1
- import type { SendTransactionsResponse } from '@safe-global/safe-apps-sdk'
1
+ import type { SignMessageResponse } from '@safe-global/safe-apps-sdk'
2
2
import SafeAppsSDK from '@safe-global/safe-apps-sdk'
3
3
import { decode } from 'jsonwebtoken'
4
4
import type { Observable } from 'rxjs'
@@ -44,7 +44,7 @@ export function jwtAuthSetupToken$(
44
44
}
45
45
46
46
interface GnosisSafeSignInDetails {
47
- safeTxHash : string
47
+ messageHash : string
48
48
challenge : string
49
49
}
50
50
@@ -72,15 +72,24 @@ async function getGnosisSafeDetails(
72
72
}
73
73
74
74
const dataToSign = getDataToSignFromChallenge ( newChallenge )
75
- const { safeTxHash } = ( await sdk . txs . signMessage ( dataToSign ) ) as SendTransactionsResponse
75
+ const res = ( await sdk . txs . signMessage ( dataToSign ) ) as SignMessageResponse
76
+ let messageHash : string | undefined
77
+ if ( 'messageHash' in res ) {
78
+ messageHash = res . messageHash
79
+ } else if ( 'safeTxHash' in res ) {
80
+ throw new Error ( 'Please upgrade your SAFE' )
81
+ } else {
82
+ throw new Error ( 'Unexpected response type' )
83
+ }
84
+
76
85
localStorage . setItem (
77
86
key ,
78
87
JSON . stringify ( {
79
- safeTxHash ,
88
+ messageHash ,
80
89
challenge : newChallenge ,
81
90
} as GnosisSafeSignInDetails ) ,
82
91
)
83
- return { challenge : newChallenge , safeTxHash , dataToSign }
92
+ return { challenge : newChallenge , messageHash , dataToSign }
84
93
}
85
94
86
95
async function requestJWT (
@@ -99,40 +108,35 @@ async function requestJWT(
99
108
100
109
const {
101
110
challenge : gnosisSafeChallenge ,
102
- safeTxHash ,
111
+ messageHash ,
103
112
dataToSign,
104
113
} = await getGnosisSafeDetails ( sdk , chainId , account , challenge )
105
114
106
115
// start polling
107
116
const token = await new Promise < string | null > ( ( resolve ) => {
108
117
let returnValue = ( val : string | null ) => resolve ( val ) // CAUTION: this function is reassigned later
109
118
const interval = setInterval ( async ( ) => {
110
- try {
111
- const { detailedExecutionInfo } = await sdk . txs . getBySafeTxHash ( safeTxHash )
112
- if (
113
- ! (
114
- detailedExecutionInfo ?. type === 'MULTISIG' &&
115
- detailedExecutionInfo . confirmations . length
116
- )
117
- ) {
118
- throw new Error ( 'GS: not ready' )
119
- }
120
-
121
- const isSigned = await sdk . safe . isMessageSigned ( dataToSign )
122
- if ( ! isSigned ) {
123
- throw new Error ( 'Not signed yet' )
119
+ if ( messageHash ) {
120
+ try {
121
+ const isSigned = await sdk . safe . isMessageSigned ( dataToSign )
122
+ if ( ! isSigned ) {
123
+ throw new Error ( 'Not signed yet' )
124
+ }
125
+ const offchainSignature = await sdk . safe . getOffChainSignature ( messageHash )
126
+ if ( ! offchainSignature ) {
127
+ throw new Error ( 'GS: not ready' )
128
+ }
129
+ const safeJwt = await requestSignin ( {
130
+ challenge : gnosisSafeChallenge ,
131
+ signature : offchainSignature ,
132
+ chainId,
133
+ isGnosisSafe : true ,
134
+ } ) . toPromise ( )
135
+
136
+ return returnValue ( safeJwt )
137
+ } catch ( error ) {
138
+ console . error ( 'GS: error occurred' , error )
124
139
}
125
-
126
- const safeJwt = await requestSignin ( {
127
- challenge : gnosisSafeChallenge ,
128
- signature : safeTxHash ,
129
- chainId,
130
- isGnosisSafe : true ,
131
- } ) . toPromise ( )
132
-
133
- return returnValue ( safeJwt )
134
- } catch ( error ) {
135
- console . error ( 'GS: error occurred' , error )
136
140
}
137
141
} , 5 * 1000 )
138
142
0 commit comments