@metamask/smart-transactions-controller 6.2.0 → 6.2.2

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/CHANGELOG.md CHANGED
@@ -6,18 +6,26 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
- ## [6.2.0]
9
+ ## [6.2.2]
10
+ ### Fixed
11
+ - Revert "Parameterize SmartTransactionsController state by ChainId for MultiChain + Integrate PollingController Mixin ([#235](https://github.com/MetaMask/smart-transactions-controller/pull/235))
12
+
13
+ ## [6.2.1] [DEPRECATED]
14
+ ### Fixed
15
+ - Fix a typo in a URL for submitting transactions ([#230](https://github.com/MetaMask/smart-transactions-controller/pull/230))
16
+
17
+ ## [6.2.0] [DEPRECATED]
10
18
  ### Added
11
19
  - Pass current version of this package to API when submitting transactions ([#227](https://github.com/MetaMask/smart-transactions-controller/pull/227))
12
20
 
13
- ## [6.1.0]
21
+ ## [6.1.0] [DEPRECATED]
14
22
  ### Added
15
23
  - Add a new "userOptInV2" prop ([#222](https://github.com/MetaMask/smart-transactions-controller/pull/222))
16
24
 
17
25
  ### Changed
18
26
  - Bump @metamask/network-controller from 15.0.0 to 15.1.0 ([#219](https://github.com/MetaMask/smart-transactions-controller/pull/219))
19
27
 
20
- ## [6.0.0]
28
+ ## [6.0.0] [DEPRECATED]
21
29
  ### Added
22
30
  - **BREAKING:** `getNetworkClientById` is now required argument in constructor options object ([#210](https://github.com/MetaMask/smart-transactions-controller/pull/210))
23
31
  - Integrate `PollingController` mixin and `_executePoll` method used for concurrent multichain polling ([#210](https://github.com/MetaMask/smart-transactions-controller/pull/210))
@@ -175,7 +183,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
175
183
  - Add initial SmartTransactionsController ([#1](https://github.com/MetaMask/smart-transactions-controller/pull/1))
176
184
  - Initial commit
177
185
 
178
- [Unreleased]: https://github.com/MetaMask/smart-transactions-controller/compare/v6.2.0...HEAD
186
+ [Unreleased]: https://github.com/MetaMask/smart-transactions-controller/compare/v6.2.2...HEAD
187
+ [6.2.2]: https://github.com/MetaMask/smart-transactions-controller/compare/v6.2.1...v6.2.2
188
+ [6.2.1]: https://github.com/MetaMask/smart-transactions-controller/compare/v6.2.0...v6.2.1
179
189
  [6.2.0]: https://github.com/MetaMask/smart-transactions-controller/compare/v6.1.0...v6.2.0
180
190
  [6.1.0]: https://github.com/MetaMask/smart-transactions-controller/compare/v6.0.0...v6.1.0
181
191
  [6.0.0]: https://github.com/MetaMask/smart-transactions-controller/compare/v5.0.0...v6.0.0
@@ -1,49 +1,40 @@
1
1
  /// <reference types="node" />
2
- import { BaseConfig, BaseState } from '@metamask/base-controller';
3
- import { NetworkState, NetworkController, NetworkClientId } from '@metamask/network-controller';
4
- import { PollingControllerV1 } from '@metamask/polling-controller';
5
- import EthQuery from '@metamask/eth-query';
6
- import { SmartTransaction, SignedTransaction, SignedCanceledTransaction, UnsignedTransaction, SmartTransactionStatuses, Fees, IndividualTxFees, Hex } from './types';
2
+ import { BaseConfig, BaseController, BaseState } from '@metamask/base-controller';
3
+ import { NetworkState } from '@metamask/network-controller';
4
+ import { SmartTransaction, SignedTransaction, SignedCanceledTransaction, UnsignedTransaction, SmartTransactionStatuses, Fees, IndividualTxFees } from './types';
7
5
  export declare const DEFAULT_INTERVAL: number;
8
6
  export declare type SmartTransactionsControllerConfig = BaseConfig & {
9
7
  interval: number;
10
8
  clientId: string;
11
- chainId: Hex;
9
+ chainId: string;
12
10
  supportedChainIds: string[];
13
11
  };
14
- declare type FeeEstimates = {
15
- approvalTxFees: IndividualTxFees | undefined;
16
- tradeTxFees: IndividualTxFees | undefined;
17
- };
18
12
  export declare type SmartTransactionsControllerState = BaseState & {
19
13
  smartTransactionsState: {
20
- smartTransactions: Record<Hex, SmartTransaction[]>;
14
+ smartTransactions: Record<string, SmartTransaction[]>;
21
15
  userOptIn: boolean | undefined;
22
16
  userOptInV2: boolean | undefined;
23
17
  liveness: boolean | undefined;
24
- fees: FeeEstimates;
25
- feesByChainId: Record<Hex, FeeEstimates>;
26
- livenessByChainId: Record<Hex, boolean>;
18
+ fees: {
19
+ approvalTxFees: IndividualTxFees | undefined;
20
+ tradeTxFees: IndividualTxFees | undefined;
21
+ };
27
22
  };
28
23
  };
29
- export default class SmartTransactionsController extends PollingControllerV1<SmartTransactionsControllerConfig, SmartTransactionsControllerState> {
30
- #private;
24
+ export default class SmartTransactionsController extends BaseController<SmartTransactionsControllerConfig, SmartTransactionsControllerState> {
31
25
  timeoutHandle?: NodeJS.Timeout;
32
26
  private getNonceLock;
33
- ethQuery: EthQuery;
27
+ ethersProvider: any;
34
28
  confirmExternalTransaction: any;
35
29
  private trackMetaMetricsEvent;
36
- private getNetworkClientById;
37
30
  private fetch;
38
- constructor({ onNetworkStateChange, getNonceLock, provider, confirmExternalTransaction, trackMetaMetricsEvent, getNetworkClientById, }: {
31
+ constructor({ onNetworkStateChange, getNonceLock, provider, confirmExternalTransaction, trackMetaMetricsEvent, }: {
39
32
  onNetworkStateChange: (listener: (networkState: NetworkState) => void) => void;
40
33
  getNonceLock: any;
41
34
  provider: any;
42
35
  confirmExternalTransaction: any;
43
36
  trackMetaMetricsEvent: any;
44
- getNetworkClientById: NetworkController['getNetworkClientById'];
45
37
  }, config?: Partial<SmartTransactionsControllerConfig>, state?: Partial<SmartTransactionsControllerState>);
46
- _executePoll(networkClientId: string): Promise<void>;
47
38
  checkPoll(state: any): void;
48
39
  initializeSmartTransactionsForChainId(): void;
49
40
  poll(interval?: number): Promise<void>;
@@ -51,42 +42,23 @@ export default class SmartTransactionsController extends PollingControllerV1<Sma
51
42
  setOptInState(state: boolean | undefined): void;
52
43
  trackStxStatusChange(smartTransaction: SmartTransaction, prevSmartTransaction?: SmartTransaction): void;
53
44
  isNewSmartTransaction(smartTransactionUuid: string): boolean;
54
- updateSmartTransaction(smartTransaction: SmartTransaction, { networkClientId }?: {
55
- networkClientId?: NetworkClientId;
56
- }): void;
57
- updateSmartTransactions({ networkClientId, }?: {
58
- networkClientId?: NetworkClientId;
59
- }): Promise<void>;
60
- fetchSmartTransactionsStatus(uuids: string[], { networkClientId }?: {
61
- networkClientId?: NetworkClientId;
62
- }): Promise<SmartTransaction[]>;
45
+ updateSmartTransaction(smartTransaction: SmartTransaction): void;
46
+ updateSmartTransactions(): Promise<void>;
47
+ confirmSmartTransaction(smartTransaction: SmartTransaction): Promise<void>;
48
+ fetchSmartTransactionsStatus(uuids: string[]): Promise<SmartTransaction[]>;
63
49
  addNonceToTransaction(transaction: UnsignedTransaction): Promise<UnsignedTransaction>;
64
50
  clearFees(): Fees;
65
- getFees(tradeTx: UnsignedTransaction, approvalTx: UnsignedTransaction, { networkClientId }?: {
66
- networkClientId?: NetworkClientId;
67
- }): Promise<Fees>;
68
- submitSignedTransactions({ txParams, signedTransactions, signedCanceledTransactions, networkClientId, }: {
51
+ getFees(tradeTx: UnsignedTransaction, approvalTx: UnsignedTransaction): Promise<Fees>;
52
+ submitSignedTransactions({ txParams, signedTransactions, signedCanceledTransactions, }: {
69
53
  signedTransactions: SignedTransaction[];
70
54
  signedCanceledTransactions: SignedCanceledTransaction[];
71
55
  txParams?: any;
72
- networkClientId?: NetworkClientId;
73
56
  }): Promise<any>;
74
- getChainId({ networkClientId, }?: {
75
- networkClientId?: NetworkClientId;
76
- }): Hex;
77
- getEthQuery({ networkClientId, }: {
78
- networkClientId?: NetworkClientId;
79
- }): EthQuery;
80
- cancelSmartTransaction(uuid: string, { networkClientId, }?: {
81
- networkClientId?: NetworkClientId;
82
- }): Promise<void>;
83
- fetchLiveness({ networkClientId, }?: {
84
- networkClientId?: NetworkClientId;
85
- }): Promise<boolean>;
57
+ cancelSmartTransaction(uuid: string): Promise<void>;
58
+ fetchLiveness(): Promise<boolean>;
86
59
  setStatusRefreshInterval(interval: number): Promise<void>;
87
60
  getTransactions({ addressFrom, status, }: {
88
61
  addressFrom: string;
89
62
  status: SmartTransactionStatuses;
90
63
  }): SmartTransaction[];
91
64
  }
92
- export {};
@@ -1,35 +1,30 @@
1
1
  "use strict";
2
- var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
3
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
4
- 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");
5
- return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
6
- };
7
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
8
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
9
4
  };
10
- var _SmartTransactionsController_instances, _SmartTransactionsController_updateSmartTransaction, _SmartTransactionsController_confirmSmartTransaction;
11
5
  Object.defineProperty(exports, "__esModule", { value: true });
12
6
  exports.DEFAULT_INTERVAL = void 0;
7
+ const base_controller_1 = require("@metamask/base-controller");
13
8
  const controller_utils_1 = require("@metamask/controller-utils");
14
- const polling_controller_1 = require("@metamask/polling-controller");
15
9
  const bignumber_js_1 = require("bignumber.js");
16
- const eth_query_1 = __importDefault(require("@metamask/eth-query"));
10
+ const bignumber_1 = require("@ethersproject/bignumber");
11
+ const providers_1 = require("@ethersproject/providers");
17
12
  const bytes_1 = require("@ethersproject/bytes");
13
+ const mapValues_1 = __importDefault(require("lodash/mapValues"));
18
14
  const cloneDeep_1 = __importDefault(require("lodash/cloneDeep"));
19
15
  const types_1 = require("./types");
20
16
  const utils_1 = require("./utils");
21
17
  const constants_1 = require("./constants");
22
18
  const SECOND = 1000;
23
19
  exports.DEFAULT_INTERVAL = SECOND * 5;
24
- class SmartTransactionsController extends polling_controller_1.PollingControllerV1 {
25
- constructor({ onNetworkStateChange, getNonceLock, provider, confirmExternalTransaction, trackMetaMetricsEvent, getNetworkClientById, }, config, state) {
20
+ class SmartTransactionsController extends base_controller_1.BaseController {
21
+ constructor({ onNetworkStateChange, getNonceLock, provider, confirmExternalTransaction, trackMetaMetricsEvent, }, config, state) {
26
22
  super(config, state);
27
- _SmartTransactionsController_instances.add(this);
28
23
  this.defaultConfig = {
29
24
  interval: exports.DEFAULT_INTERVAL,
30
- chainId: controller_utils_1.ChainId.mainnet,
25
+ chainId: constants_1.CHAIN_IDS.ETHEREUM,
31
26
  clientId: 'default',
32
- supportedChainIds: [constants_1.CHAIN_IDS.ETHEREUM, constants_1.CHAIN_IDS.GOERLI],
27
+ supportedChainIds: [constants_1.CHAIN_IDS.ETHEREUM, constants_1.CHAIN_IDS.RINKEBY],
33
28
  };
34
29
  this.defaultState = {
35
30
  smartTransactionsState: {
@@ -41,28 +36,12 @@ class SmartTransactionsController extends polling_controller_1.PollingController
41
36
  tradeTxFees: undefined,
42
37
  },
43
38
  liveness: true,
44
- livenessByChainId: {
45
- [constants_1.CHAIN_IDS.ETHEREUM]: true,
46
- [constants_1.CHAIN_IDS.GOERLI]: true,
47
- },
48
- feesByChainId: {
49
- [constants_1.CHAIN_IDS.ETHEREUM]: {
50
- approvalTxFees: undefined,
51
- tradeTxFees: undefined,
52
- },
53
- [constants_1.CHAIN_IDS.GOERLI]: {
54
- approvalTxFees: undefined,
55
- tradeTxFees: undefined,
56
- },
57
- },
58
39
  },
59
40
  };
60
- this.setIntervalLength(this.config.interval || exports.DEFAULT_INTERVAL);
61
41
  this.getNonceLock = getNonceLock;
62
- this.ethQuery = new eth_query_1.default(provider);
42
+ this.ethersProvider = new providers_1.Web3Provider(provider);
63
43
  this.confirmExternalTransaction = confirmExternalTransaction;
64
44
  this.trackMetaMetricsEvent = trackMetaMetricsEvent;
65
- this.getNetworkClientById = getNetworkClientById;
66
45
  this.initialize();
67
46
  this.initializeSmartTransactionsForChainId();
68
47
  onNetworkStateChange(({ providerConfig: newProvider }) => {
@@ -70,7 +49,7 @@ class SmartTransactionsController extends polling_controller_1.PollingController
70
49
  this.configure({ chainId });
71
50
  this.initializeSmartTransactionsForChainId();
72
51
  this.checkPoll(this.state);
73
- this.ethQuery = new eth_query_1.default(provider);
52
+ this.ethersProvider = new providers_1.Web3Provider(provider);
74
53
  });
75
54
  this.subscribe((currentState) => this.checkPoll(currentState));
76
55
  }
@@ -80,17 +59,6 @@ class SmartTransactionsController extends polling_controller_1.PollingController
80
59
  const fetchOptions = Object.assign(Object.assign({}, options), { headers: Object.assign({ 'Content-Type': 'application/json' }, (clientId && { 'X-Client-Id': clientId })) });
81
60
  return (0, utils_1.handleFetch)(request, fetchOptions);
82
61
  }
83
- _executePoll(networkClientId) {
84
- // if this is going to be truly UI driven polling we shouldn't really reach here
85
- // with a networkClientId that is not supported, but for now I'll add a check in case
86
- // wondering if we should add some kind of predicate to the polling controller to check whether
87
- // we should poll or not
88
- const chainId = this.getChainId({ networkClientId });
89
- if (!this.config.supportedChainIds.includes(chainId)) {
90
- return Promise.resolve();
91
- }
92
- return this.updateSmartTransactions({ networkClientId });
93
- }
94
62
  checkPoll(state) {
95
63
  const { smartTransactions } = state.smartTransactionsState;
96
64
  const currentSmartTransactions = smartTransactions[this.config.chainId];
@@ -166,49 +134,123 @@ class SmartTransactionsController extends polling_controller_1.PollingController
166
134
  const currentIndex = currentSmartTransactions === null || currentSmartTransactions === void 0 ? void 0 : currentSmartTransactions.findIndex((stx) => stx.uuid === smartTransactionUuid);
167
135
  return currentIndex === -1 || currentIndex === undefined;
168
136
  }
169
- updateSmartTransaction(smartTransaction, { networkClientId } = {}) {
170
- let { chainId } = this.config;
171
- let { ethQuery } = this;
172
- if (networkClientId) {
173
- const networkClient = this.getNetworkClientById(networkClientId);
174
- chainId = networkClient.configuration.chainId;
175
- // @ts-expect-error TODO: Provider type alignment
176
- ethQuery = new eth_query_1.default(networkClient.provider);
137
+ updateSmartTransaction(smartTransaction) {
138
+ const { chainId } = this.config;
139
+ const { smartTransactionsState } = this.state;
140
+ const { smartTransactions } = smartTransactionsState;
141
+ const currentSmartTransactions = smartTransactions[chainId];
142
+ const currentIndex = currentSmartTransactions === null || currentSmartTransactions === void 0 ? void 0 : currentSmartTransactions.findIndex((stx) => stx.uuid === smartTransaction.uuid);
143
+ const isNewSmartTransaction = this.isNewSmartTransaction(smartTransaction.uuid);
144
+ this.trackStxStatusChange(smartTransaction, isNewSmartTransaction
145
+ ? undefined
146
+ : currentSmartTransactions[currentIndex]);
147
+ if (isNewSmartTransaction) {
148
+ // add smart transaction
149
+ const cancelledNonceIndex = currentSmartTransactions.findIndex((stx) => {
150
+ var _a, _b, _c;
151
+ return ((_a = stx.txParams) === null || _a === void 0 ? void 0 : _a.nonce) === ((_b = smartTransaction.txParams) === null || _b === void 0 ? void 0 : _b.nonce) &&
152
+ ((_c = stx.status) === null || _c === void 0 ? void 0 : _c.startsWith('cancelled'));
153
+ });
154
+ const snapshot = (0, cloneDeep_1.default)(smartTransaction);
155
+ const history = [snapshot];
156
+ const historifiedSmartTransaction = Object.assign(Object.assign({}, smartTransaction), { history });
157
+ const nextSmartTransactions = cancelledNonceIndex > -1
158
+ ? currentSmartTransactions
159
+ .slice(0, cancelledNonceIndex)
160
+ .concat(currentSmartTransactions.slice(cancelledNonceIndex + 1))
161
+ .concat(historifiedSmartTransaction)
162
+ : currentSmartTransactions.concat(historifiedSmartTransaction);
163
+ this.update({
164
+ smartTransactionsState: Object.assign(Object.assign({}, smartTransactionsState), { smartTransactions: Object.assign(Object.assign({}, smartTransactionsState.smartTransactions), { [chainId]: nextSmartTransactions }) }),
165
+ });
166
+ return;
177
167
  }
178
- __classPrivateFieldGet(this, _SmartTransactionsController_instances, "m", _SmartTransactionsController_updateSmartTransaction).call(this, smartTransaction, {
179
- chainId,
180
- ethQuery,
168
+ if ((smartTransaction.status === types_1.SmartTransactionStatuses.SUCCESS ||
169
+ smartTransaction.status === types_1.SmartTransactionStatuses.REVERTED) &&
170
+ !smartTransaction.confirmed) {
171
+ // confirm smart transaction
172
+ const currentSmartTransaction = currentSmartTransactions[currentIndex];
173
+ const nextSmartTransaction = Object.assign(Object.assign({}, currentSmartTransaction), smartTransaction);
174
+ this.confirmSmartTransaction(nextSmartTransaction);
175
+ }
176
+ this.update({
177
+ smartTransactionsState: Object.assign(Object.assign({}, smartTransactionsState), { smartTransactions: Object.assign(Object.assign({}, smartTransactionsState.smartTransactions), { [chainId]: smartTransactionsState.smartTransactions[chainId].map((item, index) => {
178
+ return index === currentIndex
179
+ ? Object.assign(Object.assign({}, item), smartTransaction) : item;
180
+ }) }) }),
181
181
  });
182
182
  }
183
- async updateSmartTransactions({ networkClientId, } = {}) {
183
+ async updateSmartTransactions() {
184
184
  const { smartTransactions } = this.state.smartTransactionsState;
185
- const chainId = this.getChainId({ networkClientId });
186
- const smartTransactionsForChainId = smartTransactions === null || smartTransactions === void 0 ? void 0 : smartTransactions[chainId];
187
- const transactionsToUpdate = smartTransactionsForChainId
185
+ const { chainId } = this.config;
186
+ const currentSmartTransactions = smartTransactions === null || smartTransactions === void 0 ? void 0 : smartTransactions[chainId];
187
+ const transactionsToUpdate = currentSmartTransactions
188
188
  .filter(utils_1.isSmartTransactionPending)
189
189
  .map((smartTransaction) => smartTransaction.uuid);
190
190
  if (transactionsToUpdate.length > 0) {
191
- this.fetchSmartTransactionsStatus(transactionsToUpdate, {
192
- networkClientId,
191
+ this.fetchSmartTransactionsStatus(transactionsToUpdate);
192
+ }
193
+ }
194
+ async confirmSmartTransaction(smartTransaction) {
195
+ var _a, _b, _c;
196
+ const txHash = (_a = smartTransaction.statusMetadata) === null || _a === void 0 ? void 0 : _a.minedHash;
197
+ try {
198
+ const transactionReceipt = await this.ethersProvider.getTransactionReceipt(txHash);
199
+ const transaction = await this.ethersProvider.getTransaction(txHash);
200
+ const maxFeePerGas = (_b = transaction.maxFeePerGas) === null || _b === void 0 ? void 0 : _b.toHexString();
201
+ const maxPriorityFeePerGas = (_c = transaction.maxPriorityFeePerGas) === null || _c === void 0 ? void 0 : _c.toHexString();
202
+ if (transactionReceipt === null || transactionReceipt === void 0 ? void 0 : transactionReceipt.blockNumber) {
203
+ const blockData = await this.ethersProvider.getBlock(transactionReceipt === null || transactionReceipt === void 0 ? void 0 : transactionReceipt.blockNumber, false);
204
+ const baseFeePerGas = blockData === null || blockData === void 0 ? void 0 : blockData.baseFeePerGas.toHexString();
205
+ const txReceipt = (0, mapValues_1.default)(transactionReceipt, (value) => {
206
+ if (value instanceof bignumber_1.BigNumber) {
207
+ return value.toHexString();
208
+ }
209
+ return value;
210
+ });
211
+ const updatedTxParams = Object.assign(Object.assign({}, smartTransaction.txParams), { maxFeePerGas,
212
+ maxPriorityFeePerGas });
213
+ // call confirmExternalTransaction
214
+ const originalTxMeta = Object.assign(Object.assign({}, smartTransaction), { id: smartTransaction.uuid, status: 'confirmed', hash: txHash, txParams: updatedTxParams });
215
+ // create txMeta snapshot for history
216
+ const snapshot = (0, utils_1.snapshotFromTxMeta)(originalTxMeta);
217
+ // recover previous tx state obj
218
+ const previousState = (0, utils_1.replayHistory)(originalTxMeta.history);
219
+ // generate history entry and add to history
220
+ const entry = (0, utils_1.generateHistoryEntry)(previousState, snapshot, 'txStateManager: setting status to confirmed');
221
+ const txMeta = entry.length > 0
222
+ ? Object.assign(Object.assign({}, originalTxMeta), { history: originalTxMeta.history.concat(entry) }) : originalTxMeta;
223
+ this.confirmExternalTransaction(txMeta, txReceipt, baseFeePerGas);
224
+ this.trackMetaMetricsEvent({
225
+ event: 'STX Confirmed',
226
+ category: 'swaps',
227
+ });
228
+ this.updateSmartTransaction(Object.assign(Object.assign({}, smartTransaction), { confirmed: true }));
229
+ }
230
+ }
231
+ catch (e) {
232
+ this.trackMetaMetricsEvent({
233
+ event: 'STX Confirmation Failed',
234
+ category: 'swaps',
193
235
  });
236
+ console.error('confirm error', e);
194
237
  }
195
238
  }
196
239
  // ! Ask backend API to accept list of uuids as params
197
- async fetchSmartTransactionsStatus(uuids, { networkClientId } = {}) {
240
+ async fetchSmartTransactionsStatus(uuids) {
241
+ const { chainId } = this.config;
198
242
  const params = new URLSearchParams({
199
243
  uuids: uuids.join(','),
200
244
  });
201
- const chainId = this.getChainId({ networkClientId });
202
- const ethQuery = this.getEthQuery({ networkClientId });
203
245
  const url = `${(0, utils_1.getAPIRequestURL)(types_1.APIType.BATCH_STATUS, chainId)}?${params.toString()}`;
204
246
  const data = await this.fetch(url);
205
247
  Object.entries(data).forEach(([uuid, stxStatus]) => {
206
- __classPrivateFieldGet(this, _SmartTransactionsController_instances, "m", _SmartTransactionsController_updateSmartTransaction).call(this, {
248
+ this.updateSmartTransaction({
207
249
  statusMetadata: stxStatus,
208
250
  status: (0, utils_1.calculateStatus)(stxStatus),
209
251
  cancellable: (0, utils_1.isSmartTransactionCancellable)(stxStatus),
210
252
  uuid,
211
- }, { chainId, ethQuery });
253
+ });
212
254
  });
213
255
  return data;
214
256
  }
@@ -228,8 +270,8 @@ class SmartTransactionsController extends polling_controller_1.PollingController
228
270
  });
229
271
  return fees;
230
272
  }
231
- async getFees(tradeTx, approvalTx, { networkClientId } = {}) {
232
- const chainId = this.getChainId({ networkClientId });
273
+ async getFees(tradeTx, approvalTx) {
274
+ const { chainId } = this.config;
233
275
  const transactions = [];
234
276
  let unsignedTradeTransactionWithNonce;
235
277
  if (approvalTx) {
@@ -262,10 +304,7 @@ class SmartTransactionsController extends polling_controller_1.PollingController
262
304
  smartTransactionsState: Object.assign(Object.assign({}, this.state.smartTransactionsState), { fees: {
263
305
  approvalTxFees,
264
306
  tradeTxFees,
265
- }, feesByChainId: Object.assign(Object.assign({}, this.state.smartTransactionsState.feesByChainId), { [chainId]: {
266
- approvalTxFees,
267
- tradeTxFees,
268
- } }) }),
307
+ } }),
269
308
  });
270
309
  return {
271
310
  approvalTxFees,
@@ -274,9 +313,8 @@ class SmartTransactionsController extends polling_controller_1.PollingController
274
313
  }
275
314
  // * After this successful call client must add a nonce representative to
276
315
  // * transaction controller external transactions list
277
- async submitSignedTransactions({ txParams, signedTransactions, signedCanceledTransactions, networkClientId, }) {
278
- const chainId = this.getChainId({ networkClientId });
279
- const ethQuery = this.getEthQuery({ networkClientId });
316
+ async submitSignedTransactions({ txParams, signedTransactions, signedCanceledTransactions, }) {
317
+ const { chainId } = this.config;
280
318
  const data = await this.fetch((0, utils_1.getAPIRequestURL)(types_1.APIType.SUBMIT_TRANSACTIONS, chainId), {
281
319
  method: 'POST',
282
320
  body: JSON.stringify({
@@ -287,13 +325,11 @@ class SmartTransactionsController extends polling_controller_1.PollingController
287
325
  const time = Date.now();
288
326
  let preTxBalance;
289
327
  try {
290
- const preTxBalanceBN = await (0, controller_utils_1.query)(ethQuery, 'getBalance', [
291
- txParams === null || txParams === void 0 ? void 0 : txParams.from,
292
- ]);
293
- preTxBalance = new bignumber_js_1.BigNumber(preTxBalanceBN).toString(16);
328
+ const preTxBalanceBN = await this.ethersProvider.getBalance(txParams === null || txParams === void 0 ? void 0 : txParams.from);
329
+ preTxBalance = new bignumber_js_1.BigNumber(preTxBalanceBN.toHexString()).toString(16);
294
330
  }
295
331
  catch (e) {
296
- console.error('provider error', e);
332
+ console.error('ethers error', e);
297
333
  }
298
334
  const nonceLock = await this.getNonceLock(txParams === null || txParams === void 0 ? void 0 : txParams.from);
299
335
  try {
@@ -302,7 +338,8 @@ class SmartTransactionsController extends polling_controller_1.PollingController
302
338
  txParams.nonce = nonce;
303
339
  }
304
340
  const { nonceDetails } = nonceLock;
305
- __classPrivateFieldGet(this, _SmartTransactionsController_instances, "m", _SmartTransactionsController_updateSmartTransaction).call(this, {
341
+ this.updateSmartTransaction({
342
+ chainId,
306
343
  nonceDetails,
307
344
  preTxBalance,
308
345
  status: types_1.SmartTransactionStatuses.PENDING,
@@ -310,36 +347,25 @@ class SmartTransactionsController extends polling_controller_1.PollingController
310
347
  txParams,
311
348
  uuid: data.uuid,
312
349
  cancellable: true,
313
- }, { chainId, ethQuery });
350
+ });
314
351
  }
315
352
  finally {
316
353
  nonceLock.releaseLock();
317
354
  }
318
355
  return data;
319
356
  }
320
- getChainId({ networkClientId, } = {}) {
321
- return networkClientId
322
- ? this.getNetworkClientById(networkClientId).configuration.chainId
323
- : this.config.chainId;
324
- }
325
- getEthQuery({ networkClientId, }) {
326
- return networkClientId
327
- ? // @ts-expect-error TODO: Provider type alignment
328
- new eth_query_1.default(this.getNetworkClientById(networkClientId).provider)
329
- : this.ethQuery;
330
- }
331
357
  // TODO: This should return if the cancellation was on chain or not (for nonce management)
332
358
  // After this successful call client must update nonce representative
333
359
  // in transaction controller external transactions list
334
- async cancelSmartTransaction(uuid, { networkClientId, } = {}) {
335
- const chainId = this.getChainId({ networkClientId });
360
+ async cancelSmartTransaction(uuid) {
361
+ const { chainId } = this.config;
336
362
  await this.fetch((0, utils_1.getAPIRequestURL)(types_1.APIType.CANCEL, chainId), {
337
363
  method: 'POST',
338
364
  body: JSON.stringify({ uuid }),
339
365
  });
340
366
  }
341
- async fetchLiveness({ networkClientId, } = {}) {
342
- const chainId = this.getChainId({ networkClientId });
367
+ async fetchLiveness() {
368
+ const { chainId } = this.config;
343
369
  let liveness = false;
344
370
  try {
345
371
  const response = await this.fetch((0, utils_1.getAPIRequestURL)(types_1.APIType.LIVENESS, chainId));
@@ -349,7 +375,7 @@ class SmartTransactionsController extends polling_controller_1.PollingController
349
375
  console.log('"fetchLiveness" API call failed');
350
376
  }
351
377
  this.update({
352
- smartTransactionsState: Object.assign(Object.assign({}, this.state.smartTransactionsState), { liveness, livenessByChainId: Object.assign(Object.assign({}, this.state.smartTransactionsState.livenessByChainId), { [chainId]: liveness }) }),
378
+ smartTransactionsState: Object.assign(Object.assign({}, this.state.smartTransactionsState), { liveness }),
353
379
  });
354
380
  return liveness;
355
381
  }
@@ -372,91 +398,4 @@ class SmartTransactionsController extends polling_controller_1.PollingController
372
398
  }
373
399
  }
374
400
  exports.default = SmartTransactionsController;
375
- _SmartTransactionsController_instances = new WeakSet(), _SmartTransactionsController_updateSmartTransaction = function _SmartTransactionsController_updateSmartTransaction(smartTransaction, { chainId = this.config.chainId, ethQuery = this.ethQuery, }) {
376
- const { smartTransactionsState } = this.state;
377
- const { smartTransactions } = smartTransactionsState;
378
- const currentSmartTransactions = smartTransactions[chainId];
379
- const currentIndex = currentSmartTransactions === null || currentSmartTransactions === void 0 ? void 0 : currentSmartTransactions.findIndex((stx) => stx.uuid === smartTransaction.uuid);
380
- const isNewSmartTransaction = this.isNewSmartTransaction(smartTransaction.uuid);
381
- this.trackStxStatusChange(smartTransaction, isNewSmartTransaction
382
- ? undefined
383
- : currentSmartTransactions[currentIndex]);
384
- if (isNewSmartTransaction) {
385
- // add smart transaction
386
- const cancelledNonceIndex = currentSmartTransactions === null || currentSmartTransactions === void 0 ? void 0 : currentSmartTransactions.findIndex((stx) => {
387
- var _a, _b, _c;
388
- return ((_a = stx.txParams) === null || _a === void 0 ? void 0 : _a.nonce) === ((_b = smartTransaction.txParams) === null || _b === void 0 ? void 0 : _b.nonce) &&
389
- ((_c = stx.status) === null || _c === void 0 ? void 0 : _c.startsWith('cancelled'));
390
- });
391
- const snapshot = (0, cloneDeep_1.default)(smartTransaction);
392
- const history = [snapshot];
393
- const historifiedSmartTransaction = Object.assign(Object.assign({}, smartTransaction), { history });
394
- const nextSmartTransactions = cancelledNonceIndex > -1
395
- ? currentSmartTransactions
396
- .slice(0, cancelledNonceIndex)
397
- .concat(currentSmartTransactions.slice(cancelledNonceIndex + 1))
398
- .concat(historifiedSmartTransaction)
399
- : currentSmartTransactions === null || currentSmartTransactions === void 0 ? void 0 : currentSmartTransactions.concat(historifiedSmartTransaction);
400
- this.update({
401
- smartTransactionsState: Object.assign(Object.assign({}, smartTransactionsState), { smartTransactions: Object.assign(Object.assign({}, smartTransactionsState.smartTransactions), { [chainId]: nextSmartTransactions }) }),
402
- });
403
- return;
404
- }
405
- if ((smartTransaction.status === types_1.SmartTransactionStatuses.SUCCESS ||
406
- smartTransaction.status === types_1.SmartTransactionStatuses.REVERTED) &&
407
- !smartTransaction.confirmed) {
408
- // confirm smart transaction
409
- const currentSmartTransaction = currentSmartTransactions[currentIndex];
410
- const nextSmartTransaction = Object.assign(Object.assign({}, currentSmartTransaction), smartTransaction);
411
- __classPrivateFieldGet(this, _SmartTransactionsController_instances, "m", _SmartTransactionsController_confirmSmartTransaction).call(this, nextSmartTransaction, {
412
- chainId,
413
- ethQuery,
414
- });
415
- }
416
- this.update({
417
- smartTransactionsState: Object.assign(Object.assign({}, smartTransactionsState), { smartTransactions: Object.assign(Object.assign({}, smartTransactionsState.smartTransactions), { [chainId]: smartTransactionsState.smartTransactions[chainId].map((item, index) => {
418
- return index === currentIndex
419
- ? Object.assign(Object.assign({}, item), smartTransaction) : item;
420
- }) }) }),
421
- });
422
- }, _SmartTransactionsController_confirmSmartTransaction = async function _SmartTransactionsController_confirmSmartTransaction(smartTransaction, { chainId, ethQuery, }) {
423
- var _a;
424
- const txHash = (_a = smartTransaction.statusMetadata) === null || _a === void 0 ? void 0 : _a.minedHash;
425
- try {
426
- const transactionReceipt = await (0, controller_utils_1.query)(ethQuery, 'getTransactionReceipt', [txHash]);
427
- const transaction = await (0, controller_utils_1.query)(ethQuery, 'getTransactionByHash', [txHash]);
428
- const maxFeePerGas = transaction === null || transaction === void 0 ? void 0 : transaction.maxFeePerGas;
429
- const maxPriorityFeePerGas = transaction === null || transaction === void 0 ? void 0 : transaction.maxPriorityFeePerGas;
430
- if (transactionReceipt === null || transactionReceipt === void 0 ? void 0 : transactionReceipt.blockNumber) {
431
- const blockData = await (0, controller_utils_1.query)(ethQuery, 'getBlockByNumber', [transactionReceipt === null || transactionReceipt === void 0 ? void 0 : transactionReceipt.blockNumber, false]);
432
- const baseFeePerGas = blockData === null || blockData === void 0 ? void 0 : blockData.baseFeePerGas;
433
- const txReceipt = Object.values(transactionReceipt);
434
- const updatedTxParams = Object.assign(Object.assign({}, smartTransaction.txParams), { maxFeePerGas,
435
- maxPriorityFeePerGas });
436
- // call confirmExternalTransaction
437
- const originalTxMeta = Object.assign(Object.assign({}, smartTransaction), { id: smartTransaction.uuid, status: 'confirmed', hash: txHash, txParams: updatedTxParams });
438
- // create txMeta snapshot for history
439
- const snapshot = (0, utils_1.snapshotFromTxMeta)(originalTxMeta);
440
- // recover previous tx state obj
441
- const previousState = (0, utils_1.replayHistory)(originalTxMeta.history);
442
- // generate history entry and add to history
443
- const entry = (0, utils_1.generateHistoryEntry)(previousState, snapshot, 'txStateManager: setting status to confirmed');
444
- const txMeta = entry.length > 0
445
- ? Object.assign(Object.assign({}, originalTxMeta), { history: originalTxMeta.history.concat(entry) }) : originalTxMeta;
446
- this.confirmExternalTransaction(txMeta, txReceipt, baseFeePerGas);
447
- this.trackMetaMetricsEvent({
448
- event: 'STX Confirmed',
449
- category: 'swaps',
450
- });
451
- __classPrivateFieldGet(this, _SmartTransactionsController_instances, "m", _SmartTransactionsController_updateSmartTransaction).call(this, Object.assign(Object.assign({}, smartTransaction), { confirmed: true }), { chainId, ethQuery });
452
- }
453
- }
454
- catch (e) {
455
- this.trackMetaMetricsEvent({
456
- event: 'STX Confirmation Failed',
457
- category: 'swaps',
458
- });
459
- console.error('confirm error', e);
460
- }
461
- };
462
401
  //# sourceMappingURL=SmartTransactionsController.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SmartTransactionsController.js","sourceRoot":"","sources":["../src/SmartTransactionsController.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseConfig, BaseState } from '@metamask/base-controller';\nimport { ChainId, safelyExecute, query } from '@metamask/controller-utils';\nimport {\n NetworkState,\n NetworkController,\n NetworkClientId,\n} from '@metamask/network-controller';\nimport { PollingControllerV1 } from '@metamask/polling-controller';\nimport { BigNumber } from 'bignumber.js';\nimport EthQuery from '@metamask/eth-query';\nimport { hexlify } from '@ethersproject/bytes';\nimport cloneDeep from 'lodash/cloneDeep';\n\nimport {\n APIType,\n SmartTransaction,\n SignedTransaction,\n SignedCanceledTransaction,\n UnsignedTransaction,\n SmartTransactionsStatus,\n SmartTransactionStatuses,\n Fees,\n IndividualTxFees,\n Hex,\n} from './types';\nimport {\n getAPIRequestURL,\n isSmartTransactionPending,\n calculateStatus,\n snapshotFromTxMeta,\n replayHistory,\n generateHistoryEntry,\n getStxProcessingTime,\n handleFetch,\n isSmartTransactionCancellable,\n incrementNonceInHex,\n} from './utils';\nimport { CHAIN_IDS } from './constants';\n\nconst SECOND = 1000;\nexport const DEFAULT_INTERVAL = SECOND * 5;\n\nexport type SmartTransactionsControllerConfig = BaseConfig & {\n interval: number;\n clientId: string;\n chainId: Hex;\n supportedChainIds: string[];\n};\n\ntype FeeEstimates = {\n approvalTxFees: IndividualTxFees | undefined;\n tradeTxFees: IndividualTxFees | undefined;\n};\n\nexport type SmartTransactionsControllerState = BaseState & {\n smartTransactionsState: {\n smartTransactions: Record<Hex, SmartTransaction[]>;\n userOptIn: boolean | undefined;\n userOptInV2: boolean | undefined;\n liveness: boolean | undefined;\n fees: FeeEstimates;\n feesByChainId: Record<Hex, FeeEstimates>;\n livenessByChainId: Record<Hex, boolean>;\n };\n};\n\nexport default class SmartTransactionsController extends PollingControllerV1<\n SmartTransactionsControllerConfig,\n SmartTransactionsControllerState\n> {\n public timeoutHandle?: NodeJS.Timeout;\n\n private getNonceLock: any;\n\n public ethQuery: EthQuery;\n\n public confirmExternalTransaction: any;\n\n private trackMetaMetricsEvent: any;\n\n private getNetworkClientById: NetworkController['getNetworkClientById'];\n\n /* istanbul ignore next */\n private async fetch(request: string, options?: RequestInit) {\n const { clientId } = this.config;\n const fetchOptions = {\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...(clientId && { 'X-Client-Id': clientId }),\n },\n };\n\n return handleFetch(request, fetchOptions);\n }\n\n constructor(\n {\n onNetworkStateChange,\n getNonceLock,\n provider,\n confirmExternalTransaction,\n trackMetaMetricsEvent,\n getNetworkClientById,\n }: {\n onNetworkStateChange: (\n listener: (networkState: NetworkState) => void,\n ) => void;\n getNonceLock: any;\n provider: any;\n confirmExternalTransaction: any;\n trackMetaMetricsEvent: any;\n getNetworkClientById: NetworkController['getNetworkClientById'];\n },\n config?: Partial<SmartTransactionsControllerConfig>,\n state?: Partial<SmartTransactionsControllerState>,\n ) {\n super(config, state);\n\n this.defaultConfig = {\n interval: DEFAULT_INTERVAL,\n chainId: ChainId.mainnet,\n clientId: 'default',\n supportedChainIds: [CHAIN_IDS.ETHEREUM, CHAIN_IDS.GOERLI],\n };\n\n this.defaultState = {\n smartTransactionsState: {\n smartTransactions: {},\n userOptIn: undefined,\n userOptInV2: undefined,\n fees: {\n approvalTxFees: undefined,\n tradeTxFees: undefined,\n },\n liveness: true,\n livenessByChainId: {\n [CHAIN_IDS.ETHEREUM]: true,\n [CHAIN_IDS.GOERLI]: true,\n },\n feesByChainId: {\n [CHAIN_IDS.ETHEREUM]: {\n approvalTxFees: undefined,\n tradeTxFees: undefined,\n },\n [CHAIN_IDS.GOERLI]: {\n approvalTxFees: undefined,\n tradeTxFees: undefined,\n },\n },\n },\n };\n this.setIntervalLength(this.config.interval || DEFAULT_INTERVAL);\n this.getNonceLock = getNonceLock;\n this.ethQuery = new EthQuery(provider);\n this.confirmExternalTransaction = confirmExternalTransaction;\n this.trackMetaMetricsEvent = trackMetaMetricsEvent;\n this.getNetworkClientById = getNetworkClientById;\n\n this.initialize();\n this.initializeSmartTransactionsForChainId();\n\n onNetworkStateChange(({ providerConfig: newProvider }) => {\n const { chainId } = newProvider;\n this.configure({ chainId });\n this.initializeSmartTransactionsForChainId();\n this.checkPoll(this.state);\n this.ethQuery = new EthQuery(provider);\n });\n\n this.subscribe((currentState: any) => this.checkPoll(currentState));\n }\n\n _executePoll(networkClientId: string): Promise<void> {\n // if this is going to be truly UI driven polling we shouldn't really reach here\n // with a networkClientId that is not supported, but for now I'll add a check in case\n // wondering if we should add some kind of predicate to the polling controller to check whether\n // we should poll or not\n const chainId = this.getChainId({ networkClientId });\n if (!this.config.supportedChainIds.includes(chainId)) {\n return Promise.resolve();\n }\n return this.updateSmartTransactions({ networkClientId });\n }\n\n checkPoll(state: any) {\n const { smartTransactions } = state.smartTransactionsState;\n const currentSmartTransactions = smartTransactions[this.config.chainId];\n const pendingTransactions = currentSmartTransactions?.filter(\n isSmartTransactionPending,\n );\n if (!this.timeoutHandle && pendingTransactions?.length > 0) {\n this.poll();\n } else if (this.timeoutHandle && pendingTransactions?.length === 0) {\n this.stop();\n }\n }\n\n initializeSmartTransactionsForChainId() {\n if (this.config.supportedChainIds.includes(this.config.chainId)) {\n const { smartTransactionsState } = this.state;\n this.update({\n smartTransactionsState: {\n ...smartTransactionsState,\n smartTransactions: {\n ...smartTransactionsState.smartTransactions,\n [this.config.chainId]:\n smartTransactionsState.smartTransactions[this.config.chainId] ??\n [],\n },\n },\n });\n }\n }\n\n async poll(interval?: number): Promise<void> {\n const { chainId, supportedChainIds } = this.config;\n interval && this.configure({ interval }, false, false);\n this.timeoutHandle && clearInterval(this.timeoutHandle);\n if (!supportedChainIds.includes(chainId)) {\n return;\n }\n await safelyExecute(() => this.updateSmartTransactions());\n this.timeoutHandle = setInterval(() => {\n safelyExecute(() => this.updateSmartTransactions());\n }, this.config.interval);\n }\n\n async stop() {\n this.timeoutHandle && clearInterval(this.timeoutHandle);\n this.timeoutHandle = undefined;\n }\n\n setOptInState(state: boolean | undefined): void {\n this.update({\n smartTransactionsState: {\n ...this.state.smartTransactionsState,\n userOptInV2: state,\n },\n });\n }\n\n trackStxStatusChange(\n smartTransaction: SmartTransaction,\n prevSmartTransaction?: SmartTransaction,\n ) {\n if (!prevSmartTransaction) {\n return; // Don't track the first STX, because it doesn't have all necessary params.\n }\n\n let updatedSmartTransaction = cloneDeep(smartTransaction);\n updatedSmartTransaction = {\n ...cloneDeep(prevSmartTransaction),\n ...updatedSmartTransaction,\n };\n\n if (\n !updatedSmartTransaction.swapMetaData ||\n (updatedSmartTransaction.status === prevSmartTransaction.status &&\n prevSmartTransaction.swapMetaData)\n ) {\n return; // If status hasn't changed, don't track it again.\n }\n\n const sensitiveProperties = {\n stx_status: updatedSmartTransaction.status,\n token_from_symbol: updatedSmartTransaction.sourceTokenSymbol,\n token_to_symbol: updatedSmartTransaction.destinationTokenSymbol,\n processing_time: getStxProcessingTime(updatedSmartTransaction.time),\n stx_enabled: true,\n current_stx_enabled: true,\n stx_user_opt_in: true,\n };\n\n this.trackMetaMetricsEvent({\n event: 'STX Status Updated',\n category: 'swaps',\n sensitiveProperties,\n });\n }\n\n isNewSmartTransaction(smartTransactionUuid: string): boolean {\n const { chainId } = this.config;\n const { smartTransactionsState } = this.state;\n const { smartTransactions } = smartTransactionsState;\n const currentSmartTransactions = smartTransactions[chainId];\n const currentIndex = currentSmartTransactions?.findIndex(\n (stx) => stx.uuid === smartTransactionUuid,\n );\n return currentIndex === -1 || currentIndex === undefined;\n }\n\n updateSmartTransaction(\n smartTransaction: SmartTransaction,\n { networkClientId }: { networkClientId?: NetworkClientId } = {},\n ) {\n let { chainId } = this.config;\n let { ethQuery } = this;\n if (networkClientId) {\n const networkClient = this.getNetworkClientById(networkClientId);\n chainId = networkClient.configuration.chainId;\n // @ts-expect-error TODO: Provider type alignment\n ethQuery = new EthQuery(networkClient.provider);\n }\n\n this.#updateSmartTransaction(smartTransaction, {\n chainId,\n ethQuery,\n });\n }\n\n #updateSmartTransaction(\n smartTransaction: SmartTransaction,\n {\n chainId = this.config.chainId,\n ethQuery = this.ethQuery,\n }: {\n chainId: Hex;\n ethQuery: EthQuery;\n },\n ): void {\n const { smartTransactionsState } = this.state;\n const { smartTransactions } = smartTransactionsState;\n const currentSmartTransactions = smartTransactions[chainId];\n const currentIndex = currentSmartTransactions?.findIndex(\n (stx) => stx.uuid === smartTransaction.uuid,\n );\n const isNewSmartTransaction = this.isNewSmartTransaction(\n smartTransaction.uuid,\n );\n\n this.trackStxStatusChange(\n smartTransaction,\n isNewSmartTransaction\n ? undefined\n : currentSmartTransactions[currentIndex],\n );\n\n if (isNewSmartTransaction) {\n // add smart transaction\n const cancelledNonceIndex = currentSmartTransactions?.findIndex(\n (stx: SmartTransaction) =>\n stx.txParams?.nonce === smartTransaction.txParams?.nonce &&\n stx.status?.startsWith('cancelled'),\n );\n const snapshot = cloneDeep(smartTransaction);\n const history = [snapshot];\n const historifiedSmartTransaction = { ...smartTransaction, history };\n const nextSmartTransactions =\n cancelledNonceIndex > -1\n ? currentSmartTransactions\n .slice(0, cancelledNonceIndex)\n .concat(currentSmartTransactions.slice(cancelledNonceIndex + 1))\n .concat(historifiedSmartTransaction)\n : currentSmartTransactions?.concat(historifiedSmartTransaction);\n this.update({\n smartTransactionsState: {\n ...smartTransactionsState,\n smartTransactions: {\n ...smartTransactionsState.smartTransactions,\n [chainId]: nextSmartTransactions,\n },\n },\n });\n return;\n }\n\n if (\n (smartTransaction.status === SmartTransactionStatuses.SUCCESS ||\n smartTransaction.status === SmartTransactionStatuses.REVERTED) &&\n !smartTransaction.confirmed\n ) {\n // confirm smart transaction\n const currentSmartTransaction = currentSmartTransactions[currentIndex];\n const nextSmartTransaction = {\n ...currentSmartTransaction,\n ...smartTransaction,\n };\n this.#confirmSmartTransaction(nextSmartTransaction, {\n chainId,\n ethQuery,\n });\n }\n\n this.update({\n smartTransactionsState: {\n ...smartTransactionsState,\n smartTransactions: {\n ...smartTransactionsState.smartTransactions,\n [chainId]: smartTransactionsState.smartTransactions[chainId].map(\n (item, index) => {\n return index === currentIndex\n ? { ...item, ...smartTransaction }\n : item;\n },\n ),\n },\n },\n });\n }\n\n async updateSmartTransactions({\n networkClientId,\n }: {\n networkClientId?: NetworkClientId;\n } = {}): Promise<void> {\n const { smartTransactions } = this.state.smartTransactionsState;\n const chainId = this.getChainId({ networkClientId });\n const smartTransactionsForChainId = smartTransactions?.[chainId];\n\n const transactionsToUpdate: string[] = smartTransactionsForChainId\n .filter(isSmartTransactionPending)\n .map((smartTransaction) => smartTransaction.uuid);\n\n if (transactionsToUpdate.length > 0) {\n this.fetchSmartTransactionsStatus(transactionsToUpdate, {\n networkClientId,\n });\n }\n }\n\n async #confirmSmartTransaction(\n smartTransaction: SmartTransaction,\n {\n chainId,\n ethQuery,\n }: {\n chainId: Hex;\n ethQuery: EthQuery;\n },\n ) {\n const txHash = smartTransaction.statusMetadata?.minedHash;\n try {\n const transactionReceipt: {\n maxFeePerGas?: string;\n maxPriorityFeePerGas?: string;\n blockNumber: string;\n } | null = await query(ethQuery, 'getTransactionReceipt', [txHash]);\n\n const transaction: {\n maxFeePerGas?: string;\n maxPriorityFeePerGas?: string;\n } | null = await query(ethQuery, 'getTransactionByHash', [txHash]);\n\n const maxFeePerGas = transaction?.maxFeePerGas;\n const maxPriorityFeePerGas = transaction?.maxPriorityFeePerGas;\n if (transactionReceipt?.blockNumber) {\n const blockData: { baseFeePerGas?: string } | null = await query(\n ethQuery,\n 'getBlockByNumber',\n [transactionReceipt?.blockNumber, false],\n );\n const baseFeePerGas = blockData?.baseFeePerGas;\n const txReceipt = Object.values(transactionReceipt);\n const updatedTxParams = {\n ...smartTransaction.txParams,\n maxFeePerGas,\n maxPriorityFeePerGas,\n };\n // call confirmExternalTransaction\n const originalTxMeta = {\n ...smartTransaction,\n id: smartTransaction.uuid,\n status: 'confirmed',\n hash: txHash,\n txParams: updatedTxParams,\n };\n // create txMeta snapshot for history\n const snapshot = snapshotFromTxMeta(originalTxMeta);\n // recover previous tx state obj\n const previousState = replayHistory(originalTxMeta.history);\n // generate history entry and add to history\n const entry = generateHistoryEntry(\n previousState,\n snapshot,\n 'txStateManager: setting status to confirmed',\n );\n const txMeta =\n entry.length > 0\n ? {\n ...originalTxMeta,\n history: originalTxMeta.history.concat(entry),\n }\n : originalTxMeta;\n\n this.confirmExternalTransaction(txMeta, txReceipt, baseFeePerGas);\n\n this.trackMetaMetricsEvent({\n event: 'STX Confirmed',\n category: 'swaps',\n });\n\n this.#updateSmartTransaction(\n {\n ...smartTransaction,\n confirmed: true,\n },\n { chainId, ethQuery },\n );\n }\n } catch (e) {\n this.trackMetaMetricsEvent({\n event: 'STX Confirmation Failed',\n category: 'swaps',\n });\n console.error('confirm error', e);\n }\n }\n\n // ! Ask backend API to accept list of uuids as params\n async fetchSmartTransactionsStatus(\n uuids: string[],\n { networkClientId }: { networkClientId?: NetworkClientId } = {},\n ): Promise<SmartTransaction[]> {\n const params = new URLSearchParams({\n uuids: uuids.join(','),\n });\n const chainId = this.getChainId({ networkClientId });\n const ethQuery = this.getEthQuery({ networkClientId });\n const url = `${getAPIRequestURL(\n APIType.BATCH_STATUS,\n chainId,\n )}?${params.toString()}`;\n\n const data = await this.fetch(url);\n Object.entries(data).forEach(([uuid, stxStatus]) => {\n this.#updateSmartTransaction(\n {\n statusMetadata: stxStatus as SmartTransactionsStatus,\n status: calculateStatus(stxStatus as SmartTransactionsStatus),\n cancellable: isSmartTransactionCancellable(\n stxStatus as SmartTransactionsStatus,\n ),\n uuid,\n },\n { chainId, ethQuery },\n );\n });\n\n return data;\n }\n\n async addNonceToTransaction(\n transaction: UnsignedTransaction,\n ): Promise<UnsignedTransaction> {\n const nonceLock = await this.getNonceLock(transaction.from);\n const nonce = nonceLock.nextNonce;\n nonceLock.releaseLock();\n return {\n ...transaction,\n nonce: `0x${nonce.toString(16)}`,\n };\n }\n\n clearFees(): Fees {\n const fees = {\n approvalTxFees: undefined,\n tradeTxFees: undefined,\n };\n this.update({\n smartTransactionsState: {\n ...this.state.smartTransactionsState,\n fees,\n },\n });\n return fees;\n }\n\n async getFees(\n tradeTx: UnsignedTransaction,\n approvalTx: UnsignedTransaction,\n { networkClientId }: { networkClientId?: NetworkClientId } = {},\n ): Promise<Fees> {\n const chainId = this.getChainId({ networkClientId });\n const transactions = [];\n let unsignedTradeTransactionWithNonce;\n if (approvalTx) {\n const unsignedApprovalTransactionWithNonce =\n await this.addNonceToTransaction(approvalTx);\n transactions.push(unsignedApprovalTransactionWithNonce);\n unsignedTradeTransactionWithNonce = {\n ...tradeTx,\n // If there is an approval tx, the trade tx's nonce is increased by 1.\n nonce: incrementNonceInHex(unsignedApprovalTransactionWithNonce.nonce),\n };\n } else {\n unsignedTradeTransactionWithNonce = await this.addNonceToTransaction(\n tradeTx,\n );\n }\n transactions.push(unsignedTradeTransactionWithNonce);\n const data = await this.fetch(getAPIRequestURL(APIType.GET_FEES, chainId), {\n method: 'POST',\n body: JSON.stringify({\n txs: transactions,\n }),\n });\n let approvalTxFees;\n let tradeTxFees;\n if (approvalTx) {\n approvalTxFees = data?.txs[0];\n tradeTxFees = data?.txs[1];\n } else {\n tradeTxFees = data?.txs[0];\n }\n\n this.update({\n smartTransactionsState: {\n ...this.state.smartTransactionsState,\n fees: {\n approvalTxFees,\n tradeTxFees,\n },\n feesByChainId: {\n ...this.state.smartTransactionsState.feesByChainId,\n [chainId]: {\n approvalTxFees,\n tradeTxFees,\n },\n },\n },\n });\n\n return {\n approvalTxFees,\n tradeTxFees,\n };\n }\n\n // * After this successful call client must add a nonce representative to\n // * transaction controller external transactions list\n async submitSignedTransactions({\n txParams,\n signedTransactions,\n signedCanceledTransactions,\n networkClientId,\n }: {\n signedTransactions: SignedTransaction[];\n signedCanceledTransactions: SignedCanceledTransaction[];\n txParams?: any;\n networkClientId?: NetworkClientId;\n }) {\n const chainId = this.getChainId({ networkClientId });\n const ethQuery = this.getEthQuery({ networkClientId });\n const data = await this.fetch(\n getAPIRequestURL(APIType.SUBMIT_TRANSACTIONS, chainId),\n {\n method: 'POST',\n body: JSON.stringify({\n rawTxs: signedTransactions,\n rawCancelTxs: signedCanceledTransactions,\n }),\n },\n );\n const time = Date.now();\n let preTxBalance;\n try {\n const preTxBalanceBN = await query(ethQuery, 'getBalance', [\n txParams?.from,\n ]);\n preTxBalance = new BigNumber(preTxBalanceBN).toString(16);\n } catch (e) {\n console.error('provider error', e);\n }\n const nonceLock = await this.getNonceLock(txParams?.from);\n try {\n const nonce = hexlify(nonceLock.nextNonce);\n if (txParams && !txParams?.nonce) {\n txParams.nonce = nonce;\n }\n const { nonceDetails } = nonceLock;\n\n this.#updateSmartTransaction(\n {\n nonceDetails,\n preTxBalance,\n status: SmartTransactionStatuses.PENDING,\n time,\n txParams,\n uuid: data.uuid,\n cancellable: true,\n },\n { chainId, ethQuery },\n );\n } finally {\n nonceLock.releaseLock();\n }\n\n return data;\n }\n\n getChainId({\n networkClientId,\n }: { networkClientId?: NetworkClientId } = {}): Hex {\n return networkClientId\n ? this.getNetworkClientById(networkClientId).configuration.chainId\n : this.config.chainId;\n }\n\n getEthQuery({\n networkClientId,\n }: {\n networkClientId?: NetworkClientId;\n }): EthQuery {\n return networkClientId\n ? // @ts-expect-error TODO: Provider type alignment\n new EthQuery(this.getNetworkClientById(networkClientId).provider)\n : this.ethQuery;\n }\n\n // TODO: This should return if the cancellation was on chain or not (for nonce management)\n // After this successful call client must update nonce representative\n // in transaction controller external transactions list\n async cancelSmartTransaction(\n uuid: string,\n {\n networkClientId,\n }: {\n networkClientId?: NetworkClientId;\n } = {},\n ): Promise<void> {\n const chainId = this.getChainId({ networkClientId });\n await this.fetch(getAPIRequestURL(APIType.CANCEL, chainId), {\n method: 'POST',\n body: JSON.stringify({ uuid }),\n });\n }\n\n async fetchLiveness({\n networkClientId,\n }: {\n networkClientId?: NetworkClientId;\n } = {}): Promise<boolean> {\n const chainId = this.getChainId({ networkClientId });\n let liveness = false;\n try {\n const response = await this.fetch(\n getAPIRequestURL(APIType.LIVENESS, chainId),\n );\n liveness = Boolean(response.lastBlock);\n } catch (e) {\n console.log('\"fetchLiveness\" API call failed');\n }\n\n this.update({\n smartTransactionsState: {\n ...this.state.smartTransactionsState,\n liveness,\n livenessByChainId: {\n ...this.state.smartTransactionsState.livenessByChainId,\n [chainId]: liveness,\n },\n },\n });\n\n return liveness;\n }\n\n async setStatusRefreshInterval(interval: number): Promise<void> {\n if (interval !== this.config.interval) {\n this.configure({ interval }, false, false);\n }\n }\n\n getTransactions({\n addressFrom,\n status,\n }: {\n addressFrom: string;\n status: SmartTransactionStatuses;\n }): SmartTransaction[] {\n const { smartTransactions } = this.state.smartTransactionsState;\n const { chainId } = this.config;\n const currentSmartTransactions = smartTransactions?.[chainId];\n if (!currentSmartTransactions || currentSmartTransactions.length === 0) {\n return [];\n }\n\n return currentSmartTransactions.filter((stx) => {\n return stx.status === status && stx.txParams?.from === addressFrom;\n });\n }\n}\n"]}
1
+ {"version":3,"file":"SmartTransactionsController.js","sourceRoot":"","sources":["../src/SmartTransactionsController.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n BaseConfig,\n BaseController,\n BaseState,\n} from '@metamask/base-controller';\nimport { safelyExecute } from '@metamask/controller-utils';\nimport { NetworkState } from '@metamask/network-controller';\nimport { BigNumber } from 'bignumber.js';\nimport { BigNumber as ethersBigNumber } from '@ethersproject/bignumber';\nimport { Web3Provider } from '@ethersproject/providers';\nimport { hexlify } from '@ethersproject/bytes';\nimport mapValues from 'lodash/mapValues';\nimport cloneDeep from 'lodash/cloneDeep';\n\nimport {\n APIType,\n SmartTransaction,\n SignedTransaction,\n SignedCanceledTransaction,\n UnsignedTransaction,\n SmartTransactionsStatus,\n SmartTransactionStatuses,\n Fees,\n IndividualTxFees,\n} from './types';\nimport {\n getAPIRequestURL,\n isSmartTransactionPending,\n calculateStatus,\n snapshotFromTxMeta,\n replayHistory,\n generateHistoryEntry,\n getStxProcessingTime,\n handleFetch,\n isSmartTransactionCancellable,\n incrementNonceInHex,\n} from './utils';\nimport { CHAIN_IDS } from './constants';\n\nconst SECOND = 1000;\nexport const DEFAULT_INTERVAL = SECOND * 5;\n\nexport type SmartTransactionsControllerConfig = BaseConfig & {\n interval: number;\n clientId: string;\n chainId: string;\n supportedChainIds: string[];\n};\n\nexport type SmartTransactionsControllerState = BaseState & {\n smartTransactionsState: {\n smartTransactions: Record<string, SmartTransaction[]>;\n userOptIn: boolean | undefined;\n userOptInV2: boolean | undefined;\n liveness: boolean | undefined;\n fees: {\n approvalTxFees: IndividualTxFees | undefined;\n tradeTxFees: IndividualTxFees | undefined;\n };\n };\n};\n\nexport default class SmartTransactionsController extends BaseController<\n SmartTransactionsControllerConfig,\n SmartTransactionsControllerState\n> {\n public timeoutHandle?: NodeJS.Timeout;\n\n private getNonceLock: any;\n\n public ethersProvider: any;\n\n public confirmExternalTransaction: any;\n\n private trackMetaMetricsEvent: any;\n\n /* istanbul ignore next */\n private async fetch(request: string, options?: RequestInit) {\n const { clientId } = this.config;\n const fetchOptions = {\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...(clientId && { 'X-Client-Id': clientId }),\n },\n };\n\n return handleFetch(request, fetchOptions);\n }\n\n constructor(\n {\n onNetworkStateChange,\n getNonceLock,\n provider,\n confirmExternalTransaction,\n trackMetaMetricsEvent,\n }: {\n onNetworkStateChange: (\n listener: (networkState: NetworkState) => void,\n ) => void;\n getNonceLock: any;\n provider: any;\n confirmExternalTransaction: any;\n trackMetaMetricsEvent: any;\n },\n config?: Partial<SmartTransactionsControllerConfig>,\n state?: Partial<SmartTransactionsControllerState>,\n ) {\n super(config, state);\n\n this.defaultConfig = {\n interval: DEFAULT_INTERVAL,\n chainId: CHAIN_IDS.ETHEREUM,\n clientId: 'default',\n supportedChainIds: [CHAIN_IDS.ETHEREUM, CHAIN_IDS.RINKEBY],\n };\n\n this.defaultState = {\n smartTransactionsState: {\n smartTransactions: {},\n userOptIn: undefined,\n userOptInV2: undefined,\n fees: {\n approvalTxFees: undefined,\n tradeTxFees: undefined,\n },\n liveness: true,\n },\n };\n\n this.getNonceLock = getNonceLock;\n this.ethersProvider = new Web3Provider(provider);\n this.confirmExternalTransaction = confirmExternalTransaction;\n this.trackMetaMetricsEvent = trackMetaMetricsEvent;\n\n this.initialize();\n this.initializeSmartTransactionsForChainId();\n\n onNetworkStateChange(({ providerConfig: newProvider }) => {\n const { chainId } = newProvider;\n this.configure({ chainId });\n this.initializeSmartTransactionsForChainId();\n this.checkPoll(this.state);\n this.ethersProvider = new Web3Provider(provider);\n });\n\n this.subscribe((currentState: any) => this.checkPoll(currentState));\n }\n\n checkPoll(state: any) {\n const { smartTransactions } = state.smartTransactionsState;\n const currentSmartTransactions = smartTransactions[this.config.chainId];\n const pendingTransactions = currentSmartTransactions?.filter(\n isSmartTransactionPending,\n );\n if (!this.timeoutHandle && pendingTransactions?.length > 0) {\n this.poll();\n } else if (this.timeoutHandle && pendingTransactions?.length === 0) {\n this.stop();\n }\n }\n\n initializeSmartTransactionsForChainId() {\n if (this.config.supportedChainIds.includes(this.config.chainId)) {\n const { smartTransactionsState } = this.state;\n this.update({\n smartTransactionsState: {\n ...smartTransactionsState,\n smartTransactions: {\n ...smartTransactionsState.smartTransactions,\n [this.config.chainId]:\n smartTransactionsState.smartTransactions[this.config.chainId] ??\n [],\n },\n },\n });\n }\n }\n\n async poll(interval?: number): Promise<void> {\n const { chainId, supportedChainIds } = this.config;\n interval && this.configure({ interval }, false, false);\n this.timeoutHandle && clearInterval(this.timeoutHandle);\n if (!supportedChainIds.includes(chainId)) {\n return;\n }\n await safelyExecute(() => this.updateSmartTransactions());\n this.timeoutHandle = setInterval(() => {\n safelyExecute(() => this.updateSmartTransactions());\n }, this.config.interval);\n }\n\n async stop() {\n this.timeoutHandle && clearInterval(this.timeoutHandle);\n this.timeoutHandle = undefined;\n }\n\n setOptInState(state: boolean | undefined): void {\n this.update({\n smartTransactionsState: {\n ...this.state.smartTransactionsState,\n userOptInV2: state,\n },\n });\n }\n\n trackStxStatusChange(\n smartTransaction: SmartTransaction,\n prevSmartTransaction?: SmartTransaction,\n ) {\n if (!prevSmartTransaction) {\n return; // Don't track the first STX, because it doesn't have all necessary params.\n }\n\n let updatedSmartTransaction = cloneDeep(smartTransaction);\n updatedSmartTransaction = {\n ...cloneDeep(prevSmartTransaction),\n ...updatedSmartTransaction,\n };\n\n if (\n !updatedSmartTransaction.swapMetaData ||\n (updatedSmartTransaction.status === prevSmartTransaction.status &&\n prevSmartTransaction.swapMetaData)\n ) {\n return; // If status hasn't changed, don't track it again.\n }\n\n const sensitiveProperties = {\n stx_status: updatedSmartTransaction.status,\n token_from_symbol: updatedSmartTransaction.sourceTokenSymbol,\n token_to_symbol: updatedSmartTransaction.destinationTokenSymbol,\n processing_time: getStxProcessingTime(updatedSmartTransaction.time),\n stx_enabled: true,\n current_stx_enabled: true,\n stx_user_opt_in: true,\n };\n\n this.trackMetaMetricsEvent({\n event: 'STX Status Updated',\n category: 'swaps',\n sensitiveProperties,\n });\n }\n\n isNewSmartTransaction(smartTransactionUuid: string): boolean {\n const { chainId } = this.config;\n const { smartTransactionsState } = this.state;\n const { smartTransactions } = smartTransactionsState;\n const currentSmartTransactions = smartTransactions[chainId];\n const currentIndex = currentSmartTransactions?.findIndex(\n (stx) => stx.uuid === smartTransactionUuid,\n );\n return currentIndex === -1 || currentIndex === undefined;\n }\n\n updateSmartTransaction(smartTransaction: SmartTransaction): void {\n const { chainId } = this.config;\n const { smartTransactionsState } = this.state;\n const { smartTransactions } = smartTransactionsState;\n const currentSmartTransactions = smartTransactions[chainId];\n const currentIndex = currentSmartTransactions?.findIndex(\n (stx) => stx.uuid === smartTransaction.uuid,\n );\n const isNewSmartTransaction = this.isNewSmartTransaction(\n smartTransaction.uuid,\n );\n this.trackStxStatusChange(\n smartTransaction,\n isNewSmartTransaction\n ? undefined\n : currentSmartTransactions[currentIndex],\n );\n\n if (isNewSmartTransaction) {\n // add smart transaction\n const cancelledNonceIndex = currentSmartTransactions.findIndex(\n (stx: SmartTransaction) =>\n stx.txParams?.nonce === smartTransaction.txParams?.nonce &&\n stx.status?.startsWith('cancelled'),\n );\n const snapshot = cloneDeep(smartTransaction);\n const history = [snapshot];\n const historifiedSmartTransaction = { ...smartTransaction, history };\n const nextSmartTransactions =\n cancelledNonceIndex > -1\n ? currentSmartTransactions\n .slice(0, cancelledNonceIndex)\n .concat(currentSmartTransactions.slice(cancelledNonceIndex + 1))\n .concat(historifiedSmartTransaction)\n : currentSmartTransactions.concat(historifiedSmartTransaction);\n this.update({\n smartTransactionsState: {\n ...smartTransactionsState,\n smartTransactions: {\n ...smartTransactionsState.smartTransactions,\n [chainId]: nextSmartTransactions,\n },\n },\n });\n return;\n }\n\n if (\n (smartTransaction.status === SmartTransactionStatuses.SUCCESS ||\n smartTransaction.status === SmartTransactionStatuses.REVERTED) &&\n !smartTransaction.confirmed\n ) {\n // confirm smart transaction\n const currentSmartTransaction = currentSmartTransactions[currentIndex];\n const nextSmartTransaction = {\n ...currentSmartTransaction,\n ...smartTransaction,\n };\n this.confirmSmartTransaction(nextSmartTransaction);\n }\n\n this.update({\n smartTransactionsState: {\n ...smartTransactionsState,\n smartTransactions: {\n ...smartTransactionsState.smartTransactions,\n [chainId]: smartTransactionsState.smartTransactions[chainId].map(\n (item, index) => {\n return index === currentIndex\n ? { ...item, ...smartTransaction }\n : item;\n },\n ),\n },\n },\n });\n }\n\n async updateSmartTransactions() {\n const { smartTransactions } = this.state.smartTransactionsState;\n const { chainId } = this.config;\n\n const currentSmartTransactions = smartTransactions?.[chainId];\n\n const transactionsToUpdate: string[] = currentSmartTransactions\n .filter(isSmartTransactionPending)\n .map((smartTransaction) => smartTransaction.uuid);\n\n if (transactionsToUpdate.length > 0) {\n this.fetchSmartTransactionsStatus(transactionsToUpdate);\n }\n }\n\n async confirmSmartTransaction(smartTransaction: SmartTransaction) {\n const txHash = smartTransaction.statusMetadata?.minedHash;\n try {\n const transactionReceipt =\n await this.ethersProvider.getTransactionReceipt(txHash);\n const transaction = await this.ethersProvider.getTransaction(txHash);\n const maxFeePerGas = transaction.maxFeePerGas?.toHexString();\n const maxPriorityFeePerGas =\n transaction.maxPriorityFeePerGas?.toHexString();\n if (transactionReceipt?.blockNumber) {\n const blockData = await this.ethersProvider.getBlock(\n transactionReceipt?.blockNumber,\n false,\n );\n const baseFeePerGas = blockData?.baseFeePerGas.toHexString();\n const txReceipt = mapValues(transactionReceipt, (value) => {\n if (value instanceof ethersBigNumber) {\n return value.toHexString();\n }\n return value;\n });\n const updatedTxParams = {\n ...smartTransaction.txParams,\n maxFeePerGas,\n maxPriorityFeePerGas,\n };\n // call confirmExternalTransaction\n const originalTxMeta = {\n ...smartTransaction,\n id: smartTransaction.uuid,\n status: 'confirmed',\n hash: txHash,\n txParams: updatedTxParams,\n };\n // create txMeta snapshot for history\n const snapshot = snapshotFromTxMeta(originalTxMeta);\n // recover previous tx state obj\n const previousState = replayHistory(originalTxMeta.history);\n // generate history entry and add to history\n const entry = generateHistoryEntry(\n previousState,\n snapshot,\n 'txStateManager: setting status to confirmed',\n );\n const txMeta =\n entry.length > 0\n ? {\n ...originalTxMeta,\n history: originalTxMeta.history.concat(entry),\n }\n : originalTxMeta;\n this.confirmExternalTransaction(txMeta, txReceipt, baseFeePerGas);\n\n this.trackMetaMetricsEvent({\n event: 'STX Confirmed',\n category: 'swaps',\n });\n\n this.updateSmartTransaction({\n ...smartTransaction,\n confirmed: true,\n });\n }\n } catch (e) {\n this.trackMetaMetricsEvent({\n event: 'STX Confirmation Failed',\n category: 'swaps',\n });\n console.error('confirm error', e);\n }\n }\n\n // ! Ask backend API to accept list of uuids as params\n async fetchSmartTransactionsStatus(\n uuids: string[],\n ): Promise<SmartTransaction[]> {\n const { chainId } = this.config;\n\n const params = new URLSearchParams({\n uuids: uuids.join(','),\n });\n\n const url = `${getAPIRequestURL(\n APIType.BATCH_STATUS,\n chainId,\n )}?${params.toString()}`;\n\n const data = await this.fetch(url);\n\n Object.entries(data).forEach(([uuid, stxStatus]) => {\n this.updateSmartTransaction({\n statusMetadata: stxStatus as SmartTransactionsStatus,\n status: calculateStatus(stxStatus as SmartTransactionsStatus),\n cancellable: isSmartTransactionCancellable(\n stxStatus as SmartTransactionsStatus,\n ),\n uuid,\n });\n });\n\n return data;\n }\n\n async addNonceToTransaction(\n transaction: UnsignedTransaction,\n ): Promise<UnsignedTransaction> {\n const nonceLock = await this.getNonceLock(transaction.from);\n const nonce = nonceLock.nextNonce;\n nonceLock.releaseLock();\n return {\n ...transaction,\n nonce: `0x${nonce.toString(16)}`,\n };\n }\n\n clearFees(): Fees {\n const fees = {\n approvalTxFees: undefined,\n tradeTxFees: undefined,\n };\n this.update({\n smartTransactionsState: {\n ...this.state.smartTransactionsState,\n fees,\n },\n });\n return fees;\n }\n\n async getFees(\n tradeTx: UnsignedTransaction,\n approvalTx: UnsignedTransaction,\n ): Promise<Fees> {\n const { chainId } = this.config;\n const transactions = [];\n let unsignedTradeTransactionWithNonce;\n if (approvalTx) {\n const unsignedApprovalTransactionWithNonce =\n await this.addNonceToTransaction(approvalTx);\n transactions.push(unsignedApprovalTransactionWithNonce);\n unsignedTradeTransactionWithNonce = {\n ...tradeTx,\n // If there is an approval tx, the trade tx's nonce is increased by 1.\n nonce: incrementNonceInHex(unsignedApprovalTransactionWithNonce.nonce),\n };\n } else {\n unsignedTradeTransactionWithNonce = await this.addNonceToTransaction(\n tradeTx,\n );\n }\n transactions.push(unsignedTradeTransactionWithNonce);\n const data = await this.fetch(getAPIRequestURL(APIType.GET_FEES, chainId), {\n method: 'POST',\n body: JSON.stringify({\n txs: transactions,\n }),\n });\n let approvalTxFees;\n let tradeTxFees;\n if (approvalTx) {\n approvalTxFees = data?.txs[0];\n tradeTxFees = data?.txs[1];\n } else {\n tradeTxFees = data?.txs[0];\n }\n\n this.update({\n smartTransactionsState: {\n ...this.state.smartTransactionsState,\n fees: {\n approvalTxFees,\n tradeTxFees,\n },\n },\n });\n return {\n approvalTxFees,\n tradeTxFees,\n };\n }\n\n // * After this successful call client must add a nonce representative to\n // * transaction controller external transactions list\n async submitSignedTransactions({\n txParams,\n signedTransactions,\n signedCanceledTransactions,\n }: {\n signedTransactions: SignedTransaction[];\n signedCanceledTransactions: SignedCanceledTransaction[];\n txParams?: any;\n }) {\n const { chainId } = this.config;\n const data = await this.fetch(\n getAPIRequestURL(APIType.SUBMIT_TRANSACTIONS, chainId),\n {\n method: 'POST',\n body: JSON.stringify({\n rawTxs: signedTransactions,\n rawCancelTxs: signedCanceledTransactions,\n }),\n },\n );\n const time = Date.now();\n let preTxBalance;\n try {\n const preTxBalanceBN = await this.ethersProvider.getBalance(\n txParams?.from,\n );\n preTxBalance = new BigNumber(preTxBalanceBN.toHexString()).toString(16);\n } catch (e) {\n console.error('ethers error', e);\n }\n const nonceLock = await this.getNonceLock(txParams?.from);\n try {\n const nonce = hexlify(nonceLock.nextNonce);\n if (txParams && !txParams?.nonce) {\n txParams.nonce = nonce;\n }\n const { nonceDetails } = nonceLock;\n\n this.updateSmartTransaction({\n chainId,\n nonceDetails,\n preTxBalance,\n status: SmartTransactionStatuses.PENDING,\n time,\n txParams,\n uuid: data.uuid,\n cancellable: true,\n });\n } finally {\n nonceLock.releaseLock();\n }\n\n return data;\n }\n\n // TODO: This should return if the cancellation was on chain or not (for nonce management)\n // After this successful call client must update nonce representative\n // in transaction controller external transactions list\n async cancelSmartTransaction(uuid: string): Promise<void> {\n const { chainId } = this.config;\n await this.fetch(getAPIRequestURL(APIType.CANCEL, chainId), {\n method: 'POST',\n body: JSON.stringify({ uuid }),\n });\n }\n\n async fetchLiveness(): Promise<boolean> {\n const { chainId } = this.config;\n let liveness = false;\n try {\n const response = await this.fetch(\n getAPIRequestURL(APIType.LIVENESS, chainId),\n );\n liveness = Boolean(response.lastBlock);\n } catch (e) {\n console.log('\"fetchLiveness\" API call failed');\n }\n\n this.update({\n smartTransactionsState: {\n ...this.state.smartTransactionsState,\n liveness,\n },\n });\n return liveness;\n }\n\n async setStatusRefreshInterval(interval: number): Promise<void> {\n if (interval !== this.config.interval) {\n this.configure({ interval }, false, false);\n }\n }\n\n getTransactions({\n addressFrom,\n status,\n }: {\n addressFrom: string;\n status: SmartTransactionStatuses;\n }): SmartTransaction[] {\n const { smartTransactions } = this.state.smartTransactionsState;\n const { chainId } = this.config;\n const currentSmartTransactions = smartTransactions?.[chainId];\n if (!currentSmartTransactions || currentSmartTransactions.length === 0) {\n return [];\n }\n\n return currentSmartTransactions.filter((stx) => {\n return stx.status === status && stx.txParams?.from === addressFrom;\n });\n }\n}\n"]}
@@ -1,7 +1,6 @@
1
1
  export declare const API_BASE_URL = "https://transaction.metaswap.codefi.network";
2
2
  export declare const CHAIN_IDS: {
3
- readonly ETHEREUM: "0x1";
4
- readonly GOERLI: "0x5";
5
- readonly RINKEBY: "0x4";
6
- readonly BSC: "0x38";
3
+ ETHEREUM: string;
4
+ RINKEBY: string;
5
+ BSC: string;
7
6
  };
package/dist/constants.js CHANGED
@@ -4,7 +4,6 @@ exports.CHAIN_IDS = exports.API_BASE_URL = void 0;
4
4
  exports.API_BASE_URL = 'https://transaction.metaswap.codefi.network';
5
5
  exports.CHAIN_IDS = {
6
6
  ETHEREUM: '0x1',
7
- GOERLI: '0x5',
8
7
  RINKEBY: '0x4',
9
8
  BSC: '0x38',
10
9
  };
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,YAAY,GAAG,6CAA6C,CAAC;AAC7D,QAAA,SAAS,GAAG;IACvB,QAAQ,EAAE,KAAK;IACf,MAAM,EAAE,KAAK;IACb,OAAO,EAAE,KAAK;IACd,GAAG,EAAE,MAAM;CACH,CAAC","sourcesContent":["export const API_BASE_URL = 'https://transaction.metaswap.codefi.network';\nexport const CHAIN_IDS = {\n ETHEREUM: '0x1',\n GOERLI: '0x5',\n RINKEBY: '0x4',\n BSC: '0x38',\n} as const;\n"]}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,YAAY,GAAG,6CAA6C,CAAC;AAC7D,QAAA,SAAS,GAAG;IACvB,QAAQ,EAAE,KAAK;IACf,OAAO,EAAE,KAAK;IACd,GAAG,EAAE,MAAM;CACZ,CAAC","sourcesContent":["export const API_BASE_URL = 'https://transaction.metaswap.codefi.network';\nexport const CHAIN_IDS = {\n ETHEREUM: '0x1',\n RINKEBY: '0x4',\n BSC: '0x38',\n};\n"]}
package/dist/types.d.ts CHANGED
@@ -94,4 +94,3 @@ export declare type Fees = {
94
94
  export declare type UnsignedTransaction = any;
95
95
  export declare type SignedTransaction = any;
96
96
  export declare type SignedCanceledTransaction = any;
97
- export declare type Hex = `0x${string}`;
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";AAAA,UAAU;;;AAEV,IAAY,OAOX;AAPD,WAAY,OAAO;IACjB,6CAAU,CAAA;IACV,qDAAc,CAAA;IACd,mEAAqB,CAAA;IACrB,yCAAQ,CAAA;IACR,qDAAc,CAAA;IACd,6CAAU,CAAA;AACZ,CAAC,EAPW,OAAO,GAAP,eAAO,KAAP,eAAO,QAOlB;AAED,wBAAwB;AAExB,IAAY,uBAMX;AAND,WAAY,uBAAuB;IACjC,kDAAuB,CAAA;IACvB,8CAAmB,CAAA;IACnB,kDAAuB,CAAA;IACvB,gDAAqB,CAAA;IACrB,8CAAmB,CAAA;AACrB,CAAC,EANW,uBAAuB,GAAvB,+BAAuB,KAAvB,+BAAuB,QAMlC;AAED,IAAY,kCAQX;AARD,WAAY,kCAAkC;IAC5C,mEAA6B,CAAA;IAC7B,6DAAuB,CAAA;IACvB,yEAAmC,CAAA;IACnC,qEAA+B,CAAA;IAC/B,uEAAiC,CAAA;IACjC,qEAA+B,CAAA;IAC/B,qFAA+C,CAAA;AACjD,CAAC,EARW,kCAAkC,GAAlC,0CAAkC,KAAlC,0CAAkC,QAQ7C;AAED,IAAY,wBAaX;AAbD,WAAY,wBAAwB;IAClC,+CAAmB,CAAA;IACnB,+CAAmB,CAAA;IACnB,iDAAqB,CAAA;IACrB,+CAAmB,CAAA;IACnB,mDAAuB,CAAA;IACvB,6EAAiD,CAAA;IACjD,uEAA2C,CAAA;IAC3C,mFAAuD,CAAA;IACvD,+EAAmD,CAAA;IACnD,iFAAqD,CAAA;IACrD,+FAAmE,CAAA;IACnE,iDAAqB,CAAA;AACvB,CAAC,EAbW,wBAAwB,GAAxB,gCAAwB,KAAxB,gCAAwB,QAanC;AAEY,QAAA,6BAA6B,GAAG;IAC3C,CAAC,kCAAkC,CAAC,YAAY,CAAC,EAC/C,wBAAwB,CAAC,sBAAsB;IACjD,CAAC,kCAAkC,CAAC,SAAS,CAAC,EAC5C,wBAAwB,CAAC,mBAAmB;IAC9C,CAAC,kCAAkC,CAAC,eAAe,CAAC,EAClD,wBAAwB,CAAC,yBAAyB;IACpD,CAAC,kCAAkC,CAAC,aAAa,CAAC,EAChD,wBAAwB,CAAC,uBAAuB;IAClD,CAAC,kCAAkC,CAAC,cAAc,CAAC,EACjD,wBAAwB,CAAC,wBAAwB;IACnD,CAAC,kCAAkC,CAAC,qBAAqB,CAAC,EACxD,wBAAwB,CAAC,+BAA+B;CAC3D,CAAC","sourcesContent":["/** API */\n\nexport enum APIType {\n 'GET_FEES',\n 'ESTIMATE_GAS',\n 'SUBMIT_TRANSACTIONS',\n 'CANCEL',\n 'BATCH_STATUS',\n 'LIVENESS',\n}\n\n/** SmartTransactions */\n\nexport enum SmartTransactionMinedTx {\n NOT_MINED = 'not_mined',\n SUCCESS = 'success',\n CANCELLED = 'cancelled',\n REVERTED = 'reverted',\n UNKNOWN = 'unknown',\n}\n\nexport enum SmartTransactionCancellationReason {\n WOULD_REVERT = 'would_revert',\n TOO_CHEAP = 'too_cheap',\n DEADLINE_MISSED = 'deadline_missed',\n INVALID_NONCE = 'invalid_nonce',\n USER_CANCELLED = 'user_cancelled',\n NOT_CANCELLED = 'not_cancelled',\n PREVIOUS_TX_CANCELLED = 'previous_tx_cancelled',\n}\n\nexport enum SmartTransactionStatuses {\n PENDING = 'pending',\n SUCCESS = 'success',\n REVERTED = 'reverted',\n UNKNOWN = 'unknown',\n CANCELLED = 'cancelled',\n CANCELLED_WOULD_REVERT = 'cancelled_would_revert',\n CANCELLED_TOO_CHEAP = 'cancelled_too_cheap',\n CANCELLED_DEADLINE_MISSED = 'cancelled_deadline_missed',\n CANCELLED_INVALID_NONCE = 'cancelled_invalid_nonce',\n CANCELLED_USER_CANCELLED = 'cancelled_user_cancelled',\n CANCELLED_PREVIOUS_TX_CANCELLED = 'cancelled_previous_tx_cancelled',\n RESOLVED = 'resolved',\n}\n\nexport const cancellationReasonToStatusMap = {\n [SmartTransactionCancellationReason.WOULD_REVERT]:\n SmartTransactionStatuses.CANCELLED_WOULD_REVERT,\n [SmartTransactionCancellationReason.TOO_CHEAP]:\n SmartTransactionStatuses.CANCELLED_TOO_CHEAP,\n [SmartTransactionCancellationReason.DEADLINE_MISSED]:\n SmartTransactionStatuses.CANCELLED_DEADLINE_MISSED,\n [SmartTransactionCancellationReason.INVALID_NONCE]:\n SmartTransactionStatuses.CANCELLED_INVALID_NONCE,\n [SmartTransactionCancellationReason.USER_CANCELLED]:\n SmartTransactionStatuses.CANCELLED_USER_CANCELLED,\n [SmartTransactionCancellationReason.PREVIOUS_TX_CANCELLED]:\n SmartTransactionStatuses.CANCELLED_PREVIOUS_TX_CANCELLED,\n};\n\nexport type SmartTransactionsStatus = {\n error?: string;\n cancellationFeeWei: number;\n cancellationReason?: SmartTransactionCancellationReason;\n deadlineRatio: number;\n minedHash: string | undefined;\n minedTx: SmartTransactionMinedTx;\n isSettled: boolean;\n};\n\nexport type SmartTransaction = {\n uuid: string;\n chainId?: string;\n destinationTokenAddress?: string;\n destinationTokenDecimals?: string;\n destinationTokenSymbol?: string;\n history?: any;\n nonceDetails?: any;\n origin?: string;\n preTxBalance?: string;\n status?: string;\n statusMetadata?: SmartTransactionsStatus;\n sourceTokenSymbol?: string;\n swapMetaData?: any;\n swapTokenValue?: string;\n time?: number;\n txParams?: any;\n type?: string;\n confirmed?: boolean;\n cancellable?: boolean;\n};\n\nexport type Fee = {\n maxFeePerGas: number;\n maxPriorityFeePerGas: number;\n};\n\nexport type IndividualTxFees = {\n fees: Fee[];\n cancelFees: Fee[];\n feeEstimate: number;\n gasLimit: number;\n gasUsed: number;\n};\n\nexport type Fees = {\n approvalTxFees: IndividualTxFees | undefined;\n tradeTxFees: IndividualTxFees | undefined;\n};\n\n// TODO\nexport type UnsignedTransaction = any;\n\n// TODO\nexport type SignedTransaction = any;\n\n// TODO\nexport type SignedCanceledTransaction = any;\n\nexport type Hex = `0x${string}`;\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";AAAA,UAAU;;;AAEV,IAAY,OAOX;AAPD,WAAY,OAAO;IACjB,6CAAU,CAAA;IACV,qDAAc,CAAA;IACd,mEAAqB,CAAA;IACrB,yCAAQ,CAAA;IACR,qDAAc,CAAA;IACd,6CAAU,CAAA;AACZ,CAAC,EAPW,OAAO,GAAP,eAAO,KAAP,eAAO,QAOlB;AAED,wBAAwB;AAExB,IAAY,uBAMX;AAND,WAAY,uBAAuB;IACjC,kDAAuB,CAAA;IACvB,8CAAmB,CAAA;IACnB,kDAAuB,CAAA;IACvB,gDAAqB,CAAA;IACrB,8CAAmB,CAAA;AACrB,CAAC,EANW,uBAAuB,GAAvB,+BAAuB,KAAvB,+BAAuB,QAMlC;AAED,IAAY,kCAQX;AARD,WAAY,kCAAkC;IAC5C,mEAA6B,CAAA;IAC7B,6DAAuB,CAAA;IACvB,yEAAmC,CAAA;IACnC,qEAA+B,CAAA;IAC/B,uEAAiC,CAAA;IACjC,qEAA+B,CAAA;IAC/B,qFAA+C,CAAA;AACjD,CAAC,EARW,kCAAkC,GAAlC,0CAAkC,KAAlC,0CAAkC,QAQ7C;AAED,IAAY,wBAaX;AAbD,WAAY,wBAAwB;IAClC,+CAAmB,CAAA;IACnB,+CAAmB,CAAA;IACnB,iDAAqB,CAAA;IACrB,+CAAmB,CAAA;IACnB,mDAAuB,CAAA;IACvB,6EAAiD,CAAA;IACjD,uEAA2C,CAAA;IAC3C,mFAAuD,CAAA;IACvD,+EAAmD,CAAA;IACnD,iFAAqD,CAAA;IACrD,+FAAmE,CAAA;IACnE,iDAAqB,CAAA;AACvB,CAAC,EAbW,wBAAwB,GAAxB,gCAAwB,KAAxB,gCAAwB,QAanC;AAEY,QAAA,6BAA6B,GAAG;IAC3C,CAAC,kCAAkC,CAAC,YAAY,CAAC,EAC/C,wBAAwB,CAAC,sBAAsB;IACjD,CAAC,kCAAkC,CAAC,SAAS,CAAC,EAC5C,wBAAwB,CAAC,mBAAmB;IAC9C,CAAC,kCAAkC,CAAC,eAAe,CAAC,EAClD,wBAAwB,CAAC,yBAAyB;IACpD,CAAC,kCAAkC,CAAC,aAAa,CAAC,EAChD,wBAAwB,CAAC,uBAAuB;IAClD,CAAC,kCAAkC,CAAC,cAAc,CAAC,EACjD,wBAAwB,CAAC,wBAAwB;IACnD,CAAC,kCAAkC,CAAC,qBAAqB,CAAC,EACxD,wBAAwB,CAAC,+BAA+B;CAC3D,CAAC","sourcesContent":["/** API */\n\nexport enum APIType {\n 'GET_FEES',\n 'ESTIMATE_GAS',\n 'SUBMIT_TRANSACTIONS',\n 'CANCEL',\n 'BATCH_STATUS',\n 'LIVENESS',\n}\n\n/** SmartTransactions */\n\nexport enum SmartTransactionMinedTx {\n NOT_MINED = 'not_mined',\n SUCCESS = 'success',\n CANCELLED = 'cancelled',\n REVERTED = 'reverted',\n UNKNOWN = 'unknown',\n}\n\nexport enum SmartTransactionCancellationReason {\n WOULD_REVERT = 'would_revert',\n TOO_CHEAP = 'too_cheap',\n DEADLINE_MISSED = 'deadline_missed',\n INVALID_NONCE = 'invalid_nonce',\n USER_CANCELLED = 'user_cancelled',\n NOT_CANCELLED = 'not_cancelled',\n PREVIOUS_TX_CANCELLED = 'previous_tx_cancelled',\n}\n\nexport enum SmartTransactionStatuses {\n PENDING = 'pending',\n SUCCESS = 'success',\n REVERTED = 'reverted',\n UNKNOWN = 'unknown',\n CANCELLED = 'cancelled',\n CANCELLED_WOULD_REVERT = 'cancelled_would_revert',\n CANCELLED_TOO_CHEAP = 'cancelled_too_cheap',\n CANCELLED_DEADLINE_MISSED = 'cancelled_deadline_missed',\n CANCELLED_INVALID_NONCE = 'cancelled_invalid_nonce',\n CANCELLED_USER_CANCELLED = 'cancelled_user_cancelled',\n CANCELLED_PREVIOUS_TX_CANCELLED = 'cancelled_previous_tx_cancelled',\n RESOLVED = 'resolved',\n}\n\nexport const cancellationReasonToStatusMap = {\n [SmartTransactionCancellationReason.WOULD_REVERT]:\n SmartTransactionStatuses.CANCELLED_WOULD_REVERT,\n [SmartTransactionCancellationReason.TOO_CHEAP]:\n SmartTransactionStatuses.CANCELLED_TOO_CHEAP,\n [SmartTransactionCancellationReason.DEADLINE_MISSED]:\n SmartTransactionStatuses.CANCELLED_DEADLINE_MISSED,\n [SmartTransactionCancellationReason.INVALID_NONCE]:\n SmartTransactionStatuses.CANCELLED_INVALID_NONCE,\n [SmartTransactionCancellationReason.USER_CANCELLED]:\n SmartTransactionStatuses.CANCELLED_USER_CANCELLED,\n [SmartTransactionCancellationReason.PREVIOUS_TX_CANCELLED]:\n SmartTransactionStatuses.CANCELLED_PREVIOUS_TX_CANCELLED,\n};\n\nexport type SmartTransactionsStatus = {\n error?: string;\n cancellationFeeWei: number;\n cancellationReason?: SmartTransactionCancellationReason;\n deadlineRatio: number;\n minedHash: string | undefined;\n minedTx: SmartTransactionMinedTx;\n isSettled: boolean;\n};\n\nexport type SmartTransaction = {\n uuid: string;\n chainId?: string;\n destinationTokenAddress?: string;\n destinationTokenDecimals?: string;\n destinationTokenSymbol?: string;\n history?: any;\n nonceDetails?: any;\n origin?: string;\n preTxBalance?: string;\n status?: string;\n statusMetadata?: SmartTransactionsStatus;\n sourceTokenSymbol?: string;\n swapMetaData?: any;\n swapTokenValue?: string;\n time?: number;\n txParams?: any;\n type?: string;\n confirmed?: boolean;\n cancellable?: boolean;\n};\n\nexport type Fee = {\n maxFeePerGas: number;\n maxPriorityFeePerGas: number;\n};\n\nexport type IndividualTxFees = {\n fees: Fee[];\n cancelFees: Fee[];\n feeEstimate: number;\n gasLimit: number;\n gasUsed: number;\n};\n\nexport type Fees = {\n approvalTxFees: IndividualTxFees | undefined;\n tradeTxFees: IndividualTxFees | undefined;\n};\n\n// TODO\nexport type UnsignedTransaction = any;\n\n// TODO\nexport type SignedTransaction = any;\n\n// TODO\nexport type SignedCanceledTransaction = any;\n"]}
package/dist/utils.js CHANGED
@@ -30,7 +30,7 @@ function getAPIRequestURL(apiType, chainId) {
30
30
  return `${constants_1.API_BASE_URL}/networks/${chainIdDec}/estimateGas`;
31
31
  }
32
32
  case types_1.APIType.SUBMIT_TRANSACTIONS: {
33
- return `${constants_1.API_BASE_URL}/networks/${chainIdDec}/submitTransactions&stxControllerVersion=${package_json_1.default.version}`;
33
+ return `${constants_1.API_BASE_URL}/networks/${chainIdDec}/submitTransactions?stxControllerVersion=${package_json_1.default.version}`;
34
34
  }
35
35
  case types_1.APIType.CANCEL: {
36
36
  return `${constants_1.API_BASE_URL}/networks/${chainIdDec}/cancel`;
package/dist/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import jsonDiffer from 'fast-json-patch';\nimport _ from 'lodash';\nimport { BigNumber } from 'bignumber.js';\nimport { hexlify } from '@ethersproject/bytes';\n\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport packageJson from '../package.json';\n\nimport {\n APIType,\n SmartTransaction,\n SmartTransactionsStatus,\n SmartTransactionStatuses,\n SmartTransactionCancellationReason,\n SmartTransactionMinedTx,\n cancellationReasonToStatusMap,\n} from './types';\nimport { API_BASE_URL } from './constants';\n\nexport function isSmartTransactionPending(smartTransaction: SmartTransaction) {\n return smartTransaction.status === SmartTransactionStatuses.PENDING;\n}\n\nexport const isSmartTransactionStatusResolved = (\n stxStatus: SmartTransactionsStatus | string,\n) => stxStatus === 'uuid_not_found';\n\n// TODO use actual url once API is defined\nexport function getAPIRequestURL(apiType: APIType, chainId: string): string {\n const chainIdDec = parseInt(chainId, 16);\n switch (apiType) {\n case APIType.GET_FEES: {\n return `${API_BASE_URL}/networks/${chainIdDec}/getFees`;\n }\n\n case APIType.ESTIMATE_GAS: {\n return `${API_BASE_URL}/networks/${chainIdDec}/estimateGas`;\n }\n\n case APIType.SUBMIT_TRANSACTIONS: {\n return `${API_BASE_URL}/networks/${chainIdDec}/submitTransactions&stxControllerVersion=${packageJson.version}`;\n }\n\n case APIType.CANCEL: {\n return `${API_BASE_URL}/networks/${chainIdDec}/cancel`;\n }\n\n case APIType.BATCH_STATUS: {\n return `${API_BASE_URL}/networks/${chainIdDec}/batchStatus`;\n }\n\n case APIType.LIVENESS: {\n return `${API_BASE_URL}/networks/${chainIdDec}/health`;\n }\n\n default: {\n throw new Error(`Invalid APIType`); // It can never get here thanks to TypeScript.\n }\n }\n}\n\nexport const calculateStatus = (stxStatus: SmartTransactionsStatus) => {\n if (isSmartTransactionStatusResolved(stxStatus)) {\n return SmartTransactionStatuses.RESOLVED;\n }\n const cancellations = [\n SmartTransactionCancellationReason.WOULD_REVERT,\n SmartTransactionCancellationReason.TOO_CHEAP,\n SmartTransactionCancellationReason.DEADLINE_MISSED,\n SmartTransactionCancellationReason.INVALID_NONCE,\n SmartTransactionCancellationReason.USER_CANCELLED,\n SmartTransactionCancellationReason.PREVIOUS_TX_CANCELLED,\n ];\n if (stxStatus?.minedTx === SmartTransactionMinedTx.NOT_MINED) {\n if (\n stxStatus.cancellationReason ===\n SmartTransactionCancellationReason.NOT_CANCELLED\n ) {\n return SmartTransactionStatuses.PENDING;\n }\n\n const isCancellation =\n cancellations.findIndex(\n (cancellation) => cancellation === stxStatus.cancellationReason,\n ) > -1;\n if (stxStatus.cancellationReason && isCancellation) {\n if (!stxStatus.isSettled) {\n return SmartTransactionStatuses.PENDING;\n }\n return cancellationReasonToStatusMap[stxStatus.cancellationReason];\n }\n } else if (stxStatus?.minedTx === SmartTransactionMinedTx.SUCCESS) {\n return SmartTransactionStatuses.SUCCESS;\n } else if (stxStatus?.minedTx === SmartTransactionMinedTx.CANCELLED) {\n return SmartTransactionStatuses.CANCELLED;\n } else if (stxStatus?.minedTx === SmartTransactionMinedTx.REVERTED) {\n return SmartTransactionStatuses.REVERTED;\n } else if (stxStatus?.minedTx === SmartTransactionMinedTx.UNKNOWN) {\n return SmartTransactionStatuses.UNKNOWN;\n }\n return SmartTransactionStatuses.UNKNOWN;\n};\n\n/**\n Generates an array of history objects sense the previous state.\n The object has the keys\n op (the operation performed),\n path (the key and if a nested object then each key will be separated with a `/`)\n value\n with the first entry having the note and a timestamp when the change took place\n @param previousState - the previous state of the object\n @param newState - the update object\n @param [note] - a optional note for the state change\n @returns\n*/\nexport function generateHistoryEntry(\n previousState: any,\n newState: any,\n note: string,\n) {\n const entry: any = jsonDiffer.compare(previousState, newState);\n // Add a note to the first op, since it breaks if we append it to the entry\n if (entry[0]) {\n if (note) {\n entry[0].note = note;\n }\n\n entry[0].timestamp = Date.now();\n }\n return entry;\n}\n\n/**\n Recovers previous txMeta state obj\n @returns\n*/\nexport function replayHistory(_shortHistory: any) {\n const shortHistory = _.cloneDeep(_shortHistory);\n return shortHistory.reduce(\n (val: any, entry: any) => jsonDiffer.applyPatch(val, entry).newDocument,\n );\n}\n\n/**\n * Snapshot {@code txMeta}\n * @param txMeta - the tx metadata object\n * @returns a deep clone without history\n */\nexport function snapshotFromTxMeta(txMeta: any) {\n const shallow = { ...txMeta };\n delete shallow.history;\n return _.cloneDeep(shallow);\n}\n\n/**\n * Returns processing time for an STX in seconds.\n * @param smartTransactionSubmittedtime\n * @returns Processing time in seconds.\n */\nexport const getStxProcessingTime = (\n smartTransactionSubmittedtime: number | undefined,\n): number | undefined => {\n if (!smartTransactionSubmittedtime) {\n return undefined;\n }\n return Math.round((Date.now() - smartTransactionSubmittedtime) / 1000);\n};\n\nexport const mapKeysToCamel = (\n obj: Record<string, any>,\n): Record<string, any> => {\n if (!_.isObject(obj)) {\n return obj;\n }\n const mappedValues = _.mapValues(obj, (val: Record<string, any>) => {\n if (_.isArray(val)) {\n return val.map(mapKeysToCamel);\n } else if (_.isObject(val)) {\n return mapKeysToCamel(val);\n }\n return val;\n });\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n return _.mapKeys(mappedValues, (value, key) => _.camelCase(key));\n};\n\nexport async function handleFetch(request: string, options?: RequestInit) {\n const response = await fetch(request, options);\n const json = await response.json();\n if (!response.ok) {\n console.log(`response`, response);\n throw new Error(\n `Fetch error:${JSON.stringify({\n status: response.status,\n ...mapKeysToCamel(json),\n })}`,\n );\n }\n return json;\n}\n\nexport const isSmartTransactionCancellable = (\n stxStatus: SmartTransactionsStatus,\n): boolean => {\n return (\n stxStatus.minedTx === SmartTransactionMinedTx.NOT_MINED &&\n (!stxStatus.cancellationReason ||\n stxStatus.cancellationReason ===\n SmartTransactionCancellationReason.NOT_CANCELLED)\n );\n};\n\nexport const incrementNonceInHex = (nonceInHex: string): string => {\n const nonceInDec = new BigNumber(nonceInHex, 16).toString(10);\n return hexlify(Number(nonceInDec) + 1);\n};\n"]}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import jsonDiffer from 'fast-json-patch';\nimport _ from 'lodash';\nimport { BigNumber } from 'bignumber.js';\nimport { hexlify } from '@ethersproject/bytes';\n\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport packageJson from '../package.json';\n\nimport {\n APIType,\n SmartTransaction,\n SmartTransactionsStatus,\n SmartTransactionStatuses,\n SmartTransactionCancellationReason,\n SmartTransactionMinedTx,\n cancellationReasonToStatusMap,\n} from './types';\nimport { API_BASE_URL } from './constants';\n\nexport function isSmartTransactionPending(smartTransaction: SmartTransaction) {\n return smartTransaction.status === SmartTransactionStatuses.PENDING;\n}\n\nexport const isSmartTransactionStatusResolved = (\n stxStatus: SmartTransactionsStatus | string,\n) => stxStatus === 'uuid_not_found';\n\n// TODO use actual url once API is defined\nexport function getAPIRequestURL(apiType: APIType, chainId: string): string {\n const chainIdDec = parseInt(chainId, 16);\n switch (apiType) {\n case APIType.GET_FEES: {\n return `${API_BASE_URL}/networks/${chainIdDec}/getFees`;\n }\n\n case APIType.ESTIMATE_GAS: {\n return `${API_BASE_URL}/networks/${chainIdDec}/estimateGas`;\n }\n\n case APIType.SUBMIT_TRANSACTIONS: {\n return `${API_BASE_URL}/networks/${chainIdDec}/submitTransactions?stxControllerVersion=${packageJson.version}`;\n }\n\n case APIType.CANCEL: {\n return `${API_BASE_URL}/networks/${chainIdDec}/cancel`;\n }\n\n case APIType.BATCH_STATUS: {\n return `${API_BASE_URL}/networks/${chainIdDec}/batchStatus`;\n }\n\n case APIType.LIVENESS: {\n return `${API_BASE_URL}/networks/${chainIdDec}/health`;\n }\n\n default: {\n throw new Error(`Invalid APIType`); // It can never get here thanks to TypeScript.\n }\n }\n}\n\nexport const calculateStatus = (stxStatus: SmartTransactionsStatus) => {\n if (isSmartTransactionStatusResolved(stxStatus)) {\n return SmartTransactionStatuses.RESOLVED;\n }\n const cancellations = [\n SmartTransactionCancellationReason.WOULD_REVERT,\n SmartTransactionCancellationReason.TOO_CHEAP,\n SmartTransactionCancellationReason.DEADLINE_MISSED,\n SmartTransactionCancellationReason.INVALID_NONCE,\n SmartTransactionCancellationReason.USER_CANCELLED,\n SmartTransactionCancellationReason.PREVIOUS_TX_CANCELLED,\n ];\n if (stxStatus?.minedTx === SmartTransactionMinedTx.NOT_MINED) {\n if (\n stxStatus.cancellationReason ===\n SmartTransactionCancellationReason.NOT_CANCELLED\n ) {\n return SmartTransactionStatuses.PENDING;\n }\n\n const isCancellation =\n cancellations.findIndex(\n (cancellation) => cancellation === stxStatus.cancellationReason,\n ) > -1;\n if (stxStatus.cancellationReason && isCancellation) {\n if (!stxStatus.isSettled) {\n return SmartTransactionStatuses.PENDING;\n }\n return cancellationReasonToStatusMap[stxStatus.cancellationReason];\n }\n } else if (stxStatus?.minedTx === SmartTransactionMinedTx.SUCCESS) {\n return SmartTransactionStatuses.SUCCESS;\n } else if (stxStatus?.minedTx === SmartTransactionMinedTx.CANCELLED) {\n return SmartTransactionStatuses.CANCELLED;\n } else if (stxStatus?.minedTx === SmartTransactionMinedTx.REVERTED) {\n return SmartTransactionStatuses.REVERTED;\n } else if (stxStatus?.minedTx === SmartTransactionMinedTx.UNKNOWN) {\n return SmartTransactionStatuses.UNKNOWN;\n }\n return SmartTransactionStatuses.UNKNOWN;\n};\n\n/**\n Generates an array of history objects sense the previous state.\n The object has the keys\n op (the operation performed),\n path (the key and if a nested object then each key will be separated with a `/`)\n value\n with the first entry having the note and a timestamp when the change took place\n @param previousState - the previous state of the object\n @param newState - the update object\n @param [note] - a optional note for the state change\n @returns\n*/\nexport function generateHistoryEntry(\n previousState: any,\n newState: any,\n note: string,\n) {\n const entry: any = jsonDiffer.compare(previousState, newState);\n // Add a note to the first op, since it breaks if we append it to the entry\n if (entry[0]) {\n if (note) {\n entry[0].note = note;\n }\n\n entry[0].timestamp = Date.now();\n }\n return entry;\n}\n\n/**\n Recovers previous txMeta state obj\n @returns\n*/\nexport function replayHistory(_shortHistory: any) {\n const shortHistory = _.cloneDeep(_shortHistory);\n return shortHistory.reduce(\n (val: any, entry: any) => jsonDiffer.applyPatch(val, entry).newDocument,\n );\n}\n\n/**\n * Snapshot {@code txMeta}\n * @param txMeta - the tx metadata object\n * @returns a deep clone without history\n */\nexport function snapshotFromTxMeta(txMeta: any) {\n const shallow = { ...txMeta };\n delete shallow.history;\n return _.cloneDeep(shallow);\n}\n\n/**\n * Returns processing time for an STX in seconds.\n * @param smartTransactionSubmittedtime\n * @returns Processing time in seconds.\n */\nexport const getStxProcessingTime = (\n smartTransactionSubmittedtime: number | undefined,\n): number | undefined => {\n if (!smartTransactionSubmittedtime) {\n return undefined;\n }\n return Math.round((Date.now() - smartTransactionSubmittedtime) / 1000);\n};\n\nexport const mapKeysToCamel = (\n obj: Record<string, any>,\n): Record<string, any> => {\n if (!_.isObject(obj)) {\n return obj;\n }\n const mappedValues = _.mapValues(obj, (val: Record<string, any>) => {\n if (_.isArray(val)) {\n return val.map(mapKeysToCamel);\n } else if (_.isObject(val)) {\n return mapKeysToCamel(val);\n }\n return val;\n });\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n return _.mapKeys(mappedValues, (value, key) => _.camelCase(key));\n};\n\nexport async function handleFetch(request: string, options?: RequestInit) {\n const response = await fetch(request, options);\n const json = await response.json();\n if (!response.ok) {\n console.log(`response`, response);\n throw new Error(\n `Fetch error:${JSON.stringify({\n status: response.status,\n ...mapKeysToCamel(json),\n })}`,\n );\n }\n return json;\n}\n\nexport const isSmartTransactionCancellable = (\n stxStatus: SmartTransactionsStatus,\n): boolean => {\n return (\n stxStatus.minedTx === SmartTransactionMinedTx.NOT_MINED &&\n (!stxStatus.cancellationReason ||\n stxStatus.cancellationReason ===\n SmartTransactionCancellationReason.NOT_CANCELLED)\n );\n};\n\nexport const incrementNonceInHex = (nonceInHex: string): string => {\n const nonceInDec = new BigNumber(nonceInHex, 16).toString(10);\n return hexlify(Number(nonceInDec) + 1);\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metamask/smart-transactions-controller",
3
- "version": "6.2.0",
3
+ "version": "6.2.2",
4
4
  "description": "Improves success rates for swaps by trialing transactions privately and finding minimum fees",
5
5
  "repository": {
6
6
  "type": "git",
@@ -25,12 +25,12 @@
25
25
  "test:watch": "jest --watchAll"
26
26
  },
27
27
  "dependencies": {
28
+ "@ethersproject/bignumber": "^5.7.0",
28
29
  "@ethersproject/bytes": "^5.7.0",
30
+ "@ethersproject/providers": "^5.7.0",
29
31
  "@metamask/base-controller": "^3.2.1",
30
32
  "@metamask/controller-utils": "^5.0.0",
31
- "@metamask/eth-query": "^3.0.1",
32
33
  "@metamask/network-controller": "^15.0.0",
33
- "@metamask/polling-controller": "^0.2.0",
34
34
  "bignumber.js": "^9.0.1",
35
35
  "fast-json-patch": "^3.1.0",
36
36
  "lodash": "^4.17.21"