diff --git a/src/pages/privacy.tsx b/src/pages/privacy.tsx
index f168d61e83..ced949e2af 100644
--- a/src/pages/privacy.tsx
+++ b/src/pages/privacy.tsx
@@ -49,7 +49,7 @@ const SafePrivacyPolicy = () => (
`}
Privacy Policy
- Last updated: January 2024.
+ Last updated: June 2024.
Your privacy is important to us. It is our policy to respect your privacy and comply with any applicable law and
regulation regarding any personal information we may collect about you, including across our website,{' '}
@@ -338,7 +338,7 @@ const SafePrivacyPolicy = () => (
SECTION 2, THIS DATA WILL BECOME PUBLIC AND IT WILL NOT LIKELY BE POSSIBLE TO DELETE OR CHANGE THE DATA AT ANY
GIVEN TIME.
- 4.2. Tracking
+ 4.2. Tracking & Analysis
4.2.1 We will process the following personal data to analyze your behavior:
IP address (will not be stored for EU users),
@@ -370,7 +370,24 @@ const SafePrivacyPolicy = () => (
- 4.2.2 We conduct technical monitoring of your activity on the platform in order to ensure availability, integrity
+ 4.2.2 For general operational analysis of the {'Safe{Wallet}'} interface, monitoring transaction origins and
+ measuring transaction failure rates to ensure improved service performance and reliability, we process information
+ which constitutes the transaction service database, such as:
+
+
+ signatures
+ signature_type
+ ethereum_tx_id
+ message_hash
+ safe_app_id
+ safe_message_id
+
+
+ We conduct this analysis in our legitimate interest to continuously improve our product and service and ensure
+ increased service performance and reliability.
+
+
+ 4.2.3 We conduct technical monitoring of your activity on the platform in order to ensure availability, integrity
and robustness of the service. For this purpose we process your:
@@ -383,7 +400,7 @@ const SafePrivacyPolicy = () => (
The lawful basis for this processing is our legitimate interest (GDPR Art.6.1f) in ensuring the correctness of the
service.
- 4.2.3. Anonymized tracking
+ 4.2.4 Anonymized tracking
We will anonymize the following personal data to gather anonymous user statistics on your browsing behavior on our
website:
@@ -689,15 +706,7 @@ const SafePrivacyPolicy = () => (
-
5.13. Web3Auth
-
- We use{' '}
-
- Web3Auth
- {' '}
- to create a signer wallet/an owner account by using the user's Gmail account or Apple ID information.
-
- 5.14. MoonPay
+ 5.13. MoonPay
We use{' '}
@@ -706,7 +715,7 @@ const SafePrivacyPolicy = () => (
to offer on-ramp and off-ramp services. For that purpose personal data is required for KYC/AML or other financial
regulatory requirements. This data is encrypted by MoonPay.
- 5.15. Spindl
+ 5.14. Spindl
We use{' '}
diff --git a/src/pages/settings/cookies.tsx b/src/pages/settings/cookies.tsx
index d8bd965854..c3c53f06ef 100644
--- a/src/pages/settings/cookies.tsx
+++ b/src/pages/settings/cookies.tsx
@@ -1,4 +1,4 @@
-import { CookieBanner } from '@/components/common/CookieBanner'
+import { CookieAndTermBanner } from 'src/components/common/CookieAndTermBanner'
import SettingsHeader from '@/components/settings/SettingsHeader'
import { Grid, Paper, Typography } from '@mui/material'
import type { NextPage } from 'next'
@@ -23,7 +23,7 @@ const Cookies: NextPage = () => {
-
+
diff --git a/src/pages/settings/security-login.tsx b/src/pages/settings/security.tsx
similarity index 69%
rename from src/pages/settings/security-login.tsx
rename to src/pages/settings/security.tsx
index ddbb86eb7a..73e8b27994 100644
--- a/src/pages/settings/security-login.tsx
+++ b/src/pages/settings/security.tsx
@@ -4,11 +4,11 @@ import Head from 'next/head'
import SettingsHeader from '@/components/settings/SettingsHeader'
import SecurityLogin from '@/components/settings/SecurityLogin'
-const SecurityLoginPage: NextPage = () => {
+const SecurityPage: NextPage = () => {
return (
<>
- {'Astar Safe – Settings – Security & Login'}
+ {'Astar Safe – Settings – Security'}
@@ -20,4 +20,4 @@ const SecurityLoginPage: NextPage = () => {
)
}
-export default SecurityLoginPage
+export default SecurityPage
diff --git a/src/pages/settings/setup.tsx b/src/pages/settings/setup.tsx
index 281027a09b..83a8208403 100644
--- a/src/pages/settings/setup.tsx
+++ b/src/pages/settings/setup.tsx
@@ -8,6 +8,7 @@ import { RequiredConfirmation } from '@/components/settings/RequiredConfirmation
import useSafeInfo from '@/hooks/useSafeInfo'
import SettingsHeader from '@/components/settings/SettingsHeader'
import DelegatesList from '@/components/settings/DelegatesList'
+import SpendingLimits from '@/components/settings/SpendingLimits'
const Setup: NextPage = () => {
const { safe, safeLoaded } = useSafeInfo()
@@ -57,12 +58,14 @@ const Setup: NextPage = () => {
-
+
+
+
>
diff --git a/src/pages/swap.tsx b/src/pages/swap.tsx
index 1d2f918806..297affc64e 100644
--- a/src/pages/swap.tsx
+++ b/src/pages/swap.tsx
@@ -1,12 +1,21 @@
import type { NextPage } from 'next'
import Head from 'next/head'
import { useRouter } from 'next/router'
-import SwapWidget from '@/features/swap'
+import { GeoblockingContext } from '@/components/common/GeoblockingProvider'
+import { useContext } from 'react'
+import { AppRoutes } from '@/config/routes'
+import dynamic from 'next/dynamic'
+const SwapWidgetNoSSR = dynamic(() => import('@/features/swap'), { ssr: false })
const Swap: NextPage = () => {
const router = useRouter()
+ const isBlockedCountry = useContext(GeoblockingContext)
const { token, amount } = router.query
+ if (isBlockedCountry) {
+ router.replace(AppRoutes['403'])
+ }
+
let sell = undefined
if (token && amount) {
sell = {
@@ -22,7 +31,7 @@ const Swap: NextPage = () => {
-
+
>
)
diff --git a/src/pages/terms.tsx b/src/pages/terms.tsx
index 250866b53f..05befd65ea 100644
--- a/src/pages/terms.tsx
+++ b/src/pages/terms.tsx
@@ -12,7 +12,7 @@ const SafeTerms = () => (
Terms and Conditions
- Last updated: January 2024.
+ Last updated: July 2024.
1. What is the scope of the Terms?
@@ -161,8 +161,12 @@ const SafeTerms = () => (
the responsibility to monitor authorized Transactions or to check the correctness or completeness of
- Transactions before you are authorizing them.
+ Transactions before you are authorizing them;
+ notifications about events occurring in or connection with your Safe Account;
+ recovery of your Safe Account;
+ flagging malicious transactions;
+ issuance of the Safe Token and any related functionalities or reward programs.
5. What do you need to know about Third-Party Services?
@@ -268,25 +272,118 @@ const SafeTerms = () => (
- 8. Can we terminate or limit your right to use our Services?
-
+ 8. Are we responsible for recovering your Safe Account?
+
+ We shall not be responsible for recovering your Safe Account.
+ You are solely responsible for securing a back-up of your Safe Account access as you see fit.
+
+ Any recovery feature we provide access to within the Safe App is a mechanism controlled by your Safe Account on
+ the Blockchain, both of which we don't have any influence over once you have set it up. We will never act
+ as a recoverer ourselves and don't offer recovery services. The Self Custodial Recovery feature allows you
+ to determine your own recovery setup and nominate anyone including yourself as your recoverer. The recoverer can
+ start the recovery process at any time. Please note that we are not responsible for notifying you of this
+ process (see Section 7 above). Furthermore we reserve the right to cease the access to the Self Custodial
+ Recovery feature via our Safe App taking the user's reasonable interests into account and providing due
+ notification.
+
+ The recovery feature is provided free of charge and liability is limited pursuant to Section 17.4 below.
+
+
+ 9. Are we responsible for notifying you about events occuring in your Safe Account?
+
+
+ We shall not be responsible for notifying you of any interactions or events occurring in your Safe Account, be
+ it on the Blockchain, third-party interfaces, within any other infrastructure, or our Services.
+
+ You are responsible for monitoring Safe Account as you see fit.
+
+ Any notification service we provide or offer for subscription within the Safe App via e-mail or push
+ notifications or any other means of communication is provided free of charge and liability is limited pursuant
+ to Section 17.4 below. Furthermore we reserve the right to change the notification feature from time to time or
+ cease to provide them without notice.
+
+
+
+ 10. Are we responsible for flagging malicious transactions?
+
+ We shall not be responsible for flagging malicious transactions in our Safe App.
+
+ You are solely responsible for checking any transaction, address, Token or other item you interact with via your
+ Smart Account in our Safe App.{' '}
+
- We may terminate the Agreement and refuse access to the Safe Apps at any time giving 30 days’ prior
- notice. The right of the parties to terminate the Agreement for cause remains unaffected. In case of our
- termination of the Agreement, you may no longer access your Safe Account via our Services. However, you may
+ Any security flagging or warning service we provide or offer for subscription within the Safe App is provided
+ free of charge and liability is limited pursuant to Section 17.4 below. Furthermore we reserve the right to
+ change the feature from time to time or cease to provide them without notice.
+
+
+
+
+ 11. Are we responsible for the issuance of the Safe Token and any related functionalities or reward programs?
+
+
+
+ The Safe Token is issued by the Safe Ecosystem Foundation. We are not the issuer or in any way responsible for
+ the Safe Token. Furthermore, we do not provide any functionalities to the Safe Token or Safe Token reward
+ programs.
+
+
+ You are solely responsible for managing your Safe Tokens just like any other Token in your Safe Account and
+ solely responsible for your eligibility for any reward programs.
+
+
+ Any interface we provide that allows you to claim or delegate your Safe Tokens or to participate in any third
+ party program related to Safe Tokens is provided free of charge and we exclude any and all liability for the
+ correctness, completeness, speed or timeliness of these services. Furthermore we reserve the right to change the
+ feature from time to time or cease to provide them without notice.
+
+
+
+ 12. Are we responsible for third-party content and services?
+
+
+ You may view, have access to, and use third-party content and services, for example widget integrations, within
+ the Safe App (“Third-Party Features”). You view, access, or use Third-Party Features at your own election. Your
+ reliance on Third-Party Features is subject to separate terms and conditions set forth by the applicable third
+ party content and/or service provider (“Third-Party Terms”). Third-Party Terms may, amongst other things,
+
+ involve separate fees and charges,
+ include disclaimers or risk warnings,
+ apply a different terms and privacy policy.
+
+
+
+ Third Party Features are provided for your convenience only. We do not verify, curate, or control Third Party
+ Features.{' '}
+
+
+ If we offer access to Third-Party Features in the Safe App free of charge by us (Third-Parties may charge
+ separate fees), the liability for providing access to such Third-Party Feature is limited pursuant to Section
+ 17.1 below. Furthermore we reserve the right to cease to provide access to those Third-Party Features through
+ the Safe App without notice.
+
+
+
+ 13. Can we terminate or limit your right to use our Services?
+
+
+ We may cease offering our Services and/or terminate the Agreement and refuse access to the Safe Apps at any
+ time. The right of the parties to terminate the Agreement at any time for cause remains unaffected. In case of
+ our termination of the Agreement, you may no longer access your Safe Account via our Services. However, you may
continue to access your Safe Account and any Tokens via a third-party wallet provider using your Recovery Phrase
and Private Keys.
- We reserve the right to limit the use of the Safe Apps to a specified number of Users if necessary to
- protect or ensure the stability and integrity of the Services. We will only be able to limit access to the
- Services. At no time will we be able to limit or block access to or transfer your funds without your consent.
+ We reserve the right to limit the use of the Safe Apps to a specified number of Users if necessary to protect or
+ ensure the stability and integrity of the Services. We will only be able to limit access to the Services. At no
+ time will we be able to limit or block access to or transfer your funds without your consent.
- 9. Can you terminate your Agreement with us?
+ 14. Can you terminate your Agreement with us?
You may terminate the Agreement at any time without notice.
- 10. What licenses and access do we grant to you?
+
+ 15. What licenses and access do we grant to you?
All intellectual property rights in Safe Accounts and the Services throughout the world belong to us as owner or
@@ -300,7 +397,7 @@ const SafeTerms = () => (
- 11. What can you expect from the Services and can we make changes to them?
+ 16. What can you expect from the Services and can we make changes to them?
Without limiting your mandatory warranties, we provide the Services to you “as is” and “as
@@ -327,7 +424,7 @@ const SafeTerms = () => (
- 12. What do you agree, warrant and represent?
+ 17. What do you agree, warrant and represent?
By using our Services you hereby agree, represent and warrant that:
@@ -387,49 +484,179 @@ const SafeTerms = () => (
You are using the Services at your own risk.
- 13. What about our liability to you?
- All our liability is excluded, except for the following:
-
+ 18. What about our liability to you?
- In the event of intent and gross negligence on our part, we are liable for damages – regardless of the legal
- grounds.
-
-
- In the event of negligence on our part, we are liable for damages resulting from injury to life, body or health.
-
-
- In the event of simple negligence on our part, we are only liable for damages resulting from the breach of an
- essential contractual duty (e.g. a duty, the performance of which enables the proper execution of the contract
- in the first place and on the compliance of which the contractual partner regularly relies and may rely),
- whereby our liability shall be limited to compensation of the foreseeable, typically occurring damage. Liability
- for the violation of a non-essential contractual duty is excluded.
-
-
- The liability for simple negligence only applies to the extent that we do not offer the Safe App and the
- Services free of charge (please note, in this context, that any service, network and/or transaction fees may be
- charged by third parties via the Blockchain and not necessarily by us). Conversely, this means that we are not
- liable in cases of simple negligence, when you obtain the Safe App or the service from us free of charge.
-
-
- The limitations of liability according to Clauses 13.2 to 13.4. do not apply as far as we have assumed a
- guarantee or we have fraudulently concealed a defect in the Services. These limitations of liability also do not
- apply to your claims according to the Product Liability Act (”Produkthaftungsgesetz”) and any applicable data
- privacy laws.
-
-
- If you suffer damages from the loss of data, we are not liable for this, as far as the damages would have been
- avoided by your regular and complete backup of all relevant data.
-
-
- In the event of disruptions to the technical infrastructure, the internet connection or a relevant Blockchain
- that we are not responsible for, we shall be exempt from our obligation to perform. This also applies if we are
- prevented from performing due to force majeure or other circumstances, the elimination of which is not possible
- or cannot be economically expected of CC.
+ If the Safe App or Services are provided to the User free of charge (please note, in this context, that any
+ service, network, and/or transaction fees may be charged by third parties via the Blockchain and not necessarily
+ by us), CC shall be liable only in cases of intent, gross negligence, or if CC has fraudulently concealed a
+ possible material or legal defect of the Safe App or Services. If the Safe App or Services are not provided to
+ the User free of charge, CC shall be liable only (i) in cases pursuant to Clause 17.1 as well as (ii) in cases
+ of simple negligence for damages resulting from the breach of an essential contractual duty, a duty, the
+ performance of which enables the proper execution of this Agreement in the first place and on the compliance of
+ which the User regularly relies and may rely, whereby CC's liability shall be limited to the compensation
+ of the foreseeable, typically occurring damage. The Parties agree that the typical foreseeable damage equals the
+ sum of the annual Fees paid or agreed to be paid by the User to CC during the course of the calendar year in
+ which the event giving rise to the damage claim occurred. Liability in cases of simple negligence for damages
+ resulting from the breach of a non-essential contractual duty are excluded. The limitations of liability
+ according to Clause 17.1 and Clause 17.2 do not apply (i) to damages resulting from injury to life, body or
+ health, (ii) insofar as CC has assumed a guarantee, (iii) to claims of the User according to the Product
+ Liability Act and (iv) to claims of the User according to the applicable data protection law. The limitation of
+ liability also applies to the personal liability of the organs, legal representatives, employees and vicarious
+ agents of CC. If the User suffers damages due to the loss of data, CC is not liable for this, insofar as the
+ damage would have been avoided by a regular and complete backup of all relevant data by the User. In the event
+ of disruptions to the technical infrastructure, the internet connection or a relevant Blockchain that we are not
+ responsible for, we shall be exempt from our obligation to perform. This also applies if we are prevented from
+ performing due to force majeure or other circumstances, the elimination of which is not possible or cannot be
+ economically expected of CC.
+
+
+ If the Safe App or Services are provided to the User free of charge (please note, in this context, that any
+ service, network and/or transaction fees may be charged by third parties via the Blockchain and not necessarily
+ by us), CC shall be liable only in cases of intent, gross negligence or if CC has fraudulently concealed a
+ possible material or legal defect of the Safe App or Services. If the Safe App or Services are not provided to
+ the User free of charge, CC shall be liable only (i) in cases pursuant to Clause 17.1 as well as (ii) in cases
+ of simple negligence for damages resulting from the breach of an essential contractual duty, a duty, the
+ performance of which enables the proper execution of this Agreement in the first place and on the compliance of
+ which the User regularly relies and may rely, whereby CC's liability shall be limited to the compensation
+ of the foreseeable, typically occurring damage. The Parties agree that the typical foreseeable damage equals the
+ sum of the annual Fees paid or agreed to be paid by the User to CC during the course of the calendar year in
+ which the event giving rise to the damage claim occurred. Liability in cases of simple negligence for damages
+ resulting from the breach of a non-essential contractual duty are excluded. The limitations of liability
+ according to Clause 17.1 and Clause 17.2 do not apply (i) to damages resulting from injury to life, body or
+ health, (ii) insofar as CC has assumed a guarantee, (iii) to claims of the User according to the Product
+ Liability Act and (iv) to claims of the User according to the applicable data protection law. The limitation of
+ liability also applies to the personal liability of the organs, legal representatives, employees and vicarious
+ agents of CC. If the User suffers damages due to the loss of data, CC is not liable for this, insofar as the
+ damage would have been avoided by a regular and complete backup of all relevant data by the User. In the event
+ of disruptions to the technical infrastructure, the internet connection or a relevant Blockchain that we are not
+ responsible for, we shall be exempt from our obligation to perform. This also applies if we are prevented from
+ performing due to force majeure or other circumstances, the elimination of which is not possible or cannot be
+ economically expected of CC.
+
+
+ If the Safe App or Services are provided to the User free of charge (please note, in this context, that any
+ service, network and/or transaction fees may be charged by third parties via the Blockchain and not necessarily
+ by us), CC shall be liable only in cases of intent, gross negligence or if CC has fraudulently concealed a
+ possible material or legal defect of the Safe App or Services. If the Safe App or Services are not provided to
+ the User free of charge, CC shall be liable only (i) in cases pursuant to Clause 17.1 as well as (ii) in cases
+ of simple negligence for damages resulting from the breach of an essential contractual duty, a duty, the
+ performance of which enables the proper execution of this Agreement in the first place and on the compliance of
+ which the User regularly relies and may rely, whereby CC's liability shall be limited to the compensation
+ of the foreseeable, typically occurring damage. The Parties agree that the typical foreseeable damage equals the
+ sum of the annual Fees paid or agreed to be paid by the User to CC during the course of the calendar year in
+ which the event giving rise to the damage claim occurred. Liability in cases of simple negligence for damages
+ resulting from the breach of a non-essential contractual duty are excluded. The limitations of liability
+ according to Clause 17.1 and Clause 17.2 do not apply (i) to damages resulting from injury to life, body or
+ health, (ii) insofar as CC has assumed a guarantee, (iii) to claims of the User according to the Product
+ Liability Act and (iv) to claims of the User according to the applicable data protection law. The limitation of
+ liability also applies to the personal liability of the organs, legal representatives, employees and vicarious
+ agents of CC. If the User suffers damages due to the loss of data, CC is not liable for this, insofar as the
+ damage would have been avoided by a regular and complete backup of all relevant data by the User. In the event
+ of disruptions to the technical infrastructure, the internet connection or a relevant Blockchain that we are not
+ responsible for, we shall be exempt from our obligation to perform. This also applies if we are prevented from
+ performing due to force majeure or other circumstances, the elimination of which is not possible or cannot be
+ economically expected of CC.
+
+
+ If the Safe App or Services are provided to the User free of charge (please note, in this context, that any
+ service, network and/or transaction fees may be charged by third parties via the Blockchain and not necessarily
+ by us), CC shall be liable only in cases of intent, gross negligence or if CC has fraudulently concealed a
+ possible material or legal defect of the Safe App or Services. If the Safe App or Services are not provided to
+ the User free of charge, CC shall be liable only (i) in cases pursuant to Clause 17.1 as well as (ii) in cases
+ of simple negligence for damages resulting from the breach of an essential contractual duty, a duty, the
+ performance of which enables the proper execution of this Agreement in the first place and on the compliance of
+ which the User regularly relies and may rely, whereby CC's liability shall be limited to the compensation
+ of the foreseeable, typically occurring damage. The Parties agree that the typical foreseeable damage equals the
+ sum of the annual Fees paid or agreed to be paid by the User to CC during the course of the calendar year in
+ which the event giving rise to the damage claim occurred. Liability in cases of simple negligence for damages
+ resulting from the breach of a non-essential contractual duty are excluded. The limitations of liability
+ according to Clause 17.1 and Clause 17.2 do not apply (i) to damages resulting from injury to life, body or
+ health, (ii) insofar as CC has assumed a guarantee, (iii) to claims of the User according to the Product
+ Liability Act and (iv) to claims of the User according to the applicable data protection law. The limitation of
+ liability also applies to the personal liability of the organs, legal representatives, employees and vicarious
+ agents of CC. If the User suffers damages due to the loss of data, CC is not liable for this, insofar as the
+ damage would have been avoided by a regular and complete backup of all relevant data by the User. In the event
+ of disruptions to the technical infrastructure, the internet connection or a relevant Blockchain that we are not
+ responsible for, we shall be exempt from our obligation to perform. This also applies if we are prevented from
+ performing due to force majeure or other circumstances, the elimination of which is not possible or cannot be
+ economically expected of CC.
+
+
+ If the Safe App or Services are provided to the User free of charge (please note, in this context, that any
+ service, network and/or transaction fees may be charged by third parties via the Blockchain and not necessarily
+ by us), CC shall be liable only in cases of intent, gross negligence or if CC has fraudulently concealed a
+ possible material or legal defect of the Safe App or Services. If the Safe App or Services are not provided to
+ the User free of charge, CC shall be liable only (i) in cases pursuant to Clause 17.1 as well as (ii) in cases
+ of simple negligence for damages resulting from the breach of an essential contractual duty, a duty, the
+ performance of which enables the proper execution of this Agreement in the first place and on the compliance of
+ which the User regularly relies and may rely, whereby CC's liability shall be limited to the compensation
+ of the foreseeable, typically occurring damage. The Parties agree that the typical foreseeable damage equals the
+ sum of the annual Fees paid or agreed to be paid by the User to CC during the course of the calendar year in
+ which the event giving rise to the damage claim occurred. Liability in cases of simple negligence for damages
+ resulting from the breach of a non-essential contractual duty are excluded. The limitations of liability
+ according to Clause 17.1 and Clause 17.2 do not apply (i) to damages resulting from injury to life, body or
+ health, (ii) insofar as CC has assumed a guarantee, (iii) to claims of the User according to the Product
+ Liability Act and (iv) to claims of the User according to the applicable data protection law. The limitation of
+ liability also applies to the personal liability of the organs, legal representatives, employees and vicarious
+ agents of CC. If the User suffers damages due to the loss of data, CC is not liable for this, insofar as the
+ damage would have been avoided by a regular and complete backup of all relevant data by the User. In the event
+ of disruptions to the technical infrastructure, the internet connection or a relevant Blockchain that we are not
+ responsible for, we shall be exempt from our obligation to perform. This also applies if we are prevented from
+ performing due to force majeure or other circumstances, the elimination of which is not possible or cannot be
+ economically expected of CC.
+
+
+ If the Safe App or Services are provided to the User free of charge (please note, in this context, that any
+ service, network and/or transaction fees may be charged by third parties via the Blockchain and not necessarily
+ by us), CC shall be liable only in cases of intent, gross negligence or if CC has fraudulently concealed a
+ possible material or legal defect of the Safe App or Services. If the Safe App or Services are not provided to
+ the User free of charge, CC shall be liable only (i) in cases pursuant to Clause 17.1 as well as (ii) in cases
+ of simple negligence for damages resulting from the breach of an essential contractual duty, a duty, the
+ performance of which enables the proper execution of this Agreement in the first place and on the compliance of
+ which the User regularly relies and may rely, whereby CC's liability shall be limited to the compensation
+ of the foreseeable, typically occurring damage. The Parties agree that the typical foreseeable damage equals the
+ sum of the annual Fees paid or agreed to be paid by the User to CC during the course of the calendar year in
+ which the event giving rise to the damage claim occurred. Liability in cases of simple negligence for damages
+ resulting from the breach of a non-essential contractual duty are excluded. The limitations of liability
+ according to Clause 17.1 and Clause 17.2 do not apply (i) to damages resulting from injury to life, body or
+ health, (ii) insofar as CC has assumed a guarantee, (iii) to claims of the User according to the Product
+ Liability Act and (iv) to claims of the User according to the applicable data protection law. The limitation of
+ liability also applies to the personal liability of the organs, legal representatives, employees and vicarious
+ agents of CC. If the User suffers damages due to the loss of data, CC is not liable for this, insofar as the
+ damage would have been avoided by a regular and complete backup of all relevant data by the User. In the event
+ of disruptions to the technical infrastructure, the internet connection or a relevant Blockchain that we are not
+ responsible for, we shall be exempt from our obligation to perform. This also applies if we are prevented from
+ performing due to force majeure or other circumstances, the elimination of which is not possible or cannot be
+ economically expected of CC.
+
+
+ If the Safe App or Services are provided to the User free of charge (please note, in this context, that any
+ service, network and/or transaction fees may be charged by third parties via the Blockchain and not necessarily
+ by us), CC shall be liable only in cases of intent, gross negligence or if CC has fraudulently concealed a
+ possible material or legal defect of the Safe App or Services. If the Safe App or Services are not provided to
+ the User free of charge, CC shall be liable only (i) in cases pursuant to Clause 17.1 as well as (ii) in cases
+ of simple negligence for damages resulting from the breach of an essential contractual duty, a duty, the
+ performance of which enables the proper execution of this Agreement in the first place and on the compliance of
+ which the User regularly relies and may rely, whereby CC's liability shall be limited to the compensation
+ of the foreseeable, typically occurring damage. The Parties agree that the typical foreseeable damage equals the
+ sum of the annual Fees paid or agreed to be paid by the User to CC during the course of the calendar year in
+ which the event giving rise to the damage claim occurred. Liability in cases of simple negligence for damages
+ resulting from the breach of a non-essential contractual duty are excluded. The limitations of liability
+ according to Clause 17.1 and Clause 17.2 do not apply (i) to damages resulting from injury to life, body or
+ health, (ii) insofar as CC has assumed a guarantee, (iii) to claims of the User according to the Product
+ Liability Act and (iv) to claims of the User according to the applicable data protection law. The limitation of
+ liability also applies to the personal liability of the organs, legal representatives, employees and vicarious
+ agents of CC. If the User suffers damages due to the loss of data, CC is not liable for this, insofar as the
+ damage would have been avoided by a regular and complete backup of all relevant data by the User. In the event
+ of disruptions to the technical infrastructure, the internet connection or a relevant Blockchain that we are not
+ responsible for, we shall be exempt from our obligation to perform. This also applies if we are prevented from
+ performing due to force majeure or other circumstances, the elimination of which is not possible or cannot be
+ economically expected of CC.
- 14. What about viruses, bugs and security vulnerabilities?
+ 19. What about viruses, bugs and security vulnerabilities?
We endeavor to provide our Service free from material bugs, security vulnerabilities or viruses.
@@ -443,7 +670,7 @@ const SafeTerms = () => (
- 15. What if an event outside our control happens that affects our Services?
+ 20. What if an event outside our control happens that affects our Services?
We may update and change our Services from time to time. We may suspend or withdraw or restrict the availability
@@ -485,7 +712,7 @@ const SafeTerms = () => (
- 16. Who is responsible for your tax liabilities?
+ 21. Who is responsible for your tax liabilities?
You are solely responsible to determine if your use of the Services have tax implications, in particular income
tax and capital gains tax relating to the purchase or sale of Tokens, for you. By using the Services you agree not
@@ -493,7 +720,7 @@ const SafeTerms = () => (
action or transaction related thereto.
- 17. What if a court disagrees with part of this Agreement?
+ 22. What if a court disagrees with part of this Agreement?
Should individual provisions of these Terms be or become invalid or unenforceable in whole or in part, this shall
not affect the validity of the remaining provisions. The invalid or unenforceable provision shall be replaced by
@@ -502,20 +729,20 @@ const SafeTerms = () => (
valid provision that comes as close as possible to the economic purpose of the invalid or unenforceable provision.
- 18. What if we do not enforce certain rights under this Agreement?
+ 23. What if we do not enforce certain rights under this Agreement?
Our failure to exercise or enforce any right or remedy provided under this Agreement or by law shall not
constitute a waiver of that or any other right or remedy, nor shall it prevent or restrict any further exercise of
that or any other right or remedy.
- 19. Do third parties have rights?
+ 24. Do third parties have rights?
Unless it expressly states otherwise, this Agreement does not give rise to any third-party rights, which may be
enforced against us.
- 20. Can this Agreement be assigned?
+ 25. Can this Agreement be assigned?
We are entitled to transfer our rights and obligations under the Agreement in whole or in part to third parties
@@ -526,13 +753,13 @@ const SafeTerms = () => (
- 21. Which Clauses of this Agreement survive termination?
+ 26. Which Clauses of this Agreement survive termination?
All covenants, agreements, representations and warranties made in this Agreement shall survive your acceptance of
this Agreement and its termination.
- 22. Data Protection
+ 27. Data Protection
We inform you about our processing of personal data, including the disclosure to third parties and your rights as
an affected party, in the{' '}
@@ -542,7 +769,7 @@ const SafeTerms = () => (
.
- 23. Which laws apply to the Agreement?
+ 28. Which laws apply to the Agreement?
The Agreement including these Terms shall be governed by German law. The application of the UN Convention on
Contracts for the International Sale of Goods is excluded. For consumers domiciled in another European country but
@@ -551,7 +778,7 @@ const SafeTerms = () => (
German law.
- 24. How can you get support for Safe Accounts and tell us about any problems?
+ 29. How can you get support for Safe Accounts and tell us about any problems?
If you want to learn more about Safe Accounts or the Service or have any problems using them or have any
complaints please get in touch via any of the following channels:
@@ -583,14 +810,14 @@ const SafeTerms = () => (
- 25. Where is the place of legal proceedings?
+ 30. Where is the place of legal proceedings?
For users who are merchants within the meaning of the German Commercial Code (Handelsgesetzbuch), a special fund
(Sondervermögen) under public law or a legal person under public law, Berlin shall be the exclusive place of
jurisdiction for all disputes arising from the contractual relationship.
- 26. Is this all?
+ 31. Is this all?
These Terms constitute the entire agreement between you and us in relation to the Agreement’s subject
matter. It replaces and extinguishes any and all prior agreements, draft agreements, arrangements, warranties,
diff --git a/src/pages/transactions/messages.tsx b/src/pages/transactions/messages.tsx
index 656ae97f7e..e12a837fae 100644
--- a/src/pages/transactions/messages.tsx
+++ b/src/pages/transactions/messages.tsx
@@ -1,6 +1,6 @@
import { useEffect } from 'react'
import Head from 'next/head'
-import { FEATURES } from '@safe-global/safe-gateway-typescript-sdk'
+import { FEATURES } from '@/utils/chains'
import { useRouter } from 'next/router'
import type { NextPage } from 'next'
diff --git a/src/pages/transactions/msg.tsx b/src/pages/transactions/msg.tsx
new file mode 100644
index 0000000000..2db44e1e61
--- /dev/null
+++ b/src/pages/transactions/msg.tsx
@@ -0,0 +1,25 @@
+import type { NextPage } from 'next'
+import Head from 'next/head'
+
+import Typography from '@mui/material/Typography'
+import SingleMsg from '@/components/safe-messages/SingleMsg'
+
+const SingleTransaction: NextPage = () => {
+ return (
+ <>
+
+ {'Safe{Wallet} – Message details'}
+
+
+
+
+ Message details
+
+
+
+
+ >
+ )
+}
+
+export default SingleTransaction
diff --git a/src/pages/welcome/social-login.tsx b/src/pages/welcome/social-login.tsx
deleted file mode 100644
index 4232d4ff48..0000000000
--- a/src/pages/welcome/social-login.tsx
+++ /dev/null
@@ -1,17 +0,0 @@
-import type { NextPage } from 'next'
-import Head from 'next/head'
-import NewSafeSocial from '@/components/welcome/NewSafeSocial'
-
-const SocialLogin: NextPage = () => {
- return (
- <>
-
- {'Astar Safe – Welcome'}
-
-
-
- >
- )
-}
-
-export default SocialLogin
diff --git a/src/service-workers/index.ts b/src/service-workers/index.ts
index 70f1e849e8..0ed829a135 100644
--- a/src/service-workers/index.ts
+++ b/src/service-workers/index.ts
@@ -3,8 +3,5 @@
///
import { firebaseMessagingSw } from './firebase-messaging/firebase-messaging-sw'
-import { mpcCoreKitServiceWorker } from './mpc-core-kit-sw'
firebaseMessagingSw()
-
-mpcCoreKitServiceWorker()
diff --git a/src/service-workers/mpc-core-kit-sw.ts b/src/service-workers/mpc-core-kit-sw.ts
deleted file mode 100644
index 76b47bf211..0000000000
--- a/src/service-workers/mpc-core-kit-sw.ts
+++ /dev/null
@@ -1,325 +0,0 @@
-///
-
-declare const self: ServiceWorkerGlobalScope
-
-export const mpcCoreKitServiceWorker = () => {
- /* eslint-disable */
- function getScope() {
- return self.registration.scope
- }
-
- self.addEventListener('message', function (event) {
- if (event.data && event.data.type === 'SKIP_WAITING') {
- self.skipWaiting()
- }
- })
-
- self.addEventListener('fetch', function (event) {
- try {
- const url = new URL(event.request.url)
- //@ts-expect-error
- const redirectURL = self.location.url
- if (url.pathname.includes('redirect') && url.href.includes(getScope())) {
- event.respondWith(
- new Response(
- new Blob(
- [
- `
-
-
-
-
-
-
- Redirect
-
-
-
-
-
-
-
You can close this window now
-
-
-
-
-
-
- ${''}
- `,
- ],
- { type: 'text/html' },
- ),
- ),
- )
- }
- } catch (error) {
- console.error(error)
- }
- })
-}
diff --git a/src/services/ExternalStore.ts b/src/services/ExternalStore.ts
index 34b65821e9..fbd5d71960 100644
--- a/src/services/ExternalStore.ts
+++ b/src/services/ExternalStore.ts
@@ -23,7 +23,7 @@ class ExternalStore {
}
}
- private readonly subscribe = (listener: Listener): (() => void) => {
+ public readonly subscribe = (listener: Listener): (() => void) => {
this.listeners.add(listener)
return () => {
this.listeners.delete(listener)
diff --git a/src/services/analytics/__tests__/tx-tracking.test.ts b/src/services/analytics/__tests__/tx-tracking.test.ts
index 41705985ca..d8c58b3219 100644
--- a/src/services/analytics/__tests__/tx-tracking.test.ts
+++ b/src/services/analytics/__tests__/tx-tracking.test.ts
@@ -138,14 +138,12 @@ describe('getTransactionTrackingType', () => {
expect(txType).toEqual(TX_TYPES.rejection)
})
- it('should return walletconnect for walletconnect transactions', async () => {
+ it('should return walletconnect for transactions w/o safeAppInfo', async () => {
const txType = await getMockTxType({
txInfo: {
type: TransactionInfoType.CUSTOM,
},
- safeAppInfo: {
- url: 'https://safe-apps.dev.5afe.dev/wallet-connect',
- },
+ safeAppInfo: null,
} as unknown)
expect(txType).toEqual(TX_TYPES.walletconnect)
@@ -175,14 +173,4 @@ describe('getTransactionTrackingType', () => {
expect(txType).toEqual(TX_TYPES.batch)
})
-
- it('should return custom for unknown transactions', async () => {
- const txType = await getMockTxType({
- txInfo: {
- type: TransactionInfoType.CUSTOM,
- },
- } as unknown)
-
- expect(txType).toEqual(TX_TYPES.custom)
- })
})
diff --git a/src/services/analytics/events/batching.ts b/src/services/analytics/events/batching.ts
index 91c42ebe90..e6f312a390 100644
--- a/src/services/analytics/events/batching.ts
+++ b/src/services/analytics/events/batching.ts
@@ -16,11 +16,6 @@ export const BATCH_EVENTS = {
action: 'Tx added to batch',
category,
},
- // On reorder of batch items
- BATCH_REORDER: {
- action: 'Batch reorder',
- category,
- },
// When batch item details are expanded
BATCH_EXPAND_TX: {
action: 'Expand batched tx',
diff --git a/src/services/analytics/events/createLoadSafe.ts b/src/services/analytics/events/createLoadSafe.ts
index 32e860e2a8..991c84d294 100644
--- a/src/services/analytics/events/createLoadSafe.ts
+++ b/src/services/analytics/events/createLoadSafe.ts
@@ -61,10 +61,6 @@ export const CREATE_SAFE_EVENTS = {
action: 'Activated Safe',
category: CREATE_SAFE_CATEGORY,
},
- GET_STARTED: {
- action: 'Load Safe',
- category: CREATE_SAFE_CATEGORY,
- },
OPEN_HINT: {
action: 'Open Hint',
category: CREATE_SAFE_CATEGORY,
diff --git a/src/services/analytics/events/modals.ts b/src/services/analytics/events/modals.ts
index b8fd8df76b..e90fb9d334 100644
--- a/src/services/analytics/events/modals.ts
+++ b/src/services/analytics/events/modals.ts
@@ -63,6 +63,10 @@ export const MODALS_EVENTS = {
category: MODALS_CATEGORY,
event: EventType.CLICK,
},
+ SWAP: {
+ action: 'Swap',
+ category: MODALS_CATEGORY,
+ },
}
export enum MODAL_NAVIGATION {
diff --git a/src/services/analytics/events/mpcWallet.ts b/src/services/analytics/events/mpcWallet.ts
deleted file mode 100644
index 53254ead36..0000000000
--- a/src/services/analytics/events/mpcWallet.ts
+++ /dev/null
@@ -1,61 +0,0 @@
-import { EventType } from '@/services/analytics/types'
-
-const MPC_WALLET_CATEGORY = 'mpc-wallet'
-
-export const MPC_WALLET_EVENTS = {
- CONNECT_GOOGLE: {
- event: EventType.CLICK,
- action: 'Continue with Google button',
- category: MPC_WALLET_CATEGORY,
- },
- MANUAL_RECOVERY: {
- event: EventType.META,
- action: 'MFA login started',
- category: MPC_WALLET_CATEGORY,
- },
- RECOVER_PASSWORD: {
- event: EventType.CLICK,
- action: 'Recover account using password',
- category: MPC_WALLET_CATEGORY,
- },
- RECOVERED_SOCIAL_SIGNER: {
- event: EventType.META,
- action: 'Recovered social signer',
- category: MPC_WALLET_CATEGORY,
- },
- UPSERT_PASSWORD: {
- event: EventType.CLICK,
- action: 'Set or change password',
- category: MPC_WALLET_CATEGORY,
- },
- ENABLE_MFA: {
- event: EventType.META,
- action: 'Enable MFA for account',
- category: MPC_WALLET_CATEGORY,
- },
- REVEAL_PRIVATE_KEY: {
- event: EventType.CLICK,
- action: 'Reveal private key',
- category: MPC_WALLET_CATEGORY,
- },
- EXPORT_PK_SUCCESS: {
- event: EventType.META,
- action: 'Export private key successful',
- category: MPC_WALLET_CATEGORY,
- },
- EXPORT_PK_ERROR: {
- event: EventType.META,
- action: 'Export private key error',
- category: MPC_WALLET_CATEGORY,
- },
- SEE_PK: {
- event: EventType.CLICK,
- action: 'Toggle see private key',
- category: MPC_WALLET_CATEGORY,
- },
- COPY_PK: {
- event: EventType.CLICK,
- action: 'Copy private key',
- category: MPC_WALLET_CATEGORY,
- },
-}
diff --git a/src/services/analytics/events/overview.ts b/src/services/analytics/events/overview.ts
index f006f126b8..0552c87cfd 100644
--- a/src/services/analytics/events/overview.ts
+++ b/src/services/analytics/events/overview.ts
@@ -38,10 +38,12 @@ export const OVERVIEW_EVENTS = {
TOTAL_SAFES_OWNED: {
action: 'Total Safes owned',
category: OVERVIEW_CATEGORY,
+ event: EventType.META,
},
TOTAL_SAFES_WATCHLIST: {
action: 'Total Safes watchlist',
category: OVERVIEW_CATEGORY,
+ event: EventType.META,
},
SIDEBAR: {
action: 'Sidebar',
diff --git a/src/services/analytics/events/swaps.ts b/src/services/analytics/events/swaps.ts
index 6b7fb3bf93..a90da152ac 100644
--- a/src/services/analytics/events/swaps.ts
+++ b/src/services/analytics/events/swaps.ts
@@ -7,8 +7,11 @@ export const SWAP_EVENTS = {
},
}
-export const SWAP_LABELS = {
- dashboard: 'dashboard',
- sidebar: 'sidebar',
- asset: 'asset',
+export enum SWAP_LABELS {
+ dashboard = 'dashboard',
+ sidebar = 'sidebar',
+ asset = 'asset',
+ dashboard_assets = 'dashboard_assets',
+ promoWidget = 'promoWidget',
+ safeAppsPromoWidget = 'safeAppsPromoWidget',
}
diff --git a/src/services/analytics/events/transactions.ts b/src/services/analytics/events/transactions.ts
index 48a456f7ee..74f83b9c77 100644
--- a/src/services/analytics/events/transactions.ts
+++ b/src/services/analytics/events/transactions.ts
@@ -22,6 +22,7 @@ export enum TX_TYPES {
walletconnect = 'walletconnect',
custom = 'custom',
native_swap = 'native_swap',
+ bulk_execute = 'bulk_execute',
// Counterfactual
activate_without_tx = 'activate_without_tx',
@@ -52,4 +53,9 @@ export const TX_EVENTS = {
action: 'Speed up transaction',
category: TX_CATEGORY,
},
+ EXECUTE_THROUGH_ROLE: {
+ event: EventType.TX_EXECUTED_THROUGH_ROLE,
+ action: 'Execute transaction through role',
+ category: TX_CATEGORY,
+ },
}
diff --git a/src/services/analytics/events/txList.ts b/src/services/analytics/events/txList.ts
index 7cdcc687b4..12b0ea586d 100644
--- a/src/services/analytics/events/txList.ts
+++ b/src/services/analytics/events/txList.ts
@@ -67,4 +67,8 @@ export const MESSAGE_EVENTS = {
action: 'Sign message',
category: TX_LIST_CATEGORY,
},
+ COPY_DEEPLINK: {
+ action: 'Copy message deeplink',
+ category: TX_LIST_CATEGORY,
+ },
}
diff --git a/src/services/analytics/gtm.ts b/src/services/analytics/gtm.ts
index cb004e7de9..3945b2d9ed 100644
--- a/src/services/analytics/gtm.ts
+++ b/src/services/analytics/gtm.ts
@@ -58,7 +58,7 @@ export const gtmSetDeviceType = (type: DeviceType): void => {
}
export const gtmSetSafeAddress = (safeAddress: string): void => {
- commonEventParams.safeAddress = safeAddress.slice(2)
+ commonEventParams.safeAddress = safeAddress.slice(2) // Remove 0x prefix
}
export const gtmInit = (): void => {
diff --git a/src/services/analytics/tx-tracking.ts b/src/services/analytics/tx-tracking.ts
index 6073c1a489..0f9af3359b 100644
--- a/src/services/analytics/tx-tracking.ts
+++ b/src/services/analytics/tx-tracking.ts
@@ -1,6 +1,5 @@
import { TX_TYPES } from '@/services/analytics/events/transactions'
import { getTxDetails } from '@/services/transactions'
-import { isWalletConnectSafeApp } from '@/utils/gateway'
import { SettingsInfoType, type TransactionDetails } from '@safe-global/safe-gateway-typescript-sdk'
import {
isERC721Transfer,
@@ -9,7 +8,7 @@ import {
isTransferTxInfo,
isCustomTxInfo,
isCancellationTxInfo,
- isSwapTxInfo,
+ isSwapOrderTxInfo,
} from '@/utils/transaction-guards'
export const getTransactionTrackingType = async (chainId: string, txId: string): Promise => {
@@ -30,7 +29,7 @@ export const getTransactionTrackingType = async (chainId: string, txId: string):
return TX_TYPES.transfer_token
}
- if (isSwapTxInfo(txInfo)) {
+ if (isSwapOrderTxInfo(txInfo)) {
return TX_TYPES.native_swap
}
@@ -63,12 +62,14 @@ export const getTransactionTrackingType = async (chainId: string, txId: string):
}
if (details.safeAppInfo) {
- return isWalletConnectSafeApp(details.safeAppInfo.url) ? TX_TYPES.walletconnect : details.safeAppInfo.url
+ return details.safeAppInfo.url
}
if (isMultiSendTxInfo(txInfo)) {
return TX_TYPES.batch
}
+
+ return TX_TYPES.walletconnect
}
return TX_TYPES.custom
diff --git a/src/services/analytics/types.ts b/src/services/analytics/types.ts
index 855b791403..781615ffbf 100644
--- a/src/services/analytics/types.ts
+++ b/src/services/analytics/types.ts
@@ -13,6 +13,7 @@ export enum EventType {
TX_CREATED = 'tx_created',
TX_CONFIRMED = 'tx_confirmed',
TX_EXECUTED = 'tx_executed',
+ TX_EXECUTED_THROUGH_ROLE = 'tx_executed_through_role',
}
export type EventLabel = string | number | boolean | null
diff --git a/src/services/analytics/useGtm.ts b/src/services/analytics/useGtm.ts
index f5e1906a39..95f546f6d5 100644
--- a/src/services/analytics/useGtm.ts
+++ b/src/services/analytics/useGtm.ts
@@ -16,7 +16,7 @@ import {
} from '@/services/analytics/gtm'
import { spindlInit, spindlAttribute } from './spindl'
import { useAppSelector } from '@/store'
-import { CookieType, selectCookies } from '@/store/cookiesSlice'
+import { CookieAndTermType, selectCookies } from '@/store/cookiesAndTermsSlice'
import useChainId from '@/hooks/useChainId'
import { useRouter } from 'next/router'
import { AppRoutes } from '@/config/routes'
@@ -30,7 +30,7 @@ import { OVERVIEW_EVENTS } from './events'
const useGtm = () => {
const chainId = useChainId()
const cookies = useAppSelector(selectCookies)
- const isAnalyticsEnabled = cookies[CookieType.ANALYTICS] || false
+ const isAnalyticsEnabled = cookies[CookieAndTermType.ANALYTICS] || false
const [, setPrevAnalytics] = useState(isAnalyticsEnabled)
const router = useRouter()
const theme = useTheme()
@@ -96,7 +96,7 @@ const useGtm = () => {
useEffect(() => {
if (wallet?.address) {
- gtmSetUserProperty(AnalyticsUserProperties.WALLET_ADDRESS, wallet.address)
+ gtmSetUserProperty(AnalyticsUserProperties.WALLET_ADDRESS, wallet.address.slice(2)) // Remove 0x prefix
spindlAttribute(wallet.address)
}
}, [wallet?.address])
diff --git a/src/services/contracts/deployments.ts b/src/services/contracts/deployments.ts
index d1bf681416..181b8ff5b6 100644
--- a/src/services/contracts/deployments.ts
+++ b/src/services/contracts/deployments.ts
@@ -6,6 +6,7 @@ import {
getFallbackHandlerDeployment,
getProxyFactoryDeployment,
getSignMessageLibDeployment,
+ getCreateCallDeployment,
} from '@safe-global/safe-deployments'
import type { SingletonDeployment, DeploymentFilter } from '@safe-global/safe-deployments'
import type { ChainInfo, SafeInfo } from '@safe-global/safe-gateway-typescript-sdk'
@@ -79,3 +80,7 @@ export const getProxyFactoryContractDeployment = (chainId: string, safeVersion:
export const getSignMessageLibContractDeployment = (chainId: string, safeVersion: SafeInfo['version']) => {
return _tryDeploymentVersions(getSignMessageLibDeployment, chainId, safeVersion)
}
+
+export const getCreateCallContractDeployment = (chainId: string, safeVersion: SafeInfo['version']) => {
+ return _tryDeploymentVersions(getCreateCallDeployment, chainId, safeVersion)
+}
diff --git a/src/services/exceptions/ErrorCodes.ts b/src/services/exceptions/ErrorCodes.ts
index 95c50e7639..be96e60985 100644
--- a/src/services/exceptions/ErrorCodes.ts
+++ b/src/services/exceptions/ErrorCodes.ts
@@ -11,7 +11,7 @@ enum ErrorCodes {
_101 = '101: Failed to resolve the address',
_103 = '103: Error creating a SafeTransaction',
_104 = '104: Invalid chain short name in the URL',
- _105 = '105: Error initializing the Safe Core SDK',
+ _105 = '105: Error connecting to the blockchain',
_106 = '106: Failed to get connected wallet',
_302 = '302: Error connecting to the wallet',
@@ -66,6 +66,7 @@ enum ErrorCodes {
_812 = '812: Failed to recover',
_813 = '813: Failed to cancel recovery',
_814 = '814: Failed to speed up transaction',
+ _815 = '815: Error executing a transaction through a role',
_900 = '900: Error loading Safe App',
_901 = '901: Error processing Safe Apps SDK request',
diff --git a/src/services/local-storage/session.ts b/src/services/local-storage/session.ts
index 1d297b5fcd..1a1a45178d 100644
--- a/src/services/local-storage/session.ts
+++ b/src/services/local-storage/session.ts
@@ -2,4 +2,10 @@ import Storage from './Storage'
const session = new Storage(typeof window !== 'undefined' ? window.sessionStorage : undefined)
+export const sessionItem = (key: string) => ({
+ get: () => session.getItem(key),
+ set: (value: T) => session.setItem(key, value),
+ remove: () => session.removeItem(key),
+})
+
export default session
diff --git a/src/services/mpc/PasswordRecoveryModal.tsx b/src/services/mpc/PasswordRecoveryModal.tsx
deleted file mode 100644
index 7a7e1d08ab..0000000000
--- a/src/services/mpc/PasswordRecoveryModal.tsx
+++ /dev/null
@@ -1,42 +0,0 @@
-import { PasswordRecovery } from '@/components/common/SocialSigner/PasswordRecovery'
-import TxModalDialog from '@/components/common/TxModalDialog'
-import useSocialWallet from '@/hooks/wallets/mpc/useSocialWallet'
-import ExternalStore from '@/services/ExternalStore'
-
-const { useStore: useCloseCallback, setStore: setCloseCallback } = new ExternalStore<() => void>()
-
-export const open = (cb: () => void) => {
- setCloseCallback(() => cb)
-}
-
-export const close = () => {
- setCloseCallback(undefined)
-}
-
-const PasswordRecoveryModal = () => {
- const socialWalletService = useSocialWallet()
- const closeCallback = useCloseCallback()
- const open = !!closeCallback
-
- const handleClose = () => {
- closeCallback?.()
- setCloseCallback(undefined)
- close()
- }
-
- const recoverPassword = async (password: string, storeDeviceFactor: boolean) => {
- if (!socialWalletService) return
-
- await socialWalletService.recoverAccountWithPassword(password, storeDeviceFactor)
- }
-
- if (!open) return null
-
- return (
-
-
-
- )
-}
-
-export default PasswordRecoveryModal
diff --git a/src/services/mpc/SocialLoginModule.ts b/src/services/mpc/SocialLoginModule.ts
deleted file mode 100644
index 84052dfbed..0000000000
--- a/src/services/mpc/SocialLoginModule.ts
+++ /dev/null
@@ -1,138 +0,0 @@
-import { getWeb3ReadOnly } from '@/hooks/wallets/web3'
-import { FEATURES, hasFeature } from '@/utils/chains'
-import type { ChainInfo } from '@safe-global/safe-gateway-typescript-sdk'
-import { type WalletInit, ProviderRpcError } from '@web3-onboard/common'
-import { type EIP1193Provider } from '@web3-onboard/core'
-import { type Web3AuthMPCCoreKit } from '@web3auth/mpc-core-kit'
-
-const assertDefined = (mpcProvider: T | undefined) => {
- if (!mpcProvider) {
- throw new Error('MPC provider is not ready. Login and initialize it first')
- }
- return mpcProvider
-}
-
-export const ONBOARD_MPC_MODULE_LABEL = 'Social Login'
-
-export const isSocialLoginWallet = (walletLabel: string | undefined) => {
- return walletLabel === ONBOARD_MPC_MODULE_LABEL
-}
-
-const getConnectedAccounts = async (provider: typeof Web3AuthMPCCoreKit.prototype.provider | undefined) => {
- try {
- const web3 = assertDefined(provider)
- return web3.request({ method: 'eth_accounts' })
- } catch (e) {
- throw new ProviderRpcError({
- code: 4001,
- message: 'Provider is unavailable',
- })
- }
-}
-
-/**
- * Module for MPC wallet created by the Web3Auth tKey MPC.
- * We gain access to the provider created by tKey MPC after a successful login.
- * This module returns a provider which will always get the current MPC Wallet provider from an ExternalStore and delegate all calls to it.
- *
- * @returns Custom Onboard MpcModule
- */
-function MpcModule(chain: ChainInfo): WalletInit {
- if (!hasFeature(chain, FEATURES.SOCIAL_LOGIN)) return () => null
-
- return () => {
- return {
- label: ONBOARD_MPC_MODULE_LABEL,
- getIcon: async () => (await import('./icon')).default,
- getInterface: async () => {
- const { _getMPCCoreKitInstance } = await import('@/hooks/wallets/mpc/useMPC')
- const { getSocialWalletService } = await import('@/hooks/wallets/mpc/useSocialWallet')
- const { COREKIT_STATUS } = await import('@web3auth/mpc-core-kit')
- const { open } = await import('./PasswordRecoveryModal')
-
- const getMPCProvider = () => _getMPCCoreKitInstance()?.provider
-
- const provider: EIP1193Provider = {
- on: (event, listener) => {
- const web3 = assertDefined(getMPCProvider())
- web3.on(event, listener)
- },
- request: (request) => {
- return new Promise(async (resolve, reject) => {
- try {
- /*
- * We have to fallback to web3ReadOnly for eth_estimateGas because the provider by Web3Auth does not expose / implement it.
- */
- if ('eth_estimateGas' === request.method) {
- const web3ReadOnly = assertDefined(getWeb3ReadOnly())
-
- web3ReadOnly
- ?.send(request.method, request.params ?? [])
- .then(resolve)
- .catch(reject)
-
- return
- }
-
- if ('eth_requestAccounts' === request.method) {
- try {
- // If the provider is defined we already have access to the accounts.
- const web3 = assertDefined(getMPCProvider())
- web3.request({ method: 'eth_accounts' }).then(resolve).catch(reject)
- } catch (e) {
- // Otherwise try to log in the user
- const socialWalletService = getSocialWalletService()
- if (!socialWalletService) throw Error('Social Login not ready')
-
- const status = await socialWalletService.loginAndCreate()
-
- if (status === COREKIT_STATUS.REQUIRED_SHARE) {
- open(() => {
- getConnectedAccounts(getMPCProvider()).then(resolve).catch(reject)
- })
- } else {
- getConnectedAccounts(getMPCProvider()).then(resolve).catch(reject)
- }
- }
- return
- }
-
- if ('wallet_switchEthereumChain' === request.method) {
- // The MPC provider always uses the current chain as chain. Nothing to do here.
- resolve(null)
- return
- }
-
- const web3 = assertDefined(getMPCProvider())
- // Default: we call the inner provider
- web3.request(request).then(resolve).catch(reject)
- return
- } catch (error) {
- reject(
- new ProviderRpcError({
- // TODO: This error code is usually for user rejection. But 4009 for instance has no effect with onboard
- code: 4001,
- message: 'Provider is unavailable',
- }),
- )
- }
- })
- },
- removeListener: (event, listener) => {
- const web3 = assertDefined(getMPCProvider())
- return web3.removeListener(event, listener)
- },
- disconnect: () => {
- _getMPCCoreKitInstance()?.logout()
- },
- }
-
- return {
- provider,
- }
- },
- }
- }
-}
-
-export default MpcModule
diff --git a/src/services/mpc/SocialWalletService.ts b/src/services/mpc/SocialWalletService.ts
deleted file mode 100644
index 12cad18cdb..0000000000
--- a/src/services/mpc/SocialWalletService.ts
+++ /dev/null
@@ -1,207 +0,0 @@
-import { COREKIT_STATUS, type Web3AuthMPCCoreKit } from '@web3auth/mpc-core-kit'
-import BN from 'bn.js'
-import { SecurityQuestionRecovery } from '@/services/mpc/recovery/SecurityQuestionRecovery'
-import { trackEvent } from '@/services/analytics'
-import { MPC_WALLET_EVENTS } from '@/services/analytics/events/mpcWallet'
-import { DeviceShareRecovery } from '@/services/mpc/recovery/DeviceShareRecovery'
-import { logError } from '../exceptions'
-import ErrorCodes from '../exceptions/ErrorCodes'
-import { asError } from '../exceptions/utils'
-import { type ISocialWalletService } from './interfaces'
-import { isSocialWalletOptions, SOCIAL_WALLET_OPTIONS } from './config'
-
-const ERROR_MSG_NO_NEW_ACCOUNTS =
- 'Social Login is deprecated and will be removed on 01.05.2024. New accounts cannot be created.'
-
-/**
- * Singleton Service for accessing the social login wallet
- */
-class SocialWalletService implements ISocialWalletService {
- private mpcCoreKit: Web3AuthMPCCoreKit
- private onConnect: () => Promise = () => Promise.resolve()
-
- private deviceShareRecovery: DeviceShareRecovery
- private securityQuestionRecovery: SecurityQuestionRecovery
-
- constructor(mpcCoreKit: Web3AuthMPCCoreKit) {
- this.mpcCoreKit = mpcCoreKit
- this.deviceShareRecovery = new DeviceShareRecovery(mpcCoreKit)
- this.securityQuestionRecovery = new SecurityQuestionRecovery(mpcCoreKit)
- }
-
- isMFAEnabled() {
- const { shareDescriptions } = this.mpcCoreKit.getKeyDetails()
- return !Object.values(shareDescriptions).some((value) => value[0]?.includes('hashedShare'))
- }
-
- /**
- *
- * An Account is considered new if
- * - It has no MFA setup
- * - the hashedShare was created in the past 5 minutes
- *
- * @returns true if account is new, false otherwise
- */
- isAccountNew() {
- const { shareDescriptions } = this.mpcCoreKit.getKeyDetails()
- const hashedShare = Object.values(shareDescriptions).find((value) => value[0]?.includes('hashedShare'))
-
- if (!hashedShare || hashedShare.length > 1) {
- return false
- }
-
- try {
- const firstShare = hashedShare[0]
- const data = JSON.parse(firstShare)
- if ('dateAdded' in data) {
- const dateAdded = Number(data.dateAdded)
- const timeDiff = Date.now() - dateAdded
- if (timeDiff < 1000 * 5 * 60) {
- return true
- }
- }
- } catch {}
- return false
- }
-
- isRecoveryPasswordSet() {
- return this.securityQuestionRecovery.isEnabled()
- }
-
- async enableMFA(oldPassword: string | undefined, newPassword: string): Promise {
- try {
- // 1. setup device factor with password recovery
- await this.securityQuestionRecovery.upsertPassword(newPassword, oldPassword)
- const securityQuestionFactor = await this.securityQuestionRecovery.recoverWithPassword(newPassword)
- if (!securityQuestionFactor) {
- throw Error('Problem setting up the new password')
- }
-
- if (!this.isMFAEnabled()) {
- trackEvent({ ...MPC_WALLET_EVENTS.ENABLE_MFA, label: 'password' })
- // 2. enable MFA in mpcCoreKit
- await this.mpcCoreKit.enableMFA({}, false)
- }
-
- await this.mpcCoreKit.commitChanges()
- } catch (e) {
- const error = asError(e)
- logError(ErrorCodes._304, error.message)
- throw error
- }
- }
-
- setOnConnect(onConnect: () => Promise) {
- this.onConnect = onConnect
- }
-
- getUserInfo() {
- return this.mpcCoreKit.state.userInfo
- }
-
- async loginAndCreate(): Promise {
- const config = SOCIAL_WALLET_OPTIONS
- const isConfigured = isSocialWalletOptions(config)
- if (!isConfigured) {
- throw new Error('The Social signer wallet is not configured correctly')
- }
- try {
- await this.mpcCoreKit.loginWithOauth({
- aggregateVerifierIdentifier: config.web3AuthAggregateVerifierId,
- subVerifierDetailsArray: [
- {
- clientId: config.googleClientId,
- typeOfLogin: 'google',
- verifier: config.web3AuthSubverifierId,
- },
- ],
- aggregateVerifierType: 'single_id_verifier',
- })
-
- if (this.mpcCoreKit.status === COREKIT_STATUS.REQUIRED_SHARE) {
- // Check if we have a device share stored
- if (await this.deviceShareRecovery.isEnabled()) {
- await this.deviceShareRecovery.recoverWithDeviceFactor()
- } else {
- // Check password recovery
- if (this.securityQuestionRecovery.isEnabled()) {
- trackEvent(MPC_WALLET_EVENTS.MANUAL_RECOVERY)
- return this.mpcCoreKit.status
- }
- }
- }
-
- await this.finalizeLogin()
- return this.mpcCoreKit.status
- } catch (err) {
- const error = asError(err)
- if (error.message === ERROR_MSG_NO_NEW_ACCOUNTS) {
- logError(ErrorCodes._307, error)
- throw err
- }
- logError(ErrorCodes._306, error)
- throw new Error('Something went wrong. Please try to login again.')
- }
- }
-
- private async finalizeLogin() {
- if (this.mpcCoreKit.status === COREKIT_STATUS.LOGGED_IN) {
- if (this.isAccountNew()) {
- throw new Error(ERROR_MSG_NO_NEW_ACCOUNTS)
- }
- await this.mpcCoreKit.commitChanges()
- await this.mpcCoreKit.provider?.request({ method: 'eth_accounts', params: [] })
- await this.onConnect()
- }
- }
-
- async recoverAccountWithPassword(password: string, storeDeviceShare: boolean = false) {
- if (this.securityQuestionRecovery.isEnabled()) {
- const factorKeyString = await this.securityQuestionRecovery.recoverWithPassword(password)
- const factorKey = new BN(factorKeyString, 'hex')
- await this.mpcCoreKit.inputFactorKey(factorKey)
-
- if (storeDeviceShare) {
- await this.deviceShareRecovery.createAndStoreDeviceFactor()
- }
-
- await this.finalizeLogin()
- }
-
- if (this.mpcCoreKit.status === COREKIT_STATUS.LOGGED_IN) {
- trackEvent({ ...MPC_WALLET_EVENTS.RECOVERED_SOCIAL_SIGNER, label: 'password' })
- }
-
- return this.mpcCoreKit.status === COREKIT_STATUS.LOGGED_IN
- }
-
- async exportSignerKey(password: string): Promise {
- try {
- if (this.securityQuestionRecovery.isEnabled()) {
- // Only export PK if recovery works
- await this.securityQuestionRecovery.recoverWithPassword(password)
- }
- const exportedPK = await this.mpcCoreKit?._UNSAFE_exportTssKey()
- return exportedPK
- } catch (err) {
- throw new Error('Error exporting account. Make sure the password is correct.')
- }
- }
-
- async __deleteAccount() {
- // This is a critical function that should only be used for testing purposes
- // Resetting your account means clearing all the metadata associated with it from the metadata server
- // The key details will be deleted from our server and you will not be able to recover your account
- if (!this.mpcCoreKit?.metadataKey) {
- throw new Error('MPC Core Kit is not initialized or the user is not logged in')
- }
-
- // In web3auth an account is reset by overwriting the metadata with KEY_NOT_FOUND
- await this.mpcCoreKit.tKey.storageLayer.setMetadata({
- privKey: new BN(this.mpcCoreKit.metadataKey, 'hex'),
- input: { message: 'KEY_NOT_FOUND' },
- })
- }
-}
-
-export default SocialWalletService
diff --git a/src/services/mpc/__mocks__/SocialWalletService.ts b/src/services/mpc/__mocks__/SocialWalletService.ts
deleted file mode 100644
index c8d074772f..0000000000
--- a/src/services/mpc/__mocks__/SocialWalletService.ts
+++ /dev/null
@@ -1,74 +0,0 @@
-import { COREKIT_STATUS, type UserInfo } from '@web3auth/mpc-core-kit'
-import { toBeHex } from 'ethers'
-import { type ISocialWalletService } from '../interfaces'
-
-/**
- * Manual mock for SocialWalletService
- *
- * By default it will log in the user after a 1 second timer.
- * For password recovery it expects the password to be "Test1234!"
- */
-class TestSocialWalletService implements ISocialWalletService {
- private fakePassword = 'Test1234!'
- private postLoginState = COREKIT_STATUS.LOGGED_IN
- private _isMfaEnabled = false
- private onConnect: () => Promise = () => Promise.resolve()
- private userInfo: UserInfo = {
- email: 'test@testermann.com',
- name: 'Test Testermann',
- profileImage: 'test.testermann.local/profile.png',
- } as unknown as UserInfo
-
- setOnConnect(onConnect: () => Promise): void {
- this.onConnect = onConnect
- }
-
- getUserInfo(): UserInfo | undefined {
- return this.userInfo
- }
- isMFAEnabled(): boolean {
- return this._isMfaEnabled
- }
- enableMFA(oldPassword: string, newPassword: string): Promise {
- this._isMfaEnabled = true
- return Promise.resolve()
- }
- isRecoveryPasswordSet(): boolean {
- throw new Error('Method not implemented.')
- }
-
- /**
- * Method for tests to set the expected login state after calling loginAndCreate()
- */
- __setPostLoginState(state: COREKIT_STATUS) {
- this.postLoginState = state
- }
-
- __setUserInfo(userInfo: UserInfo) {
- this.userInfo = userInfo
- }
-
- async loginAndCreate(): Promise {
- return new Promise((resolve) => {
- this.onConnect().then(() => resolve(this.postLoginState))
- })
- }
-
- __deleteAccount(): void {
- throw new Error('Method not implemented.')
- }
- async recoverAccountWithPassword(password: string, storeDeviceFactor: boolean): Promise {
- if (this.fakePassword === password) {
- await this.onConnect()
- return true
- }
-
- throw Error('Invalid Password')
- }
-
- exportSignerKey(password: string): Promise {
- return Promise.resolve(toBeHex('0x1', 20))
- }
-}
-
-export default TestSocialWalletService
diff --git a/src/services/mpc/__tests__/SocialWalletService.test.ts b/src/services/mpc/__tests__/SocialWalletService.test.ts
deleted file mode 100644
index 8e124bcaa1..0000000000
--- a/src/services/mpc/__tests__/SocialWalletService.test.ts
+++ /dev/null
@@ -1,340 +0,0 @@
-import { act, waitFor } from '@/tests/test-utils'
-import {
- COREKIT_STATUS,
- type UserInfo,
- type OauthLoginParams,
- type Web3AuthMPCCoreKit,
- type TssSecurityQuestion,
-} from '@web3auth/mpc-core-kit'
-import * as mpcCoreKit from '@web3auth/mpc-core-kit'
-import * as socialWalletOptions from '@/services/mpc/config'
-import { ethers } from 'ethers'
-import BN from 'bn.js'
-import SocialWalletService from '../SocialWalletService'
-
-/** time until mock login resolves */
-const MOCK_LOGIN_TIME = 1000
-
-/**
- * Helper class for mocking MPC Core Kit login flow
- */
-class MockMPCCoreKit {
- status: COREKIT_STATUS = COREKIT_STATUS.INITIALIZED
- state: {
- userInfo: UserInfo | undefined
- } = {
- userInfo: undefined,
- }
-
- private stateAfterLogin: COREKIT_STATUS
- private userInfoAfterLogin: UserInfo | undefined
- private expectedFactorKey: BN
- private expectedKeyDetails: { shareDescriptions: Record }
- /**
- *
- * @param stateAfterLogin State after loginWithOauth resolves
- * @param userInfoAfterLogin User info to set in the state after loginWithOauth resolves
- * @param expectedFactorKey For MFA login flow the expected factor key. If inputFactorKey gets called with the expected factor key the state switches to logged in
- */
- constructor(
- stateAfterLogin: COREKIT_STATUS,
- userInfoAfterLogin: UserInfo,
- expectedFactorKey: BN = new BN(-1),
- expectedKeyDetails = { shareDescriptions: {} },
- ) {
- this.stateAfterLogin = stateAfterLogin
- this.userInfoAfterLogin = userInfoAfterLogin
- this.expectedFactorKey = expectedFactorKey
- this.expectedKeyDetails = expectedKeyDetails
- }
-
- loginWithOauth(params: OauthLoginParams): Promise {
- return new Promise((resolve) => {
- // Resolve after 1 sec
- setTimeout(() => {
- this.status = this.stateAfterLogin
- this.state.userInfo = this.userInfoAfterLogin
- resolve()
- }, MOCK_LOGIN_TIME)
- })
- }
-
- inputFactorKey(factorKey: BN) {
- if (factorKey.eq(this.expectedFactorKey)) {
- this.status = COREKIT_STATUS.LOGGED_IN
- return Promise.resolve()
- } else {
- Promise.reject()
- }
- }
-
- commitChanges = jest.fn().mockImplementation(() => Promise.resolve())
-
- getUserInfo() {
- return this.state.userInfo
- }
-
- getKeyDetails() {
- return this.expectedKeyDetails
- }
-}
-
-describe('useMPCWallet', () => {
- beforeAll(() => {
- jest.useFakeTimers()
- })
- beforeEach(() => {
- jest.resetAllMocks()
- jest.spyOn(socialWalletOptions, 'isSocialWalletOptions').mockReturnValue(true)
- })
- afterAll(() => {
- jest.useRealTimers()
- })
-
- describe('triggerLogin', () => {
- it('should handle successful log in for SFA account', async () => {
- const mockOnConnect = jest.fn()
-
- const mockCoreKit = new MockMPCCoreKit(
- COREKIT_STATUS.LOGGED_IN,
- {
- email: 'test@test.com',
- name: 'Test',
- } as unknown as UserInfo,
- new BN(-1),
- {
- shareDescriptions: {
- 1: [
- JSON.stringify({
- dateAdded: Date.now() - 30 * 24 * 60 * 60 * 60 * 1000,
- module: 'hashedShare',
- }),
- ],
- },
- },
- ) as unknown as Web3AuthMPCCoreKit
-
- const testService = new SocialWalletService(mockCoreKit)
- testService.setOnConnect(mockOnConnect)
-
- let status: Promise
- act(() => {
- status = testService.loginAndCreate()
- })
-
- expect(mockOnConnect).not.toHaveBeenCalled()
-
- // Resolve mock login
- act(() => {
- jest.advanceTimersByTime(MOCK_LOGIN_TIME)
- })
-
- // We should be logged in and onboard should get connected
- await waitFor(() => {
- expect(status).resolves.toEqual(COREKIT_STATUS.LOGGED_IN)
- expect(mockOnConnect).toHaveBeenCalled()
- expect(mockCoreKit.commitChanges).toHaveBeenCalled()
- })
- })
-
- it('should not allow logins to newly created SFA accounts', async () => {
- const mockOnConnect = jest.fn()
-
- const mockCoreKit = new MockMPCCoreKit(
- COREKIT_STATUS.LOGGED_IN,
- {
- email: 'test@test.com',
- name: 'Test',
- } as unknown as UserInfo,
- new BN(-1),
- {
- shareDescriptions: {
- 1: [
- JSON.stringify({
- dateAdded: Date.now() - 5,
- module: 'hashedShare',
- }),
- ],
- },
- },
- ) as unknown as Web3AuthMPCCoreKit
-
- const testService = new SocialWalletService(mockCoreKit)
- testService.setOnConnect(mockOnConnect)
-
- let status: Promise
- act(() => {
- status = testService.loginAndCreate()
- })
-
- expect(mockOnConnect).not.toHaveBeenCalled()
-
- // Resolve mock login
- act(() => {
- jest.advanceTimersByTime(MOCK_LOGIN_TIME)
- })
-
- // We should be logged in and onboard should get connected
- await waitFor(() => {
- expect(status).rejects.toEqual(
- new Error('Social Login is deprecated and will be removed on 01.05.2024. New accounts cannot be created.'),
- )
- expect(mockOnConnect).not.toHaveBeenCalled()
- expect(mockCoreKit.commitChanges).not.toHaveBeenCalled()
- })
- })
-
- it('should handle successful log in for MFA account with device share', async () => {
- const mockOnConnect = jest.fn()
-
- const mockDeviceFactor = ethers.Wallet.createRandom().privateKey.slice(2)
-
- const mockCoreKit = new MockMPCCoreKit(
- COREKIT_STATUS.REQUIRED_SHARE,
- {
- email: 'test@test.com',
- name: 'Test',
- } as unknown as UserInfo,
- new BN(mockDeviceFactor, 'hex'),
- ) as unknown as Web3AuthMPCCoreKit
-
- jest.spyOn(mpcCoreKit, 'getWebBrowserFactor').mockReturnValue(Promise.resolve(mockDeviceFactor))
-
- const testService = new SocialWalletService(mockCoreKit)
- testService.setOnConnect(mockOnConnect)
-
- let status: Promise
- act(() => {
- status = testService.loginAndCreate()
- })
-
- // While the login resolves we are in Authenticating state
- expect(mockOnConnect).not.toHaveBeenCalled()
-
- // Resolve mock login
- act(() => {
- jest.advanceTimersByTime(MOCK_LOGIN_TIME)
- })
-
- // We should be logged in and onboard should get connected
- await waitFor(() => {
- expect(status).resolves.toEqual(COREKIT_STATUS.LOGGED_IN)
- expect(mockOnConnect).toHaveBeenCalled()
- expect(mockCoreKit.commitChanges).toHaveBeenCalled()
- })
- })
-
- it('should require manual share for MFA account without device share', async () => {
- const mockOnConnect = jest.fn()
- const mockCoreKit = new MockMPCCoreKit(COREKIT_STATUS.REQUIRED_SHARE, {
- email: 'test@test.com',
- name: 'Test',
- } as unknown as UserInfo) as unknown as Web3AuthMPCCoreKit
-
- jest.spyOn(mpcCoreKit, 'getWebBrowserFactor').mockReturnValue(Promise.resolve(undefined))
- jest.spyOn(mpcCoreKit, 'TssSecurityQuestion').mockReturnValue({
- getQuestion: () => 'SOME RANDOM QUESTION',
- } as unknown as TssSecurityQuestion)
-
- const testService = new SocialWalletService(mockCoreKit)
- testService.setOnConnect(mockOnConnect)
-
- let status: Promise
- act(() => {
- status = testService.loginAndCreate()
- })
-
- // Resolve mock login
- act(() => {
- jest.advanceTimersByTime(MOCK_LOGIN_TIME)
- })
-
- // A missing second factor should result in manual recovery state
- await waitFor(() => {
- expect(status).resolves.toEqual(COREKIT_STATUS.REQUIRED_SHARE)
- expect(mockOnConnect).not.toHaveBeenCalled()
- expect(mockCoreKit.commitChanges).not.toHaveBeenCalled()
- })
- })
- })
-
- describe('resetAccount', () => {
- it('should reset an account by overwriting the metadata', async () => {
- const mockSetMetadata = jest.fn()
- const mockMPCCore = {
- metadataKey: ethers.Wallet.createRandom().privateKey.slice(2),
- state: {
- userInfo: undefined,
- },
- tKey: {
- storageLayer: {
- setMetadata: mockSetMetadata,
- },
- },
- }
-
- const testService = new SocialWalletService(mockMPCCore as unknown as Web3AuthMPCCoreKit)
-
- await testService.__deleteAccount()
-
- expect(mockSetMetadata).toHaveBeenCalledWith({
- privKey: new BN(mockMPCCore.metadataKey, 'hex'),
- input: { message: 'KEY_NOT_FOUND' },
- })
- })
- })
-
- describe('recoverFactorWithPassword', () => {
- it('should not recover if wrong password is entered', () => {
- const mockOnConnect = jest.fn()
- const mockMPCCore = {
- state: {
- userInfo: undefined,
- },
- commitChanges: jest.fn(),
- } as unknown as Web3AuthMPCCoreKit
-
- jest.spyOn(mpcCoreKit, 'TssSecurityQuestion').mockReturnValue({
- getQuestion: () => 'SOME RANDOM QUESTION',
- recoverFactor: () => {
- throw new Error('Invalid answer')
- },
- } as unknown as TssSecurityQuestion)
-
- const testService = new SocialWalletService(mockMPCCore as unknown as Web3AuthMPCCoreKit)
- testService.setOnConnect(mockOnConnect)
-
- expect(testService.recoverAccountWithPassword('test', false)).rejects.toEqual(new Error('Invalid answer'))
- expect(mockOnConnect).not.toHaveBeenCalled()
- expect(mockMPCCore.commitChanges).not.toHaveBeenCalled()
- })
-
- it('should input recovered factor if correct password is entered', async () => {
- const mockOnConnect = jest.fn()
- const mockSecurityQuestionFactor = ethers.Wallet.createRandom().privateKey.slice(2)
-
- const mockMPCCore = new MockMPCCoreKit(
- COREKIT_STATUS.REQUIRED_SHARE,
- {
- email: 'test@test.com',
- name: 'Test',
- } as unknown as UserInfo,
- new BN(mockSecurityQuestionFactor, 'hex'),
- ) as unknown as Web3AuthMPCCoreKit
-
- jest.spyOn(mpcCoreKit, 'TssSecurityQuestion').mockReturnValue({
- getQuestion: () => 'SOME RANDOM QUESTION',
- recoverFactor: () => Promise.resolve(mockSecurityQuestionFactor),
- } as unknown as TssSecurityQuestion)
-
- const testService = new SocialWalletService(mockMPCCore as unknown as Web3AuthMPCCoreKit)
- testService.setOnConnect(mockOnConnect)
-
- act(() => testService.recoverAccountWithPassword('test', false))
-
- await waitFor(() => {
- expect(mockOnConnect).toHaveBeenCalled()
- })
- })
- })
-})
diff --git a/src/services/mpc/__tests__/module.test.ts b/src/services/mpc/__tests__/module.test.ts
deleted file mode 100644
index 548576de78..0000000000
--- a/src/services/mpc/__tests__/module.test.ts
+++ /dev/null
@@ -1,125 +0,0 @@
-import { chainBuilder } from '@/tests/builders/chains'
-import { FEATURES } from '@/utils/chains'
-import MpcModule, { ONBOARD_MPC_MODULE_LABEL } from '../SocialLoginModule'
-import { type WalletModule } from '@web3-onboard/common'
-
-import * as web3 from '@/hooks/wallets/web3'
-import * as useMPC from '@/hooks/wallets/mpc/useMPC'
-import { toBeHex } from 'ethers'
-
-const mockChain = chainBuilder()
- // @ts-expect-error - we are using a local FEATURES enum
- .with({ features: [FEATURES.SOCIAL_LOGIN] })
- .build()
-
-describe('MPC Onboard module', () => {
- it('should return correct metadata', async () => {
- const mpcModule = MpcModule(mockChain)({
- device: {
- browser: {
- name: 'Firefox',
- version: '1.0',
- },
- os: {
- name: 'macOS',
- version: '1.0',
- },
- type: 'desktop',
- },
- })
- expect(Array.isArray(mpcModule)).toBeFalsy()
- const walletModule = mpcModule as WalletModule
-
- expect(walletModule.label).toBe(ONBOARD_MPC_MODULE_LABEL)
- expect(walletModule.getIcon()).toBeDefined()
- const walletInterface = await walletModule.getInterface({} as any)
- expect(walletInterface.instance).toBeUndefined()
- expect(walletInterface.provider).toBeDefined()
- })
-
- it('should call web3readonly for eth_estimateGas', async () => {
- const mockReadOnlySend = jest.fn().mockImplementation(() => Promise.resolve('0x5'))
- jest.spyOn(web3, 'getWeb3ReadOnly').mockReturnValue({
- send: mockReadOnlySend,
- } as any)
-
- jest.spyOn(useMPC, '_getMPCCoreKitInstance').mockImplementation(() => {
- return {
- provider: {},
- } as any
- })
-
- const mpcModule = MpcModule(mockChain)({
- device: {
- browser: {
- name: 'Firefox',
- version: '1.0',
- },
- os: {
- name: 'macOS',
- version: '1.0',
- },
- type: 'desktop',
- },
- })
- const walletModule = mpcModule as WalletModule
- const walletInterface = await walletModule.getInterface({} as any)
-
- await walletInterface.provider.request({
- method: 'eth_estimateGas',
- params: [
- {
- to: toBeHex('0x123', 20),
- value: '0',
- data: '0x',
- },
- ],
- })
-
- expect(mockReadOnlySend).toHaveBeenCalledWith('eth_estimateGas', [
- {
- to: toBeHex('0x123', 20),
- value: '0',
- data: '0x',
- },
- ])
- })
-
- it('should call eth_accounts when eth_requestAccounts gets called', async () => {
- const mockReadOnlySend = jest.fn()
- const mockMPCProviderRequest = jest.fn().mockImplementation(() => Promise.resolve(toBeHex('0x456', 20)))
- jest.spyOn(web3, 'getWeb3ReadOnly').mockReturnValue({
- send: mockReadOnlySend,
- } as any)
-
- jest.spyOn(useMPC, '_getMPCCoreKitInstance').mockImplementation(() => {
- return {
- provider: {
- request: mockMPCProviderRequest,
- },
- } as any
- })
-
- const mpcModule = MpcModule(mockChain)({
- device: {
- browser: {
- name: 'Firefox',
- version: '1.0',
- },
- os: {
- name: 'macOS',
- version: '1.0',
- },
- type: 'desktop',
- },
- })
- const walletModule = mpcModule as WalletModule
- const walletInterface = await walletModule.getInterface({} as any)
-
- await walletInterface.provider.request({
- method: 'eth_requestAccounts',
- })
-
- expect(mockMPCProviderRequest).toHaveBeenCalledWith({ method: 'eth_accounts' })
- })
-})
diff --git a/src/services/mpc/config.ts b/src/services/mpc/config.ts
deleted file mode 100644
index db2ce429f4..0000000000
--- a/src/services/mpc/config.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-import { IS_PRODUCTION } from '@/config/constants'
-
-enum SocialWalletOptionsKeys {
- web3AuthClientId = 'web3AuthClientId',
- web3AuthAggregateVerifierId = 'web3AuthAggregateVerifierId',
- web3AuthSubverifierId = 'web3AuthSubverifierId',
- googleClientId = 'googleClientId',
-}
-
-export type SocialWalletOptions = {
- [SocialWalletOptionsKeys.web3AuthClientId]: string
- [SocialWalletOptionsKeys.web3AuthAggregateVerifierId]: string
- [SocialWalletOptionsKeys.web3AuthSubverifierId]: string
- [SocialWalletOptionsKeys.googleClientId]: string
-}
-
-export const isSocialWalletOptions = (options: unknown): options is SocialWalletOptions => {
- if (typeof options !== 'object' || options === null) {
- return false
- }
-
- const requiredKeys = Object.values(SocialWalletOptionsKeys)
- const hasRequiredKeys = requiredKeys.every((key) => key in options)
- const hasValues = Object.values(options).every(Boolean)
-
- return hasRequiredKeys && hasValues
-}
-
-/** env variables */
-export const SOCIAL_WALLET_OPTIONS: any = (() => {
- const SOCIAL_WALLET_OPTIONS_PRODUCTION = process.env.NEXT_PUBLIC_SOCIAL_WALLET_OPTIONS_PRODUCTION || '{}'
- const SOCIAL_WALLET_OPTIONS_STAGING = process.env.NEXT_PUBLIC_SOCIAL_WALLET_OPTIONS_STAGING || '{}'
-
- try {
- return JSON.parse(IS_PRODUCTION ? SOCIAL_WALLET_OPTIONS_PRODUCTION : SOCIAL_WALLET_OPTIONS_STAGING)
- } catch (error) {
- console.error('Error parsing SOCIAL_WALLET_OPTIONS', error)
- return {}
- }
-})()
diff --git a/src/services/mpc/icon.ts b/src/services/mpc/icon.ts
deleted file mode 100644
index c306bf5353..0000000000
--- a/src/services/mpc/icon.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-const pairingIcon = `
-
-
-
-
-
-
-
-
-`
-
-export default pairingIcon
diff --git a/src/services/mpc/interfaces.ts b/src/services/mpc/interfaces.ts
deleted file mode 100644
index b76ace0eec..0000000000
--- a/src/services/mpc/interfaces.ts
+++ /dev/null
@@ -1,52 +0,0 @@
-import type { COREKIT_STATUS, UserInfo } from '@web3auth/mpc-core-kit'
-
-export interface ISocialWalletService {
- /**
- * Opens a popup with the Google login and creates / restores the mpc wallet.
- *
- * @returns the follow up status of the mpcCoreKit.
- */
- loginAndCreate(): Promise
-
- /**
- * Deletes the currently logged in account.
- * This should only be used in dev environments and never in prod!
- */
- __deleteAccount(): void
-
- /**
- * Tries to recover a social signer through the Security Questions module
- *
- * @param password entered recovery password
- * @param storeDeviceFactor if true a device factor will be added after successful recovery
- */
- recoverAccountWithPassword(password: string, storeDeviceFactor: boolean): Promise
-
- /**
- * Exports the key of the signer
- *
- * @param password recovery password
- */
- exportSignerKey(password: string): Promise
-
- /**
- * Returns true if MFA is enabled
- */
- isMFAEnabled(): boolean
-
- /**
- * Enables MFA and stores a device share with 2 factors:
- * - one factor encrypted with the password
- * - one factor encrypted with a key in the local storage of the browser
- *
- * @param oldPassword required if MFA is already enabled
- * @param newPassword new password to set
- */
- enableMFA(oldPassword: string | undefined, newPassword: string): Promise
-
- isRecoveryPasswordSet(): boolean
-
- getUserInfo(): UserInfo | undefined
-
- setOnConnect(onConnect: () => Promise): void
-}
diff --git a/src/services/mpc/recovery/DeviceShareRecovery.ts b/src/services/mpc/recovery/DeviceShareRecovery.ts
deleted file mode 100644
index 7806f91b92..0000000000
--- a/src/services/mpc/recovery/DeviceShareRecovery.ts
+++ /dev/null
@@ -1,59 +0,0 @@
-import {
- BrowserStorage,
- getWebBrowserFactor,
- storeWebBrowserFactor,
- TssShareType,
- type Web3AuthMPCCoreKit,
-} from '@web3auth/mpc-core-kit'
-import BN from 'bn.js'
-import { getPubKeyPoint } from '@tkey-mpc/common-types'
-
-export class DeviceShareRecovery {
- private mpcCoreKit: Web3AuthMPCCoreKit
-
- constructor(mpcCoreKit: Web3AuthMPCCoreKit) {
- this.mpcCoreKit = mpcCoreKit
- }
-
- async isEnabled() {
- return !!(await getWebBrowserFactor(this.mpcCoreKit))
- }
-
- async createAndStoreDeviceFactor() {
- const userAgent = navigator.userAgent
-
- const deviceFactorKey = new BN(
- await this.mpcCoreKit.createFactor({ shareType: TssShareType.DEVICE, additionalMetadata: { userAgent } }),
- 'hex',
- )
- await storeWebBrowserFactor(deviceFactorKey, this.mpcCoreKit)
- }
-
- async recoverWithDeviceFactor() {
- // Recover from device factor
- const deviceFactor = await getWebBrowserFactor(this.mpcCoreKit)
- if (!deviceFactor) {
- throw Error('Cannot recover from device factor. No device factor found')
- }
- const deviceFactorKey = new BN(deviceFactor, 'hex')
- await this.mpcCoreKit.inputFactorKey(deviceFactorKey)
- }
-
- async removeDeviceFactor() {
- const deviceFactor = await getWebBrowserFactor(this.mpcCoreKit)
- if (!deviceFactor) {
- // No device factor exists. Nothing to do
- return
- }
- // Delete factor
- const key = new BN(deviceFactor, 'hex')
- const pubKey = getPubKeyPoint(key)
- await this.mpcCoreKit.deleteFactor(pubKey)
-
- // Remove from local storage
- const metadata = this.mpcCoreKit.tKey.getMetadata()
- const tkeyPubX = metadata.pubKey.x.toString(16, 64)
- const currentStorage = BrowserStorage.getInstance('mpc_corekit_store')
- currentStorage.remove(tkeyPubX)
- }
-}
diff --git a/src/services/mpc/recovery/SecurityQuestionRecovery.ts b/src/services/mpc/recovery/SecurityQuestionRecovery.ts
deleted file mode 100644
index 0d707cb29f..0000000000
--- a/src/services/mpc/recovery/SecurityQuestionRecovery.ts
+++ /dev/null
@@ -1,48 +0,0 @@
-import { TssSecurityQuestion, TssShareType, type Web3AuthMPCCoreKit } from '@web3auth/mpc-core-kit'
-
-export class SecurityQuestionRecovery {
- /** This is only used internally in the metadata store of tKey. Not in the UI */
- private static readonly DEFAULT_SECURITY_QUESTION = 'ENTER PASSWORD'
-
- private mpcCoreKit: Web3AuthMPCCoreKit
- private securityQuestions = new TssSecurityQuestion()
-
- constructor(mpcCoreKit: Web3AuthMPCCoreKit) {
- this.mpcCoreKit = mpcCoreKit
- }
-
- isEnabled(): boolean {
- try {
- const question = this.securityQuestions.getQuestion(this.mpcCoreKit)
- return !!question
- } catch (error) {
- // It errors out if recovery is not setup currently
- return false
- }
- }
-
- async upsertPassword(newPassword: string, oldPassword?: string) {
- if (this.isEnabled()) {
- if (!oldPassword) {
- throw Error('To change the password you need to provide the old password')
- }
- await this.securityQuestions.changeSecurityQuestion({
- answer: oldPassword,
- mpcCoreKit: this.mpcCoreKit,
- newAnswer: newPassword,
- newQuestion: SecurityQuestionRecovery.DEFAULT_SECURITY_QUESTION,
- })
- } else {
- await this.securityQuestions.setSecurityQuestion({
- question: SecurityQuestionRecovery.DEFAULT_SECURITY_QUESTION,
- answer: newPassword,
- mpcCoreKit: this.mpcCoreKit,
- shareType: TssShareType.DEVICE,
- })
- }
- }
-
- async recoverWithPassword(password: string) {
- return this.securityQuestions.recoverFactor(this.mpcCoreKit, password)
- }
-}
diff --git a/src/services/ofac/blockedAddressList.json b/src/services/ofac/blockedAddressList.json
index e8df17f077..2a75c8a50b 100644
--- a/src/services/ofac/blockedAddressList.json
+++ b/src/services/ofac/blockedAddressList.json
@@ -149,5 +149,10 @@
"0x530a64c0ce595026a4a556b703644228179e2d57",
"0xfac583c0cf07ea434052c49115a4682172ab6b4f",
"0x961c5be54a2ffc17cf4cb021d863c42dacd47fc1",
- "0x983a81ca6fb1e441266d2fbcb7d8e530ac2e05a2"
+ "0x983a81ca6fb1e441266d2fbcb7d8e530ac2e05a2",
+ "0xf3701f445b6bdafedbca97d1e477357839e4120d",
+ "0xe950dc316b836e4eefb8308bf32bf7c72a1358ff",
+ "0x21b8d56bda776bbe68655a16895afd96f5534fed",
+ "0x175d44451403edf28469df03a9280c1197adb92c",
+ "0x19f8f2b0915daa12a3f5c9cf01df9e24d53794f7"
]
diff --git a/src/services/private-key-module/PkModulePopup.tsx b/src/services/private-key-module/PkModulePopup.tsx
new file mode 100644
index 0000000000..5bdbbb2452
--- /dev/null
+++ b/src/services/private-key-module/PkModulePopup.tsx
@@ -0,0 +1,51 @@
+import type { FormEvent } from 'react'
+import { Button, TextField, Typography, Box } from '@mui/material'
+import ModalDialog from '@/components/common/ModalDialog'
+import pkStore from './pk-popup-store'
+const { useStore, setStore } = pkStore
+
+const PkModulePopup = () => {
+ const { isOpen, privateKey } = useStore() ?? { isOpen: false, privateKey: '' }
+
+ const onClose = () => {
+ setStore({ isOpen: false, privateKey })
+ }
+
+ const onSubmit = (e: FormEvent) => {
+ e.preventDefault()
+ const privateKey = (e.target as unknown as { 'private-key': HTMLInputElement })['private-key'].value
+
+ setStore({
+ isOpen: false,
+ privateKey,
+ })
+ }
+
+ return (
+
+
+
+ Enter your signer private key. The key will be saved for the duration of this browser session.
+
+
+
+
+
+ )
+}
+
+export default PkModulePopup
diff --git a/src/services/private-key-module/icon.ts b/src/services/private-key-module/icon.ts
new file mode 100644
index 0000000000..69c435dfb8
--- /dev/null
+++ b/src/services/private-key-module/icon.ts
@@ -0,0 +1,5 @@
+const icon = `
+
+ `
+
+export default icon
diff --git a/src/services/private-key-module/index.ts b/src/services/private-key-module/index.ts
new file mode 100644
index 0000000000..355bd2ded9
--- /dev/null
+++ b/src/services/private-key-module/index.ts
@@ -0,0 +1,130 @@
+import { JsonRpcProvider, Wallet } from 'ethers'
+import type { ChainInfo } from '@safe-global/safe-gateway-typescript-sdk'
+import { type WalletInit, createEIP1193Provider } from '@web3-onboard/common'
+import { getRpcServiceUrl } from '@/hooks/wallets/web3'
+import pkPopupStore from './pk-popup-store'
+import { numberToHex } from '@/utils/hex'
+
+export const PRIVATE_KEY_MODULE_LABEL = 'Private key'
+
+async function getPrivateKey() {
+ const savedKey = pkPopupStore.getStore()?.privateKey
+ if (savedKey) return savedKey
+
+ pkPopupStore.setStore({
+ isOpen: true,
+ privateKey: '',
+ })
+
+ return new Promise((resolve) => {
+ const unsubscribe = pkPopupStore.subscribe(() => {
+ unsubscribe()
+ resolve(pkPopupStore.getStore()?.privateKey ?? '')
+ })
+ })
+}
+
+let currentChainId = ''
+let currentRpcUri = ''
+
+const PrivateKeyModule = (chainId: ChainInfo['chainId'], rpcUri: ChainInfo['rpcUri']): WalletInit => {
+ currentChainId = chainId
+ currentRpcUri = getRpcServiceUrl(rpcUri)
+
+ return () => {
+ return {
+ label: PRIVATE_KEY_MODULE_LABEL,
+ getIcon: async () => (await import('./icon')).default,
+ getInterface: async () => {
+ const privateKey = await getPrivateKey()
+ if (!privateKey) {
+ throw new Error('You rejected the connection')
+ }
+
+ let provider: JsonRpcProvider
+ let wallet: Wallet
+ const chainChangedListeners = new Set<(chainId: string) => void>()
+
+ const updateProvider = () => {
+ console.log('[Private key signer] Updating provider to chainId', currentChainId, currentRpcUri)
+ provider?.destroy()
+ provider = new JsonRpcProvider(currentRpcUri, Number(currentChainId), { staticNetwork: true })
+ wallet = new Wallet(privateKey, provider)
+
+ setTimeout(() => {
+ chainChangedListeners.forEach((listener) => listener(numberToHex(Number(currentChainId))))
+ }, 100)
+ }
+
+ updateProvider()
+
+ return {
+ provider: createEIP1193Provider(
+ {
+ on: (event: string, listener: (...args: any[]) => void) => {
+ if (event === 'accountsChanged') {
+ return
+ } else if (event === 'chainChanged') {
+ chainChangedListeners.add(listener)
+ } else {
+ provider.on(event, listener)
+ }
+ },
+
+ request: async (request: { method: string; params: any[] }) => {
+ return provider.send(request.method, request.params)
+ },
+
+ disconnect: () => {
+ pkPopupStore.setStore({
+ isOpen: false,
+ privateKey: '',
+ })
+ },
+ },
+ {
+ eth_chainId: async () => currentChainId,
+
+ // @ts-ignore
+ eth_getCode: async ({ params }) => provider.getCode(params[0], params[1]),
+
+ eth_accounts: async () => [wallet.address],
+ eth_requestAccounts: async () => [wallet.address],
+
+ eth_call: async ({ params }: { params: any }) => wallet.call(params[0]),
+
+ eth_sendTransaction: async ({ params }) => {
+ const tx = await wallet.sendTransaction(params[0] as any)
+ return tx.hash // return transaction hash
+ },
+
+ personal_sign: async ({ params }) => {
+ const signedMessage = wallet.signingKey.sign(params[0])
+ return signedMessage.serialized
+ },
+
+ eth_signTypedData: async ({ params }) => {
+ const [, json] = params
+ const typedData = JSON.parse(json)
+ return await wallet.signTypedData(
+ typedData.domain,
+ { [typedData.primaryType]: typedData.types[typedData.primaryType] },
+ typedData.message,
+ )
+ },
+
+ // @ts-ignore
+ wallet_switchEthereumChain: async ({ params }) => {
+ console.log('[Private key signer] Switching chain', params)
+ updateProvider()
+ },
+ },
+ ),
+ }
+ },
+ platforms: ['desktop'],
+ }
+ }
+}
+
+export default PrivateKeyModule
diff --git a/src/services/private-key-module/pk-popup-store.ts b/src/services/private-key-module/pk-popup-store.ts
new file mode 100644
index 0000000000..5779540b50
--- /dev/null
+++ b/src/services/private-key-module/pk-popup-store.ts
@@ -0,0 +1,23 @@
+import ExternalStore from '@/services/ExternalStore'
+import { sessionItem } from '@/services/local-storage/session'
+
+type PkModulePopupStore = {
+ isOpen: boolean
+ privateKey: string
+}
+
+const defaultValue = {
+ isOpen: false,
+ privateKey: '',
+}
+
+const STORAGE_KEY = 'privateKeyModulePK'
+const pkStorage = sessionItem(STORAGE_KEY)
+
+const popupStore = new ExternalStore(pkStorage.get() || defaultValue)
+
+popupStore.subscribe(() => {
+ pkStorage.set(popupStore.getStore() || defaultValue)
+})
+
+export default popupStore
diff --git a/src/services/safe-messages/__tests__/safeMsgSender.test.ts b/src/services/safe-messages/__tests__/safeMsgSender.test.ts
index 744bd3e762..57e3e273ac 100644
--- a/src/services/safe-messages/__tests__/safeMsgSender.test.ts
+++ b/src/services/safe-messages/__tests__/safeMsgSender.test.ts
@@ -1,3 +1,4 @@
+import { MockEip1193Provider } from '@/tests/mocks/providers'
import * as gateway from '@safe-global/safe-gateway-typescript-sdk'
import type { JsonRpcSigner } from 'ethers'
import { zeroPadBytes } from 'ethers'
@@ -7,7 +8,6 @@ import * as utils from '@/utils/safe-messages'
import * as events from '@/services/safe-messages/safeMsgEvents'
import * as sdk from '@/services/tx/tx-sender/sdk'
import { zeroPadValue } from 'ethers'
-import type { EIP1193Provider, OnboardAPI, WalletState, AppState } from '@web3-onboard/core'
jest.mock('@safe-global/safe-gateway-typescript-sdk', () => ({
...jest.requireActual('@safe-global/safe-gateway-typescript-sdk'),
@@ -15,51 +15,6 @@ jest.mock('@safe-global/safe-gateway-typescript-sdk', () => ({
confirmSafeMessage: jest.fn(),
}))
-let mockProvider = {
- request: jest.fn,
-} as unknown as EIP1193Provider
-
-const mockOnboardState = {
- chains: [],
- walletModules: [],
- wallets: [
- {
- label: 'Wallet 1',
- icon: '',
- provider: mockProvider,
- chains: [{ id: '0x5' }],
- accounts: [
- {
- address: '0x1234567890123456789012345678901234567890',
- ens: null,
- balance: null,
- },
- ],
- },
- ] as WalletState[],
- accountCenter: {
- enabled: true,
- },
-} as unknown as AppState
-
-const mockOnboard = {
- connectWallet: jest.fn(),
- disconnectWallet: jest.fn(),
- setChain: jest.fn(),
- state: {
- select: (key: keyof AppState) => ({
- subscribe: (next: any) => {
- next(mockOnboardState[key])
-
- return {
- unsubscribe: jest.fn(),
- }
- },
- }),
- get: () => mockOnboardState,
- },
-} as unknown as OnboardAPI
-
const mockValidSignature = `${zeroPadBytes('0x0456', 64)}1c`
const mockSignatureWithInvalidV = `${zeroPadBytes('0x0456', 64)}01`
describe('safeMsgSender', () => {
@@ -90,7 +45,7 @@ describe('safeMsgSender', () => {
const message = 'Hello world'
const safeAppId = 1
- await dispatchSafeMsgProposal({ onboard: mockOnboard, safe, message, safeAppId })
+ await dispatchSafeMsgProposal({ provider: MockEip1193Provider, safe, message, safeAppId })
expect(proposeSafeMessageSpy).toHaveBeenCalledWith('5', zeroPadValue('0x0789', 20), {
message,
@@ -135,7 +90,7 @@ describe('safeMsgSender', () => {
}
const safeAppId = 1
- await dispatchSafeMsgProposal({ onboard: mockOnboard, safe, message, safeAppId })
+ await dispatchSafeMsgProposal({ provider: MockEip1193Provider, safe, message, safeAppId })
// Normalize message manually
message.types['EIP712Domain'] = [
@@ -172,7 +127,7 @@ describe('safeMsgSender', () => {
const message = 'Hello world'
const safeAppId = 1
- await dispatchSafeMsgProposal({ onboard: mockOnboard, safe, message, safeAppId })
+ await dispatchSafeMsgProposal({ provider: MockEip1193Provider, safe, message, safeAppId })
expect(proposeSafeMessageSpy).toHaveBeenCalledWith('5', zeroPadValue('0x0789', 20), {
message,
@@ -203,7 +158,7 @@ describe('safeMsgSender', () => {
const safeAppId = 1
try {
- await dispatchSafeMsgProposal({ onboard: mockOnboard, safe, message, safeAppId })
+ await dispatchSafeMsgProposal({ provider: MockEip1193Provider, safe, message, safeAppId })
} catch (e) {
expect((e as Error).message).toBe('Example error')
@@ -237,7 +192,7 @@ describe('safeMsgSender', () => {
} as unknown as gateway.SafeInfo
const message = 'Hello world'
- await dispatchSafeMsgConfirmation({ onboard: mockOnboard, safe, message })
+ await dispatchSafeMsgConfirmation({ provider: MockEip1193Provider, safe, message })
expect(confirmSafeMessageSpy).toHaveBeenCalledWith('5', '0x0123', {
signature: mockValidSignature,
@@ -264,7 +219,7 @@ describe('safeMsgSender', () => {
const message = 'Hello world'
try {
- await dispatchSafeMsgConfirmation({ onboard: mockOnboard, safe, message })
+ await dispatchSafeMsgConfirmation({ provider: MockEip1193Provider, safe, message })
} catch (e) {
expect((e as Error).message).toBe('Example error')
diff --git a/src/services/safe-messages/safeMsgSender.ts b/src/services/safe-messages/safeMsgSender.ts
index 8e00d1b9d9..5cedd7a468 100644
--- a/src/services/safe-messages/safeMsgSender.ts
+++ b/src/services/safe-messages/safeMsgSender.ts
@@ -1,6 +1,6 @@
import { proposeSafeMessage, confirmSafeMessage } from '@safe-global/safe-gateway-typescript-sdk'
import type { SafeInfo, SafeMessage } from '@safe-global/safe-gateway-typescript-sdk'
-import type { OnboardAPI } from '@web3-onboard/core'
+import type { Eip1193Provider } from 'ethers'
import { safeMsgDispatch, SafeMsgEvent } from './safeMsgEvents'
import { generateSafeMessageHash, isEIP712TypedData, tryOffChainMsgSigning } from '@/utils/safe-messages'
@@ -9,12 +9,12 @@ import { getAssertedChainSigner } from '@/services/tx/tx-sender/sdk'
import { asError } from '../exceptions/utils'
export const dispatchSafeMsgProposal = async ({
- onboard,
+ provider,
safe,
message,
safeAppId,
}: {
- onboard: OnboardAPI
+ provider: Eip1193Provider
safe: SafeInfo
message: SafeMessage['message']
safeAppId?: number
@@ -22,7 +22,7 @@ export const dispatchSafeMsgProposal = async ({
const messageHash = generateSafeMessageHash(safe, message)
try {
- const signer = await getAssertedChainSigner(onboard, safe.chainId)
+ const signer = await getAssertedChainSigner(provider)
const signature = await tryOffChainMsgSigning(signer, safe, message)
let normalizedMessage = message
@@ -50,18 +50,18 @@ export const dispatchSafeMsgProposal = async ({
}
export const dispatchSafeMsgConfirmation = async ({
- onboard,
+ provider,
safe,
message,
}: {
- onboard: OnboardAPI
+ provider: Eip1193Provider
safe: SafeInfo
message: SafeMessage['message']
}): Promise => {
const messageHash = generateSafeMessageHash(safe, message)
try {
- const signer = await getAssertedChainSigner(onboard, safe.chainId)
+ const signer = await getAssertedChainSigner(provider)
const signature = await tryOffChainMsgSigning(signer, safe, message)
await confirmSafeMessage(safe.chainId, messageHash, {
diff --git a/src/services/safe-wallet-provider/index.test.ts b/src/services/safe-wallet-provider/index.test.ts
index ef6f52ed0e..3252f21e23 100644
--- a/src/services/safe-wallet-provider/index.test.ts
+++ b/src/services/safe-wallet-provider/index.test.ts
@@ -1,8 +1,10 @@
// Unit tests for the SafeWalletProvider class
+import { faker } from '@faker-js/faker'
import { SafeWalletProvider } from '.'
+import { ERC20__factory } from '@/types/contracts'
const safe = {
- safeAddress: '0x123',
+ safeAddress: faker.finance.ethereumAddress(),
chainId: 1,
}
@@ -69,7 +71,7 @@ describe('SafeWalletProvider', () => {
expect(result).toEqual({
id: 1,
jsonrpc: '2.0',
- result: ['0x123'],
+ result: [safe.safeAddress],
})
})
})
@@ -136,7 +138,7 @@ describe('SafeWalletProvider', () => {
const result = await safeWalletProvider.request(
1,
- { method: 'personal_sign', params: ['message', '0x123'] } as any,
+ { method: 'personal_sign', params: ['message', safe.safeAddress] } as any,
{} as any,
)
@@ -157,7 +159,7 @@ describe('SafeWalletProvider', () => {
const result = await safeWalletProvider.request(
1,
- { method: 'eth_sign', params: ['0x123', '0x123'] } as any,
+ { method: 'eth_sign', params: [safe.safeAddress, '0x345'] } as any,
{} as any,
)
@@ -214,7 +216,7 @@ describe('SafeWalletProvider', () => {
const result = await safeWalletProvider.request(
1,
- { method: 'personal_sign', params: ['0x123', '0x123'] } as any,
+ { method: 'eth_sign', params: [safe.safeAddress, '0x123'] } as any,
{} as any,
)
@@ -238,7 +240,7 @@ describe('SafeWalletProvider', () => {
{
method,
params: [
- '0x123',
+ safe.safeAddress,
{
domain: {
chainId: 1,
@@ -290,7 +292,7 @@ describe('SafeWalletProvider', () => {
{
method,
params: [
- '0x123',
+ safe.safeAddress,
{
domain: {
chainId: 1,
@@ -320,16 +322,23 @@ describe('SafeWalletProvider', () => {
const sdk = {
send: jest.fn().mockResolvedValue({ safeTxHash: '0x456' }),
}
+ const toAddress = faker.finance.ethereumAddress()
const safeWalletProvider = new SafeWalletProvider(safe, sdk as any)
const result = await safeWalletProvider.request(
1,
- { method: 'eth_sendTransaction', params: [{ from: '0x123', to: '0x123', value: '0x123', gas: 1000 }] } as any,
+ {
+ method: 'eth_sendTransaction',
+ params: [{ from: safe.safeAddress, to: toAddress, value: '0x01', gas: 1000 }],
+ } as any,
appInfo,
)
expect(sdk.send).toHaveBeenCalledWith(
- { txs: [{ from: '0x123', to: '0x123', value: '0x123', gas: 1000, data: '0x' }], params: { safeTxGas: 1000 } },
+ {
+ txs: [{ from: safe.safeAddress, to: toAddress, value: '0x01', gas: 1000, data: '0x' }],
+ params: { safeTxGas: 1000 },
+ },
appInfo,
)
@@ -426,10 +435,15 @@ describe('SafeWalletProvider', () => {
}
const safeWalletProvider = new SafeWalletProvider(safe, sdk as any)
+ const toAddress = faker.finance.ethereumAddress()
+
// Send the transaction
await safeWalletProvider.request(
1,
- { method: 'eth_sendTransaction', params: [{ from: '0x123', to: '0x123', value: '0x123', gas: 1000 }] } as any,
+ {
+ method: 'eth_sendTransaction',
+ params: [{ from: safe.safeAddress, to: toAddress, value: '0x01', gas: 1000 }],
+ } as any,
appInfo,
)
@@ -445,15 +459,15 @@ describe('SafeWalletProvider', () => {
result: {
blockHash: null,
blockNumber: null,
- from: '0x123',
+ from: safe.safeAddress,
gas: 0,
gasPrice: '0x00',
hash: '0x777',
input: '0x',
nonce: 0,
- to: '0x123',
+ to: toAddress,
transactionIndex: null,
- value: '0x123',
+ value: '0x01',
},
})
})
@@ -495,7 +509,7 @@ describe('SafeWalletProvider', () => {
})
describe('EIP-5792', () => {
- describe('wallet_sendFunctionCallBundle', () => {
+ describe('wallet_sendCalls', () => {
it('should send a bundle', async () => {
const sdk = {
send: jest.fn(),
@@ -505,15 +519,16 @@ describe('SafeWalletProvider', () => {
const params = [
{
chainId: 1,
- from: '0x1234',
+ version: '1.0',
+ from: faker.finance.ethereumAddress(),
calls: [
- { gas: 1000, data: '0x123', to: '0x123', value: '0x123' },
- { gas: 1000, data: '0x456', to: '0x789', value: '0x1' },
+ { data: '0x123', to: faker.finance.ethereumAddress(), value: '0x123' },
+ { data: '0x456', to: faker.finance.ethereumAddress(), value: '0x1' },
],
},
]
- await safeWalletProvider.request(1, { method: 'wallet_sendFunctionCallBundle', params } as any, appInfo)
+ await safeWalletProvider.request(1, { method: 'wallet_sendCalls', params } as any, appInfo)
expect(sdk.send).toHaveBeenCalledWith(
{
@@ -529,9 +544,79 @@ describe('SafeWalletProvider', () => {
},
)
})
+
+ it('test contract deployment calls and calls without data / value', async () => {
+ const fakeCreateCallLib = faker.finance.ethereumAddress()
+ const sdk = {
+ send: jest.fn(),
+ getCreateCallTransaction: jest.fn().mockImplementation((data: string) => {
+ return {
+ to: fakeCreateCallLib,
+ data,
+ value: '0',
+ }
+ }),
+ }
+ const safeWalletProvider = new SafeWalletProvider(safe, sdk as any)
+ const transferReceiver = faker.finance.ethereumAddress()
+ const erc20Address = faker.finance.ethereumAddress()
+ const erc20TransferData = ERC20__factory.createInterface().encodeFunctionData('transfer', [
+ transferReceiver,
+ '100',
+ ])
+ const nativeTransferTo = faker.finance.ethereumAddress()
+
+ const params = [
+ {
+ chainId: 1,
+ version: '1.0',
+ from: safe.safeAddress,
+ calls: [
+ { data: '0x1234' },
+ { data: '0x', to: nativeTransferTo, value: '0x1' },
+ {
+ to: erc20Address,
+ data: erc20TransferData,
+ },
+ ],
+ },
+ ]
+
+ await safeWalletProvider.request(1, { method: 'wallet_sendCalls', params } as any, appInfo)
+
+ expect(sdk.send).toHaveBeenCalledWith(
+ {
+ txs: [
+ {
+ to: fakeCreateCallLib,
+ data: '0x1234',
+ value: '0',
+ },
+ {
+ to: nativeTransferTo,
+ data: '0x',
+ value: '0x1',
+ },
+ {
+ to: erc20Address,
+ data: erc20TransferData,
+ value: '0',
+ },
+ ],
+ params: { safeTxGas: 0 },
+ },
+ {
+ description: 'test',
+ iconUrl: 'test',
+ id: 1,
+ name: 'test',
+ url: 'test',
+ },
+ )
+ })
})
- describe('wallet_getBundleStatus', () => {
+ describe('wallet_getCallsStatus', () => {
it('should look up a tx by txHash', async () => {
const sdk = {
getBySafeTxHash: jest.fn().mockResolvedValue({
@@ -549,7 +634,7 @@ describe('SafeWalletProvider', () => {
const params = ['0x123']
- await safeWalletProvider.request(1, { method: 'wallet_getBundleStatus', params } as any, appInfo)
+ await safeWalletProvider.request(1, { method: 'wallet_getCallsStatus', params } as any, appInfo)
expect(sdk.getBySafeTxHash).toHaveBeenCalledWith(params[0])
expect(sdk.proxy).toHaveBeenCalledWith('eth_getTransactionReceipt', params)
@@ -571,14 +656,14 @@ describe('SafeWalletProvider', () => {
const params = ['0x123']
- await safeWalletProvider.request(1, { method: 'wallet_getBundleStatus', params } as any, appInfo)
+ await safeWalletProvider.request(1, { method: 'wallet_getCallsStatus', params } as any, appInfo)
expect(sdk.getBySafeTxHash).toHaveBeenCalledWith(params[0])
expect(sdk.proxy).not.toHaveBeenCalled()
})
})
- describe('wallet_showBundleStatus', () => {
+ describe('wallet_showCallsStatus', () => {
it('should return the bundle status', async () => {
const sdk = {
showTxStatus: jest.fn(),
@@ -587,10 +672,52 @@ describe('SafeWalletProvider', () => {
const params = ['0x123']
- await safeWalletProvider.request(1, { method: 'wallet_showBundleStatus', params } as any, appInfo)
+ await safeWalletProvider.request(1, { method: 'wallet_showCallsStatus', params } as any, appInfo)
expect(sdk.showTxStatus).toHaveBeenCalledWith(params[0])
})
})
+
+ describe('wallet_getCapabilities', () => {
+ it('should return atomic batch for the current chain', async () => {
+ const sdk = {
+ showTxStatus: jest.fn(),
+ }
+ const safeWalletProvider = new SafeWalletProvider(safe, sdk as any)
+
+ const params = [safe.safeAddress]
+
+ const result = await safeWalletProvider.request(1, { method: 'wallet_getCapabilities', params } as any, appInfo)
+
+ expect(result).toEqual({
+ id: 1,
+ jsonrpc: '2.0',
+ result: {
+ ['0x1']: {
+ atomicBatch: {
+ supported: true,
+ },
+ },
+ },
+ })
+ })
+
+ it('should return an empty object if the safe address does not match', async () => {
+ const sdk = {
+ showTxStatus: jest.fn(),
+ }
+ const safeWalletProvider = new SafeWalletProvider(safe, sdk as any)
+
+ const params = [faker.finance.ethereumAddress()]
+
+ const result = await safeWalletProvider.request(1, { method: 'wallet_getCapabilities', params } as any, appInfo)
+
+ expect(result).toEqual({
+ id: 1,
+ jsonrpc: '2.0',
+ result: {},
+ })
+ })
+ })
})
})
diff --git a/src/services/safe-wallet-provider/index.ts b/src/services/safe-wallet-provider/index.ts
index ac61be0915..d44109b528 100644
--- a/src/services/safe-wallet-provider/index.ts
+++ b/src/services/safe-wallet-provider/index.ts
@@ -12,8 +12,10 @@ type SafeSettings = {
offChainSigning?: boolean
}
+type GetCapabilitiesResult = Record<`0x${string}`, Record>
+
export type AppInfo = {
- id: number
+ id?: number
name: string
description: string
url: string
@@ -32,6 +34,11 @@ export type WalletSDK = {
switchChain: (chainId: string, appInfo: AppInfo) => Promise
setSafeSettings: (safeSettings: SafeSettings) => SafeSettings
proxy: (method: string, params?: Array | Record) => Promise
+ getCreateCallTransaction: (data: string) => {
+ to: string
+ data: string
+ value: '0'
+ }
}
interface RpcRequest {
@@ -128,28 +135,34 @@ export class SafeWalletProvider {
// EIP-5792
// @see https://eips.ethereum.org/EIPS/eip-5792
- case 'wallet_sendFunctionCallBundle': {
- return this.wallet_sendFunctionCallBundle(
+ case 'wallet_sendCalls': {
+ return this.wallet_sendCalls(
...(params as [
{
+ version: string
chainId: string
from: string
- calls: Array<{ gas: string; data: string; to?: string; value?: string }>
+ calls: Array<{ data: string; to?: string; value?: string }>
+ capabilities?: Record | undefined
},
]),
appInfo,
)
}
- case 'wallet_getBundleStatus': {
- return this.wallet_getBundleStatus(...(params as [string]))
+ case 'wallet_getCallsStatus': {
+ return this.wallet_getCallsStatus(...(params as [string]))
}
- case 'wallet_showBundleStatus': {
- this.wallet_showBundleStatus(...(params as [string]))
+ case 'wallet_showCallsStatus': {
+ this.wallet_showCallsStatus(...(params as [string]))
return null
}
+ case 'wallet_getCapabilities': {
+ return this.wallet_getCapabilities(...(params as [string]))
+ }
+
// Safe proprietary methods
case 'safe_setSettings': {
return this.safe_setSettings(...(params as [SafeSettings]))
@@ -314,17 +327,36 @@ export class SafeWalletProvider {
// EIP-5792
// @see https://eips.ethereum.org/EIPS/eip-5792
- async wallet_sendFunctionCallBundle(
+ async wallet_sendCalls(
bundle: {
chainId: string
from: string
- calls: Array<{ gas: string; data: string; to?: string; value?: string }>
+ calls: Array<{ data?: string; to?: string; value?: string }>
},
appInfo: AppInfo,
): Promise {
+ const txs = bundle.calls.map((call) => {
+ if (!call.to && !call.value && !call.data) {
+ throw new RpcError(RpcErrorCode.INVALID_PARAMS, 'Invalid call parameters.')
+ }
+ if (!call.to && !call.value && call.data) {
+ // If only data is provided the call is a contract deployment
+ // We have to use the CreateCall lib
+ return this.sdk.getCreateCallTransaction(call.data)
+ }
+ if (!call.to) {
+ // For all non-contract deployments we need a to address
+ throw new RpcError(RpcErrorCode.INVALID_PARAMS, 'Invalid call parameters.')
+ }
+ return {
+ to: call.to,
+ data: call.data ?? '0x',
+ value: call.value ?? '0',
+ }
+ })
const { safeTxHash } = await this.sdk.send(
{
- txs: bundle.calls,
+ txs,
params: { safeTxGas: 0 },
},
appInfo,
@@ -332,7 +364,7 @@ export class SafeWalletProvider {
return safeTxHash
}
- async wallet_getBundleStatus(safeTxHash: string): Promise<{
+ async wallet_getCallsStatus(safeTxHash: string): Promise<{
calls: Array<{
status: BundleStatus
receipt: {
@@ -381,11 +413,24 @@ export class SafeWalletProvider {
calls: calls.map(() => callStatus),
}
}
- async wallet_showBundleStatus(txHash: string): Promise {
+ async wallet_showCallsStatus(txHash: string): Promise {
this.sdk.showTxStatus(txHash)
return null
}
+ async wallet_getCapabilities(walletAddress: string): Promise {
+ if (walletAddress === this.safe.safeAddress) {
+ return {
+ [`0x${this.safe.chainId.toString(16)}`]: {
+ atomicBatch: {
+ supported: true,
+ },
+ },
+ }
+ }
+ return {}
+ }
+
// Safe proprietary methods
async safe_setSettings(settings: SafeSettings): Promise {
return this.sdk.setSafeSettings(settings)
diff --git a/src/services/safe-wallet-provider/useSafeWalletProvider.test.tsx b/src/services/safe-wallet-provider/useSafeWalletProvider.test.tsx
index e8dba12a22..db9a29c922 100644
--- a/src/services/safe-wallet-provider/useSafeWalletProvider.test.tsx
+++ b/src/services/safe-wallet-provider/useSafeWalletProvider.test.tsx
@@ -11,6 +11,9 @@ import useSafeWalletProvider, { _useTxFlowApi } from './useSafeWalletProvider'
import { SafeWalletProvider } from '.'
import { makeStore } from '@/store'
import * as messages from '@/utils/safe-messages'
+import { faker } from '@faker-js/faker'
+import { Interface } from 'ethers'
+import { getCreateCallDeployment } from '@safe-global/safe-deployments'
const appInfo = {
id: 1,
@@ -45,6 +48,7 @@ describe('useSafeWalletProvider', () => {
value: '0x1234567890000000000000000000000000000000',
},
deployed: true,
+ version: '1.3.0',
} as unknown as ExtendedSafeInfo,
},
},
@@ -64,6 +68,7 @@ describe('useSafeWalletProvider', () => {
expect(result.current?.getBySafeTxHash).toBeDefined()
expect(result.current?.switchChain).toBeDefined()
expect(result.current?.proxy).toBeDefined()
+ expect(result.current?.getCreateCallTransaction).toBeDefined()
})
it('should open signing window for off-chain messages', () => {
@@ -294,8 +299,7 @@ describe('useSafeWalletProvider', () => {
push: mockPush,
} as unknown as router.NextRouter)
- // @ts-expect-error - auto accept prompt
- jest.spyOn(window, 'prompt').mockReturnValue(true)
+ jest.spyOn(window, 'confirm').mockReturnValue(true)
const { result } = renderHook(() => _useTxFlowApi('1', '0x1234567890000000000000000000000000000000'), {
initialReduxState: {
@@ -354,4 +358,34 @@ describe('useSafeWalletProvider', () => {
},
})
})
+
+ it('should create CreateCall lib transactions', () => {
+ const createCallDeployment = getCreateCallDeployment({ version: '1.3.0', network: '1' })
+ const createCallInterface = new Interface(['function performCreate(uint256,bytes)'])
+ const safeAddress = faker.finance.ethereumAddress()
+ const { result } = renderHook(() => _useTxFlowApi('1', safeAddress), {
+ initialReduxState: {
+ safeInfo: {
+ loading: false,
+ error: undefined,
+ data: {
+ chainId: '1',
+ address: {
+ value: safeAddress,
+ },
+ deployed: true,
+ version: '1.3.0',
+ } as unknown as ExtendedSafeInfo,
+ },
+ },
+ })
+
+ const tx = result.current?.getCreateCallTransaction('0x1234')
+
+ expect(tx).toEqual({
+ to: createCallDeployment?.networkAddresses['1'],
+ value: '0',
+ data: createCallInterface.encodeFunctionData('performCreate', [0, '0x1234']),
+ })
+ })
})
diff --git a/src/services/safe-wallet-provider/useSafeWalletProvider.tsx b/src/services/safe-wallet-provider/useSafeWalletProvider.tsx
index 6833de0a0f..6bb82c0934 100644
--- a/src/services/safe-wallet-provider/useSafeWalletProvider.tsx
+++ b/src/services/safe-wallet-provider/useSafeWalletProvider.tsx
@@ -14,7 +14,7 @@ import { Methods } from '@safe-global/safe-apps-sdk'
import type { EIP712TypedData, SafeSettings } from '@safe-global/safe-apps-sdk'
import { useWeb3ReadOnly } from '@/hooks/wallets/web3'
import { getTransactionDetails } from '@safe-global/safe-gateway-typescript-sdk'
-import { getAddress } from 'ethers'
+import { Interface, getAddress } from 'ethers'
import { AppRoutes } from '@/config/routes'
import useChains, { useCurrentChain } from '@/hooks/useChains'
import { NotificationMessages, showNotification } from './notifications'
@@ -22,6 +22,7 @@ import { SignMessageOnChainFlow } from '@/components/tx-flow/flows'
import { useAppSelector } from '@/store'
import { selectOnChainSigning } from '@/store/settingsSlice'
import { isOffchainEIP1271Supported } from '@/utils/safe-messages'
+import { getCreateCallContractDeployment } from '../contracts/deployments'
export const _useTxFlowApi = (chainId: string, safeAddress: string): WalletSDK | undefined => {
const { safe } = useSafeInfo()
@@ -169,7 +170,7 @@ export const _useTxFlowApi = (chainId: string, safeAddress: string): WalletSDK |
throw new Error(`Chain ${chainId} not supported`)
}
- if (prompt(`${appInfo.name} wants to switch to ${cfg.shortName}. Do you want to continue?`)) {
+ if (confirm(`${appInfo.name} wants to switch to ${cfg.shortName}. Do you want to continue?`)) {
router.push({
pathname: AppRoutes.index,
query: {
@@ -205,6 +206,23 @@ export const _useTxFlowApi = (chainId: string, safeAddress: string): WalletSDK |
async proxy(method, params) {
return web3ReadOnly?.send(method, params ?? [])
},
+
+ getCreateCallTransaction(data) {
+ const createCallDeployment = getCreateCallContractDeployment(safe.chainId, safe.version)
+ if (!createCallDeployment) {
+ throw new Error('No CreateCall deployment found for chain and safe version')
+ }
+ const createCallAddress = createCallDeployment.networkAddresses[safe.chainId]
+
+ const createCallInterface = new Interface(createCallDeployment.abi)
+ const callData = createCallInterface.encodeFunctionData('performCreate', ['0', data])
+
+ return {
+ to: createCallAddress,
+ data: callData,
+ value: '0',
+ }
+ },
}
}, [chainId, safeAddress, safe, currentChain, onChainSigning, settings, setTxFlow, configs, router, web3ReadOnly])
}
diff --git a/src/services/siwe/index.ts b/src/services/siwe/index.ts
new file mode 100644
index 0000000000..682e79c1bc
--- /dev/null
+++ b/src/services/siwe/index.ts
@@ -0,0 +1,41 @@
+import { getAuthNonce, verifyAuth } from '@safe-global/safe-gateway-typescript-sdk'
+import type { BrowserProvider } from 'ethers'
+
+/**
+ * Prompt the user to sign in with their wallet and set an access_token cookie
+ * @param provider
+ */
+async function signInWithEthereum(provider: BrowserProvider) {
+ const { nonce } = await getAuthNonce()
+
+ const [network, signer] = await Promise.all([provider.getNetwork(), provider.getSigner()])
+
+ const message = {
+ domain: window.location.host,
+ address: signer.address as `0x${string}`,
+ // Results in special signing window in MetaMask
+ statement: 'Sign in with Ethereum to the app.',
+ uri: window.location.origin,
+ version: '1',
+ chainId: Number(network.chainId),
+ nonce,
+ issuedAt: new Date(),
+ }
+
+ const signableMessage = `${message.domain} wants you to sign in with your Ethereum account:
+${message.address}
+
+${message.statement}
+
+URI: ${message.uri}
+Version: ${message.version}
+Chain ID: ${message.chainId}
+Nonce: ${message.nonce}
+Issued At: ${message.issuedAt.toISOString()}`
+
+ const signature = await signer.signMessage(signableMessage)
+
+ return verifyAuth({ message: signableMessage, signature })
+}
+
+export default signInWithEthereum
diff --git a/src/services/transactions/index.ts b/src/services/transactions/index.ts
index d9b2c4da76..01e8fce25f 100644
--- a/src/services/transactions/index.ts
+++ b/src/services/transactions/index.ts
@@ -1,5 +1,6 @@
import memoize from 'lodash/memoize'
import { getTransactionDetails, getTransactionHistory } from '@safe-global/safe-gateway-typescript-sdk'
+import { trimTrailingSlash } from '@/utils/url'
export const getTimezoneOffset = () => new Date().getTimezoneOffset() * 60 * -1000
@@ -28,3 +29,31 @@ export const getTxHistory = (chainId: string, safeAddress: string, trusted = fal
pageUrl,
)
}
+
+/**
+ * Fetch the module transaction id from the transaction service providing the transaction hash
+ */
+export const getModuleTransactionId = async ({
+ transactionService,
+ safeAddress,
+ txHash,
+}: {
+ transactionService: string
+ safeAddress: string
+ txHash: string
+}) => {
+ const url = `${trimTrailingSlash(
+ transactionService,
+ )}/api/v1/safes/${safeAddress}/module-transactions/?transaction_hash=${txHash}`
+ const { results } = await fetch(url).then((res) => {
+ if (res.ok && res.status === 200) {
+ return res.json() as Promise
+ } else {
+ throw new Error('Error fetching Safe module transactions')
+ }
+ })
+
+ if (results.length === 0) throw new Error('module transaction not found')
+
+ return results[0].moduleTransactionId as string
+}
diff --git a/src/services/tx/__tests__/txMonitor.test.ts b/src/services/tx/__tests__/txMonitor.test.ts
index c87a161c58..cc46409c63 100644
--- a/src/services/tx/__tests__/txMonitor.test.ts
+++ b/src/services/tx/__tests__/txMonitor.test.ts
@@ -3,14 +3,13 @@ import * as txEvents from '@/services/tx/txEvents'
import * as txMonitor from '@/services/tx/txMonitor'
import { act } from '@testing-library/react'
-import { SafeCreationStatus } from '@/components/new-safe/create/steps/StatusStep/useSafeCreation'
import { toBeHex } from 'ethers'
import { MockEip1193Provider } from '@/tests/mocks/providers'
import { BrowserProvider, type JsonRpcProvider, type TransactionReceipt } from 'ethers'
import { faker } from '@faker-js/faker'
import { SimpleTxWatcher } from '@/utils/SimpleTxWatcher'
-const { waitForTx, waitForRelayedTx, waitForCreateSafeTx } = txMonitor
+const { waitForTx, waitForRelayedTx } = txMonitor
const provider = new BrowserProvider(MockEip1193Provider) as unknown as JsonRpcProvider
@@ -243,134 +242,6 @@ describe('txMonitor', () => {
})
})
})
-
- describe('waitForCreateSafeTx', () => {
- it("sets the status to SUCCESS if taskStatus 'ExecSuccess'", async () => {
- const mockData = {
- task: {
- taskState: 'ExecSuccess',
- },
- }
- global.fetch = jest.fn().mockImplementation(setupFetchStub(mockData))
-
- const mockFetch = jest.spyOn(global, 'fetch')
- const setStatusSpy = jest.fn()
-
- waitForCreateSafeTx('0x1', setStatusSpy)
-
- await act(() => {
- jest.advanceTimersByTime(15_000 + 1)
- })
-
- expect(mockFetch).toHaveBeenCalledTimes(1)
- expect(setStatusSpy).toHaveBeenCalledWith(SafeCreationStatus.SUCCESS)
- })
-
- it("sets the status to ERROR if taskStatus 'ExecReverted'", async () => {
- const mockData = {
- task: {
- taskState: 'ExecReverted',
- },
- }
- global.fetch = jest.fn().mockImplementation(setupFetchStub(mockData))
-
- const mockFetch = jest.spyOn(global, 'fetch')
- const setStatusSpy = jest.fn()
-
- waitForCreateSafeTx('0x1', setStatusSpy)
-
- await act(() => {
- jest.advanceTimersByTime(15_000 + 1)
- })
-
- expect(mockFetch).toHaveBeenCalledTimes(1)
- expect(setStatusSpy).toHaveBeenCalledWith(SafeCreationStatus.ERROR)
- })
-
- it("sets the status to ERROR if taskStatus 'Blacklisted'", async () => {
- const mockData = {
- task: {
- taskState: 'Blacklisted',
- },
- }
- global.fetch = jest.fn().mockImplementation(setupFetchStub(mockData))
-
- const mockFetch = jest.spyOn(global, 'fetch')
- const setStatusSpy = jest.fn()
-
- waitForCreateSafeTx('0x1', setStatusSpy)
-
- await act(() => {
- jest.advanceTimersByTime(15_000 + 1)
- })
-
- expect(mockFetch).toHaveBeenCalledTimes(1)
- expect(setStatusSpy).toHaveBeenCalledWith(SafeCreationStatus.ERROR)
- })
-
- it("sets the status to ERROR if taskStatus 'Cancelled'", async () => {
- const mockData = {
- task: {
- taskState: 'Cancelled',
- },
- }
- global.fetch = jest.fn().mockImplementation(setupFetchStub(mockData))
-
- const mockFetch = jest.spyOn(global, 'fetch')
- const setStatusSpy = jest.fn()
-
- waitForCreateSafeTx('0x1', setStatusSpy)
-
- await act(() => {
- jest.advanceTimersByTime(15_000 + 1)
- })
-
- expect(mockFetch).toHaveBeenCalledTimes(1)
- expect(setStatusSpy).toHaveBeenCalledWith(SafeCreationStatus.ERROR)
- })
-
- it("sets the status to ERROR if taskStatus 'NotFound'", async () => {
- const mockData = {
- task: {
- taskState: 'NotFound',
- },
- }
- global.fetch = jest.fn().mockImplementation(setupFetchStub(mockData))
-
- const mockFetch = jest.spyOn(global, 'fetch')
- const setStatusSpy = jest.fn()
-
- waitForCreateSafeTx('0x1', setStatusSpy)
-
- await act(() => {
- jest.advanceTimersByTime(15_000 + 1)
- })
-
- expect(mockFetch).toHaveBeenCalledTimes(1)
- expect(setStatusSpy).toHaveBeenCalledWith(SafeCreationStatus.ERROR)
- })
-
- it('sets the status to ERROR if the tx relaying timed out', async () => {
- const mockData = {
- task: {
- taskState: 'WaitingForConfirmation',
- },
- }
- global.fetch = jest.fn().mockImplementation(setupFetchStub(mockData))
-
- const mockFetch = jest.spyOn(global, 'fetch')
- const setStatusSpy = jest.fn()
-
- waitForCreateSafeTx('0x1', setStatusSpy)
-
- await act(() => {
- jest.advanceTimersByTime(3 * 60_000 + 1)
- })
-
- expect(mockFetch).toHaveBeenCalled()
- expect(setStatusSpy).toHaveBeenCalledWith(SafeCreationStatus.ERROR)
- })
- })
})
describe('getRemainingTimeout', () => {
diff --git a/src/services/tx/extractTxInfo.ts b/src/services/tx/extractTxInfo.ts
index fc8da6248d..6fc690beb4 100644
--- a/src/services/tx/extractTxInfo.ts
+++ b/src/services/tx/extractTxInfo.ts
@@ -57,6 +57,8 @@ const extractTxInfo = (
} else {
return txDetails.txData?.value ?? '0'
}
+ case 'TwapOrder':
+ return txDetails.txData?.value ?? '0'
case 'SwapOrder':
return txDetails.txData?.value ?? '0'
case 'Custom':
@@ -79,12 +81,12 @@ const extractTxInfo = (
return txDetails.txInfo.transferInfo.tokenAddress
}
case 'SwapOrder':
- const swapOrderTo = txDetails.txData?.to.value
- // TODO: Remove assertion after type is corrected
- if (!swapOrderTo) {
- throw new Error('SwapOrder tx data does not have a `to` field')
+ case 'TwapOrder':
+ const orderTo = txDetails.txData?.to.value
+ if (!orderTo) {
+ throw new Error('Order tx data does not have a `to` field')
}
- return swapOrderTo
+ return orderTo
case 'Custom':
return txDetails.txInfo.to.value
case 'Creation':
diff --git a/src/services/tx/tx-sender/__tests__/ts-sender.test.ts b/src/services/tx/tx-sender/__tests__/ts-sender.test.ts
index dd5149468e..f961694bd6 100644
--- a/src/services/tx/tx-sender/__tests__/ts-sender.test.ts
+++ b/src/services/tx/tx-sender/__tests__/ts-sender.test.ts
@@ -33,7 +33,6 @@ const setupFetchStub = (data: any) => (_url: string) => {
ok: true,
})
}
-import type { OnboardAPI, WalletState, AppState } from '@web3-onboard/core'
import { toBeHex } from 'ethers'
import { generatePreValidatedSignature } from '@safe-global/protocol-kit/dist/src/utils/signatures'
import { createMockSafeTransaction } from '@/tests/transactions'
@@ -67,47 +66,6 @@ jest.mock('../../proposeTransaction', () => ({
default: jest.fn(() => Promise.resolve({ txId: '123' })),
}))
-const mockOnboardState = {
- chains: [],
- walletModules: [],
- wallets: [
- {
- label: 'Wallet 1',
- icon: '',
- provider: MockEip1193Provider,
- chains: [{ id: '0x5' }],
- accounts: [
- {
- address: SIGNER_ADDRESS,
- ens: null,
- balance: null,
- },
- ],
- },
- ] as WalletState[],
- accountCenter: {
- enabled: true,
- },
-} as unknown as AppState
-
-const mockOnboard = {
- connectWallet: jest.fn(),
- disconnectWallet: jest.fn(),
- setChain: jest.fn(),
- state: {
- select: (key: keyof AppState) => ({
- subscribe: (next: any) => {
- next(mockOnboardState[key])
-
- return {
- unsubscribe: jest.fn(),
- }
- },
- }),
- get: () => mockOnboardState,
- },
-} as unknown as OnboardAPI
-
// Mock Safe SDK
const mockSafeSDK = {
createTransaction: jest.fn(() => ({
@@ -323,7 +281,7 @@ describe('txSender', () => {
nonce: 1,
})
- const signedTx = await dispatchTxSigning(tx, '1.3.0', mockOnboard, '5', '0x345')
+ const signedTx = await dispatchTxSigning(tx, '1.3.0', MockEip1193Provider, '0x345')
expect(mockSafeSDK.createTransaction).toHaveBeenCalled()
@@ -344,7 +302,7 @@ describe('txSender', () => {
nonce: 1,
})
- const signedTx = await dispatchTxSigning(tx, '1.0.0', mockOnboard, '5', '0x345')
+ const signedTx = await dispatchTxSigning(tx, '1.0.0', MockEip1193Provider, '0x345')
expect(mockSafeSDK.createTransaction).toHaveBeenCalledTimes(1)
@@ -365,7 +323,7 @@ describe('txSender', () => {
nonce: 1,
})
- const signedTx = await dispatchTxSigning(tx, null, mockOnboard, '5', '0x345')
+ const signedTx = await dispatchTxSigning(tx, null, MockEip1193Provider, '0x345')
expect(mockSafeSDK.createTransaction).toHaveBeenCalledTimes(1)
@@ -388,7 +346,7 @@ describe('txSender', () => {
nonce: 1,
})
- const signedTx = await dispatchTxSigning(tx, '1.3.0', mockOnboard, '5', '0x345')
+ const signedTx = await dispatchTxSigning(tx, '1.3.0', MockEip1193Provider, '0x345')
expect(mockSafeSDK.createTransaction).toHaveBeenCalledTimes(1)
@@ -414,7 +372,7 @@ describe('txSender', () => {
let signedTx
try {
- signedTx = await dispatchTxSigning(tx, '1.3.0', mockOnboard, '5', '0x345')
+ signedTx = await dispatchTxSigning(tx, '1.3.0', MockEip1193Provider, '0x345')
} catch (error) {
expect(mockSafeSDK.createTransaction).toHaveBeenCalledTimes(1)
@@ -448,7 +406,7 @@ describe('txSender', () => {
let signedTx
try {
- signedTx = await dispatchTxSigning(tx, '1.3.0', mockOnboard, '5', '0x345')
+ signedTx = await dispatchTxSigning(tx, '1.3.0', MockEip1193Provider, '0x345')
} catch (error) {
expect(mockSafeSDK.createTransaction).toHaveBeenCalledTimes(1)
@@ -484,7 +442,7 @@ describe('txSender', () => {
nonce: 1,
})
- await dispatchTxExecution(safeTx, { nonce: 1 }, txId, mockOnboard, '5', safeAddress)
+ await dispatchTxExecution(safeTx, { nonce: 1 }, txId, MockEip1193Provider, SIGNER_ADDRESS, safeAddress)
expect(mockSafeSDK.executeTransaction).toHaveBeenCalled()
expect(txEvents.txDispatch).toHaveBeenCalledWith('EXECUTING', { txId })
@@ -512,7 +470,9 @@ describe('txSender', () => {
nonce: 1,
})
- await expect(dispatchTxExecution(safeTx, {}, txId, mockOnboard, '5', safeAddress)).rejects.toThrow('error')
+ await expect(dispatchTxExecution(safeTx, {}, txId, MockEip1193Provider, '5', safeAddress)).rejects.toThrow(
+ 'error',
+ )
expect(mockSafeSDK.executeTransaction).toHaveBeenCalled()
expect(txEvents.txDispatch).toHaveBeenCalledWith('FAILED', { txId, error: new Error('error') })
@@ -531,7 +491,7 @@ describe('txSender', () => {
nonce: 1,
})
- await dispatchTxExecution(safeTx, { nonce: 1 }, txId, mockOnboard, '5', '0x123')
+ await dispatchTxExecution(safeTx, { nonce: 1 }, txId, MockEip1193Provider, SIGNER_ADDRESS, '0x123')
expect(mockSafeSDK.executeTransaction).toHaveBeenCalled()
expect(txEvents.txDispatch).toHaveBeenCalledWith('EXECUTING', { txId })
diff --git a/src/services/tx/tx-sender/dispatch.ts b/src/services/tx/tx-sender/dispatch.ts
index 3f9038aa7b..5af9b9f578 100644
--- a/src/services/tx/tx-sender/dispatch.ts
+++ b/src/services/tx/tx-sender/dispatch.ts
@@ -1,10 +1,15 @@
import { relayTransaction, type SafeInfo, type TransactionDetails } from '@safe-global/safe-gateway-typescript-sdk'
-import type { SafeTransaction, TransactionOptions, TransactionResult } from '@safe-global/safe-core-sdk-types'
+import type {
+ SafeTransaction,
+ Transaction,
+ TransactionOptions,
+ TransactionResult,
+} from '@safe-global/safe-core-sdk-types'
import { didRevert } from '@/utils/ethers-utils'
import type { MultiSendCallOnlyEthersContract } from '@safe-global/protocol-kit'
import { type SpendingLimitTxParams } from '@/components/tx-flow/flows/TokenTransfer/ReviewSpendingLimitTx'
import { getSpendingLimitContract } from '@/services/contracts/spendingLimitContracts'
-import type { ContractTransactionResponse, Overrides, TransactionResponse } from 'ethers'
+import type { ContractTransactionResponse, Eip1193Provider, Overrides, TransactionResponse } from 'ethers'
import type { RequestId } from '@safe-global/safe-apps-sdk'
import proposeTx from '../proposeTransaction'
import { txDispatch, TxEvent } from '../txEvents'
@@ -14,11 +19,10 @@ import {
getAndValidateSafeSDK,
getSafeSDKWithSigner,
getUncheckedSafeSDK,
- assertWalletChain,
tryOffChainTxSigning,
+ getUncheckedSigner,
} from './sdk'
import { createWeb3, getUserNonce, getWeb3ReadOnly } from '@/hooks/wallets/web3'
-import { type OnboardAPI } from '@web3-onboard/core'
import { asError } from '@/services/exceptions/utils'
import chains from '@/config/chains'
import { LATEST_SAFE_VERSION } from '@/config/constants'
@@ -76,11 +80,10 @@ export const dispatchTxProposal = async ({
export const dispatchTxSigning = async (
safeTx: SafeTransaction,
safeVersion: SafeInfo['version'],
- onboard: OnboardAPI,
- chainId: SafeInfo['chainId'],
+ provider: Eip1193Provider,
txId?: string,
): Promise => {
- const sdk = await getSafeSDKWithSigner(onboard, chainId)
+ const sdk = await getSafeSDKWithSigner(provider)
let signedTx: SafeTransaction | undefined
try {
@@ -106,10 +109,10 @@ const ZK_SYNC_ON_CHAIN_SIGNATURE_GAS_LIMIT = 4_500_000
export const dispatchOnChainSigning = async (
safeTx: SafeTransaction,
txId: string,
- onboard: OnboardAPI,
+ provider: Eip1193Provider,
chainId: SafeInfo['chainId'],
) => {
- const sdkUnchecked = await getUncheckedSafeSDK(onboard, chainId)
+ const sdkUnchecked = await getUncheckedSafeSDK(provider)
const safeTxHash = await sdkUnchecked.getTransactionHash(safeTx)
const eventParams = { txId }
@@ -135,13 +138,13 @@ export const dispatchOnChainSigning = async (
export const dispatchSafeTxSpeedUp = async (
txOptions: Omit & { nonce: number },
txId: string,
- onboard: OnboardAPI,
+ provider: Eip1193Provider,
chainId: SafeInfo['chainId'],
+ signerAddress: string,
safeAddress: string,
) => {
- const sdkUnchecked = await getUncheckedSafeSDK(onboard, chainId)
+ const sdkUnchecked = await getUncheckedSafeSDK(provider)
const eventParams = { txId }
- const wallet = await assertWalletChain(onboard, chainId)
const signerNonce = txOptions.nonce
// Execute the tx
@@ -158,17 +161,17 @@ export const dispatchSafeTxSpeedUp = async (
txDispatch(TxEvent.PROCESSING, {
...eventParams,
txHash: result.hash,
- signerAddress: wallet.address,
+ signerAddress,
signerNonce,
gasLimit: txOptions.gasLimit,
txType: 'SafeTx',
})
- const provider = getWeb3ReadOnly()
+ const readOnlyProvider = getWeb3ReadOnly()
- if (provider) {
+ if (readOnlyProvider) {
// don't await as we don't want to block
- waitForTx(provider, [txId], result.hash, safeAddress, wallet.address, signerNonce)
+ waitForTx(readOnlyProvider, [txId], result.hash, safeAddress, signerAddress, signerNonce)
}
return result.hash
@@ -179,19 +182,17 @@ export const dispatchCustomTxSpeedUp = async (
txId: string,
to: string,
data: string,
- onboard: OnboardAPI,
- chainId: SafeInfo['chainId'],
+ provider: Eip1193Provider,
+ signerAddress: string,
safeAddress: string,
) => {
const eventParams = { txId }
- const wallet = await assertWalletChain(onboard, chainId)
const signerNonce = txOptions.nonce
- const web3Provider = createWeb3(wallet.provider)
- const signer = await web3Provider.getSigner()
// Execute the tx
let result: TransactionResponse | undefined
try {
+ const signer = await getUncheckedSigner(provider)
result = await signer.sendTransaction({ to, data, ...txOptions })
txDispatch(TxEvent.EXECUTING, eventParams)
} catch (error) {
@@ -201,7 +202,7 @@ export const dispatchCustomTxSpeedUp = async (
txDispatch(TxEvent.PROCESSING, {
txHash: result.hash,
- signerAddress: wallet.address,
+ signerAddress,
signerNonce,
data,
to,
@@ -209,11 +210,11 @@ export const dispatchCustomTxSpeedUp = async (
txType: 'Custom',
})
- const provider = getWeb3ReadOnly()
+ const readOnlyProvider = getWeb3ReadOnly()
- if (provider) {
+ if (readOnlyProvider) {
// don't await as we don't want to block
- waitForTx(provider, [txId], result.hash, safeAddress, wallet.address, signerNonce)
+ waitForTx(readOnlyProvider, [txId], result.hash, safeAddress, signerAddress, signerNonce)
}
return result.hash
@@ -226,15 +227,14 @@ export const dispatchTxExecution = async (
safeTx: SafeTransaction,
txOptions: TransactionOptions,
txId: string,
- onboard: OnboardAPI,
- chainId: SafeInfo['chainId'],
+ provider: Eip1193Provider,
+ signerAddress: string,
safeAddress: string,
): Promise => {
- const sdkUnchecked = await getUncheckedSafeSDK(onboard, chainId)
+ const sdkUnchecked = await getUncheckedSafeSDK(provider)
const eventParams = { txId }
- const wallet = await assertWalletChain(onboard, chainId)
- const signerNonce = txOptions.nonce ?? (await getUserNonce(wallet.address))
+ const signerNonce = txOptions.nonce ?? (await getUserNonce(signerAddress))
// Execute the tx
let result: TransactionResult | undefined
@@ -249,18 +249,18 @@ export const dispatchTxExecution = async (
txDispatch(TxEvent.PROCESSING, {
...eventParams,
txHash: result.hash,
- signerAddress: wallet.address,
+ signerAddress,
signerNonce,
gasLimit: txOptions.gasLimit,
txType: 'SafeTx',
})
- const provider = getWeb3ReadOnly()
+ const readOnlyProvider = getWeb3ReadOnly()
// Asynchronously watch the tx to be mined/validated
- if (provider) {
+ if (readOnlyProvider) {
// don't await as we don't want to block
- waitForTx(provider, [txId], result.hash, safeAddress, wallet.address, signerNonce)
+ waitForTx(readOnlyProvider, [txId], result.hash, safeAddress, signerAddress, signerNonce)
}
return result.hash
@@ -270,8 +270,8 @@ export const dispatchBatchExecution = async (
txs: TransactionDetails[],
multiSendContract: MultiSendCallOnlyEthersContract,
multiSendTxData: string,
- onboard: OnboardAPI,
- chainId: SafeInfo['chainId'],
+ provider: Eip1193Provider,
+ signerAddress: string,
safeAddress: string,
overrides: Omit & { nonce: number },
) => {
@@ -279,18 +279,15 @@ export const dispatchBatchExecution = async (
let result: ContractTransactionResponse | undefined
const txIds = txs.map((tx) => tx.txId)
- let signerAddress: string | undefined = undefined
let signerNonce = overrides.nonce
let txData = multiSendContract.encode('multiSend', [multiSendTxData])
- const wallet = await assertWalletChain(onboard, chainId)
try {
- signerAddress = wallet.address
if (signerNonce === undefined || signerNonce === null) {
signerNonce = await getUserNonce(signerAddress)
}
- const provider = createWeb3(wallet.provider)
- result = await multiSendContract.contract.connect(await provider.getSigner()).multiSend(multiSendTxData, overrides)
+ const signer = await getUncheckedSigner(provider)
+ result = await multiSendContract.contract.connect(signer).multiSend(multiSendTxData, overrides)
txIds.forEach((txId) => {
txDispatch(TxEvent.EXECUTING, { txId, groupKey })
@@ -309,27 +306,75 @@ export const dispatchBatchExecution = async (
txHash: result!.hash,
groupKey,
signerNonce,
- signerAddress: wallet.address,
+ signerAddress,
txType: 'Custom',
data: txData,
to: txTo,
})
})
- const provider = getWeb3ReadOnly()
+ const readOnlyProvider = getWeb3ReadOnly()
- if (provider) {
+ if (readOnlyProvider) {
// don't await as we don't want to block
- waitForTx(provider, txIds, result.hash, safeAddress, signerAddress, signerNonce)
+ waitForTx(readOnlyProvider, txIds, result.hash, safeAddress, signerAddress, signerNonce)
}
return result!.hash
}
+/**
+ * Execute a module transaction
+ */
+export const dispatchModuleTxExecution = async (
+ tx: Transaction,
+ provider: Eip1193Provider,
+ safeAddress: string,
+): Promise => {
+ const id = JSON.stringify(tx)
+
+ let result: TransactionResponse | undefined
+ try {
+ const browserProvider = createWeb3(provider)
+ const signer = await browserProvider.getSigner()
+
+ txDispatch(TxEvent.EXECUTING, { groupKey: id })
+ result = await signer.sendTransaction(tx)
+ } catch (error) {
+ txDispatch(TxEvent.FAILED, { groupKey: id, error: asError(error) })
+ throw error
+ }
+
+ txDispatch(TxEvent.PROCESSING_MODULE, {
+ groupKey: id,
+ txHash: result.hash,
+ })
+
+ result
+ ?.wait()
+ .then((receipt) => {
+ if (receipt === null) {
+ txDispatch(TxEvent.FAILED, { groupKey: id, error: new Error('No transaction receipt found') })
+ } else if (didRevert(receipt)) {
+ txDispatch(TxEvent.REVERTED, {
+ groupKey: id,
+ error: new Error('Transaction reverted by EVM'),
+ })
+ } else {
+ txDispatch(TxEvent.PROCESSED, { groupKey: id, safeAddress, txHash: result?.hash })
+ }
+ })
+ .catch((error) => {
+ txDispatch(TxEvent.FAILED, { groupKey: id, error: asError(error) })
+ })
+
+ return result?.hash
+}
+
export const dispatchSpendingLimitTxExecution = async (
txParams: SpendingLimitTxParams,
txOptions: TransactionOptions,
- onboard: OnboardAPI,
+ provider: Eip1193Provider,
chainId: SafeInfo['chainId'],
safeAddress: string,
) => {
@@ -337,9 +382,8 @@ export const dispatchSpendingLimitTxExecution = async (
let result: ContractTransactionResponse | undefined
try {
- const wallet = await assertWalletChain(onboard, chainId)
- const provider = createWeb3(wallet.provider)
- const contract = getSpendingLimitContract(chainId, await provider.getSigner())
+ const signer = await getUncheckedSigner(provider)
+ const contract = getSpendingLimitContract(chainId, signer)
result = await contract.executeAllowanceTransfer(
txParams.safeAddress,
@@ -387,11 +431,10 @@ export const dispatchSpendingLimitTxExecution = async (
export const dispatchSafeAppsTx = async (
safeTx: SafeTransaction,
safeAppRequestId: RequestId,
- onboard: OnboardAPI,
- chainId: SafeInfo['chainId'],
+ provider: Eip1193Provider,
txId?: string,
): Promise => {
- const sdk = await getSafeSDKWithSigner(onboard, chainId)
+ const sdk = await getSafeSDKWithSigner(provider)
const safeTxHash = await sdk.getTransactionHash(safeTx)
txDispatch(TxEvent.SAFE_APPS_REQUEST, { safeAppRequestId, safeTxHash, txId })
return safeTxHash
diff --git a/src/services/tx/tx-sender/sdk.ts b/src/services/tx/tx-sender/sdk.ts
index 9379b42b37..3071bd19a2 100644
--- a/src/services/tx/tx-sender/sdk.ts
+++ b/src/services/tx/tx-sender/sdk.ts
@@ -1,7 +1,7 @@
import { getSafeSDK } from '@/hooks/coreSDK/safeCoreSDK'
import type Safe from '@safe-global/protocol-kit'
import { EthersAdapter, SigningMethod } from '@safe-global/protocol-kit'
-import type { JsonRpcSigner } from 'ethers'
+import type { Eip1193Provider, JsonRpcSigner } from 'ethers'
import { ethers } from 'ethers'
import { isWalletRejection, isHardwareWallet, isWalletConnect } from '@/utils/wallets'
import { OperationType, type SafeTransaction } from '@safe-global/safe-core-sdk-types'
@@ -15,6 +15,7 @@ import { type OnboardAPI } from '@web3-onboard/core'
import type { ConnectedWallet } from '@/hooks/wallets/useOnboard'
import { asError } from '@/services/exceptions/utils'
import { UncheckedJsonRpcSigner } from '@/utils/providers/UncheckedJsonRpcSigner'
+import get from 'lodash/get'
export const getAndValidateSafeSDK = (): Safe => {
const safeSDK = getSafeSDK()
@@ -36,24 +37,29 @@ async function switchOrAddChain(walletProvider: ConnectedWallet['provider'], cha
params: [{ chainId: hexChainId }],
})
} catch (error) {
- if ((error as Error & { code: number }).code !== UNKNOWN_CHAIN_ERROR_CODE) {
- throw error
+ const errorCode = get(error, 'code') as number | undefined
+
+ // Rabby emits the same error code as MM, but it is nested
+ const nestedErrorCode = get(error, 'data.originalError.code') as number | undefined
+
+ if (errorCode === UNKNOWN_CHAIN_ERROR_CODE || nestedErrorCode === UNKNOWN_CHAIN_ERROR_CODE) {
+ const chain = await getChainConfig(chainId)
+
+ return walletProvider.request({
+ method: 'wallet_addEthereumChain',
+ params: [
+ {
+ chainId: hexChainId,
+ chainName: chain.chainName,
+ nativeCurrency: chain.nativeCurrency,
+ rpcUrls: [chain.publicRpcUri.value],
+ blockExplorerUrls: [new URL(chain.blockExplorerUriTemplate.address).origin],
+ },
+ ],
+ })
}
- const chain = await getChainConfig(chainId)
-
- return walletProvider.request({
- method: 'wallet_addEthereumChain',
- params: [
- {
- chainId: hexChainId,
- chainName: chain.chainName,
- nativeCurrency: chain.nativeCurrency,
- rpcUrls: [chain.publicRpcUri.value],
- blockExplorerUrls: [new URL(chain.blockExplorerUriTemplate.address).origin],
- },
- ],
- })
+ throw error
}
}
@@ -111,13 +117,14 @@ export const assertWalletChain = async (onboard: OnboardAPI, chainId: string): P
return newWallet
}
-export const getAssertedChainSigner = async (
- onboard: OnboardAPI,
- chainId: SafeInfo['chainId'],
-): Promise => {
- const wallet = await assertWalletChain(onboard, chainId)
- const provider = createWeb3(wallet.provider)
- return provider.getSigner()
+export const getAssertedChainSigner = async (provider: Eip1193Provider): Promise => {
+ const browserProvider = createWeb3(provider)
+ return browserProvider.getSigner()
+}
+
+export const getUncheckedSigner = async (provider: Eip1193Provider) => {
+ const browserProvider = createWeb3(provider)
+ return new UncheckedJsonRpcSigner(browserProvider, (await browserProvider.getSigner()).address)
}
/**
@@ -126,8 +133,9 @@ export const getAssertedChainSigner = async (
* most of the values of transactionResponse which is needed when
* dealing with smart-contract wallet owners
*/
-export const getUncheckedSafeSDK = async (onboard: OnboardAPI, chainId: SafeInfo['chainId']): Promise => {
- const signer = await getAssertedChainSigner(onboard, chainId)
+export const getUncheckedSafeSDK = async (provider: Eip1193Provider): Promise => {
+ const browserProvider = createWeb3(provider)
+ const signer = await browserProvider.getSigner()
const uncheckedJsonRpcSigner = new UncheckedJsonRpcSigner(signer.provider, await signer.getAddress())
const sdk = getAndValidateSafeSDK()
@@ -139,8 +147,9 @@ export const getUncheckedSafeSDK = async (onboard: OnboardAPI, chainId: SafeInfo
return sdk.connect({ ethAdapter })
}
-export const getSafeSDKWithSigner = async (onboard: OnboardAPI, chainId: SafeInfo['chainId']): Promise => {
- const signer = await getAssertedChainSigner(onboard, chainId)
+export const getSafeSDKWithSigner = async (provider: Eip1193Provider): Promise => {
+ const browserProvider = createWeb3(provider)
+ const signer = await browserProvider.getSigner()
const sdk = getAndValidateSafeSDK()
const ethAdapter = new EthersAdapter({
diff --git a/src/services/tx/txMonitor.ts b/src/services/tx/txMonitor.ts
index f0dcc0d5d2..2931808128 100644
--- a/src/services/tx/txMonitor.ts
+++ b/src/services/tx/txMonitor.ts
@@ -4,7 +4,6 @@ import { txDispatch, TxEvent } from '@/services/tx/txEvents'
import { POLLING_INTERVAL } from '@/config/constants'
import { Errors, logError } from '@/services/exceptions'
-import { SafeCreationStatus } from '@/components/new-safe/create/steps/StatusStep/useSafeCreation'
import { asError } from '../exceptions/utils'
import { type JsonRpcProvider, type TransactionReceipt } from 'ethers'
import { SimpleTxWatcher } from '@/utils/SimpleTxWatcher'
@@ -205,41 +204,3 @@ export const waitForRelayedTx = (taskId: string, txIds: string[], safeAddress: s
clearInterval(intervalId)
}, WAIT_FOR_RELAY_TIMEOUT)
}
-
-export const waitForCreateSafeTx = (taskId: string, setStatus: (value: SafeCreationStatus) => void): void => {
- let intervalId: NodeJS.Timeout
- let failAfterTimeoutId: NodeJS.Timeout
-
- intervalId = setInterval(async () => {
- const status = await getRelayTxStatus(taskId)
-
- // 404
- if (!status) {
- return
- }
-
- switch (status.task.taskState) {
- case TaskState.ExecSuccess:
- setStatus(SafeCreationStatus.SUCCESS)
- break
- case TaskState.ExecReverted:
- case TaskState.Blacklisted:
- case TaskState.Cancelled:
- case TaskState.NotFound:
- setStatus(SafeCreationStatus.ERROR)
- break
- default:
- // Don't clear interval as we're still waiting for the tx to be relayed
- return
- }
-
- clearTimeout(failAfterTimeoutId)
- clearInterval(intervalId)
- }, POLLING_INTERVAL)
-
- failAfterTimeoutId = setTimeout(() => {
- setStatus(SafeCreationStatus.ERROR)
-
- clearInterval(intervalId)
- }, WAIT_FOR_RELAY_TIMEOUT)
-}
diff --git a/src/store/batchSlice.ts b/src/store/batchSlice.ts
index 6a796b4526..4591aaad26 100644
--- a/src/store/batchSlice.ts
+++ b/src/store/batchSlice.ts
@@ -20,21 +20,6 @@ export const batchSlice = createSlice({
name: 'batch',
initialState,
reducers: {
- // Set a batch (used for reordering)
- setBatch: (
- state,
- action: PayloadAction<{
- chainId: string
- safeAddress: string
- items: DraftBatchItem[]
- }>,
- ) => {
- const { chainId, safeAddress, items } = action.payload
- state[chainId] = state[chainId] || {}
- // @ts-expect-error
- state[chainId][safeAddress] = items
- },
-
// Add a tx to the batch
addTx: (
state,
@@ -47,9 +32,11 @@ export const batchSlice = createSlice({
const { chainId, safeAddress, txDetails } = action.payload
state[chainId] = state[chainId] || {}
state[chainId][safeAddress] = state[chainId][safeAddress] || []
+ // @ts-expect-error
state[chainId][safeAddress].push({
id: Math.random().toString(36).slice(2),
timestamp: Date.now(),
+ // @ts-expect-error
txDetails,
})
},
@@ -71,7 +58,7 @@ export const batchSlice = createSlice({
},
})
-export const { setBatch, addTx, removeTx } = batchSlice.actions
+export const { addTx, removeTx } = batchSlice.actions
const selectAllBatches = (state: RootState): BatchTxsState => {
return state[batchSlice.name] || initialState
diff --git a/src/store/cookiesAndTermsSlice.ts b/src/store/cookiesAndTermsSlice.ts
new file mode 100644
index 0000000000..2c87b0f1f6
--- /dev/null
+++ b/src/store/cookiesAndTermsSlice.ts
@@ -0,0 +1,31 @@
+import type { PayloadAction } from '@reduxjs/toolkit'
+import { createSlice } from '@reduxjs/toolkit'
+import type { RootState } from '.'
+
+export enum CookieAndTermType {
+ TERMS = 'terms',
+ NECESSARY = 'necessary',
+ UPDATES = 'updates',
+ ANALYTICS = 'analytics',
+}
+
+export type CookiesAndTermsState = Record
+
+const initialState: CookiesAndTermsState = {
+ [CookieAndTermType.TERMS]: undefined,
+ [CookieAndTermType.NECESSARY]: undefined,
+ [CookieAndTermType.UPDATES]: undefined,
+ [CookieAndTermType.ANALYTICS]: undefined,
+}
+
+export const cookiesAndTermsSlice = createSlice({
+ name: 'cookies_terms_v1',
+ initialState,
+ reducers: {
+ saveCookieAndTermConsent: (_, { payload }: PayloadAction) => payload,
+ },
+})
+
+export const { saveCookieAndTermConsent } = cookiesAndTermsSlice.actions
+
+export const selectCookies = (state: RootState) => state[cookiesAndTermsSlice.name]
diff --git a/src/store/cookiesSlice.ts b/src/store/cookiesSlice.ts
deleted file mode 100644
index 70bbc35662..0000000000
--- a/src/store/cookiesSlice.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import type { PayloadAction } from '@reduxjs/toolkit'
-import { createSlice } from '@reduxjs/toolkit'
-import type { RootState } from '.'
-
-export enum CookieType {
- NECESSARY = 'necessary',
- UPDATES = 'updates',
- ANALYTICS = 'analytics',
-}
-
-export type CookiesState = Record
-
-const initialState: CookiesState = {
- [CookieType.NECESSARY]: undefined,
- [CookieType.UPDATES]: undefined,
- [CookieType.ANALYTICS]: undefined,
-}
-
-export const cookiesSlice = createSlice({
- name: 'cookies',
- initialState,
- reducers: {
- saveCookieConsent: (_, { payload }: PayloadAction) => payload,
- },
-})
-
-export const { saveCookieConsent } = cookiesSlice.actions
-
-export const selectCookies = (state: RootState) => state[cookiesSlice.name]
diff --git a/src/store/index.ts b/src/store/index.ts
index de091020b3..e6b2f8f81c 100644
--- a/src/store/index.ts
+++ b/src/store/index.ts
@@ -34,7 +34,7 @@ const rootReducer = combineReducers({
[slices.pendingTxsSlice.name]: slices.pendingTxsSlice.reducer,
[slices.addedSafesSlice.name]: slices.addedSafesSlice.reducer,
[slices.settingsSlice.name]: slices.settingsSlice.reducer,
- [slices.cookiesSlice.name]: slices.cookiesSlice.reducer,
+ [slices.cookiesAndTermsSlice.name]: slices.cookiesAndTermsSlice.reducer,
[slices.popupSlice.name]: slices.popupSlice.reducer,
[slices.spendingLimitSlice.name]: slices.spendingLimitSlice.reducer,
[slices.safeAppsSlice.name]: slices.safeAppsSlice.reducer,
@@ -51,7 +51,7 @@ const persistedSlices: (keyof PreloadedState)[] = [
slices.pendingTxsSlice.name,
slices.addedSafesSlice.name,
slices.settingsSlice.name,
- slices.cookiesSlice.name,
+ slices.cookiesAndTermsSlice.name,
slices.safeAppsSlice.name,
slices.pendingSafeMessagesSlice.name,
slices.batchSlice.name,
diff --git a/src/store/popupSlice.ts b/src/store/popupSlice.ts
index c077d558a7..831fcc5c90 100644
--- a/src/store/popupSlice.ts
+++ b/src/store/popupSlice.ts
@@ -1,6 +1,6 @@
import type { PayloadAction } from '@reduxjs/toolkit'
import { createSlice } from '@reduxjs/toolkit'
-import type { CookieType } from './cookiesSlice'
+import type { CookieAndTermType } from './cookiesAndTermsSlice'
import type { RootState } from '.'
export enum PopupType {
@@ -10,7 +10,7 @@ export enum PopupType {
type PopupState = {
[PopupType.COOKIES]: {
open: boolean
- warningKey?: CookieType
+ warningKey?: CookieAndTermType
}
}
@@ -24,7 +24,7 @@ export const popupSlice = createSlice({
name: 'popups',
initialState,
reducers: {
- openCookieBanner: (state, { payload }: PayloadAction<{ warningKey?: CookieType }>) => {
+ openCookieBanner: (state, { payload }: PayloadAction<{ warningKey?: CookieAndTermType }>) => {
state[PopupType.COOKIES] = {
...payload,
open: true,
diff --git a/src/store/slices.ts b/src/store/slices.ts
index b186894502..210bd7d7c5 100644
--- a/src/store/slices.ts
+++ b/src/store/slices.ts
@@ -9,7 +9,7 @@ export * from './notificationsSlice'
export * from './pendingTxsSlice'
export * from './addedSafesSlice'
export * from './settingsSlice'
-export * from './cookiesSlice'
+export * from './cookiesAndTermsSlice'
export * from './popupSlice'
export * from './spendingLimitsSlice'
export * from './safeAppsSlice'
diff --git a/src/store/swapOrderSlice.ts b/src/store/swapOrderSlice.ts
index 2fd4afcf2b..c8f884aef6 100644
--- a/src/store/swapOrderSlice.ts
+++ b/src/store/swapOrderSlice.ts
@@ -2,10 +2,12 @@ import type { listenerMiddlewareInstance } from '@/store'
import { createSelector, createSlice } from '@reduxjs/toolkit'
import type { OrderStatuses } from '@safe-global/safe-gateway-typescript-sdk'
import type { RootState } from '@/store'
-import { isSwapTxInfo, isTransactionListItem } from '@/utils/transaction-guards'
+import { isSwapOrderTxInfo, isTransactionListItem } from '@/utils/transaction-guards'
import { txHistorySlice } from '@/store/txHistorySlice'
import { showNotification } from '@/store/notificationsSlice'
import { selectSafeInfo } from '@/store/safeInfoSlice'
+import { selectChainById } from '@/store/chainsSlice'
+import { getTxLink } from '@/utils/tx-link'
type AllStatuses = OrderStatuses | 'created'
type Order = {
@@ -80,11 +82,18 @@ export const swapOrderStatusListener = (listenerMiddleware: typeof listenerMiddl
if (oldStatus === newStatus || newStatus === undefined) {
return
}
+ const safeInfo = selectSafeInfo(listenerApi.getState())
+
+ let link = undefined
+ if (swapOrder.txId && safeInfo.data?.chainId && safeInfo.data?.address) {
+ const chainInfo = selectChainById(listenerApi.getState(), safeInfo.data?.chainId)
+ if (chainInfo !== undefined) {
+ link = getTxLink(swapOrder.txId, chainInfo, safeInfo.data?.address.value)
+ }
+ }
switch (newStatus) {
case 'created':
- const safeInfo = selectSafeInfo(listenerApi.getState())
-
dispatch(
showNotification({
title: 'Order created',
@@ -94,6 +103,7 @@ export const swapOrderStatusListener = (listenerMiddleware: typeof listenerMiddl
: 'Waiting for confirmation from signers of your Safe',
groupKey,
variant: 'info',
+ link,
}),
)
@@ -105,6 +115,7 @@ export const swapOrderStatusListener = (listenerMiddleware: typeof listenerMiddl
message: 'Waiting for confirmation from signers of your Safe',
groupKey,
variant: 'info',
+ link,
}),
)
break
@@ -115,6 +126,7 @@ export const swapOrderStatusListener = (listenerMiddleware: typeof listenerMiddl
message: 'Waiting for order execution by the CoW Protocol',
groupKey,
variant: 'info',
+ link,
}),
)
break
@@ -129,6 +141,7 @@ export const swapOrderStatusListener = (listenerMiddleware: typeof listenerMiddl
message: 'Your order has been successful',
groupKey,
variant: 'success',
+ link,
}),
)
break
@@ -143,6 +156,7 @@ export const swapOrderStatusListener = (listenerMiddleware: typeof listenerMiddl
message: 'Your order has reached the expiry time and has become invalid',
groupKey,
variant: 'warning',
+ link,
}),
)
break
@@ -157,6 +171,7 @@ export const swapOrderStatusListener = (listenerMiddleware: typeof listenerMiddl
message: 'Your order has been cancelled',
groupKey,
variant: 'warning',
+ link,
}),
)
break
@@ -182,7 +197,7 @@ export const swapOrderListener = (listenerMiddleware: typeof listenerMiddlewareI
continue
}
- if (isSwapTxInfo(result.transaction.txInfo)) {
+ if (isSwapOrderTxInfo(result.transaction.txInfo)) {
const swapOrder = result.transaction.txInfo
const oldStatus = selectSwapOrderStatus(listenerApi.getOriginalState(), swapOrder.uid)
diff --git a/src/tests/builders/safeMessage.ts b/src/tests/builders/safeMessage.ts
new file mode 100644
index 0000000000..b3a9da6a34
--- /dev/null
+++ b/src/tests/builders/safeMessage.ts
@@ -0,0 +1,25 @@
+import { Builder, type IBuilder } from '@/tests/Builder'
+import { faker } from '@faker-js/faker'
+import { SafeMessageListItemType, SafeMessageStatus, type SafeMessage } from '@safe-global/safe-gateway-typescript-sdk'
+
+export function safeMsgBuilder(): IBuilder {
+ return Builder.new().with({
+ type: SafeMessageListItemType.MESSAGE,
+ messageHash: faker.string.hexadecimal(),
+ status: SafeMessageStatus.NEEDS_CONFIRMATION,
+ logoUri: null,
+ name: null,
+ message: 'Message text',
+ creationTimestamp: faker.date.past().getTime(),
+ modifiedTimestamp: faker.date.past().getTime(),
+ confirmationsSubmitted: 1,
+ confirmationsRequired: 2,
+ proposedBy: { value: faker.finance.ethereumAddress() },
+ confirmations: [
+ {
+ owner: { value: faker.finance.ethereumAddress() },
+ signature: '',
+ },
+ ],
+ })
+}
diff --git a/src/tests/builders/wallet.ts b/src/tests/builders/wallet.ts
index f088389e52..fc95ce44f5 100644
--- a/src/tests/builders/wallet.ts
+++ b/src/tests/builders/wallet.ts
@@ -3,7 +3,7 @@ import { faker } from '@faker-js/faker'
import { Builder, type IBuilder } from '../Builder'
import { eip1193ProviderBuilder } from './eip1193Provider'
-const walletNames = ['MetaMask', 'Wallet Connect', 'Social Login', 'Rainbow']
+const walletNames = ['MetaMask', 'Wallet Connect', 'Rainbow']
export const connectedWalletBuilder = (): IBuilder => {
return Builder.new().with({
diff --git a/src/tests/e2e-wallet.ts b/src/tests/e2e-wallet.ts
index 58d79323b3..17ce32c32e 100644
--- a/src/tests/e2e-wallet.ts
+++ b/src/tests/e2e-wallet.ts
@@ -1,30 +1,94 @@
+import { type HDNodeWallet, JsonRpcProvider, Wallet } from 'ethers'
import type { ChainInfo } from '@safe-global/safe-gateway-typescript-sdk'
-import type { WalletInit } from '@web3-onboard/common'
-
-import { CYPRESS_MNEMONIC } from '@/config/constants'
+import { type WalletInit, createEIP1193Provider } from '@web3-onboard/common'
import { getRpcServiceUrl } from '@/hooks/wallets/web3'
+import { numberToHex } from '@/utils/hex'
+import { CYPRESS_MNEMONIC } from '@/config/constants'
export const E2E_WALLET_NAME = 'E2E Wallet'
-const e2eWalletModule = (rpcUri: ChainInfo['rpcUri']): WalletInit => {
+let currentChainId = ''
+let currentRpcUri = ''
+
+const E2EWalletMoule = (chainId: ChainInfo['chainId'], rpcUri: ChainInfo['rpcUri']): WalletInit => {
+ currentChainId = chainId
+ currentRpcUri = getRpcServiceUrl(rpcUri)
+
return () => {
return {
label: E2E_WALLET_NAME,
getIcon: async () => ' ',
getInterface: async () => {
- const { createEIP1193Provider } = await import('@web3-onboard/common')
+ let provider: JsonRpcProvider
+ let wallet: HDNodeWallet
+ const chainChangedListeners = new Set<(chainId: string) => void>()
+
+ const updateProvider = () => {
+ provider?.destroy()
+ provider = new JsonRpcProvider(currentRpcUri, Number(currentChainId), { staticNetwork: true })
+ wallet = Wallet.fromPhrase(CYPRESS_MNEMONIC, provider)
- const { default: HDWalletProvider } = await import('@truffle/hdwallet-provider')
+ setTimeout(() => {
+ chainChangedListeners.forEach((listener) => listener(numberToHex(Number(currentChainId))))
+ }, 100)
+ }
- const provider = new HDWalletProvider({
- mnemonic: CYPRESS_MNEMONIC,
- providerOrUrl: getRpcServiceUrl(rpcUri),
- })
+ updateProvider()
return {
- provider: createEIP1193Provider(provider.engine, {
- eth_requestAccounts: async () => provider.getAddresses(),
- }),
+ provider: createEIP1193Provider(
+ {
+ on: (event: string, listener: (...args: any[]) => void) => {
+ if (event === 'accountsChanged') {
+ return
+ } else if (event === 'chainChanged') {
+ chainChangedListeners.add(listener)
+ } else {
+ provider.on(event, listener)
+ }
+ },
+
+ request: async (request: { method: string; params: any[] }) => {
+ return provider.send(request.method, request.params)
+ },
+ },
+ {
+ eth_chainId: async () => currentChainId,
+
+ // @ts-ignore
+ eth_getCode: async ({ params }) => provider.getCode(params[0], params[1]),
+
+ eth_accounts: async () => [wallet.address],
+ eth_requestAccounts: async () => [wallet.address],
+
+ eth_call: async ({ params }: { params: any }) => wallet.call(params[0]),
+
+ eth_sendTransaction: async ({ params }) => {
+ const tx = await wallet.sendTransaction(params[0] as any)
+ return tx.hash // return transaction hash
+ },
+
+ personal_sign: async ({ params }) => {
+ const signedMessage = wallet.signingKey.sign(params[0])
+ return signedMessage.serialized
+ },
+
+ eth_signTypedData: async ({ params }) => {
+ const [, json] = params
+ const typedData = JSON.parse(json)
+ return await wallet.signTypedData(
+ typedData.domain,
+ { [typedData.primaryType]: typedData.types[typedData.primaryType] },
+ typedData.message,
+ )
+ },
+
+ // @ts-ignore
+ wallet_switchEthereumChain: async ({ params }) => {
+ updateProvider()
+ },
+ },
+ ),
}
},
platforms: ['desktop'],
@@ -32,4 +96,4 @@ const e2eWalletModule = (rpcUri: ChainInfo['rpcUri']): WalletInit => {
}
}
-export default e2eWalletModule
+export default E2EWalletMoule
diff --git a/src/tests/mocks/chains.ts b/src/tests/mocks/chains.ts
index 795f466b90..f21904c274 100644
--- a/src/tests/mocks/chains.ts
+++ b/src/tests/mocks/chains.ts
@@ -43,7 +43,6 @@ const CONFIG_SERVICE_CHAINS: ChainInfo[] = [
],
disabledWallets: ['lattice'],
features: [
- FEATURES.CONTRACT_INTERACTION,
FEATURES.DOMAIN_LOOKUP,
FEATURES.EIP1559,
FEATURES.ERC721,
@@ -52,6 +51,10 @@ const CONFIG_SERVICE_CHAINS: ChainInfo[] = [
FEATURES.SPENDING_LIMIT,
FEATURES.TX_SIMULATION,
],
+ balancesProvider: {
+ chainName: null,
+ enabled: false,
+ },
},
{
transactionService: 'https://safe-transaction.xdai.gnosis.io',
@@ -94,7 +97,6 @@ const CONFIG_SERVICE_CHAINS: ChainInfo[] = [
'walletLink',
],
features: [
- FEATURES.CONTRACT_INTERACTION,
FEATURES.EIP1559,
FEATURES.ERC721,
FEATURES.SAFE_APPS,
@@ -102,6 +104,10 @@ const CONFIG_SERVICE_CHAINS: ChainInfo[] = [
FEATURES.SPENDING_LIMIT,
FEATURES.TX_SIMULATION,
],
+ balancesProvider: {
+ chainName: null,
+ enabled: false,
+ },
},
{
transactionService: 'https://safe-transaction.polygon.gnosis.io',
@@ -150,7 +156,6 @@ const CONFIG_SERVICE_CHAINS: ChainInfo[] = [
'walletLink',
],
features: [
- FEATURES.CONTRACT_INTERACTION,
FEATURES.EIP1559,
FEATURES.ERC721,
FEATURES.SAFE_APPS,
@@ -158,6 +163,10 @@ const CONFIG_SERVICE_CHAINS: ChainInfo[] = [
FEATURES.SPENDING_LIMIT,
FEATURES.TX_SIMULATION,
],
+ balancesProvider: {
+ chainName: null,
+ enabled: false,
+ },
},
{
transactionService: 'https://safe-transaction.bsc.gnosis.io',
@@ -203,13 +212,16 @@ const CONFIG_SERVICE_CHAINS: ChainInfo[] = [
'walletLink',
],
features: [
- FEATURES.CONTRACT_INTERACTION,
FEATURES.ERC721,
FEATURES.SAFE_APPS,
FEATURES.SAFE_TX_GAS_OPTIONAL,
FEATURES.SPENDING_LIMIT,
FEATURES.TX_SIMULATION,
],
+ balancesProvider: {
+ chainName: null,
+ enabled: false,
+ },
},
{
transactionService: 'https://safe-transaction.ewc.gnosis.io',
@@ -253,13 +265,16 @@ const CONFIG_SERVICE_CHAINS: ChainInfo[] = [
'walletLink',
],
features: [
- FEATURES.CONTRACT_INTERACTION,
FEATURES.DOMAIN_LOOKUP,
FEATURES.ERC721,
FEATURES.SAFE_APPS,
FEATURES.SAFE_TX_GAS_OPTIONAL,
FEATURES.SPENDING_LIMIT,
],
+ balancesProvider: {
+ chainName: null,
+ enabled: false,
+ },
},
{
transactionService: 'https://safe-transaction.arbitrum.gnosis.io',
@@ -301,13 +316,11 @@ const CONFIG_SERVICE_CHAINS: ChainInfo[] = [
'trust',
'walletLink',
],
- features: [
- FEATURES.CONTRACT_INTERACTION,
- FEATURES.ERC721,
- FEATURES.SAFE_APPS,
- FEATURES.SAFE_TX_GAS_OPTIONAL,
- FEATURES.TX_SIMULATION,
- ],
+ features: [FEATURES.ERC721, FEATURES.SAFE_APPS, FEATURES.SAFE_TX_GAS_OPTIONAL, FEATURES.TX_SIMULATION],
+ balancesProvider: {
+ chainName: null,
+ enabled: false,
+ },
},
{
transactionService: 'https://safe-transaction.aurora.gnosis.io',
@@ -351,6 +364,10 @@ const CONFIG_SERVICE_CHAINS: ChainInfo[] = [
'walletLink',
],
features: [FEATURES.CONTRACT_INTERACTION, FEATURES.ERC721, FEATURES.SAFE_APPS, FEATURES.SAFE_TX_GAS_OPTIONAL],
+ balancesProvider: {
+ chainName: null,
+ enabled: false,
+ },
},
{
transactionService: 'https://safe-transaction.avalanche.gnosis.io',
@@ -398,7 +415,6 @@ const CONFIG_SERVICE_CHAINS: ChainInfo[] = [
'trust',
],
features: [
- FEATURES.CONTRACT_INTERACTION,
FEATURES.EIP1559,
FEATURES.ERC721,
FEATURES.SAFE_APPS,
@@ -406,6 +422,10 @@ const CONFIG_SERVICE_CHAINS: ChainInfo[] = [
FEATURES.SPENDING_LIMIT,
FEATURES.TX_SIMULATION,
],
+ balancesProvider: {
+ chainName: null,
+ enabled: false,
+ },
},
{
transactionService: 'https://safe-transaction.optimism.gnosis.io',
@@ -447,13 +467,11 @@ const CONFIG_SERVICE_CHAINS: ChainInfo[] = [
'trust',
'walletLink',
],
- features: [
- FEATURES.CONTRACT_INTERACTION,
- FEATURES.ERC721,
- FEATURES.SAFE_APPS,
- FEATURES.SAFE_TX_GAS_OPTIONAL,
- FEATURES.TX_SIMULATION,
- ],
+ features: [FEATURES.ERC721, FEATURES.SAFE_APPS, FEATURES.SAFE_TX_GAS_OPTIONAL, FEATURES.TX_SIMULATION],
+ balancesProvider: {
+ chainName: null,
+ enabled: false,
+ },
},
{
transactionService: 'https://safe-transaction.goerli.gnosis.io/',
@@ -496,7 +514,6 @@ const CONFIG_SERVICE_CHAINS: ChainInfo[] = [
'walletLink',
],
features: [
- FEATURES.CONTRACT_INTERACTION,
FEATURES.DOMAIN_LOOKUP,
FEATURES.EIP1559,
FEATURES.ERC721,
@@ -505,6 +522,10 @@ const CONFIG_SERVICE_CHAINS: ChainInfo[] = [
FEATURES.SPENDING_LIMIT,
FEATURES.TX_SIMULATION,
],
+ balancesProvider: {
+ chainName: null,
+ enabled: false,
+ },
},
{
transactionService: 'https://safe-transaction.rinkeby.gnosis.io',
@@ -537,7 +558,6 @@ const CONFIG_SERVICE_CHAINS: ChainInfo[] = [
gasPrice: [{ type: GAS_PRICE_TYPE.FIXED, weiValue: '24000000000' }],
disabledWallets: ['fortmatic', 'lattice', 'tally'],
features: [
- FEATURES.CONTRACT_INTERACTION,
FEATURES.DOMAIN_LOOKUP,
FEATURES.EIP1559,
FEATURES.ERC721,
@@ -546,6 +566,10 @@ const CONFIG_SERVICE_CHAINS: ChainInfo[] = [
FEATURES.SPENDING_LIMIT,
FEATURES.TX_SIMULATION,
],
+ balancesProvider: {
+ chainName: null,
+ enabled: false,
+ },
},
{
transactionService: 'https://safe-transaction.volta.gnosis.io',
@@ -589,13 +613,16 @@ const CONFIG_SERVICE_CHAINS: ChainInfo[] = [
'walletLink',
],
features: [
- FEATURES.CONTRACT_INTERACTION,
FEATURES.DOMAIN_LOOKUP,
FEATURES.ERC721,
FEATURES.SAFE_APPS,
FEATURES.SAFE_TX_GAS_OPTIONAL,
FEATURES.SPENDING_LIMIT,
],
+ balancesProvider: {
+ chainName: null,
+ enabled: false,
+ },
},
]
diff --git a/src/tests/mocks/transactions.ts b/src/tests/mocks/transactions.ts
index 427c3ad4b5..e70ae51ecd 100644
--- a/src/tests/mocks/transactions.ts
+++ b/src/tests/mocks/transactions.ts
@@ -23,6 +23,7 @@ const mockTransferInfo: TransferInfo = {
tokenAddress: 'string',
value: 'string',
trusted: true,
+ imitation: false,
}
const mockTxInfo: TransactionInfo = {
@@ -44,6 +45,7 @@ export const defaultTx: TransactionSummary = {
confirmationsRequired: 2,
confirmationsSubmitted: 2,
},
+ txHash: null,
}
export const getMockTx = ({ nonce }: { nonce?: number }): Transaction => {
diff --git a/src/utils/__tests__/chains.test.ts b/src/utils/__tests__/chains.test.ts
index 8a12c47cd6..ed8a0cf156 100644
--- a/src/utils/__tests__/chains.test.ts
+++ b/src/utils/__tests__/chains.test.ts
@@ -4,7 +4,7 @@ import { CONFIG_SERVICE_CHAINS } from '@/tests/mocks/chains'
describe('chains', () => {
describe('hasFeature', () => {
it('returns true for a feature that exists', () => {
- expect(hasFeature(CONFIG_SERVICE_CHAINS[0], FEATURES.CONTRACT_INTERACTION)).toBe(true)
+ expect(hasFeature(CONFIG_SERVICE_CHAINS[0], FEATURES.ERC721)).toBe(true)
})
it("returns false for a feature that doesn't exists", () => {
diff --git a/src/utils/__tests__/formatNumber.test.ts b/src/utils/__tests__/formatNumber.test.ts
index 84f4c000f5..b3890ffc35 100644
--- a/src/utils/__tests__/formatNumber.test.ts
+++ b/src/utils/__tests__/formatNumber.test.ts
@@ -1,308 +1,61 @@
-import { formatAmount, formatAmountPrecise, formatCurrency } from '@/utils/formatNumber'
+import { formatAmountPrecise, formatAmount, formatCurrency } from '@/utils/formatNumber'
describe('formatNumber', () => {
- describe('formatAmount', () => {
- it('should remove trailing zeroes', () => {
- expect(formatAmount('0.10000')).toEqual('0.1')
- expect(formatAmount('0.100000000000')).toEqual('0.1')
- })
-
- it('should use maximum of 5 decimals', () => {
- expect(formatAmount('0.123456789')).toEqual('0.12346')
- })
-
- it('should use five decimals for numbers up until 999.99999', () => {
- expect(formatAmount('345.123456789')).toEqual('345.12346') // 9 decimals
- expect(formatAmount('999.99999')).toEqual('999.99999') // 5 decimals
-
- // rounds above the specified limit
- expect(formatAmount('999.999992')).toEqual('999.99999') // 6 decimals
- expect(formatAmount('999.999996')).toEqual('1,000')
- })
-
- it('should use four decimals for numbers between 1,000.0001 until 9,999.9999', () => {
- // rounds down past the specified precision
- expect(formatAmount(1_000.00001)).toEqual('1,000')
-
- expect(formatAmount(1_000.0001234)).toEqual('1,000.0001')
- expect(formatAmount(1_234.123456789)).toEqual('1,234.1235')
- expect(formatAmount(9_999.9999)).toEqual('9,999.9999')
-
- // rounds above the specified limit
- expect(formatAmount(9_999.99992)).toEqual('9,999.9999')
- expect(formatAmount(9_999.99996)).toEqual('10,000')
- })
-
- it('should use three decimals for numbers between 10,000.001 until 99,999.999', () => {
- // rounds down past the specified precision
- expect(formatAmount(10_000.00001)).toEqual('10,000')
-
- expect(formatAmount(10_000.001)).toEqual('10,000.001')
- expect(formatAmount(12_345.123456789)).toEqual('12,345.123')
- expect(formatAmount(99_999.999)).toEqual('99,999.999')
-
- // rounds above the specified limit
- expect(formatAmount(99_999.9992)).toEqual('99,999.999')
- expect(formatAmount(99_999.9996)).toEqual('100,000')
- })
-
- it('should use two decimals for numbers between 100,000.01 until 999,999.99', () => {
- // rounds down past the specified precision
- expect(formatAmount(100_000.00001)).toEqual('100,000')
-
- expect(formatAmount(100_000.01)).toEqual('100,000.01')
- expect(formatAmount(123_456.123456789)).toEqual('123,456.12')
- expect(formatAmount(999_999.99)).toEqual('999,999.99')
-
- // rounds above the specified limit
- expect(formatAmount(999_999.992)).toEqual('999,999.99')
- expect(formatAmount(999_999.996)).toEqual('1,000,000')
- })
-
- it('should use one decimal for numbers between 1,000,000.1 until 9,999,999.9', () => {
- // rounds down past the specified precision
- expect(formatAmount(1_000_000.00001)).toEqual('1,000,000')
-
- expect(formatAmount(1_000_000.1)).toEqual('1,000,000.1')
- expect(formatAmount(1_234_567.123456789)).toEqual('1,234,567.1')
- expect(formatAmount(9_999_999.9)).toEqual('9,999,999.9')
-
- // rounds above the specified limit
- expect(formatAmount(9_999_999.92)).toEqual('9,999,999.9')
- expect(formatAmount(9_999_999.96)).toEqual('10,000,000')
- })
-
- it('should use no decimals for numbers between 10,000,000 and 99,999,999.5', () => {
- // rounds down past the specified precision
- expect(formatAmount(10_000_000.00001)).toEqual('10,000,000')
-
- expect(formatAmount(10_000_000.1)).toEqual('10,000,000')
- expect(formatAmount(12_345_678.123456789)).toEqual('12,345,678')
- expect(formatAmount(99_999_999)).toEqual('99,999,999')
-
- // rounds above the specified limit
- expect(formatAmount(99_999_999.2)).toEqual('99,999,999')
- expect(formatAmount(99_999_999.6)).toEqual('100M')
- })
-
- it('should use M symbol for numbers between 100,000,000 and 999,999,500', () => {
- // rounds down past the specified precision
- expect(formatAmount(100_000_000.00001)).toEqual('100M')
- expect(formatAmount(100_000_100)).toEqual('100M')
-
- expect(formatAmount(100_001_000)).toEqual('100.001M')
- expect(formatAmount(123_456_789.123456789)).toEqual('123.457M')
- expect(formatAmount(999_999_000)).toEqual('999.999M')
-
- // rounds above the specified limit
- expect(formatAmount(999_999_499)).toEqual('999.999M')
- expect(formatAmount(999_999_500)).toEqual('1B')
+ describe('formatAmountPrecise', () => {
+ it('should format a number with a defined precision', () => {
+ expect(formatAmountPrecise(1234.5678, 2)).toBe('1,234.57')
})
+ })
- it('should use B symbol for numbers between 999,999,500 and 999,999,500,000', () => {
- // rounds down past the specified precision
- expect(formatAmount(1_000_000_000.00001)).toEqual('1B')
- expect(formatAmount(1_000_100_000)).toEqual('1B')
-
- expect(formatAmount(1_100_000_000)).toEqual('1.1B')
- expect(formatAmount(1_234_567_898.123456789)).toEqual('1.235B')
- expect(formatAmount(100_001_000_500)).toEqual('100.001B')
- expect(formatAmount(999_999_000_000)).toEqual('999.999B')
-
- // rounds above the specified limit
- expect(formatAmount(999_999_499_999)).toEqual('999.999B')
- expect(formatAmount(999_999_500_000)).toEqual('1T')
+ describe('formatAmount', () => {
+ it('should format a number below 0.0001', () => {
+ expect(formatAmount(0.000000009)).toBe('< 0.00001')
})
- it('should use T notation for numbers between 999,999,500,000 and 999,000,000,000', () => {
- // rounds down past the specified precision
- expect(formatAmount(1_000_000_000_000.00001)).toEqual('1T')
- expect(formatAmount(1_000_100_000_000)).toEqual('1T')
-
- expect(formatAmount(1_100_000_000_000)).toEqual('1.1T')
- expect(formatAmount(1_234_567_898_765.123456789)).toEqual('1.235T')
- expect(formatAmount(100_001_000_000_000)).toEqual('100.001T')
- expect(formatAmount(999_999_000_000_000)).toEqual('> 999T')
+ it('should format a number below 1', () => {
+ expect(formatAmount(0.567811)).toBe('0.56781')
})
- it('should use > 999T for numbers above 999,000,000,000,000', () => {
- expect(formatAmount(999_000_000_000_001)).toEqual('> 999T')
- expect(formatAmount(999_000_000_000_000.001)).toEqual('> 999T')
+ it('should format a number above 1', () => {
+ expect(formatAmount(285.1257657)).toBe('285.12577')
})
- it('should use < 0.00001 for amounts smaller then 0.00001', () => {
- expect(formatAmount(0.00001)).toEqual('0.00001')
- expect(formatAmount(0.000014)).toEqual('0.00001')
- expect(formatAmount(0.000015)).toEqual('0.00002')
- expect(formatAmount(0.000001)).toEqual('< 0.00001')
- expect(formatAmount(0.000009)).toEqual('< 0.00001')
+ it('should abbreviate a number with more than 10 digits', () => {
+ expect(formatAmount(12345678901)).toBe('12.35B')
})
- it('should use < -0.00001 or < +0.00001 when the Eucledian distance of the amount is smaller than 0.00001', () => {
- // to keep the '+' sign the amount shall be passed as a string
- expect(formatAmount('+0.000001')).toEqual('< +0.00001')
- expect(formatAmount('+0.000009')).toEqual('< +0.00001')
-
- // negative numbers will keep the sign either way
- expect(formatAmount(-0.000001)).toEqual('< -0.00001')
- expect(formatAmount(-0.000009)).toEqual('< -0.00001')
- expect(formatAmount('-0.000001')).toEqual('< -0.00001')
- expect(formatAmount('-0.000009')).toEqual('< -0.00001')
+ it('should abbreviate a number with more than a given amount of digits', () => {
+ expect(formatAmount(1234.12, 2, 4)).toBe('1.23K')
})
})
describe('formatCurrency', () => {
- it('returns the correct number of decimals', () => {
- const amount1 = 0
-
- expect(formatCurrency(amount1, 'JPY')).toBe('0 JPY')
- expect(formatCurrency(amount1, 'IQD')).toBe('0 IQD')
- expect(formatCurrency(amount1, 'USD')).toBe('0.00 USD')
- expect(formatCurrency(amount1, 'EUR')).toBe('0.00 EUR')
- expect(formatCurrency(amount1, 'GBP')).toBe('0.00 GBP')
- expect(formatCurrency(amount1, 'BHD')).toBe('0.000 BHD')
-
- const amount2 = 1
-
- expect(formatCurrency(amount2, 'JPY')).toBe('1 JPY')
- expect(formatCurrency(amount2, 'IQD')).toBe('1 IQD')
- expect(formatCurrency(amount2, 'USD')).toBe('1.00 USD')
- expect(formatCurrency(amount2, 'EUR')).toBe('1.00 EUR')
- expect(formatCurrency(amount2, 'GBP')).toBe('1.00 GBP')
- expect(formatCurrency(amount2, 'BHD')).toBe('1.000 BHD')
-
- const amount3 = '1.7777'
-
- expect(formatCurrency(amount3, 'JPY')).toBe('2 JPY')
- expect(formatCurrency(amount3, 'IQD')).toBe('2 IQD')
- expect(formatCurrency(amount3, 'USD')).toBe('1.78 USD')
- expect(formatCurrency(amount3, 'EUR')).toBe('1.78 EUR')
- expect(formatCurrency(amount3, 'GBP')).toBe('1.78 GBP')
- expect(formatCurrency(amount3, 'BHD')).toBe('1.778 BHD')
- })
-
- it('should drop decimals for values above 1k', () => {
- // It should stop
- expect(formatCurrency(999.99, 'USD')).toBe('999.99 USD')
- expect(formatCurrency(1000.1, 'USD')).toBe('1,000 USD')
- expect(formatCurrency(1000.99, 'USD')).toBe('1,001 USD')
- expect(formatCurrency(32500.5, 'EUR')).toBe('32,501 EUR')
- expect(formatCurrency(314285500.1, 'JPY')).toBe('314.286M JPY')
+ it('should format a 0', () => {
+ expect(formatCurrency(0, 'USD')).toBe('$ 0')
})
- it('should use M symbol for numbers between 100,000,000 and 999,999,500', () => {
- const amount1 = 100_000_100
-
- expect(formatCurrency(amount1, 'JPY')).toBe('100M JPY')
-
- const amount2 = 123_456_789.123456789
-
- expect(formatCurrency(amount2, 'JPY')).toBe('123.457M JPY')
-
- const amount3 = 999_999_500
-
- expect(formatCurrency(amount3, 'JPY')).toBe('1B JPY')
+ it('should format a number below 1', () => {
+ expect(formatCurrency(0.5678, 'USD')).toBe('$ 0.57')
})
- it('should use B symbol for numbers between 999,999,500 and 999,999,500,000', () => {
- const amount1 = 1_000_000_000
-
- expect(formatCurrency(amount1, 'JPY')).toBe('1B JPY')
-
- const amount2 = 1_234_567_898.123456789
-
- expect(formatCurrency(amount2, 'JPY')).toBe('1.235B JPY')
-
- const amount3 = 999_999_500_000
-
- expect(formatCurrency(amount3, 'JPY')).toBe('1T JPY')
- })
-
- it('should use T notation for numbers between 999,999,500,000 and 999,000,000,000', () => {
- const amount1 = 1_000_100_000_000
-
- expect(formatCurrency(amount1, 'JPY')).toBe('1T JPY')
-
- const amount2 = 1_234_567_898_765.123456789
-
- expect(formatCurrency(amount2, 'JPY')).toBe('1.235T JPY')
-
- const amount3 = 999_999_000_000_000
-
- expect(formatCurrency(amount3, 'JPY')).toBe('> 999T JPY')
+ it('should format a number above 1', () => {
+ expect(formatCurrency(285.1257657, 'EUR')).toBe('€ 285')
})
- it('should use > 999T for numbers above 999,000,000,000,000', () => {
- const amount1 = 999_000_000_000_001
-
- expect(formatCurrency(amount1, 'JPY')).toBe('> 999T JPY')
+ it('should abbreviate billions', () => {
+ expect(formatCurrency(12_345_678_901, 'USD')).toBe('$ 12.35B')
})
- it('should use < - smallest denomination or < + smallest denomination when amounts are smaller than the smallest denomination', () => {
- const amount = 0.000001
-
- expect(formatCurrency(amount, 'JPY')).toBe('< 1 JPY')
- expect(formatCurrency(amount, 'IQD')).toBe('< 1 IQD')
- expect(formatCurrency(amount, 'USD')).toBe('< 0.01 USD')
- expect(formatCurrency(amount, 'EUR')).toBe('< 0.01 EUR')
- expect(formatCurrency(amount, 'GBP')).toBe('< 0.01 GBP')
- expect(formatCurrency(amount, 'BHD')).toBe('< 0.001 BHD')
-
- // Preserves sign if specified
- const amount2 = '+0.000001'
-
- expect(formatCurrency(amount2, 'JPY')).toBe('< +1 JPY')
- expect(formatCurrency(amount2, 'IQD')).toBe('< +1 IQD')
- expect(formatCurrency(amount2, 'USD')).toBe('< +0.01 USD')
- expect(formatCurrency(amount2, 'EUR')).toBe('< +0.01 EUR')
- expect(formatCurrency(amount2, 'GBP')).toBe('< +0.01 GBP')
- expect(formatCurrency(amount2, 'BHD')).toBe('< +0.001 BHD')
-
- const amount3 = -0.000009
-
- expect(formatCurrency(amount3, 'JPY')).toBe('< -1 JPY')
- expect(formatCurrency(amount3, 'IQD')).toBe('< -1 IQD')
- expect(formatCurrency(amount3, 'USD')).toBe('< -0.01 USD')
- expect(formatCurrency(amount3, 'EUR')).toBe('< -0.01 EUR')
- expect(formatCurrency(amount3, 'GBP')).toBe('< -0.01 GBP')
- expect(formatCurrency(amount3, 'BHD')).toBe('< -0.001 BHD')
-
- const amount4 = '-0.000009'
-
- expect(formatCurrency(amount4, 'JPY')).toBe('< -1 JPY')
- expect(formatCurrency(amount4, 'IQD')).toBe('< -1 IQD')
- expect(formatCurrency(amount4, 'USD')).toBe('< -0.01 USD')
- expect(formatCurrency(amount4, 'EUR')).toBe('< -0.01 EUR')
- expect(formatCurrency(amount4, 'GBP')).toBe('< -0.01 GBP')
- expect(formatCurrency(amount4, 'BHD')).toBe('< -0.001 BHD')
+ it('should abbreviate millions', () => {
+ expect(formatCurrency(9_589_009.543645, 'EUR')).toBe('€ 9.59M')
})
- })
-
- describe('formatAmountPrecise', () => {
- it('should format amounts without the compact notation', () => {
- const tokenDecimals = 18
-
- const amount1 = 100_000_000.00001 // 100M
- expect(formatAmountPrecise(amount1, tokenDecimals)).toEqual('100,000,000.00001')
- const amount2 = 1_000_000_000.00001 // 1B
- expect(formatAmountPrecise(amount2, tokenDecimals)).toEqual('1,000,000,000.00001')
-
- const amount3 = 1_234_567_898.123456789 // 1.235B
- expect(formatAmountPrecise(amount3, tokenDecimals)).toEqual('1,234,567,898.1234567')
+ it('should abbreviate thousands', () => {
+ expect(formatCurrency(119_589.543645, 'EUR')).toBe('€ 119.59K')
})
- it('should preserve the max fraction digits', () => {
- const tokenDecimals = 18
-
- const amount1 = 0.000001 // < 0.00001
- expect(formatAmountPrecise(amount1, tokenDecimals)).toEqual('0.000001')
-
- const amount2 = 0.00000123456789 // 14 decimals
- expect(formatAmountPrecise(amount2, tokenDecimals)).toEqual('0.00000123456789') // 14 decimals
-
- const amount3 = 0.00000123456789012345 // 20 decimals
- expect(formatAmountPrecise(amount3, tokenDecimals)).toEqual('0.000001234567890123') // 18 decimals
+ it('should abbreviate a number with more than a given amount of digits', () => {
+ expect(formatCurrency(1234.12, 'USD', 4)).toBe('$ 1.23K')
})
})
})
diff --git a/src/utils/__tests__/tx-history-filter.test.ts b/src/utils/__tests__/tx-history-filter.test.ts
index 05115d8deb..956715118d 100644
--- a/src/utils/__tests__/tx-history-filter.test.ts
+++ b/src/utils/__tests__/tx-history-filter.test.ts
@@ -394,7 +394,7 @@ describe('tx-history-filter', () => {
expect(getIncomingTransfers).toHaveBeenCalledWith(
'4',
'0x123',
- { value: '123', executed: undefined, timezone_offset: 3600000, trusted: false },
+ { value: '123', executed: undefined, timezone_offset: 3600000, trusted: false, imitation: false },
'pageUrl1',
)
@@ -422,6 +422,7 @@ describe('tx-history-filter', () => {
executed: 'true',
timezone_offset: 3600000,
trusted: false,
+ imitation: false,
},
'pageUrl2',
)
@@ -442,7 +443,7 @@ describe('tx-history-filter', () => {
expect(getModuleTransactions).toHaveBeenCalledWith(
'1',
'0x789',
- { to: '0x123', executed: undefined, timezone_offset: 3600000, trusted: false },
+ { to: '0x123', executed: undefined, timezone_offset: 3600000, trusted: false, imitation: false },
'pageUrl3',
)
diff --git a/src/utils/__tests__/tx-list.test.ts b/src/utils/__tests__/tx-list.test.ts
index 340cea2f7b..db7ca71c0f 100644
--- a/src/utils/__tests__/tx-list.test.ts
+++ b/src/utils/__tests__/tx-list.test.ts
@@ -2,7 +2,7 @@ import { faker } from '@faker-js/faker'
import { TransactionInfoType } from '@safe-global/safe-gateway-typescript-sdk'
import type { TransactionListItem } from '@safe-global/safe-gateway-typescript-sdk'
-import { groupConflictingTxs, groupRecoveryTransactions, _getRecoveryCancellations } from '@/utils/tx-list'
+import { groupTxs, groupRecoveryTransactions, _getRecoveryCancellations } from '@/utils/tx-list'
describe('tx-list', () => {
describe('groupConflictingTxs', () => {
@@ -25,7 +25,7 @@ describe('tx-list', () => {
},
]
- const result = groupConflictingTxs(list as TransactionListItem[])
+ const result = groupTxs(list as TransactionListItem[])
expect(result).toEqual([
[
{
@@ -67,7 +67,7 @@ describe('tx-list', () => {
},
]
- const result = groupConflictingTxs(list as TransactionListItem[])
+ const result = groupTxs(list as TransactionListItem[])
expect(result).toEqual([
[
{
@@ -90,12 +90,13 @@ describe('tx-list', () => {
])
})
- it('should return non-conflicting transaction lists as is', () => {
+ it('should group transactions with the same txHash (bulk txs)', () => {
const list = [
{
type: 'TRANSACTION',
transaction: {
id: 1,
+ txHash: '0x123',
},
conflictType: 'None',
},
@@ -103,12 +104,72 @@ describe('tx-list', () => {
type: 'TRANSACTION',
transaction: {
id: 2,
+ txHash: '0x123',
+ },
+ conflictType: 'None',
+ },
+ {
+ type: 'TRANSACTION',
+ transaction: {
+ id: 3,
+ txHash: '0x456',
+ },
+ conflictType: 'None',
+ },
+ ]
+
+ const result = groupTxs(list as unknown as TransactionListItem[])
+ expect(result).toEqual([
+ [
+ {
+ type: 'TRANSACTION',
+ transaction: {
+ id: 1,
+ txHash: '0x123',
+ },
+ conflictType: 'None',
+ },
+ {
+ type: 'TRANSACTION',
+ transaction: {
+ id: 2,
+ txHash: '0x123',
+ },
+ conflictType: 'None',
+ },
+ ],
+ {
+ type: 'TRANSACTION',
+ transaction: {
+ id: 3,
+ txHash: '0x456',
+ },
+ conflictType: 'None',
+ },
+ ])
+ })
+
+ it('should return non-conflicting, and non bulk transaction lists as is', () => {
+ const list = [
+ {
+ type: 'TRANSACTION',
+ transaction: {
+ id: 1,
+ txHash: '0x123',
+ },
+ conflictType: 'None',
+ },
+ {
+ type: 'TRANSACTION',
+ transaction: {
+ id: 2,
+ txHash: '0x345',
},
conflictType: 'None',
},
]
- const result = groupConflictingTxs(list as unknown as TransactionListItem[])
+ const result = groupTxs(list as unknown as TransactionListItem[])
expect(result).toEqual(list)
})
})
diff --git a/src/utils/chains.ts b/src/utils/chains.ts
index b4eeca7477..ae181213cc 100644
--- a/src/utils/chains.ts
+++ b/src/utils/chains.ts
@@ -5,7 +5,6 @@ import { getExplorerLink } from './gateway'
export enum FEATURES {
ERC721 = 'ERC721',
SAFE_APPS = 'SAFE_APPS',
- CONTRACT_INTERACTION = 'CONTRACT_INTERACTION',
DOMAIN_LOOKUP = 'DOMAIN_LOOKUP',
SPENDING_LIMIT = 'SPENDING_LIMIT',
EIP1559 = 'EIP1559',
@@ -18,17 +17,22 @@ export enum FEATURES {
PUSH_NOTIFICATIONS = 'PUSH_NOTIFICATIONS',
NATIVE_WALLETCONNECT = 'NATIVE_WALLETCONNECT',
RECOVERY = 'RECOVERY',
- SOCIAL_LOGIN = 'SOCIAL_LOGIN',
COUNTERFACTUAL = 'COUNTERFACTUAL',
DELETE_TX = 'DELETE_TX',
SPEED_UP_TX = 'SPEED_UP_TX',
SAP_BANNER = 'SAP_BANNER',
NATIVE_SWAPS = 'NATIVE_SWAPS',
+ NATIVE_SWAPS_USE_COW_STAGING_SERVER = 'NATIVE_SWAPS_USE_COW_STAGING_SERVER',
+ NATIVE_SWAPS_FEE_ENABLED = 'NATIVE_SWAPS_FEE_ENABLED',
+ RELAY_NATIVE_SWAPS = 'RELAY_NATIVE_SWAPS',
+ ZODIAC_ROLES = 'ZODIAC_ROLES',
}
export const FeatureRoutes = {
[AppRoutes.apps.index]: FEATURES.SAFE_APPS,
[AppRoutes.swap]: FEATURES.NATIVE_SWAPS,
+ [AppRoutes.balances.nfts]: FEATURES.ERC721,
+ [AppRoutes.settings.notifications]: FEATURES.PUSH_NOTIFICATIONS,
}
export const hasFeature = (chain: ChainInfo, feature: FEATURES): boolean => {
@@ -43,3 +47,9 @@ export const getBlockExplorerLink = (
return getExplorerLink(address, chain.blockExplorerUriTemplate)
}
}
+
+export const isRouteEnabled = (route: string, chain?: ChainInfo) => {
+ if (!chain) return false
+ const featureRoute = FeatureRoutes[route]
+ return !featureRoute || hasFeature(chain, featureRoute)
+}
diff --git a/src/utils/formatNumber.ts b/src/utils/formatNumber.ts
index b0cb100983..f0d0a1b202 100644
--- a/src/utils/formatNumber.ts
+++ b/src/utils/formatNumber.ts
@@ -1,107 +1,28 @@
-import memoize from 'lodash/memoize'
-
-// These follow the guideline of "How to format amounts"
-// https://github.com/5afe/safe/wiki/How-to-format-amounts
-
-const LOWER_LIMIT = 0.00001
-const COMPACT_LIMIT = 99_999_999.5
-const UPPER_LIMIT = 999 * 10 ** 12
-const NO_DECIMALS_LIMIT = 1000
+const locale = typeof navigator !== 'undefined' ? navigator.language : undefined
/**
- * Formatter that restricts the upper and lower limit of numbers that can be formatted
+ * Intl.NumberFormat number formatter that adheres to our style guide
* @param number Number to format
- * @param formatter Function to format number
- * @param minimum Minimum number to format
*/
-const format = (number: string | number, formatter: (float: number) => string, minimum = LOWER_LIMIT) => {
- const float = Number(number)
-
- if (float === 0) {
- return formatter(float)
- }
-
- if (Math.abs(float) < minimum) {
- return `< ${formatter(minimum * Math.sign(float))}`
- }
-
- if (float < UPPER_LIMIT) {
- return formatter(float)
- }
-
- return `> ${formatter(UPPER_LIMIT)}`
-}
-
-// Universal amount formatting options
-
-const getNumberFormatNotation = (number: string | number): Intl.NumberFormatOptions['notation'] => {
- return Number(number) >= COMPACT_LIMIT ? 'compact' : undefined
-}
-
-const getNumberFormatSignDisplay = (number: string | number): Intl.NumberFormatOptions['signDisplay'] => {
- const shouldDisplaySign = typeof number === 'string' ? number.trim().startsWith('+') : Number(number) < 0
- return shouldDisplaySign ? 'exceptZero' : undefined
-}
-
-// Amount formatting options
-
-const getAmountFormatterMaxFractionDigits = (
- number: string | number,
-): Intl.NumberFormatOptions['maximumFractionDigits'] => {
+export const formatAmount = (number: string | number, precision = 5, maxLength = 6): string => {
const float = Number(number)
+ if (float === 0) return '0'
+ if (float === Math.round(float)) precision = 0
+ if (Math.abs(float) < 0.00001) return '< 0.00001'
- if (float < 1_000) {
- return 5
- }
-
- if (float < 10_000) {
- return 4
- }
-
- if (float < 100_000) {
- return 3
- }
-
- if (float < 1_000_000) {
- return 2
- }
-
- if (float < 10_000_000) {
- return 1
- }
-
- if (float < COMPACT_LIMIT) {
- return 0
- }
-
- // Represents numbers like 767.343M
- if (float < UPPER_LIMIT) {
- return 3
- }
-
- return 0
-}
-
-const getAmountFormatterOptions = (number: string | number): Intl.NumberFormatOptions => {
- return {
- maximumFractionDigits: getAmountFormatterMaxFractionDigits(number),
- notation: getNumberFormatNotation(number),
- signDisplay: getNumberFormatSignDisplay(number),
- }
-}
+ const fullNum = new Intl.NumberFormat(locale, {
+ style: 'decimal',
+ maximumFractionDigits: precision,
+ }).format(float)
-/**
- * Intl.NumberFormat number formatter that adheres to our style guide
- * @param number Number to format
- */
-export const formatAmount = (number: string | number, precision?: number): string => {
- const options = getAmountFormatterOptions(number)
- if (precision !== undefined) {
- options.maximumFractionDigits = precision
- }
- const formatter = new Intl.NumberFormat(undefined, options)
+ // +3 for the decimal point and the two decimal places
+ if (fullNum.length <= maxLength + 3) return fullNum
- return format(number, formatter.format)
+ return new Intl.NumberFormat(locale, {
+ style: 'decimal',
+ notation: 'compact',
+ maximumFractionDigits: 2,
+ }).format(float)
}
/**
@@ -109,59 +30,11 @@ export const formatAmount = (number: string | number, precision?: number): strin
* @param number Number to format
* @param precision Fraction digits to show
*/
-export const formatAmountPrecise = (number: string | number, precision: number): string => {
- const float = Number(number)
-
- const formatter = new Intl.NumberFormat(undefined, {
+export const formatAmountPrecise = (number: string | number, precision?: number): string => {
+ return new Intl.NumberFormat(locale, {
+ style: 'decimal',
maximumFractionDigits: precision,
- })
-
- return formatter.format(float)
-}
-
-// Fiat formatting
-
-const getMinimumCurrencyDenominator = memoize((currency: string): number => {
- const BASE_VALUE = 1
-
- const formatter = new Intl.NumberFormat(undefined, {
- style: 'currency',
- currency,
- })
-
- const fraction = formatter.formatToParts(BASE_VALUE).find(({ type }) => type === 'fraction')
-
- // Currencies may not have decimals, i.e. JPY
- return fraction ? Number(`0.${'1'.padStart(fraction.value.length, '0')}`) : 1
-})
-
-const getCurrencyFormatterMaxFractionDigits = (
- number: string | number,
- currency: string,
-): Intl.NumberFormatOptions['maximumFractionDigits'] => {
- const float = Number(number)
-
- if (float < NO_DECIMALS_LIMIT) {
- const [, decimals] = getMinimumCurrencyDenominator(currency).toString().split('.')
- return decimals?.length ?? 0
- }
-
- if (float >= COMPACT_LIMIT) {
- return 3
- }
-
- return 0
-}
-
-const getCurrencyFormatterOptions = (number: string | number, currency: string): Intl.NumberFormatOptions => {
- return {
- maximumFractionDigits: getCurrencyFormatterMaxFractionDigits(number, currency),
- notation: getNumberFormatNotation(number),
- signDisplay: getNumberFormatSignDisplay(number),
- style: 'currency',
- currency,
- currencyDisplay: 'code',
- }
+ }).format(Number(number))
}
/**
@@ -169,42 +42,26 @@ const getCurrencyFormatterOptions = (number: string | number, currency: string):
* @param number Number to format
* @param currency ISO 4217 currency code
*/
-export const formatCurrency = (number: string | number, currency: string): string => {
- // Note: we will be able to achieve the following once the `roundingMode` option is supported
- // see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#parameters
-
- const minimum = getMinimumCurrencyDenominator(currency)
-
- const currencyFormatter = (float: number): string => {
- const options = getCurrencyFormatterOptions(number, currency)
- const formatter = new Intl.NumberFormat(undefined, options)
-
- const parts = formatter.formatToParts(float) // Returns an array of objects with `type` and `value` properties
+export const formatCurrency = (number: string | number, currency: string, maxLength = 6): string => {
+ let float = Number(number)
- const fraction = parts.find(({ type }) => type === 'fraction')
-
- const amount = parts
- .filter(({ type }) => type !== 'currency' && type !== 'literal') // Remove currency code and whitespace
- .map((part) => {
- if (float >= 0) {
- return part
- }
-
- if (fraction && part.type === 'fraction') {
- return { ...part, value: '1'.padStart(fraction.value.length, '0') }
- }
-
- if (!fraction && part.type === 'integer') {
- return { ...part, value: minimum.toString() }
- }
-
- return part
- })
- .reduce((acc, { value }) => acc + value, '')
- .trim()
-
- return `${amount} ${currency.toUpperCase()}`
- }
-
- return format(number, currencyFormatter, minimum)
+ let result = new Intl.NumberFormat(locale, {
+ style: 'currency',
+ currency,
+ currencyDisplay: 'narrowSymbol',
+ maximumFractionDigits: Math.abs(float) >= 1 || float === 0 ? 0 : 2,
+ }).format(float)
+
+ // +1 for the currency symbol
+ if (result.length > maxLength + 1) {
+ result = new Intl.NumberFormat(locale, {
+ style: 'currency',
+ currency,
+ currencyDisplay: 'narrowSymbol',
+ notation: 'compact',
+ maximumFractionDigits: 2,
+ }).format(float)
+ }
+
+ return result.replace(/^(\D+)/, '$1 ')
}
diff --git a/src/utils/formatters.ts b/src/utils/formatters.ts
index a74fab0143..bbff73c66b 100644
--- a/src/utils/formatters.ts
+++ b/src/utils/formatters.ts
@@ -1,6 +1,6 @@
import type { BigNumberish } from 'ethers'
import { formatUnits, parseUnits } from 'ethers'
-import { formatAmount } from './formatNumber'
+import { formatAmount, formatAmountPrecise } from './formatNumber'
const GWEI = 'gwei'
@@ -38,7 +38,8 @@ export const formatVisualAmount = (
decimals: number | string = GWEI,
precision?: number,
): string => {
- return formatAmount(safeFormatUnits(value, decimals), precision)
+ const amount = safeFormatUnits(value, decimals)
+ return precision ? formatAmountPrecise(amount, precision) : formatAmount(amount)
}
export const safeParseUnits = (value: string, decimals: number | string = GWEI): bigint | undefined => {
diff --git a/src/utils/gateway.ts b/src/utils/gateway.ts
index a6bb8e31c5..12c657f016 100644
--- a/src/utils/gateway.ts
+++ b/src/utils/gateway.ts
@@ -1,6 +1,5 @@
import type { JsonRpcSigner } from 'ethers'
import { type ChainInfo, deleteTransaction } from '@safe-global/safe-gateway-typescript-sdk'
-import { WC_APP_PROD, WC_APP_DEV } from '@/config/constants'
import { signTypedData } from './web3'
export const _replaceTemplate = (uri: string, data: Record): string => {
@@ -30,10 +29,6 @@ export const getExplorerLink = (
return { href, title }
}
-export const isWalletConnectSafeApp = (url: string): boolean => {
- return url === WC_APP_PROD.url || url === WC_APP_DEV.url
-}
-
const signTxServiceMessage = async (
chainId: string,
safeAddress: string,
diff --git a/src/utils/helpers.ts b/src/utils/helpers.ts
index 0c90822e51..a66781819d 100644
--- a/src/utils/helpers.ts
+++ b/src/utils/helpers.ts
@@ -2,6 +2,7 @@
import type { ConnectedWallet } from '@/hooks/wallets/useOnboard'
import type { SafeTransaction } from '@safe-global/safe-core-sdk-types'
import type { OnboardAPI } from '@web3-onboard/core'
+import type { Eip1193Provider } from 'ethers'
export function invariant(condition: T, error: string): asserts condition {
if (condition) {
@@ -22,3 +23,7 @@ export function assertWallet(wallet: ConnectedWallet | null): asserts wallet {
export function assertOnboard(onboard: OnboardAPI | undefined): asserts onboard {
return invariant(onboard, 'Onboard not connected')
}
+
+export function assertProvider(provider: Eip1193Provider | undefined): asserts provider {
+ return invariant(provider, 'Provider not found')
+}
diff --git a/src/utils/safe-messages.ts b/src/utils/safe-messages.ts
index c6e3764e1c..27cd99d585 100644
--- a/src/utils/safe-messages.ts
+++ b/src/utils/safe-messages.ts
@@ -11,8 +11,8 @@ import {
type SafeMessage,
type EIP712TypedData,
type ChainInfo,
- FEATURES,
} from '@safe-global/safe-gateway-typescript-sdk'
+import { FEATURES } from '@/utils/chains'
import { hasFeature } from './chains'
import { asError } from '@/services/exceptions/utils'
diff --git a/src/utils/transaction-guards.ts b/src/utils/transaction-guards.ts
index 5b622126ec..a92fe19a12 100644
--- a/src/utils/transaction-guards.ts
+++ b/src/utils/transaction-guards.ts
@@ -1,10 +1,12 @@
import type {
AddressEx,
+ BaselineConfirmationView,
Cancellation,
ConflictHeader,
Creation,
Custom,
DateLabel,
+ DecodedDataResponse,
DetailedExecutionInfo,
Erc20Transfer,
Erc721Transfer,
@@ -16,27 +18,30 @@ import type {
MultisigExecutionDetails,
MultisigExecutionInfo,
NativeCoinTransfer,
+ Order,
+ OrderConfirmationView,
SafeInfo,
SettingsChange,
+ SwapOrder,
+ SwapOrderConfirmationView,
Transaction,
TransactionInfo,
TransactionListItem,
TransactionSummary,
Transfer,
TransferInfo,
- SwapOrder,
- DecodedDataResponse,
- BaselineConfirmationView,
- CowSwapConfirmationView,
+ TwapOrder,
+ TwapOrderConfirmationView,
} from '@safe-global/safe-gateway-typescript-sdk'
-import { TransferDirection } from '@safe-global/safe-gateway-typescript-sdk'
import {
+ ConfirmationViewTypes,
ConflictType,
DetailedExecutionInfoType,
TransactionInfoType,
TransactionListItemType,
TransactionStatus,
TransactionTokenType,
+ TransferDirection,
} from '@safe-global/safe-gateway-typescript-sdk'
import { getSpendingLimitModuleAddress } from '@/services/contracts/spendingLimitContracts'
import { sameAddress } from '@/utils/addresses'
@@ -73,7 +78,17 @@ export const isModuleDetailedExecutionInfo = (value?: DetailedExecutionInfo): va
// TransactionInfo type guards
export const isTransferTxInfo = (value: TransactionInfo): value is Transfer => {
- return value.type === TransactionInfoType.TRANSFER
+ return value.type === TransactionInfoType.TRANSFER || isSwapTransferOrderTxInfo(value)
+}
+
+/**
+ * A fulfillment transaction for swap, limit or twap order is always a SwapOrder
+ * It cannot be a TWAP order
+ *
+ * @param value
+ */
+export const isSwapTransferOrderTxInfo = (value: TransactionInfo): value is SwapOrder => {
+ return value.type === TransactionInfoType.SWAP_TRANSFER
}
export const isSettingsChangeTxInfo = (value: TransactionInfo): value is SettingsChange => {
@@ -92,26 +107,50 @@ export const isMultiSendTxInfo = (value: TransactionInfo): value is MultiSend =>
)
}
-export const isSwapTxInfo = (value: TransactionInfo): value is SwapOrder => {
+export const isOrderTxInfo = (value: TransactionInfo): value is Order => {
+ return isSwapOrderTxInfo(value) || isTwapOrderTxInfo(value)
+}
+
+export const isSwapOrderTxInfo = (value: TransactionInfo): value is SwapOrder => {
return value.type === TransactionInfoType.SWAP_ORDER
}
+export const isTwapOrderTxInfo = (value: TransactionInfo): value is TwapOrder => {
+ return value.type === TransactionInfoType.TWAP_ORDER
+}
+
+export const isConfirmationViewOrder = (
+ decodedData: DecodedDataResponse | BaselineConfirmationView | OrderConfirmationView | undefined,
+): decodedData is OrderConfirmationView => {
+ return isSwapConfirmationViewOrder(decodedData) || isTwapConfirmationViewOrder(decodedData)
+}
+
+export const isTwapConfirmationViewOrder = (
+ decodedData: DecodedDataResponse | BaselineConfirmationView | OrderConfirmationView | undefined,
+): decodedData is TwapOrderConfirmationView => {
+ if (decodedData && 'type' in decodedData) {
+ return decodedData.type === ConfirmationViewTypes.COW_SWAP_TWAP_ORDER
+ }
+
+ return false
+}
+
export const isSwapConfirmationViewOrder = (
- decodedData: DecodedDataResponse | BaselineConfirmationView | CowSwapConfirmationView | undefined,
-): decodedData is CowSwapConfirmationView => {
+ decodedData: DecodedDataResponse | BaselineConfirmationView | OrderConfirmationView | undefined,
+): decodedData is SwapOrderConfirmationView => {
if (decodedData && 'type' in decodedData) {
- return decodedData.type === 'COW_SWAP_ORDER'
+ return decodedData.type === ConfirmationViewTypes.COW_SWAP_ORDER
}
return false
}
-export const isCancelledSwap = (value: TransactionInfo) => {
- return isSwapTxInfo(value) && value.status === 'cancelled'
+export const isCancelledSwapOrder = (value: TransactionInfo) => {
+ return isSwapOrderTxInfo(value) && value.status === 'cancelled'
}
-export const isOpenSwap = (value: TransactionInfo) => {
- return isSwapTxInfo(value) && value.status === 'open'
+export const isOpenSwapOrder = (value: TransactionInfo) => {
+ return isSwapOrderTxInfo(value) && value.status === 'open'
}
export const isCancellationTxInfo = (value: TransactionInfo): value is Cancellation => {
diff --git a/src/utils/transactions.ts b/src/utils/transactions.ts
index 4ef03485a4..97c2b028b9 100644
--- a/src/utils/transactions.ts
+++ b/src/utils/transactions.ts
@@ -86,6 +86,7 @@ export const makeTxFromDetails = (txDetails: TransactionDetails): Transaction =>
txInfo: txDetails.txInfo,
executionInfo,
safeAppInfo: txDetails?.safeAppInfo,
+ txHash: txDetails?.txHash || null,
},
conflictType: ConflictType.NONE,
}
@@ -297,3 +298,7 @@ export const isTrustedTx = (tx: TransactionSummary) => {
Boolean(tx.txInfo.transferInfo.trusted)
)
}
+
+export const isImitation = ({ txInfo }: TransactionSummary): boolean => {
+ return isTransferTxInfo(txInfo) && isERC20Transfer(txInfo.transferInfo) && Boolean(txInfo.transferInfo.imitation)
+}
diff --git a/src/utils/tx-history-filter.ts b/src/utils/tx-history-filter.ts
index bad2691c00..bcc4c5ba47 100644
--- a/src/utils/tx-history-filter.ts
+++ b/src/utils/tx-history-filter.ts
@@ -127,6 +127,7 @@ export const fetchFilteredTxHistory = async (
...filterData.filter,
timezone_offset: getTimezoneOffset(),
trusted: onlyTrusted ?? false,
+ imitation: onlyTrusted ?? false,
executed: filterData.type === TxFilterType.MULTISIG ? 'true' : undefined,
}
diff --git a/src/utils/tx-link.ts b/src/utils/tx-link.ts
new file mode 100644
index 0000000000..4b7635efc1
--- /dev/null
+++ b/src/utils/tx-link.ts
@@ -0,0 +1,17 @@
+import type { ChainInfo } from '@safe-global/safe-gateway-typescript-sdk'
+import type { LinkProps } from 'next/link'
+import { AppRoutes } from '@/config/routes'
+
+export const getTxLink = (
+ txId: string,
+ chain: ChainInfo,
+ safeAddress: string,
+): { href: LinkProps['href']; title: string } => {
+ return {
+ href: {
+ pathname: AppRoutes.transactions.tx,
+ query: { id: txId, safe: `${chain?.shortName}:${safeAddress}` },
+ },
+ title: 'View transaction',
+ }
+}
diff --git a/src/utils/tx-list.ts b/src/utils/tx-list.ts
index f9737be4be..f54b89bf0b 100644
--- a/src/utils/tx-list.ts
+++ b/src/utils/tx-list.ts
@@ -7,6 +7,11 @@ import type { RecoveryQueueItem } from '@/features/recovery/services/recovery-st
type GroupedTxs = Array
+export const groupTxs = (list: TransactionListItem[]) => {
+ const groupedByConflicts = groupConflictingTxs(list)
+ return groupBulkTxs(groupedByConflicts)
+}
+
/**
* Group txs by conflict header
*/
@@ -33,6 +38,31 @@ export const groupConflictingTxs = (list: TransactionListItem[]): GroupedTxs =>
})
}
+/**
+ * Group txs by tx hash
+ */
+const groupBulkTxs = (list: GroupedTxs): GroupedTxs => {
+ return list
+ .reduce((resultItems, item) => {
+ if (Array.isArray(item) || !isTransactionListItem(item)) {
+ return resultItems.concat([item])
+ }
+ const currentTxHash = item.transaction.txHash
+
+ const prevItem = resultItems[resultItems.length - 1]
+ if (!Array.isArray(prevItem)) return resultItems.concat([[item]])
+ const prevTxHash = prevItem[0].transaction.txHash
+
+ if (currentTxHash && currentTxHash === prevTxHash) {
+ prevItem.push(item)
+ return resultItems
+ }
+
+ return resultItems.concat([[item]])
+ }, [])
+ .map((item) => (Array.isArray(item) && item.length === 1 ? item[0] : item))
+}
+
export function _getRecoveryCancellations(moduleAddress: string, transactions: Array) {
const CANCELLATION_TX_METHOD_NAME = 'setTxNonce'
diff --git a/src/utils/wallets.ts b/src/utils/wallets.ts
index 97493744bb..9a2469e4d9 100644
--- a/src/utils/wallets.ts
+++ b/src/utils/wallets.ts
@@ -3,7 +3,7 @@ import { type ConnectedWallet } from '@/hooks/wallets/useOnboard'
import { getWeb3ReadOnly, isSmartContract } from '@/hooks/wallets/web3'
import { WALLET_KEYS } from '@/hooks/wallets/consts'
import memoize from 'lodash/memoize'
-import { ONBOARD_MPC_MODULE_LABEL } from '@/services/mpc/SocialLoginModule'
+import { PRIVATE_KEY_MODULE_LABEL } from '@/services/private-key-module'
const WALLETCONNECT = 'WalletConnect'
@@ -48,6 +48,8 @@ export const isSmartContractWallet = memoize(
/* Check if the wallet is unlocked. */
export const isWalletUnlocked = async (walletName: string): Promise => {
+ if (walletName === PRIVATE_KEY_MODULE_LABEL) return true
+
const METAMASK_LIKE = ['MetaMask', 'Rabby Wallet', 'Zerion']
// Only MetaMask exposes a method to check if the wallet is unlocked
@@ -60,8 +62,5 @@ export const isWalletUnlocked = async (walletName: string): Promise=12.12.47"
@@ -3561,7 +3497,7 @@
dependencies:
"@types/mdx" "^2.0.0"
-"@metamask/eth-sig-util@4.0.1", "@metamask/eth-sig-util@^4.0.0":
+"@metamask/eth-sig-util@^4.0.0":
version "4.0.1"
resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz#3ad61f6ea9ad73ba5b19db780d40d9aae5157088"
integrity sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==
@@ -3572,18 +3508,6 @@
tweetnacl "^1.0.3"
tweetnacl-util "^0.15.1"
-"@metamask/eth-sig-util@^5.0.0":
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-5.1.0.tgz#a47f62800ee1917fef976ba67544a0ccd7d1bd6b"
- integrity sha512-mlgziIHYlA9pi/XZerChqg4NocdOgBPB9NmxgXWQO2U2hH8RGOJQrz6j/AIKkYxgCMIE2PY000+joOwXfzeTDQ==
- dependencies:
- "@ethereumjs/util" "^8.0.6"
- bn.js "^4.12.0"
- ethereum-cryptography "^2.0.0"
- ethjs-util "^0.1.6"
- tweetnacl "^1.0.3"
- tweetnacl-util "^0.15.1"
-
"@metamask/obs-store@^7.0.0":
version "7.0.0"
resolved "https://registry.yarnpkg.com/@metamask/obs-store/-/obs-store-7.0.0.tgz#6cae5f28306bb3e83a381bc9ae22682316095bd3"
@@ -3592,22 +3516,6 @@
"@metamask/safe-event-emitter" "^2.0.0"
through2 "^2.0.3"
-"@metamask/rpc-errors@^5.1.1":
- version "5.1.1"
- resolved "https://registry.yarnpkg.com/@metamask/rpc-errors/-/rpc-errors-5.1.1.tgz#f82732ad0952d34d219eca42699c0c74bee95a9e"
- integrity sha512-JjZnDi2y2CfvbohhBl+FOQRzmFlJpybcQlIk37zEX8B96eVSPbH/T8S0p7cSF8IE33IWx6JkD8Ycsd+2TXFxCw==
- dependencies:
- "@metamask/utils" "^5.0.0"
- fast-safe-stringify "^2.0.6"
-
-"@metamask/rpc-errors@^6.0.0":
- version "6.1.0"
- resolved "https://registry.yarnpkg.com/@metamask/rpc-errors/-/rpc-errors-6.1.0.tgz#dfdef7cba4b9ad01ca3f99e990b5980575b89b4f"
- integrity sha512-JQElKxai26FpDyRKO/yH732wI+BV90i1u6pOuDOpdADSbppB2g1pPh3AGST1zkZqEE9eIKIUw8UdBQ4rp3VTSg==
- dependencies:
- "@metamask/utils" "^8.1.0"
- fast-safe-stringify "^2.0.6"
-
"@metamask/safe-event-emitter@2.0.0", "@metamask/safe-event-emitter@^2.0.0":
version "2.0.0"
resolved "https://registry.yarnpkg.com/@metamask/safe-event-emitter/-/safe-event-emitter-2.0.0.tgz#af577b477c683fad17c619a78208cede06f9605c"
@@ -3623,29 +3531,6 @@
semver "^7.3.8"
superstruct "^1.0.3"
-"@metamask/utils@^5.0.0":
- version "5.0.2"
- resolved "https://registry.yarnpkg.com/@metamask/utils/-/utils-5.0.2.tgz#140ba5061d90d9dac0280c19cab101bc18c8857c"
- integrity sha512-yfmE79bRQtnMzarnKfX7AEJBwFTxvTyw3nBQlu/5rmGXrjAeAMltoGxO62TFurxrQAFMNa/fEjIHNvungZp0+g==
- dependencies:
- "@ethereumjs/tx" "^4.1.2"
- "@types/debug" "^4.1.7"
- debug "^4.3.4"
- semver "^7.3.8"
- superstruct "^1.0.3"
-
-"@metamask/utils@^8.1.0":
- version "8.1.0"
- resolved "https://registry.yarnpkg.com/@metamask/utils/-/utils-8.1.0.tgz#b8e73f5b4696b1b668cf5c1421daad140a3f98ac"
- integrity sha512-sFNpzBKRicDgM2ZuU6vrPROlqNGm8/jDsjc5WrU1RzCkAMc4Xr3vUUf8p59uQ6B09etUWNb8d2GTCbISdmH/Ug==
- dependencies:
- "@ethereumjs/tx" "^4.1.2"
- "@noble/hashes" "^1.3.1"
- "@types/debug" "^4.1.7"
- debug "^4.3.4"
- semver "^7.5.4"
- superstruct "^1.0.3"
-
"@motionone/animation@^10.15.1", "@motionone/animation@^10.16.3":
version "10.16.3"
resolved "https://registry.yarnpkg.com/@motionone/animation/-/animation-10.16.3.tgz#f5b71e27fd8b88b61f983adb0ed6c8e3e89281f9"
@@ -3845,10 +3730,10 @@
dependencies:
webpack-bundle-analyzer "4.7.0"
-"@next/env@14.1.0":
- version "14.1.0"
- resolved "https://registry.yarnpkg.com/@next/env/-/env-14.1.0.tgz#43d92ebb53bc0ae43dcc64fb4d418f8f17d7a341"
- integrity sha512-Py8zIo+02ht82brwwhTg36iogzFqGLPXlRGKQw5s+qP/kMNc4MAyDeEwBKDijk6zTIbegEgu8Qy7C1LboslQAw==
+"@next/env@14.1.1":
+ version "14.1.1"
+ resolved "https://registry.yarnpkg.com/@next/env/-/env-14.1.1.tgz#80150a8440eb0022a73ba353c6088d419b908bac"
+ integrity sha512-7CnQyD5G8shHxQIIg3c7/pSeYFeMhsNbpU/bmvH7ZnDql7mNRgg8O2JZrhrc/soFnfBnKP4/xXNiiSIPn2w8gA==
"@next/eslint-plugin-next@14.1.0":
version "14.1.0"
@@ -3857,50 +3742,50 @@
dependencies:
glob "10.3.10"
-"@next/swc-darwin-arm64@14.1.0":
- version "14.1.0"
- resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.1.0.tgz#70a57c87ab1ae5aa963a3ba0f4e59e18f4ecea39"
- integrity sha512-nUDn7TOGcIeyQni6lZHfzNoo9S0euXnu0jhsbMOmMJUBfgsnESdjN97kM7cBqQxZa8L/bM9om/S5/1dzCrW6wQ==
-
-"@next/swc-darwin-x64@14.1.0":
- version "14.1.0"
- resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.1.0.tgz#0863a22feae1540e83c249384b539069fef054e9"
- integrity sha512-1jgudN5haWxiAl3O1ljUS2GfupPmcftu2RYJqZiMJmmbBT5M1XDffjUtRUzP4W3cBHsrvkfOFdQ71hAreNQP6g==
-
-"@next/swc-linux-arm64-gnu@14.1.0":
- version "14.1.0"
- resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.1.0.tgz#893da533d3fce4aec7116fe772d4f9b95232423c"
- integrity sha512-RHo7Tcj+jllXUbK7xk2NyIDod3YcCPDZxj1WLIYxd709BQ7WuRYl3OWUNG+WUfqeQBds6kvZYlc42NJJTNi4tQ==
-
-"@next/swc-linux-arm64-musl@14.1.0":
- version "14.1.0"
- resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.1.0.tgz#d81ddcf95916310b8b0e4ad32b637406564244c0"
- integrity sha512-v6kP8sHYxjO8RwHmWMJSq7VZP2nYCkRVQ0qolh2l6xroe9QjbgV8siTbduED4u0hlk0+tjS6/Tuy4n5XCp+l6g==
-
-"@next/swc-linux-x64-gnu@14.1.0":
- version "14.1.0"
- resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.1.0.tgz#18967f100ec19938354332dcb0268393cbacf581"
- integrity sha512-zJ2pnoFYB1F4vmEVlb/eSe+VH679zT1VdXlZKX+pE66grOgjmKJHKacf82g/sWE4MQ4Rk2FMBCRnX+l6/TVYzQ==
-
-"@next/swc-linux-x64-musl@14.1.0":
- version "14.1.0"
- resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.1.0.tgz#77077cd4ba8dda8f349dc7ceb6230e68ee3293cf"
- integrity sha512-rbaIYFt2X9YZBSbH/CwGAjbBG2/MrACCVu2X0+kSykHzHnYH5FjHxwXLkcoJ10cX0aWCEynpu+rP76x0914atg==
-
-"@next/swc-win32-arm64-msvc@14.1.0":
- version "14.1.0"
- resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.1.0.tgz#5f0b8cf955644104621e6d7cc923cad3a4c5365a"
- integrity sha512-o1N5TsYc8f/HpGt39OUQpQ9AKIGApd3QLueu7hXk//2xq5Z9OxmV6sQfNp8C7qYmiOlHYODOGqNNa0e9jvchGQ==
-
-"@next/swc-win32-ia32-msvc@14.1.0":
- version "14.1.0"
- resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.1.0.tgz#21f4de1293ac5e5a168a412b139db5d3420a89d0"
- integrity sha512-XXIuB1DBRCFwNO6EEzCTMHT5pauwaSj4SWs7CYnME57eaReAKBXCnkUE80p/pAZcewm7hs+vGvNqDPacEXHVkw==
-
-"@next/swc-win32-x64-msvc@14.1.0":
- version "14.1.0"
- resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.1.0.tgz#e561fb330466d41807123d932b365cf3d33ceba2"
- integrity sha512-9WEbVRRAqJ3YFVqEZIxUqkiO8l1nool1LmNxygr5HWF8AcSYsEpneUDhmjUVJEzO2A04+oPtZdombzzPPkTtgg==
+"@next/swc-darwin-arm64@14.1.1":
+ version "14.1.1"
+ resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.1.1.tgz#b74ba7c14af7d05fa2848bdeb8ee87716c939b64"
+ integrity sha512-yDjSFKQKTIjyT7cFv+DqQfW5jsD+tVxXTckSe1KIouKk75t1qZmj/mV3wzdmFb0XHVGtyRjDMulfVG8uCKemOQ==
+
+"@next/swc-darwin-x64@14.1.1":
+ version "14.1.1"
+ resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.1.1.tgz#82c3e67775e40094c66e76845d1a36cc29c9e78b"
+ integrity sha512-KCQmBL0CmFmN8D64FHIZVD9I4ugQsDBBEJKiblXGgwn7wBCSe8N4Dx47sdzl4JAg39IkSN5NNrr8AniXLMb3aw==
+
+"@next/swc-linux-arm64-gnu@14.1.1":
+ version "14.1.1"
+ resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.1.1.tgz#4f4134457b90adc5c3d167d07dfb713c632c0caa"
+ integrity sha512-YDQfbWyW0JMKhJf/T4eyFr4b3tceTorQ5w2n7I0mNVTFOvu6CGEzfwT3RSAQGTi/FFMTFcuspPec/7dFHuP7Eg==
+
+"@next/swc-linux-arm64-musl@14.1.1":
+ version "14.1.1"
+ resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.1.1.tgz#594bedafaeba4a56db23a48ffed2cef7cd09c31a"
+ integrity sha512-fiuN/OG6sNGRN/bRFxRvV5LyzLB8gaL8cbDH5o3mEiVwfcMzyE5T//ilMmaTrnA8HLMS6hoz4cHOu6Qcp9vxgQ==
+
+"@next/swc-linux-x64-gnu@14.1.1":
+ version "14.1.1"
+ resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.1.1.tgz#cb4e75f1ff2b9bcadf2a50684605928ddfc58528"
+ integrity sha512-rv6AAdEXoezjbdfp3ouMuVqeLjE1Bin0AuE6qxE6V9g3Giz5/R3xpocHoAi7CufRR+lnkuUjRBn05SYJ83oKNQ==
+
+"@next/swc-linux-x64-musl@14.1.1":
+ version "14.1.1"
+ resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.1.1.tgz#15f26800df941b94d06327f674819ab64b272e25"
+ integrity sha512-YAZLGsaNeChSrpz/G7MxO3TIBLaMN8QWMr3X8bt6rCvKovwU7GqQlDu99WdvF33kI8ZahvcdbFsy4jAFzFX7og==
+
+"@next/swc-win32-arm64-msvc@14.1.1":
+ version "14.1.1"
+ resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.1.1.tgz#060c134fa7fa843666e3e8574972b2b723773dd9"
+ integrity sha512-1L4mUYPBMvVDMZg1inUYyPvFSduot0g73hgfD9CODgbr4xiTYe0VOMTZzaRqYJYBA9mana0x4eaAaypmWo1r5A==
+
+"@next/swc-win32-ia32-msvc@14.1.1":
+ version "14.1.1"
+ resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.1.1.tgz#5c06889352b1f77e3807834a0d0afd7e2d2d1da2"
+ integrity sha512-jvIE9tsuj9vpbbXlR5YxrghRfMuG0Qm/nZ/1KDHc+y6FpnZ/apsgh+G6t15vefU0zp3WSpTMIdXRUsNl/7RSuw==
+
+"@next/swc-win32-x64-msvc@14.1.1":
+ version "14.1.1"
+ resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.1.1.tgz#d38c63a8f9b7f36c1470872797d3735b4a9c5c52"
+ integrity sha512-S6K6EHDU5+1KrBDLko7/c1MNy/Ya73pIAmvKeFwsF4RmBFJSO7/7YeD4FnZ4iBdzE69PpQ4sOMU9ORKeNuxe8A==
"@ngraveio/bc-ur@^1.0.0", "@ngraveio/bc-ur@^1.1.5":
version "1.1.6"
@@ -3929,11 +3814,6 @@
dependencies:
"@noble/hashes" "1.3.2"
-"@noble/hashes@1.1.2":
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.2.tgz#e9e035b9b166ca0af657a7848eb2718f0f22f183"
- integrity sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==
-
"@noble/hashes@1.3.1":
version "1.3.1"
resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.1.tgz#8831ef002114670c603c458ab8b11328406953a9"
@@ -3949,16 +3829,6 @@
resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.3.tgz#39908da56a4adc270147bb07968bf3b16cfe1699"
integrity sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==
-"@noble/hashes@~1.1.1":
- version "1.1.5"
- resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.5.tgz#1a0377f3b9020efe2fae03290bd2a12140c95c11"
- integrity sha512-LTMZiiLc+V4v1Yi16TD6aX2gmtKszNye0pQgbaLqkvhIqP7nVsSaJsWloGQjJfJ8offaoP5GtX3yY5swbcJxxQ==
-
-"@noble/secp256k1@1.6.3", "@noble/secp256k1@~1.6.0":
- version "1.6.3"
- resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.6.3.tgz#7eed12d9f4404b416999d0c87686836c4c5c9b94"
- integrity sha512-T04e4iTurVy7I8Sw4+c5OSN9/RkPlo1uKxAomtxQNLq8j1uPAqnsqG1bqvY3Jv7c13gyr6dui0zmh/I3+f/JaQ==
-
"@nodelib/fs.scandir@2.1.5":
version "2.1.5"
resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
@@ -4237,37 +4107,23 @@
resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.7.2.tgz#2d4260033e199b3032a08b41348ac10de21c47e9"
integrity sha512-RbhOOTCNoCrbfkRyoXODZp75MlpiHMgbE5MEBZAnnnLyQNgrigEj4p0lzsMDyc1zVsJDLrivB58tgg3emX0eEA==
-"@safe-global/api-kit@^2.3.0":
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/@safe-global/api-kit/-/api-kit-2.3.0.tgz#fc7e741a25cb5983ce7e7ccf0f2fd2ef64bbe704"
- integrity sha512-Mh9HH9+TK4dz5tiuPLn/GK42cOf1lKGvcmH/JQK8b7gD+YJugnXdrsirs3XahvwdG0rG7xfL9tf4mcW7zWzuXQ==
+"@safe-global/api-kit@^2.3.2":
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/@safe-global/api-kit/-/api-kit-2.3.2.tgz#37cab964faf79f98eb5f1a86004a56c0fb0eef21"
+ integrity sha512-pnbP23t3XQOWZv5Y35CoDpBAajSeB0ZY9ahajruNYt6pyPYxleQVuRueCQ+FDZHNDGS0SK7dlUYyUScs/GsTZQ==
dependencies:
- "@safe-global/protocol-kit" "^3.0.2"
- "@safe-global/safe-core-sdk-types" "^4.0.2"
+ "@safe-global/protocol-kit" "^3.1.1"
+ "@safe-global/safe-core-sdk-types" "^4.1.1"
ethers "^6.7.1"
node-fetch "^2.7.0"
-"@safe-global/protocol-kit@^3.0.2":
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/@safe-global/protocol-kit/-/protocol-kit-3.0.2.tgz#cfa4c5e890c101aa89e11768d07b2bc5455f72fb"
- integrity sha512-Jxvvfu4yqEdWeOuY3VWOOs/q5f27om3tctL2guOCDbAuSx3Vd1peaKRwLiREkvrrqKEW0tfmzUSsqtmlJExfBw==
- dependencies:
- "@noble/hashes" "^1.3.3"
- "@safe-global/safe-deployments" "^1.34.0"
- ethereumjs-util "^7.1.5"
- ethers "^6.7.1"
- semver "^7.5.4"
- web3 "^1.10.3"
- web3-core "^1.10.3"
- web3-utils "^1.10.3"
-
-"@safe-global/protocol-kit@^3.1.0":
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/@safe-global/protocol-kit/-/protocol-kit-3.1.0.tgz#429f3f11b3b2c60ed31568f853393155f316316b"
- integrity sha512-PUZgTohIoQ1KN7RYE2IcQL8lj/LAb4WRgkDwB+1Vv7AoOLTI1U0Whajfe6Ur9w35BrQwr/x2HAoQvVSzH4FZ3Q==
+"@safe-global/protocol-kit@^3.1.1":
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/@safe-global/protocol-kit/-/protocol-kit-3.1.1.tgz#eec3cee3432cd1ad8b159e1911527d93ecc502f9"
+ integrity sha512-ai/N1DI6U53CsC46Do8eOyb6IkgVhjoQFhbFIh5rFSAKiuw3B0hTF7nrVRb0jw4NFlNHCcWDAER/uNH0Qy2Pkg==
dependencies:
"@noble/hashes" "^1.3.3"
- "@safe-global/safe-deployments" "^1.35.0"
+ "@safe-global/safe-deployments" "^1.36.0"
ethereumjs-util "^7.1.5"
ethers "^6.7.1"
semver "^7.5.4"
@@ -4275,66 +4131,55 @@
web3-core "^1.10.3"
web3-utils "^1.10.3"
-"@safe-global/safe-apps-sdk@^9.0.0-next.1":
- version "9.0.0-next.1"
- resolved "https://registry.yarnpkg.com/@safe-global/safe-apps-sdk/-/safe-apps-sdk-9.0.0-next.1.tgz#762186e36a3580c93e7efe7f49259c75043c5b7b"
- integrity sha512-0XsgPXCOXx0wKhumKX/b65alRgd3umfNhsCq/S0K/hhMD/Uh6BTOzHRNFCosbnGvWQT75Hp3Y11LVS7ZD49t/w==
+"@safe-global/safe-apps-sdk@^9.1.0":
+ version "9.1.0"
+ resolved "https://registry.yarnpkg.com/@safe-global/safe-apps-sdk/-/safe-apps-sdk-9.1.0.tgz#0e65913e0f202e529ed3c846e0f5a98c2d35aa98"
+ integrity sha512-N5p/ulfnnA2Pi2M3YeWjULeWbjo7ei22JwU/IXnhoHzKq3pYCN6ynL9mJBOlvDVv892EgLPCWCOwQk/uBT2v0Q==
dependencies:
"@safe-global/safe-gateway-typescript-sdk" "^3.5.3"
- viem "^1.6.0"
+ viem "^2.1.1"
-"@safe-global/safe-core-sdk-types@^4.0.2":
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/@safe-global/safe-core-sdk-types/-/safe-core-sdk-types-4.0.2.tgz#70a99d8d61b83db458124c263391d86e5d6d5057"
- integrity sha512-3I60xV/BLPiBtc3nGp2itgiDL+YbMI9OwaANvnJL2AwSS1kc2kH3/SsCwAW3s4Usr3b0lE08aO7I9ropyxFHhA==
+"@safe-global/safe-core-sdk-types@^4.1.1":
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/@safe-global/safe-core-sdk-types/-/safe-core-sdk-types-4.1.1.tgz#b75e15a2e6fa50f131629ca6f6f3a98fd6037d30"
+ integrity sha512-5NIWG7OjV+C5iquux0yPcu8SHUzg1qJXJ/jAQcPwXGTC7ZVsFawnR43/l2Vg9zEwf0RF0xTm3W8DXkaBYORiEQ==
dependencies:
- "@safe-global/safe-deployments" "^1.34.0"
+ "@safe-global/safe-deployments" "^1.36.0"
ethers "^6.7.1"
web3-core "^1.10.3"
web3-utils "^1.10.3"
-"@safe-global/safe-deployments@^1.34.0":
- version "1.34.0"
- resolved "https://registry.yarnpkg.com/@safe-global/safe-deployments/-/safe-deployments-1.34.0.tgz#5eef33012a4af55c4440036b1c0cfdb2245c6e49"
- integrity sha512-J55iHhB1tiNoPeVQ5s943zrfeKRYPqBtnz/EM7d878WzUmmDlTGKHN98qPYKBxkRKP1UjEWuQDrZxy80lx1rJw==
- dependencies:
- semver "^7.3.7"
-
-"@safe-global/safe-deployments@^1.35.0":
- version "1.35.0"
- resolved "https://registry.yarnpkg.com/@safe-global/safe-deployments/-/safe-deployments-1.35.0.tgz#6930a86a006526a9791ebd2a11cf8f5d8358563b"
- integrity sha512-Of8WQEcvL5Fm+xxnCDjah6Hkw+sNdzcApQnzr+OsPBxYtZL0RRtbmesypj36oOD8BQmyrH54V8DVN+pYjrfJ9g==
+"@safe-global/safe-deployments@^1.36.0":
+ version "1.36.0"
+ resolved "https://registry.yarnpkg.com/@safe-global/safe-deployments/-/safe-deployments-1.36.0.tgz#7e5cd470cc1042182d47f65b59831a64ed8feff1"
+ integrity sha512-9MbDJveRR64AbmzjIpuUqmDBDtOZpXpvkyhTUs+5UOPT3WgSO375/ZTO7hZpywP7+EmxnjkGc9EoxjGcC4TAyw==
dependencies:
semver "^7.6.0"
-"@safe-global/safe-gateway-typescript-sdk@3.21.1":
- version "3.21.1"
- resolved "https://registry.yarnpkg.com/@safe-global/safe-gateway-typescript-sdk/-/safe-gateway-typescript-sdk-3.21.1.tgz#984ec2d3d4211caf6a96786ab922b39909093538"
- integrity sha512-7nakIjcRSs6781LkizYpIfXh1DYlkUDqyALciqz/BjFU/S97sVjZdL4cuKsG9NEarytE+f6p0Qbq2Bo1aocVUA==
+"@safe-global/safe-gateway-typescript-sdk@3.21.8":
+ version "3.21.8"
+ resolved "https://registry.yarnpkg.com/@safe-global/safe-gateway-typescript-sdk/-/safe-gateway-typescript-sdk-3.21.8.tgz#f90eb668dd620d0c5578f02f7040169610a0eda1"
+ integrity sha512-n/fYgiqbuzAQuK0bgny6GBYvb585ETxKURa5Kb9hBV3fa47SvJo/dpGq275fJUn0e3Hh1YqETiLGj4HVJjHiTA==
"@safe-global/safe-gateway-typescript-sdk@^3.5.3":
- version "3.19.0"
- resolved "https://registry.yarnpkg.com/@safe-global/safe-gateway-typescript-sdk/-/safe-gateway-typescript-sdk-3.19.0.tgz#18637c205c83bfc0a6be5fddbf202d6bb4927302"
- integrity sha512-TRlP05KY6t3wjLJ74FiirWlEt3xTclnUQM2YdYto1jx5G1o0meMnugIUZXhzm7Bs3rDEDNhz/aDf2KMSZtoCFg==
+ version "3.21.2"
+ resolved "https://registry.yarnpkg.com/@safe-global/safe-gateway-typescript-sdk/-/safe-gateway-typescript-sdk-3.21.2.tgz#2123a7429c2d9713365f51c359bfc055d4c8e913"
+ integrity sha512-N9Y2CKPBVbc8FbOKzqepy8TJUY2VILX7bmxV4ruByLJvR9PBnGvGfnOhw975cDn6PmSziXL0RaUWHpSW23rsng==
"@safe-global/safe-modules-deployments@^1.2.0":
version "1.2.0"
resolved "https://registry.yarnpkg.com/@safe-global/safe-modules-deployments/-/safe-modules-deployments-1.2.0.tgz#ca871c3f553cd16cbea1aac8f8be16498329a7d3"
integrity sha512-/pjHIPaYwGRM5oOB7lc+yf28fWEq7twNP5dJxpLFgG/9UR4E3F+XfFdYkpP22eIvmOkBwCJXJZfPfESh9WSF2w==
-"@scure/base@~1.1.0", "@scure/base@~1.1.2":
+"@scure/base@~1.1.0":
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.0":
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.0.tgz#dea45875e7fbc720c2b4560325f1cf5d2246d95b"
- integrity sha512-ftTW3kKX54YXLCxH6BB7oEEoJfoE2pIgw7MINKAs5PsS6nqKPuKk1haTF/EuHmYqG330t5GSrdmtRuHaY1a62Q==
- dependencies:
- "@noble/hashes" "~1.1.1"
- "@noble/secp256k1" "~1.6.0"
- "@scure/base" "~1.1.0"
+"@scure/base@~1.1.2":
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.6.tgz#8ce5d304b436e4c84f896e0550c83e4d88cb917d"
+ integrity sha512-ok9AWwhcgYuGG3Zfhyqg+zwl+Wn5uE+dwC0NV/2qQkx4dABbb/bx96vWu8NSj+BNjjSjno+JRYRjle1jV08k3g==
"@scure/bip32@1.3.1":
version "1.3.1"
@@ -4354,14 +4199,6 @@
"@noble/hashes" "~1.3.2"
"@scure/base" "~1.1.2"
-"@scure/bip39@1.1.0":
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.0.tgz#92f11d095bae025f166bef3defcc5bf4945d419a"
- integrity sha512-pwrPOS16VeTKg98dYXQyIjJEcWfz7/1YJIwxUEPFfQPtc86Ym/1sVgQ2RLoD43AazMk2l/unK4ITySSpW2+82w==
- dependencies:
- "@noble/hashes" "~1.1.1"
- "@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"
@@ -4481,11 +4318,6 @@
dependencies:
"@sinonjs/commons" "^3.0.0"
-"@socket.io/component-emitter@~3.1.0":
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz#96116f2a912e0c02817345b3c10751069920d553"
- integrity sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==
-
"@solana/buffer-layout@^4.0.0":
version "4.0.1"
resolved "https://registry.yarnpkg.com/@solana/buffer-layout/-/buffer-layout-4.0.1.tgz#b996235eaec15b1e0b5092a8ed6028df77fa6c15"
@@ -4613,7 +4445,7 @@
"@stablelib/constant-time" "^1.0.1"
"@stablelib/wipe" "^1.0.1"
-"@stablelib/random@^1.0.1", "@stablelib/random@^1.0.2":
+"@stablelib/random@1.0.2", "@stablelib/random@^1.0.1", "@stablelib/random@^1.0.2":
version "1.0.2"
resolved "https://registry.yarnpkg.com/@stablelib/random/-/random-1.0.2.tgz#2dece393636489bf7e19c51229dd7900eddf742c"
integrity sha512-rIsE83Xpb7clHPVRlBj8qNe5L8ISQOzjghYQm/dZ7VaM2KHYwMW5adjQjrzTZCchFnNCNhkwtnOBa9HTMJCI8w==
@@ -4644,7 +4476,7 @@
resolved "https://registry.yarnpkg.com/@stablelib/wipe/-/wipe-1.0.1.tgz#d21401f1d59ade56a62e139462a97f104ed19a36"
integrity sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg==
-"@stablelib/x25519@^1.0.3":
+"@stablelib/x25519@1.0.3", "@stablelib/x25519@^1.0.3":
version "1.0.3"
resolved "https://registry.yarnpkg.com/@stablelib/x25519/-/x25519-1.0.3.tgz#13c8174f774ea9f3e5e42213cbf9fc68a3c7b7fd"
integrity sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw==
@@ -5609,438 +5441,18 @@
integrity sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw==
dependencies:
"@babel/runtime" "^7.12.5"
- "@testing-library/dom" "^8.5.0"
- "@types/react-dom" "^18.0.0"
-
-"@testing-library/user-event@^14.4.2", "@testing-library/user-event@^14.5.2":
- version "14.5.2"
- resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-14.5.2.tgz#db7257d727c891905947bd1c1a99da20e03c2ebd"
- integrity sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==
-
-"@tkey-mpc/chrome-storage@^9.0.2":
- version "9.0.2"
- resolved "https://registry.yarnpkg.com/@tkey-mpc/chrome-storage/-/chrome-storage-9.0.2.tgz#77a0e46df75c844ee9c5f4b07963d22edb44b71b"
- integrity sha512-3yeliKVCJP77OhG5J93uj2/0XwASO6H8WqSZgAgbVxXbC6oPazKTv84YVw0rkXmLE7gkHqagcjNiNOQaV29VRw==
- dependencies:
- "@tkey-mpc/common-types" "^9.0.2"
- webextension-polyfill "^0.10.0"
-
-"@tkey-mpc/common-types@^8.2.2":
- version "8.2.2"
- resolved "https://registry.yarnpkg.com/@tkey-mpc/common-types/-/common-types-8.2.2.tgz#194324a9ad92027c0f040896fa94fec096e83c5d"
- integrity sha512-aN/LUXFh+t+4vf1zzlIIh3xd+M4HKzBgaJq6eVopPLMxaG941ZFyOq9Tbymzliq9lrFhA3ByEyPFI6Lunqzvbg==
- dependencies:
- "@toruslabs/eccrypto" "^3.0.0"
- "@toruslabs/rss-client" "^1.5.0"
- bn.js "^5.2.1"
- elliptic "^6.5.4"
- serialize-error "^8.1.0"
- ts-custom-error "^3.3.1"
- web3-utils "^1.8.1"
-
-"@tkey-mpc/common-types@^9.0.2":
- version "9.0.2"
- resolved "https://registry.yarnpkg.com/@tkey-mpc/common-types/-/common-types-9.0.2.tgz#ad8fc7c905a27caf1c7f6fa724b14768b46e3de2"
- integrity sha512-TJrij2Fq/klAcLlpECqxNUnzeLcChNmrjQdwYJXZKMBsyUo3jYmAGTAqA7/6leaHSZfW18DMHcLrsSeiHQw63g==
- dependencies:
- "@toruslabs/customauth" "^16.0.6"
- "@toruslabs/eccrypto" "^4.0.0"
- "@toruslabs/rss-client" "^1.5.0"
- "@toruslabs/torus.js" "^11.0.6"
- bn.js "^5.2.1"
- elliptic "^6.5.4"
- serialize-error "^8.1.0"
- ts-custom-error "^3.3.1"
-
-"@tkey-mpc/core@^9.0.2":
- version "9.0.2"
- resolved "https://registry.yarnpkg.com/@tkey-mpc/core/-/core-9.0.2.tgz#ca659d5288e5e818c36dd0618d2903fc6a9e1349"
- integrity sha512-sc3w+rjc37OSQwff0bpVlmUDX58hBKY8AOSOsuWJoMfA7l8CFWyQp7iRBiVIxIgOojfeosu0RUcq2Z8HsTKK0g==
- dependencies:
- "@tkey-mpc/common-types" "^9.0.2"
- "@toruslabs/eccrypto" "^4.0.0"
- "@toruslabs/http-helpers" "^5.0.0"
- "@toruslabs/rss-client" "^1.5.0"
- "@toruslabs/torus.js" "^11.0.6"
- bn.js "^5.2.1"
- elliptic "^6.5.4"
- json-stable-stringify "^1.0.2"
-
-"@tkey-mpc/security-questions@^9.0.2":
- version "9.0.2"
- resolved "https://registry.yarnpkg.com/@tkey-mpc/security-questions/-/security-questions-9.0.2.tgz#9ed6f944713f08d290bba920738488451db083fe"
- integrity sha512-ekxMnmdbwuDRlEuXhZcG4U2W1Y1NFSo10Ctb8Mrw9FNz0XR7lTIAcLn3dlvCQHRmKLT1hlziW8oby4nsMpqsbA==
- dependencies:
- "@tkey-mpc/common-types" "^9.0.2"
- bn.js "^5.2.1"
- ethereum-cryptography "^2.1.2"
-
-"@tkey-mpc/service-provider-base@^9.0.2":
- version "9.0.2"
- resolved "https://registry.yarnpkg.com/@tkey-mpc/service-provider-base/-/service-provider-base-9.0.2.tgz#03dc78cd3684bd261a1135ab0dfeb08c9b7b74c2"
- integrity sha512-Gk3xF1NFV/BqmwMNKDB//DNoN9nff4kGeNxXiVnlxhQKZuX9phzd/sxJljKc6tutOK5YdOcvot7ZuwJg2/vZjA==
- dependencies:
- "@tkey-mpc/common-types" "^9.0.2"
- bn.js "^5.2.1"
- elliptic "^6.5.4"
-
-"@tkey-mpc/service-provider-torus@^9.0.3":
- version "9.0.3"
- resolved "https://registry.yarnpkg.com/@tkey-mpc/service-provider-torus/-/service-provider-torus-9.0.3.tgz#fdfddf000c55fb22ac92c135db5d46c8d9615e2a"
- integrity sha512-9/OjTqjruR5AWMwJPRuR+ZxsZXzt9jQfzfNtde13VHSjtogcLwT12U1QTHJ7tsIZYckBy3ZVDbNpIcTOzz70tQ==
- dependencies:
- "@tkey-mpc/common-types" "^9.0.2"
- "@tkey-mpc/service-provider-base" "^9.0.2"
- "@toruslabs/customauth" "^16.0.6"
- "@toruslabs/torus.js" "^11.0.6"
- bn.js "^5.2.1"
- elliptic "^6.5.4"
-
-"@tkey-mpc/share-serialization@^9.0.2":
- version "9.0.2"
- resolved "https://registry.yarnpkg.com/@tkey-mpc/share-serialization/-/share-serialization-9.0.2.tgz#a303d5eed1e6d9665a8aede5324193682bf4760e"
- integrity sha512-dtQFbWvV9A4y6SGpx72WaRcwSREf/Yld9f4+u7FWe81WY575N655SheqM08gYYEGZlcQ+TiCMN3C2rq9I+NpMw==
- dependencies:
- "@tkey-mpc/common-types" "^9.0.2"
- "@types/create-hash" "1.2.2"
- bn.js "^5.2.1"
- ethereum-cryptography "^2.1.2"
-
-"@tkey-mpc/storage-layer-torus@^9.0.2":
- version "9.0.2"
- resolved "https://registry.yarnpkg.com/@tkey-mpc/storage-layer-torus/-/storage-layer-torus-9.0.2.tgz#a59067379ead3e110359209a004ab69356f7930e"
- integrity sha512-qxQ+O9GerdaM66DVh8Qi7oIRjBbcsUcuP+F9P5YdH8J+XEFDMSjhuuBaQpU3xaMFxpTozkSv4Kh/zHWyQE2YeA==
- dependencies:
- "@tkey-mpc/common-types" "^9.0.2"
- "@toruslabs/http-helpers" "^5.0.0"
- base64url "3.0.1"
- bn.js "^5.2.1"
- ethereum-cryptography "^2.1.2"
- json-stable-stringify "^1.0.2"
-
-"@tootallnate/once@2":
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf"
- integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==
-
-"@toruslabs/base-controllers@^2.2.6":
- version "2.9.0"
- resolved "https://registry.yarnpkg.com/@toruslabs/base-controllers/-/base-controllers-2.9.0.tgz#e23f4228b5a90bf94ba9b0b27451f3024bd1acc4"
- integrity sha512-rKc+bR4QB/wdbH0CxLZC5e2PUZcIgkr9yY7TMd3oIffDklaYBnsuC5ES2/rgK1aRUDRWz+qWbTwLqsY6PlT37Q==
- dependencies:
- "@ethereumjs/util" "^8.0.6"
- "@toruslabs/broadcast-channel" "^6.2.0"
- "@toruslabs/http-helpers" "^3.3.0"
- "@toruslabs/openlogin-jrpc" "^4.0.0"
- async-mutex "^0.4.0"
- bignumber.js "^9.1.1"
- bowser "^2.11.0"
- eth-rpc-errors "^4.0.3"
- json-rpc-random-id "^1.0.1"
- lodash "^4.17.21"
- loglevel "^1.8.1"
-
-"@toruslabs/base-controllers@^4.2.0":
- version "4.5.2"
- resolved "https://registry.yarnpkg.com/@toruslabs/base-controllers/-/base-controllers-4.5.2.tgz#ce0a475203990525ec352d3b3283eca5b1b19cbb"
- integrity sha512-DEaeKREzY8OJ74k6nuOP1x2a8Z1HeCfV2uQE835QhLKuCDgqRomDwCwRcrCGT3rqxT/AVhWmBj+ykO/XS/4lZw==
- dependencies:
- "@ethereumjs/util" "^9.0.0"
- "@metamask/rpc-errors" "^6.0.0"
- "@toruslabs/broadcast-channel" "^9.0.0"
- "@toruslabs/http-helpers" "^5.0.0"
- "@toruslabs/openlogin-jrpc" "^5.1.0"
- async-mutex "^0.4.0"
- bignumber.js "^9.1.2"
- bowser "^2.11.0"
- lodash "^4.17.21"
- loglevel "^1.8.1"
-
-"@toruslabs/base-session-manager@^3.0.0":
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/@toruslabs/base-session-manager/-/base-session-manager-3.0.0.tgz#4302d0747ef71a8278af79e577cf53253c907cd5"
- integrity sha512-+EqwizmSFkVEczUtaw+swbAxRIIxC/EaFE040rwfgC5fixaQMNLw2cVYXWN67Ra47wC9A7Om6xwQTuGFR+dy4w==
- dependencies:
- "@toruslabs/http-helpers" "^5.0.0"
-
-"@toruslabs/broadcast-channel@^6.2.0":
- version "6.3.1"
- resolved "https://registry.yarnpkg.com/@toruslabs/broadcast-channel/-/broadcast-channel-6.3.1.tgz#d4b0a08c3a0fa88d42d7f33387ce9be928c2d4b2"
- integrity sha512-BEtJQ+9bMfFoGuCsp5NmxyY+C980Ho+3BZIKSiYwRtl5qymJ+jMX5lsoCppoQblcb34dP6FwEjeFw80Y9QC/rw==
- dependencies:
- "@babel/runtime" "^7.21.0"
- "@toruslabs/eccrypto" "^2.1.1"
- "@toruslabs/metadata-helpers" "^3.2.0"
- bowser "^2.11.0"
- loglevel "^1.8.1"
- oblivious-set "1.1.1"
- socket.io-client "^4.6.1"
- unload "^2.4.1"
-
-"@toruslabs/broadcast-channel@^8.0.0":
- version "8.0.0"
- resolved "https://registry.yarnpkg.com/@toruslabs/broadcast-channel/-/broadcast-channel-8.0.0.tgz#904ee44fceeb861d16f282ca211d1e2adf16e2f8"
- integrity sha512-qCyWsHVL4Xtx1J6k1+acD7TJKCelJWyUy5Q5zyiWMPxMGFxTv1XdRyqpzV+VgwbcslIqgFN0GewOry2l1jlUQQ==
- dependencies:
- "@babel/runtime" "^7.22.10"
- "@toruslabs/eccrypto" "^4.0.0"
- "@toruslabs/metadata-helpers" "^5.0.0"
- bowser "^2.11.0"
- loglevel "^1.8.1"
- oblivious-set "1.1.1"
- socket.io-client "^4.7.2"
- unload "^2.4.1"
-
-"@toruslabs/broadcast-channel@^9.0.0":
- version "9.0.0"
- resolved "https://registry.yarnpkg.com/@toruslabs/broadcast-channel/-/broadcast-channel-9.0.0.tgz#8f13b829269ee410fd46b7b463dea33b0c116147"
- integrity sha512-GA0hh32vt0qu0qZ/QepNHDT5bxKzTsDWu2yp5J1a8CQWNwUGPkYkDe1ycRySQVBo/wa7UyZdXvgLYtYne+/cZw==
- dependencies:
- "@babel/runtime" "^7.22.10"
- "@toruslabs/eccrypto" "^4.0.0"
- "@toruslabs/metadata-helpers" "^5.0.0"
- bowser "^2.11.0"
- loglevel "^1.8.1"
- oblivious-set "1.1.1"
- socket.io-client "^4.7.2"
- unload "^2.4.1"
-
-"@toruslabs/constants@^13.0.1", "@toruslabs/constants@^13.0.3":
- version "13.0.3"
- resolved "https://registry.yarnpkg.com/@toruslabs/constants/-/constants-13.0.3.tgz#260a3e5c430d201bd3d92e13ef2044bd89a4432e"
- integrity sha512-DiksceNFwzV4XBwcPdKpV6tfrvWIxhmwseTJbNnlzdy6uXgzvtagfapu+98pjrkNrjoRLiM17QBgBi8sNw7oGQ==
-
-"@toruslabs/customauth@^16.0.6":
- version "16.0.6"
- resolved "https://registry.yarnpkg.com/@toruslabs/customauth/-/customauth-16.0.6.tgz#cf3f0e614735fb799a9748b992026f81a9ee2ab6"
- integrity sha512-4+Cxbxz3fxm750MMaMqMoJS0x8RZdD0y1tHLa/2T+b993cjRoQRixddTa3rWNYdbWsg2rgcmGkpXxywq3aLzwA==
- dependencies:
- "@chaitanyapotti/register-service-worker" "^1.7.3"
- "@toruslabs/broadcast-channel" "^8.0.0"
- "@toruslabs/constants" "^13.0.1"
- "@toruslabs/eccrypto" "^4.0.0"
- "@toruslabs/fetch-node-details" "^13.0.1"
- "@toruslabs/http-helpers" "^5.0.0"
- "@toruslabs/metadata-helpers" "^5.0.0"
- "@toruslabs/torus.js" "^11.0.5"
- base64url "^3.0.1"
- bowser "^2.11.0"
- events "^3.3.0"
- jwt-decode "^3.1.2"
- lodash.merge "^4.6.2"
- loglevel "^1.8.1"
-
-"@toruslabs/eccrypto@4.0.0", "@toruslabs/eccrypto@^4.0.0":
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/@toruslabs/eccrypto/-/eccrypto-4.0.0.tgz#0b27ed2d1e9483e77f42a7619a2c3c19cb802f44"
- integrity sha512-Z3EINkbsgJx1t6jCDVIJjLSUEGUtNIeDjhMWmeDGOWcP/+v/yQ1hEvd1wfxEz4q5WqIHhevacmPiVxiJ4DljGQ==
- dependencies:
- elliptic "^6.5.4"
-
-"@toruslabs/eccrypto@^2.1.1":
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/@toruslabs/eccrypto/-/eccrypto-2.2.1.tgz#19012cc4e774e8c3df7ceebb2c1a07ecfd784917"
- integrity sha512-7sviL0wLYsfA5ogEAOIdb0tu/QAOFXfHc9B8ONYtF04x4Mg3Nr89LL35FhjaEm055q8Ru7cUQhEFSiqJqm9GCw==
- dependencies:
- elliptic "^6.5.4"
-
-"@toruslabs/eccrypto@^3.0.0":
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/@toruslabs/eccrypto/-/eccrypto-3.0.0.tgz#96df18e9d7320b230492671cf2942e703cd34ae3"
- integrity sha512-+lFjV+0FZ3S4zH5T/Gnc795HoqpzLLDW28fSkibZRlx1Nx8uwbl3pyJSfya0C0bRHH1/+NTeBogUDijaRJ1NCw==
- dependencies:
- elliptic "^6.5.4"
-
-"@toruslabs/fetch-node-details@^13.0.1":
- version "13.0.3"
- resolved "https://registry.yarnpkg.com/@toruslabs/fetch-node-details/-/fetch-node-details-13.0.3.tgz#3cb1d08a61e7ded4eda325b1f52c837553903cd4"
- integrity sha512-u8Lhp2rOcK9+0qfz74JzLIisjfDKbMY5H/yh9E601peBydshx9HnfWTuRuj5bYGuHCQlXHC3t7UQbMAiuZ0EuA==
- dependencies:
- "@toruslabs/constants" "^13.0.3"
- "@toruslabs/fnd-base" "^13.0.3"
- "@toruslabs/http-helpers" "^5.0.0"
- loglevel "^1.8.1"
-
-"@toruslabs/fnd-base@^13.0.1", "@toruslabs/fnd-base@^13.0.3":
- version "13.0.3"
- resolved "https://registry.yarnpkg.com/@toruslabs/fnd-base/-/fnd-base-13.0.3.tgz#11a0cc95b085309322a6e20818b5dfb14cf6b004"
- integrity sha512-XQyUacMwQ/yb1OgEnZHtnepCIhh9DfeTz+Ki7DkpqiCPnvduXqQYPSYoLwQumBjHOKwn9HxHdPYL9ps3hQpGPg==
- dependencies:
- "@toruslabs/constants" "^13.0.3"
-
-"@toruslabs/http-helpers@^3.2.0", "@toruslabs/http-helpers@^3.3.0", "@toruslabs/http-helpers@^3.4.0":
- version "3.4.0"
- resolved "https://registry.yarnpkg.com/@toruslabs/http-helpers/-/http-helpers-3.4.0.tgz#6d1da9e6aba094af62e73cf639a69844c82202f3"
- integrity sha512-CoeJSL32mpp0gmYjxv48odu6pfjHk/rbJHDwCtYPcMHAl+qUQ/DTpVOOn9U0fGkD+fYZrQmZbRkXFgLhiT0ajQ==
- dependencies:
- lodash.merge "^4.6.2"
- loglevel "^1.8.1"
-
-"@toruslabs/http-helpers@^5.0.0":
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/@toruslabs/http-helpers/-/http-helpers-5.0.0.tgz#2a309d2a2c5c00d50a725d83ccec8a7475771d62"
- integrity sha512-GmezWz9JeF6YyhjLSm+9XDF4YaeICEckY0Jbo43i86SjhfJYgRWqEi63VSiNsaqc/z810Q0FQvEk1TnBRX2tgA==
- dependencies:
- lodash.merge "^4.6.2"
- loglevel "^1.8.1"
-
-"@toruslabs/metadata-helpers@5.0.0", "@toruslabs/metadata-helpers@^5.0.0", "@toruslabs/metadata-helpers@^5.x":
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/@toruslabs/metadata-helpers/-/metadata-helpers-5.0.0.tgz#12be5de4e8a5d1af2dd080bdf05f5ad8953aaae7"
- integrity sha512-ZUFfOHJVJC53c8wJYHjdF3bIgN2ZvfqehbTZ/zJ7oVFfrrd6O66V3gQ1i1zxBjH3yhOvZKQwc0DaMmh3G0NUXQ==
- dependencies:
- "@toruslabs/eccrypto" "^4.0.0"
- "@toruslabs/http-helpers" "^5.0.0"
- elliptic "^6.5.4"
- ethereum-cryptography "^2.1.2"
- json-stable-stringify "^1.0.2"
-
-"@toruslabs/metadata-helpers@^3.2.0":
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/@toruslabs/metadata-helpers/-/metadata-helpers-3.2.0.tgz#b297933ac37481a9c86a125ac6a4e5c2f109fb78"
- integrity sha512-2bCc6PNKd9y+aWfZQ1FXd47QmfyT4NmmqPGfsqk+sQS2o+MlxIyLuh9uh7deMgXo4b4qBDX+RQGbIKM1zVk56w==
- dependencies:
- "@toruslabs/eccrypto" "^2.1.1"
- "@toruslabs/http-helpers" "^3.4.0"
- elliptic "^6.5.4"
- ethereum-cryptography "^2.0.0"
- json-stable-stringify "^1.0.2"
-
-"@toruslabs/openlogin-jrpc@^2.6.0":
- version "2.13.0"
- resolved "https://registry.yarnpkg.com/@toruslabs/openlogin-jrpc/-/openlogin-jrpc-2.13.0.tgz#aae71e7c9b0161bc14baf3fc696605d74e0b99f4"
- integrity sha512-TEg50/84xSocHLb3MEtw0DaIa+bXU66TJJjjDrqGPjoRo97fn8F8jDW2AcVV+eug39xpfxPIw1FFdCtgunmz7w==
- dependencies:
- "@toruslabs/openlogin-utils" "^2.13.0"
- end-of-stream "^1.4.4"
- eth-rpc-errors "^4.0.3"
- events "^3.3.0"
- fast-safe-stringify "^2.1.1"
- once "^1.4.0"
- pump "^3.0.0"
- readable-stream "^3.6.0"
-
-"@toruslabs/openlogin-jrpc@^4.0.0":
- version "4.7.2"
- resolved "https://registry.yarnpkg.com/@toruslabs/openlogin-jrpc/-/openlogin-jrpc-4.7.2.tgz#e04dd6945da92d790f713a58aaa1657c57b330c8"
- integrity sha512-9Eb0cPc0lPuS6v2YkQlgzfbRnZ6fLez9Ike5wznoHSFA2/JVu1onwuI56EV1HwswdDrOWPPQEyzI1j9NriZ0ew==
- dependencies:
- "@metamask/rpc-errors" "^5.1.1"
- "@toruslabs/openlogin-utils" "^4.7.0"
- end-of-stream "^1.4.4"
- events "^3.3.0"
- fast-safe-stringify "^2.1.1"
- once "^1.4.0"
- pump "^3.0.0"
- readable-stream "^4.4.2"
-
-"@toruslabs/openlogin-jrpc@^5.1.0", "@toruslabs/openlogin-jrpc@^5.2.0":
- version "5.3.0"
- resolved "https://registry.yarnpkg.com/@toruslabs/openlogin-jrpc/-/openlogin-jrpc-5.3.0.tgz#37fefe43d82b0ecfa7a99de56050e4b46bf68a5c"
- integrity sha512-tM1XHG5UulvENhZYewo9eVWF5r9SffGru8+09qFED7g/PFupKs/rccaXYwyWRGVenQSMgj6ipgUd72zliuen+A==
- dependencies:
- "@metamask/rpc-errors" "^6.0.0"
- "@toruslabs/openlogin-utils" "^5.3.0"
- end-of-stream "^1.4.4"
- events "^3.3.0"
- fast-safe-stringify "^2.1.1"
- once "^1.4.0"
- pump "^3.0.0"
- readable-stream "^4.4.2"
-
-"@toruslabs/openlogin-session-manager@^3.0.0":
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/@toruslabs/openlogin-session-manager/-/openlogin-session-manager-3.0.0.tgz#2f13af3ef96ddda48803a0265a798cffc3c9f78c"
- integrity sha512-S+nnZQ+Y+XCHvTYaov3ltiV2hAAPpKpwxvB4TmbMvi7KWOZ8BcUJQykSITlIXV4aE5y5BD96rsmjQ3C3MyVtUQ==
- dependencies:
- "@toruslabs/base-session-manager" "^3.0.0"
- "@toruslabs/eccrypto" "^4.0.0"
- "@toruslabs/metadata-helpers" "5.0.0"
-
-"@toruslabs/openlogin-utils@^2.13.0":
- version "2.13.0"
- resolved "https://registry.yarnpkg.com/@toruslabs/openlogin-utils/-/openlogin-utils-2.13.0.tgz#e339f9d638b1e3a8ecca7b8c973d6060a19afda5"
- integrity sha512-g4pj6hIdKcuyetVsUWqiAJmCooTS9hOADL31m7LTqgdXzX9oR437A+c8Dw8gzFVcHmkK16Yt2//GvlKnSsGILg==
- dependencies:
- base64url "^3.0.1"
- keccak "^3.0.3"
- randombytes "^2.1.0"
-
-"@toruslabs/openlogin-utils@^4.7.0":
- version "4.7.0"
- resolved "https://registry.yarnpkg.com/@toruslabs/openlogin-utils/-/openlogin-utils-4.7.0.tgz#741d6ba1c0754b59a182b1c6dd8d0263695ed980"
- integrity sha512-w6XkHs4WKuufsf/zzteBzs4EJuOknrUmJ+iv5FZ8HzIpMQeL/984CP8HYaFSEYkbGCP4ydAnhY4Uh0QAhpDbPg==
- dependencies:
- base64url "^3.0.1"
-
-"@toruslabs/openlogin-utils@^5.2.0", "@toruslabs/openlogin-utils@^5.3.0":
- version "5.3.0"
- resolved "https://registry.yarnpkg.com/@toruslabs/openlogin-utils/-/openlogin-utils-5.3.0.tgz#59906be13fe47c399513360e36b9262410e5a1f2"
- integrity sha512-WfwadC7ZqKOTVqfI4rFANu7IzEgI7H4A/0TiIQihxHpFWdFM23yVuCCIm5zCzQ1QtA2mwBbBZYwOJ0YHVrV6HQ==
- dependencies:
- "@toruslabs/constants" "^13.0.1"
- base64url "^3.0.1"
-
-"@toruslabs/openlogin@^5.2.0":
- version "5.3.0"
- resolved "https://registry.yarnpkg.com/@toruslabs/openlogin/-/openlogin-5.3.0.tgz#4cb28a62bf30b06b7e56a78bf9d7abe01d640560"
- integrity sha512-I6bVBPDlqcnF/11+disyS0kUClJLavYcLi3dBEx2a1mEv18jOy1kuG+FSenDMzF733MCk1Y3Iikox0evPzhpvQ==
- dependencies:
- "@toruslabs/broadcast-channel" "^8.0.0"
- "@toruslabs/eccrypto" "^4.0.0"
- "@toruslabs/metadata-helpers" "^5.0.0"
- "@toruslabs/openlogin-session-manager" "^3.0.0"
- "@toruslabs/openlogin-utils" "^5.3.0"
- bowser "^2.11.0"
- events "^3.3.0"
- loglevel "^1.8.1"
- ts-custom-error "^3.3.1"
-
-"@toruslabs/rss-client@^1.5.0":
- version "1.5.0"
- resolved "https://registry.yarnpkg.com/@toruslabs/rss-client/-/rss-client-1.5.0.tgz#82a02736f671152e1a4c9078194320e2bbc4e49e"
- integrity sha512-7oaRZjmomNoL0+OZMFe8mv3hSeaYWvrxTjuUtkOHybMitStEcEj64tPjWia646BX7AFeqtUCURNdNaQzqfwDMQ==
- dependencies:
- "@toruslabs/eccrypto" "^2.1.1"
- "@toruslabs/http-helpers" "^3.2.0"
- bn.js "^5.2.1"
- elliptic "^6.5.4"
- fetch "^1.1.0"
- loglevel "^1.8.1"
- node-fetch "^2.0.0"
- web3-eth-contract "^1.8.1"
- web3-utils "^1.8.1"
-
-"@toruslabs/torus.js@^11.0.5", "@toruslabs/torus.js@^11.0.6":
- version "11.0.6"
- resolved "https://registry.yarnpkg.com/@toruslabs/torus.js/-/torus.js-11.0.6.tgz#982f28555922e66822b38d265c6f8a38bc094db3"
- integrity sha512-l+Ba/DX1L2cLngiL08r8zZmRQ/A3MJ4pl20MaTzQuwxS2OfOXSReKld4YOWHwo5NEd36PHZdZ43qbh0NrzrwVQ==
- dependencies:
- "@toruslabs/constants" "^13.0.1"
- "@toruslabs/eccrypto" "^4.0.0"
- "@toruslabs/http-helpers" "^5.0.0"
- bn.js "^5.2.1"
- elliptic "^6.5.4"
- ethereum-cryptography "^2.1.2"
- json-stable-stringify "^1.0.2"
- loglevel "^1.8.1"
-
-"@toruslabs/tss-client@^1.7.1":
- version "1.7.1"
- resolved "https://registry.yarnpkg.com/@toruslabs/tss-client/-/tss-client-1.7.1.tgz#018511a75a1ee6094fbe74d2b7be968b92255e97"
- integrity sha512-gaVjXy/eJKv59zdWW2lnAhjumw8DMMGlGHXEOipVywCylKqS8VvQVwwo+UyevR2VXUQsNkBr9deD5TGFH0OQHQ==
- dependencies:
- "@toruslabs/eccrypto" "^4.0.0"
- "@toruslabs/tss-lib" "^1.7.1"
- bn.js "^5.2.1"
- elliptic "^6.5.4"
- keccak256 "^1.0.6"
- socket.io-client "^4.7.2"
+ "@testing-library/dom" "^8.5.0"
+ "@types/react-dom" "^18.0.0"
-"@toruslabs/tss-lib@^1.7.1":
- version "1.7.1"
- resolved "https://registry.yarnpkg.com/@toruslabs/tss-lib/-/tss-lib-1.7.1.tgz#758c62b72b41450de5df90acb42d6c2ba5df0482"
- integrity sha512-kdjBO95cPq4i7RaRMkjUJFH0aiSHrMZV/A4I42oUr0FkBd7e/RYyn1e1QH1pAAyidCIKbMkwqTxgPg4nuHEcDg==
+"@testing-library/user-event@^14.4.2", "@testing-library/user-event@^14.5.2":
+ version "14.5.2"
+ resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-14.5.2.tgz#db7257d727c891905947bd1c1a99da20e03c2ebd"
+ integrity sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==
+
+"@tootallnate/once@2":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf"
+ integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==
"@trezor/analytics@1.0.8":
version "1.0.8"
@@ -6190,33 +5602,6 @@
varuint-bitcoin "^1.1.2"
wif "^2.0.6"
-"@truffle/hdwallet-provider@^2.1.4":
- version "2.1.15"
- resolved "https://registry.yarnpkg.com/@truffle/hdwallet-provider/-/hdwallet-provider-2.1.15.tgz#fbf8e19d112db81b109ebc06ac6d9d42124b512c"
- integrity sha512-I5cSS+5LygA3WFzru9aC5+yDXVowEEbLCx0ckl/RqJ2/SCiYXkzYlR5/DjjDJuCtYhivhrn2RP9AheeFlRF+qw==
- dependencies:
- "@ethereumjs/common" "^2.4.0"
- "@ethereumjs/tx" "^3.3.0"
- "@metamask/eth-sig-util" "4.0.1"
- "@truffle/hdwallet" "^0.1.4"
- "@types/ethereum-protocol" "^1.0.0"
- "@types/web3" "1.0.20"
- "@types/web3-provider-engine" "^14.0.0"
- ethereum-cryptography "1.1.2"
- ethereum-protocol "^1.0.1"
- ethereumjs-util "^7.1.5"
- web3 "1.10.0"
- web3-provider-engine "16.0.3"
-
-"@truffle/hdwallet@^0.1.4":
- version "0.1.4"
- resolved "https://registry.yarnpkg.com/@truffle/hdwallet/-/hdwallet-0.1.4.tgz#eeb21163d9e295692a0ba2fa848cc7b5a29b0ded"
- integrity sha512-D3SN0iw3sMWUXjWAedP6RJtopo9qQXYi80inzbtcsoso4VhxFxCwFvCErCl4b27AEJ9pkAtgnxEFRaSKdMmi1Q==
- dependencies:
- ethereum-cryptography "1.1.2"
- keccak "3.0.2"
- secp256k1 "4.0.3"
-
"@trysound/sax@0.2.0":
version "0.2.0"
resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad"
@@ -6278,13 +5663,6 @@
dependencies:
"@babel/types" "^7.20.7"
-"@types/bn.js@*", "@types/bn.js@^5.1.0", "@types/bn.js@^5.1.1":
- version "5.1.2"
- resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.2.tgz#162f5238c46f4bcbac07a98561724eca1fcf0c5e"
- integrity sha512-dkpZu0szUtn9UXTmw+e0AJFd4D2XAxDnsCLdc05SfqpqzPEBft8eQr8uaFitfo/dUUOZERaLec2hHMG87A4Dxg==
- dependencies:
- "@types/node" "*"
-
"@types/bn.js@5.1.1":
version "5.1.1"
resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.1.tgz#b51e1b55920a4ca26e9285ff79936bbdec910682"
@@ -6299,6 +5677,13 @@
dependencies:
"@types/node" "*"
+"@types/bn.js@^5.1.0", "@types/bn.js@^5.1.1":
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.2.tgz#162f5238c46f4bcbac07a98561724eca1fcf0c5e"
+ integrity sha512-dkpZu0szUtn9UXTmw+e0AJFd4D2XAxDnsCLdc05SfqpqzPEBft8eQr8uaFitfo/dUUOZERaLec2hHMG87A4Dxg==
+ dependencies:
+ "@types/node" "*"
+
"@types/body-parser@*":
version "1.19.5"
resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4"
@@ -6324,13 +5709,6 @@
dependencies:
"@types/node" "*"
-"@types/create-hash@1.2.2":
- version "1.2.2"
- resolved "https://registry.yarnpkg.com/@types/create-hash/-/create-hash-1.2.2.tgz#e87247083df8478f6b83655592bde0d709028235"
- integrity sha512-Fg8/kfMJObbETFU/Tn+Y0jieYewryLrbKwLCEIwPyklZZVY2qB+64KFjhplGSw+cseZosfFXctXO+PyIYD8iZQ==
- dependencies:
- "@types/node" "*"
-
"@types/cross-spawn@^6.0.2":
version "6.0.6"
resolved "https://registry.yarnpkg.com/@types/cross-spawn/-/cross-spawn-6.0.6.tgz#0163d0b79a6f85409e0decb8dcca17147f81fd22"
@@ -6406,13 +5784,6 @@
resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40"
integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==
-"@types/ethereum-protocol@*", "@types/ethereum-protocol@^1.0.0":
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/@types/ethereum-protocol/-/ethereum-protocol-1.0.3.tgz#64a4001b8ef7d3f09e89123feb8c35d04efd00a7"
- integrity sha512-peaCYb+wAT3Gnttt8Ep6+b3ciVK+mWX5wyVnJiDtmWXU1c9RXi5qDxEjGyZrjU/9EYdXPd3hMiXXBjDDPu96yQ==
- dependencies:
- bignumber.js "7.2.1"
-
"@types/express-serve-static-core@^4.17.33":
version "4.19.0"
resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.0.tgz#3ae8ab3767d98d0b682cda063c3339e1e86ccfaa"
@@ -6782,11 +6153,6 @@
resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.4.tgz#2b38784cd16957d3782e8e2b31c03bc1d13b4d65"
integrity sha512-IDaobHimLQhjwsQ/NMwRVfa/yL7L/wriQPMhw1ZJall0KX6E1oxk29XMDeilW5qTIg5aoiqf5Udy8U/51aNoQQ==
-"@types/underscore@*":
- version "1.11.11"
- resolved "https://registry.yarnpkg.com/@types/underscore/-/underscore-1.11.11.tgz#d687e649dd7f3c4045b71f756cd80892d55d3bb1"
- integrity sha512-J/ZgSP9Yv0S+wfUfeRh9ynktcCvycfW4S9NbzkFdiHLBth+Ctdy5nYg3ZAqUKq7v3gcJce6rXo41zJV6IqsXsQ==
-
"@types/unist@*", "@types/unist@^3.0.0":
version "3.0.2"
resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.2.tgz#6dd61e43ef60b34086287f83683a5c1b2dc53d20"
@@ -6807,21 +6173,6 @@
resolved "https://registry.yarnpkg.com/@types/w3c-web-usb/-/w3c-web-usb-1.0.8.tgz#c593fef468b6e6051209c8aa89d1ead08005e23d"
integrity sha512-ouEoUTyB27wFXUUyl0uKIE6VkeCczDtazWTiZGD1M4onceJnp8KnHDf7CzLbpwzek2ZFWXTC5KrNDRc9q/Jf6Q==
-"@types/web3-provider-engine@^14.0.0":
- version "14.0.2"
- resolved "https://registry.yarnpkg.com/@types/web3-provider-engine/-/web3-provider-engine-14.0.2.tgz#ff571f2077abab015616edec3b6437e8dc1f8e40"
- integrity sha512-i+vgIh873kDu6MnYZkIqrho4JCan1c8TcPnYY6te2lq1ODD4SPA8JxFCyQjK+vwbLMr5F3N/I37AfK/wxiyuEA==
- dependencies:
- "@types/ethereum-protocol" "*"
-
-"@types/web3@1.0.20":
- version "1.0.20"
- resolved "https://registry.yarnpkg.com/@types/web3/-/web3-1.0.20.tgz#234dd1f976702c0daaff147c80f24a5582e09d0e"
- integrity sha512-KTDlFuYjzCUlBDGt35Ir5QRtyV9klF84MMKUsEJK10sTWga/71V+8VYLT7yysjuBjaOx2uFYtIWNGoz3yrNDlg==
- dependencies:
- "@types/bn.js" "*"
- "@types/underscore" "*"
-
"@types/web@^0.0.100":
version "0.0.100"
resolved "https://registry.yarnpkg.com/@types/web/-/web-0.0.100.tgz#174f5952c40ab0940b0aa04e76d2f2776005b8c6"
@@ -7089,7 +6440,53 @@
events "^3.3.0"
isomorphic-unfetch "^3.1.0"
-"@walletconnect/core@2.11.2", "@walletconnect/core@2.11.3", "@walletconnect/core@^2.10.1", "@walletconnect/core@^2.11.2":
+"@walletconnect/core@2.11.2":
+ version "2.11.2"
+ resolved "https://registry.yarnpkg.com/@walletconnect/core/-/core-2.11.2.tgz#35286be92c645fa461fecc0dfe25de9f076fca8f"
+ integrity sha512-bB4SiXX8hX3/hyBfVPC5gwZCXCl+OPj+/EDVM71iAO3TDsh78KPbrVAbDnnsbHzZVHlsMohtXX3j5XVsheN3+g==
+ 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.14"
+ "@walletconnect/keyvaluestorage" "^1.1.1"
+ "@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.11.2"
+ "@walletconnect/utils" "2.11.2"
+ events "^3.3.0"
+ isomorphic-unfetch "3.1.0"
+ lodash.isequal "4.5.0"
+ uint8arrays "^3.1.0"
+
+"@walletconnect/core@2.13.1":
+ version "2.13.1"
+ resolved "https://registry.yarnpkg.com/@walletconnect/core/-/core-2.13.1.tgz#a59646e39a5beaa3f3551d129af43cd404cf4faf"
+ integrity sha512-h0MSYKJu9i1VEs5koCTT7c5YeQ1Kj0ncTFiMqANbDnB1r3mBulXn+FKtZ2fCmf1j7KDpgluuUzpSs+sQfPcv4Q==
+ dependencies:
+ "@walletconnect/heartbeat" "1.2.2"
+ "@walletconnect/jsonrpc-provider" "1.0.14"
+ "@walletconnect/jsonrpc-types" "1.0.4"
+ "@walletconnect/jsonrpc-utils" "1.0.8"
+ "@walletconnect/jsonrpc-ws-connection" "1.0.14"
+ "@walletconnect/keyvaluestorage" "1.1.1"
+ "@walletconnect/logger" "2.1.2"
+ "@walletconnect/relay-api" "1.0.10"
+ "@walletconnect/relay-auth" "1.0.4"
+ "@walletconnect/safe-json" "1.0.2"
+ "@walletconnect/time" "1.0.2"
+ "@walletconnect/types" "2.13.1"
+ "@walletconnect/utils" "2.13.1"
+ events "3.3.0"
+ isomorphic-unfetch "3.1.0"
+ lodash.isequal "4.5.0"
+ uint8arrays "3.1.0"
+
+"@walletconnect/core@^2.10.1":
version "2.11.3"
resolved "https://registry.yarnpkg.com/@walletconnect/core/-/core-2.11.3.tgz#c81855722cb9afd411f91f5345c7874f48bade0b"
integrity sha512-/9m4EqiggFUwkQDv5PDWbcTI+yCVnBd/iYW5iIHEkivg2/mnBr2bQz2r/vtPjp19r/ZK62Dx0+UN3U+BWP8ulQ==
@@ -7135,7 +6532,7 @@
"@walletconnect/utils" "2.11.2"
events "^3.3.0"
-"@walletconnect/events@^1.0.1":
+"@walletconnect/events@1.0.1", "@walletconnect/events@^1.0.1":
version "1.0.1"
resolved "https://registry.yarnpkg.com/@walletconnect/events/-/events-1.0.1.tgz#2b5f9c7202019e229d7ccae1369a9e86bda7816c"
integrity sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ==
@@ -7152,6 +6549,15 @@
"@walletconnect/time" "^1.0.2"
tslib "1.14.1"
+"@walletconnect/heartbeat@1.2.2":
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/@walletconnect/heartbeat/-/heartbeat-1.2.2.tgz#e8dc5179db7769950c6f9cf59b23516d9b95227d"
+ integrity sha512-uASiRmC5MwhuRuf05vq4AT48Pq8RMi876zV8rr8cV969uTOzWdB/k+Lj5yI2PBtB1bGQisGen7MM1GcZlQTBXw==
+ dependencies:
+ "@walletconnect/events" "^1.0.1"
+ "@walletconnect/time" "^1.0.2"
+ events "^3.3.0"
+
"@walletconnect/jsonrpc-http-connection@^1.0.7":
version "1.0.7"
resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-http-connection/-/jsonrpc-http-connection-1.0.7.tgz#a6973569b8854c22da707a759d241e4f5c2d5a98"
@@ -7171,6 +6577,15 @@
"@walletconnect/safe-json" "^1.0.2"
tslib "1.14.1"
+"@walletconnect/jsonrpc-provider@1.0.14":
+ version "1.0.14"
+ resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-provider/-/jsonrpc-provider-1.0.14.tgz#696f3e3b6d728b361f2e8b853cfc6afbdf2e4e3e"
+ integrity sha512-rtsNY1XqHvWj0EtITNeuf8PHMvlCLiS3EjQL+WOkxEOA4KPxsohFnBDeyPYiNm4ZvkQdLnece36opYidmtbmow==
+ dependencies:
+ "@walletconnect/jsonrpc-utils" "^1.0.8"
+ "@walletconnect/safe-json" "^1.0.2"
+ events "^3.3.0"
+
"@walletconnect/jsonrpc-types@1.0.3", "@walletconnect/jsonrpc-types@^1.0.2", "@walletconnect/jsonrpc-types@^1.0.3":
version "1.0.3"
resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.3.tgz#65e3b77046f1a7fa8347ae02bc1b841abe6f290c"
@@ -7179,6 +6594,14 @@
keyvaluestorage-interface "^1.0.0"
tslib "1.14.1"
+"@walletconnect/jsonrpc-types@1.0.4":
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.4.tgz#ce1a667d79eadf2a2d9d002c152ceb68739c230c"
+ integrity sha512-P6679fG/M+wuWg9TY8mh6xFSdYnFyFjwFelxyISxMDrlbXokorEVXYOxiqEbrU3x1BmBoCAJJ+vtEaEoMlpCBQ==
+ dependencies:
+ events "^3.3.0"
+ keyvaluestorage-interface "^1.0.0"
+
"@walletconnect/jsonrpc-utils@1.0.8", "@walletconnect/jsonrpc-utils@^1.0.6", "@walletconnect/jsonrpc-utils@^1.0.7", "@walletconnect/jsonrpc-utils@^1.0.8":
version "1.0.8"
resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.8.tgz#82d0cc6a5d6ff0ecc277cb35f71402c91ad48d72"
@@ -7198,7 +6621,7 @@
events "^3.3.0"
ws "^7.5.1"
-"@walletconnect/keyvaluestorage@^1.1.1":
+"@walletconnect/keyvaluestorage@1.1.1", "@walletconnect/keyvaluestorage@^1.1.1":
version "1.1.1"
resolved "https://registry.yarnpkg.com/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.1.1.tgz#dd2caddabfbaf80f6b8993a0704d8b83115a1842"
integrity sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==
@@ -7207,7 +6630,15 @@
idb-keyval "^6.2.1"
unstorage "^1.9.0"
-"@walletconnect/logger@2.0.1", "@walletconnect/logger@^2.0.1":
+"@walletconnect/logger@2.1.2":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/@walletconnect/logger/-/logger-2.1.2.tgz#813c9af61b96323a99f16c10089bfeb525e2a272"
+ integrity sha512-aAb28I3S6pYXZHQm5ESB+V6rDqIYfsnHaQyzFbwUUBFY4H0OXx/YtTl8lvhUNhMMfb9UxbwEBS253TlXUYJWSw==
+ dependencies:
+ "@walletconnect/safe-json" "^1.0.2"
+ pino "7.11.0"
+
+"@walletconnect/logger@^2.0.1":
version "2.0.1"
resolved "https://registry.yarnpkg.com/@walletconnect/logger/-/logger-2.0.1.tgz#7f489b96e9a1ff6bf3e58f0fbd6d69718bf844a8"
integrity sha512-SsTKdsgWm+oDTBeNE/zHxxr5eJfZmE9/5yp/Ku+zJtcTAjELb3DXueWkDXmE9h8uHIbJzIb5wj5lPdzyrjT6hQ==
@@ -7240,6 +6671,13 @@
"@walletconnect/modal-core" "2.6.2"
"@walletconnect/modal-ui" "2.6.2"
+"@walletconnect/relay-api@1.0.10":
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/@walletconnect/relay-api/-/relay-api-1.0.10.tgz#5aef3cd07c21582b968136179aa75849dcc65499"
+ integrity sha512-tqrdd4zU9VBNqUaXXQASaexklv6A54yEyQQEXYOCr+Jz8Ket0dmPBDyg19LVSNUN2cipAghQc45/KVmfFJ0cYw==
+ dependencies:
+ "@walletconnect/jsonrpc-types" "^1.0.2"
+
"@walletconnect/relay-api@^1.0.9":
version "1.0.9"
resolved "https://registry.yarnpkg.com/@walletconnect/relay-api/-/relay-api-1.0.9.tgz#f8c2c3993dddaa9f33ed42197fc9bfebd790ecaf"
@@ -7248,7 +6686,7 @@
"@walletconnect/jsonrpc-types" "^1.0.2"
tslib "1.14.1"
-"@walletconnect/relay-auth@^1.0.4":
+"@walletconnect/relay-auth@1.0.4", "@walletconnect/relay-auth@^1.0.4":
version "1.0.4"
resolved "https://registry.yarnpkg.com/@walletconnect/relay-auth/-/relay-auth-1.0.4.tgz#0b5c55c9aa3b0ef61f526ce679f3ff8a5c4c2c7c"
integrity sha512-kKJcS6+WxYq5kshpPaxGHdwf5y98ZwbfuS4EE/NkQzqrDFm5Cj+dP8LofzWvjrrLkZq7Afy7WrQMXdLy8Sx7HQ==
@@ -7260,7 +6698,7 @@
tslib "1.14.1"
uint8arrays "^3.0.0"
-"@walletconnect/safe-json@^1.0.1", "@walletconnect/safe-json@^1.0.2":
+"@walletconnect/safe-json@1.0.2", "@walletconnect/safe-json@^1.0.1", "@walletconnect/safe-json@^1.0.2":
version "1.0.2"
resolved "https://registry.yarnpkg.com/@walletconnect/safe-json/-/safe-json-1.0.2.tgz#7237e5ca48046e4476154e503c6d3c914126fa77"
integrity sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA==
@@ -7282,22 +6720,22 @@
"@walletconnect/utils" "2.11.2"
events "^3.3.0"
-"@walletconnect/sign-client@2.11.3":
- version "2.11.3"
- resolved "https://registry.yarnpkg.com/@walletconnect/sign-client/-/sign-client-2.11.3.tgz#3ea7b3acf92ee31cc42b45d42e66c44b4720b28b"
- integrity sha512-JVjLTxN/3NjMXv5zalSGKuSYLRyU2yX6AWEdq17cInlrwODpbWZr6PS1uxMWdH4r90DXBLhdtwDbEq/pfd0BPg==
+"@walletconnect/sign-client@2.13.1":
+ version "2.13.1"
+ resolved "https://registry.yarnpkg.com/@walletconnect/sign-client/-/sign-client-2.13.1.tgz#7bdc9226218fd33caf3aef69dff0b4140abc7fa8"
+ integrity sha512-e+dcqcLsedB4ZjnePFM5Cy8oxu0dyz5iZfhfKH/MOrQV/hyhZ+hJwh4MmkO2QyEu2PERKs9o2Uc6x8RZdi0UAQ==
dependencies:
- "@walletconnect/core" "2.11.3"
- "@walletconnect/events" "^1.0.1"
- "@walletconnect/heartbeat" "1.2.1"
+ "@walletconnect/core" "2.13.1"
+ "@walletconnect/events" "1.0.1"
+ "@walletconnect/heartbeat" "1.2.2"
"@walletconnect/jsonrpc-utils" "1.0.8"
- "@walletconnect/logger" "^2.0.1"
- "@walletconnect/time" "^1.0.2"
- "@walletconnect/types" "2.11.3"
- "@walletconnect/utils" "2.11.3"
- events "^3.3.0"
+ "@walletconnect/logger" "2.1.2"
+ "@walletconnect/time" "1.0.2"
+ "@walletconnect/types" "2.13.1"
+ "@walletconnect/utils" "2.13.1"
+ events "3.3.0"
-"@walletconnect/time@^1.0.2":
+"@walletconnect/time@1.0.2", "@walletconnect/time@^1.0.2":
version "1.0.2"
resolved "https://registry.yarnpkg.com/@walletconnect/time/-/time-1.0.2.tgz#6c5888b835750ecb4299d28eecc5e72c6d336523"
integrity sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g==
@@ -7316,7 +6754,7 @@
"@walletconnect/logger" "^2.0.1"
events "^3.3.0"
-"@walletconnect/types@2.11.3", "@walletconnect/types@^2.11.3":
+"@walletconnect/types@2.11.3":
version "2.11.3"
resolved "https://registry.yarnpkg.com/@walletconnect/types/-/types-2.11.3.tgz#8ce43cb77e8fd9d5269847cdd73bcfa7cce7dd1a"
integrity sha512-JY4wA9MVosDW9dcJMTpnwliste0aJGJ1X6Q4ulLsQsgWRSEBRkLila0oUT01TDBW9Yq8uUp7uFOUTaKx6KWVAg==
@@ -7328,10 +6766,17 @@
"@walletconnect/logger" "^2.0.1"
events "^3.3.0"
-"@walletconnect/types@~1.8.0":
- version "1.8.0"
- resolved "https://registry.yarnpkg.com/@walletconnect/types/-/types-1.8.0.tgz#3f5e85b2d6b149337f727ab8a71b8471d8d9a195"
- integrity sha512-Cn+3I0V0vT9ghMuzh1KzZvCkiAxTq+1TR2eSqw5E5AVWfmCtECFkVZBP6uUJZ8YjwLqXheI+rnjqPy7sVM4Fyg==
+"@walletconnect/types@2.13.1", "@walletconnect/types@^2.13.1":
+ version "2.13.1"
+ resolved "https://registry.yarnpkg.com/@walletconnect/types/-/types-2.13.1.tgz#393e3bd4d60a755f3a70cbe769b58cf153450310"
+ integrity sha512-CIrdt66d38xdunGCy5peOOP17EQkCEGKweXc3+Gn/RWeSiRU35I7wjC/Bp4iWcgAQ6iBTZv4jGGST5XyrOp+Pg==
+ dependencies:
+ "@walletconnect/events" "1.0.1"
+ "@walletconnect/heartbeat" "1.2.2"
+ "@walletconnect/jsonrpc-types" "1.0.4"
+ "@walletconnect/keyvaluestorage" "1.1.1"
+ "@walletconnect/logger" "2.1.2"
+ events "3.3.0"
"@walletconnect/universal-provider@2.11.2":
version "2.11.2"
@@ -7368,7 +6813,7 @@
query-string "7.1.3"
uint8arrays "^3.1.0"
-"@walletconnect/utils@2.11.3", "@walletconnect/utils@^2.10.1", "@walletconnect/utils@^2.11.3":
+"@walletconnect/utils@2.11.3", "@walletconnect/utils@^2.10.1":
version "2.11.3"
resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-2.11.3.tgz#3731809b54902655cf202e0bf0e8f268780e8b54"
integrity sha512-jsdNkrl/IcTkzWFn0S2d0urzBXg6RxVJtUYRsUx3qI3wzOGiABP9ui3yiZ3SgZOv9aRe62PaNp1qpbYZ+zPb8Q==
@@ -7388,28 +6833,48 @@
query-string "7.1.3"
uint8arrays "^3.1.0"
-"@walletconnect/web3wallet@^1.10.3":
- version "1.10.3"
- resolved "https://registry.yarnpkg.com/@walletconnect/web3wallet/-/web3wallet-1.10.3.tgz#8195308757bd298ccc9caa6e3fe9f4ff82b94607"
- integrity sha512-1Dr2P8KIDCqEWZ+s4coKGJz/+pj87ogFs+icPDXPu9QpzTgY5Y1WSzuAHaqoY5gTlL7WS58YP49s0E7iacUz4g==
+"@walletconnect/utils@2.13.1", "@walletconnect/utils@^2.13.1":
+ version "2.13.1"
+ resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-2.13.1.tgz#f44e81028754c6e056dba588ad9b9fa5ad047645"
+ integrity sha512-EcooXXlqy5hk9hy/nK2wBF/qxe7HjH0K8ZHzjKkXRkwAE5pCvy0IGXIXWmUR9sw8LFJEqZyd8rZdWLKNUe8hqA==
+ dependencies:
+ "@stablelib/chacha20poly1305" "1.0.1"
+ "@stablelib/hkdf" "1.0.1"
+ "@stablelib/random" "1.0.2"
+ "@stablelib/sha256" "1.0.1"
+ "@stablelib/x25519" "1.0.3"
+ "@walletconnect/relay-api" "1.0.10"
+ "@walletconnect/safe-json" "1.0.2"
+ "@walletconnect/time" "1.0.2"
+ "@walletconnect/types" "2.13.1"
+ "@walletconnect/window-getters" "1.0.1"
+ "@walletconnect/window-metadata" "1.0.1"
+ detect-browser "5.3.0"
+ query-string "7.1.3"
+ uint8arrays "3.1.0"
+
+"@walletconnect/web3wallet@^1.12.1":
+ version "1.12.1"
+ resolved "https://registry.yarnpkg.com/@walletconnect/web3wallet/-/web3wallet-1.12.1.tgz#efe7863c6518b2262bca1ea01650222986963cc4"
+ integrity sha512-34h7UkWjZvZdtCc/t6tZCSBPjDzJbfG1+OPkJ6FiD1KJP+a0wSwuI7l4LliGgvAdsXfrM+sn3ZEWVWy62zeRDA==
dependencies:
"@walletconnect/auth-client" "2.1.2"
- "@walletconnect/core" "2.11.3"
- "@walletconnect/jsonrpc-provider" "1.0.13"
+ "@walletconnect/core" "2.13.1"
+ "@walletconnect/jsonrpc-provider" "1.0.14"
"@walletconnect/jsonrpc-utils" "1.0.8"
- "@walletconnect/logger" "2.0.1"
- "@walletconnect/sign-client" "2.11.3"
- "@walletconnect/types" "2.11.3"
- "@walletconnect/utils" "2.11.3"
+ "@walletconnect/logger" "2.1.2"
+ "@walletconnect/sign-client" "2.13.1"
+ "@walletconnect/types" "2.13.1"
+ "@walletconnect/utils" "2.13.1"
-"@walletconnect/window-getters@^1.0.1":
+"@walletconnect/window-getters@1.0.1", "@walletconnect/window-getters@^1.0.1":
version "1.0.1"
resolved "https://registry.yarnpkg.com/@walletconnect/window-getters/-/window-getters-1.0.1.tgz#f36d1c72558a7f6b87ecc4451fc8bd44f63cbbdc"
integrity sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q==
dependencies:
tslib "1.14.1"
-"@walletconnect/window-metadata@^1.0.1":
+"@walletconnect/window-metadata@1.0.1", "@walletconnect/window-metadata@^1.0.1":
version "1.0.1"
resolved "https://registry.yarnpkg.com/@walletconnect/window-metadata/-/window-metadata-1.0.1.tgz#2124f75447b7e989e4e4e1581d55d25bc75f7be5"
integrity sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA==
@@ -7525,103 +6990,6 @@
joi "17.9.1"
rxjs "^7.5.2"
-"@web3auth-mpc/base-provider@^2.1.9":
- version "2.1.9"
- resolved "https://registry.yarnpkg.com/@web3auth-mpc/base-provider/-/base-provider-2.1.9.tgz#407aca075deb981b5cae80567828526aecf385d7"
- integrity sha512-i3NmTDk8ezaZXz+wtR1O931DBq9cDfyCzYI/XHFHA0zS0iealCSHXXKD6iACByoUuFDBNSq7GdgZCJNcoqWOGw==
- dependencies:
- "@toruslabs/base-controllers" "^2.2.6"
- "@toruslabs/openlogin-jrpc" "^2.6.0"
- "@web3auth-mpc/base" "^2.1.9"
- eth-rpc-errors "^4.0.3"
- json-rpc-random-id "^1.0.1"
-
-"@web3auth-mpc/base@^2.1.9":
- version "2.1.9"
- resolved "https://registry.yarnpkg.com/@web3auth-mpc/base/-/base-2.1.9.tgz#1d1768f5b7c955c5a7e8e71a6590aeee49352604"
- integrity sha512-T91A+1Vu4C3//5Hj94bhMUaerOu3nVwGfELON2FH16yXNPQsNZPwyBuBoROUYdTp4fOZvCG4OtLiw+g8dPncaA==
- dependencies:
- "@toruslabs/http-helpers" "^3.2.0"
- "@toruslabs/openlogin-jrpc" "^2.6.0"
- jwt-decode "^3.1.2"
- loglevel "^1.8.0"
- ts-custom-error "^3.2.2"
-
-"@web3auth-mpc/ethereum-provider@^2.3.0":
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/@web3auth-mpc/ethereum-provider/-/ethereum-provider-2.3.0.tgz#000e83696ee6894879a4a8aaef2fd2df5ae3cc6c"
- integrity sha512-2RY8GPd2UJ04P4Gzjt+Uec00j721LIceSJoHlwhOPGYNPx0QpRsAmwOmMRNLBA5Y+beKrnQ8b8rGDF9wBUaqtA==
- dependencies:
- "@ethereumjs/common" "^3.0.0"
- "@ethereumjs/rlp" "^4.0.0"
- "@ethereumjs/tx" "^4.0.0"
- "@ethereumjs/util" "^8.0.0"
- "@metamask/eth-sig-util" "^5.0.0"
- "@toruslabs/base-controllers" "^2.2.6"
- "@toruslabs/http-helpers" "^3.2.0"
- "@toruslabs/openlogin-jrpc" "^2.6.0"
- "@walletconnect/types" "~1.8.0"
- "@web3auth-mpc/base" "^2.1.9"
- "@web3auth-mpc/base-provider" "^2.1.9"
- assert "^2.0.0"
- bignumber.js "^9.1.0"
- bn.js "^5.2.1"
- eth-rpc-errors "^4.0.3"
- jsonschema "^1.4.1"
-
-"@web3auth/base-provider@^7.0.1":
- version "7.0.4"
- resolved "https://registry.yarnpkg.com/@web3auth/base-provider/-/base-provider-7.0.4.tgz#a0152ae15585e3f51a7bf5b6f9c1d20f55a52625"
- integrity sha512-DDE/K6AP2UBRQqBJUoFggGt7ylQ96pexVnaps9Yw8JOtx573yzVUPs2tYEjhxmAfRGgmDD1J8juokgvCEeKf4g==
- dependencies:
- "@metamask/rpc-errors" "^6.0.0"
- "@toruslabs/base-controllers" "^4.2.0"
- "@toruslabs/openlogin-jrpc" "^5.2.0"
- "@web3auth/base" "^7.0.4"
- json-rpc-random-id "^1.0.1"
-
-"@web3auth/base@^7.0.1", "@web3auth/base@^7.0.4":
- version "7.0.4"
- resolved "https://registry.yarnpkg.com/@web3auth/base/-/base-7.0.4.tgz#93a165486ee991938b87a5fa8fe97da7c58a15b3"
- integrity sha512-ufpJ0uqOp7k7uGqDS1DohOeIIrsTLUAdyiExM5D+SQYYIXri3M9wbFgyCeAqHbJbfBO6hI9PDcY82QvOGCMI3w==
- dependencies:
- "@toruslabs/http-helpers" "^5.0.0"
- "@toruslabs/openlogin" "^5.2.0"
- "@toruslabs/openlogin-jrpc" "^5.2.0"
- "@toruslabs/openlogin-utils" "^5.2.0"
- jwt-decode "^3.1.2"
- loglevel "^1.8.1"
- ts-custom-error "^3.3.1"
-
-"@web3auth/mpc-core-kit@^1.1.3":
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/@web3auth/mpc-core-kit/-/mpc-core-kit-1.1.3.tgz#01c508157f11d5a6685fa578bb873f40678fa403"
- integrity sha512-wpbrBDBxZ8vi7oY3zL3BEktKuwfs5miMga4R7qmc12k79gNJa8S6FvZQ38wZkwNJyrRb0iFQ1kOWR0NOteeMyg==
- dependencies:
- "@tkey-mpc/chrome-storage" "^9.0.2"
- "@tkey-mpc/common-types" "^9.0.2"
- "@tkey-mpc/core" "^9.0.2"
- "@tkey-mpc/security-questions" "^9.0.2"
- "@tkey-mpc/service-provider-torus" "^9.0.3"
- "@tkey-mpc/share-serialization" "^9.0.2"
- "@tkey-mpc/storage-layer-torus" "^9.0.2"
- "@toruslabs/constants" "^13.0.1"
- "@toruslabs/customauth" "^16.0.6"
- "@toruslabs/eccrypto" "4.0.0"
- "@toruslabs/fetch-node-details" "^13.0.1"
- "@toruslabs/fnd-base" "^13.0.1"
- "@toruslabs/metadata-helpers" "^5.x"
- "@toruslabs/openlogin-session-manager" "^3.0.0"
- "@toruslabs/torus.js" "^11.0.6"
- "@toruslabs/tss-client" "^1.7.1"
- "@toruslabs/tss-lib" "^1.7.1"
- "@web3auth-mpc/ethereum-provider" "^2.3.0"
- "@web3auth/base" "^7.0.1"
- "@web3auth/base-provider" "^7.0.1"
- bn.js "^5.2.1"
- bowser "^2.11.0"
- elliptic "^6.5.4"
-
"@webassemblyjs/ast@1.12.1", "@webassemblyjs/ast@^1.12.1":
version "1.12.1"
resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.12.1.tgz#bb16a0e8b1914f979f45864c23819cc3e3f0d4bb"
@@ -7794,10 +7162,10 @@ abab@^2.0.6:
resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291"
integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==
-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==
+abitype@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.0.tgz#237176dace81d90d018bebf3a45cb42f2a2d9e97"
+ integrity sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ==
abort-controller@^3.0.0:
version "3.0.0"
@@ -7806,25 +7174,11 @@ abort-controller@^3.0.0:
dependencies:
event-target-shim "^5.0.0"
-abortcontroller-polyfill@^1.7.3, abortcontroller-polyfill@^1.7.5:
+abortcontroller-polyfill@^1.7.5:
version "1.7.5"
resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz#6738495f4e901fbb57b6c0611d0c75f76c485bed"
integrity sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==
-abstract-leveldown@~2.6.0:
- version "2.6.3"
- resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz#1c5e8c6a5ef965ae8c35dfb3a8770c476b82c4b8"
- integrity sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA==
- dependencies:
- xtend "~4.0.0"
-
-abstract-leveldown@~2.7.1:
- version "2.7.2"
- resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz#87a44d7ebebc341d59665204834c8b7e0932cc93"
- integrity sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w==
- dependencies:
- xtend "~4.0.0"
-
accepts@~1.3.5, accepts@~1.3.8:
version "1.3.8"
resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e"
@@ -8232,13 +7586,6 @@ astral-regex@^2.0.0:
resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31"
integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==
-async-eventemitter@^0.2.2:
- version "0.2.4"
- resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca"
- integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==
- dependencies:
- async "^2.4.0"
-
async-limiter@~1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd"
@@ -8251,25 +7598,6 @@ async-mutex@^0.2.6:
dependencies:
tslib "^2.0.0"
-async-mutex@^0.4.0:
- version "0.4.0"
- resolved "https://registry.yarnpkg.com/async-mutex/-/async-mutex-0.4.0.tgz#ae8048cd4d04ace94347507504b3cf15e631c25f"
- integrity sha512-eJFZ1YhRR8UN8eBLoNzcDPcy/jqjsg6I1AP+KvWQX80BqOSW1oJPJXDylPUEeMr2ZQvHgnQ//Lp6f3RQ1zI7HA==
- dependencies:
- tslib "^2.4.0"
-
-async@^1.4.2:
- version "1.5.2"
- resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
- integrity sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==
-
-async@^2.0.1, async@^2.1.2, async@^2.4.0, async@^2.5.0:
- version "2.6.4"
- resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221"
- integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==
- dependencies:
- lodash "^4.17.14"
-
async@^3.2.0, async@^3.2.3:
version "3.2.4"
resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c"
@@ -8458,13 +7786,6 @@ babel-preset-jest@^29.6.3:
babel-plugin-jest-hoist "^29.6.3"
babel-preset-current-node-syntax "^1.0.0"
-backoff@^2.5.0:
- version "2.5.0"
- resolved "https://registry.yarnpkg.com/backoff/-/backoff-2.5.0.tgz#f616eda9d3e4b66b8ca7fca79f695722c5f8e26f"
- integrity sha512-wC5ihrnUXmR2douXmXLCe5O3zg3GKIyvRi/hi58a/XyRxVI+3/yM0PYueQOZXPXQ9pxBislYkw+sF9b7C/RuMA==
- dependencies:
- precond "0.2"
-
balanced-match@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
@@ -8518,11 +7839,6 @@ base64-js@^1.3.1:
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
-base64url@3.0.1, base64url@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/base64url/-/base64url-3.0.1.tgz#6399d572e2bc3f90a9a8b22d5dbb0a32d33f788d"
- integrity sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==
-
bchaddrjs@^0.5.2:
version "0.5.2"
resolved "https://registry.yarnpkg.com/bchaddrjs/-/bchaddrjs-0.5.2.tgz#1f52b5077329774e7c82d4882964628106bb11a0"
@@ -8579,11 +7895,6 @@ bigint-buffer@^1.1.5:
dependencies:
bindings "^1.3.0"
-bignumber.js@7.2.1:
- version "7.2.1"
- resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-7.2.1.tgz#80c048759d826800807c4bfd521e50edbba57a5f"
- integrity sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==
-
bignumber.js@^9.0.0, bignumber.js@^9.0.1, bignumber.js@^9.1.0, bignumber.js@^9.1.1, bignumber.js@^9.1.2:
version "9.1.2"
resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c"
@@ -8613,13 +7924,6 @@ bip66@^1.1.5:
dependencies:
safe-buffer "^5.0.1"
-biskviit@1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/biskviit/-/biskviit-1.0.1.tgz#037a0cd4b71b9e331fd90a1122de17dc49e420a7"
- integrity sha512-VGCXdHbdbpEkFgtjkeoBN8vRlbj1ZRX2/mxhE8asCCRalUx2nBzOomLJv8Aw/nRt5+ccDb+tPKidg4XxcfGW4w==
- dependencies:
- psl "^1.1.7"
-
bitcoin-ops@^1.3.0, bitcoin-ops@^1.4.1:
version "1.4.1"
resolved "https://registry.yarnpkg.com/bitcoin-ops/-/bitcoin-ops-1.4.1.tgz#e45de620398e22fd4ca6023de43974ff42240278"
@@ -8677,7 +7981,7 @@ bn.js@4.11.6:
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215"
integrity sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==
-bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.0, bn.js@^4.11.6, bn.js@^4.11.8, bn.js@^4.11.9, bn.js@^4.12.0:
+bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.0, bn.js@^4.11.6, bn.js@^4.11.8, bn.js@^4.11.9:
version "4.12.0"
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88"
integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==
@@ -8890,11 +8194,6 @@ bser@2.1.1:
dependencies:
node-int64 "^0.4.0"
-btoa@^1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/btoa/-/btoa-1.2.1.tgz#01a9909f8b2c93f6bf680ba26131eb30f7fa3d73"
- integrity sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==
-
buffer-crc32@~0.2.3:
version "0.2.13"
resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
@@ -9130,13 +8429,6 @@ check-more-types@^2.24.0:
resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600"
integrity sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==
-checkpoint-store@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/checkpoint-store/-/checkpoint-store-1.1.0.tgz#04e4cb516b91433893581e6d4601a78e9552ea06"
- integrity sha512-J/NdY2WvIx654cc6LWSq/IYFFCUf75fFTgwzFnmbqyORH4MwgiQCgswLLKBGzmsyTI5V7i5bp/So6sMbDWhedg==
- dependencies:
- functional-red-black-tree "^1.0.1"
-
"chokidar@>=3.0.0 <4.0.0", chokidar@^3.5.3, chokidar@^3.6.0:
version "3.6.0"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b"
@@ -9340,11 +8632,6 @@ clone@^1.0.2:
resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==
-clone@^2.0.0, clone@^2.1.1:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f"
- integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==
-
clsx@^1.1.0, clsx@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12"
@@ -9689,14 +8976,6 @@ cross-env@^7.0.3:
dependencies:
cross-spawn "^7.0.1"
-cross-fetch@^2.1.0:
- version "2.2.6"
- resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-2.2.6.tgz#2ef0bb39a24ac034787965c457368a28730e220a"
- integrity sha512-9JZz+vXCmfKUZ68zAptS7k4Nu8e2qcibe7WVZYps7sAgk5R8GYTc+T1WR0v1rlP9HxgARmOX1UTIJZFytajpNA==
- dependencies:
- node-fetch "^2.6.7"
- whatwg-fetch "^2.0.4"
-
cross-fetch@^3.1.4, cross-fetch@^3.1.5, cross-fetch@^3.1.6:
version "3.1.8"
resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82"
@@ -9931,7 +9210,7 @@ debug@2.6.9, debug@^2.2.0:
dependencies:
ms "2.0.0"
-debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2:
+debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4:
version "4.3.4"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
@@ -10058,13 +9337,6 @@ defer-to-connect@^2.0.0, defer-to-connect@^2.0.1:
resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587"
integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==
-deferred-leveldown@~1.2.1:
- version "1.2.2"
- resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz#3acd2e0b75d1669924bc0a4b642851131173e1eb"
- integrity sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA==
- dependencies:
- abstract-leveldown "~2.6.0"
-
define-data-property@^1.0.1, define-data-property@^1.1.2:
version "1.1.4"
resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e"
@@ -10486,14 +9758,7 @@ encodeurl@~1.0.2:
resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==
-encoding@0.1.12:
- version "0.1.12"
- resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb"
- integrity sha512-bl1LAgiQc4ZWr++pNYUdRe/alecaHFeHxIJ/pNciqGdKXghaTCOwKkbKp6ye7pKZGu/GcaSXFk8PBVhgs+dJdA==
- dependencies:
- iconv-lite "~0.4.13"
-
-end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1, end-of-stream@^1.4.4:
+end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1:
version "1.4.4"
resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
@@ -10509,22 +9774,6 @@ endent@^2.0.1:
fast-json-parse "^1.0.3"
objectorarray "^1.0.5"
-engine.io-client@~6.5.2:
- version "6.5.2"
- resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-6.5.2.tgz#8709e22c291d4297ae80318d3c8baeae71f0e002"
- integrity sha512-CQZqbrpEYnrpGqC07a9dJDz4gePZUgTPMU3NKJPSeQOyw27Tst4Pl3FemKoFGAlHzgZmKjoRmiJvbWfhCXUlIg==
- dependencies:
- "@socket.io/component-emitter" "~3.1.0"
- debug "~4.3.1"
- engine.io-parser "~5.2.1"
- ws "~8.11.0"
- xmlhttprequest-ssl "~2.0.0"
-
-engine.io-parser@~5.2.1:
- version "5.2.1"
- resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.1.tgz#9f213c77512ff1a6cc0c7a86108a7ffceb16fcfb"
- integrity sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==
-
enhanced-resolve@^5.12.0, enhanced-resolve@^5.16.0, enhanced-resolve@^5.7.0:
version "5.16.0"
resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz#65ec88778083056cb32487faa9aef82ed0864787"
@@ -10561,7 +9810,7 @@ err-code@^3.0.0, err-code@^3.0.1:
resolved "https://registry.yarnpkg.com/err-code/-/err-code-3.0.1.tgz#a444c7b992705f2b120ee320b09972eef331c920"
integrity sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==
-errno@^0.1.1, errno@~0.1.1:
+errno@^0.1.1:
version "0.1.8"
resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f"
integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==
@@ -11160,18 +10409,6 @@ eth-block-tracker@6.1.0:
json-rpc-random-id "^1.0.1"
pify "^3.0.0"
-eth-block-tracker@^4.4.2:
- version "4.4.3"
- resolved "https://registry.yarnpkg.com/eth-block-tracker/-/eth-block-tracker-4.4.3.tgz#766a0a0eb4a52c867a28328e9ae21353812cf626"
- integrity sha512-A8tG4Z4iNg4mw5tP1Vung9N9IjgMNqpiMoJ/FouSFwNCGHv2X0mmOYwtQOJzki6XN7r7Tyo01S29p7b224I4jw==
- dependencies:
- "@babel/plugin-transform-runtime" "^7.5.5"
- "@babel/runtime" "^7.5.5"
- eth-query "^2.1.0"
- json-rpc-random-id "^1.0.1"
- pify "^3.0.0"
- safe-event-emitter "^1.0.1"
-
eth-crypto@^2.1.0:
version "2.6.0"
resolved "https://registry.yarnpkg.com/eth-crypto/-/eth-crypto-2.6.0.tgz#b777f367ae8c70e5917b3b7d52adab6b34841e29"
@@ -11204,45 +10441,6 @@ eth-json-rpc-filters@5.1.0:
json-rpc-engine "^6.1.0"
pify "^5.0.0"
-eth-json-rpc-filters@^4.2.1:
- version "4.2.2"
- resolved "https://registry.yarnpkg.com/eth-json-rpc-filters/-/eth-json-rpc-filters-4.2.2.tgz#eb35e1dfe9357ace8a8908e7daee80b2cd60a10d"
- integrity sha512-DGtqpLU7bBg63wPMWg1sCpkKCf57dJ+hj/k3zF26anXMzkmtSBDExL8IhUu7LUd34f0Zsce3PYNO2vV2GaTzaw==
- dependencies:
- "@metamask/safe-event-emitter" "^2.0.0"
- async-mutex "^0.2.6"
- eth-json-rpc-middleware "^6.0.0"
- eth-query "^2.1.2"
- json-rpc-engine "^6.1.0"
- pify "^5.0.0"
-
-eth-json-rpc-infura@^5.1.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/eth-json-rpc-infura/-/eth-json-rpc-infura-5.1.0.tgz#e6da7dc47402ce64c54e7018170d89433c4e8fb6"
- integrity sha512-THzLye3PHUSGn1EXMhg6WTLW9uim7LQZKeKaeYsS9+wOBcamRiCQVGHa6D2/4P0oS0vSaxsBnU/J6qvn0MPdow==
- dependencies:
- eth-json-rpc-middleware "^6.0.0"
- eth-rpc-errors "^3.0.0"
- json-rpc-engine "^5.3.0"
- node-fetch "^2.6.0"
-
-eth-json-rpc-middleware@^6.0.0:
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/eth-json-rpc-middleware/-/eth-json-rpc-middleware-6.0.0.tgz#4fe16928b34231a2537856f08a5ebbc3d0c31175"
- integrity sha512-qqBfLU2Uq1Ou15Wox1s+NX05S9OcAEL4JZ04VZox2NS0U+RtCMjSxzXhLFWekdShUPZ+P8ax3zCO2xcPrp6XJQ==
- dependencies:
- btoa "^1.2.1"
- clone "^2.1.1"
- eth-query "^2.1.2"
- eth-rpc-errors "^3.0.0"
- eth-sig-util "^1.4.2"
- ethereumjs-util "^5.1.2"
- json-rpc-engine "^5.3.0"
- json-stable-stringify "^1.0.1"
- node-fetch "^2.6.1"
- pify "^3.0.0"
- safe-event-emitter "^1.0.1"
-
eth-lib@0.2.8:
version "0.2.8"
resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.2.8.tgz#b194058bef4b220ad12ea497431d6cb6aa0623c8"
@@ -11264,7 +10462,7 @@ eth-lib@^0.1.26:
ws "^3.0.0"
xhr-request-promise "^0.1.2"
-eth-query@^2.1.0, eth-query@^2.1.2:
+eth-query@^2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/eth-query/-/eth-query-2.1.2.tgz#d6741d9000106b51510c72db92d6365456a6da5e"
integrity sha512-srES0ZcvwkR/wd5OQBRA1bIJMww1skfGS0s8wlwK3/oNP4+wnds60krvu5R1QbpRQjMmpG5OMIWro5s7gvDPsA==
@@ -11279,28 +10477,13 @@ eth-rpc-errors@4.0.2:
dependencies:
fast-safe-stringify "^2.0.6"
-eth-rpc-errors@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/eth-rpc-errors/-/eth-rpc-errors-3.0.0.tgz#d7b22653c70dbf9defd4ef490fd08fe70608ca10"
- integrity sha512-iPPNHPrLwUlR9xCSYm7HHQjWBasor3+KZfRvwEWxMz3ca0yqnlBeJrnyphkGIXZ4J7AMAaOLmwy4AWhnxOiLxg==
- dependencies:
- fast-safe-stringify "^2.0.6"
-
-eth-rpc-errors@^4.0.2, eth-rpc-errors@^4.0.3:
+eth-rpc-errors@^4.0.2:
version "4.0.3"
resolved "https://registry.yarnpkg.com/eth-rpc-errors/-/eth-rpc-errors-4.0.3.tgz#6ddb6190a4bf360afda82790bb7d9d5e724f423a"
integrity sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg==
dependencies:
fast-safe-stringify "^2.0.6"
-eth-sig-util@^1.4.2:
- version "1.4.2"
- resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-1.4.2.tgz#8d958202c7edbaae839707fba6f09ff327606210"
- integrity sha512-iNZ576iTOGcfllftB73cPB5AN+XUQAT/T8xzsILsghXC1o8gJUqe3RHlcDqagu+biFpYQ61KQrZZJza8eRSYqw==
- dependencies:
- ethereumjs-abi "git+https://github.com/ethereumjs/ethereumjs-abi.git"
- ethereumjs-util "^5.1.1"
-
ethereum-bloom-filters@^1.0.6:
version "1.0.10"
resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz#3ca07f4aed698e75bd134584850260246a5fed8a"
@@ -11308,26 +10491,6 @@ ethereum-bloom-filters@^1.0.6:
dependencies:
js-sha3 "^0.8.0"
-ethereum-common@0.2.0:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.2.0.tgz#13bf966131cce1eeade62a1b434249bb4cb120ca"
- integrity sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA==
-
-ethereum-common@^0.0.18:
- version "0.0.18"
- resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.0.18.tgz#2fdc3576f232903358976eb39da783213ff9523f"
- integrity sha512-EoltVQTRNg2Uy4o84qpa2aXymXDJhxm7eos/ACOg0DG4baAbMjhbdAEsx9GeE8sC3XCxnYvrrzZDH8D8MtA2iQ==
-
-ethereum-cryptography@1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-1.1.2.tgz#74f2ac0f0f5fe79f012c889b3b8446a9a6264e6d"
- integrity sha512-XDSJlg4BD+hq9N2FjvotwUET9Tfxpxc3kWGE2AqUG5vcbeunnbImVk3cj6e/xT3phdW21mE8R5IugU4fspQDcQ==
- dependencies:
- "@noble/hashes" "1.1.2"
- "@noble/secp256k1" "1.6.3"
- "@scure/bip32" "1.1.0"
- "@scure/bip39" "1.1.0"
-
ethereum-cryptography@^0.1.3:
version "0.1.3"
resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191"
@@ -11351,87 +10514,23 @@ ethereum-cryptography@^0.1.3:
ethereum-cryptography@^2.0.0, ethereum-cryptography@^2.1.2:
version "2.1.2"
- resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-2.1.2.tgz#18fa7108622e56481157a5cb7c01c0c6a672eb67"
- integrity sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug==
- dependencies:
- "@noble/curves" "1.1.0"
- "@noble/hashes" "1.3.1"
- "@scure/bip32" "1.3.1"
- "@scure/bip39" "1.2.1"
-
-ethereum-protocol@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/ethereum-protocol/-/ethereum-protocol-1.0.1.tgz#b7d68142f4105e0ae7b5e178cf42f8d4dc4b93cf"
- integrity sha512-3KLX1mHuEsBW0dKG+c6EOJS1NBNqdCICvZW9sInmZTt5aY0oxmHVggYRE0lJu1tcnMD1K+AKHdLi6U43Awm1Vg==
-
-ethereumjs-abi@^0.6.8:
- version "0.6.8"
- resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae"
- integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==
- dependencies:
- bn.js "^4.11.8"
- ethereumjs-util "^6.0.0"
-
-"ethereumjs-abi@git+https://github.com/ethereumjs/ethereumjs-abi.git":
- version "0.6.8"
- resolved "git+https://github.com/ethereumjs/ethereumjs-abi.git#ee3994657fa7a427238e6ba92a84d0b529bbcde0"
- dependencies:
- bn.js "^4.11.8"
- ethereumjs-util "^6.0.0"
-
-ethereumjs-account@^2.0.3:
- version "2.0.5"
- resolved "https://registry.yarnpkg.com/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz#eeafc62de544cb07b0ee44b10f572c9c49e00a84"
- integrity sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA==
- dependencies:
- ethereumjs-util "^5.0.0"
- rlp "^2.0.0"
- safe-buffer "^5.1.1"
-
-ethereumjs-block@^1.2.2:
- version "1.7.1"
- resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz#78b88e6cc56de29a6b4884ee75379b6860333c3f"
- integrity sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg==
- dependencies:
- async "^2.0.1"
- ethereum-common "0.2.0"
- ethereumjs-tx "^1.2.2"
- ethereumjs-util "^5.0.0"
- merkle-patricia-tree "^2.1.2"
-
-ethereumjs-block@~2.2.0:
- version "2.2.2"
- resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz#c7654be7e22df489fda206139ecd63e2e9c04965"
- integrity sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg==
- dependencies:
- async "^2.0.1"
- ethereumjs-common "^1.5.0"
- ethereumjs-tx "^2.1.1"
- ethereumjs-util "^5.0.0"
- merkle-patricia-tree "^2.1.2"
-
-ethereumjs-common@^1.1.0, ethereumjs-common@^1.5.0:
- version "1.5.2"
- resolved "https://registry.yarnpkg.com/ethereumjs-common/-/ethereumjs-common-1.5.2.tgz#2065dbe9214e850f2e955a80e650cb6999066979"
- integrity sha512-hTfZjwGX52GS2jcVO6E2sx4YuFnf0Fhp5ylo4pEPhEffNln7vS59Hr5sLnp3/QCazFLluuBZ+FZ6J5HTp0EqCA==
-
-ethereumjs-tx@^1.2.2:
- version "1.3.7"
- resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz#88323a2d875b10549b8347e09f4862b546f3d89a"
- integrity sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA==
+ resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-2.1.2.tgz#18fa7108622e56481157a5cb7c01c0c6a672eb67"
+ integrity sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug==
dependencies:
- ethereum-common "^0.0.18"
- ethereumjs-util "^5.0.0"
+ "@noble/curves" "1.1.0"
+ "@noble/hashes" "1.3.1"
+ "@scure/bip32" "1.3.1"
+ "@scure/bip39" "1.2.1"
-ethereumjs-tx@^2.1.1:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz#5dfe7688bf177b45c9a23f86cf9104d47ea35fed"
- integrity sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==
+ethereumjs-abi@^0.6.8:
+ version "0.6.8"
+ resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae"
+ integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==
dependencies:
- ethereumjs-common "^1.5.0"
+ bn.js "^4.11.8"
ethereumjs-util "^6.0.0"
-ethereumjs-util@7.1.5, ethereumjs-util@^7.0.7, ethereumjs-util@^7.0.8, ethereumjs-util@^7.1.0, ethereumjs-util@^7.1.1, ethereumjs-util@^7.1.2, ethereumjs-util@^7.1.3, ethereumjs-util@^7.1.4, ethereumjs-util@^7.1.5:
+ethereumjs-util@7.1.5, ethereumjs-util@^7.0.7, ethereumjs-util@^7.0.8, ethereumjs-util@^7.1.3, ethereumjs-util@^7.1.4, ethereumjs-util@^7.1.5:
version "7.1.5"
resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181"
integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==
@@ -11442,19 +10541,6 @@ ethereumjs-util@7.1.5, ethereumjs-util@^7.0.7, ethereumjs-util@^7.0.8, ethereumj
ethereum-cryptography "^0.1.3"
rlp "^2.2.4"
-ethereumjs-util@^5.0.0, ethereumjs-util@^5.1.1, ethereumjs-util@^5.1.2, ethereumjs-util@^5.1.5:
- version "5.2.1"
- resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz#a833f0e5fca7e5b361384dc76301a721f537bf65"
- integrity sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==
- dependencies:
- bn.js "^4.11.0"
- create-hash "^1.1.2"
- elliptic "^6.5.2"
- ethereum-cryptography "^0.1.3"
- ethjs-util "^0.1.3"
- rlp "^2.0.0"
- safe-buffer "^5.1.1"
-
ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.1:
version "6.2.1"
resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69"
@@ -11468,23 +10554,6 @@ ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.1:
ethjs-util "0.1.6"
rlp "^2.2.3"
-ethereumjs-vm@^2.3.4:
- version "2.6.0"
- resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz#76243ed8de031b408793ac33907fb3407fe400c6"
- integrity sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw==
- dependencies:
- async "^2.1.2"
- async-eventemitter "^0.2.2"
- ethereumjs-account "^2.0.3"
- ethereumjs-block "~2.2.0"
- ethereumjs-common "^1.1.0"
- ethereumjs-util "^6.0.0"
- fake-merkle-patricia-tree "^1.0.1"
- functional-red-black-tree "^1.0.1"
- merkle-patricia-tree "^2.3.2"
- rustbn.js "~0.2.0"
- safe-buffer "^5.1.1"
-
ethers@5.5.3:
version "5.5.3"
resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.5.3.tgz#1e361516711c0c3244b6210e7e3ecabf0c75fca0"
@@ -11614,7 +10683,7 @@ ethjs-unit@0.1.6:
bn.js "4.11.6"
number-to-bn "1.7.0"
-ethjs-util@0.1.6, ethjs-util@^0.1.3, ethjs-util@^0.1.6:
+ethjs-util@0.1.6, ethjs-util@^0.1.6:
version "0.1.6"
resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536"
integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==
@@ -11650,7 +10719,7 @@ eventemitter3@^4.0.7:
resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f"
integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==
-events@^3.0.0, events@^3.2.0, events@^3.3.0:
+events@3.3.0, events@^3.2.0, events@^3.3.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
@@ -11828,13 +10897,6 @@ fake-indexeddb@^4.0.2:
dependencies:
realistic-structured-clone "^3.0.0"
-fake-merkle-patricia-tree@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/fake-merkle-patricia-tree/-/fake-merkle-patricia-tree-1.0.1.tgz#4b8c3acfb520afadf9860b1f14cd8ce3402cddd3"
- integrity sha512-Tgq37lkc9pUIgIKw5uitNUKcgcYL3R6JvXtKQbOf/ZSavXbidsksgp/pAY6p//uhw0I4yoMsvTSovvVIsk/qxA==
- dependencies:
- checkpoint-store "^1.1.0"
-
fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
version "3.1.3"
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
@@ -11881,7 +10943,7 @@ fast-redact@^3.0.0:
resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.3.0.tgz#7c83ce3a7be4898241a46560d51de10f653f7634"
integrity sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==
-fast-safe-stringify@^2.0.6, fast-safe-stringify@^2.1.1:
+fast-safe-stringify@^2.0.6:
version "2.1.1"
resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884"
integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==
@@ -11924,14 +10986,6 @@ fetch-retry@^5.0.2:
resolved "https://registry.yarnpkg.com/fetch-retry/-/fetch-retry-5.0.6.tgz#17d0bc90423405b7a88b74355bf364acd2a7fa56"
integrity sha512-3yurQZ2hD9VISAhJJP9bpYFNQrHHBXE2JxxjY5aLEcDi46RmAzJE2OC9FAde0yis5ElW0jTTzs0zfg/Cca4XqQ==
-fetch@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/fetch/-/fetch-1.1.0.tgz#0a8279f06be37f9f0ebb567560a30a480da59a2e"
- integrity sha512-5O8TwrGzoNblBG/jtK4NFuZwNCkZX6s5GfRNOaGtm+QGJEuNakSC/i2RW0R93KX6E0jVjNXm6O3CRN4Ql3K+yA==
- dependencies:
- biskviit "1.0.1"
- encoding "0.1.12"
-
figures@^3.2.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af"
@@ -12206,15 +11260,6 @@ forwarded@0.2.0:
resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==
-framer-motion@^10.13.1:
- version "10.16.4"
- resolved "https://registry.yarnpkg.com/framer-motion/-/framer-motion-10.16.4.tgz#30279ef5499b8d85db3a298ee25c83429933e9f8"
- integrity sha512-p9V9nGomS3m6/CALXqv6nFGMuFOxbWsmaOrdmhyQimMIlLl3LC7h7l86wge/Js/8cRu5ktutS/zlzgR7eBOtFA==
- dependencies:
- tslib "^2.4.0"
- optionalDependencies:
- "@emotion/is-prop-valid" "^0.8.2"
-
fresh@0.5.2:
version "0.5.2"
resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
@@ -12324,11 +11369,6 @@ function.prototype.name@^1.1.5, function.prototype.name@^1.1.6:
es-abstract "^1.22.1"
functions-have-names "^1.2.3"
-functional-red-black-tree@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
- integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==
-
functions-have-names@^1.2.3:
version "1.2.3"
resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834"
@@ -13033,7 +12073,7 @@ husky@^9.0.11:
resolved "https://registry.yarnpkg.com/husky/-/husky-9.0.11.tgz#fc91df4c756050de41b3e478b2158b87c1e79af9"
integrity sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==
-iconv-lite@0.4.24, iconv-lite@~0.4.13:
+iconv-lite@0.4.24:
version "0.4.24"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
@@ -13096,11 +12136,6 @@ image-size@~0.5.0:
resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c"
integrity sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==
-immediate@^3.2.3:
- version "3.3.0"
- resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.3.0.tgz#1aef225517836bcdf7f2a2de2600c79ff0269266"
- integrity sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==
-
immer@^9.0.21:
version "9.0.21"
resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.21.tgz#1e025ea31a40f24fb064f1fef23e931496330176"
@@ -13387,11 +12422,6 @@ is-finalizationregistry@^1.0.2:
dependencies:
call-bind "^1.0.2"
-is-fn@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/is-fn/-/is-fn-1.0.0.tgz#9543d5de7bcf5b08a22ec8a20bae6e286d510d8c"
- integrity sha512-XoFPJQmsAShb3jEQRfzf2rqXavq7fIqF/jOekp308JlThqrODnMpweVSGilKTCXELfLhltGP2AGgbQGVP8F1dg==
-
is-fullwidth-code-point@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
@@ -13676,10 +12706,10 @@ isomorphic-ws@^4.0.1:
resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc"
integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==
-isows@1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/isows/-/isows-1.0.3.tgz#93c1cf0575daf56e7120bab5c8c448b0809d0d74"
- integrity sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg==
+isows@1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/isows/-/isows-1.0.4.tgz#810cd0d90cc4995c26395d2aa4cfa4037ebdf061"
+ integrity sha512-hEzjY+x9u9hPmBom9IIAqdJCwNLax+xrPb51vEPpERoFlIxgmZcHzsT5jKG06nvInKOBGvReAVz80Umed5CczQ==
isstream@~0.1.2:
version "0.1.2"
@@ -14346,14 +13376,6 @@ json-rpc-engine@6.1.0, json-rpc-engine@^6.1.0:
"@metamask/safe-event-emitter" "^2.0.0"
eth-rpc-errors "^4.0.2"
-json-rpc-engine@^5.3.0:
- version "5.4.0"
- resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-5.4.0.tgz#75758609d849e1dba1e09021ae473f3ab63161e5"
- integrity sha512-rAffKbPoNDjuRnXkecTjnsE3xLLrb00rEkdgalINhaYVYIxDwWtvYBr9UFbhTvPB1B2qUOLoFd/cV6f4Q7mh7g==
- dependencies:
- eth-rpc-errors "^3.0.0"
- safe-event-emitter "^1.0.1"
-
json-rpc-random-id@^1.0.0, json-rpc-random-id@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz#ba49d96aded1444dbb8da3d203748acbbcdec8c8"
@@ -14379,7 +13401,7 @@ json-stable-stringify-without-jsonify@^1.0.1:
resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==
-json-stable-stringify@^1.0.1, json-stable-stringify@^1.0.2:
+json-stable-stringify@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.2.tgz#e06f23128e0bbe342dc996ed5a19e28b57b580e0"
integrity sha512-eunSSaEnxV12z+Z73y/j5N37/In40GK4GmsSy+tEHJMxknvqnA7/djeYtAgW0GsWHUfg+847WJjKaEylk2y09g==
@@ -14449,11 +13471,6 @@ jsonschema@1.2.2:
resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.2.2.tgz#83ab9c63d65bf4d596f91d81195e78772f6452bc"
integrity sha512-iX5OFQ6yx9NgbHCwse51ohhKgLuLL7Z5cNOeZOPIlDUtAMrxlruHLzVZxbltdHE5mEDXN+75oFOwq6Gn0MZwsA==
-jsonschema@^1.4.1:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.1.tgz#cc4c3f0077fb4542982973d8a083b6b34f482dab"
- integrity sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==
-
jsprim@^1.2.2:
version "1.4.2"
resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb"
@@ -14489,30 +13506,7 @@ jsqr@^1.2.0:
object.assign "^4.1.4"
object.values "^1.1.6"
-jwt-decode@^3.1.2:
- version "3.1.2"
- resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-3.1.2.tgz#3fb319f3675a2df0c2895c8f5e9fa4b67b04ed59"
- integrity sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==
-
-keccak256@^1.0.6:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/keccak256/-/keccak256-1.0.6.tgz#dd32fb771558fed51ce4e45a035ae7515573da58"
- integrity sha512-8GLiM01PkdJVGUhR1e6M/AvWnSqYS0HaERI+K/QtStGDGlSTx2B1zTqZk4Zlqu5TxHJNTxWAdP9Y+WI50OApUw==
- dependencies:
- bn.js "^5.2.0"
- buffer "^6.0.3"
- keccak "^3.0.2"
-
-keccak@3.0.2:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.2.tgz#4c2c6e8c54e04f2670ee49fa734eb9da152206e0"
- integrity sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ==
- dependencies:
- node-addon-api "^2.0.0"
- node-gyp-build "^4.2.0"
- readable-stream "^3.6.0"
-
-keccak@^3.0.0, keccak@^3.0.1, keccak@^3.0.2, keccak@^3.0.3:
+keccak@^3.0.0, keccak@^3.0.1, keccak@^3.0.3:
version "3.0.4"
resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.4.tgz#edc09b89e633c0549da444432ecf062ffadee86d"
integrity sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==
@@ -14598,56 +13592,6 @@ less@^4.1.3:
needle "^3.1.0"
source-map "~0.6.0"
-level-codec@~7.0.0:
- version "7.0.1"
- resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-7.0.1.tgz#341f22f907ce0f16763f24bddd681e395a0fb8a7"
- integrity sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ==
-
-level-errors@^1.0.3:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.1.2.tgz#4399c2f3d3ab87d0625f7e3676e2d807deff404d"
- integrity sha512-Sw/IJwWbPKF5Ai4Wz60B52yj0zYeqzObLh8k1Tk88jVmD51cJSKWSYpRyhVIvFzZdvsPqlH5wfhp/yxdsaQH4w==
- dependencies:
- errno "~0.1.1"
-
-level-errors@~1.0.3:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.0.5.tgz#83dbfb12f0b8a2516bdc9a31c4876038e227b859"
- integrity sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig==
- dependencies:
- errno "~0.1.1"
-
-level-iterator-stream@~1.3.0:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz#e43b78b1a8143e6fa97a4f485eb8ea530352f2ed"
- integrity sha512-1qua0RHNtr4nrZBgYlpV0qHHeHpcRRWTxEZJ8xsemoHAXNL5tbooh4tPEEqIqsbWCAJBmUmkwYK/sW5OrFjWWw==
- dependencies:
- inherits "^2.0.1"
- level-errors "^1.0.3"
- readable-stream "^1.0.33"
- xtend "^4.0.0"
-
-level-ws@0.0.0:
- version "0.0.0"
- resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-0.0.0.tgz#372e512177924a00424b0b43aef2bb42496d228b"
- integrity sha512-XUTaO/+Db51Uiyp/t7fCMGVFOTdtLS/NIACxE/GHsij15mKzxksZifKVjlXDF41JMUP/oM1Oc4YNGdKnc3dVLw==
- dependencies:
- readable-stream "~1.0.15"
- xtend "~2.1.1"
-
-levelup@^1.2.1:
- version "1.3.9"
- resolved "https://registry.yarnpkg.com/levelup/-/levelup-1.3.9.tgz#2dbcae845b2bb2b6bea84df334c475533bbd82ab"
- integrity sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ==
- dependencies:
- deferred-leveldown "~1.2.1"
- level-codec "~7.0.0"
- level-errors "~1.0.3"
- level-iterator-stream "~1.3.0"
- prr "~1.0.1"
- semver "~5.4.1"
- xtend "~4.0.0"
-
leven@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2"
@@ -14831,7 +13775,7 @@ lodash.uniqby@^4.7.0:
resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302"
integrity sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==
-lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.7.0:
+lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.7.0:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
@@ -14854,11 +13798,6 @@ log-update@^4.0.0:
slice-ansi "^4.0.0"
wrap-ansi "^6.2.0"
-loglevel@^1.8.0, loglevel@^1.8.1:
- version "1.8.1"
- resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.8.1.tgz#5c621f83d5b48c54ae93b6156353f555963377b4"
- integrity sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==
-
long@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28"
@@ -14936,11 +13875,6 @@ lru-queue@^0.1.0:
dependencies:
es5-ext "~0.10.2"
-ltgt@~2.2.0:
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5"
- integrity sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==
-
lz-string@^1.5.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941"
@@ -15028,18 +13962,6 @@ media-typer@0.3.0:
resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==
-memdown@^1.0.0:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/memdown/-/memdown-1.4.1.tgz#b4e4e192174664ffbae41361aa500f3119efe215"
- integrity sha512-iVrGHZB8i4OQfM155xx8akvG9FIj+ht14DX5CQkCTG4EHzZ3d3sgckIf/Lm9ivZalEsFuEVnWv2B2WZvbrro2w==
- dependencies:
- abstract-leveldown "~2.7.1"
- functional-red-black-tree "^1.0.1"
- immediate "^3.2.3"
- inherits "~2.0.1"
- ltgt "~2.2.0"
- safe-buffer "~5.1.1"
-
memfs@^3.4.1, memfs@^3.4.12:
version "3.6.0"
resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.6.0.tgz#d7a2110f86f79dd950a8b6df6d57bc984aa185f6"
@@ -15108,20 +14030,6 @@ merge2@^1.3.0, merge2@^1.4.1:
resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
-merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2:
- version "2.3.2"
- resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz#982ca1b5a0fde00eed2f6aeed1f9152860b8208a"
- integrity sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g==
- dependencies:
- async "^1.4.2"
- ethereumjs-util "^5.0.0"
- level-ws "0.0.0"
- levelup "^1.2.1"
- memdown "^1.0.0"
- readable-stream "^2.0.0"
- rlp "^2.0.0"
- semaphore ">=1.0.1"
-
methods@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
@@ -15537,12 +14445,12 @@ next-tick@1, next-tick@^1.1.0:
resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb"
integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==
-next@^14.1.0:
- version "14.1.0"
- resolved "https://registry.yarnpkg.com/next/-/next-14.1.0.tgz#b31c0261ff9caa6b4a17c5af019ed77387174b69"
- integrity sha512-wlzrsbfeSU48YQBjZhDzOwhWhGsy+uQycR8bHAOt1LY1bn3zZEcDyHQOEoN3aWzQ8LHCAJ1nqrWCc9XF2+O45Q==
+next@^14.1.1:
+ version "14.1.1"
+ resolved "https://registry.yarnpkg.com/next/-/next-14.1.1.tgz#92bd603996c050422a738e90362dff758459a171"
+ integrity sha512-McrGJqlGSHeaz2yTRPkEucxQKe5Zq7uPwyeHNmJaZNY4wx9E9QdxmTp310agFRoMuIYgQrCrT3petg13fSVOww==
dependencies:
- "@next/env" "14.1.0"
+ "@next/env" "14.1.1"
"@swc/helpers" "0.5.2"
busboy "1.6.0"
caniuse-lite "^1.0.30001579"
@@ -15550,15 +14458,15 @@ next@^14.1.0:
postcss "8.4.31"
styled-jsx "5.1.1"
optionalDependencies:
- "@next/swc-darwin-arm64" "14.1.0"
- "@next/swc-darwin-x64" "14.1.0"
- "@next/swc-linux-arm64-gnu" "14.1.0"
- "@next/swc-linux-arm64-musl" "14.1.0"
- "@next/swc-linux-x64-gnu" "14.1.0"
- "@next/swc-linux-x64-musl" "14.1.0"
- "@next/swc-win32-arm64-msvc" "14.1.0"
- "@next/swc-win32-ia32-msvc" "14.1.0"
- "@next/swc-win32-x64-msvc" "14.1.0"
+ "@next/swc-darwin-arm64" "14.1.1"
+ "@next/swc-darwin-x64" "14.1.1"
+ "@next/swc-linux-arm64-gnu" "14.1.1"
+ "@next/swc-linux-arm64-musl" "14.1.1"
+ "@next/swc-linux-x64-gnu" "14.1.1"
+ "@next/swc-linux-x64-musl" "14.1.1"
+ "@next/swc-win32-arm64-msvc" "14.1.1"
+ "@next/swc-win32-ia32-msvc" "14.1.1"
+ "@next/swc-win32-x64-msvc" "14.1.1"
no-case@^3.0.4:
version "3.0.4"
@@ -15624,7 +14532,7 @@ node-fetch@2.6.7:
dependencies:
whatwg-url "^5.0.0"
-node-fetch@^2.0.0, node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch@^2.6.12, node-fetch@^2.6.7, node-fetch@^2.7.0:
+node-fetch@^2.0.0, node-fetch@^2.6.1, node-fetch@^2.6.12, node-fetch@^2.7.0:
version "2.7.0"
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d"
integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==
@@ -15851,11 +14759,6 @@ objectorarray@^1.0.5:
resolved "https://registry.yarnpkg.com/objectorarray/-/objectorarray-1.0.5.tgz#2c05248bbefabd8f43ad13b41085951aac5e68a5"
integrity sha512-eJJDYkhJFFbBBAxeh8xW+weHlkI28n2ZdQV/J/DNfWfSKlGEf2xcfAbZTv3riEXHAhL9SVOTs2pRmXiSTf78xg==
-oblivious-set@1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/oblivious-set/-/oblivious-set-1.1.1.tgz#d9d38e9491d51f27a5c3ec1681d2ba40aa81e98b"
- integrity sha512-Oh+8fK09mgGmAshFdH6hSVco6KZmd1tTwNFWj35OvzdmJTMZtAkbn05zar2iG3v6sDs1JLEtOiBGNb6BHwkb2w==
-
oboe@2.1.5:
version "2.1.5"
resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.5.tgz#5554284c543a2266d7a38f17e073821fbde393cd"
@@ -16498,11 +15401,6 @@ prebuild-install@^7.1.1:
tar-fs "^2.0.0"
tunnel-agent "^0.6.0"
-precond@0.2:
- version "0.2.3"
- resolved "https://registry.yarnpkg.com/precond/-/precond-0.2.3.tgz#aa9591bcaa24923f1e0f4849d240f47efc1075ac"
- integrity sha512-QCYG84SgGyGzqJ/vlMsxeXd/pgL/I94ixdNFyh1PusWmTCyVfPJjZ1K1jvHtsbfnXQs2TSkEP2fR7QiMZAnKFQ==
-
prelude-ls@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
@@ -16576,14 +15474,6 @@ process@^0.11.10:
resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==
-promise-to-callback@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/promise-to-callback/-/promise-to-callback-1.0.0.tgz#5d2a749010bfb67d963598fcd3960746a68feef7"
- integrity sha512-uhMIZmKM5ZteDMfLgJnoSq9GCwsNKrYau73Awf1jIy6/eUcuuZ3P+CD9zUv0kJsIUbU+x6uLNIhXhLHDs1pNPA==
- dependencies:
- is-fn "^1.0.0"
- set-immediate-shim "^1.0.1"
-
prompts@^2.0.1, prompts@^2.4.0:
version "2.4.2"
resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069"
@@ -16684,7 +15574,7 @@ prr@~1.0.1:
resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==
-psl@^1.1.28, psl@^1.1.33, psl@^1.1.7:
+psl@^1.1.28, psl@^1.1.33:
version "1.9.0"
resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7"
integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==
@@ -17141,17 +16031,7 @@ read-pkg@^5.2.0:
parse-json "^5.0.0"
type-fest "^0.6.0"
-readable-stream@^1.0.33:
- version "1.1.14"
- resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
- integrity sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==
- dependencies:
- core-util-is "~1.0.0"
- inherits "~2.0.1"
- isarray "0.0.1"
- string_decoder "~0.10.x"
-
-readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.2.9, readable-stream@^2.3.8, readable-stream@~2.3.6:
+readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.3.8, readable-stream@~2.3.6:
version "2.3.8"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b"
integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==
@@ -17173,7 +16053,7 @@ readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.5.0, readable
string_decoder "^1.1.1"
util-deprecate "^1.0.1"
-readable-stream@^4.0.0, readable-stream@^4.4.2:
+readable-stream@^4.0.0:
version "4.5.2"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.5.2.tgz#9e7fc4c45099baeed934bff6eb97ba6cf2729e09"
integrity sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==
@@ -17184,7 +16064,7 @@ readable-stream@^4.0.0, readable-stream@^4.4.2:
process "^0.11.10"
string_decoder "^1.3.0"
-readable-stream@~1.0.15, readable-stream@~1.0.17, readable-stream@~1.0.27-1:
+readable-stream@~1.0.17, readable-stream@~1.0.27-1:
version "1.0.34"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"
integrity sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==
@@ -17384,7 +16264,7 @@ request-progress@^3.0.0:
dependencies:
throttleit "^1.0.0"
-request@^2.79.0, request@^2.85.0:
+request@^2.79.0:
version "2.88.2"
resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3"
integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==
@@ -17621,7 +16501,7 @@ ripple-lib@^1.10.1:
ripple-lib-transactionparser "0.8.2"
ws "^7.2.0"
-rlp@^2.0.0, rlp@^2.2.3, rlp@^2.2.4:
+rlp@^2.2.3, rlp@^2.2.4:
version "2.2.7"
resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf"
integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==
@@ -17672,11 +16552,6 @@ run-parallel@^1.1.9:
dependencies:
queue-microtask "^1.2.2"
-rustbn.js@~0.2.0:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca"
- integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==
-
rxjs@6, rxjs@^6.6.3, rxjs@^6.6.7:
version "6.6.7"
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9"
@@ -17718,13 +16593,6 @@ safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0,
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
-safe-event-emitter@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/safe-event-emitter/-/safe-event-emitter-1.0.1.tgz#5b692ef22329ed8f69fdce607e50ca734f6f20af"
- integrity sha512-e1wFe99A91XYYxoQbcq2ZJUWurxEyP8vfz7A7vuUe1s95q8r5ebraVaA1BukYJcpM6V16ugWoD9vngi8Ccu5fg==
- dependencies:
- events "^3.0.0"
-
safe-regex-test@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377"
@@ -17844,15 +16712,6 @@ secp256k1@3.7.1:
nan "^2.14.0"
safe-buffer "^5.1.2"
-secp256k1@4.0.3, secp256k1@^4.0.0, secp256k1@^4.0.1:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303"
- integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==
- dependencies:
- elliptic "^6.5.4"
- node-addon-api "^2.0.0"
- node-gyp-build "^4.2.0"
-
secp256k1@5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-5.0.0.tgz#be6f0c8c7722e2481e9773336d351de8cddd12f7"
@@ -17862,10 +16721,14 @@ secp256k1@5.0.0:
node-addon-api "^5.0.0"
node-gyp-build "^4.2.0"
-semaphore@>=1.0.1, semaphore@^1.0.3:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/semaphore/-/semaphore-1.1.0.tgz#aaad8b86b20fe8e9b32b16dc2ee682a8cd26a8aa"
- integrity sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==
+secp256k1@^4.0.0, secp256k1@^4.0.1:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303"
+ integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==
+ dependencies:
+ elliptic "^6.5.4"
+ node-addon-api "^2.0.0"
+ node-gyp-build "^4.2.0"
"semver@2 || 3 || 4 || 5", semver@^5.6.0:
version "5.7.2"
@@ -17891,11 +16754,6 @@ semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.2, semve
dependencies:
lru-cache "^6.0.0"
-semver@~5.4.1:
- version "5.4.1"
- resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e"
- integrity sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==
-
send@0.18.0:
version "0.18.0"
resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be"
@@ -17915,13 +16773,6 @@ send@0.18.0:
range-parser "~1.2.1"
statuses "2.0.1"
-serialize-error@^8.1.0:
- version "8.1.0"
- resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-8.1.0.tgz#3a069970c712f78634942ddd50fbbc0eaebe2f67"
- integrity sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==
- dependencies:
- type-fest "^0.20.2"
-
serialize-javascript@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa"
@@ -17983,11 +16834,6 @@ set-function-name@^2.0.0, set-function-name@^2.0.1:
functions-have-names "^1.2.3"
has-property-descriptors "^1.0.0"
-set-immediate-shim@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"
- integrity sha512-Li5AOqrZWCVA2n5kryzEmqai6bKSIvpz5oUJHPVj6+dsbD3X1ixtsY5tEnsaNpH3pFAHmG8eIHUrtEtohrg+UQ==
-
setimmediate@^1.0.4, setimmediate@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
@@ -18136,24 +16982,6 @@ smart-buffer@^4.2.0:
resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae"
integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==
-socket.io-client@^4.6.1, socket.io-client@^4.7.2:
- version "4.7.2"
- resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.7.2.tgz#f2f13f68058bd4e40f94f2a1541f275157ff2c08"
- integrity sha512-vtA0uD4ibrYD793SOIAwlo8cj6haOeMHrGvwPxJsxH7CeIksqJ+3Zc06RvWTIFgiSqx4A3sOnTXpfAEE2Zyz6w==
- dependencies:
- "@socket.io/component-emitter" "~3.1.0"
- debug "~4.3.2"
- engine.io-client "~6.5.2"
- socket.io-parser "~4.2.4"
-
-socket.io-parser@~4.2.4:
- version "4.2.4"
- resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.4.tgz#c806966cf7270601e47469ddeec30fbdfda44c83"
- integrity sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==
- dependencies:
- "@socket.io/component-emitter" "~3.1.0"
- debug "~4.3.1"
-
socks-proxy-agent@6.1.1:
version "6.1.1"
resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz#e664e8f1aaf4e1fb3df945f09e3d94f911137f87"
@@ -19081,11 +17909,6 @@ ts-command-line-args@^2.2.0:
command-line-usage "^6.1.0"
string-format "^2.0.0"
-ts-custom-error@^3.2.2, ts-custom-error@^3.3.1:
- version "3.3.1"
- resolved "https://registry.yarnpkg.com/ts-custom-error/-/ts-custom-error-3.3.1.tgz#8bd3c8fc6b8dc8e1cb329267c45200f1e17a65d1"
- integrity sha512-5OX1tzOjxWEgsr/YEUWSuPrQ00deKLh6D7OTWcvNHm12/7QPyRh8SYpyWvA4IZv8H/+GQWQEh/kwo95Q9OVW1A==
-
ts-dedent@^2.0.0, ts-dedent@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/ts-dedent/-/ts-dedent-2.2.0.tgz#39e4bd297cd036292ae2394eb3412be63f563bb5"
@@ -19411,6 +18234,13 @@ uglify-js@^3.1.4:
resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c"
integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==
+uint8arrays@3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-3.1.0.tgz#8186b8eafce68f28bd29bd29d683a311778901e2"
+ integrity sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog==
+ dependencies:
+ multiformats "^9.4.2"
+
uint8arrays@^2.0.5, uint8arrays@^2.1.2:
version "2.1.10"
resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-2.1.10.tgz#34d023c843a327c676e48576295ca373c56e286a"
@@ -19540,11 +18370,6 @@ universalify@^2.0.0:
resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717"
integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==
-unload@^2.4.1:
- version "2.4.1"
- resolved "https://registry.yarnpkg.com/unload/-/unload-2.4.1.tgz#b0c5b7fb44e17fcbf50dcb8fb53929c59dd226a5"
- integrity sha512-IViSAm8Z3sRBYA+9wc0fLQmU9Nrxb16rcDmIiR6Y9LJSZzI7QY5QsDhqPpKOjAn0O9/kfK1TfNEMMAGPTIraPw==
-
unpipe@1.0.0, unpipe@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
@@ -19765,18 +18590,18 @@ verror@1.10.0:
core-util-is "1.0.2"
extsprintf "^1.2.0"
-viem@^1.6.0:
- version "1.20.3"
- resolved "https://registry.yarnpkg.com/viem/-/viem-1.20.3.tgz#8b8360daee622295f5385949c02c86d943d14e0f"
- integrity sha512-7CrmeCb2KYkeCgUmUyb1hsf+IX/PLwi+Np+Vm4YUTPeG82y3HRSgGHSaCOp3d0YtR2kXD3nv9y5kE7LBFE+wWw==
+viem@^2.1.1:
+ version "2.13.8"
+ resolved "https://registry.yarnpkg.com/viem/-/viem-2.13.8.tgz#d6aaeecc84e5ee5cac1566f103ed4cf0335ef811"
+ integrity sha512-JX8dOrCJKazNVs7YAahXnX+NANp0nlK16GyYjtQXILnar1daCPsLy4uzKgZDBVBD6DdRP2lsbPfo4X7QX3q5EQ==
dependencies:
"@adraffy/ens-normalize" "1.10.0"
"@noble/curves" "1.2.0"
"@noble/hashes" "1.3.2"
"@scure/bip32" "1.3.2"
"@scure/bip39" "1.2.1"
- abitype "0.9.8"
- isows "1.0.3"
+ abitype "1.0.0"
+ isows "1.0.4"
ws "8.13.0"
vm-browserify@^1.1.2:
@@ -19820,15 +18645,6 @@ wcwidth@^1.0.1:
dependencies:
defaults "^1.0.3"
-web3-bzz@1.10.0:
- version "1.10.0"
- resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.10.0.tgz#ac74bc71cdf294c7080a79091079192f05c5baed"
- integrity sha512-o9IR59io3pDUsXTsps5pO5hW1D5zBmg46iNc2t4j2DkaYHNdDLwk2IP9ukoM2wg47QILfPEJYzhTfkS/CcX0KA==
- dependencies:
- "@types/node" "^12.12.6"
- got "12.1.0"
- swarm-js "^0.1.40"
-
web3-bzz@1.10.3:
version "1.10.3"
resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.10.3.tgz#13942b37757eb850f3500a8e08bf605448b67566"
@@ -19838,14 +18654,6 @@ web3-bzz@1.10.3:
got "12.1.0"
swarm-js "^0.1.40"
-web3-core-helpers@1.10.0:
- version "1.10.0"
- resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.10.0.tgz#1016534c51a5df77ed4f94d1fcce31de4af37fad"
- integrity sha512-pIxAzFDS5vnbXvfvLSpaA1tfRykAe9adw43YCKsEYQwH0gCLL0kMLkaCX3q+Q8EVmAh+e1jWL/nl9U0de1+++g==
- dependencies:
- web3-eth-iban "1.10.0"
- web3-utils "1.10.0"
-
web3-core-helpers@1.10.3:
version "1.10.3"
resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.10.3.tgz#f2db40ea57e888795e46f229b06113b60bcd671c"
@@ -19854,17 +18662,6 @@ web3-core-helpers@1.10.3:
web3-eth-iban "1.10.3"
web3-utils "1.10.3"
-web3-core-method@1.10.0:
- version "1.10.0"
- resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.10.0.tgz#82668197fa086e8cc8066742e35a9d72535e3412"
- integrity sha512-4R700jTLAMKDMhQ+nsVfIXvH6IGJlJzGisIfMKWAIswH31h5AZz7uDUW2YctI+HrYd+5uOAlS4OJeeT9bIpvkA==
- dependencies:
- "@ethersproject/transactions" "^5.6.2"
- web3-core-helpers "1.10.0"
- web3-core-promievent "1.10.0"
- web3-core-subscriptions "1.10.0"
- web3-utils "1.10.0"
-
web3-core-method@1.10.3:
version "1.10.3"
resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.10.3.tgz#63f16310ccab4eec8eca0a337d534565c2ba8d33"
@@ -19876,13 +18673,6 @@ web3-core-method@1.10.3:
web3-core-subscriptions "1.10.3"
web3-utils "1.10.3"
-web3-core-promievent@1.10.0:
- version "1.10.0"
- resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.10.0.tgz#cbb5b3a76b888df45ed3a8d4d8d4f54ccb66a37b"
- integrity sha512-68N7k5LWL5R38xRaKFrTFT2pm2jBNFaM4GioS00YjAKXRQ3KjmhijOMG3TICz6Aa5+6GDWYelDNx21YAeZ4YTg==
- dependencies:
- eventemitter3 "4.0.4"
-
web3-core-promievent@1.10.3:
version "1.10.3"
resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.10.3.tgz#9765dd42ce6cf2dc0a08eaffee607b855644f290"
@@ -19890,17 +18680,6 @@ web3-core-promievent@1.10.3:
dependencies:
eventemitter3 "4.0.4"
-web3-core-requestmanager@1.10.0:
- version "1.10.0"
- resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.10.0.tgz#4b34f6e05837e67c70ff6f6993652afc0d54c340"
- integrity sha512-3z/JKE++Os62APml4dvBM+GAuId4h3L9ckUrj7ebEtS2AR0ixyQPbrBodgL91Sv7j7cQ3Y+hllaluqjguxvSaQ==
- dependencies:
- util "^0.12.5"
- web3-core-helpers "1.10.0"
- web3-providers-http "1.10.0"
- web3-providers-ipc "1.10.0"
- web3-providers-ws "1.10.0"
-
web3-core-requestmanager@1.10.3:
version "1.10.3"
resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.10.3.tgz#c34ca8e998a18d6ca3fa7f7a11d4391da401c987"
@@ -19912,14 +18691,6 @@ web3-core-requestmanager@1.10.3:
web3-providers-ipc "1.10.3"
web3-providers-ws "1.10.3"
-web3-core-subscriptions@1.10.0:
- version "1.10.0"
- resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.10.0.tgz#b534592ee1611788fc0cb0b95963b9b9b6eacb7c"
- integrity sha512-HGm1PbDqsxejI075gxBc5OSkwymilRWZufIy9zEpnWKNmfbuv5FfHgW1/chtJP6aP3Uq2vHkvTDl3smQBb8l+g==
- dependencies:
- eventemitter3 "4.0.4"
- web3-core-helpers "1.10.0"
-
web3-core-subscriptions@1.10.3:
version "1.10.3"
resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.10.3.tgz#58768cd72a9313252ef05dc52c09536f009a9479"
@@ -19928,19 +18699,6 @@ web3-core-subscriptions@1.10.3:
eventemitter3 "4.0.4"
web3-core-helpers "1.10.3"
-web3-core@1.10.0:
- version "1.10.0"
- resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.10.0.tgz#9aa07c5deb478cf356c5d3b5b35afafa5fa8e633"
- integrity sha512-fWySwqy2hn3TL89w5TM8wXF1Z2Q6frQTKHWmP0ppRQorEK8NcHJRfeMiv/mQlSKoTS1F6n/nv2uyZsixFycjYQ==
- dependencies:
- "@types/bn.js" "^5.1.1"
- "@types/node" "^12.12.6"
- bignumber.js "^9.0.0"
- web3-core-helpers "1.10.0"
- web3-core-method "1.10.0"
- web3-core-requestmanager "1.10.0"
- web3-utils "1.10.0"
-
web3-core@1.10.3, web3-core@^1.10.3:
version "1.10.3"
resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.10.3.tgz#4aeb8f4b0cb5775d9fa4edf1127864743f1c3ae3"
@@ -19954,14 +18712,6 @@ web3-core@1.10.3, web3-core@^1.10.3:
web3-core-requestmanager "1.10.3"
web3-utils "1.10.3"
-web3-eth-abi@1.10.0:
- version "1.10.0"
- resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.10.0.tgz#53a7a2c95a571e205e27fd9e664df4919483cce1"
- integrity sha512-cwS+qRBWpJ43aI9L3JS88QYPfFcSJJ3XapxOQ4j40v6mk7ATpA8CVK1vGTzpihNlOfMVRBkR95oAj7oL6aiDOg==
- dependencies:
- "@ethersproject/abi" "^5.6.3"
- web3-utils "1.10.0"
-
web3-eth-abi@1.10.3:
version "1.10.3"
resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.10.3.tgz#7decfffa8fed26410f32cfefdc32d3e76f717ca2"
@@ -19970,22 +18720,6 @@ web3-eth-abi@1.10.3:
"@ethersproject/abi" "^5.6.3"
web3-utils "1.10.3"
-web3-eth-accounts@1.10.0:
- version "1.10.0"
- resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.10.0.tgz#2942beca0a4291455f32cf09de10457a19a48117"
- integrity sha512-wiq39Uc3mOI8rw24wE2n15hboLE0E9BsQLdlmsL4Zua9diDS6B5abXG0XhFcoNsXIGMWXVZz4TOq3u4EdpXF/Q==
- dependencies:
- "@ethereumjs/common" "2.5.0"
- "@ethereumjs/tx" "3.3.2"
- eth-lib "0.2.8"
- ethereumjs-util "^7.1.5"
- scrypt-js "^3.0.1"
- uuid "^9.0.0"
- web3-core "1.10.0"
- web3-core-helpers "1.10.0"
- web3-core-method "1.10.0"
- web3-utils "1.10.0"
-
web3-eth-accounts@1.10.3:
version "1.10.3"
resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.10.3.tgz#9ecb816b81cd97333988bfcd0afaee5d13bbb198"
@@ -20002,21 +18736,7 @@ web3-eth-accounts@1.10.3:
web3-core-method "1.10.3"
web3-utils "1.10.3"
-web3-eth-contract@1.10.0:
- version "1.10.0"
- resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.10.0.tgz#8e68c7654576773ec3c91903f08e49d0242c503a"
- integrity sha512-MIC5FOzP/+2evDksQQ/dpcXhSqa/2hFNytdl/x61IeWxhh6vlFeSjq0YVTAyIzdjwnL7nEmZpjfI6y6/Ufhy7w==
- dependencies:
- "@types/bn.js" "^5.1.1"
- web3-core "1.10.0"
- web3-core-helpers "1.10.0"
- web3-core-method "1.10.0"
- web3-core-promievent "1.10.0"
- web3-core-subscriptions "1.10.0"
- web3-eth-abi "1.10.0"
- web3-utils "1.10.0"
-
-web3-eth-contract@1.10.3, web3-eth-contract@^1.8.1:
+web3-eth-contract@1.10.3:
version "1.10.3"
resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.10.3.tgz#8880468e2ba7d8a4791cf714f67d5e1ec1591275"
integrity sha512-Y2CW61dCCyY4IoUMD4JsEQWrILX4FJWDWC/Txx/pr3K/+fGsBGvS9kWQN5EsVXOp4g7HoFOfVh9Lf7BmVVSRmg==
@@ -20030,20 +18750,6 @@ web3-eth-contract@1.10.3, web3-eth-contract@^1.8.1:
web3-eth-abi "1.10.3"
web3-utils "1.10.3"
-web3-eth-ens@1.10.0:
- version "1.10.0"
- resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.10.0.tgz#96a676524e0b580c87913f557a13ed810cf91cd9"
- integrity sha512-3hpGgzX3qjgxNAmqdrC2YUQMTfnZbs4GeLEmy8aCWziVwogbuqQZ+Gzdfrym45eOZodk+lmXyLuAdqkNlvkc1g==
- dependencies:
- content-hash "^2.5.2"
- eth-ens-namehash "2.0.8"
- web3-core "1.10.0"
- web3-core-helpers "1.10.0"
- web3-core-promievent "1.10.0"
- web3-eth-abi "1.10.0"
- web3-eth-contract "1.10.0"
- web3-utils "1.10.0"
-
web3-eth-ens@1.10.3:
version "1.10.3"
resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.10.3.tgz#ae5b49bcb9823027e0b28aa6b1de58d726cbaafa"
@@ -20058,14 +18764,6 @@ web3-eth-ens@1.10.3:
web3-eth-contract "1.10.3"
web3-utils "1.10.3"
-web3-eth-iban@1.10.0:
- version "1.10.0"
- resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.10.0.tgz#5a46646401965b0f09a4f58e7248c8a8cd22538a"
- integrity sha512-0l+SP3IGhInw7Q20LY3IVafYEuufo4Dn75jAHT7c2aDJsIolvf2Lc6ugHkBajlwUneGfbRQs/ccYPQ9JeMUbrg==
- dependencies:
- bn.js "^5.2.1"
- web3-utils "1.10.0"
-
web3-eth-iban@1.10.3:
version "1.10.3"
resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.10.3.tgz#91d458e5400195edc883a0d4383bf1cecd17240d"
@@ -20074,18 +18772,6 @@ web3-eth-iban@1.10.3:
bn.js "^5.2.1"
web3-utils "1.10.3"
-web3-eth-personal@1.10.0:
- version "1.10.0"
- resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.10.0.tgz#94d525f7a29050a0c2a12032df150ac5ea633071"
- integrity sha512-anseKn98w/d703eWq52uNuZi7GhQeVjTC5/svrBWEKob0WZ5kPdo+EZoFN0sp5a5ubbrk/E0xSl1/M5yORMtpg==
- dependencies:
- "@types/node" "^12.12.6"
- web3-core "1.10.0"
- web3-core-helpers "1.10.0"
- web3-core-method "1.10.0"
- web3-net "1.10.0"
- web3-utils "1.10.0"
-
web3-eth-personal@1.10.3:
version "1.10.3"
resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.10.3.tgz#4e72008aa211327ccc3bfa7671c510e623368457"
@@ -20098,24 +18784,6 @@ web3-eth-personal@1.10.3:
web3-net "1.10.3"
web3-utils "1.10.3"
-web3-eth@1.10.0:
- version "1.10.0"
- resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.10.0.tgz#38b905e2759697c9624ab080cfcf4e6c60b3a6cf"
- integrity sha512-Z5vT6slNMLPKuwRyKGbqeGYC87OAy8bOblaqRTgg94CXcn/mmqU7iPIlG4506YdcdK3x6cfEDG7B6w+jRxypKA==
- dependencies:
- web3-core "1.10.0"
- web3-core-helpers "1.10.0"
- web3-core-method "1.10.0"
- web3-core-subscriptions "1.10.0"
- web3-eth-abi "1.10.0"
- web3-eth-accounts "1.10.0"
- web3-eth-contract "1.10.0"
- web3-eth-ens "1.10.0"
- web3-eth-iban "1.10.0"
- web3-eth-personal "1.10.0"
- web3-net "1.10.0"
- web3-utils "1.10.0"
-
web3-eth@1.10.3:
version "1.10.3"
resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.10.3.tgz#b8c6f37f1aac52422583a5a9c29130983a3fb3b1"
@@ -20134,15 +18802,6 @@ web3-eth@1.10.3:
web3-net "1.10.3"
web3-utils "1.10.3"
-web3-net@1.10.0:
- version "1.10.0"
- resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.10.0.tgz#be53e7f5dafd55e7c9013d49c505448b92c9c97b"
- integrity sha512-NLH/N3IshYWASpxk4/18Ge6n60GEvWBVeM8inx2dmZJVmRI6SJIlUxbL8jySgiTn3MMZlhbdvrGo8fpUW7a1GA==
- dependencies:
- web3-core "1.10.0"
- web3-core-method "1.10.0"
- web3-utils "1.10.0"
-
web3-net@1.10.3:
version "1.10.3"
resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.10.3.tgz#9486c2fe51452cb958e11915db6f90bd6caa5482"
@@ -20152,44 +18811,6 @@ web3-net@1.10.3:
web3-core-method "1.10.3"
web3-utils "1.10.3"
-web3-provider-engine@16.0.3:
- version "16.0.3"
- resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-16.0.3.tgz#8ff93edf3a8da2f70d7f85c5116028c06a0d9f07"
- integrity sha512-Q3bKhGqLfMTdLvkd4TtkGYJHcoVQ82D1l8jTIwwuJp/sAp7VHnRYb9YJ14SW/69VMWoOhSpPLZV2tWb9V0WJoA==
- dependencies:
- "@ethereumjs/tx" "^3.3.0"
- async "^2.5.0"
- backoff "^2.5.0"
- clone "^2.0.0"
- cross-fetch "^2.1.0"
- eth-block-tracker "^4.4.2"
- eth-json-rpc-filters "^4.2.1"
- eth-json-rpc-infura "^5.1.0"
- eth-json-rpc-middleware "^6.0.0"
- eth-rpc-errors "^3.0.0"
- eth-sig-util "^1.4.2"
- ethereumjs-block "^1.2.2"
- ethereumjs-util "^5.1.5"
- ethereumjs-vm "^2.3.4"
- json-stable-stringify "^1.0.1"
- promise-to-callback "^1.0.0"
- readable-stream "^2.2.9"
- request "^2.85.0"
- semaphore "^1.0.3"
- ws "^5.1.1"
- xhr "^2.2.0"
- xtend "^4.0.1"
-
-web3-providers-http@1.10.0:
- version "1.10.0"
- resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.10.0.tgz#864fa48675e7918c9a4374e5f664b32c09d0151b"
- integrity sha512-eNr965YB8a9mLiNrkjAWNAPXgmQWfpBfkkn7tpEFlghfww0u3I0tktMZiaToJVcL2+Xq+81cxbkpeWJ5XQDwOA==
- dependencies:
- abortcontroller-polyfill "^1.7.3"
- cross-fetch "^3.1.4"
- es6-promise "^4.2.8"
- web3-core-helpers "1.10.0"
-
web3-providers-http@1.10.3:
version "1.10.3"
resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.10.3.tgz#d8166ee89db82d37281ea9e15c5882a2d7928755"
@@ -20200,14 +18821,6 @@ web3-providers-http@1.10.3:
es6-promise "^4.2.8"
web3-core-helpers "1.10.3"
-web3-providers-ipc@1.10.0:
- version "1.10.0"
- resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.10.0.tgz#9747c7a6aee96a51488e32fa7c636c3460b39889"
- integrity sha512-OfXG1aWN8L1OUqppshzq8YISkWrYHaATW9H8eh0p89TlWMc1KZOL9vttBuaBEi96D/n0eYDn2trzt22bqHWfXA==
- dependencies:
- oboe "2.1.5"
- web3-core-helpers "1.10.0"
-
web3-providers-ipc@1.10.3:
version "1.10.3"
resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.10.3.tgz#a7e015957fc037d8a87bd4b6ae3561c1b1ad1f46"
@@ -20216,15 +18829,6 @@ web3-providers-ipc@1.10.3:
oboe "2.1.5"
web3-core-helpers "1.10.3"
-web3-providers-ws@1.10.0:
- version "1.10.0"
- resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.10.0.tgz#cb0b87b94c4df965cdf486af3a8cd26daf3975e5"
- integrity sha512-sK0fNcglW36yD5xjnjtSGBnEtf59cbw4vZzJ+CmOWIKGIR96mP5l684g0WD0Eo+f4NQc2anWWXG74lRc9OVMCQ==
- dependencies:
- eventemitter3 "4.0.4"
- web3-core-helpers "1.10.0"
- websocket "^1.0.32"
-
web3-providers-ws@1.10.3:
version "1.10.3"
resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.10.3.tgz#03c84958f9da251349cd26fd7a4ae567e3af6caa"
@@ -20234,16 +18838,6 @@ web3-providers-ws@1.10.3:
web3-core-helpers "1.10.3"
websocket "^1.0.32"
-web3-shh@1.10.0:
- version "1.10.0"
- resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.10.0.tgz#c2979b87e0f67a7fef2ce9ee853bd7bfbe9b79a8"
- integrity sha512-uNUUuNsO2AjX41GJARV9zJibs11eq6HtOe6Wr0FtRUcj8SN6nHeYIzwstAvJ4fXA53gRqFMTxdntHEt9aXVjpg==
- dependencies:
- web3-core "1.10.0"
- web3-core-method "1.10.0"
- web3-core-subscriptions "1.10.0"
- web3-net "1.10.0"
-
web3-shh@1.10.3:
version "1.10.3"
resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.10.3.tgz#ee44f760598a65a290d611c443838aac854ee858"
@@ -20254,20 +18848,7 @@ web3-shh@1.10.3:
web3-core-subscriptions "1.10.3"
web3-net "1.10.3"
-web3-utils@1.10.0:
- version "1.10.0"
- resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.10.0.tgz#ca4c1b431a765c14ac7f773e92e0fd9377ccf578"
- integrity sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg==
- dependencies:
- bn.js "^5.2.1"
- ethereum-bloom-filters "^1.0.6"
- ethereumjs-util "^7.1.0"
- ethjs-unit "0.1.6"
- number-to-bn "1.7.0"
- randombytes "^2.1.0"
- utf8 "3.0.0"
-
-web3-utils@1.10.3, web3-utils@^1.10.3, web3-utils@^1.8.1:
+web3-utils@1.10.3, web3-utils@^1.10.3:
version "1.10.3"
resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.10.3.tgz#f1db99c82549c7d9f8348f04ffe4e0188b449714"
integrity sha512-OqcUrEE16fDBbGoQtZXWdavsPzbGIDc5v3VrRTZ0XrIpefC/viZ1ZU9bGEemazyS0catk/3rkOOxpzTfY+XsyQ==
@@ -20281,19 +18862,6 @@ web3-utils@1.10.3, web3-utils@^1.10.3, web3-utils@^1.8.1:
randombytes "^2.1.0"
utf8 "3.0.0"
-web3@1.10.0:
- version "1.10.0"
- resolved "https://registry.yarnpkg.com/web3/-/web3-1.10.0.tgz#2fde0009f59aa756c93e07ea2a7f3ab971091274"
- integrity sha512-YfKY9wSkGcM8seO+daR89oVTcbu18NsVfvOngzqMYGUU0pPSQmE57qQDvQzUeoIOHAnXEBNzrhjQJmm8ER0rng==
- dependencies:
- web3-bzz "1.10.0"
- web3-core "1.10.0"
- web3-eth "1.10.0"
- web3-eth-personal "1.10.0"
- web3-net "1.10.0"
- web3-shh "1.10.0"
- web3-utils "1.10.0"
-
web3@^1.10.3:
version "1.10.3"
resolved "https://registry.yarnpkg.com/web3/-/web3-1.10.3.tgz#5e80ac532dc432b09fde668d570b0ad4e6710897"
@@ -20307,11 +18875,6 @@ web3@^1.10.3:
web3-shh "1.10.3"
web3-utils "1.10.3"
-webextension-polyfill@^0.10.0:
- version "0.10.0"
- resolved "https://registry.yarnpkg.com/webextension-polyfill/-/webextension-polyfill-0.10.0.tgz#ccb28101c910ba8cf955f7e6a263e662d744dbb8"
- integrity sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g==
-
webidl-conversions@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
@@ -20461,11 +19024,6 @@ whatwg-encoding@^2.0.0:
dependencies:
iconv-lite "0.6.3"
-whatwg-fetch@^2.0.4:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f"
- integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==
-
whatwg-mimetype@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7"
@@ -20843,23 +19401,11 @@ ws@^3.0.0:
safe-buffer "~5.1.0"
ultron "~1.1.0"
-ws@^5.1.1:
- version "5.2.3"
- resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.3.tgz#05541053414921bc29c63bee14b8b0dd50b07b3d"
- integrity sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==
- dependencies:
- async-limiter "~1.0.0"
-
ws@^8.11.0, ws@^8.2.3, ws@^8.5.0:
version "8.16.0"
resolved "https://registry.yarnpkg.com/ws/-/ws-8.16.0.tgz#d1cd774f36fbc07165066a60e40323eab6446fd4"
integrity sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==
-ws@~8.11.0:
- version "8.11.0"
- resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143"
- integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==
-
xhr-request-promise@^0.1.2:
version "0.1.3"
resolved "https://registry.yarnpkg.com/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz#2d5f4b16d8c6c893be97f1a62b0ed4cf3ca5f96c"
@@ -20880,7 +19426,7 @@ xhr-request@^1.0.1, xhr-request@^1.1.0:
url-set-query "^1.0.0"
xhr "^2.0.4"
-xhr@^2.0.4, xhr@^2.2.0, xhr@^2.3.3:
+xhr@^2.0.4, xhr@^2.3.3:
version "2.6.0"
resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.6.0.tgz#b69d4395e792b4173d6b7df077f0fc5e4e2b249d"
integrity sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==
@@ -20900,12 +19446,7 @@ xmlchars@^2.2.0:
resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb"
integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==
-xmlhttprequest-ssl@~2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz#91360c86b914e67f44dce769180027c0da618c67"
- integrity sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==
-
-xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0, xtend@~4.0.1:
+xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.1:
version "4.0.2"
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
@@ -21017,3 +19558,8 @@ yocto-queue@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251"
integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==
+
+zodiac-roles-deployments@^2.2.2:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/zodiac-roles-deployments/-/zodiac-roles-deployments-2.2.2.tgz#feb7e7544398e1572d2f7fa6ff2be033f2c736ce"
+ integrity sha512-6nG6/AuJh9SIrXR1NieRzSfn1+J6k9p2mb3qns3cRYhx3+i4wWIRh1JcE+jueHSYo+H7yKG/jfwRXMVN1L938A==