@ref-finance/ref-sdk 1.3.8 → 1.3.10

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.
@@ -168,6 +168,8 @@
168
168
 
169
169
  .__ref-swap-widget-submit-button {
170
170
  width: 100%;
171
+ display: flex;
172
+ align-items: center;
171
173
  justify-content: center;
172
174
  font-size: 18px;
173
175
  font-weight: 700;
@@ -176,6 +178,28 @@
176
178
  margin-top: 14px;
177
179
  cursor: pointer;
178
180
  }
181
+
182
+ .__ref-swap-widget-submit-button-loader {
183
+ width: 20px;
184
+ height: 20px;
185
+ border: 2px solid #fff;
186
+ border-bottom-color: rgb(255, 255, 255);
187
+ border-bottom-color: transparent;
188
+ border-radius: 50%;
189
+ display: inline-block;
190
+ box-sizing: border-box;
191
+ animation: rotation 1s linear infinite;
192
+ }
193
+
194
+ @keyframes rotation {
195
+ 0% {
196
+ transform: rotate(0deg);
197
+ }
198
+ 100% {
199
+ transform: rotate(360deg);
200
+ }
201
+ }
202
+
179
203
  .__ref-widget-swap-detail-view {
180
204
  justify-content: space-between;
181
205
  width: 100%;
@@ -531,18 +531,6 @@ function _extends() {
531
531
  };
532
532
  return _extends.apply(this, arguments);
533
533
  }
534
- function _objectWithoutPropertiesLoose(source, excluded) {
535
- if (source == null) return {};
536
- var target = {};
537
- var sourceKeys = Object.keys(source);
538
- var key, i;
539
- for (i = 0; i < sourceKeys.length; i++) {
540
- key = sourceKeys[i];
541
- if (excluded.indexOf(key) >= 0) continue;
542
- target[key] = source[key];
543
- }
544
- return target;
545
- }
546
534
  function _unsupportedIterableToArray(o, minLen) {
547
535
  if (!o) return;
548
536
  if (typeof o === "string") return _arrayLikeToArray(o, minLen);
@@ -4748,7 +4736,6 @@ var fetchAllPools = /*#__PURE__*/function () {
4748
4736
  };
4749
4737
  }();
4750
4738
 
4751
- var _excluded = ["slippageTolerance", "refreshTrigger", "onSwap", "AccountId", "poolFetchingState", "referralId"];
4752
4739
  var ThemeContext = /*#__PURE__*/React.createContext(defaultTheme);
4753
4740
  var ThemeContextProvider = function ThemeContextProvider(_ref) {
4754
4741
  var customTheme = _ref.customTheme,
@@ -4927,7 +4914,7 @@ var useSwap = function useSwap(params) {
4927
4914
  AccountId = params.AccountId,
4928
4915
  poolFetchingState = params.poolFetchingState,
4929
4916
  referralId = params.referralId,
4930
- swapParams = _objectWithoutPropertiesLoose(params, _excluded);
4917
+ tokens = params.tokens;
4931
4918
  var tokenIn = params.tokenIn,
4932
4919
  tokenOut = params.tokenOut,
4933
4920
  amountIn = params.amountIn;
@@ -4949,6 +4936,15 @@ var useSwap = function useSwap(params) {
4949
4936
  var _useState14 = React.useState(false),
4950
4937
  forceEstimate = _useState14[0],
4951
4938
  setForceEstimate = _useState14[1];
4939
+ var _useTokenBalances = useTokenBalances(tokens, AccountId),
4940
+ balances = _useTokenBalances.balances,
4941
+ updateTokenBalance = _useTokenBalances.updateTokenBalance;
4942
+ var tokenInBalance = React.useMemo(function () {
4943
+ return balances[tokenIn == null ? void 0 : tokenIn.id];
4944
+ }, [tokenIn, balances]);
4945
+ var tokenOutBalance = React.useMemo(function () {
4946
+ return balances[tokenOut == null ? void 0 : tokenOut.id] || '';
4947
+ }, [tokenOut, balances]);
4952
4948
  var minAmountOut = amountOut ? percentLess(slippageTolerance, amountOut) : '';
4953
4949
  var fee = !params.tokenOut || !params.tokenIn ? 0 : getAvgFee(estimates, params.tokenOut.id, toNonDivisibleNumber(params.tokenIn.decimals, params.amountIn));
4954
4950
  var rate = calculateExchangeRate(ONLY_ZEROS.test(params.amountIn) ? '1' : params.amountIn, amountOut || '1');
@@ -4990,8 +4986,16 @@ var useSwap = function useSwap(params) {
4990
4986
  _minAmountOut = percentLess(slippageTolerance, scientificNotationToString(bigEstimate.toString()));
4991
4987
  transactionsRef.push(nearWithdrawTransaction(_minAmountOut));
4992
4988
  }
4993
- onSwap(transactionsRef);
4994
- case 8:
4989
+ _context3.next = 9;
4990
+ return onSwap(transactionsRef);
4991
+ case 9:
4992
+ setTimeout(function () {
4993
+ var tokensToUpdate = [];
4994
+ if (tokenIn) tokensToUpdate.push(tokenIn.id);
4995
+ if (tokenOut) tokensToUpdate.push(tokenOut.id);
4996
+ if (tokensToUpdate.length > 0 && AccountId) updateTokenBalance(tokensToUpdate, AccountId);
4997
+ }, 3000);
4998
+ case 10:
4995
4999
  case "end":
4996
5000
  return _context3.stop();
4997
5001
  }
@@ -5053,6 +5057,9 @@ var useSwap = function useSwap(params) {
5053
5057
  return {
5054
5058
  amountOut: amountOut,
5055
5059
  minAmountOut: minAmountOut,
5060
+ balances: balances,
5061
+ tokenInBalance: tokenInBalance,
5062
+ tokenOutBalance: tokenOutBalance,
5056
5063
  fee: fee,
5057
5064
  rate: rate,
5058
5065
  estimates: estimates,
@@ -5080,30 +5087,108 @@ var TokenPriceContextProvider = function TokenPriceContextProvider(_ref7) {
5080
5087
  value: tokenPriceList
5081
5088
  }, children);
5082
5089
  };
5083
- var useTokenBalnces = function useTokenBalnces(tokens, AccountId) {
5090
+ var useTokenBalances = function useTokenBalances(tokens, AccountId) {
5084
5091
  var _useState16 = React.useState({}),
5085
5092
  balances = _useState16[0],
5086
5093
  setBalances = _useState16[1];
5094
+ var updateTokenBalance = React.useCallback( /*#__PURE__*/function () {
5095
+ var _ref8 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5(tokenIds, AccountId) {
5096
+ var updatedTokensBalancesMap;
5097
+ return _regeneratorRuntime().wrap(function _callee5$(_context5) {
5098
+ while (1) {
5099
+ switch (_context5.prev = _context5.next) {
5100
+ case 0:
5101
+ updatedTokensBalancesMap = {};
5102
+ _context5.next = 3;
5103
+ return Promise.all(tokenIds.map( /*#__PURE__*/function () {
5104
+ var _ref9 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4(tokenId) {
5105
+ var _tokens$find;
5106
+ return _regeneratorRuntime().wrap(function _callee4$(_context4) {
5107
+ while (1) {
5108
+ switch (_context4.prev = _context4.next) {
5109
+ case 0:
5110
+ _context4.t0 = toReadableNumber;
5111
+ _context4.t1 = ((_tokens$find = tokens.find(function (t) {
5112
+ return t.id === tokenId;
5113
+ })) == null ? void 0 : _tokens$find.decimals) || 0;
5114
+ _context4.next = 4;
5115
+ return ftGetBalance(tokenId === exports.WRAP_NEAR_CONTRACT_ID ? 'NEAR' : tokenId, AccountId);
5116
+ case 4:
5117
+ _context4.t2 = _context4.sent;
5118
+ updatedTokensBalancesMap[tokenId] = (0, _context4.t0)(_context4.t1, _context4.t2);
5119
+ case 6:
5120
+ case "end":
5121
+ return _context4.stop();
5122
+ }
5123
+ }
5124
+ }, _callee4);
5125
+ }));
5126
+ return function (_x3) {
5127
+ return _ref9.apply(this, arguments);
5128
+ };
5129
+ }()));
5130
+ case 3:
5131
+ setBalances(function (prevState) {
5132
+ return _extends({}, prevState, updatedTokensBalancesMap);
5133
+ });
5134
+ case 4:
5135
+ case "end":
5136
+ return _context5.stop();
5137
+ }
5138
+ }
5139
+ }, _callee5);
5140
+ }));
5141
+ return function (_x, _x2) {
5142
+ return _ref8.apply(this, arguments);
5143
+ };
5144
+ }(), [tokens]);
5087
5145
  React.useEffect(function () {
5088
- var validTokens = tokens.filter(function (t) {
5089
- return !!(t != null && t.id);
5090
- });
5091
- var ids = validTokens.map(function (token) {
5092
- return token.id;
5093
- });
5094
- Promise.all(ids.map(function (id) {
5095
- return ftGetBalance(id === exports.WRAP_NEAR_CONTRACT_ID ? 'NEAR' : id, AccountId);
5096
- })).then(function (balances) {
5097
- var balancesMap = validTokens.reduce(function (acc, token, index) {
5098
- var _extends2;
5099
- return _extends({}, acc, (_extends2 = {}, _extends2[token.id] = toReadableNumber(token.decimals, balances[index]), _extends2));
5100
- }, {});
5101
- setBalances(balancesMap);
5102
- });
5103
- }, [tokens.map(function (t) {
5146
+ // Initializes token balances
5147
+ // Called in 1 minute intervals
5148
+ var initTokenBalances = /*#__PURE__*/function () {
5149
+ var _ref10 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6() {
5150
+ var validTokens, ids;
5151
+ return _regeneratorRuntime().wrap(function _callee6$(_context6) {
5152
+ while (1) {
5153
+ switch (_context6.prev = _context6.next) {
5154
+ case 0:
5155
+ if (AccountId) {
5156
+ _context6.next = 3;
5157
+ break;
5158
+ }
5159
+ setBalances({});
5160
+ return _context6.abrupt("return");
5161
+ case 3:
5162
+ validTokens = tokens.filter(function (t) {
5163
+ return !!(t != null && t.id);
5164
+ });
5165
+ ids = validTokens.map(function (token) {
5166
+ return token.id;
5167
+ });
5168
+ updateTokenBalance(ids, AccountId);
5169
+ case 6:
5170
+ case "end":
5171
+ return _context6.stop();
5172
+ }
5173
+ }
5174
+ }, _callee6);
5175
+ }));
5176
+ return function initTokenBalances() {
5177
+ return _ref10.apply(this, arguments);
5178
+ };
5179
+ }();
5180
+ initTokenBalances();
5181
+ var interval = setInterval(initTokenBalances, 60000);
5182
+ return function () {
5183
+ return clearInterval(interval);
5184
+ };
5185
+ }, [AccountId, tokens.map(function (t) {
5104
5186
  return t == null ? void 0 : t.id;
5105
5187
  }).join('-')]);
5106
- return balances;
5188
+ return {
5189
+ balances: balances,
5190
+ updateTokenBalance: updateTokenBalance
5191
+ };
5107
5192
  };
5108
5193
 
5109
5194
  var getPriceImpact$1 = function getPriceImpact(value, tokenIn, tokenInAmount) {
@@ -5416,6 +5501,8 @@ var HalfAndMaxAmount = function HalfAndMaxAmount(_ref6) {
5416
5501
  }
5417
5502
  }, "Max"));
5418
5503
  };
5504
+ var DECIMAL_POINT = '.';
5505
+ var ALLOWED_KEYS = ['Backspace', 'Tab', 'ArrowLeft', 'ArrowRight', 'Delete', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', DECIMAL_POINT];
5419
5506
  var TokenAmount = function TokenAmount(props) {
5420
5507
  var _ref$current2;
5421
5508
  var balance = props.balance,
@@ -5436,6 +5523,28 @@ var TokenAmount = function TokenAmount(props) {
5436
5523
  var _useState5 = React.useState(false),
5437
5524
  hoverSelect = _useState5[0],
5438
5525
  setHoverSelect = _useState5[1];
5526
+ var handleKeyDown = function handleKeyDown(event) {
5527
+ if (!ALLOWED_KEYS.includes(event.key) && !event.ctrlKey) {
5528
+ event.preventDefault();
5529
+ }
5530
+ var isDecimalPoint = event.key === DECIMAL_POINT;
5531
+ if (!isDecimalPoint) return;
5532
+ // Ensure only one dot is allowed
5533
+ var inputValue = event.target.value;
5534
+ if (inputValue.includes(DECIMAL_POINT)) {
5535
+ event.preventDefault();
5536
+ }
5537
+ // prohibit only one dot
5538
+ if (inputValue.length === 0) {
5539
+ event.preventDefault();
5540
+ }
5541
+ };
5542
+ var handlePaste = function handlePaste(event) {
5543
+ var paste = event.clipboardData.getData('text');
5544
+ if (!/^[0-9.]+$/.test(paste)) {
5545
+ event.preventDefault();
5546
+ }
5547
+ };
5439
5548
  var handleChange = function handleChange(amount) {
5440
5549
  if (onChangeAmount) {
5441
5550
  onChangeAmount(amount);
@@ -5481,7 +5590,8 @@ var TokenAmount = function TokenAmount(props) {
5481
5590
  }, !token ? React__default.createElement(React__default.Fragment, null, React__default.createElement("span", {
5482
5591
  style: {
5483
5592
  whiteSpace: 'nowrap',
5484
- height: '26px'
5593
+ height: '26px',
5594
+ userSelect: 'none'
5485
5595
  },
5486
5596
  className: "__ref-swap-widget-row-flex-center"
5487
5597
  }, "Select Token")) : React__default.createElement(React__default.Fragment, null, React__default.createElement("img", {
@@ -5516,16 +5626,16 @@ var TokenAmount = function TokenAmount(props) {
5516
5626
  }, React__default.createElement("input", {
5517
5627
  ref: ref,
5518
5628
  max: !!onChangeAmount ? curMax : undefined,
5519
- min: "0",
5520
5629
  onWheel: function onWheel() {
5521
5630
  if (ref.current) {
5522
5631
  ref.current.blur();
5523
5632
  }
5524
5633
  },
5525
5634
  className: "__ref-swap-widget-input-class",
5526
- step: "any",
5527
5635
  value: amount,
5528
- type: "number",
5636
+ type: "text",
5637
+ onKeyDown: handleKeyDown,
5638
+ onPaste: handlePaste,
5529
5639
  placeholder: !onChangeAmount ? '-' : '0.0',
5530
5640
  onChange: function onChange(_ref7) {
5531
5641
  var target = _ref7.target;
@@ -5533,9 +5643,6 @@ var TokenAmount = function TokenAmount(props) {
5533
5643
  handleChange(target.value);
5534
5644
  },
5535
5645
  disabled: !onChangeAmount,
5536
- onKeyDown: function onKeyDown(e) {
5537
- return symbolsArr.includes(e.key) && e.preventDefault();
5538
- },
5539
5646
  style: {
5540
5647
  color: primary,
5541
5648
  marginBottom: '8px',
@@ -6383,15 +6490,9 @@ var SwapWidget = function SwapWidget(props) {
6383
6490
  var _useState2 = React.useState(),
6384
6491
  tokenOut = _useState2[0],
6385
6492
  setTokenOut = _useState2[1];
6386
- var _useState3 = React.useState(''),
6387
- tokenInBalance = _useState3[0],
6388
- setTokenInBalance = _useState3[1];
6389
- var _useState4 = React.useState(''),
6390
- tokenOutBalance = _useState4[0],
6391
- setTokenOutBalance = _useState4[1];
6392
- var _useState5 = React.useState(false),
6393
- notOpen = _useState5[0],
6394
- setNotOpen = _useState5[1];
6493
+ var _useState3 = React.useState(false),
6494
+ notOpen = _useState3[0],
6495
+ setNotOpen = _useState3[1];
6395
6496
  React.useEffect(function () {
6396
6497
  if (!transactionState) return;
6397
6498
  if (transactionState && transactionState.state !== null) {
@@ -6399,18 +6500,18 @@ var SwapWidget = function SwapWidget(props) {
6399
6500
  }
6400
6501
  transactionState == null ? void 0 : transactionState.setState((transactionState == null ? void 0 : transactionState.state) || null);
6401
6502
  }, [transactionState]);
6402
- var _useState6 = React.useState('swap'),
6403
- widgetRoute = _useState6[0],
6404
- setWidgetRoute = _useState6[1];
6405
- var _useState7 = React.useState('1'),
6406
- amountIn = _useState7[0],
6407
- setAmountIn = _useState7[1];
6408
- var _useState8 = React.useState(false),
6409
- showSlip = _useState8[0],
6410
- setShowSlip = _useState8[1];
6411
- var _useState9 = React.useState(0.5),
6412
- slippageTolerance = _useState9[0],
6413
- setSlippageTolerance = _useState9[1];
6503
+ var _useState4 = React.useState('swap'),
6504
+ widgetRoute = _useState4[0],
6505
+ setWidgetRoute = _useState4[1];
6506
+ var _useState5 = React.useState('1'),
6507
+ amountIn = _useState5[0],
6508
+ setAmountIn = _useState5[1];
6509
+ var _useState6 = React.useState(false),
6510
+ showSlip = _useState6[0],
6511
+ setShowSlip = _useState6[1];
6512
+ var _useState7 = React.useState(0.5),
6513
+ slippageTolerance = _useState7[0],
6514
+ setSlippageTolerance = _useState7[1];
6414
6515
  var _useTokensIndexer = useTokensIndexer({
6415
6516
  defaultTokenList: defaultTokenList,
6416
6517
  AccountId: AccountId
@@ -6421,10 +6522,9 @@ var SwapWidget = function SwapWidget(props) {
6421
6522
  useAllTokens({
6422
6523
  reload: true
6423
6524
  });
6424
- var balances = useTokenBalnces(tokens, AccountId);
6425
- var _useState10 = React.useState(false),
6426
- refreshTrigger = _useState10[0],
6427
- setRreshTrigger = _useState10[1];
6525
+ var _useState8 = React.useState(false),
6526
+ refreshTrigger = _useState8[0],
6527
+ setRreshTrigger = _useState8[1];
6428
6528
  var tokenPriceList = useTokenPriceList();
6429
6529
  var _useRefPools = useRefPools(refreshTrigger),
6430
6530
  allPools = _useRefPools.allPools,
@@ -6466,28 +6566,6 @@ var SwapWidget = function SwapWidget(props) {
6466
6566
  handleSetTokenOut(exports.REF_META_DATA);
6467
6567
  }
6468
6568
  }, [tokens, tokenLoading]);
6469
- React.useEffect(function () {
6470
- if (!tokenIn) return;
6471
- var wrapedId = tokenIn.id === exports.WRAP_NEAR_CONTRACT_ID ? 'NEAR' : tokenIn.id;
6472
- if (balances[wrapedId]) {
6473
- setTokenInBalance(balances[wrapedId]);
6474
- return;
6475
- }
6476
- ftGetBalance(wrapedId, AccountId).then(function (available) {
6477
- setTokenInBalance(toReadableNumber(tokenIn.decimals, available));
6478
- });
6479
- }, [tokenIn, AccountId, balances]);
6480
- React.useEffect(function () {
6481
- if (!tokenOut) return;
6482
- var wrapedId = tokenOut.id === exports.WRAP_NEAR_CONTRACT_ID ? 'NEAR' : tokenOut.id;
6483
- if (balances[wrapedId]) {
6484
- setTokenOutBalance(balances[wrapedId]);
6485
- return;
6486
- }
6487
- ftGetBalance(wrapedId, AccountId).then(function (available) {
6488
- setTokenOutBalance(toReadableNumber(tokenOut.decimals, available));
6489
- });
6490
- }, [tokenOut, AccountId, balances]);
6491
6569
  var _useSwap = useSwap({
6492
6570
  tokenIn: tokenIn,
6493
6571
  tokenOut: tokenOut,
@@ -6509,10 +6587,14 @@ var SwapWidget = function SwapWidget(props) {
6509
6587
  AccountId: AccountId,
6510
6588
  refreshTrigger: refreshTrigger,
6511
6589
  poolFetchingState: poolFetchingState,
6512
- referralId: referralId
6590
+ referralId: referralId,
6591
+ tokens: tokens
6513
6592
  }),
6514
6593
  amountOut = _useSwap.amountOut,
6515
6594
  minAmountOut = _useSwap.minAmountOut,
6595
+ balances = _useSwap.balances,
6596
+ tokenInBalance = _useSwap.tokenInBalance,
6597
+ tokenOutBalance = _useSwap.tokenOutBalance,
6516
6598
  rate = _useSwap.rate,
6517
6599
  fee = _useSwap.fee,
6518
6600
  estimates = _useSwap.estimates,
@@ -6537,6 +6619,9 @@ var SwapWidget = function SwapWidget(props) {
6537
6619
  makeSwap();
6538
6620
  };
6539
6621
  var canSubmit = tokenIn && tokenOut && canSwap && !swapError && isSignedIn && new Big(tokenInBalance || '0').gte(amountIn || '0') && slippageTolerance > 0 && slippageTolerance < 100 && !ONLY_ZEROS.test(tokenInBalance);
6622
+ var tokensLoaded = React.useMemo(function () {
6623
+ return tokens.length > 0;
6624
+ }, [tokens]);
6540
6625
  return React__default.createElement(ThemeContextProvider, {
6541
6626
  customTheme: curTheme
6542
6627
  }, React__default.createElement(TokenPriceContextProvider, null, widgetRoute === 'swap' && React__default.createElement("form", {
@@ -6578,6 +6663,7 @@ var SwapWidget = function SwapWidget(props) {
6578
6663
  price: !tokenIn ? null : tokenPriceList == null ? void 0 : (_tokenPriceList$token = tokenPriceList[tokenIn.id]) == null ? void 0 : _tokenPriceList$token.price,
6579
6664
  onChangeAmount: setAmountIn,
6580
6665
  onSelectToken: function onSelectToken() {
6666
+ if (!tokensLoaded) return;
6581
6667
  setWidgetRoute('token-selector-in');
6582
6668
  }
6583
6669
  }), React__default.createElement("div", {
@@ -6603,6 +6689,7 @@ var SwapWidget = function SwapWidget(props) {
6603
6689
  token: tokenOut,
6604
6690
  price: !tokenOut ? null : tokenPriceList == null ? void 0 : (_tokenPriceList$token2 = tokenPriceList[tokenOut.id]) == null ? void 0 : _tokenPriceList$token2.price,
6605
6691
  onSelectToken: function onSelectToken() {
6692
+ if (!tokensLoaded) return;
6606
6693
  setWidgetRoute('token-selector-out');
6607
6694
  },
6608
6695
  onForceUpdate: function onForceUpdate() {
@@ -6639,7 +6726,9 @@ var SwapWidget = function SwapWidget(props) {
6639
6726
  cursor: !canSubmit ? 'not-allowed' : 'pointer'
6640
6727
  },
6641
6728
  disabled: !canSubmit
6642
- }, 'Swap') : React__default.createElement("button", {
6729
+ }, tokensLoaded ? 'Swap' : React__default.createElement("div", {
6730
+ className: "__ref-swap-widget-submit-button-loader"
6731
+ })) : React__default.createElement("button", {
6643
6732
  type: "button",
6644
6733
  className: "__ref-swap-widget-submit-button __ref-swap-widget-button",
6645
6734
  onClick: onConnect,