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>
89 lines
2.1 KiB
Go
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,
|
|
}
|
|
}
|