thirdweb 5.93.10 → 5.93.12-nightly-9e8fd89ec0317f4f6968f4e592ff72ac3b2dec15-20250403000327

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.
Files changed (129) hide show
  1. package/dist/cjs/bridge/Buy.js +16 -4
  2. package/dist/cjs/bridge/Buy.js.map +1 -1
  3. package/dist/cjs/bridge/Sell.js +17 -4
  4. package/dist/cjs/bridge/Sell.js.map +1 -1
  5. package/dist/cjs/bridge/Status.js +2 -1
  6. package/dist/cjs/bridge/Status.js.map +1 -1
  7. package/dist/cjs/exports/extensions/erc721.js +5 -2
  8. package/dist/cjs/exports/extensions/erc721.js.map +1 -1
  9. package/dist/cjs/extensions/marketplace/direct-listings/write/updateListing.js +10 -5
  10. package/dist/cjs/extensions/marketplace/direct-listings/write/updateListing.js.map +1 -1
  11. package/dist/cjs/react/web/ui/ConnectWallet/locale/getConnectLocale.js +3 -0
  12. package/dist/cjs/react/web/ui/ConnectWallet/locale/getConnectLocale.js.map +1 -1
  13. package/dist/cjs/react/web/ui/ConnectWallet/locale/ru.js +120 -0
  14. package/dist/cjs/react/web/ui/ConnectWallet/locale/ru.js.map +1 -0
  15. package/dist/cjs/react/web/ui/ConnectWallet/screens/Buy/pay-transactions/SwapDetailsScreen.js +0 -8
  16. package/dist/cjs/react/web/ui/ConnectWallet/screens/Buy/pay-transactions/SwapDetailsScreen.js.map +1 -1
  17. package/dist/cjs/react/web/ui/ConnectWallet/screens/Buy/swap/TransferConfirmationScreen.js +38 -13
  18. package/dist/cjs/react/web/ui/ConnectWallet/screens/Buy/swap/TransferConfirmationScreen.js.map +1 -1
  19. package/dist/cjs/react/web/ui/ConnectWallet/screens/WalletSwitcherConnectionScreen.js +3 -1
  20. package/dist/cjs/react/web/ui/ConnectWallet/screens/WalletSwitcherConnectionScreen.js.map +1 -1
  21. package/dist/cjs/react/web/wallets/injected/locale/getInjectedWalletLocale.js +2 -0
  22. package/dist/cjs/react/web/wallets/injected/locale/getInjectedWalletLocale.js.map +1 -1
  23. package/dist/cjs/react/web/wallets/injected/locale/ru.js +27 -0
  24. package/dist/cjs/react/web/wallets/injected/locale/ru.js.map +1 -0
  25. package/dist/cjs/react/web/wallets/shared/locale/getConnectLocale.js +2 -0
  26. package/dist/cjs/react/web/wallets/shared/locale/getConnectLocale.js.map +1 -1
  27. package/dist/cjs/react/web/wallets/shared/locale/ru.js +59 -0
  28. package/dist/cjs/react/web/wallets/shared/locale/ru.js.map +1 -0
  29. package/dist/cjs/react/web/wallets/smartWallet/locale/getSmartWalletLocale.js +2 -0
  30. package/dist/cjs/react/web/wallets/smartWallet/locale/getSmartWalletLocale.js.map +1 -1
  31. package/dist/cjs/react/web/wallets/smartWallet/locale/ru.js +13 -0
  32. package/dist/cjs/react/web/wallets/smartWallet/locale/ru.js.map +1 -0
  33. package/dist/cjs/version.js +1 -1
  34. package/dist/cjs/version.js.map +1 -1
  35. package/dist/cjs/wallets/smart/lib/userop.js +12 -0
  36. package/dist/cjs/wallets/smart/lib/userop.js.map +1 -1
  37. package/dist/esm/bridge/Buy.js +16 -4
  38. package/dist/esm/bridge/Buy.js.map +1 -1
  39. package/dist/esm/bridge/Sell.js +17 -4
  40. package/dist/esm/bridge/Sell.js.map +1 -1
  41. package/dist/esm/bridge/Status.js +2 -1
  42. package/dist/esm/bridge/Status.js.map +1 -1
  43. package/dist/esm/exports/extensions/erc721.js +1 -0
  44. package/dist/esm/exports/extensions/erc721.js.map +1 -1
  45. package/dist/esm/extensions/marketplace/direct-listings/write/updateListing.js +10 -5
  46. package/dist/esm/extensions/marketplace/direct-listings/write/updateListing.js.map +1 -1
  47. package/dist/esm/react/web/ui/ConnectWallet/locale/getConnectLocale.js +3 -0
  48. package/dist/esm/react/web/ui/ConnectWallet/locale/getConnectLocale.js.map +1 -1
  49. package/dist/esm/react/web/ui/ConnectWallet/locale/ru.js +118 -0
  50. package/dist/esm/react/web/ui/ConnectWallet/locale/ru.js.map +1 -0
  51. package/dist/esm/react/web/ui/ConnectWallet/screens/Buy/pay-transactions/SwapDetailsScreen.js +0 -8
  52. package/dist/esm/react/web/ui/ConnectWallet/screens/Buy/pay-transactions/SwapDetailsScreen.js.map +1 -1
  53. package/dist/esm/react/web/ui/ConnectWallet/screens/Buy/swap/TransferConfirmationScreen.js +39 -14
  54. package/dist/esm/react/web/ui/ConnectWallet/screens/Buy/swap/TransferConfirmationScreen.js.map +1 -1
  55. package/dist/esm/react/web/ui/ConnectWallet/screens/WalletSwitcherConnectionScreen.js +3 -1
  56. package/dist/esm/react/web/ui/ConnectWallet/screens/WalletSwitcherConnectionScreen.js.map +1 -1
  57. package/dist/esm/react/web/wallets/injected/locale/getInjectedWalletLocale.js +2 -0
  58. package/dist/esm/react/web/wallets/injected/locale/getInjectedWalletLocale.js.map +1 -1
  59. package/dist/esm/react/web/wallets/injected/locale/ru.js +25 -0
  60. package/dist/esm/react/web/wallets/injected/locale/ru.js.map +1 -0
  61. package/dist/esm/react/web/wallets/shared/locale/getConnectLocale.js +2 -0
  62. package/dist/esm/react/web/wallets/shared/locale/getConnectLocale.js.map +1 -1
  63. package/dist/esm/react/web/wallets/shared/locale/ru.js +57 -0
  64. package/dist/esm/react/web/wallets/shared/locale/ru.js.map +1 -0
  65. package/dist/esm/react/web/wallets/smartWallet/locale/getSmartWalletLocale.js +2 -0
  66. package/dist/esm/react/web/wallets/smartWallet/locale/getSmartWalletLocale.js.map +1 -1
  67. package/dist/esm/react/web/wallets/smartWallet/locale/ru.js +11 -0
  68. package/dist/esm/react/web/wallets/smartWallet/locale/ru.js.map +1 -0
  69. package/dist/esm/version.js +1 -1
  70. package/dist/esm/version.js.map +1 -1
  71. package/dist/esm/wallets/smart/lib/userop.js +12 -0
  72. package/dist/esm/wallets/smart/lib/userop.js.map +1 -1
  73. package/dist/types/bridge/Buy.d.ts +13 -4
  74. package/dist/types/bridge/Buy.d.ts.map +1 -1
  75. package/dist/types/bridge/Sell.d.ts +14 -4
  76. package/dist/types/bridge/Sell.d.ts.map +1 -1
  77. package/dist/types/bridge/Status.d.ts +5 -0
  78. package/dist/types/bridge/Status.d.ts.map +1 -1
  79. package/dist/types/bridge/types/Quote.d.ts +19 -2
  80. package/dist/types/bridge/types/Quote.d.ts.map +1 -1
  81. package/dist/types/exports/extensions/erc721.d.ts +1 -0
  82. package/dist/types/exports/extensions/erc721.d.ts.map +1 -1
  83. package/dist/types/react/web/ui/ConnectWallet/locale/getConnectLocale.d.ts.map +1 -1
  84. package/dist/types/react/web/ui/ConnectWallet/locale/ru.d.ts +4 -0
  85. package/dist/types/react/web/ui/ConnectWallet/locale/ru.d.ts.map +1 -0
  86. package/dist/types/react/web/ui/ConnectWallet/screens/Buy/pay-transactions/SwapDetailsScreen.d.ts.map +1 -1
  87. package/dist/types/react/web/ui/ConnectWallet/screens/Buy/swap/TransferConfirmationScreen.d.ts.map +1 -1
  88. package/dist/types/react/web/ui/ConnectWallet/screens/WalletSwitcherConnectionScreen.d.ts.map +1 -1
  89. package/dist/types/react/web/ui/types.d.ts +1 -1
  90. package/dist/types/react/web/ui/types.d.ts.map +1 -1
  91. package/dist/types/react/web/wallets/injected/locale/getInjectedWalletLocale.d.ts.map +1 -1
  92. package/dist/types/react/web/wallets/injected/locale/ru.d.ts +7 -0
  93. package/dist/types/react/web/wallets/injected/locale/ru.d.ts.map +1 -0
  94. package/dist/types/react/web/wallets/shared/locale/getConnectLocale.d.ts.map +1 -1
  95. package/dist/types/react/web/wallets/shared/locale/ru.d.ts +58 -0
  96. package/dist/types/react/web/wallets/shared/locale/ru.d.ts.map +1 -0
  97. package/dist/types/react/web/wallets/smartWallet/locale/getSmartWalletLocale.d.ts.map +1 -1
  98. package/dist/types/react/web/wallets/smartWallet/locale/ru.d.ts +4 -0
  99. package/dist/types/react/web/wallets/smartWallet/locale/ru.d.ts.map +1 -0
  100. package/dist/types/version.d.ts +1 -1
  101. package/dist/types/version.d.ts.map +1 -1
  102. package/dist/types/wallets/smart/lib/userop.d.ts.map +1 -1
  103. package/package.json +4 -4
  104. package/src/adapters/viem-legacy.test.ts +1 -1
  105. package/src/bridge/Buy.ts +16 -4
  106. package/src/bridge/Sell.ts +17 -4
  107. package/src/bridge/Status.test.ts +13 -0
  108. package/src/bridge/Status.ts +14 -6
  109. package/src/bridge/types/Quote.ts +19 -9
  110. package/src/exports/extensions/erc721.ts +5 -0
  111. package/src/extensions/marketplace/direct-listings/direct-listings.test.ts +15 -2
  112. package/src/extensions/marketplace/direct-listings/write/updateListing.ts +15 -15
  113. package/src/react/web/ui/ConnectWallet/locale/getConnectLocale.ts +3 -0
  114. package/src/react/web/ui/ConnectWallet/locale/ru.ts +124 -0
  115. package/src/react/web/ui/ConnectWallet/screens/Buy/pay-transactions/SwapDetailsScreen.tsx +0 -29
  116. package/src/react/web/ui/ConnectWallet/screens/Buy/swap/TransferConfirmationScreen.tsx +52 -13
  117. package/src/react/web/ui/ConnectWallet/screens/WalletSwitcherConnectionScreen.tsx +3 -1
  118. package/src/react/web/ui/types.ts +1 -0
  119. package/src/react/web/wallets/injected/locale/getInjectedWalletLocale.test.ts +2 -0
  120. package/src/react/web/wallets/injected/locale/getInjectedWalletLocale.ts +2 -0
  121. package/src/react/web/wallets/injected/locale/ru.ts +27 -0
  122. package/src/react/web/wallets/shared/locale/getConnectLocale.ts +2 -0
  123. package/src/react/web/wallets/shared/locale/ru.ts +62 -0
  124. package/src/react/web/wallets/smartWallet/locale/getSmartWalletLocale.test.ts +2 -0
  125. package/src/react/web/wallets/smartWallet/locale/getSmartWalletLocale.ts +2 -0
  126. package/src/react/web/wallets/smartWallet/locale/ru.ts +13 -0
  127. package/src/version.ts +1 -1
  128. package/src/wallets/smart/lib/userop.ts +18 -0
  129. package/src/wallets/smart/smart-wallet-integration-v07.test.ts +21 -0
@@ -1,5 +1,6 @@
1
1
  import { describe, expect, it } from "vitest";
2
2
  import { TEST_CLIENT } from "~test/test-clients.js";
3
+ import { defineChain } from "../chains/utils.js";
3
4
  import { status } from "./Status.js";
4
5
 
5
6
  describe.runIf(process.env.TW_SECRET_KEY)("Bridge.status", () => {
@@ -35,4 +36,16 @@ describe.runIf(process.env.TW_SECRET_KEY)("Bridge.status", () => {
35
36
  }
36
37
  `);
37
38
  });
39
+
40
+ it("should handle successfull status with chain", async () => {
41
+ const result = await status({
42
+ transactionHash:
43
+ "0xe199ef82a0b6215221536e18ec512813c1aa10b4f5ed0d4dfdfcd703578da56d",
44
+ chain: defineChain(8453),
45
+ client: TEST_CLIENT,
46
+ });
47
+
48
+ expect(result).toBeDefined();
49
+ expect(result.status).toBe("COMPLETED");
50
+ });
38
51
  });
@@ -1,4 +1,5 @@
1
1
  import type { Hex as ox__Hex } from "ox";
2
+ import type { Chain } from "../chains/types.js";
2
3
  import type { ThirdwebClient } from "../client/client.js";
3
4
  import { getClientFetch } from "../utils/fetch.js";
4
5
  import { UNIVERSAL_BRIDGE_URL } from "./constants.js";
@@ -100,7 +101,8 @@ import type { Status } from "./types/Status.js";
100
101
  * @beta
101
102
  */
102
103
  export async function status(options: status.Options): Promise<status.Result> {
103
- const { transactionHash, chainId, client } = options;
104
+ const { transactionHash, client } = options;
105
+ const chainId = "chainId" in options ? options.chainId : options.chain.id;
104
106
 
105
107
  const clientFetch = getClientFetch(client);
106
108
  const url = new URL(`${UNIVERSAL_BRIDGE_URL}/status`);
@@ -153,11 +155,17 @@ export async function status(options: status.Options): Promise<status.Result> {
153
155
  }
154
156
 
155
157
  export declare namespace status {
156
- type Options = {
157
- transactionHash: ox__Hex.Hex;
158
- chainId: number;
159
- client: ThirdwebClient;
160
- };
158
+ type Options =
159
+ | {
160
+ transactionHash: ox__Hex.Hex;
161
+ chainId: number;
162
+ client: ThirdwebClient;
163
+ }
164
+ | {
165
+ transactionHash: ox__Hex.Hex;
166
+ chain: Chain;
167
+ client: ThirdwebClient;
168
+ };
161
169
 
162
170
  type Result = Status;
163
171
  }
@@ -1,4 +1,6 @@
1
- import type { TransactionEnvelopeEip1559 as ox__TransactionEnvelopeEip1559 } from "ox";
1
+ import type { Hex as ox__Hex } from "ox";
2
+ import type { Chain } from "../../chains/types.js";
3
+ import type { ThirdwebClient } from "../../client/client.js";
2
4
 
3
5
  export type Quote = {
4
6
  /**
@@ -31,12 +33,20 @@ export type PreparedQuote = Quote & {
31
33
  /**
32
34
  * A series of [ox](https://oxlib.sh) EIP-1559 transactions that must be executed in sequential order to fulfill the complete route.
33
35
  */
34
- transactions: Array<
35
- ox__TransactionEnvelopeEip1559.TransactionEnvelopeEip1559<
36
- false,
37
- bigint,
38
- number,
39
- "eip1559"
40
- >
41
- >;
36
+ transactions: Array<{
37
+ data: ox__Hex.Hex;
38
+ to: ox__Hex.Hex;
39
+ value?: bigint | undefined;
40
+ chainId: number;
41
+ /**
42
+ * The action this transaction performs. This can be "approval", "transfer", "buy", or "sell".
43
+ */
44
+ action: "approval" | "transfer" | "buy" | "sell";
45
+ /**
46
+ * The transaction ID, used for tracking purposes.
47
+ */
48
+ id: ox__Hex.Hex;
49
+ client: ThirdwebClient;
50
+ chain: Chain;
51
+ }>;
42
52
  };
@@ -50,6 +50,11 @@ export {
50
50
  isApprovedForAll,
51
51
  type IsApprovedForAllParams,
52
52
  } from "../../extensions/erc721/__generated__/IERC721A/read/isApprovedForAll.js";
53
+ export {
54
+ type GetApprovedParams,
55
+ isGetApprovedSupported,
56
+ getApproved,
57
+ } from "../../extensions/erc721/__generated__/IERC721A/read/getApproved.js";
53
58
  export { getTotalUnclaimedSupply } from "../../extensions/erc721/read/getTotalUnclaimedSupply.js";
54
59
  export { getTotalClaimedSupply } from "../../extensions/erc721/read/getTotalClaimedSupply.js";
55
60
  export {
@@ -34,6 +34,7 @@ import { getListing } from "./read/getListing.js";
34
34
  import { isListingValid } from "./utils.js";
35
35
  import { buyFromListing } from "./write/buyFromListing.js";
36
36
  import { createListing } from "./write/createListing.js";
37
+ import { updateListing } from "./write/updateListing.js";
37
38
 
38
39
  const chain = ANVIL_CHAIN;
39
40
  const client = TEST_CLIENT;
@@ -302,6 +303,18 @@ describe.runIf(process.env.TW_SECRET_KEY)("Marketplace Direct Listings", () => {
302
303
  expect(listingEvent1155.args.listingCreator).toBe(TEST_ACCOUNT_C.address);
303
304
  expect(listingEvent1155.args.assetContract).toBe(erc1155Contract.address);
304
305
 
306
+ await sendAndConfirmTransaction({
307
+ transaction: updateListing({
308
+ listingId: listingEvent1155.args.listingId,
309
+ contract: marketplaceContract,
310
+ assetContractAddress: erc1155Contract.address,
311
+ tokenId: 0n,
312
+ pricePerToken: "0.05",
313
+ quantity: 1n,
314
+ }),
315
+ account: TEST_ACCOUNT_C,
316
+ });
317
+
305
318
  const [
306
319
  listings1155After,
307
320
  validListings1155,
@@ -341,10 +354,10 @@ describe.runIf(process.env.TW_SECRET_KEY)("Marketplace Direct Listings", () => {
341
354
  expect(secondListing.currencyValuePerToken).toMatchInlineSnapshot(`
342
355
  {
343
356
  "decimals": 18,
344
- "displayValue": "0.01",
357
+ "displayValue": "0.05",
345
358
  "name": "Anvil Ether",
346
359
  "symbol": "ETH",
347
- "value": 10000000000000000n,
360
+ "value": 50000000000000000n,
348
361
  }
349
362
  `);
350
363
  expect(secondListing.asset.metadata.name).toBe("erc1155 #0");
@@ -120,25 +120,25 @@ export function updateListing(
120
120
  }
121
121
 
122
122
  // validate the timestamps
123
- let startTimestamp = BigInt(
124
- Math.floor(
125
- (mergedOptions.startTimestamp ?? new Date()).getTime() / 1000,
126
- ),
127
- );
128
- const endTimestamp = BigInt(
129
- Math.floor(
130
- (
131
- mergedOptions.endTimestamp ??
132
- new Date(Date.now() + 10 * 365 * 24 * 60 * 60 * 1000)
133
- ).getTime() / 1000,
134
- ),
135
- );
123
+ let startTimestamp = mergedOptions.startTimestamp
124
+ ? BigInt(Math.floor(mergedOptions.startTimestamp.getTime() / 1000))
125
+ : mergedOptions.startTimeInSeconds;
136
126
 
137
- if (startTimestamp <= lastestBlock.timestamp) {
127
+ const endTimestamp = mergedOptions.endTimestamp
128
+ ? BigInt(Math.floor(mergedOptions.endTimestamp.getTime() / 1000))
129
+ : mergedOptions.endTimeInSeconds;
130
+
131
+ if (
132
+ startTimestamp !== mergedOptions.startTimeInSeconds &&
133
+ startTimestamp <= lastestBlock.timestamp
134
+ ) {
138
135
  // set the start time to the next block if it is in the past
139
136
  startTimestamp = lastestBlock.timestamp + 1n;
140
137
  }
141
- if (startTimestamp >= endTimestamp) {
138
+ if (
139
+ startTimestamp !== mergedOptions.startTimeInSeconds &&
140
+ startTimestamp >= endTimestamp
141
+ ) {
142
142
  throw new Error("Start time must be before end time.");
143
143
  }
144
144
 
@@ -24,6 +24,9 @@ export async function getConnectLocale(localeId: LocaleId) {
24
24
  case "fr_FR": {
25
25
  return (await import("./fr.js")).default;
26
26
  }
27
+ case "ru_RU": {
28
+ return (await import("./ru.js")).default;
29
+ }
27
30
  case "pt_BR": {
28
31
  return (await import("./br.js")).default;
29
32
  }
@@ -0,0 +1,124 @@
1
+ import type { ConnectLocale } from "./types.js";
2
+
3
+ const connectLocaleRu: ConnectLocale = {
4
+ id: "ru_RU",
5
+ signIn: "Войти",
6
+ defaultButtonTitle: "Подключиться",
7
+ connecting: "Подключение",
8
+ switchNetwork: "Сменить сеть",
9
+ switchingNetwork: "Смена сети",
10
+ defaultModalTitle: "Войти",
11
+ recommended: "Рекомендуется",
12
+ installed: "Установлено",
13
+ buy: "Купить",
14
+ continueAsGuest: "Продолжить как гость",
15
+ connectAWallet: "Подключить кошелек",
16
+ newToWallets: "Новичок в кошельках?",
17
+ getStarted: "Начать",
18
+ guest: "Гость",
19
+ send: "Отправить",
20
+ receive: "Получить",
21
+ currentNetwork: "Текущая сеть",
22
+ switchAccount: "Сменить аккаунт",
23
+ requestTestnetFunds: "Запросить средства тестовой сети",
24
+ transactions: "Транзакции",
25
+ payTransactions: "Фиатные транзакции",
26
+ walletTransactions: "Транзакции кошелька",
27
+ viewAllTransactions: "Просмотреть все транзакции",
28
+ backupWallet: "Создать резервную копию кошелька",
29
+ guestWalletWarning:
30
+ "Это временный гостевой кошелек. Создайте резервную копию, если не хотите потерять к нему доступ",
31
+ switchTo: "Переключиться на", // Используется в "Switch to <Wallet-Name>>"
32
+ connectedToSmartWallet: "Смарт-аккаунт",
33
+ confirmInWallet: "Подтвердить в кошельке",
34
+ disconnectWallet: "Отсоединить кошелек",
35
+ copyAddress: "Скопировать адрес",
36
+ personalWallet: "Личный кошелек",
37
+ smartWallet: "Смарт-кошелек",
38
+ or: "ИЛИ",
39
+ goBackButton: "Назад",
40
+ passkeys: {
41
+ title: "Ключи доступа",
42
+ linkPasskey: "Привязать ключ доступа",
43
+ },
44
+ welcomeScreen: {
45
+ defaultTitle: "Ваш портал в мир децентрализации",
46
+ defaultSubtitle: "Подключите кошелек, чтобы начать",
47
+ },
48
+ agreement: {
49
+ prefix: "Подключаясь, вы соглашаетесь с",
50
+ termsOfService: "Условиями использования",
51
+ and: "и",
52
+ privacyPolicy: "Политикой конфиденциальности",
53
+ },
54
+ networkSelector: {
55
+ title: "Выбрать сеть",
56
+ mainnets: "Основные сети (мейннетс)",
57
+ testnets: "Тестовые сети (тестнетс)",
58
+ allNetworks: "Все",
59
+ addCustomNetwork: "Добавить кастомную сеть",
60
+ inputPlaceholder: "Поиск сети или Chain ID",
61
+ categoryLabel: {
62
+ recentlyUsed: "Недавно использованные",
63
+ popular: "Популярные",
64
+ others: "Все сети",
65
+ },
66
+ loading: "Загрузка",
67
+ failedToSwitch: "Не удалось сменить сеть",
68
+ },
69
+ receiveFundsScreen: {
70
+ title: "Получить средства",
71
+ instruction:
72
+ "Скопируйте адрес кошелька, чтобы отправить средства на этот кошелек",
73
+ },
74
+ sendFundsScreen: {
75
+ title: "Отправить средства",
76
+ submitButton: "Отправить",
77
+ token: "Токен",
78
+ sendTo: "Отправить на",
79
+ amount: "Сумма",
80
+ successMessage: "Транзакция успешно выполнена",
81
+ invalidAddress: "Недействительный адрес",
82
+ noTokensFound: "Токены не найдены",
83
+ searchToken: "Найти или вставить адрес токена",
84
+ transactionFailed: "Транзакция не удалась",
85
+ transactionRejected: "Транзакция отклонена",
86
+ insufficientFunds: "Недостаточно средств",
87
+ selectTokenTitle: "Выбрать токен",
88
+ sending: "Отправка",
89
+ },
90
+ signatureScreen: {
91
+ instructionScreen: {
92
+ title: "Войти",
93
+ instruction:
94
+ "Пожалуйста, подпишите сообщение в кошельке, чтобы продолжить",
95
+ signInButton: "Войти",
96
+ disconnectWallet: "Отсоединить кошелек",
97
+ },
98
+ signingScreen: {
99
+ title: "Вход",
100
+ prompt: "Подпись запроса в вашем кошельке",
101
+ promptForSafe:
102
+ "Подпишите запрос в вашем кошельке и подтвердите транзакцию в Safe",
103
+ approveTransactionInSafe: "Подтвердить транзакцию в Safe",
104
+ tryAgain: "Попробовать снова",
105
+ failedToSignIn: "Не удалось войти",
106
+ inProgress: "Ожидание подтверждения",
107
+ },
108
+ },
109
+ manageWallet: {
110
+ title: "Управление кошельком",
111
+ linkedProfiles: "Привязанные профили",
112
+ linkProfile: "Привязать профиль",
113
+ connectAnApp: "Подключить приложение",
114
+ exportPrivateKey: "Экспортировать приватный ключ",
115
+ },
116
+ viewFunds: {
117
+ title: "Просмотр средств",
118
+ viewNFTs: "Просмотр NFTs",
119
+ viewTokens: "Просмотр токенов",
120
+ viewAssets: "Просмотр активов",
121
+ },
122
+ };
123
+
124
+ export default connectLocaleRu;
@@ -101,9 +101,7 @@ export function SwapTxDetailsTable(
101
101
  ) {
102
102
  let uiData: SwapTxDetailsData;
103
103
  let showStatusRow = true;
104
- let isTransfer = false;
105
104
  if (props.type === "status") {
106
- isTransfer = props.status.swapType === "TRANSFER";
107
105
  const status = props.status;
108
106
  if (props.hideStatusRow) {
109
107
  showStatusRow = false;
@@ -191,33 +189,6 @@ export function SwapTxDetailsTable(
191
189
  </>
192
190
  );
193
191
 
194
- if (isTransfer) {
195
- return (
196
- <div>
197
- {/* source chain Tx hash link */}
198
- {fromChainExplorers.explorers?.[0]?.url && sourceTxHash && (
199
- <ButtonLink
200
- fullWidth
201
- variant="outline"
202
- href={formatExplorerTxUrl(
203
- fromChainExplorers.explorers[0]?.url,
204
- sourceTxHash,
205
- )}
206
- target="_blank"
207
- gap="xs"
208
- style={{
209
- fontSize: fontSize.sm,
210
- padding: spacing.sm,
211
- }}
212
- >
213
- View on {fromChainName.name} Explorer
214
- <ExternalLinkIcon width={iconSize.sm} height={iconSize.sm} />
215
- </ButtonLink>
216
- )}
217
- </div>
218
- );
219
- }
220
-
221
192
  return (
222
193
  <div>
223
194
  {/* Pay */}
@@ -1,4 +1,5 @@
1
1
  import { CheckCircledIcon } from "@radix-ui/react-icons";
2
+ import { useQuery } from "@tanstack/react-query";
2
3
  import { useState } from "react";
3
4
  import type { Chain } from "../../../../../../../chains/types.js";
4
5
  import { getCachedChain } from "../../../../../../../chains/utils.js";
@@ -78,6 +79,48 @@ export function TransferConfirmationScreen(
78
79
  | { id: "done" }
79
80
  >({ id: "idle" });
80
81
 
82
+ const transferQuery = useQuery({
83
+ queryKey: [
84
+ "transfer",
85
+ isNativeToken(token) ? NATIVE_TOKEN_ADDRESS : token.address,
86
+ tokenAmount,
87
+ receiverAddress,
88
+ payer.account.address,
89
+ payOptions?.purchaseData,
90
+ ],
91
+ queryFn: async () => {
92
+ const transferResponse = await getBuyWithCryptoTransfer({
93
+ client,
94
+ fromAddress: payer.account.address,
95
+ toAddress: receiverAddress,
96
+ chainId: chain.id,
97
+ tokenAddress: isNativeToken(token)
98
+ ? NATIVE_TOKEN_ADDRESS
99
+ : token.address,
100
+ amount: tokenAmount,
101
+ purchaseData: payOptions?.purchaseData,
102
+ });
103
+ return transferResponse;
104
+ },
105
+ refetchInterval: 30 * 1000,
106
+ });
107
+
108
+ if (transferQuery.isLoading) {
109
+ return (
110
+ <Container p="lg">
111
+ <ModalHeader title={title} onBack={onBack} />
112
+ <Container flex="column" center="both" style={{ minHeight: "300px" }}>
113
+ <Spacer y="xl" />
114
+ <Spinner size="xl" color="secondaryText" />
115
+ <Spacer y="xl" />
116
+ </Container>
117
+ </Container>
118
+ );
119
+ }
120
+
121
+ const transferFromAmountWithFees =
122
+ transferQuery.data?.paymentToken.amount || tokenAmount;
123
+
81
124
  return (
82
125
  <Container p="lg">
83
126
  <ModalHeader title={title} onBack={onBack} />
@@ -109,7 +152,7 @@ export function TransferConfirmationScreen(
109
152
  fromChain={chain}
110
153
  toToken={token}
111
154
  toChain={chain}
112
- fromAmount={tokenAmount}
155
+ fromAmount={transactionMode ? tokenAmount : transferFromAmountWithFees}
113
156
  toAmount={tokenAmount}
114
157
  />
115
158
 
@@ -230,7 +273,9 @@ export function TransferConfirmationScreen(
230
273
  token,
231
274
  chain,
232
275
  tokenMetadata,
233
- tokenAmount,
276
+ tokenAmount: transactionMode
277
+ ? tokenAmount
278
+ : transferFromAmountWithFees,
234
279
  fromAddress: payer.account.address,
235
280
  toAddress: receiverAddress,
236
281
  transaction: txResult,
@@ -240,17 +285,11 @@ export function TransferConfirmationScreen(
240
285
  setStep("execute");
241
286
  setStatus({ id: "idle" });
242
287
  } else {
243
- const transferResponse = await getBuyWithCryptoTransfer({
244
- client,
245
- fromAddress: payer.account.address,
246
- toAddress: receiverAddress,
247
- chainId: chain.id,
248
- tokenAddress: isNativeToken(token)
249
- ? NATIVE_TOKEN_ADDRESS
250
- : token.address,
251
- amount: tokenAmount,
252
- purchaseData: payOptions?.purchaseData,
253
- });
288
+ const transferResponse = transferQuery.data;
289
+
290
+ if (!transferResponse) {
291
+ throw new Error("Transfer data not found");
292
+ }
254
293
 
255
294
  if (transferResponse.approvalData) {
256
295
  // check allowance
@@ -5,6 +5,7 @@ import type { Wallet } from "../../../../../wallets/interfaces/wallet.js";
5
5
  import type { SmartWalletOptions } from "../../../../../wallets/smart/types.js";
6
6
  import type { AppMetadata } from "../../../../../wallets/types.js";
7
7
  import type { WalletId } from "../../../../../wallets/wallet-types.js";
8
+ import { useActiveWalletChain } from "../../../../core/hooks/wallets/useActiveWalletChain.js";
8
9
  import { useConnectedWallets } from "../../../../core/hooks/wallets/useConnectedWallets.js";
9
10
  import { ConnectModalContent } from "../Modal/ConnectModalContent.js";
10
11
  import { useSetupScreen } from "../Modal/screen.js";
@@ -34,6 +35,7 @@ export type WalletSwitcherConnectionScreenProps = {
34
35
  export function WalletSwitcherConnectionScreen(
35
36
  props: WalletSwitcherConnectionScreenProps,
36
37
  ) {
38
+ const walletChain = useActiveWalletChain();
37
39
  const connectedWallets = useConnectedWallets();
38
40
  const wallets =
39
41
  props.wallets ||
@@ -52,7 +54,7 @@ export function WalletSwitcherConnectionScreen(
52
54
  <ConnectModalContent
53
55
  accountAbstraction={props.accountAbstraction}
54
56
  auth={undefined}
55
- chain={props.chain}
57
+ chain={props.chain || walletChain}
56
58
  chains={props.chains}
57
59
  client={props.client}
58
60
  connectLocale={props.connectLocale}
@@ -8,4 +8,5 @@ export type LocaleId =
8
8
  | "vi_VN"
9
9
  | "de_DE"
10
10
  | "fr_FR"
11
+ | "ru_RU"
11
12
  | "pt_BR";
@@ -8,6 +8,7 @@ import fr from "./fr.js";
8
8
  import { getInjectedWalletLocale } from "./getInjectedWalletLocale.js";
9
9
  import ja from "./ja.js";
10
10
  import kr from "./kr.js";
11
+ import ru from "./ru.js";
11
12
  import tl from "./tl.js";
12
13
  import vi from "./vi.js";
13
14
 
@@ -19,6 +20,7 @@ const locales: { locale: LocaleId; content: object }[] = [
19
20
  { locale: "de_DE", content: de },
20
21
  { locale: "ko_KR", content: kr },
21
22
  { locale: "fr_FR", content: fr },
23
+ { locale: "ru_RU", content: ru },
22
24
  { locale: "pt_BR", content: br },
23
25
  ];
24
26
 
@@ -22,6 +22,8 @@ export async function getInjectedWalletLocale(
22
22
  return (await import("./kr.js")).default;
23
23
  case "fr_FR":
24
24
  return (await import("./fr.js")).default;
25
+ case "ru_RU":
26
+ return (await import("./ru.js")).default;
25
27
  case "pt_BR": {
26
28
  return (await import("./br.js")).default;
27
29
  }
@@ -0,0 +1,27 @@
1
+ import type { InjectedWalletLocale } from "./types.js";
2
+
3
+ /**
4
+ * @internal
5
+ */
6
+ const injectedWalletLocaleRu = (wallet: string): InjectedWalletLocale => ({
7
+ connectionScreen: {
8
+ inProgress: "Ожидание подтверждения",
9
+ failed: "Подключение не удалось",
10
+ instruction: `Примите запрос на подключение в ${wallet}`,
11
+ retry: "Попробовать снова",
12
+ },
13
+ getStartedScreen: {
14
+ instruction: `Отсканируйте QR-код, чтобы скачать приложение ${wallet}`,
15
+ },
16
+ scanScreen: {
17
+ instruction: `Для подключения отсканируйте QR-код с помощью приложения ${wallet}`,
18
+ },
19
+ getStartedLink: `Ещё нет ${wallet}?`,
20
+ download: {
21
+ chrome: "Скачать расширение для Chrome",
22
+ android: "Скачать в Google Play",
23
+ iOS: "Скачать в App Store",
24
+ },
25
+ });
26
+
27
+ export default injectedWalletLocaleRu;
@@ -22,6 +22,8 @@ export async function getInAppWalletLocale(
22
22
  return (await import("./kr.js")).default;
23
23
  case "fr_FR":
24
24
  return (await import("./fr.js")).default;
25
+ case "ru_RU":
26
+ return (await import("./ru.js")).default;
25
27
  case "pt_BR": {
26
28
  return (await import("./br.js")).default;
27
29
  }
@@ -0,0 +1,62 @@
1
+ import type { InAppWalletLocale } from "./types.js";
2
+
3
+ export default {
4
+ signInWithGoogle: "Google",
5
+ signInWithFacebook: "Facebook",
6
+ signInWithApple: "Apple",
7
+ signInWithDiscord: "Discord",
8
+ emailPlaceholder: "Адрес электронной почты",
9
+ submitEmail: "Продолжить",
10
+ signIn: "Войти",
11
+ or: "или",
12
+ emailRequired: "Требуется адрес электронной почты",
13
+ invalidEmail: "Неверный адрес электронной почты",
14
+ maxAccountsExceeded:
15
+ "Превышено максимальное количество аккаунтов. Пожалуйста, сообщите разработчику приложения.",
16
+ socialLoginScreen: {
17
+ title: "Войти",
18
+ instruction: "Войдите в свой аккаунт во всплывающем окне",
19
+ failed: "Не удалось войти",
20
+ retry: "Повторить попытку",
21
+ },
22
+ emailLoginScreen: {
23
+ title: "Войти",
24
+ enterCodeSendTo: "Введите код подтверждения, отправленный на",
25
+ newDeviceDetected: "Обнаружено новое устройство",
26
+ enterRecoveryCode:
27
+ "Введите код восстановления, отправленный вам по электронной почте при первой регистрации",
28
+ invalidCode: "Неверный код подтверждения",
29
+ invalidCodeOrRecoveryCode:
30
+ "Неверный код подтверждения или код восстановления",
31
+ verify: "Подтвердить",
32
+ failedToSendCode: "Не удалось отправить код подтверждения",
33
+ sendingCode: "Отправка кода подтверждения",
34
+ resendCode: "Повторно отправить код подтверждения",
35
+ },
36
+ createPassword: {
37
+ title: "Создать пароль",
38
+ instruction:
39
+ "Установите пароль для вашего аккаунта. Этот пароль понадобится при подключении с нового устройства.",
40
+ saveInstruction: "Обязательно сохраните его",
41
+ inputPlaceholder: "Введите ваш пароль",
42
+ confirmation: "Я сохранил свой пароль",
43
+ submitButton: "Установить пароль",
44
+ failedToSetPassword: "Не удалось установить пароль",
45
+ },
46
+ enterPassword: {
47
+ title: "Введите пароль",
48
+ instruction: "Введите пароль для вашего аккаунта",
49
+ inputPlaceholder: "Введите ваш пароль",
50
+ submitButton: "Подтвердить",
51
+ wrongPassword: "Неверный пароль",
52
+ },
53
+ signInWithEmail: "Войти с помощью электронной почты",
54
+ invalidPhone: "Недействительный номер телефона",
55
+ phonePlaceholder: "Номер телефона",
56
+ signInWithPhone: "Войти с помощью номера телефона",
57
+ phoneRequired: "Требуется номер телефона",
58
+ passkey: "Ключ доступа",
59
+ signInWithWallet: "Войти с помощью кошелька",
60
+ linkWallet: "Привязать кошелек",
61
+ loginAsGuest: "Продолжить как гость",
62
+ } satisfies InAppWalletLocale;
@@ -8,6 +8,7 @@ import fr from "./fr.js";
8
8
  import { getSmartWalletLocale } from "./getSmartWalletLocale.js";
9
9
  import ja from "./ja.js";
10
10
  import kr from "./kr.js";
11
+ import ru from "./ru.js";
11
12
  import tl from "./tl.js";
12
13
  import vi from "./vi.js";
13
14
 
@@ -19,6 +20,7 @@ const locales: { locale: LocaleId; content: object }[] = [
19
20
  { locale: "de_DE", content: de },
20
21
  { locale: "ko_KR", content: kr },
21
22
  { locale: "fr_FR", content: fr },
23
+ { locale: "ru_RU", content: ru },
22
24
  { locale: "pt_BR", content: br },
23
25
  ];
24
26
 
@@ -22,6 +22,8 @@ export async function getSmartWalletLocale(
22
22
  return (await import("./kr.js")).default;
23
23
  case "fr_FR":
24
24
  return (await import("./fr.js")).default;
25
+ case "ru_RU":
26
+ return (await import("./ru.js")).default;
25
27
  case "pt_BR": {
26
28
  return (await import("./br.js")).default;
27
29
  }