Skip to content

Commit 5585efa

Browse files
authored
Validate shared session network (#25)
1 parent 425e230 commit 5585efa

2 files changed

Lines changed: 35 additions & 4 deletions

File tree

src/lib/l1signing.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,14 +121,15 @@ export function buildL1SigningContext(params: {
121121
phantomAgent: { source: string; connectionId: `0x${string}` }
122122
typedData: ReturnType<typeof buildL1SignTypedDataParams>
123123
} {
124+
const isMainnet = networkToL1Source(params.network) === 'a'
124125
const envelope = [
125126
params.multisigAddress.toLowerCase(),
126127
params.outerSigner.toLowerCase(),
127128
params.action,
128129
]
129130

130131
const connectionIdBytes = actionHash(envelope, params.vaultAddress, params.nonce)
131-
const phantomAgent = constructPhantomAgent(connectionIdBytes, params.network === 'Mainnet')
132+
const phantomAgent = constructPhantomAgent(connectionIdBytes, isMainnet)
132133
const typedData = {
133134
domain: L1_DOMAIN,
134135
types: L1_TYPES,
@@ -144,6 +145,12 @@ export function buildL1SigningContext(params: {
144145
}
145146
}
146147

148+
function networkToL1Source(network: Network): 'a' | 'b' {
149+
if (network === 'Mainnet') return 'a'
150+
if (network === 'Testnet') return 'b'
151+
throw new Error(`Invalid network for L1 signing: ${String(network)}`)
152+
}
153+
147154
// ============================================================================
148155
// Helpers
149156
// ============================================================================

src/lib/session.ts

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
import { resolve } from '$app/paths';
2-
import type { Session, FormValues } from './types';
2+
import type { Session, FormValues, Network } from './types';
3+
4+
const NETWORK_ALIASES: Record<string, Network> = {
5+
mainnet: 'Mainnet',
6+
main: 'Mainnet',
7+
mainet: 'Mainnet',
8+
testnet: 'Testnet',
9+
test: 'Testnet',
10+
};
311

412
// Encode session to URL-safe base64 for sharing
513
export function encodeSession(session: Session): string {
@@ -13,7 +21,11 @@ export function decodeSession(encoded: string): Session | null {
1321
try {
1422
const bytes = Uint8Array.from(atob(encoded), (c) => c.charCodeAt(0));
1523
const json = new TextDecoder().decode(bytes);
16-
return JSON.parse(json) as Session;
24+
const session = JSON.parse(json) as Session;
25+
return {
26+
...session,
27+
network: parseNetwork(session.network),
28+
};
1729
} catch {
1830
return null;
1931
}
@@ -52,8 +64,20 @@ export function sessionToFormValues(session: Session): FormValues {
5264
return {
5365
actionType: session.actionType,
5466
multisigAddress: session.multisigAddress,
55-
network: session.network,
67+
network: parseNetwork(session.network),
5668
vaultAddress: session.vaultAddress,
5769
fields,
5870
};
5971
}
72+
73+
function parseNetwork(value: unknown): Network {
74+
if (typeof value !== 'string') {
75+
throw new Error(`Invalid network in shared session: ${String(value)}`);
76+
}
77+
78+
const network = NETWORK_ALIASES[value.trim().toLowerCase()];
79+
if (!network) {
80+
throw new Error(`Invalid network in shared session: ${value}`);
81+
}
82+
return network;
83+
}

0 commit comments

Comments
 (0)