@cityofzion/bs-ethereum 2.14.7 → 2.14.8

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.
@@ -1,4 +1,4 @@
1
- import { TBSAccount, TBSToken, TTransferParam, TGetLedgerTransport, ITokenService, TBSNetwork, IBlockchainDataService, IExchangeDataService, INftDataService, IExplorerService, TPingNetworkResponse, IWalletConnectService } from '@cityofzion/blockchain-service';
1
+ import { TBSAccount, TIntentTransferParam, TBSToken, TTransferParam, TGetLedgerTransport, ITokenService, TBSNetwork, IBlockchainDataService, IExchangeDataService, INftDataService, IExplorerService, TPingNetworkResponse, IWalletConnectService } from '@cityofzion/blockchain-service';
2
2
  import { ethers } from 'ethers';
3
3
  import { EthersLedgerServiceEthereum } from './services/ledger/EthersLedgerServiceEthereum';
4
4
  import { IBSEthereum, TBSEthereumNetworkId, TSupportedEVM } from './types';
@@ -13,7 +13,7 @@ export declare class BSEthereum<N extends string = string, A extends string = TB
13
13
  nativeTokens: TBSToken[];
14
14
  feeToken: TBSToken;
15
15
  network: TBSNetwork<A>;
16
- availableNetworkURLs: string[];
16
+ rpcNetworkUrls: string[];
17
17
  readonly defaultNetwork: TBSNetwork<A>;
18
18
  readonly availableNetworks: TBSNetwork<A>[];
19
19
  blockchainDataService: IBlockchainDataService;
@@ -24,6 +24,10 @@ export declare class BSEthereum<N extends string = string, A extends string = TB
24
24
  tokenService: ITokenService;
25
25
  walletConnectService: IWalletConnectService;
26
26
  constructor(name: N, evm?: TSupportedEVM, network?: TBSNetwork<A>, getLedgerTransport?: TGetLedgerTransport<N>);
27
+ protected _buildTransferParams(intent: TIntentTransferParam): Promise<{
28
+ transactionParams: ethers.utils.Deferrable<ethers.providers.TransactionRequest>;
29
+ gasPrice: ethers.BigNumber;
30
+ }>;
27
31
  generateSigner(account: TBSAccount<N>): Promise<ethers.Signer & TypedDataSigner>;
28
32
  setNetwork(network: TBSNetwork<A>): void;
29
33
  pingNode(url: string): Promise<TPingNetworkResponse>;
@@ -49,7 +49,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
49
49
  var __importDefault = (this && this.__importDefault) || function (mod) {
50
50
  return (mod && mod.__esModule) ? mod : { "default": mod };
51
51
  };
52
- var _BSEthereum_instances, _BSEthereum_buildTransferParams, _BSEthereum_setTokens;
52
+ var _BSEthereum_instances, _BSEthereum_setTokens;
53
53
  Object.defineProperty(exports, "__esModule", { value: true });
54
54
  exports.BSEthereum = void 0;
55
55
  const blockchain_service_1 = require("@cityofzion/blockchain-service");
@@ -81,6 +81,42 @@ class BSEthereum {
81
81
  this.defaultNetwork = this.availableNetworks.find(network => network.type === 'mainnet');
82
82
  this.setNetwork(network !== null && network !== void 0 ? network : this.defaultNetwork);
83
83
  }
84
+ _buildTransferParams(intent) {
85
+ return __awaiter(this, void 0, void 0, function* () {
86
+ const provider = new ethers_1.ethers.providers.JsonRpcProvider(this.network.url);
87
+ let decimals = intent.tokenDecimals;
88
+ if (!decimals) {
89
+ try {
90
+ const token = yield this.blockchainDataService.getTokenInfo(intent.tokenHash);
91
+ decimals = token.decimals;
92
+ }
93
+ catch (_a) {
94
+ decimals = 18;
95
+ }
96
+ }
97
+ const amount = ethersBigNumber.parseFixed(intent.amount, decimals);
98
+ const gasPrice = yield provider.getGasPrice();
99
+ let transactionParams = {
100
+ type: 2,
101
+ };
102
+ const isNative = this.tokenService.predicateByHash(this.feeToken, intent.tokenHash);
103
+ if (isNative) {
104
+ transactionParams.to = intent.receiverAddress;
105
+ transactionParams.value = amount;
106
+ }
107
+ else {
108
+ const contract = new ethers_1.ethers.Contract(intent.tokenHash, [
109
+ 'function transfer(address to, uint amount) returns (bool)',
110
+ ]);
111
+ const populatedTransaction = yield contract.populateTransaction.transfer(intent.receiverAddress, amount);
112
+ transactionParams = Object.assign(Object.assign({}, populatedTransaction), transactionParams);
113
+ }
114
+ return {
115
+ transactionParams,
116
+ gasPrice,
117
+ };
118
+ });
119
+ }
84
120
  generateSigner(account) {
85
121
  return __awaiter(this, void 0, void 0, function* () {
86
122
  const provider = new ethers_1.ethers.providers.JsonRpcProvider(this.network.url);
@@ -96,14 +132,14 @@ class BSEthereum {
96
132
  });
97
133
  }
98
134
  setNetwork(network) {
99
- const availableURLs = BSEthereumConstants_1.BSEthereumConstants.RPC_LIST_BY_NETWORK_ID[network.id] || [];
100
- const isValidNetwork = blockchain_service_1.BSUtilsHelper.validateNetwork(network, this.availableNetworks, availableURLs);
135
+ const rpcNetworkUrls = BSEthereumConstants_1.BSEthereumConstants.RPC_LIST_BY_NETWORK_ID[network.id] || [];
136
+ const isValidNetwork = blockchain_service_1.BSUtilsHelper.validateNetwork(network, this.availableNetworks, rpcNetworkUrls);
101
137
  if (!isValidNetwork) {
102
138
  throw new Error(`Network with id ${network.id} is not available for ${this.name}`);
103
139
  }
104
140
  __classPrivateFieldGet(this, _BSEthereum_instances, "m", _BSEthereum_setTokens).call(this, network);
105
141
  this.network = network;
106
- this.availableNetworkURLs = availableURLs;
142
+ this.rpcNetworkUrls = rpcNetworkUrls;
107
143
  this.nftDataService = new GhostMarketNDSEthereum_1.GhostMarketNDSEthereum(this);
108
144
  this.explorerService = new BlockscoutESEthereum_1.BlockscoutESEthereum(this);
109
145
  this.exchangeDataService = new MoralisEDSEthereum_1.MoralisEDSEthereum(this);
@@ -203,7 +239,7 @@ class BSEthereum {
203
239
  for (const intent of param.intents) {
204
240
  let transactionHash = '';
205
241
  try {
206
- const { transactionParams, gasPrice } = yield __classPrivateFieldGet(this, _BSEthereum_instances, "m", _BSEthereum_buildTransferParams).call(this, intent);
242
+ const { transactionParams, gasPrice } = yield this._buildTransferParams(intent);
207
243
  let gasLimit;
208
244
  try {
209
245
  gasLimit = yield signer.estimateGas(transactionParams);
@@ -230,7 +266,7 @@ class BSEthereum {
230
266
  const signer = yield this.generateSigner(param.senderAccount);
231
267
  let fee = ethers_1.ethers.utils.parseEther('0');
232
268
  for (const intent of param.intents) {
233
- const { gasPrice, transactionParams } = yield __classPrivateFieldGet(this, _BSEthereum_instances, "m", _BSEthereum_buildTransferParams).call(this, intent);
269
+ const { gasPrice, transactionParams } = yield this._buildTransferParams(intent);
234
270
  const estimated = yield signer.estimateGas(transactionParams);
235
271
  const intentFee = gasPrice.mul(estimated);
236
272
  fee = fee.add(intentFee);
@@ -249,42 +285,7 @@ class BSEthereum {
249
285
  }
250
286
  }
251
287
  exports.BSEthereum = BSEthereum;
252
- _BSEthereum_instances = new WeakSet(), _BSEthereum_buildTransferParams = function _BSEthereum_buildTransferParams(intent) {
253
- return __awaiter(this, void 0, void 0, function* () {
254
- const provider = new ethers_1.ethers.providers.JsonRpcProvider(this.network.url);
255
- let decimals = intent.tokenDecimals;
256
- if (!decimals) {
257
- try {
258
- const token = yield this.blockchainDataService.getTokenInfo(intent.tokenHash);
259
- decimals = token.decimals;
260
- }
261
- catch (_a) {
262
- decimals = 18;
263
- }
264
- }
265
- const amount = ethersBigNumber.parseFixed(intent.amount, decimals);
266
- const gasPrice = yield provider.getGasPrice();
267
- let transactionParams = {
268
- type: 2,
269
- };
270
- const isNative = this.tokenService.predicateByHash(this.feeToken, intent.tokenHash);
271
- if (isNative) {
272
- transactionParams.to = intent.receiverAddress;
273
- transactionParams.value = amount;
274
- }
275
- else {
276
- const contract = new ethers_1.ethers.Contract(intent.tokenHash, [
277
- 'function transfer(address to, uint amount) returns (bool)',
278
- ]);
279
- const populatedTransaction = yield contract.populateTransaction.transfer(intent.receiverAddress, amount);
280
- transactionParams = Object.assign(Object.assign({}, populatedTransaction), transactionParams);
281
- }
282
- return {
283
- transactionParams,
284
- gasPrice,
285
- };
286
- });
287
- }, _BSEthereum_setTokens = function _BSEthereum_setTokens(network) {
288
+ _BSEthereum_instances = new WeakSet(), _BSEthereum_setTokens = function _BSEthereum_setTokens(network) {
288
289
  const nativeAsset = BSEthereumHelper_1.BSEthereumHelper.getNativeAsset(network);
289
290
  this.tokens = [nativeAsset];
290
291
  this.nativeTokens = [nativeAsset];
@@ -57,7 +57,7 @@ BSEthereumConstants.RPC_LIST_BY_NETWORK_ID = {
57
57
  '56': [
58
58
  'https://binance.llamarpc.com',
59
59
  'https://bsc-rpc.publicnode.com',
60
- 'https://bsc-dataseed.binance.org/',
60
+ 'https://bsc-dataseed.binance.org',
61
61
  'https://bsc-dataseed.bnbchain.org',
62
62
  'https://endpoints.omniatech.io/v1/bsc/mainnet/public',
63
63
  ],
@@ -1,5 +1,6 @@
1
1
  import { IWalletConnectService, TBSNetworkId, TWalletConnectServiceRequestMethodParams } from '@cityofzion/blockchain-service';
2
2
  import { IBSEthereum } from '../../types';
3
+ import { ethers } from 'ethers';
3
4
  export declare class WalletConnectServiceEthereum<N extends string, A extends TBSNetworkId> implements IWalletConnectService {
4
5
  #private;
5
6
  readonly namespace: string;
@@ -9,6 +10,11 @@ export declare class WalletConnectServiceEthereum<N extends string, A extends TB
9
10
  readonly calculableMethods: string[];
10
11
  readonly autoApproveMethods: string[];
11
12
  constructor(service: IBSEthereum<N, A>);
13
+ protected _resolveParams(args: TWalletConnectServiceRequestMethodParams<N>): Promise<{
14
+ param: any;
15
+ provider: ethers.providers.JsonRpcProvider;
16
+ wallet: ethers.Signer & import("@ethersproject/abstract-signer").TypedDataSigner;
17
+ }>;
12
18
  personal_sign(args: TWalletConnectServiceRequestMethodParams<N>): Promise<string>;
13
19
  eth_sign(args: TWalletConnectServiceRequestMethodParams<N>): Promise<string>;
14
20
  eth_signTransaction(args: TWalletConnectServiceRequestMethodParams<N>): Promise<string>;
@@ -19,7 +19,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
19
19
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
20
20
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
21
21
  };
22
- var _WalletConnectServiceEthereum_instances, _WalletConnectServiceEthereum_service, _WalletConnectServiceEthereum_resolveParams, _WalletConnectServiceEthereum_convertHexToUtf8;
22
+ var _WalletConnectServiceEthereum_instances, _WalletConnectServiceEthereum_service, _WalletConnectServiceEthereum_convertHexToUtf8;
23
23
  Object.defineProperty(exports, "__esModule", { value: true });
24
24
  exports.WalletConnectServiceEthereum = void 0;
25
25
  const ethers_1 = require("ethers");
@@ -61,13 +61,52 @@ class WalletConnectServiceEthereum {
61
61
  __classPrivateFieldSet(this, _WalletConnectServiceEthereum_service, service, "f");
62
62
  this.chain = `${this.namespace}:${__classPrivateFieldGet(this, _WalletConnectServiceEthereum_service, "f").network.id.toString()}`;
63
63
  }
64
+ _resolveParams(args) {
65
+ return __awaiter(this, void 0, void 0, function* () {
66
+ var _a, _b, _c;
67
+ const wallet = yield __classPrivateFieldGet(this, _WalletConnectServiceEthereum_service, "f").generateSigner(args.account);
68
+ const provider = new ethers_1.ethers.providers.JsonRpcProvider(__classPrivateFieldGet(this, _WalletConnectServiceEthereum_service, "f").network.url);
69
+ const param = args.params[0];
70
+ if (typeof param !== 'object') {
71
+ throw new Error('Invalid Params');
72
+ }
73
+ if (param.gas) {
74
+ param.gasLimit = param.gas;
75
+ delete param.gas;
76
+ }
77
+ if (param.type && typeof param.type !== 'number') {
78
+ param.type = parseInt(param.type);
79
+ }
80
+ const gasPrice = yield provider.getGasPrice();
81
+ if (param.type === 2) {
82
+ param.maxPriorityFeePerGas = (_a = param.maxPriorityFeePerGas) !== null && _a !== void 0 ? _a : gasPrice;
83
+ param.maxFeePerGas = (_b = param.maxPriorityFeePerGas) !== null && _b !== void 0 ? _b : gasPrice;
84
+ }
85
+ else {
86
+ param.gasPrice = (_c = param.gasPrice) !== null && _c !== void 0 ? _c : gasPrice;
87
+ }
88
+ if (!param.gasLimit) {
89
+ const connectedWallet = wallet.connect(provider);
90
+ try {
91
+ param.gasLimit = yield connectedWallet.estimateGas(Object.assign(Object.assign({}, param), { gasLimit: BSEthereumConstants_1.BSEthereumConstants.DEFAULT_GAS_LIMIT }));
92
+ }
93
+ catch (_d) {
94
+ param.gasLimit = BSEthereumConstants_1.BSEthereumConstants.DEFAULT_GAS_LIMIT;
95
+ }
96
+ }
97
+ return {
98
+ param,
99
+ provider,
100
+ wallet,
101
+ };
102
+ });
103
+ }
64
104
  personal_sign(args) {
65
105
  return __awaiter(this, void 0, void 0, function* () {
66
106
  const wallet = yield __classPrivateFieldGet(this, _WalletConnectServiceEthereum_service, "f").generateSigner(args.account);
67
107
  const message = args.params.filter((param) => !ethers_1.ethers.utils.isAddress(param))[0];
68
108
  const convertedMessage = __classPrivateFieldGet(this, _WalletConnectServiceEthereum_instances, "m", _WalletConnectServiceEthereum_convertHexToUtf8).call(this, message);
69
- const signedMessage = yield wallet.signMessage(convertedMessage);
70
- return signedMessage;
109
+ return yield wallet.signMessage(convertedMessage);
71
110
  });
72
111
  }
73
112
  eth_sign(args) {
@@ -77,9 +116,8 @@ class WalletConnectServiceEthereum {
77
116
  }
78
117
  eth_signTransaction(args) {
79
118
  return __awaiter(this, void 0, void 0, function* () {
80
- const { param, wallet } = yield __classPrivateFieldGet(this, _WalletConnectServiceEthereum_instances, "m", _WalletConnectServiceEthereum_resolveParams).call(this, args);
81
- const signature = yield wallet.signTransaction(param);
82
- return signature;
119
+ const { param, wallet } = yield this._resolveParams(args);
120
+ return yield wallet.signTransaction(param);
83
121
  });
84
122
  }
85
123
  eth_signTypedData(args) {
@@ -90,8 +128,7 @@ class WalletConnectServiceEthereum {
90
128
  const { domain, types, message } = parsedData;
91
129
  // https://github.com/ethers-io/ethers.js/issues/687#issuecomment-714069471
92
130
  delete types.EIP712Domain;
93
- const signedData = yield wallet._signTypedData(domain, types, message);
94
- return signedData;
131
+ return yield wallet._signTypedData(domain, types, message);
95
132
  });
96
133
  }
97
134
  eth_signTypedData_v3(args) {
@@ -106,7 +143,7 @@ class WalletConnectServiceEthereum {
106
143
  }
107
144
  eth_sendTransaction(args) {
108
145
  return __awaiter(this, void 0, void 0, function* () {
109
- const { param, provider, wallet } = yield __classPrivateFieldGet(this, _WalletConnectServiceEthereum_instances, "m", _WalletConnectServiceEthereum_resolveParams).call(this, args);
146
+ const { param, provider, wallet } = yield this._resolveParams(args);
110
147
  const connectedWallet = wallet.connect(provider);
111
148
  const { hash } = yield connectedWallet.sendTransaction(param);
112
149
  return hash;
@@ -114,7 +151,7 @@ class WalletConnectServiceEthereum {
114
151
  }
115
152
  eth_call(args) {
116
153
  return __awaiter(this, void 0, void 0, function* () {
117
- const { param, provider, wallet } = yield __classPrivateFieldGet(this, _WalletConnectServiceEthereum_instances, "m", _WalletConnectServiceEthereum_resolveParams).call(this, args);
154
+ const { param, provider, wallet } = yield this._resolveParams(args);
118
155
  const connectedWallet = wallet.connect(provider);
119
156
  return yield connectedWallet.call(param);
120
157
  });
@@ -164,7 +201,7 @@ class WalletConnectServiceEthereum {
164
201
  }
165
202
  calculateRequestFee(args) {
166
203
  return __awaiter(this, void 0, void 0, function* () {
167
- const { param, wallet, provider } = yield __classPrivateFieldGet(this, _WalletConnectServiceEthereum_instances, "m", _WalletConnectServiceEthereum_resolveParams).call(this, args);
204
+ const { param, wallet, provider } = yield this._resolveParams(args);
168
205
  const connectedWallet = wallet.connect(provider);
169
206
  const gasPrice = yield provider.getGasPrice();
170
207
  const estimated = yield connectedWallet.estimateGas(param);
@@ -173,46 +210,7 @@ class WalletConnectServiceEthereum {
173
210
  }
174
211
  }
175
212
  exports.WalletConnectServiceEthereum = WalletConnectServiceEthereum;
176
- _WalletConnectServiceEthereum_service = new WeakMap(), _WalletConnectServiceEthereum_instances = new WeakSet(), _WalletConnectServiceEthereum_resolveParams = function _WalletConnectServiceEthereum_resolveParams(args) {
177
- return __awaiter(this, void 0, void 0, function* () {
178
- var _a, _b, _c;
179
- const wallet = yield __classPrivateFieldGet(this, _WalletConnectServiceEthereum_service, "f").generateSigner(args.account);
180
- const provider = new ethers_1.ethers.providers.JsonRpcProvider(__classPrivateFieldGet(this, _WalletConnectServiceEthereum_service, "f").network.url);
181
- const param = args.params[0];
182
- if (typeof param !== 'object') {
183
- throw new Error('Invalid Params');
184
- }
185
- if (param.gas) {
186
- param.gasLimit = param.gas;
187
- delete param.gas;
188
- }
189
- if (param.type && typeof param.type !== 'number') {
190
- param.type = parseInt(param.type);
191
- }
192
- const gasPrice = yield provider.getGasPrice();
193
- if (param.type === 2) {
194
- param.maxPriorityFeePerGas = (_a = param.maxPriorityFeePerGas) !== null && _a !== void 0 ? _a : gasPrice;
195
- param.maxFeePerGas = (_b = param.maxPriorityFeePerGas) !== null && _b !== void 0 ? _b : gasPrice;
196
- }
197
- else {
198
- param.gasPrice = (_c = param.gasPrice) !== null && _c !== void 0 ? _c : gasPrice;
199
- }
200
- if (!param.gasLimit) {
201
- const connectedWallet = wallet.connect(provider);
202
- try {
203
- param.gasLimit = yield connectedWallet.estimateGas(Object.assign(Object.assign({}, param), { gasLimit: BSEthereumConstants_1.BSEthereumConstants.DEFAULT_GAS_LIMIT }));
204
- }
205
- catch (_d) {
206
- param.gasLimit = BSEthereumConstants_1.BSEthereumConstants.DEFAULT_GAS_LIMIT;
207
- }
208
- }
209
- return {
210
- param,
211
- provider,
212
- wallet,
213
- };
214
- });
215
- }, _WalletConnectServiceEthereum_convertHexToUtf8 = function _WalletConnectServiceEthereum_convertHexToUtf8(value) {
213
+ _WalletConnectServiceEthereum_service = new WeakMap(), _WalletConnectServiceEthereum_instances = new WeakSet(), _WalletConnectServiceEthereum_convertHexToUtf8 = function _WalletConnectServiceEthereum_convertHexToUtf8(value) {
216
214
  if (ethers_1.ethers.utils.isHexString(value)) {
217
215
  return ethers_1.ethers.utils.toUtf8String(value);
218
216
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cityofzion/bs-ethereum",
3
- "version": "2.14.7",
3
+ "version": "2.14.8",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "repository": "https://github.com/CityOfZion/blockchain-services",
@@ -19,7 +19,7 @@
19
19
  "@ledgerhq/hw-app-eth": "~6.45.19",
20
20
  "axios": "~1.12.2",
21
21
  "ethers": "5.8.0",
22
- "@cityofzion/blockchain-service": "1.22.5"
22
+ "@cityofzion/blockchain-service": "1.22.6"
23
23
  },
24
24
  "devDependencies": {
25
25
  "@ledgerhq/hw-transport": "~6.31.11",