diff --git a/.changeset/tiny-files-chew.md b/.changeset/tiny-files-chew.md new file mode 100644 index 000000000..672546fd0 --- /dev/null +++ b/.changeset/tiny-files-chew.md @@ -0,0 +1,18 @@ +--- +'@0xsequence/api': patch +'@0xsequence/builder': patch +'@0xsequence/guard': patch +'@0xsequence/identity-instrument': patch +'@0xsequence/indexer': patch +'@0xsequence/marketplace': patch +'@0xsequence/metadata': patch +'@0xsequence/relayer': patch +'@0xsequence/userdata': patch +'@0xsequence/abi': patch +'@0xsequence/wallet-core': patch +'@0xsequence/dapp-client': patch +'@0xsequence/wallet-primitives': patch +'@0xsequence/wallet-wdk': patch +--- + +dapp client updates for EOA login diff --git a/packages/wallet/dapp-client/src/utils/index.ts b/packages/wallet/dapp-client/src/utils/index.ts index cdb2c4e69..12bf312c3 100644 --- a/packages/wallet/dapp-client/src/utils/index.ts +++ b/packages/wallet/dapp-client/src/utils/index.ts @@ -1,6 +1,8 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -import { Network } from '@0xsequence/wallet-primitives' -import { Bytes, Hex } from 'ox' +import type { ExplicitSessionConfig } from '@0xsequence/wallet-core' +import { Network, Permission } from '@0xsequence/wallet-primitives' +import { Bytes, Hex, type Address } from 'ox' +export { VALUE_FORWARDER_ADDRESS } from './constants.js' type JsonReplacer = (key: string, value: any) => any type JsonReviver = (key: string, value: any) => any @@ -124,6 +126,50 @@ const uint8ArrayReviver: JsonReviver = (key, value) => { export const jsonRevivers = chainRevivers([mapReviver, bigIntReviver, uint8ArrayReviver]) export const jsonReplacers = chainReplacers([mapReplacer, bigIntReplacer, uint8ArrayReplacer]) +export type SessionDuration = { + days?: number + hours?: number + minutes?: number +} + +export type NativeTokenSpending = { + valueLimit: bigint + allowedRecipients?: Address.Address[] +} + +export type ExplicitSessionParams = { + chainId: number + expiresIn: SessionDuration + permissions: Permission.Permission[] + nativeTokenSpending?: NativeTokenSpending +} + +export const createExplicitSessionConfig = (params: ExplicitSessionParams): ExplicitSessionConfig => { + const nowInSeconds = BigInt(Math.floor(Date.now() / 1000)) + const { days = 0, hours = 0, minutes = 0 } = params.expiresIn + const sessionLifetimeSeconds = days * 24 * 60 * 60 + hours * 60 * 60 + minutes * 60 + const deadline = nowInSeconds + BigInt(sessionLifetimeSeconds) + + if (params.permissions.length === 0) { + throw new Error('createExplicitSessionConfig: At least one permission is required.') + } + + const nativeTokenSpending = params.nativeTokenSpending + const valueLimit = nativeTokenSpending?.valueLimit ?? 0n + const nativeTokenReceivers = [...(nativeTokenSpending?.allowedRecipients || [])] + const nativeTokenSpendingPermissions = nativeTokenReceivers.map((receiver) => ({ + target: receiver, + rules: [], + })) + + return { + chainId: params.chainId, + valueLimit, + deadline, + permissions: [...params.permissions, ...nativeTokenSpendingPermissions], + } +} + /** * Apply a template to a string. *