@@ -32,7 +32,7 @@ const createSIWEMessage: SIWEConfig['createMessage'] = ({
3232 */
3333interface GetSIWEConfigProps {
3434 authClient : PromiseClient < typeof Auth > ;
35- queryClient : QueryClient ;
35+ wagmiQueryClient : QueryClient ;
3636 nonceQuery : UseQueryResult < NonceText > ;
3737 authenticateQuery : UseQueryResult < H160 > ;
3838 sessionQuery : UseQueryResult < SiweSession > ;
@@ -51,7 +51,7 @@ interface GetSIWEConfigProps {
5151 */
5252export const getSIWEConfig = ( {
5353 authClient,
54- queryClient ,
54+ wagmiQueryClient ,
5555 nonceQuery,
5656 authenticateQuery,
5757 sessionQuery,
@@ -65,76 +65,100 @@ export const getSIWEConfig = ({
6565
6666 // Returns a promise which, upon resolution, returns the nonce.
6767 async getNonce ( ) {
68- logger . debug ( 'Fetching nonce...' ) ;
68+ logger . debug ( 'SIWE: Fetching nonce...' ) ;
6969 const { data } = await nonceQuery . refetch ( ) ;
7070 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 } ` ) ;
7272 return data . nonce ;
7373 } ,
7474
7575 // Returns a promise which, upon resolution, verifies the contents of the SIWE message.
7676 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 ;
8598 } ,
8699
87100 // Returns a promise which, upon resolution and disconnect/reconnect of the
88101 // client terminates the SIWE session.
89102 async signOut ( ) {
90- logger . debug ( 'Signing out...' ) ;
103+ logger . debug ( 'SIWE: Signing out...' ) ;
91104 try {
92105 await signOutQuery . refetch ( ) ;
93- logger . info ( 'Signed out' ) ;
106+ logger . info ( 'SIWE: Signed out' ) ;
94107 return true ;
95108 } catch ( error ) {
96- logger . error ( 'Error signing out' ) ;
109+ logger . error ( 'SIWE: Error signing out' , { error } ) ;
97110 return false ;
98111 }
99112 } ,
100113
101114 // Returns a promise which, upon await, gets details about the current session.
102115 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+ ) ;
104135
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+ }
116155
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 } ) ;
121160 return null ;
122161 }
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 ;
138162 } ,
139163 } ;
140164 return config ;
0 commit comments