|
1 | 1 | /* eslint-disable @typescript-eslint/no-explicit-any */ |
2 | | -import { Network } from '@0xsequence/wallet-primitives' |
3 | | -import { Bytes, Hex } from 'ox' |
| 2 | +import type { ExplicitSessionConfig } from '@0xsequence/wallet-core' |
| 3 | +import { Network, Permission } from '@0xsequence/wallet-primitives' |
| 4 | +import { Bytes, Hex, type Address } from 'ox' |
| 5 | +export { VALUE_FORWARDER_ADDRESS } from './constants.js' |
4 | 6 |
|
5 | 7 | type JsonReplacer = (key: string, value: any) => any |
6 | 8 | type JsonReviver = (key: string, value: any) => any |
@@ -124,6 +126,50 @@ const uint8ArrayReviver: JsonReviver = (key, value) => { |
124 | 126 | export const jsonRevivers = chainRevivers([mapReviver, bigIntReviver, uint8ArrayReviver]) |
125 | 127 | export const jsonReplacers = chainReplacers([mapReplacer, bigIntReplacer, uint8ArrayReplacer]) |
126 | 128 |
|
| 129 | +export type SessionDuration = { |
| 130 | + days?: number |
| 131 | + hours?: number |
| 132 | + minutes?: number |
| 133 | +} |
| 134 | + |
| 135 | +export type NativeTokenSpending = { |
| 136 | + valueLimit: bigint |
| 137 | + allowedRecipients?: Address.Address[] |
| 138 | +} |
| 139 | + |
| 140 | +export type ExplicitSessionParams = { |
| 141 | + chainId: number |
| 142 | + expiresIn: SessionDuration |
| 143 | + permissions: Permission.Permission[] |
| 144 | + nativeTokenSpending?: NativeTokenSpending |
| 145 | +} |
| 146 | + |
| 147 | +export const createExplicitSessionConfig = (params: ExplicitSessionParams): ExplicitSessionConfig => { |
| 148 | + const nowInSeconds = BigInt(Math.floor(Date.now() / 1000)) |
| 149 | + const { days = 0, hours = 0, minutes = 0 } = params.expiresIn |
| 150 | + const sessionLifetimeSeconds = days * 24 * 60 * 60 + hours * 60 * 60 + minutes * 60 |
| 151 | + const deadline = nowInSeconds + BigInt(sessionLifetimeSeconds) |
| 152 | + |
| 153 | + if (params.permissions.length === 0) { |
| 154 | + throw new Error('createExplicitSessionConfig: At least one permission is required.') |
| 155 | + } |
| 156 | + |
| 157 | + const nativeTokenSpending = params.nativeTokenSpending |
| 158 | + const valueLimit = nativeTokenSpending?.valueLimit ?? 0n |
| 159 | + const nativeTokenReceivers = [...(nativeTokenSpending?.allowedRecipients || [])] |
| 160 | + const nativeTokenSpendingPermissions = nativeTokenReceivers.map((receiver) => ({ |
| 161 | + target: receiver, |
| 162 | + rules: [], |
| 163 | + })) |
| 164 | + |
| 165 | + return { |
| 166 | + chainId: params.chainId, |
| 167 | + valueLimit, |
| 168 | + deadline, |
| 169 | + permissions: [...params.permissions, ...nativeTokenSpendingPermissions], |
| 170 | + } |
| 171 | +} |
| 172 | + |
127 | 173 | /** |
128 | 174 | * Apply a template to a string. |
129 | 175 | * |
|
0 commit comments