@cartridge/controller 0.13.7 → 0.13.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils.ts","../../src/errors.ts","../../src/node/account.ts","../../src/constants.ts","../../package.json","../../src/icon.ts","../../src/mutex.ts","../../src/provider.ts","../../src/node/server.ts","../../src/node/backend.ts","../../src/node/provider.ts"],"names":["params","call"],"mappings":"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","file":"index.js","sourcesContent":["import { Policy, ApprovalPolicy } from \"@cartridge/controller-wasm/controller\";\nimport { Policies, SessionPolicies } from \"@cartridge/presets\";\nimport { ChainId } from \"@starknet-io/types-js\";\nimport {\n addAddressPadding,\n Call,\n CallData,\n constants,\n getChecksumAddress,\n hash,\n shortString,\n typedData,\n TypedDataRevision,\n} from \"starknet\";\nimport { ParsedSessionPolicies } from \"./policies\";\n\n// Whitelist of allowed property names to prevent prototype pollution\nconst ALLOWED_PROPERTIES = new Set([\n \"contracts\",\n \"messages\",\n \"target\",\n \"method\",\n \"name\",\n \"description\",\n \"types\",\n \"domain\",\n \"primaryType\",\n]);\n\nfunction validatePropertyName(prop: string): void {\n if (!ALLOWED_PROPERTIES.has(prop)) {\n throw new Error(`Invalid property name: ${prop}`);\n }\n}\n\nfunction safeObjectAccess<T>(obj: any, prop: string): T {\n validatePropertyName(prop);\n return obj[prop];\n}\n\nexport function normalizeCalls(calls: Call | Call[]) {\n return toArray(calls).map((call) => {\n return {\n entrypoint: call.entrypoint,\n contractAddress: addAddressPadding(call.contractAddress),\n calldata: CallData.toHex(call.calldata),\n };\n });\n}\n\nexport function getPresetSessionPolicies(\n config: Record<string, unknown>,\n chainId: string,\n): SessionPolicies | undefined {\n const decodedChainId = shortString.decodeShortString(chainId);\n const chains = config.chains as\n | Record<string, Record<string, unknown>>\n | undefined;\n const chainConfig = chains?.[decodedChainId];\n if (!chainConfig?.policies) return undefined;\n return toSessionPolicies(chainConfig.policies as Policies);\n}\n\nexport function toSessionPolicies(policies: Policies): SessionPolicies {\n return Array.isArray(policies)\n ? policies.reduce<SessionPolicies>(\n (prev, p) => {\n if (safeObjectAccess<string>(p, \"target\")) {\n const target = getChecksumAddress(\n safeObjectAccess<string>(p, \"target\"),\n );\n const entrypoint = safeObjectAccess<string>(p, \"method\");\n const contracts = safeObjectAccess<Record<string, any>>(\n prev,\n \"contracts\",\n );\n const item = {\n name: humanizeString(entrypoint),\n entrypoint: entrypoint,\n description: safeObjectAccess<string>(p, \"description\"),\n };\n\n if (target in contracts) {\n const methods = toArray(contracts[target].methods);\n contracts[target] = {\n methods: [...methods, item],\n };\n } else {\n contracts[target] = {\n methods: [item],\n };\n }\n } else {\n const messages = safeObjectAccess<any[]>(prev, \"messages\");\n messages.push(p);\n }\n\n return prev;\n },\n { contracts: {}, messages: [] },\n )\n : policies;\n}\n\n/**\n * Converts parsed session policies to WASM-compatible Policy objects.\n *\n * IMPORTANT: Policies are sorted canonically and addresses are normalized\n * via getChecksumAddress before hashing. Without this, Object.keys/entries\n * reordering or inconsistent address casing can cause identical policies to\n * produce different merkle roots, leading to \"session/not-registered\" errors.\n * See: https://github.com/cartridge-gg/controller/issues/2357\n */\nexport function toWasmPolicies(policies: ParsedSessionPolicies): Policy[] {\n return [\n ...Object.entries(policies.contracts ?? {})\n .sort(([a], [b]) => a.toLowerCase().localeCompare(b.toLowerCase()))\n .flatMap(([target, { methods }]) =>\n toArray(methods)\n .slice()\n .sort((a, b) => a.entrypoint.localeCompare(b.entrypoint))\n .map((m): Policy => {\n // Check if this is an approve entrypoint with spender and amount\n if (m.entrypoint === \"approve\") {\n if (\"spender\" in m && \"amount\" in m && m.spender && m.amount) {\n const approvalPolicy: ApprovalPolicy = {\n target: getChecksumAddress(target),\n spender: m.spender,\n amount: String(m.amount),\n };\n return approvalPolicy;\n }\n\n // Fall back to CallPolicy with deprecation warning\n console.warn(\n `[DEPRECATED] Approve method without spender and amount fields will be rejected in future versions. ` +\n `Please update your preset or policies to include both 'spender' and 'amount' fields for approve calls on contract ${target}. ` +\n `Example: { entrypoint: \"approve\", spender: \"0x...\", amount: \"0x...\" }`,\n );\n }\n\n // For non-approve methods and legacy approve, create a regular CallPolicy\n return {\n target: getChecksumAddress(target),\n method: hash.getSelectorFromName(m.entrypoint),\n authorized: !!m.authorized,\n };\n }),\n ),\n ...(policies.messages ?? [])\n .map((p) => {\n const domainHash = typedData.getStructHash(\n p.types,\n \"StarknetDomain\",\n p.domain,\n TypedDataRevision.ACTIVE,\n );\n const typeHash = typedData.getTypeHash(\n p.types,\n p.primaryType,\n TypedDataRevision.ACTIVE,\n );\n\n return {\n scope_hash: hash.computePoseidonHash(domainHash, typeHash),\n authorized: !!p.authorized,\n };\n })\n .sort((a, b) =>\n a.scope_hash.toString().localeCompare(b.scope_hash.toString()),\n ),\n ];\n}\n\nexport function toArray<T>(val: T | T[]): T[] {\n return Array.isArray(val) ? val : [val];\n}\n\nexport function humanizeString(str: string): string {\n return (\n str\n // Convert from camelCase or snake_case\n .replace(/([a-z])([A-Z])/g, \"$1 $2\") // camelCase to spaces\n .replace(/_/g, \" \") // snake_case to spaces\n .toLowerCase()\n // Capitalize first letter\n .replace(/^\\w/, (c) => c.toUpperCase())\n );\n}\n\nexport function parseChainId(url: URL): ChainId {\n const parts = url.pathname.split(\"/\");\n const isCartridgeHost = url.hostname === \"api.cartridge.gg\";\n\n // Handle non-Cartridge hosts by making a synchronous call to getChainId\n if (!isCartridgeHost) {\n // Check if we're in a browser environment\n if (typeof XMLHttpRequest === \"undefined\") {\n // In Node.js environment (like tests), we can't make synchronous HTTP calls\n // For now, we'll use a placeholder chainId for non-Cartridge hosts in tests\n console.warn(\n `Cannot make synchronous HTTP call in Node.js environment for ${url.toString()}`,\n );\n return shortString.encodeShortString(\"LOCALHOST\") as ChainId;\n }\n\n // Use a synchronous XMLHttpRequest to get the chain ID\n const xhr = new XMLHttpRequest();\n xhr.open(\"POST\", url.toString(), false); // false makes it synchronous\n xhr.setRequestHeader(\"Content-Type\", \"application/json\");\n\n const requestBody = JSON.stringify({\n jsonrpc: \"2.0\",\n method: \"starknet_chainId\",\n params: [],\n id: 1,\n });\n\n try {\n xhr.send(requestBody);\n\n if (xhr.status === 200) {\n const response = JSON.parse(xhr.responseText);\n if (response.result) {\n return response.result as ChainId;\n }\n }\n\n throw new Error(\n `Failed to get chain ID from ${url.toString()}: ${xhr.status} ${xhr.statusText}`,\n );\n } catch (error) {\n throw new Error(`Failed to connect to ${url.toString()}: ${error}`);\n }\n }\n\n if (parts.includes(\"starknet\")) {\n if (parts.includes(\"mainnet\")) {\n return constants.StarknetChainId.SN_MAIN;\n } else if (parts.includes(\"sepolia\")) {\n return constants.StarknetChainId.SN_SEPOLIA;\n }\n } else if (parts.length >= 3) {\n const projectName = parts[2];\n if (parts.includes(\"katana\")) {\n return shortString.encodeShortString(\n `WP_${projectName.toUpperCase().replace(/-/g, \"_\")}`,\n ) as ChainId;\n } else if (parts.includes(\"mainnet\")) {\n return shortString.encodeShortString(\n `GG_${projectName.toUpperCase().replace(/-/g, \"_\")}`,\n ) as ChainId;\n }\n }\n\n throw new Error(`Chain ${url.toString()} not supported`);\n}\n\nexport function isMobile() {\n return (\n window.matchMedia(\"(max-width: 768px)\").matches ||\n \"ontouchstart\" in window ||\n navigator.maxTouchPoints > 0\n );\n}\n\n// Sanitize image src to prevent XSS\nexport function sanitizeImageSrc(src: string): string {\n // Allow only http/https URLs (absolute)\n try {\n const url = new URL(src, window.location.origin);\n if (url.protocol === \"http:\" || url.protocol === \"https:\") {\n return url.href;\n }\n } catch (_) {\n // If invalid, fall through to fallback src below\n }\n // Fallback image (transparent pixel or default)\n return \"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\";\n}\n","export class NotReadyToConnect extends Error {\n constructor() {\n super(\"Not ready to connect\");\n\n Object.setPrototypeOf(this, NotReadyToConnect.prototype);\n }\n}\n\nexport class HeadlessAuthenticationError extends Error {\n constructor(\n message: string,\n public cause?: Error,\n ) {\n super(message);\n this.name = \"HeadlessAuthenticationError\";\n\n Object.setPrototypeOf(this, HeadlessAuthenticationError.prototype);\n }\n}\n\nexport class InvalidCredentialsError extends HeadlessAuthenticationError {\n constructor(credentialType: string) {\n super(`Invalid credentials provided for type: ${credentialType}`);\n this.name = \"InvalidCredentialsError\";\n\n Object.setPrototypeOf(this, InvalidCredentialsError.prototype);\n }\n}\n\nexport class HeadlessModeNotSupportedError extends Error {\n constructor(operation: string) {\n super(`Operation \"${operation}\" is not supported in headless mode`);\n this.name = \"HeadlessModeNotSupportedError\";\n\n Object.setPrototypeOf(this, HeadlessModeNotSupportedError.prototype);\n }\n}\n","import { Policy } from \"@cartridge/controller-wasm\";\nimport { CartridgeSessionAccount } from \"@cartridge/controller-wasm/session\";\nimport { Call, InvokeFunctionResponse, WalletAccount } from \"starknet\";\n\nimport { normalizeCalls } from \"../utils\";\nimport BaseProvider from \"../provider\";\n\nexport * from \"../errors\";\nexport * from \"../types\";\n\nexport default class SessionAccount extends WalletAccount {\n public controller: CartridgeSessionAccount;\n\n constructor(\n provider: BaseProvider,\n {\n rpcUrl,\n privateKey,\n address,\n ownerGuid,\n chainId,\n expiresAt,\n policies,\n guardianKeyGuid,\n metadataHash,\n sessionKeyGuid,\n }: {\n rpcUrl: string;\n privateKey: string;\n address: string;\n ownerGuid: string;\n chainId: string;\n expiresAt: number;\n policies: Policy[];\n guardianKeyGuid: string;\n metadataHash: string;\n sessionKeyGuid: string;\n },\n ) {\n super({\n provider: { nodeUrl: rpcUrl },\n walletProvider: provider,\n address,\n });\n\n this.address = address;\n this.controller = CartridgeSessionAccount.newAsRegistered(\n rpcUrl,\n privateKey,\n address,\n ownerGuid,\n chainId,\n {\n expiresAt,\n policies,\n guardianKeyGuid,\n metadataHash,\n sessionKeyGuid,\n },\n );\n }\n\n /**\n * Invoke execute function in account contract\n *\n * @param calls the invocation object or an array of them, containing:\n * - contractAddress - the address of the contract\n * - entrypoint - the entrypoint of the contract\n * - calldata - (defaults to []) the calldata\n * - signature - (defaults to []) the signature\n *\n * @returns response from addTransaction\n */\n async execute(calls: Call | Call[]): Promise<InvokeFunctionResponse> {\n try {\n const res = await this.controller.executeFromOutside(\n normalizeCalls(calls),\n );\n\n return res;\n } catch (e) {\n return this.controller.execute(normalizeCalls(calls));\n }\n }\n}\n","export const KEYCHAIN_URL = \"https://x.cartridge.gg\";\nexport const PROFILE_URL = \"https://profile.cartridge.gg\";\nexport const API_URL = \"https://api.cartridge.gg\";\n","{\n \"name\": \"@cartridge/controller\",\n \"version\": \"0.13.7\",\n \"description\": \"Cartridge Controller\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/cartridge-gg/controller.git\",\n \"directory\": \"packages/controller\"\n },\n \"module\": \"dist/index.js\",\n \"types\": \"dist/index.d.ts\",\n \"type\": \"module\",\n \"scripts\": {\n \"build:deps\": \"pnpm build\",\n \"dev\": \"vite build --watch\",\n \"build:browser\": \"vite build\",\n \"build:node\": \"tsup --config tsup.node.config.ts\",\n \"build\": \"pnpm build:browser && pnpm build:node\",\n \"format\": \"prettier --write \\\"src/**/*.ts\\\"\",\n \"format:check\": \"prettier --check \\\"src/**/*.ts\\\"\",\n \"test\": \"jest\",\n \"version\": \"pnpm pkg get version\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\"\n },\n \"./session\": {\n \"types\": \"./dist/session.d.ts\",\n \"import\": \"./dist/session.js\"\n },\n \"./session/node\": {\n \"types\": \"./dist/node/index.d.ts\",\n \"import\": \"./dist/node/index.js\",\n \"require\": \"./dist/node/index.cjs\"\n }\n },\n \"dependencies\": {\n \"@cartridge/controller-wasm\": \"catalog:\",\n \"@cartridge/penpal\": \"catalog:\",\n \"micro-sol-signer\": \"^0.5.0\",\n \"bs58\": \"^6.0.0\",\n \"ethers\": \"^6.13.5\",\n \"@starknet-io/get-starknet-wallet-standard\": \"5.0.0-beta.0\",\n \"@starknet-io/types-js\": \"0.9.1\",\n \"@telegram-apps/sdk\": \"^2.4.0\",\n \"@turnkey/sdk-browser\": \"^4.0.0\",\n \"cbor-x\": \"^1.5.0\",\n \"starknet\": \"^8.5.2\",\n \"mipd\": \"^0.0.7\",\n \"open\": \"^10.1.0\",\n \"@walletconnect/ethereum-provider\": \"^2.20.0\"\n },\n \"devDependencies\": {\n \"@cartridge/tsconfig\": \"workspace:*\",\n \"@types/jest\": \"catalog:\",\n \"@types/mocha\": \"catalog:\",\n \"@types/node\": \"catalog:\",\n \"jest\": \"^29.7.0\",\n \"prettier\": \"catalog:\",\n \"rollup-plugin-visualizer\": \"^5.12.0\",\n \"ts-jest\": \"^29.2.5\",\n \"tsup\": \"catalog:\",\n \"typescript\": \"catalog:\",\n \"vite\": \"catalog:\",\n \"vite-plugin-dts\": \"^4.5.3\",\n \"vite-plugin-node-polyfills\": \"^0.23.0\",\n \"vite-plugin-top-level-await\": \"catalog:\",\n \"vite-plugin-wasm\": \"catalog:\"\n }\n}\n","export const icon =\n \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODAwIiBoZWlnaHQ9IjgwMCIgdmlld0JveD0iMCAwIDgwMCA4MDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGZpbHRlcj0idXJsKCNmaWx0ZXIwX2RfNTExMl83ODIpIj4KPHBhdGggZD0iTTQ2OS4yMzYgNzBDNDgyLjM5IDcwIDQ5My4wNTMgODAuNjYzIDQ5My4wNTMgOTMuODE2NFYxNDcuMTQ3TDUxNS4zMzggMTQ3LjE0N0w1MTUuNDI4IDE0Ny4xNDdMNTE1LjU1NCAxNDcuMTQ3TDUxNS44MjYgMTQ3LjE0OUM1MTYuMDE2IDE0Ny4xNTEgNTE2LjIyNSAxNDcuMTUzIDUxNi40NTEgMTQ3LjE1N0M1MTYuOTA0IDE0Ny4xNjQgNTE3LjQyOCAxNDcuMTc2IDUxOC4wMiAxNDcuMTk1QzUxOS4yMDEgMTQ3LjIzNCA1MjAuNjYgMTQ3LjMwNCA1MjIuMzYxIDE0Ny40MjRDNTI1Ljc0MSAxNDcuNjYzIDUzMC4xODUgMTQ4LjExNCA1MzUuMzYzIDE0OC45NjlDNTQ1LjAwMSAxNTAuNTYyIDU1OC41NTYgMTUzLjc4IDU3Mi45MTggMTYwLjYwM0w3MzAuNDIgMjI2LjY3MUw3MzIuMTAxIDIyNy41MDVDNzcxLjc4NyAyNDcuMTc3IDc4OS45OTMgMjg2LjI5NiA3ODkuOTkzIDMyMi4wMzZWNTg1Ljg2NUM3ODkuOTkzIDU4Ni4wNTQgNzg5Ljk5NCA1ODYuMjU0IDc4OS45OTQgNTg2LjQ2M0w3ODkuOTk2IDU4Ni45MTNDNzkwLjAzOCA1OTcuMDk2IDc5MC4xNjEgNjI2Ljk5NiA3NjQuMjMxIDY1Mi44MjNMNzE0Ljc2IDcwMi4wOTVMNzE0LjY0MSA3MDIuMjE1QzcwNC42MDEgNzEyLjI3NSA2OTIuMTIzIDcyMC42NTIgNjc2LjI4NCA3MjQuODc5QzY2NC4zOSA3MjguMDU0IDY1Mi44MjcgNzI3Ljk2NiA2NDguNjM3IDcyNy45MzRMNjQ4LjYxOSA3MjcuOTMzQzY0OC40MDkgNzI3LjkzMiA2NDguMjE5IDcyNy45MyA2NDguMDQ3IDcyNy45M0w2NDcuNzUyIDcyNy45MjlINDgwLjcyMUM0NzQuMDk0IDcyNy45MjkgNDY4LjcyMSA3MjIuNTU2IDQ2OC43MjEgNzE1LjkyOVY2NjguMzg4SDMyOC41ODZDMzI4LjU4NiA2NzIuNjI5IDMyOC41NzIgNjk4LjA1MiAzMjguNTYxIDcxNS45NDRDMzI4LjU1NyA3MjIuNTY5IDMyMy4xODYgNzI3LjkyOSAzMTYuNTYxIDcyNy45MjlIMTUyLjI0NkMxNTIuMTA0IDcyNy45MjkgMTUxLjk0MiA3MjcuOTI5IDE1MS43NjIgNzI3LjkzMUwxNTEuMzYyIDcyNy45MzRDMTQ3LjE3MiA3MjcuOTY2IDEzNS42MDkgNzI4LjA1NCAxMjMuNzE0IDcyNC44NzlDMTA3Ljg3MyA3MjAuNjUxIDk1LjM5MzggNzEyLjI3MiA4NS4zNTI5IDcwMi4yMUw4NS4yMzg2IDcwMi4wOTVMMzUuNjcgNjUyLjcyNUwzNS41NzIzIDY1Mi42MjdDOS44NjI0MiA2MjYuNzggOS45NjY3IDU5Ny4xODUgMTAuMDAzIDU4Ni44NzRDMTAuMDA0MyA1ODYuNTEzIDEwLjAwNTUgNTg2LjE3NyAxMC4wMDU1IDU4NS44NjVWMzIyLjAzNkMxMC4wMDU1IDI4Ni40MyAyOC4xNjYyIDI0Ny4xOTkgNjcuODk3NyAyMjcuNTA1TDY5LjU3OSAyMjYuNjcxTDIyNy4wODEgMTYwLjYwM0MyNDEuNDQzIDE1My43OCAyNTQuOTk4IDE1MC41NjIgMjY0LjYzNiAxNDguOTY5QzI2OS44MTQgMTQ4LjExNCAyNzQuMjU4IDE0Ny42NjMgMjc3LjYzOCAxNDcuNDI0QzI3OS4zMzggMTQ3LjMwNCAyODAuNzk4IDE0Ny4yMzQgMjgxLjk3OSAxNDcuMTk1QzI4Mi41NzEgMTQ3LjE3NiAyODMuMDk1IDE0Ny4xNjQgMjgzLjU0NyAxNDcuMTU3TDI4My45MTcgMTQ3LjE1MkwyODQuMTczIDE0Ny4xNDlMMjg0LjQ0NSAxNDcuMTQ3TDI4NC41NzEgMTQ3LjE0N0wyODQuNjYgMTQ3LjE0N0wzMDYuOTQyIDE0Ny4xNDdWOTMuODE2NEMzMDYuOTQyIDgwLjY2MyAzMTcuNjA1IDcwIDMzMC43NTggNzBINDY5LjIzNloiIGZpbGw9IiMxOTFBMUEiLz4KPHBhdGggZD0iTTM2Ni40ODMgMTI5LjU0SDQzMy41MTJWMjA2LjY4N0gzNjYuNDgzVjEyOS41NFoiIGZpbGw9IiNGQkNCNEEiLz4KPHBhdGggZD0iTTI2OS4wMSA2MDIuNDI5SDE0NC4wMDhDMTM1Ljc2OCA2MDIuNDI5IDEzNS43NjggNTk0LjE0NiAxMzUuNzY4IDU5NC4xNDZWMjgwLjg1QzEzNS43NjggMjgwLjg1IDEzNS43NjggMjcyLjY0NCAxNDQuMDA4IDI3Mi42NDRIMzY2LjQ4M0wzNjYuNDgzIDIwNi42ODdIMjg0LjY5QzI4NC42OSAyMDYuNjg3IDI2OC4xMzQgMjA2LjY4NyAyNTEuNTc5IDIxNC44OTNMOTQuMzQxNCAyODAuODVDNzcuNzg2MSAyODkuMDU3IDY5LjU0NjkgMzA1LjYyMyA2OS41NDY5IDMyMi4wMzVWNTg1Ljg2M0M2OS41NDY5IDU5NC4xNDcgNjkuNTQ2OSA2MDIuMzUzIDc3Ljc4NjEgNjEwLjYzNkwxMjcuNDUyIDY2MC4xMDRDMTM1LjY5MSA2NjguMzg3IDE0MS45MjggNjY4LjM4NyAxNTIuMjQ3IDY2OC4zODdIMjY5LjAyOUMyNjkuMDM3IDY0OC4zNCAyNjkuMDQ2IDYyNC42NTUgMjY5LjA1NCA2MDIuODg3SDUyOC4wMTNWNjY4LjM4N0g2NDcuNzUzQzY1OC4wNzEgNjY4LjM4NyA2NjQuMzA4IDY2OC4zODcgNjcyLjU0NyA2NjAuMTA0TDcyMi4yMTMgNjEwLjYzNkM3MzAuNDUzIDYwMi40MjkgNzMwLjQ1MyA1OTQuMTQ3IDczMC40NTMgNTg1Ljg2M1YzMjIuMDM1QzczMC40NTMgMzA1LjU0NiA3MjIuMjEzIDI4OS4wNTcgNzA1LjY1OCAyODAuODVMNTQ4LjQyMSAyMTQuODkzQzUzMS44NjUgMjA2LjY4NyA1MTUuMzEgMjA2LjY4NyA1MTUuMzEgMjA2LjY4N0g0MzMuNTEyTDQzMy41MTIgMjcyLjY0NEg2NTYuMDY5QzY2NC4zMDggMjcyLjY0NCA2NjQuMzA4IDI4MC44NSA2NjQuMzA4IDI4MC44NVY1OTQuMTQ2QzY2NC4zMDggNTk0LjE0NiA2NjQuMzA4IDYwMi40MjkgNjU2LjA2OSA2MDIuNDI5SDUyOC4yNjJWNTM3LjM5NkgyNjkuMDc1QzI2OS4wNzUgNTQzLjcwNyAyNjkuMDE3IDU5Ni45MTIgMjY5LjAxIDYwMi40MjlaIiBmaWxsPSIjRkJDQjRBIi8+CjxwYXRoIGQ9Ik0yNjkuMDA5IDQzNi4xNzJINTI4LjI2MlYzNzAuNjgxSDI2OS4wNzVDMjY5LjA3NSAzNzcuMzczIDI2OS4wMDkgNDM2Ljc4OCAyNjkuMDA5IDQzNi4xNzJaIiBmaWxsPSIjRkJDQjRBIi8+CjwvZz4KPGRlZnM+CjxmaWx0ZXIgaWQ9ImZpbHRlcjBfZF81MTEyXzc4MiIgeD0iLTQiIHk9IjAiIHdpZHRoPSI4MDgiIGhlaWdodD0iODA4IiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CjxmZUZsb29kIGZsb29kLW9wYWNpdHk9IjAiIHJlc3VsdD0iQmFja2dyb3VuZEltYWdlRml4Ii8+CjxmZUNvbG9yTWF0cml4IGluPSJTb3VyY2VBbHBoYSIgdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwIiByZXN1bHQ9ImhhcmRBbHBoYSIvPgo8ZmVPZmZzZXQgZHk9IjQiLz4KPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMiIvPgo8ZmVDb21wb3NpdGUgaW4yPSJoYXJkQWxwaGEiIG9wZXJhdG9yPSJvdXQiLz4KPGZlQ29sb3JNYXRyaXggdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAuMjUgMCIvPgo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluMj0iQmFja2dyb3VuZEltYWdlRml4IiByZXN1bHQ9ImVmZmVjdDFfZHJvcFNoYWRvd181MTEyXzc4MiIvPgo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9ImVmZmVjdDFfZHJvcFNoYWRvd181MTEyXzc4MiIgcmVzdWx0PSJzaGFwZSIvPgo8L2ZpbHRlcj4KPC9kZWZzPgo8L3N2Zz4K\";\n","function releaseStub() {}\n\n/**\n * A simple mutual exclusion lock. It allows you to obtain and release a lock,\n * ensuring that only one task can access a critical section at a time.\n */\nexport class Mutex {\n private m_lastPromise: Promise<void> = Promise.resolve();\n\n /**\n * Acquire lock\n * @param [bypass=false] option to skip lock acquisition\n */\n public async obtain(bypass = false): Promise<() => void> {\n let release = releaseStub;\n if (bypass) return release;\n const lastPromise = this.m_lastPromise;\n this.m_lastPromise = new Promise<void>((resolve) => (release = resolve));\n await lastPromise;\n return release;\n }\n}\n","import {\n AddInvokeTransactionParameters,\n AddStarknetChainParameters,\n Permission,\n RequestAccountsParameters,\n RequestFn,\n StarknetWindowObject,\n SwitchStarknetChainParameters,\n TypedData,\n UNEXPECTED_ERROR,\n WalletEventHandlers,\n WalletEventListener,\n WalletEvents,\n} from \"@starknet-io/types-js\";\nimport { WalletAccount } from \"starknet\";\nimport manifest from \"../package.json\";\n\nimport { icon } from \"./icon\";\nimport { Mutex } from \"./mutex\";\n\nconst mutex = new Mutex();\n\nexport default abstract class BaseProvider implements StarknetWindowObject {\n public id = \"controller\";\n public name = \"Controller\";\n public version = manifest.version;\n public icon = icon;\n\n public account?: WalletAccount;\n public subscriptions: WalletEvents[] = [];\n\n private _probePromise: Promise<WalletAccount | undefined> | null = null;\n\n protected async safeProbe(): Promise<WalletAccount | undefined> {\n // If we already have an account, return it\n if (this.account) {\n return this.account;\n }\n\n // If we're already probing, wait for the existing probe\n if (this._probePromise) {\n return this._probePromise;\n }\n\n const release = await mutex.obtain();\n return await new Promise<WalletAccount | undefined>(async (resolve) => {\n try {\n this._probePromise = this.probe();\n const result = await this._probePromise;\n resolve(result);\n } finally {\n this._probePromise = null;\n }\n }).finally(() => {\n release();\n });\n }\n\n request: RequestFn = async (call) => {\n switch (call.type) {\n case \"wallet_getPermissions\":\n await this.safeProbe();\n\n if (this.account) {\n return [Permission.ACCOUNTS];\n }\n\n return [];\n\n case \"wallet_requestAccounts\": {\n if (this.account) {\n return [this.account.address];\n }\n\n const silentMode =\n call.params && (call.params as RequestAccountsParameters).silent_mode;\n\n this.account = await this.safeProbe();\n\n if (!this.account && !silentMode) {\n this.account = await this.connect();\n }\n\n if (this.account) {\n return [this.account.address];\n }\n\n return [];\n }\n\n case \"wallet_watchAsset\":\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: \"wallet_watchAsset not implemented\",\n } as UNEXPECTED_ERROR;\n\n case \"wallet_addStarknetChain\": {\n let params = call.params as AddStarknetChainParameters;\n return this.addStarknetChain(params);\n }\n\n case \"wallet_switchStarknetChain\": {\n let params = call.params as SwitchStarknetChainParameters;\n return this.switchStarknetChain(params.chainId);\n }\n\n case \"wallet_requestChainId\":\n if (!this.account) {\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: \"Account not initialized\",\n } as UNEXPECTED_ERROR;\n }\n\n return await this.account.getChainId();\n\n case \"wallet_deploymentData\":\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: \"wallet_deploymentData not implemented\",\n } as UNEXPECTED_ERROR;\n\n case \"wallet_addInvokeTransaction\":\n if (!this.account) {\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: \"Account not initialized\",\n } as UNEXPECTED_ERROR;\n }\n\n let params = call.params as AddInvokeTransactionParameters;\n return await this.account.execute(\n params.calls.map((call) => ({\n contractAddress: call.contract_address,\n entrypoint: call.entry_point,\n calldata: call.calldata,\n })),\n );\n\n case \"wallet_addDeclareTransaction\":\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: \"wallet_addDeclareTransaction not implemented\",\n } as UNEXPECTED_ERROR;\n\n case \"wallet_signTypedData\": {\n if (!this.account) {\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: \"Account not initialized\",\n } as UNEXPECTED_ERROR;\n }\n\n return await this.account.signMessage(call.params as TypedData);\n }\n\n case \"wallet_supportedSpecs\":\n return [];\n case \"wallet_supportedWalletApi\":\n return [];\n default:\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: `Unknown RPC call type: ${call.type}`,\n } as UNEXPECTED_ERROR;\n }\n };\n\n on: WalletEventListener = <E extends keyof WalletEventHandlers>(\n event: E,\n handler: WalletEventHandlers[E],\n ): void => {\n if (event !== \"accountsChanged\" && event !== \"networkChanged\") {\n throw new Error(`Unknown event: ${event}`);\n }\n this.subscriptions.push({ type: event, handler } as WalletEvents);\n };\n\n off: WalletEventListener = <E extends keyof WalletEventHandlers>(\n event: E,\n handler: WalletEventHandlers[E],\n ): void => {\n if (event !== \"accountsChanged\" && event !== \"networkChanged\") {\n throw new Error(`Unknown event: ${event}`);\n }\n const idx = this.subscriptions.findIndex(\n (sub) => sub.type === event && sub.handler === handler,\n );\n if (idx >= 0) {\n this.subscriptions.splice(idx, 1);\n }\n };\n\n protected emitNetworkChanged(chainId: string) {\n this.subscriptions\n .filter((sub) => sub.type === \"networkChanged\")\n .forEach((sub) => {\n (sub.handler as WalletEventHandlers[\"networkChanged\"])(chainId);\n });\n }\n\n protected emitAccountsChanged(accounts: string[]) {\n this.subscriptions\n .filter((sub) => sub.type === \"accountsChanged\")\n .forEach((sub) => {\n (sub.handler as WalletEventHandlers[\"accountsChanged\"])(accounts);\n });\n }\n\n abstract probe(): Promise<WalletAccount | undefined>;\n abstract connect(): Promise<WalletAccount | undefined>;\n abstract switchStarknetChain(chainId: string): Promise<boolean>;\n abstract addStarknetChain(\n chain: AddStarknetChainParameters,\n ): Promise<boolean>;\n}\n","import * as http from \"http\";\nimport { AddressInfo } from \"net\";\n\ntype ServerResponse = http.ServerResponse<http.IncomingMessage> & {\n req: http.IncomingMessage;\n};\n\nexport class CallbackServer {\n private server: http.Server;\n private resolveCallback?: (data: string) => void;\n private rejectCallback?: (error: Error) => void;\n private timeoutId?: NodeJS.Timeout;\n\n constructor() {\n this.server = http.createServer(this.handleRequest.bind(this));\n\n // Handle server errors\n this.server.on(\"error\", (error) => {\n console.error(\"Server error:\", error);\n if (this.rejectCallback) {\n this.rejectCallback(error);\n }\n });\n }\n\n private cleanup() {\n if (this.timeoutId) {\n clearTimeout(this.timeoutId);\n }\n this.server.close();\n }\n\n private handleRequest(req: http.IncomingMessage, res: ServerResponse) {\n if (!req.url?.startsWith(\"/callback\")) {\n res.writeHead(404);\n res.end();\n return;\n }\n\n const params = new URLSearchParams(req.url.split(\"?\")[1]);\n const session = params.get(\"startapp\");\n\n if (!session) {\n console.warn(\"Received callback without session data\");\n res.writeHead(400);\n res.end(\"Missing session data\");\n return;\n }\n\n if (this.resolveCallback) {\n this.resolveCallback(session);\n }\n\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(\n \"<html><body><script>window.close();</script>Session registered successfully. You can close this window.</body></html>\",\n );\n\n this.cleanup();\n }\n\n async listen(): Promise<string> {\n return new Promise((resolve, reject) => {\n this.server.listen(0, \"localhost\", () => {\n const address = this.server.address() as AddressInfo;\n const url = `http://localhost:${address.port}/callback`;\n resolve(url);\n });\n\n this.server.on(\"error\", reject);\n });\n }\n\n async waitForCallback(): Promise<string> {\n return new Promise((resolve, reject) => {\n this.resolveCallback = resolve;\n this.rejectCallback = reject;\n\n this.timeoutId = setTimeout(\n () => {\n console.warn(\"Callback timeout reached\");\n reject(new Error(\"Callback timeout after 5 minutes\"));\n this.cleanup();\n },\n 5 * 60 * 1000,\n );\n });\n }\n}\n","import * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport { CallbackServer } from \"./server\";\n\ninterface SessionSigner {\n privKey: string;\n pubKey: string;\n}\n\ninterface SessionInfo {\n username: string;\n address: string;\n ownerGuid: string;\n transactionHash?: string;\n expiresAt: string;\n}\n\ninterface SessionData {\n signer?: SessionSigner;\n session?: SessionInfo;\n policies?: any;\n lastUsedConnector?: string;\n [key: string]: any;\n}\n\n/**\n * Implements a file system backend.\n * This is designed for Node.js environments to store session data on the filesystem.\n */\nexport class NodeBackend {\n private basePath: string;\n private sessionFile: string;\n private data: SessionData = {};\n private callbackServer?: CallbackServer;\n\n constructor(basePath: string) {\n if (!basePath) {\n throw new Error(\"basePath is required for NodeBackend\");\n }\n this.basePath = basePath;\n this.sessionFile = path.join(this.basePath, \"session.json\");\n }\n\n private async ensureDirectoryExists(): Promise<void> {\n try {\n await fs.access(this.basePath);\n } catch {\n try {\n await fs.mkdir(this.basePath, { recursive: true });\n } catch (error: any) {\n throw new Error(\n `Failed to create directory ${this.basePath}: ${error.message}`,\n );\n }\n }\n }\n\n private async loadData(): Promise<void> {\n try {\n const content = await fs.readFile(this.sessionFile, \"utf-8\");\n const parsed = JSON.parse(content);\n\n if (typeof parsed !== \"object\" || parsed === null) {\n throw new Error(\"Invalid session data format\");\n }\n\n this.data = parsed;\n } catch (error: unknown) {\n if (error instanceof Error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw new Error(`Failed to load session data: ${error.message}`);\n }\n }\n this.data = {};\n }\n }\n\n private async saveData(): Promise<void> {\n try {\n await this.ensureDirectoryExists();\n await fs.writeFile(\n this.sessionFile,\n JSON.stringify(this.data, null, 2),\n \"utf-8\",\n );\n } catch (error: unknown) {\n if (error instanceof Error) {\n throw new Error(`Failed to save session data: ${error.message}`);\n }\n throw error;\n }\n }\n\n async get(key: string): Promise<string | null> {\n if (!key) {\n throw new Error(\"Key is required\");\n }\n\n await this.loadData();\n return this.data[key] ? JSON.stringify(this.data[key]) : null;\n }\n\n async set(key: string, value: string): Promise<void> {\n if (!key) {\n throw new Error(\"Key is required\");\n }\n if (!value) {\n throw new Error(\"Value is required\");\n }\n\n await this.loadData();\n try {\n this.data[key] = JSON.parse(value);\n await this.saveData();\n } catch (error: unknown) {\n if (error instanceof Error) {\n throw new Error(`Failed to set ${key}: ${error.message}`);\n }\n throw error;\n }\n }\n\n async delete(key: string): Promise<void> {\n if (!key) {\n throw new Error(\"Key is required\");\n }\n\n await this.loadData();\n delete this.data[key];\n await this.saveData();\n }\n\n async getRedirectUri(): Promise<string> {\n try {\n this.callbackServer = new CallbackServer();\n return await this.callbackServer.listen();\n } catch (error: unknown) {\n if (error instanceof Error) {\n throw new Error(`Failed to start callback server: ${error.message}`);\n }\n throw error;\n }\n }\n\n async waitForCallback(): Promise<string | null> {\n if (!this.callbackServer) {\n throw new Error(\"Callback server not initialized\");\n }\n return await this.callbackServer.waitForCallback();\n }\n\n openLink(url: string): void {\n if (!url) {\n throw new Error(\"URL is required\");\n }\n\n console.log(`\\n\\t Open url to authorize session: ${url}`);\n }\n}\n","import { ec, encode, stark, WalletAccount } from \"starknet\";\nimport { SessionPolicies } from \"@cartridge/presets\";\nimport { AddStarknetChainParameters } from \"@starknet-io/types-js\";\nimport { signerToGuid } from \"@cartridge/controller-wasm\";\n\nimport SessionAccount from \"./account\";\nimport { KEYCHAIN_URL } from \"../constants\";\nimport BaseProvider from \"../provider\";\nimport { toWasmPolicies } from \"../utils\";\nimport { ParsedSessionPolicies } from \"../policies\";\nimport { NodeBackend } from \"./backend\";\n\nexport type SessionOptions = {\n rpc: string;\n chainId: string;\n policies: SessionPolicies;\n basePath: string;\n keychainUrl?: string;\n};\n\nexport default class SessionProvider extends BaseProvider {\n public id = \"controller_session\";\n public name = \"Controller Session\";\n\n protected _chainId: string;\n protected _rpcUrl: string;\n protected _username?: string;\n protected _policies: ParsedSessionPolicies;\n protected _keychainUrl: string;\n protected _backend: NodeBackend;\n\n constructor({\n rpc,\n chainId,\n policies,\n basePath,\n keychainUrl,\n }: SessionOptions) {\n super();\n\n this._policies = {\n verified: false,\n contracts: policies.contracts\n ? Object.fromEntries(\n Object.entries(policies.contracts).map(([address, contract]) => [\n address,\n {\n ...contract,\n methods: contract.methods.map((method) => ({\n ...method,\n authorized: true,\n })),\n },\n ]),\n )\n : undefined,\n messages: policies.messages?.map((message) => ({\n ...message,\n authorized: true,\n })),\n };\n\n this._rpcUrl = rpc;\n this._chainId = chainId;\n this._keychainUrl = keychainUrl || KEYCHAIN_URL;\n this._backend = new NodeBackend(basePath);\n }\n\n async username() {\n const sessionStr = await this._backend.get(\"session\");\n if (sessionStr) {\n const session = JSON.parse(sessionStr);\n return session.username;\n }\n return undefined;\n }\n\n async probe(): Promise<WalletAccount | undefined> {\n if (this.account) {\n return this.account;\n }\n\n const [sessionStr, signerStr] = await Promise.all([\n this._backend.get(\"session\"),\n this._backend.get(\"signer\"),\n ]);\n\n if (!sessionStr || !signerStr) {\n return undefined;\n }\n\n const session = JSON.parse(sessionStr);\n const signer = JSON.parse(signerStr);\n\n // Check expiration\n const expirationTime = parseInt(session.expiresAt) * 1000;\n if (Date.now() >= expirationTime) {\n await this.disconnect();\n return undefined;\n }\n\n this._username = session.username;\n this.account = new SessionAccount(this, {\n rpcUrl: this._rpcUrl,\n privateKey: signer.privKey,\n address: session.address,\n ownerGuid: session.ownerGuid,\n chainId: this._chainId,\n expiresAt: parseInt(session.expiresAt),\n policies: toWasmPolicies(this._policies),\n guardianKeyGuid: session.guardianKeyGuid,\n metadataHash: session.metadataHash,\n sessionKeyGuid: session.sessionKeyGuid,\n });\n\n return this.account;\n }\n\n async connect(): Promise<WalletAccount | undefined> {\n if (this.account) {\n return this.account;\n }\n\n const account = await this.probe();\n if (account) {\n return account;\n }\n\n const pk = stark.randomAddress();\n const publicKey = ec.starkCurve.getStarkKey(pk);\n\n await this._backend.set(\n \"signer\",\n JSON.stringify({\n privKey: pk,\n pubKey: publicKey,\n }),\n );\n\n // Get redirect URI from local server\n const redirectUri = await this._backend.getRedirectUri();\n\n const url = `${\n this._keychainUrl\n }/session?public_key=${encodeURIComponent(publicKey)}&redirect_uri=${encodeURIComponent(\n redirectUri,\n )}&redirect_query_name=startapp&policies=${encodeURIComponent(\n JSON.stringify(this._policies),\n )}&rpc_url=${encodeURIComponent(this._rpcUrl)}`;\n\n this._backend.openLink(url);\n\n // Wait for callback with session data\n const sessionData = await this._backend.waitForCallback();\n if (sessionData) {\n const sessionRegistration = JSON.parse(atob(sessionData));\n const formattedPk = encode.addHexPrefix(publicKey);\n // Ensure addresses are properly formatted\n sessionRegistration.address = sessionRegistration.address.toLowerCase();\n sessionRegistration.ownerGuid =\n sessionRegistration.ownerGuid.toLowerCase();\n sessionRegistration.guardianKeyGuid = \"0x0\";\n sessionRegistration.metadataHash = \"0x0\";\n sessionRegistration.sessionKeyGuid = signerToGuid({\n starknet: { privateKey: formattedPk },\n });\n await this._backend.set(\"session\", JSON.stringify(sessionRegistration));\n return this.probe();\n }\n\n return undefined;\n }\n\n async disconnect(): Promise<void> {\n await this._backend.delete(\"signer\");\n await this._backend.delete(\"session\");\n this.account = undefined;\n this._username = undefined;\n }\n\n switchStarknetChain(_chainId: string): Promise<boolean> {\n throw new Error(\"switchStarknetChain not implemented\");\n }\n\n addStarknetChain(_chain: AddStarknetChainParameters): Promise<boolean> {\n throw new Error(\"addStarknetChain not implemented\");\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/utils.ts","../../src/errors.ts","../../src/node/account.ts","../../src/constants.ts","../../package.json","../../src/icon.ts","../../src/mutex.ts","../../src/provider.ts","../../src/node/server.ts","../../src/node/backend.ts","../../src/node/provider.ts"],"names":["params","call"],"mappings":"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","file":"index.js","sourcesContent":["import { Policy, ApprovalPolicy } from \"@cartridge/controller-wasm/controller\";\nimport { Policies, SessionPolicies } from \"@cartridge/presets\";\nimport { ChainId } from \"@starknet-io/types-js\";\nimport {\n addAddressPadding,\n Call,\n CallData,\n constants,\n getChecksumAddress,\n hash,\n shortString,\n typedData,\n TypedDataRevision,\n} from \"starknet\";\nimport { ParsedSessionPolicies } from \"./policies\";\n\n// Whitelist of allowed property names to prevent prototype pollution\nconst ALLOWED_PROPERTIES = new Set([\n \"contracts\",\n \"messages\",\n \"target\",\n \"method\",\n \"name\",\n \"description\",\n \"types\",\n \"domain\",\n \"primaryType\",\n]);\n\nfunction validatePropertyName(prop: string): void {\n if (!ALLOWED_PROPERTIES.has(prop)) {\n throw new Error(`Invalid property name: ${prop}`);\n }\n}\n\nfunction safeObjectAccess<T>(obj: any, prop: string): T {\n validatePropertyName(prop);\n return obj[prop];\n}\n\nexport function normalizeCalls(calls: Call | Call[]) {\n return toArray(calls).map((call) => {\n return {\n entrypoint: call.entrypoint,\n contractAddress: addAddressPadding(call.contractAddress),\n calldata: CallData.toHex(call.calldata),\n };\n });\n}\n\nexport function getPresetSessionPolicies(\n config: Record<string, unknown>,\n chainId: string,\n): SessionPolicies | undefined {\n const decodedChainId = shortString.decodeShortString(chainId);\n const chains = config.chains as\n | Record<string, Record<string, unknown>>\n | undefined;\n const chainConfig = chains?.[decodedChainId];\n if (!chainConfig?.policies) return undefined;\n return toSessionPolicies(chainConfig.policies as Policies);\n}\n\nexport function toSessionPolicies(policies: Policies): SessionPolicies {\n return Array.isArray(policies)\n ? policies.reduce<SessionPolicies>(\n (prev, p) => {\n if (safeObjectAccess<string>(p, \"target\")) {\n const target = getChecksumAddress(\n safeObjectAccess<string>(p, \"target\"),\n );\n const entrypoint = safeObjectAccess<string>(p, \"method\");\n const contracts = safeObjectAccess<Record<string, any>>(\n prev,\n \"contracts\",\n );\n const item = {\n name: humanizeString(entrypoint),\n entrypoint: entrypoint,\n description: safeObjectAccess<string>(p, \"description\"),\n };\n\n if (target in contracts) {\n const methods = toArray(contracts[target].methods);\n contracts[target] = {\n methods: [...methods, item],\n };\n } else {\n contracts[target] = {\n methods: [item],\n };\n }\n } else {\n const messages = safeObjectAccess<any[]>(prev, \"messages\");\n messages.push(p);\n }\n\n return prev;\n },\n { contracts: {}, messages: [] },\n )\n : policies;\n}\n\n/**\n * Converts parsed session policies to WASM-compatible Policy objects.\n *\n * IMPORTANT: Policies are sorted canonically and addresses are normalized\n * via getChecksumAddress before hashing. Without this, Object.keys/entries\n * reordering or inconsistent address casing can cause identical policies to\n * produce different merkle roots, leading to \"session/not-registered\" errors.\n * See: https://github.com/cartridge-gg/controller/issues/2357\n */\nexport function toWasmPolicies(policies: ParsedSessionPolicies): Policy[] {\n return [\n ...Object.entries(policies.contracts ?? {})\n .sort(([a], [b]) => a.toLowerCase().localeCompare(b.toLowerCase()))\n .flatMap(([target, { methods }]) =>\n toArray(methods)\n .slice()\n .sort((a, b) => a.entrypoint.localeCompare(b.entrypoint))\n .map((m): Policy => {\n // Check if this is an approve entrypoint with spender and amount\n if (m.entrypoint === \"approve\") {\n if (\"spender\" in m && \"amount\" in m && m.spender && m.amount) {\n const approvalPolicy: ApprovalPolicy = {\n target: getChecksumAddress(target),\n spender: m.spender,\n amount: String(m.amount),\n };\n return approvalPolicy;\n }\n\n // Fall back to CallPolicy with deprecation warning\n console.warn(\n `[DEPRECATED] Approve method without spender and amount fields will be rejected in future versions. ` +\n `Please update your preset or policies to include both 'spender' and 'amount' fields for approve calls on contract ${target}. ` +\n `Example: { entrypoint: \"approve\", spender: \"0x...\", amount: \"0x...\" }`,\n );\n }\n\n // For non-approve methods and legacy approve, create a regular CallPolicy\n return {\n target: getChecksumAddress(target),\n method: hash.getSelectorFromName(m.entrypoint),\n authorized: !!m.authorized,\n };\n }),\n ),\n ...(policies.messages ?? [])\n .map((p) => {\n const domainHash = typedData.getStructHash(\n p.types,\n \"StarknetDomain\",\n p.domain,\n TypedDataRevision.ACTIVE,\n );\n const typeHash = typedData.getTypeHash(\n p.types,\n p.primaryType,\n TypedDataRevision.ACTIVE,\n );\n\n return {\n scope_hash: hash.computePoseidonHash(domainHash, typeHash),\n authorized: !!p.authorized,\n };\n })\n .sort((a, b) =>\n a.scope_hash.toString().localeCompare(b.scope_hash.toString()),\n ),\n ];\n}\n\nexport function toArray<T>(val: T | T[]): T[] {\n return Array.isArray(val) ? val : [val];\n}\n\nexport function humanizeString(str: string): string {\n return (\n str\n // Convert from camelCase or snake_case\n .replace(/([a-z])([A-Z])/g, \"$1 $2\") // camelCase to spaces\n .replace(/_/g, \" \") // snake_case to spaces\n .toLowerCase()\n // Capitalize first letter\n .replace(/^\\w/, (c) => c.toUpperCase())\n );\n}\n\nexport function parseChainId(url: URL): ChainId {\n const parts = url.pathname.split(\"/\");\n const isCartridgeHost = url.hostname === \"api.cartridge.gg\";\n\n // Handle non-Cartridge hosts by making a synchronous call to getChainId\n if (!isCartridgeHost) {\n // Check if we're in a browser environment\n if (typeof XMLHttpRequest === \"undefined\") {\n // In Node.js environment (like tests), we can't make synchronous HTTP calls\n // For now, we'll use a placeholder chainId for non-Cartridge hosts in tests\n console.warn(\n `Cannot make synchronous HTTP call in Node.js environment for ${url.toString()}`,\n );\n return shortString.encodeShortString(\"LOCALHOST\") as ChainId;\n }\n\n // Use a synchronous XMLHttpRequest to get the chain ID\n const xhr = new XMLHttpRequest();\n xhr.open(\"POST\", url.toString(), false); // false makes it synchronous\n xhr.setRequestHeader(\"Content-Type\", \"application/json\");\n\n const requestBody = JSON.stringify({\n jsonrpc: \"2.0\",\n method: \"starknet_chainId\",\n params: [],\n id: 1,\n });\n\n try {\n xhr.send(requestBody);\n\n if (xhr.status === 200) {\n const response = JSON.parse(xhr.responseText);\n if (response.result) {\n return response.result as ChainId;\n }\n }\n\n throw new Error(\n `Failed to get chain ID from ${url.toString()}: ${xhr.status} ${xhr.statusText}`,\n );\n } catch (error) {\n throw new Error(`Failed to connect to ${url.toString()}: ${error}`);\n }\n }\n\n if (parts.includes(\"starknet\")) {\n if (parts.includes(\"mainnet\")) {\n return constants.StarknetChainId.SN_MAIN;\n } else if (parts.includes(\"sepolia\")) {\n return constants.StarknetChainId.SN_SEPOLIA;\n }\n } else if (parts.length >= 3) {\n const projectName = parts[2];\n if (parts.includes(\"katana\")) {\n return shortString.encodeShortString(\n `WP_${projectName.toUpperCase().replace(/-/g, \"_\")}`,\n ) as ChainId;\n } else if (parts.includes(\"mainnet\")) {\n return shortString.encodeShortString(\n `GG_${projectName.toUpperCase().replace(/-/g, \"_\")}`,\n ) as ChainId;\n }\n }\n\n throw new Error(`Chain ${url.toString()} not supported`);\n}\n\nexport function isMobile() {\n return (\n window.matchMedia(\"(max-width: 768px)\").matches ||\n \"ontouchstart\" in window ||\n navigator.maxTouchPoints > 0\n );\n}\n\n// Sanitize image src to prevent XSS\nexport function sanitizeImageSrc(src: string): string {\n // Allow only http/https URLs (absolute)\n try {\n const url = new URL(src, window.location.origin);\n if (url.protocol === \"http:\" || url.protocol === \"https:\") {\n return url.href;\n }\n } catch (_) {\n // If invalid, fall through to fallback src below\n }\n // Fallback image (transparent pixel or default)\n return \"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\";\n}\n","export class NotReadyToConnect extends Error {\n constructor() {\n super(\"Not ready to connect\");\n\n Object.setPrototypeOf(this, NotReadyToConnect.prototype);\n }\n}\n\nexport class HeadlessAuthenticationError extends Error {\n constructor(\n message: string,\n public cause?: Error,\n ) {\n super(message);\n this.name = \"HeadlessAuthenticationError\";\n\n Object.setPrototypeOf(this, HeadlessAuthenticationError.prototype);\n }\n}\n\nexport class InvalidCredentialsError extends HeadlessAuthenticationError {\n constructor(credentialType: string) {\n super(`Invalid credentials provided for type: ${credentialType}`);\n this.name = \"InvalidCredentialsError\";\n\n Object.setPrototypeOf(this, InvalidCredentialsError.prototype);\n }\n}\n\nexport class HeadlessModeNotSupportedError extends Error {\n constructor(operation: string) {\n super(`Operation \"${operation}\" is not supported in headless mode`);\n this.name = \"HeadlessModeNotSupportedError\";\n\n Object.setPrototypeOf(this, HeadlessModeNotSupportedError.prototype);\n }\n}\n","import { Policy } from \"@cartridge/controller-wasm\";\nimport { CartridgeSessionAccount } from \"@cartridge/controller-wasm/session\";\nimport { Call, InvokeFunctionResponse, WalletAccount } from \"starknet\";\n\nimport { normalizeCalls } from \"../utils\";\nimport BaseProvider from \"../provider\";\n\nexport * from \"../errors\";\nexport * from \"../types\";\n\nexport default class SessionAccount extends WalletAccount {\n public controller: CartridgeSessionAccount;\n\n constructor(\n provider: BaseProvider,\n {\n rpcUrl,\n privateKey,\n address,\n ownerGuid,\n chainId,\n expiresAt,\n policies,\n guardianKeyGuid,\n metadataHash,\n sessionKeyGuid,\n }: {\n rpcUrl: string;\n privateKey: string;\n address: string;\n ownerGuid: string;\n chainId: string;\n expiresAt: number;\n policies: Policy[];\n guardianKeyGuid: string;\n metadataHash: string;\n sessionKeyGuid: string;\n },\n ) {\n super({\n provider: { nodeUrl: rpcUrl },\n walletProvider: provider,\n address,\n });\n\n this.address = address;\n this.controller = CartridgeSessionAccount.newAsRegistered(\n rpcUrl,\n privateKey,\n address,\n ownerGuid,\n chainId,\n {\n expiresAt,\n policies,\n guardianKeyGuid,\n metadataHash,\n sessionKeyGuid,\n },\n );\n }\n\n /**\n * Invoke execute function in account contract\n *\n * @param calls the invocation object or an array of them, containing:\n * - contractAddress - the address of the contract\n * - entrypoint - the entrypoint of the contract\n * - calldata - (defaults to []) the calldata\n * - signature - (defaults to []) the signature\n *\n * @returns response from addTransaction\n */\n async execute(calls: Call | Call[]): Promise<InvokeFunctionResponse> {\n try {\n const res = await this.controller.executeFromOutside(\n normalizeCalls(calls),\n );\n\n return res;\n } catch (e) {\n return this.controller.execute(normalizeCalls(calls));\n }\n }\n}\n","export const KEYCHAIN_URL = \"https://x.cartridge.gg\";\nexport const PROFILE_URL = \"https://profile.cartridge.gg\";\nexport const API_URL = \"https://api.cartridge.gg\";\n\n// Query parameter name used to pass session data via URL redirects.\n// Borrowed from Telegram mini app convention, but the choice is arbitrary.\nexport const REDIRECT_QUERY_NAME = \"startapp\";\n","{\n \"name\": \"@cartridge/controller\",\n \"version\": \"0.13.9\",\n \"description\": \"Cartridge Controller\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/cartridge-gg/controller.git\",\n \"directory\": \"packages/controller\"\n },\n \"module\": \"dist/index.js\",\n \"types\": \"dist/index.d.ts\",\n \"type\": \"module\",\n \"scripts\": {\n \"build:deps\": \"pnpm build:browser && pnpm build:node\",\n \"dev\": \"vite build --watch\",\n \"build:browser\": \"vite build\",\n \"build:node\": \"tsup --config tsup.node.config.ts\",\n \"format\": \"prettier --write \\\"src/**/*.ts\\\"\",\n \"format:check\": \"prettier --check \\\"src/**/*.ts\\\"\",\n \"test\": \"jest\",\n \"version\": \"pnpm pkg get version\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\"\n },\n \"./session\": {\n \"types\": \"./dist/session.d.ts\",\n \"import\": \"./dist/session.js\"\n },\n \"./session/node\": {\n \"types\": \"./dist/node/index.d.ts\",\n \"import\": \"./dist/node/index.js\",\n \"require\": \"./dist/node/index.cjs\"\n }\n },\n \"dependencies\": {\n \"@cartridge/controller-wasm\": \"catalog:\",\n \"@cartridge/penpal\": \"catalog:\",\n \"micro-sol-signer\": \"^0.5.0\",\n \"bs58\": \"^6.0.0\",\n \"ethers\": \"^6.13.5\",\n \"@starknet-io/get-starknet-wallet-standard\": \"5.0.0-beta.0\",\n \"@starknet-io/types-js\": \"0.9.1\",\n \"@telegram-apps/sdk\": \"^2.4.0\",\n \"@turnkey/sdk-browser\": \"^4.0.0\",\n \"cbor-x\": \"^1.5.0\",\n \"starknet\": \"^8.5.2\",\n \"mipd\": \"^0.0.7\",\n \"open\": \"^10.1.0\",\n \"@walletconnect/ethereum-provider\": \"^2.20.0\"\n },\n \"devDependencies\": {\n \"@cartridge/tsconfig\": \"workspace:*\",\n \"@types/jest\": \"catalog:\",\n \"@types/mocha\": \"catalog:\",\n \"@types/node\": \"catalog:\",\n \"jest\": \"^29.7.0\",\n \"prettier\": \"catalog:\",\n \"rollup-plugin-visualizer\": \"^5.12.0\",\n \"ts-jest\": \"^29.2.5\",\n \"tsup\": \"catalog:\",\n \"typescript\": \"catalog:\",\n \"vite\": \"catalog:\",\n \"vite-plugin-dts\": \"^4.5.3\",\n \"vite-plugin-node-polyfills\": \"^0.23.0\",\n \"vite-plugin-top-level-await\": \"catalog:\",\n \"vite-plugin-wasm\": \"catalog:\"\n }\n}\n","export const icon =\n \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODAwIiBoZWlnaHQ9IjgwMCIgdmlld0JveD0iMCAwIDgwMCA4MDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGZpbHRlcj0idXJsKCNmaWx0ZXIwX2RfNTExMl83ODIpIj4KPHBhdGggZD0iTTQ2OS4yMzYgNzBDNDgyLjM5IDcwIDQ5My4wNTMgODAuNjYzIDQ5My4wNTMgOTMuODE2NFYxNDcuMTQ3TDUxNS4zMzggMTQ3LjE0N0w1MTUuNDI4IDE0Ny4xNDdMNTE1LjU1NCAxNDcuMTQ3TDUxNS44MjYgMTQ3LjE0OUM1MTYuMDE2IDE0Ny4xNTEgNTE2LjIyNSAxNDcuMTUzIDUxNi40NTEgMTQ3LjE1N0M1MTYuOTA0IDE0Ny4xNjQgNTE3LjQyOCAxNDcuMTc2IDUxOC4wMiAxNDcuMTk1QzUxOS4yMDEgMTQ3LjIzNCA1MjAuNjYgMTQ3LjMwNCA1MjIuMzYxIDE0Ny40MjRDNTI1Ljc0MSAxNDcuNjYzIDUzMC4xODUgMTQ4LjExNCA1MzUuMzYzIDE0OC45NjlDNTQ1LjAwMSAxNTAuNTYyIDU1OC41NTYgMTUzLjc4IDU3Mi45MTggMTYwLjYwM0w3MzAuNDIgMjI2LjY3MUw3MzIuMTAxIDIyNy41MDVDNzcxLjc4NyAyNDcuMTc3IDc4OS45OTMgMjg2LjI5NiA3ODkuOTkzIDMyMi4wMzZWNTg1Ljg2NUM3ODkuOTkzIDU4Ni4wNTQgNzg5Ljk5NCA1ODYuMjU0IDc4OS45OTQgNTg2LjQ2M0w3ODkuOTk2IDU4Ni45MTNDNzkwLjAzOCA1OTcuMDk2IDc5MC4xNjEgNjI2Ljk5NiA3NjQuMjMxIDY1Mi44MjNMNzE0Ljc2IDcwMi4wOTVMNzE0LjY0MSA3MDIuMjE1QzcwNC42MDEgNzEyLjI3NSA2OTIuMTIzIDcyMC42NTIgNjc2LjI4NCA3MjQuODc5QzY2NC4zOSA3MjguMDU0IDY1Mi44MjcgNzI3Ljk2NiA2NDguNjM3IDcyNy45MzRMNjQ4LjYxOSA3MjcuOTMzQzY0OC40MDkgNzI3LjkzMiA2NDguMjE5IDcyNy45MyA2NDguMDQ3IDcyNy45M0w2NDcuNzUyIDcyNy45MjlINDgwLjcyMUM0NzQuMDk0IDcyNy45MjkgNDY4LjcyMSA3MjIuNTU2IDQ2OC43MjEgNzE1LjkyOVY2NjguMzg4SDMyOC41ODZDMzI4LjU4NiA2NzIuNjI5IDMyOC41NzIgNjk4LjA1MiAzMjguNTYxIDcxNS45NDRDMzI4LjU1NyA3MjIuNTY5IDMyMy4xODYgNzI3LjkyOSAzMTYuNTYxIDcyNy45MjlIMTUyLjI0NkMxNTIuMTA0IDcyNy45MjkgMTUxLjk0MiA3MjcuOTI5IDE1MS43NjIgNzI3LjkzMUwxNTEuMzYyIDcyNy45MzRDMTQ3LjE3MiA3MjcuOTY2IDEzNS42MDkgNzI4LjA1NCAxMjMuNzE0IDcyNC44NzlDMTA3Ljg3MyA3MjAuNjUxIDk1LjM5MzggNzEyLjI3MiA4NS4zNTI5IDcwMi4yMUw4NS4yMzg2IDcwMi4wOTVMMzUuNjcgNjUyLjcyNUwzNS41NzIzIDY1Mi42MjdDOS44NjI0MiA2MjYuNzggOS45NjY3IDU5Ny4xODUgMTAuMDAzIDU4Ni44NzRDMTAuMDA0MyA1ODYuNTEzIDEwLjAwNTUgNTg2LjE3NyAxMC4wMDU1IDU4NS44NjVWMzIyLjAzNkMxMC4wMDU1IDI4Ni40MyAyOC4xNjYyIDI0Ny4xOTkgNjcuODk3NyAyMjcuNTA1TDY5LjU3OSAyMjYuNjcxTDIyNy4wODEgMTYwLjYwM0MyNDEuNDQzIDE1My43OCAyNTQuOTk4IDE1MC41NjIgMjY0LjYzNiAxNDguOTY5QzI2OS44MTQgMTQ4LjExNCAyNzQuMjU4IDE0Ny42NjMgMjc3LjYzOCAxNDcuNDI0QzI3OS4zMzggMTQ3LjMwNCAyODAuNzk4IDE0Ny4yMzQgMjgxLjk3OSAxNDcuMTk1QzI4Mi41NzEgMTQ3LjE3NiAyODMuMDk1IDE0Ny4xNjQgMjgzLjU0NyAxNDcuMTU3TDI4My45MTcgMTQ3LjE1MkwyODQuMTczIDE0Ny4xNDlMMjg0LjQ0NSAxNDcuMTQ3TDI4NC41NzEgMTQ3LjE0N0wyODQuNjYgMTQ3LjE0N0wzMDYuOTQyIDE0Ny4xNDdWOTMuODE2NEMzMDYuOTQyIDgwLjY2MyAzMTcuNjA1IDcwIDMzMC43NTggNzBINDY5LjIzNloiIGZpbGw9IiMxOTFBMUEiLz4KPHBhdGggZD0iTTM2Ni40ODMgMTI5LjU0SDQzMy41MTJWMjA2LjY4N0gzNjYuNDgzVjEyOS41NFoiIGZpbGw9IiNGQkNCNEEiLz4KPHBhdGggZD0iTTI2OS4wMSA2MDIuNDI5SDE0NC4wMDhDMTM1Ljc2OCA2MDIuNDI5IDEzNS43NjggNTk0LjE0NiAxMzUuNzY4IDU5NC4xNDZWMjgwLjg1QzEzNS43NjggMjgwLjg1IDEzNS43NjggMjcyLjY0NCAxNDQuMDA4IDI3Mi42NDRIMzY2LjQ4M0wzNjYuNDgzIDIwNi42ODdIMjg0LjY5QzI4NC42OSAyMDYuNjg3IDI2OC4xMzQgMjA2LjY4NyAyNTEuNTc5IDIxNC44OTNMOTQuMzQxNCAyODAuODVDNzcuNzg2MSAyODkuMDU3IDY5LjU0NjkgMzA1LjYyMyA2OS41NDY5IDMyMi4wMzVWNTg1Ljg2M0M2OS41NDY5IDU5NC4xNDcgNjkuNTQ2OSA2MDIuMzUzIDc3Ljc4NjEgNjEwLjYzNkwxMjcuNDUyIDY2MC4xMDRDMTM1LjY5MSA2NjguMzg3IDE0MS45MjggNjY4LjM4NyAxNTIuMjQ3IDY2OC4zODdIMjY5LjAyOUMyNjkuMDM3IDY0OC4zNCAyNjkuMDQ2IDYyNC42NTUgMjY5LjA1NCA2MDIuODg3SDUyOC4wMTNWNjY4LjM4N0g2NDcuNzUzQzY1OC4wNzEgNjY4LjM4NyA2NjQuMzA4IDY2OC4zODcgNjcyLjU0NyA2NjAuMTA0TDcyMi4yMTMgNjEwLjYzNkM3MzAuNDUzIDYwMi40MjkgNzMwLjQ1MyA1OTQuMTQ3IDczMC40NTMgNTg1Ljg2M1YzMjIuMDM1QzczMC40NTMgMzA1LjU0NiA3MjIuMjEzIDI4OS4wNTcgNzA1LjY1OCAyODAuODVMNTQ4LjQyMSAyMTQuODkzQzUzMS44NjUgMjA2LjY4NyA1MTUuMzEgMjA2LjY4NyA1MTUuMzEgMjA2LjY4N0g0MzMuNTEyTDQzMy41MTIgMjcyLjY0NEg2NTYuMDY5QzY2NC4zMDggMjcyLjY0NCA2NjQuMzA4IDI4MC44NSA2NjQuMzA4IDI4MC44NVY1OTQuMTQ2QzY2NC4zMDggNTk0LjE0NiA2NjQuMzA4IDYwMi40MjkgNjU2LjA2OSA2MDIuNDI5SDUyOC4yNjJWNTM3LjM5NkgyNjkuMDc1QzI2OS4wNzUgNTQzLjcwNyAyNjkuMDE3IDU5Ni45MTIgMjY5LjAxIDYwMi40MjlaIiBmaWxsPSIjRkJDQjRBIi8+CjxwYXRoIGQ9Ik0yNjkuMDA5IDQzNi4xNzJINTI4LjI2MlYzNzAuNjgxSDI2OS4wNzVDMjY5LjA3NSAzNzcuMzczIDI2OS4wMDkgNDM2Ljc4OCAyNjkuMDA5IDQzNi4xNzJaIiBmaWxsPSIjRkJDQjRBIi8+CjwvZz4KPGRlZnM+CjxmaWx0ZXIgaWQ9ImZpbHRlcjBfZF81MTEyXzc4MiIgeD0iLTQiIHk9IjAiIHdpZHRoPSI4MDgiIGhlaWdodD0iODA4IiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CjxmZUZsb29kIGZsb29kLW9wYWNpdHk9IjAiIHJlc3VsdD0iQmFja2dyb3VuZEltYWdlRml4Ii8+CjxmZUNvbG9yTWF0cml4IGluPSJTb3VyY2VBbHBoYSIgdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwIiByZXN1bHQ9ImhhcmRBbHBoYSIvPgo8ZmVPZmZzZXQgZHk9IjQiLz4KPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMiIvPgo8ZmVDb21wb3NpdGUgaW4yPSJoYXJkQWxwaGEiIG9wZXJhdG9yPSJvdXQiLz4KPGZlQ29sb3JNYXRyaXggdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAuMjUgMCIvPgo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluMj0iQmFja2dyb3VuZEltYWdlRml4IiByZXN1bHQ9ImVmZmVjdDFfZHJvcFNoYWRvd181MTEyXzc4MiIvPgo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9ImVmZmVjdDFfZHJvcFNoYWRvd181MTEyXzc4MiIgcmVzdWx0PSJzaGFwZSIvPgo8L2ZpbHRlcj4KPC9kZWZzPgo8L3N2Zz4K\";\n","function releaseStub() {}\n\n/**\n * A simple mutual exclusion lock. It allows you to obtain and release a lock,\n * ensuring that only one task can access a critical section at a time.\n */\nexport class Mutex {\n private m_lastPromise: Promise<void> = Promise.resolve();\n\n /**\n * Acquire lock\n * @param [bypass=false] option to skip lock acquisition\n */\n public async obtain(bypass = false): Promise<() => void> {\n let release = releaseStub;\n if (bypass) return release;\n const lastPromise = this.m_lastPromise;\n this.m_lastPromise = new Promise<void>((resolve) => (release = resolve));\n await lastPromise;\n return release;\n }\n}\n","import {\n AddInvokeTransactionParameters,\n AddStarknetChainParameters,\n Permission,\n RequestAccountsParameters,\n RequestFn,\n StarknetWindowObject,\n SwitchStarknetChainParameters,\n TypedData,\n UNEXPECTED_ERROR,\n WalletEventHandlers,\n WalletEventListener,\n WalletEvents,\n} from \"@starknet-io/types-js\";\nimport { WalletAccount } from \"starknet\";\nimport manifest from \"../package.json\";\n\nimport { icon } from \"./icon\";\nimport { Mutex } from \"./mutex\";\n\nconst mutex = new Mutex();\n\nexport default abstract class BaseProvider implements StarknetWindowObject {\n public id = \"controller\";\n public name = \"Controller\";\n public version = manifest.version;\n public icon = icon;\n\n public account?: WalletAccount;\n public subscriptions: WalletEvents[] = [];\n\n private _probePromise: Promise<WalletAccount | undefined> | null = null;\n\n protected async safeProbe(): Promise<WalletAccount | undefined> {\n // If we already have an account, return it\n if (this.account) {\n return this.account;\n }\n\n // If we're already probing, wait for the existing probe\n if (this._probePromise) {\n return this._probePromise;\n }\n\n const release = await mutex.obtain();\n return await new Promise<WalletAccount | undefined>(async (resolve) => {\n try {\n this._probePromise = this.probe();\n const result = await this._probePromise;\n resolve(result);\n } finally {\n this._probePromise = null;\n }\n }).finally(() => {\n release();\n });\n }\n\n request: RequestFn = async (call) => {\n switch (call.type) {\n case \"wallet_getPermissions\":\n await this.safeProbe();\n\n if (this.account) {\n return [Permission.ACCOUNTS];\n }\n\n return [];\n\n case \"wallet_requestAccounts\": {\n if (this.account) {\n return [this.account.address];\n }\n\n const silentMode =\n call.params && (call.params as RequestAccountsParameters).silent_mode;\n\n this.account = await this.safeProbe();\n\n if (!this.account && !silentMode) {\n this.account = await this.connect();\n }\n\n if (this.account) {\n return [this.account.address];\n }\n\n return [];\n }\n\n case \"wallet_watchAsset\":\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: \"wallet_watchAsset not implemented\",\n } as UNEXPECTED_ERROR;\n\n case \"wallet_addStarknetChain\": {\n let params = call.params as AddStarknetChainParameters;\n return this.addStarknetChain(params);\n }\n\n case \"wallet_switchStarknetChain\": {\n let params = call.params as SwitchStarknetChainParameters;\n return this.switchStarknetChain(params.chainId);\n }\n\n case \"wallet_requestChainId\":\n if (!this.account) {\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: \"Account not initialized\",\n } as UNEXPECTED_ERROR;\n }\n\n return await this.account.getChainId();\n\n case \"wallet_deploymentData\":\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: \"wallet_deploymentData not implemented\",\n } as UNEXPECTED_ERROR;\n\n case \"wallet_addInvokeTransaction\":\n if (!this.account) {\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: \"Account not initialized\",\n } as UNEXPECTED_ERROR;\n }\n\n let params = call.params as AddInvokeTransactionParameters;\n return await this.account.execute(\n params.calls.map((call) => ({\n contractAddress: call.contract_address,\n entrypoint: call.entry_point,\n calldata: call.calldata,\n })),\n );\n\n case \"wallet_addDeclareTransaction\":\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: \"wallet_addDeclareTransaction not implemented\",\n } as UNEXPECTED_ERROR;\n\n case \"wallet_signTypedData\": {\n if (!this.account) {\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: \"Account not initialized\",\n } as UNEXPECTED_ERROR;\n }\n\n return await this.account.signMessage(call.params as TypedData);\n }\n\n case \"wallet_supportedSpecs\":\n return [];\n case \"wallet_supportedWalletApi\":\n return [];\n default:\n throw {\n code: 63,\n message: \"An unexpected error occurred\",\n data: `Unknown RPC call type: ${call.type}`,\n } as UNEXPECTED_ERROR;\n }\n };\n\n on: WalletEventListener = <E extends keyof WalletEventHandlers>(\n event: E,\n handler: WalletEventHandlers[E],\n ): void => {\n if (event !== \"accountsChanged\" && event !== \"networkChanged\") {\n throw new Error(`Unknown event: ${event}`);\n }\n this.subscriptions.push({ type: event, handler } as WalletEvents);\n };\n\n off: WalletEventListener = <E extends keyof WalletEventHandlers>(\n event: E,\n handler: WalletEventHandlers[E],\n ): void => {\n if (event !== \"accountsChanged\" && event !== \"networkChanged\") {\n throw new Error(`Unknown event: ${event}`);\n }\n const idx = this.subscriptions.findIndex(\n (sub) => sub.type === event && sub.handler === handler,\n );\n if (idx >= 0) {\n this.subscriptions.splice(idx, 1);\n }\n };\n\n protected emitNetworkChanged(chainId: string) {\n this.subscriptions\n .filter((sub) => sub.type === \"networkChanged\")\n .forEach((sub) => {\n (sub.handler as WalletEventHandlers[\"networkChanged\"])(chainId);\n });\n }\n\n protected emitAccountsChanged(accounts: string[]) {\n this.subscriptions\n .filter((sub) => sub.type === \"accountsChanged\")\n .forEach((sub) => {\n (sub.handler as WalletEventHandlers[\"accountsChanged\"])(accounts);\n });\n }\n\n abstract probe(): Promise<WalletAccount | undefined>;\n abstract connect(): Promise<WalletAccount | undefined>;\n abstract switchStarknetChain(chainId: string): Promise<boolean>;\n abstract addStarknetChain(\n chain: AddStarknetChainParameters,\n ): Promise<boolean>;\n}\n","import * as http from \"http\";\nimport { AddressInfo } from \"net\";\nimport { REDIRECT_QUERY_NAME } from \"../constants\";\n\ntype ServerResponse = http.ServerResponse<http.IncomingMessage> & {\n req: http.IncomingMessage;\n};\n\nexport class CallbackServer {\n private server: http.Server;\n private resolveCallback?: (data: string) => void;\n private rejectCallback?: (error: Error) => void;\n private timeoutId?: NodeJS.Timeout;\n\n constructor() {\n this.server = http.createServer(this.handleRequest.bind(this));\n\n // Handle server errors\n this.server.on(\"error\", (error) => {\n console.error(\"Server error:\", error);\n if (this.rejectCallback) {\n this.rejectCallback(error);\n }\n });\n }\n\n private cleanup() {\n if (this.timeoutId) {\n clearTimeout(this.timeoutId);\n }\n this.server.close();\n }\n\n private handleRequest(req: http.IncomingMessage, res: ServerResponse) {\n if (!req.url?.startsWith(\"/callback\")) {\n res.writeHead(404);\n res.end();\n return;\n }\n\n const params = new URLSearchParams(req.url.split(\"?\")[1]);\n const session = params.get(REDIRECT_QUERY_NAME);\n\n if (!session) {\n console.warn(\"Received callback without session data\");\n res.writeHead(400);\n res.end(\"Missing session data\");\n return;\n }\n\n if (this.resolveCallback) {\n this.resolveCallback(session);\n }\n\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(\n \"<html><body><script>window.close();</script>Session registered successfully. You can close this window.</body></html>\",\n );\n\n this.cleanup();\n }\n\n async listen(): Promise<string> {\n return new Promise((resolve, reject) => {\n this.server.listen(0, \"localhost\", () => {\n const address = this.server.address() as AddressInfo;\n const url = `http://localhost:${address.port}/callback`;\n resolve(url);\n });\n\n this.server.on(\"error\", reject);\n });\n }\n\n async waitForCallback(): Promise<string> {\n return new Promise((resolve, reject) => {\n this.resolveCallback = resolve;\n this.rejectCallback = reject;\n\n this.timeoutId = setTimeout(\n () => {\n console.warn(\"Callback timeout reached\");\n reject(new Error(\"Callback timeout after 5 minutes\"));\n this.cleanup();\n },\n 5 * 60 * 1000,\n );\n });\n }\n}\n","import * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport { CallbackServer } from \"./server\";\n\ninterface SessionSigner {\n privKey: string;\n pubKey: string;\n}\n\ninterface SessionInfo {\n username: string;\n address: string;\n ownerGuid: string;\n transactionHash?: string;\n expiresAt: string;\n}\n\ninterface SessionData {\n signer?: SessionSigner;\n session?: SessionInfo;\n policies?: any;\n lastUsedConnector?: string;\n [key: string]: any;\n}\n\n/**\n * Implements a file system backend.\n * This is designed for Node.js environments to store session data on the filesystem.\n */\nexport class NodeBackend {\n private basePath: string;\n private sessionFile: string;\n private data: SessionData = {};\n private callbackServer?: CallbackServer;\n\n constructor(basePath: string) {\n if (!basePath) {\n throw new Error(\"basePath is required for NodeBackend\");\n }\n this.basePath = basePath;\n this.sessionFile = path.join(this.basePath, \"session.json\");\n }\n\n private async ensureDirectoryExists(): Promise<void> {\n try {\n await fs.access(this.basePath);\n } catch {\n try {\n await fs.mkdir(this.basePath, { recursive: true });\n } catch (error: any) {\n throw new Error(\n `Failed to create directory ${this.basePath}: ${error.message}`,\n );\n }\n }\n }\n\n private async loadData(): Promise<void> {\n try {\n const content = await fs.readFile(this.sessionFile, \"utf-8\");\n const parsed = JSON.parse(content);\n\n if (typeof parsed !== \"object\" || parsed === null) {\n throw new Error(\"Invalid session data format\");\n }\n\n this.data = parsed;\n } catch (error: unknown) {\n if (error instanceof Error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw new Error(`Failed to load session data: ${error.message}`);\n }\n }\n this.data = {};\n }\n }\n\n private async saveData(): Promise<void> {\n try {\n await this.ensureDirectoryExists();\n await fs.writeFile(\n this.sessionFile,\n JSON.stringify(this.data, null, 2),\n \"utf-8\",\n );\n } catch (error: unknown) {\n if (error instanceof Error) {\n throw new Error(`Failed to save session data: ${error.message}`);\n }\n throw error;\n }\n }\n\n async get(key: string): Promise<string | null> {\n if (!key) {\n throw new Error(\"Key is required\");\n }\n\n await this.loadData();\n return this.data[key] ? JSON.stringify(this.data[key]) : null;\n }\n\n async set(key: string, value: string): Promise<void> {\n if (!key) {\n throw new Error(\"Key is required\");\n }\n if (!value) {\n throw new Error(\"Value is required\");\n }\n\n await this.loadData();\n try {\n this.data[key] = JSON.parse(value);\n await this.saveData();\n } catch (error: unknown) {\n if (error instanceof Error) {\n throw new Error(`Failed to set ${key}: ${error.message}`);\n }\n throw error;\n }\n }\n\n async delete(key: string): Promise<void> {\n if (!key) {\n throw new Error(\"Key is required\");\n }\n\n await this.loadData();\n delete this.data[key];\n await this.saveData();\n }\n\n async getRedirectUri(): Promise<string> {\n try {\n this.callbackServer = new CallbackServer();\n return await this.callbackServer.listen();\n } catch (error: unknown) {\n if (error instanceof Error) {\n throw new Error(`Failed to start callback server: ${error.message}`);\n }\n throw error;\n }\n }\n\n async waitForCallback(): Promise<string | null> {\n if (!this.callbackServer) {\n throw new Error(\"Callback server not initialized\");\n }\n return await this.callbackServer.waitForCallback();\n }\n\n openLink(url: string): void {\n if (!url) {\n throw new Error(\"URL is required\");\n }\n\n console.log(`\\n\\t Open url to authorize session: ${url}`);\n }\n}\n","import { ec, encode, stark, WalletAccount } from \"starknet\";\nimport { SessionPolicies } from \"@cartridge/presets\";\nimport { AddStarknetChainParameters } from \"@starknet-io/types-js\";\nimport { signerToGuid } from \"@cartridge/controller-wasm\";\n\nimport SessionAccount from \"./account\";\nimport { KEYCHAIN_URL } from \"../constants\";\nimport BaseProvider from \"../provider\";\nimport { toWasmPolicies } from \"../utils\";\nimport { ParsedSessionPolicies } from \"../policies\";\nimport { NodeBackend } from \"./backend\";\n\nexport type SessionOptions = {\n rpc: string;\n chainId: string;\n policies: SessionPolicies;\n basePath: string;\n keychainUrl?: string;\n};\n\nexport default class SessionProvider extends BaseProvider {\n public id = \"controller_session\";\n public name = \"Controller Session\";\n\n protected _chainId: string;\n protected _rpcUrl: string;\n protected _username?: string;\n protected _policies: ParsedSessionPolicies;\n protected _keychainUrl: string;\n protected _backend: NodeBackend;\n\n constructor({\n rpc,\n chainId,\n policies,\n basePath,\n keychainUrl,\n }: SessionOptions) {\n super();\n\n this._policies = {\n verified: false,\n contracts: policies.contracts\n ? Object.fromEntries(\n Object.entries(policies.contracts).map(([address, contract]) => [\n address,\n {\n ...contract,\n methods: contract.methods.map((method) => ({\n ...method,\n authorized: true,\n })),\n },\n ]),\n )\n : undefined,\n messages: policies.messages?.map((message) => ({\n ...message,\n authorized: true,\n })),\n };\n\n this._rpcUrl = rpc;\n this._chainId = chainId;\n this._keychainUrl = keychainUrl || KEYCHAIN_URL;\n this._backend = new NodeBackend(basePath);\n }\n\n async username() {\n const sessionStr = await this._backend.get(\"session\");\n if (sessionStr) {\n const session = JSON.parse(sessionStr);\n return session.username;\n }\n return undefined;\n }\n\n async probe(): Promise<WalletAccount | undefined> {\n if (this.account) {\n return this.account;\n }\n\n const [sessionStr, signerStr] = await Promise.all([\n this._backend.get(\"session\"),\n this._backend.get(\"signer\"),\n ]);\n\n if (!sessionStr || !signerStr) {\n return undefined;\n }\n\n const session = JSON.parse(sessionStr);\n const signer = JSON.parse(signerStr);\n\n // Check expiration\n const expirationTime = parseInt(session.expiresAt) * 1000;\n if (Date.now() >= expirationTime) {\n await this.disconnect();\n return undefined;\n }\n\n this._username = session.username;\n this.account = new SessionAccount(this, {\n rpcUrl: this._rpcUrl,\n privateKey: signer.privKey,\n address: session.address,\n ownerGuid: session.ownerGuid,\n chainId: this._chainId,\n expiresAt: parseInt(session.expiresAt),\n policies: toWasmPolicies(this._policies),\n guardianKeyGuid: session.guardianKeyGuid,\n metadataHash: session.metadataHash,\n sessionKeyGuid: session.sessionKeyGuid,\n });\n\n return this.account;\n }\n\n async connect(): Promise<WalletAccount | undefined> {\n if (this.account) {\n return this.account;\n }\n\n const account = await this.probe();\n if (account) {\n return account;\n }\n\n const pk = stark.randomAddress();\n const publicKey = ec.starkCurve.getStarkKey(pk);\n\n await this._backend.set(\n \"signer\",\n JSON.stringify({\n privKey: pk,\n pubKey: publicKey,\n }),\n );\n\n // Get redirect URI from local server\n const redirectUri = await this._backend.getRedirectUri();\n\n const url = `${\n this._keychainUrl\n }/session?public_key=${encodeURIComponent(publicKey)}&redirect_uri=${encodeURIComponent(\n redirectUri,\n )}&redirect_query_name=startapp&policies=${encodeURIComponent(\n JSON.stringify(this._policies),\n )}&rpc_url=${encodeURIComponent(this._rpcUrl)}`;\n\n this._backend.openLink(url);\n\n // Wait for callback with session data\n const sessionData = await this._backend.waitForCallback();\n if (sessionData) {\n const sessionRegistration = JSON.parse(atob(sessionData));\n const formattedPk = encode.addHexPrefix(publicKey);\n // Ensure addresses are properly formatted\n sessionRegistration.address = sessionRegistration.address.toLowerCase();\n sessionRegistration.ownerGuid =\n sessionRegistration.ownerGuid.toLowerCase();\n sessionRegistration.guardianKeyGuid = \"0x0\";\n sessionRegistration.metadataHash = \"0x0\";\n sessionRegistration.sessionKeyGuid = signerToGuid({\n starknet: { privateKey: formattedPk },\n });\n await this._backend.set(\"session\", JSON.stringify(sessionRegistration));\n return this.probe();\n }\n\n return undefined;\n }\n\n async disconnect(): Promise<void> {\n await this._backend.delete(\"signer\");\n await this._backend.delete(\"session\");\n this.account = undefined;\n this._username = undefined;\n }\n\n switchStarknetChain(_chainId: string): Promise<boolean> {\n throw new Error(\"switchStarknetChain not implemented\");\n }\n\n addStarknetChain(_chain: AddStarknetChainParameters): Promise<boolean> {\n throw new Error(\"addStarknetChain not implemented\");\n }\n}\n"]}
@@ -37,15 +37,16 @@ export default class SessionProvider extends BaseProvider {
37
37
  protected _disconnectRedirectUrl?: string;
38
38
  protected _policies: ParsedSessionPolicies;
39
39
  protected _preset?: string;
40
- private _ready;
41
40
  protected _keychainUrl: string;
42
41
  protected _apiUrl: string;
43
42
  protected _publicKey: string;
44
43
  protected _sessionKeyGuid: string;
45
44
  protected _signupOptions?: AuthOptions;
45
+ private _readyPromise;
46
46
  reopenBrowser: boolean;
47
47
  constructor({ rpc, chainId, policies, preset, shouldOverridePresetPolicies, redirectUrl, disconnectRedirectUrl, keychainUrl, apiUrl, signupOptions, }: SessionOptions);
48
- private _init;
48
+ private _setSigningKeys;
49
+ private _resolvePreset;
49
50
  private validatePoliciesSubset;
50
51
  private padBase64;
51
52
  private normalizeSession;
@@ -56,7 +57,7 @@ export default class SessionProvider extends BaseProvider {
56
57
  switchStarknetChain(_chainId: string): Promise<boolean>;
57
58
  addStarknetChain(_chain: AddStarknetChainParameters): Promise<boolean>;
58
59
  disconnect(): Promise<void>;
59
- tryRetrieveFromQueryOrStorage(): WalletAccount | undefined;
60
+ private tryRetrieveSessionAccount;
60
61
  private clearStoredSession;
61
62
  }
62
63
  export {};