@@ -32,7 +32,7 @@ const createSIWEMessage: SIWEConfig['createMessage'] = ({
32
32
*/
33
33
interface GetSIWEConfigProps {
34
34
authClient : PromiseClient < typeof Auth > ;
35
- queryClient : QueryClient ;
35
+ wagmiQueryClient : QueryClient ;
36
36
nonceQuery : UseQueryResult < NonceText > ;
37
37
authenticateQuery : UseQueryResult < H160 > ;
38
38
sessionQuery : UseQueryResult < SiweSession > ;
@@ -51,7 +51,7 @@ interface GetSIWEConfigProps {
51
51
*/
52
52
export const getSIWEConfig = ( {
53
53
authClient,
54
- queryClient ,
54
+ wagmiQueryClient ,
55
55
nonceQuery,
56
56
authenticateQuery,
57
57
sessionQuery,
@@ -65,76 +65,100 @@ export const getSIWEConfig = ({
65
65
66
66
// Returns a promise which, upon resolution, returns the nonce.
67
67
async getNonce ( ) {
68
- logger . debug ( 'Fetching nonce...' ) ;
68
+ logger . debug ( 'SIWE: Fetching nonce...' ) ;
69
69
const { data } = await nonceQuery . refetch ( ) ;
70
70
if ( data ?. nonce === undefined ) throw new Error ( 'Could not fetch nonce' ) ;
71
- logger . debug ( `Current nonce: ${ data . nonce } ` ) ;
71
+ logger . debug ( `SIWE: Current nonce: ${ data . nonce } ` ) ;
72
72
return data . nonce ;
73
73
} ,
74
74
75
75
// Returns a promise which, upon resolution, verifies the contents of the SIWE message.
76
76
async verifyMessage ( { message, signature } ) {
77
- logger . debug ( 'Verifying message...' ) ;
78
- const res = await authClient . verify ( {
79
- body : JSON . stringify ( { message, signature } ) ,
80
- } ) ;
81
- // verify address returned by Trade API matches current address
82
- const verifiedAddress = fromH160ToAddress ( res ) . toLowerCase ( ) ;
83
- logger . debug ( 'Message verified successfully' ) ;
84
- return verifiedAddress === address ?. toLowerCase ( ) ;
77
+ logger . debug ( 'SIWE: Verifying message...' ) ;
78
+
79
+ let verified = false ;
80
+ try {
81
+ const res = await authClient . verify ( {
82
+ body : JSON . stringify ( { message, signature } ) ,
83
+ } ) ;
84
+ // verify address returned by Trade API matches current address
85
+ const verifiedAddress = fromH160ToAddress ( res ) . toLowerCase ( ) ;
86
+ logger . info ( 'SIWE: Signed in' ) ;
87
+ verified = verifiedAddress === address ?. toLowerCase ( ) ;
88
+ } catch ( error ) {
89
+ logger . error ( 'SIWE: Error verifying message' , { error } ) ;
90
+ }
91
+
92
+ if ( ! verified ) {
93
+ logger . warn ( 'SIWE: Fetching new nonce after failed verification...' ) ;
94
+ await wagmiQueryClient . refetchQueries ( [ 'ckSiweNonce' ] ) ;
95
+ }
96
+
97
+ return verified ;
85
98
} ,
86
99
87
100
// Returns a promise which, upon resolution and disconnect/reconnect of the
88
101
// client terminates the SIWE session.
89
102
async signOut ( ) {
90
- logger . debug ( 'Signing out...' ) ;
103
+ logger . debug ( 'SIWE: Signing out...' ) ;
91
104
try {
92
105
await signOutQuery . refetch ( ) ;
93
- logger . info ( 'Signed out' ) ;
106
+ logger . info ( 'SIWE: Signed out' ) ;
94
107
return true ;
95
108
} catch ( error ) {
96
- logger . error ( 'Error signing out' ) ;
109
+ logger . error ( 'SIWE: Error signing out' , { error } ) ;
97
110
return false ;
98
111
}
99
112
} ,
100
113
101
114
// Returns a promise which, upon await, gets details about the current session.
102
115
async getSession ( ) {
103
- logger . debug ( 'Getting session...' ) ;
116
+ logger . debug ( 'SIWE: Getting session...' ) ;
117
+ try {
118
+ // check auth endpoint to ensure session is valid
119
+ const { data : authData , error : authError } =
120
+ await authenticateQuery . refetch ( { } ) ;
121
+ if ( authData === undefined || authError !== null ) {
122
+ logger . debug ( 'SIWE: Could not get auth data' , { authError } ) ;
123
+ return null ;
124
+ }
125
+ const authorizedAddress = fromH160ToAddress ( authData ) ;
126
+ if ( authorizedAddress . toLowerCase ( ) !== address ?. toLowerCase ( ) ) {
127
+ logger . error (
128
+ 'SIWE: Authorized address does not match connected address' ,
129
+ ) ;
130
+ return null ;
131
+ }
132
+ logger . debug (
133
+ 'SIWE: Authorized address matches connected address. Now checking /session endpoint.' ,
134
+ ) ;
104
135
105
- // check auth endpoint to ensure session is valid
106
- const { data : authData } = await authenticateQuery . refetch ( { } ) ;
107
- if ( authData === undefined ) {
108
- logger . warn ( 'Could not get auth data' ) ;
109
- return null ;
110
- }
111
- const authorizedAddress = fromH160ToAddress ( authData ) ;
112
- if ( authorizedAddress . toLowerCase ( ) !== address ?. toLowerCase ( ) ) {
113
- logger . error ( 'Authorized address does not match connected address' ) ;
114
- return null ;
115
- }
136
+ // get session data
137
+ const { data : sessionData , error : sessionError } =
138
+ await sessionQuery . refetch ( ) ;
139
+ if (
140
+ ! sessionData ?. address ||
141
+ ! sessionData . chainId ||
142
+ sessionError !== null
143
+ ) {
144
+ logger . debug ( 'SIWE: No session data found' , { sessionError } ) ;
145
+ return null ;
146
+ }
147
+ const sessionAddress = fromH160ToAddress ( sessionData . address ) ;
148
+ if ( sessionAddress . toLowerCase ( ) === address . toLowerCase ( ) ) {
149
+ logger . debug ( 'SIWE: Session is valid' ) ;
150
+ return {
151
+ address : sessionAddress ,
152
+ chainId : Number ( fromH256 ( sessionData . chainId ) . toString ( ) ) ,
153
+ } ;
154
+ }
116
155
117
- // get session data
118
- const { data : sessionData } = await sessionQuery . refetch ( ) ;
119
- if ( ! sessionData ?. address || ! sessionData . chainId ) {
120
- logger . warn ( 'No session data found' ) ;
156
+ logger . error ( 'SIWE: Auth route does not match session data' ) ;
157
+ return null ;
158
+ } catch ( error ) {
159
+ logger . error ( 'SIWE: Error getting session' , { error } ) ;
121
160
return null ;
122
161
}
123
- const sessionAddress = fromH160ToAddress ( sessionData . address ) ;
124
- if ( sessionAddress . toLowerCase ( ) === address . toLowerCase ( ) ) {
125
- logger . debug ( 'Session is valid' ) ;
126
- queryClient . setQueryData (
127
- [ 'valorem.trade.v1.Auth' , 'signed-out' ] ,
128
- false ,
129
- ) ;
130
- return {
131
- address : sessionAddress ,
132
- chainId : Number ( fromH256 ( sessionData . chainId ) . toString ( ) ) ,
133
- } ;
134
- }
135
-
136
- logger . error ( 'Auth route does not match session data' ) ;
137
- return null ;
138
162
} ,
139
163
} ;
140
164
return config ;
0 commit comments