Skip to content

Commit 2d3785c

Browse files
authored
Merge pull request #7 from AmbireTech/fix/safe-wallet-connection
Bug/ Can't connect with Safe Protocol
2 parents 9a97f3b + 31b0577 commit 2d3785c

File tree

1 file changed

+33
-8
lines changed

1 file changed

+33
-8
lines changed

src/components/SignForm/SignForm.js

+33-8
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import { getMessagePlaceholder, validateMessage } from '../../helpers/messages'
1717

1818
import './SignForm.scss'
1919
import { MdIosShare } from 'react-icons/md'
20+
import { useWeb3Onboard } from '@web3-onboard/react/dist/context'
2021

2122
const truncateAddress = (addr) => {
2223
return addr.substr(0, 4) + '...' + addr.substr(-4)
@@ -30,12 +31,14 @@ const SignForm = ({ selectedForm, setShareModalLink }) => {
3031

3132
const connectedWallets = useWallets()
3233
const [connectedAccount, setConnectedAccount] = useState(null)
34+
const { state } = useWeb3Onboard()
3335

3436
const [error, setError] = useState(null)
3537

3638
const [isSigning, setIsSigning] = useState(false)
3739
const [isLoaderDelayerActive, setIsLoaderDelayerActive] = useState(false)
3840
const [signature, setSignature] = useState(null)
41+
const [hasDisconnected, setHasDiconnected] = useState(false)
3942

4043
const [message, setMessage] = useState('')
4144
const [messageError, setMessageError] = useState(null)
@@ -64,10 +67,26 @@ const SignForm = ({ selectedForm, setShareModalLink }) => {
6467
useEffect(() => {
6568
if (!wallet?.provider) {
6669
provider = null
70+
71+
const currentState = state.get()
72+
73+
// If the user has disconnected from safe once we should not autoconnect him again
74+
if (selectedForm !== 'sign' || hasDisconnected || !currentState) return
75+
76+
const availableWalletLabels = currentState.walletModules.map((module) => module.label)
77+
78+
// Check if Safe is available, because autoselecting will fail if it's not
79+
if (!availableWalletLabels.includes('Safe')) return
80+
81+
connect({
82+
autoSelect: {
83+
label: 'Safe',
84+
},
85+
})
6786
} else {
6887
provider = new ethers.providers.Web3Provider(wallet.provider, 'any')
6988
}
70-
}, [wallet])
89+
}, [wallet, connect, selectedForm, hasDisconnected, state])
7190

7291
// wallet sign call
7392
const walletSign = useCallback(
@@ -81,19 +100,19 @@ const SignForm = ({ selectedForm, setShareModalLink }) => {
81100
const signer = provider.getUncheckedSigner()
82101

83102
if (messageType === 'humanMessage') {
84-
if (wallet.label === 'Gnosis Safe') {
85-
return (await provider.sdk.txs.signMessage(hexlify(ethers.utils.toUtf8Bytes(message)))).safeTxHash
103+
if (wallet.label === 'Safe') {
104+
return (await wallet.instance.txs.signMessage(hexlify(ethers.utils.toUtf8Bytes(message)))).safeTxHash
86105
}
87106
return signer.signMessage(message)
88107
} else if (messageType === 'hexMessage') {
89-
if (wallet.label === 'Gnosis Safe') {
90-
return (await provider.sdk.txs.signMessage(message)).safeTxHash
108+
if (wallet.label === 'Safe') {
109+
return (await wallet.instance.txs.signMessage(message)).safeTxHash
91110
}
92111
return signer.signMessage(arrayify(message))
93112
} else if (messageType === 'typedData') {
94-
if (wallet.label === 'Gnosis Safe') {
113+
if (wallet.label === 'Safe') {
95114
return (
96-
await provider.sdk.txs.signMessage({
115+
await wallet.instance.txs.signMessage({
97116
signType: 'eth_signTypedData_v4',
98117
message,
99118
})
@@ -321,7 +340,13 @@ const SignForm = ({ selectedForm, setShareModalLink }) => {
321340
Connected with <b>{truncateAddress(connectedAccount.address)}</b>
322341
<CopyButton textToCopy={connectedAccount.address} />
323342
</span>
324-
<button onClick={() => disconnect(wallet)} className='button-disconnect'>
343+
<button
344+
onClick={() => {
345+
disconnect(wallet)
346+
setHasDiconnected(true)
347+
}}
348+
className='button-disconnect'
349+
>
325350
Disconnect Wallet
326351
</button>
327352
</>

0 commit comments

Comments
 (0)