@bbuilders/djeon402-sdk-client 1.0.1
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.
- package/README.md +355 -0
- package/dist/index.cjs +1025 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +261 -0
- package/dist/index.d.ts +261 -0
- package/dist/index.js +1011 -0
- package/dist/index.js.map +1 -0
- package/dist/react/index.cjs +1230 -0
- package/dist/react/index.cjs.map +1 -0
- package/dist/react/index.d.cts +339 -0
- package/dist/react/index.d.ts +339 -0
- package/dist/react/index.js +1211 -0
- package/dist/react/index.js.map +1 -0
- package/dist/vue/index.cjs +1333 -0
- package/dist/vue/index.cjs.map +1 -0
- package/dist/vue/index.d.cts +346 -0
- package/dist/vue/index.d.ts +346 -0
- package/dist/vue/index.js +1314 -0
- package/dist/vue/index.js.map +1 -0
- package/package.json +105 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/vue/index.ts","../../src/vue/useApprove.ts","../../src/vue/useDjeon402.ts","../../src/client.ts","../../src/modules/admin.ts","../../src/modules/kyc.ts","../../src/modules/token.ts","../../src/modules/x402.ts","../../src/vue/useBalance.ts","../../src/vue/useIsBlacklisted.ts","../../src/vue/useKYCData.ts","../../src/vue/useTokenInfo.ts","../../src/vue/useTransfer.ts","../../src/vue/useX402Receive.ts","../../src/vue/useX402Transfer.ts"],"sourcesContent":["export { useApprove } from './useApprove';\nexport { useBalance } from './useBalance';\nexport { provideDjeon402, useDjeon402 } from './useDjeon402';\nexport { useIsBlacklisted } from './useIsBlacklisted';\nexport { useKYCData } from './useKYCData';\nexport { useTokenInfo } from './useTokenInfo';\nexport { useTransfer } from './useTransfer';\nexport { useX402Receive } from './useX402Receive';\nexport { useX402Transfer } from './useX402Transfer';\n","import type { TransferResult } from '@bbuilders/djeon402-core';\nimport type { Address, WalletClient } from 'viem';\nimport { type Ref, ref } from 'vue';\nimport { useDjeon402 } from './useDjeon402';\n\nexport function useApprove(walletClient: Ref<WalletClient | undefined>) {\n const { sdk } = useDjeon402();\n const data: Ref<TransferResult | null> = ref(null);\n const error: Ref<Error | null> = ref(null);\n const isLoading = ref(false);\n\n const approve = async (spender: Address, amount: string) => {\n if (!walletClient.value) {\n throw new Error('Wallet not connected');\n }\n\n isLoading.value = true;\n error.value = null;\n try {\n data.value = await sdk.token.approve({\n walletClient: walletClient.value,\n spender,\n amount,\n });\n return data.value;\n } catch (e) {\n error.value = e as Error;\n throw e;\n } finally {\n isLoading.value = false;\n }\n };\n\n return {\n approve,\n data,\n error,\n isLoading,\n };\n}\n","import type { Address } from 'viem';\nimport { type InjectionKey, inject, provide, readonly } from 'vue';\nimport { Djeon402ClientSDK } from '../client';\n\nexport interface Djeon402Config {\n contractAddress: Address;\n kycRegistryAddress?: Address;\n chainId: number;\n rpcUrl?: string;\n}\n\ninterface Djeon402Context {\n sdk: Djeon402ClientSDK;\n config: Readonly<Djeon402Config>;\n}\n\nconst Djeon402Key: InjectionKey<Djeon402Context> = Symbol('djeon402');\n\nexport function provideDjeon402(config: Djeon402Config) {\n const sdk = new Djeon402ClientSDK({\n contractAddress: config.contractAddress,\n kycRegistryAddress: config.kycRegistryAddress,\n chainId: config.chainId,\n rpcUrl: config.rpcUrl || '',\n });\n\n const context: Djeon402Context = {\n sdk,\n config: readonly(config) as Readonly<Djeon402Config>,\n };\n\n provide(Djeon402Key, context);\n\n return context;\n}\n\nexport function useDjeon402() {\n const context = inject(Djeon402Key);\n if (!context) {\n throw new Error('useDjeon402 must be used within provideDjeon402');\n }\n return context;\n}\n","import type { ClientSDKConfig } from '@bbuilders/djeon402-core';\nimport { type Address, type Chain, createPublicClient, http, type PublicClient } from 'viem';\nimport { base } from 'viem/chains';\nimport { AdminModule } from './modules/admin';\nimport { KYCModule } from './modules/kyc';\nimport { TokenModule } from './modules/token';\nimport { X402Module } from './modules/x402';\n\n/**\n * DJEON402 Client SDK for browsers\n * Works with wallet providers (MetaMask, WalletConnect, etc.)\n */\nexport class Djeon402ClientSDK {\n public readonly publicClient: PublicClient;\n public readonly contractAddress: Address;\n public readonly kycRegistryAddress?: Address;\n public readonly chainId: number;\n\n public readonly token: TokenModule;\n public readonly admin: AdminModule;\n public readonly kyc: KYCModule;\n public readonly x402: X402Module;\n\n constructor(config: ClientSDKConfig) {\n const { rpcUrl, contractAddress, kycRegistryAddress, chainId } = config;\n\n this.contractAddress = contractAddress;\n this.kycRegistryAddress = kycRegistryAddress;\n this.chainId = chainId;\n\n // For client SDK, default to base chain or custom RPC\n const chain: Chain =\n chainId === 8453\n ? base\n : {\n id: chainId,\n name: 'Custom Chain',\n nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n rpcUrls: {\n default: { http: [rpcUrl || ''] },\n public: { http: [rpcUrl || ''] },\n },\n };\n\n // Create public client for read operations\n this.publicClient = createPublicClient({\n chain,\n transport: http(rpcUrl),\n });\n\n // Initialize modules\n this.token = new TokenModule(this);\n this.admin = new AdminModule(this);\n this.kyc = new KYCModule(this);\n this.x402 = new X402Module(this);\n }\n\n /**\n * Get chain configuration\n */\n getChain(): Chain {\n return this.chainId === 8453\n ? base\n : {\n id: this.chainId,\n name: 'Custom Chain',\n nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n rpcUrls: {\n default: { http: [this.publicClient.transport.url || ''] },\n public: { http: [this.publicClient.transport.url || ''] },\n },\n };\n }\n}\n","import {\n DJEON402_ABI,\n type RoleCheckResult,\n type RolesResult,\n type TransferResult,\n validateAddress,\n} from '@bbuilders/djeon402-core';\nimport type { Address, Hex, WalletClient } from 'viem';\nimport type { Djeon402ClientSDK } from '../client';\n\nexport class AdminModule {\n constructor(private sdk: Djeon402ClientSDK) {}\n\n /**\n * Get role hashes\n */\n async getRoles(): Promise<RolesResult> {\n const [minter, burner, pauser, blacklister, admin] = await Promise.all([\n this.sdk.publicClient.readContract({\n address: this.sdk.contractAddress,\n abi: DJEON402_ABI,\n functionName: 'MINTER_ROLE',\n }),\n this.sdk.publicClient.readContract({\n address: this.sdk.contractAddress,\n abi: DJEON402_ABI,\n functionName: 'BURNER_ROLE',\n }),\n this.sdk.publicClient.readContract({\n address: this.sdk.contractAddress,\n abi: DJEON402_ABI,\n functionName: 'PAUSER_ROLE',\n }),\n this.sdk.publicClient.readContract({\n address: this.sdk.contractAddress,\n abi: DJEON402_ABI,\n functionName: 'BLACKLISTER_ROLE',\n }),\n this.sdk.publicClient.readContract({\n address: this.sdk.contractAddress,\n abi: DJEON402_ABI,\n functionName: 'DEFAULT_ADMIN_ROLE',\n }),\n ]);\n\n return {\n MINTER_ROLE: minter as Hex,\n BURNER_ROLE: burner as Hex,\n PAUSER_ROLE: pauser as Hex,\n BLACKLISTER_ROLE: blacklister as Hex,\n DEFAULT_ADMIN_ROLE: admin as Hex,\n };\n }\n\n /**\n * Check if address has role\n */\n async hasRole(role: Hex, account: Address): Promise<RoleCheckResult> {\n validateAddress(account);\n\n const result = await this.sdk.publicClient.readContract({\n address: this.sdk.contractAddress,\n abi: DJEON402_ABI,\n functionName: 'hasRole',\n args: [role, account],\n });\n\n return {\n role,\n address: account,\n hasRole: result as boolean,\n };\n }\n\n /**\n * Check if address is blacklisted\n */\n async isBlacklisted(account: Address): Promise<{ isBlacklisted: boolean; address: Address }> {\n validateAddress(account);\n\n const isBlacklisted = await this.sdk.publicClient.readContract({\n address: this.sdk.contractAddress,\n abi: DJEON402_ABI,\n functionName: 'isBlacklisted',\n args: [account],\n });\n\n return {\n isBlacklisted: isBlacklisted as boolean,\n address: account,\n };\n }\n\n /**\n * Blacklist an address\n */\n async blacklist(params: {\n walletClient: WalletClient;\n account: Address;\n }): Promise<TransferResult> {\n const { walletClient, account } = params;\n\n if (!walletClient.account) {\n throw new Error('Wallet client must have an account');\n }\n\n validateAddress(account);\n\n const hash = await walletClient.writeContract({\n address: this.sdk.contractAddress,\n abi: DJEON402_ABI,\n functionName: 'blacklist',\n args: [account],\n account: walletClient.account,\n chain: walletClient.chain,\n });\n\n const receipt = await this.sdk.publicClient.waitForTransactionReceipt({ hash });\n\n return {\n success: receipt.status === 'success',\n hash,\n blockNumber: receipt.blockNumber.toString(),\n };\n }\n\n /**\n * Remove from blacklist\n */\n async unBlacklist(params: {\n walletClient: WalletClient;\n account: Address;\n }): Promise<TransferResult> {\n const { walletClient, account } = params;\n\n if (!walletClient.account) {\n throw new Error('Wallet client must have an account');\n }\n\n validateAddress(account);\n\n const hash = await walletClient.writeContract({\n address: this.sdk.contractAddress,\n abi: DJEON402_ABI,\n functionName: 'unBlacklist',\n args: [account],\n account: walletClient.account,\n chain: walletClient.chain,\n });\n\n const receipt = await this.sdk.publicClient.waitForTransactionReceipt({ hash });\n\n return {\n success: receipt.status === 'success',\n hash,\n blockNumber: receipt.blockNumber.toString(),\n };\n }\n\n /**\n * Pause contract\n */\n async pause(params: { walletClient: WalletClient }): Promise<TransferResult> {\n const { walletClient } = params;\n\n if (!walletClient.account) {\n throw new Error('Wallet client must have an account');\n }\n\n const hash = await walletClient.writeContract({\n address: this.sdk.contractAddress,\n abi: DJEON402_ABI,\n functionName: 'pause',\n account: walletClient.account,\n chain: walletClient.chain,\n });\n\n const receipt = await this.sdk.publicClient.waitForTransactionReceipt({ hash });\n\n return {\n success: receipt.status === 'success',\n hash,\n blockNumber: receipt.blockNumber.toString(),\n };\n }\n\n /**\n * Unpause contract\n */\n async unpause(params: { walletClient: WalletClient }): Promise<TransferResult> {\n const { walletClient } = params;\n\n if (!walletClient.account) {\n throw new Error('Wallet client must have an account');\n }\n\n const hash = await walletClient.writeContract({\n address: this.sdk.contractAddress,\n abi: DJEON402_ABI,\n functionName: 'unpause',\n account: walletClient.account,\n chain: walletClient.chain,\n });\n\n const receipt = await this.sdk.publicClient.waitForTransactionReceipt({ hash });\n\n return {\n success: receipt.status === 'success',\n hash,\n blockNumber: receipt.blockNumber.toString(),\n };\n }\n}\n","import {\n KYC_REGISTRY_ABI,\n type KYCData,\n type KYCLevel,\n type KYCLevelName,\n type TransferResult,\n validateAddress,\n} from '@bbuilders/djeon402-core';\nimport type { Address, WalletClient } from 'viem';\nimport type { Djeon402ClientSDK } from '../client';\n\nexport class KYCModule {\n constructor(private sdk: Djeon402ClientSDK) {}\n\n /**\n * Get KYC data for an address\n */\n async getData(address: Address): Promise<KYCData> {\n if (!this.sdk.kycRegistryAddress) {\n throw new Error('KYC Registry address not configured');\n }\n\n validateAddress(address);\n\n const kycData = await this.sdk.publicClient.readContract({\n address: this.sdk.kycRegistryAddress,\n abi: KYC_REGISTRY_ABI,\n functionName: 'getKYCData',\n args: [address],\n });\n\n // Contract returns: level, expiryDate, kycHash, isActive, dailyLimit, dailySpent\n const result = kycData as readonly [\n level: number,\n expiryDate: bigint,\n kycHash: string,\n isActive: boolean,\n dailyLimit: bigint,\n dailySpent: bigint,\n ];\n\n const [level, expiryDate, kycHash, isActive, dailyLimit, dailySpent] = result;\n\n const levelNames: KYCLevelName[] = ['None', 'Tier1', 'Tier2', 'Tier3'];\n const expiryDateReadable = new Date(Number(expiryDate) * 1000).toISOString();\n\n return {\n level: level as KYCLevel,\n levelName: levelNames[level] as KYCLevelName,\n expiryDate: Number(expiryDate),\n expiryDateReadable,\n kycHash,\n isActive,\n dailyLimit: dailyLimit.toString(),\n dailyLimitRaw: dailyLimit.toString(),\n dailySpent: dailySpent.toString(),\n dailySpentRaw: dailySpent.toString(),\n userAddress: address,\n };\n }\n\n /**\n * Get remaining daily limit\n */\n async getRemainingLimit(address: Address) {\n if (!this.sdk.kycRegistryAddress) {\n throw new Error('KYC Registry address not configured');\n }\n\n validateAddress(address);\n\n const remaining = await this.sdk.publicClient.readContract({\n address: this.sdk.kycRegistryAddress,\n abi: KYC_REGISTRY_ABI,\n functionName: 'getRemainingDailyLimit',\n args: [address],\n });\n\n return {\n address,\n remainingLimit: (remaining as bigint).toString(),\n };\n }\n\n /**\n * Verify KYC (admin only)\n */\n async verify(params: {\n walletClient: WalletClient;\n userAddress: Address;\n level: number;\n expiryDate: number;\n documentHash: string;\n }): Promise<TransferResult> {\n if (!this.sdk.kycRegistryAddress) {\n throw new Error('KYC Registry address not configured');\n }\n\n const { walletClient, userAddress, level, expiryDate, documentHash } = params;\n\n if (!walletClient.account) {\n throw new Error('Wallet client must have an account');\n }\n\n validateAddress(userAddress);\n\n if (level < 0 || level > 3) {\n throw new Error('Invalid KYC level. Must be 0-3');\n }\n\n const hash = await walletClient.writeContract({\n address: this.sdk.kycRegistryAddress,\n abi: KYC_REGISTRY_ABI,\n functionName: 'verifyKYC',\n args: [userAddress, level, BigInt(expiryDate), documentHash as `0x${string}`],\n account: walletClient.account,\n chain: walletClient.chain,\n });\n\n const receipt = await this.sdk.publicClient.waitForTransactionReceipt({ hash });\n\n return {\n success: receipt.status === 'success',\n hash,\n blockNumber: receipt.blockNumber.toString(),\n };\n }\n\n /**\n * Update KYC level (admin only)\n */\n async updateKYC(params: {\n walletClient: WalletClient;\n userAddress: Address;\n level: number;\n expiryDate?: number;\n }): Promise<TransferResult> {\n if (!this.sdk.kycRegistryAddress) {\n throw new Error('KYC Registry address not configured');\n }\n\n const { walletClient, userAddress, level, expiryDate = 0 } = params;\n\n if (!walletClient.account) {\n throw new Error('Wallet client must have an account');\n }\n\n validateAddress(userAddress);\n\n const hash = await walletClient.writeContract({\n address: this.sdk.kycRegistryAddress,\n abi: KYC_REGISTRY_ABI,\n functionName: 'updateKYC',\n args: [userAddress, level, BigInt(expiryDate)],\n account: walletClient.account,\n chain: walletClient.chain,\n });\n\n const receipt = await this.sdk.publicClient.waitForTransactionReceipt({ hash });\n\n return {\n success: receipt.status === 'success',\n hash,\n blockNumber: receipt.blockNumber.toString(),\n };\n }\n\n /**\n * Revoke KYC (admin only)\n */\n async revokeKYC(params: {\n walletClient: WalletClient;\n userAddress: Address;\n }): Promise<TransferResult> {\n if (!this.sdk.kycRegistryAddress) {\n throw new Error('KYC Registry address not configured');\n }\n\n const { walletClient, userAddress } = params;\n\n if (!walletClient.account) {\n throw new Error('Wallet client must have an account');\n }\n\n validateAddress(userAddress);\n\n const hash = await walletClient.writeContract({\n address: this.sdk.kycRegistryAddress,\n abi: KYC_REGISTRY_ABI,\n functionName: 'revokeKYC',\n args: [userAddress],\n account: walletClient.account,\n chain: walletClient.chain,\n });\n\n const receipt = await this.sdk.publicClient.waitForTransactionReceipt({ hash });\n\n return {\n success: receipt.status === 'success',\n hash,\n blockNumber: receipt.blockNumber.toString(),\n };\n }\n\n /**\n * Set daily limit for a user (admin only)\n */\n async setDailyLimit(params: {\n walletClient: WalletClient;\n userAddress: Address;\n limitUSD: string;\n }): Promise<TransferResult> {\n if (!this.sdk.kycRegistryAddress) {\n throw new Error('KYC Registry address not configured');\n }\n\n const { walletClient, userAddress, limitUSD } = params;\n\n if (!walletClient.account) {\n throw new Error('Wallet client must have an account');\n }\n\n validateAddress(userAddress);\n\n const limitInSmallestUnit = BigInt(parseFloat(limitUSD) * 1_000_000);\n\n const hash = await walletClient.writeContract({\n address: this.sdk.kycRegistryAddress,\n abi: KYC_REGISTRY_ABI,\n functionName: 'setDailyLimit',\n args: [userAddress, limitInSmallestUnit],\n account: walletClient.account,\n chain: walletClient.chain,\n });\n\n const receipt = await this.sdk.publicClient.waitForTransactionReceipt({ hash });\n\n return {\n success: receipt.status === 'success',\n hash,\n blockNumber: receipt.blockNumber.toString(),\n };\n }\n\n /**\n * Check if a transaction amount is within the user's daily limit\n */\n async checkDailyLimit(params: {\n walletClient: WalletClient;\n userAddress: Address;\n amountUSD: string;\n }): Promise<boolean> {\n if (!this.sdk.kycRegistryAddress) {\n throw new Error('KYC Registry address not configured');\n }\n\n const { walletClient, userAddress, amountUSD } = params;\n\n if (!walletClient.account) {\n throw new Error('Wallet client must have an account');\n }\n\n validateAddress(userAddress);\n\n const amountInSmallestUnit = BigInt(parseFloat(amountUSD) * 1_000_000);\n\n const result = await walletClient.writeContract({\n address: this.sdk.kycRegistryAddress,\n abi: KYC_REGISTRY_ABI,\n functionName: 'checkDailyLimit',\n args: [userAddress, amountInSmallestUnit],\n account: walletClient.account,\n chain: walletClient.chain,\n });\n\n return result as unknown as boolean;\n }\n\n /**\n * Check if a user's KYC is valid (view)\n */\n async isKYCValid(userAddress: Address): Promise<boolean> {\n if (!this.sdk.kycRegistryAddress) {\n throw new Error('KYC Registry address not configured');\n }\n\n validateAddress(userAddress);\n\n const result = await this.sdk.publicClient.readContract({\n address: this.sdk.kycRegistryAddress,\n abi: KYC_REGISTRY_ABI,\n functionName: 'isKYCValid',\n args: [userAddress],\n });\n\n return result as boolean;\n }\n}\n","import {\n type AllowanceResult,\n type BalanceResult,\n DJEON402_ABI,\n formatTokenAmount,\n parseTokenAmount,\n type TokenInfo,\n type TransferResult,\n validateAddress,\n validateAmount,\n} from '@bbuilders/djeon402-core';\nimport type { Address, WalletClient } from 'viem';\nimport type { Djeon402ClientSDK } from '../client';\n\nexport class TokenModule {\n constructor(private sdk: Djeon402ClientSDK) {}\n\n /**\n * Get token information\n */\n async getInfo(): Promise<TokenInfo> {\n const [name, symbol, decimals, totalSupply, paused] = await Promise.all([\n this.sdk.publicClient.readContract({\n address: this.sdk.contractAddress,\n abi: DJEON402_ABI,\n functionName: 'name',\n }),\n this.sdk.publicClient.readContract({\n address: this.sdk.contractAddress,\n abi: DJEON402_ABI,\n functionName: 'symbol',\n }),\n this.sdk.publicClient.readContract({\n address: this.sdk.contractAddress,\n abi: DJEON402_ABI,\n functionName: 'decimals',\n }),\n this.sdk.publicClient.readContract({\n address: this.sdk.contractAddress,\n abi: DJEON402_ABI,\n functionName: 'totalSupply',\n }),\n this.sdk.publicClient.readContract({\n address: this.sdk.contractAddress,\n abi: DJEON402_ABI,\n functionName: 'paused',\n }),\n ]);\n\n return {\n name: name as string,\n symbol: symbol as string,\n decimals: decimals as number,\n totalSupply: formatTokenAmount(totalSupply as bigint, decimals as number),\n totalSupplyRaw: (totalSupply as bigint).toString(),\n paused: paused as boolean,\n contractAddress: this.sdk.contractAddress,\n };\n }\n\n /**\n * Get balance of an address\n */\n async getBalance(address: Address): Promise<BalanceResult> {\n validateAddress(address);\n\n const [balance, decimals] = await Promise.all([\n this.sdk.publicClient.readContract({\n address: this.sdk.contractAddress,\n abi: DJEON402_ABI,\n functionName: 'balanceOf',\n args: [address],\n }),\n this.sdk.publicClient.readContract({\n address: this.sdk.contractAddress,\n abi: DJEON402_ABI,\n functionName: 'decimals',\n }),\n ]);\n\n return {\n address,\n balance: formatTokenAmount(balance as bigint, decimals as number),\n balanceRaw: (balance as bigint).toString(),\n };\n }\n\n /**\n * Get allowance\n */\n async getAllowance(owner: Address, spender: Address): Promise<AllowanceResult> {\n validateAddress(owner);\n validateAddress(spender);\n\n const [allowance, decimals] = await Promise.all([\n this.sdk.publicClient.readContract({\n address: this.sdk.contractAddress,\n abi: DJEON402_ABI,\n functionName: 'allowance',\n args: [owner, spender],\n }),\n this.sdk.publicClient.readContract({\n address: this.sdk.contractAddress,\n abi: DJEON402_ABI,\n functionName: 'decimals',\n }),\n ]);\n\n return {\n owner,\n spender,\n allowance: formatTokenAmount(allowance as bigint, decimals as number),\n allowanceRaw: (allowance as bigint).toString(),\n };\n }\n\n /**\n * Transfer tokens using wallet client\n */\n async transfer(params: {\n walletClient: WalletClient;\n to: Address;\n amount: string;\n }): Promise<TransferResult> {\n const { walletClient, to, amount } = params;\n\n if (!walletClient.account) {\n throw new Error('Wallet client must have an account');\n }\n\n validateAddress(to);\n validateAmount(amount);\n\n const decimals = await this.sdk.publicClient.readContract({\n address: this.sdk.contractAddress,\n abi: DJEON402_ABI,\n functionName: 'decimals',\n });\n\n const amountBigInt = parseTokenAmount(amount, decimals as number);\n\n const hash = await walletClient.writeContract({\n address: this.sdk.contractAddress,\n abi: DJEON402_ABI,\n functionName: 'transfer',\n args: [to, amountBigInt],\n account: walletClient.account,\n chain: walletClient.chain,\n });\n\n // Wait for transaction\n const receipt = await this.sdk.publicClient.waitForTransactionReceipt({\n hash,\n });\n\n return {\n success: receipt.status === 'success',\n hash,\n from: walletClient.account.address,\n to,\n amount,\n amountRaw: amountBigInt.toString(),\n blockNumber: receipt.blockNumber.toString(),\n status: receipt.status,\n };\n }\n\n /**\n * Approve spending\n */\n async approve(params: {\n walletClient: WalletClient;\n spender: Address;\n amount: string;\n }): Promise<TransferResult> {\n const { walletClient, spender, amount } = params;\n\n if (!walletClient.account) {\n throw new Error('Wallet client must have an account');\n }\n\n validateAddress(spender);\n validateAmount(amount);\n\n const decimals = await this.sdk.publicClient.readContract({\n address: this.sdk.contractAddress,\n abi: DJEON402_ABI,\n functionName: 'decimals',\n });\n\n const amountBigInt = parseTokenAmount(amount, decimals as number);\n\n const hash = await walletClient.writeContract({\n address: this.sdk.contractAddress,\n abi: DJEON402_ABI,\n functionName: 'approve',\n args: [spender, amountBigInt],\n account: walletClient.account,\n chain: walletClient.chain,\n });\n\n const receipt = await this.sdk.publicClient.waitForTransactionReceipt({ hash });\n\n return {\n success: receipt.status === 'success',\n hash,\n blockNumber: receipt.blockNumber.toString(),\n };\n }\n\n /**\n * Mint tokens (requires MINTER_ROLE)\n */\n async mint(params: {\n walletClient: WalletClient;\n to: Address;\n amount: string;\n }): Promise<TransferResult> {\n const { walletClient, to, amount } = params;\n\n if (!walletClient.account) {\n throw new Error('Wallet client must have an account');\n }\n\n validateAddress(to);\n validateAmount(amount);\n\n const decimals = await this.sdk.publicClient.readContract({\n address: this.sdk.contractAddress,\n abi: DJEON402_ABI,\n functionName: 'decimals',\n });\n\n const amountBigInt = parseTokenAmount(amount, decimals as number);\n\n const hash = await walletClient.writeContract({\n address: this.sdk.contractAddress,\n abi: DJEON402_ABI,\n functionName: 'mint',\n args: [to, amountBigInt],\n account: walletClient.account,\n chain: walletClient.chain,\n });\n\n const receipt = await this.sdk.publicClient.waitForTransactionReceipt({ hash });\n\n return {\n success: receipt.status === 'success',\n hash,\n blockNumber: receipt.blockNumber.toString(),\n };\n }\n\n /**\n * Burn tokens (requires BURNER_ROLE)\n */\n async burn(params: {\n walletClient: WalletClient;\n amount: string;\n }): Promise<TransferResult> {\n const { walletClient, amount } = params;\n\n if (!walletClient.account) {\n throw new Error('Wallet client must have an account');\n }\n\n validateAmount(amount);\n\n const decimals = await this.sdk.publicClient.readContract({\n address: this.sdk.contractAddress,\n abi: DJEON402_ABI,\n functionName: 'decimals',\n });\n\n const amountBigInt = parseTokenAmount(amount, decimals as number);\n\n const hash = await walletClient.writeContract({\n address: this.sdk.contractAddress,\n abi: DJEON402_ABI,\n functionName: 'burn',\n args: [amountBigInt],\n account: walletClient.account,\n chain: walletClient.chain,\n });\n\n const receipt = await this.sdk.publicClient.waitForTransactionReceipt({ hash });\n\n return {\n success: receipt.status === 'success',\n hash,\n blockNumber: receipt.blockNumber.toString(),\n };\n }\n}\n","import {\n DJEON402_ABI,\n parseTokenAmount,\n type CancelAuthorizationResult,\n type ReceiveAuthorizationSignature,\n type TransferAuthorizationSignature,\n type TransferResult,\n validateAddress,\n validateAmount,\n} from '@bbuilders/djeon402-core';\nimport type { Address, Hex, WalletClient } from 'viem';\nimport type { Djeon402ClientSDK } from '../client';\n\nexport class X402Module {\n constructor(private sdk: Djeon402ClientSDK) {}\n\n /**\n * Generate a random nonce\n */\n generateNonce(): Hex {\n const randomBytes = new Uint8Array(32);\n crypto.getRandomValues(randomBytes);\n return `0x${Array.from(randomBytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('')}` as Hex;\n }\n\n /**\n * Get EIP-712 domain separator\n */\n async getDomainSeparator(): Promise<Hex> {\n const domain = await this.sdk.publicClient.readContract({\n address: this.sdk.contractAddress,\n abi: DJEON402_ABI,\n functionName: 'DOMAIN_SEPARATOR',\n });\n\n return domain as Hex;\n }\n\n /**\n * Get authorization state (whether a nonce has been used)\n */\n async getAuthorizationState(authorizer: Address, nonce: Hex): Promise<boolean> {\n return (await this.sdk.publicClient.readContract({\n address: this.sdk.contractAddress,\n abi: DJEON402_ABI,\n functionName: 'authorizationState',\n args: [authorizer, nonce],\n })) as boolean;\n }\n\n /**\n * Sign transfer authorization using wallet\n */\n async signTransferWithWallet(params: {\n walletClient: WalletClient;\n to: Address;\n amount: string;\n validAfter?: bigint;\n validBefore?: bigint;\n nonce?: Hex;\n }): Promise<TransferAuthorizationSignature> {\n const { walletClient, to, amount, validAfter = 0n, validBefore, nonce } = params;\n\n if (!walletClient.account) {\n throw new Error('Wallet client must have an account');\n }\n\n validateAddress(to);\n validateAmount(amount);\n\n const from = walletClient.account.address;\n\n // Get decimals\n const decimals = await this.sdk.publicClient.readContract({\n address: this.sdk.contractAddress,\n abi: DJEON402_ABI,\n functionName: 'decimals',\n });\n\n const value = parseTokenAmount(amount, decimals as number);\n\n // Generate nonce if not provided\n const transferNonce = nonce || this.generateNonce();\n\n // Calculate validBefore if not provided (default: 1 hour from now)\n const validBeforeTimestamp = validBefore ?? BigInt(Math.floor(Date.now() / 1000) + 3600);\n\n // Get token name for EIP-712 domain\n const name = await this.sdk.publicClient.readContract({\n address: this.sdk.contractAddress,\n abi: DJEON402_ABI,\n functionName: 'name',\n });\n\n // EIP-712 domain\n const domain = {\n name: name as string,\n version: '1',\n chainId: this.sdk.chainId,\n verifyingContract: this.sdk.contractAddress,\n };\n\n // EIP-712 types\n const types = {\n TransferWithAuthorization: [\n { name: 'from', type: 'address' },\n { name: 'to', type: 'address' },\n { name: 'value', type: 'uint256' },\n { name: 'validAfter', type: 'uint256' },\n { name: 'validBefore', type: 'uint256' },\n { name: 'nonce', type: 'bytes32' },\n ],\n };\n\n // Message to sign\n const message = {\n from,\n to,\n value,\n validAfter,\n validBefore: validBeforeTimestamp,\n nonce: transferNonce,\n };\n\n // Sign typed data\n const signature = await walletClient.signTypedData({\n account: walletClient.account,\n domain,\n types,\n primaryType: 'TransferWithAuthorization',\n message,\n });\n\n // Split signature into v, r, s\n const v = parseInt(signature.slice(130, 132), 16);\n const r = `0x${signature.slice(2, 66)}` as Hex;\n const s = `0x${signature.slice(66, 130)}` as Hex;\n\n return {\n from,\n to,\n value,\n validAfter,\n validBefore: validBeforeTimestamp,\n nonce: transferNonce,\n v,\n r,\n s,\n };\n }\n\n /**\n * Sign receive authorization using wallet (receiver signs)\n */\n async signReceiveWithWallet(params: {\n walletClient: WalletClient;\n from: Address;\n amount: string;\n validAfter?: bigint;\n validBefore?: bigint;\n nonce?: Hex;\n }): Promise<ReceiveAuthorizationSignature> {\n const { walletClient, from, amount, validAfter = 0n, validBefore, nonce } = params;\n\n if (!walletClient.account) {\n throw new Error('Wallet client must have an account');\n }\n\n validateAddress(from);\n validateAmount(amount);\n\n const to = walletClient.account.address;\n\n const decimals = await this.sdk.publicClient.readContract({\n address: this.sdk.contractAddress,\n abi: DJEON402_ABI,\n functionName: 'decimals',\n });\n\n const value = parseTokenAmount(amount, decimals as number);\n const receiveNonce = nonce || this.generateNonce();\n const validBeforeTimestamp = validBefore ?? BigInt(Math.floor(Date.now() / 1000) + 3600);\n\n const name = await this.sdk.publicClient.readContract({\n address: this.sdk.contractAddress,\n abi: DJEON402_ABI,\n functionName: 'name',\n });\n\n const domain = {\n name: name as string,\n version: '1',\n chainId: this.sdk.chainId,\n verifyingContract: this.sdk.contractAddress,\n };\n\n const types = {\n ReceiveWithAuthorization: [\n { name: 'from', type: 'address' },\n { name: 'to', type: 'address' },\n { name: 'value', type: 'uint256' },\n { name: 'validAfter', type: 'uint256' },\n { name: 'validBefore', type: 'uint256' },\n { name: 'nonce', type: 'bytes32' },\n ],\n };\n\n const message = {\n from,\n to,\n value,\n validAfter,\n validBefore: validBeforeTimestamp,\n nonce: receiveNonce,\n };\n\n const signature = await walletClient.signTypedData({\n account: walletClient.account,\n domain,\n types,\n primaryType: 'ReceiveWithAuthorization',\n message,\n });\n\n const v = parseInt(signature.slice(130, 132), 16);\n const r = `0x${signature.slice(2, 66)}` as Hex;\n const s = `0x${signature.slice(66, 130)}` as Hex;\n\n return {\n from,\n to,\n value,\n validAfter,\n validBefore: validBeforeTimestamp,\n nonce: receiveNonce,\n v,\n r,\n s,\n };\n }\n\n /**\n * Execute receive with authorization (caller must be the receiver)\n */\n async executeReceive(params: {\n walletClient: WalletClient;\n authorization: ReceiveAuthorizationSignature;\n }): Promise<TransferResult> {\n const { walletClient, authorization } = params;\n\n if (!walletClient.account) {\n throw new Error('Wallet client must have an account');\n }\n\n const { from, to, value, validAfter, validBefore, nonce, v, r, s } = authorization;\n\n const hash = await walletClient.writeContract({\n address: this.sdk.contractAddress,\n abi: DJEON402_ABI,\n functionName: 'receiveWithAuthorization',\n args: [from, to, value, validAfter, validBefore, nonce, v, r, s],\n account: walletClient.account,\n chain: walletClient.chain,\n });\n\n const receipt = await this.sdk.publicClient.waitForTransactionReceipt({ hash });\n\n return {\n success: receipt.status === 'success',\n hash,\n blockNumber: receipt.blockNumber.toString(),\n };\n }\n\n /**\n * Sign cancel authorization using wallet\n */\n async signCancelWithWallet(params: {\n walletClient: WalletClient;\n authorizer: Address;\n nonce: Hex;\n }): Promise<{ authorizer: Address; nonce: Hex; v: number; r: Hex; s: Hex }> {\n const { walletClient, authorizer, nonce: authNonce } = params;\n\n if (!walletClient.account) {\n throw new Error('Wallet client must have an account');\n }\n\n const name = await this.sdk.publicClient.readContract({\n address: this.sdk.contractAddress,\n abi: DJEON402_ABI,\n functionName: 'name',\n });\n\n const domain = {\n name: name as string,\n version: '1',\n chainId: this.sdk.chainId,\n verifyingContract: this.sdk.contractAddress,\n };\n\n const types = {\n CancelAuthorization: [\n { name: 'authorizer', type: 'address' },\n { name: 'nonce', type: 'bytes32' },\n ],\n };\n\n const message = { authorizer, nonce: authNonce };\n\n const signature = await walletClient.signTypedData({\n account: walletClient.account,\n domain,\n types,\n primaryType: 'CancelAuthorization',\n message,\n });\n\n const v = parseInt(signature.slice(130, 132), 16);\n const r = `0x${signature.slice(2, 66)}` as Hex;\n const s = `0x${signature.slice(66, 130)}` as Hex;\n\n return { authorizer, nonce: authNonce, v, r, s };\n }\n\n /**\n * Cancel an authorization (marks nonce as used)\n */\n async cancelAuthorization(params: {\n walletClient: WalletClient;\n authorizer: Address;\n nonce: Hex;\n }): Promise<CancelAuthorizationResult> {\n const { walletClient } = params;\n\n const { authorizer, nonce, v, r, s } = await this.signCancelWithWallet(params);\n\n const hash = await walletClient.writeContract({\n address: this.sdk.contractAddress,\n abi: DJEON402_ABI,\n functionName: 'cancelAuthorization',\n args: [authorizer, nonce, v, r, s],\n account: walletClient.account!,\n chain: walletClient.chain,\n });\n\n const receipt = await this.sdk.publicClient.waitForTransactionReceipt({ hash });\n\n return {\n success: receipt.status === 'success',\n hash,\n blockNumber: receipt.blockNumber.toString(),\n };\n }\n\n /**\n * Execute transfer with authorization (relayer function)\n */\n async executeTransfer(params: {\n walletClient: WalletClient;\n authorization: TransferAuthorizationSignature;\n }): Promise<TransferResult> {\n const { walletClient, authorization } = params;\n\n if (!walletClient.account) {\n throw new Error('Wallet client must have an account');\n }\n\n const { from, to, value, validAfter, validBefore, nonce, v, r, s } = authorization;\n\n const hash = await walletClient.writeContract({\n address: this.sdk.contractAddress,\n abi: DJEON402_ABI,\n functionName: 'transferWithAuthorization',\n args: [from, to, value, validAfter, validBefore, nonce, v, r, s],\n account: walletClient.account,\n chain: walletClient.chain,\n });\n\n const receipt = await this.sdk.publicClient.waitForTransactionReceipt({ hash });\n\n return {\n success: receipt.status === 'success',\n hash,\n blockNumber: receipt.blockNumber.toString(),\n };\n }\n\n /**\n * Fetch wrapper that auto-handles 402 Payment Required responses.\n * On 402, decodes PAYMENT-REQUIRED header, signs authorization, retries with PAYMENT-SIGNATURE.\n */\n async fetchWithPayment(\n walletClient: WalletClient,\n url: string,\n options: RequestInit = {},\n ): Promise<Response> {\n const response = await fetch(url, options);\n\n if (response.status !== 402) return response;\n\n const paymentRequiredHeader = response.headers.get('PAYMENT-REQUIRED');\n if (!paymentRequiredHeader) {\n throw new Error('402 response missing PAYMENT-REQUIRED header');\n }\n\n const paymentRequired = JSON.parse(atob(paymentRequiredHeader));\n const accepted = paymentRequired.accepts?.[0];\n if (!accepted) {\n throw new Error('No accepted payment methods in 402 response');\n }\n\n const authData = await this.signTransferWithWallet({\n walletClient,\n to: accepted.payTo as Address,\n amount: accepted.amount,\n });\n\n const paymentPayload = {\n x402Version: paymentRequired.x402Version || 2,\n resource: paymentRequired.resource,\n accepted,\n payload: {\n signature: `0x${authData.r.slice(2)}${authData.s.slice(2)}${authData.v.toString(16).padStart(2, '0')}`,\n authorization: {\n from: authData.from,\n to: authData.to,\n value: authData.value.toString(),\n validAfter: authData.validAfter.toString(),\n validBefore: authData.validBefore.toString(),\n nonce: authData.nonce,\n },\n },\n };\n\n const encoded = btoa(JSON.stringify(paymentPayload));\n return fetch(url, {\n ...options,\n headers: {\n ...Object.fromEntries(new Headers(options.headers).entries()),\n 'PAYMENT-SIGNATURE': encoded,\n },\n });\n }\n}\n","import type { BalanceResult } from '@bbuilders/djeon402-core';\nimport type { Address } from 'viem';\nimport { type Ref, ref, watch } from 'vue';\nimport { useDjeon402 } from './useDjeon402';\n\nexport function useBalance(address: Ref<Address | undefined>) {\n const { sdk } = useDjeon402();\n const data: Ref<BalanceResult | null> = ref(null);\n const error: Ref<Error | null> = ref(null);\n const isLoading = ref(false);\n\n const fetch = async () => {\n if (!address.value) return;\n\n isLoading.value = true;\n error.value = null;\n try {\n data.value = await sdk.token.getBalance(address.value);\n } catch (e) {\n error.value = e as Error;\n } finally {\n isLoading.value = false;\n }\n };\n\n watch(\n address,\n () => {\n fetch();\n },\n { immediate: true }\n );\n\n return {\n data,\n error,\n isLoading,\n refetch: fetch,\n };\n}\n","import type { Address } from 'viem';\nimport { type Ref, ref, watch } from 'vue';\nimport { useDjeon402 } from './useDjeon402';\n\nexport function useIsBlacklisted(address: Ref<Address | undefined>) {\n const { sdk } = useDjeon402();\n const data: Ref<{ isBlacklisted: boolean; address: Address } | null> = ref(null);\n const error: Ref<Error | null> = ref(null);\n const isLoading = ref(false);\n\n const fetch = async () => {\n if (!address.value) return;\n\n isLoading.value = true;\n error.value = null;\n try {\n data.value = await sdk.admin.isBlacklisted(address.value);\n } catch (e) {\n error.value = e as Error;\n } finally {\n isLoading.value = false;\n }\n };\n\n watch(\n address,\n () => {\n fetch();\n },\n { immediate: true }\n );\n\n return {\n data,\n error,\n isLoading,\n refetch: fetch,\n };\n}\n","import type { KYCData } from '@bbuilders/djeon402-core';\nimport type { Address } from 'viem';\nimport { type Ref, ref, watch } from 'vue';\nimport { useDjeon402 } from './useDjeon402';\n\nexport function useKYCData(address: Ref<Address | undefined>) {\n const { sdk } = useDjeon402();\n const data: Ref<KYCData | null> = ref(null);\n const error: Ref<Error | null> = ref(null);\n const isLoading = ref(false);\n\n const fetch = async () => {\n if (!address.value) return;\n\n isLoading.value = true;\n error.value = null;\n try {\n data.value = await sdk.kyc.getData(address.value);\n } catch (e) {\n error.value = e as Error;\n } finally {\n isLoading.value = false;\n }\n };\n\n watch(\n address,\n () => {\n fetch();\n },\n { immediate: true }\n );\n\n return {\n data,\n error,\n isLoading,\n refetch: fetch,\n };\n}\n","import type { TokenInfo } from '@bbuilders/djeon402-core';\nimport { onMounted, type Ref, ref } from 'vue';\nimport { useDjeon402 } from './useDjeon402';\n\nexport function useTokenInfo() {\n const { sdk } = useDjeon402();\n const data: Ref<TokenInfo | null> = ref(null);\n const error: Ref<Error | null> = ref(null);\n const isLoading = ref(false);\n\n const fetch = async () => {\n isLoading.value = true;\n error.value = null;\n try {\n data.value = await sdk.token.getInfo();\n } catch (e) {\n error.value = e as Error;\n } finally {\n isLoading.value = false;\n }\n };\n\n onMounted(() => {\n fetch();\n });\n\n return {\n data,\n error,\n isLoading,\n refetch: fetch,\n };\n}\n","import type { TransferResult } from '@bbuilders/djeon402-core';\nimport type { Address, WalletClient } from 'viem';\nimport { type Ref, ref } from 'vue';\nimport { useDjeon402 } from './useDjeon402';\n\nexport function useTransfer(walletClient: Ref<WalletClient | undefined>) {\n const { sdk } = useDjeon402();\n const data: Ref<TransferResult | null> = ref(null);\n const error: Ref<Error | null> = ref(null);\n const isLoading = ref(false);\n\n const transfer = async (to: Address, amount: string) => {\n if (!walletClient.value) {\n throw new Error('Wallet not connected');\n }\n\n isLoading.value = true;\n error.value = null;\n try {\n data.value = await sdk.token.transfer({\n walletClient: walletClient.value,\n to,\n amount,\n });\n return data.value;\n } catch (e) {\n error.value = e as Error;\n throw e;\n } finally {\n isLoading.value = false;\n }\n };\n\n return {\n transfer,\n data,\n error,\n isLoading,\n };\n}\n","import type { ReceiveAuthorizationSignature } from '@bbuilders/djeon402-core';\nimport type { Address, WalletClient } from 'viem';\nimport { type Ref, ref } from 'vue';\nimport { useDjeon402 } from './useDjeon402';\n\nexport function useX402Receive(walletClient: Ref<WalletClient | undefined>) {\n const { sdk } = useDjeon402();\n const data: Ref<ReceiveAuthorizationSignature | null> = ref(null);\n const error: Ref<Error | null> = ref(null);\n const isLoading = ref(false);\n\n const signReceive = async (params: {\n from: Address;\n amount: string;\n validAfter?: bigint;\n validBefore?: bigint;\n }) => {\n if (!walletClient.value) {\n throw new Error('Wallet not connected');\n }\n\n isLoading.value = true;\n error.value = null;\n try {\n data.value = await sdk.x402.signReceiveWithWallet({\n walletClient: walletClient.value,\n ...params,\n });\n return data.value;\n } catch (e) {\n error.value = e as Error;\n throw e;\n } finally {\n isLoading.value = false;\n }\n };\n\n return {\n signReceive,\n authorization: data,\n error,\n isLoading,\n };\n}\n","import type { TransferAuthorizationSignature } from '@bbuilders/djeon402-core';\nimport type { Address, WalletClient } from 'viem';\nimport { type Ref, ref } from 'vue';\nimport { useDjeon402 } from './useDjeon402';\n\nexport function useX402Transfer(walletClient: Ref<WalletClient | undefined>) {\n const { sdk } = useDjeon402();\n const data: Ref<TransferAuthorizationSignature | null> = ref(null);\n const error: Ref<Error | null> = ref(null);\n const isLoading = ref(false);\n\n const signTransfer = async (params: {\n to: Address;\n amount: string;\n validAfter?: bigint;\n validBefore?: bigint;\n }) => {\n if (!walletClient.value) {\n throw new Error('Wallet not connected');\n }\n\n isLoading.value = true;\n error.value = null;\n try {\n data.value = await sdk.x402.signTransferWithWallet({\n walletClient: walletClient.value,\n ...params,\n });\n return data.value;\n } catch (e) {\n error.value = e as Error;\n throw e;\n } finally {\n isLoading.value = false;\n }\n };\n\n return {\n signTransfer,\n authorization: data,\n error,\n isLoading,\n };\n}\n"],"mappings":"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","names":["import_vue","import_djeon402_core","import_djeon402_core","import_djeon402_core","import_vue","fetch","import_vue","fetch","import_vue","fetch","import_vue","fetch","import_vue","import_vue","import_vue"]}
|
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
import { TransferResult, BalanceResult, RolesResult, RoleCheckResult, KYCData, TokenInfo, AllowanceResult, TransferAuthorizationSignature, ReceiveAuthorizationSignature, CancelAuthorizationResult, ClientSDKConfig } from '@bbuilders/djeon402-core';
|
|
2
|
+
import { WalletClient, Address, Hex, PublicClient, Chain } from 'viem';
|
|
3
|
+
import { Ref } from 'vue';
|
|
4
|
+
|
|
5
|
+
declare function useApprove(walletClient: Ref<WalletClient | undefined>): {
|
|
6
|
+
approve: (spender: Address, amount: string) => Promise<TransferResult>;
|
|
7
|
+
data: Ref<TransferResult | null, TransferResult | null>;
|
|
8
|
+
error: Ref<Error | null, Error | null>;
|
|
9
|
+
isLoading: Ref<boolean, boolean>;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
declare function useBalance(address: Ref<Address | undefined>): {
|
|
13
|
+
data: Ref<BalanceResult | null, BalanceResult | null>;
|
|
14
|
+
error: Ref<Error | null, Error | null>;
|
|
15
|
+
isLoading: Ref<boolean, boolean>;
|
|
16
|
+
refetch: () => Promise<void>;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
declare class AdminModule {
|
|
20
|
+
private sdk;
|
|
21
|
+
constructor(sdk: Djeon402ClientSDK);
|
|
22
|
+
/**
|
|
23
|
+
* Get role hashes
|
|
24
|
+
*/
|
|
25
|
+
getRoles(): Promise<RolesResult>;
|
|
26
|
+
/**
|
|
27
|
+
* Check if address has role
|
|
28
|
+
*/
|
|
29
|
+
hasRole(role: Hex, account: Address): Promise<RoleCheckResult>;
|
|
30
|
+
/**
|
|
31
|
+
* Check if address is blacklisted
|
|
32
|
+
*/
|
|
33
|
+
isBlacklisted(account: Address): Promise<{
|
|
34
|
+
isBlacklisted: boolean;
|
|
35
|
+
address: Address;
|
|
36
|
+
}>;
|
|
37
|
+
/**
|
|
38
|
+
* Blacklist an address
|
|
39
|
+
*/
|
|
40
|
+
blacklist(params: {
|
|
41
|
+
walletClient: WalletClient;
|
|
42
|
+
account: Address;
|
|
43
|
+
}): Promise<TransferResult>;
|
|
44
|
+
/**
|
|
45
|
+
* Remove from blacklist
|
|
46
|
+
*/
|
|
47
|
+
unBlacklist(params: {
|
|
48
|
+
walletClient: WalletClient;
|
|
49
|
+
account: Address;
|
|
50
|
+
}): Promise<TransferResult>;
|
|
51
|
+
/**
|
|
52
|
+
* Pause contract
|
|
53
|
+
*/
|
|
54
|
+
pause(params: {
|
|
55
|
+
walletClient: WalletClient;
|
|
56
|
+
}): Promise<TransferResult>;
|
|
57
|
+
/**
|
|
58
|
+
* Unpause contract
|
|
59
|
+
*/
|
|
60
|
+
unpause(params: {
|
|
61
|
+
walletClient: WalletClient;
|
|
62
|
+
}): Promise<TransferResult>;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
declare class KYCModule {
|
|
66
|
+
private sdk;
|
|
67
|
+
constructor(sdk: Djeon402ClientSDK);
|
|
68
|
+
/**
|
|
69
|
+
* Get KYC data for an address
|
|
70
|
+
*/
|
|
71
|
+
getData(address: Address): Promise<KYCData>;
|
|
72
|
+
/**
|
|
73
|
+
* Get remaining daily limit
|
|
74
|
+
*/
|
|
75
|
+
getRemainingLimit(address: Address): Promise<{
|
|
76
|
+
address: `0x${string}`;
|
|
77
|
+
remainingLimit: string;
|
|
78
|
+
}>;
|
|
79
|
+
/**
|
|
80
|
+
* Verify KYC (admin only)
|
|
81
|
+
*/
|
|
82
|
+
verify(params: {
|
|
83
|
+
walletClient: WalletClient;
|
|
84
|
+
userAddress: Address;
|
|
85
|
+
level: number;
|
|
86
|
+
expiryDate: number;
|
|
87
|
+
documentHash: string;
|
|
88
|
+
}): Promise<TransferResult>;
|
|
89
|
+
/**
|
|
90
|
+
* Update KYC level (admin only)
|
|
91
|
+
*/
|
|
92
|
+
updateKYC(params: {
|
|
93
|
+
walletClient: WalletClient;
|
|
94
|
+
userAddress: Address;
|
|
95
|
+
level: number;
|
|
96
|
+
expiryDate?: number;
|
|
97
|
+
}): Promise<TransferResult>;
|
|
98
|
+
/**
|
|
99
|
+
* Revoke KYC (admin only)
|
|
100
|
+
*/
|
|
101
|
+
revokeKYC(params: {
|
|
102
|
+
walletClient: WalletClient;
|
|
103
|
+
userAddress: Address;
|
|
104
|
+
}): Promise<TransferResult>;
|
|
105
|
+
/**
|
|
106
|
+
* Set daily limit for a user (admin only)
|
|
107
|
+
*/
|
|
108
|
+
setDailyLimit(params: {
|
|
109
|
+
walletClient: WalletClient;
|
|
110
|
+
userAddress: Address;
|
|
111
|
+
limitUSD: string;
|
|
112
|
+
}): Promise<TransferResult>;
|
|
113
|
+
/**
|
|
114
|
+
* Check if a transaction amount is within the user's daily limit
|
|
115
|
+
*/
|
|
116
|
+
checkDailyLimit(params: {
|
|
117
|
+
walletClient: WalletClient;
|
|
118
|
+
userAddress: Address;
|
|
119
|
+
amountUSD: string;
|
|
120
|
+
}): Promise<boolean>;
|
|
121
|
+
/**
|
|
122
|
+
* Check if a user's KYC is valid (view)
|
|
123
|
+
*/
|
|
124
|
+
isKYCValid(userAddress: Address): Promise<boolean>;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
declare class TokenModule {
|
|
128
|
+
private sdk;
|
|
129
|
+
constructor(sdk: Djeon402ClientSDK);
|
|
130
|
+
/**
|
|
131
|
+
* Get token information
|
|
132
|
+
*/
|
|
133
|
+
getInfo(): Promise<TokenInfo>;
|
|
134
|
+
/**
|
|
135
|
+
* Get balance of an address
|
|
136
|
+
*/
|
|
137
|
+
getBalance(address: Address): Promise<BalanceResult>;
|
|
138
|
+
/**
|
|
139
|
+
* Get allowance
|
|
140
|
+
*/
|
|
141
|
+
getAllowance(owner: Address, spender: Address): Promise<AllowanceResult>;
|
|
142
|
+
/**
|
|
143
|
+
* Transfer tokens using wallet client
|
|
144
|
+
*/
|
|
145
|
+
transfer(params: {
|
|
146
|
+
walletClient: WalletClient;
|
|
147
|
+
to: Address;
|
|
148
|
+
amount: string;
|
|
149
|
+
}): Promise<TransferResult>;
|
|
150
|
+
/**
|
|
151
|
+
* Approve spending
|
|
152
|
+
*/
|
|
153
|
+
approve(params: {
|
|
154
|
+
walletClient: WalletClient;
|
|
155
|
+
spender: Address;
|
|
156
|
+
amount: string;
|
|
157
|
+
}): Promise<TransferResult>;
|
|
158
|
+
/**
|
|
159
|
+
* Mint tokens (requires MINTER_ROLE)
|
|
160
|
+
*/
|
|
161
|
+
mint(params: {
|
|
162
|
+
walletClient: WalletClient;
|
|
163
|
+
to: Address;
|
|
164
|
+
amount: string;
|
|
165
|
+
}): Promise<TransferResult>;
|
|
166
|
+
/**
|
|
167
|
+
* Burn tokens (requires BURNER_ROLE)
|
|
168
|
+
*/
|
|
169
|
+
burn(params: {
|
|
170
|
+
walletClient: WalletClient;
|
|
171
|
+
amount: string;
|
|
172
|
+
}): Promise<TransferResult>;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
declare class X402Module {
|
|
176
|
+
private sdk;
|
|
177
|
+
constructor(sdk: Djeon402ClientSDK);
|
|
178
|
+
/**
|
|
179
|
+
* Generate a random nonce
|
|
180
|
+
*/
|
|
181
|
+
generateNonce(): Hex;
|
|
182
|
+
/**
|
|
183
|
+
* Get EIP-712 domain separator
|
|
184
|
+
*/
|
|
185
|
+
getDomainSeparator(): Promise<Hex>;
|
|
186
|
+
/**
|
|
187
|
+
* Get authorization state (whether a nonce has been used)
|
|
188
|
+
*/
|
|
189
|
+
getAuthorizationState(authorizer: Address, nonce: Hex): Promise<boolean>;
|
|
190
|
+
/**
|
|
191
|
+
* Sign transfer authorization using wallet
|
|
192
|
+
*/
|
|
193
|
+
signTransferWithWallet(params: {
|
|
194
|
+
walletClient: WalletClient;
|
|
195
|
+
to: Address;
|
|
196
|
+
amount: string;
|
|
197
|
+
validAfter?: bigint;
|
|
198
|
+
validBefore?: bigint;
|
|
199
|
+
nonce?: Hex;
|
|
200
|
+
}): Promise<TransferAuthorizationSignature>;
|
|
201
|
+
/**
|
|
202
|
+
* Sign receive authorization using wallet (receiver signs)
|
|
203
|
+
*/
|
|
204
|
+
signReceiveWithWallet(params: {
|
|
205
|
+
walletClient: WalletClient;
|
|
206
|
+
from: Address;
|
|
207
|
+
amount: string;
|
|
208
|
+
validAfter?: bigint;
|
|
209
|
+
validBefore?: bigint;
|
|
210
|
+
nonce?: Hex;
|
|
211
|
+
}): Promise<ReceiveAuthorizationSignature>;
|
|
212
|
+
/**
|
|
213
|
+
* Execute receive with authorization (caller must be the receiver)
|
|
214
|
+
*/
|
|
215
|
+
executeReceive(params: {
|
|
216
|
+
walletClient: WalletClient;
|
|
217
|
+
authorization: ReceiveAuthorizationSignature;
|
|
218
|
+
}): Promise<TransferResult>;
|
|
219
|
+
/**
|
|
220
|
+
* Sign cancel authorization using wallet
|
|
221
|
+
*/
|
|
222
|
+
signCancelWithWallet(params: {
|
|
223
|
+
walletClient: WalletClient;
|
|
224
|
+
authorizer: Address;
|
|
225
|
+
nonce: Hex;
|
|
226
|
+
}): Promise<{
|
|
227
|
+
authorizer: Address;
|
|
228
|
+
nonce: Hex;
|
|
229
|
+
v: number;
|
|
230
|
+
r: Hex;
|
|
231
|
+
s: Hex;
|
|
232
|
+
}>;
|
|
233
|
+
/**
|
|
234
|
+
* Cancel an authorization (marks nonce as used)
|
|
235
|
+
*/
|
|
236
|
+
cancelAuthorization(params: {
|
|
237
|
+
walletClient: WalletClient;
|
|
238
|
+
authorizer: Address;
|
|
239
|
+
nonce: Hex;
|
|
240
|
+
}): Promise<CancelAuthorizationResult>;
|
|
241
|
+
/**
|
|
242
|
+
* Execute transfer with authorization (relayer function)
|
|
243
|
+
*/
|
|
244
|
+
executeTransfer(params: {
|
|
245
|
+
walletClient: WalletClient;
|
|
246
|
+
authorization: TransferAuthorizationSignature;
|
|
247
|
+
}): Promise<TransferResult>;
|
|
248
|
+
/**
|
|
249
|
+
* Fetch wrapper that auto-handles 402 Payment Required responses.
|
|
250
|
+
* On 402, decodes PAYMENT-REQUIRED header, signs authorization, retries with PAYMENT-SIGNATURE.
|
|
251
|
+
*/
|
|
252
|
+
fetchWithPayment(walletClient: WalletClient, url: string, options?: RequestInit): Promise<Response>;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* DJEON402 Client SDK for browsers
|
|
257
|
+
* Works with wallet providers (MetaMask, WalletConnect, etc.)
|
|
258
|
+
*/
|
|
259
|
+
declare class Djeon402ClientSDK {
|
|
260
|
+
readonly publicClient: PublicClient;
|
|
261
|
+
readonly contractAddress: Address;
|
|
262
|
+
readonly kycRegistryAddress?: Address;
|
|
263
|
+
readonly chainId: number;
|
|
264
|
+
readonly token: TokenModule;
|
|
265
|
+
readonly admin: AdminModule;
|
|
266
|
+
readonly kyc: KYCModule;
|
|
267
|
+
readonly x402: X402Module;
|
|
268
|
+
constructor(config: ClientSDKConfig);
|
|
269
|
+
/**
|
|
270
|
+
* Get chain configuration
|
|
271
|
+
*/
|
|
272
|
+
getChain(): Chain;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
interface Djeon402Config {
|
|
276
|
+
contractAddress: Address;
|
|
277
|
+
kycRegistryAddress?: Address;
|
|
278
|
+
chainId: number;
|
|
279
|
+
rpcUrl?: string;
|
|
280
|
+
}
|
|
281
|
+
interface Djeon402Context {
|
|
282
|
+
sdk: Djeon402ClientSDK;
|
|
283
|
+
config: Readonly<Djeon402Config>;
|
|
284
|
+
}
|
|
285
|
+
declare function provideDjeon402(config: Djeon402Config): Djeon402Context;
|
|
286
|
+
declare function useDjeon402(): Djeon402Context;
|
|
287
|
+
|
|
288
|
+
declare function useIsBlacklisted(address: Ref<Address | undefined>): {
|
|
289
|
+
data: Ref<{
|
|
290
|
+
isBlacklisted: boolean;
|
|
291
|
+
address: Address;
|
|
292
|
+
} | null, {
|
|
293
|
+
isBlacklisted: boolean;
|
|
294
|
+
address: Address;
|
|
295
|
+
} | null>;
|
|
296
|
+
error: Ref<Error | null, Error | null>;
|
|
297
|
+
isLoading: Ref<boolean, boolean>;
|
|
298
|
+
refetch: () => Promise<void>;
|
|
299
|
+
};
|
|
300
|
+
|
|
301
|
+
declare function useKYCData(address: Ref<Address | undefined>): {
|
|
302
|
+
data: Ref<KYCData | null, KYCData | null>;
|
|
303
|
+
error: Ref<Error | null, Error | null>;
|
|
304
|
+
isLoading: Ref<boolean, boolean>;
|
|
305
|
+
refetch: () => Promise<void>;
|
|
306
|
+
};
|
|
307
|
+
|
|
308
|
+
declare function useTokenInfo(): {
|
|
309
|
+
data: Ref<TokenInfo | null, TokenInfo | null>;
|
|
310
|
+
error: Ref<Error | null, Error | null>;
|
|
311
|
+
isLoading: Ref<boolean, boolean>;
|
|
312
|
+
refetch: () => Promise<void>;
|
|
313
|
+
};
|
|
314
|
+
|
|
315
|
+
declare function useTransfer(walletClient: Ref<WalletClient | undefined>): {
|
|
316
|
+
transfer: (to: Address, amount: string) => Promise<TransferResult>;
|
|
317
|
+
data: Ref<TransferResult | null, TransferResult | null>;
|
|
318
|
+
error: Ref<Error | null, Error | null>;
|
|
319
|
+
isLoading: Ref<boolean, boolean>;
|
|
320
|
+
};
|
|
321
|
+
|
|
322
|
+
declare function useX402Receive(walletClient: Ref<WalletClient | undefined>): {
|
|
323
|
+
signReceive: (params: {
|
|
324
|
+
from: Address;
|
|
325
|
+
amount: string;
|
|
326
|
+
validAfter?: bigint;
|
|
327
|
+
validBefore?: bigint;
|
|
328
|
+
}) => Promise<ReceiveAuthorizationSignature>;
|
|
329
|
+
authorization: Ref<ReceiveAuthorizationSignature | null, ReceiveAuthorizationSignature | null>;
|
|
330
|
+
error: Ref<Error | null, Error | null>;
|
|
331
|
+
isLoading: Ref<boolean, boolean>;
|
|
332
|
+
};
|
|
333
|
+
|
|
334
|
+
declare function useX402Transfer(walletClient: Ref<WalletClient | undefined>): {
|
|
335
|
+
signTransfer: (params: {
|
|
336
|
+
to: Address;
|
|
337
|
+
amount: string;
|
|
338
|
+
validAfter?: bigint;
|
|
339
|
+
validBefore?: bigint;
|
|
340
|
+
}) => Promise<TransferAuthorizationSignature>;
|
|
341
|
+
authorization: Ref<TransferAuthorizationSignature | null, TransferAuthorizationSignature | null>;
|
|
342
|
+
error: Ref<Error | null, Error | null>;
|
|
343
|
+
isLoading: Ref<boolean, boolean>;
|
|
344
|
+
};
|
|
345
|
+
|
|
346
|
+
export { provideDjeon402, useApprove, useBalance, useDjeon402, useIsBlacklisted, useKYCData, useTokenInfo, useTransfer, useX402Receive, useX402Transfer };
|