@cartridge/controller 0.9.1 → 0.9.2

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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/account.ts","../../../node_modules/.pnpm/@cartridge+penpal@6.2.4/node_modules/@cartridge/penpal/lib/enums.js","../../../node_modules/.pnpm/@cartridge+penpal@6.2.4/node_modules/@cartridge/penpal/lib/createDestructor.js","../../../node_modules/.pnpm/@cartridge+penpal@6.2.4/node_modules/@cartridge/penpal/lib/createLogger.js","../../../node_modules/.pnpm/@cartridge+penpal@6.2.4/node_modules/@cartridge/penpal/lib/parent/getOriginFromSrc.js","../../../node_modules/.pnpm/@cartridge+penpal@6.2.4/node_modules/@cartridge/penpal/lib/errorSerialization.js","../../../node_modules/.pnpm/@cartridge+penpal@6.2.4/node_modules/@cartridge/penpal/lib/connectCallReceiver.js","../../../node_modules/.pnpm/@cartridge+penpal@6.2.4/node_modules/@cartridge/penpal/lib/generateId.js","../../../node_modules/.pnpm/@cartridge+penpal@6.2.4/node_modules/@cartridge/penpal/lib/methodSerialization.js","../../../node_modules/.pnpm/@cartridge+penpal@6.2.4/node_modules/@cartridge/penpal/lib/connectCallSender.js","../../../node_modules/.pnpm/@cartridge+penpal@6.2.4/node_modules/@cartridge/penpal/lib/parent/handleAckMessageFactory.js","../../../node_modules/.pnpm/@cartridge+penpal@6.2.4/node_modules/@cartridge/penpal/lib/parent/handleSynMessageFactory.js","../../../node_modules/.pnpm/@cartridge+penpal@6.2.4/node_modules/@cartridge/penpal/lib/parent/monitorIframeRemoval.js","../../../node_modules/.pnpm/@cartridge+penpal@6.2.4/node_modules/@cartridge/penpal/lib/startConnectionTimeout.js","../../../node_modules/.pnpm/@cartridge+penpal@6.2.4/node_modules/@cartridge/penpal/lib/parent/validateIframeHasSrcOrSrcDoc.js","../../../node_modules/.pnpm/@cartridge+penpal@6.2.4/node_modules/@cartridge/penpal/lib/parent/connectToChild.js","../src/iframe/base.ts","../../../node_modules/.pnpm/ethers@6.13.7_bufferutil@4.0.9_utf-8-validate@5.0.10/node_modules/ethers/lib.esm/_version.js","../../../node_modules/.pnpm/ethers@6.13.7_bufferutil@4.0.9_utf-8-validate@5.0.10/node_modules/ethers/lib.esm/utils/properties.js","../../../node_modules/.pnpm/ethers@6.13.7_bufferutil@4.0.9_utf-8-validate@5.0.10/node_modules/ethers/lib.esm/utils/errors.js","../../../node_modules/.pnpm/ethers@6.13.7_bufferutil@4.0.9_utf-8-validate@5.0.10/node_modules/ethers/lib.esm/utils/data.js","../../../node_modules/.pnpm/@noble+hashes@1.3.2/node_modules/@noble/hashes/esm/_assert.js","../../../node_modules/.pnpm/@noble+hashes@1.3.2/node_modules/@noble/hashes/esm/utils.js","../../../node_modules/.pnpm/@noble+hashes@1.3.2/node_modules/@noble/hashes/esm/_u64.js","../../../node_modules/.pnpm/@noble+hashes@1.3.2/node_modules/@noble/hashes/esm/sha3.js","../../../node_modules/.pnpm/ethers@6.13.7_bufferutil@4.0.9_utf-8-validate@5.0.10/node_modules/ethers/lib.esm/crypto/keccak.js","../../../node_modules/.pnpm/ethers@6.13.7_bufferutil@4.0.9_utf-8-validate@5.0.10/node_modules/ethers/lib.esm/address/address.js","../src/wallets/argent/index.ts","../../../node_modules/.pnpm/mipd@0.0.7_typescript@5.8.3/node_modules/mipd/dist/esm/utils.js","../../../node_modules/.pnpm/mipd@0.0.7_typescript@5.8.3/node_modules/mipd/dist/esm/store.js","../src/wallets/metamask/index.ts","../src/wallets/phantom/index.ts","../src/wallets/rabby/index.ts","../src/wallets/bridge.ts","../src/iframe/keychain.ts","../src/controller.ts","../src/lookup.ts","../../../node_modules/.pnpm/@cartridge+presets@https+++codeload.github.com+cartridge-gg+presets+tar.gz+d246ec1/node_modules/@cartridge/presets/dist/index.js"],"sourcesContent":["import {\n InvokeFunctionResponse,\n TypedData,\n WalletAccount,\n Call,\n AllowArray,\n} from \"starknet\";\n\nimport {\n ConnectError,\n Keychain,\n KeychainOptions,\n Modal,\n ResponseCodes,\n} from \"./types\";\nimport { AsyncMethodReturns } from \"@cartridge/penpal\";\nimport BaseProvider from \"./provider\";\nimport { toArray } from \"./utils\";\nimport { SIGNATURE } from \"@starknet-io/types-js\";\n\nclass ControllerAccount extends WalletAccount {\n private keychain: AsyncMethodReturns<Keychain>;\n private modal: Modal;\n private options?: KeychainOptions;\n\n constructor(\n provider: BaseProvider,\n rpcUrl: string,\n address: string,\n keychain: AsyncMethodReturns<Keychain>,\n options: KeychainOptions,\n modal: Modal,\n ) {\n super({ nodeUrl: rpcUrl }, provider, address);\n\n this.keychain = keychain;\n this.options = options;\n this.modal = modal;\n }\n\n /**\n * Invoke execute function in account contract\n *\n * @param calls the invocation object or an array of them, containing:\n * - contractAddress - the address of the contract\n * - entrypoint - the entrypoint of the contract\n * - calldata - (defaults to []) the calldata\n * - signature - (defaults to []) the signature\n * @param abis (optional) the abi of the contract for better displaying\n *\n * @returns response from addTransaction\n */\n async execute(calls: AllowArray<Call>): Promise<InvokeFunctionResponse> {\n calls = toArray(calls);\n\n return new Promise(async (resolve, reject) => {\n const sessionExecute = await this.keychain.execute(\n calls,\n undefined,\n undefined,\n false,\n this.options?.feeSource,\n );\n\n // Session call succeeded\n if (sessionExecute.code === ResponseCodes.SUCCESS) {\n resolve(sessionExecute as InvokeFunctionResponse);\n return;\n }\n\n // Propagates session txn error back to caller\n if (\n this.options?.propagateSessionErrors &&\n sessionExecute.code !== ResponseCodes.USER_INTERACTION_REQUIRED\n ) {\n reject((sessionExecute as ConnectError).error);\n return;\n }\n\n // Session call or Paymaster flow failed.\n // Session not avaialble, manual flow fallback\n this.modal.open();\n const manualExecute = await this.keychain.execute(\n calls,\n undefined,\n undefined,\n true,\n (sessionExecute as ConnectError).error,\n );\n\n // Manual call succeeded\n if (manualExecute.code === ResponseCodes.SUCCESS) {\n resolve(manualExecute as InvokeFunctionResponse);\n this.modal.close();\n return;\n }\n\n reject((manualExecute as ConnectError).error);\n return;\n });\n }\n\n /**\n * Sign an JSON object for off-chain usage with the starknet private key and return the signature\n * This adds a message prefix so it cant be interchanged with transactions\n *\n * @param json - JSON object to be signed\n * @returns the signature of the JSON object\n * @throws {Error} if the JSON object is not a valid JSON\n */\n async signMessage(typedData: TypedData): Promise<SIGNATURE> {\n return new Promise(async (resolve, reject) => {\n const sessionSign = await this.keychain.signMessage(typedData, \"\", true);\n\n // Session sign succeeded\n if (!(\"code\" in sessionSign)) {\n resolve(sessionSign as SIGNATURE);\n return;\n }\n\n // Session not avaialble, manual flow fallback\n this.modal.open();\n const manualSign = await this.keychain.signMessage(typedData, \"\", false);\n\n if (!(\"code\" in manualSign)) {\n resolve(manualSign as SIGNATURE);\n } else {\n reject((manualSign as ConnectError).error);\n }\n this.modal.close();\n });\n }\n}\n\nexport default ControllerAccount;\n","export var MessageType;\n(function (MessageType) {\n MessageType[\"Call\"] = \"call\";\n MessageType[\"Reply\"] = \"reply\";\n MessageType[\"Syn\"] = \"syn\";\n MessageType[\"SynAck\"] = \"synAck\";\n MessageType[\"Ack\"] = \"ack\";\n})(MessageType || (MessageType = {}));\nexport var Resolution;\n(function (Resolution) {\n Resolution[\"Fulfilled\"] = \"fulfilled\";\n Resolution[\"Rejected\"] = \"rejected\";\n})(Resolution || (Resolution = {}));\nexport var ErrorCode;\n(function (ErrorCode) {\n ErrorCode[\"ConnectionDestroyed\"] = \"ConnectionDestroyed\";\n ErrorCode[\"ConnectionTimeout\"] = \"ConnectionTimeout\";\n ErrorCode[\"NoIframeSrc\"] = \"NoIframeSrc\";\n})(ErrorCode || (ErrorCode = {}));\nexport var NativeErrorName;\n(function (NativeErrorName) {\n NativeErrorName[\"DataCloneError\"] = \"DataCloneError\";\n})(NativeErrorName || (NativeErrorName = {}));\nexport var NativeEventType;\n(function (NativeEventType) {\n NativeEventType[\"Message\"] = \"message\";\n})(NativeEventType || (NativeEventType = {}));\n","export default (localName, log) => {\n const callbacks = [];\n let destroyed = false;\n return {\n destroy(error) {\n if (!destroyed) {\n destroyed = true;\n log(`${localName}: Destroying connection`);\n callbacks.forEach((callback) => {\n callback(error);\n });\n }\n },\n onDestroy(callback) {\n destroyed ? callback() : callbacks.push(callback);\n },\n };\n};\n","export default (debug) => {\n /**\n * Logs a message if debug is enabled.\n */\n return (...args) => {\n if (debug) {\n console.log('[Penpal]', ...args); // eslint-disable-line no-console\n }\n };\n};\n","const DEFAULT_PORT_BY_PROTOCOL = {\n 'http:': '80',\n 'https:': '443',\n};\nconst URL_REGEX = /^(https?:)?\\/\\/([^/:]+)?(:(\\d+))?/;\nconst opaqueOriginSchemes = ['file:', 'data:'];\n/**\n * Converts a src value into an origin.\n */\nexport default (src) => {\n if (src && opaqueOriginSchemes.find((scheme) => src.startsWith(scheme))) {\n // The origin of the child document is an opaque origin and its\n // serialization is \"null\"\n // https://html.spec.whatwg.org/multipage/origin.html#origin\n return 'null';\n }\n // Note that if src is undefined, then srcdoc is being used instead of src\n // and we can follow this same logic below to get the origin of the parent,\n // which is the origin that we will need to use.\n const location = document.location;\n const regexResult = URL_REGEX.exec(src);\n let protocol;\n let hostname;\n let port;\n if (regexResult) {\n // It's an absolute URL. Use the parsed info.\n // regexResult[1] will be undefined if the URL starts with //\n protocol = regexResult[1] ? regexResult[1] : location.protocol;\n hostname = regexResult[2];\n port = regexResult[4];\n }\n else {\n // It's a relative path. Use the current location's info.\n protocol = location.protocol;\n hostname = location.hostname;\n port = location.port;\n }\n // If the port is the default for the protocol, we don't want to add it to the origin string\n // or it won't match the message's event.origin.\n const portSuffix = port && port !== DEFAULT_PORT_BY_PROTOCOL[protocol] ? `:${port}` : '';\n return `${protocol}//${hostname}${portSuffix}`;\n};\n","/**\n * Converts an error object into a plain object.\n */\nexport const serializeError = ({ name, message, stack, }) => ({\n name,\n message,\n stack,\n});\n/**\n * Converts a plain object into an error object.\n */\nexport const deserializeError = (obj) => {\n const deserializedError = new Error();\n // @ts-ignore\n Object.keys(obj).forEach((key) => (deserializedError[key] = obj[key]));\n return deserializedError;\n};\n","import { serializeError } from './errorSerialization';\nimport { MessageType, NativeEventType, NativeErrorName, Resolution, } from './enums';\n/**\n * Listens for \"call\" messages coming from the remote, executes the corresponding method, and\n * responds with the return value.\n */\nexport default (info, serializedMethods, log) => {\n const { localName, local, remote, originForSending, originForReceiving, } = info;\n let destroyed = false;\n const handleMessageEvent = (event) => {\n if (event.source !== remote || event.data.penpal !== MessageType.Call) {\n return;\n }\n if (originForReceiving !== '*' && event.origin !== originForReceiving) {\n log(`${localName} received message from origin ${event.origin} which did not match expected origin ${originForReceiving}`);\n return;\n }\n const callMessage = event.data;\n const { methodName, args, id } = callMessage;\n log(`${localName}: Received ${methodName}() call`);\n const createPromiseHandler = (resolution) => {\n return (returnValue) => {\n log(`${localName}: Sending ${methodName}() reply`);\n if (destroyed) {\n // It's possible to throw an error here, but it would need to be thrown asynchronously\n // and would only be catchable using window.onerror. This is because the consumer\n // is merely returning a value from their method and not calling any function\n // that they could wrap in a try-catch. Even if the consumer were to catch the error,\n // the value of doing so is questionable. Instead, we'll just log a message.\n log(`${localName}: Unable to send ${methodName}() reply due to destroyed connection`);\n return;\n }\n const message = {\n penpal: MessageType.Reply,\n id,\n resolution,\n returnValue,\n };\n if (resolution === Resolution.Rejected &&\n returnValue instanceof Error) {\n message.returnValue = serializeError(returnValue);\n message.returnValueIsError = true;\n }\n try {\n remote.postMessage(message, originForSending);\n }\n catch (err) {\n // If a consumer attempts to send an object that's not cloneable (e.g., window),\n // we want to ensure the receiver's promise gets rejected.\n if (err.name === NativeErrorName.DataCloneError) {\n const errorReplyMessage = {\n penpal: MessageType.Reply,\n id,\n resolution: Resolution.Rejected,\n returnValue: serializeError(err),\n returnValueIsError: true,\n };\n remote.postMessage(errorReplyMessage, originForSending);\n }\n throw err;\n }\n };\n };\n new Promise((resolve) => resolve(serializedMethods[methodName]\n .call(serializedMethods, event.origin)\n .apply(serializedMethods, args))).then(createPromiseHandler(Resolution.Fulfilled), createPromiseHandler(Resolution.Rejected));\n };\n local.addEventListener(NativeEventType.Message, handleMessageEvent);\n return () => {\n destroyed = true;\n local.removeEventListener(NativeEventType.Message, handleMessageEvent);\n };\n};\n","let id = 0;\n/**\n * @return {number} A unique ID (not universally unique)\n */\nexport default () => ++id;\n","const KEY_PATH_DELIMITER = '.';\nconst keyPathToSegments = (keyPath) => keyPath ? keyPath.split(KEY_PATH_DELIMITER) : [];\nconst segmentsToKeyPath = (segments) => segments.join(KEY_PATH_DELIMITER);\nconst createKeyPath = (key, prefix) => {\n const segments = keyPathToSegments(prefix || '');\n segments.push(key);\n return segmentsToKeyPath(segments);\n};\n/**\n * Given a `keyPath`, set it to be `value` on `subject`, creating any intermediate\n * objects along the way.\n *\n * @param {Object} subject The object on which to set value.\n * @param {string} keyPath The key path at which to set value.\n * @param {Object} value The value to store at the given key path.\n * @returns {Object} Updated subject.\n */\nexport const setAtKeyPath = (subject, keyPath, value) => {\n const segments = keyPathToSegments(keyPath);\n segments.reduce((prevSubject, key, idx) => {\n if (typeof prevSubject[key] === 'undefined') {\n prevSubject[key] = {};\n }\n if (idx === segments.length - 1) {\n prevSubject[key] = value;\n }\n return prevSubject[key];\n }, subject);\n return subject;\n};\n/**\n * Given a dictionary of (nested) keys to function, flatten them to a map\n * from key path to function.\n *\n * @param {Object} methods The (potentially nested) object to serialize.\n * @param {string} prefix A string with which to prefix entries. Typically not intended to be used by consumers.\n * @returns {Object} An map from key path in `methods` to functions.\n */\nexport const serializeMethods = (methods, prefix) => {\n const flattenedMethods = {};\n Object.keys(methods).forEach((key) => {\n const value = methods[key];\n const keyPath = createKeyPath(key, prefix);\n if (typeof value === 'object') {\n // Recurse into any nested children.\n Object.assign(flattenedMethods, serializeMethods(value, keyPath));\n }\n if (typeof value === 'function') {\n // If we've found a method, expose it.\n flattenedMethods[keyPath] = value;\n }\n });\n return flattenedMethods;\n};\n/**\n * Given a map of key paths to functions, unpack the key paths to an object.\n *\n * @param {Object} flattenedMethods A map of key paths to functions to unpack.\n * @returns {Object} A (potentially nested) map of functions.\n */\nexport const deserializeMethods = (flattenedMethods) => {\n const methods = {};\n for (const keyPath in flattenedMethods) {\n setAtKeyPath(methods, keyPath, flattenedMethods[keyPath]);\n }\n return methods;\n};\n","import generateId from './generateId';\nimport { deserializeError } from './errorSerialization';\nimport { deserializeMethods } from './methodSerialization';\nimport { ErrorCode, MessageType, NativeEventType, Resolution } from './enums';\n/**\n * Augments an object with methods that match those defined by the remote. When these methods are\n * called, a \"call\" message will be sent to the remote, the remote's corresponding method will be\n * executed, and the method's return value will be returned via a message.\n * @param {Object} callSender Sender object that should be augmented with methods.\n * @param {Object} info Information about the local and remote windows.\n * @param {Array} methodKeyPaths Key paths of methods available to be called on the remote.\n * @param {Promise} destructionPromise A promise resolved when destroy() is called on the penpal\n * connection.\n * @returns {Object} The call sender object with methods that may be called.\n */\nexport default (callSender, info, methodKeyPaths, destroyConnection, log) => {\n const { localName, local, remote, originForSending, originForReceiving, } = info;\n let destroyed = false;\n log(`${localName}: Connecting call sender`);\n const createMethodProxy = (methodName) => {\n return (...args) => {\n log(`${localName}: Sending ${methodName}() call`);\n // This handles the case where the iframe has been removed from the DOM\n // (and therefore its window closed), the consumer has not yet\n // called destroy(), and the user calls a method exposed by\n // the remote. We detect the iframe has been removed and force\n // a destroy() immediately so that the consumer sees the error saying\n // the connection has been destroyed. We wrap this check in a try catch\n // because Edge throws an \"Object expected\" error when accessing\n // contentWindow.closed on a contentWindow from an iframe that's been\n // removed from the DOM.\n let iframeRemoved;\n try {\n if (remote.closed) {\n iframeRemoved = true;\n }\n }\n catch (e) {\n iframeRemoved = true;\n }\n if (iframeRemoved) {\n destroyConnection();\n }\n if (destroyed) {\n const error = new Error(`Unable to send ${methodName}() call due ` + `to destroyed connection`);\n error.code = ErrorCode.ConnectionDestroyed;\n throw error;\n }\n return new Promise((resolve, reject) => {\n const id = generateId();\n const handleMessageEvent = (event) => {\n if (event.source !== remote ||\n event.data.penpal !== MessageType.Reply ||\n event.data.id !== id) {\n return;\n }\n if (originForReceiving !== '*' &&\n event.origin !== originForReceiving) {\n log(`${localName} received message from origin ${event.origin} which did not match expected origin ${originForReceiving}`);\n return;\n }\n const replyMessage = event.data;\n log(`${localName}: Received ${methodName}() reply`);\n local.removeEventListener(NativeEventType.Message, handleMessageEvent);\n let returnValue = replyMessage.returnValue;\n if (replyMessage.returnValueIsError) {\n returnValue = deserializeError(returnValue);\n }\n (replyMessage.resolution === Resolution.Fulfilled ? resolve : reject)(returnValue);\n };\n local.addEventListener(NativeEventType.Message, handleMessageEvent);\n const callMessage = {\n penpal: MessageType.Call,\n id,\n methodName,\n args,\n };\n remote.postMessage(callMessage, originForSending);\n });\n };\n };\n // Wrap each method in a proxy which sends it to the corresponding receiver.\n const flattenedMethods = methodKeyPaths.reduce((api, name) => {\n api[name] = createMethodProxy(name);\n return api;\n }, {});\n // Unpack the structure of the provided methods object onto the CallSender, exposing\n // the methods in the same shape they were provided.\n Object.assign(callSender, deserializeMethods(flattenedMethods));\n return () => {\n destroyed = true;\n };\n};\n","import connectCallReceiver from '../connectCallReceiver';\nimport connectCallSender from '../connectCallSender';\n/**\n * Handles an ACK handshake message.\n */\nexport default (serializedMethods, childOrigin, originForSending, destructor, log) => {\n const { destroy, onDestroy } = destructor;\n let destroyCallReceiver;\n let receiverMethodNames;\n // We resolve the promise with the call sender. If the child reconnects\n // (for example, after refreshing or navigating to another page that\n // uses Penpal, we'll update the call sender with methods that match the\n // latest provided by the child.\n const callSender = {};\n return (event) => {\n if (childOrigin !== '*' && event.origin !== childOrigin) {\n log(`Parent: Handshake - Received ACK message from origin ${event.origin} which did not match expected origin ${childOrigin}`);\n return;\n }\n log('Parent: Handshake - Received ACK');\n const info = {\n localName: 'Parent',\n local: window,\n remote: event.source,\n originForSending: originForSending,\n originForReceiving: childOrigin,\n };\n // If the child reconnected, we need to destroy the prior call receiver\n // before setting up a new one.\n if (destroyCallReceiver) {\n destroyCallReceiver();\n }\n destroyCallReceiver = connectCallReceiver(info, serializedMethods, log);\n onDestroy(destroyCallReceiver);\n // If the child reconnected, we need to remove the methods from the\n // previous call receiver off the sender.\n if (receiverMethodNames) {\n receiverMethodNames.forEach((receiverMethodName) => {\n delete callSender[receiverMethodName];\n });\n }\n receiverMethodNames = event.data.methodNames;\n const destroyCallSender = connectCallSender(callSender, info, receiverMethodNames, destroy, log);\n onDestroy(destroyCallSender);\n return callSender;\n };\n};\n","import { MessageType } from '../enums';\n/**\n * Handles a SYN handshake message.\n */\nexport default (log, serializedMethods, childOrigin, originForSending) => {\n return (event) => {\n // Under specific timing circumstances, we can receive an event\n // whose source is null. This seems to happen when the child iframe is\n // removed from the DOM about the same time it has sent the SYN event.\n // https://github.com/Aaronius/penpal/issues/85\n if (!event.source) {\n return;\n }\n if (childOrigin !== '*' && event.origin !== childOrigin) {\n log(`Parent: Handshake - Received SYN message from origin ${event.origin} which did not match expected origin ${childOrigin}`);\n return;\n }\n log('Parent: Handshake - Received SYN, responding with SYN-ACK');\n const synAckMessage = {\n penpal: MessageType.SynAck,\n methodNames: Object.keys(serializedMethods),\n };\n event.source.postMessage(synAckMessage, originForSending);\n };\n};\n","const CHECK_IFRAME_IN_DOC_INTERVAL = 60000;\n/**\n * Monitors for iframe removal and destroys connection if iframe\n * is found to have been removed from DOM. This is to prevent memory\n * leaks when the iframe is removed from the document and the consumer\n * hasn't called destroy(). Without this, event listeners attached to\n * the window would stick around and since the event handlers have a\n * reference to the iframe in their closures, the iframe would stick\n * around too.\n */\nexport default (iframe, destructor) => {\n const { destroy, onDestroy } = destructor;\n const checkIframeInDocIntervalId = setInterval(() => {\n if (!iframe.isConnected) {\n clearInterval(checkIframeInDocIntervalId);\n destroy();\n }\n }, CHECK_IFRAME_IN_DOC_INTERVAL);\n onDestroy(() => {\n clearInterval(checkIframeInDocIntervalId);\n });\n};\n","import { ErrorCode } from './enums';\n/**\n * Starts a timeout and calls the callback with an error\n * if the timeout completes before the stop function is called.\n */\nexport default (timeout, callback) => {\n let timeoutId;\n if (timeout !== undefined) {\n timeoutId = window.setTimeout(() => {\n const error = new Error(`Connection timed out after ${timeout}ms`);\n error.code = ErrorCode.ConnectionTimeout;\n callback(error);\n }, timeout);\n }\n return () => {\n clearTimeout(timeoutId);\n };\n};\n","import { ErrorCode } from '../enums';\nexport default (iframe) => {\n if (!iframe.src && !iframe.srcdoc) {\n const error = new Error('Iframe must have src or srcdoc property defined.');\n error.code = ErrorCode.NoIframeSrc;\n throw error;\n }\n};\n","import { MessageType, NativeEventType } from '../enums';\nimport createDestructor from '../createDestructor';\nimport createLogger from '../createLogger';\nimport getOriginFromSrc from './getOriginFromSrc';\nimport handleAckMessageFactory from './handleAckMessageFactory';\nimport handleSynMessageFactory from './handleSynMessageFactory';\nimport { serializeMethods } from '../methodSerialization';\nimport monitorIframeRemoval from './monitorIframeRemoval';\nimport startConnectionTimeout from '../startConnectionTimeout';\nimport validateIframeHasSrcOrSrcDoc from './validateIframeHasSrcOrSrcDoc';\n/**\n * Attempts to establish communication with an iframe.\n */\nexport default (options) => {\n let { iframe, methods = {}, childOrigin, timeout, debug = false } = options;\n const log = createLogger(debug);\n const destructor = createDestructor('Parent', log);\n const { onDestroy, destroy } = destructor;\n if (!childOrigin) {\n validateIframeHasSrcOrSrcDoc(iframe);\n childOrigin = getOriginFromSrc(iframe.src);\n }\n // If event.origin is \"null\", the remote protocol is file: or data: and we\n // must post messages with \"*\" as targetOrigin when sending messages.\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage#Using_window.postMessage_in_extensions\n const originForSending = childOrigin === 'null' ? '*' : childOrigin;\n const serializedMethods = serializeMethods(methods);\n const handleSynMessage = handleSynMessageFactory(log, serializedMethods, childOrigin, originForSending);\n const handleAckMessage = handleAckMessageFactory(serializedMethods, childOrigin, originForSending, destructor, log);\n const promise = new Promise((resolve, reject) => {\n const stopConnectionTimeout = startConnectionTimeout(timeout, destroy);\n const handleMessage = (event) => {\n if (event.source !== iframe.contentWindow || !event.data) {\n return;\n }\n if (event.data.penpal === MessageType.Syn) {\n handleSynMessage(event);\n return;\n }\n if (event.data.penpal === MessageType.Ack) {\n const callSender = handleAckMessage(event);\n if (callSender) {\n stopConnectionTimeout();\n resolve(callSender);\n }\n return;\n }\n };\n window.addEventListener(NativeEventType.Message, handleMessage);\n log('Parent: Awaiting handshake');\n monitorIframeRemoval(iframe, destructor);\n onDestroy((error) => {\n window.removeEventListener(NativeEventType.Message, handleMessage);\n if (error) {\n reject(error);\n }\n });\n });\n return {\n promise,\n destroy() {\n // Don't allow consumer to pass an error into destroy.\n destroy();\n },\n };\n};\n","import { AsyncMethodReturns, connectToChild } from \"@cartridge/penpal\";\nimport { ControllerOptions, Modal } from \"../types\";\n\nexport type IFrameOptions<CallSender> = Omit<\n ConstructorParameters<typeof IFrame>[0],\n \"id\" | \"url\" | \"onConnect\"\n> & {\n url?: string;\n onConnect: (child: AsyncMethodReturns<CallSender>) => void;\n};\n\nexport class IFrame<CallSender extends {}> implements Modal {\n url?: URL;\n private iframe?: HTMLIFrameElement;\n private container?: HTMLDivElement;\n private onClose?: () => void;\n private child?: AsyncMethodReturns<CallSender>;\n\n constructor({\n id,\n url,\n preset,\n onClose,\n onConnect,\n methods = {},\n }: Pick<ControllerOptions, \"preset\"> & {\n id: string;\n url: URL;\n onClose?: () => void;\n onConnect: (child: AsyncMethodReturns<CallSender>) => void;\n methods?: { [key: string]: (...args: any[]) => void };\n }) {\n if (typeof document === \"undefined\" || typeof window === \"undefined\") {\n return;\n }\n\n if (preset) {\n url.searchParams.set(\"preset\", preset);\n }\n\n this.url = url;\n\n const iframe = document.createElement(\"iframe\");\n iframe.src = url.toString();\n iframe.id = id;\n iframe.style.border = \"none\";\n iframe.sandbox.add(\"allow-forms\");\n iframe.sandbox.add(\"allow-popups\");\n iframe.sandbox.add(\"allow-popups-to-escape-sandbox\");\n iframe.sandbox.add(\"allow-scripts\");\n iframe.sandbox.add(\"allow-same-origin\");\n iframe.allow =\n \"publickey-credentials-create *; publickey-credentials-get *; clipboard-write\";\n if (!!document.hasStorageAccess) {\n iframe.sandbox.add(\"allow-storage-access-by-user-activation\");\n }\n\n const container = document.createElement(\"div\");\n container.id = \"controller\";\n container.style.position = \"fixed\";\n container.style.height = \"100%\";\n container.style.width = \"100%\";\n container.style.top = \"0\";\n container.style.left = \"0\";\n container.style.zIndex = \"10000\";\n container.style.backgroundColor = \"rgba(0,0,0,0.6)\";\n container.style.display = \"flex\";\n container.style.alignItems = \"center\";\n container.style.justifyContent = \"center\";\n container.style.visibility = \"hidden\";\n container.style.opacity = \"0\";\n container.style.transition = \"opacity 0.2s ease\";\n container.style.pointerEvents = \"auto\";\n container.appendChild(iframe);\n\n // Add click event listener to close iframe when clicking outside\n container.addEventListener(\"click\", (e) => {\n if (e.target === container) {\n // Attempting to reset(clear context) for keychain iframe (identified by ID)\n if (id === \"controller-keychain\" && this.child) {\n // Type assertion for keychain child only\n (this.child as any)\n .reset?.()\n .catch((e: any) => console.error(\"Error resetting context:\", e));\n }\n this.close();\n }\n });\n\n this.iframe = iframe;\n this.container = container;\n\n connectToChild<CallSender>({\n iframe: this.iframe,\n methods: {\n close: (_origin: string) => () => this.close(),\n reload: (_origin: string) => () => window.location.reload(),\n ...methods,\n },\n }).promise.then((child) => {\n this.child = child;\n onConnect(child);\n });\n\n this.resize();\n window.addEventListener(\"resize\", () => this.resize());\n\n const observer = new MutationObserver(() => {\n if (typeof document === \"undefined\") return;\n const existingController = document.getElementById(\"controller\");\n if (document.body) {\n if (id === \"controller-keychain\" && !existingController) {\n document.body.appendChild(container);\n observer.disconnect();\n }\n }\n });\n\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n });\n\n const existingController = document.getElementById(\"controller\");\n if (document.body) {\n if (id === \"controller-keychain\" && !existingController) {\n document.body.appendChild(container);\n }\n }\n\n this.onClose = onClose;\n }\n\n open() {\n if (!this.container || typeof document === \"undefined\" || !document.body)\n return;\n document.body.style.overflow = \"hidden\";\n\n this.container.style.visibility = \"visible\";\n this.container.style.opacity = \"1\";\n }\n\n close() {\n if (!this.container || typeof document === \"undefined\" || !document.body)\n return;\n this.onClose?.();\n\n document.body.style.overflow = \"auto\";\n\n this.container.style.visibility = \"hidden\";\n this.container.style.opacity = \"0\";\n }\n\n sendBackward() {\n if (!this.container) return;\n this.container.style.zIndex = \"9999\";\n }\n\n sendForward() {\n if (!this.container) return;\n this.container.style.zIndex = \"10000\";\n }\n\n private resize() {\n if (!this.iframe || typeof window === \"undefined\") return;\n\n this.iframe.style.userSelect = \"none\";\n\n if (window.innerWidth < 768) {\n this.iframe.style.height = \"100%\";\n this.iframe.style.width = \"100%\";\n this.iframe.style.borderRadius = \"0\";\n return;\n }\n\n this.iframe.style.height = \"600px\";\n this.iframe.style.width = \"432px\";\n this.iframe.style.borderRadius = \"8px\";\n }\n\n isOpen() {\n return this.iframe?.style.display !== \"none\";\n }\n}\n","/* Do NOT modify this file; see /src.ts/_admin/update-version.ts */\n/**\n * The current version of Ethers.\n */\nexport const version = \"6.13.7\";\n//# sourceMappingURL=_version.js.map","/**\n * Property helper functions.\n *\n * @_subsection api/utils:Properties [about-properties]\n */\nfunction checkType(value, type, name) {\n const types = type.split(\"|\").map(t => t.trim());\n for (let i = 0; i < types.length; i++) {\n switch (type) {\n case \"any\":\n return;\n case \"bigint\":\n case \"boolean\":\n case \"number\":\n case \"string\":\n if (typeof (value) === type) {\n return;\n }\n }\n }\n const error = new Error(`invalid value for type ${type}`);\n error.code = \"INVALID_ARGUMENT\";\n error.argument = `value.${name}`;\n error.value = value;\n throw error;\n}\n/**\n * Resolves to a new object that is a copy of %%value%%, but with all\n * values resolved.\n */\nexport async function resolveProperties(value) {\n const keys = Object.keys(value);\n const results = await Promise.all(keys.map((k) => Promise.resolve(value[k])));\n return results.reduce((accum, v, index) => {\n accum[keys[index]] = v;\n return accum;\n }, {});\n}\n/**\n * Assigns the %%values%% to %%target%% as read-only values.\n *\n * It %%types%% is specified, the values are checked.\n */\nexport function defineProperties(target, values, types) {\n for (let key in values) {\n let value = values[key];\n const type = (types ? types[key] : null);\n if (type) {\n checkType(value, type, key);\n }\n Object.defineProperty(target, key, { enumerable: true, value, writable: false });\n }\n}\n//# sourceMappingURL=properties.js.map","/**\n * All errors in ethers include properties to ensure they are both\n * human-readable (i.e. ``.message``) and machine-readable (i.e. ``.code``).\n *\n * The [[isError]] function can be used to check the error ``code`` and\n * provide a type guard for the properties present on that error interface.\n *\n * @_section: api/utils/errors:Errors [about-errors]\n */\nimport { version } from \"../_version.js\";\nimport { defineProperties } from \"./properties.js\";\nfunction stringify(value) {\n if (value == null) {\n return \"null\";\n }\n if (Array.isArray(value)) {\n return \"[ \" + (value.map(stringify)).join(\", \") + \" ]\";\n }\n if (value instanceof Uint8Array) {\n const HEX = \"0123456789abcdef\";\n let result = \"0x\";\n for (let i = 0; i < value.length; i++) {\n result += HEX[value[i] >> 4];\n result += HEX[value[i] & 0xf];\n }\n return result;\n }\n if (typeof (value) === \"object\" && typeof (value.toJSON) === \"function\") {\n return stringify(value.toJSON());\n }\n switch (typeof (value)) {\n case \"boolean\":\n case \"symbol\":\n return value.toString();\n case \"bigint\":\n return BigInt(value).toString();\n case \"number\":\n return (value).toString();\n case \"string\":\n return JSON.stringify(value);\n case \"object\": {\n const keys = Object.keys(value);\n keys.sort();\n return \"{ \" + keys.map((k) => `${stringify(k)}: ${stringify(value[k])}`).join(\", \") + \" }\";\n }\n }\n return `[ COULD NOT SERIALIZE ]`;\n}\n/**\n * Returns true if the %%error%% matches an error thrown by ethers\n * that matches the error %%code%%.\n *\n * In TypeScript environments, this can be used to check that %%error%%\n * matches an EthersError type, which means the expected properties will\n * be set.\n *\n * @See [ErrorCodes](api:ErrorCode)\n * @example\n * try {\n * // code....\n * } catch (e) {\n * if (isError(e, \"CALL_EXCEPTION\")) {\n * // The Type Guard has validated this object\n * console.log(e.data);\n * }\n * }\n */\nexport function isError(error, code) {\n return (error && error.code === code);\n}\n/**\n * Returns true if %%error%% is a [[CallExceptionError].\n */\nexport function isCallException(error) {\n return isError(error, \"CALL_EXCEPTION\");\n}\n/**\n * Returns a new Error configured to the format ethers emits errors, with\n * the %%message%%, [[api:ErrorCode]] %%code%% and additional properties\n * for the corresponding EthersError.\n *\n * Each error in ethers includes the version of ethers, a\n * machine-readable [[ErrorCode]], and depending on %%code%%, additional\n * required properties. The error message will also include the %%message%%,\n * ethers version, %%code%% and all additional properties, serialized.\n */\nexport function makeError(message, code, info) {\n let shortMessage = message;\n {\n const details = [];\n if (info) {\n if (\"message\" in info || \"code\" in info || \"name\" in info) {\n throw new Error(`value will overwrite populated values: ${stringify(info)}`);\n }\n for (const key in info) {\n if (key === \"shortMessage\") {\n continue;\n }\n const value = (info[key]);\n // try {\n details.push(key + \"=\" + stringify(value));\n // } catch (error: any) {\n // console.log(\"MMM\", error.message);\n // details.push(key + \"=[could not serialize object]\");\n // }\n }\n }\n details.push(`code=${code}`);\n details.push(`version=${version}`);\n if (details.length) {\n message += \" (\" + details.join(\", \") + \")\";\n }\n }\n let error;\n switch (code) {\n case \"INVALID_ARGUMENT\":\n error = new TypeError(message);\n break;\n case \"NUMERIC_FAULT\":\n case \"BUFFER_OVERRUN\":\n error = new RangeError(message);\n break;\n default:\n error = new Error(message);\n }\n defineProperties(error, { code });\n if (info) {\n Object.assign(error, info);\n }\n if (error.shortMessage == null) {\n defineProperties(error, { shortMessage });\n }\n return error;\n}\n/**\n * Throws an EthersError with %%message%%, %%code%% and additional error\n * %%info%% when %%check%% is falsish..\n *\n * @see [[api:makeError]]\n */\nexport function assert(check, message, code, info) {\n if (!check) {\n throw makeError(message, code, info);\n }\n}\n/**\n * A simple helper to simply ensuring provided arguments match expected\n * constraints, throwing if not.\n *\n * In TypeScript environments, the %%check%% has been asserted true, so\n * any further code does not need additional compile-time checks.\n */\nexport function assertArgument(check, message, name, value) {\n assert(check, message, \"INVALID_ARGUMENT\", { argument: name, value: value });\n}\nexport function assertArgumentCount(count, expectedCount, message) {\n if (message == null) {\n message = \"\";\n }\n if (message) {\n message = \": \" + message;\n }\n assert(count >= expectedCount, \"missing argument\" + message, \"MISSING_ARGUMENT\", {\n count: count,\n expectedCount: expectedCount\n });\n assert(count <= expectedCount, \"too many arguments\" + message, \"UNEXPECTED_ARGUMENT\", {\n count: count,\n expectedCount: expectedCount\n });\n}\nconst _normalizeForms = [\"NFD\", \"NFC\", \"NFKD\", \"NFKC\"].reduce((accum, form) => {\n try {\n // General test for normalize\n /* c8 ignore start */\n if (\"test\".normalize(form) !== \"test\") {\n throw new Error(\"bad\");\n }\n ;\n /* c8 ignore stop */\n if (form === \"NFD\") {\n const check = String.fromCharCode(0xe9).normalize(\"NFD\");\n const expected = String.fromCharCode(0x65, 0x0301);\n /* c8 ignore start */\n if (check !== expected) {\n throw new Error(\"broken\");\n }\n /* c8 ignore stop */\n }\n accum.push(form);\n }\n catch (error) { }\n return accum;\n}, []);\n/**\n * Throws if the normalization %%form%% is not supported.\n */\nexport function assertNormalize(form) {\n assert(_normalizeForms.indexOf(form) >= 0, \"platform missing String.prototype.normalize\", \"UNSUPPORTED_OPERATION\", {\n operation: \"String.prototype.normalize\", info: { form }\n });\n}\n/**\n * Many classes use file-scoped values to guard the constructor,\n * making it effectively private. This facilitates that pattern\n * by ensuring the %%givenGaurd%% matches the file-scoped %%guard%%,\n * throwing if not, indicating the %%className%% if provided.\n */\nexport function assertPrivate(givenGuard, guard, className) {\n if (className == null) {\n className = \"\";\n }\n if (givenGuard !== guard) {\n let method = className, operation = \"new\";\n if (className) {\n method += \".\";\n operation += \" \" + className;\n }\n assert(false, `private constructor; use ${method}from* methods`, \"UNSUPPORTED_OPERATION\", {\n operation\n });\n }\n}\n//# sourceMappingURL=errors.js.map","/**\n * Some data helpers.\n *\n *\n * @_subsection api/utils:Data Helpers [about-data]\n */\nimport { assert, assertArgument } from \"./errors.js\";\nfunction _getBytes(value, name, copy) {\n if (value instanceof Uint8Array) {\n if (copy) {\n return new Uint8Array(value);\n }\n return value;\n }\n if (typeof (value) === \"string\" && value.match(/^0x(?:[0-9a-f][0-9a-f])*$/i)) {\n const result = new Uint8Array((value.length - 2) / 2);\n let offset = 2;\n for (let i = 0; i < result.length; i++) {\n result[i] = parseInt(value.substring(offset, offset + 2), 16);\n offset += 2;\n }\n return result;\n }\n assertArgument(false, \"invalid BytesLike value\", name || \"value\", value);\n}\n/**\n * Get a typed Uint8Array for %%value%%. If already a Uint8Array\n * the original %%value%% is returned; if a copy is required use\n * [[getBytesCopy]].\n *\n * @see: getBytesCopy\n */\nexport function getBytes(value, name) {\n return _getBytes(value, name, false);\n}\n/**\n * Get a typed Uint8Array for %%value%%, creating a copy if necessary\n * to prevent any modifications of the returned value from being\n * reflected elsewhere.\n *\n * @see: getBytes\n */\nexport function getBytesCopy(value, name) {\n return _getBytes(value, name, true);\n}\n/**\n * Returns true if %%value%% is a valid [[HexString]].\n *\n * If %%length%% is ``true`` or a //number//, it also checks that\n * %%value%% is a valid [[DataHexString]] of %%length%% (if a //number//)\n * bytes of data (e.g. ``0x1234`` is 2 bytes).\n */\nexport function isHexString(value, length) {\n if (typeof (value) !== \"string\" || !value.match(/^0x[0-9A-Fa-f]*$/)) {\n return false;\n }\n if (typeof (length) === \"number\" && value.length !== 2 + 2 * length) {\n return false;\n }\n if (length === true && (value.length % 2) !== 0) {\n return false;\n }\n return true;\n}\n/**\n * Returns true if %%value%% is a valid representation of arbitrary\n * data (i.e. a valid [[DataHexString]] or a Uint8Array).\n */\nexport function isBytesLike(value) {\n return (isHexString(value, true) || (value instanceof Uint8Array));\n}\nconst HexCharacters = \"0123456789abcdef\";\n/**\n * Returns a [[DataHexString]] representation of %%data%%.\n */\nexport function hexlify(data) {\n const bytes = getBytes(data);\n let result = \"0x\";\n for (let i = 0; i < bytes.length; i++) {\n const v = bytes[i];\n result += HexCharacters[(v & 0xf0) >> 4] + HexCharacters[v & 0x0f];\n }\n return result;\n}\n/**\n * Returns a [[DataHexString]] by concatenating all values\n * within %%data%%.\n */\nexport function concat(datas) {\n return \"0x\" + datas.map((d) => hexlify(d).substring(2)).join(\"\");\n}\n/**\n * Returns the length of %%data%%, in bytes.\n */\nexport function dataLength(data) {\n if (isHexString(data, true)) {\n return (data.length - 2) / 2;\n }\n return getBytes(data).length;\n}\n/**\n * Returns a [[DataHexString]] by slicing %%data%% from the %%start%%\n * offset to the %%end%% offset.\n *\n * By default %%start%% is 0 and %%end%% is the length of %%data%%.\n */\nexport function dataSlice(data, start, end) {\n const bytes = getBytes(data);\n if (end != null && end > bytes.length) {\n assert(false, \"cannot slice beyond data bounds\", \"BUFFER_OVERRUN\", {\n buffer: bytes, length: bytes.length, offset: end\n });\n }\n return hexlify(bytes.slice((start == null) ? 0 : start, (end == null) ? bytes.length : end));\n}\n/**\n * Return the [[DataHexString]] result by stripping all **leading**\n ** zero bytes from %%data%%.\n */\nexport function stripZerosLeft(data) {\n let bytes = hexlify(data).substring(2);\n while (bytes.startsWith(\"00\")) {\n bytes = bytes.substring(2);\n }\n return \"0x\" + bytes;\n}\nfunction zeroPad(data, length, left) {\n const bytes = getBytes(data);\n assert(length >= bytes.length, \"padding exceeds data length\", \"BUFFER_OVERRUN\", {\n buffer: new Uint8Array(bytes),\n length: length,\n offset: length + 1\n });\n const result = new Uint8Array(length);\n result.fill(0);\n if (left) {\n result.set(bytes, length - bytes.length);\n }\n else {\n result.set(bytes, 0);\n }\n return hexlify(result);\n}\n/**\n * Return the [[DataHexString]] of %%data%% padded on the **left**\n * to %%length%% bytes.\n *\n * If %%data%% already exceeds %%length%%, a [[BufferOverrunError]] is\n * thrown.\n *\n * This pads data the same as **values** are in Solidity\n * (e.g. ``uint128``).\n */\nexport function zeroPadValue(data, length) {\n return zeroPad(data, length, true);\n}\n/**\n * Return the [[DataHexString]] of %%data%% padded on the **right**\n * to %%length%% bytes.\n *\n * If %%data%% already exceeds %%length%%, a [[BufferOverrunError]] is\n * thrown.\n *\n * This pads data the same as **bytes** are in Solidity\n * (e.g. ``bytes16``).\n */\nexport function zeroPadBytes(data, length) {\n return zeroPad(data, length, false);\n}\n//# sourceMappingURL=data.js.map","function number(n) {\n if (!Number.isSafeInteger(n) || n < 0)\n throw new Error(`Wrong positive integer: ${n}`);\n}\nfunction bool(b) {\n if (typeof b !== 'boolean')\n throw new Error(`Expected boolean, not ${b}`);\n}\nfunction bytes(b, ...lengths) {\n if (!(b instanceof Uint8Array))\n throw new Error('Expected Uint8Array');\n if (lengths.length > 0 && !lengths.includes(b.length))\n throw new Error(`Expected Uint8Array of length ${lengths}, not of length=${b.length}`);\n}\nfunction hash(hash) {\n if (typeof hash !== 'function' || typeof hash.create !== 'function')\n throw new Error('Hash should be wrapped by utils.wrapConstructor');\n number(hash.outputLen);\n number(hash.blockLen);\n}\nfunction exists(instance, checkFinished = true) {\n if (instance.destroyed)\n throw new Error('Hash instance has been destroyed');\n if (checkFinished && instance.finished)\n throw new Error('Hash#digest() has already been called');\n}\nfunction output(out, instance) {\n bytes(out);\n const min = instance.outputLen;\n if (out.length < min) {\n throw new Error(`digestInto() expects output buffer of length at least ${min}`);\n }\n}\nexport { number, bool, bytes, hash, exists, output };\nconst assert = { number, bool, bytes, hash, exists, output };\nexport default assert;\n//# sourceMappingURL=_assert.js.map","/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n// We use WebCrypto aka globalThis.crypto, which exists in browsers and node.js 16+.\n// node.js versions earlier than v19 don't declare it in global scope.\n// For node.js, package.json#exports field mapping rewrites import\n// from `crypto` to `cryptoNode`, which imports native module.\n// Makes the utils un-importable in browsers without a bundler.\n// Once node.js 18 is deprecated, we can just drop the import.\nimport { crypto } from '@noble/hashes/crypto';\nconst u8a = (a) => a instanceof Uint8Array;\n// Cast array to different type\nexport const u8 = (arr) => new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength);\nexport const u32 = (arr) => new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));\n// Cast array to view\nexport const createView = (arr) => new DataView(arr.buffer, arr.byteOffset, arr.byteLength);\n// The rotate right (circular right shift) operation for uint32\nexport const rotr = (word, shift) => (word << (32 - shift)) | (word >>> shift);\n// big-endian hardware is rare. Just in case someone still decides to run hashes:\n// early-throw an error because we don't support BE yet.\nexport const isLE = new Uint8Array(new Uint32Array([0x11223344]).buffer)[0] === 0x44;\nif (!isLE)\n throw new Error('Non little-endian hardware is not supported');\nconst hexes = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, '0'));\n/**\n * @example bytesToHex(Uint8Array.from([0xca, 0xfe, 0x01, 0x23])) // 'cafe0123'\n */\nexport function bytesToHex(bytes) {\n if (!u8a(bytes))\n throw new Error('Uint8Array expected');\n // pre-caching improves the speed 6x\n let hex = '';\n for (let i = 0; i < bytes.length; i++) {\n hex += hexes[bytes[i]];\n }\n return hex;\n}\n/**\n * @example hexToBytes('cafe0123') // Uint8Array.from([0xca, 0xfe, 0x01, 0x23])\n */\nexport function hexToBytes(hex) {\n if (typeof hex !== 'string')\n throw new Error('hex string expected, got ' + typeof hex);\n const len = hex.length;\n if (len % 2)\n throw new Error('padded hex string expected, got unpadded hex of length ' + len);\n const array = new Uint8Array(len / 2);\n for (let i = 0; i < array.length; i++) {\n const j = i * 2;\n const hexByte = hex.slice(j, j + 2);\n const byte = Number.parseInt(hexByte, 16);\n if (Number.isNaN(byte) || byte < 0)\n throw new Error('Invalid byte sequence');\n array[i] = byte;\n }\n return array;\n}\n// There is no setImmediate in browser and setTimeout is slow.\n// call of async fn will return Promise, which will be fullfiled only on\n// next scheduler queue processing step and this is exactly what we need.\nexport const nextTick = async () => { };\n// Returns control to thread each 'tick' ms to avoid blocking\nexport async function asyncLoop(iters, tick, cb) {\n let ts = Date.now();\n for (let i = 0; i < iters; i++) {\n cb(i);\n // Date.now() is not monotonic, so in case if clock goes backwards we return return control too\n const diff = Date.now() - ts;\n if (diff >= 0 && diff < tick)\n continue;\n await nextTick();\n ts += diff;\n }\n}\n/**\n * @example utf8ToBytes('abc') // new Uint8Array([97, 98, 99])\n */\nexport function utf8ToBytes(str) {\n if (typeof str !== 'string')\n throw new Error(`utf8ToBytes expected string, got ${typeof str}`);\n return new Uint8Array(new TextEncoder().encode(str)); // https://bugzil.la/1681809\n}\n/**\n * Normalizes (non-hex) string or Uint8Array to Uint8Array.\n * Warning: when Uint8Array is passed, it would NOT get copied.\n * Keep in mind for future mutable operations.\n */\nexport function toBytes(data) {\n if (typeof data === 'string')\n data = utf8ToBytes(data);\n if (!u8a(data))\n throw new Error(`expected Uint8Array, got ${typeof data}`);\n return data;\n}\n/**\n * Copies several Uint8Arrays into one.\n */\nexport function concatBytes(...arrays) {\n const r = new Uint8Array(arrays.reduce((sum, a) => sum + a.length, 0));\n let pad = 0; // walk through each item, ensure they have proper type\n arrays.forEach((a) => {\n if (!u8a(a))\n throw new Error('Uint8Array expected');\n r.set(a, pad);\n pad += a.length;\n });\n return r;\n}\n// For runtime check if class implements interface\nexport class Hash {\n // Safe version that clones internal state\n clone() {\n return this._cloneInto();\n }\n}\nconst toStr = {}.toString;\nexport function checkOpts(defaults, opts) {\n if (opts !== undefined && toStr.call(opts) !== '[object Object]')\n throw new Error('Options should be object or undefined');\n const merged = Object.assign(defaults, opts);\n return merged;\n}\nexport function wrapConstructor(hashCons) {\n const hashC = (msg) => hashCons().update(toBytes(msg)).digest();\n const tmp = hashCons();\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = () => hashCons();\n return hashC;\n}\nexport function wrapConstructorWithOpts(hashCons) {\n const hashC = (msg, opts) => hashCons(opts).update(toBytes(msg)).digest();\n const tmp = hashCons({});\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts) => hashCons(opts);\n return hashC;\n}\nexport function wrapXOFConstructorWithOpts(hashCons) {\n const hashC = (msg, opts) => hashCons(opts).update(toBytes(msg)).digest();\n const tmp = hashCons({});\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts) => hashCons(opts);\n return hashC;\n}\n/**\n * Secure PRNG. Uses `crypto.getRandomValues`, which defers to OS.\n */\nexport function randomBytes(bytesLength = 32) {\n if (crypto && typeof crypto.getRandomValues === 'function') {\n return crypto.getRandomValues(new Uint8Array(bytesLength));\n }\n throw new Error('crypto.getRandomValues must be defined');\n}\n//# sourceMappingURL=utils.js.map","const U32_MASK64 = /* @__PURE__ */ BigInt(2 ** 32 - 1);\nconst _32n = /* @__PURE__ */ BigInt(32);\n// We are not using BigUint64Array, because they are extremely slow as per 2022\nfunction fromBig(n, le = false) {\n if (le)\n return { h: Number(n & U32_MASK64), l: Number((n >> _32n) & U32_MASK64) };\n return { h: Number((n >> _32n) & U32_MASK64) | 0, l: Number(n & U32_MASK64) | 0 };\n}\nfunction split(lst, le = false) {\n let Ah = new Uint32Array(lst.length);\n let Al = new Uint32Array(lst.length);\n for (let i = 0; i < lst.length; i++) {\n const { h, l } = fromBig(lst[i], le);\n [Ah[i], Al[i]] = [h, l];\n }\n return [Ah, Al];\n}\nconst toBig = (h, l) => (BigInt(h >>> 0) << _32n) | BigInt(l >>> 0);\n// for Shift in [0, 32)\nconst shrSH = (h, _l, s) => h >>> s;\nconst shrSL = (h, l, s) => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in [1, 32)\nconst rotrSH = (h, l, s) => (h >>> s) | (l << (32 - s));\nconst rotrSL = (h, l, s) => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotrBH = (h, l, s) => (h << (64 - s)) | (l >>> (s - 32));\nconst rotrBL = (h, l, s) => (h >>> (s - 32)) | (l << (64 - s));\n// Right rotate for shift===32 (just swaps l&h)\nconst rotr32H = (_h, l) => l;\nconst rotr32L = (h, _l) => h;\n// Left rotate for Shift in [1, 32)\nconst rotlSH = (h, l, s) => (h << s) | (l >>> (32 - s));\nconst rotlSL = (h, l, s) => (l << s) | (h >>> (32 - s));\n// Left rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotlBH = (h, l, s) => (l << (s - 32)) | (h >>> (64 - s));\nconst rotlBL = (h, l, s) => (h << (s - 32)) | (l >>> (64 - s));\n// JS uses 32-bit signed integers for bitwise operations which means we cannot\n// simple take carry out of low bit sum by shift, we need to use division.\nfunction add(Ah, Al, Bh, Bl) {\n const l = (Al >>> 0) + (Bl >>> 0);\n return { h: (Ah + Bh + ((l / 2 ** 32) | 0)) | 0, l: l | 0 };\n}\n// Addition with more than 2 elements\nconst add3L = (Al, Bl, Cl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0);\nconst add3H = (low, Ah, Bh, Ch) => (Ah + Bh + Ch + ((low / 2 ** 32) | 0)) | 0;\nconst add4L = (Al, Bl, Cl, Dl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0);\nconst add4H = (low, Ah, Bh, Ch, Dh) => (Ah + Bh + Ch + Dh + ((low / 2 ** 32) | 0)) | 0;\nconst add5L = (Al, Bl, Cl, Dl, El) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0) + (El >>> 0);\nconst add5H = (low, Ah, Bh, Ch, Dh, Eh) => (Ah + Bh + Ch + Dh + Eh + ((low / 2 ** 32) | 0)) | 0;\n// prettier-ignore\nexport { fromBig, split, toBig, shrSH, shrSL, rotrSH, rotrSL, rotrBH, rotrBL, rotr32H, rotr32L, rotlSH, rotlSL, rotlBH, rotlBL, add, add3L, add3H, add4L, add4H, add5H, add5L, };\n// prettier-ignore\nconst u64 = {\n fromBig, split, toBig,\n shrSH, shrSL,\n rotrSH, rotrSL, rotrBH, rotrBL,\n rotr32H, rotr32L,\n rotlSH, rotlSL, rotlBH, rotlBL,\n add, add3L, add3H, add4L, add4H, add5H, add5L,\n};\nexport default u64;\n//# sourceMappingURL=_u64.js.map","import { bytes, exists, number, output } from './_assert.js';\nimport { rotlBH, rotlBL, rotlSH, rotlSL, split } from './_u64.js';\nimport { Hash, u32, toBytes, wrapConstructor, wrapXOFConstructorWithOpts, } from './utils.js';\n// SHA3 (keccak) is based on a new design: basically, the internal state is bigger than output size.\n// It's called a sponge function.\n// Various per round constants calculations\nconst [SHA3_PI, SHA3_ROTL, _SHA3_IOTA] = [[], [], []];\nconst _0n = /* @__PURE__ */ BigInt(0);\nconst _1n = /* @__PURE__ */ BigInt(1);\nconst _2n = /* @__PURE__ */ BigInt(2);\nconst _7n = /* @__PURE__ */ BigInt(7);\nconst _256n = /* @__PURE__ */ BigInt(256);\nconst _0x71n = /* @__PURE__ */ BigInt(0x71);\nfor (let round = 0, R = _1n, x = 1, y = 0; round < 24; round++) {\n // Pi\n [x, y] = [y, (2 * x + 3 * y) % 5];\n SHA3_PI.push(2 * (5 * y + x));\n // Rotational\n SHA3_ROTL.push((((round + 1) * (round + 2)) / 2) % 64);\n // Iota\n let t = _0n;\n for (let j = 0; j < 7; j++) {\n R = ((R << _1n) ^ ((R >> _7n) * _0x71n)) % _256n;\n if (R & _2n)\n t ^= _1n << ((_1n << /* @__PURE__ */ BigInt(j)) - _1n);\n }\n _SHA3_IOTA.push(t);\n}\nconst [SHA3_IOTA_H, SHA3_IOTA_L] = /* @__PURE__ */ split(_SHA3_IOTA, true);\n// Left rotation (without 0, 32, 64)\nconst rotlH = (h, l, s) => (s > 32 ? rotlBH(h, l, s) : rotlSH(h, l, s));\nconst rotlL = (h, l, s) => (s > 32 ? rotlBL(h, l, s) : rotlSL(h, l, s));\n// Same as keccakf1600, but allows to skip some rounds\nexport function keccakP(s, rounds = 24) {\n const B = new Uint32Array(5 * 2);\n // NOTE: all indices are x2 since we store state as u32 instead of u64 (bigints to slow in js)\n for (let round = 24 - rounds; round < 24; round++) {\n // Theta θ\n for (let x = 0; x < 10; x++)\n B[x] = s[x] ^ s[x + 10] ^ s[x + 20] ^ s[x + 30] ^ s[x + 40];\n for (let x = 0; x < 10; x += 2) {\n const idx1 = (x + 8) % 10;\n const idx0 = (x + 2) % 10;\n const B0 = B[idx0];\n const B1 = B[idx0 + 1];\n const Th = rotlH(B0, B1, 1) ^ B[idx1];\n const Tl = rotlL(B0, B1, 1) ^ B[idx1 + 1];\n for (let y = 0; y < 50; y += 10) {\n s[x + y] ^= Th;\n s[x + y + 1] ^= Tl;\n }\n }\n // Rho (ρ) and Pi (π)\n let curH = s[2];\n let curL = s[3];\n for (let t = 0; t < 24; t++) {\n const shift = SHA3_ROTL[t];\n const Th = rotlH(curH, curL, shift);\n const Tl = rotlL(curH, curL, shift);\n const PI = SHA3_PI[t];\n curH = s[PI];\n curL = s[PI + 1];\n s[PI] = Th;\n s[PI + 1] = Tl;\n }\n // Chi (χ)\n for (let y = 0; y < 50; y += 10) {\n for (let x = 0; x < 10; x++)\n B[x] = s[y + x];\n for (let x = 0; x < 10; x++)\n s[y + x] ^= ~B[(x + 2) % 10] & B[(x + 4) % 10];\n }\n // Iota (ι)\n s[0] ^= SHA3_IOTA_H[round];\n s[1] ^= SHA3_IOTA_L[round];\n }\n B.fill(0);\n}\nexport class Keccak extends Hash {\n // NOTE: we accept arguments in bytes instead of bits here.\n constructor(blockLen, suffix, outputLen, enableXOF = false, rounds = 24) {\n super();\n this.blockLen = blockLen;\n this.suffix = suffix;\n this.outputLen = outputLen;\n this.enableXOF = enableXOF;\n this.rounds = rounds;\n this.pos = 0;\n this.posOut = 0;\n this.finished = false;\n this.destroyed = false;\n // Can be passed from user as dkLen\n number(outputLen);\n // 1600 = 5x5 matrix of 64bit. 1600 bits === 200 bytes\n if (0 >= this.blockLen || this.blockLen >= 200)\n throw new Error('Sha3 supports only keccak-f1600 function');\n this.state = new Uint8Array(200);\n this.state32 = u32(this.state);\n }\n keccak() {\n keccakP(this.state32, this.rounds);\n this.posOut = 0;\n this.pos = 0;\n }\n update(data) {\n exists(this);\n const { blockLen, state } = this;\n data = toBytes(data);\n const len = data.length;\n for (let pos = 0; pos < len;) {\n const take = Math.min(blockLen - this.pos, len - pos);\n for (let i = 0; i < take; i++)\n state[this.pos++] ^= data[pos++];\n if (this.pos === blockLen)\n this.keccak();\n }\n return this;\n }\n finish() {\n if (this.finished)\n return;\n this.finished = true;\n const { state, suffix, pos, blockLen } = this;\n // Do the padding\n state[pos] ^= suffix;\n if ((suffix & 0x80) !== 0 && pos === blockLen - 1)\n this.keccak();\n state[blockLen - 1] ^= 0x80;\n this.keccak();\n }\n writeInto(out) {\n exists(this, false);\n bytes(out);\n this.finish();\n const bufferOut = this.state;\n const { blockLen } = this;\n for (let pos = 0, len = out.length; pos < len;) {\n if (this.posOut >= blockLen)\n this.keccak();\n const take = Math.min(blockLen - this.posOut, len - pos);\n out.set(bufferOut.subarray(this.posOut, this.posOut + take), pos);\n this.posOut += take;\n pos += take;\n }\n return out;\n }\n xofInto(out) {\n // Sha3/Keccak usage with XOF is probably mistake, only SHAKE instances can do XOF\n if (!this.enableXOF)\n throw new Error('XOF is not possible for this instance');\n return this.writeInto(out);\n }\n xof(bytes) {\n number(bytes);\n return this.xofInto(new Uint8Array(bytes));\n }\n digestInto(out) {\n output(out, this);\n if (this.finished)\n throw new Error('digest() was already called');\n this.writeInto(out);\n this.destroy();\n return out;\n }\n digest() {\n return this.digestInto(new Uint8Array(this.outputLen));\n }\n destroy() {\n this.destroyed = true;\n this.state.fill(0);\n }\n _cloneInto(to) {\n const { blockLen, suffix, outputLen, rounds, enableXOF } = this;\n to || (to = new Keccak(blockLen, suffix, outputLen, enableXOF, rounds));\n to.state32.set(this.state32);\n to.pos = this.pos;\n to.posOut = this.posOut;\n to.finished = this.finished;\n to.rounds = rounds;\n // Suffix can change in cSHAKE\n to.suffix = suffix;\n to.outputLen = outputLen;\n to.enableXOF = enableXOF;\n to.destroyed = this.destroyed;\n return to;\n }\n}\nconst gen = (suffix, blockLen, outputLen) => wrapConstructor(() => new Keccak(blockLen, suffix, outputLen));\nexport const sha3_224 = /* @__PURE__ */ gen(0x06, 144, 224 / 8);\n/**\n * SHA3-256 hash function\n * @param message - that would be hashed\n */\nexport const sha3_256 = /* @__PURE__ */ gen(0x06, 136, 256 / 8);\nexport const sha3_384 = /* @__PURE__ */ gen(0x06, 104, 384 / 8);\nexport const sha3_512 = /* @__PURE__ */ gen(0x06, 72, 512 / 8);\nexport const keccak_224 = /* @__PURE__ */ gen(0x01, 144, 224 / 8);\n/**\n * keccak-256 hash function. Different from SHA3-256.\n * @param message - that would be hashed\n */\nexport const keccak_256 = /* @__PURE__ */ gen(0x01, 136, 256 / 8);\nexport const keccak_384 = /* @__PURE__ */ gen(0x01, 104, 384 / 8);\nexport const keccak_512 = /* @__PURE__ */ gen(0x01, 72, 512 / 8);\nconst genShake = (suffix, blockLen, outputLen) => wrapXOFConstructorWithOpts((opts = {}) => new Keccak(blockLen, suffix, opts.dkLen === undefined ? outputLen : opts.dkLen, true));\nexport const shake128 = /* @__PURE__ */ genShake(0x1f, 168, 128 / 8);\nexport const shake256 = /* @__PURE__ */ genShake(0x1f, 136, 256 / 8);\n//# sourceMappingURL=sha3.js.map","/**\n * Cryptographic hashing functions\n *\n * @_subsection: api/crypto:Hash Functions [about-crypto-hashing]\n */\nimport { keccak_256 } from \"@noble/hashes/sha3\";\nimport { getBytes, hexlify } from \"../utils/index.js\";\nlet locked = false;\nconst _keccak256 = function (data) {\n return keccak_256(data);\n};\nlet __keccak256 = _keccak256;\n/**\n * Compute the cryptographic KECCAK256 hash of %%data%%.\n *\n * The %%data%% **must** be a data representation, to compute the\n * hash of UTF-8 data use the [[id]] function.\n *\n * @returns DataHexstring\n * @example:\n * keccak256(\"0x\")\n * //_result:\n *\n * keccak256(\"0x1337\")\n * //_result:\n *\n * keccak256(new Uint8Array([ 0x13, 0x37 ]))\n * //_result:\n *\n * // Strings are assumed to be DataHexString, otherwise it will\n * // throw. To hash UTF-8 data, see the note above.\n * keccak256(\"Hello World\")\n * //_error:\n */\nexport function keccak256(_data) {\n const data = getBytes(_data, \"data\");\n return hexlify(__keccak256(data));\n}\nkeccak256._ = _keccak256;\nkeccak256.lock = function () { locked = true; };\nkeccak256.register = function (func) {\n if (locked) {\n throw new TypeError(\"keccak256 is locked\");\n }\n __keccak256 = func;\n};\nObject.freeze(keccak256);\n//# sourceMappingURL=keccak.js.map","import { keccak256 } from \"../crypto/index.js\";\nimport { getBytes, assertArgument } from \"../utils/index.js\";\nconst BN_0 = BigInt(0);\nconst BN_36 = BigInt(36);\nfunction getChecksumAddress(address) {\n // if (!isHexString(address, 20)) {\n // logger.throwArgumentError(\"invalid address\", \"address\", address);\n // }\n address = address.toLowerCase();\n const chars = address.substring(2).split(\"\");\n const expanded = new Uint8Array(40);\n for (let i = 0; i < 40; i++) {\n expanded[i] = chars[i].charCodeAt(0);\n }\n const hashed = getBytes(keccak256(expanded));\n for (let i = 0; i < 40; i += 2) {\n if ((hashed[i >> 1] >> 4) >= 8) {\n chars[i] = chars[i].toUpperCase();\n }\n if ((hashed[i >> 1] & 0x0f) >= 8) {\n chars[i + 1] = chars[i + 1].toUpperCase();\n }\n }\n return \"0x\" + chars.join(\"\");\n}\n// See: https://en.wikipedia.org/wiki/International_Bank_Account_Number\n// Create lookup table\nconst ibanLookup = {};\nfor (let i = 0; i < 10; i++) {\n ibanLookup[String(i)] = String(i);\n}\nfor (let i = 0; i < 26; i++) {\n ibanLookup[String.fromCharCode(65 + i)] = String(10 + i);\n}\n// How many decimal digits can we process? (for 64-bit float, this is 15)\n// i.e. Math.floor(Math.log10(Number.MAX_SAFE_INTEGER));\nconst safeDigits = 15;\nfunction ibanChecksum(address) {\n address = address.toUpperCase();\n address = address.substring(4) + address.substring(0, 2) + \"00\";\n let expanded = address.split(\"\").map((c) => { return ibanLookup[c]; }).join(\"\");\n // Javascript can handle integers safely up to 15 (decimal) digits\n while (expanded.length >= safeDigits) {\n let block = expanded.substring(0, safeDigits);\n expanded = parseInt(block, 10) % 97 + expanded.substring(block.length);\n }\n let checksum = String(98 - (parseInt(expanded, 10) % 97));\n while (checksum.length < 2) {\n checksum = \"0\" + checksum;\n }\n return checksum;\n}\n;\nconst Base36 = (function () {\n ;\n const result = {};\n for (let i = 0; i < 36; i++) {\n const key = \"0123456789abcdefghijklmnopqrstuvwxyz\"[i];\n result[key] = BigInt(i);\n }\n return result;\n})();\nfunction fromBase36(value) {\n value = value.toLowerCase();\n let result = BN_0;\n for (let i = 0; i < value.length; i++) {\n result = result * BN_36 + Base36[value[i]];\n }\n return result;\n}\n/**\n * Returns a normalized and checksumed address for %%address%%.\n * This accepts non-checksum addresses, checksum addresses and\n * [[getIcapAddress]] formats.\n *\n * The checksum in Ethereum uses the capitalization (upper-case\n * vs lower-case) of the characters within an address to encode\n * its checksum, which offers, on average, a checksum of 15-bits.\n *\n * If %%address%% contains both upper-case and lower-case, it is\n * assumed to already be a checksum address and its checksum is\n * validated, and if the address fails its expected checksum an\n * error is thrown.\n *\n * If you wish the checksum of %%address%% to be ignore, it should\n * be converted to lower-case (i.e. ``.toLowercase()``) before\n * being passed in. This should be a very rare situation though,\n * that you wish to bypass the safegaurds in place to protect\n * against an address that has been incorrectly copied from another\n * source.\n *\n * @example:\n * // Adds the checksum (via upper-casing specific letters)\n * getAddress(\"0x8ba1f109551bd432803012645ac136ddd64dba72\")\n * //_result:\n *\n * // Converts ICAP address and adds checksum\n * getAddress(\"XE65GB6LDNXYOFTX0NSV3FUWKOWIXAMJK36\");\n * //_result:\n *\n * // Throws an error if an address contains mixed case,\n * // but the checksum fails\n * getAddress(\"0x8Ba1f109551bD432803012645Ac136ddd64DBA72\")\n * //_error:\n */\nexport function getAddress(address) {\n assertArgument(typeof (address) === \"string\", \"invalid address\", \"address\", address);\n if (address.match(/^(0x)?[0-9a-fA-F]{40}$/)) {\n // Missing the 0x prefix\n if (!address.startsWith(\"0x\")) {\n address = \"0x\" + address;\n }\n const result = getChecksumAddress(address);\n // It is a checksummed address with a bad checksum\n assertArgument(!address.match(/([A-F].*[a-f])|([a-f].*[A-F])/) || result === address, \"bad address checksum\", \"address\", address);\n return result;\n }\n // Maybe ICAP? (we only support direct mode)\n if (address.match(/^XE[0-9]{2}[0-9A-Za-z]{30,31}$/)) {\n // It is an ICAP address with a bad checksum\n assertArgument(address.substring(2, 4) === ibanChecksum(address), \"bad icap checksum\", \"address\", address);\n let result = fromBase36(address.substring(4)).toString(16);\n while (result.length < 40) {\n result = \"0\" + result;\n }\n return getChecksumAddress(\"0x\" + result);\n }\n assertArgument(false, \"invalid address\", \"address\", address);\n}\n/**\n * The [ICAP Address format](link-icap) format is an early checksum\n * format which attempts to be compatible with the banking\n * industry [IBAN format](link-wiki-iban) for bank accounts.\n *\n * It is no longer common or a recommended format.\n *\n * @example:\n * getIcapAddress(\"0x8ba1f109551bd432803012645ac136ddd64dba72\");\n * //_result:\n *\n * getIcapAddress(\"XE65GB6LDNXYOFTX0NSV3FUWKOWIXAMJK36\");\n * //_result:\n *\n * // Throws an error if the ICAP checksum is wrong\n * getIcapAddress(\"XE65GB6LDNXYOFTX0NSV3FUWKOWIXAMJK37\");\n * //_error:\n */\nexport function getIcapAddress(address) {\n //let base36 = _base16To36(getAddress(address).substring(2)).toUpperCase();\n let base36 = BigInt(getAddress(address)).toString(36).toUpperCase();\n while (base36.length < 30) {\n base36 = \"0\" + base36;\n }\n return \"XE\" + ibanChecksum(\"XE00\" + base36) + base36;\n}\n//# sourceMappingURL=address.js.map","import { TypedData } from \"@starknet-io/types-js\";\nimport { connect, StarknetWindowObject } from \"starknetkit\";\nimport { InjectedConnector } from \"starknetkit/injected\";\nimport {\n ExternalPlatform,\n ExternalWallet,\n ExternalWalletResponse,\n ExternalWalletType,\n WalletAdapter,\n} from \"../types\";\n\nexport class ArgentWallet implements WalletAdapter {\n readonly type: ExternalWalletType = \"argent\";\n readonly platform: ExternalPlatform = \"starknet\";\n private wallet: StarknetWindowObject | undefined = undefined;\n private account: string | undefined = undefined;\n private connectedAccounts: string[] = [];\n\n isAvailable(): boolean {\n return typeof window !== \"undefined\" && !!window.starknet_argentX;\n }\n\n getInfo(): ExternalWallet {\n const available = this.isAvailable();\n\n return {\n type: this.type,\n available,\n version: available\n ? window.starknet_argentX?.version || \"Unknown\"\n : undefined,\n chainId: available ? window.starknet_argentX?.chainId : undefined,\n name: \"Argent\",\n platform: this.platform,\n };\n }\n\n async connect(): Promise<ExternalWalletResponse<any>> {\n if (this.account) {\n return { success: true, wallet: this.type, account: this.account };\n }\n\n try {\n if (!this.isAvailable()) {\n throw new Error(\"Argent is not available\");\n }\n\n const { wallet, connectorData } = await connect({\n connectors: [new InjectedConnector({ options: { id: \"argentX\" } })],\n });\n\n if (!wallet) {\n throw new Error(\"No wallet found\");\n }\n\n this.wallet = wallet;\n this.account = connectorData?.account;\n return { success: true, wallet: this.type, account: this.account };\n } catch (error) {\n console.error(`Error connecting to Argent:`, error);\n return {\n success: false,\n wallet: this.type,\n error: (error as Error).message || \"Unknown error\",\n };\n }\n }\n\n getConnectedAccounts(): string[] {\n return this.connectedAccounts;\n }\n\n async signTypedData(data: TypedData): Promise<ExternalWalletResponse<any>> {\n try {\n if (!this.isAvailable() || !this.wallet) {\n throw new Error(\"Argent is not connected\");\n }\n\n const sig = await this.wallet.request({\n type: \"wallet_signTypedData\",\n params: data,\n });\n\n return { success: true, wallet: this.type, result: sig };\n } catch (error) {\n console.error(`Error signing typed data with Argent:`, error);\n return {\n success: false,\n wallet: this.type,\n error: (error as Error).message || \"Unknown error\",\n };\n }\n }\n\n async sendTransaction(_txn: any): Promise<ExternalWalletResponse<any>> {\n return {\n success: false,\n wallet: this.type,\n error: \"Not implemented\",\n };\n }\n\n async switchChain(_chainId: string): Promise<boolean> {\n console.warn(\n \"Chain switching for Argent may require custom implementation\",\n );\n return false;\n }\n\n async getBalance(\n _tokenAddress?: string,\n ): Promise<ExternalWalletResponse<any>> {\n try {\n if (!this.isAvailable() || !this.wallet) {\n throw new Error(\"Argent is not connected\");\n }\n\n // TODO: Implement balance fetching based on Argent's API\n return {\n success: true,\n wallet: this.type,\n result: \"Implement based on Argent API\",\n };\n } catch (error) {\n console.error(`Error getting balance from Argent:`, error);\n return {\n success: false,\n wallet: this.type,\n error: (error as Error).message || \"Unknown error\",\n };\n }\n }\n}\n","/**\n * Announces an EIP-1193 Provider.\n */\nexport function announceProvider(detail) {\n const event = new CustomEvent('eip6963:announceProvider', { detail: Object.freeze(detail) });\n window.dispatchEvent(event);\n const handler = () => window.dispatchEvent(event);\n window.addEventListener('eip6963:requestProvider', handler);\n return () => window.removeEventListener('eip6963:requestProvider', handler);\n}\n/**\n * Watches for EIP-1193 Providers to be announced.\n */\nexport function requestProviders(listener) {\n if (typeof window === 'undefined')\n return;\n const handler = (event) => listener(event.detail);\n window.addEventListener('eip6963:announceProvider', handler);\n window.dispatchEvent(new CustomEvent('eip6963:requestProvider'));\n return () => window.removeEventListener('eip6963:announceProvider', handler);\n}\n//# sourceMappingURL=utils.js.map","import { requestProviders } from './utils.js';\nexport function createStore() {\n const listeners = new Set();\n let providerDetails = [];\n const request = () => requestProviders((providerDetail) => {\n if (providerDetails.some(({ info }) => info.uuid === providerDetail.info.uuid))\n return;\n providerDetails = [...providerDetails, providerDetail];\n listeners.forEach((listener) => listener(providerDetails, { added: [providerDetail] }));\n });\n let unwatch = request();\n return {\n _listeners() {\n return listeners;\n },\n clear() {\n listeners.forEach((listener) => listener([], { removed: [...providerDetails] }));\n providerDetails = [];\n },\n destroy() {\n this.clear();\n listeners.clear();\n unwatch?.();\n },\n findProvider({ rdns }) {\n return providerDetails.find((providerDetail) => providerDetail.info.rdns === rdns);\n },\n getProviders() {\n return providerDetails;\n },\n reset() {\n this.clear();\n unwatch?.();\n unwatch = request();\n },\n subscribe(listener, { emitImmediately } = {}) {\n listeners.add(listener);\n if (emitImmediately)\n listener(providerDetails, { added: providerDetails });\n return () => listeners.delete(listener);\n },\n };\n}\n//# sourceMappingURL=store.js.map","import { MetaMaskSDK } from \"@metamask/sdk\";\nimport { getAddress } from \"ethers/address\";\nimport { createStore } from \"mipd\";\nimport {\n ExternalPlatform,\n ExternalWallet,\n ExternalWalletResponse,\n ExternalWalletType,\n WalletAdapter,\n} from \"../types\";\n\nexport class MetaMaskWallet implements WalletAdapter {\n readonly type: ExternalWalletType = \"metamask\";\n readonly platform: ExternalPlatform = \"ethereum\";\n private MMSDK: MetaMaskSDK;\n private store = createStore();\n private account: string | undefined = undefined;\n private connectedAccounts: string[] = [];\n\n constructor() {\n this.MMSDK = new MetaMaskSDK({\n dappMetadata: {\n name: \"Cartridge Controller\",\n url: window.location.href,\n },\n });\n if (this.isAvailable()) {\n this.MMSDK.sdkInitPromise?.then(() => {\n this.MMSDK.getProvider()\n ?.request({\n method: \"eth_accounts\",\n })\n .then((accounts: any) => {\n if (accounts && accounts.length > 0) {\n this.account = getAddress(accounts[0]);\n this.connectedAccounts = accounts.map(getAddress);\n }\n });\n this.MMSDK.getProvider()?.on(\"accountsChanged\", (accounts: any) => {\n if (Array.isArray(accounts)) {\n if (accounts.length > 0) {\n this.account = getAddress(accounts?.[0]);\n this.connectedAccounts = accounts.map(getAddress);\n }\n }\n });\n });\n }\n }\n\n isAvailable(): boolean {\n return (\n typeof window !== \"undefined\" &&\n this.store\n .getProviders()\n .some((provider) => provider.info.rdns === \"io.metamask\")\n );\n }\n\n getInfo(): ExternalWallet {\n const available = this.isAvailable();\n\n return {\n type: this.type,\n available,\n version: available ? window.ethereum?.version || \"Unknown\" : undefined,\n chainId: available ? window.ethereum?.chainId : undefined,\n name: \"MetaMask\",\n platform: this.platform,\n connectedAccounts: this.connectedAccounts,\n };\n }\n\n async connect(): Promise<ExternalWalletResponse<any>> {\n if (this.account) {\n return { success: true, wallet: this.type, account: this.account };\n }\n\n try {\n if (!this.isAvailable()) {\n throw new Error(\"MetaMask is not available\");\n }\n\n const accounts = await this.MMSDK.connect();\n if (accounts && accounts.length > 0) {\n this.account = getAddress(accounts[0]);\n this.connectedAccounts = accounts.map((account: string) =>\n getAddress(account),\n );\n\n return { success: true, wallet: this.type, account: this.account };\n }\n\n throw new Error(\"No accounts found\");\n } catch (error) {\n console.error(`Error connecting to MetaMask:`, error);\n return {\n success: false,\n wallet: this.type,\n error: (error as Error).message || \"Unknown error\",\n };\n }\n }\n\n getConnectedAccounts(): string[] {\n return this.connectedAccounts;\n }\n\n async signTransaction(\n transaction: any,\n ): Promise<ExternalWalletResponse<any>> {\n try {\n if (!this.isAvailable() || !this.account) {\n throw new Error(\"MetaMask is not connected\");\n }\n\n const ethereum = this.MMSDK.getProvider();\n if (!ethereum) {\n throw new Error(\"MetaMask is not connected\");\n }\n\n const result = await ethereum.request({\n method: \"eth_sendTransaction\",\n params: [transaction],\n });\n\n return { success: true, wallet: this.type, result };\n } catch (error) {\n console.error(`Error signing transaction with MetaMask:`, error);\n return {\n success: false,\n wallet: this.type,\n error: (error as Error).message || \"Unknown error\",\n };\n }\n }\n\n async signMessage(\n message: string,\n address?: string,\n ): Promise<ExternalWalletResponse<any>> {\n try {\n if (!this.isAvailable() || !this.account) {\n throw new Error(\"MetaMask is not connected\");\n }\n\n const result = await this.MMSDK.getProvider()?.request({\n method: \"personal_sign\",\n params: [address || this.account, message],\n });\n\n return { success: true, wallet: this.type, result };\n } catch (error) {\n console.error(`Error signing message with MetaMask:`, error);\n return {\n success: false,\n wallet: this.type,\n error: (error as Error).message || \"Unknown error\",\n };\n }\n }\n\n async signTypedData(data: any): Promise<ExternalWalletResponse<any>> {\n try {\n if (!this.isAvailable() || !this.account) {\n throw new Error(\"MetaMask is not connected\");\n }\n\n const ethereum = this.MMSDK.getProvider();\n if (!ethereum) {\n throw new Error(\"MetaMask is not connected\");\n }\n\n const result = await ethereum.request({\n method: \"eth_signTypedData_v4\",\n params: [this.account, JSON.stringify(data)],\n });\n\n return { success: true, wallet: this.type, result };\n } catch (error) {\n console.error(`Error signing typed data with MetaMask:`, error);\n return {\n success: false,\n wallet: this.type,\n error: (error as Error).message || \"Unknown error\",\n };\n }\n }\n\n async sendTransaction(_txn: any): Promise<ExternalWalletResponse<any>> {\n return {\n success: false,\n wallet: this.type,\n error: \"Not implemented\",\n };\n }\n\n async switchChain(chainId: string): Promise<boolean> {\n try {\n if (!this.isAvailable()) {\n throw new Error(\"MetaMask is not available\");\n }\n\n const ethereum = this.MMSDK.getProvider();\n if (!ethereum) {\n throw new Error(\"MetaMask is not connected\");\n }\n\n try {\n await ethereum.request({\n method: \"wallet_switchEthereumChain\",\n params: [{ chainId }],\n });\n return true;\n } catch (error) {\n if ((error as any).code === 4902) {\n console.warn(\"Chain not added to MetaMask\");\n }\n throw error;\n }\n } catch (error) {\n console.error(`Error switching chain for MetaMask:`, error);\n return false;\n }\n }\n\n async getBalance(\n tokenAddress?: string,\n ): Promise<ExternalWalletResponse<any>> {\n try {\n if (!this.isAvailable() || !this.account) {\n throw new Error(\"MetaMask is not connected\");\n }\n\n if (tokenAddress) {\n return {\n success: false,\n wallet: this.type,\n error: \"Not implemented for ERC20\",\n };\n } else {\n const ethereum = this.MMSDK.getProvider();\n if (!ethereum) {\n throw new Error(\"MetaMask is not connected\");\n }\n\n const balance = await ethereum.request({\n method: \"eth_getBalance\",\n params: [this.account, \"latest\"],\n });\n return { success: true, wallet: this.type, result: balance };\n }\n } catch (error) {\n console.error(`Error getting balance from MetaMask:`, error);\n return {\n success: false,\n wallet: this.type,\n error: (error as Error).message || \"Unknown error\",\n };\n }\n }\n}\n","import { PublicKey, Transaction, VersionedTransaction } from \"@solana/web3.js\";\nimport {\n ExternalPlatform,\n ExternalWallet,\n ExternalWalletResponse,\n ExternalWalletType,\n WalletAdapter,\n} from \"../types\";\n\ninterface PhantomProvider {\n isPhantom: boolean;\n publicKey: PublicKey | null;\n isConnected: boolean;\n connect(opts?: { onlyIfTrusted: boolean }): Promise<{ publicKey: PublicKey }>;\n disconnect(): Promise<void>;\n signTransaction(\n transaction: Transaction | VersionedTransaction,\n ): Promise<Transaction | VersionedTransaction>;\n signAllTransactions(\n transactions: (Transaction | VersionedTransaction)[],\n ): Promise<(Transaction | VersionedTransaction)[]>;\n signAndSendTransaction(\n transaction: Transaction | VersionedTransaction,\n opts?: { skipPreflight?: boolean; maxRetries?: number },\n ): Promise<{ signature: string }>;\n signMessage(\n message: Uint8Array,\n display?: \"utf8\" | \"hex\",\n ): Promise<{ signature: Uint8Array }>;\n on(\n event: \"connect\" | \"disconnect\" | \"accountChanged\",\n handler: (args: unknown) => void,\n ): void;\n request(args: { method: string; params?: unknown }): Promise<unknown>;\n}\n\nexport class PhantomWallet implements WalletAdapter {\n readonly type: ExternalWalletType = \"phantom\";\n readonly platform: ExternalPlatform = \"solana\";\n private account: string | undefined = undefined;\n private connectedAccounts: string[] = [];\n\n private getProvider(): PhantomProvider {\n if (typeof window === \"undefined\") {\n throw new Error(\"Not ready\");\n }\n\n const provider = window.solana;\n\n if (!provider?.isPhantom) {\n throw new Error(\"Phantom is not available\");\n }\n\n return provider;\n }\n\n isAvailable(): boolean {\n return typeof window !== \"undefined\" && !!window.solana?.isPhantom;\n }\n\n getInfo(): ExternalWallet {\n const available = this.isAvailable();\n\n return {\n type: this.type,\n available,\n version: \"Unknown\",\n name: \"Phantom\",\n platform: this.platform,\n };\n }\n\n async connect(): Promise<ExternalWalletResponse<any>> {\n if (this.account) {\n return { success: true, wallet: this.type, account: this.account };\n }\n\n try {\n if (!this.isAvailable()) {\n throw new Error(\"Phantom is not available\");\n }\n\n const response = await this.getProvider().connect();\n if (response.publicKey) {\n this.account = response.publicKey.toString();\n return { success: true, wallet: this.type, account: this.account };\n }\n\n throw new Error(\"No accounts found\");\n } catch (error) {\n console.error(`Error connecting to Phantom:`, error);\n return {\n success: false,\n wallet: this.type,\n error: (error as Error).message || \"Unknown error\",\n };\n }\n }\n\n getConnectedAccounts(): string[] {\n return this.connectedAccounts;\n }\n\n async signMessage(message: string): Promise<ExternalWalletResponse<any>> {\n try {\n if (!this.isAvailable() || !this.account) {\n throw new Error(\"Phantom is not connected\");\n }\n\n const encodedMessage = new TextEncoder().encode(message);\n const result = await this.getProvider().signMessage(\n encodedMessage,\n \"utf8\",\n );\n return { success: true, wallet: this.type, result };\n } catch (error) {\n console.error(`Error signing message with Phantom:`, error);\n return {\n success: false,\n wallet: this.type,\n error: (error as Error).message || \"Unknown error\",\n };\n }\n }\n\n async sendTransaction(\n serailized_txn: Uint8Array,\n ): Promise<ExternalWalletResponse<any>> {\n if (!this.isAvailable() || !this.account) {\n throw new Error(\"Phantom is not connected\");\n }\n\n try {\n const txn = Transaction.from(serailized_txn);\n const provider = this.getProvider();\n const result = await provider.signAndSendTransaction(txn);\n return {\n success: true,\n wallet: this.type,\n result,\n };\n } catch (error) {\n console.error(`Error sending transaction with Phantom:`, error);\n return {\n success: false,\n wallet: this.type,\n error: (error as Error).message || \"Unknown error\",\n };\n }\n }\n\n async switchChain(_chainId: string): Promise<boolean> {\n console.warn(\"Chain switching not supported for Phantom\");\n return false;\n }\n\n async getBalance(\n _tokenAddress?: string,\n ): Promise<ExternalWalletResponse<any>> {\n try {\n if (!this.isAvailable() || !this.account) {\n throw new Error(\"Phantom is not connected\");\n }\n\n // TODO: Implement balance fetching based on Phantom's API\n return {\n success: true,\n wallet: this.type,\n result: \"Implement based on Phantom API\",\n };\n } catch (error) {\n console.error(`Error getting balance from Phantom:`, error);\n return {\n success: false,\n wallet: this.type,\n error: (error as Error).message || \"Unknown error\",\n };\n }\n }\n}\n","import { getAddress } from \"ethers/address\";\nimport { createStore, EIP6963ProviderDetail } from \"mipd\";\nimport {\n ExternalPlatform,\n ExternalWallet,\n ExternalWalletResponse,\n ExternalWalletType,\n WalletAdapter,\n} from \"../types\";\n\nconst RABBY_RDNS = \"io.rabby\";\n\nexport class RabbyWallet implements WalletAdapter {\n readonly type: ExternalWalletType = \"rabby\";\n readonly platform: ExternalPlatform = \"ethereum\";\n private account: string | undefined = undefined;\n private store = createStore();\n private provider: EIP6963ProviderDetail | undefined;\n private connectedAccounts: string[] = [];\n\n constructor() {\n this.provider = this.store\n .getProviders()\n .find((provider) => provider.info.rdns === RABBY_RDNS);\n this.provider?.provider\n .request({\n method: \"eth_accounts\",\n })\n .then((accounts) => {\n this.connectedAccounts = accounts.map(getAddress);\n if (accounts.length > 0) {\n this.account = getAddress(accounts?.[0]);\n }\n });\n this.provider?.provider?.on(\"accountsChanged\", (accounts: string[]) => {\n if (accounts) {\n // rabby doesn't allow multiple accounts to be connected at the same time\n this.connectedAccounts = accounts.map((account) => getAddress(account));\n this.account = getAddress(accounts?.[0]);\n }\n });\n }\n\n isAvailable(): boolean {\n return typeof window !== \"undefined\" && !!this.provider;\n }\n\n getInfo(): ExternalWallet {\n const available = this.isAvailable();\n\n return {\n type: this.type,\n available,\n version: available ? window.ethereum?.version || \"Unknown\" : undefined,\n chainId: available ? window.ethereum?.chainId : undefined,\n name: \"Rabby\",\n platform: this.platform,\n connectedAccounts: this.connectedAccounts,\n };\n }\n\n async connect(address?: string): Promise<ExternalWalletResponse<any>> {\n if (address && this.connectedAccounts.includes(getAddress(address))) {\n this.account = getAddress(address);\n }\n\n if (this.account) {\n return { success: true, wallet: this.type, account: this.account };\n }\n\n try {\n if (!this.isAvailable()) {\n throw new Error(\"Rabby is not available\");\n }\n\n const accounts = await this.provider?.provider.request({\n method: \"eth_requestAccounts\",\n });\n if (accounts && accounts.length > 0) {\n this.account = getAddress(accounts[0]);\n this.connectedAccounts = accounts.map(getAddress);\n return { success: true, wallet: this.type, account: this.account };\n }\n\n throw new Error(\"No accounts found\");\n } catch (error) {\n console.error(`Error connecting to Rabby:`, error);\n return {\n success: false,\n wallet: this.type,\n error: (error as Error).message || \"Unknown error\",\n };\n }\n }\n\n getConnectedAccounts(): string[] {\n return this.connectedAccounts;\n }\n\n async signTransaction(\n transaction: any,\n ): Promise<ExternalWalletResponse<any>> {\n try {\n if (!this.isAvailable() || !this.account) {\n throw new Error(\"Rabby is not connected\");\n }\n\n const ethereum = this.provider?.provider;\n if (!ethereum) {\n throw new Error(\"Rabby is not connected\");\n }\n\n const result = await ethereum.request({\n method: \"eth_sendTransaction\",\n params: [transaction],\n });\n\n return { success: true, wallet: this.type, result };\n } catch (error) {\n console.error(`Error signing transaction with Rabby:`, error);\n return {\n success: false,\n wallet: this.type,\n error: (error as Error).message || \"Unknown error\",\n };\n }\n }\n\n async signMessage(\n message: `0x${string}`,\n address?: string,\n ): Promise<ExternalWalletResponse<any>> {\n try {\n if (!this.isAvailable() || !this.account) {\n throw new Error(\"Rabby is not connected\");\n }\n\n const result = await this.provider?.provider.request({\n method: \"personal_sign\",\n params: [address || this.account, message] as any,\n });\n\n return { success: true, wallet: this.type, result };\n } catch (error) {\n console.error(`Error signing message with Rabby:`, error);\n return {\n success: false,\n wallet: this.type,\n error: (error as Error).message || \"Unknown error\",\n };\n }\n }\n\n async signTypedData(data: any): Promise<ExternalWalletResponse<any>> {\n try {\n if (!this.isAvailable() || !this.account) {\n throw new Error(\"Rabby is not connected\");\n }\n\n const provider = this.provider?.provider;\n if (!provider) {\n throw new Error(\"Rabby is not connected\");\n }\n\n const result = await provider.request({\n method: \"eth_signTypedData_v4\",\n params: [this.account, JSON.stringify(data)] as any,\n });\n\n return { success: true, wallet: this.type, result };\n } catch (error) {\n console.error(`Error signing typed data with Rabby:`, error);\n return {\n success: false,\n wallet: this.type,\n error: (error as Error).message || \"Unknown error\",\n };\n }\n }\n\n async sendTransaction(_txn: any): Promise<ExternalWalletResponse<any>> {\n return {\n success: false,\n wallet: this.type,\n error: \"Not implemented\",\n };\n }\n\n async switchChain(chainId: string): Promise<boolean> {\n try {\n if (!this.isAvailable()) {\n throw new Error(\"Rabby is not available\");\n }\n\n const provider = this.provider?.provider;\n if (!provider) {\n throw new Error(\"Rabby is not connected\");\n }\n\n try {\n await provider.request({\n method: \"wallet_switchEthereumChain\",\n params: [{ chainId }],\n });\n return true;\n } catch (error) {\n if ((error as any).code === 4902) {\n console.warn(\"Chain not added to Rabby\");\n }\n throw error;\n }\n } catch (error) {\n console.error(`Error switching chain for Rabby:`, error);\n return false;\n }\n }\n\n async getBalance(\n tokenAddress?: string,\n ): Promise<ExternalWalletResponse<any>> {\n try {\n if (!this.isAvailable() || !this.account) {\n throw new Error(\"Rabby is not connected\");\n }\n\n if (tokenAddress) {\n return {\n success: false,\n wallet: this.type,\n error: \"Not implemented for ERC20\",\n };\n } else {\n const provider = this.provider?.provider;\n if (!provider) {\n throw new Error(\"Rabby is not connected\");\n }\n\n const balance = await provider.request({\n method: \"eth_getBalance\",\n params: [this.account, \"latest\"] as any,\n });\n return { success: true, wallet: this.type, result: balance };\n }\n } catch (error) {\n console.error(`Error getting balance from Rabby:`, error);\n return {\n success: false,\n wallet: this.type,\n error: (error as Error).message || \"Unknown error\",\n };\n }\n }\n}\n","import { getAddress } from \"ethers\";\nimport { ArgentWallet } from \"./argent\";\nimport { MetaMaskWallet } from \"./metamask\";\nimport { PhantomWallet } from \"./phantom\";\nimport { RabbyWallet } from \"./rabby\";\nimport {\n ExternalWallet,\n ExternalWalletResponse,\n ExternalWalletType,\n WalletAdapter,\n} from \"./types\";\n\nexport class WalletBridge {\n private readonly walletAdapters: Map<ExternalWalletType, WalletAdapter>;\n\n constructor() {\n this.walletAdapters = new Map<ExternalWalletType, WalletAdapter>();\n\n if (typeof window == \"undefined\") {\n return;\n }\n\n const metamask = new MetaMaskWallet();\n metamask.isAvailable() && this.walletAdapters.set(\"metamask\", metamask);\n\n const phantom = new PhantomWallet();\n phantom.isAvailable() && this.walletAdapters.set(\"phantom\", phantom);\n\n const argent = new ArgentWallet();\n argent.isAvailable() && this.walletAdapters.set(\"argent\", argent);\n\n const rabby = new RabbyWallet();\n rabby.isAvailable() && this.walletAdapters.set(\"rabby\", rabby);\n\n window.wallet_bridge = this;\n }\n\n getIFrameMethods() {\n return {\n externalDetectWallets: (_origin: string) => () => this.detectWallets(),\n externalConnectWallet: (_origin: string) => (type: ExternalWalletType) =>\n this.connectWallet(type),\n externalSignMessage:\n (_origin: string) =>\n (identifier: ExternalWalletType | string, message: string) =>\n this.signMessage(identifier, message),\n externalSignTypedData:\n (_origin: string) =>\n (identifier: ExternalWalletType | string, data: any) =>\n this.signTypedData(identifier, data),\n externalSendTransaction:\n (_origin: string) =>\n (identifier: ExternalWalletType | string, txn: any) =>\n this.sendTransaction(identifier, txn),\n externalGetBalance:\n (_origin: string) =>\n (identifier: ExternalWalletType | string, tokenAddress?: string) =>\n this.getBalance(identifier, tokenAddress),\n };\n }\n\n async detectWallets(): Promise<ExternalWallet[]> {\n const wallets = Array.from(this.walletAdapters.values()).map((adapter) =>\n adapter.getInfo(),\n ) as ExternalWallet[];\n\n return wallets;\n }\n\n private getWalletAdapterByType(type: ExternalWalletType): WalletAdapter {\n const adapter = this.walletAdapters.get(type);\n if (!adapter) {\n throw new Error(`Unsupported wallet type: ${type}`);\n }\n return adapter;\n }\n\n private handleError(\n identifier: ExternalWalletType | string,\n error: unknown,\n operation: string,\n responseType?: ExternalWalletType,\n ): ExternalWalletResponse {\n const errorMessage =\n error instanceof Error ? error.message : \"Unknown error\";\n let walletType: ExternalWalletType | string = \"unknown\";\n if (typeof identifier === \"string\") {\n const adapter = this.getConnectedWalletAdapter(identifier);\n walletType = responseType ?? adapter?.type ?? identifier;\n } else {\n walletType = identifier;\n }\n\n console.error(`Error ${operation} with ${identifier} wallet:`, error);\n return {\n success: false,\n wallet: walletType as ExternalWalletType,\n error: errorMessage,\n };\n }\n\n async connectWallet(\n type: ExternalWalletType,\n ): Promise<ExternalWalletResponse> {\n try {\n const wallet = this.getWalletAdapterByType(type);\n const response = await wallet.connect();\n\n if (response.success && response.account) {\n console.log(\n `Wallet ${type} connected with address ${response.account}`,\n );\n } else if (response.success && !response.account) {\n console.error(\n `Wallet ${type} connected successfully but did not provide an address.`,\n );\n return {\n ...response,\n success: false,\n error: \"Wallet connected but address not found.\",\n };\n }\n\n return response;\n } catch (error) {\n return this.handleError(type, error, \"connecting to\");\n }\n }\n\n private getConnectedWalletAdapter(\n identifier: ExternalWalletType | string,\n ): WalletAdapter {\n let wallet: WalletAdapter | undefined;\n if (typeof identifier === \"string\") {\n // this is an address\n const checkSummedAddress = getAddress(identifier);\n\n wallet = this.walletAdapters.values().find((adapter) => {\n return adapter.getConnectedAccounts().includes(checkSummedAddress);\n });\n } else {\n wallet = this.walletAdapters.get(identifier);\n }\n\n if (!wallet) {\n throw new Error(\n `Wallet with identifier ${identifier} is not connected or supported`,\n );\n }\n return wallet;\n }\n\n async signMessage(\n identifier: ExternalWalletType | string,\n message: string,\n ): Promise<ExternalWalletResponse> {\n let wallet: WalletAdapter | undefined;\n try {\n wallet = this.getConnectedWalletAdapter(identifier);\n if (!wallet.signMessage) {\n throw new Error(\n `Wallet type ${wallet.type} (identifier: ${identifier}) does not support signing messages`,\n );\n }\n return await wallet.signMessage(message, identifier);\n } catch (error) {\n return this.handleError(\n identifier,\n error,\n \"signing message with\",\n wallet?.type,\n );\n }\n }\n\n async signTypedData(\n identifier: ExternalWalletType | string,\n data: any,\n ): Promise<ExternalWalletResponse> {\n let wallet: WalletAdapter | undefined;\n try {\n wallet = this.getConnectedWalletAdapter(identifier);\n if (!wallet.signTypedData) {\n throw new Error(\n `Wallet type ${wallet.type} (identifier: ${identifier}) does not support signing typed data`,\n );\n }\n return await wallet.signTypedData(data);\n } catch (error) {\n return this.handleError(\n identifier,\n error,\n \"signing typed data with\",\n wallet?.type,\n );\n }\n }\n\n async sendTransaction(\n identifier: ExternalWalletType | string,\n txn: any,\n ): Promise<ExternalWalletResponse> {\n let wallet: WalletAdapter | undefined;\n try {\n wallet = this.getConnectedWalletAdapter(identifier);\n return await wallet.sendTransaction(txn);\n } catch (error) {\n return this.handleError(\n identifier,\n error,\n \"sending transaction with\",\n wallet?.type,\n );\n }\n }\n\n async getBalance(\n identifier: ExternalWalletType | string,\n tokenAddress?: string,\n ): Promise<ExternalWalletResponse> {\n let wallet: WalletAdapter | undefined;\n try {\n wallet = this.getConnectedWalletAdapter(identifier);\n return await wallet.getBalance(tokenAddress);\n } catch (error) {\n return this.handleError(\n identifier,\n error,\n \"getting balance from\",\n wallet?.type,\n );\n }\n }\n}\n\ndeclare global {\n interface Window {\n ethereum?: any;\n solana?: any;\n starknet_argentX?: any;\n wallet_bridge?: WalletBridge;\n }\n}\n\nexport type {\n ExternalWallet,\n ExternalWalletResponse,\n ExternalWalletType,\n WalletAdapter,\n} from \"./types\";\n","import { KEYCHAIN_URL } from \"../constants\";\nimport { Keychain, KeychainOptions } from \"../types\";\nimport { WalletBridge } from \"../wallets/bridge\";\nimport { IFrame, IFrameOptions } from \"./base\";\n\ntype KeychainIframeOptions = IFrameOptions<Keychain> &\n KeychainOptions & {\n version?: string;\n };\n\nexport class KeychainIFrame extends IFrame<Keychain> {\n private walletBridge: WalletBridge;\n\n constructor({\n url,\n policies,\n version,\n slot,\n namespace,\n tokens,\n ...iframeOptions\n }: KeychainIframeOptions) {\n const _url = new URL(url ?? KEYCHAIN_URL);\n const walletBridge = new WalletBridge();\n\n if (policies) {\n _url.searchParams.set(\n \"policies\",\n encodeURIComponent(JSON.stringify(policies)),\n );\n }\n\n if (version) {\n _url.searchParams.set(\"v\", encodeURIComponent(version));\n }\n\n if (slot) {\n _url.searchParams.set(\"ps\", encodeURIComponent(slot));\n }\n\n if (namespace) {\n _url.searchParams.set(\"ns\", encodeURIComponent(namespace));\n }\n\n if (tokens?.erc20) {\n _url.searchParams.set(\n \"erc20\",\n encodeURIComponent(tokens.erc20.toString()),\n );\n }\n\n super({\n ...iframeOptions,\n id: \"controller-keychain\",\n url: _url,\n methods: walletBridge.getIFrameMethods(),\n });\n\n this.walletBridge = walletBridge;\n\n // Expose the wallet bridge instance globally for WASM interop\n if (typeof window !== \"undefined\") {\n (window as any).external_wallets = this.walletBridge;\n }\n }\n\n getWalletBridge(): WalletBridge {\n return this.walletBridge;\n }\n}\n","import { AsyncMethodReturns } from \"@cartridge/penpal\";\n\nimport { Policy } from \"@cartridge/presets\";\nimport {\n AddInvokeTransactionResult,\n AddStarknetChainParameters,\n ChainId,\n} from \"@starknet-io/types-js\";\nimport { constants, shortString, WalletAccount } from \"starknet\";\nimport { version } from \"../package.json\";\nimport ControllerAccount from \"./account\";\nimport { NotReadyToConnect } from \"./errors\";\nimport { KeychainIFrame } from \"./iframe\";\nimport BaseProvider from \"./provider\";\nimport {\n Chain,\n ConnectError,\n ConnectReply,\n ControllerOptions,\n IFrames,\n Keychain,\n ProbeReply,\n ProfileContextTypeVariant,\n ResponseCodes,\n} from \"./types\";\nimport { parseChainId } from \"./utils\";\n\nexport default class ControllerProvider extends BaseProvider {\n private keychain?: AsyncMethodReturns<Keychain>;\n private options: ControllerOptions;\n private iframes: IFrames;\n private selectedChain: ChainId;\n private chains: Map<ChainId, Chain>;\n\n isReady(): boolean {\n return !!this.keychain;\n }\n\n constructor(options: ControllerOptions = {}) {\n super();\n\n // Default Cartridge chains that are always available\n const cartridgeChains: Chain[] = [\n { rpcUrl: \"https://api.cartridge.gg/x/starknet/sepolia\" },\n { rpcUrl: \"https://api.cartridge.gg/x/starknet/mainnet\" },\n ];\n\n // Merge user chains with default chains\n // User chains take precedence if they specify the same network\n const chains = [...cartridgeChains, ...(options.chains || [])];\n const defaultChainId =\n options.defaultChainId || constants.StarknetChainId.SN_MAIN;\n\n this.selectedChain = defaultChainId;\n this.chains = new Map<ChainId, Chain>();\n\n this.iframes = {\n keychain: new KeychainIFrame({\n ...options,\n onClose: this.keychain?.reset,\n onConnect: (keychain) => {\n this.keychain = keychain;\n },\n version: version,\n }),\n };\n\n this.options = { ...options, chains, defaultChainId };\n\n this.initializeChains(chains);\n\n if (typeof window !== \"undefined\") {\n (window as any).starknet_controller = this;\n }\n }\n\n async logout() {\n if (!this.keychain) {\n console.error(new NotReadyToConnect().message);\n return;\n }\n\n try {\n // Disconnect the controller/keychain first\n await this.disconnect();\n\n // Close all controller iframes\n const iframes = document.querySelectorAll('iframe[id^=\"controller-\"]');\n iframes.forEach((iframe) => {\n const container = iframe.parentElement;\n if (container) {\n container.style.visibility = \"hidden\";\n container.style.opacity = \"0\";\n }\n });\n\n // Reset body overflow\n if (document.body) {\n document.body.style.overflow = \"auto\";\n }\n\n // Reload the page to complete logout\n window.location.reload();\n } catch (err) {\n console.error(\"Logout failed:\", err);\n throw err;\n }\n }\n\n async probe(): Promise<WalletAccount | undefined> {\n try {\n await this.waitForKeychain();\n\n if (!this.keychain) {\n console.error(new NotReadyToConnect().message);\n return;\n }\n\n const response = (await this.keychain.probe(this.rpcUrl())) as ProbeReply;\n\n // For backwards compat with controller <=0.6.0\n let rpcUrl = response?.rpcUrl || this.rpcUrl();\n this.account = new ControllerAccount(\n this,\n rpcUrl,\n response.address,\n this.keychain,\n this.options,\n this.iframes.keychain,\n );\n } catch (e) {\n console.error(e);\n return;\n }\n\n return this.account;\n }\n\n async connect(): Promise<WalletAccount | undefined> {\n if (this.account) {\n return this.account;\n }\n\n if (!this.keychain || !this.iframes.keychain) {\n console.error(new NotReadyToConnect().message);\n return;\n }\n\n if (typeof document !== \"undefined\" && !!document.hasStorageAccess) {\n const ok = await document.hasStorageAccess();\n if (!ok) {\n await document.requestStorageAccess();\n }\n }\n\n this.iframes.keychain.open();\n\n try {\n let response = await this.keychain.connect(\n // Policy precedence logic:\n // 1. If shouldOverridePresetPolicies is true and policies are provided, use policies\n // 2. Otherwise, if preset is defined, use empty object (let preset take precedence)\n // 3. Otherwise, use provided policies or empty object\n this.options.shouldOverridePresetPolicies && this.options.policies\n ? this.options.policies\n : this.options.preset\n ? {}\n : this.options.policies || {},\n this.rpcUrl(),\n this.options.signupOptions,\n );\n if (response.code !== ResponseCodes.SUCCESS) {\n throw new Error(response.message);\n }\n\n response = response as ConnectReply;\n this.account = new ControllerAccount(\n this,\n this.rpcUrl(),\n response.address,\n this.keychain,\n this.options,\n this.iframes.keychain,\n );\n\n return this.account;\n } catch (e) {\n console.log(e);\n } finally {\n this.iframes.keychain.close();\n }\n }\n\n async switchStarknetChain(chainId: string): Promise<boolean> {\n if (!this.keychain || !this.iframes.keychain) {\n console.error(new NotReadyToConnect().message);\n return false;\n }\n\n try {\n this.selectedChain = chainId;\n const response = (await this.keychain.probe(this.rpcUrl())) as ProbeReply;\n\n if (response.rpcUrl === this.rpcUrl()) {\n return true;\n }\n\n await this.keychain.switchChain(this.rpcUrl());\n } catch (e) {\n console.error(e);\n return false;\n }\n\n this.emitNetworkChanged(chainId);\n return true;\n }\n\n addStarknetChain(_chain: AddStarknetChainParameters): Promise<boolean> {\n return Promise.resolve(true);\n }\n\n async disconnect() {\n if (!this.keychain) {\n console.error(new NotReadyToConnect().message);\n return;\n }\n\n if (typeof document !== \"undefined\" && !!document.hasStorageAccess) {\n const ok = await document.hasStorageAccess();\n if (!ok) {\n await document.requestStorageAccess();\n }\n }\n\n this.account = undefined;\n return this.keychain.disconnect();\n }\n\n async openProfile(tab: ProfileContextTypeVariant = \"inventory\") {\n // Profile functionality is now integrated into keychain\n // Navigate keychain iframe to profile page\n if (!this.keychain || !this.iframes.keychain) {\n console.error(new NotReadyToConnect().message);\n return;\n }\n if (!this.account) {\n console.error(\"Account is not ready\");\n return;\n }\n const username = await this.keychain.username();\n\n // Navigate first, then open to avoid flash\n await this.keychain.navigate(`/account/${username}/${tab}`);\n this.iframes.keychain.open();\n }\n\n async openProfileTo(to: string) {\n // Profile functionality is now integrated into keychain\n if (!this.keychain || !this.iframes.keychain) {\n console.error(new NotReadyToConnect().message);\n return;\n }\n if (!this.account) {\n console.error(\"Account is not ready\");\n return;\n }\n\n const username = await this.keychain.username();\n await this.keychain.navigate(`/account/${username}/${to}`);\n this.iframes.keychain.open();\n }\n\n async openProfileAt(at: string) {\n // Profile functionality is now integrated into keychain\n if (!this.keychain || !this.iframes.keychain) {\n console.error(new NotReadyToConnect().message);\n return;\n }\n if (!this.account) {\n console.error(\"Account is not ready\");\n return;\n }\n\n await this.keychain.navigate(at);\n this.iframes.keychain.open();\n }\n\n openSettings() {\n if (!this.keychain || !this.iframes.keychain) {\n console.error(new NotReadyToConnect().message);\n return;\n }\n this.iframes.keychain.open();\n this.keychain.openSettings();\n }\n\n revoke(origin: string, _policy: Policy[]) {\n if (!this.keychain) {\n console.error(new NotReadyToConnect().message);\n return null;\n }\n\n return this.keychain.revoke(origin);\n }\n\n rpcUrl(): string {\n const chain = this.chains.get(this.selectedChain);\n if (!chain) {\n const availableChains = Array.from(this.chains.keys()).map((chain) =>\n shortString.decodeShortString(chain),\n );\n throw new Error(\n `Chain not found: ${shortString.decodeShortString(this.selectedChain)}. Available chains: ${availableChains.join(\", \")}`,\n );\n }\n return chain.rpcUrl;\n }\n\n username() {\n if (!this.keychain) {\n console.error(new NotReadyToConnect().message);\n return;\n }\n\n return this.keychain.username();\n }\n\n openPurchaseCredits() {\n if (!this.keychain || !this.iframes.keychain) {\n console.error(new NotReadyToConnect().message);\n return;\n }\n this.iframes.keychain.open();\n this.keychain.openPurchaseCredits();\n }\n\n openStarterPack(starterpackId: string) {\n if (!this.keychain || !this.iframes.keychain) {\n console.error(new NotReadyToConnect().message);\n return;\n }\n\n // Navigate first, then open the iframe\n this.keychain.navigate(`/starter-pack/${starterpackId}`).then(() => {\n this.iframes.keychain.open();\n });\n }\n\n async openExecute(calls: any, chainId?: string) {\n if (!this.keychain || !this.iframes.keychain) {\n console.error(new NotReadyToConnect().message);\n return;\n }\n // Switch to the chain if provided\n let currentChainId = this.selectedChain;\n if (chainId) {\n this.switchStarknetChain(chainId);\n }\n // Open keychain\n this.iframes.keychain.open();\n // Invoke execute\n const res = await this.keychain.execute(calls, undefined, undefined, true);\n // Close keychain\n this.iframes.keychain.close();\n // Switch back to the original chain\n if (chainId) {\n this.switchStarknetChain(currentChainId);\n }\n const status = !(\n res &&\n ((res as ConnectError).code === ResponseCodes.NOT_CONNECTED ||\n (res as ConnectError).code === ResponseCodes.CANCELED)\n );\n return {\n status,\n transactionHash: (res as AddInvokeTransactionResult)?.transaction_hash,\n };\n }\n\n async delegateAccount() {\n if (!this.keychain) {\n console.error(new NotReadyToConnect().message);\n return null;\n }\n\n return await this.keychain.delegateAccount();\n }\n\n private initializeChains(chains: Chain[]) {\n for (const chain of chains) {\n try {\n const url = new URL(chain.rpcUrl);\n const chainId = parseChainId(url);\n\n // Validate that mainnet and sepolia must use Cartridge RPC\n const isMainnet = chainId === constants.StarknetChainId.SN_MAIN;\n const isSepolia = chainId === constants.StarknetChainId.SN_SEPOLIA;\n const isCartridgeRpc = url.hostname === \"api.cartridge.gg\";\n const isLocalhost =\n url.hostname === \"localhost\" || url.hostname === \"127.0.0.1\";\n\n if ((isMainnet || isSepolia) && !(isCartridgeRpc || isLocalhost)) {\n throw new Error(\n `Only Cartridge RPC providers are allowed for ${isMainnet ? \"mainnet\" : \"sepolia\"}. ` +\n `Please use: https://api.cartridge.gg/x/starknet/${isMainnet ? \"mainnet\" : \"sepolia\"}`,\n );\n }\n\n this.chains.set(chainId, chain);\n } catch (error) {\n console.error(`Failed to parse chainId for ${chain.rpcUrl}:`, error);\n throw error; // Re-throw to ensure invalid chains fail fast\n }\n }\n\n if (!this.chains.has(this.selectedChain)) {\n console.warn(\n `Selected chain ${this.selectedChain} not found in configured chains. ` +\n `Available chains: ${Array.from(this.chains.keys()).join(\", \")}`,\n );\n }\n }\n\n private waitForKeychain({\n timeout = 50000,\n interval = 100,\n }:\n | {\n timeout?: number;\n interval?: number;\n }\n | undefined = {}) {\n return new Promise<void>((resolve, reject) => {\n const startTime = Date.now();\n const id = setInterval(() => {\n if (Date.now() - startTime > timeout) {\n clearInterval(id);\n reject(new Error(\"Timeout waiting for keychain\"));\n return;\n }\n\n if (!this.keychain) return;\n\n clearInterval(id);\n resolve();\n }, interval);\n });\n }\n}\n","import { LookupRequest, LookupResponse } from \"./types\";\nimport { num } from \"starknet\";\nimport { API_URL } from \"./constants\";\n\nconst cache = new Map<string, string>();\n\nasync function lookup(request: LookupRequest): Promise<LookupResponse> {\n if (!request.addresses?.length && !request.usernames?.length) {\n return { results: [] };\n }\n\n const response = await fetch(`${API_URL}/lookup`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(request),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n return response.json();\n}\n\nexport async function lookupUsernames(\n usernames: string[],\n): Promise<Map<string, string>> {\n const uncachedUsernames = usernames.filter((name) => !cache.has(name));\n\n if (uncachedUsernames.length > 0) {\n const response = await lookup({ usernames: uncachedUsernames });\n\n response.results.forEach((result) => {\n cache.set(result.username, result.addresses[0]); // TODO: handle multiple controller addresses\n });\n }\n\n return new Map(\n usernames\n .map((name) => [name, cache.get(name)] as [string, string])\n .filter((entry): entry is [string, string] => entry[1] !== undefined),\n );\n}\n\nexport async function lookupAddresses(\n addresses: string[],\n): Promise<Map<string, string>> {\n addresses = addresses.map(num.toHex);\n const uncachedAddresses = addresses.filter((addr) => !cache.has(addr));\n\n if (uncachedAddresses.length > 0) {\n const response = await lookup({\n addresses: uncachedAddresses,\n });\n\n response.results.forEach((result) => {\n cache.set(result.addresses[0], result.username); // TODO: handle multiple controller addresses\n });\n }\n\n return new Map(\n addresses\n .map((addr) => [addr, cache.get(addr)] as [string, string])\n .filter((entry): entry is [string, string] => entry[1] !== undefined),\n );\n}\n","// src/generated/erc20-metadata.ts\nvar metadata = [\n {\n name: \"Wrapped BTC\",\n symbol: \"WBTC\",\n decimals: 8,\n l2_token_address: \"0x03fe2b97c1fd336e750087d68b9b867997fd64a2661ff3ca5a7c771641e8e7ac\",\n sort_order: 0,\n total_supply: null,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/7dcb2db2-a7a7-44af-660b-8262e057a100/logo\"\n },\n {\n name: \"USD Coin\",\n symbol: \"USDC\",\n decimals: 6,\n l2_token_address: \"0x053c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8\",\n sort_order: 5,\n total_supply: null,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/e5aaa970-a998-47e8-bd43-4a3b56b87200/logo\"\n },\n {\n name: \"LUSD Stablecoin\",\n symbol: \"LUSD\",\n decimals: 18,\n l2_token_address: \"0x070a76fd48ca0ef910631754d77dd822147fe98a569b826ec85e3c33fde586ac\",\n sort_order: 3,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/dc0ae733-5498-4afa-f475-48dba677aa00/logo\"\n },\n {\n name: \"Tether USD\",\n symbol: \"USDT\",\n decimals: 6,\n l2_token_address: \"0x068f5c6a61780768455de69077e07e89787839bf8166decfbf92b645209c0fb8\",\n sort_order: 4,\n total_supply: null,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/c8a721d1-07c3-46e4-ab4e-523977c30b00/logo\"\n },\n {\n name: \"Ether\",\n symbol: \"ETH\",\n decimals: 18,\n l2_token_address: \"0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7\",\n sort_order: 3,\n total_supply: null,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/e07829b7-0382-4e03-7ecd-a478c5aa9f00/logo\"\n },\n {\n name: \"Dai Stablecoin\",\n symbol: \"DAIv0\",\n decimals: 18,\n l2_token_address: \"0x00da114221cb83fa859dbdb4c44beeaa0bb37c7537ad5ae66fe5e0efd20e6eb3\",\n sort_order: 4,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/919e761b-56f7-4f53-32aa-5e066f7f6200/logo\"\n },\n {\n name: \"Dai Stablecoin\",\n symbol: \"DAI\",\n decimals: 18,\n l2_token_address: \"0x05574eb6b8789a91466f902c380d978e472db68170ff82a5b650b95a58ddf4ad\",\n sort_order: 4,\n total_supply: null,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/919e761b-56f7-4f53-32aa-5e066f7f6200/logo\"\n },\n {\n name: \"Legacy Starknet Wrapped Staked Ether\",\n symbol: \"wstETH-legacy\",\n decimals: 18,\n l2_token_address: \"0x042b8f0484674ca266ac5d08e4ac6a3fe65bd3129795def2dca5c34ecc5f96d2\",\n sort_order: 1,\n total_supply: null,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/26162dcc-29c2-4f5e-3acd-5e6be1f07a00/logo\"\n },\n {\n name: \"Wrapped Staked Ether\",\n symbol: \"wstETH\",\n decimals: 18,\n l2_token_address: \"0x0057912720381af14b0e5c87aa4718ed5e527eab60b3801ebf702ab09139e38b\",\n sort_order: 1,\n total_supply: null,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/dbbcbdea-1a92-437d-3701-4a5ee129d000/logo\"\n },\n {\n name: \"Rocket Pool ETH\",\n symbol: \"rETH\",\n decimals: 18,\n l2_token_address: \"0x0319111a5037cbec2b3e638cc34a3474e2d2608299f3e62866e9cc683208c610\",\n sort_order: 1,\n total_supply: null,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/c9f2d6fe-fbc6-4384-0990-923dfcb7a200/logo\"\n },\n {\n name: \"LORDS\",\n symbol: \"LORDS\",\n decimals: 18,\n l2_token_address: \"0x0124aeb495b947201f5fac96fd1138e326ad86195b98df6dec9009158a533b49\",\n sort_order: 1,\n total_supply: 509e5,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/a3bfe959-50c4-4f89-0aef-b19207d82a00/logo\"\n },\n {\n name: \"R Stablecoin\",\n symbol: \"R\",\n decimals: 18,\n l2_token_address: \"0x01fa2fb85f624600112040e1f3a848f53a37ed5a7385810063d5fe6887280333\",\n sort_order: 3,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/77612e4e-f7ee-4dba-2066-af321843ef00/logo\"\n },\n {\n name: \"Frax\",\n symbol: \"FRAX\",\n decimals: 18,\n l2_token_address: \"0x009c6b4fb13dfaa025c1383ed6190af8ed8cbb09d9588a3bb020feb152442406\",\n sort_order: 1,\n total_supply: 649462235,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/eeaf0779-e492-474c-ef19-b27843525600/logo\"\n },\n {\n name: \"Frax Share\",\n symbol: \"FXS\",\n decimals: 18,\n l2_token_address: \"0x0058efd0e73c33a848ffaa88738d128ebf0af98ea78cf3c14dc757bb02d39ffb\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/98bea621-1e4f-4d63-9689-bdaef0d56500/logo\"\n },\n {\n name: \"Staked Frax Ether\",\n symbol: \"sfrxETH\",\n decimals: 18,\n l2_token_address: \"0x04578fffc279e61b5cb0267a5f8e24b6089d40f93158fbbad2cb23b8622c9233\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/cd6fe18a-25db-4de9-758a-daf3b364ea00/logo\"\n },\n {\n name: \"Uniswap\",\n symbol: \"UNI\",\n decimals: 18,\n l2_token_address: \"0x049210ffc442172463f3177147c1aeaa36c51d152c1b0630f2364c300d4f48ee\",\n sort_order: 1,\n total_supply: 1e9,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/361b018e-bd53-4019-27c8-7cf8d9031b00/logo\"\n },\n {\n name: \"Paper\",\n symbol: \"PAPER\",\n decimals: 18,\n l2_token_address: \"0x0410466536b5ae074f7fea81e5533b8134a9fa08b3dd077dd9db08f64997d113\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/811f019a-0461-4cff-6c1e-442102863f00/logo\"\n },\n {\n name: \"StarkPepe\",\n symbol: \"xSPEPE\",\n decimals: 18,\n l2_token_address: \"0x06f15ec4b6ff0b7f7a216c4b2ccdefc96cbf114d6242292ca82971592f62273b\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n disabled: true\n },\n {\n name: \"StarkNet Token\",\n symbol: \"STRK\",\n decimals: 18,\n l2_token_address: \"0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d\",\n sort_order: 2,\n total_supply: 1e10,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/1b126320-367c-48ed-cf5a-ba7580e49600/logo\"\n },\n {\n name: \"zkLend Token\",\n symbol: \"ZEND\",\n decimals: 18,\n l2_token_address: \"0x00585c32b625999e6e5e78645ff8df7a9001cf5cf3eb6b80ccdd16cb64bd3a34\",\n sort_order: 1,\n total_supply: null,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/95515b0e-1230-4158-10f1-56888f613c00/logo\"\n },\n {\n name: \"Ekubo Protocol\",\n symbol: \"EKUBO\",\n decimals: 18,\n l2_token_address: \"0x075afe6402ad5a5c20dd25e10ec3b3986acaa647b77e4ae24b0cbc9a54a27a87\",\n sort_order: 1,\n total_supply: 1e7,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/634d9c36-2f0b-4781-93e6-72d701b5af00/logo\"\n },\n {\n name: \"SOCKS\",\n symbol: \"SOCKS\",\n decimals: 18,\n l2_token_address: \"0x023ed2ba4fb5709302c5dfd739fa7613359042f143286c115b6c7f7dc2601015\",\n sort_order: 1,\n total_supply: 1e11,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/2db5a2a6-c98e-4b80-35e0-31b489132100/logo\"\n },\n {\n name: \"Nostra\",\n symbol: \"NSTR\",\n decimals: 18,\n l2_token_address: \"0x00c530f2c0aa4c16a0806365b0898499fba372e5df7a7172dc6fe9ba777e8007\",\n sort_order: 1,\n total_supply: 1e8,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/a45c2224-17a7-4269-ea7e-3924e9755800/logo\"\n },\n {\n name: \"Carmine\",\n symbol: \"CRM\",\n decimals: 18,\n l2_token_address: \"0x51c4b1fe3bf6774b87ad0b15ef5d1472759076e42944fff9b9f641ff13e5bbe\",\n sort_order: 1,\n total_supply: 1e8,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/6ab817f1-8075-4a94-6e14-f112f1f89d00/logo\"\n },\n {\n name: \"Cash\",\n symbol: \"CASH\",\n decimals: 18,\n l2_token_address: \"0x498edfaf50ca5855666a700c25dd629d577eb9afccdf3b5977aec79aee55ada\",\n sort_order: 3,\n total_supply: null,\n hidden: false,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/6bd6d156-f509-4b51-5dfc-3ee566143600/logo\"\n },\n {\n name: \"Nums\",\n symbol: \"NUMS\",\n decimals: 18,\n l2_token_address: \"0xe5f10eddc01699dc899a30dbc3c9858148fa4aa0a47c0ffd85f887ffc4653e\",\n sort_order: 1,\n total_supply: 1,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/90868d05-cb75-4c42-278c-5a540db2cf00/logo\"\n },\n {\n name: \"Flip\",\n symbol: \"FLIP\",\n decimals: 18,\n l2_token_address: \"0x01bfe97d729138fc7c2d93c77d6d1d8a24708d5060608017d9b384adf38f04c7\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/275f0fa8-a691-471c-ace6-0eb0315dde00/logo\"\n },\n {\n name: \"Eternum Stone\",\n symbol: \"STONE\",\n decimals: 18,\n l2_token_address: \"0x439a1c010e3e1bb2d43d43411000893c0042bd88f6c701611a0ea914d426da4\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/932e7f83-a4c2-40f0-3048-35af3b194100/logo\"\n },\n {\n name: \"Eternum Coal\",\n symbol: \"COAL\",\n decimals: 18,\n l2_token_address: \"0xce635e3f241b0ae78c46a929d84a9101910188f9c4024eaa7559556503c31a\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/cf2ee180-06bf-4443-e3aa-724d7c28e800/logo\"\n },\n {\n name: \"Eternum Wood\",\n symbol: \"WOOD\",\n decimals: 18,\n l2_token_address: \"0x40d8907cec0f7ae9c364dfb12485a1314d84c129bf1898d2f3d4b7fcc7d44f4\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/1db5f954-c1ef-447e-9f8f-05bd9f3b2b00/logo\"\n },\n {\n name: \"Eternum Copper\",\n symbol: \"COPPER\",\n decimals: 18,\n l2_token_address: \"0x66ed5c928ee027a9419ace1cbea8389885161db5572a7c5c4fef2310e9bf494\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/6bbcdcc9-6146-404d-9501-92a664cf3100/logo\"\n },\n {\n name: \"Eternum Ironwood\",\n symbol: \"IRONWOOD\",\n decimals: 18,\n l2_token_address: \"0x1720cf6318bff45e62acc588680ae3cd4d5f8465b1d52cb710533c9299b031a\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/5af7c03b-e4ae-4aee-eba4-a4e2160a1d00/logo\"\n },\n {\n name: \"Eternum Obsidian\",\n symbol: \"OBSIDIAN\",\n decimals: 18,\n l2_token_address: \"0x3b6448d09dcd023507376402686261f5d6739455fa02f804907b066e488da66\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/8be9bc66-486b-4181-6804-725a1db8ad00/logo\"\n },\n {\n name: \"Eternum Gold\",\n symbol: \"GOLD\",\n decimals: 18,\n l2_token_address: \"0xdff9dca192609c4e86ab3be22c7ec1e968876c992d21986f3c542be97fa2f\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/fb9e90f7-3c2f-4c64-7e43-c3f694f35e00/logo\"\n },\n {\n name: \"Eternum Silver\",\n symbol: \"SILVER\",\n decimals: 18,\n l2_token_address: \"0x6fe21d2d4a8a05bdb70f09c9250af9870020d5dcc35f410b4a39d6605c3e353\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/e443afeb-850b-46a0-a7ba-a473306d6b00/logo\"\n },\n {\n name: \"Eternum Mithral\",\n symbol: \"MITHRAL\",\n decimals: 18,\n l2_token_address: \"0x67ba235c569c23877064b2ac6ebd4d79f32d3c00f5fab8e28a3b5700b957f6\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/33dc517f-8a66-45eb-f2c5-de5388e47500/logo\"\n },\n {\n name: \"Eternum Alchemical Silver\",\n symbol: \"ALCHEMICALSILVER\",\n decimals: 18,\n l2_token_address: \"0x3956a5301e99522038a2e7dcb9c2a89bf087ffa79310ee0a508b5538efd8ddd\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/3d2e0fd8-4af8-49a0-4bdb-691a4d6ef800/logo\"\n },\n {\n name: \"Eternum Cold Iron\",\n symbol: \"COLDIRON\",\n decimals: 18,\n l2_token_address: \"0x555d713e59d4ff96b7960447e9bc9e79bfdeab5b0eea74e3df81bce61cfbc77\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/878c0d8a-8e2c-4281-0896-9cbbb2ef9400/logo\"\n },\n {\n name: \"Eternum Deep Crystal\",\n symbol: \"DEEPCRYSTAL\",\n decimals: 18,\n l2_token_address: \"0x1d655ac834d38df7921074fc1588411e202b1af83307cbd996983aff52db3a8\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/1c2c954f-448c-476b-a4a6-19b52efe3e00/logo\"\n },\n {\n name: \"Eternum Ruby\",\n symbol: \"RUBY\",\n decimals: 18,\n l2_token_address: \"0x3d9b66720959d0e7687b898292c10e62e78626f2dba5e1909961a2ce3f86612\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/6a45b34d-3bfe-4994-45b0-f2bee8abac00/logo\"\n },\n {\n name: \"Eternum Diamonds\",\n symbol: \"DIAMONDS\",\n decimals: 18,\n l2_token_address: \"0xe03ea8ae385f64754820af5c01c36abf1b8130dd6797d3fd9d430e4114e876\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/b1fa609d-8799-4754-cdea-ab69514ca700/logo\"\n },\n {\n name: \"Eternum Hartwood\",\n symbol: \"HARTWOOD\",\n decimals: 18,\n l2_token_address: \"0x5620aa7170cd66dbcbc37d03087bfe4633ffef91d3e4d97b501de906004f79b\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/27e37e85-91bd-4ee1-0552-1e0795077400/logo\"\n },\n {\n name: \"Eternum Ignium\",\n symbol: \"IGNIUM\",\n decimals: 18,\n l2_token_address: \"0x625c1f789b03ebebc7a9322366f38ebad1f693b84b2abd8cb8f5b2748b0cdd5\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/58591e20-24fb-4353-417a-81d877a5a200/logo\"\n },\n {\n name: \"Eternum Twilight Quartz\",\n symbol: \"TWILIGHTQUARTZ\",\n decimals: 18,\n l2_token_address: \"0x35e24c02409c3cfe8d5646399a62c4d102bb782938d5f5180e92c9c62d3faf7\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/2f8cb892-e82a-4af3-bd09-316061faec00/logo\"\n },\n {\n name: \"Eternum True Ice\",\n symbol: \"TRUEICE\",\n decimals: 18,\n l2_token_address: \"0x4485f5a6e16562e1c761cd348e63256d00389e3ddf4f5d98afe7ab44c57c481\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/fe4bfc17-6553-4dc5-58d2-f452b4aa8a00/logo\"\n },\n {\n name: \"Eternum Adamantine\",\n symbol: \"ADAMANTINE\",\n decimals: 18,\n l2_token_address: \"0x367f838f85a2f5e1580d6f011e4476f581083314cff8721ba3dda9706076eed\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/13bd026b-3612-480e-0119-04cf4c505a00/logo\"\n },\n {\n name: \"Eternum Sapphire\",\n symbol: \"SAPPHIRE\",\n decimals: 18,\n l2_token_address: \"0x2f8dd022568af8f9f718aa37707a9b858529db56910633a160456838b6cbcbc\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/0ebf555f-e732-4054-f8e5-55b2ed49ba00/logo\"\n },\n {\n name: \"Eternum Ethereal Silica\",\n symbol: \"ETHEREALSILICA\",\n decimals: 18,\n l2_token_address: \"0x68b6e23cbbd58a644700f55e96c83580921e9f521b6e5175396b53ba7910e7d\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/f02a5b43-bfcf-408c-7d1b-fcfe68b02d00/logo\"\n },\n {\n name: \"Eternum Dragon Hide\",\n symbol: \"DRAGONHIDE\",\n decimals: 18,\n l2_token_address: \"0x3bf856515bece3c93f5061b7941b8645f817a0acab93c758b8c7b4bc0afa3c6\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/e74955fc-5c8a-4dff-4882-a49a46a5a800/logo\"\n },\n {\n name: \"Eternum Ancient Fragment\",\n symbol: \"ANCIENTFRAGMENT\",\n decimals: 18,\n l2_token_address: \"0x0695b08ecdfdd828c2e6267da62f59e6d7543e690ef56a484df25c8566b332a5\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/9af855b7-4790-4390-9466-6bed4481ab00/logo\"\n },\n {\n name: \"Eternum Donkey\",\n symbol: \"DONKEY\",\n decimals: 18,\n l2_token_address: \"0x264be95a4a2ace20add68cb321acdccd2f9f8440ee1c7abd85da44ddab01085\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/20817378-a45e-4521-f464-10f6dd13c500/logo\"\n },\n {\n name: \"Eternum Knight\",\n symbol: \"KNIGHT\",\n decimals: 18,\n l2_token_address: \"0xac965f9e67164723c16735a9da8dbc9eb8e43b1bd0323591e87c056badf606\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/8787ed1f-af5c-4873-c01a-55f05e999a00/logo\"\n },\n {\n name: \"Eternum Crossbowman\",\n symbol: \"CROSSBOWMAN\",\n decimals: 18,\n l2_token_address: \"0x67e4ac00a241be06ba6afc11fa2715ec7da0c42c05a67ef6ecfcfeda725aaa8\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/dec7f31b-4b1d-46bb-4fca-c0253cf55a00/logo\"\n },\n {\n name: \"Eternum Paladin\",\n symbol: \"PALADIN\",\n decimals: 18,\n l2_token_address: \"0x3bc86299bee061c7c8d7546ccb62b9daf9bffc653b1508facb722c6593874bc\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/7d2cd5a5-f38a-49f6-11f8-ba3b59a59e00/logo\"\n },\n {\n name: \"Eternum Wheat\",\n symbol: \"WHEAT\",\n decimals: 18,\n l2_token_address: \"0x57a3f1ee475e072ce3be41785c0e889b7295d7a0dcc22b992c5b9408dbeb280\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/c338b6a8-77c4-4dd6-34f5-1af0d3fb1e00/logo\"\n },\n {\n name: \"Eternum Fish\",\n symbol: \"FISH\",\n decimals: 18,\n l2_token_address: \"0x27719173cfe10f1aa38d2aaed0a075b6077290f1e817aa3485d2b828394f4d9\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/6deef27f-df40-4248-4e1b-ed1d79a3f000/logo\"\n },\n {\n name: \"Fools\",\n symbol: \"FOOLS\",\n decimals: 18,\n l2_token_address: \"0x068a7a07e08fc3e723a878223d00f669106780d5ea6665eb15d893476d47bf3b\",\n sort_order: 1,\n total_supply: null,\n logo_url: \"https://assets.underware.gg/pistols/fools.svg\"\n },\n {\n name: \"Fame\",\n symbol: \"FAME\",\n decimals: 18,\n l2_token_address: \"0x02549653a4ae1ff8d04a20b8820a49cbe97486c536ec0e4c8f68aa33d80067cf\",\n sort_order: 1,\n total_supply: null,\n logo_url: \"https://assets.underware.gg/pistols/fame.svg\"\n }\n];\n\n// configs/cartridge/config.json\nvar config_default = {\n origin: \"*\",\n theme: {\n name: \"Cartridge\",\n icon: \"icon.svg\"\n }\n};\n\n// src/config-loader.ts\nvar CONFIG_BASE_URL = \"https://static.cartridge.gg/presets\";\nasync function getConfigsIndex() {\n try {\n const response = await fetch(`${CONFIG_BASE_URL}/index.json`);\n if (!response.ok) {\n throw new Error(`Failed to load configs index: ${response.statusText}`);\n }\n return await response.json();\n } catch (error) {\n console.error(\"Error loading configs index:\", error);\n return { configs: [], baseUrl: CONFIG_BASE_URL };\n }\n}\nasync function getAvailableConfigs() {\n const indexData = await getConfigsIndex();\n return indexData.configs;\n}\nasync function loadConfig(configName) {\n try {\n const indexData = await getConfigsIndex();\n const baseUrl = indexData.baseUrl || CONFIG_BASE_URL;\n const prefix = `${baseUrl}/${configName}`;\n const response = await fetch(`${prefix}/config.json`);\n if (!response.ok) {\n throw new Error(\n `Failed to load config ${configName}: ${response.statusText}`\n );\n }\n const config = await response.json();\n if (config && config.theme) {\n if (config.theme.icon && !config.theme.icon.startsWith(\"http\")) {\n config.theme.icon = `${prefix}/${config.theme.icon}`;\n }\n if (config.theme.cover) {\n if (typeof config.theme.cover === \"string\") {\n if (!config.theme.cover.startsWith(\"http\")) {\n config.theme.cover = `${prefix}/${config.theme.cover}`;\n }\n } else {\n if (config.theme.cover.light && !config.theme.cover.light.startsWith(\"http\")) {\n config.theme.cover.light = `${prefix}/${config.theme.cover.light}`;\n }\n if (config.theme.cover.dark && !config.theme.cover.dark.startsWith(\"http\")) {\n config.theme.cover.dark = `${prefix}/${config.theme.cover.dark}`;\n }\n }\n }\n const prefixOptimizedImageSet = (imageSet) => {\n if (!imageSet) return;\n for (const format in imageSet) {\n if (imageSet[format]) {\n for (const size in imageSet[format]) {\n if (imageSet[format][size] && !imageSet[format][size].startsWith(\"http\")) {\n imageSet[format][size] = `${prefix}/${imageSet[format][size]}`;\n }\n }\n }\n }\n };\n if (config.theme.optimizedIcon) {\n prefixOptimizedImageSet(config.theme.optimizedIcon);\n }\n if (config.theme.optimizedCover) {\n if (typeof config.theme.optimizedCover === \"string\") {\n if (!config.theme.optimizedCover.startsWith(\"http\")) {\n config.theme.optimizedCover = `${prefix}/${config.theme.optimizedCover}`;\n }\n } else if (config.theme.optimizedCover.light || config.theme.optimizedCover.dark) {\n const themeVal = config.theme.optimizedCover;\n if (themeVal.light) {\n prefixOptimizedImageSet(themeVal.light);\n }\n if (themeVal.dark) {\n prefixOptimizedImageSet(themeVal.dark);\n }\n } else {\n prefixOptimizedImageSet(config.theme.optimizedCover);\n }\n }\n }\n return config;\n } catch (error) {\n console.error(`Error loading config ${configName}:`, error);\n return null;\n }\n}\nasync function loadAllConfigs() {\n const indexData = await getConfigsIndex();\n const availableConfigs = indexData.configs;\n const baseUrl = indexData.baseUrl || CONFIG_BASE_URL;\n const configsMap = {};\n await Promise.all(\n availableConfigs.map(async (configName) => {\n try {\n const response = await fetch(`${baseUrl}/${configName}/config.json`);\n if (response.ok) {\n const config = await response.json();\n configsMap[configName] = config;\n }\n } catch (error) {\n console.error(`Error loading config ${configName}:`, error);\n }\n })\n );\n return configsMap;\n}\n\n// src/index.ts\nconfig_default.theme.icon = \"https://static.cartridge.gg/presets/cartridge/icon.svg\";\nvar erc20Metadata = metadata;\nvar defaultTheme = config_default.theme;\nexport {\n defaultTheme,\n erc20Metadata,\n getAvailableConfigs,\n getConfigsIndex,\n loadAllConfigs,\n loadConfig\n};\n//# sourceMappingURL=index.js.map"],"names":["ControllerAccount","WalletAccount","provider","rpcUrl","address","keychain","options","modal","calls","toArray","resolve","reject","sessionExecute","ResponseCodes","manualExecute","typedData","sessionSign","manualSign","MessageType","Resolution","ErrorCode","NativeErrorName","NativeEventType","createDestructor","localName","log","callbacks","destroyed","error","callback","createLogger","debug","args","DEFAULT_PORT_BY_PROTOCOL","URL_REGEX","opaqueOriginSchemes","getOriginFromSrc","src","scheme","location","regexResult","protocol","hostname","port","portSuffix","serializeError","name","message","stack","deserializeError","obj","deserializedError","key","connectCallReceiver","info","serializedMethods","local","remote","originForSending","originForReceiving","handleMessageEvent","event","callMessage","methodName","id","createPromiseHandler","resolution","returnValue","err","errorReplyMessage","generateId","KEY_PATH_DELIMITER","keyPathToSegments","keyPath","segmentsToKeyPath","segments","createKeyPath","prefix","setAtKeyPath","subject","value","prevSubject","idx","serializeMethods","methods","flattenedMethods","deserializeMethods","connectCallSender","callSender","methodKeyPaths","destroyConnection","createMethodProxy","iframeRemoved","replyMessage","api","handleAckMessageFactory","childOrigin","destructor","destroy","onDestroy","destroyCallReceiver","receiverMethodNames","receiverMethodName","destroyCallSender","handleSynMessageFactory","synAckMessage","CHECK_IFRAME_IN_DOC_INTERVAL","monitorIframeRemoval","iframe","checkIframeInDocIntervalId","startConnectionTimeout","timeout","timeoutId","validateIframeHasSrcOrSrcDoc","connectToChild","handleSynMessage","handleAckMessage","stopConnectionTimeout","handleMessage","IFrame","url","preset","onClose","onConnect","container","e","_origin","child","observer","existingController","version","defineProperties","target","values","types","stringify","HEX","result","i","keys","k","makeError","code","shortMessage","details","assert","check","assertArgument","accum","form","_getBytes","copy","offset","getBytes","HexCharacters","hexlify","data","bytes","v","number","n","b","lengths","exists","instance","checkFinished","output","out","min","u8a","a","u32","arr","isLE","utf8ToBytes","str","toBytes","Hash","wrapConstructor","hashCons","hashC","msg","tmp","U32_MASK64","_32n","fromBig","le","split","lst","Ah","Al","h","l","rotlSH","s","rotlSL","rotlBH","rotlBL","SHA3_PI","SHA3_ROTL","_SHA3_IOTA","_0n","_1n","_2n","_7n","_256n","_0x71n","round","R","x","y","t","j","SHA3_IOTA_H","SHA3_IOTA_L","rotlH","rotlL","keccakP","rounds","B","idx1","idx0","B0","B1","Th","Tl","curH","curL","shift","PI","Keccak","blockLen","suffix","outputLen","enableXOF","state","len","pos","take","bufferOut","to","gen","keccak_256","locked","_keccak256","__keccak256","keccak256","_data","func","BN_0","BN_36","getChecksumAddress","chars","expanded","hashed","ibanLookup","safeDigits","ibanChecksum","c","block","checksum","Base36","fromBase36","getAddress","ArgentWallet","available","wallet","connectorData","connect","InjectedConnector","sig","_txn","_chainId","_tokenAddress","requestProviders","listener","handler","createStore","listeners","providerDetails","request","providerDetail","unwatch","rdns","emitImmediately","MetaMaskWallet","MetaMaskSDK","accounts","account","transaction","ethereum","chainId","tokenAddress","balance","PhantomWallet","response","encodedMessage","serailized_txn","txn","Transaction","RABBY_RDNS","RabbyWallet","WalletBridge","metamask","phantom","argent","rabby","type","identifier","adapter","operation","responseType","errorMessage","walletType","checkSummedAddress","KeychainIFrame","policies","slot","namespace","tokens","iframeOptions","_url","KEYCHAIN_URL","walletBridge","ControllerProvider","BaseProvider","chains","defaultChainId","constants","NotReadyToConnect","_chain","tab","username","at","origin","_policy","chain","availableChains","shortString","starterpackId","currentChainId","res","parseChainId","isMainnet","isSepolia","isCartridgeRpc","isLocalhost","interval","startTime","cache","lookup","API_URL","lookupUsernames","usernames","uncachedUsernames","entry","lookupAddresses","addresses","num","uncachedAddresses","addr","metadata","config_default","CONFIG_BASE_URL","getConfigsIndex","getAvailableConfigs","loadConfig","configName","config","prefixOptimizedImageSet","imageSet","format","size","themeVal","loadAllConfigs","indexData","availableConfigs","baseUrl","configsMap","erc20Metadata","defaultTheme"],"mappings":"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","x_google_ignoreList":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,17,18,19,20,21,22,23,24,25,26,28,29,37]}
1
+ {"version":3,"file":"index.js","sources":["../src/account.ts","../../../node_modules/.pnpm/@cartridge+penpal@6.2.4/node_modules/@cartridge/penpal/lib/enums.js","../../../node_modules/.pnpm/@cartridge+penpal@6.2.4/node_modules/@cartridge/penpal/lib/createDestructor.js","../../../node_modules/.pnpm/@cartridge+penpal@6.2.4/node_modules/@cartridge/penpal/lib/createLogger.js","../../../node_modules/.pnpm/@cartridge+penpal@6.2.4/node_modules/@cartridge/penpal/lib/parent/getOriginFromSrc.js","../../../node_modules/.pnpm/@cartridge+penpal@6.2.4/node_modules/@cartridge/penpal/lib/errorSerialization.js","../../../node_modules/.pnpm/@cartridge+penpal@6.2.4/node_modules/@cartridge/penpal/lib/connectCallReceiver.js","../../../node_modules/.pnpm/@cartridge+penpal@6.2.4/node_modules/@cartridge/penpal/lib/generateId.js","../../../node_modules/.pnpm/@cartridge+penpal@6.2.4/node_modules/@cartridge/penpal/lib/methodSerialization.js","../../../node_modules/.pnpm/@cartridge+penpal@6.2.4/node_modules/@cartridge/penpal/lib/connectCallSender.js","../../../node_modules/.pnpm/@cartridge+penpal@6.2.4/node_modules/@cartridge/penpal/lib/parent/handleAckMessageFactory.js","../../../node_modules/.pnpm/@cartridge+penpal@6.2.4/node_modules/@cartridge/penpal/lib/parent/handleSynMessageFactory.js","../../../node_modules/.pnpm/@cartridge+penpal@6.2.4/node_modules/@cartridge/penpal/lib/parent/monitorIframeRemoval.js","../../../node_modules/.pnpm/@cartridge+penpal@6.2.4/node_modules/@cartridge/penpal/lib/startConnectionTimeout.js","../../../node_modules/.pnpm/@cartridge+penpal@6.2.4/node_modules/@cartridge/penpal/lib/parent/validateIframeHasSrcOrSrcDoc.js","../../../node_modules/.pnpm/@cartridge+penpal@6.2.4/node_modules/@cartridge/penpal/lib/parent/connectToChild.js","../src/iframe/base.ts","../../../node_modules/.pnpm/ethers@6.13.7_bufferutil@4.0.9_utf-8-validate@5.0.10/node_modules/ethers/lib.esm/_version.js","../../../node_modules/.pnpm/ethers@6.13.7_bufferutil@4.0.9_utf-8-validate@5.0.10/node_modules/ethers/lib.esm/utils/properties.js","../../../node_modules/.pnpm/ethers@6.13.7_bufferutil@4.0.9_utf-8-validate@5.0.10/node_modules/ethers/lib.esm/utils/errors.js","../../../node_modules/.pnpm/ethers@6.13.7_bufferutil@4.0.9_utf-8-validate@5.0.10/node_modules/ethers/lib.esm/utils/data.js","../../../node_modules/.pnpm/@noble+hashes@1.3.2/node_modules/@noble/hashes/esm/_assert.js","../../../node_modules/.pnpm/@noble+hashes@1.3.2/node_modules/@noble/hashes/esm/utils.js","../../../node_modules/.pnpm/@noble+hashes@1.3.2/node_modules/@noble/hashes/esm/_u64.js","../../../node_modules/.pnpm/@noble+hashes@1.3.2/node_modules/@noble/hashes/esm/sha3.js","../../../node_modules/.pnpm/ethers@6.13.7_bufferutil@4.0.9_utf-8-validate@5.0.10/node_modules/ethers/lib.esm/crypto/keccak.js","../../../node_modules/.pnpm/ethers@6.13.7_bufferutil@4.0.9_utf-8-validate@5.0.10/node_modules/ethers/lib.esm/address/address.js","../src/wallets/argent/index.ts","../../../node_modules/.pnpm/mipd@0.0.7_typescript@5.8.3/node_modules/mipd/dist/esm/utils.js","../../../node_modules/.pnpm/mipd@0.0.7_typescript@5.8.3/node_modules/mipd/dist/esm/store.js","../src/wallets/metamask/index.ts","../src/wallets/phantom/index.ts","../src/wallets/rabby/index.ts","../src/wallets/bridge.ts","../src/iframe/keychain.ts","../src/controller.ts","../src/lookup.ts","../../../node_modules/.pnpm/@cartridge+presets@https+++codeload.github.com+cartridge-gg+presets+tar.gz+d246ec1/node_modules/@cartridge/presets/dist/index.js"],"sourcesContent":["import {\n InvokeFunctionResponse,\n TypedData,\n WalletAccount,\n Call,\n AllowArray,\n} from \"starknet\";\n\nimport {\n ConnectError,\n Keychain,\n KeychainOptions,\n Modal,\n ResponseCodes,\n} from \"./types\";\nimport { AsyncMethodReturns } from \"@cartridge/penpal\";\nimport BaseProvider from \"./provider\";\nimport { toArray } from \"./utils\";\nimport { SIGNATURE } from \"@starknet-io/types-js\";\n\nclass ControllerAccount extends WalletAccount {\n private keychain: AsyncMethodReturns<Keychain>;\n private modal: Modal;\n private options?: KeychainOptions;\n\n constructor(\n provider: BaseProvider,\n rpcUrl: string,\n address: string,\n keychain: AsyncMethodReturns<Keychain>,\n options: KeychainOptions,\n modal: Modal,\n ) {\n super({ nodeUrl: rpcUrl }, provider, address);\n\n this.keychain = keychain;\n this.options = options;\n this.modal = modal;\n }\n\n /**\n * Invoke execute function in account contract\n *\n * @param calls the invocation object or an array of them, containing:\n * - contractAddress - the address of the contract\n * - entrypoint - the entrypoint of the contract\n * - calldata - (defaults to []) the calldata\n * - signature - (defaults to []) the signature\n * @param abis (optional) the abi of the contract for better displaying\n *\n * @returns response from addTransaction\n */\n async execute(calls: AllowArray<Call>): Promise<InvokeFunctionResponse> {\n calls = toArray(calls);\n\n return new Promise(async (resolve, reject) => {\n const sessionExecute = await this.keychain.execute(\n calls,\n undefined,\n undefined,\n false,\n this.options?.feeSource,\n );\n\n // Session call succeeded\n if (sessionExecute.code === ResponseCodes.SUCCESS) {\n resolve(sessionExecute as InvokeFunctionResponse);\n return;\n }\n\n // Propagates session txn error back to caller\n if (\n this.options?.propagateSessionErrors &&\n sessionExecute.code !== ResponseCodes.USER_INTERACTION_REQUIRED\n ) {\n reject((sessionExecute as ConnectError).error);\n return;\n }\n\n // Session call or Paymaster flow failed.\n // Session not avaialble, manual flow fallback\n this.modal.open();\n const manualExecute = await this.keychain.execute(\n calls,\n undefined,\n undefined,\n true,\n (sessionExecute as ConnectError).error,\n );\n\n // Manual call succeeded\n if (manualExecute.code === ResponseCodes.SUCCESS) {\n resolve(manualExecute as InvokeFunctionResponse);\n this.modal.close();\n return;\n }\n\n reject((manualExecute as ConnectError).error);\n return;\n });\n }\n\n /**\n * Sign an JSON object for off-chain usage with the starknet private key and return the signature\n * This adds a message prefix so it cant be interchanged with transactions\n *\n * @param json - JSON object to be signed\n * @returns the signature of the JSON object\n * @throws {Error} if the JSON object is not a valid JSON\n */\n async signMessage(typedData: TypedData): Promise<SIGNATURE> {\n return new Promise(async (resolve, reject) => {\n const sessionSign = await this.keychain.signMessage(typedData, \"\", true);\n\n // Session sign succeeded\n if (!(\"code\" in sessionSign)) {\n resolve(sessionSign as SIGNATURE);\n return;\n }\n\n // Session not avaialble, manual flow fallback\n this.modal.open();\n const manualSign = await this.keychain.signMessage(typedData, \"\", false);\n\n if (!(\"code\" in manualSign)) {\n resolve(manualSign as SIGNATURE);\n } else {\n reject((manualSign as ConnectError).error);\n }\n this.modal.close();\n });\n }\n}\n\nexport default ControllerAccount;\n","export var MessageType;\n(function (MessageType) {\n MessageType[\"Call\"] = \"call\";\n MessageType[\"Reply\"] = \"reply\";\n MessageType[\"Syn\"] = \"syn\";\n MessageType[\"SynAck\"] = \"synAck\";\n MessageType[\"Ack\"] = \"ack\";\n})(MessageType || (MessageType = {}));\nexport var Resolution;\n(function (Resolution) {\n Resolution[\"Fulfilled\"] = \"fulfilled\";\n Resolution[\"Rejected\"] = \"rejected\";\n})(Resolution || (Resolution = {}));\nexport var ErrorCode;\n(function (ErrorCode) {\n ErrorCode[\"ConnectionDestroyed\"] = \"ConnectionDestroyed\";\n ErrorCode[\"ConnectionTimeout\"] = \"ConnectionTimeout\";\n ErrorCode[\"NoIframeSrc\"] = \"NoIframeSrc\";\n})(ErrorCode || (ErrorCode = {}));\nexport var NativeErrorName;\n(function (NativeErrorName) {\n NativeErrorName[\"DataCloneError\"] = \"DataCloneError\";\n})(NativeErrorName || (NativeErrorName = {}));\nexport var NativeEventType;\n(function (NativeEventType) {\n NativeEventType[\"Message\"] = \"message\";\n})(NativeEventType || (NativeEventType = {}));\n","export default (localName, log) => {\n const callbacks = [];\n let destroyed = false;\n return {\n destroy(error) {\n if (!destroyed) {\n destroyed = true;\n log(`${localName}: Destroying connection`);\n callbacks.forEach((callback) => {\n callback(error);\n });\n }\n },\n onDestroy(callback) {\n destroyed ? callback() : callbacks.push(callback);\n },\n };\n};\n","export default (debug) => {\n /**\n * Logs a message if debug is enabled.\n */\n return (...args) => {\n if (debug) {\n console.log('[Penpal]', ...args); // eslint-disable-line no-console\n }\n };\n};\n","const DEFAULT_PORT_BY_PROTOCOL = {\n 'http:': '80',\n 'https:': '443',\n};\nconst URL_REGEX = /^(https?:)?\\/\\/([^/:]+)?(:(\\d+))?/;\nconst opaqueOriginSchemes = ['file:', 'data:'];\n/**\n * Converts a src value into an origin.\n */\nexport default (src) => {\n if (src && opaqueOriginSchemes.find((scheme) => src.startsWith(scheme))) {\n // The origin of the child document is an opaque origin and its\n // serialization is \"null\"\n // https://html.spec.whatwg.org/multipage/origin.html#origin\n return 'null';\n }\n // Note that if src is undefined, then srcdoc is being used instead of src\n // and we can follow this same logic below to get the origin of the parent,\n // which is the origin that we will need to use.\n const location = document.location;\n const regexResult = URL_REGEX.exec(src);\n let protocol;\n let hostname;\n let port;\n if (regexResult) {\n // It's an absolute URL. Use the parsed info.\n // regexResult[1] will be undefined if the URL starts with //\n protocol = regexResult[1] ? regexResult[1] : location.protocol;\n hostname = regexResult[2];\n port = regexResult[4];\n }\n else {\n // It's a relative path. Use the current location's info.\n protocol = location.protocol;\n hostname = location.hostname;\n port = location.port;\n }\n // If the port is the default for the protocol, we don't want to add it to the origin string\n // or it won't match the message's event.origin.\n const portSuffix = port && port !== DEFAULT_PORT_BY_PROTOCOL[protocol] ? `:${port}` : '';\n return `${protocol}//${hostname}${portSuffix}`;\n};\n","/**\n * Converts an error object into a plain object.\n */\nexport const serializeError = ({ name, message, stack, }) => ({\n name,\n message,\n stack,\n});\n/**\n * Converts a plain object into an error object.\n */\nexport const deserializeError = (obj) => {\n const deserializedError = new Error();\n // @ts-ignore\n Object.keys(obj).forEach((key) => (deserializedError[key] = obj[key]));\n return deserializedError;\n};\n","import { serializeError } from './errorSerialization';\nimport { MessageType, NativeEventType, NativeErrorName, Resolution, } from './enums';\n/**\n * Listens for \"call\" messages coming from the remote, executes the corresponding method, and\n * responds with the return value.\n */\nexport default (info, serializedMethods, log) => {\n const { localName, local, remote, originForSending, originForReceiving, } = info;\n let destroyed = false;\n const handleMessageEvent = (event) => {\n if (event.source !== remote || event.data.penpal !== MessageType.Call) {\n return;\n }\n if (originForReceiving !== '*' && event.origin !== originForReceiving) {\n log(`${localName} received message from origin ${event.origin} which did not match expected origin ${originForReceiving}`);\n return;\n }\n const callMessage = event.data;\n const { methodName, args, id } = callMessage;\n log(`${localName}: Received ${methodName}() call`);\n const createPromiseHandler = (resolution) => {\n return (returnValue) => {\n log(`${localName}: Sending ${methodName}() reply`);\n if (destroyed) {\n // It's possible to throw an error here, but it would need to be thrown asynchronously\n // and would only be catchable using window.onerror. This is because the consumer\n // is merely returning a value from their method and not calling any function\n // that they could wrap in a try-catch. Even if the consumer were to catch the error,\n // the value of doing so is questionable. Instead, we'll just log a message.\n log(`${localName}: Unable to send ${methodName}() reply due to destroyed connection`);\n return;\n }\n const message = {\n penpal: MessageType.Reply,\n id,\n resolution,\n returnValue,\n };\n if (resolution === Resolution.Rejected &&\n returnValue instanceof Error) {\n message.returnValue = serializeError(returnValue);\n message.returnValueIsError = true;\n }\n try {\n remote.postMessage(message, originForSending);\n }\n catch (err) {\n // If a consumer attempts to send an object that's not cloneable (e.g., window),\n // we want to ensure the receiver's promise gets rejected.\n if (err.name === NativeErrorName.DataCloneError) {\n const errorReplyMessage = {\n penpal: MessageType.Reply,\n id,\n resolution: Resolution.Rejected,\n returnValue: serializeError(err),\n returnValueIsError: true,\n };\n remote.postMessage(errorReplyMessage, originForSending);\n }\n throw err;\n }\n };\n };\n new Promise((resolve) => resolve(serializedMethods[methodName]\n .call(serializedMethods, event.origin)\n .apply(serializedMethods, args))).then(createPromiseHandler(Resolution.Fulfilled), createPromiseHandler(Resolution.Rejected));\n };\n local.addEventListener(NativeEventType.Message, handleMessageEvent);\n return () => {\n destroyed = true;\n local.removeEventListener(NativeEventType.Message, handleMessageEvent);\n };\n};\n","let id = 0;\n/**\n * @return {number} A unique ID (not universally unique)\n */\nexport default () => ++id;\n","const KEY_PATH_DELIMITER = '.';\nconst keyPathToSegments = (keyPath) => keyPath ? keyPath.split(KEY_PATH_DELIMITER) : [];\nconst segmentsToKeyPath = (segments) => segments.join(KEY_PATH_DELIMITER);\nconst createKeyPath = (key, prefix) => {\n const segments = keyPathToSegments(prefix || '');\n segments.push(key);\n return segmentsToKeyPath(segments);\n};\n/**\n * Given a `keyPath`, set it to be `value` on `subject`, creating any intermediate\n * objects along the way.\n *\n * @param {Object} subject The object on which to set value.\n * @param {string} keyPath The key path at which to set value.\n * @param {Object} value The value to store at the given key path.\n * @returns {Object} Updated subject.\n */\nexport const setAtKeyPath = (subject, keyPath, value) => {\n const segments = keyPathToSegments(keyPath);\n segments.reduce((prevSubject, key, idx) => {\n if (typeof prevSubject[key] === 'undefined') {\n prevSubject[key] = {};\n }\n if (idx === segments.length - 1) {\n prevSubject[key] = value;\n }\n return prevSubject[key];\n }, subject);\n return subject;\n};\n/**\n * Given a dictionary of (nested) keys to function, flatten them to a map\n * from key path to function.\n *\n * @param {Object} methods The (potentially nested) object to serialize.\n * @param {string} prefix A string with which to prefix entries. Typically not intended to be used by consumers.\n * @returns {Object} An map from key path in `methods` to functions.\n */\nexport const serializeMethods = (methods, prefix) => {\n const flattenedMethods = {};\n Object.keys(methods).forEach((key) => {\n const value = methods[key];\n const keyPath = createKeyPath(key, prefix);\n if (typeof value === 'object') {\n // Recurse into any nested children.\n Object.assign(flattenedMethods, serializeMethods(value, keyPath));\n }\n if (typeof value === 'function') {\n // If we've found a method, expose it.\n flattenedMethods[keyPath] = value;\n }\n });\n return flattenedMethods;\n};\n/**\n * Given a map of key paths to functions, unpack the key paths to an object.\n *\n * @param {Object} flattenedMethods A map of key paths to functions to unpack.\n * @returns {Object} A (potentially nested) map of functions.\n */\nexport const deserializeMethods = (flattenedMethods) => {\n const methods = {};\n for (const keyPath in flattenedMethods) {\n setAtKeyPath(methods, keyPath, flattenedMethods[keyPath]);\n }\n return methods;\n};\n","import generateId from './generateId';\nimport { deserializeError } from './errorSerialization';\nimport { deserializeMethods } from './methodSerialization';\nimport { ErrorCode, MessageType, NativeEventType, Resolution } from './enums';\n/**\n * Augments an object with methods that match those defined by the remote. When these methods are\n * called, a \"call\" message will be sent to the remote, the remote's corresponding method will be\n * executed, and the method's return value will be returned via a message.\n * @param {Object} callSender Sender object that should be augmented with methods.\n * @param {Object} info Information about the local and remote windows.\n * @param {Array} methodKeyPaths Key paths of methods available to be called on the remote.\n * @param {Promise} destructionPromise A promise resolved when destroy() is called on the penpal\n * connection.\n * @returns {Object} The call sender object with methods that may be called.\n */\nexport default (callSender, info, methodKeyPaths, destroyConnection, log) => {\n const { localName, local, remote, originForSending, originForReceiving, } = info;\n let destroyed = false;\n log(`${localName}: Connecting call sender`);\n const createMethodProxy = (methodName) => {\n return (...args) => {\n log(`${localName}: Sending ${methodName}() call`);\n // This handles the case where the iframe has been removed from the DOM\n // (and therefore its window closed), the consumer has not yet\n // called destroy(), and the user calls a method exposed by\n // the remote. We detect the iframe has been removed and force\n // a destroy() immediately so that the consumer sees the error saying\n // the connection has been destroyed. We wrap this check in a try catch\n // because Edge throws an \"Object expected\" error when accessing\n // contentWindow.closed on a contentWindow from an iframe that's been\n // removed from the DOM.\n let iframeRemoved;\n try {\n if (remote.closed) {\n iframeRemoved = true;\n }\n }\n catch (e) {\n iframeRemoved = true;\n }\n if (iframeRemoved) {\n destroyConnection();\n }\n if (destroyed) {\n const error = new Error(`Unable to send ${methodName}() call due ` + `to destroyed connection`);\n error.code = ErrorCode.ConnectionDestroyed;\n throw error;\n }\n return new Promise((resolve, reject) => {\n const id = generateId();\n const handleMessageEvent = (event) => {\n if (event.source !== remote ||\n event.data.penpal !== MessageType.Reply ||\n event.data.id !== id) {\n return;\n }\n if (originForReceiving !== '*' &&\n event.origin !== originForReceiving) {\n log(`${localName} received message from origin ${event.origin} which did not match expected origin ${originForReceiving}`);\n return;\n }\n const replyMessage = event.data;\n log(`${localName}: Received ${methodName}() reply`);\n local.removeEventListener(NativeEventType.Message, handleMessageEvent);\n let returnValue = replyMessage.returnValue;\n if (replyMessage.returnValueIsError) {\n returnValue = deserializeError(returnValue);\n }\n (replyMessage.resolution === Resolution.Fulfilled ? resolve : reject)(returnValue);\n };\n local.addEventListener(NativeEventType.Message, handleMessageEvent);\n const callMessage = {\n penpal: MessageType.Call,\n id,\n methodName,\n args,\n };\n remote.postMessage(callMessage, originForSending);\n });\n };\n };\n // Wrap each method in a proxy which sends it to the corresponding receiver.\n const flattenedMethods = methodKeyPaths.reduce((api, name) => {\n api[name] = createMethodProxy(name);\n return api;\n }, {});\n // Unpack the structure of the provided methods object onto the CallSender, exposing\n // the methods in the same shape they were provided.\n Object.assign(callSender, deserializeMethods(flattenedMethods));\n return () => {\n destroyed = true;\n };\n};\n","import connectCallReceiver from '../connectCallReceiver';\nimport connectCallSender from '../connectCallSender';\n/**\n * Handles an ACK handshake message.\n */\nexport default (serializedMethods, childOrigin, originForSending, destructor, log) => {\n const { destroy, onDestroy } = destructor;\n let destroyCallReceiver;\n let receiverMethodNames;\n // We resolve the promise with the call sender. If the child reconnects\n // (for example, after refreshing or navigating to another page that\n // uses Penpal, we'll update the call sender with methods that match the\n // latest provided by the child.\n const callSender = {};\n return (event) => {\n if (childOrigin !== '*' && event.origin !== childOrigin) {\n log(`Parent: Handshake - Received ACK message from origin ${event.origin} which did not match expected origin ${childOrigin}`);\n return;\n }\n log('Parent: Handshake - Received ACK');\n const info = {\n localName: 'Parent',\n local: window,\n remote: event.source,\n originForSending: originForSending,\n originForReceiving: childOrigin,\n };\n // If the child reconnected, we need to destroy the prior call receiver\n // before setting up a new one.\n if (destroyCallReceiver) {\n destroyCallReceiver();\n }\n destroyCallReceiver = connectCallReceiver(info, serializedMethods, log);\n onDestroy(destroyCallReceiver);\n // If the child reconnected, we need to remove the methods from the\n // previous call receiver off the sender.\n if (receiverMethodNames) {\n receiverMethodNames.forEach((receiverMethodName) => {\n delete callSender[receiverMethodName];\n });\n }\n receiverMethodNames = event.data.methodNames;\n const destroyCallSender = connectCallSender(callSender, info, receiverMethodNames, destroy, log);\n onDestroy(destroyCallSender);\n return callSender;\n };\n};\n","import { MessageType } from '../enums';\n/**\n * Handles a SYN handshake message.\n */\nexport default (log, serializedMethods, childOrigin, originForSending) => {\n return (event) => {\n // Under specific timing circumstances, we can receive an event\n // whose source is null. This seems to happen when the child iframe is\n // removed from the DOM about the same time it has sent the SYN event.\n // https://github.com/Aaronius/penpal/issues/85\n if (!event.source) {\n return;\n }\n if (childOrigin !== '*' && event.origin !== childOrigin) {\n log(`Parent: Handshake - Received SYN message from origin ${event.origin} which did not match expected origin ${childOrigin}`);\n return;\n }\n log('Parent: Handshake - Received SYN, responding with SYN-ACK');\n const synAckMessage = {\n penpal: MessageType.SynAck,\n methodNames: Object.keys(serializedMethods),\n };\n event.source.postMessage(synAckMessage, originForSending);\n };\n};\n","const CHECK_IFRAME_IN_DOC_INTERVAL = 60000;\n/**\n * Monitors for iframe removal and destroys connection if iframe\n * is found to have been removed from DOM. This is to prevent memory\n * leaks when the iframe is removed from the document and the consumer\n * hasn't called destroy(). Without this, event listeners attached to\n * the window would stick around and since the event handlers have a\n * reference to the iframe in their closures, the iframe would stick\n * around too.\n */\nexport default (iframe, destructor) => {\n const { destroy, onDestroy } = destructor;\n const checkIframeInDocIntervalId = setInterval(() => {\n if (!iframe.isConnected) {\n clearInterval(checkIframeInDocIntervalId);\n destroy();\n }\n }, CHECK_IFRAME_IN_DOC_INTERVAL);\n onDestroy(() => {\n clearInterval(checkIframeInDocIntervalId);\n });\n};\n","import { ErrorCode } from './enums';\n/**\n * Starts a timeout and calls the callback with an error\n * if the timeout completes before the stop function is called.\n */\nexport default (timeout, callback) => {\n let timeoutId;\n if (timeout !== undefined) {\n timeoutId = window.setTimeout(() => {\n const error = new Error(`Connection timed out after ${timeout}ms`);\n error.code = ErrorCode.ConnectionTimeout;\n callback(error);\n }, timeout);\n }\n return () => {\n clearTimeout(timeoutId);\n };\n};\n","import { ErrorCode } from '../enums';\nexport default (iframe) => {\n if (!iframe.src && !iframe.srcdoc) {\n const error = new Error('Iframe must have src or srcdoc property defined.');\n error.code = ErrorCode.NoIframeSrc;\n throw error;\n }\n};\n","import { MessageType, NativeEventType } from '../enums';\nimport createDestructor from '../createDestructor';\nimport createLogger from '../createLogger';\nimport getOriginFromSrc from './getOriginFromSrc';\nimport handleAckMessageFactory from './handleAckMessageFactory';\nimport handleSynMessageFactory from './handleSynMessageFactory';\nimport { serializeMethods } from '../methodSerialization';\nimport monitorIframeRemoval from './monitorIframeRemoval';\nimport startConnectionTimeout from '../startConnectionTimeout';\nimport validateIframeHasSrcOrSrcDoc from './validateIframeHasSrcOrSrcDoc';\n/**\n * Attempts to establish communication with an iframe.\n */\nexport default (options) => {\n let { iframe, methods = {}, childOrigin, timeout, debug = false } = options;\n const log = createLogger(debug);\n const destructor = createDestructor('Parent', log);\n const { onDestroy, destroy } = destructor;\n if (!childOrigin) {\n validateIframeHasSrcOrSrcDoc(iframe);\n childOrigin = getOriginFromSrc(iframe.src);\n }\n // If event.origin is \"null\", the remote protocol is file: or data: and we\n // must post messages with \"*\" as targetOrigin when sending messages.\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage#Using_window.postMessage_in_extensions\n const originForSending = childOrigin === 'null' ? '*' : childOrigin;\n const serializedMethods = serializeMethods(methods);\n const handleSynMessage = handleSynMessageFactory(log, serializedMethods, childOrigin, originForSending);\n const handleAckMessage = handleAckMessageFactory(serializedMethods, childOrigin, originForSending, destructor, log);\n const promise = new Promise((resolve, reject) => {\n const stopConnectionTimeout = startConnectionTimeout(timeout, destroy);\n const handleMessage = (event) => {\n if (event.source !== iframe.contentWindow || !event.data) {\n return;\n }\n if (event.data.penpal === MessageType.Syn) {\n handleSynMessage(event);\n return;\n }\n if (event.data.penpal === MessageType.Ack) {\n const callSender = handleAckMessage(event);\n if (callSender) {\n stopConnectionTimeout();\n resolve(callSender);\n }\n return;\n }\n };\n window.addEventListener(NativeEventType.Message, handleMessage);\n log('Parent: Awaiting handshake');\n monitorIframeRemoval(iframe, destructor);\n onDestroy((error) => {\n window.removeEventListener(NativeEventType.Message, handleMessage);\n if (error) {\n reject(error);\n }\n });\n });\n return {\n promise,\n destroy() {\n // Don't allow consumer to pass an error into destroy.\n destroy();\n },\n };\n};\n","import { AsyncMethodReturns, connectToChild } from \"@cartridge/penpal\";\nimport { ControllerOptions, Modal } from \"../types\";\n\nexport type IFrameOptions<CallSender> = Omit<\n ConstructorParameters<typeof IFrame>[0],\n \"id\" | \"url\" | \"onConnect\"\n> & {\n url?: string;\n onConnect: (child: AsyncMethodReturns<CallSender>) => void;\n};\n\nexport class IFrame<CallSender extends {}> implements Modal {\n url?: URL;\n private iframe?: HTMLIFrameElement;\n private container?: HTMLDivElement;\n private onClose?: () => void;\n private child?: AsyncMethodReturns<CallSender>;\n private closeTimeout?: NodeJS.Timeout;\n\n constructor({\n id,\n url,\n preset,\n onClose,\n onConnect,\n methods = {},\n }: Pick<ControllerOptions, \"preset\"> & {\n id: string;\n url: URL;\n onClose?: () => void;\n onConnect: (child: AsyncMethodReturns<CallSender>) => void;\n methods?: { [key: string]: (...args: any[]) => void };\n }) {\n if (typeof document === \"undefined\" || typeof window === \"undefined\") {\n return;\n }\n\n if (preset) {\n url.searchParams.set(\"preset\", preset);\n }\n\n this.url = url;\n\n const iframe = document.createElement(\"iframe\");\n iframe.src = url.toString();\n iframe.id = id;\n iframe.style.border = \"none\";\n iframe.sandbox.add(\"allow-forms\");\n iframe.sandbox.add(\"allow-popups\");\n iframe.sandbox.add(\"allow-popups-to-escape-sandbox\");\n iframe.sandbox.add(\"allow-scripts\");\n iframe.sandbox.add(\"allow-same-origin\");\n iframe.allow =\n \"publickey-credentials-create *; publickey-credentials-get *; clipboard-write\";\n if (!!document.hasStorageAccess) {\n iframe.sandbox.add(\"allow-storage-access-by-user-activation\");\n }\n\n const container = document.createElement(\"div\");\n container.id = \"controller\";\n container.style.position = \"fixed\";\n container.style.height = \"100%\";\n container.style.width = \"100%\";\n container.style.top = \"0\";\n container.style.left = \"0\";\n container.style.zIndex = \"10000\";\n container.style.backgroundColor = \"rgba(0,0,0,0.6)\";\n container.style.display = \"none\"; // Use display: none to completely hide from password managers\n container.style.alignItems = \"center\";\n container.style.justifyContent = \"center\";\n container.style.transition = \"opacity 0.2s ease\";\n container.style.opacity = \"0\";\n container.style.pointerEvents = \"auto\";\n container.appendChild(iframe);\n\n // Add click event listener to close iframe when clicking outside\n container.addEventListener(\"click\", (e) => {\n if (e.target === container) {\n // Attempting to reset(clear context) for keychain iframe (identified by ID)\n if (id === \"controller-keychain\" && this.child) {\n // Type assertion for keychain child only\n (this.child as any)\n .reset?.()\n .catch((e: any) => console.error(\"Error resetting context:\", e));\n }\n this.close();\n }\n });\n\n this.iframe = iframe;\n this.container = container;\n\n connectToChild<CallSender>({\n iframe: this.iframe,\n methods: {\n close: (_origin: string) => () => this.close(),\n reload: (_origin: string) => () => window.location.reload(),\n ...methods,\n },\n }).promise.then((child) => {\n this.child = child;\n onConnect(child);\n });\n\n this.resize();\n window.addEventListener(\"resize\", () => this.resize());\n\n const observer = new MutationObserver(() => {\n if (typeof document === \"undefined\") return;\n const existingController = document.getElementById(\"controller\");\n if (document.body) {\n if (id === \"controller-keychain\" && !existingController) {\n document.body.appendChild(container);\n observer.disconnect();\n }\n }\n });\n\n observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n });\n\n const existingController = document.getElementById(\"controller\");\n if (document.body) {\n if (id === \"controller-keychain\" && !existingController) {\n document.body.appendChild(container);\n }\n }\n\n this.onClose = onClose;\n }\n\n open() {\n if (!this.container || typeof document === \"undefined\" || !document.body)\n return;\n\n // Clear any pending close timeout to prevent race condition\n if (this.closeTimeout) {\n clearTimeout(this.closeTimeout);\n this.closeTimeout = undefined;\n }\n\n document.body.style.overflow = \"hidden\";\n\n this.container.style.display = \"flex\";\n // Use requestAnimationFrame to ensure display change is processed before opacity change\n requestAnimationFrame(() => {\n if (this.container) {\n this.container.style.opacity = \"1\";\n }\n });\n }\n\n close() {\n if (!this.container || typeof document === \"undefined\" || !document.body)\n return;\n this.onClose?.();\n\n document.body.style.overflow = \"auto\";\n\n // Start fade-out transition\n this.container.style.opacity = \"0\";\n\n // Set display: none after transition completes (200ms)\n this.closeTimeout = setTimeout(() => {\n if (this.container) {\n this.container.style.display = \"none\";\n }\n this.closeTimeout = undefined;\n }, 200);\n }\n\n sendBackward() {\n if (!this.container) return;\n this.container.style.zIndex = \"9999\";\n }\n\n sendForward() {\n if (!this.container) return;\n this.container.style.zIndex = \"10000\";\n }\n\n private resize() {\n if (!this.iframe || typeof window === \"undefined\") return;\n\n this.iframe.style.userSelect = \"none\";\n\n if (window.innerWidth < 768) {\n this.iframe.style.height = \"100%\";\n this.iframe.style.width = \"100%\";\n this.iframe.style.borderRadius = \"0\";\n return;\n }\n\n this.iframe.style.height = \"600px\";\n this.iframe.style.width = \"432px\";\n this.iframe.style.borderRadius = \"8px\";\n }\n\n isOpen() {\n return this.container?.style.display !== \"none\";\n }\n}\n","/* Do NOT modify this file; see /src.ts/_admin/update-version.ts */\n/**\n * The current version of Ethers.\n */\nexport const version = \"6.13.7\";\n//# sourceMappingURL=_version.js.map","/**\n * Property helper functions.\n *\n * @_subsection api/utils:Properties [about-properties]\n */\nfunction checkType(value, type, name) {\n const types = type.split(\"|\").map(t => t.trim());\n for (let i = 0; i < types.length; i++) {\n switch (type) {\n case \"any\":\n return;\n case \"bigint\":\n case \"boolean\":\n case \"number\":\n case \"string\":\n if (typeof (value) === type) {\n return;\n }\n }\n }\n const error = new Error(`invalid value for type ${type}`);\n error.code = \"INVALID_ARGUMENT\";\n error.argument = `value.${name}`;\n error.value = value;\n throw error;\n}\n/**\n * Resolves to a new object that is a copy of %%value%%, but with all\n * values resolved.\n */\nexport async function resolveProperties(value) {\n const keys = Object.keys(value);\n const results = await Promise.all(keys.map((k) => Promise.resolve(value[k])));\n return results.reduce((accum, v, index) => {\n accum[keys[index]] = v;\n return accum;\n }, {});\n}\n/**\n * Assigns the %%values%% to %%target%% as read-only values.\n *\n * It %%types%% is specified, the values are checked.\n */\nexport function defineProperties(target, values, types) {\n for (let key in values) {\n let value = values[key];\n const type = (types ? types[key] : null);\n if (type) {\n checkType(value, type, key);\n }\n Object.defineProperty(target, key, { enumerable: true, value, writable: false });\n }\n}\n//# sourceMappingURL=properties.js.map","/**\n * All errors in ethers include properties to ensure they are both\n * human-readable (i.e. ``.message``) and machine-readable (i.e. ``.code``).\n *\n * The [[isError]] function can be used to check the error ``code`` and\n * provide a type guard for the properties present on that error interface.\n *\n * @_section: api/utils/errors:Errors [about-errors]\n */\nimport { version } from \"../_version.js\";\nimport { defineProperties } from \"./properties.js\";\nfunction stringify(value) {\n if (value == null) {\n return \"null\";\n }\n if (Array.isArray(value)) {\n return \"[ \" + (value.map(stringify)).join(\", \") + \" ]\";\n }\n if (value instanceof Uint8Array) {\n const HEX = \"0123456789abcdef\";\n let result = \"0x\";\n for (let i = 0; i < value.length; i++) {\n result += HEX[value[i] >> 4];\n result += HEX[value[i] & 0xf];\n }\n return result;\n }\n if (typeof (value) === \"object\" && typeof (value.toJSON) === \"function\") {\n return stringify(value.toJSON());\n }\n switch (typeof (value)) {\n case \"boolean\":\n case \"symbol\":\n return value.toString();\n case \"bigint\":\n return BigInt(value).toString();\n case \"number\":\n return (value).toString();\n case \"string\":\n return JSON.stringify(value);\n case \"object\": {\n const keys = Object.keys(value);\n keys.sort();\n return \"{ \" + keys.map((k) => `${stringify(k)}: ${stringify(value[k])}`).join(\", \") + \" }\";\n }\n }\n return `[ COULD NOT SERIALIZE ]`;\n}\n/**\n * Returns true if the %%error%% matches an error thrown by ethers\n * that matches the error %%code%%.\n *\n * In TypeScript environments, this can be used to check that %%error%%\n * matches an EthersError type, which means the expected properties will\n * be set.\n *\n * @See [ErrorCodes](api:ErrorCode)\n * @example\n * try {\n * // code....\n * } catch (e) {\n * if (isError(e, \"CALL_EXCEPTION\")) {\n * // The Type Guard has validated this object\n * console.log(e.data);\n * }\n * }\n */\nexport function isError(error, code) {\n return (error && error.code === code);\n}\n/**\n * Returns true if %%error%% is a [[CallExceptionError].\n */\nexport function isCallException(error) {\n return isError(error, \"CALL_EXCEPTION\");\n}\n/**\n * Returns a new Error configured to the format ethers emits errors, with\n * the %%message%%, [[api:ErrorCode]] %%code%% and additional properties\n * for the corresponding EthersError.\n *\n * Each error in ethers includes the version of ethers, a\n * machine-readable [[ErrorCode]], and depending on %%code%%, additional\n * required properties. The error message will also include the %%message%%,\n * ethers version, %%code%% and all additional properties, serialized.\n */\nexport function makeError(message, code, info) {\n let shortMessage = message;\n {\n const details = [];\n if (info) {\n if (\"message\" in info || \"code\" in info || \"name\" in info) {\n throw new Error(`value will overwrite populated values: ${stringify(info)}`);\n }\n for (const key in info) {\n if (key === \"shortMessage\") {\n continue;\n }\n const value = (info[key]);\n // try {\n details.push(key + \"=\" + stringify(value));\n // } catch (error: any) {\n // console.log(\"MMM\", error.message);\n // details.push(key + \"=[could not serialize object]\");\n // }\n }\n }\n details.push(`code=${code}`);\n details.push(`version=${version}`);\n if (details.length) {\n message += \" (\" + details.join(\", \") + \")\";\n }\n }\n let error;\n switch (code) {\n case \"INVALID_ARGUMENT\":\n error = new TypeError(message);\n break;\n case \"NUMERIC_FAULT\":\n case \"BUFFER_OVERRUN\":\n error = new RangeError(message);\n break;\n default:\n error = new Error(message);\n }\n defineProperties(error, { code });\n if (info) {\n Object.assign(error, info);\n }\n if (error.shortMessage == null) {\n defineProperties(error, { shortMessage });\n }\n return error;\n}\n/**\n * Throws an EthersError with %%message%%, %%code%% and additional error\n * %%info%% when %%check%% is falsish..\n *\n * @see [[api:makeError]]\n */\nexport function assert(check, message, code, info) {\n if (!check) {\n throw makeError(message, code, info);\n }\n}\n/**\n * A simple helper to simply ensuring provided arguments match expected\n * constraints, throwing if not.\n *\n * In TypeScript environments, the %%check%% has been asserted true, so\n * any further code does not need additional compile-time checks.\n */\nexport function assertArgument(check, message, name, value) {\n assert(check, message, \"INVALID_ARGUMENT\", { argument: name, value: value });\n}\nexport function assertArgumentCount(count, expectedCount, message) {\n if (message == null) {\n message = \"\";\n }\n if (message) {\n message = \": \" + message;\n }\n assert(count >= expectedCount, \"missing argument\" + message, \"MISSING_ARGUMENT\", {\n count: count,\n expectedCount: expectedCount\n });\n assert(count <= expectedCount, \"too many arguments\" + message, \"UNEXPECTED_ARGUMENT\", {\n count: count,\n expectedCount: expectedCount\n });\n}\nconst _normalizeForms = [\"NFD\", \"NFC\", \"NFKD\", \"NFKC\"].reduce((accum, form) => {\n try {\n // General test for normalize\n /* c8 ignore start */\n if (\"test\".normalize(form) !== \"test\") {\n throw new Error(\"bad\");\n }\n ;\n /* c8 ignore stop */\n if (form === \"NFD\") {\n const check = String.fromCharCode(0xe9).normalize(\"NFD\");\n const expected = String.fromCharCode(0x65, 0x0301);\n /* c8 ignore start */\n if (check !== expected) {\n throw new Error(\"broken\");\n }\n /* c8 ignore stop */\n }\n accum.push(form);\n }\n catch (error) { }\n return accum;\n}, []);\n/**\n * Throws if the normalization %%form%% is not supported.\n */\nexport function assertNormalize(form) {\n assert(_normalizeForms.indexOf(form) >= 0, \"platform missing String.prototype.normalize\", \"UNSUPPORTED_OPERATION\", {\n operation: \"String.prototype.normalize\", info: { form }\n });\n}\n/**\n * Many classes use file-scoped values to guard the constructor,\n * making it effectively private. This facilitates that pattern\n * by ensuring the %%givenGaurd%% matches the file-scoped %%guard%%,\n * throwing if not, indicating the %%className%% if provided.\n */\nexport function assertPrivate(givenGuard, guard, className) {\n if (className == null) {\n className = \"\";\n }\n if (givenGuard !== guard) {\n let method = className, operation = \"new\";\n if (className) {\n method += \".\";\n operation += \" \" + className;\n }\n assert(false, `private constructor; use ${method}from* methods`, \"UNSUPPORTED_OPERATION\", {\n operation\n });\n }\n}\n//# sourceMappingURL=errors.js.map","/**\n * Some data helpers.\n *\n *\n * @_subsection api/utils:Data Helpers [about-data]\n */\nimport { assert, assertArgument } from \"./errors.js\";\nfunction _getBytes(value, name, copy) {\n if (value instanceof Uint8Array) {\n if (copy) {\n return new Uint8Array(value);\n }\n return value;\n }\n if (typeof (value) === \"string\" && value.match(/^0x(?:[0-9a-f][0-9a-f])*$/i)) {\n const result = new Uint8Array((value.length - 2) / 2);\n let offset = 2;\n for (let i = 0; i < result.length; i++) {\n result[i] = parseInt(value.substring(offset, offset + 2), 16);\n offset += 2;\n }\n return result;\n }\n assertArgument(false, \"invalid BytesLike value\", name || \"value\", value);\n}\n/**\n * Get a typed Uint8Array for %%value%%. If already a Uint8Array\n * the original %%value%% is returned; if a copy is required use\n * [[getBytesCopy]].\n *\n * @see: getBytesCopy\n */\nexport function getBytes(value, name) {\n return _getBytes(value, name, false);\n}\n/**\n * Get a typed Uint8Array for %%value%%, creating a copy if necessary\n * to prevent any modifications of the returned value from being\n * reflected elsewhere.\n *\n * @see: getBytes\n */\nexport function getBytesCopy(value, name) {\n return _getBytes(value, name, true);\n}\n/**\n * Returns true if %%value%% is a valid [[HexString]].\n *\n * If %%length%% is ``true`` or a //number//, it also checks that\n * %%value%% is a valid [[DataHexString]] of %%length%% (if a //number//)\n * bytes of data (e.g. ``0x1234`` is 2 bytes).\n */\nexport function isHexString(value, length) {\n if (typeof (value) !== \"string\" || !value.match(/^0x[0-9A-Fa-f]*$/)) {\n return false;\n }\n if (typeof (length) === \"number\" && value.length !== 2 + 2 * length) {\n return false;\n }\n if (length === true && (value.length % 2) !== 0) {\n return false;\n }\n return true;\n}\n/**\n * Returns true if %%value%% is a valid representation of arbitrary\n * data (i.e. a valid [[DataHexString]] or a Uint8Array).\n */\nexport function isBytesLike(value) {\n return (isHexString(value, true) || (value instanceof Uint8Array));\n}\nconst HexCharacters = \"0123456789abcdef\";\n/**\n * Returns a [[DataHexString]] representation of %%data%%.\n */\nexport function hexlify(data) {\n const bytes = getBytes(data);\n let result = \"0x\";\n for (let i = 0; i < bytes.length; i++) {\n const v = bytes[i];\n result += HexCharacters[(v & 0xf0) >> 4] + HexCharacters[v & 0x0f];\n }\n return result;\n}\n/**\n * Returns a [[DataHexString]] by concatenating all values\n * within %%data%%.\n */\nexport function concat(datas) {\n return \"0x\" + datas.map((d) => hexlify(d).substring(2)).join(\"\");\n}\n/**\n * Returns the length of %%data%%, in bytes.\n */\nexport function dataLength(data) {\n if (isHexString(data, true)) {\n return (data.length - 2) / 2;\n }\n return getBytes(data).length;\n}\n/**\n * Returns a [[DataHexString]] by slicing %%data%% from the %%start%%\n * offset to the %%end%% offset.\n *\n * By default %%start%% is 0 and %%end%% is the length of %%data%%.\n */\nexport function dataSlice(data, start, end) {\n const bytes = getBytes(data);\n if (end != null && end > bytes.length) {\n assert(false, \"cannot slice beyond data bounds\", \"BUFFER_OVERRUN\", {\n buffer: bytes, length: bytes.length, offset: end\n });\n }\n return hexlify(bytes.slice((start == null) ? 0 : start, (end == null) ? bytes.length : end));\n}\n/**\n * Return the [[DataHexString]] result by stripping all **leading**\n ** zero bytes from %%data%%.\n */\nexport function stripZerosLeft(data) {\n let bytes = hexlify(data).substring(2);\n while (bytes.startsWith(\"00\")) {\n bytes = bytes.substring(2);\n }\n return \"0x\" + bytes;\n}\nfunction zeroPad(data, length, left) {\n const bytes = getBytes(data);\n assert(length >= bytes.length, \"padding exceeds data length\", \"BUFFER_OVERRUN\", {\n buffer: new Uint8Array(bytes),\n length: length,\n offset: length + 1\n });\n const result = new Uint8Array(length);\n result.fill(0);\n if (left) {\n result.set(bytes, length - bytes.length);\n }\n else {\n result.set(bytes, 0);\n }\n return hexlify(result);\n}\n/**\n * Return the [[DataHexString]] of %%data%% padded on the **left**\n * to %%length%% bytes.\n *\n * If %%data%% already exceeds %%length%%, a [[BufferOverrunError]] is\n * thrown.\n *\n * This pads data the same as **values** are in Solidity\n * (e.g. ``uint128``).\n */\nexport function zeroPadValue(data, length) {\n return zeroPad(data, length, true);\n}\n/**\n * Return the [[DataHexString]] of %%data%% padded on the **right**\n * to %%length%% bytes.\n *\n * If %%data%% already exceeds %%length%%, a [[BufferOverrunError]] is\n * thrown.\n *\n * This pads data the same as **bytes** are in Solidity\n * (e.g. ``bytes16``).\n */\nexport function zeroPadBytes(data, length) {\n return zeroPad(data, length, false);\n}\n//# sourceMappingURL=data.js.map","function number(n) {\n if (!Number.isSafeInteger(n) || n < 0)\n throw new Error(`Wrong positive integer: ${n}`);\n}\nfunction bool(b) {\n if (typeof b !== 'boolean')\n throw new Error(`Expected boolean, not ${b}`);\n}\nfunction bytes(b, ...lengths) {\n if (!(b instanceof Uint8Array))\n throw new Error('Expected Uint8Array');\n if (lengths.length > 0 && !lengths.includes(b.length))\n throw new Error(`Expected Uint8Array of length ${lengths}, not of length=${b.length}`);\n}\nfunction hash(hash) {\n if (typeof hash !== 'function' || typeof hash.create !== 'function')\n throw new Error('Hash should be wrapped by utils.wrapConstructor');\n number(hash.outputLen);\n number(hash.blockLen);\n}\nfunction exists(instance, checkFinished = true) {\n if (instance.destroyed)\n throw new Error('Hash instance has been destroyed');\n if (checkFinished && instance.finished)\n throw new Error('Hash#digest() has already been called');\n}\nfunction output(out, instance) {\n bytes(out);\n const min = instance.outputLen;\n if (out.length < min) {\n throw new Error(`digestInto() expects output buffer of length at least ${min}`);\n }\n}\nexport { number, bool, bytes, hash, exists, output };\nconst assert = { number, bool, bytes, hash, exists, output };\nexport default assert;\n//# sourceMappingURL=_assert.js.map","/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n// We use WebCrypto aka globalThis.crypto, which exists in browsers and node.js 16+.\n// node.js versions earlier than v19 don't declare it in global scope.\n// For node.js, package.json#exports field mapping rewrites import\n// from `crypto` to `cryptoNode`, which imports native module.\n// Makes the utils un-importable in browsers without a bundler.\n// Once node.js 18 is deprecated, we can just drop the import.\nimport { crypto } from '@noble/hashes/crypto';\nconst u8a = (a) => a instanceof Uint8Array;\n// Cast array to different type\nexport const u8 = (arr) => new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength);\nexport const u32 = (arr) => new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));\n// Cast array to view\nexport const createView = (arr) => new DataView(arr.buffer, arr.byteOffset, arr.byteLength);\n// The rotate right (circular right shift) operation for uint32\nexport const rotr = (word, shift) => (word << (32 - shift)) | (word >>> shift);\n// big-endian hardware is rare. Just in case someone still decides to run hashes:\n// early-throw an error because we don't support BE yet.\nexport const isLE = new Uint8Array(new Uint32Array([0x11223344]).buffer)[0] === 0x44;\nif (!isLE)\n throw new Error('Non little-endian hardware is not supported');\nconst hexes = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, '0'));\n/**\n * @example bytesToHex(Uint8Array.from([0xca, 0xfe, 0x01, 0x23])) // 'cafe0123'\n */\nexport function bytesToHex(bytes) {\n if (!u8a(bytes))\n throw new Error('Uint8Array expected');\n // pre-caching improves the speed 6x\n let hex = '';\n for (let i = 0; i < bytes.length; i++) {\n hex += hexes[bytes[i]];\n }\n return hex;\n}\n/**\n * @example hexToBytes('cafe0123') // Uint8Array.from([0xca, 0xfe, 0x01, 0x23])\n */\nexport function hexToBytes(hex) {\n if (typeof hex !== 'string')\n throw new Error('hex string expected, got ' + typeof hex);\n const len = hex.length;\n if (len % 2)\n throw new Error('padded hex string expected, got unpadded hex of length ' + len);\n const array = new Uint8Array(len / 2);\n for (let i = 0; i < array.length; i++) {\n const j = i * 2;\n const hexByte = hex.slice(j, j + 2);\n const byte = Number.parseInt(hexByte, 16);\n if (Number.isNaN(byte) || byte < 0)\n throw new Error('Invalid byte sequence');\n array[i] = byte;\n }\n return array;\n}\n// There is no setImmediate in browser and setTimeout is slow.\n// call of async fn will return Promise, which will be fullfiled only on\n// next scheduler queue processing step and this is exactly what we need.\nexport const nextTick = async () => { };\n// Returns control to thread each 'tick' ms to avoid blocking\nexport async function asyncLoop(iters, tick, cb) {\n let ts = Date.now();\n for (let i = 0; i < iters; i++) {\n cb(i);\n // Date.now() is not monotonic, so in case if clock goes backwards we return return control too\n const diff = Date.now() - ts;\n if (diff >= 0 && diff < tick)\n continue;\n await nextTick();\n ts += diff;\n }\n}\n/**\n * @example utf8ToBytes('abc') // new Uint8Array([97, 98, 99])\n */\nexport function utf8ToBytes(str) {\n if (typeof str !== 'string')\n throw new Error(`utf8ToBytes expected string, got ${typeof str}`);\n return new Uint8Array(new TextEncoder().encode(str)); // https://bugzil.la/1681809\n}\n/**\n * Normalizes (non-hex) string or Uint8Array to Uint8Array.\n * Warning: when Uint8Array is passed, it would NOT get copied.\n * Keep in mind for future mutable operations.\n */\nexport function toBytes(data) {\n if (typeof data === 'string')\n data = utf8ToBytes(data);\n if (!u8a(data))\n throw new Error(`expected Uint8Array, got ${typeof data}`);\n return data;\n}\n/**\n * Copies several Uint8Arrays into one.\n */\nexport function concatBytes(...arrays) {\n const r = new Uint8Array(arrays.reduce((sum, a) => sum + a.length, 0));\n let pad = 0; // walk through each item, ensure they have proper type\n arrays.forEach((a) => {\n if (!u8a(a))\n throw new Error('Uint8Array expected');\n r.set(a, pad);\n pad += a.length;\n });\n return r;\n}\n// For runtime check if class implements interface\nexport class Hash {\n // Safe version that clones internal state\n clone() {\n return this._cloneInto();\n }\n}\nconst toStr = {}.toString;\nexport function checkOpts(defaults, opts) {\n if (opts !== undefined && toStr.call(opts) !== '[object Object]')\n throw new Error('Options should be object or undefined');\n const merged = Object.assign(defaults, opts);\n return merged;\n}\nexport function wrapConstructor(hashCons) {\n const hashC = (msg) => hashCons().update(toBytes(msg)).digest();\n const tmp = hashCons();\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = () => hashCons();\n return hashC;\n}\nexport function wrapConstructorWithOpts(hashCons) {\n const hashC = (msg, opts) => hashCons(opts).update(toBytes(msg)).digest();\n const tmp = hashCons({});\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts) => hashCons(opts);\n return hashC;\n}\nexport function wrapXOFConstructorWithOpts(hashCons) {\n const hashC = (msg, opts) => hashCons(opts).update(toBytes(msg)).digest();\n const tmp = hashCons({});\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts) => hashCons(opts);\n return hashC;\n}\n/**\n * Secure PRNG. Uses `crypto.getRandomValues`, which defers to OS.\n */\nexport function randomBytes(bytesLength = 32) {\n if (crypto && typeof crypto.getRandomValues === 'function') {\n return crypto.getRandomValues(new Uint8Array(bytesLength));\n }\n throw new Error('crypto.getRandomValues must be defined');\n}\n//# sourceMappingURL=utils.js.map","const U32_MASK64 = /* @__PURE__ */ BigInt(2 ** 32 - 1);\nconst _32n = /* @__PURE__ */ BigInt(32);\n// We are not using BigUint64Array, because they are extremely slow as per 2022\nfunction fromBig(n, le = false) {\n if (le)\n return { h: Number(n & U32_MASK64), l: Number((n >> _32n) & U32_MASK64) };\n return { h: Number((n >> _32n) & U32_MASK64) | 0, l: Number(n & U32_MASK64) | 0 };\n}\nfunction split(lst, le = false) {\n let Ah = new Uint32Array(lst.length);\n let Al = new Uint32Array(lst.length);\n for (let i = 0; i < lst.length; i++) {\n const { h, l } = fromBig(lst[i], le);\n [Ah[i], Al[i]] = [h, l];\n }\n return [Ah, Al];\n}\nconst toBig = (h, l) => (BigInt(h >>> 0) << _32n) | BigInt(l >>> 0);\n// for Shift in [0, 32)\nconst shrSH = (h, _l, s) => h >>> s;\nconst shrSL = (h, l, s) => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in [1, 32)\nconst rotrSH = (h, l, s) => (h >>> s) | (l << (32 - s));\nconst rotrSL = (h, l, s) => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotrBH = (h, l, s) => (h << (64 - s)) | (l >>> (s - 32));\nconst rotrBL = (h, l, s) => (h >>> (s - 32)) | (l << (64 - s));\n// Right rotate for shift===32 (just swaps l&h)\nconst rotr32H = (_h, l) => l;\nconst rotr32L = (h, _l) => h;\n// Left rotate for Shift in [1, 32)\nconst rotlSH = (h, l, s) => (h << s) | (l >>> (32 - s));\nconst rotlSL = (h, l, s) => (l << s) | (h >>> (32 - s));\n// Left rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotlBH = (h, l, s) => (l << (s - 32)) | (h >>> (64 - s));\nconst rotlBL = (h, l, s) => (h << (s - 32)) | (l >>> (64 - s));\n// JS uses 32-bit signed integers for bitwise operations which means we cannot\n// simple take carry out of low bit sum by shift, we need to use division.\nfunction add(Ah, Al, Bh, Bl) {\n const l = (Al >>> 0) + (Bl >>> 0);\n return { h: (Ah + Bh + ((l / 2 ** 32) | 0)) | 0, l: l | 0 };\n}\n// Addition with more than 2 elements\nconst add3L = (Al, Bl, Cl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0);\nconst add3H = (low, Ah, Bh, Ch) => (Ah + Bh + Ch + ((low / 2 ** 32) | 0)) | 0;\nconst add4L = (Al, Bl, Cl, Dl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0);\nconst add4H = (low, Ah, Bh, Ch, Dh) => (Ah + Bh + Ch + Dh + ((low / 2 ** 32) | 0)) | 0;\nconst add5L = (Al, Bl, Cl, Dl, El) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0) + (El >>> 0);\nconst add5H = (low, Ah, Bh, Ch, Dh, Eh) => (Ah + Bh + Ch + Dh + Eh + ((low / 2 ** 32) | 0)) | 0;\n// prettier-ignore\nexport { fromBig, split, toBig, shrSH, shrSL, rotrSH, rotrSL, rotrBH, rotrBL, rotr32H, rotr32L, rotlSH, rotlSL, rotlBH, rotlBL, add, add3L, add3H, add4L, add4H, add5H, add5L, };\n// prettier-ignore\nconst u64 = {\n fromBig, split, toBig,\n shrSH, shrSL,\n rotrSH, rotrSL, rotrBH, rotrBL,\n rotr32H, rotr32L,\n rotlSH, rotlSL, rotlBH, rotlBL,\n add, add3L, add3H, add4L, add4H, add5H, add5L,\n};\nexport default u64;\n//# sourceMappingURL=_u64.js.map","import { bytes, exists, number, output } from './_assert.js';\nimport { rotlBH, rotlBL, rotlSH, rotlSL, split } from './_u64.js';\nimport { Hash, u32, toBytes, wrapConstructor, wrapXOFConstructorWithOpts, } from './utils.js';\n// SHA3 (keccak) is based on a new design: basically, the internal state is bigger than output size.\n// It's called a sponge function.\n// Various per round constants calculations\nconst [SHA3_PI, SHA3_ROTL, _SHA3_IOTA] = [[], [], []];\nconst _0n = /* @__PURE__ */ BigInt(0);\nconst _1n = /* @__PURE__ */ BigInt(1);\nconst _2n = /* @__PURE__ */ BigInt(2);\nconst _7n = /* @__PURE__ */ BigInt(7);\nconst _256n = /* @__PURE__ */ BigInt(256);\nconst _0x71n = /* @__PURE__ */ BigInt(0x71);\nfor (let round = 0, R = _1n, x = 1, y = 0; round < 24; round++) {\n // Pi\n [x, y] = [y, (2 * x + 3 * y) % 5];\n SHA3_PI.push(2 * (5 * y + x));\n // Rotational\n SHA3_ROTL.push((((round + 1) * (round + 2)) / 2) % 64);\n // Iota\n let t = _0n;\n for (let j = 0; j < 7; j++) {\n R = ((R << _1n) ^ ((R >> _7n) * _0x71n)) % _256n;\n if (R & _2n)\n t ^= _1n << ((_1n << /* @__PURE__ */ BigInt(j)) - _1n);\n }\n _SHA3_IOTA.push(t);\n}\nconst [SHA3_IOTA_H, SHA3_IOTA_L] = /* @__PURE__ */ split(_SHA3_IOTA, true);\n// Left rotation (without 0, 32, 64)\nconst rotlH = (h, l, s) => (s > 32 ? rotlBH(h, l, s) : rotlSH(h, l, s));\nconst rotlL = (h, l, s) => (s > 32 ? rotlBL(h, l, s) : rotlSL(h, l, s));\n// Same as keccakf1600, but allows to skip some rounds\nexport function keccakP(s, rounds = 24) {\n const B = new Uint32Array(5 * 2);\n // NOTE: all indices are x2 since we store state as u32 instead of u64 (bigints to slow in js)\n for (let round = 24 - rounds; round < 24; round++) {\n // Theta θ\n for (let x = 0; x < 10; x++)\n B[x] = s[x] ^ s[x + 10] ^ s[x + 20] ^ s[x + 30] ^ s[x + 40];\n for (let x = 0; x < 10; x += 2) {\n const idx1 = (x + 8) % 10;\n const idx0 = (x + 2) % 10;\n const B0 = B[idx0];\n const B1 = B[idx0 + 1];\n const Th = rotlH(B0, B1, 1) ^ B[idx1];\n const Tl = rotlL(B0, B1, 1) ^ B[idx1 + 1];\n for (let y = 0; y < 50; y += 10) {\n s[x + y] ^= Th;\n s[x + y + 1] ^= Tl;\n }\n }\n // Rho (ρ) and Pi (π)\n let curH = s[2];\n let curL = s[3];\n for (let t = 0; t < 24; t++) {\n const shift = SHA3_ROTL[t];\n const Th = rotlH(curH, curL, shift);\n const Tl = rotlL(curH, curL, shift);\n const PI = SHA3_PI[t];\n curH = s[PI];\n curL = s[PI + 1];\n s[PI] = Th;\n s[PI + 1] = Tl;\n }\n // Chi (χ)\n for (let y = 0; y < 50; y += 10) {\n for (let x = 0; x < 10; x++)\n B[x] = s[y + x];\n for (let x = 0; x < 10; x++)\n s[y + x] ^= ~B[(x + 2) % 10] & B[(x + 4) % 10];\n }\n // Iota (ι)\n s[0] ^= SHA3_IOTA_H[round];\n s[1] ^= SHA3_IOTA_L[round];\n }\n B.fill(0);\n}\nexport class Keccak extends Hash {\n // NOTE: we accept arguments in bytes instead of bits here.\n constructor(blockLen, suffix, outputLen, enableXOF = false, rounds = 24) {\n super();\n this.blockLen = blockLen;\n this.suffix = suffix;\n this.outputLen = outputLen;\n this.enableXOF = enableXOF;\n this.rounds = rounds;\n this.pos = 0;\n this.posOut = 0;\n this.finished = false;\n this.destroyed = false;\n // Can be passed from user as dkLen\n number(outputLen);\n // 1600 = 5x5 matrix of 64bit. 1600 bits === 200 bytes\n if (0 >= this.blockLen || this.blockLen >= 200)\n throw new Error('Sha3 supports only keccak-f1600 function');\n this.state = new Uint8Array(200);\n this.state32 = u32(this.state);\n }\n keccak() {\n keccakP(this.state32, this.rounds);\n this.posOut = 0;\n this.pos = 0;\n }\n update(data) {\n exists(this);\n const { blockLen, state } = this;\n data = toBytes(data);\n const len = data.length;\n for (let pos = 0; pos < len;) {\n const take = Math.min(blockLen - this.pos, len - pos);\n for (let i = 0; i < take; i++)\n state[this.pos++] ^= data[pos++];\n if (this.pos === blockLen)\n this.keccak();\n }\n return this;\n }\n finish() {\n if (this.finished)\n return;\n this.finished = true;\n const { state, suffix, pos, blockLen } = this;\n // Do the padding\n state[pos] ^= suffix;\n if ((suffix & 0x80) !== 0 && pos === blockLen - 1)\n this.keccak();\n state[blockLen - 1] ^= 0x80;\n this.keccak();\n }\n writeInto(out) {\n exists(this, false);\n bytes(out);\n this.finish();\n const bufferOut = this.state;\n const { blockLen } = this;\n for (let pos = 0, len = out.length; pos < len;) {\n if (this.posOut >= blockLen)\n this.keccak();\n const take = Math.min(blockLen - this.posOut, len - pos);\n out.set(bufferOut.subarray(this.posOut, this.posOut + take), pos);\n this.posOut += take;\n pos += take;\n }\n return out;\n }\n xofInto(out) {\n // Sha3/Keccak usage with XOF is probably mistake, only SHAKE instances can do XOF\n if (!this.enableXOF)\n throw new Error('XOF is not possible for this instance');\n return this.writeInto(out);\n }\n xof(bytes) {\n number(bytes);\n return this.xofInto(new Uint8Array(bytes));\n }\n digestInto(out) {\n output(out, this);\n if (this.finished)\n throw new Error('digest() was already called');\n this.writeInto(out);\n this.destroy();\n return out;\n }\n digest() {\n return this.digestInto(new Uint8Array(this.outputLen));\n }\n destroy() {\n this.destroyed = true;\n this.state.fill(0);\n }\n _cloneInto(to) {\n const { blockLen, suffix, outputLen, rounds, enableXOF } = this;\n to || (to = new Keccak(blockLen, suffix, outputLen, enableXOF, rounds));\n to.state32.set(this.state32);\n to.pos = this.pos;\n to.posOut = this.posOut;\n to.finished = this.finished;\n to.rounds = rounds;\n // Suffix can change in cSHAKE\n to.suffix = suffix;\n to.outputLen = outputLen;\n to.enableXOF = enableXOF;\n to.destroyed = this.destroyed;\n return to;\n }\n}\nconst gen = (suffix, blockLen, outputLen) => wrapConstructor(() => new Keccak(blockLen, suffix, outputLen));\nexport const sha3_224 = /* @__PURE__ */ gen(0x06, 144, 224 / 8);\n/**\n * SHA3-256 hash function\n * @param message - that would be hashed\n */\nexport const sha3_256 = /* @__PURE__ */ gen(0x06, 136, 256 / 8);\nexport const sha3_384 = /* @__PURE__ */ gen(0x06, 104, 384 / 8);\nexport const sha3_512 = /* @__PURE__ */ gen(0x06, 72, 512 / 8);\nexport const keccak_224 = /* @__PURE__ */ gen(0x01, 144, 224 / 8);\n/**\n * keccak-256 hash function. Different from SHA3-256.\n * @param message - that would be hashed\n */\nexport const keccak_256 = /* @__PURE__ */ gen(0x01, 136, 256 / 8);\nexport const keccak_384 = /* @__PURE__ */ gen(0x01, 104, 384 / 8);\nexport const keccak_512 = /* @__PURE__ */ gen(0x01, 72, 512 / 8);\nconst genShake = (suffix, blockLen, outputLen) => wrapXOFConstructorWithOpts((opts = {}) => new Keccak(blockLen, suffix, opts.dkLen === undefined ? outputLen : opts.dkLen, true));\nexport const shake128 = /* @__PURE__ */ genShake(0x1f, 168, 128 / 8);\nexport const shake256 = /* @__PURE__ */ genShake(0x1f, 136, 256 / 8);\n//# sourceMappingURL=sha3.js.map","/**\n * Cryptographic hashing functions\n *\n * @_subsection: api/crypto:Hash Functions [about-crypto-hashing]\n */\nimport { keccak_256 } from \"@noble/hashes/sha3\";\nimport { getBytes, hexlify } from \"../utils/index.js\";\nlet locked = false;\nconst _keccak256 = function (data) {\n return keccak_256(data);\n};\nlet __keccak256 = _keccak256;\n/**\n * Compute the cryptographic KECCAK256 hash of %%data%%.\n *\n * The %%data%% **must** be a data representation, to compute the\n * hash of UTF-8 data use the [[id]] function.\n *\n * @returns DataHexstring\n * @example:\n * keccak256(\"0x\")\n * //_result:\n *\n * keccak256(\"0x1337\")\n * //_result:\n *\n * keccak256(new Uint8Array([ 0x13, 0x37 ]))\n * //_result:\n *\n * // Strings are assumed to be DataHexString, otherwise it will\n * // throw. To hash UTF-8 data, see the note above.\n * keccak256(\"Hello World\")\n * //_error:\n */\nexport function keccak256(_data) {\n const data = getBytes(_data, \"data\");\n return hexlify(__keccak256(data));\n}\nkeccak256._ = _keccak256;\nkeccak256.lock = function () { locked = true; };\nkeccak256.register = function (func) {\n if (locked) {\n throw new TypeError(\"keccak256 is locked\");\n }\n __keccak256 = func;\n};\nObject.freeze(keccak256);\n//# sourceMappingURL=keccak.js.map","import { keccak256 } from \"../crypto/index.js\";\nimport { getBytes, assertArgument } from \"../utils/index.js\";\nconst BN_0 = BigInt(0);\nconst BN_36 = BigInt(36);\nfunction getChecksumAddress(address) {\n // if (!isHexString(address, 20)) {\n // logger.throwArgumentError(\"invalid address\", \"address\", address);\n // }\n address = address.toLowerCase();\n const chars = address.substring(2).split(\"\");\n const expanded = new Uint8Array(40);\n for (let i = 0; i < 40; i++) {\n expanded[i] = chars[i].charCodeAt(0);\n }\n const hashed = getBytes(keccak256(expanded));\n for (let i = 0; i < 40; i += 2) {\n if ((hashed[i >> 1] >> 4) >= 8) {\n chars[i] = chars[i].toUpperCase();\n }\n if ((hashed[i >> 1] & 0x0f) >= 8) {\n chars[i + 1] = chars[i + 1].toUpperCase();\n }\n }\n return \"0x\" + chars.join(\"\");\n}\n// See: https://en.wikipedia.org/wiki/International_Bank_Account_Number\n// Create lookup table\nconst ibanLookup = {};\nfor (let i = 0; i < 10; i++) {\n ibanLookup[String(i)] = String(i);\n}\nfor (let i = 0; i < 26; i++) {\n ibanLookup[String.fromCharCode(65 + i)] = String(10 + i);\n}\n// How many decimal digits can we process? (for 64-bit float, this is 15)\n// i.e. Math.floor(Math.log10(Number.MAX_SAFE_INTEGER));\nconst safeDigits = 15;\nfunction ibanChecksum(address) {\n address = address.toUpperCase();\n address = address.substring(4) + address.substring(0, 2) + \"00\";\n let expanded = address.split(\"\").map((c) => { return ibanLookup[c]; }).join(\"\");\n // Javascript can handle integers safely up to 15 (decimal) digits\n while (expanded.length >= safeDigits) {\n let block = expanded.substring(0, safeDigits);\n expanded = parseInt(block, 10) % 97 + expanded.substring(block.length);\n }\n let checksum = String(98 - (parseInt(expanded, 10) % 97));\n while (checksum.length < 2) {\n checksum = \"0\" + checksum;\n }\n return checksum;\n}\n;\nconst Base36 = (function () {\n ;\n const result = {};\n for (let i = 0; i < 36; i++) {\n const key = \"0123456789abcdefghijklmnopqrstuvwxyz\"[i];\n result[key] = BigInt(i);\n }\n return result;\n})();\nfunction fromBase36(value) {\n value = value.toLowerCase();\n let result = BN_0;\n for (let i = 0; i < value.length; i++) {\n result = result * BN_36 + Base36[value[i]];\n }\n return result;\n}\n/**\n * Returns a normalized and checksumed address for %%address%%.\n * This accepts non-checksum addresses, checksum addresses and\n * [[getIcapAddress]] formats.\n *\n * The checksum in Ethereum uses the capitalization (upper-case\n * vs lower-case) of the characters within an address to encode\n * its checksum, which offers, on average, a checksum of 15-bits.\n *\n * If %%address%% contains both upper-case and lower-case, it is\n * assumed to already be a checksum address and its checksum is\n * validated, and if the address fails its expected checksum an\n * error is thrown.\n *\n * If you wish the checksum of %%address%% to be ignore, it should\n * be converted to lower-case (i.e. ``.toLowercase()``) before\n * being passed in. This should be a very rare situation though,\n * that you wish to bypass the safegaurds in place to protect\n * against an address that has been incorrectly copied from another\n * source.\n *\n * @example:\n * // Adds the checksum (via upper-casing specific letters)\n * getAddress(\"0x8ba1f109551bd432803012645ac136ddd64dba72\")\n * //_result:\n *\n * // Converts ICAP address and adds checksum\n * getAddress(\"XE65GB6LDNXYOFTX0NSV3FUWKOWIXAMJK36\");\n * //_result:\n *\n * // Throws an error if an address contains mixed case,\n * // but the checksum fails\n * getAddress(\"0x8Ba1f109551bD432803012645Ac136ddd64DBA72\")\n * //_error:\n */\nexport function getAddress(address) {\n assertArgument(typeof (address) === \"string\", \"invalid address\", \"address\", address);\n if (address.match(/^(0x)?[0-9a-fA-F]{40}$/)) {\n // Missing the 0x prefix\n if (!address.startsWith(\"0x\")) {\n address = \"0x\" + address;\n }\n const result = getChecksumAddress(address);\n // It is a checksummed address with a bad checksum\n assertArgument(!address.match(/([A-F].*[a-f])|([a-f].*[A-F])/) || result === address, \"bad address checksum\", \"address\", address);\n return result;\n }\n // Maybe ICAP? (we only support direct mode)\n if (address.match(/^XE[0-9]{2}[0-9A-Za-z]{30,31}$/)) {\n // It is an ICAP address with a bad checksum\n assertArgument(address.substring(2, 4) === ibanChecksum(address), \"bad icap checksum\", \"address\", address);\n let result = fromBase36(address.substring(4)).toString(16);\n while (result.length < 40) {\n result = \"0\" + result;\n }\n return getChecksumAddress(\"0x\" + result);\n }\n assertArgument(false, \"invalid address\", \"address\", address);\n}\n/**\n * The [ICAP Address format](link-icap) format is an early checksum\n * format which attempts to be compatible with the banking\n * industry [IBAN format](link-wiki-iban) for bank accounts.\n *\n * It is no longer common or a recommended format.\n *\n * @example:\n * getIcapAddress(\"0x8ba1f109551bd432803012645ac136ddd64dba72\");\n * //_result:\n *\n * getIcapAddress(\"XE65GB6LDNXYOFTX0NSV3FUWKOWIXAMJK36\");\n * //_result:\n *\n * // Throws an error if the ICAP checksum is wrong\n * getIcapAddress(\"XE65GB6LDNXYOFTX0NSV3FUWKOWIXAMJK37\");\n * //_error:\n */\nexport function getIcapAddress(address) {\n //let base36 = _base16To36(getAddress(address).substring(2)).toUpperCase();\n let base36 = BigInt(getAddress(address)).toString(36).toUpperCase();\n while (base36.length < 30) {\n base36 = \"0\" + base36;\n }\n return \"XE\" + ibanChecksum(\"XE00\" + base36) + base36;\n}\n//# sourceMappingURL=address.js.map","import { TypedData } from \"@starknet-io/types-js\";\nimport { connect, StarknetWindowObject } from \"starknetkit\";\nimport { InjectedConnector } from \"starknetkit/injected\";\nimport {\n ExternalPlatform,\n ExternalWallet,\n ExternalWalletResponse,\n ExternalWalletType,\n WalletAdapter,\n} from \"../types\";\n\nexport class ArgentWallet implements WalletAdapter {\n readonly type: ExternalWalletType = \"argent\";\n readonly platform: ExternalPlatform = \"starknet\";\n private wallet: StarknetWindowObject | undefined = undefined;\n private account: string | undefined = undefined;\n private connectedAccounts: string[] = [];\n\n isAvailable(): boolean {\n return typeof window !== \"undefined\" && !!window.starknet_argentX;\n }\n\n getInfo(): ExternalWallet {\n const available = this.isAvailable();\n\n return {\n type: this.type,\n available,\n version: available\n ? window.starknet_argentX?.version || \"Unknown\"\n : undefined,\n chainId: available ? window.starknet_argentX?.chainId : undefined,\n name: \"Argent\",\n platform: this.platform,\n };\n }\n\n async connect(): Promise<ExternalWalletResponse<any>> {\n if (this.account) {\n return { success: true, wallet: this.type, account: this.account };\n }\n\n try {\n if (!this.isAvailable()) {\n throw new Error(\"Argent is not available\");\n }\n\n const { wallet, connectorData } = await connect({\n connectors: [new InjectedConnector({ options: { id: \"argentX\" } })],\n });\n\n if (!wallet) {\n throw new Error(\"No wallet found\");\n }\n\n this.wallet = wallet;\n this.account = connectorData?.account;\n return { success: true, wallet: this.type, account: this.account };\n } catch (error) {\n console.error(`Error connecting to Argent:`, error);\n return {\n success: false,\n wallet: this.type,\n error: (error as Error).message || \"Unknown error\",\n };\n }\n }\n\n getConnectedAccounts(): string[] {\n return this.connectedAccounts;\n }\n\n async signTypedData(data: TypedData): Promise<ExternalWalletResponse<any>> {\n try {\n if (!this.isAvailable() || !this.wallet) {\n throw new Error(\"Argent is not connected\");\n }\n\n const sig = await this.wallet.request({\n type: \"wallet_signTypedData\",\n params: data,\n });\n\n return { success: true, wallet: this.type, result: sig };\n } catch (error) {\n console.error(`Error signing typed data with Argent:`, error);\n return {\n success: false,\n wallet: this.type,\n error: (error as Error).message || \"Unknown error\",\n };\n }\n }\n\n async sendTransaction(_txn: any): Promise<ExternalWalletResponse<any>> {\n return {\n success: false,\n wallet: this.type,\n error: \"Not implemented\",\n };\n }\n\n async switchChain(_chainId: string): Promise<boolean> {\n console.warn(\n \"Chain switching for Argent may require custom implementation\",\n );\n return false;\n }\n\n async getBalance(\n _tokenAddress?: string,\n ): Promise<ExternalWalletResponse<any>> {\n try {\n if (!this.isAvailable() || !this.wallet) {\n throw new Error(\"Argent is not connected\");\n }\n\n // TODO: Implement balance fetching based on Argent's API\n return {\n success: true,\n wallet: this.type,\n result: \"Implement based on Argent API\",\n };\n } catch (error) {\n console.error(`Error getting balance from Argent:`, error);\n return {\n success: false,\n wallet: this.type,\n error: (error as Error).message || \"Unknown error\",\n };\n }\n }\n}\n","/**\n * Announces an EIP-1193 Provider.\n */\nexport function announceProvider(detail) {\n const event = new CustomEvent('eip6963:announceProvider', { detail: Object.freeze(detail) });\n window.dispatchEvent(event);\n const handler = () => window.dispatchEvent(event);\n window.addEventListener('eip6963:requestProvider', handler);\n return () => window.removeEventListener('eip6963:requestProvider', handler);\n}\n/**\n * Watches for EIP-1193 Providers to be announced.\n */\nexport function requestProviders(listener) {\n if (typeof window === 'undefined')\n return;\n const handler = (event) => listener(event.detail);\n window.addEventListener('eip6963:announceProvider', handler);\n window.dispatchEvent(new CustomEvent('eip6963:requestProvider'));\n return () => window.removeEventListener('eip6963:announceProvider', handler);\n}\n//# sourceMappingURL=utils.js.map","import { requestProviders } from './utils.js';\nexport function createStore() {\n const listeners = new Set();\n let providerDetails = [];\n const request = () => requestProviders((providerDetail) => {\n if (providerDetails.some(({ info }) => info.uuid === providerDetail.info.uuid))\n return;\n providerDetails = [...providerDetails, providerDetail];\n listeners.forEach((listener) => listener(providerDetails, { added: [providerDetail] }));\n });\n let unwatch = request();\n return {\n _listeners() {\n return listeners;\n },\n clear() {\n listeners.forEach((listener) => listener([], { removed: [...providerDetails] }));\n providerDetails = [];\n },\n destroy() {\n this.clear();\n listeners.clear();\n unwatch?.();\n },\n findProvider({ rdns }) {\n return providerDetails.find((providerDetail) => providerDetail.info.rdns === rdns);\n },\n getProviders() {\n return providerDetails;\n },\n reset() {\n this.clear();\n unwatch?.();\n unwatch = request();\n },\n subscribe(listener, { emitImmediately } = {}) {\n listeners.add(listener);\n if (emitImmediately)\n listener(providerDetails, { added: providerDetails });\n return () => listeners.delete(listener);\n },\n };\n}\n//# sourceMappingURL=store.js.map","import { MetaMaskSDK } from \"@metamask/sdk\";\nimport { getAddress } from \"ethers/address\";\nimport { createStore } from \"mipd\";\nimport {\n ExternalPlatform,\n ExternalWallet,\n ExternalWalletResponse,\n ExternalWalletType,\n WalletAdapter,\n} from \"../types\";\n\nexport class MetaMaskWallet implements WalletAdapter {\n readonly type: ExternalWalletType = \"metamask\";\n readonly platform: ExternalPlatform = \"ethereum\";\n private MMSDK: MetaMaskSDK;\n private store = createStore();\n private account: string | undefined = undefined;\n private connectedAccounts: string[] = [];\n\n constructor() {\n this.MMSDK = new MetaMaskSDK({\n dappMetadata: {\n name: \"Cartridge Controller\",\n url: window.location.href,\n },\n });\n if (this.isAvailable()) {\n this.MMSDK.sdkInitPromise?.then(() => {\n this.MMSDK.getProvider()\n ?.request({\n method: \"eth_accounts\",\n })\n .then((accounts: any) => {\n if (accounts && accounts.length > 0) {\n this.account = getAddress(accounts[0]);\n this.connectedAccounts = accounts.map(getAddress);\n }\n });\n this.MMSDK.getProvider()?.on(\"accountsChanged\", (accounts: any) => {\n if (Array.isArray(accounts)) {\n if (accounts.length > 0) {\n this.account = getAddress(accounts?.[0]);\n this.connectedAccounts = accounts.map(getAddress);\n }\n }\n });\n });\n }\n }\n\n isAvailable(): boolean {\n return (\n typeof window !== \"undefined\" &&\n this.store\n .getProviders()\n .some((provider) => provider.info.rdns === \"io.metamask\")\n );\n }\n\n getInfo(): ExternalWallet {\n const available = this.isAvailable();\n\n return {\n type: this.type,\n available,\n version: available ? window.ethereum?.version || \"Unknown\" : undefined,\n chainId: available ? window.ethereum?.chainId : undefined,\n name: \"MetaMask\",\n platform: this.platform,\n connectedAccounts: this.connectedAccounts,\n };\n }\n\n async connect(): Promise<ExternalWalletResponse<any>> {\n if (this.account) {\n return { success: true, wallet: this.type, account: this.account };\n }\n\n try {\n if (!this.isAvailable()) {\n throw new Error(\"MetaMask is not available\");\n }\n\n const accounts = await this.MMSDK.connect();\n if (accounts && accounts.length > 0) {\n this.account = getAddress(accounts[0]);\n this.connectedAccounts = accounts.map((account: string) =>\n getAddress(account),\n );\n\n return { success: true, wallet: this.type, account: this.account };\n }\n\n throw new Error(\"No accounts found\");\n } catch (error) {\n console.error(`Error connecting to MetaMask:`, error);\n return {\n success: false,\n wallet: this.type,\n error: (error as Error).message || \"Unknown error\",\n };\n }\n }\n\n getConnectedAccounts(): string[] {\n return this.connectedAccounts;\n }\n\n async signTransaction(\n transaction: any,\n ): Promise<ExternalWalletResponse<any>> {\n try {\n if (!this.isAvailable() || !this.account) {\n throw new Error(\"MetaMask is not connected\");\n }\n\n const ethereum = this.MMSDK.getProvider();\n if (!ethereum) {\n throw new Error(\"MetaMask is not connected\");\n }\n\n const result = await ethereum.request({\n method: \"eth_sendTransaction\",\n params: [transaction],\n });\n\n return { success: true, wallet: this.type, result };\n } catch (error) {\n console.error(`Error signing transaction with MetaMask:`, error);\n return {\n success: false,\n wallet: this.type,\n error: (error as Error).message || \"Unknown error\",\n };\n }\n }\n\n async signMessage(\n message: string,\n address?: string,\n ): Promise<ExternalWalletResponse<any>> {\n try {\n if (!this.isAvailable() || !this.account) {\n throw new Error(\"MetaMask is not connected\");\n }\n\n const result = await this.MMSDK.getProvider()?.request({\n method: \"personal_sign\",\n params: [address || this.account, message],\n });\n\n return { success: true, wallet: this.type, result };\n } catch (error) {\n console.error(`Error signing message with MetaMask:`, error);\n return {\n success: false,\n wallet: this.type,\n error: (error as Error).message || \"Unknown error\",\n };\n }\n }\n\n async signTypedData(data: any): Promise<ExternalWalletResponse<any>> {\n try {\n if (!this.isAvailable() || !this.account) {\n throw new Error(\"MetaMask is not connected\");\n }\n\n const ethereum = this.MMSDK.getProvider();\n if (!ethereum) {\n throw new Error(\"MetaMask is not connected\");\n }\n\n const result = await ethereum.request({\n method: \"eth_signTypedData_v4\",\n params: [this.account, JSON.stringify(data)],\n });\n\n return { success: true, wallet: this.type, result };\n } catch (error) {\n console.error(`Error signing typed data with MetaMask:`, error);\n return {\n success: false,\n wallet: this.type,\n error: (error as Error).message || \"Unknown error\",\n };\n }\n }\n\n async sendTransaction(_txn: any): Promise<ExternalWalletResponse<any>> {\n return {\n success: false,\n wallet: this.type,\n error: \"Not implemented\",\n };\n }\n\n async switchChain(chainId: string): Promise<boolean> {\n try {\n if (!this.isAvailable()) {\n throw new Error(\"MetaMask is not available\");\n }\n\n const ethereum = this.MMSDK.getProvider();\n if (!ethereum) {\n throw new Error(\"MetaMask is not connected\");\n }\n\n try {\n await ethereum.request({\n method: \"wallet_switchEthereumChain\",\n params: [{ chainId }],\n });\n return true;\n } catch (error) {\n if ((error as any).code === 4902) {\n console.warn(\"Chain not added to MetaMask\");\n }\n throw error;\n }\n } catch (error) {\n console.error(`Error switching chain for MetaMask:`, error);\n return false;\n }\n }\n\n async getBalance(\n tokenAddress?: string,\n ): Promise<ExternalWalletResponse<any>> {\n try {\n if (!this.isAvailable() || !this.account) {\n throw new Error(\"MetaMask is not connected\");\n }\n\n if (tokenAddress) {\n return {\n success: false,\n wallet: this.type,\n error: \"Not implemented for ERC20\",\n };\n } else {\n const ethereum = this.MMSDK.getProvider();\n if (!ethereum) {\n throw new Error(\"MetaMask is not connected\");\n }\n\n const balance = await ethereum.request({\n method: \"eth_getBalance\",\n params: [this.account, \"latest\"],\n });\n return { success: true, wallet: this.type, result: balance };\n }\n } catch (error) {\n console.error(`Error getting balance from MetaMask:`, error);\n return {\n success: false,\n wallet: this.type,\n error: (error as Error).message || \"Unknown error\",\n };\n }\n }\n}\n","import { PublicKey, Transaction, VersionedTransaction } from \"@solana/web3.js\";\nimport {\n ExternalPlatform,\n ExternalWallet,\n ExternalWalletResponse,\n ExternalWalletType,\n WalletAdapter,\n} from \"../types\";\n\ninterface PhantomProvider {\n isPhantom: boolean;\n publicKey: PublicKey | null;\n isConnected: boolean;\n connect(opts?: { onlyIfTrusted: boolean }): Promise<{ publicKey: PublicKey }>;\n disconnect(): Promise<void>;\n signTransaction(\n transaction: Transaction | VersionedTransaction,\n ): Promise<Transaction | VersionedTransaction>;\n signAllTransactions(\n transactions: (Transaction | VersionedTransaction)[],\n ): Promise<(Transaction | VersionedTransaction)[]>;\n signAndSendTransaction(\n transaction: Transaction | VersionedTransaction,\n opts?: { skipPreflight?: boolean; maxRetries?: number },\n ): Promise<{ signature: string }>;\n signMessage(\n message: Uint8Array,\n display?: \"utf8\" | \"hex\",\n ): Promise<{ signature: Uint8Array }>;\n on(\n event: \"connect\" | \"disconnect\" | \"accountChanged\",\n handler: (args: unknown) => void,\n ): void;\n request(args: { method: string; params?: unknown }): Promise<unknown>;\n}\n\nexport class PhantomWallet implements WalletAdapter {\n readonly type: ExternalWalletType = \"phantom\";\n readonly platform: ExternalPlatform = \"solana\";\n private account: string | undefined = undefined;\n private connectedAccounts: string[] = [];\n\n private getProvider(): PhantomProvider {\n if (typeof window === \"undefined\") {\n throw new Error(\"Not ready\");\n }\n\n const provider = window.solana;\n\n if (!provider?.isPhantom) {\n throw new Error(\"Phantom is not available\");\n }\n\n return provider;\n }\n\n isAvailable(): boolean {\n return typeof window !== \"undefined\" && !!window.solana?.isPhantom;\n }\n\n getInfo(): ExternalWallet {\n const available = this.isAvailable();\n\n return {\n type: this.type,\n available,\n version: \"Unknown\",\n name: \"Phantom\",\n platform: this.platform,\n };\n }\n\n async connect(): Promise<ExternalWalletResponse<any>> {\n if (this.account) {\n return { success: true, wallet: this.type, account: this.account };\n }\n\n try {\n if (!this.isAvailable()) {\n throw new Error(\"Phantom is not available\");\n }\n\n const response = await this.getProvider().connect();\n if (response.publicKey) {\n this.account = response.publicKey.toString();\n return { success: true, wallet: this.type, account: this.account };\n }\n\n throw new Error(\"No accounts found\");\n } catch (error) {\n console.error(`Error connecting to Phantom:`, error);\n return {\n success: false,\n wallet: this.type,\n error: (error as Error).message || \"Unknown error\",\n };\n }\n }\n\n getConnectedAccounts(): string[] {\n return this.connectedAccounts;\n }\n\n async signMessage(message: string): Promise<ExternalWalletResponse<any>> {\n try {\n if (!this.isAvailable() || !this.account) {\n throw new Error(\"Phantom is not connected\");\n }\n\n const encodedMessage = new TextEncoder().encode(message);\n const result = await this.getProvider().signMessage(\n encodedMessage,\n \"utf8\",\n );\n return { success: true, wallet: this.type, result };\n } catch (error) {\n console.error(`Error signing message with Phantom:`, error);\n return {\n success: false,\n wallet: this.type,\n error: (error as Error).message || \"Unknown error\",\n };\n }\n }\n\n async sendTransaction(\n serailized_txn: Uint8Array,\n ): Promise<ExternalWalletResponse<any>> {\n if (!this.isAvailable() || !this.account) {\n throw new Error(\"Phantom is not connected\");\n }\n\n try {\n const txn = Transaction.from(serailized_txn);\n const provider = this.getProvider();\n const result = await provider.signAndSendTransaction(txn);\n return {\n success: true,\n wallet: this.type,\n result,\n };\n } catch (error) {\n console.error(`Error sending transaction with Phantom:`, error);\n return {\n success: false,\n wallet: this.type,\n error: (error as Error).message || \"Unknown error\",\n };\n }\n }\n\n async switchChain(_chainId: string): Promise<boolean> {\n console.warn(\"Chain switching not supported for Phantom\");\n return false;\n }\n\n async getBalance(\n _tokenAddress?: string,\n ): Promise<ExternalWalletResponse<any>> {\n try {\n if (!this.isAvailable() || !this.account) {\n throw new Error(\"Phantom is not connected\");\n }\n\n // TODO: Implement balance fetching based on Phantom's API\n return {\n success: true,\n wallet: this.type,\n result: \"Implement based on Phantom API\",\n };\n } catch (error) {\n console.error(`Error getting balance from Phantom:`, error);\n return {\n success: false,\n wallet: this.type,\n error: (error as Error).message || \"Unknown error\",\n };\n }\n }\n}\n","import { getAddress } from \"ethers/address\";\nimport { createStore, EIP6963ProviderDetail } from \"mipd\";\nimport {\n ExternalPlatform,\n ExternalWallet,\n ExternalWalletResponse,\n ExternalWalletType,\n WalletAdapter,\n} from \"../types\";\n\nconst RABBY_RDNS = \"io.rabby\";\n\nexport class RabbyWallet implements WalletAdapter {\n readonly type: ExternalWalletType = \"rabby\";\n readonly platform: ExternalPlatform = \"ethereum\";\n private account: string | undefined = undefined;\n private store = createStore();\n private provider: EIP6963ProviderDetail | undefined;\n private connectedAccounts: string[] = [];\n\n constructor() {\n this.provider = this.store\n .getProviders()\n .find((provider) => provider.info.rdns === RABBY_RDNS);\n this.provider?.provider\n .request({\n method: \"eth_accounts\",\n })\n .then((accounts) => {\n this.connectedAccounts = accounts.map(getAddress);\n if (accounts.length > 0) {\n this.account = getAddress(accounts?.[0]);\n }\n });\n this.provider?.provider?.on(\"accountsChanged\", (accounts: string[]) => {\n if (accounts) {\n // rabby doesn't allow multiple accounts to be connected at the same time\n this.connectedAccounts = accounts.map((account) => getAddress(account));\n this.account = getAddress(accounts?.[0]);\n }\n });\n }\n\n isAvailable(): boolean {\n return typeof window !== \"undefined\" && !!this.provider;\n }\n\n getInfo(): ExternalWallet {\n const available = this.isAvailable();\n\n return {\n type: this.type,\n available,\n version: available ? window.ethereum?.version || \"Unknown\" : undefined,\n chainId: available ? window.ethereum?.chainId : undefined,\n name: \"Rabby\",\n platform: this.platform,\n connectedAccounts: this.connectedAccounts,\n };\n }\n\n async connect(address?: string): Promise<ExternalWalletResponse<any>> {\n if (address && this.connectedAccounts.includes(getAddress(address))) {\n this.account = getAddress(address);\n }\n\n if (this.account) {\n return { success: true, wallet: this.type, account: this.account };\n }\n\n try {\n if (!this.isAvailable()) {\n throw new Error(\"Rabby is not available\");\n }\n\n const accounts = await this.provider?.provider.request({\n method: \"eth_requestAccounts\",\n });\n if (accounts && accounts.length > 0) {\n this.account = getAddress(accounts[0]);\n this.connectedAccounts = accounts.map(getAddress);\n return { success: true, wallet: this.type, account: this.account };\n }\n\n throw new Error(\"No accounts found\");\n } catch (error) {\n console.error(`Error connecting to Rabby:`, error);\n return {\n success: false,\n wallet: this.type,\n error: (error as Error).message || \"Unknown error\",\n };\n }\n }\n\n getConnectedAccounts(): string[] {\n return this.connectedAccounts;\n }\n\n async signTransaction(\n transaction: any,\n ): Promise<ExternalWalletResponse<any>> {\n try {\n if (!this.isAvailable() || !this.account) {\n throw new Error(\"Rabby is not connected\");\n }\n\n const ethereum = this.provider?.provider;\n if (!ethereum) {\n throw new Error(\"Rabby is not connected\");\n }\n\n const result = await ethereum.request({\n method: \"eth_sendTransaction\",\n params: [transaction],\n });\n\n return { success: true, wallet: this.type, result };\n } catch (error) {\n console.error(`Error signing transaction with Rabby:`, error);\n return {\n success: false,\n wallet: this.type,\n error: (error as Error).message || \"Unknown error\",\n };\n }\n }\n\n async signMessage(\n message: `0x${string}`,\n address?: string,\n ): Promise<ExternalWalletResponse<any>> {\n try {\n if (!this.isAvailable() || !this.account) {\n throw new Error(\"Rabby is not connected\");\n }\n\n const result = await this.provider?.provider.request({\n method: \"personal_sign\",\n params: [address || this.account, message] as any,\n });\n\n return { success: true, wallet: this.type, result };\n } catch (error) {\n console.error(`Error signing message with Rabby:`, error);\n return {\n success: false,\n wallet: this.type,\n error: (error as Error).message || \"Unknown error\",\n };\n }\n }\n\n async signTypedData(data: any): Promise<ExternalWalletResponse<any>> {\n try {\n if (!this.isAvailable() || !this.account) {\n throw new Error(\"Rabby is not connected\");\n }\n\n const provider = this.provider?.provider;\n if (!provider) {\n throw new Error(\"Rabby is not connected\");\n }\n\n const result = await provider.request({\n method: \"eth_signTypedData_v4\",\n params: [this.account, JSON.stringify(data)] as any,\n });\n\n return { success: true, wallet: this.type, result };\n } catch (error) {\n console.error(`Error signing typed data with Rabby:`, error);\n return {\n success: false,\n wallet: this.type,\n error: (error as Error).message || \"Unknown error\",\n };\n }\n }\n\n async sendTransaction(_txn: any): Promise<ExternalWalletResponse<any>> {\n return {\n success: false,\n wallet: this.type,\n error: \"Not implemented\",\n };\n }\n\n async switchChain(chainId: string): Promise<boolean> {\n try {\n if (!this.isAvailable()) {\n throw new Error(\"Rabby is not available\");\n }\n\n const provider = this.provider?.provider;\n if (!provider) {\n throw new Error(\"Rabby is not connected\");\n }\n\n try {\n await provider.request({\n method: \"wallet_switchEthereumChain\",\n params: [{ chainId }],\n });\n return true;\n } catch (error) {\n if ((error as any).code === 4902) {\n console.warn(\"Chain not added to Rabby\");\n }\n throw error;\n }\n } catch (error) {\n console.error(`Error switching chain for Rabby:`, error);\n return false;\n }\n }\n\n async getBalance(\n tokenAddress?: string,\n ): Promise<ExternalWalletResponse<any>> {\n try {\n if (!this.isAvailable() || !this.account) {\n throw new Error(\"Rabby is not connected\");\n }\n\n if (tokenAddress) {\n return {\n success: false,\n wallet: this.type,\n error: \"Not implemented for ERC20\",\n };\n } else {\n const provider = this.provider?.provider;\n if (!provider) {\n throw new Error(\"Rabby is not connected\");\n }\n\n const balance = await provider.request({\n method: \"eth_getBalance\",\n params: [this.account, \"latest\"] as any,\n });\n return { success: true, wallet: this.type, result: balance };\n }\n } catch (error) {\n console.error(`Error getting balance from Rabby:`, error);\n return {\n success: false,\n wallet: this.type,\n error: (error as Error).message || \"Unknown error\",\n };\n }\n }\n}\n","import { getAddress } from \"ethers\";\nimport { ArgentWallet } from \"./argent\";\nimport { MetaMaskWallet } from \"./metamask\";\nimport { PhantomWallet } from \"./phantom\";\nimport { RabbyWallet } from \"./rabby\";\nimport {\n ExternalWallet,\n ExternalWalletResponse,\n ExternalWalletType,\n WalletAdapter,\n} from \"./types\";\n\nexport class WalletBridge {\n private readonly walletAdapters: Map<ExternalWalletType, WalletAdapter>;\n\n constructor() {\n this.walletAdapters = new Map<ExternalWalletType, WalletAdapter>();\n\n if (typeof window == \"undefined\") {\n return;\n }\n\n const metamask = new MetaMaskWallet();\n metamask.isAvailable() && this.walletAdapters.set(\"metamask\", metamask);\n\n const phantom = new PhantomWallet();\n phantom.isAvailable() && this.walletAdapters.set(\"phantom\", phantom);\n\n const argent = new ArgentWallet();\n argent.isAvailable() && this.walletAdapters.set(\"argent\", argent);\n\n const rabby = new RabbyWallet();\n rabby.isAvailable() && this.walletAdapters.set(\"rabby\", rabby);\n\n window.wallet_bridge = this;\n }\n\n getIFrameMethods() {\n return {\n externalDetectWallets: (_origin: string) => () => this.detectWallets(),\n externalConnectWallet: (_origin: string) => (type: ExternalWalletType) =>\n this.connectWallet(type),\n externalSignMessage:\n (_origin: string) =>\n (identifier: ExternalWalletType | string, message: string) =>\n this.signMessage(identifier, message),\n externalSignTypedData:\n (_origin: string) =>\n (identifier: ExternalWalletType | string, data: any) =>\n this.signTypedData(identifier, data),\n externalSendTransaction:\n (_origin: string) =>\n (identifier: ExternalWalletType | string, txn: any) =>\n this.sendTransaction(identifier, txn),\n externalGetBalance:\n (_origin: string) =>\n (identifier: ExternalWalletType | string, tokenAddress?: string) =>\n this.getBalance(identifier, tokenAddress),\n };\n }\n\n async detectWallets(): Promise<ExternalWallet[]> {\n const wallets = Array.from(this.walletAdapters.values()).map((adapter) =>\n adapter.getInfo(),\n ) as ExternalWallet[];\n\n return wallets;\n }\n\n private getWalletAdapterByType(type: ExternalWalletType): WalletAdapter {\n const adapter = this.walletAdapters.get(type);\n if (!adapter) {\n throw new Error(`Unsupported wallet type: ${type}`);\n }\n return adapter;\n }\n\n private handleError(\n identifier: ExternalWalletType | string,\n error: unknown,\n operation: string,\n responseType?: ExternalWalletType,\n ): ExternalWalletResponse {\n const errorMessage =\n error instanceof Error ? error.message : \"Unknown error\";\n let walletType: ExternalWalletType | string = \"unknown\";\n if (typeof identifier === \"string\") {\n const adapter = this.getConnectedWalletAdapter(identifier);\n walletType = responseType ?? adapter?.type ?? identifier;\n } else {\n walletType = identifier;\n }\n\n console.error(`Error ${operation} with ${identifier} wallet:`, error);\n return {\n success: false,\n wallet: walletType as ExternalWalletType,\n error: errorMessage,\n };\n }\n\n async connectWallet(\n type: ExternalWalletType,\n ): Promise<ExternalWalletResponse> {\n try {\n const wallet = this.getWalletAdapterByType(type);\n const response = await wallet.connect();\n\n if (response.success && response.account) {\n console.log(\n `Wallet ${type} connected with address ${response.account}`,\n );\n } else if (response.success && !response.account) {\n console.error(\n `Wallet ${type} connected successfully but did not provide an address.`,\n );\n return {\n ...response,\n success: false,\n error: \"Wallet connected but address not found.\",\n };\n }\n\n return response;\n } catch (error) {\n return this.handleError(type, error, \"connecting to\");\n }\n }\n\n private getConnectedWalletAdapter(\n identifier: ExternalWalletType | string,\n ): WalletAdapter {\n let wallet: WalletAdapter | undefined;\n if (typeof identifier === \"string\") {\n // this is an address\n const checkSummedAddress = getAddress(identifier);\n\n wallet = this.walletAdapters.values().find((adapter) => {\n return adapter.getConnectedAccounts().includes(checkSummedAddress);\n });\n } else {\n wallet = this.walletAdapters.get(identifier);\n }\n\n if (!wallet) {\n throw new Error(\n `Wallet with identifier ${identifier} is not connected or supported`,\n );\n }\n return wallet;\n }\n\n async signMessage(\n identifier: ExternalWalletType | string,\n message: string,\n ): Promise<ExternalWalletResponse> {\n let wallet: WalletAdapter | undefined;\n try {\n wallet = this.getConnectedWalletAdapter(identifier);\n if (!wallet.signMessage) {\n throw new Error(\n `Wallet type ${wallet.type} (identifier: ${identifier}) does not support signing messages`,\n );\n }\n return await wallet.signMessage(message, identifier);\n } catch (error) {\n return this.handleError(\n identifier,\n error,\n \"signing message with\",\n wallet?.type,\n );\n }\n }\n\n async signTypedData(\n identifier: ExternalWalletType | string,\n data: any,\n ): Promise<ExternalWalletResponse> {\n let wallet: WalletAdapter | undefined;\n try {\n wallet = this.getConnectedWalletAdapter(identifier);\n if (!wallet.signTypedData) {\n throw new Error(\n `Wallet type ${wallet.type} (identifier: ${identifier}) does not support signing typed data`,\n );\n }\n return await wallet.signTypedData(data);\n } catch (error) {\n return this.handleError(\n identifier,\n error,\n \"signing typed data with\",\n wallet?.type,\n );\n }\n }\n\n async sendTransaction(\n identifier: ExternalWalletType | string,\n txn: any,\n ): Promise<ExternalWalletResponse> {\n let wallet: WalletAdapter | undefined;\n try {\n wallet = this.getConnectedWalletAdapter(identifier);\n return await wallet.sendTransaction(txn);\n } catch (error) {\n return this.handleError(\n identifier,\n error,\n \"sending transaction with\",\n wallet?.type,\n );\n }\n }\n\n async getBalance(\n identifier: ExternalWalletType | string,\n tokenAddress?: string,\n ): Promise<ExternalWalletResponse> {\n let wallet: WalletAdapter | undefined;\n try {\n wallet = this.getConnectedWalletAdapter(identifier);\n return await wallet.getBalance(tokenAddress);\n } catch (error) {\n return this.handleError(\n identifier,\n error,\n \"getting balance from\",\n wallet?.type,\n );\n }\n }\n}\n\ndeclare global {\n interface Window {\n ethereum?: any;\n solana?: any;\n starknet_argentX?: any;\n wallet_bridge?: WalletBridge;\n }\n}\n\nexport type {\n ExternalWallet,\n ExternalWalletResponse,\n ExternalWalletType,\n WalletAdapter,\n} from \"./types\";\n","import { KEYCHAIN_URL } from \"../constants\";\nimport { Keychain, KeychainOptions } from \"../types\";\nimport { WalletBridge } from \"../wallets/bridge\";\nimport { IFrame, IFrameOptions } from \"./base\";\n\ntype KeychainIframeOptions = IFrameOptions<Keychain> &\n KeychainOptions & {\n version?: string;\n };\n\nexport class KeychainIFrame extends IFrame<Keychain> {\n private walletBridge: WalletBridge;\n\n constructor({\n url,\n policies,\n version,\n slot,\n namespace,\n tokens,\n ...iframeOptions\n }: KeychainIframeOptions) {\n const _url = new URL(url ?? KEYCHAIN_URL);\n const walletBridge = new WalletBridge();\n\n if (policies) {\n _url.searchParams.set(\n \"policies\",\n encodeURIComponent(JSON.stringify(policies)),\n );\n }\n\n if (version) {\n _url.searchParams.set(\"v\", encodeURIComponent(version));\n }\n\n if (slot) {\n _url.searchParams.set(\"ps\", encodeURIComponent(slot));\n }\n\n if (namespace) {\n _url.searchParams.set(\"ns\", encodeURIComponent(namespace));\n }\n\n if (tokens?.erc20) {\n _url.searchParams.set(\n \"erc20\",\n encodeURIComponent(tokens.erc20.toString()),\n );\n }\n\n super({\n ...iframeOptions,\n id: \"controller-keychain\",\n url: _url,\n methods: walletBridge.getIFrameMethods(),\n });\n\n this.walletBridge = walletBridge;\n\n // Expose the wallet bridge instance globally for WASM interop\n if (typeof window !== \"undefined\") {\n (window as any).external_wallets = this.walletBridge;\n }\n }\n\n getWalletBridge(): WalletBridge {\n return this.walletBridge;\n }\n}\n","import { AsyncMethodReturns } from \"@cartridge/penpal\";\n\nimport { Policy } from \"@cartridge/presets\";\nimport {\n AddInvokeTransactionResult,\n AddStarknetChainParameters,\n ChainId,\n} from \"@starknet-io/types-js\";\nimport { constants, shortString, WalletAccount } from \"starknet\";\nimport { version } from \"../package.json\";\nimport ControllerAccount from \"./account\";\nimport { NotReadyToConnect } from \"./errors\";\nimport { KeychainIFrame } from \"./iframe\";\nimport BaseProvider from \"./provider\";\nimport {\n Chain,\n ConnectError,\n ConnectReply,\n ControllerOptions,\n IFrames,\n Keychain,\n ProbeReply,\n ProfileContextTypeVariant,\n ResponseCodes,\n} from \"./types\";\nimport { parseChainId } from \"./utils\";\n\nexport default class ControllerProvider extends BaseProvider {\n private keychain?: AsyncMethodReturns<Keychain>;\n private options: ControllerOptions;\n private iframes: IFrames;\n private selectedChain: ChainId;\n private chains: Map<ChainId, Chain>;\n\n isReady(): boolean {\n return !!this.keychain;\n }\n\n constructor(options: ControllerOptions = {}) {\n super();\n\n // Default Cartridge chains that are always available\n const cartridgeChains: Chain[] = [\n { rpcUrl: \"https://api.cartridge.gg/x/starknet/sepolia\" },\n { rpcUrl: \"https://api.cartridge.gg/x/starknet/mainnet\" },\n ];\n\n // Merge user chains with default chains\n // User chains take precedence if they specify the same network\n const chains = [...cartridgeChains, ...(options.chains || [])];\n const defaultChainId =\n options.defaultChainId || constants.StarknetChainId.SN_MAIN;\n\n this.selectedChain = defaultChainId;\n this.chains = new Map<ChainId, Chain>();\n\n this.iframes = {\n keychain: new KeychainIFrame({\n ...options,\n onClose: this.keychain?.reset,\n onConnect: (keychain) => {\n this.keychain = keychain;\n },\n version: version,\n }),\n };\n\n this.options = { ...options, chains, defaultChainId };\n\n this.initializeChains(chains);\n\n if (typeof window !== \"undefined\") {\n (window as any).starknet_controller = this;\n }\n }\n\n async logout() {\n if (!this.keychain) {\n console.error(new NotReadyToConnect().message);\n return;\n }\n\n try {\n // Disconnect the controller/keychain first\n await this.disconnect();\n\n // Close all controller iframes\n const iframes = document.querySelectorAll('iframe[id^=\"controller-\"]');\n iframes.forEach((iframe) => {\n const container = iframe.parentElement;\n if (container) {\n // Start fade-out transition\n container.style.opacity = \"0\";\n // Set display: none after transition completes\n setTimeout(() => {\n container.style.display = \"none\";\n }, 200);\n }\n });\n\n // Reset body overflow\n if (document.body) {\n document.body.style.overflow = \"auto\";\n }\n\n // Reload the page to complete logout\n window.location.reload();\n } catch (err) {\n console.error(\"Logout failed:\", err);\n throw err;\n }\n }\n\n async probe(): Promise<WalletAccount | undefined> {\n try {\n await this.waitForKeychain();\n\n if (!this.keychain) {\n console.error(new NotReadyToConnect().message);\n return;\n }\n\n const response = (await this.keychain.probe(this.rpcUrl())) as ProbeReply;\n\n // For backwards compat with controller <=0.6.0\n let rpcUrl = response?.rpcUrl || this.rpcUrl();\n this.account = new ControllerAccount(\n this,\n rpcUrl,\n response.address,\n this.keychain,\n this.options,\n this.iframes.keychain,\n );\n } catch (e) {\n console.error(e);\n return;\n }\n\n return this.account;\n }\n\n async connect(): Promise<WalletAccount | undefined> {\n if (this.account) {\n return this.account;\n }\n\n if (!this.keychain || !this.iframes.keychain) {\n console.error(new NotReadyToConnect().message);\n return;\n }\n\n if (typeof document !== \"undefined\" && !!document.hasStorageAccess) {\n const ok = await document.hasStorageAccess();\n if (!ok) {\n await document.requestStorageAccess();\n }\n }\n\n this.iframes.keychain.open();\n\n try {\n let response = await this.keychain.connect(\n // Policy precedence logic:\n // 1. If shouldOverridePresetPolicies is true and policies are provided, use policies\n // 2. Otherwise, if preset is defined, use empty object (let preset take precedence)\n // 3. Otherwise, use provided policies or empty object\n this.options.shouldOverridePresetPolicies && this.options.policies\n ? this.options.policies\n : this.options.preset\n ? {}\n : this.options.policies || {},\n this.rpcUrl(),\n this.options.signupOptions,\n );\n if (response.code !== ResponseCodes.SUCCESS) {\n throw new Error(response.message);\n }\n\n response = response as ConnectReply;\n this.account = new ControllerAccount(\n this,\n this.rpcUrl(),\n response.address,\n this.keychain,\n this.options,\n this.iframes.keychain,\n );\n\n return this.account;\n } catch (e) {\n console.log(e);\n } finally {\n this.iframes.keychain.close();\n }\n }\n\n async switchStarknetChain(chainId: string): Promise<boolean> {\n if (!this.keychain || !this.iframes.keychain) {\n console.error(new NotReadyToConnect().message);\n return false;\n }\n\n try {\n this.selectedChain = chainId;\n const response = (await this.keychain.probe(this.rpcUrl())) as ProbeReply;\n\n if (response.rpcUrl === this.rpcUrl()) {\n return true;\n }\n\n await this.keychain.switchChain(this.rpcUrl());\n } catch (e) {\n console.error(e);\n return false;\n }\n\n this.emitNetworkChanged(chainId);\n return true;\n }\n\n addStarknetChain(_chain: AddStarknetChainParameters): Promise<boolean> {\n return Promise.resolve(true);\n }\n\n async disconnect() {\n if (!this.keychain) {\n console.error(new NotReadyToConnect().message);\n return;\n }\n\n if (typeof document !== \"undefined\" && !!document.hasStorageAccess) {\n const ok = await document.hasStorageAccess();\n if (!ok) {\n await document.requestStorageAccess();\n }\n }\n\n this.account = undefined;\n return this.keychain.disconnect();\n }\n\n async openProfile(tab: ProfileContextTypeVariant = \"inventory\") {\n // Profile functionality is now integrated into keychain\n // Navigate keychain iframe to profile page\n if (!this.keychain || !this.iframes.keychain) {\n console.error(new NotReadyToConnect().message);\n return;\n }\n if (!this.account) {\n console.error(\"Account is not ready\");\n return;\n }\n const username = await this.keychain.username();\n\n // Navigate first, then open to avoid flash\n await this.keychain.navigate(`/account/${username}/${tab}`);\n this.iframes.keychain.open();\n }\n\n async openProfileTo(to: string) {\n // Profile functionality is now integrated into keychain\n if (!this.keychain || !this.iframes.keychain) {\n console.error(new NotReadyToConnect().message);\n return;\n }\n if (!this.account) {\n console.error(\"Account is not ready\");\n return;\n }\n\n const username = await this.keychain.username();\n await this.keychain.navigate(`/account/${username}/${to}`);\n this.iframes.keychain.open();\n }\n\n async openProfileAt(at: string) {\n // Profile functionality is now integrated into keychain\n if (!this.keychain || !this.iframes.keychain) {\n console.error(new NotReadyToConnect().message);\n return;\n }\n if (!this.account) {\n console.error(\"Account is not ready\");\n return;\n }\n\n await this.keychain.navigate(at);\n this.iframes.keychain.open();\n }\n\n openSettings() {\n if (!this.keychain || !this.iframes.keychain) {\n console.error(new NotReadyToConnect().message);\n return;\n }\n this.iframes.keychain.open();\n this.keychain.openSettings();\n }\n\n revoke(origin: string, _policy: Policy[]) {\n if (!this.keychain) {\n console.error(new NotReadyToConnect().message);\n return null;\n }\n\n return this.keychain.revoke(origin);\n }\n\n rpcUrl(): string {\n const chain = this.chains.get(this.selectedChain);\n if (!chain) {\n const availableChains = Array.from(this.chains.keys()).map((chain) =>\n shortString.decodeShortString(chain),\n );\n throw new Error(\n `Chain not found: ${shortString.decodeShortString(this.selectedChain)}. Available chains: ${availableChains.join(\", \")}`,\n );\n }\n return chain.rpcUrl;\n }\n\n username() {\n if (!this.keychain) {\n console.error(new NotReadyToConnect().message);\n return;\n }\n\n return this.keychain.username();\n }\n\n openPurchaseCredits() {\n if (!this.keychain || !this.iframes.keychain) {\n console.error(new NotReadyToConnect().message);\n return;\n }\n this.iframes.keychain.open();\n this.keychain.openPurchaseCredits();\n }\n\n openStarterPack(starterpackId: string) {\n if (!this.keychain || !this.iframes.keychain) {\n console.error(new NotReadyToConnect().message);\n return;\n }\n\n // Navigate first, then open the iframe\n this.keychain.navigate(`/starter-pack/${starterpackId}`).then(() => {\n this.iframes.keychain.open();\n });\n }\n\n async openExecute(calls: any, chainId?: string) {\n if (!this.keychain || !this.iframes.keychain) {\n console.error(new NotReadyToConnect().message);\n return;\n }\n // Switch to the chain if provided\n let currentChainId = this.selectedChain;\n if (chainId) {\n this.switchStarknetChain(chainId);\n }\n // Open keychain\n this.iframes.keychain.open();\n // Invoke execute\n const res = await this.keychain.execute(calls, undefined, undefined, true);\n // Close keychain\n this.iframes.keychain.close();\n // Switch back to the original chain\n if (chainId) {\n this.switchStarknetChain(currentChainId);\n }\n const status = !(\n res &&\n ((res as ConnectError).code === ResponseCodes.NOT_CONNECTED ||\n (res as ConnectError).code === ResponseCodes.CANCELED)\n );\n return {\n status,\n transactionHash: (res as AddInvokeTransactionResult)?.transaction_hash,\n };\n }\n\n async delegateAccount() {\n if (!this.keychain) {\n console.error(new NotReadyToConnect().message);\n return null;\n }\n\n return await this.keychain.delegateAccount();\n }\n\n private initializeChains(chains: Chain[]) {\n for (const chain of chains) {\n try {\n const url = new URL(chain.rpcUrl);\n const chainId = parseChainId(url);\n\n // Validate that mainnet and sepolia must use Cartridge RPC\n const isMainnet = chainId === constants.StarknetChainId.SN_MAIN;\n const isSepolia = chainId === constants.StarknetChainId.SN_SEPOLIA;\n const isCartridgeRpc = url.hostname === \"api.cartridge.gg\";\n const isLocalhost =\n url.hostname === \"localhost\" || url.hostname === \"127.0.0.1\";\n\n if ((isMainnet || isSepolia) && !(isCartridgeRpc || isLocalhost)) {\n throw new Error(\n `Only Cartridge RPC providers are allowed for ${isMainnet ? \"mainnet\" : \"sepolia\"}. ` +\n `Please use: https://api.cartridge.gg/x/starknet/${isMainnet ? \"mainnet\" : \"sepolia\"}`,\n );\n }\n\n this.chains.set(chainId, chain);\n } catch (error) {\n console.error(`Failed to parse chainId for ${chain.rpcUrl}:`, error);\n throw error; // Re-throw to ensure invalid chains fail fast\n }\n }\n\n if (!this.chains.has(this.selectedChain)) {\n console.warn(\n `Selected chain ${this.selectedChain} not found in configured chains. ` +\n `Available chains: ${Array.from(this.chains.keys()).join(\", \")}`,\n );\n }\n }\n\n private waitForKeychain({\n timeout = 50000,\n interval = 100,\n }:\n | {\n timeout?: number;\n interval?: number;\n }\n | undefined = {}) {\n return new Promise<void>((resolve, reject) => {\n const startTime = Date.now();\n const id = setInterval(() => {\n if (Date.now() - startTime > timeout) {\n clearInterval(id);\n reject(new Error(\"Timeout waiting for keychain\"));\n return;\n }\n\n if (!this.keychain) return;\n\n clearInterval(id);\n resolve();\n }, interval);\n });\n }\n}\n","import { LookupRequest, LookupResponse } from \"./types\";\nimport { num } from \"starknet\";\nimport { API_URL } from \"./constants\";\n\nconst cache = new Map<string, string>();\n\nasync function lookup(request: LookupRequest): Promise<LookupResponse> {\n if (!request.addresses?.length && !request.usernames?.length) {\n return { results: [] };\n }\n\n const response = await fetch(`${API_URL}/lookup`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(request),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n return response.json();\n}\n\nexport async function lookupUsernames(\n usernames: string[],\n): Promise<Map<string, string>> {\n const uncachedUsernames = usernames.filter((name) => !cache.has(name));\n\n if (uncachedUsernames.length > 0) {\n const response = await lookup({ usernames: uncachedUsernames });\n\n response.results.forEach((result) => {\n cache.set(result.username, result.addresses[0]); // TODO: handle multiple controller addresses\n });\n }\n\n return new Map(\n usernames\n .map((name) => [name, cache.get(name)] as [string, string])\n .filter((entry): entry is [string, string] => entry[1] !== undefined),\n );\n}\n\nexport async function lookupAddresses(\n addresses: string[],\n): Promise<Map<string, string>> {\n addresses = addresses.map(num.toHex);\n const uncachedAddresses = addresses.filter((addr) => !cache.has(addr));\n\n if (uncachedAddresses.length > 0) {\n const response = await lookup({\n addresses: uncachedAddresses,\n });\n\n response.results.forEach((result) => {\n cache.set(result.addresses[0], result.username); // TODO: handle multiple controller addresses\n });\n }\n\n return new Map(\n addresses\n .map((addr) => [addr, cache.get(addr)] as [string, string])\n .filter((entry): entry is [string, string] => entry[1] !== undefined),\n );\n}\n","// src/generated/erc20-metadata.ts\nvar metadata = [\n {\n name: \"Wrapped BTC\",\n symbol: \"WBTC\",\n decimals: 8,\n l2_token_address: \"0x03fe2b97c1fd336e750087d68b9b867997fd64a2661ff3ca5a7c771641e8e7ac\",\n sort_order: 0,\n total_supply: null,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/7dcb2db2-a7a7-44af-660b-8262e057a100/logo\"\n },\n {\n name: \"USD Coin\",\n symbol: \"USDC\",\n decimals: 6,\n l2_token_address: \"0x053c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8\",\n sort_order: 5,\n total_supply: null,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/e5aaa970-a998-47e8-bd43-4a3b56b87200/logo\"\n },\n {\n name: \"LUSD Stablecoin\",\n symbol: \"LUSD\",\n decimals: 18,\n l2_token_address: \"0x070a76fd48ca0ef910631754d77dd822147fe98a569b826ec85e3c33fde586ac\",\n sort_order: 3,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/dc0ae733-5498-4afa-f475-48dba677aa00/logo\"\n },\n {\n name: \"Tether USD\",\n symbol: \"USDT\",\n decimals: 6,\n l2_token_address: \"0x068f5c6a61780768455de69077e07e89787839bf8166decfbf92b645209c0fb8\",\n sort_order: 4,\n total_supply: null,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/c8a721d1-07c3-46e4-ab4e-523977c30b00/logo\"\n },\n {\n name: \"Ether\",\n symbol: \"ETH\",\n decimals: 18,\n l2_token_address: \"0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7\",\n sort_order: 3,\n total_supply: null,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/e07829b7-0382-4e03-7ecd-a478c5aa9f00/logo\"\n },\n {\n name: \"Dai Stablecoin\",\n symbol: \"DAIv0\",\n decimals: 18,\n l2_token_address: \"0x00da114221cb83fa859dbdb4c44beeaa0bb37c7537ad5ae66fe5e0efd20e6eb3\",\n sort_order: 4,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/919e761b-56f7-4f53-32aa-5e066f7f6200/logo\"\n },\n {\n name: \"Dai Stablecoin\",\n symbol: \"DAI\",\n decimals: 18,\n l2_token_address: \"0x05574eb6b8789a91466f902c380d978e472db68170ff82a5b650b95a58ddf4ad\",\n sort_order: 4,\n total_supply: null,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/919e761b-56f7-4f53-32aa-5e066f7f6200/logo\"\n },\n {\n name: \"Legacy Starknet Wrapped Staked Ether\",\n symbol: \"wstETH-legacy\",\n decimals: 18,\n l2_token_address: \"0x042b8f0484674ca266ac5d08e4ac6a3fe65bd3129795def2dca5c34ecc5f96d2\",\n sort_order: 1,\n total_supply: null,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/26162dcc-29c2-4f5e-3acd-5e6be1f07a00/logo\"\n },\n {\n name: \"Wrapped Staked Ether\",\n symbol: \"wstETH\",\n decimals: 18,\n l2_token_address: \"0x0057912720381af14b0e5c87aa4718ed5e527eab60b3801ebf702ab09139e38b\",\n sort_order: 1,\n total_supply: null,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/dbbcbdea-1a92-437d-3701-4a5ee129d000/logo\"\n },\n {\n name: \"Rocket Pool ETH\",\n symbol: \"rETH\",\n decimals: 18,\n l2_token_address: \"0x0319111a5037cbec2b3e638cc34a3474e2d2608299f3e62866e9cc683208c610\",\n sort_order: 1,\n total_supply: null,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/c9f2d6fe-fbc6-4384-0990-923dfcb7a200/logo\"\n },\n {\n name: \"LORDS\",\n symbol: \"LORDS\",\n decimals: 18,\n l2_token_address: \"0x0124aeb495b947201f5fac96fd1138e326ad86195b98df6dec9009158a533b49\",\n sort_order: 1,\n total_supply: 509e5,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/a3bfe959-50c4-4f89-0aef-b19207d82a00/logo\"\n },\n {\n name: \"R Stablecoin\",\n symbol: \"R\",\n decimals: 18,\n l2_token_address: \"0x01fa2fb85f624600112040e1f3a848f53a37ed5a7385810063d5fe6887280333\",\n sort_order: 3,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/77612e4e-f7ee-4dba-2066-af321843ef00/logo\"\n },\n {\n name: \"Frax\",\n symbol: \"FRAX\",\n decimals: 18,\n l2_token_address: \"0x009c6b4fb13dfaa025c1383ed6190af8ed8cbb09d9588a3bb020feb152442406\",\n sort_order: 1,\n total_supply: 649462235,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/eeaf0779-e492-474c-ef19-b27843525600/logo\"\n },\n {\n name: \"Frax Share\",\n symbol: \"FXS\",\n decimals: 18,\n l2_token_address: \"0x0058efd0e73c33a848ffaa88738d128ebf0af98ea78cf3c14dc757bb02d39ffb\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/98bea621-1e4f-4d63-9689-bdaef0d56500/logo\"\n },\n {\n name: \"Staked Frax Ether\",\n symbol: \"sfrxETH\",\n decimals: 18,\n l2_token_address: \"0x04578fffc279e61b5cb0267a5f8e24b6089d40f93158fbbad2cb23b8622c9233\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/cd6fe18a-25db-4de9-758a-daf3b364ea00/logo\"\n },\n {\n name: \"Uniswap\",\n symbol: \"UNI\",\n decimals: 18,\n l2_token_address: \"0x049210ffc442172463f3177147c1aeaa36c51d152c1b0630f2364c300d4f48ee\",\n sort_order: 1,\n total_supply: 1e9,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/361b018e-bd53-4019-27c8-7cf8d9031b00/logo\"\n },\n {\n name: \"Paper\",\n symbol: \"PAPER\",\n decimals: 18,\n l2_token_address: \"0x0410466536b5ae074f7fea81e5533b8134a9fa08b3dd077dd9db08f64997d113\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/811f019a-0461-4cff-6c1e-442102863f00/logo\"\n },\n {\n name: \"StarkPepe\",\n symbol: \"xSPEPE\",\n decimals: 18,\n l2_token_address: \"0x06f15ec4b6ff0b7f7a216c4b2ccdefc96cbf114d6242292ca82971592f62273b\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n disabled: true\n },\n {\n name: \"StarkNet Token\",\n symbol: \"STRK\",\n decimals: 18,\n l2_token_address: \"0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d\",\n sort_order: 2,\n total_supply: 1e10,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/1b126320-367c-48ed-cf5a-ba7580e49600/logo\"\n },\n {\n name: \"zkLend Token\",\n symbol: \"ZEND\",\n decimals: 18,\n l2_token_address: \"0x00585c32b625999e6e5e78645ff8df7a9001cf5cf3eb6b80ccdd16cb64bd3a34\",\n sort_order: 1,\n total_supply: null,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/95515b0e-1230-4158-10f1-56888f613c00/logo\"\n },\n {\n name: \"Ekubo Protocol\",\n symbol: \"EKUBO\",\n decimals: 18,\n l2_token_address: \"0x075afe6402ad5a5c20dd25e10ec3b3986acaa647b77e4ae24b0cbc9a54a27a87\",\n sort_order: 1,\n total_supply: 1e7,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/634d9c36-2f0b-4781-93e6-72d701b5af00/logo\"\n },\n {\n name: \"SOCKS\",\n symbol: \"SOCKS\",\n decimals: 18,\n l2_token_address: \"0x023ed2ba4fb5709302c5dfd739fa7613359042f143286c115b6c7f7dc2601015\",\n sort_order: 1,\n total_supply: 1e11,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/2db5a2a6-c98e-4b80-35e0-31b489132100/logo\"\n },\n {\n name: \"Nostra\",\n symbol: \"NSTR\",\n decimals: 18,\n l2_token_address: \"0x00c530f2c0aa4c16a0806365b0898499fba372e5df7a7172dc6fe9ba777e8007\",\n sort_order: 1,\n total_supply: 1e8,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/a45c2224-17a7-4269-ea7e-3924e9755800/logo\"\n },\n {\n name: \"Carmine\",\n symbol: \"CRM\",\n decimals: 18,\n l2_token_address: \"0x51c4b1fe3bf6774b87ad0b15ef5d1472759076e42944fff9b9f641ff13e5bbe\",\n sort_order: 1,\n total_supply: 1e8,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/6ab817f1-8075-4a94-6e14-f112f1f89d00/logo\"\n },\n {\n name: \"Cash\",\n symbol: \"CASH\",\n decimals: 18,\n l2_token_address: \"0x498edfaf50ca5855666a700c25dd629d577eb9afccdf3b5977aec79aee55ada\",\n sort_order: 3,\n total_supply: null,\n hidden: false,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/6bd6d156-f509-4b51-5dfc-3ee566143600/logo\"\n },\n {\n name: \"Nums\",\n symbol: \"NUMS\",\n decimals: 18,\n l2_token_address: \"0xe5f10eddc01699dc899a30dbc3c9858148fa4aa0a47c0ffd85f887ffc4653e\",\n sort_order: 1,\n total_supply: 1,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/90868d05-cb75-4c42-278c-5a540db2cf00/logo\"\n },\n {\n name: \"Flip\",\n symbol: \"FLIP\",\n decimals: 18,\n l2_token_address: \"0x01bfe97d729138fc7c2d93c77d6d1d8a24708d5060608017d9b384adf38f04c7\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/275f0fa8-a691-471c-ace6-0eb0315dde00/logo\"\n },\n {\n name: \"Eternum Stone\",\n symbol: \"STONE\",\n decimals: 18,\n l2_token_address: \"0x439a1c010e3e1bb2d43d43411000893c0042bd88f6c701611a0ea914d426da4\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/932e7f83-a4c2-40f0-3048-35af3b194100/logo\"\n },\n {\n name: \"Eternum Coal\",\n symbol: \"COAL\",\n decimals: 18,\n l2_token_address: \"0xce635e3f241b0ae78c46a929d84a9101910188f9c4024eaa7559556503c31a\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/cf2ee180-06bf-4443-e3aa-724d7c28e800/logo\"\n },\n {\n name: \"Eternum Wood\",\n symbol: \"WOOD\",\n decimals: 18,\n l2_token_address: \"0x40d8907cec0f7ae9c364dfb12485a1314d84c129bf1898d2f3d4b7fcc7d44f4\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/1db5f954-c1ef-447e-9f8f-05bd9f3b2b00/logo\"\n },\n {\n name: \"Eternum Copper\",\n symbol: \"COPPER\",\n decimals: 18,\n l2_token_address: \"0x66ed5c928ee027a9419ace1cbea8389885161db5572a7c5c4fef2310e9bf494\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/6bbcdcc9-6146-404d-9501-92a664cf3100/logo\"\n },\n {\n name: \"Eternum Ironwood\",\n symbol: \"IRONWOOD\",\n decimals: 18,\n l2_token_address: \"0x1720cf6318bff45e62acc588680ae3cd4d5f8465b1d52cb710533c9299b031a\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/5af7c03b-e4ae-4aee-eba4-a4e2160a1d00/logo\"\n },\n {\n name: \"Eternum Obsidian\",\n symbol: \"OBSIDIAN\",\n decimals: 18,\n l2_token_address: \"0x3b6448d09dcd023507376402686261f5d6739455fa02f804907b066e488da66\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/8be9bc66-486b-4181-6804-725a1db8ad00/logo\"\n },\n {\n name: \"Eternum Gold\",\n symbol: \"GOLD\",\n decimals: 18,\n l2_token_address: \"0xdff9dca192609c4e86ab3be22c7ec1e968876c992d21986f3c542be97fa2f\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/fb9e90f7-3c2f-4c64-7e43-c3f694f35e00/logo\"\n },\n {\n name: \"Eternum Silver\",\n symbol: \"SILVER\",\n decimals: 18,\n l2_token_address: \"0x6fe21d2d4a8a05bdb70f09c9250af9870020d5dcc35f410b4a39d6605c3e353\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/e443afeb-850b-46a0-a7ba-a473306d6b00/logo\"\n },\n {\n name: \"Eternum Mithral\",\n symbol: \"MITHRAL\",\n decimals: 18,\n l2_token_address: \"0x67ba235c569c23877064b2ac6ebd4d79f32d3c00f5fab8e28a3b5700b957f6\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/33dc517f-8a66-45eb-f2c5-de5388e47500/logo\"\n },\n {\n name: \"Eternum Alchemical Silver\",\n symbol: \"ALCHEMICALSILVER\",\n decimals: 18,\n l2_token_address: \"0x3956a5301e99522038a2e7dcb9c2a89bf087ffa79310ee0a508b5538efd8ddd\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/3d2e0fd8-4af8-49a0-4bdb-691a4d6ef800/logo\"\n },\n {\n name: \"Eternum Cold Iron\",\n symbol: \"COLDIRON\",\n decimals: 18,\n l2_token_address: \"0x555d713e59d4ff96b7960447e9bc9e79bfdeab5b0eea74e3df81bce61cfbc77\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/878c0d8a-8e2c-4281-0896-9cbbb2ef9400/logo\"\n },\n {\n name: \"Eternum Deep Crystal\",\n symbol: \"DEEPCRYSTAL\",\n decimals: 18,\n l2_token_address: \"0x1d655ac834d38df7921074fc1588411e202b1af83307cbd996983aff52db3a8\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/1c2c954f-448c-476b-a4a6-19b52efe3e00/logo\"\n },\n {\n name: \"Eternum Ruby\",\n symbol: \"RUBY\",\n decimals: 18,\n l2_token_address: \"0x3d9b66720959d0e7687b898292c10e62e78626f2dba5e1909961a2ce3f86612\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/6a45b34d-3bfe-4994-45b0-f2bee8abac00/logo\"\n },\n {\n name: \"Eternum Diamonds\",\n symbol: \"DIAMONDS\",\n decimals: 18,\n l2_token_address: \"0xe03ea8ae385f64754820af5c01c36abf1b8130dd6797d3fd9d430e4114e876\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/b1fa609d-8799-4754-cdea-ab69514ca700/logo\"\n },\n {\n name: \"Eternum Hartwood\",\n symbol: \"HARTWOOD\",\n decimals: 18,\n l2_token_address: \"0x5620aa7170cd66dbcbc37d03087bfe4633ffef91d3e4d97b501de906004f79b\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/27e37e85-91bd-4ee1-0552-1e0795077400/logo\"\n },\n {\n name: \"Eternum Ignium\",\n symbol: \"IGNIUM\",\n decimals: 18,\n l2_token_address: \"0x625c1f789b03ebebc7a9322366f38ebad1f693b84b2abd8cb8f5b2748b0cdd5\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/58591e20-24fb-4353-417a-81d877a5a200/logo\"\n },\n {\n name: \"Eternum Twilight Quartz\",\n symbol: \"TWILIGHTQUARTZ\",\n decimals: 18,\n l2_token_address: \"0x35e24c02409c3cfe8d5646399a62c4d102bb782938d5f5180e92c9c62d3faf7\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/2f8cb892-e82a-4af3-bd09-316061faec00/logo\"\n },\n {\n name: \"Eternum True Ice\",\n symbol: \"TRUEICE\",\n decimals: 18,\n l2_token_address: \"0x4485f5a6e16562e1c761cd348e63256d00389e3ddf4f5d98afe7ab44c57c481\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/fe4bfc17-6553-4dc5-58d2-f452b4aa8a00/logo\"\n },\n {\n name: \"Eternum Adamantine\",\n symbol: \"ADAMANTINE\",\n decimals: 18,\n l2_token_address: \"0x367f838f85a2f5e1580d6f011e4476f581083314cff8721ba3dda9706076eed\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/13bd026b-3612-480e-0119-04cf4c505a00/logo\"\n },\n {\n name: \"Eternum Sapphire\",\n symbol: \"SAPPHIRE\",\n decimals: 18,\n l2_token_address: \"0x2f8dd022568af8f9f718aa37707a9b858529db56910633a160456838b6cbcbc\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/0ebf555f-e732-4054-f8e5-55b2ed49ba00/logo\"\n },\n {\n name: \"Eternum Ethereal Silica\",\n symbol: \"ETHEREALSILICA\",\n decimals: 18,\n l2_token_address: \"0x68b6e23cbbd58a644700f55e96c83580921e9f521b6e5175396b53ba7910e7d\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/f02a5b43-bfcf-408c-7d1b-fcfe68b02d00/logo\"\n },\n {\n name: \"Eternum Dragon Hide\",\n symbol: \"DRAGONHIDE\",\n decimals: 18,\n l2_token_address: \"0x3bf856515bece3c93f5061b7941b8645f817a0acab93c758b8c7b4bc0afa3c6\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/e74955fc-5c8a-4dff-4882-a49a46a5a800/logo\"\n },\n {\n name: \"Eternum Ancient Fragment\",\n symbol: \"ANCIENTFRAGMENT\",\n decimals: 18,\n l2_token_address: \"0x0695b08ecdfdd828c2e6267da62f59e6d7543e690ef56a484df25c8566b332a5\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/9af855b7-4790-4390-9466-6bed4481ab00/logo\"\n },\n {\n name: \"Eternum Donkey\",\n symbol: \"DONKEY\",\n decimals: 18,\n l2_token_address: \"0x264be95a4a2ace20add68cb321acdccd2f9f8440ee1c7abd85da44ddab01085\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/20817378-a45e-4521-f464-10f6dd13c500/logo\"\n },\n {\n name: \"Eternum Knight\",\n symbol: \"KNIGHT\",\n decimals: 18,\n l2_token_address: \"0xac965f9e67164723c16735a9da8dbc9eb8e43b1bd0323591e87c056badf606\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/8787ed1f-af5c-4873-c01a-55f05e999a00/logo\"\n },\n {\n name: \"Eternum Crossbowman\",\n symbol: \"CROSSBOWMAN\",\n decimals: 18,\n l2_token_address: \"0x67e4ac00a241be06ba6afc11fa2715ec7da0c42c05a67ef6ecfcfeda725aaa8\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/dec7f31b-4b1d-46bb-4fca-c0253cf55a00/logo\"\n },\n {\n name: \"Eternum Paladin\",\n symbol: \"PALADIN\",\n decimals: 18,\n l2_token_address: \"0x3bc86299bee061c7c8d7546ccb62b9daf9bffc653b1508facb722c6593874bc\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/7d2cd5a5-f38a-49f6-11f8-ba3b59a59e00/logo\"\n },\n {\n name: \"Eternum Wheat\",\n symbol: \"WHEAT\",\n decimals: 18,\n l2_token_address: \"0x57a3f1ee475e072ce3be41785c0e889b7295d7a0dcc22b992c5b9408dbeb280\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/c338b6a8-77c4-4dd6-34f5-1af0d3fb1e00/logo\"\n },\n {\n name: \"Eternum Fish\",\n symbol: \"FISH\",\n decimals: 18,\n l2_token_address: \"0x27719173cfe10f1aa38d2aaed0a075b6077290f1e817aa3485d2b828394f4d9\",\n sort_order: 1,\n total_supply: null,\n hidden: true,\n logo_url: \"https://imagedelivery.net/0xPAQaDtnQhBs8IzYRIlNg/6deef27f-df40-4248-4e1b-ed1d79a3f000/logo\"\n },\n {\n name: \"Fools\",\n symbol: \"FOOLS\",\n decimals: 18,\n l2_token_address: \"0x068a7a07e08fc3e723a878223d00f669106780d5ea6665eb15d893476d47bf3b\",\n sort_order: 1,\n total_supply: null,\n logo_url: \"https://assets.underware.gg/pistols/fools.svg\"\n },\n {\n name: \"Fame\",\n symbol: \"FAME\",\n decimals: 18,\n l2_token_address: \"0x02549653a4ae1ff8d04a20b8820a49cbe97486c536ec0e4c8f68aa33d80067cf\",\n sort_order: 1,\n total_supply: null,\n logo_url: \"https://assets.underware.gg/pistols/fame.svg\"\n }\n];\n\n// configs/cartridge/config.json\nvar config_default = {\n origin: \"*\",\n theme: {\n name: \"Cartridge\",\n icon: \"icon.svg\"\n }\n};\n\n// src/config-loader.ts\nvar CONFIG_BASE_URL = \"https://static.cartridge.gg/presets\";\nasync function getConfigsIndex() {\n try {\n const response = await fetch(`${CONFIG_BASE_URL}/index.json`);\n if (!response.ok) {\n throw new Error(`Failed to load configs index: ${response.statusText}`);\n }\n return await response.json();\n } catch (error) {\n console.error(\"Error loading configs index:\", error);\n return { configs: [], baseUrl: CONFIG_BASE_URL };\n }\n}\nasync function getAvailableConfigs() {\n const indexData = await getConfigsIndex();\n return indexData.configs;\n}\nasync function loadConfig(configName) {\n try {\n const indexData = await getConfigsIndex();\n const baseUrl = indexData.baseUrl || CONFIG_BASE_URL;\n const prefix = `${baseUrl}/${configName}`;\n const response = await fetch(`${prefix}/config.json`);\n if (!response.ok) {\n throw new Error(\n `Failed to load config ${configName}: ${response.statusText}`\n );\n }\n const config = await response.json();\n if (config && config.theme) {\n if (config.theme.icon && !config.theme.icon.startsWith(\"http\")) {\n config.theme.icon = `${prefix}/${config.theme.icon}`;\n }\n if (config.theme.cover) {\n if (typeof config.theme.cover === \"string\") {\n if (!config.theme.cover.startsWith(\"http\")) {\n config.theme.cover = `${prefix}/${config.theme.cover}`;\n }\n } else {\n if (config.theme.cover.light && !config.theme.cover.light.startsWith(\"http\")) {\n config.theme.cover.light = `${prefix}/${config.theme.cover.light}`;\n }\n if (config.theme.cover.dark && !config.theme.cover.dark.startsWith(\"http\")) {\n config.theme.cover.dark = `${prefix}/${config.theme.cover.dark}`;\n }\n }\n }\n const prefixOptimizedImageSet = (imageSet) => {\n if (!imageSet) return;\n for (const format in imageSet) {\n if (imageSet[format]) {\n for (const size in imageSet[format]) {\n if (imageSet[format][size] && !imageSet[format][size].startsWith(\"http\")) {\n imageSet[format][size] = `${prefix}/${imageSet[format][size]}`;\n }\n }\n }\n }\n };\n if (config.theme.optimizedIcon) {\n prefixOptimizedImageSet(config.theme.optimizedIcon);\n }\n if (config.theme.optimizedCover) {\n if (typeof config.theme.optimizedCover === \"string\") {\n if (!config.theme.optimizedCover.startsWith(\"http\")) {\n config.theme.optimizedCover = `${prefix}/${config.theme.optimizedCover}`;\n }\n } else if (config.theme.optimizedCover.light || config.theme.optimizedCover.dark) {\n const themeVal = config.theme.optimizedCover;\n if (themeVal.light) {\n prefixOptimizedImageSet(themeVal.light);\n }\n if (themeVal.dark) {\n prefixOptimizedImageSet(themeVal.dark);\n }\n } else {\n prefixOptimizedImageSet(config.theme.optimizedCover);\n }\n }\n }\n return config;\n } catch (error) {\n console.error(`Error loading config ${configName}:`, error);\n return null;\n }\n}\nasync function loadAllConfigs() {\n const indexData = await getConfigsIndex();\n const availableConfigs = indexData.configs;\n const baseUrl = indexData.baseUrl || CONFIG_BASE_URL;\n const configsMap = {};\n await Promise.all(\n availableConfigs.map(async (configName) => {\n try {\n const response = await fetch(`${baseUrl}/${configName}/config.json`);\n if (response.ok) {\n const config = await response.json();\n configsMap[configName] = config;\n }\n } catch (error) {\n console.error(`Error loading config ${configName}:`, error);\n }\n })\n );\n return configsMap;\n}\n\n// src/index.ts\nconfig_default.theme.icon = \"https://static.cartridge.gg/presets/cartridge/icon.svg\";\nvar erc20Metadata = metadata;\nvar defaultTheme = config_default.theme;\nexport {\n defaultTheme,\n erc20Metadata,\n getAvailableConfigs,\n getConfigsIndex,\n loadAllConfigs,\n loadConfig\n};\n//# sourceMappingURL=index.js.map"],"names":["ControllerAccount","WalletAccount","provider","rpcUrl","address","keychain","options","modal","calls","toArray","resolve","reject","sessionExecute","ResponseCodes","manualExecute","typedData","sessionSign","manualSign","MessageType","Resolution","ErrorCode","NativeErrorName","NativeEventType","createDestructor","localName","log","callbacks","destroyed","error","callback","createLogger","debug","args","DEFAULT_PORT_BY_PROTOCOL","URL_REGEX","opaqueOriginSchemes","getOriginFromSrc","src","scheme","location","regexResult","protocol","hostname","port","portSuffix","serializeError","name","message","stack","deserializeError","obj","deserializedError","key","connectCallReceiver","info","serializedMethods","local","remote","originForSending","originForReceiving","handleMessageEvent","event","callMessage","methodName","id","createPromiseHandler","resolution","returnValue","err","errorReplyMessage","generateId","KEY_PATH_DELIMITER","keyPathToSegments","keyPath","segmentsToKeyPath","segments","createKeyPath","prefix","setAtKeyPath","subject","value","prevSubject","idx","serializeMethods","methods","flattenedMethods","deserializeMethods","connectCallSender","callSender","methodKeyPaths","destroyConnection","createMethodProxy","iframeRemoved","replyMessage","api","handleAckMessageFactory","childOrigin","destructor","destroy","onDestroy","destroyCallReceiver","receiverMethodNames","receiverMethodName","destroyCallSender","handleSynMessageFactory","synAckMessage","CHECK_IFRAME_IN_DOC_INTERVAL","monitorIframeRemoval","iframe","checkIframeInDocIntervalId","startConnectionTimeout","timeout","timeoutId","validateIframeHasSrcOrSrcDoc","connectToChild","handleSynMessage","handleAckMessage","stopConnectionTimeout","handleMessage","IFrame","url","preset","onClose","onConnect","container","e","_origin","child","observer","existingController","version","defineProperties","target","values","types","stringify","HEX","result","i","keys","k","makeError","code","shortMessage","details","assert","check","assertArgument","accum","form","_getBytes","copy","offset","getBytes","HexCharacters","hexlify","data","bytes","v","number","n","b","lengths","exists","instance","checkFinished","output","out","min","u8a","a","u32","arr","isLE","utf8ToBytes","str","toBytes","Hash","wrapConstructor","hashCons","hashC","msg","tmp","U32_MASK64","_32n","fromBig","le","split","lst","Ah","Al","h","l","rotlSH","s","rotlSL","rotlBH","rotlBL","SHA3_PI","SHA3_ROTL","_SHA3_IOTA","_0n","_1n","_2n","_7n","_256n","_0x71n","round","R","x","y","t","j","SHA3_IOTA_H","SHA3_IOTA_L","rotlH","rotlL","keccakP","rounds","B","idx1","idx0","B0","B1","Th","Tl","curH","curL","shift","PI","Keccak","blockLen","suffix","outputLen","enableXOF","state","len","pos","take","bufferOut","to","gen","keccak_256","locked","_keccak256","__keccak256","keccak256","_data","func","BN_0","BN_36","getChecksumAddress","chars","expanded","hashed","ibanLookup","safeDigits","ibanChecksum","c","block","checksum","Base36","fromBase36","getAddress","ArgentWallet","available","wallet","connectorData","connect","InjectedConnector","sig","_txn","_chainId","_tokenAddress","requestProviders","listener","handler","createStore","listeners","providerDetails","request","providerDetail","unwatch","rdns","emitImmediately","MetaMaskWallet","MetaMaskSDK","accounts","account","transaction","ethereum","chainId","tokenAddress","balance","PhantomWallet","response","encodedMessage","serailized_txn","txn","Transaction","RABBY_RDNS","RabbyWallet","WalletBridge","metamask","phantom","argent","rabby","type","identifier","adapter","operation","responseType","errorMessage","walletType","checkSummedAddress","KeychainIFrame","policies","slot","namespace","tokens","iframeOptions","_url","KEYCHAIN_URL","walletBridge","ControllerProvider","BaseProvider","chains","defaultChainId","constants","NotReadyToConnect","_chain","tab","username","at","origin","_policy","chain","availableChains","shortString","starterpackId","currentChainId","res","parseChainId","isMainnet","isSepolia","isCartridgeRpc","isLocalhost","interval","startTime","cache","lookup","API_URL","lookupUsernames","usernames","uncachedUsernames","entry","lookupAddresses","addresses","num","uncachedAddresses","addr","metadata","config_default","CONFIG_BASE_URL","getConfigsIndex","getAvailableConfigs","loadConfig","configName","config","prefixOptimizedImageSet","imageSet","format","size","themeVal","loadAllConfigs","indexData","availableConfigs","baseUrl","configsMap","erc20Metadata","defaultTheme"],"mappings":"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","x_google_ignoreList":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,17,18,19,20,21,22,23,24,25,26,28,29,37]}