UNPKG

@worldcoin/minikit-js

Version:

minikit-js is our SDK for building mini-apps.

1,348 lines (1,327 loc) 80.5 kB
"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // index.ts var core_exports = {}; __export(core_exports, { AttestationErrorCodes: () => AttestationErrorCodes, AttestationErrorMessage: () => AttestationErrorMessage, COMMAND_VERSIONS: () => COMMAND_VERSIONS, ChatErrorCodes: () => ChatErrorCodes, ChatErrorMessage: () => ChatErrorMessage, Command: () => Command, GetPermissionsErrorCodes: () => GetPermissionsErrorCodes, GetPermissionsErrorMessage: () => GetPermissionsErrorMessage, MiniAppLaunchLocation: () => MiniAppLaunchLocation, MiniKit: () => MiniKit, MiniKitInstallErrorCodes: () => MiniKitInstallErrorCodes, MiniKitInstallErrorMessage: () => MiniKitInstallErrorMessage, Network: () => Network, PaymentErrorCodes: () => PaymentErrorCodes, PaymentErrorMessage: () => PaymentErrorMessage, Permission: () => Permission, RequestPermissionErrorCodes: () => RequestPermissionErrorCodes, RequestPermissionErrorMessage: () => RequestPermissionErrorMessage, ResponseEvent: () => ResponseEvent, SendHapticFeedbackErrorCodes: () => SendHapticFeedbackErrorCodes, SendHapticFeedbackErrorMessage: () => SendHapticFeedbackErrorMessage, SendTransactionErrorCodes: () => SendTransactionErrorCodes, SendTransactionErrorMessage: () => SendTransactionErrorMessage, ShareContactsErrorCodes: () => ShareContactsErrorCodes, ShareContactsErrorMessage: () => ShareContactsErrorMessage, ShareFilesErrorCodes: () => ShareFilesErrorCodes, ShareFilesErrorMessage: () => ShareFilesErrorMessage, SignMessageErrorCodes: () => SignMessageErrorCodes, SignMessageErrorMessage: () => SignMessageErrorMessage, SignTypedDataErrorCodes: () => SignTypedDataErrorCodes, SignTypedDataErrorMessage: () => SignTypedDataErrorMessage, TokenDecimals: () => TokenDecimals, Tokens: () => Tokens, VerificationErrorCodes: () => import_idkit_core2.AppErrorCodes, VerificationLevel: () => import_idkit_core6.VerificationLevel, WalletAuthErrorCodes: () => WalletAuthErrorCodes, WalletAuthErrorMessage: () => WalletAuthErrorMessage, createAsyncCommands: () => createAsyncCommands, createAttestationAsyncCommand: () => createAttestationAsyncCommand, createAttestationCommand: () => createAttestationCommand, createChatAsyncCommand: () => createChatAsyncCommand, createChatCommand: () => createChatCommand, createCloseMiniAppCommand: () => createCloseMiniAppCommand, createCommands: () => createCommands, createGetPermissionsAsyncCommand: () => createGetPermissionsAsyncCommand, createGetPermissionsCommand: () => createGetPermissionsCommand, createPayAsyncCommand: () => createPayAsyncCommand, createPayCommand: () => createPayCommand, createRequestPermissionAsyncCommand: () => createRequestPermissionAsyncCommand, createRequestPermissionCommand: () => createRequestPermissionCommand, createSendHapticFeedbackAsyncCommand: () => createSendHapticFeedbackAsyncCommand, createSendHapticFeedbackCommand: () => createSendHapticFeedbackCommand, createSendTransactionAsyncCommand: () => createSendTransactionAsyncCommand, createSendTransactionCommand: () => createSendTransactionCommand, createShareAsyncCommand: () => createShareAsyncCommand, createShareCommand: () => createShareCommand, createShareContactsAsyncCommand: () => createShareContactsAsyncCommand, createShareContactsCommand: () => createShareContactsCommand, createSignMessageAsyncCommand: () => createSignMessageAsyncCommand, createSignMessageCommand: () => createSignMessageCommand, createSignTypedDataAsyncCommand: () => createSignTypedDataAsyncCommand, createSignTypedDataCommand: () => createSignTypedDataCommand, createVerifyAsyncCommand: () => createVerifyAsyncCommand, createVerifyCommand: () => createVerifyCommand, createWalletAuthAsyncCommand: () => createWalletAuthAsyncCommand, createWalletAuthCommand: () => createWalletAuthCommand, getIsUserVerified: () => getIsUserVerified, isCommandAvailable: () => isCommandAvailable, mapWorldAppLaunchLocation: () => mapWorldAppLaunchLocation, parseSiweMessage: () => parseSiweMessage, sendMiniKitEvent: () => sendMiniKitEvent, setCommandAvailable: () => setCommandAvailable, tokenToDecimals: () => tokenToDecimals, validateCommands: () => validateCommands, verifyCloudProof: () => import_backend.verifyCloudProof, verifySiweMessage: () => verifySiweMessage }); module.exports = __toCommonJS(core_exports); // helpers/send-webview-event.ts var sendWebviewEvent = (payload) => { if (window.webkit) { window.webkit?.messageHandlers?.minikit?.postMessage?.(payload); } else if (window.Android) { window.Android.postMessage?.(JSON.stringify(payload)); } }; // commands/types.ts var Command = /* @__PURE__ */ ((Command2) => { Command2["Verify"] = "verify"; Command2["Pay"] = "pay"; Command2["WalletAuth"] = "wallet-auth"; Command2["SendTransaction"] = "send-transaction"; Command2["SignMessage"] = "sign-message"; Command2["SignTypedData"] = "sign-typed-data"; Command2["ShareContacts"] = "share-contacts"; Command2["RequestPermission"] = "request-permission"; Command2["GetPermissions"] = "get-permissions"; Command2["SendHapticFeedback"] = "send-haptic-feedback"; Command2["Share"] = "share"; Command2["Chat"] = "chat"; Command2["Attestation"] = "attestation"; Command2["CloseMiniApp"] = "close-miniapp"; return Command2; })(Command || {}); var ResponseEvent = /* @__PURE__ */ ((ResponseEvent3) => { ResponseEvent3["MiniAppVerifyAction"] = "miniapp-verify-action"; ResponseEvent3["MiniAppPayment"] = "miniapp-payment"; ResponseEvent3["MiniAppWalletAuth"] = "miniapp-wallet-auth"; ResponseEvent3["MiniAppSendTransaction"] = "miniapp-send-transaction"; ResponseEvent3["MiniAppSignMessage"] = "miniapp-sign-message"; ResponseEvent3["MiniAppSignTypedData"] = "miniapp-sign-typed-data"; ResponseEvent3["MiniAppShareContacts"] = "miniapp-share-contacts"; ResponseEvent3["MiniAppRequestPermission"] = "miniapp-request-permission"; ResponseEvent3["MiniAppGetPermissions"] = "miniapp-get-permissions"; ResponseEvent3["MiniAppSendHapticFeedback"] = "miniapp-send-haptic-feedback"; ResponseEvent3["MiniAppShare"] = "miniapp-share"; ResponseEvent3["MiniAppMicrophone"] = "miniapp-microphone"; ResponseEvent3["MiniAppChat"] = "miniapp-chat"; ResponseEvent3["MiniAppAttestation"] = "miniapp-attestation"; return ResponseEvent3; })(ResponseEvent || {}); var COMMAND_VERSIONS = { ["verify" /* Verify */]: 1, ["pay" /* Pay */]: 1, ["wallet-auth" /* WalletAuth */]: 2, ["send-transaction" /* SendTransaction */]: 1, ["sign-message" /* SignMessage */]: 1, ["sign-typed-data" /* SignTypedData */]: 1, ["share-contacts" /* ShareContacts */]: 1, ["request-permission" /* RequestPermission */]: 1, ["get-permissions" /* GetPermissions */]: 1, ["send-haptic-feedback" /* SendHapticFeedback */]: 1, ["share" /* Share */]: 1, ["chat" /* Chat */]: 1, ["attestation" /* Attestation */]: 1, ["close-miniapp" /* CloseMiniApp */]: 1 }; var commandAvailability = { ["verify" /* Verify */]: false, ["pay" /* Pay */]: false, ["wallet-auth" /* WalletAuth */]: false, ["send-transaction" /* SendTransaction */]: false, ["sign-message" /* SignMessage */]: false, ["sign-typed-data" /* SignTypedData */]: false, ["share-contacts" /* ShareContacts */]: false, ["request-permission" /* RequestPermission */]: false, ["get-permissions" /* GetPermissions */]: false, ["send-haptic-feedback" /* SendHapticFeedback */]: false, ["share" /* Share */]: false, ["chat" /* Chat */]: false, ["attestation" /* Attestation */]: false, ["close-miniapp" /* CloseMiniApp */]: false }; function isCommandAvailable(command) { return commandAvailability[command]; } function setCommandAvailable(command, available) { commandAvailability[command] = available; } function validateCommands(worldAppSupportedCommands) { let allCommandsValid = true; Object.entries(COMMAND_VERSIONS).forEach(([commandName, version]) => { const commandInput = worldAppSupportedCommands.find( (cmd) => cmd.name === commandName ); let isCommandValid = false; if (!commandInput) { console.warn( `Command ${commandName} is not supported by the app. Try updating the app version` ); } else { if (commandInput.supported_versions.includes(version)) { setCommandAvailable(commandName, true); isCommandValid = true; } else { isCommandValid = true; console.warn( `Command ${commandName} version ${version} is not supported by the app. Supported versions: ${commandInput.supported_versions.join(", ")}. This is not an error, but it is recommended to update the World App version.` ); setCommandAvailable(commandName, true); } } if (!isCommandValid) { allCommandsValid = false; } }); return allCommandsValid; } function sendMiniKitEvent(payload) { sendWebviewEvent(payload); } // commands/attestation.ts var AttestationErrorCodes = /* @__PURE__ */ ((AttestationErrorCodes2) => { AttestationErrorCodes2["Unauthorized"] = "unauthorized"; AttestationErrorCodes2["AttestationFailed"] = "attestation_failed"; AttestationErrorCodes2["IntegrityFailed"] = "integrity_failed"; AttestationErrorCodes2["InvalidInput"] = "invalid_input"; AttestationErrorCodes2["UnsupportedVersion"] = "unsupported_version"; return AttestationErrorCodes2; })(AttestationErrorCodes || {}); var AttestationErrorMessage = { ["unauthorized" /* Unauthorized */]: "App is not whitelisted for attestation.", ["attestation_failed" /* AttestationFailed */]: "Failed to obtain token from attestation gateway.", ["integrity_failed" /* IntegrityFailed */]: "Platform integrity check failed.", ["invalid_input" /* InvalidInput */]: "Invalid request payload.", ["unsupported_version" /* UnsupportedVersion */]: "Command version is not supported." }; function createAttestationCommand(_ctx) { return (input) => { if (typeof window === "undefined" || !isCommandAvailable("attestation" /* Attestation */)) { console.error( "'attestation' command is unavailable. Check MiniKit.install() or update the app version" ); return null; } if (!input.requestHash || input.requestHash.length === 0) { console.error("'attestation' command requires a non-empty requestHash"); return null; } const payload = { request_hash: input.requestHash }; sendMiniKitEvent({ command: "attestation" /* Attestation */, version: COMMAND_VERSIONS["attestation" /* Attestation */], payload }); return payload; }; } function createAttestationAsyncCommand(ctx, syncCommand) { return async (input) => { return new Promise((resolve, reject) => { try { const handleResponse = (response) => { ctx.events.unsubscribe("miniapp-attestation" /* MiniAppAttestation */); resolve({ commandPayload, finalPayload: response }); }; ctx.events.subscribe( "miniapp-attestation" /* MiniAppAttestation */, handleResponse ); const commandPayload = syncCommand(input); if (!commandPayload) { ctx.events.unsubscribe("miniapp-attestation" /* MiniAppAttestation */); reject( new Error( "'attestation' command failed: command unavailable or invalid input" ) ); } } catch (error) { ctx.events.unsubscribe("miniapp-attestation" /* MiniAppAttestation */); reject(error); } }); }; } // commands/chat.ts var ChatErrorCodes = /* @__PURE__ */ ((ChatErrorCodes2) => { ChatErrorCodes2["UserRejected"] = "user_rejected"; ChatErrorCodes2["SendFailed"] = "send_failed"; ChatErrorCodes2["GenericError"] = "generic_error"; return ChatErrorCodes2; })(ChatErrorCodes || {}); var ChatErrorMessage = { ["user_rejected" /* UserRejected */]: "User rejected the request.", ["send_failed" /* SendFailed */]: "Failed to send the message.", ["generic_error" /* GenericError */]: "Something unexpected went wrong." }; function createChatCommand(_ctx) { return (payload) => { if (typeof window === "undefined" || !isCommandAvailable("chat" /* Chat */)) { console.error( "'chat' command is unavailable. Check MiniKit.install() or update the app version" ); return null; } if (payload.message.length === 0) { console.error("'chat' command requires a non-empty message"); return null; } sendMiniKitEvent({ command: "chat" /* Chat */, version: COMMAND_VERSIONS["chat" /* Chat */], payload }); return payload; }; } function createChatAsyncCommand(ctx, syncCommand) { return async (payload) => { return new Promise((resolve, reject) => { try { let commandPayload = null; const handleResponse = (response) => { ctx.events.unsubscribe("miniapp-chat" /* MiniAppChat */); resolve({ commandPayload, finalPayload: response }); }; ctx.events.subscribe("miniapp-chat" /* MiniAppChat */, handleResponse); commandPayload = syncCommand(payload); } catch (error) { reject(error); } }); }; } // commands/close-miniapp.ts function createCloseMiniAppCommand(_ctx) { return () => { if (typeof window === "undefined" || !isCommandAvailable("close-miniapp" /* CloseMiniApp */)) { console.error( "'closeMiniApp' command is unavailable. Check MiniKit.install() or update the app version" ); return false; } sendMiniKitEvent({ command: "close-miniapp" /* CloseMiniApp */, version: COMMAND_VERSIONS["close-miniapp" /* CloseMiniApp */], payload: {} }); return true; }; } // commands/get-permissions.ts var GetPermissionsErrorCodes = /* @__PURE__ */ ((GetPermissionsErrorCodes2) => { GetPermissionsErrorCodes2["GenericError"] = "generic_error"; return GetPermissionsErrorCodes2; })(GetPermissionsErrorCodes || {}); var GetPermissionsErrorMessage = { ["generic_error" /* GenericError */]: "Something unexpected went wrong. Please try again." }; var Permission = /* @__PURE__ */ ((Permission2) => { Permission2["Notifications"] = "notifications"; Permission2["Contacts"] = "contacts"; Permission2["Microphone"] = "microphone"; return Permission2; })(Permission || {}); function createGetPermissionsCommand(_ctx) { return () => { if (typeof window === "undefined" || !isCommandAvailable("get-permissions" /* GetPermissions */)) { console.error( "'getPermissions' command is unavailable. Check MiniKit.install() or update the app version" ); return null; } sendMiniKitEvent({ command: "get-permissions" /* GetPermissions */, version: COMMAND_VERSIONS["get-permissions" /* GetPermissions */], payload: {} }); return { status: "sent" }; }; } function createGetPermissionsAsyncCommand(ctx, syncCommand) { return async () => { return new Promise((resolve, reject) => { try { let commandPayload = null; const handleResponse = (payload) => { ctx.events.unsubscribe("miniapp-get-permissions" /* MiniAppGetPermissions */); resolve({ commandPayload, finalPayload: payload }); }; ctx.events.subscribe( "miniapp-get-permissions" /* MiniAppGetPermissions */, handleResponse ); commandPayload = syncCommand(); } catch (error) { reject(error); } }); }; } // types/payment.ts var Tokens = /* @__PURE__ */ ((Tokens3) => { Tokens3["USDC"] = "USDCE"; Tokens3["WLD"] = "WLD"; return Tokens3; })(Tokens || {}); var TokenDecimals = { ["USDCE" /* USDC */]: 6, ["WLD" /* WLD */]: 18 }; var Network = /* @__PURE__ */ ((Network2) => { Network2["Optimism"] = "optimism"; Network2["WorldChain"] = "worldchain"; return Network2; })(Network || {}); // helpers/payment/client.ts var tokenToDecimals = (amount, token) => { const decimals = TokenDecimals[token]; if (decimals === void 0) { throw new Error(`Invalid token: ${token}`); } const factor = 10 ** decimals; const result = amount * factor; if (!Number.isInteger(result)) { throw new Error(`The resulting amount is not a whole number: ${result}`); } return result; }; var validatePaymentPayload = (payload) => { if (payload.tokens.some( (token) => token.symbol == "USDCE" /* USDC */ && parseFloat(token.token_amount) < 0.1 )) { console.error("USDC amount should be greater than $0.1"); return false; } if (payload.reference.length > 36) { console.error("Reference must not exceed 36 characters"); return false; } if (typeof payload.reference !== "string") { throw new Error("Reference must be a string"); } return true; }; // commands/pay.ts var PaymentErrorCodes = /* @__PURE__ */ ((PaymentErrorCodes2) => { PaymentErrorCodes2["InputError"] = "input_error"; PaymentErrorCodes2["UserRejected"] = "user_rejected"; PaymentErrorCodes2["PaymentRejected"] = "payment_rejected"; PaymentErrorCodes2["InvalidReceiver"] = "invalid_receiver"; PaymentErrorCodes2["InsufficientBalance"] = "insufficient_balance"; PaymentErrorCodes2["TransactionFailed"] = "transaction_failed"; PaymentErrorCodes2["GenericError"] = "generic_error"; PaymentErrorCodes2["UserBlocked"] = "user_blocked"; return PaymentErrorCodes2; })(PaymentErrorCodes || {}); var PaymentErrorMessage = { ["input_error" /* InputError */]: "There was a problem with this request. Please try again or contact the app owner.", ["user_rejected" /* UserRejected */]: "You have cancelled the payment in World App.", ["payment_rejected" /* PaymentRejected */]: "You've cancelled the payment in World App.", ["invalid_receiver" /* InvalidReceiver */]: "The receiver address is invalid. Please contact the app owner.", ["insufficient_balance" /* InsufficientBalance */]: "You do not have enough balance to complete this transaction.", ["transaction_failed" /* TransactionFailed */]: "The transaction failed. Please try again.", ["generic_error" /* GenericError */]: "Something unexpected went wrong. Please try again.", ["user_blocked" /* UserBlocked */]: "User's region is blocked from making payments." }; function createPayCommand(_ctx) { return (payload) => { if (typeof window === "undefined" || !isCommandAvailable("pay" /* Pay */)) { console.error( "'pay' command is unavailable. Check MiniKit.install() or update the app version" ); return null; } if (!validatePaymentPayload(payload)) { return null; } const eventPayload = { ...payload, network: "worldchain" /* WorldChain */ }; sendMiniKitEvent({ command: "pay" /* Pay */, version: COMMAND_VERSIONS["pay" /* Pay */], payload: eventPayload }); return eventPayload; }; } function createPayAsyncCommand(ctx, syncCommand) { return async (payload) => { return new Promise((resolve, reject) => { try { let commandPayload = null; const handleResponse = (response) => { ctx.events.unsubscribe("miniapp-payment" /* MiniAppPayment */); resolve({ commandPayload, finalPayload: response }); }; ctx.events.subscribe( "miniapp-payment" /* MiniAppPayment */, handleResponse ); commandPayload = syncCommand(payload); } catch (error) { reject(error); } }); }; } // commands/request-permission.ts var RequestPermissionErrorCodes = /* @__PURE__ */ ((RequestPermissionErrorCodes2) => { RequestPermissionErrorCodes2["UserRejected"] = "user_rejected"; RequestPermissionErrorCodes2["GenericError"] = "generic_error"; RequestPermissionErrorCodes2["AlreadyRequested"] = "already_requested"; RequestPermissionErrorCodes2["PermissionDisabled"] = "permission_disabled"; RequestPermissionErrorCodes2["AlreadyGranted"] = "already_granted"; RequestPermissionErrorCodes2["UnsupportedPermission"] = "unsupported_permission"; return RequestPermissionErrorCodes2; })(RequestPermissionErrorCodes || {}); var RequestPermissionErrorMessage = { ["user_rejected" /* UserRejected */]: "User declined sharing contacts", ["generic_error" /* GenericError */]: "Request failed for unknown reason.", ["already_requested" /* AlreadyRequested */]: "User has already declined turning on notifications once", ["permission_disabled" /* PermissionDisabled */]: "User does not have this permission enabled in World App", ["already_granted" /* AlreadyGranted */]: "If the user has already granted this mini app permission", ["unsupported_permission" /* UnsupportedPermission */]: "The permission requested is not supported by this mini app" }; function createRequestPermissionCommand(_ctx) { return (payload) => { if (typeof window === "undefined" || !isCommandAvailable("request-permission" /* RequestPermission */)) { console.error( "'requestPermission' command is unavailable. Check MiniKit.install() or update the app version" ); return null; } sendMiniKitEvent({ command: "request-permission" /* RequestPermission */, version: COMMAND_VERSIONS["request-permission" /* RequestPermission */], payload }); return payload; }; } function createRequestPermissionAsyncCommand(ctx, syncCommand) { return async (payload) => { return new Promise((resolve, reject) => { try { let commandPayload = null; const handleResponse = (response) => { ctx.events.unsubscribe("miniapp-request-permission" /* MiniAppRequestPermission */); resolve({ commandPayload, finalPayload: response }); }; ctx.events.subscribe( "miniapp-request-permission" /* MiniAppRequestPermission */, handleResponse ); commandPayload = syncCommand(payload); } catch (error) { reject(error); } }); }; } // commands/send-haptic-feedback.ts var SendHapticFeedbackErrorCodes = /* @__PURE__ */ ((SendHapticFeedbackErrorCodes2) => { SendHapticFeedbackErrorCodes2["GenericError"] = "generic_error"; SendHapticFeedbackErrorCodes2["UserRejected"] = "user_rejected"; return SendHapticFeedbackErrorCodes2; })(SendHapticFeedbackErrorCodes || {}); var SendHapticFeedbackErrorMessage = { ["generic_error" /* GenericError */]: "Something unexpected went wrong.", ["user_rejected" /* UserRejected */]: "User rejected the request." }; function createSendHapticFeedbackCommand(_ctx) { return (payload) => { if (typeof window === "undefined" || !isCommandAvailable("send-haptic-feedback" /* SendHapticFeedback */)) { console.error( "'sendHapticFeedback' command is unavailable. Check MiniKit.install() or update the app version" ); return null; } sendMiniKitEvent({ command: "send-haptic-feedback" /* SendHapticFeedback */, version: COMMAND_VERSIONS["send-haptic-feedback" /* SendHapticFeedback */], payload }); return payload; }; } function createSendHapticFeedbackAsyncCommand(ctx, syncCommand) { return async (payload) => { return new Promise((resolve, reject) => { try { let commandPayload = null; const handleResponse = (response) => { ctx.events.unsubscribe("miniapp-send-haptic-feedback" /* MiniAppSendHapticFeedback */); resolve({ commandPayload, finalPayload: response }); }; ctx.events.subscribe( "miniapp-send-haptic-feedback" /* MiniAppSendHapticFeedback */, handleResponse ); commandPayload = syncCommand(payload); } catch (error) { reject(error); } }); }; } // helpers/transaction/validate-payload.ts var isValidHex = (str) => { return /^0x[0-9A-Fa-f]+$/.test(str); }; var objectValuesToArrayRecursive = (input) => { if (input === null || typeof input !== "object") { return input; } if (Array.isArray(input)) { return input.map((item) => objectValuesToArrayRecursive(item)); } const values = Object.values(input); return values.map((value) => objectValuesToArrayRecursive(value)); }; var processPayload = (payload) => { if (typeof payload === "boolean" || typeof payload === "string" || payload === null || payload === void 0) { return payload; } if (typeof payload === "number" || typeof payload === "bigint") { return String(payload); } if (Array.isArray(payload)) { return payload.map((value) => processPayload(value)); } if (typeof payload === "object") { const result = { ...payload }; if ("value" in result && result.value !== void 0) { if (typeof result.value !== "string") { result.value = String(result.value); } if (!isValidHex(result.value)) { console.error( "Transaction value must be a valid hex string", result.value ); throw new Error( `Transaction value must be a valid hex string: ${result.value}` ); } } for (const key in result) { if (Object.prototype.hasOwnProperty.call(result, key)) { result[key] = processPayload(result[key]); } } return result; } return payload; }; var validateSendTransactionPayload = (payload) => { if (payload.formatPayload) { const formattedPayload = processPayload(payload); formattedPayload.transaction = formattedPayload.transaction.map((tx) => { const args = objectValuesToArrayRecursive(tx.args); return { ...tx, args }; }); return formattedPayload; } return payload; }; // commands/send-transaction.ts var SendTransactionErrorCodes = /* @__PURE__ */ ((SendTransactionErrorCodes2) => { SendTransactionErrorCodes2["InvalidOperation"] = "invalid_operation"; SendTransactionErrorCodes2["UserRejected"] = "user_rejected"; SendTransactionErrorCodes2["InputError"] = "input_error"; SendTransactionErrorCodes2["SimulationFailed"] = "simulation_failed"; SendTransactionErrorCodes2["TransactionFailed"] = "transaction_failed"; SendTransactionErrorCodes2["GenericError"] = "generic_error"; SendTransactionErrorCodes2["DisallowedOperation"] = "disallowed_operation"; SendTransactionErrorCodes2["ValidationError"] = "validation_error"; SendTransactionErrorCodes2["InvalidContract"] = "invalid_contract"; SendTransactionErrorCodes2["MaliciousOperation"] = "malicious_operation"; SendTransactionErrorCodes2["DailyTxLimitReached"] = "daily_tx_limit_reached"; SendTransactionErrorCodes2["PermittedAmountExceedsSlippage"] = "permitted_amount_exceeds_slippage"; SendTransactionErrorCodes2["PermittedAmountNotFound"] = "permitted_amount_not_found"; return SendTransactionErrorCodes2; })(SendTransactionErrorCodes || {}); var SendTransactionErrorMessage = { ["invalid_operation" /* InvalidOperation */]: "Transaction included an operation that was invalid", ["user_rejected" /* UserRejected */]: "User rejected the request.", ["input_error" /* InputError */]: "Invalid payload.", ["simulation_failed" /* SimulationFailed */]: "The transaction simulation failed.", ["validation_error" /* ValidationError */]: "The transaction validation failed. Please try again.", ["transaction_failed" /* TransactionFailed */]: "The transaction failed. Please try again later.", ["generic_error" /* GenericError */]: "Something unexpected went wrong. Please try again.", ["disallowed_operation" /* DisallowedOperation */]: "The operation requested is not allowed. Please refer to the docs.", ["invalid_contract" /* InvalidContract */]: "The contract address is not allowed for your application. Please check your developer portal configurations", ["malicious_operation" /* MaliciousOperation */]: "The operation requested is considered malicious.", ["daily_tx_limit_reached" /* DailyTxLimitReached */]: "Daily transaction limit reached. Max 100 transactions per day. Wait until the next day.", ["permitted_amount_exceeds_slippage" /* PermittedAmountExceedsSlippage */]: "Permitted amount exceeds slippage. You must spend at least 90% of the permitted amount.", ["permitted_amount_not_found" /* PermittedAmountNotFound */]: "Permitted amount not found in permit2 payload." }; function createSendTransactionCommand(_ctx) { return (payload) => { if (typeof window === "undefined" || !isCommandAvailable("send-transaction" /* SendTransaction */)) { console.error( "'sendTransaction' command is unavailable. Check MiniKit.install() or update the app version" ); return null; } payload.formatPayload = payload.formatPayload !== false; const validatedPayload = validateSendTransactionPayload(payload); sendMiniKitEvent({ command: "send-transaction" /* SendTransaction */, version: COMMAND_VERSIONS["send-transaction" /* SendTransaction */], payload: validatedPayload }); return validatedPayload; }; } function createSendTransactionAsyncCommand(ctx, syncCommand) { return async (payload) => { return new Promise((resolve, reject) => { try { let commandPayload = null; const handleResponse = (response) => { ctx.events.unsubscribe("miniapp-send-transaction" /* MiniAppSendTransaction */); resolve({ commandPayload, finalPayload: response }); }; ctx.events.subscribe( "miniapp-send-transaction" /* MiniAppSendTransaction */, handleResponse ); commandPayload = syncCommand(payload); } catch (error) { reject(error); } }); }; } // helpers/share/index.ts var MAX_FILES = 10; var MAX_TOTAL_SIZE_MB = 50; var MAX_TOTAL_SIZE_BYTES = MAX_TOTAL_SIZE_MB * 1024 * 1024; var processFile = async (file) => { const buffer = await file.arrayBuffer(); const uint8Array = new Uint8Array(buffer); let binaryString = ""; const K_CHUNK_SIZE = 32768; for (let i = 0; i < uint8Array.length; i += K_CHUNK_SIZE) { const chunk = uint8Array.subarray( i, Math.min(i + K_CHUNK_SIZE, uint8Array.length) ); binaryString += String.fromCharCode.apply( null, Array.from(chunk) // Convert Uint8Array chunk to number[] ); } const base64Data = btoa(binaryString); return { name: file.name, type: file.type, data: base64Data }; }; var formatShareInput = async (input) => { if (!input.files) { return { title: input.title, text: input.text, url: input.url }; } if (!Array.isArray(input.files)) { throw new Error('The "files" property must be an array.'); } if (input.files.length === 0) { } else { if (input.files.length > MAX_FILES) { throw new Error(`Cannot share more than ${MAX_FILES} files.`); } let totalSize = 0; for (const file of input.files) { if (!(file instanceof File)) { throw new Error( `Each item in the 'files' array must be a File object. Received: ${typeof file}` ); } totalSize += file.size; } if (totalSize > MAX_TOTAL_SIZE_BYTES) { throw new Error(`Total file size cannot exceed ${MAX_TOTAL_SIZE_MB}MB.`); } } const fileProcessingPromises = input.files.map((file) => processFile(file)); const processedFiles = await Promise.all(fileProcessingPromises); return { files: processedFiles, title: input.title, text: input.text, url: input.url }; }; // commands/share.ts var ShareFilesErrorCodes = /* @__PURE__ */ ((ShareFilesErrorCodes2) => { ShareFilesErrorCodes2["UserRejected"] = "user_rejected"; ShareFilesErrorCodes2["GenericError"] = "generic_error"; ShareFilesErrorCodes2["InvalidFileName"] = "invalid_file_name"; return ShareFilesErrorCodes2; })(ShareFilesErrorCodes || {}); var ShareFilesErrorMessage = { ["user_rejected" /* UserRejected */]: "User rejected the request.", ["generic_error" /* GenericError */]: "Something unexpected went wrong.", ["invalid_file_name" /* InvalidFileName */]: "Invalid file name. Make sure you include the extension" }; function createShareCommand(ctx) { return (payload) => { if (typeof window === "undefined" || !isCommandAvailable("share" /* Share */)) { console.error( "'share' command is unavailable. Check MiniKit.install() or update the app version" ); return null; } if (ctx.state.deviceProperties.deviceOS === "ios" && typeof navigator !== "undefined") { sendMiniKitEvent({ command: "share" /* Share */, version: COMMAND_VERSIONS["share" /* Share */], payload }); navigator.share(payload); } else { formatShareInput(payload).then((formattedResult) => { sendMiniKitEvent({ command: "share" /* Share */, version: COMMAND_VERSIONS["share" /* Share */], payload: formattedResult }); }).catch((error) => { console.error("Failed to format share input", error); }); ctx.events.subscribe("miniapp-share" /* MiniAppShare */, (response) => { console.log("Share Response", response); }); } return payload; }; } function createShareAsyncCommand(ctx, syncCommand) { return async (payload) => { return new Promise((resolve, reject) => { try { let commandPayload = null; const handleResponse = (response) => { ctx.events.unsubscribe("miniapp-share" /* MiniAppShare */); resolve({ commandPayload, finalPayload: response }); }; ctx.events.subscribe("miniapp-share" /* MiniAppShare */, handleResponse); commandPayload = syncCommand(payload); } catch (error) { reject(error); } }); }; } // commands/share-contacts.ts var ShareContactsErrorCodes = /* @__PURE__ */ ((ShareContactsErrorCodes2) => { ShareContactsErrorCodes2["UserRejected"] = "user_rejected"; ShareContactsErrorCodes2["GenericError"] = "generic_error"; return ShareContactsErrorCodes2; })(ShareContactsErrorCodes || {}); var ShareContactsErrorMessage = { ["user_rejected" /* UserRejected */]: "User rejected the request.", ["generic_error" /* GenericError */]: "Something unexpected went wrong." }; function createShareContactsCommand(_ctx) { return (payload) => { if (typeof window === "undefined" || !isCommandAvailable("share-contacts" /* ShareContacts */)) { console.error( "'shareContacts' command is unavailable. Check MiniKit.install() or update the app version" ); return null; } sendMiniKitEvent({ command: "share-contacts" /* ShareContacts */, version: COMMAND_VERSIONS["share-contacts" /* ShareContacts */], payload }); return payload; }; } function createShareContactsAsyncCommand(ctx, syncCommand) { return async (payload) => { return new Promise((resolve, reject) => { try { let commandPayload = null; const handleResponse = (response) => { ctx.events.unsubscribe("miniapp-share-contacts" /* MiniAppShareContacts */); resolve({ commandPayload, finalPayload: response }); }; ctx.events.subscribe( "miniapp-share-contacts" /* MiniAppShareContacts */, handleResponse ); commandPayload = syncCommand(payload); } catch (error) { reject(error); } }); }; } // commands/sign-message.ts var SignMessageErrorCodes = /* @__PURE__ */ ((SignMessageErrorCodes2) => { SignMessageErrorCodes2["InvalidMessage"] = "invalid_message"; SignMessageErrorCodes2["UserRejected"] = "user_rejected"; SignMessageErrorCodes2["GenericError"] = "generic_error"; return SignMessageErrorCodes2; })(SignMessageErrorCodes || {}); var SignMessageErrorMessage = { ["invalid_message" /* InvalidMessage */]: "Invalid message requested", ["user_rejected" /* UserRejected */]: "User rejected the request.", ["generic_error" /* GenericError */]: "Something unexpected went wrong." }; function createSignMessageCommand(_ctx) { return (payload) => { if (typeof window === "undefined" || !isCommandAvailable("sign-message" /* SignMessage */)) { console.error( "'signMessage' command is unavailable. Check MiniKit.install() or update the app version" ); return null; } sendMiniKitEvent({ command: "sign-message" /* SignMessage */, version: COMMAND_VERSIONS["sign-message" /* SignMessage */], payload }); return payload; }; } function createSignMessageAsyncCommand(ctx, syncCommand) { return async (payload) => { return new Promise((resolve, reject) => { try { let commandPayload = null; const handleResponse = (response) => { ctx.events.unsubscribe("miniapp-sign-message" /* MiniAppSignMessage */); resolve({ commandPayload, finalPayload: response }); }; ctx.events.subscribe( "miniapp-sign-message" /* MiniAppSignMessage */, handleResponse ); commandPayload = syncCommand(payload); } catch (error) { reject(error); } }); }; } // commands/sign-typed-data.ts var SignTypedDataErrorCodes = /* @__PURE__ */ ((SignTypedDataErrorCodes2) => { SignTypedDataErrorCodes2["InvalidOperation"] = "invalid_operation"; SignTypedDataErrorCodes2["UserRejected"] = "user_rejected"; SignTypedDataErrorCodes2["InputError"] = "input_error"; SignTypedDataErrorCodes2["SimulationFailed"] = "simulation_failed"; SignTypedDataErrorCodes2["GenericError"] = "generic_error"; SignTypedDataErrorCodes2["DisallowedOperation"] = "disallowed_operation"; SignTypedDataErrorCodes2["InvalidContract"] = "invalid_contract"; SignTypedDataErrorCodes2["MaliciousOperation"] = "malicious_operation"; return SignTypedDataErrorCodes2; })(SignTypedDataErrorCodes || {}); var SignTypedDataErrorMessage = { ["invalid_operation" /* InvalidOperation */]: "Transaction included an operation that was invalid", ["user_rejected" /* UserRejected */]: "User rejected the request.", ["input_error" /* InputError */]: "Invalid payload.", ["simulation_failed" /* SimulationFailed */]: "The transaction simulation failed.", ["generic_error" /* GenericError */]: "Something unexpected went wrong. Please try again.", ["disallowed_operation" /* DisallowedOperation */]: "The operation requested is not allowed. Please refer to the docs.", ["invalid_contract" /* InvalidContract */]: "The contract address is not allowed for your application. Please check your developer portal configurations", ["malicious_operation" /* MaliciousOperation */]: "The operation requested is considered malicious." }; function createSignTypedDataCommand(_ctx) { return (payload) => { console.warn( "signTypedData is deprecated. Use signMessage or sendTransaction instead." ); if (typeof window === "undefined" || !isCommandAvailable("sign-typed-data" /* SignTypedData */)) { console.error( "'signTypedData' command is unavailable. Check MiniKit.install() or update the app version" ); return null; } if (!payload.chainId) { payload.chainId = 480; } sendMiniKitEvent({ command: "sign-typed-data" /* SignTypedData */, version: COMMAND_VERSIONS["sign-typed-data" /* SignTypedData */], payload }); return payload; }; } function createSignTypedDataAsyncCommand(ctx, syncCommand) { return async (payload) => { return new Promise((resolve, reject) => { try { let commandPayload = null; const handleResponse = (response) => { ctx.events.unsubscribe("miniapp-sign-typed-data" /* MiniAppSignTypedData */); resolve({ commandPayload, finalPayload: response }); }; ctx.events.subscribe( "miniapp-sign-typed-data" /* MiniAppSignTypedData */, handleResponse ); commandPayload = syncCommand(payload); } catch (error) { reject(error); } }); }; } // commands/verify.ts var import_idkit_core = require("@worldcoin/idkit-core"); var import_hashing = require("@worldcoin/idkit-core/hashing"); var import_idkit_core2 = require("@worldcoin/idkit-core"); function createVerifyCommand(ctx) { return (payload) => { if (typeof window === "undefined" || !isCommandAvailable("verify" /* Verify */)) { console.error( "'verify' command is unavailable. Check MiniKit.install() or update the app version" ); return null; } if (Array.isArray(payload.verification_level) && payload.verification_level.length === 0) { console.error("'verification_level' must not be an empty array"); return null; } const timestamp = (/* @__PURE__ */ new Date()).toISOString(); const eventPayload = { action: (0, import_hashing.encodeAction)(payload.action), signal: (0, import_hashing.generateSignal)(payload.signal).digest, verification_level: payload.verification_level || import_idkit_core.VerificationLevel.Orb, timestamp }; ctx.events.setVerifyActionProcessingOptions({ skip_proof_compression: payload.skip_proof_compression }); sendMiniKitEvent({ command: "verify" /* Verify */, version: COMMAND_VERSIONS["verify" /* Verify */], payload: eventPayload }); return eventPayload; }; } function createVerifyAsyncCommand(ctx, syncCommand) { let hasInFlightVerifyRequest = false; return async (payload) => { if (hasInFlightVerifyRequest) { return Promise.reject( new Error( "A verify request is already in flight. Wait for the current request to complete before sending another." ) ); } return new Promise((resolve, reject) => { try { hasInFlightVerifyRequest = true; let commandPayload = null; const handleResponse = (response) => { ctx.events.unsubscribe("miniapp-verify-action" /* MiniAppVerifyAction */); hasInFlightVerifyRequest = false; resolve({ commandPayload, finalPayload: response }); }; ctx.events.subscribe( "miniapp-verify-action" /* MiniAppVerifyAction */, handleResponse ); commandPayload = syncCommand(payload); if (commandPayload === null) { ctx.events.unsubscribe("miniapp-verify-action" /* MiniAppVerifyAction */); hasInFlightVerifyRequest = false; reject( new Error( "Failed to send verify command. Ensure MiniKit is installed and the verify command is available." ) ); } } catch (error) { hasInFlightVerifyRequest = false; reject(error); } }); }; } // helpers/siwe/siwe.ts var import_viem = require("viem"); var import_chains = require("viem/chains"); var PREAMBLE = " wants you to sign in with your Ethereum account:"; var URI_TAG = "URI: "; var VERSION_TAG = "Version: "; var CHAIN_TAG = "Chain ID: "; var NONCE_TAG = "Nonce: "; var IAT_TAG = "Issued At: "; var EXP_TAG = "Expiration Time: "; var NBF_TAG = "Not Before: "; var RID_TAG = "Request ID: "; var ERC_191_PREFIX = "Ethereum Signed Message:\n"; var EIP1271_MAGICVALUE = "0x1626ba7e"; var SAFE_CONTRACT_ABI = [ { inputs: [ { internalType: "address", name: "owner", type: "address" } ], name: "isOwner", outputs: [ { internalType: "bool", name: "", type: "bool" } ], stateMutability: "view", type: "function" }, { inputs: [ { internalType: "bytes32", name: "_message", type: "bytes32" }, { internalType: "bytes", name: "_signature", type: "bytes" } ], name: "isValidSignature", outputs: [ { internalType: "bytes4", name: "", type: "bytes4" } ], stateMutability: "view", type: "function" } ]; var tagged = (line, tag) => { if (line && line.includes(tag)) { return line.replace(tag, ""); } else { throw new Error(`Missing '${tag}'`); } }; var parseSiweMessage = (inputString) => { const lines = inputString.split("\n")[Symbol.iterator](); const domain = tagged(lines.next()?.value, PREAMBLE); const address = lines.next()?.value; lines.next(); const nextValue = lines.next()?.value; let statement; if (nextValue) { statement = nextValue; lines.next(); } const uri = tagged(lines.next()?.value, URI_TAG); const version = tagged(lines.next()?.value, VERSION_TAG); const chain_id = tagged(lines.next()?.value, CHAIN_TAG); const nonce = tagged(lines.next()?.value, NONCE_TAG); const issued_at = tagged(lines.next()?.value, IAT_TAG); let expiration_time, not_before, request_id; for (let line of lines) { if (line.startsWith(EXP_TAG)) { expiration_time = tagged(line, EXP_TAG); } else if (line.startsWith(NBF_TAG)) { not_before = tagged(line, NBF_TAG); } else if (line.startsWith(RID_TAG)) { request_id = tagged(line, RID_TAG); } } if (lines.next().done === false) { throw new Error("Extra lines in the input"); } const siweMessageData = { domain, address, statement, uri, version, chain_id, nonce, issued_at, expiration_time, not_before, request_id }; return siweMessageData; }; var generateSiweMessage = (siweMessageData) => { let siweMessage = ""; if (siweMessageData.scheme) { siweMessage += `${siweMessageData.scheme}://${siweMessageData.domain} wants you to sign in with your Ethereum account: `; } else { siweMessage += `${siweMessageData.domain} wants you to sign in with your Ethereum account: `; } if (siweMessageData.address) { siweMessage += `${siweMessageData.address} `; } else { siweMessage += "{address}\n"; } siweMessage += "\n"; if (siweMessageData.statement) { siweMessage += `${siweMessageData.statement} `; } siweMessage += "\n"; siweMessage += `URI: ${siweMessageData.uri} `; siweMessage += `Version: ${siweMessageData.version} `; siweMessage += `Chain ID: ${siweMessageData.chain_id} `; siweMessage += `Nonce: ${siweMessageData.nonce} `; siweMessage += `Issued At: ${siweMessageData.issued_at} `; if (siweMessageData.expiration_time) { siweMessage += `Expiration Time: ${siweMessageData.expiration_time} `; } if (siweMessageData.not_before) { siweMessage += `Not Before: ${siweMessageData.not_before} `; } if (siweMessageData.request_id) { siweMessage += `Request ID: ${siweMessageData.request_id} `; } return siweMessage; }; var verifySiweMessage = (payload, nonce, statement, requestId, userProvider) => { if (payload.version === 1) { return verifySiweMessageV1( payload, nonce, statement, requestId, userProvider ); } else { return verifySiweMessageV2( payload, nonce, statement, requestId, userProvider ); } }; var validateMessage = (siweMessageData, nonce, statement, requestId) => { if (siweMessageData.expiration_time) { const expirationTime = new Date(siweMessageData.expiration_time); if (expirationTime < /* @__PURE__ */ new Date()) { throw new Error("Expired message"); } } if (siweMessageData.not_before) { const notBefore = new Date(siweMessageData.not_before); if (notBefore > /* @__PURE__ */ new Date()) { throw new Error("Not Before time has not passed"); } } if (nonce && siweMessageData.nonce !== nonce) { throw new Error( `Nonce mismatch. Got: ${siweMessageData.nonce}, Expected: ${nonce}` ); } if (statement && siweMessageData.statement !== statement) { throw new Error( `Statement mismatch. Got: ${siweMessageData.statement}, Expected: ${statement}` ); } if (requestId && siweMessageData.request_id !== requestId) { throw new Error( `Request ID mismatch. Got: ${siweMessageData.request_id}, Expected: ${requestId}` ); } return true; }; var verifySiweMessageV1 = async (payload, nonce, statement, requestId, userProvider) => { if (typeof window !== "undefined") { throw new Error("Wallet auth payload can only be verified in the backend"); } const { message, signature, address } = payload; const siweMessageData = parseSiweMessage(message); validateMessage(siweMessageData, nonce, statement, requestId); let provider = userProvider || (0, import_viem.createPublicClient)({ chain: import_chains.worldchain, transport: (0, import_viem.http)() }); const signedMessage = `${ERC_191_PREFIX}${message.length}${message}`; const hashedMessage = (0, import_viem.hashMessage)(signedMessage); const contract = (0, import_viem.getContract)({ address, abi: SAFE_CONTRACT_ABI, client: provider }); try { const recoveredAddress = await (0, import_viem.recoverAddress)({ hash: hashedMessage, signature: `0x${signature}` }); const isOwner = await contract.read.isOwner([recoveredAddress]); if (!isOwner) { throw new Error("Signature verification failed, invalid owner"); } } catch (error) { th