Files
explorer-monorepo/backend/wallet/walletconnect_sessions.go
defiQUG ab9c1f9f98
Some checks failed
Deploy Explorer Live / deploy (push) Failing after 15s
Validate Explorer / frontend (push) Failing after 20s
Validate Explorer / smoke-e2e (push) Has been skipped
Ship bridge lanes, public API access doc, and WalletConnect client stack.
Align CCIP catalog UX with 11-lane config-ready routes, document the no-key public API decision, and enable browser WalletConnect pairing with backend session registration and deploy-time project ID wiring.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-23 02:21:37 -07:00

89 lines
2.1 KiB
Go

package wallet
import (
"strings"
"sync"
"time"
)
const walletConnectSessionTTL = 24 * time.Hour
type storedWalletConnectSession struct {
SessionID string
Address string
ChainID int
Connected bool
Status string
Message string
UpdatedAt time.Time
}
var (
walletConnectSessionMu sync.RWMutex
walletConnectSessions = map[string]storedWalletConnectSession{}
)
func purgeExpiredWalletConnectSessions(now time.Time) {
for id, session := range walletConnectSessions {
if now.Sub(session.UpdatedAt) > walletConnectSessionTTL {
delete(walletConnectSessions, id)
}
}
}
// RegisterClientSession records a browser-paired WalletConnect session snapshot.
func RegisterClientSession(sessionID, address string, chainID int) *Session {
sessionID = strings.TrimSpace(sessionID)
address = strings.TrimSpace(address)
now := time.Now().UTC()
walletConnectSessionMu.Lock()
defer walletConnectSessionMu.Unlock()
purgeExpiredWalletConnectSessions(now)
record := storedWalletConnectSession{
SessionID: sessionID,
Address: address,
ChainID: chainID,
Connected: true,
Status: WalletConnectStatusClient,
Message: "WalletConnect session registered by browser client after pairing.",
UpdatedAt: now,
}
walletConnectSessions[sessionID] = record
return sessionFromStored(record)
}
func lookupWalletConnectSession(sessionID string) (*Session, bool) {
sessionID = strings.TrimSpace(sessionID)
if sessionID == "" {
return nil, false
}
now := time.Now().UTC()
walletConnectSessionMu.Lock()
defer walletConnectSessionMu.Unlock()
purgeExpiredWalletConnectSessions(now)
record, ok := walletConnectSessions[sessionID]
if !ok {
return nil, false
}
if now.Sub(record.UpdatedAt) > walletConnectSessionTTL {
delete(walletConnectSessions, sessionID)
return nil, false
}
return sessionFromStored(record), true
}
func sessionFromStored(record storedWalletConnectSession) *Session {
return &Session{
SessionID: record.SessionID,
Address: record.Address,
ChainID: record.ChainID,
Connected: record.Connected,
Status: record.Status,
Message: record.Message,
}
}