{"version":3,"sources":["../../enduser/src/CommunityClient.ts","../../enduser/src/UserLifecycle.ts"],"names":["BaseClient","xPNTsFactoryActions","registryActions","stakeAmount","parseAbiParameters","parseEther","tokenActions","encodeAbiParameters","sbtActions","reputationActions","RegistryABI","BaseError","ContractFunctionRevertedError"],"mappings":"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","file":"chunk-PJRT65TI.cjs","sourcesContent":["import { type Address, type Hash, type Hex, parseEther, encodeAbiParameters, parseAbiParameters } from 'viem';\nimport { BaseClient, type ClientConfig, type TransactionOptions } from '@aastar/core';\nimport { registryActions, sbtActions, xPNTsFactoryActions, reputationActions, tokenActions } from '@aastar/core';\n\nexport interface CommunityClientConfig extends ClientConfig {\n    sbtAddress?: Address;\n    factoryAddress?: Address;\n    reputationAddress?: Address;\n}\n\nexport interface CreateCommunityParams {\n    name: string;\n    tokenSymbol: string;\n    ensName?: string;\n    description?: string;\n}\n\nexport interface CommunityInfo {\n    address: Address; // Community ID (hash) usually, but here likely the SBT/profile? No, Community in Registry is bytes32 ID.\n    // Wait, Registry defines Community as a Role (ROLE_COMMUNITY).\n    // The \"Community\" entity usually implies a collection of contracts (Token, maybe Paymaster).\n}\n\n/**\n * Client for Community Managers (`ROLE_COMMUNITY`)\n */\nexport class CommunityClient extends BaseClient {\n    public sbtAddress?: Address;\n    public factoryAddress?: Address;\n    public reputationAddress?: Address;\n\n    constructor(config: CommunityClientConfig) {\n        super(config);\n        this.sbtAddress = config.sbtAddress;\n        this.factoryAddress = config.factoryAddress;\n        this.reputationAddress = config.reputationAddress;\n    }\n\n    // ========================================\n    // 1. 社区创建与配置\n    // ========================================\n\n    /**\n     * Create a new Community Token (xPNTs) and register it.\n     * Note: In the current architecture, creating a community often involves:\n     * 1. Registering the ROLE_COMMUNITY on Registry (if not exists) -> usually manual or self-register\n     * 2. Deploying a Token (xPNTs) via Factory\n     * 3. Linking the Token to the Community in Registry\n     */\n    async createCommunityToken(params: CreateCommunityParams, options?: TransactionOptions): Promise<Hash> {\n        try {\n            if (!this.factoryAddress) {\n                throw new Error('Factory address required for this client');\n            }\n            const factory = xPNTsFactoryActions(this.factoryAddress);\n\n            // 1. Deploy Token\n            // Note: The address calculation should be handled via event parsing or predictive deployment\n            // For now, returning the transaction hash as per L1 pattern\n            return await factory(this.client).createToken({\n                name: params.name,\n                symbol: params.tokenSymbol,\n                community: this.getAddress(),\n                account: options?.account\n            });\n        } catch (error) {\n            // Error is likely already an AAStarError from L1, but we wrap it for context\n            throw error; \n        }\n    }\n\n    /**\n     * Get Community Details (Decodes Role Metadata)\n     * @param communityAddress - The address of the community manager (defaults to self)\n     */\n    async getCommunityInfo(communityAddress?: Address): Promise<{\n        name: string;\n        ensName: string;\n        website: string;\n        description: string;\n        logoURI: string;\n        stakeAmount: bigint;\n    }> {\n        try {\n            const target = communityAddress || this.getAddress();\n            const registryAddr = this.requireRegistry();\n            const registry = registryActions(registryAddr);\n            const publicClient = this.getStartPublicClient();\n            \n            // 1. Get Role ID\n            const API_ROLE_COMMUNITY = await registry(publicClient).ROLE_COMMUNITY();\n\n            // 2. Fetch Metadata (Hex).\n            // NOTE: in the deployed v5 Registry, `roleMetadata` is an INTERNAL mapping with no\n            // public getter (the rich community profile — name/website/logo — is written on\n            // registerRole but not readable on-chain). When the getter is absent the call\n            // reverts; degrade gracefully to the on-chain-readable fields (stake) with an\n            // empty profile rather than throwing, so callers can still resolve the community.\n            let metadataHex: Hex | undefined;\n            try {\n                metadataHex = await registry(publicClient).roleMetadata({\n                    roleId: API_ROLE_COMMUNITY,\n                    user: target\n                });\n            } catch (err) {\n                // Degrade ONLY on contract-level \"no getter / reverted\" errors — the deployed\n                // v5 Registry genuinely lacks a public roleMetadata getter. Re-throw genuine\n                // transport/RPC errors so a transient network failure is not silently masked as\n                // \"no community profile\".\n                const m = (err instanceof Error ? `${err.message} ${(err as { cause?: { message?: string } }).cause?.message ?? ''}` : String(err)).toLowerCase();\n                const isContractGap =\n                    m.includes('revert') || m.includes('returned no data') ||\n                    m.includes('does not exist') || m.includes('is not a function') ||\n                    m.includes('no data was returned');\n                if (!isContractGap) throw err;\n                metadataHex = undefined;\n            }\n\n            if (!metadataHex || metadataHex === '0x') {\n                let stakeAmount = 0n;\n                try {\n                    stakeAmount = await registry(publicClient).roleStakes({ roleId: API_ROLE_COMMUNITY, user: target });\n                } catch { /* stake unreadable too — leave 0 */ }\n                return { name: '', ensName: '', website: '', description: '', logoURI: '', stakeAmount };\n            }\n\n            // 3. Decode\n            // struct CommunityRoleData { string name; string ensName; string website; string description; string logoURI; uint256 stakeAmount; }\n            let dataToDecode = metadataHex;\n            \n            // Check for common 'bytes' or 'tuple' wrapper offset (0x20)\n            if (metadataHex.startsWith('0x0000000000000000000000000000000000000000000000000000000000000020')) {\n                dataToDecode = `0x${metadataHex.slice(66)}`; \n            }\n\n            const { decodeAbiParameters, parseAbiParameters } = await import('viem');\n            const [name, ensName, website, description, logoURI, stakeAmount] = decodeAbiParameters(\n                parseAbiParameters('string, string, string, string, string, uint256'),\n                dataToDecode as Hex\n            );\n\n            return {\n                name,\n                ensName,\n                website,\n                description,\n                logoURI,\n                stakeAmount\n            };\n        } catch (error) {\n            throw error;\n        }\n    }\n\n    /**\n     * Register self as a Community Manager.\n     * This method handles all necessary steps:\n     * 1. Checks and approves GToken to GTokenStaking\n     * 2. Encodes CommunityRoleData with provided parameters\n     * 3. Calls registerRoleSelf on Registry\n     * \n     * @param params Community registration parameters\n     * @param options Transaction options\n     * @returns Transaction hash\n     */\n    async registerAsCommunity(params: {\n        name: string;\n        ensName?: string;\n        website?: string;\n        description?: string;\n        logoURI?: string;\n        stakeAmount?: bigint;\n    }, options?: TransactionOptions): Promise<Hash> {\n        try {\n            const registryAddr = this.requireRegistry();\n            const registry = registryActions(registryAddr);\n            const gTokenStakingAddr = this.requireGTokenStaking();\n            const gTokenAddr = this.requireGToken();\n            \n            // 1. Get ROLE_COMMUNITY\n            const roleCommunity = await registry(this.getStartPublicClient()).ROLE_COMMUNITY();\n            \n            // 2. Prepare stake amount (default 30 GToken as per Registry config)\n            const stakeAmount = params.stakeAmount || parseEther('30');\n            \n            // 3. Check and approve GToken to GTokenStaking if needed\n            const gToken = tokenActions();\n            \n            const allowance = await gToken(this.getStartPublicClient()).allowance({\n                token: gTokenAddr,\n                owner: this.getAddress(),\n                spender: gTokenStakingAddr\n            });\n            \n            if (allowance < stakeAmount) {\n                const approveHash = await gToken(this.client).approve({\n                    token: gTokenAddr,\n                    spender: gTokenStakingAddr,\n                    amount: stakeAmount * BigInt(2), // Approve 2x for future use\n                    account: options?.account\n                });\n                await (this.getStartPublicClient() as any).waitForTransactionReceipt({ hash: approveHash });\n            }\n            \n            // 4. Encode CommunityRoleData\n            // struct CommunityRoleData { string name; string ensName; string website; string description; string logoURI; uint256 stakeAmount; }\n            const communityData = encodeAbiParameters(\n                parseAbiParameters('string, string, string, string, string, uint256'),\n                [\n                    params.name,\n                    params.ensName || '',\n                    params.website || '',\n                    params.description || `${params.name} Community`,\n                    params.logoURI || '',\n                    stakeAmount\n                ]\n            );\n            \n            // 5. Register role\n            return await registry(this.client).registerRoleSelf({\n                roleId: roleCommunity,\n                data: communityData,\n                account: options?.account\n            });\n        } catch (error) {\n            throw error;\n        }\n    }\n\n    /**\n     * One-click Setup: Register Community + Deploy Token\n     * Orchestrates the complete community initialization flow.\n     */\n    async setupCommunity(params: {\n        name: string;\n        tokenName: string;\n        tokenSymbol: string;\n        description?: string;\n        logoURI?: string;\n        website?: string;\n        stakeAmount?: bigint;\n    }, options?: TransactionOptions): Promise<{ tokenAddress: Address; hashes: Hash[] }> {\n        const hashes: Hash[] = [];\n        let tokenAddress: Address = '0x0000000000000000000000000000000000000000';\n\n        // 1. Register as Community (Idempotent check handled inside or by registry)\n        // We should check hasRole first to avoid errors if already registered\n        const registry = registryActions(this.requireRegistry())(this.getStartPublicClient());\n        const ROLE_COMMUNITY = await registry.ROLE_COMMUNITY();\n        const hasRole = await registry.hasRole({ roleId: ROLE_COMMUNITY, user: this.getAddress() });\n\n        if (!hasRole) {\n            const hReg = await this.registerAsCommunity({\n                name: params.name,\n                ensName: params.website, // Mapping website to ENS param for now as per legacy behavior\n                website: params.website,\n                description: params.description,\n                logoURI: params.logoURI,\n                stakeAmount: params.stakeAmount\n            }, options);\n            hashes.push(hReg);\n            \n            // Critical: Factory requires caller to be registered in Registry.\n            // We must wait for the registration to be mined.\n            await (this.getStartPublicClient() as any).waitForTransactionReceipt({ hash: hReg });\n        }\n\n        // 2. Deploy Token (Idempotent check via Factory)\n        if (this.factoryAddress) {\n            const factoryReader = xPNTsFactoryActions(this.factoryAddress)(this.getStartPublicClient());\n            const existingToken = await factoryReader.getTokenAddress({ community: this.getAddress() });\n\n            if (existingToken && existingToken !== '0x0000000000000000000000000000000000000000') {\n                tokenAddress = existingToken;\n            } else {\n                const hToken = await this.createCommunityToken({\n                    name: params.tokenName,\n                    tokenSymbol: params.tokenSymbol,\n                    description: params.description\n                }, options);\n                hashes.push(hToken);\n                \n                // Critical: Wait for token deployment to fetch the address\n                await (this.getStartPublicClient() as any).waitForTransactionReceipt({ hash: hToken });\n                \n                // Fetch the actual address (with retries for latency)\n                for (let i = 0; i < 5; i++) {\n                    tokenAddress = await factoryReader.getTokenAddress({ community: this.getAddress() });\n                    if (tokenAddress && tokenAddress !== '0x0000000000000000000000000000000000000000') break;\n                    await new Promise(r => setTimeout(r, 2000));\n                }\n                \n                if (!tokenAddress || tokenAddress === '0x0000000000000000000000000000000000000000') {\n                    console.warn(`Warning: Token address not found after 10s. Factory might be slow indexing.`);\n                }\n            }\n        }\n\n        return { tokenAddress, hashes };\n    }\n\n    // ========================================\n    // 2. 成员管理\n    // ========================================\n\n    /**\n     * Airdrop SBTs to users to make them members\n     */\n    async airdropSBT(users: Address[], roleId: bigint, options?: TransactionOptions): Promise<Hash> {\n        try {\n            if (!this.sbtAddress) throw new Error('SBT address required for this client');\n            const sbt = sbtActions(this.sbtAddress);\n\n            if (users.length === 1) {\n                // Convert roleId to Hex (bytes32)\n                const roleIdHex = `0x${roleId.toString(16).padStart(64, '0')}` as Hash;\n\n                return await sbt(this.client).mintForRole({\n                    user: users[0],\n                    roleId: roleIdHex,\n                    roleData: '0x',\n                    account: options?.account\n                });\n            }\n            \n            throw new Error('Batch airdrop not fully implemented in L1 yet, use single user');\n        } catch (error) {\n            throw error;\n        }\n    }\n\n    // ========================================\n    // 3. 信誉系统\n    // ========================================\n\n    async setReputationRule(ruleId: bigint, ruleConfig: any, options?: TransactionOptions): Promise<Hash> {\n        try {\n            if (!this.reputationAddress) throw new Error('Reputation address required for this client');\n            const reputation = reputationActions(this.reputationAddress);\n            \n            const ruleIdHex = `0x${ruleId.toString(16).padStart(64, '0')}` as Hash;\n\n            return await reputation(this.client).setReputationRule({\n                ruleId: ruleIdHex,\n                rule: ruleConfig,\n                account: options?.account\n            });\n        } catch (error) {\n            throw error;\n        }\n    }\n\n    // ========================================\n    // 4. 管理功能\n    // ========================================\n\n    /**\n     * Revoke membership (Burn SBT)\n     */\n    async revokeMembership(userAddr: Address, options?: TransactionOptions): Promise<Hash> {\n        try {\n            if (!this.sbtAddress) throw new Error('SBT address required for this client');\n            const sbt = sbtActions(this.sbtAddress);\n            \n            return await sbt(this.client).burnSBT({\n                user: userAddr,\n                account: options?.account\n            });\n        } catch (error) {\n            throw error;\n        }\n    }\n\n    /**\n     * Transfer ownership of the Community Token\n     */\n    async transferCommunityTokenOwnership(tokenAddress: Address, newOwner: Address, options?: TransactionOptions): Promise<Hash> {\n        try {\n            const token = tokenActions()(this.client);\n            \n            return await token.transferOwnership({\n                token: tokenAddress,\n                newOwner,\n                account: options?.account\n            });\n        } catch (error) {\n            throw error;\n        }\n    }\n}\n","import { type Address, type Hash, type Hex, parseEther, BaseError, ContractFunctionRevertedError } from 'viem';\nimport { BaseClient, type ClientConfig, type TransactionOptions, RegistryABI } from '@aastar/core';\nimport { registryActions, sbtActions, tokenActions, stakingActions, entryPointActions } from '@aastar/core'; // L2/L1 Actions\n\nexport interface GaslessConfig {\n    paymasterUrl: string;\n    policy?: 'CREDIT' | 'TOKEN' | 'SPONSORED';\n    /**\n     * Explicit paymaster for TOKEN/SPONSORED (V4) policies. If omitted, the chain's canonical\n     * PaymasterV4 is used. CREDIT always routes to the SuperPaymaster (registry-resolved).\n     */\n    paymasterAddress?: Address;\n    /** ERC-20 used to pay gas under a V4 paymaster (TOKEN/SPONSORED). Required for those policies. */\n    gasToken?: Address;\n}\n\nexport interface UserLifecycleConfig extends ClientConfig {\n    accountAddress: Address;\n    registryAddress: Address;\n    sbtAddress: Address;\n    gTokenAddress: Address;\n    gTokenStakingAddress: Address;\n    entryPointAddress: Address;\n    gasless?: GaslessConfig; // Optional gasless config\n}\n\nexport interface OnboardResult {\n    success: boolean;\n    sbtId?: bigint;\n    txHash?: Hash;\n}\n\nexport interface ReputationData {\n    score: bigint;\n    level: bigint;\n    creditLimit: bigint;\n}\n\n/**\n * UserLifecycle - L3 Pattern\n * \n * Responsibilities:\n * 1. Managing the complete lifecycle of an End User (Onboard -> Operate -> Exit)\n * 2. Providing a unified interface for Gasless operations\n * 3. Abstracting underlying contract interactions via L2 Actions\n */\nexport class UserLifecycle extends BaseClient {\n    public accountAddress: Address;\n    public registryAddress: Address;\n    public sbtAddress: Address;\n    public gTokenAddress: Address;\n    public gTokenStakingAddress: Address;\n    public entryPointAddress: Address;\n    public gaslessConfig?: GaslessConfig;\n\n    public config: UserLifecycleConfig;\n\n    constructor(config: UserLifecycleConfig) {\n        super(config);\n        this.config = config;\n        this.accountAddress = config.accountAddress;\n        this.registryAddress = config.registryAddress;\n        this.sbtAddress = config.sbtAddress;\n        this.gTokenAddress = config.gTokenAddress;\n        this.gTokenStakingAddress = config.gTokenStakingAddress;\n        this.entryPointAddress = config.entryPointAddress;\n        this.gaslessConfig = config.gasless;\n    }\n\n    // ===========================================\n    // 1. Onboarding Phase (Registration)\n    // ===========================================\n\n    /**\n     * Check if user is eligible to join a community\n     * @param community Address of the community\n     */\n    async checkEligibility(_community: Address): Promise<boolean> {\n        // #169 lesson: don't silently return `true` (a stub that claims everyone is eligible). The\n        // real blacklist/whitelist/community-rule check is not implemented, so throw rather than lie.\n        throw new Error('UserLifecycle.checkEligibility is not implemented — do not rely on a stubbed eligibility result.');\n    }\n\n    /**\n     * One-click Onboarding: Approve -> Stake -> Register -> Mint SBT\n     * @param community Address of the community to join\n     * @param stakeAmount Amount of GToken to stake (default 0.4 GT)\n     */\n    async onboard(community: Address, stakeAmount: bigint = parseEther('0.4')): Promise<OnboardResult> {\n        try {\n            const registry = registryActions(this.registryAddress)(this.getStartPublicClient());\n            const userClient = await import('./UserClient.js').then(m => new m.UserClient({\n                ...this.config,\n                accountAddress: this.accountAddress,\n                registryAddress: this.registryAddress,\n                gTokenStakingAddress: this.gTokenStakingAddress,\n                gTokenAddress: this.gTokenAddress,\n                sbtAddress: this.sbtAddress\n            }));\n\n            // Use UserClient's batch execution capability for atomic onboarding\n            const txHash = await userClient.registerAsEndUser(community, stakeAmount);\n            \n            // Post-check: Verify role with retry\n            let hasRole = false;\n            for (let i = 0; i < 5; i++) {\n                hasRole = await registry.hasRole({ \n                    roleId: await registry.ROLE_ENDUSER(), \n                    user: this.accountAddress \n                });\n                if (hasRole) break;\n                await new Promise(r => setTimeout(r, 2000));\n            }\n\n            return {\n                success: hasRole,\n                txHash\n            };\n        } catch (error) {\n            console.error(\"Onboarding failed:\", error);\n            return { success: false };\n        }\n    }\n\n    /**\n     * Enable or update Gasless configuration\n     */\n    async enableGasless(config: GaslessConfig): Promise<void> {\n        this.gaslessConfig = config;\n        // In future: verify paymaster connection here\n    }\n\n    // ===========================================\n    // 2. Operational Phase (Execute & Interact)\n    // ===========================================\n\n    /**\n     * Execute a transaction effectively using Gasless configuration if available\n     */\n    async executeGaslessTx(params: {\n        target: Address;\n        value: bigint;\n        data: Hex;\n        operator?: Address; // Optional specific operator\n    }): Promise<Hash> {\n        if (!this.gaslessConfig) {\n            throw new Error(\"Gasless configuration not enabled. Call enableGasless() first.\");\n        }\n        // #169 lesson: an unset policy must NOT silently default to V4 (it would route to the\n        // canonical PaymasterV4 and SUCCEED silently — the dangerous case). Require it explicitly.\n        if (!this.gaslessConfig.policy) {\n            throw new Error(\n                \"gasless.policy is required ('CREDIT' | 'TOKEN' | 'SPONSORED') — refusing to default the paymaster silently.\",\n            );\n        }\n\n        const userClient = await import('./UserClient.js').then(m => new m.UserClient({\n            ...this.config,\n            accountAddress: this.accountAddress,\n            // Pass minimal config needed for execution\n            entryPointAddress: this.entryPointAddress,\n            bundlerClient: (this.config as any).bundlerClient \n        }));\n\n        // Resolve the paymaster ADDRESS for the policy (not a placeholder — #169 lesson: never\n        // silently submit the wrong address). CREDIT → SuperPaymaster (registry-resolved);\n        // TOKEN/SPONSORED → V4: explicit config address, else the chain's canonical PaymasterV4.\n        const paymasterType = this.gaslessConfig.policy === 'CREDIT' ? 'Super' : 'V4';\n        let paymasterAddress: Address;\n        if (paymasterType === 'Super') {\n            const registry = registryActions(this.registryAddress)(this.client);\n            paymasterAddress = await registry.SUPER_PAYMASTER();\n        } else if (this.gaslessConfig.paymasterAddress) {\n            paymasterAddress = this.gaslessConfig.paymasterAddress;\n        } else {\n            const { getCanonicalAddresses } = await import('@aastar/core');\n            const chainId = await this.client.getChainId();\n            const canon = getCanonicalAddresses(chainId) as any;\n            if (!canon?.paymasterV4) {\n                throw new Error(\n                    `No canonical PaymasterV4 for chain ${chainId}; set gasless.paymasterAddress for a ${this.gaslessConfig.policy} policy.`,\n                );\n            }\n            paymasterAddress = canon.paymasterV4 as Address;\n        }\n\n        return await userClient.executeGasless({\n            target: params.target,\n            value: params.value,\n            data: params.data,\n            paymaster: paymasterAddress,\n            paymasterType,\n            gasToken: this.gaslessConfig.gasToken,\n            operator: params.operator\n        });\n    }\n\n    async claimSBT(roleId: Hex, options?: TransactionOptions): Promise<Hash> {\n        const userClient = await import('./UserClient.js').then(m => new m.UserClient({\n            ...this.config,\n            accountAddress: this.accountAddress,\n            sbtAddress: this.sbtAddress\n        }));\n        return await userClient.mintSBT(roleId, options);\n    }\n\n    // ===========================================\n    // 3. Query Phase (Info & Stats)\n    // ===========================================\n\n    async getMyReputation(): Promise<ReputationData> {\n        const publicClient = this.getStartPublicClient();\n        const registry = registryActions(this.registryAddress)(publicClient);\n        \n        const [score, creditLimit] = await Promise.all([\n            registry.globalReputation({ user: this.accountAddress }),\n            registry.getCreditLimit({ user: this.accountAddress })\n        ]);\n\n        // Derive the level from the Registry's ascending level thresholds: the level is the number of\n        // thresholds the score meets. The thresholds array has no length getter, so read by index until\n        // an out-of-bounds read REVERTS (Panic) — but ONLY a revert means \"end of array\". A network /\n        // RPC / unexpected error must propagate: silently breaking would under-report the level (the\n        // #169 silent-error pattern). Read raw so the viem error type is preserved for that distinction.\n        let level = 0n;\n        for (let i = 0; i < 32; i++) {\n            let threshold: bigint;\n            try {\n                threshold = (await (publicClient as any).readContract({\n                    address: this.registryAddress,\n                    abi: RegistryABI as any,\n                    functionName: 'levelThresholds',\n                    args: [BigInt(i)],\n                })) as bigint;\n            } catch (err) {\n                if (err instanceof BaseError && err.walk((e) => e instanceof ContractFunctionRevertedError)) {\n                    break; // out-of-bounds read = past the end of the thresholds array\n                }\n                throw err; // network/RPC/unexpected — do NOT silently report a truncated level\n            }\n            if (score >= threshold) level = BigInt(i + 1);\n            else break;\n        }\n\n        return { score, level, creditLimit };\n    }\n\n    async getCreditLimit(): Promise<bigint> {\n        const registry = registryActions(this.registryAddress)(this.client);\n        return await registry.getCreditLimit({ user: this.accountAddress });\n    }\n\n    // ===========================================\n    // 4. Exit Phase (Cleanup)\n    // ===========================================\n\n    async leaveCommunity(community: Address, options?: TransactionOptions): Promise<Hash> {\n        const userClient = await import('./UserClient.js').then(m => new m.UserClient({\n            ...this.config,\n            accountAddress: this.accountAddress,\n            sbtAddress: this.sbtAddress\n        }));\n        return await userClient.leaveCommunity(community, options);\n    }\n\n    async exitRole(roleId: Hex, options?: TransactionOptions): Promise<Hash> {\n        const userClient = await import('./UserClient.js').then(m => new m.UserClient({\n            ...this.config,\n            accountAddress: this.accountAddress,\n            registryAddress: this.registryAddress\n        }));\n        return await userClient.exitRole(roleId, options);\n    }\n\n    async unstakeAll(roleId: Hex, options?: TransactionOptions): Promise<Hash> {\n        const userClient = await import('./UserClient.js').then(m => new m.UserClient({\n            ...this.config,\n            accountAddress: this.accountAddress,\n            gTokenStakingAddress: this.gTokenStakingAddress\n        }));\n        return await userClient.unstakeFromRole(roleId, options);\n    }\n}\n"]}