@metamask/smart-transactions-controller 1.0.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -6,6 +6,37 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [1.4.0]
10
+ ### Added
11
+ - Add isomorphic-fetch to stx controller ([#38](https://github.com/MetaMask/smart-transactions-controller/pull/38))
12
+ - feat: create new handleFetch with custom error handling ([#35](https://github.com/MetaMask/smart-transactions-controller/pull/35))
13
+ - Unblock submit if ethers errors ([#30](https://github.com/MetaMask/smart-transactions-controller/pull/30))
14
+ - Parse chain ids from hex to dec instead of mapping them ([#31](https://github.com/MetaMask/smart-transactions-controller/pull/31))
15
+ - chore(deps): bump @metamask/controllers from 20.0.0 to 20.1.0 ([#28](https://github.com/MetaMask/smart-transactions-controller/pull/28))
16
+ - getTransactions -> getFees, refactoring ([#27](https://github.com/MetaMask/smart-transactions-controller/pull/27))
17
+ - chore(deps): bump @metamask/controllers from 19.0.0 to 20.0.0 ([#24](https://github.com/MetaMask/smart-transactions-controller/pull/24))
18
+ - Switch license with MetaMask license ([#25](https://github.com/MetaMask/smart-transactions-controller/pull/25))
19
+
20
+ ## [1.3.0]
21
+ ### Added
22
+ - Use the production version of the Transaction APIs repo ([#37](https://github.com/MetaMask/smart-transactions-controller/pull/37))
23
+
24
+ ## [1.2.0]
25
+ ### Added
26
+ - Add more unit tests for SmartTransactionsController ([#23](https://github.com/MetaMask/smart-transactions-controller/pull/23))
27
+ - chore(deps): bump @metamask/controllers from 16.0.0 to 19.0.0 ([#18](https://github.com/MetaMask/smart-transactions-controller/pull/18))
28
+ - Add cancelled status to stx after successful cancel request ([#21](https://github.com/MetaMask/smart-transactions-controller/pull/21))
29
+ - 1.1.0 ([#22](https://github.com/MetaMask/smart-transactions-controller/pull/22))
30
+
31
+ ## [1.1.0]
32
+ ### Added
33
+ - Tracking of STX status changes ([#20](https://github.com/MetaMask/smart-transactions-controller/pull/20))
34
+ - Remove cancelled transaction when new trx with same nonce submitted ([#19](https://github.com/MetaMask/smart-transactions-controller/pull/19))
35
+ - chore: modify polling and clean up tests ([#17](https://github.com/MetaMask/smart-transactions-controller/pull/17))
36
+ - State changes + getTransactions fn ([#16](https://github.com/MetaMask/smart-transactions-controller/pull/16))
37
+ - Add updatedTxParams and confirm history event ([#15](https://github.com/MetaMask/smart-transactions-controller/pull/15))
38
+ - Smart Transactions List ([#13](https://github.com/MetaMask/smart-transactions-controller/pull/13))
39
+
9
40
  ## [1.0.0]
10
41
  ### Added
11
42
  - Adds nonce to a tx, adds `yarn build:link` support, updates functions for API calls, refactoring ([#8](https://github.com/MetaMask/smart-transactions-controller/pull/8))
@@ -16,5 +47,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
16
47
  - Add initial SmartTransactionsController ([#1](https://github.com/MetaMask/smart-transactions-controller/pull/1))
17
48
  - Initial commit
18
49
 
19
- [Unreleased]: https://github.com/MetaMask/smart-transactions-controller/compare/v1.0.0...HEAD
50
+ [Unreleased]: https://github.com/MetaMask/smart-transactions-controller/compare/v1.4.0...HEAD
51
+ [1.4.0]: https://github.com/MetaMask/smart-transactions-controller/compare/v1.3.0...v1.4.0
52
+ [1.3.0]: https://github.com/MetaMask/smart-transactions-controller/compare/v1.2.0...v1.3.0
53
+ [1.2.0]: https://github.com/MetaMask/smart-transactions-controller/compare/v1.1.0...v1.2.0
54
+ [1.1.0]: https://github.com/MetaMask/smart-transactions-controller/compare/v1.0.0...v1.1.0
20
55
  [1.0.0]: https://github.com/MetaMask/smart-transactions-controller/releases/tag/v1.0.0
package/LICENSE CHANGED
@@ -1 +1,18 @@
1
- (c) ConsenSys Software Inc. 2021. All Rights Reserved.
1
+ Copyright ConsenSys Software Inc. 2020. All rights reserved.
2
+
3
+ You acknowledge and agree that ConsenSys Software Inc. (“ConsenSys”) (or ConsenSys’s licensors) own all legal right, title and interest in and to the work, software, application, source code, documentation and any other documents in this repository (collectively, the “Program”), including any intellectual property rights which subsist in the Program (whether those rights happen to be registered or not, and wherever in the world those rights may exist), whether in source code or any other form.
4
+
5
+ Subject to the limited license below, you may not (and you may not permit anyone else to) distribute, publish, copy, modify, merge, combine with another program, create derivative works of, reverse engineer, decompile or otherwise attempt to extract the source code of, the Program or any part thereof, except that you may contribute to this repository.
6
+
7
+ You are granted a non-exclusive, non-transferable, non-sublicensable license to distribute, publish, copy, modify, merge, combine with another program or create derivative works of the Program (such resulting program, collectively, the “Resulting Program”) solely for Non-Commercial Use as long as you:
8
+ 1. give prominent notice (“Notice”) with each copy of the Resulting Program that the Program is used in the Resulting Program and that the Program is the copyright of ConsenSys; and
9
+ 2. subject the Resulting Program and any distribution, publication, copy, modification, merger therewith, combination with another program or derivative works thereof to the same Notice requirement and Non-Commercial Use restriction set forth herein.
10
+
11
+ “Non-Commercial Use” means each use as described in clauses (1)-(3) below, as reasonably determined by ConsenSys in its sole discretion:
12
+ 1. personal use for research, personal study, private entertainment, hobby projects or amateur pursuits, in each case without any anticipated commercial application;
13
+ 2. use by any charitable organization, educational institution, public research organization, public safety or health organization, environmental protection organization or government institution; or
14
+ 3. the number of monthly active users of the Resulting Program across all versions thereof and platforms globally do not exceed 10,000 at any time.
15
+
16
+ You will not use any trade mark, service mark, trade name, logo of ConsenSys or any other company or organization in a way that is likely or intended to cause confusion about the owner or authorized user of such marks, names or logos.
17
+
18
+ If you have any questions, comments or interest in pursuing any other use cases, please reach out to us at metamask.license@consensys.net.
@@ -1,6 +1,8 @@
1
+ /// <reference types="node" />
1
2
  import { BaseConfig, BaseController, BaseState, NetworkState } from '@metamask/controllers';
2
- import { SmartTransaction, SignedTransaction, SignedCanceledTransaction, UnsignedTransaction } from './types';
3
+ import { SmartTransaction, SignedTransaction, SignedCanceledTransaction, UnsignedTransaction, SmartTransactionStatuses, Fee } from './types';
3
4
  export declare const DEFAULT_INTERVAL: number;
5
+ export declare const CANCELLABLE_INTERVAL: number;
4
6
  export interface SmartTransactionsControllerConfig extends BaseConfig {
5
7
  interval: number;
6
8
  clientId: string;
@@ -8,37 +10,55 @@ export interface SmartTransactionsControllerConfig extends BaseConfig {
8
10
  supportedChainIds: string[];
9
11
  }
10
12
  export interface SmartTransactionsControllerState extends BaseState {
11
- smartTransactions: Record<string, SmartTransaction[]>;
12
- userOptIn: boolean | undefined;
13
+ smartTransactionsState: {
14
+ smartTransactions: Record<string, SmartTransaction[]>;
15
+ userOptIn: boolean | undefined;
16
+ };
13
17
  }
14
18
  export default class SmartTransactionsController extends BaseController<SmartTransactionsControllerConfig, SmartTransactionsControllerState> {
15
- private timeoutHandle?;
19
+ timeoutHandle?: NodeJS.Timeout;
16
20
  private nonceTracker;
17
- private updateSmartTransaction;
21
+ private getNetwork;
22
+ ethersProvider: any;
23
+ txController: any;
24
+ private trackMetaMetricsEvent;
18
25
  private fetch;
19
- constructor({ onNetworkStateChange, nonceTracker, }: {
26
+ constructor({ onNetworkStateChange, nonceTracker, getNetwork, provider, txController, trackMetaMetricsEvent, }: {
20
27
  onNetworkStateChange: (listener: (networkState: NetworkState) => void) => void;
21
28
  nonceTracker: any;
29
+ getNetwork: any;
30
+ provider: any;
31
+ txController: any;
32
+ trackMetaMetricsEvent: any;
22
33
  }, config?: Partial<SmartTransactionsControllerConfig>, state?: Partial<SmartTransactionsControllerState>);
34
+ checkPoll(state: any): void;
23
35
  initializeSmartTransactionsForChainId(): void;
24
36
  poll(interval?: number): Promise<void>;
25
37
  stop(): Promise<void>;
26
38
  setOptInState(state: boolean | undefined): void;
39
+ trackStxStatusChange(smartTransaction: SmartTransaction, prevSmartTransaction?: SmartTransaction): void;
40
+ updateSmartTransaction(smartTransaction: SmartTransaction): void;
27
41
  updateSmartTransactions(): Promise<void>;
42
+ confirmSmartTransaction(smartTransaction: SmartTransaction): Promise<void>;
28
43
  fetchSmartTransactionsStatus(uuids: string[]): Promise<SmartTransaction[]>;
29
44
  addNonceToTransaction(transaction: UnsignedTransaction): Promise<UnsignedTransaction>;
30
- getUnsignedTransactionsAndEstimates(unsignedTransaction: UnsignedTransaction): Promise<{
31
- transactions: UnsignedTransaction[];
32
- cancelTransactions: UnsignedTransaction[];
33
- estimates: {
34
- maxFee: number;
35
- estimatedFee: number;
36
- };
45
+ getFees(unsignedTransaction: UnsignedTransaction): Promise<{
46
+ fees: Fee[];
47
+ cancelFees: Fee[];
48
+ feeEstimate: number;
49
+ gasLimit: number;
50
+ gasUsed: number;
37
51
  }>;
38
- submitSignedTransactions({ signedTransactions, signedCanceledTransactions, }: {
52
+ submitSignedTransactions({ txParams, signedTransactions, signedCanceledTransactions, }: {
39
53
  signedTransactions: SignedTransaction[];
40
54
  signedCanceledTransactions: SignedCanceledTransaction[];
55
+ txParams?: any;
41
56
  }): Promise<any>;
42
57
  cancelSmartTransaction(uuid: string): Promise<void>;
43
58
  fetchLiveness(): Promise<boolean>;
59
+ setStatusRefreshInterval(interval: number): Promise<void>;
60
+ getTransactions({ addressFrom, status, }: {
61
+ addressFrom: string;
62
+ status: SmartTransactionStatuses;
63
+ }): SmartTransaction[];
44
64
  }
@@ -1,16 +1,25 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DEFAULT_INTERVAL = void 0;
6
+ exports.CANCELLABLE_INTERVAL = exports.DEFAULT_INTERVAL = void 0;
4
7
  const controllers_1 = require("@metamask/controllers");
8
+ const bignumber_js_1 = require("bignumber.js");
9
+ const ethers_1 = require("ethers");
10
+ const mapValues_1 = __importDefault(require("lodash/mapValues"));
11
+ const cloneDeep_1 = __importDefault(require("lodash/cloneDeep"));
5
12
  const types_1 = require("./types");
6
13
  const utils_1 = require("./utils");
7
14
  const constants_1 = require("./constants");
8
- const { handleFetch, safelyExecute } = controllers_1.util;
15
+ const { safelyExecute } = controllers_1.util;
9
16
  // TODO: JSDoc all methods
10
17
  // TODO: Remove all comments (* ! ?)
11
- exports.DEFAULT_INTERVAL = 5 * 60 * 1000;
18
+ const SECOND = 1000;
19
+ exports.DEFAULT_INTERVAL = SECOND * 10;
20
+ exports.CANCELLABLE_INTERVAL = SECOND * 10.5;
12
21
  class SmartTransactionsController extends controllers_1.BaseController {
13
- constructor({ onNetworkStateChange, nonceTracker, }, config, state) {
22
+ constructor({ onNetworkStateChange, nonceTracker, getNetwork, provider, txController, trackMetaMetricsEvent, }, config, state) {
14
23
  super(config, state);
15
24
  this.defaultConfig = {
16
25
  interval: exports.DEFAULT_INTERVAL,
@@ -19,87 +28,202 @@ class SmartTransactionsController extends controllers_1.BaseController {
19
28
  supportedChainIds: [constants_1.CHAIN_IDS.ETHEREUM, constants_1.CHAIN_IDS.RINKEBY],
20
29
  };
21
30
  this.defaultState = {
22
- smartTransactions: {},
23
- userOptIn: undefined,
31
+ smartTransactionsState: {
32
+ smartTransactions: {},
33
+ userOptIn: undefined,
34
+ },
24
35
  };
25
36
  this.nonceTracker = nonceTracker;
37
+ this.getNetwork = getNetwork;
38
+ this.ethersProvider = new ethers_1.ethers.providers.Web3Provider(provider);
39
+ this.txController = txController;
40
+ this.trackMetaMetricsEvent = trackMetaMetricsEvent;
26
41
  this.initialize();
27
42
  this.initializeSmartTransactionsForChainId();
28
- onNetworkStateChange(({ provider }) => {
29
- const { chainId } = provider;
43
+ onNetworkStateChange(({ provider: newProvider }) => {
44
+ const { chainId } = newProvider;
30
45
  this.configure({ chainId });
31
46
  this.initializeSmartTransactionsForChainId();
32
- this.poll();
47
+ this.checkPoll(this.state);
48
+ this.ethersProvider = new ethers_1.ethers.providers.Web3Provider(provider);
33
49
  });
34
- this.poll();
35
- }
36
- updateSmartTransaction(smartTransaction) {
37
- var _a, _b;
38
- const { chainId } = this.config;
39
- const currentIndex = (_a = this.state.smartTransactions[chainId]) === null || _a === void 0 ? void 0 : _a.findIndex((st) => st.uuid === smartTransaction.uuid);
40
- if (currentIndex === -1 || currentIndex === undefined) {
41
- this.update({
42
- smartTransactions: Object.assign(Object.assign({}, this.state.smartTransactions), { [chainId]: [
43
- ...(_b = this.state.smartTransactions) === null || _b === void 0 ? void 0 : _b[chainId],
44
- smartTransaction,
45
- ] }),
46
- });
47
- }
48
- else {
49
- this.update({
50
- smartTransactions: Object.assign(Object.assign({}, this.state.smartTransactions), { [chainId]: this.state.smartTransactions[chainId].map((item, index) => {
51
- return index === currentIndex ? smartTransaction : item;
52
- }) }),
53
- });
54
- }
50
+ this.subscribe((currentState) => this.checkPoll(currentState));
55
51
  }
56
52
  /* istanbul ignore next */
57
53
  async fetch(request, options) {
58
54
  const { clientId } = this.config;
59
55
  const fetchOptions = Object.assign(Object.assign({}, options), { headers: Object.assign({ 'Content-Type': 'application/json' }, (clientId && { 'X-Client-Id': clientId })) });
60
- return handleFetch(request, fetchOptions);
56
+ return utils_1.handleFetch(request, fetchOptions);
57
+ }
58
+ checkPoll(state) {
59
+ const { smartTransactions } = state.smartTransactionsState;
60
+ const currentSmartTransactions = smartTransactions[this.config.chainId];
61
+ const pendingTransactions = currentSmartTransactions === null || currentSmartTransactions === void 0 ? void 0 : currentSmartTransactions.filter(utils_1.isSmartTransactionPending);
62
+ if (!this.timeoutHandle && (pendingTransactions === null || pendingTransactions === void 0 ? void 0 : pendingTransactions.length) > 0) {
63
+ this.poll();
64
+ }
65
+ else if (this.timeoutHandle && (pendingTransactions === null || pendingTransactions === void 0 ? void 0 : pendingTransactions.length) === 0) {
66
+ this.stop();
67
+ }
61
68
  }
62
69
  initializeSmartTransactionsForChainId() {
63
70
  var _a;
64
71
  if (this.config.supportedChainIds.includes(this.config.chainId)) {
72
+ const { smartTransactionsState } = this.state;
65
73
  this.update({
66
- smartTransactions: Object.assign(Object.assign({}, this.state.smartTransactions), { [this.config.chainId]: (_a = this.state.smartTransactions[this.config.chainId]) !== null && _a !== void 0 ? _a : [] }),
74
+ smartTransactionsState: Object.assign(Object.assign({}, smartTransactionsState), { smartTransactions: Object.assign(Object.assign({}, smartTransactionsState.smartTransactions), { [this.config.chainId]: (_a = smartTransactionsState.smartTransactions[this.config.chainId]) !== null && _a !== void 0 ? _a : [] }) }),
67
75
  });
68
76
  }
69
77
  }
70
78
  async poll(interval) {
71
79
  const { chainId, supportedChainIds } = this.config;
72
80
  interval && this.configure({ interval }, false, false);
73
- this.timeoutHandle && clearTimeout(this.timeoutHandle);
81
+ this.timeoutHandle && clearInterval(this.timeoutHandle);
74
82
  if (!supportedChainIds.includes(chainId)) {
75
83
  return;
76
84
  }
77
85
  await safelyExecute(() => this.updateSmartTransactions());
78
- this.timeoutHandle = setTimeout(() => {
79
- this.poll(this.config.interval);
86
+ this.timeoutHandle = setInterval(() => {
87
+ safelyExecute(() => this.updateSmartTransactions());
80
88
  }, this.config.interval);
81
89
  }
82
90
  async stop() {
83
- this.timeoutHandle && clearTimeout(this.timeoutHandle);
91
+ this.timeoutHandle && clearInterval(this.timeoutHandle);
92
+ this.timeoutHandle = undefined;
84
93
  }
85
94
  setOptInState(state) {
86
- this.update({ userOptIn: state });
95
+ this.update({
96
+ smartTransactionsState: Object.assign(Object.assign({}, this.state.smartTransactionsState), { userOptIn: state }),
97
+ });
87
98
  }
88
- async updateSmartTransactions() {
89
- var _a;
90
- const { smartTransactions } = this.state;
99
+ trackStxStatusChange(smartTransaction, prevSmartTransaction) {
100
+ var _a, _b;
101
+ if (!prevSmartTransaction) {
102
+ return; // Don't track the first STX, because it doesn't have all necessary params.
103
+ }
104
+ let updatedSmartTransaction = cloneDeep_1.default(smartTransaction);
105
+ updatedSmartTransaction = Object.assign(Object.assign({}, cloneDeep_1.default(prevSmartTransaction)), updatedSmartTransaction);
106
+ if (!updatedSmartTransaction.swapMetaData ||
107
+ (updatedSmartTransaction.status === prevSmartTransaction.status &&
108
+ prevSmartTransaction.swapMetaData)) {
109
+ return; // If status hasn't changed, don't track it again.
110
+ }
111
+ const sensitiveProperties = {
112
+ stx_status: updatedSmartTransaction.status,
113
+ token_from_address: (_a = updatedSmartTransaction.txParams) === null || _a === void 0 ? void 0 : _a.from,
114
+ token_from_symbol: updatedSmartTransaction.sourceTokenSymbol,
115
+ token_to_address: (_b = updatedSmartTransaction.txParams) === null || _b === void 0 ? void 0 : _b.to,
116
+ token_to_symbol: updatedSmartTransaction.destinationTokenSymbol,
117
+ processing_time: utils_1.getStxProcessingTime(updatedSmartTransaction.time),
118
+ stx_enabled: true,
119
+ stx_user_opt_in: true,
120
+ };
121
+ this.trackMetaMetricsEvent({
122
+ event: 'STX Status Updated',
123
+ category: 'swaps',
124
+ sensitiveProperties,
125
+ });
126
+ }
127
+ updateSmartTransaction(smartTransaction) {
91
128
  const { chainId } = this.config;
92
- const transactionsToUpdate = [];
93
- (_a = smartTransactions[chainId]) === null || _a === void 0 ? void 0 : _a.forEach((smartTransaction) => {
94
- if (utils_1.isSmartTransactionPending(smartTransaction)) {
95
- transactionsToUpdate.push(smartTransaction.uuid);
96
- }
129
+ const { smartTransactionsState } = this.state;
130
+ const { smartTransactions } = smartTransactionsState;
131
+ const currentSmartTransactions = smartTransactions[chainId];
132
+ const currentIndex = currentSmartTransactions === null || currentSmartTransactions === void 0 ? void 0 : currentSmartTransactions.findIndex((st) => st.uuid === smartTransaction.uuid);
133
+ const isNewSmartTransaction = currentIndex === -1 || currentIndex === undefined;
134
+ this.trackStxStatusChange(smartTransaction, isNewSmartTransaction
135
+ ? undefined
136
+ : currentSmartTransactions[currentIndex]);
137
+ if (isNewSmartTransaction) {
138
+ // add smart transaction
139
+ const cancelledNonceIndex = currentSmartTransactions.findIndex((stx) => {
140
+ var _a, _b, _c;
141
+ return ((_a = stx.txParams) === null || _a === void 0 ? void 0 : _a.nonce) === ((_b = smartTransaction.txParams) === null || _b === void 0 ? void 0 : _b.nonce) &&
142
+ ((_c = stx.status) === null || _c === void 0 ? void 0 : _c.startsWith('cancelled'));
143
+ });
144
+ const snapshot = cloneDeep_1.default(smartTransaction);
145
+ const history = [snapshot];
146
+ const historifiedSmartTransaction = Object.assign(Object.assign({}, smartTransaction), { history });
147
+ const nextSmartTransactions = cancelledNonceIndex > -1
148
+ ? currentSmartTransactions
149
+ .slice(0, cancelledNonceIndex)
150
+ .concat(currentSmartTransactions.slice(cancelledNonceIndex + 1))
151
+ .concat(historifiedSmartTransaction)
152
+ : currentSmartTransactions.concat(historifiedSmartTransaction);
153
+ this.update({
154
+ smartTransactionsState: Object.assign(Object.assign({}, smartTransactionsState), { smartTransactions: Object.assign(Object.assign({}, smartTransactionsState.smartTransactions), { [chainId]: nextSmartTransactions }) }),
155
+ });
156
+ return;
157
+ }
158
+ if ((smartTransaction.status === types_1.SmartTransactionStatuses.SUCCESS ||
159
+ smartTransaction.status === types_1.SmartTransactionStatuses.REVERTED) &&
160
+ !smartTransaction.confirmed) {
161
+ // confirm smart transaction
162
+ const currentSmartTransaction = currentSmartTransactions[currentIndex];
163
+ const nextSmartTransaction = Object.assign(Object.assign({}, currentSmartTransaction), smartTransaction);
164
+ this.confirmSmartTransaction(nextSmartTransaction);
165
+ }
166
+ this.update({
167
+ smartTransactionsState: Object.assign(Object.assign({}, smartTransactionsState), { smartTransactions: Object.assign(Object.assign({}, smartTransactionsState.smartTransactions), { [chainId]: smartTransactionsState.smartTransactions[chainId].map((item, index) => {
168
+ return index === currentIndex
169
+ ? Object.assign(Object.assign({}, item), smartTransaction) : item;
170
+ }) }) }),
97
171
  });
172
+ }
173
+ async updateSmartTransactions() {
174
+ const { smartTransactions } = this.state.smartTransactionsState;
175
+ const { chainId } = this.config;
176
+ const currentSmartTransactions = smartTransactions === null || smartTransactions === void 0 ? void 0 : smartTransactions[chainId];
177
+ const transactionsToUpdate = currentSmartTransactions
178
+ .filter(utils_1.isSmartTransactionPending)
179
+ .map((smartTransaction) => smartTransaction.uuid);
98
180
  if (transactionsToUpdate.length > 0) {
99
181
  this.fetchSmartTransactionsStatus(transactionsToUpdate);
100
182
  }
101
- else {
102
- this.stop();
183
+ }
184
+ async confirmSmartTransaction(smartTransaction) {
185
+ var _a, _b, _c;
186
+ const txHash = (_a = smartTransaction.statusMetadata) === null || _a === void 0 ? void 0 : _a.minedHash;
187
+ try {
188
+ const transactionReceipt = await this.ethersProvider.getTransactionReceipt(txHash);
189
+ const transaction = await this.ethersProvider.getTransaction(txHash);
190
+ const maxFeePerGas = (_b = transaction.maxFeePerGas) === null || _b === void 0 ? void 0 : _b.toHexString();
191
+ const maxPriorityFeePerGas = (_c = transaction.maxPriorityFeePerGas) === null || _c === void 0 ? void 0 : _c.toHexString();
192
+ if (transactionReceipt === null || transactionReceipt === void 0 ? void 0 : transactionReceipt.blockNumber) {
193
+ const blockData = await this.ethersProvider.getBlock(transactionReceipt === null || transactionReceipt === void 0 ? void 0 : transactionReceipt.blockNumber, false);
194
+ const baseFeePerGas = blockData === null || blockData === void 0 ? void 0 : blockData.baseFeePerGas.toHexString();
195
+ const txReceipt = mapValues_1.default(transactionReceipt, (value) => {
196
+ if (value instanceof ethers_1.ethers.BigNumber) {
197
+ return value.toHexString();
198
+ }
199
+ return value;
200
+ });
201
+ const updatedTxParams = Object.assign(Object.assign({}, smartTransaction.txParams), { maxFeePerGas,
202
+ maxPriorityFeePerGas });
203
+ // call confirmExternalTransaction
204
+ const originalTxMeta = Object.assign(Object.assign({}, smartTransaction), { id: smartTransaction.uuid, status: 'confirmed', hash: txHash, txParams: updatedTxParams });
205
+ // create txMeta snapshot for history
206
+ const snapshot = utils_1.snapshotFromTxMeta(originalTxMeta);
207
+ // recover previous tx state obj
208
+ const previousState = utils_1.replayHistory(originalTxMeta.history);
209
+ // generate history entry and add to history
210
+ const entry = utils_1.generateHistoryEntry(previousState, snapshot, 'txStateManager: setting status to confirmed');
211
+ const txMeta = entry.length > 0
212
+ ? Object.assign(Object.assign({}, originalTxMeta), { history: originalTxMeta.history.concat(entry) }) : originalTxMeta;
213
+ this.txController.confirmExternalTransaction(txMeta, txReceipt, baseFeePerGas);
214
+ this.trackMetaMetricsEvent({
215
+ event: 'STX Confirmed',
216
+ category: 'swaps',
217
+ });
218
+ this.updateSmartTransaction(Object.assign(Object.assign({}, smartTransaction), { confirmed: true }));
219
+ }
220
+ }
221
+ catch (e) {
222
+ this.trackMetaMetricsEvent({
223
+ event: 'STX Confirmation Failed',
224
+ category: 'swaps',
225
+ });
226
+ console.error('confirm error', e);
103
227
  }
104
228
  }
105
229
  // ! Ask backend API to accept list of uuids as params
@@ -110,8 +234,12 @@ class SmartTransactionsController extends controllers_1.BaseController {
110
234
  });
111
235
  const url = `${utils_1.getAPIRequestURL(types_1.APIType.BATCH_STATUS, chainId)}?${params.toString()}`;
112
236
  const data = await this.fetch(url);
113
- data.forEach((smartTransaction) => {
114
- this.updateSmartTransaction(smartTransaction);
237
+ Object.entries(data).forEach(([uuid, smartTransaction]) => {
238
+ this.updateSmartTransaction({
239
+ statusMetadata: smartTransaction,
240
+ status: utils_1.calculateStatus(smartTransaction),
241
+ uuid,
242
+ });
115
243
  });
116
244
  return data;
117
245
  }
@@ -119,12 +247,12 @@ class SmartTransactionsController extends controllers_1.BaseController {
119
247
  const nonceLock = await this.nonceTracker.getNonceLock(transaction.from);
120
248
  const nonce = nonceLock.nextNonce;
121
249
  nonceLock.releaseLock();
122
- return Object.assign(Object.assign({}, transaction), { nonce });
250
+ return Object.assign(Object.assign({}, transaction), { nonce: `0x${nonce.toString(16)}` });
123
251
  }
124
- async getUnsignedTransactionsAndEstimates(unsignedTransaction) {
252
+ async getFees(unsignedTransaction) {
125
253
  const { chainId } = this.config;
126
254
  const unsignedTransactionWithNonce = await this.addNonceToTransaction(unsignedTransaction);
127
- const data = await this.fetch(utils_1.getAPIRequestURL(types_1.APIType.GET_TRANSACTIONS, chainId), {
255
+ const data = await this.fetch(utils_1.getAPIRequestURL(types_1.APIType.GET_FEES, chainId), {
128
256
  method: 'POST',
129
257
  body: JSON.stringify({ tx: unsignedTransactionWithNonce }),
130
258
  });
@@ -132,7 +260,7 @@ class SmartTransactionsController extends controllers_1.BaseController {
132
260
  }
133
261
  // * After this successful call client must add a nonce representative to
134
262
  // * transaction controller external transactions list
135
- async submitSignedTransactions({ signedTransactions, signedCanceledTransactions, }) {
263
+ async submitSignedTransactions({ txParams, signedTransactions, signedCanceledTransactions, }) {
136
264
  const { chainId } = this.config;
137
265
  const data = await this.fetch(utils_1.getAPIRequestURL(types_1.APIType.SUBMIT_TRANSACTIONS, chainId), {
138
266
  method: 'POST',
@@ -141,7 +269,40 @@ class SmartTransactionsController extends controllers_1.BaseController {
141
269
  rawCancelTxs: signedCanceledTransactions,
142
270
  }),
143
271
  });
144
- this.updateSmartTransaction({ uuid: data.uuid });
272
+ const time = Date.now();
273
+ const metamaskNetworkId = this.getNetwork();
274
+ let preTxBalance;
275
+ try {
276
+ const preTxBalanceBN = await this.ethersProvider.getBalance(txParams === null || txParams === void 0 ? void 0 : txParams.from);
277
+ preTxBalance = new bignumber_js_1.BigNumber(preTxBalanceBN.toHexString()).toString(16);
278
+ }
279
+ catch (e) {
280
+ console.error('ethers error', e);
281
+ }
282
+ const nonceLock = await this.nonceTracker.getNonceLock(txParams === null || txParams === void 0 ? void 0 : txParams.from);
283
+ const nonce = ethers_1.ethers.utils.hexlify(nonceLock.nextNonce);
284
+ if (txParams && !(txParams === null || txParams === void 0 ? void 0 : txParams.nonce)) {
285
+ txParams.nonce = nonce;
286
+ }
287
+ const { nonceDetails } = nonceLock;
288
+ this.updateSmartTransaction({
289
+ chainId,
290
+ nonceDetails,
291
+ metamaskNetworkId,
292
+ preTxBalance,
293
+ status: types_1.SmartTransactionStatuses.PENDING,
294
+ time,
295
+ txParams,
296
+ uuid: data.uuid,
297
+ cancellable: true,
298
+ });
299
+ setTimeout(() => {
300
+ this.updateSmartTransaction({
301
+ uuid: data.uuid,
302
+ cancellable: false,
303
+ });
304
+ }, exports.CANCELLABLE_INTERVAL);
305
+ nonceLock.releaseLock();
145
306
  return data;
146
307
  }
147
308
  // ! This should return if the cancellation was on chain or not (for nonce management)
@@ -154,12 +315,33 @@ class SmartTransactionsController extends controllers_1.BaseController {
154
315
  method: 'POST',
155
316
  body: JSON.stringify({ uuid }),
156
317
  });
318
+ this.updateSmartTransaction({
319
+ uuid,
320
+ status: types_1.SmartTransactionStatuses.CANCELLED_USER_CANCELLED,
321
+ });
157
322
  }
158
323
  async fetchLiveness() {
159
324
  const { chainId } = this.config;
160
325
  const response = await this.fetch(utils_1.getAPIRequestURL(types_1.APIType.LIVENESS, chainId));
161
326
  return Boolean(response.lastBlock);
162
327
  }
328
+ async setStatusRefreshInterval(interval) {
329
+ if (interval !== this.config.interval) {
330
+ this.configure({ interval }, false, false);
331
+ }
332
+ }
333
+ getTransactions({ addressFrom, status, }) {
334
+ const { smartTransactions } = this.state.smartTransactionsState;
335
+ const { chainId } = this.config;
336
+ const currentSmartTransactions = smartTransactions === null || smartTransactions === void 0 ? void 0 : smartTransactions[chainId];
337
+ if (!currentSmartTransactions || currentSmartTransactions.length === 0) {
338
+ return [];
339
+ }
340
+ return currentSmartTransactions.filter((stx) => {
341
+ var _a;
342
+ return stx.status === status && ((_a = stx.txParams) === null || _a === void 0 ? void 0 : _a.from) === addressFrom;
343
+ });
344
+ }
163
345
  }
164
346
  exports.default = SmartTransactionsController;
165
347
  //# 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 {\n BaseConfig,\n BaseController,\n BaseState,\n NetworkState,\n util,\n} from '@metamask/controllers';\nimport {\n APIType,\n SmartTransaction,\n SignedTransaction,\n SignedCanceledTransaction,\n UnsignedTransaction,\n} from './types';\nimport { getAPIRequestURL, isSmartTransactionPending } from './utils';\nimport { CHAIN_IDS } from './constants';\n\nconst { handleFetch, safelyExecute } = util;\n\n// TODO: JSDoc all methods\n// TODO: Remove all comments (* ! ?)\n\nexport const DEFAULT_INTERVAL = 5 * 60 * 1000;\n\nexport interface SmartTransactionsControllerConfig extends BaseConfig {\n interval: number;\n clientId: string;\n chainId: string;\n supportedChainIds: string[];\n}\n\nexport interface SmartTransactionsControllerState extends BaseState {\n smartTransactions: Record<string, SmartTransaction[]>;\n userOptIn: boolean | undefined;\n}\n\nexport default class SmartTransactionsController extends BaseController<\n SmartTransactionsControllerConfig,\n SmartTransactionsControllerState\n> {\n private timeoutHandle?: NodeJS.Timeout;\n\n private nonceTracker: any;\n\n private updateSmartTransaction(smartTransaction: SmartTransaction): void {\n const { chainId } = this.config;\n const currentIndex = this.state.smartTransactions[chainId]?.findIndex(\n (st) => st.uuid === smartTransaction.uuid,\n );\n if (currentIndex === -1 || currentIndex === undefined) {\n this.update({\n smartTransactions: {\n ...this.state.smartTransactions,\n [chainId]: [\n ...this.state.smartTransactions?.[chainId],\n smartTransaction,\n ],\n },\n });\n } else {\n this.update({\n smartTransactions: {\n ...this.state.smartTransactions,\n [chainId]: this.state.smartTransactions[chainId].map(\n (item, index) => {\n return index === currentIndex ? smartTransaction : item;\n },\n ),\n },\n });\n }\n }\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 nonceTracker,\n }: {\n onNetworkStateChange: (\n listener: (networkState: NetworkState) => void,\n ) => void;\n nonceTracker: 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 smartTransactions: {},\n userOptIn: undefined,\n };\n\n this.nonceTracker = nonceTracker;\n\n this.initialize();\n this.initializeSmartTransactionsForChainId();\n\n onNetworkStateChange(({ provider }) => {\n const { chainId } = provider;\n this.configure({ chainId });\n this.initializeSmartTransactionsForChainId();\n this.poll();\n });\n\n this.poll();\n }\n\n initializeSmartTransactionsForChainId() {\n if (this.config.supportedChainIds.includes(this.config.chainId)) {\n this.update({\n smartTransactions: {\n ...this.state.smartTransactions,\n [this.config.chainId]:\n this.state.smartTransactions[this.config.chainId] ?? [],\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 && clearTimeout(this.timeoutHandle);\n if (!supportedChainIds.includes(chainId)) {\n return;\n }\n await safelyExecute(() => this.updateSmartTransactions());\n this.timeoutHandle = setTimeout(() => {\n this.poll(this.config.interval);\n }, this.config.interval);\n }\n\n async stop() {\n this.timeoutHandle && clearTimeout(this.timeoutHandle);\n }\n\n setOptInState(state: boolean | undefined): void {\n this.update({ userOptIn: state });\n }\n\n async updateSmartTransactions() {\n const { smartTransactions } = this.state;\n const { chainId } = this.config;\n\n const transactionsToUpdate: string[] = [];\n smartTransactions[chainId]?.forEach((smartTransaction) => {\n if (isSmartTransactionPending(smartTransaction)) {\n transactionsToUpdate.push(smartTransaction.uuid);\n }\n });\n\n if (transactionsToUpdate.length > 0) {\n this.fetchSmartTransactionsStatus(transactionsToUpdate);\n } else {\n this.stop();\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: SmartTransaction[] = await this.fetch(url);\n\n data.forEach((smartTransaction) => {\n this.updateSmartTransaction(smartTransaction);\n });\n\n return data;\n }\n\n async addNonceToTransaction(\n transaction: UnsignedTransaction,\n ): Promise<UnsignedTransaction> {\n const nonceLock = await this.nonceTracker.getNonceLock(transaction.from);\n const nonce = nonceLock.nextNonce;\n nonceLock.releaseLock();\n return {\n ...transaction,\n nonce,\n };\n }\n\n async getUnsignedTransactionsAndEstimates(\n unsignedTransaction: UnsignedTransaction,\n ): Promise<{\n transactions: UnsignedTransaction[];\n cancelTransactions: UnsignedTransaction[];\n estimates: {\n maxFee: number; // GWEI number\n estimatedFee: number; // GWEI number\n };\n }> {\n const { chainId } = this.config;\n\n const unsignedTransactionWithNonce = await this.addNonceToTransaction(\n unsignedTransaction,\n );\n const data = await this.fetch(\n getAPIRequestURL(APIType.GET_TRANSACTIONS, chainId),\n {\n method: 'POST',\n body: JSON.stringify({ tx: unsignedTransactionWithNonce }),\n },\n );\n\n return data;\n }\n\n // * After this successful call client must add a nonce representative to\n // * transaction controller external transactions list\n async submitSignedTransactions({\n signedTransactions,\n signedCanceledTransactions,\n }: {\n signedTransactions: SignedTransaction[];\n signedCanceledTransactions: SignedCanceledTransaction[];\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 this.updateSmartTransaction({ uuid: data.uuid });\n return data;\n }\n\n // ! 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 // ! Ask backend API to make this endpoint a POST\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 const response = await this.fetch(\n getAPIRequestURL(APIType.LIVENESS, chainId),\n );\n return Boolean(response.lastBlock);\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 NetworkState,\n util,\n} from '@metamask/controllers';\nimport { BigNumber } from 'bignumber.js';\nimport { ethers } from 'ethers';\nimport mapValues from 'lodash/mapValues';\nimport cloneDeep from 'lodash/cloneDeep';\nimport {\n APIType,\n SmartTransaction,\n SignedTransaction,\n SignedCanceledTransaction,\n UnsignedTransaction,\n SmartTransactionsStatus,\n SmartTransactionStatuses,\n Fee,\n} from './types';\nimport {\n getAPIRequestURL,\n isSmartTransactionPending,\n calculateStatus,\n snapshotFromTxMeta,\n replayHistory,\n generateHistoryEntry,\n getStxProcessingTime,\n handleFetch,\n} from './utils';\nimport { CHAIN_IDS } from './constants';\n\nconst { safelyExecute } = util;\n\n// TODO: JSDoc all methods\n// TODO: Remove all comments (* ! ?)\nconst SECOND = 1000;\n\nexport const DEFAULT_INTERVAL = SECOND * 10;\nexport const CANCELLABLE_INTERVAL = SECOND * 10.5;\n\nexport interface SmartTransactionsControllerConfig extends BaseConfig {\n interval: number;\n clientId: string;\n chainId: string;\n supportedChainIds: string[];\n}\n\nexport interface SmartTransactionsControllerState extends BaseState {\n smartTransactionsState: {\n smartTransactions: Record<string, SmartTransaction[]>;\n userOptIn: boolean | undefined;\n };\n}\n\nexport default class SmartTransactionsController extends BaseController<\n SmartTransactionsControllerConfig,\n SmartTransactionsControllerState\n> {\n public timeoutHandle?: NodeJS.Timeout;\n\n private nonceTracker: any;\n\n private getNetwork: any;\n\n public ethersProvider: any;\n\n public txController: 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 nonceTracker,\n getNetwork,\n provider,\n txController,\n trackMetaMetricsEvent,\n }: {\n onNetworkStateChange: (\n listener: (networkState: NetworkState) => void,\n ) => void;\n nonceTracker: any;\n getNetwork: any;\n provider: any;\n txController: 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 },\n };\n\n this.nonceTracker = nonceTracker;\n this.getNetwork = getNetwork;\n this.ethersProvider = new ethers.providers.Web3Provider(provider);\n this.txController = txController;\n this.trackMetaMetricsEvent = trackMetaMetricsEvent;\n\n this.initialize();\n this.initializeSmartTransactionsForChainId();\n\n onNetworkStateChange(({ provider: newProvider }) => {\n const { chainId } = newProvider;\n this.configure({ chainId });\n this.initializeSmartTransactionsForChainId();\n this.checkPoll(this.state);\n this.ethersProvider = new ethers.providers.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 userOptIn: 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_address: updatedSmartTransaction.txParams?.from,\n token_from_symbol: updatedSmartTransaction.sourceTokenSymbol,\n token_to_address: updatedSmartTransaction.txParams?.to,\n token_to_symbol: updatedSmartTransaction.destinationTokenSymbol,\n processing_time: getStxProcessingTime(updatedSmartTransaction.time),\n 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 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 (st) => st.uuid === smartTransaction.uuid,\n );\n const isNewSmartTransaction =\n currentIndex === -1 || currentIndex === undefined;\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 = await this.ethersProvider.getTransactionReceipt(\n txHash,\n );\n const transaction = await this.ethersProvider.getTransaction(txHash);\n const maxFeePerGas = transaction.maxFeePerGas?.toHexString();\n const maxPriorityFeePerGas = 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 ethers.BigNumber) {\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.txController.confirmExternalTransaction(\n txMeta,\n txReceipt,\n baseFeePerGas,\n );\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, smartTransaction]) => {\n this.updateSmartTransaction({\n statusMetadata: smartTransaction as SmartTransactionsStatus,\n status: calculateStatus(smartTransaction as SmartTransactionsStatus),\n uuid,\n });\n });\n\n return data;\n }\n\n async addNonceToTransaction(\n transaction: UnsignedTransaction,\n ): Promise<UnsignedTransaction> {\n const nonceLock = await this.nonceTracker.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 async getFees(\n unsignedTransaction: UnsignedTransaction,\n ): Promise<{\n fees: Fee[];\n cancelFees: Fee[];\n feeEstimate: number;\n gasLimit: number;\n gasUsed: number;\n }> {\n const { chainId } = this.config;\n\n const unsignedTransactionWithNonce = await this.addNonceToTransaction(\n unsignedTransaction,\n );\n const data = await this.fetch(getAPIRequestURL(APIType.GET_FEES, chainId), {\n method: 'POST',\n body: JSON.stringify({ tx: unsignedTransactionWithNonce }),\n });\n\n return data;\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 const metamaskNetworkId = this.getNetwork();\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.nonceTracker.getNonceLock(txParams?.from);\n const nonce = ethers.utils.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 metamaskNetworkId,\n preTxBalance,\n status: SmartTransactionStatuses.PENDING,\n time,\n txParams,\n uuid: data.uuid,\n cancellable: true,\n });\n\n setTimeout(() => {\n this.updateSmartTransaction({\n uuid: data.uuid,\n cancellable: false,\n });\n }, CANCELLABLE_INTERVAL);\n nonceLock.releaseLock();\n return data;\n }\n\n // ! 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 // ! Ask backend API to make this endpoint a POST\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 this.updateSmartTransaction({\n uuid,\n status: SmartTransactionStatuses.CANCELLED_USER_CANCELLED,\n });\n }\n\n async fetchLiveness(): Promise<boolean> {\n const { chainId } = this.config;\n const response = await this.fetch(\n getAPIRequestURL(APIType.LIVENESS, chainId),\n );\n return Boolean(response.lastBlock);\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
- export declare const API_BASE_URL = "https://transaction.metaswap-dev.codefi.network";
1
+ export declare const API_BASE_URL = "https://transaction.metaswap.codefi.network";
2
2
  export declare const CHAIN_IDS: {
3
3
  ETHEREUM: string;
4
4
  RINKEBY: string;
5
5
  BSC: string;
6
6
  };
7
- export declare const CHAIN_IDS_HEX_TO_DEC: any;
package/dist/constants.js CHANGED
@@ -1,15 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CHAIN_IDS_HEX_TO_DEC = exports.CHAIN_IDS = exports.API_BASE_URL = void 0;
4
- exports.API_BASE_URL = 'https://transaction.metaswap-dev.codefi.network';
3
+ exports.CHAIN_IDS = exports.API_BASE_URL = void 0;
4
+ exports.API_BASE_URL = 'https://transaction.metaswap.codefi.network';
5
5
  exports.CHAIN_IDS = {
6
6
  ETHEREUM: '0x1',
7
7
  RINKEBY: '0x4',
8
8
  BSC: '0x38',
9
9
  };
10
- exports.CHAIN_IDS_HEX_TO_DEC = {
11
- [exports.CHAIN_IDS.ETHEREUM]: '1',
12
- [exports.CHAIN_IDS.RINKEBY]: '4',
13
- [exports.CHAIN_IDS.BSC]: '56',
14
- };
15
10
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,YAAY,GAAG,iDAAiD,CAAC;AACjE,QAAA,SAAS,GAAG;IACvB,QAAQ,EAAE,KAAK;IACf,OAAO,EAAE,KAAK;IACd,GAAG,EAAE,MAAM;CACZ,CAAC;AACW,QAAA,oBAAoB,GAAG;IAClC,CAAC,iBAAS,CAAC,QAAQ,CAAC,EAAE,GAAG;IACzB,CAAC,iBAAS,CAAC,OAAO,CAAC,EAAE,GAAG;IACxB,CAAC,iBAAS,CAAC,GAAG,CAAC,EAAE,IAAI;CACf,CAAC","sourcesContent":["export const API_BASE_URL = 'https://transaction.metaswap-dev.codefi.network';\nexport const CHAIN_IDS = {\n ETHEREUM: '0x1',\n RINKEBY: '0x4',\n BSC: '0x38',\n};\nexport const CHAIN_IDS_HEX_TO_DEC = {\n [CHAIN_IDS.ETHEREUM]: '1',\n [CHAIN_IDS.RINKEBY]: '4',\n [CHAIN_IDS.BSC]: '56',\n} as any;\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/index.d.ts CHANGED
@@ -1,2 +1,3 @@
1
+ import 'isomorphic-fetch';
1
2
  import SmartTransactionsController from './SmartTransactionsController';
2
3
  export default SmartTransactionsController;
package/dist/index.js CHANGED
@@ -3,6 +3,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ // eslint-disable-next-line import/no-unassigned-import
7
+ require("isomorphic-fetch");
6
8
  const SmartTransactionsController_1 = __importDefault(require("./SmartTransactionsController"));
7
9
  exports.default = SmartTransactionsController_1.default;
8
10
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;AAAA,gGAAwE;AAExE,kBAAe,qCAA2B,CAAC","sourcesContent":["import SmartTransactionsController from './SmartTransactionsController';\n\nexport default SmartTransactionsController;\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;AAAA,uDAAuD;AACvD,4BAA0B;AAC1B,gGAAwE;AAExE,kBAAe,qCAA2B,CAAC","sourcesContent":["// eslint-disable-next-line import/no-unassigned-import\nimport 'isomorphic-fetch';\nimport SmartTransactionsController from './SmartTransactionsController';\n\nexport default SmartTransactionsController;\n"]}
package/dist/types.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  /** API */
2
2
  export declare enum APIType {
3
- 'GET_TRANSACTIONS' = 0,
3
+ 'GET_FEES' = 0,
4
4
  'SUBMIT_TRANSACTIONS' = 1,
5
5
  'CANCEL' = 2,
6
6
  'BATCH_STATUS' = 3,
@@ -15,8 +15,32 @@ export declare enum SmartTransactionMinedTx {
15
15
  UNKNOWN = "unknown"
16
16
  }
17
17
  export declare enum SmartTransactionCancellationReason {
18
+ WOULD_REVERT = "would_revert",
19
+ TOO_CHEAP = "too_cheap",
20
+ DEADLINE_MISSED = "deadline_missed",
21
+ INVALID_NONCE = "invalid_nonce",
22
+ USER_CANCELLED = "user_cancelled",
18
23
  NOT_CANCELLED = "not_cancelled"
19
24
  }
25
+ export declare enum SmartTransactionStatuses {
26
+ PENDING = "pending",
27
+ SUCCESS = "success",
28
+ REVERTED = "reverted",
29
+ UNKNOWN = "unknown",
30
+ CANCELLED_WOULD_REVERT = "cancelled_would_revert",
31
+ CANCELLED_TOO_CHEAP = "cancelled_too_cheap",
32
+ CANCELLED_DEADLINE_MISSED = "cancelled_deadline_missed",
33
+ CANCELLED_INVALID_NONCE = "cancelled_invalid_nonce",
34
+ CANCELLED_USER_CANCELLED = "cancelled_user_cancelled",
35
+ RESOLVED = "resolved"
36
+ }
37
+ export declare const cancellationReasonToStatusMap: {
38
+ would_revert: SmartTransactionStatuses;
39
+ too_cheap: SmartTransactionStatuses;
40
+ deadline_missed: SmartTransactionStatuses;
41
+ invalid_nonce: SmartTransactionStatuses;
42
+ user_cancelled: SmartTransactionStatuses;
43
+ };
20
44
  export interface SmartTransactionsStatus {
21
45
  error?: string;
22
46
  cancellationFeeWei: number;
@@ -27,7 +51,29 @@ export interface SmartTransactionsStatus {
27
51
  }
28
52
  export interface SmartTransaction {
29
53
  uuid: string;
30
- status?: SmartTransactionsStatus;
54
+ chainId?: string;
55
+ destinationTokenAddress?: string;
56
+ destinationTokenDecimals?: string;
57
+ destinationTokenSymbol?: string;
58
+ history?: any;
59
+ metamaskNetworkId?: string;
60
+ nonceDetails?: any;
61
+ origin?: string;
62
+ preTxBalance?: string;
63
+ status?: string;
64
+ statusMetadata?: SmartTransactionsStatus;
65
+ sourceTokenSymbol?: string;
66
+ swapMetaData?: any;
67
+ swapTokenValue?: string;
68
+ time?: number;
69
+ txParams?: any;
70
+ type?: string;
71
+ confirmed?: boolean;
72
+ cancellable?: boolean;
73
+ }
74
+ export interface Fee {
75
+ maxFeePerGas: number;
76
+ maxPriorityFeePerGas: number;
31
77
  }
32
78
  export declare type UnsignedTransaction = any;
33
79
  export declare type SignedTransaction = any;
package/dist/types.js CHANGED
@@ -1,10 +1,10 @@
1
1
  "use strict";
2
2
  /** API */
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.SmartTransactionCancellationReason = exports.SmartTransactionMinedTx = exports.APIType = void 0;
4
+ exports.cancellationReasonToStatusMap = exports.SmartTransactionStatuses = exports.SmartTransactionCancellationReason = exports.SmartTransactionMinedTx = exports.APIType = void 0;
5
5
  var APIType;
6
6
  (function (APIType) {
7
- APIType[APIType["GET_TRANSACTIONS"] = 0] = "GET_TRANSACTIONS";
7
+ APIType[APIType["GET_FEES"] = 0] = "GET_FEES";
8
8
  APIType[APIType["SUBMIT_TRANSACTIONS"] = 1] = "SUBMIT_TRANSACTIONS";
9
9
  APIType[APIType["CANCEL"] = 2] = "CANCEL";
10
10
  APIType[APIType["BATCH_STATUS"] = 3] = "BATCH_STATUS";
@@ -21,6 +21,31 @@ var SmartTransactionMinedTx;
21
21
  })(SmartTransactionMinedTx = exports.SmartTransactionMinedTx || (exports.SmartTransactionMinedTx = {}));
22
22
  var SmartTransactionCancellationReason;
23
23
  (function (SmartTransactionCancellationReason) {
24
+ SmartTransactionCancellationReason["WOULD_REVERT"] = "would_revert";
25
+ SmartTransactionCancellationReason["TOO_CHEAP"] = "too_cheap";
26
+ SmartTransactionCancellationReason["DEADLINE_MISSED"] = "deadline_missed";
27
+ SmartTransactionCancellationReason["INVALID_NONCE"] = "invalid_nonce";
28
+ SmartTransactionCancellationReason["USER_CANCELLED"] = "user_cancelled";
24
29
  SmartTransactionCancellationReason["NOT_CANCELLED"] = "not_cancelled";
25
30
  })(SmartTransactionCancellationReason = exports.SmartTransactionCancellationReason || (exports.SmartTransactionCancellationReason = {}));
31
+ var SmartTransactionStatuses;
32
+ (function (SmartTransactionStatuses) {
33
+ SmartTransactionStatuses["PENDING"] = "pending";
34
+ SmartTransactionStatuses["SUCCESS"] = "success";
35
+ SmartTransactionStatuses["REVERTED"] = "reverted";
36
+ SmartTransactionStatuses["UNKNOWN"] = "unknown";
37
+ SmartTransactionStatuses["CANCELLED_WOULD_REVERT"] = "cancelled_would_revert";
38
+ SmartTransactionStatuses["CANCELLED_TOO_CHEAP"] = "cancelled_too_cheap";
39
+ SmartTransactionStatuses["CANCELLED_DEADLINE_MISSED"] = "cancelled_deadline_missed";
40
+ SmartTransactionStatuses["CANCELLED_INVALID_NONCE"] = "cancelled_invalid_nonce";
41
+ SmartTransactionStatuses["CANCELLED_USER_CANCELLED"] = "cancelled_user_cancelled";
42
+ SmartTransactionStatuses["RESOLVED"] = "resolved";
43
+ })(SmartTransactionStatuses = exports.SmartTransactionStatuses || (exports.SmartTransactionStatuses = {}));
44
+ exports.cancellationReasonToStatusMap = {
45
+ [SmartTransactionCancellationReason.WOULD_REVERT]: SmartTransactionStatuses.CANCELLED_WOULD_REVERT,
46
+ [SmartTransactionCancellationReason.TOO_CHEAP]: SmartTransactionStatuses.CANCELLED_TOO_CHEAP,
47
+ [SmartTransactionCancellationReason.DEADLINE_MISSED]: SmartTransactionStatuses.CANCELLED_DEADLINE_MISSED,
48
+ [SmartTransactionCancellationReason.INVALID_NONCE]: SmartTransactionStatuses.CANCELLED_INVALID_NONCE,
49
+ [SmartTransactionCancellationReason.USER_CANCELLED]: SmartTransactionStatuses.CANCELLED_USER_CANCELLED,
50
+ };
26
51
  //# sourceMappingURL=types.js.map
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,OAMX;AAND,WAAY,OAAO;IACjB,6DAAkB,CAAA;IAClB,mEAAqB,CAAA;IACrB,yCAAQ,CAAA;IACR,qDAAc,CAAA;IACd,6CAAU,CAAA;AACZ,CAAC,EANW,OAAO,GAAP,eAAO,KAAP,eAAO,QAMlB;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,kCAEX;AAFD,WAAY,kCAAkC;IAC5C,qEAA+B,CAAA;AACjC,CAAC,EAFW,kCAAkC,GAAlC,0CAAkC,KAAlC,0CAAkC,QAE7C","sourcesContent":["/** API */\n\nexport enum APIType {\n 'GET_TRANSACTIONS',\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 NOT_CANCELLED = 'not_cancelled',\n}\n\nexport interface SmartTransactionsStatus {\n error?: string;\n cancellationFeeWei: number;\n cancellationReason?: SmartTransactionCancellationReason;\n deadlineRatio: number;\n minedHash: string | undefined;\n minedTx: SmartTransactionMinedTx;\n}\n\nexport interface SmartTransaction {\n uuid: string;\n status?: SmartTransactionsStatus;\n}\n\n// TODO: maybe grab the type from transactions controller?\nexport type UnsignedTransaction = any;\n\n// TODO\nexport type SignedTransaction = any;\n\n// TODO\nexport type SignedCanceledTransaction = any;\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";AAAA,UAAU;;;AAEV,IAAY,OAMX;AAND,WAAY,OAAO;IACjB,6CAAU,CAAA;IACV,mEAAqB,CAAA;IACrB,yCAAQ,CAAA;IACR,qDAAc,CAAA;IACd,6CAAU,CAAA;AACZ,CAAC,EANW,OAAO,GAAP,eAAO,KAAP,eAAO,QAMlB;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,kCAOX;AAPD,WAAY,kCAAkC;IAC5C,mEAA6B,CAAA;IAC7B,6DAAuB,CAAA;IACvB,yEAAmC,CAAA;IACnC,qEAA+B,CAAA;IAC/B,uEAAiC,CAAA;IACjC,qEAA+B,CAAA;AACjC,CAAC,EAPW,kCAAkC,GAAlC,0CAAkC,KAAlC,0CAAkC,QAO7C;AAED,IAAY,wBAWX;AAXD,WAAY,wBAAwB;IAClC,+CAAmB,CAAA;IACnB,+CAAmB,CAAA;IACnB,iDAAqB,CAAA;IACrB,+CAAmB,CAAA;IACnB,6EAAiD,CAAA;IACjD,uEAA2C,CAAA;IAC3C,mFAAuD,CAAA;IACvD,+EAAmD,CAAA;IACnD,iFAAqD,CAAA;IACrD,iDAAqB,CAAA;AACvB,CAAC,EAXW,wBAAwB,GAAxB,gCAAwB,KAAxB,gCAAwB,QAWnC;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;CACpD,CAAC","sourcesContent":["/** API */\n\nexport enum APIType {\n 'GET_FEES',\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}\n\nexport enum SmartTransactionStatuses {\n PENDING = 'pending',\n SUCCESS = 'success',\n REVERTED = 'reverted',\n UNKNOWN = 'unknown',\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 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};\n\nexport interface SmartTransactionsStatus {\n error?: string;\n cancellationFeeWei: number;\n cancellationReason?: SmartTransactionCancellationReason;\n deadlineRatio: number;\n minedHash: string | undefined;\n minedTx: SmartTransactionMinedTx;\n}\n\nexport interface SmartTransaction {\n uuid: string;\n chainId?: string;\n destinationTokenAddress?: string;\n destinationTokenDecimals?: string;\n destinationTokenSymbol?: string;\n history?: any;\n metamaskNetworkId?: string;\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 interface Fee {\n maxFeePerGas: number;\n maxPriorityFeePerGas: number;\n}\n\n// TODO: maybe grab the type from transactions controller?\nexport type UnsignedTransaction = any;\n\n// TODO\nexport type SignedTransaction = any;\n\n// TODO\nexport type SignedCanceledTransaction = any;\n"]}
package/dist/utils.d.ts CHANGED
@@ -1,3 +1,36 @@
1
- import { APIType, SmartTransaction } from './types';
1
+ import { APIType, SmartTransaction, SmartTransactionsStatus, SmartTransactionStatuses } from './types';
2
2
  export declare function isSmartTransactionPending(smartTransaction: SmartTransaction): boolean;
3
+ export declare const isSmartTransactionStatusResolved: (status: SmartTransactionsStatus | string) => boolean;
3
4
  export declare function getAPIRequestURL(apiType: APIType, chainId: string): string;
5
+ export declare const calculateStatus: (status: SmartTransactionsStatus) => SmartTransactionStatuses;
6
+ /**
7
+ Generates an array of history objects sense the previous state.
8
+ The object has the keys
9
+ op (the operation performed),
10
+ path (the key and if a nested object then each key will be separated with a `/`)
11
+ value
12
+ with the first entry having the note and a timestamp when the change took place
13
+ @param {Object} previousState - the previous state of the object
14
+ @param {Object} newState - the update object
15
+ @param {string} [note] - a optional note for the state change
16
+ @returns {Array}
17
+ */
18
+ export declare function generateHistoryEntry(previousState: any, newState: any, note: string): any;
19
+ /**
20
+ Recovers previous txMeta state obj
21
+ @returns {Object}
22
+ */
23
+ export declare function replayHistory(_shortHistory: any): any;
24
+ /**
25
+ * Snapshot {@code txMeta}
26
+ * @param {Object} txMeta - the tx metadata object
27
+ * @returns {Object} a deep clone without history
28
+ */
29
+ export declare function snapshotFromTxMeta(txMeta: any): any;
30
+ /**
31
+ * Returns processing time for an STX in seconds.
32
+ * @param {number} smartTransactionSubmittedtime
33
+ * @returns {number} Processing time in seconds.
34
+ */
35
+ export declare const getStxProcessingTime: (smartTransactionSubmittedtime: number | undefined) => number | undefined;
36
+ export declare function handleFetch(request: string, options?: RequestInit): Promise<any>;
package/dist/utils.js CHANGED
@@ -1,20 +1,25 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getAPIRequestURL = exports.isSmartTransactionPending = void 0;
6
+ exports.handleFetch = exports.getStxProcessingTime = exports.snapshotFromTxMeta = exports.replayHistory = exports.generateHistoryEntry = exports.calculateStatus = exports.getAPIRequestURL = exports.isSmartTransactionStatusResolved = exports.isSmartTransactionPending = void 0;
7
+ const fast_json_patch_1 = __importDefault(require("fast-json-patch"));
8
+ const lodash_1 = require("lodash");
4
9
  const types_1 = require("./types");
5
10
  const constants_1 = require("./constants");
6
11
  function isSmartTransactionPending(smartTransaction) {
7
- return (!smartTransaction.status ||
8
- (!smartTransaction.status.error &&
9
- smartTransaction.status.minedTx === types_1.SmartTransactionMinedTx.NOT_MINED));
12
+ return smartTransaction.status === types_1.SmartTransactionStatuses.PENDING;
10
13
  }
11
14
  exports.isSmartTransactionPending = isSmartTransactionPending;
15
+ const isSmartTransactionStatusResolved = (status) => status === 'uuid_not_found';
16
+ exports.isSmartTransactionStatusResolved = isSmartTransactionStatusResolved;
12
17
  // TODO use actual url once API is defined
13
18
  function getAPIRequestURL(apiType, chainId) {
14
- const chainIdDec = constants_1.CHAIN_IDS_HEX_TO_DEC[chainId];
19
+ const chainIdDec = parseInt(chainId, 16);
15
20
  switch (apiType) {
16
- case types_1.APIType.GET_TRANSACTIONS: {
17
- return `${constants_1.API_BASE_URL}/networks/${chainIdDec}/getTransactions`;
21
+ case types_1.APIType.GET_FEES: {
22
+ return `${constants_1.API_BASE_URL}/networks/${chainIdDec}/getFees`;
18
23
  }
19
24
  case types_1.APIType.SUBMIT_TRANSACTIONS: {
20
25
  return `${constants_1.API_BASE_URL}/networks/${chainIdDec}/submitTransactions`;
@@ -34,4 +39,108 @@ function getAPIRequestURL(apiType, chainId) {
34
39
  }
35
40
  }
36
41
  exports.getAPIRequestURL = getAPIRequestURL;
42
+ const calculateStatus = (status) => {
43
+ if (exports.isSmartTransactionStatusResolved(status)) {
44
+ return types_1.SmartTransactionStatuses.RESOLVED;
45
+ }
46
+ const cancellations = [
47
+ types_1.SmartTransactionCancellationReason.WOULD_REVERT,
48
+ types_1.SmartTransactionCancellationReason.TOO_CHEAP,
49
+ types_1.SmartTransactionCancellationReason.DEADLINE_MISSED,
50
+ types_1.SmartTransactionCancellationReason.INVALID_NONCE,
51
+ types_1.SmartTransactionCancellationReason.USER_CANCELLED,
52
+ ];
53
+ if ((status === null || status === void 0 ? void 0 : status.minedTx) === types_1.SmartTransactionMinedTx.NOT_MINED) {
54
+ if (status.cancellationReason ===
55
+ types_1.SmartTransactionCancellationReason.NOT_CANCELLED) {
56
+ return types_1.SmartTransactionStatuses.PENDING;
57
+ }
58
+ const isCancellation = cancellations.findIndex((cancellation) => cancellation === status.cancellationReason) > -1;
59
+ if (status.cancellationReason && isCancellation) {
60
+ return types_1.cancellationReasonToStatusMap[status.cancellationReason];
61
+ }
62
+ }
63
+ else if ((status === null || status === void 0 ? void 0 : status.minedTx) === types_1.SmartTransactionMinedTx.SUCCESS) {
64
+ return types_1.SmartTransactionStatuses.SUCCESS;
65
+ }
66
+ else if ((status === null || status === void 0 ? void 0 : status.minedTx) === types_1.SmartTransactionMinedTx.REVERTED) {
67
+ return types_1.SmartTransactionStatuses.REVERTED;
68
+ }
69
+ else if ((status === null || status === void 0 ? void 0 : status.minedTx) === types_1.SmartTransactionMinedTx.UNKNOWN) {
70
+ return types_1.SmartTransactionStatuses.UNKNOWN;
71
+ }
72
+ return types_1.SmartTransactionStatuses.UNKNOWN;
73
+ };
74
+ exports.calculateStatus = calculateStatus;
75
+ /**
76
+ Generates an array of history objects sense the previous state.
77
+ The object has the keys
78
+ op (the operation performed),
79
+ path (the key and if a nested object then each key will be separated with a `/`)
80
+ value
81
+ with the first entry having the note and a timestamp when the change took place
82
+ @param {Object} previousState - the previous state of the object
83
+ @param {Object} newState - the update object
84
+ @param {string} [note] - a optional note for the state change
85
+ @returns {Array}
86
+ */
87
+ function generateHistoryEntry(previousState, newState, note) {
88
+ const entry = fast_json_patch_1.default.compare(previousState, newState);
89
+ // Add a note to the first op, since it breaks if we append it to the entry
90
+ if (entry[0]) {
91
+ if (note) {
92
+ entry[0].note = note;
93
+ }
94
+ entry[0].timestamp = Date.now();
95
+ }
96
+ return entry;
97
+ }
98
+ exports.generateHistoryEntry = generateHistoryEntry;
99
+ /**
100
+ Recovers previous txMeta state obj
101
+ @returns {Object}
102
+ */
103
+ function replayHistory(_shortHistory) {
104
+ const shortHistory = lodash_1.cloneDeep(_shortHistory);
105
+ return shortHistory.reduce((val, entry) => fast_json_patch_1.default.applyPatch(val, entry).newDocument);
106
+ }
107
+ exports.replayHistory = replayHistory;
108
+ /**
109
+ * Snapshot {@code txMeta}
110
+ * @param {Object} txMeta - the tx metadata object
111
+ * @returns {Object} a deep clone without history
112
+ */
113
+ function snapshotFromTxMeta(txMeta) {
114
+ const shallow = Object.assign({}, txMeta);
115
+ delete shallow.history;
116
+ return lodash_1.cloneDeep(shallow);
117
+ }
118
+ exports.snapshotFromTxMeta = snapshotFromTxMeta;
119
+ /**
120
+ * Returns processing time for an STX in seconds.
121
+ * @param {number} smartTransactionSubmittedtime
122
+ * @returns {number} Processing time in seconds.
123
+ */
124
+ const getStxProcessingTime = (smartTransactionSubmittedtime) => {
125
+ if (!smartTransactionSubmittedtime) {
126
+ return undefined;
127
+ }
128
+ return Math.round((Date.now() - smartTransactionSubmittedtime) / 1000);
129
+ };
130
+ exports.getStxProcessingTime = getStxProcessingTime;
131
+ async function handleFetch(request, options) {
132
+ const response = await fetch(request, options);
133
+ const json = await response.json();
134
+ if (!response.ok) {
135
+ const { error: type, error_details: message } = json;
136
+ console.log(`response`, response);
137
+ throw new Error(`Fetch error:${JSON.stringify({
138
+ status: response.status,
139
+ type,
140
+ message,
141
+ })}`);
142
+ }
143
+ return json;
144
+ }
145
+ exports.handleFetch = handleFetch;
37
146
  //# sourceMappingURL=utils.js.map
package/dist/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;AAAA,mCAA6E;AAC7E,2CAAiE;AAEjE,SAAgB,yBAAyB,CAAC,gBAAkC;IAC1E,OAAO,CACL,CAAC,gBAAgB,CAAC,MAAM;QACxB,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK;YAC7B,gBAAgB,CAAC,MAAM,CAAC,OAAO,KAAK,+BAAuB,CAAC,SAAS,CAAC,CACzE,CAAC;AACJ,CAAC;AAND,8DAMC;AAED,0CAA0C;AAC1C,SAAgB,gBAAgB,CAAC,OAAgB,EAAE,OAAe;IAChE,MAAM,UAAU,GAAG,gCAAoB,CAAC,OAAO,CAAC,CAAC;IACjD,QAAQ,OAAO,EAAE;QACf,KAAK,eAAO,CAAC,gBAAgB,CAAC,CAAC;YAC7B,OAAO,GAAG,wBAAY,aAAa,UAAU,kBAAkB,CAAC;SACjE;QAED,KAAK,eAAO,CAAC,mBAAmB,CAAC,CAAC;YAChC,OAAO,GAAG,wBAAY,aAAa,UAAU,qBAAqB,CAAC;SACpE;QAED,KAAK,eAAO,CAAC,MAAM,CAAC,CAAC;YACnB,OAAO,GAAG,wBAAY,aAAa,UAAU,SAAS,CAAC;SACxD;QAED,KAAK,eAAO,CAAC,YAAY,CAAC,CAAC;YACzB,OAAO,GAAG,wBAAY,aAAa,UAAU,cAAc,CAAC;SAC7D;QAED,KAAK,eAAO,CAAC,QAAQ,CAAC,CAAC;YACrB,OAAO,GAAG,wBAAY,aAAa,UAAU,SAAS,CAAC;SACxD;QAED,OAAO,CAAC,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC,8CAA8C;SACnF;KACF;AACH,CAAC;AA3BD,4CA2BC","sourcesContent":["import { APIType, SmartTransaction, SmartTransactionMinedTx } from './types';\nimport { API_BASE_URL, CHAIN_IDS_HEX_TO_DEC } from './constants';\n\nexport function isSmartTransactionPending(smartTransaction: SmartTransaction) {\n return (\n !smartTransaction.status ||\n (!smartTransaction.status.error &&\n smartTransaction.status.minedTx === SmartTransactionMinedTx.NOT_MINED)\n );\n}\n\n// TODO use actual url once API is defined\nexport function getAPIRequestURL(apiType: APIType, chainId: string): string {\n const chainIdDec = CHAIN_IDS_HEX_TO_DEC[chainId];\n switch (apiType) {\n case APIType.GET_TRANSACTIONS: {\n return `${API_BASE_URL}/networks/${chainIdDec}/getTransactions`;\n }\n\n case APIType.SUBMIT_TRANSACTIONS: {\n return `${API_BASE_URL}/networks/${chainIdDec}/submitTransactions`;\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"]}
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 { cloneDeep } from 'lodash';\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 status: SmartTransactionsStatus | string,\n) => status === '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.SUBMIT_TRANSACTIONS: {\n return `${API_BASE_URL}/networks/${chainIdDec}/submitTransactions`;\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 = (status: SmartTransactionsStatus) => {\n if (isSmartTransactionStatusResolved(status)) {\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 ];\n if (status?.minedTx === SmartTransactionMinedTx.NOT_MINED) {\n if (\n status.cancellationReason ===\n SmartTransactionCancellationReason.NOT_CANCELLED\n ) {\n return SmartTransactionStatuses.PENDING;\n }\n\n const isCancellation =\n cancellations.findIndex(\n (cancellation) => cancellation === status.cancellationReason,\n ) > -1;\n if (status.cancellationReason && isCancellation) {\n return cancellationReasonToStatusMap[status.cancellationReason];\n }\n } else if (status?.minedTx === SmartTransactionMinedTx.SUCCESS) {\n return SmartTransactionStatuses.SUCCESS;\n } else if (status?.minedTx === SmartTransactionMinedTx.REVERTED) {\n return SmartTransactionStatuses.REVERTED;\n } else if (status?.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 {Object} previousState - the previous state of the object\n @param {Object} newState - the update object\n @param {string} [note] - a optional note for the state change\n @returns {Array}\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 {Object}\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 {Object} txMeta - the tx metadata object\n * @returns {Object} 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 {number} smartTransactionSubmittedtime\n * @returns {number} 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 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 const { error: type, error_details: message } = json;\n console.log(`response`, response);\n throw new Error(\n `Fetch error:${JSON.stringify({\n status: response.status,\n type,\n message,\n })}`,\n );\n }\n return json;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metamask/smart-transactions-controller",
3
- "version": "1.0.0",
3
+ "version": "1.4.0",
4
4
  "description": "MetaMask controller for Smart Transactions.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -26,7 +26,13 @@
26
26
  "build:link": "yarn build && cd dist && yarn link && rm -rf node_modules && cd .."
27
27
  },
28
28
  "dependencies": {
29
- "@metamask/controllers": "^16.0.0"
29
+ "@metamask/controllers": "^20.0.0",
30
+ "@types/lodash": "^4.14.176",
31
+ "bignumber.js": "^9.0.1",
32
+ "ethers": "^5.5.1",
33
+ "fast-json-patch": "^3.1.0",
34
+ "isomorphic-fetch": "^3.0.0",
35
+ "lodash": "^4.17.21"
30
36
  },
31
37
  "devDependencies": {
32
38
  "@lavamoat/allow-scripts": "^1.0.5",