diff --git a/.env.example b/.env.example
index 247e73171..7bfb065f4 100644
--- a/.env.example
+++ b/.env.example
@@ -126,5 +126,15 @@ REACT_APP_DISABLED_CHAINS=
# - /token-list
REACT_APP_DISABLED_CHAINS_FOR_AVAILABLE_ROUTES=
+# Comma-separated list of token symbols to disable in the UI and the following API handlers:
+# - /available-routes
+# - /token-list
+REACT_APP_DISABLED_TOKENS_FOR_AVAILABLE_ROUTES=
+
# Comma-separated list of wallet addresses to block from UI
REACT_APP_WALLET_BLACKLIST=
+
+# Gas estimation padding multiplier.
+# JSON with format: {[chainId]: }
+# e.g: { "1": 1.1, "10": 1.05 }
+REACT_APP_GAS_ESTIMATION_MULTIPLIER_PER_CHAIN={"1": 1.1}
diff --git a/api/_constants.ts b/api/_constants.ts
index c2969c1c8..a1cb05615 100644
--- a/api/_constants.ts
+++ b/api/_constants.ts
@@ -17,13 +17,13 @@ const defaultRelayerFeeCapitalCostConfig: {
} = {
ETH: {
lowerBound: ethers.utils.parseUnits("0.0001").toString(),
- upperBound: ethers.utils.parseUnits("0.0001").toString(),
+ upperBound: ethers.utils.parseUnits("0.0004").toString(),
cutoff: ethers.utils.parseUnits("750").toString(),
decimals: 18,
},
WETH: {
lowerBound: ethers.utils.parseUnits("0.0001").toString(),
- upperBound: ethers.utils.parseUnits("0.0001").toString(),
+ upperBound: ethers.utils.parseUnits("0.0004").toString(),
cutoff: ethers.utils.parseUnits("750").toString(),
decimals: 18,
},
@@ -35,20 +35,20 @@ const defaultRelayerFeeCapitalCostConfig: {
},
DAI: {
lowerBound: ethers.utils.parseUnits("0.0001").toString(),
- upperBound: ethers.utils.parseUnits("0.0001").toString(),
- cutoff: ethers.utils.parseUnits("250000").toString(),
+ upperBound: ethers.utils.parseUnits("0.0004").toString(),
+ cutoff: ethers.utils.parseUnits("1500000").toString(),
decimals: 18,
},
USDC: {
lowerBound: ethers.utils.parseUnits("0.0001").toString(),
- upperBound: ethers.utils.parseUnits("0.0001").toString(),
+ upperBound: ethers.utils.parseUnits("0.0004").toString(),
cutoff: ethers.utils.parseUnits("1500000").toString(),
decimals: 6,
},
USDT: {
lowerBound: ethers.utils.parseUnits("0.0001").toString(),
- upperBound: ethers.utils.parseUnits("0.0001").toString(),
- cutoff: ethers.utils.parseUnits("250000").toString(),
+ upperBound: ethers.utils.parseUnits("0.0004").toString(),
+ cutoff: ethers.utils.parseUnits("1500000").toString(),
decimals: 6,
},
UMA: {
@@ -63,12 +63,36 @@ const defaultRelayerFeeCapitalCostConfig: {
cutoff: ethers.utils.parseUnits("5000").toString(),
decimals: 18,
},
+ ACX: {
+ lowerBound: ethers.utils.parseUnits("0.0001").toString(),
+ upperBound: ethers.utils.parseUnits("0.001").toString(),
+ cutoff: ethers.utils.parseUnits("1000000").toString(),
+ decimals: 18,
+ },
+ BAL: {
+ lowerBound: ethers.utils.parseUnits("0.0001").toString(),
+ upperBound: ethers.utils.parseUnits("0.001").toString(),
+ cutoff: ethers.utils.parseUnits("10000").toString(),
+ decimals: 18,
+ },
+ POOL: {
+ lowerBound: ethers.utils.parseUnits("0.0001").toString(),
+ upperBound: ethers.utils.parseUnits("0.001").toString(),
+ cutoff: ethers.utils.parseUnits("10000").toString(),
+ decimals: 18,
+ },
BOBA: {
lowerBound: ethers.utils.parseUnits("0.0003").toString(),
upperBound: ethers.utils.parseUnits("0.001").toString(),
cutoff: ethers.utils.parseUnits("100000").toString(),
decimals: 18,
},
+ SNX: {
+ lowerBound: ethers.utils.parseUnits("0.0001").toString(),
+ upperBound: ethers.utils.parseUnits("0.0005").toString(),
+ cutoff: ethers.utils.parseUnits("10000").toString(),
+ decimals: 18,
+ },
};
const relayerFeeCapitalCostOverrides: Record<
diff --git a/api/_utils.ts b/api/_utils.ts
index 5a491d8e6..8ab12cc8e 100644
--- a/api/_utils.ts
+++ b/api/_utils.ts
@@ -58,11 +58,6 @@ export const DEFAULT_GAS_MARKUP = 0;
// Don't permit HUB_POOL_CHAIN_ID=0
export const HUB_POOL_CHAIN_ID = Number(REACT_APP_HUBPOOL_CHAINID || 1);
-// Permit REACT_APP_FLAT_RELAY_CAPITAL_FEE=0
-export const FLAT_RELAY_CAPITAL_FEE = Number(
- process.env.REACT_APP_FLAT_RELAY_CAPITAL_FEE ?? 0.03
-); // 0.03%
-
// Tokens that should be disabled in the routes
export const DISABLED_ROUTE_TOKENS = (
process.env.DISABLED_ROUTE_TOKENS || ""
@@ -84,6 +79,10 @@ export const DISABLED_CHAINS_FOR_AVAILABLE_ROUTES = (
process.env.REACT_APP_DISABLED_CHAINS_FOR_AVAILABLE_ROUTES || ""
).split(",");
+export const DISABLED_TOKENS_FOR_AVAILABLE_ROUTES = (
+ process.env.REACT_APP_DISABLED_TOKENS_FOR_AVAILABLE_ROUTES || ""
+).split(",");
+
const _ENABLED_ROUTES =
HUB_POOL_CHAIN_ID === 1
? enabledMainnetRoutesAsJson
@@ -443,7 +442,6 @@ export const getRelayerFeeCalculator = (destinationChainId: number) => {
const relayerFeeCalculatorConfig = {
feeLimitPercent: maxRelayFeePct * 100,
- capitalCostsPercent: FLAT_RELAY_CAPITAL_FEE, // This is set same way in ./src/utils/bridge.ts
queries: queryFn(),
capitalCostsConfig: relayerFeeCapitalCostConfig,
};
diff --git a/api/available-routes.ts b/api/available-routes.ts
index 779507a32..566d5933b 100644
--- a/api/available-routes.ts
+++ b/api/available-routes.ts
@@ -8,6 +8,7 @@ import {
ENABLED_ROUTES,
handleErrorCondition,
DISABLED_CHAINS_FOR_AVAILABLE_ROUTES,
+ DISABLED_TOKENS_FOR_AVAILABLE_ROUTES,
} from "./_utils";
import { TypedVercelRequest } from "./_types";
@@ -64,10 +65,14 @@ const handler = async (
originChainId: number;
destinationChainId: number;
destinationToken: string;
+ fromTokenSymbol: string;
}) =>
![route.originChainId, route.destinationChainId].some((chainId) =>
DISABLED_CHAINS_FOR_AVAILABLE_ROUTES.includes(String(chainId))
) &&
+ !DISABLED_TOKENS_FOR_AVAILABLE_ROUTES.some(
+ (s) => s.toUpperCase() === route.fromTokenSymbol.toUpperCase()
+ ) &&
(!originToken ||
originToken.toLowerCase() === route.originToken.toLowerCase()) &&
(!originChainId || originChainId === String(route.originChainId)) &&
@@ -81,12 +86,18 @@ const handler = async (
originChainId: route.fromChain,
originToken: route.fromTokenAddress,
destinationChainId: route.toChain,
+ fromTokenSymbol: route.fromTokenSymbol,
// Resolve destination chain directly from the
// l1TokensToDestinationTokens map
destinationToken:
l1TokensToDestinationTokens[route.l1TokenAddress][route.toChain],
})
- );
+ ).map((route) => ({
+ originChainId: route.originChainId,
+ originToken: route.originToken,
+ destinationChainId: route.destinationChainId,
+ destinationToken: route.destinationToken,
+ }));
// Two different explanations for how `stale-while-revalidate` works:
diff --git a/api/suggested-fees.ts b/api/suggested-fees.ts
index 945a363f2..0e7d47db6 100644
--- a/api/suggested-fees.ts
+++ b/api/suggested-fees.ts
@@ -233,6 +233,7 @@ const handler = async (
responseJson,
});
+ response.setHeader("Cache-Control", "s-maxage=10");
response.status(200).json(responseJson);
} catch (error) {
return handleErrorCondition("suggested-fees", response, logger, error);
diff --git a/api/token-list.ts b/api/token-list.ts
index d1962c179..a25062a91 100644
--- a/api/token-list.ts
+++ b/api/token-list.ts
@@ -5,6 +5,7 @@ import {
getFallbackTokenLogoURI,
ENABLED_ROUTES,
DISABLED_CHAINS_FOR_AVAILABLE_ROUTES,
+ DISABLED_TOKENS_FOR_AVAILABLE_ROUTES,
} from "./_utils";
import { TypedVercelRequest } from "./_types";
import { TOKEN_SYMBOLS_MAP } from "./_constants";
@@ -18,6 +19,9 @@ const handler = async (_: TypedVercelRequest<{}>, response: VercelResponse) => {
(route) =>
![route.fromChain, route.toChain].some((chainId) =>
DISABLED_CHAINS_FOR_AVAILABLE_ROUTES.includes(String(chainId))
+ ) &&
+ !DISABLED_TOKENS_FOR_AVAILABLE_ROUTES.some(
+ (s) => s.toUpperCase() === route.fromTokenSymbol.toUpperCase()
)
)
.reduce(
diff --git a/index.html b/index.html
index 7d4a3eb87..122c44919 100644
--- a/index.html
+++ b/index.html
@@ -2,7 +2,7 @@
-
+
-
+
-
+
diff --git a/package.json b/package.json
index 655a06b96..04e4557a1 100644
--- a/package.json
+++ b/package.json
@@ -16,14 +16,16 @@
"@fortawesome/react-fontawesome": "^0.2.0",
"@google-cloud/logging": "^10.1.1",
"@reach/dialog": "^0.16.2",
+ "@safe-global/safe-apps-provider": "^0.18.0",
+ "@safe-global/safe-apps-sdk": "^8.1.0",
"@sentry/react": "^7.37.2",
"@uma/sdk": "^0.22.2",
- "@web3-onboard/coinbase": "^2.2.4",
- "@web3-onboard/core": "^2.20.4",
- "@web3-onboard/gnosis": "^2.1.10",
- "@web3-onboard/injected-wallets": "^2.10.2",
- "@web3-onboard/react": "^2.8.9",
- "@web3-onboard/walletconnect": "^2.4.1",
+ "@web3-onboard/coinbase": "^2.2.5",
+ "@web3-onboard/core": "^2.21.2",
+ "@web3-onboard/gnosis": "^2.2.0",
+ "@web3-onboard/injected-wallets": "^2.10.6",
+ "@web3-onboard/react": "^2.8.13",
+ "@web3-onboard/walletconnect": "^2.4.6",
"axios": "^0.27.2",
"bnc-notify": "^1.9.8",
"copy-to-clipboard": "^3.3.3",
@@ -50,7 +52,7 @@
},
"scripts": {
"start": "export REACT_APP_GIT_COMMIT_HASH=$(git rev-parse HEAD) && vite",
- "dev": "export REACT_APP_GIT_COMMIT_HASH=$(git rev-parse HEAD) && vite --port $PORT",
+ "dev": "export REACT_APP_GIT_COMMIT_HASH=$(git rev-parse HEAD) && vite --port $PORT --host",
"build": "export REACT_APP_GIT_COMMIT_HASH=$(git rev-parse HEAD) && tsc && vite build",
"analyze": "yarn build --stats && webpack-bundle-analyzer build/bundle-stats.json -m server -r build/bundle-stats.html",
"test": "export REACT_APP_GIT_COMMIT_HASH=$(git rev-parse HEAD) && jest --env jsdom src",
diff --git a/patches/@web3-onboard+walletconnect+2.4.1.patch b/patches/@web3-onboard+walletconnect+2.4.1.patch
deleted file mode 100644
index efb5267e3..000000000
--- a/patches/@web3-onboard+walletconnect+2.4.1.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-diff --git a/node_modules/@web3-onboard/walletconnect/dist/v2.js b/node_modules/@web3-onboard/walletconnect/dist/v2.js
-index e24edd8..459a4ab 100644
---- a/node_modules/@web3-onboard/walletconnect/dist/v2.js
-+++ b/node_modules/@web3-onboard/walletconnect/dist/v2.js
-@@ -48,7 +48,7 @@ function walletConnect(options) {
- ? // @ts-ignore
- // Required as WC package does not support hex numbers
- requiredChains.map(chainID => parseInt(chainID))
-- : [1];
-+ : [];
- // Defaults to the chains provided within the web3-onboard init chain property
- const optionalChainsParsed = Array.isArray(optionalChains) &&
- optionalChains.length &&
diff --git a/public/favicon.svg b/public/favicon.svg
new file mode 100644
index 000000000..af00acc86
--- /dev/null
+++ b/public/favicon.svg
@@ -0,0 +1,4 @@
+
diff --git a/public/logo-small.png b/public/logo-small.png
index cd657fe18..978787174 100644
Binary files a/public/logo-small.png and b/public/logo-small.png differ
diff --git a/public/thumbnail.png b/public/thumbnail.png
new file mode 100644
index 000000000..eef64146c
Binary files /dev/null and b/public/thumbnail.png differ
diff --git a/src/ampli/index.ts b/src/ampli/index.ts
index 834422d3f..ec2843e2e 100644
--- a/src/ampli/index.ts
+++ b/src/ampli/index.ts
@@ -1,5 +1,6 @@
/* tslint:disable */
/* eslint-disable */
+// @ts-nocheck
/**
* Ampli - A strong typed wrapper for your Analytics
*
@@ -7,7 +8,7 @@
* To update run 'ampli pull web'
*
* Required dependencies: @amplitude/analytics-browser@^1.3.0
- * Tracking Plan Version: 48
+ * Tracking Plan Version: 50
* Build: 1.0.0
* Runtime: browser:typescript-ampli-v2
*
@@ -31,10 +32,10 @@ export const ApiKey: Record = {
*/
export const DefaultConfiguration: BrowserOptions = {
plan: {
- version: "48",
+ version: "50",
branch: "main",
source: "web",
- versionId: "b6ae0501-d357-497d-9c93-27640ad3cd9f",
+ versionId: "5b6bde07-5ed3-4021-967f-fdaec4b35a87",
},
...{
ingestionMetadata: {
@@ -65,6 +66,8 @@ export type LoadOptions =
| LoadOptionsWithClientInstance;
export interface IdentifyProperties {
+ AcxVolumeNative?: any;
+ AcxVolumeUsd?: any;
AllAssetsAllNetworksWalletCurrentBalanceUsd?: string;
/**
* List of wallet addresses connected during Wallet Connect Transaction Completed event.
@@ -84,6 +87,39 @@ export interface IdentifyProperties {
* | Item Type | string |
*/
AllWalletChainIds?: string[];
+ ArbitrumAcxWalletCurrentBalance?: any;
+ ArbitrumBalWalletCurrentBalance?: any;
+ ArbitrumDaiWalletCurrentBalance?: any;
+ ArbitrumEthWalletCurrentBalance?: any;
+ ArbitrumUmaWalletCurrentBalance?: any;
+ ArbitrumUsdcWalletCurrentBalance?: any;
+ ArbitrumWbtcWalletCurrentBalance?: any;
+ ArbitrumWethWalletCurrentBalance?: any;
+ BalVolumeNative?: any;
+ BalVolumeUsd?: any;
+ BobaAcxWalletCurrentBalance?: any;
+ BobaBobaWalletCurrentBalance?: any;
+ BobaDaiWalletCurrentBalance?: any;
+ BobaEthWalletCurrentBalance?: any;
+ BobaUmaWalletCurrentBalance?: any;
+ BobaUsdcWalletCurrentBalance?: any;
+ BobaVolumeNative?: any;
+ BobaVolumeUsd?: any;
+ BobaWbtcWalletCurrentBalance?: any;
+ BobaWethWalletCurrentBalance?: any;
+ DaiVolumeNative?: any;
+ DaiVolumeUsd?: any;
+ EthereumAcxWalletCurrentBalance?: any;
+ EthereumBalWalletCurrentBalance?: any;
+ EthereumBobaWalletCurrentBalance?: any;
+ EthereumDaiWalletCurrentBalance?: any;
+ EthereumEthWalletCurrentBalance?: any;
+ EthereumUmaWalletCurrentBalance?: any;
+ EthereumUsdcWalletCurrentBalance?: any;
+ EthereumWbtcWalletCurrentBalance?: any;
+ EthereumWethWalletCurrentBalance?: any;
+ EthVolumeNative?: any;
+ EthVolumeUsd?: any;
initial_dclid?: any;
initial_fbclid?: any;
initial_gbraid?: any;
@@ -101,6 +137,32 @@ export interface IdentifyProperties {
initial_utm_source?: any;
initial_utm_term?: any;
initial_wbraid?: any;
+ L1L2Transfers?: any;
+ L2L1Transfers?: any;
+ L2L2Transfers?: any;
+ OptimismAcxWalletCurrentBalance?: any;
+ OptimismBalWalletCurrentBalance?: any;
+ OptimismDaiWalletCurrentBalance?: any;
+ OptimismEthWalletCurrentBalance?: any;
+ OptimismUmaWalletCurrentBalance?: any;
+ OptimismUsdcWalletCurrentBalance?: any;
+ OptimismWbtcWalletCurrentBalance?: any;
+ OptimismWethWalletCurrentBalance?: any;
+ PolygonAcxWalletCurrentBalance?: any;
+ PolygonBalWalletCurrentBalance?: any;
+ PolygonDaiWalletCurrentBalance?: any;
+ PolygonUmaWalletCurrentBalance?: any;
+ PolygonUsdcWalletCurrentBalance?: any;
+ PolygonWbtcWalletCurrentBalance?: any;
+ PolygonWethWalletCurrentBalance?: any;
+ referrer?: any;
+ referring_domain?: any;
+ TotalTransfers?: any;
+ TotalVolumeUsd?: any;
+ UmaVolumeNative?: any;
+ UmaVolumeUsd?: any;
+ UsdcVolumeNative?: any;
+ UsdcVolumeUsd?: any;
/**
* Currently connected wallet address
*/
@@ -109,6 +171,10 @@ export interface IdentifyProperties {
* Type of wallet connected
*/
WalletType?: string;
+ WbtcVolumeNative?: any;
+ WbtcVolumeUsd?: any;
+ WethVolumeNative?: any;
+ WethVolumeUsd?: any;
}
export interface ConnectWalletButtonClickedProperties {
@@ -123,13 +189,17 @@ export interface ConnectWalletButtonClickedProperties {
/**
* | Rule | Value |
* |---|---|
- * | Enum Values | connectWalletButton, web3OnboardModal, maxButton, quickSwapButton |
+ * | Enum Values | connectWalletButton, web3OnboardModal, maxButton, quickSwapButton, trackInExplorerLink, monitorDepositProgressLink, earnByAddingLiquidityAndStakingLink, disconnectWalletButton |
*/
element:
| "connectWalletButton"
| "web3OnboardModal"
| "maxButton"
- | "quickSwapButton";
+ | "quickSwapButton"
+ | "trackInExplorerLink"
+ | "monitorDepositProgressLink"
+ | "earnByAddingLiquidityAndStakingLink"
+ | "disconnectWalletButton";
/**
* | Rule | Value |
* |---|---|
@@ -148,7 +218,7 @@ export interface ConnectWalletButtonClickedProperties {
/**
* | Rule | Value |
* |---|---|
- * | Enum Values | navbar, mobileNavSidebar, addLiquidityForm, removeLiquidityForm, airdropSplashFlow, referralTable, rewardsTable, unstakeForm, myTransactionsTable, bridgeForm, claimReferralRewardsForm, stakeForm |
+ * | Enum Values | navbar, mobileNavSidebar, addLiquidityForm, removeLiquidityForm, airdropSplashFlow, referralTable, rewardsTable, unstakeForm, myTransactionsTable, bridgeForm, claimReferralRewardsForm, stakeForm, depositConfirmation |
*/
section:
| "navbar"
@@ -162,7 +232,21 @@ export interface ConnectWalletButtonClickedProperties {
| "myTransactionsTable"
| "bridgeForm"
| "claimReferralRewardsForm"
- | "stakeForm";
+ | "stakeForm"
+ | "depositConfirmation";
+}
+
+export interface DepositNetworkMismatchProperties {
+ /**
+ * Id of the fromChain
+ */
+ fromChainId: string;
+ signerAddress: string;
+ signerChainId: string;
+ /**
+ * Id of the toChain
+ */
+ toChainId: string;
}
export interface DisconnectWalletButtonClickedProperties {
@@ -170,7 +254,79 @@ export interface DisconnectWalletButtonClickedProperties {
* Action user did to trigger the event.
*/
action: string;
- element: string;
+ /**
+ * | Rule | Value |
+ * |---|---|
+ * | Enum Values | connectWalletButton, web3OnboardModal, maxButton, quickSwapButton, trackInExplorerLink, monitorDepositProgressLink, earnByAddingLiquidityAndStakingLink, disconnectWalletButton |
+ */
+ element:
+ | "connectWalletButton"
+ | "web3OnboardModal"
+ | "maxButton"
+ | "quickSwapButton"
+ | "trackInExplorerLink"
+ | "monitorDepositProgressLink"
+ | "earnByAddingLiquidityAndStakingLink"
+ | "disconnectWalletButton";
+ /**
+ * | Rule | Value |
+ * |---|---|
+ * | Enum Values | splashPage, bridgePage, poolPage, rewardsPage, transactionsPage, stakingPage, referralPage, airdropPage, 404Page |
+ */
+ page:
+ | "splashPage"
+ | "bridgePage"
+ | "poolPage"
+ | "rewardsPage"
+ | "transactionsPage"
+ | "stakingPage"
+ | "referralPage"
+ | "airdropPage"
+ | "404Page";
+ /**
+ * | Rule | Value |
+ * |---|---|
+ * | Enum Values | navbar, mobileNavSidebar, addLiquidityForm, removeLiquidityForm, airdropSplashFlow, referralTable, rewardsTable, unstakeForm, myTransactionsTable, bridgeForm, claimReferralRewardsForm, stakeForm, depositConfirmation |
+ */
+ section:
+ | "navbar"
+ | "mobileNavSidebar"
+ | "addLiquidityForm"
+ | "removeLiquidityForm"
+ | "airdropSplashFlow"
+ | "referralTable"
+ | "rewardsTable"
+ | "unstakeForm"
+ | "myTransactionsTable"
+ | "bridgeForm"
+ | "claimReferralRewardsForm"
+ | "stakeForm"
+ | "depositConfirmation";
+}
+
+export interface EarnByAddingLiquidityClickedProperties {
+ /**
+ * Action user did to trigger the event.
+ *
+ * | Rule | Value |
+ * |---|---|
+ * | Enum Values | onClick, onKeyPress |
+ */
+ action: "onClick" | "onKeyPress";
+ /**
+ * | Rule | Value |
+ * |---|---|
+ * | Enum Values | connectWalletButton, web3OnboardModal, maxButton, quickSwapButton, trackInExplorerLink, monitorDepositProgressLink, earnByAddingLiquidityAndStakingLink, disconnectWalletButton |
+ */
+ element:
+ | "connectWalletButton"
+ | "web3OnboardModal"
+ | "maxButton"
+ | "quickSwapButton"
+ | "trackInExplorerLink"
+ | "monitorDepositProgressLink"
+ | "earnByAddingLiquidityAndStakingLink"
+ | "disconnectWalletButton";
/**
* | Rule | Value |
* |---|---|
@@ -186,7 +342,25 @@ export interface DisconnectWalletButtonClickedProperties {
| "referralPage"
| "airdropPage"
| "404Page";
- section: string;
+ /**
+ * | Rule | Value |
+ * |---|---|
+ * | Enum Values | navbar, mobileNavSidebar, addLiquidityForm, removeLiquidityForm, airdropSplashFlow, referralTable, rewardsTable, unstakeForm, myTransactionsTable, bridgeForm, claimReferralRewardsForm, stakeForm, depositConfirmation |
+ */
+ section:
+ | "navbar"
+ | "mobileNavSidebar"
+ | "addLiquidityForm"
+ | "removeLiquidityForm"
+ | "airdropSplashFlow"
+ | "referralTable"
+ | "rewardsTable"
+ | "unstakeForm"
+ | "myTransactionsTable"
+ | "bridgeForm"
+ | "claimReferralRewardsForm"
+ | "stakeForm"
+ | "depositConfirmation";
}
export interface FromChainSelectedProperties {
@@ -216,18 +390,81 @@ export interface MaxTokenAmountClickedProperties {
/**
* | Rule | Value |
* |---|---|
- * | Enum Values | connectWalletButton, web3OnboardModal, maxButton, quickSwapButton |
+ * | Enum Values | connectWalletButton, web3OnboardModal, maxButton, quickSwapButton, trackInExplorerLink, monitorDepositProgressLink, earnByAddingLiquidityAndStakingLink, disconnectWalletButton |
*/
element:
| "connectWalletButton"
| "web3OnboardModal"
| "maxButton"
- | "quickSwapButton";
+ | "quickSwapButton"
+ | "trackInExplorerLink"
+ | "monitorDepositProgressLink"
+ | "earnByAddingLiquidityAndStakingLink"
+ | "disconnectWalletButton";
page: string;
/**
* | Rule | Value |
* |---|---|
- * | Enum Values | navbar, mobileNavSidebar, addLiquidityForm, removeLiquidityForm, airdropSplashFlow, referralTable, rewardsTable, unstakeForm, myTransactionsTable, bridgeForm, claimReferralRewardsForm, stakeForm |
+ * | Enum Values | navbar, mobileNavSidebar, addLiquidityForm, removeLiquidityForm, airdropSplashFlow, referralTable, rewardsTable, unstakeForm, myTransactionsTable, bridgeForm, claimReferralRewardsForm, stakeForm, depositConfirmation |
+ */
+ section:
+ | "navbar"
+ | "mobileNavSidebar"
+ | "addLiquidityForm"
+ | "removeLiquidityForm"
+ | "airdropSplashFlow"
+ | "referralTable"
+ | "rewardsTable"
+ | "unstakeForm"
+ | "myTransactionsTable"
+ | "bridgeForm"
+ | "claimReferralRewardsForm"
+ | "stakeForm"
+ | "depositConfirmation";
+}
+
+export interface MonitorDepositProgressClickedProperties {
+ /**
+ * Action user did to trigger the event.
+ *
+ * | Rule | Value |
+ * |---|---|
+ * | Enum Values | onClick, onKeyPress |
+ */
+ action: "onClick" | "onKeyPress";
+ /**
+ * | Rule | Value |
+ * |---|---|
+ * | Enum Values | connectWalletButton, web3OnboardModal, maxButton, quickSwapButton, trackInExplorerLink, monitorDepositProgressLink, earnByAddingLiquidityAndStakingLink, disconnectWalletButton |
+ */
+ element:
+ | "connectWalletButton"
+ | "web3OnboardModal"
+ | "maxButton"
+ | "quickSwapButton"
+ | "trackInExplorerLink"
+ | "monitorDepositProgressLink"
+ | "earnByAddingLiquidityAndStakingLink"
+ | "disconnectWalletButton";
+ /**
+ * | Rule | Value |
+ * |---|---|
+ * | Enum Values | splashPage, bridgePage, poolPage, rewardsPage, transactionsPage, stakingPage, referralPage, airdropPage, 404Page |
+ */
+ page:
+ | "splashPage"
+ | "bridgePage"
+ | "poolPage"
+ | "rewardsPage"
+ | "transactionsPage"
+ | "stakingPage"
+ | "referralPage"
+ | "airdropPage"
+ | "404Page";
+ /**
+ * | Rule | Value |
+ * |---|---|
+ * | Enum Values | navbar, mobileNavSidebar, addLiquidityForm, removeLiquidityForm, airdropSplashFlow, referralTable, rewardsTable, unstakeForm, myTransactionsTable, bridgeForm, claimReferralRewardsForm, stakeForm, depositConfirmation |
*/
section:
| "navbar"
@@ -241,7 +478,8 @@ export interface MaxTokenAmountClickedProperties {
| "myTransactionsTable"
| "bridgeForm"
| "claimReferralRewardsForm"
- | "stakeForm";
+ | "stakeForm"
+ | "depositConfirmation";
}
export interface PageViewedProperties {
@@ -292,13 +530,17 @@ export interface QuickSwapButtonClickedProperties {
/**
* | Rule | Value |
* |---|---|
- * | Enum Values | connectWalletButton, web3OnboardModal, maxButton, quickSwapButton |
+ * | Enum Values | connectWalletButton, web3OnboardModal, maxButton, quickSwapButton, trackInExplorerLink, monitorDepositProgressLink, earnByAddingLiquidityAndStakingLink, disconnectWalletButton |
*/
element:
| "connectWalletButton"
| "web3OnboardModal"
| "maxButton"
- | "quickSwapButton";
+ | "quickSwapButton"
+ | "trackInExplorerLink"
+ | "monitorDepositProgressLink"
+ | "earnByAddingLiquidityAndStakingLink"
+ | "disconnectWalletButton";
/**
* | Rule | Value |
* |---|---|
@@ -317,7 +559,7 @@ export interface QuickSwapButtonClickedProperties {
/**
* | Rule | Value |
* |---|---|
- * | Enum Values | navbar, mobileNavSidebar, addLiquidityForm, removeLiquidityForm, airdropSplashFlow, referralTable, rewardsTable, unstakeForm, myTransactionsTable, bridgeForm, claimReferralRewardsForm, stakeForm |
+ * | Enum Values | navbar, mobileNavSidebar, addLiquidityForm, removeLiquidityForm, airdropSplashFlow, referralTable, rewardsTable, unstakeForm, myTransactionsTable, bridgeForm, claimReferralRewardsForm, stakeForm, depositConfirmation |
*/
section:
| "navbar"
@@ -331,7 +573,8 @@ export interface QuickSwapButtonClickedProperties {
| "myTransactionsTable"
| "bridgeForm"
| "claimReferralRewardsForm"
- | "stakeForm";
+ | "stakeForm"
+ | "depositConfirmation";
}
export interface ToAccountChangedProperties {
@@ -375,6 +618,65 @@ export interface TokenSelectedProperties {
tokenSymbol: string;
}
+export interface TrackInExplorerClickedProperties {
+ /**
+ * Action user did to trigger the event.
+ *
+ * | Rule | Value |
+ * |---|---|
+ * | Enum Values | onClick, onKeyPress |
+ */
+ action: "onClick" | "onKeyPress";
+ /**
+ * | Rule | Value |
+ * |---|---|
+ * | Enum Values | connectWalletButton, web3OnboardModal, maxButton, quickSwapButton, trackInExplorerLink, monitorDepositProgressLink, earnByAddingLiquidityAndStakingLink, disconnectWalletButton |
+ */
+ element:
+ | "connectWalletButton"
+ | "web3OnboardModal"
+ | "maxButton"
+ | "quickSwapButton"
+ | "trackInExplorerLink"
+ | "monitorDepositProgressLink"
+ | "earnByAddingLiquidityAndStakingLink"
+ | "disconnectWalletButton";
+ /**
+ * | Rule | Value |
+ * |---|---|
+ * | Enum Values | splashPage, bridgePage, poolPage, rewardsPage, transactionsPage, stakingPage, referralPage, airdropPage, 404Page |
+ */
+ page:
+ | "splashPage"
+ | "bridgePage"
+ | "poolPage"
+ | "rewardsPage"
+ | "transactionsPage"
+ | "stakingPage"
+ | "referralPage"
+ | "airdropPage"
+ | "404Page";
+ /**
+ * | Rule | Value |
+ * |---|---|
+ * | Enum Values | navbar, mobileNavSidebar, addLiquidityForm, removeLiquidityForm, airdropSplashFlow, referralTable, rewardsTable, unstakeForm, myTransactionsTable, bridgeForm, claimReferralRewardsForm, stakeForm, depositConfirmation |
+ */
+ section:
+ | "navbar"
+ | "mobileNavSidebar"
+ | "addLiquidityForm"
+ | "removeLiquidityForm"
+ | "airdropSplashFlow"
+ | "referralTable"
+ | "rewardsTable"
+ | "unstakeForm"
+ | "myTransactionsTable"
+ | "bridgeForm"
+ | "claimReferralRewardsForm"
+ | "stakeForm"
+ | "depositConfirmation";
+}
+
export interface TransferDepositCompletedProperties {
/**
* Capital fee percent, in decimals
@@ -1082,7 +1384,20 @@ export interface WalletSelectedProperties {
* Action user did to trigger the event.
*/
action: string;
- element: string;
+ /**
+ * | Rule | Value |
+ * |---|---|
+ * | Enum Values | connectWalletButton, web3OnboardModal, maxButton, quickSwapButton, trackInExplorerLink, monitorDepositProgressLink, earnByAddingLiquidityAndStakingLink, disconnectWalletButton |
+ */
+ element:
+ | "connectWalletButton"
+ | "web3OnboardModal"
+ | "maxButton"
+ | "quickSwapButton"
+ | "trackInExplorerLink"
+ | "monitorDepositProgressLink"
+ | "earnByAddingLiquidityAndStakingLink"
+ | "disconnectWalletButton";
page: string;
/**
* Type of wallet attempted to connect
@@ -1098,7 +1413,7 @@ export interface WebVitalsProperties {
}
export class Identify implements BaseEvent {
- event_type = "Identify";
+ event_type = amplitude.Types.SpecialEventType.IDENTIFY;
constructor(public event_properties?: IdentifyProperties) {
this.event_properties = event_properties;
@@ -1117,6 +1432,14 @@ export class ConnectWalletButtonClicked implements BaseEvent {
}
}
+export class DepositNetworkMismatch implements BaseEvent {
+ event_type = "DepositNetworkMismatch";
+
+ constructor(public event_properties: DepositNetworkMismatchProperties) {
+ this.event_properties = event_properties;
+ }
+}
+
export class DisconnectWalletButtonClicked implements BaseEvent {
event_type = "DisconnectWalletButtonClicked";
@@ -1127,6 +1450,14 @@ export class DisconnectWalletButtonClicked implements BaseEvent {
}
}
+export class EarnByAddingLiquidityClicked implements BaseEvent {
+ event_type = "EarnByAddingLiquidityClicked";
+
+ constructor(public event_properties: EarnByAddingLiquidityClickedProperties) {
+ this.event_properties = event_properties;
+ }
+}
+
export class FeesInfoExpanded implements BaseEvent {
event_type = "FeesInfoExpanded";
}
@@ -1147,6 +1478,16 @@ export class MaxTokenAmountClicked implements BaseEvent {
}
}
+export class MonitorDepositProgressClicked implements BaseEvent {
+ event_type = "MonitorDepositProgressClicked";
+
+ constructor(
+ public event_properties: MonitorDepositProgressClickedProperties
+ ) {
+ this.event_properties = event_properties;
+ }
+}
+
export class PageViewed implements BaseEvent {
event_type = "PageViewed";
@@ -1187,6 +1528,14 @@ export class TokenSelected implements BaseEvent {
}
}
+export class TrackInExplorerClicked implements BaseEvent {
+ event_type = "TrackInExplorerClicked";
+
+ constructor(public event_properties: TrackInExplorerClickedProperties) {
+ this.event_properties = event_properties;
+ }
+}
+
export class TransferDepositCompleted implements BaseEvent {
event_type = "TransferDepositCompleted";
@@ -1303,7 +1652,8 @@ export class Ampli {
this.amplitude = options.client.instance;
} else if (apiKey) {
this.amplitude = amplitude.createInstance();
- return this.amplitude.init(apiKey, undefined, { ...DefaultConfiguration, ...options.client?.configuration });
+ const configuration = (options.client && 'configuration' in options.client) ? options.client.configuration : {};
+ return this.amplitude.init(apiKey, undefined, { ...DefaultConfiguration, ...configuration });
} else {
console.error("ERROR: ampli.load() requires 'environment', 'client.apiKey', or 'client.instance'");
}
@@ -1344,6 +1694,17 @@ export class Ampli {
);
}
+ /**
+ * Flush the event.
+ */
+ flush() : PromiseResult {
+ if (!this.isInitializedAndEnabled()) {
+ return getVoidPromiseResult();
+ }
+
+ return this.amplitude!.flush();
+ }
+
/**
* Track event
*
@@ -1394,6 +1755,23 @@ export class Ampli {
return this.track(new ConnectWalletButtonClicked(properties), options);
}
+ /**
+ * DepositNetworkMismatch
+ *
+ * [View in Tracking Plan](https://data.amplitude.com/risklabs/Risk%20Labs/events/main/latest/DepositNetworkMismatch)
+ *
+ * This event tracks instances where a transfer deposit is attempted to a network that does not match the intended network
+ *
+ * @param properties The event's properties (e.g. fromChainId)
+ * @param options Amplitude event options.
+ */
+ depositNetworkMismatch(
+ properties: DepositNetworkMismatchProperties,
+ options?: EventOptions,
+ ) {
+ return this.track(new DepositNetworkMismatch(properties), options);
+ }
+
/**
* DisconnectWalletButtonClicked
*
@@ -1413,6 +1791,23 @@ export class Ampli {
return this.track(new DisconnectWalletButtonClicked(properties), options);
}
+ /**
+ * EarnByAddingLiquidityClicked
+ *
+ * [View in Tracking Plan](https://data.amplitude.com/risklabs/Risk%20Labs/events/main/latest/EarnByAddingLiquidityClicked)
+ *
+ * This event tracks when a user clicks on the "Earn by Adding Liquidity" CTA within the application
+ *
+ * @param properties The event's properties (e.g. action)
+ * @param options Amplitude event options.
+ */
+ earnByAddingLiquidityClicked(
+ properties: EarnByAddingLiquidityClickedProperties,
+ options?: EventOptions,
+ ) {
+ return this.track(new EarnByAddingLiquidityClicked(properties), options);
+ }
+
/**
* FeesInfoExpanded
*
@@ -1468,6 +1863,23 @@ export class Ampli {
return this.track(new MaxTokenAmountClicked(properties), options);
}
+ /**
+ * MonitorDepositProgressClicked
+ *
+ * [View in Tracking Plan](https://data.amplitude.com/risklabs/Risk%20Labs/events/main/latest/MonitorDepositProgressClicked)
+ *
+ * This event tracks when a user clicks on the "Monitor Progress" button within the application
+ *
+ * @param properties The event's properties (e.g. action)
+ * @param options Amplitude event options.
+ */
+ monitorDepositProgressClicked(
+ properties: MonitorDepositProgressClickedProperties,
+ options?: EventOptions,
+ ) {
+ return this.track(new MonitorDepositProgressClicked(properties), options);
+ }
+
/**
* PageViewed
*
@@ -1561,6 +1973,23 @@ export class Ampli {
return this.track(new TokenSelected(properties), options);
}
+ /**
+ * TrackInExplorerClicked
+ *
+ * [View in Tracking Plan](https://data.amplitude.com/risklabs/Risk%20Labs/events/main/latest/TrackInExplorerClicked)
+ *
+ * This event tracks when a user clicks on the "Track in explorer" button within the application
+ *
+ * @param properties The event's properties (e.g. action)
+ * @param options Amplitude event options.
+ */
+ trackInExplorerClicked(
+ properties: TrackInExplorerClickedProperties,
+ options?: EventOptions,
+ ) {
+ return this.track(new TrackInExplorerClicked(properties), options);
+ }
+
/**
* TransferDepositCompleted
*
diff --git a/src/assets/arrow-star-ring.svg b/src/assets/arrow-star-ring.svg
new file mode 100644
index 000000000..61992e19a
--- /dev/null
+++ b/src/assets/arrow-star-ring.svg
@@ -0,0 +1,25 @@
+
diff --git a/src/assets/splash-mesh-bg-mobile.png b/src/assets/splash-mesh-bg-mobile.png
new file mode 100644
index 000000000..6c46c7d28
Binary files /dev/null and b/src/assets/splash-mesh-bg-mobile.png differ
diff --git a/src/components/ErrorBoundary/ErrorBoundary.tsx b/src/components/ErrorBoundary/ErrorBoundary.tsx
index 1a88ee8ec..3cfdbec96 100644
--- a/src/components/ErrorBoundary/ErrorBoundary.tsx
+++ b/src/components/ErrorBoundary/ErrorBoundary.tsx
@@ -5,16 +5,20 @@ import Sentry from "utils/sentry";
import { Wrapper, InnerWrapper, ButtonsWrapper } from "./ErrorBoundary.styles";
-export function FallbackComponent() {
+export function FallbackComponent(props: { error: Error }) {
return (
Something went wrong
+ Sorry, an error occurred.
+
+ {props.error.name}: {props.error.message}
+
- Sorry, an error occurred. We've been notified about this issue and
- we'll take a look at it shortly.
+ We've been notified about this issue and we'll take a look at it
+ shortly.
You can also try reloading the page, request support on Discord or
@@ -24,9 +28,12 @@ export function FallbackComponent() {
window.location.reload()}>
Reload
-
- Discord
-
+ window.open("https://discord.across.to", "_blank")}
+ >
+ Discord
+
@@ -37,7 +44,7 @@ export function FallbackComponent() {
export function ErrorBoundary(props: { children: React.ReactNode }) {
return (
}
beforeCapture={(scope) => scope.setLevel("fatal")}
>
{props.children}
diff --git a/src/components/Layout/Layout.tsx b/src/components/Layout/Layout.tsx
deleted file mode 100644
index 3e92a81af..000000000
--- a/src/components/Layout/Layout.tsx
+++ /dev/null
@@ -1,37 +0,0 @@
-import React from "react";
-import styled from "@emotion/styled";
-
-import { COLORS } from "utils";
-
-import Footer from "../Footer/Footer";
-
-const Layout: React.FC = ({ children }) => (
- <>
-
- {children}
-
-
-
-
- >
-);
-
-export default Layout;
-
-const FooterWrapper = styled.div`
- margin-top: -74px;
-`;
-
-const Wrapper = styled.div`
- display: grid;
- padding: 0 10px;
- grid-template-columns: 1fr min(var(--central-content), 100%) 1fr;
- min-height: 100vh;
-`;
-
-const Main = styled.main`
- height: 100%;
- grid-column: 2;
- box-shadow: 0 0 120px hsla(${COLORS.primary[500]} / 0.25);
- clip-path: inset(0px -160px 0px -160px);
-`;
diff --git a/src/components/Layout/index.ts b/src/components/Layout/index.ts
deleted file mode 100644
index b68828ddc..000000000
--- a/src/components/Layout/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-import Layout from "./Layout";
-export default Layout;
diff --git a/src/components/index.ts b/src/components/index.ts
index c7a9b25a5..25201c7af 100644
--- a/src/components/index.ts
+++ b/src/components/index.ts
@@ -1,5 +1,4 @@
export { default as GlobalStyles } from "./GlobalStyles";
-export { default as Layout } from "./Layout";
export { default as Header } from "./Header";
export { default as Dialog } from "./Dialog";
export { default as SuperHeader } from "./SuperHeader";
diff --git a/src/data/routes_1_0xc186fA914353c44b2E33eBE05f21846F1048bEda.json b/src/data/routes_1_0xc186fA914353c44b2E33eBE05f21846F1048bEda.json
index c05540526..95e8dc542 100644
--- a/src/data/routes_1_0xc186fA914353c44b2E33eBE05f21846F1048bEda.json
+++ b/src/data/routes_1_0xc186fA914353c44b2E33eBE05f21846F1048bEda.json
@@ -359,6 +359,15 @@
"isNative": false,
"l1TokenAddress": "0x6B175474E89094C44Da98b954EedeAC495271d0F"
},
+ {
+ "fromChain": 1,
+ "toChain": 8453,
+ "fromTokenAddress": "0xba100000625a3754423978a60c9317c58a424e3D",
+ "fromSpokeAddress": "0x5c7BCd6E7De5423a257D81B442095A1a6ced35C5",
+ "fromTokenSymbol": "BAL",
+ "isNative": false,
+ "l1TokenAddress": "0xba100000625a3754423978a60c9317c58a424e3D"
+ },
{
"fromChain": 10,
"toChain": 1,
@@ -710,6 +719,15 @@
"isNative": false,
"l1TokenAddress": "0x6B175474E89094C44Da98b954EedeAC495271d0F"
},
+ {
+ "fromChain": 10,
+ "toChain": 8453,
+ "fromTokenAddress": "0xFE8B128bA8C78aabC59d4c64cEE7fF28e9379921",
+ "fromSpokeAddress": "0x6f26Bf09B1C792e3228e5467807a900A503c0281",
+ "fromTokenSymbol": "BAL",
+ "isNative": false,
+ "l1TokenAddress": "0xba100000625a3754423978a60c9317c58a424e3D"
+ },
{
"fromChain": 137,
"toChain": 1,
@@ -1007,6 +1025,15 @@
"isNative": false,
"l1TokenAddress": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"
},
+ {
+ "fromChain": 137,
+ "toChain": 8453,
+ "fromTokenAddress": "0x9a71012B13CA4d3D0Cdc72A177DF3ef03b0E76A3",
+ "fromSpokeAddress": "0x9295ee1d8C5b022Be115A2AD3c30C72E34e7F096",
+ "fromTokenSymbol": "BAL",
+ "isNative": false,
+ "l1TokenAddress": "0xba100000625a3754423978a60c9317c58a424e3D"
+ },
{
"fromChain": 42161,
"toChain": 1,
@@ -1331,6 +1358,15 @@
"isNative": false,
"l1TokenAddress": "0x6B175474E89094C44Da98b954EedeAC495271d0F"
},
+ {
+ "fromChain": 42161,
+ "toChain": 8453,
+ "fromTokenAddress": "0x040d1EdC9569d4Bab2D15287Dc5A4F10F56a56B8",
+ "fromSpokeAddress": "0xe35e9842fceaCA96570B734083f4a58e8F7C5f2A",
+ "fromTokenSymbol": "BAL",
+ "isNative": false,
+ "l1TokenAddress": "0xba100000625a3754423978a60c9317c58a424e3D"
+ },
{
"fromChain": 324,
"toChain": 1,
@@ -1701,6 +1737,42 @@
"fromTokenSymbol": "ETH",
"isNative": true,
"l1TokenAddress": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"
+ },
+ {
+ "fromChain": 8453,
+ "toChain": 1,
+ "fromTokenAddress": "0x4158734D47Fc9692176B5085E0F52ee0Da5d47F1",
+ "fromSpokeAddress": "0x09aea4b2242abC8bb4BB78D537A67a245A7bEC64",
+ "fromTokenSymbol": "BAL",
+ "isNative": false,
+ "l1TokenAddress": "0xba100000625a3754423978a60c9317c58a424e3D"
+ },
+ {
+ "fromChain": 8453,
+ "toChain": 10,
+ "fromTokenAddress": "0x4158734D47Fc9692176B5085E0F52ee0Da5d47F1",
+ "fromSpokeAddress": "0x09aea4b2242abC8bb4BB78D537A67a245A7bEC64",
+ "fromTokenSymbol": "BAL",
+ "isNative": false,
+ "l1TokenAddress": "0xba100000625a3754423978a60c9317c58a424e3D"
+ },
+ {
+ "fromChain": 8453,
+ "toChain": 42161,
+ "fromTokenAddress": "0x4158734D47Fc9692176B5085E0F52ee0Da5d47F1",
+ "fromSpokeAddress": "0x09aea4b2242abC8bb4BB78D537A67a245A7bEC64",
+ "fromTokenSymbol": "BAL",
+ "isNative": false,
+ "l1TokenAddress": "0xba100000625a3754423978a60c9317c58a424e3D"
+ },
+ {
+ "fromChain": 8453,
+ "toChain": 137,
+ "fromTokenAddress": "0x4158734D47Fc9692176B5085E0F52ee0Da5d47F1",
+ "fromSpokeAddress": "0x09aea4b2242abC8bb4BB78D537A67a245A7bEC64",
+ "fromTokenSymbol": "BAL",
+ "isNative": false,
+ "l1TokenAddress": "0xba100000625a3754423978a60c9317c58a424e3D"
}
],
"pools": [
@@ -1708,5 +1780,9 @@
"tokenSymbol": "BOBA",
"isNative": false
}
- ]
+ ],
+ "spokePoolVerifier": {
+ "address": "0x269727F088F16E1Aea52Cf5a97B1CD41DAA3f02D",
+ "enabledChains": [1, 10, 137, 8453, 42161]
+ }
}
diff --git a/src/data/routes_5_0x0e2817C49698cc0874204AeDf7c72Be2Bb7fCD5d.json b/src/data/routes_5_0x0e2817C49698cc0874204AeDf7c72Be2Bb7fCD5d.json
index 5d03b2bdb..07bf401ba 100644
--- a/src/data/routes_5_0x0e2817C49698cc0874204AeDf7c72Be2Bb7fCD5d.json
+++ b/src/data/routes_5_0x0e2817C49698cc0874204AeDf7c72Be2Bb7fCD5d.json
@@ -63,5 +63,9 @@
"l1TokenAddress": "0x07865c6E87B9F70255377e024ace6630C1Eaa37F"
}
],
- "pools": []
+ "pools": [],
+ "spokePoolVerifier": {
+ "address": "0x269727F088F16E1Aea52Cf5a97B1CD41DAA3f02D",
+ "enabledChains": []
+ }
}
diff --git a/src/hooks/useDeposits.ts b/src/hooks/useDeposits.ts
index 16e1df8b3..96e1190d1 100644
--- a/src/hooks/useDeposits.ts
+++ b/src/hooks/useDeposits.ts
@@ -88,7 +88,9 @@ export function useUserDeposits(
// To provide a better UX, we take optimistically updated local pending deposits
// into account to show on the "My Transactions" page.
const localPendingUserDeposits = getLocalPendingDeposits().filter(
- (deposit) => deposit.depositorAddr === userAddress
+ (deposit) =>
+ deposit.depositorAddr === userAddress ||
+ deposit.recipientAddr === userAddress
);
const { deposits, pagination } = await getDeposits({
address: userAddress,
diff --git a/src/hooks/useWalletTrace.ts b/src/hooks/useWalletTrace.ts
index 95007e71a..89979fa20 100644
--- a/src/hooks/useWalletTrace.ts
+++ b/src/hooks/useWalletTrace.ts
@@ -52,7 +52,7 @@ export function useWalletChangeTrace() {
const { wallet } = useConnection();
useEffect(() => {
- if (!wallet) {
+ if (!wallet || !wallet.accounts.length) {
return;
}
@@ -68,5 +68,5 @@ export function useWalletChangeTrace() {
});
setPrevTrackedWallet(connectedWalletAddress);
- }, [wallet]);
+ }, [wallet, wallet?.accounts.length]);
}
diff --git a/src/onboard-override.css b/src/onboard-override.css
index c82320c89..36c27d65c 100644
--- a/src/onboard-override.css
+++ b/src/onboard-override.css
@@ -1,15 +1,8 @@
-
/* Override root variables to style the Onboard modal */
:root {
- --onboard-connect-header-background: #34353b;
- --onboard-connect-header-color: #e0f3ff;
- --onboard-connect-sidebar-color: #e0f3ff;
- --onboard-connect-sidebar-background: #2d2e33;
- --onboard-modal-background: #34353b;
- --onboard-wallet-button-background: var(--color-primary);
- --onboard-wallet-app-icon-border-color: none;
- --onboard-main-scroll-container-background: #34353b;
- --onboard-close-button-color:#2d2e33;
- --onboard-close-button-background:var(--color-primary);
- --onboard-font-family-normal: "Barlow";
+ --w3o-background-color: #2e2e34;
+ --w3o-foreground-color: #34353b;
+ --w3o-text-color: #e0f3ff;
+ --w3o-border-color: #3b3d43;
+ --w3o-font-family: Barlow;
}
diff --git a/src/utils/amplitude.ts b/src/utils/amplitude.ts
index f32a2e241..e400e3081 100644
--- a/src/utils/amplitude.ts
+++ b/src/utils/amplitude.ts
@@ -248,11 +248,11 @@ export function generateTransferQuote(
tokenInfo: TokenInfo,
fromChainInfo: ChainInfo,
toChainInfo: ChainInfo,
- toAddress: string,
- account: string,
tokenPrice: BigNumber,
estimatedTimeToRelayObject: ConfirmationDepositTimeType,
- amount: BigNumber
+ amount: BigNumber,
+ account?: string,
+ toAddress?: string
): TransferQuoteReceivedProperties {
// Create a function that converts a wei amount into a formatted token amount
const formatTokens = (wei: BigNumber) =>
@@ -285,20 +285,20 @@ export function generateTransferQuote(
fromChainId: selectedRoute.fromChain.toString(),
fromChainName: fromChainInfo.name,
isAmountTooLow: fees.isAmountTooLow,
- isSenderEqRecipient: toAddress === account,
+ isSenderEqRecipient: account && toAddress ? toAddress === account : false,
lpFeePct: formatWeiEtherPct(fees.lpFee.pct),
lpFeeTotal: formatTokens(fees.lpFee.total),
lpFeeTotalUsd: usdEquivalentString(fees.lpFee.total),
quoteLatencyMilliseconds: fees.quoteLatency.toString(),
- quoteTimestamp: String(fees.quoteTimestampInMs ?? Date.now()),
- recipient: toAddress,
+ quoteTimestamp: String(fees.quoteTimestamp),
+ recipient: toAddress || "not connected",
relayFeePct: formatWeiEtherPct(fees.relayerFee.pct),
relayFeeTotal: formatTokens(fees.relayerFee.total),
relayFeeTotalUsd: usdEquivalentString(fees.relayerFee.total),
relayGasFeePct: formatWeiEtherPct(fees.relayerGasFee.pct),
relayGasFeeTotal: formatTokens(fees.relayerGasFee.total),
relayGasFeeTotalUsd: usdEquivalentString(fees.relayerGasFee.total),
- sender: account,
+ sender: account || "not connected",
routeChainIdFromTo: `${fromChainInfo.chainId}-${toChainInfo.chainId}`,
routeChainNameFromTo: `${fromChainInfo.name}-${toChainInfo.name}`,
toAmount: formatTokens(amount.sub(totalBridgeFee)),
diff --git a/src/utils/bridge.ts b/src/utils/bridge.ts
index 84a395738..c6b669eaa 100644
--- a/src/utils/bridge.ts
+++ b/src/utils/bridge.ts
@@ -7,6 +7,7 @@ import { getProvider } from "./providers";
import { getConfig } from "utils";
import getApiEndpoint from "./serverless-api";
import { BridgeLimitInterface } from "./serverless-api/types";
+import { DepositNetworkMismatchProperties } from "ampli";
export type Fee = {
total: ethers.BigNumber;
@@ -175,17 +176,38 @@ export async function sendAcrossDeposit(
maxCount = ethers.constants.MaxUint256,
isNative,
referrer,
- }: AcrossDepositArgs
+ }: AcrossDepositArgs,
+ onNetworkMismatch?: (
+ mismatchProperties: DepositNetworkMismatchProperties
+ ) => void
): Promise {
const config = getConfig();
- const spokePool = config.getSpokePool(fromChain);
const provider = getProvider(fromChain);
- const code = await provider.getCode(spokePool.address);
- if (!code) {
+
+ const spokePool = config.getSpokePool(fromChain);
+ const spokePoolVerifier = config.getSpokePoolVerifier(fromChain);
+
+ // If the spoke pool verifier is enabled, use it for native transfers.
+ const shouldUseSpokePoolVerifier = Boolean(spokePoolVerifier) && isNative;
+
+ if (shouldUseSpokePoolVerifier) {
+ const spokePoolVerifierCode = await provider.getCode(
+ spokePoolVerifier!.address
+ );
+ if (!spokePoolVerifierCode || spokePoolVerifierCode === "0x") {
+ throw new Error(
+ `SpokePoolVerifier not deployed at ${spokePoolVerifier!.address}`
+ );
+ }
+ }
+
+ const spokePoolCode = await provider.getCode(spokePool.address);
+ if (!spokePoolCode || spokePoolCode === "0x") {
throw new Error(`SpokePool not deployed at ${spokePool.address}`);
}
+
const value = isNative ? amount : ethers.constants.Zero;
- const tx = await spokePool.populateTransaction.deposit(
+ const commonArgs = [
recipient,
tokenAddress,
amount,
@@ -194,8 +216,16 @@ export async function sendAcrossDeposit(
quoteTimestamp,
message,
maxCount,
- { value }
- );
+ { value },
+ ] as const;
+
+ const tx =
+ shouldUseSpokePoolVerifier && spokePoolVerifier
+ ? await spokePoolVerifier.populateTransaction.deposit(
+ spokePool.address,
+ ...commonArgs
+ )
+ : await spokePool.populateTransaction.deposit(...commonArgs);
// do not tag a referrer if data is not provided as a hex string.
tx.data =
@@ -203,6 +233,23 @@ export async function sendAcrossDeposit(
? tagAddress(tx.data!, referrer, referrerDelimiterHex)
: tx.data;
+ // Last test to ensure that the tx is valid and that the signer
+ // is connected to the correct chain.
+ // NOTE: I think this is a good candiate for using an RPC call
+ // to get the chainId of the signer.
+ const signerChainId = await signer.getChainId();
+ if (signerChainId !== fromChain) {
+ onNetworkMismatch?.({
+ signerAddress: await signer.getAddress(),
+ fromChainId: String(fromChain),
+ toChainId: String(destinationChainId),
+ signerChainId: String(signerChainId),
+ });
+ throw new Error(
+ "Signer is not connected to the correct chain. This may have happened in the background"
+ );
+ }
+
return signer.sendTransaction(tx);
}
diff --git a/src/utils/config.ts b/src/utils/config.ts
index 03d423623..370027e93 100644
--- a/src/utils/config.ts
+++ b/src/utils/config.ts
@@ -10,6 +10,8 @@ import {
HubPool__factory,
SpokePool,
SpokePool__factory,
+ SpokePoolVerifier,
+ SpokePoolVerifier__factory,
AcrossMerkleDistributor,
AcrossMerkleDistributor__factory,
AcceleratingDistributor,
@@ -34,6 +36,8 @@ export class ConfigClient {
public readonly spokeChains: Set = new Set();
public readonly fromChains: Set = new Set();
public readonly toChains: Set = new Set();
+ public readonly enabledChainsSpokePoolVerifier: Set = new Set();
+ public readonly spokePoolVerifierAddress: string = "";
public tokenOrder: Record = {};
public chainOrder: Record = {};
public routes: constants.Routes = [];
@@ -71,8 +75,11 @@ export class ConfigClient {
this.tokenOrder[route.fromTokenSymbol] + this.chainOrder[route.toChain]
);
});
- // prioritize routes based on token symbol and tochain. This just gives us better route prioritization when filtering a fromChain
this.pools = this.config.pools;
+ this.enabledChainsSpokePoolVerifier = new Set(
+ this.config.spokePoolVerifier.enabledChains || []
+ );
+ this.spokePoolVerifierAddress = this.config.spokePoolVerifier.address;
}
getWethAddress(): string {
return this.config.hubPoolWethAddress;
@@ -86,6 +93,9 @@ export class ConfigClient {
...constants.disabledChainIds,
...constants.disabledChainIdsForAvailableRoutes,
].includes(chainId.toString())
+ ) &&
+ !constants.disabledTokensForAvailableRoutes.some(
+ (s) => s.toUpperCase() === route.fromTokenSymbol.toUpperCase()
)
);
}
@@ -105,6 +115,25 @@ export class ConfigClient {
const provider = signer ?? providerUtils.getProvider(chainId);
return SpokePool__factory.connect(address, provider);
}
+ getSpokePoolVerifierAddress(chainId: constants.ChainId): string | undefined {
+ if (!this.enabledChainsSpokePoolVerifier.has(chainId)) {
+ return undefined;
+ }
+ return this.spokePoolVerifierAddress;
+ }
+ getSpokePoolVerifier(
+ chainId: constants.ChainId,
+ signer?: Signer
+ ): SpokePoolVerifier | undefined {
+ const address = this.getSpokePoolVerifierAddress(chainId);
+
+ if (!address) {
+ return undefined;
+ }
+
+ const provider = signer ?? providerUtils.getProvider(chainId);
+ return SpokePoolVerifier__factory.connect(address, provider);
+ }
getHubPoolChainId(): constants.ChainId {
return this.config.hubPoolChain;
}
diff --git a/src/utils/constants.ts b/src/utils/constants.ts
index 46fd3dab8..015fdd7a1 100644
--- a/src/utils/constants.ts
+++ b/src/utils/constants.ts
@@ -1,5 +1,5 @@
import assert from "assert";
-import { ethers, providers } from "ethers";
+import { BigNumber, ethers, providers } from "ethers";
import { utils } from "@across-protocol/sdk-v2";
import { CHAIN_IDs, TOKEN_SYMBOLS_MAP } from "@across-protocol/constants-v2";
import * as superstruct from "superstruct";
@@ -126,7 +126,7 @@ export type ChainInfoList = ChainInfo[];
export type ChainInfoTable = Record;
export const defaultBlockPollingInterval =
- Number(process.env.REACT_APP_DEFAULT_BLOCK_POLLING_INTERVAL_S || 30) * 1000;
+ Number(process.env.REACT_APP_DEFAULT_BLOCK_POLLING_INTERVAL_S || 15) * 1000;
export const hubPoolChainId = Number(
process.env.REACT_APP_HUBPOOL_CHAINID || 1
);
@@ -193,7 +193,7 @@ export const chainInfoList: ChainInfoList = [
"https://explorer.zksync.io"
),
nativeCurrencySymbol: "ETH",
- pollingInterval: defaultBlockPollingInterval,
+ pollingInterval: 10_000,
},
{
name: "Base",
@@ -204,7 +204,7 @@ export const chainInfoList: ChainInfoList = [
explorerUrl: "https://basescan.org",
constructExplorerLink: defaultConstructExplorerLink("https://basescan.org"),
nativeCurrencySymbol: "ETH",
- pollingInterval: defaultBlockPollingInterval,
+ pollingInterval: 10_000,
},
// testnets
{
@@ -376,9 +376,6 @@ export const tokenList = [
];
// process.env variables
-export const gasEstimationMultiplier = Number(
- process.env.REACT_APP_GAS_ESTIMATION_MULTIPLIER || 2
-);
export const rewardsApiUrl =
process.env.REACT_APP_REWARDS_API_URL || "https://api.across.to";
export const airdropWindowIndex = Number(
@@ -411,10 +408,6 @@ export const FEE_ESTIMATION = ".004";
export const MAX_RELAY_FEE_PERCENT = Number(
process.env.REACT_APP_MAX_RELAY_FEE_PERCENT || 50
);
-export const FLAT_RELAY_CAPITAL_FEE = process.env
- .REACT_APP_FLAT_RELAY_CAPITAL_FEE
- ? Number(process.env.REACT_APP_FLAT_RELAY_CAPITAL_FEE)
- : 0;
export const SHOW_ACX_NAV_TOKEN =
process.env.REACT_APP_SHOW_ACX_NAV_TOKEN === "true";
export const AddressZero = ethers.constants.AddressZero;
@@ -503,10 +496,15 @@ const PoolSS = superstruct.object({
tokenSymbol: superstruct.string(),
isNative: superstruct.boolean(),
});
+const SpokePoolVerifierSS = superstruct.object({
+ enabledChains: superstruct.array(superstruct.number()),
+ address: superstruct.string(),
+});
const PoolsSS = superstruct.array(PoolSS);
const RouteConfigSS = superstruct.type({
routes: RoutesSS,
pools: PoolsSS,
+ spokePoolVerifier: SpokePoolVerifierSS,
hubPoolWethAddress: superstruct.string(),
hubPoolChain: superstruct.number(),
hubPoolAddress: superstruct.string(),
@@ -520,6 +518,7 @@ export type Route = superstruct.Infer;
export type Routes = superstruct.Infer;
export type Pool = superstruct.Infer;
export type Pools = superstruct.Infer;
+export type SpokePoolVerifier = superstruct.Infer;
export function getRoutes(chainId: ChainId): RouteConfig {
if (chainId === ChainId.MAINNET) {
superstruct.assert(MainnetRoutes, RouteConfigSS);
@@ -637,9 +636,10 @@ export const rewardTiers = [
export const secondsPerYear = 31557600;
export const secondsPerDay = 86400; // 60 sec/min * 60 min/hr * 24 hr/day
-export const gasMultiplier = process.env.REACT_APP_GAS_ESTIMATION_MULTIPLIER
- ? Number(process.env.REACT_APP_GAS_ESTIMATION_MULTIPLIER)
- : undefined;
+export const gasMultiplierPerChain: Record = process.env
+ .REACT_APP_GAS_ESTIMATION_MULTIPLIER_PER_CHAIN
+ ? JSON.parse(process.env.REACT_APP_GAS_ESTIMATION_MULTIPLIER_PER_CHAIN)
+ : {};
export const suggestedFeesDeviationBufferMultiplier = !Number.isNaN(
Number(
@@ -689,6 +689,13 @@ export const disabledChainIdsForAvailableRoutes = (
process.env.REACT_APP_DISABLED_CHAINS_FOR_AVAILABLE_ROUTES || ""
).split(",");
+export const disabledTokensForAvailableRoutes = (
+ process.env.REACT_APP_DISABLED_TOKENS_FOR_AVAILABLE_ROUTES || ""
+).split(",");
+
export const walletBlacklist = (process.env.REACT_APP_WALLET_BLACKLIST || "")
.split(",")
.map((address) => address.toLowerCase());
+
+// Pre-computed gas expenditure for deposits used for estimations
+export const gasExpenditureDeposit = BigNumber.from(90_000);
diff --git a/src/utils/onboard.ts b/src/utils/onboard.ts
index 5e8183270..845a79f2c 100644
--- a/src/utils/onboard.ts
+++ b/src/utils/onboard.ts
@@ -10,7 +10,7 @@ import {
chainInfoList,
providerUrlsTable,
} from "utils";
-import logo from "assets/across-logo-v2.svg";
+import logo from "assets/across.svg";
const injected = injectedModule();
const gnosis = gnosisModule();
diff --git a/src/utils/transactions.ts b/src/utils/transactions.ts
index 456c29a0a..23a28456d 100644
--- a/src/utils/transactions.ts
+++ b/src/utils/transactions.ts
@@ -1,6 +1,10 @@
import { Contract, ContractTransaction, ethers } from "ethers";
import { parseEther } from "ethers/lib/utils";
-import { fixedPointAdjustment, gasMultiplier } from "./constants";
+import {
+ fixedPointAdjustment,
+ gasMultiplierPerChain,
+ hubPoolChainId,
+} from "./constants";
/**
* This function takes a raw transaction and a signer and returns the result of signing the transaction.
@@ -26,34 +30,53 @@ export async function sendSignedTransaction(
type Transaction = Promise;
+export async function getPaddedGasEstimation(
+ chainId: number,
+ contract: Contract,
+ method: string,
+ ...args: any[]
+) {
+ const gasMultiplier = gasMultiplierPerChain[chainId];
+ /* If the gas multiplier hasn't been set, run this function as a normal tx */
+ if (!gasMultiplier) {
+ return contract.estimateGas[method](...args);
+ } else {
+ // Estimate the gas with the provided estimateGas logic
+ const gasEstimation = await contract.estimateGas[method](...args);
+ // Factor in the padding
+ const gasToRecommend = gasEstimation
+ .mul(parseEther(String(gasMultiplier)))
+ .div(fixedPointAdjustment);
+ return gasToRecommend;
+ }
+}
+
/**
* Pads the gas estimation by a fixed amount dictated in the `REACT_SEND_TXN_GAS_ESTIMATION_MULTIPLIER` env var
* @param contract The contract that this transaction will originate from
* @param method The specific call method
* @returns A completed or failed transaction
*/
-export function sendWithPaddedGas(contract: Contract, method: string) {
+export function sendWithPaddedGas(
+ contract: Contract,
+ method: string,
+ chainId: number = hubPoolChainId
+) {
/**
* Executes a given smart contract method with padded gas.
* @param args The arguments to supply this smart contract call
* @returns A contract transaction result.
*/
const fn = async (...args: any[]): Transaction => {
- /* If the gas multiplier hasn't been set, run this function as a normal tx */
- if (!gasMultiplier) {
- return contract[method](...args) as Promise;
- } else {
- // Estimate the gas with the provided estimateGas logic
- const gasEstimation = await contract.estimateGas[method](...args);
- // Factor in the padding
- const gasToRecommend = gasEstimation
- .mul(parseEther(String(gasMultiplier)))
- .div(fixedPointAdjustment);
- // Call the tx with the padded gas
- return contract[method](...args, {
- gasLimit: gasToRecommend,
- });
- }
+ const gasToRecommend = await getPaddedGasEstimation(
+ chainId,
+ contract,
+ method,
+ ...args
+ );
+ return contract[method](...args, {
+ gasLimit: gasToRecommend,
+ });
};
return fn;
}
diff --git a/src/utils/typechain.ts b/src/utils/typechain.ts
index 7a3f74238..2dce307b8 100644
--- a/src/utils/typechain.ts
+++ b/src/utils/typechain.ts
@@ -6,6 +6,7 @@
export { AcrossMerkleDistributor__factory } from "@across-protocol/contracts-v2/dist/typechain/factories/contracts/merkle-distributor/AcrossMerkleDistributor__factory";
export { HubPool__factory } from "@across-protocol/contracts-v2/dist/typechain/factories/contracts/HubPool__factory";
export { SpokePool__factory } from "@across-protocol/contracts-v2/dist/typechain/factories/contracts/SpokePool.sol/SpokePool__factory";
+export { SpokePoolVerifier__factory } from "@across-protocol/contracts-v2/dist/typechain/factories/contracts/SpokePoolVerifier__factory";
export { ERC20__factory } from "@across-protocol/contracts-v2/dist/typechain/factories/@openzeppelin/contracts/token/ERC20/ERC20__factory";
export { AcceleratingDistributor__factory } from "@across-protocol/across-token/dist/typechain/factories/AcceleratingDistributor__factory";
export { ClaimAndStake__factory } from "@across-protocol/across-token/dist/typechain/factories/ClaimAndStake__factory";
@@ -13,6 +14,7 @@ export { ClaimAndStake__factory } from "@across-protocol/across-token/dist/typec
export type { AcrossMerkleDistributor } from "@across-protocol/contracts-v2/dist/typechain/contracts/merkle-distributor/AcrossMerkleDistributor";
export type { HubPool } from "@across-protocol/contracts-v2/dist/typechain/contracts/HubPool";
export type { SpokePool } from "@across-protocol/contracts-v2/dist/typechain/contracts/SpokePool.sol/SpokePool";
+export type { SpokePoolVerifier } from "@across-protocol/contracts-v2/dist/typechain/contracts/SpokePoolVerifier";
export type { AcceleratingDistributor } from "@across-protocol/across-token/dist/typechain/AcceleratingDistributor";
export type { ClaimAndStake } from "@across-protocol/across-token/dist/typechain/ClaimAndStake";
export type {
diff --git a/src/views/Bridge/Bridge.tsx b/src/views/Bridge/Bridge.tsx
index e9676bb7b..1feb8cab6 100644
--- a/src/views/Bridge/Bridge.tsx
+++ b/src/views/Bridge/Bridge.tsx
@@ -33,6 +33,8 @@ const Bridge = () => {
handleClickNewTx,
explorerUrl,
transactionElapsedTimeAsFormattedString,
+ isCurrentTokenMaxApyLoading,
+ currentTokenMaxApy,
handleChangeAmountInput,
handleClickMaxBalance,
handleSelectToken,
@@ -68,6 +70,8 @@ const Bridge = () => {
explorerLink={explorerUrl}
elapsedTimeFromDeposit={transactionElapsedTimeAsFormattedString}
toAccount={toAccount}
+ currentTokenMaxApy={currentTokenMaxApy}
+ isCurrentTokenMaxApyLoading={isCurrentTokenMaxApyLoading}
/>
) : (
{
const explorerLink = _explorerLink ?? "https://etherscan.io";
+ const history = useHistory();
+ const { addToAmpliQueue } = useAmplitude();
+
return (
@@ -115,6 +128,41 @@ const DepositConfirmation = ({
)}
+
+ {
+ const tokenSymbol = ["USDC.e", "USDbC"].includes(currentToken)
+ ? "USDC"
+ : currentToken;
+ history.push(`/pool?symbol=${tokenSymbol.toLowerCase()}`);
+ addToAmpliQueue(() => {
+ ampli.earnByAddingLiquidityClicked({
+ action: "onClick",
+ element: "earnByAddingLiquidityAndStakingLink",
+ page: "bridgePage",
+ section: "depositConfirmation",
+ });
+ });
+ }}
+ >
+
+
+
+
+
+ Earn{" "}
+
+ {currentTokenMaxApy ? formatWeiPct(currentTokenMaxApy, 3) : "-"}
+ %
+ {" "}
+ by adding liquidity and staking
+
+
+
+
+
+
@@ -125,7 +173,20 @@ const DepositConfirmation = ({
Transactions page
-
+ {
+ addToAmpliQueue(() => {
+ ampli.monitorDepositProgressClicked({
+ action: "onClick",
+ element: "monitorDepositProgressLink",
+ page: "bridgePage",
+ section: "depositConfirmation",
+ });
+ });
+ }}
+ >
@@ -141,6 +202,16 @@ const DepositConfirmation = ({
{
+ addToAmpliQueue(() => {
+ ampli.trackInExplorerClicked({
+ action: "onClick",
+ element: "trackInExplorerLink",
+ page: "bridgePage",
+ section: "depositConfirmation",
+ });
+ });
+ }}
>
@@ -312,7 +383,7 @@ const ActionCardContainer = styled.div`
}
`;
-const ActionCard = styled.div`
+const ActionCard = styled.div<{ isClickable?: boolean }>`
display: flex;
flex-direction: row;
justify-content: space-between;
@@ -326,6 +397,8 @@ const ActionCard = styled.div`
background: #3e4047;
border: 1px solid #4c4e57;
border-radius: 8px;
+
+ cursor: ${({ isClickable }) => (isClickable ? "pointer" : "default")};
`;
const ActionCardTitleWrapper = styled.div`
@@ -406,3 +479,15 @@ const AnimatedLogo = styled.div<{
}
}
`;
+
+const LPInfoIconContainer = styled.div`
+ margin-left: -16px;
+ margin-top: 16px;
+`;
+
+const LPInfoIconAndTextWrapper = styled.div`
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ gap: 8px;
+`;
diff --git a/src/views/Bridge/hooks/useAmountInput.ts b/src/views/Bridge/hooks/useAmountInput.ts
index 73dccce7c..72b46d2a7 100644
--- a/src/views/Bridge/hooks/useAmountInput.ts
+++ b/src/views/Bridge/hooks/useAmountInput.ts
@@ -9,6 +9,7 @@ import {
validateBridgeAmount,
areTokensInterchangeable,
} from "../utils";
+import { useMaxBalance } from "./useMaxBalance";
export function useAmountInput(selectedRoute: Route) {
const [userAmountInput, setUserAmountInput] = useState("");
@@ -25,19 +26,21 @@ export function useAmountInput(selectedRoute: Route) {
selectedRoute.fromChain
);
+ const { data: maxBalance } = useMaxBalance(selectedRoute);
+
const token = getConfig().getTokenInfoBySymbol(
selectedRoute.fromChain,
selectedRoute.fromTokenSymbol
);
const handleClickMaxBalance = useCallback(() => {
- if (balance) {
- setUserAmountInput(utils.formatUnits(balance, token.decimals));
+ if (maxBalance) {
+ setUserAmountInput(utils.formatUnits(maxBalance, token.decimals));
addToAmpliQueue(() => {
trackMaxButtonClicked("bridgeForm");
});
}
- }, [balance, token.decimals, addToAmpliQueue]);
+ }, [maxBalance, token.decimals, addToAmpliQueue]);
const handleChangeAmountInput = useCallback((changedInput: string) => {
setUserAmountInput(changedInput);
@@ -78,13 +81,14 @@ export function useAmountInput(selectedRoute: Route) {
userAmountInput,
parsedAmount,
balance,
+ maxBalance,
};
}
export function useValidAmount(
parsedAmount?: BigNumber,
isAmountTooLow?: boolean,
- currentBalance?: BigNumber,
+ maxBalance?: BigNumber,
maxDeposit?: BigNumber
) {
const [validationError, setValidationError] = useState<
@@ -95,11 +99,11 @@ export function useValidAmount(
const { error } = validateBridgeAmount(
parsedAmount,
isAmountTooLow,
- currentBalance,
+ maxBalance,
maxDeposit
);
setValidationError(error);
- }, [parsedAmount, isAmountTooLow, currentBalance, maxDeposit]);
+ }, [parsedAmount, isAmountTooLow, maxBalance, maxDeposit]);
return {
amountValidationError: validationError,
diff --git a/src/views/Bridge/hooks/useBridge.ts b/src/views/Bridge/hooks/useBridge.ts
index f5bce8367..e82d03787 100644
--- a/src/views/Bridge/hooks/useBridge.ts
+++ b/src/views/Bridge/hooks/useBridge.ts
@@ -1,8 +1,10 @@
-import { BigNumber } from "ethers";
import { useCallback, useEffect, useState } from "react";
+import { utils } from "@across-protocol/sdk-v2";
-import { useConnection, useIsWrongNetwork } from "hooks";
+import { useConnection, useIsWrongNetwork, useAmplitude } from "hooks";
import useReferrer from "hooks/useReferrer";
+import { useStakingPool } from "hooks/useStakingPool";
+import { ampli } from "ampli";
import { useBridgeAction } from "./useBridgeAction";
import { useBridgeDepositTracking } from "./useBridgeDepositTracking";
@@ -13,11 +15,15 @@ import { useAmountInput, useValidAmount } from "./useAmountInput";
export function useBridge() {
const [shouldUpdateQuote, setShouldUpdateQuote] = useState(true);
+ const [usedTransferQuote, setUsedTransferQuote] =
+ useState["data"]>();
const { isConnected, chainId: walletChainId, account } = useConnection();
const { referrer } = useReferrer();
+ const { addToAmpliQueue } = useAmplitude();
+
const {
selectedRoute,
handleQuickSwap,
@@ -35,6 +41,9 @@ export function useBridge() {
handleTransactionCompleted,
} = useBridgeDepositTracking();
+ const { data: selectedRoutePool, isLoading: isSelectedRoutePoolLoading } =
+ useStakingPool(selectedRoute.l1TokenAddress);
+
const {
handleChangeAmountInput,
handleClickMaxBalance,
@@ -42,30 +51,31 @@ export function useBridge() {
userAmountInput,
parsedAmount,
balance,
+ maxBalance,
} = useAmountInput(selectedRoute);
const { toAccount, setCustomToAddress } = useToAccount(selectedRoute.toChain);
+ const { data: transferQuote, isLoading: isQuoteLoading } = useTransferQuote(
+ selectedRoute,
+ parsedAmount?.gt(0) ? parsedAmount : utils.bnZero,
+ account,
+ toAccount?.address
+ );
+
const {
- estimatedTime,
quote,
- initialQuoteTime,
+ quotePriceUSD,
quotedFees,
quotedLimits,
- quotePriceUSD,
- isQuoteLoading,
- } = useTransferQuote(
- selectedRoute,
- parsedAmount?.gt(0) ? parsedAmount : BigNumber.from(0),
- account,
- toAccount?.address,
- shouldUpdateQuote
- );
+ initialQuoteTime,
+ estimatedTime,
+ } = usedTransferQuote || {};
const { amountValidationError, isAmountValid } = useValidAmount(
parsedAmount,
quotedFees?.isAmountTooLow,
- balance,
+ maxBalance,
quotedLimits?.maxDeposit
);
@@ -102,6 +112,18 @@ export function useBridge() {
checkWrongNetworkHandler();
}, [selectedRoute.fromChain, isConnected, checkWrongNetworkHandler]);
+ useEffect(() => {
+ if (shouldUpdateQuote && !isQuoteLoading) {
+ setUsedTransferQuote(transferQuote);
+
+ if (transferQuote?.quote) {
+ addToAmpliQueue(() => {
+ ampli.transferQuoteReceived(transferQuote?.quote);
+ });
+ }
+ }
+ }, [transferQuote, shouldUpdateQuote, isQuoteLoading, addToAmpliQueue]);
+
useEffect(() => {
if (
shouldUpdateQuote &&
@@ -157,5 +179,7 @@ export function useBridge() {
handleSelectFromChain,
handleSelectToChain,
handleSelectToken,
+ isCurrentTokenMaxApyLoading: isSelectedRoutePoolLoading,
+ currentTokenMaxApy: selectedRoutePool?.apyData.maxApy,
};
}
diff --git a/src/views/Bridge/hooks/useBridgeAction.ts b/src/views/Bridge/hooks/useBridgeAction.ts
index edac8ce0a..0123fde52 100644
--- a/src/views/Bridge/hooks/useBridgeAction.ts
+++ b/src/views/Bridge/hooks/useBridgeAction.ts
@@ -67,7 +67,7 @@ export function useBridgeAction(
!frozenTokenPrice ||
!tokenSymbol
) {
- return;
+ throw new Error("Missing required data for bridge action");
}
if (isWrongNetwork) {
@@ -98,7 +98,15 @@ export function useBridgeAction(
});
const timeSubmitted = Date.now();
- tx = await sendAcrossDeposit(signer, frozenPayload);
+ tx = await sendAcrossDeposit(
+ signer,
+ frozenPayload,
+ (networkMismatchProperties) => {
+ addToAmpliQueue(() => {
+ ampli.depositNetworkMismatch(networkMismatchProperties);
+ });
+ }
+ );
try {
// Instrument amplitude after signing the transaction for the submit button.
diff --git a/src/views/Bridge/hooks/useMaxBalance.ts b/src/views/Bridge/hooks/useMaxBalance.ts
new file mode 100644
index 000000000..9a1b9eb2c
--- /dev/null
+++ b/src/views/Bridge/hooks/useMaxBalance.ts
@@ -0,0 +1,60 @@
+import { useQuery } from "react-query";
+import { BigNumber, constants } from "ethers";
+
+import { useBalanceBySymbol, useConnection } from "hooks";
+import {
+ Route,
+ max,
+ getProvider,
+ gasExpenditureDeposit,
+ gasMultiplierPerChain,
+} from "utils";
+
+export function useMaxBalance(selectedRoute: Route) {
+ const { balance } = useBalanceBySymbol(
+ selectedRoute.fromTokenSymbol,
+ selectedRoute.fromChain
+ );
+ const { account, signer } = useConnection();
+
+ return useQuery(
+ [
+ "max-balance",
+ selectedRoute.fromTokenSymbol,
+ selectedRoute.fromChain,
+ account,
+ ],
+ async () => {
+ let maxBridgeAmount: BigNumber;
+
+ if (account && balance && signer) {
+ maxBridgeAmount =
+ selectedRoute.fromTokenSymbol !== "ETH"
+ ? balance
+ : // For ETH, we need to take the gas costs into account before setting the max. bridgable amount
+ await estimateGasCostsForDeposit(selectedRoute).then(
+ (estimatedGasCosts) => max(balance.sub(estimatedGasCosts), 0)
+ );
+ } else {
+ maxBridgeAmount = constants.Zero;
+ }
+
+ return maxBridgeAmount;
+ },
+ {
+ enabled: Boolean(account && balance && signer),
+ retry: true,
+ }
+ );
+}
+
+/**
+ * Estimated gas costs for a deposit with an empty message.
+ * This is used to calculate the maximum amount of ETH that can be bridged.
+ */
+async function estimateGasCostsForDeposit(selectedRoute: Route) {
+ const provider = getProvider(selectedRoute.fromChain);
+ const gasPrice = await provider.getGasPrice();
+ const gasMultiplier = gasMultiplierPerChain[selectedRoute.fromChain] || 3;
+ return gasPrice.mul(gasMultiplier).mul(gasExpenditureDeposit);
+}
diff --git a/src/views/Bridge/hooks/useTransferQuote.ts b/src/views/Bridge/hooks/useTransferQuote.ts
index 8149b6f35..be997a2e3 100644
--- a/src/views/Bridge/hooks/useTransferQuote.ts
+++ b/src/views/Bridge/hooks/useTransferQuote.ts
@@ -1,45 +1,26 @@
-import { useEffect, useState } from "react";
+import { useState } from "react";
import { BigNumber } from "ethers";
+import { useQuery } from "react-query";
import {
- GetBridgeFeesResult,
getToken,
getChainInfo,
generateTransferQuote,
- ConfirmationDepositTimeType,
getConfirmationDepositTime,
Route,
} from "utils";
-import { BridgeLimitInterface } from "utils/serverless-api/types";
-import { useAmplitude, useBridgeFees, useBridgeLimits } from "hooks";
+import { useBridgeFees, useBridgeLimits } from "hooks";
import { useCoingeckoPrice } from "hooks/useCoingeckoPrice";
-import { ampli, TransferQuoteReceivedProperties } from "ampli";
export function useTransferQuote(
selectedRoute: Route,
amountToBridge: BigNumber,
fromAddress?: string,
- toAddress?: string,
- shouldUpdateQuote?: boolean
+ toAddress?: string
) {
- const [quotedFees, setQuotedFees] = useState<
- GetBridgeFeesResult | undefined
- >();
- const [quotedLimits, setQuotedLimits] = useState<
- BridgeLimitInterface | undefined
- >();
- const [quotePriceUSD, setQuotedPriceUSD] = useState();
- const [quote, setQuote] = useState<
- TransferQuoteReceivedProperties | undefined
- >();
const [initialQuoteTime, setInitialQuoteTime] = useState<
number | undefined
>();
- const [estimatedTime, setEstimatedTime] = useState<
- ConfirmationDepositTimeType | undefined
- >();
-
- const { addToAmpliQueue } = useAmplitude();
const feesQuery = useBridgeFees(
amountToBridge,
@@ -54,91 +35,71 @@ export function useTransferQuote(
);
const usdPriceQuery = useCoingeckoPrice(selectedRoute.l1TokenAddress, "usd");
- useEffect(() => {
- if (shouldUpdateQuote || !quotedFees) {
- setQuotedFees(feesQuery.fees);
- }
- if (shouldUpdateQuote || !quotedLimits) {
- setQuotedLimits(limitsQuery.limits);
- }
- if (shouldUpdateQuote || !quotePriceUSD) {
- setQuotedPriceUSD(usdPriceQuery.data?.price);
- }
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [
- feesQuery.fees,
- limitsQuery.limits,
- usdPriceQuery.data,
- shouldUpdateQuote,
- ]);
+ return useQuery({
+ queryKey: [
+ "quote",
+ feesQuery.fees?.quoteBlock.toString(),
+ selectedRoute.fromChain,
+ selectedRoute.toChain,
+ selectedRoute.fromTokenSymbol,
+ amountToBridge.toString(),
+ ],
+ enabled: Boolean(
+ feesQuery.fees && limitsQuery.limits && usdPriceQuery.data?.price
+ ),
+ queryFn: async () => {
+ if (
+ !feesQuery.fees ||
+ !limitsQuery.limits ||
+ !usdPriceQuery.data?.price ||
+ amountToBridge.lte(0)
+ ) {
+ return {
+ estimatedTime: undefined,
+ quote: undefined,
+ initialQuoteTime: undefined,
+ quotedFees: undefined,
+ quotedLimits: undefined,
+ quotePriceUSD: undefined,
+ };
+ }
- useEffect(() => {
- if (quotedLimits && amountToBridge.gt(0)) {
- setEstimatedTime(
- getConfirmationDepositTime(
- amountToBridge,
- quotedLimits,
- selectedRoute.toChain,
- selectedRoute.fromChain
- )
- );
- }
- }, [
- amountToBridge,
- quotedLimits,
- selectedRoute.fromChain,
- selectedRoute.toChain,
- ]);
-
- useEffect(() => {
- if (
- quotedFees &&
- fromAddress &&
- toAddress &&
- usdPriceQuery?.data?.price &&
- estimatedTime &&
- amountToBridge
- ) {
const tokenInfo = getToken(selectedRoute.fromTokenSymbol);
const fromChainInfo = getChainInfo(selectedRoute.fromChain);
const toChainInfo = getChainInfo(selectedRoute.toChain);
+ const estimatedTime = getConfirmationDepositTime(
+ amountToBridge,
+ limitsQuery.limits,
+ selectedRoute.toChain,
+ selectedRoute.fromChain
+ );
const quote = generateTransferQuote(
- quotedFees,
+ feesQuery.fees,
selectedRoute,
tokenInfo,
fromChainInfo,
toChainInfo,
- toAddress,
- fromAddress,
usdPriceQuery.data.price,
estimatedTime,
- amountToBridge
+ amountToBridge,
+ fromAddress,
+ toAddress
);
- addToAmpliQueue(() => {
- ampli.transferQuoteReceived(quote);
- });
- setQuote(quote);
- setInitialQuoteTime((s) => s ?? Date.now());
- }
- }, [
- quotedFees,
- selectedRoute,
- amountToBridge,
- fromAddress,
- toAddress,
- usdPriceQuery?.data?.price,
- estimatedTime,
- addToAmpliQueue,
- ]);
- return {
- estimatedTime,
- quote,
- initialQuoteTime,
- quotedFees,
- quotedLimits,
- quotePriceUSD,
- isQuoteLoading:
- feesQuery.isLoading || limitsQuery.isLoading || usdPriceQuery.isLoading,
- };
+ let initialQuoteTimeToUse = initialQuoteTime || Date.now();
+
+ if (!initialQuoteTime) {
+ setInitialQuoteTime((s) => s ?? initialQuoteTimeToUse);
+ }
+
+ return {
+ estimatedTime,
+ quote,
+ initialQuoteTime: initialQuoteTimeToUse,
+ quotedFees: feesQuery.fees,
+ quotedLimits: limitsQuery.limits,
+ quotePriceUSD: usdPriceQuery.data.price,
+ };
+ },
+ });
}
diff --git a/src/views/Splash/Splash.styles.tsx b/src/views/Splash/Splash.styles.tsx
index 72ae4f3ab..9b563d75e 100644
--- a/src/views/Splash/Splash.styles.tsx
+++ b/src/views/Splash/Splash.styles.tsx
@@ -3,6 +3,7 @@ import { Text } from "components/Text";
import { Link } from "react-router-dom";
import { QUERIESV2 } from "utils";
import BGMesh from "assets/splash-mesh-bg.svg";
+import BGMeshMobile from "assets/splash-mesh-bg-mobile.png";
export const ExternalWrapper = styled.div`
background: url(${BGMesh});
@@ -12,6 +13,8 @@ export const ExternalWrapper = styled.div`
padding-top: 72px;
@media ${QUERIESV2.sm.andDown} {
+ background: url(${BGMeshMobile});
+
margin-top: -64px;
padding-top: 64px;
}
diff --git a/src/views/Transactions/utils.ts b/src/views/Transactions/utils.ts
index 0ac2485a3..c739292a3 100644
--- a/src/views/Transactions/utils.ts
+++ b/src/views/Transactions/utils.ts
@@ -3,6 +3,7 @@ import {
getConfig,
disabledChainIds,
disabledChainIdsForAvailableRoutes,
+ disabledTokensForAvailableRoutes,
} from "utils";
import { SupportedTxTuple } from "./types";
@@ -20,6 +21,10 @@ export function getSupportedTxTuples(
[...disabledChainIds, ...disabledChainIdsForAvailableRoutes].includes(
String(chainId)
)
+ ) ||
+ // Do not show transactions for disabled tokens
+ disabledTokensForAvailableRoutes.includes(
+ config.getTokenInfoByAddress(tx.sourceChainId, tx.assetAddr).symbol
)
) {
return supported;
diff --git a/yarn.lock b/yarn.lock
index 630f8114f..efa79fb05 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -22,11 +22,10 @@
integrity sha512-Nzl8Z1rZFvcpuKQu7CmBVfvgB13/NoulcsRVYBSkG90imS/e6mugxzqD9UrUb+WOL0ODMCANCAoDw54ZBBzNiQ==
"@across-protocol/contracts-v2@^2.4.4":
- version "2.4.6"
- resolved "https://registry.yarnpkg.com/@across-protocol/contracts-v2/-/contracts-v2-2.4.6.tgz#a87987a25fa30010387af1f9739b229953944e33"
- integrity sha512-gIu/LC8c3c51A5XPwmmyPIbTY1z3dzBk+9P8HrdwFeFB7np9vl5GgUzkRyJoihHaeZCYP+Kj3eEy11Min+LbPA==
+ version "2.4.4"
+ resolved "https://registry.yarnpkg.com/@across-protocol/contracts-v2/-/contracts-v2-2.4.4.tgz#face03ecb7c9f3c2e3171996eb4af432a718dcef"
+ integrity sha512-6HVAXhff9GhIny0XfXQYHbaply+sTG/hffaoN+/qygoX59wOduNdokjicV095tDOgVqoVEFpI8m3P/fMM08bcw==
dependencies:
- "@across-protocol/constants-v2" "^1.0.4"
"@defi-wonderland/smock" "^2.3.4"
"@eth-optimism/contracts" "^0.5.40"
"@ethersproject/abstract-provider" "5.7.0"
@@ -68,6 +67,11 @@
superstruct "^0.15.4"
tslib "^2.6.2"
+"@adraffy/ens-normalize@1.9.4":
+ version "1.9.4"
+ resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.9.4.tgz#aae21cb858bbb0411949d5b7b3051f4209043f62"
+ integrity sha512-UK0bHA7hh9cR39V+4gl2/NnBBjoXIxkuWAPCaY4X7fbH4L/azIi7ilWOCjMUYfpJgraLUAqkRi2BqrjME8Rynw==
+
"@amplitude/ampli@^1.27.1":
version "1.27.1"
resolved "https://registry.yarnpkg.com/@amplitude/ampli/-/ampli-1.27.1.tgz#bc6fdac5c1fa8fd70c8cf3398622180bbd6fb282"
@@ -2687,10 +2691,10 @@
exec-sh "^0.3.2"
minimist "^1.2.0"
-"@coinbase/wallet-sdk@^3.6.0":
- version "3.7.1"
- resolved "https://registry.yarnpkg.com/@coinbase/wallet-sdk/-/wallet-sdk-3.7.1.tgz#44b3b7a925ff5cc974e4cbf7a44199ffdcf03541"
- integrity sha512-LjyoDCB+7p0waQXfK+fUgcAs3Ezk6S6e+LYaoFjpJ6c9VTop3NyZF40Pi7df4z7QJohCwzuIDjz0Rhtig6Y7Pg==
+"@coinbase/wallet-sdk@^3.7.1":
+ version "3.7.2"
+ resolved "https://registry.yarnpkg.com/@coinbase/wallet-sdk/-/wallet-sdk-3.7.2.tgz#7a89bd9e3a06a1f26d4480d8642af33fb0c7e3aa"
+ integrity sha512-lIGvXMsgpsQWci/XOMQIJ2nIZ8JUy/L+bvC0wkRaYarr0YylwpXrJ2gRM3hCXPS477pkyO7N/kSiAoRgEXUdJQ==
dependencies:
"@metamask/safe-event-emitter" "2.0.0"
"@solana/web3.js" "^1.70.1"
@@ -4548,42 +4552,11 @@
resolved "https://registry.yarnpkg.com/@gnosis.pm/mock-contract/-/mock-contract-4.0.0.tgz#eaf500fddcab81b5f6c22280a7b22ff891dd6f87"
integrity sha512-SkRq2KwPx6vo0LAjSc8JhgQstrQFXRyn2yqquIfub7r2WHi5nUbF8beeSSXsd36hvBcQxQfmOIYNYRpj9JOhrQ==
-"@gnosis.pm/safe-apps-provider@^0.9.2":
- version "0.9.3"
- resolved "https://registry.yarnpkg.com/@gnosis.pm/safe-apps-provider/-/safe-apps-provider-0.9.3.tgz#d8913b0f8abc15fdca229571eefc5f9385c82ea7"
- integrity sha512-WzsfEMrOTd7/epEKs7S0QBB+sgw25d1B4SeLCD7q9RYi0vYLaeWT3jTuVXVGqwAlT3tFyedmvXnryLV5SUwiug==
- dependencies:
- "@gnosis.pm/safe-apps-sdk" "6.2.0"
- events "^3.3.0"
-
-"@gnosis.pm/safe-apps-sdk@6.2.0":
- version "6.2.0"
- resolved "https://registry.yarnpkg.com/@gnosis.pm/safe-apps-sdk/-/safe-apps-sdk-6.2.0.tgz#05751b4ae4c6cfa7e19839d3655e7d9b5fb72dfe"
- integrity sha512-dOpVBlu+Nv7bOrOl9llTeRriEpdUnnbXEM/RgTkS1v8Q2swT6+M+WIKTuKB/cadFXbjUsBD/nd3IsihHP24b5g==
- dependencies:
- "@gnosis.pm/safe-react-gateway-sdk" "^2.5.6"
- ethers "^5.4.7"
-
-"@gnosis.pm/safe-apps-sdk@^6.1.1":
- version "6.3.0"
- resolved "https://registry.yarnpkg.com/@gnosis.pm/safe-apps-sdk/-/safe-apps-sdk-6.3.0.tgz#19f8bff136bdfdf9003745e4202e1cb85322e493"
- integrity sha512-atUiUj1JEGnZwxDrKbuxfkwPsNQtoxnQqNjvB9cVODxSdR9OiLy5XdW2wz3Y/Gq+sjWc6lAUy3M5ovTY7qmbrg==
- dependencies:
- "@gnosis.pm/safe-react-gateway-sdk" "^2.8.5"
- ethers "^5.4.7"
-
"@gnosis.pm/safe-contracts@1.3.0", "@gnosis.pm/safe-contracts@^1.3.0":
version "1.3.0"
resolved "https://registry.yarnpkg.com/@gnosis.pm/safe-contracts/-/safe-contracts-1.3.0.tgz#316741a7690d8751a1f701538cfc9ec80866eedc"
integrity sha512-1p+1HwGvxGUVzVkFjNzglwHrLNA67U/axP0Ct85FzzH8yhGJb4t9jDjPYocVMzLorDoWAfKicGy1akPY9jXRVw==
-"@gnosis.pm/safe-react-gateway-sdk@^2.5.6", "@gnosis.pm/safe-react-gateway-sdk@^2.8.5":
- version "2.10.3"
- resolved "https://registry.yarnpkg.com/@gnosis.pm/safe-react-gateway-sdk/-/safe-react-gateway-sdk-2.10.3.tgz#4537442a78eb0508c483aabcac19296335a77ac3"
- integrity sha512-ukaLACozdJQb2YGSAZgBUkF4CT9iKVjpnKFCKUnGGghXqp+Yyn9jpdcfFK0VYQJ6ZSwAm40tHtQaN3K9817Bcg==
- dependencies:
- cross-fetch "^3.1.5"
-
"@gnosis.pm/zodiac@3.2.0":
version "3.2.0"
resolved "https://registry.yarnpkg.com/@gnosis.pm/zodiac/-/zodiac-3.2.0.tgz#4cc59023332076ede901cb39563a09b8c5625568"
@@ -5364,6 +5337,13 @@
resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz#ea6d23ade78a325f7a52750aab1526b02b628c29"
integrity sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg==
+"@noble/curves@1.2.0", "@noble/curves@~1.2.0":
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.2.0.tgz#92d7e12e4e49b23105a2555c6984d41733d65c35"
+ integrity sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==
+ dependencies:
+ "@noble/hashes" "1.3.2"
+
"@noble/curves@^1.0.0":
version "1.1.0"
resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.1.0.tgz#f13fc667c89184bc04cccb9b11e8e7bae27d8c3d"
@@ -5381,6 +5361,11 @@
resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.1.tgz#8831ef002114670c603c458ab8b11328406953a9"
integrity sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==
+"@noble/hashes@1.3.2", "@noble/hashes@~1.3.0", "@noble/hashes@~1.3.2":
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39"
+ integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==
+
"@noble/secp256k1@1.7.1", "@noble/secp256k1@~1.7.0":
version "1.7.1"
resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c"
@@ -6199,11 +6184,37 @@
resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.3.2.tgz#31b9c510d8cada9683549e1dbb4284cca5001faf"
integrity sha512-V+MvGwaHH03hYhY+k6Ef/xKd6RYlc4q8WBx+2ANmipHJcKuktNcI/NgEsJgdSUF6Lw32njT6OnrRsKYCdgHjYw==
+"@safe-global/safe-apps-provider@^0.18.0":
+ version "0.18.0"
+ resolved "https://registry.yarnpkg.com/@safe-global/safe-apps-provider/-/safe-apps-provider-0.18.0.tgz#81f1f00684840832e4fe2f92f26891533abd7b10"
+ integrity sha512-C6xN+rRfDn1ShF2Om08h1htuK6M6CttUdahCOSiNVdzGqW5d0nv2RHSO1IntvdQnyd5tBMo31Fy+7XrCve7ORA==
+ dependencies:
+ "@safe-global/safe-apps-sdk" "^8.1.0"
+ events "^3.3.0"
+
+"@safe-global/safe-apps-sdk@^8.1.0":
+ version "8.1.0"
+ resolved "https://registry.yarnpkg.com/@safe-global/safe-apps-sdk/-/safe-apps-sdk-8.1.0.tgz#d1d0c69cd2bf4eef8a79c5d677d16971926aa64a"
+ integrity sha512-XJbEPuaVc7b9n23MqlF6c+ToYIS3f7P2Sel8f3cSBQ9WORE4xrSuvhMpK9fDSFqJ7by/brc+rmJR/5HViRr0/w==
+ dependencies:
+ "@safe-global/safe-gateway-typescript-sdk" "^3.5.3"
+ viem "^1.0.0"
+
+"@safe-global/safe-gateway-typescript-sdk@^3.5.3":
+ version "3.12.0"
+ resolved "https://registry.yarnpkg.com/@safe-global/safe-gateway-typescript-sdk/-/safe-gateway-typescript-sdk-3.12.0.tgz#aa767a32f4d10f4ec9a47ad7e32d547d3b51e94c"
+ integrity sha512-hExCo62lScVC9/ztVqYEYL2pFxcqLTvB8fj0WtdP5FWrvbtEgD0pbVolchzD5bf85pbzvEwdAxSVS7EdCZxTNw==
+
"@scure/base@~1.1.0":
version "1.1.1"
resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.1.tgz#ebb651ee52ff84f420097055f4bf46cfba403938"
integrity sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==
+"@scure/base@~1.1.2":
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.3.tgz#8584115565228290a6c6c4961973e0903bb3df2f"
+ integrity sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q==
+
"@scure/bip32@1.1.5":
version "1.1.5"
resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.5.tgz#d2ccae16dcc2e75bc1d75f5ef3c66a338d1ba300"
@@ -6213,6 +6224,15 @@
"@noble/secp256k1" "~1.7.0"
"@scure/base" "~1.1.0"
+"@scure/bip32@1.3.2":
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.3.2.tgz#90e78c027d5e30f0b22c1f8d50ff12f3fb7559f8"
+ integrity sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==
+ dependencies:
+ "@noble/curves" "~1.2.0"
+ "@noble/hashes" "~1.3.2"
+ "@scure/base" "~1.1.2"
+
"@scure/bip39@1.1.1":
version "1.1.1"
resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.1.tgz#b54557b2e86214319405db819c4b6a370cf340c5"
@@ -6221,6 +6241,14 @@
"@noble/hashes" "~1.2.0"
"@scure/base" "~1.1.0"
+"@scure/bip39@1.2.1":
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.2.1.tgz#5cee8978656b272a917b7871c981e0541ad6ac2a"
+ integrity sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==
+ dependencies:
+ "@noble/hashes" "~1.3.0"
+ "@scure/base" "~1.1.0"
+
"@sentry/browser@7.37.2":
version "7.37.2"
resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.37.2.tgz#355dd28ad12677d63e0b12c5209d12b3f98ac3a4"
@@ -8329,9 +8357,9 @@
integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==
"@types/mocha@^10.0.1":
- version "10.0.3"
- resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.3.tgz#4804fe9cd39da26eb62fa65c15ea77615a187812"
- integrity sha512-RsOPImTriV/OE4A9qKjMtk2MnXiuLLbcO3nCXK+kvq4nr0iMfFgpjaX3MPLb6f7+EL1FGSelYvuJMV6REH+ZPQ==
+ version "10.0.2"
+ resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.2.tgz#96d63314255540a36bf24da094cce7a13668d73b"
+ integrity sha512-NaHL0+0lLNhX6d9rs+NSt97WH/gIlRHmszXbQ/8/MV/eVcFNdeJ/GYhrFuUc8K7WuPhRhTSdMkCp8VMzhUq85w==
"@types/ms@*":
version "0.7.31"
@@ -8634,6 +8662,13 @@
dependencies:
"@types/node" "*"
+"@types/ws@^8.5.5":
+ version "8.5.5"
+ resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.5.tgz#af587964aa06682702ee6dcbc7be41a80e4b28eb"
+ integrity sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==
+ dependencies:
+ "@types/node" "*"
+
"@types/yargs-parser@*":
version "20.2.1"
resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.1.tgz#3b9ce2489919d9e4fea439b76916abc34b2df129"
@@ -9155,24 +9190,24 @@
"@walletconnect/types" "^1.8.0"
"@walletconnect/utils" "^1.8.0"
-"@walletconnect/core@2.9.0":
- version "2.9.0"
- resolved "https://registry.yarnpkg.com/@walletconnect/core/-/core-2.9.0.tgz#7837a5d015a22b48d35b987bcde2aa9ccdf300d8"
- integrity sha512-MZYJghS9YCvGe32UOgDj0mCasaOoGHQaYXWeQblXE/xb8HuaM6kAWhjIQN9P+MNp5QP134BHP5olQostcCotXQ==
+"@walletconnect/core@2.10.1":
+ version "2.10.1"
+ resolved "https://registry.yarnpkg.com/@walletconnect/core/-/core-2.10.1.tgz#d1fb442bd77424666bacdb0f5a07f7708fb3d984"
+ integrity sha512-WAoXfmj+Zy5q48TnrKUjmHXJCBahzKwbul+noepRZf7JDtUAZ9IOWpUjg+UPRbfK5EiWZ0TF42S6SXidf7EHoQ==
dependencies:
"@walletconnect/heartbeat" "1.2.1"
"@walletconnect/jsonrpc-provider" "1.0.13"
"@walletconnect/jsonrpc-types" "1.0.3"
"@walletconnect/jsonrpc-utils" "1.0.8"
- "@walletconnect/jsonrpc-ws-connection" "1.0.12"
+ "@walletconnect/jsonrpc-ws-connection" "1.0.13"
"@walletconnect/keyvaluestorage" "^1.0.2"
"@walletconnect/logger" "^2.0.1"
"@walletconnect/relay-api" "^1.0.9"
"@walletconnect/relay-auth" "^1.0.4"
"@walletconnect/safe-json" "^1.0.2"
"@walletconnect/time" "^1.0.2"
- "@walletconnect/types" "2.9.0"
- "@walletconnect/utils" "2.9.0"
+ "@walletconnect/types" "2.10.1"
+ "@walletconnect/utils" "2.10.1"
events "^3.3.0"
lodash.isequal "4.5.0"
uint8arrays "^3.1.0"
@@ -9214,19 +9249,19 @@
dependencies:
tslib "1.14.1"
-"@walletconnect/ethereum-provider@2.9.0":
- version "2.9.0"
- resolved "https://registry.yarnpkg.com/@walletconnect/ethereum-provider/-/ethereum-provider-2.9.0.tgz#aa6e9e441678c824af8f744c50dafd604f19d69e"
- integrity sha512-rSXkC0SXMigJRdIi/M2RMuEuATY1AwtlTWQBnqyxoht7xbO2bQNPCXn0XL4s/GRNrSUtoKSY4aPMHXV4W4yLBA==
+"@walletconnect/ethereum-provider@^2.10.0":
+ version "2.10.1"
+ resolved "https://registry.yarnpkg.com/@walletconnect/ethereum-provider/-/ethereum-provider-2.10.1.tgz#4733a98f0b388cf5ae6c2b269f50da87da432ee5"
+ integrity sha512-Yhoz8EXkKzxOlBT6G+elphqCx/gkH6RxD9/ZAiy9lLc8Ng5p1gvKCVVP5zsGNE9FbkKmHd+J9JJRzn2Bw2yqtQ==
dependencies:
"@walletconnect/jsonrpc-http-connection" "^1.0.7"
"@walletconnect/jsonrpc-provider" "^1.0.13"
"@walletconnect/jsonrpc-types" "^1.0.3"
"@walletconnect/jsonrpc-utils" "^1.0.8"
- "@walletconnect/sign-client" "2.9.0"
- "@walletconnect/types" "2.9.0"
- "@walletconnect/universal-provider" "2.9.0"
- "@walletconnect/utils" "2.9.0"
+ "@walletconnect/sign-client" "2.10.1"
+ "@walletconnect/types" "2.10.1"
+ "@walletconnect/universal-provider" "2.10.1"
+ "@walletconnect/utils" "2.10.1"
events "^3.3.0"
"@walletconnect/events@^1.0.1":
@@ -9291,10 +9326,10 @@
"@walletconnect/jsonrpc-types" "^1.0.3"
tslib "1.14.1"
-"@walletconnect/jsonrpc-ws-connection@1.0.12":
- version "1.0.12"
- resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-ws-connection/-/jsonrpc-ws-connection-1.0.12.tgz#2192314884fabdda6d0a9d22e157e5b352025ed8"
- integrity sha512-HAcadga3Qjt1Cqy+qXEW6zjaCs8uJGdGQrqltzl3OjiK4epGZRdvSzTe63P+t/3z+D2wG+ffEPn0GVcDozmN1w==
+"@walletconnect/jsonrpc-ws-connection@1.0.13":
+ version "1.0.13"
+ resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-ws-connection/-/jsonrpc-ws-connection-1.0.13.tgz#23b0cdd899801bfbb44a6556936ec2b93ef2adf4"
+ integrity sha512-mfOM7uFH4lGtQxG+XklYuFBj6dwVvseTt5/ahOkkmpcAEgz2umuzu7fTR+h5EmjQBdrmYyEBOWADbeaFNxdySg==
dependencies:
"@walletconnect/jsonrpc-utils" "^1.0.6"
"@walletconnect/safe-json" "^1.0.2"
@@ -9323,31 +9358,30 @@
resolved "https://registry.yarnpkg.com/@walletconnect/mobile-registry/-/mobile-registry-1.4.0.tgz#502cf8ab87330841d794819081e748ebdef7aee5"
integrity sha512-ZtKRio4uCZ1JUF7LIdecmZt7FOLnX72RPSY7aUVu7mj7CSfxDwUn6gBuK6WGtH+NZCldBqDl5DenI5fFSvkKYw==
-"@walletconnect/modal-core@2.5.9":
- version "2.5.9"
- resolved "https://registry.yarnpkg.com/@walletconnect/modal-core/-/modal-core-2.5.9.tgz#45e0c25320d42855aaac39e6ba256a84f972b871"
- integrity sha512-isIebwF9hOknGouhS/Ob4YJ9Sa/tqNYG2v6Ua9EkCqIoLimepkG5eC53tslUWW29SLSfQ9qqBNG2+iE7yQXqgw==
+"@walletconnect/modal-core@2.6.1":
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/@walletconnect/modal-core/-/modal-core-2.6.1.tgz#bc76055d0b644a2d4b98024324825c108a700905"
+ integrity sha512-f2hYlJ5pwzGvjyaZ6BoGR5uiMgXzWXt6w6ktt1N8lmY6PiYp8whZgqx2hTxVWwVlsGnaIfh6UHp1hGnANx0eTQ==
dependencies:
- buffer "6.0.3"
- valtio "1.10.6"
+ valtio "1.11.0"
-"@walletconnect/modal-ui@2.5.9":
- version "2.5.9"
- resolved "https://registry.yarnpkg.com/@walletconnect/modal-ui/-/modal-ui-2.5.9.tgz#4d07f1697147ec9f75d85d93f564cadae05a5e59"
- integrity sha512-nfBaAT9Ls7RZTBBgAq+Nt/3AoUcinIJ9bcq5UHXTV3lOPu/qCKmUC/0HY3GvUK8ykabUAsjr0OAGmcqkB91qug==
+"@walletconnect/modal-ui@2.6.1":
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/@walletconnect/modal-ui/-/modal-ui-2.6.1.tgz#200c54c8dfe3c71321abb2724e18bb357dfd6371"
+ integrity sha512-RFUOwDAMijSK8B7W3+KoLKaa1l+KEUG0LCrtHqaB0H0cLnhEGdLR+kdTdygw+W8+yYZbkM5tXBm7MlFbcuyitA==
dependencies:
- "@walletconnect/modal-core" "2.5.9"
- lit "2.7.5"
+ "@walletconnect/modal-core" "2.6.1"
+ lit "2.7.6"
motion "10.16.2"
qrcode "1.5.3"
-"@walletconnect/modal@2.5.9":
- version "2.5.9"
- resolved "https://registry.yarnpkg.com/@walletconnect/modal/-/modal-2.5.9.tgz#28840f2a46bcd0a47c5fda60d18a5f1607a92a72"
- integrity sha512-Zs2RvPwbBNRdBhb50FuJCxi3FJltt1KSpI7odjU/x9GTpTOcSOkmR66PBCy2JvNA0+ztnS1Xs0LVEr3lu7/Jzw==
+"@walletconnect/modal@2.6.1":
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/@walletconnect/modal/-/modal-2.6.1.tgz#066fdbfcff83b58c8a9da66ab4af0eb93e3626de"
+ integrity sha512-G84tSzdPKAFk1zimgV7JzIUFT5olZUVtI3GcOk77OeLYjlMfnDT23RVRHm5EyCrjkptnvpD0wQScXePOFd2Xcw==
dependencies:
- "@walletconnect/modal-core" "2.5.9"
- "@walletconnect/modal-ui" "2.5.9"
+ "@walletconnect/modal-core" "2.6.1"
+ "@walletconnect/modal-ui" "2.6.1"
"@walletconnect/qrcode-modal@^1.8.0":
version "1.8.0"
@@ -9403,19 +9437,19 @@
dependencies:
tslib "1.14.1"
-"@walletconnect/sign-client@2.9.0":
- version "2.9.0"
- resolved "https://registry.yarnpkg.com/@walletconnect/sign-client/-/sign-client-2.9.0.tgz#fd3b0acb68bc8d56350f01ed70f8c6326e6e89fa"
- integrity sha512-mEKc4LlLMebCe45qzqh+MX4ilQK4kOEBzLY6YJpG8EhyT45eX4JMNA7qQoYa9MRMaaVb/7USJcc4e3ZrjZvQmA==
+"@walletconnect/sign-client@2.10.1":
+ version "2.10.1"
+ resolved "https://registry.yarnpkg.com/@walletconnect/sign-client/-/sign-client-2.10.1.tgz#db60bc9400cd79f0cb2380067343512b21ee4749"
+ integrity sha512-iG3eJGi1yXeG3xGeVSSMf8wDFyx239B0prLQfy1uYDtYFb2ynnH/09oqAZyKn96W5nfQzUgM2Mz157PVdloH3Q==
dependencies:
- "@walletconnect/core" "2.9.0"
+ "@walletconnect/core" "2.10.1"
"@walletconnect/events" "^1.0.1"
"@walletconnect/heartbeat" "1.2.1"
"@walletconnect/jsonrpc-utils" "1.0.8"
"@walletconnect/logger" "^2.0.1"
"@walletconnect/time" "^1.0.2"
- "@walletconnect/types" "2.9.0"
- "@walletconnect/utils" "2.9.0"
+ "@walletconnect/types" "2.10.1"
+ "@walletconnect/utils" "2.10.1"
events "^3.3.0"
"@walletconnect/socket-transport@^1.8.0":
@@ -9434,10 +9468,10 @@
dependencies:
tslib "1.14.1"
-"@walletconnect/types@2.9.0":
- version "2.9.0"
- resolved "https://registry.yarnpkg.com/@walletconnect/types/-/types-2.9.0.tgz#6e5dfdc7212c1ec4ab49a1ec409c743e16093f72"
- integrity sha512-ORopsMfSRvUYqtjKKd6scfg8o4/aGebipLxx92AuuUgMTERSU6cGmIrK6rdLu7W6FBJkmngPLEGc9mRqAb9Lug==
+"@walletconnect/types@2.10.1":
+ version "2.10.1"
+ resolved "https://registry.yarnpkg.com/@walletconnect/types/-/types-2.10.1.tgz#1355bce236f3eef575716ea3efe4beed98a873ef"
+ integrity sha512-7pccAhajQdiH2kYywjE1XI64IqRI+4ioyGy0wvz8d0UFQ/DSG3MLKR8jHf5aTOafQQ/HRLz6xvlzN4a7gIVkUQ==
dependencies:
"@walletconnect/events" "^1.0.1"
"@walletconnect/heartbeat" "1.2.1"
@@ -9451,25 +9485,25 @@
resolved "https://registry.yarnpkg.com/@walletconnect/types/-/types-1.8.0.tgz#3f5e85b2d6b149337f727ab8a71b8471d8d9a195"
integrity sha512-Cn+3I0V0vT9ghMuzh1KzZvCkiAxTq+1TR2eSqw5E5AVWfmCtECFkVZBP6uUJZ8YjwLqXheI+rnjqPy7sVM4Fyg==
-"@walletconnect/universal-provider@2.9.0":
- version "2.9.0"
- resolved "https://registry.yarnpkg.com/@walletconnect/universal-provider/-/universal-provider-2.9.0.tgz#a6b4a1f099262536e17b5c25bf7b3c89db9945a8"
- integrity sha512-k3nkSBkF69sJJVoe17IVoPtnhp/sgaa2t+x7BvA/BKeMxE0DGdtRJdEXotTc8DBmI7o2tkq6l8+HyFBGjQ/CjQ==
+"@walletconnect/universal-provider@2.10.1":
+ version "2.10.1"
+ resolved "https://registry.yarnpkg.com/@walletconnect/universal-provider/-/universal-provider-2.10.1.tgz#c4a77bd2eed1a335edae5b2b298636092fff63ef"
+ integrity sha512-81QxTH/X4dRoYCz0U9iOrBYOcj7N897ONcB57wsGhEkV7Rc9htmWJq2CzeOuxvVZ+pNZkE+/aw9LrhizO1Ltxg==
dependencies:
"@walletconnect/jsonrpc-http-connection" "^1.0.7"
"@walletconnect/jsonrpc-provider" "1.0.13"
"@walletconnect/jsonrpc-types" "^1.0.2"
"@walletconnect/jsonrpc-utils" "^1.0.7"
"@walletconnect/logger" "^2.0.1"
- "@walletconnect/sign-client" "2.9.0"
- "@walletconnect/types" "2.9.0"
- "@walletconnect/utils" "2.9.0"
+ "@walletconnect/sign-client" "2.10.1"
+ "@walletconnect/types" "2.10.1"
+ "@walletconnect/utils" "2.10.1"
events "^3.3.0"
-"@walletconnect/utils@2.9.0":
- version "2.9.0"
- resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-2.9.0.tgz#c73925edb9fefe79021bcf028e957028f986b728"
- integrity sha512-7Tu3m6dZL84KofrNBcblsgpSqU2vdo9ImLD7zWimLXERVGNQ8smXG+gmhQYblebIBhsPzjy9N38YMC3nPlfQNw==
+"@walletconnect/utils@2.10.1":
+ version "2.10.1"
+ resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-2.10.1.tgz#65b37c9800eb0e80a08385b6987471fb46e1e22e"
+ integrity sha512-DM0dKgm9O58l7VqJEyV2OVv16XRePhDAReI23let6WdW1dSpw/Y/A89Lp99ZJOjLm2FxyblMRF3YRaZtHwBffw==
dependencies:
"@stablelib/chacha20poly1305" "1.0.1"
"@stablelib/hkdf" "1.0.1"
@@ -9479,7 +9513,7 @@
"@walletconnect/relay-api" "^1.0.9"
"@walletconnect/safe-json" "^1.0.2"
"@walletconnect/time" "^1.0.2"
- "@walletconnect/types" "2.9.0"
+ "@walletconnect/types" "2.10.1"
"@walletconnect/window-getters" "^1.0.1"
"@walletconnect/window-metadata" "^1.0.1"
detect-browser "5.3.0"
@@ -9526,12 +9560,12 @@
"@walletconnect/window-getters" "^1.0.1"
tslib "1.14.1"
-"@web3-onboard/coinbase@^2.2.4":
- version "2.2.4"
- resolved "https://registry.yarnpkg.com/@web3-onboard/coinbase/-/coinbase-2.2.4.tgz#7e7f82e631816ab7ddcab8d94df6d1513baada50"
- integrity sha512-XnQejTC51ZqYm4sT+RH3tr1yWcbuZXTWXRZeIHEWiJchVBE4K9goPxhB03PX8ZQ9TDt/bUTEkl7Qfyp6bhKTKw==
+"@web3-onboard/coinbase@^2.2.5":
+ version "2.2.5"
+ resolved "https://registry.yarnpkg.com/@web3-onboard/coinbase/-/coinbase-2.2.5.tgz#fb7a57e5456323c0ee107ce48ea0cc80acbb6e07"
+ integrity sha512-mEiaK+K+nB2TwxUpkyAZmb4AHguymsJrHFbsZDdAolFTgZizCSjGHBhYlCEfxLL4fh3CpUryTa/AaNxxhdG6OQ==
dependencies:
- "@coinbase/wallet-sdk" "^3.6.0"
+ "@coinbase/wallet-sdk" "^3.7.1"
"@web3-onboard/common" "^2.3.3"
"@web3-onboard/common@^2.3.3":
@@ -9543,10 +9577,10 @@
ethers "5.5.4"
joi "17.9.1"
-"@web3-onboard/core@^2.20.4":
- version "2.20.4"
- resolved "https://registry.yarnpkg.com/@web3-onboard/core/-/core-2.20.4.tgz#ccc9ff509e56720e526b4ceae5459a1f2a435d22"
- integrity sha512-IFI3DVq5QgFj5w1TyL61gHmeOlkX8AJiBAARO3cd4zW8I3h9K2+7HeE7LbsfwefZYLILzXCfF0gMB3qRN/GWYQ==
+"@web3-onboard/core@^2.21.2":
+ version "2.21.2"
+ resolved "https://registry.yarnpkg.com/@web3-onboard/core/-/core-2.21.2.tgz#962683efc87b29ee9150ab8d7ea9568ea3b41dd5"
+ integrity sha512-apzVi2zWqs4ktZBBJ60x1e4odI1mSoZ2c69bXUg36A0xI0iRFQ9Od44peI3mfTDEru7hWsr81Nv6l+v3HRSKLw==
dependencies:
"@web3-onboard/common" "^2.3.3"
bignumber.js "^9.0.0"
@@ -9562,44 +9596,43 @@
svelte "^3.49.0"
svelte-i18n "^3.3.13"
-"@web3-onboard/gnosis@^2.1.10":
- version "2.1.10"
- resolved "https://registry.yarnpkg.com/@web3-onboard/gnosis/-/gnosis-2.1.10.tgz#ca62d23780749a9e69d96b4480c7d79c81d80211"
- integrity sha512-rUrRPdyDxeq/DRqsCPZ75JH0TcnETfeclVwUnam31DeFGtBFbOXYhHhCXnjWcQYFxqdNBaqoZuMfjrvTi+NC2g==
+"@web3-onboard/gnosis@^2.2.0":
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/@web3-onboard/gnosis/-/gnosis-2.2.0.tgz#134dd79d13b651934f4233760f4337752d1c35df"
+ integrity sha512-+CtvrI30jj3zJdplQfrCU1rSAUN6R0rfBZggl8JXvqsH5CNTFjU3ctVWeqbyGBPfcVhRQ5oLqKcj464LTwy2iw==
dependencies:
- "@gnosis.pm/safe-apps-provider" "^0.9.2"
- "@gnosis.pm/safe-apps-sdk" "^6.1.1"
"@web3-onboard/common" "^2.3.3"
-"@web3-onboard/injected-wallets@^2.10.2":
- version "2.10.2"
- resolved "https://registry.yarnpkg.com/@web3-onboard/injected-wallets/-/injected-wallets-2.10.2.tgz#e84eabebdb888dcec4a7a48f02fafa788735e791"
- integrity sha512-LFQ/bBfhvSfzB5Y9gB37mtyKmUz76tdZIfUvBhhnmmxLCuD1T4eFsjMo67cRdC6wcXRTMbCaPbldGqz/10b0ug==
+"@web3-onboard/injected-wallets@^2.10.6":
+ version "2.10.6"
+ resolved "https://registry.yarnpkg.com/@web3-onboard/injected-wallets/-/injected-wallets-2.10.6.tgz#8ba357e176f3261d57204742e2ee2ca683592784"
+ integrity sha512-/3mp+0ML478JuUXF0D1m5Nq83HMkfpdd8BcJJ//qN0Laxi+I2obquT47pcqbkRTwNAxpjzlpprjhN6V78bCF3g==
dependencies:
"@web3-onboard/common" "^2.3.3"
joi "17.9.1"
lodash.uniqby "^4.7.0"
-"@web3-onboard/react@^2.8.9":
- version "2.8.9"
- resolved "https://registry.yarnpkg.com/@web3-onboard/react/-/react-2.8.9.tgz#e64b5067d490b22d3a4566fb7c8d71d7b1787703"
- integrity sha512-Ih2PJhyTEpiW9wQbli+ZYqU8qkWqgR3PYmT2teHdDiaDaF8nPBvztBPPZkLjZSyx67iLsOBqS4kw8n74BK7DQw==
+"@web3-onboard/react@^2.8.13":
+ version "2.8.13"
+ resolved "https://registry.yarnpkg.com/@web3-onboard/react/-/react-2.8.13.tgz#c58fae9ba73f343aaa4483d57b6b27b1b14d1851"
+ integrity sha512-RhdnbVNWxYrMFOwxZKRKV3ys7SKymdHa2cHsyzcVEQlHzZVhZVlKB6KWzvk6umcyuT4DF9W4edzd1clJwCmazg==
dependencies:
"@web3-onboard/common" "^2.3.3"
- "@web3-onboard/core" "^2.20.4"
+ "@web3-onboard/core" "^2.21.2"
use-sync-external-store "1.0.0"
-"@web3-onboard/walletconnect@^2.4.1":
- version "2.4.1"
- resolved "https://registry.yarnpkg.com/@web3-onboard/walletconnect/-/walletconnect-2.4.1.tgz#49e6699b89790b17fc702cf21f24df71ec0d7c17"
- integrity sha512-REYvE+VQgCo3zMAb4q9W0cmyrLH7xAEB3oi2lUwXcfejvk6TMT7xl6dVLWpycyGfQWLXS2HM0YGQ1zhFyBkLIQ==
+"@web3-onboard/walletconnect@^2.4.6":
+ version "2.4.6"
+ resolved "https://registry.yarnpkg.com/@web3-onboard/walletconnect/-/walletconnect-2.4.6.tgz#305b16a022f915356fd8b7547c89858bbd10498c"
+ integrity sha512-HsJHC++1/RSZIbYWGLCKkkmdu+8ITV3hkBeSQxvrnO9bcCBMY//+SBo2N7hPZqqSiRFvv2/UW4r4hELmhR4pdQ==
dependencies:
"@ethersproject/providers" "5.5.0"
"@walletconnect/client" "^1.8.0"
- "@walletconnect/ethereum-provider" "2.9.0"
- "@walletconnect/modal" "2.5.9"
+ "@walletconnect/ethereum-provider" "^2.10.0"
+ "@walletconnect/modal" "2.6.1"
"@walletconnect/qrcode-modal" "^1.8.0"
"@web3-onboard/common" "^2.3.3"
+ joi "17.9.1"
rxjs "^7.5.2"
"@webassemblyjs/ast@1.11.1":
@@ -10015,6 +10048,11 @@ abbrev@1.0.x:
web3-eth-abi "^1.2.1"
web3-utils "^1.2.1"
+abitype@0.9.8:
+ version "0.9.8"
+ resolved "https://registry.yarnpkg.com/abitype/-/abitype-0.9.8.tgz#1f120b6b717459deafd213dfbf3a3dd1bf10ae8c"
+ integrity sha512-puLifILdm+8sjyss4S+fsUN09obiT1g2YW6CtcQF+QDzxR0euzgEB29MZujC6zMk2a6SVmtttq1fc6+YFA7WYQ==
+
abort-controller@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392"
@@ -13789,7 +13827,7 @@ cross-fetch@^2.1.0, cross-fetch@^2.1.1:
node-fetch "^2.6.7"
whatwg-fetch "^2.0.4"
-cross-fetch@^3.0.6, cross-fetch@^3.1.4, cross-fetch@^3.1.5:
+cross-fetch@^3.0.6, cross-fetch@^3.1.4:
version "3.1.5"
resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f"
integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==
@@ -16126,7 +16164,7 @@ ethers@5.5.4:
"@ethersproject/web" "5.5.1"
"@ethersproject/wordlists" "5.5.0"
-ethers@5.7.2, ethers@^5.0.13, ethers@^5.4.2, ethers@^5.4.7, ethers@^5.5.4, ethers@^5.6.8, ethers@^5.7.0, ethers@^5.7.1, ethers@^5.7.2:
+ethers@5.7.2, ethers@^5.0.13, ethers@^5.4.2, ethers@^5.5.4, ethers@^5.6.8, ethers@^5.7.0, ethers@^5.7.1, ethers@^5.7.2:
version "5.7.2"
resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e"
integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==
@@ -19513,6 +19551,11 @@ isomorphic-unfetch@^3.1.0:
node-fetch "^2.6.1"
unfetch "^4.2.0"
+isomorphic-ws@5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz#e5529148912ecb9b451b46ed44d53dae1ce04bbf"
+ integrity sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==
+
isomorphic-ws@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc"
@@ -20926,10 +20969,10 @@ lit-html@^2.7.0:
dependencies:
"@types/trusted-types" "^2.0.2"
-lit@2.7.5:
- version "2.7.5"
- resolved "https://registry.yarnpkg.com/lit/-/lit-2.7.5.tgz#60bc82990cfad169d42cd786999356dcf79b035f"
- integrity sha512-i/cH7Ye6nBDUASMnfwcictBnsTN91+aBjXoTHF2xARghXScKxpD4F4WYI+VLXg9lqbMinDfvoI7VnZXjyHgdfQ==
+lit@2.7.6:
+ version "2.7.6"
+ resolved "https://registry.yarnpkg.com/lit/-/lit-2.7.6.tgz#810007b876ed43e0c70124de91831921598b1665"
+ integrity sha512-1amFHA7t4VaaDe+vdQejSVBklwtH9svGoG6/dZi9JhxtJBBlqY5D1RV7iLUYY0trCqQc4NfhYYZilZiVHt7Hxg==
dependencies:
"@lit/reactive-element" "^1.6.0"
lit-element "^3.3.0"
@@ -28446,10 +28489,10 @@ validate-npm-package-license@^3.0.1:
spdx-correct "^3.0.0"
spdx-expression-parse "^3.0.0"
-valtio@1.10.6:
- version "1.10.6"
- resolved "https://registry.yarnpkg.com/valtio/-/valtio-1.10.6.tgz#80ed00198b949939863a0fa56ae687abb417fc4f"
- integrity sha512-SxN1bHUmdhW6V8qsQTpCgJEwp7uHbntuH0S9cdLQtiohuevwBksbpXjwj5uDMA7bLwg1WKyq9sEpZrx3TIMrkA==
+valtio@1.11.0:
+ version "1.11.0"
+ resolved "https://registry.yarnpkg.com/valtio/-/valtio-1.11.0.tgz#c029dcd17a0f99d2fbec933721fe64cfd32a31ed"
+ integrity sha512-65Yd0yU5qs86b5lN1eu/nzcTgQ9/6YnD6iO+DDaDbQLn1Zv2w12Gwk43WkPlUBxk5wL/6cD5YMFf7kj6HZ1Kpg==
dependencies:
proxy-compare "2.5.1"
use-sync-external-store "1.2.0"
@@ -28506,6 +28549,21 @@ vfile@^4.0.0:
unist-util-stringify-position "^2.0.0"
vfile-message "^2.0.0"
+viem@^1.0.0:
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/viem/-/viem-1.11.1.tgz#30531740eb52e5d1ff1167d8df462d1a8d45afb8"
+ integrity sha512-PPNsPacRS7nryakQQJ9PjYGjUa0QgV8lbERhRuJm8X4kGUzSAsTQaQmy4hvV0cRAEHg8tG0TMD+GTCfwzZM3Yw==
+ dependencies:
+ "@adraffy/ens-normalize" "1.9.4"
+ "@noble/curves" "1.2.0"
+ "@noble/hashes" "1.3.2"
+ "@scure/bip32" "1.3.2"
+ "@scure/bip39" "1.2.1"
+ "@types/ws" "^8.5.5"
+ abitype "0.9.8"
+ isomorphic-ws "5.0.0"
+ ws "8.13.0"
+
vite-plugin-environment@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/vite-plugin-environment/-/vite-plugin-environment-1.1.3.tgz#d01a04abb2f69730a4866c9c9db51d3dab74645b"
@@ -29743,6 +29801,11 @@ ws@7.5.3:
resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.3.tgz#160835b63c7d97bfab418fc1b8a9fced2ac01a74"
integrity sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==
+ws@8.13.0, ws@^8.11.0:
+ version "8.13.0"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0"
+ integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==
+
ws@^3.0.0:
version "3.3.3"
resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2"
@@ -29764,11 +29827,6 @@ ws@^7.3.1, ws@^7.4.5, ws@^7.4.6, ws@^7.5.1:
resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591"
integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==
-ws@^8.11.0:
- version "8.13.0"
- resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0"
- integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==
-
ws@^8.2.3, ws@^8.5.0:
version "8.8.1"
resolved "https://registry.yarnpkg.com/ws/-/ws-8.8.1.tgz#5dbad0feb7ade8ecc99b830c1d77c913d4955ff0"