@kimafinance/kima-transaction-widget 1.0.9 → 1.1.1

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.
@@ -448,7 +448,7 @@ const Copy = ({
448
448
  };
449
449
 
450
450
  const SOLANA_USDK_ADDRESS = 'GkbnUDkymDTF4U6Z5wM5kKJn3GmGndMn2rN5typmyUHY';
451
- const ETHEREUM_USDK_ADDRESS = '0x8BAd07F2445D6390DD94Eca08882b7d515EAbe6C';
451
+ const ETHEREUM_USDK_ADDRESS = '0x7C043d4D2b505740742dF6Fdb79C5caEe08728a5';
452
452
  const POLYGON_USDK_ADDRESS = '0x5bd4865a6dEd507dA08ed1aBE3cd971a7e0405D7';
453
453
  const AVAX_USDK_ADDRESS = '0x7C043d4D2b505740742dF6Fdb79C5caEe08728a5';
454
454
  const FUSE_GDOLLAR_ADDRESS = '0x79BeecC4b165Ccf547662cB4f7C0e83b3796E5b3';
@@ -465,7 +465,7 @@ var ChainName;
465
465
  })(ChainName || (ChainName = {}));
466
466
  var SupportedChainId;
467
467
  (function (SupportedChainId) {
468
- SupportedChainId[SupportedChainId["ETHEREUM"] = 5] = "ETHEREUM";
468
+ SupportedChainId[SupportedChainId["ETHEREUM"] = 11155111] = "ETHEREUM";
469
469
  SupportedChainId[SupportedChainId["POLYGON"] = 80001] = "POLYGON";
470
470
  SupportedChainId[SupportedChainId["AVALANCHE"] = 43113] = "AVALANCHE";
471
471
  SupportedChainId[SupportedChainId["FUSE"] = 122] = "FUSE";
@@ -487,7 +487,7 @@ const CHAIN_NAMES_TO_STRING = {
487
487
  [ChainName.SOLANA]: 'Solana'
488
488
  };
489
489
  const CHAIN_NAMES_TO_EXPLORER = {
490
- [ChainName.ETHEREUM]: 'goerli.etherscan.io',
490
+ [ChainName.ETHEREUM]: 'sepolia.etherscan.io',
491
491
  [ChainName.POLYGON]: 'mumbai.polygonscan.com',
492
492
  [ChainName.AVALANCHE]: 'testnet.snowtrace.io',
493
493
  [ChainName.FUSE]: 'explorer.fuse.io',
@@ -1054,8 +1054,12 @@ function useNetworkOptions() {
1054
1054
  useEffect(() => {
1055
1055
  if (!nodeProviderQuery) return;
1056
1056
  (async function () {
1057
- const networks = await fetchWrapper.get(`${nodeProviderQuery}/kima-finance/kima/kima/getChains`);
1058
- setOptions(networkOptions.filter(network => networks.Chains.findIndex(id => id === network.id) >= 0));
1057
+ try {
1058
+ const networks = await fetchWrapper.get(`${nodeProviderQuery}/kima-finance/kima/kima/getChains`);
1059
+ setOptions(networkOptions.filter(network => networks.Chains.findIndex(id => id === network.id) >= 0));
1060
+ } catch (e) {
1061
+ console.log('rpc disconnected', e);
1062
+ }
1059
1063
  })();
1060
1064
  }, [nodeProviderQuery]);
1061
1065
  return useMemo(() => ({
@@ -1091,18 +1095,26 @@ const Network = ({
1091
1095
  useEffect(() => {
1092
1096
  if (!nodeProviderQuery || mode !== ModeOptions.bridge) return;
1093
1097
  (async function () {
1094
- const networks = await fetchWrapper.get(`${nodeProviderQuery}/kima-finance/kima/kima/get_available_chains/${originNetwork}`);
1095
- setAvailableNetworks(networks.Chains);
1096
- if (_isOriginChain) {
1097
- dispatch(setTargetNetwork(networks.Chains[0]));
1098
+ try {
1099
+ const networks = await fetchWrapper.get(`${nodeProviderQuery}/kima-finance/kima/kima/get_available_chains/${originNetwork}`);
1100
+ setAvailableNetworks(networks.Chains);
1101
+ if (_isOriginChain) {
1102
+ dispatch(setTargetNetwork(networks.Chains[0]));
1103
+ }
1104
+ } catch (e) {
1105
+ console.log('rpc disconnected', e);
1098
1106
  }
1099
1107
  })();
1100
1108
  }, [nodeProviderQuery, originNetwork, mode, _isOriginChain]);
1101
1109
  useEffect(() => {
1102
1110
  if (!nodeProviderQuery || mode !== ModeOptions.payment) return;
1103
1111
  (async function () {
1104
- const networks = await fetchWrapper.get(`${nodeProviderQuery}/kima-finance/kima/kima/get_available_chains/${targetNetwork}`);
1105
- setAvailableNetworks(networks.Chains);
1112
+ try {
1113
+ const networks = await fetchWrapper.get(`${nodeProviderQuery}/kima-finance/kima/kima/get_available_chains/${targetNetwork}`);
1114
+ setAvailableNetworks(networks.Chains);
1115
+ } catch (e) {
1116
+ console.log('rpc disconnected', e);
1117
+ }
1106
1118
  })();
1107
1119
  }, [nodeProviderQuery, mode]);
1108
1120
  useEffect(() => {
@@ -1884,18 +1896,26 @@ const NetworkDropdown = ({
1884
1896
  useEffect(() => {
1885
1897
  if (!nodeProviderQuery || mode !== ModeOptions.bridge) return;
1886
1898
  (async function () {
1887
- const networks = await fetchWrapper.get(`${nodeProviderQuery}/kima-finance/kima/kima/get_available_chains/${originNetwork}`);
1888
- setAvailableNetworks(networks.Chains);
1889
- if (_isOriginChain) {
1890
- dispatch(setTargetNetwork(networks.Chains[0]));
1899
+ try {
1900
+ const networks = await fetchWrapper.get(`${nodeProviderQuery}/kima-finance/kima/kima/get_available_chains/${originNetwork}`);
1901
+ setAvailableNetworks(networks.Chains);
1902
+ if (_isOriginChain) {
1903
+ dispatch(setTargetNetwork(networks.Chains[0]));
1904
+ }
1905
+ } catch (e) {
1906
+ console.log('rpc disconnected', e);
1891
1907
  }
1892
1908
  })();
1893
1909
  }, [nodeProviderQuery, originNetwork, mode, _isOriginChain]);
1894
1910
  useEffect(() => {
1895
1911
  if (!nodeProviderQuery || mode !== ModeOptions.payment) return;
1896
1912
  (async function () {
1897
- const networks = await fetchWrapper.get(`${nodeProviderQuery}/kima-finance/kima/kima/get_available_chains/${targetNetwork}`);
1898
- setAvailableNetworks(networks.Chains);
1913
+ try {
1914
+ const networks = await fetchWrapper.get(`${nodeProviderQuery}/kima-finance/kima/kima/get_available_chains/${targetNetwork}`);
1915
+ setAvailableNetworks(networks.Chains);
1916
+ } catch (e) {
1917
+ console.log('rpc disconnected', e);
1918
+ }
1899
1919
  })();
1900
1920
  }, [nodeProviderQuery, mode]);
1901
1921
  return React.createElement("div", {
@@ -2191,57 +2211,61 @@ const TransactionWidget = ({
2191
2211
  useEffect(() => {
2192
2212
  if (!nodeProviderQuery || txId < 0) return;
2193
2213
  const timerId = setInterval(async () => {
2194
- const result = await fetchWrapper.get(`${nodeProviderQuery}/kima-finance/kima/kima/transaction_data/${txId}`);
2195
- const data = result === null || result === void 0 ? void 0 : result.transactionData;
2196
- if (!data) return;
2197
- const status = data.status;
2198
- console.log(status);
2199
- setData({
2200
- sourceChain: data.originChain,
2201
- targetChain: data.targetChain,
2202
- tssPullHash: data.tssPullHash,
2203
- tssReleaseHash: data.tssReleaseHash,
2204
- amount: +data.amount,
2205
- symbol: data.symbol,
2206
- kimaTxHash: data.kimaTxHash
2207
- });
2208
- setErrorStep(-1);
2209
- if (status === TransactionStatus.AVAILABLE) {
2210
- setStep(1);
2211
- setPercent(25);
2212
- setLoadingStep(1);
2213
- } else if (status === TransactionStatus.CONFIRMED) {
2214
- setStep(2);
2215
- setPercent(50);
2216
- setLoadingStep(2);
2217
- } else if (status.startsWith(TransactionStatus.UNAVAILABLE)) {
2218
- setStep(1);
2219
- setPercent(25);
2220
- setErrorStep(1);
2221
- setLoadingStep(-1);
2222
- } else if (status === TransactionStatus.KEYSIGNED) {
2223
- setStep(3);
2224
- setPercent(75);
2225
- setLoadingStep(3);
2226
- } else if (status === TransactionStatus.PAID) {
2227
- setStep(3);
2228
- setPercent(90);
2229
- setLoadingStep(3);
2230
- } else if (status === TransactionStatus.FAILED) {
2231
- setStep(3);
2232
- setPercent(90);
2233
- setErrorStep(3);
2234
- setLoadingStep(-1);
2235
- } else if (status === TransactionStatus.COMPLETED) {
2236
- setStep(4);
2237
- setPercent(100);
2238
- clearInterval(timerId);
2239
- setLoadingStep(-1);
2240
- setTimeout(() => {
2241
- successHandler({
2242
- txId
2243
- });
2244
- }, 3000);
2214
+ try {
2215
+ const result = await fetchWrapper.get(`${nodeProviderQuery}/kima-finance/kima/kima/transaction_data/${txId}`);
2216
+ const data = result === null || result === void 0 ? void 0 : result.transactionData;
2217
+ if (!data) return;
2218
+ const status = data.status;
2219
+ console.log(status);
2220
+ setData({
2221
+ sourceChain: data.originChain,
2222
+ targetChain: data.targetChain,
2223
+ tssPullHash: data.tssPullHash,
2224
+ tssReleaseHash: data.tssReleaseHash,
2225
+ amount: +data.amount,
2226
+ symbol: data.symbol,
2227
+ kimaTxHash: data.kimaTxHash
2228
+ });
2229
+ setErrorStep(-1);
2230
+ if (status === TransactionStatus.AVAILABLE) {
2231
+ setStep(1);
2232
+ setPercent(25);
2233
+ setLoadingStep(1);
2234
+ } else if (status === TransactionStatus.CONFIRMED) {
2235
+ setStep(2);
2236
+ setPercent(50);
2237
+ setLoadingStep(2);
2238
+ } else if (status.startsWith(TransactionStatus.UNAVAILABLE)) {
2239
+ setStep(1);
2240
+ setPercent(25);
2241
+ setErrorStep(1);
2242
+ setLoadingStep(-1);
2243
+ } else if (status === TransactionStatus.KEYSIGNED) {
2244
+ setStep(3);
2245
+ setPercent(75);
2246
+ setLoadingStep(3);
2247
+ } else if (status === TransactionStatus.PAID) {
2248
+ setStep(3);
2249
+ setPercent(90);
2250
+ setLoadingStep(3);
2251
+ } else if (status === TransactionStatus.FAILED) {
2252
+ setStep(3);
2253
+ setPercent(90);
2254
+ setErrorStep(3);
2255
+ setLoadingStep(-1);
2256
+ } else if (status === TransactionStatus.COMPLETED) {
2257
+ setStep(4);
2258
+ setPercent(100);
2259
+ clearInterval(timerId);
2260
+ setLoadingStep(-1);
2261
+ setTimeout(() => {
2262
+ successHandler({
2263
+ txId
2264
+ });
2265
+ }, 3000);
2266
+ }
2267
+ } catch (e) {
2268
+ console.log('rpc disconnected', e);
2245
2269
  }
2246
2270
  }, 1000);
2247
2271
  return () => {
@@ -6204,17 +6228,27 @@ function useAllowance() {
6204
6228
  }, [selectedCoin, sourceChain]);
6205
6229
  const [targetAddress, setTargetAddress] = useState();
6206
6230
  const isApproved = useMemo(() => {
6207
- if (!isEVMChain(sourceChain)) return splAllowance >= amount + serviceFee;
6231
+ if (!isEVMChain(sourceChain)) {
6232
+ return allowance >= amount + serviceFee;
6233
+ }
6208
6234
  if (allowance && amount && allowance.gte(parseUnits((amount + serviceFee).toString(), decimals))) return true;
6209
6235
  return false;
6210
6236
  }, [decimals, sourceChain, allowance, amount, splAllowance, serviceFee]);
6211
6237
  const updatePoolAddress = async () => {
6212
- var _result$tssPubkey;
6213
- const result = await fetchWrapper.get(`${nodeProviderQuery}/kima-finance/kima/kima/tss_pubkey`);
6214
- if ((result === null || result === void 0 ? void 0 : (_result$tssPubkey = result.tssPubkey) === null || _result$tssPubkey === void 0 ? void 0 : _result$tssPubkey.length) < 1) {
6215
- return;
6238
+ try {
6239
+ var _result$tssPubkey;
6240
+ if (sourceChain === ChainName.SOLANA) {
6241
+ setTargetAddress('8ymXJ6RH9k8qSf1xsvxSWgzPB9RYgUuHPDgonkFzUEhT');
6242
+ return;
6243
+ }
6244
+ const result = await fetchWrapper.get(`${nodeProviderQuery}/kima-finance/kima/kima/tss_pubkey`);
6245
+ if ((result === null || result === void 0 ? void 0 : (_result$tssPubkey = result.tssPubkey) === null || _result$tssPubkey === void 0 ? void 0 : _result$tssPubkey.length) < 1) {
6246
+ return;
6247
+ }
6248
+ setTargetAddress(sourceChain === ChainName.SOLANA ? result.tssPubkey[0].ebdsa : result.tssPubkey[0].ecdsa);
6249
+ } catch (e) {
6250
+ console.log('rpc disconnected', e);
6216
6251
  }
6217
- setTargetAddress(sourceChain === ChainName.SOLANA ? result.tssPubkey[0].ebdsa : result.tssPubkey[0].ecdsa);
6218
6252
  };
6219
6253
  useEffect(() => {
6220
6254
  if (!nodeProviderQuery) return;
@@ -6223,7 +6257,18 @@ function useAllowance() {
6223
6257
  useEffect(() => {
6224
6258
  (async () => {
6225
6259
  try {
6226
- if (!isEVMChain(sourceChain) || !tokenAddress || !targetAddress || !signer || !signerAddress) return;
6260
+ if (!isEVMChain(sourceChain) && publicKey && tokenAddress && connection) {
6261
+ var _accountInfo$value, _parsedAccountInfo$pa, _parsedAccountInfo$pa2, _parsedAccountInfo$pa3, _parsedAccountInfo$pa4, _parsedAccountInfo$pa5;
6262
+ const mint = new PublicKey(tokenAddress);
6263
+ const fromTokenAccount = await getOrCreateAssociatedTokenAccount(connection, publicKey, mint, publicKey, signTransaction);
6264
+ const accountInfo = await connection.getParsedAccountInfo(fromTokenAccount.address);
6265
+ console.log('solana token account: ', accountInfo);
6266
+ setDecimals(COIN_LIST['USDK'].decimals);
6267
+ const parsedAccountInfo = accountInfo === null || accountInfo === void 0 ? void 0 : (_accountInfo$value = accountInfo.value) === null || _accountInfo$value === void 0 ? void 0 : _accountInfo$value.data;
6268
+ setAllowance(((_parsedAccountInfo$pa = parsedAccountInfo.parsed) === null || _parsedAccountInfo$pa === void 0 ? void 0 : (_parsedAccountInfo$pa2 = _parsedAccountInfo$pa.info) === null || _parsedAccountInfo$pa2 === void 0 ? void 0 : _parsedAccountInfo$pa2.delegate) === targetAddress ? (_parsedAccountInfo$pa3 = parsedAccountInfo.parsed) === null || _parsedAccountInfo$pa3 === void 0 ? void 0 : (_parsedAccountInfo$pa4 = _parsedAccountInfo$pa3.info) === null || _parsedAccountInfo$pa4 === void 0 ? void 0 : (_parsedAccountInfo$pa5 = _parsedAccountInfo$pa4.delegatedAmount) === null || _parsedAccountInfo$pa5 === void 0 ? void 0 : _parsedAccountInfo$pa5.uiAmount : 0);
6269
+ return;
6270
+ }
6271
+ if (!tokenAddress || !targetAddress || !signer || !signerAddress) return;
6227
6272
  const erc20Contract = new Contract(tokenAddress, ERC20ABI.abi, signer);
6228
6273
  const decimals = await erc20Contract.decimals();
6229
6274
  const userAllowance = await erc20Contract.allowance(signerAddress, targetAddress);
@@ -6233,7 +6278,7 @@ function useAllowance() {
6233
6278
  errorHandler(error);
6234
6279
  }
6235
6280
  })();
6236
- }, [signerAddress, tokenAddress, targetAddress, isApproving, sourceChain]);
6281
+ }, [signerAddress, tokenAddress, targetAddress, isApproving, sourceChain, publicKey]);
6237
6282
  const approve = useCallback(async () => {
6238
6283
  if (isEVMChain(sourceChain)) {
6239
6284
  if (!decimals || !tokenAddress || !signer || !targetAddress) return;
@@ -6294,7 +6339,7 @@ async function getFeeInUSD(sourceChain, targetChain, gasFee) {
6294
6339
  if (targetChain === ChainName.SOLANA) {
6295
6340
  targetFee = +gasFee[targetChain] * +targetTokenPrice;
6296
6341
  } else targetFee = gasFee[targetChain] ? +gasFee[targetChain] * max_gas * +targetTokenPrice / 1e9 : 0;
6297
- return [sourceFee, targetFee];
6342
+ return [isNaN(sourceFee) ? 0 : sourceFee, isNaN(targetFee) ? 0 : targetFee];
6298
6343
  }
6299
6344
  function useServiceFee() {
6300
6345
  const {
@@ -6327,7 +6372,7 @@ function useServiceFee() {
6327
6372
  fee = fee < 0 ? 0 : fee;
6328
6373
  setServiceFee(parseFloat(fee.toFixed(2)));
6329
6374
  } catch (e) {
6330
- console.log(e);
6375
+ console.log('rpc disconnected', e);
6331
6376
  }
6332
6377
  };
6333
6378
  useEffect(() => {
@@ -6335,7 +6380,7 @@ function useServiceFee() {
6335
6380
  getServiceFee();
6336
6381
  const timerId = setInterval(() => {
6337
6382
  getServiceFee();
6338
- }, 5 * 1000);
6383
+ }, 20 * 1000);
6339
6384
  return () => {
6340
6385
  clearInterval(timerId);
6341
6386
  };
@@ -6362,9 +6407,13 @@ function useCurrencyOptions() {
6362
6407
  useEffect(() => {
6363
6408
  if (!nodeProviderQuery || !originNetwork || !targetNetwork) return;
6364
6409
  (async function () {
6365
- var _coins$Currencies;
6366
- const coins = await fetchWrapper.get(`${nodeProviderQuery}/kima-finance/kima/kima/getCurrencies/${originNetwork}/${targetNetwork}`);
6367
- setOptions(COIN_LIST[(_coins$Currencies = coins.Currencies) !== null && _coins$Currencies !== void 0 && _coins$Currencies.length ? coins.Currencies[0] : 'USDK']);
6410
+ try {
6411
+ var _coins$Currencies;
6412
+ const coins = await fetchWrapper.get(`${nodeProviderQuery}/kima-finance/kima/kima/getCurrencies/${originNetwork}/${targetNetwork}`);
6413
+ setOptions(COIN_LIST[(_coins$Currencies = coins.Currencies) !== null && _coins$Currencies !== void 0 && _coins$Currencies.length ? coins.Currencies[0] : 'USDK']);
6414
+ } catch (e) {
6415
+ console.log('rpc disconnected', e);
6416
+ }
6368
6417
  })();
6369
6418
  }, [nodeProviderQuery, originNetwork, targetNetwork]);
6370
6419
  return useMemo(() => ({
@@ -6405,6 +6454,17 @@ const TransferWidget = ({
6405
6454
  options: selectedCoin
6406
6455
  } = useCurrencyOptions();
6407
6456
  const backendUrl = useSelector(selectBackendUrl);
6457
+ const nodeProviderQuery = useSelector(selectNodeProviderQuery);
6458
+ useEffect(() => {
6459
+ if (!nodeProviderQuery) return;
6460
+ (async function () {
6461
+ const res = await fetchWrapper.get(`${nodeProviderQuery}/kima-finance/kima/kima/pool_balance`);
6462
+ console.table(res.poolBalance.map(item => ({
6463
+ chain: CHAIN_NAMES_TO_STRING[item.chainName],
6464
+ balance: +item.balance
6465
+ })));
6466
+ })();
6467
+ }, [nodeProviderQuery]);
6408
6468
  useEffect(() => {
6409
6469
  dispatch(setCurrencyOptions(selectedCoin));
6410
6470
  }, [selectedCoin]);
@@ -6417,6 +6477,22 @@ const TransferWidget = ({
6417
6477
  useEffect(() => {
6418
6478
  dispatch(setServiceFee(fee));
6419
6479
  }, [fee]);
6480
+ const checkPoolBalance = async () => {
6481
+ const res = await fetchWrapper.get(`${nodeProviderQuery}/kima-finance/kima/kima/pool_balance`);
6482
+ const poolBalance = res.poolBalance;
6483
+ for (let i = 0; i < poolBalance.length; i++) {
6484
+ if (poolBalance[i].chainName === targetNetwork) {
6485
+ if (+poolBalance[i].balance >= amount + fee) {
6486
+ return true;
6487
+ }
6488
+ const symbol = targetNetwork === ChainName.FUSE || targetNetwork === ChainName.CELO ? 'G$' : 'USDK';
6489
+ console.log(`Tried to transfer ${amount} ${symbol}, but ${CHAIN_NAMES_TO_STRING[targetNetwork]} pool has only ${+poolBalance[i].balance} ${symbol}`);
6490
+ return false;
6491
+ }
6492
+ }
6493
+ console.log(`${CHAIN_NAMES_TO_STRING[targetNetwork]} pool error`);
6494
+ return false;
6495
+ };
6420
6496
  const handleSubmit = async () => {
6421
6497
  if (!isApproved) {
6422
6498
  approve();
@@ -6424,6 +6500,10 @@ const TransferWidget = ({
6424
6500
  }
6425
6501
  try {
6426
6502
  dispatch(setSubmitting(true));
6503
+ if (!(await checkPoolBalance())) {
6504
+ dispatch(setSubmitting(false));
6505
+ return;
6506
+ }
6427
6507
  const params = JSON.stringify({
6428
6508
  originAddress: walletAddress,
6429
6509
  originChain: sourceChain,
@@ -6459,6 +6539,7 @@ const TransferWidget = ({
6459
6539
  } catch (e) {
6460
6540
  errorHandler(e);
6461
6541
  dispatch(setSubmitting(false));
6542
+ console.log('rpc disconnected', e);
6462
6543
  }
6463
6544
  };
6464
6545
  const onNext = () => {
@@ -6596,8 +6677,12 @@ const KimaTransactionWidget = ({
6596
6677
  if (mode === ModeOptions.payment) {
6597
6678
  dispatch(setTargetNetwork((transactionOption === null || transactionOption === void 0 ? void 0 : transactionOption.targetChain) || ChainName.ETHEREUM));
6598
6679
  (async function () {
6599
- const networks = await fetchWrapper.get(`${kimaNodeProviderQuery}/kima-finance/kima/kima/get_available_chains/${(transactionOption === null || transactionOption === void 0 ? void 0 : transactionOption.targetChain) || ChainName.ETHEREUM}`);
6600
- dispatch(setOriginNetwork(networks.Chains[0]));
6680
+ try {
6681
+ const networks = await fetchWrapper.get(`${kimaNodeProviderQuery}/kima-finance/kima/kima/get_available_chains/${(transactionOption === null || transactionOption === void 0 ? void 0 : transactionOption.targetChain) || ChainName.ETHEREUM}`);
6682
+ dispatch(setOriginNetwork(networks.Chains[0]));
6683
+ } catch (e) {
6684
+ console.log('rpc disconnected', e);
6685
+ }
6601
6686
  })();
6602
6687
  dispatch(setTargetAddress((transactionOption === null || transactionOption === void 0 ? void 0 : transactionOption.targetAddress) || ''));
6603
6688
  dispatch(setAmount((transactionOption === null || transactionOption === void 0 ? void 0 : transactionOption.amount) || 0));