{"version":3,"file":"index.cjs","sources":["../../../node_modules/events/events.js","../src/constants/client.ts","../src/constants/chains.ts","../src/constants/rpc.ts","../src/types/client.ts","../src/types/engine.ts","../src/utils/validator.ts","../src/utils/misc.ts","../src/controllers/engine.ts","../src/client.ts","../src/index.ts"],"sourcesContent":["// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar R = typeof Reflect === 'object' ? Reflect : null\nvar ReflectApply = R && typeof R.apply === 'function'\n  ? R.apply\n  : function ReflectApply(target, receiver, args) {\n    return Function.prototype.apply.call(target, receiver, args);\n  }\n\nvar ReflectOwnKeys\nif (R && typeof R.ownKeys === 'function') {\n  ReflectOwnKeys = R.ownKeys\n} else if (Object.getOwnPropertySymbols) {\n  ReflectOwnKeys = function ReflectOwnKeys(target) {\n    return Object.getOwnPropertyNames(target)\n      .concat(Object.getOwnPropertySymbols(target));\n  };\n} else {\n  ReflectOwnKeys = function ReflectOwnKeys(target) {\n    return Object.getOwnPropertyNames(target);\n  };\n}\n\nfunction ProcessEmitWarning(warning) {\n  if (console && console.warn) console.warn(warning);\n}\n\nvar NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n  return value !== value;\n}\n\nfunction EventEmitter() {\n  EventEmitter.init.call(this);\n}\nmodule.exports = EventEmitter;\nmodule.exports.once = once;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._eventsCount = 0;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nvar defaultMaxListeners = 10;\n\nfunction checkListener(listener) {\n  if (typeof listener !== 'function') {\n    throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n  }\n}\n\nObject.defineProperty(EventEmitter, 'defaultMaxListeners', {\n  enumerable: true,\n  get: function() {\n    return defaultMaxListeners;\n  },\n  set: function(arg) {\n    if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n      throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + arg + '.');\n    }\n    defaultMaxListeners = arg;\n  }\n});\n\nEventEmitter.init = function() {\n\n  if (this._events === undefined ||\n      this._events === Object.getPrototypeOf(this)._events) {\n    this._events = Object.create(null);\n    this._eventsCount = 0;\n  }\n\n  this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n  if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n    throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + n + '.');\n  }\n  this._maxListeners = n;\n  return this;\n};\n\nfunction _getMaxListeners(that) {\n  if (that._maxListeners === undefined)\n    return EventEmitter.defaultMaxListeners;\n  return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n  return _getMaxListeners(this);\n};\n\nEventEmitter.prototype.emit = function emit(type) {\n  var args = [];\n  for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n  var doError = (type === 'error');\n\n  var events = this._events;\n  if (events !== undefined)\n    doError = (doError && events.error === undefined);\n  else if (!doError)\n    return false;\n\n  // If there is no 'error' event listener then throw.\n  if (doError) {\n    var er;\n    if (args.length > 0)\n      er = args[0];\n    if (er instanceof Error) {\n      // Note: The comments on the `throw` lines are intentional, they show\n      // up in Node's output if this results in an unhandled exception.\n      throw er; // Unhandled 'error' event\n    }\n    // At least give some kind of context to the user\n    var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n    err.context = er;\n    throw err; // Unhandled 'error' event\n  }\n\n  var handler = events[type];\n\n  if (handler === undefined)\n    return false;\n\n  if (typeof handler === 'function') {\n    ReflectApply(handler, this, args);\n  } else {\n    var len = handler.length;\n    var listeners = arrayClone(handler, len);\n    for (var i = 0; i < len; ++i)\n      ReflectApply(listeners[i], this, args);\n  }\n\n  return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n  var m;\n  var events;\n  var existing;\n\n  checkListener(listener);\n\n  events = target._events;\n  if (events === undefined) {\n    events = target._events = Object.create(null);\n    target._eventsCount = 0;\n  } else {\n    // To avoid recursion in the case that type === \"newListener\"! Before\n    // adding it to the listeners, first emit \"newListener\".\n    if (events.newListener !== undefined) {\n      target.emit('newListener', type,\n                  listener.listener ? listener.listener : listener);\n\n      // Re-assign `events` because a newListener handler could have caused the\n      // this._events to be assigned to a new object\n      events = target._events;\n    }\n    existing = events[type];\n  }\n\n  if (existing === undefined) {\n    // Optimize the case of one listener. Don't need the extra array object.\n    existing = events[type] = listener;\n    ++target._eventsCount;\n  } else {\n    if (typeof existing === 'function') {\n      // Adding the second element, need to change to array.\n      existing = events[type] =\n        prepend ? [listener, existing] : [existing, listener];\n      // If we've already got an array, just append.\n    } else if (prepend) {\n      existing.unshift(listener);\n    } else {\n      existing.push(listener);\n    }\n\n    // Check for listener leak\n    m = _getMaxListeners(target);\n    if (m > 0 && existing.length > m && !existing.warned) {\n      existing.warned = true;\n      // No error code for this since it is a Warning\n      // eslint-disable-next-line no-restricted-syntax\n      var w = new Error('Possible EventEmitter memory leak detected. ' +\n                          existing.length + ' ' + String(type) + ' listeners ' +\n                          'added. Use emitter.setMaxListeners() to ' +\n                          'increase limit');\n      w.name = 'MaxListenersExceededWarning';\n      w.emitter = target;\n      w.type = type;\n      w.count = existing.length;\n      ProcessEmitWarning(w);\n    }\n  }\n\n  return target;\n}\n\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n  return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n    function prependListener(type, listener) {\n      return _addListener(this, type, listener, true);\n    };\n\nfunction onceWrapper() {\n  if (!this.fired) {\n    this.target.removeListener(this.type, this.wrapFn);\n    this.fired = true;\n    if (arguments.length === 0)\n      return this.listener.call(this.target);\n    return this.listener.apply(this.target, arguments);\n  }\n}\n\nfunction _onceWrap(target, type, listener) {\n  var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };\n  var wrapped = onceWrapper.bind(state);\n  wrapped.listener = listener;\n  state.wrapFn = wrapped;\n  return wrapped;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n  checkListener(listener);\n  this.on(type, _onceWrap(this, type, listener));\n  return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n    function prependOnceListener(type, listener) {\n      checkListener(listener);\n      this.prependListener(type, _onceWrap(this, type, listener));\n      return this;\n    };\n\n// Emits a 'removeListener' event if and only if the listener was removed.\nEventEmitter.prototype.removeListener =\n    function removeListener(type, listener) {\n      var list, events, position, i, originalListener;\n\n      checkListener(listener);\n\n      events = this._events;\n      if (events === undefined)\n        return this;\n\n      list = events[type];\n      if (list === undefined)\n        return this;\n\n      if (list === listener || list.listener === listener) {\n        if (--this._eventsCount === 0)\n          this._events = Object.create(null);\n        else {\n          delete events[type];\n          if (events.removeListener)\n            this.emit('removeListener', type, list.listener || listener);\n        }\n      } else if (typeof list !== 'function') {\n        position = -1;\n\n        for (i = list.length - 1; i >= 0; i--) {\n          if (list[i] === listener || list[i].listener === listener) {\n            originalListener = list[i].listener;\n            position = i;\n            break;\n          }\n        }\n\n        if (position < 0)\n          return this;\n\n        if (position === 0)\n          list.shift();\n        else {\n          spliceOne(list, position);\n        }\n\n        if (list.length === 1)\n          events[type] = list[0];\n\n        if (events.removeListener !== undefined)\n          this.emit('removeListener', type, originalListener || listener);\n      }\n\n      return this;\n    };\n\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\nEventEmitter.prototype.removeAllListeners =\n    function removeAllListeners(type) {\n      var listeners, events, i;\n\n      events = this._events;\n      if (events === undefined)\n        return this;\n\n      // not listening for removeListener, no need to emit\n      if (events.removeListener === undefined) {\n        if (arguments.length === 0) {\n          this._events = Object.create(null);\n          this._eventsCount = 0;\n        } else if (events[type] !== undefined) {\n          if (--this._eventsCount === 0)\n            this._events = Object.create(null);\n          else\n            delete events[type];\n        }\n        return this;\n      }\n\n      // emit removeListener for all listeners on all events\n      if (arguments.length === 0) {\n        var keys = Object.keys(events);\n        var key;\n        for (i = 0; i < keys.length; ++i) {\n          key = keys[i];\n          if (key === 'removeListener') continue;\n          this.removeAllListeners(key);\n        }\n        this.removeAllListeners('removeListener');\n        this._events = Object.create(null);\n        this._eventsCount = 0;\n        return this;\n      }\n\n      listeners = events[type];\n\n      if (typeof listeners === 'function') {\n        this.removeListener(type, listeners);\n      } else if (listeners !== undefined) {\n        // LIFO order\n        for (i = listeners.length - 1; i >= 0; i--) {\n          this.removeListener(type, listeners[i]);\n        }\n      }\n\n      return this;\n    };\n\nfunction _listeners(target, type, unwrap) {\n  var events = target._events;\n\n  if (events === undefined)\n    return [];\n\n  var evlistener = events[type];\n  if (evlistener === undefined)\n    return [];\n\n  if (typeof evlistener === 'function')\n    return unwrap ? [evlistener.listener || evlistener] : [evlistener];\n\n  return unwrap ?\n    unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);\n}\n\nEventEmitter.prototype.listeners = function listeners(type) {\n  return _listeners(this, type, true);\n};\n\nEventEmitter.prototype.rawListeners = function rawListeners(type) {\n  return _listeners(this, type, false);\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n  if (typeof emitter.listenerCount === 'function') {\n    return emitter.listenerCount(type);\n  } else {\n    return listenerCount.call(emitter, type);\n  }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n  var events = this._events;\n\n  if (events !== undefined) {\n    var evlistener = events[type];\n\n    if (typeof evlistener === 'function') {\n      return 1;\n    } else if (evlistener !== undefined) {\n      return evlistener.length;\n    }\n  }\n\n  return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n  return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n};\n\nfunction arrayClone(arr, n) {\n  var copy = new Array(n);\n  for (var i = 0; i < n; ++i)\n    copy[i] = arr[i];\n  return copy;\n}\n\nfunction spliceOne(list, index) {\n  for (; index + 1 < list.length; index++)\n    list[index] = list[index + 1];\n  list.pop();\n}\n\nfunction unwrapListeners(arr) {\n  var ret = new Array(arr.length);\n  for (var i = 0; i < ret.length; ++i) {\n    ret[i] = arr[i].listener || arr[i];\n  }\n  return ret;\n}\n\nfunction once(emitter, name) {\n  return new Promise(function (resolve, reject) {\n    function errorListener(err) {\n      emitter.removeListener(name, resolver);\n      reject(err);\n    }\n\n    function resolver() {\n      if (typeof emitter.removeListener === 'function') {\n        emitter.removeListener('error', errorListener);\n      }\n      resolve([].slice.call(arguments));\n    };\n\n    eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });\n    if (name !== 'error') {\n      addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });\n    }\n  });\n}\n\nfunction addErrorHandlerIfEventEmitter(emitter, handler, flags) {\n  if (typeof emitter.on === 'function') {\n    eventTargetAgnosticAddListener(emitter, 'error', handler, flags);\n  }\n}\n\nfunction eventTargetAgnosticAddListener(emitter, name, listener, flags) {\n  if (typeof emitter.on === 'function') {\n    if (flags.once) {\n      emitter.once(name, listener);\n    } else {\n      emitter.on(name, listener);\n    }\n  } else if (typeof emitter.addEventListener === 'function') {\n    // EventTarget does not have `error` event semantics like Node\n    // EventEmitters, we do not listen for `error` events here.\n    emitter.addEventListener(name, function wrapListener(arg) {\n      // IE does not have builtin `{ once: true }` support so we\n      // have to do it manually.\n      if (flags.once) {\n        emitter.removeEventListener(name, wrapListener);\n      }\n      listener(arg);\n    });\n  } else {\n    throw new TypeError('The \"emitter\" argument must be of type EventEmitter. Received type ' + typeof emitter);\n  }\n}\n","export const PROTOCOL = \"wc\";\nexport const PROTOCOL_VERSION = 2;\nexport const CLIENT_CONTEXT = \"POSClient\";\n\nexport const CLIENT_STORAGE_PREFIX = `${PROTOCOL}@${PROTOCOL_VERSION}:${CLIENT_CONTEXT}:`;\n\nexport const CLIENT_STORAGE_OPTIONS = {\n  database: \":memory:\",\n  customStoragePrefix: \"@walletconnect/pos-client\",\n};\n\nexport const POS_CLIENT_VERSION = \"1.0.0\";\n\nexport const MAX_TRANSACTION_STATUS_CHECKS = 50;\n\nexport const DEFAULT_LOGGER_LEVEL = \"error\";\n","import { UtilsTypes } from \"../types/index.js\";\n\nexport const DEFAULT_NAMESPACES: UtilsTypes.SupportedNamespaces = [\n  {\n    assetNamespaces: [\"erc20\", \"slip44\"],\n    capabilities: null,\n    events: [],\n    methods: [\"eth_sendTransaction\"],\n    name: \"eip155\",\n  },\n  {\n    assetNamespaces: [\"token\", \"slip44\"],\n    capabilities: null,\n    events: [],\n    methods: [\"solana_signAndSendTransaction\"],\n    name: \"solana\",\n  },\n  {\n    assetNamespaces: [\"trc20\", \"slip44\"],\n    capabilities: null,\n    events: [],\n    methods: [\"tron_signTransaction\"],\n    name: \"tron\",\n  },\n] as const;\n","import { POS_CLIENT_VERSION } from \"./client.js\";\n\nexport const RPC_URL = ({ projectId, deviceId }: { projectId: string; deviceId: string }) => {\n  return `https://rpc.walletconnect.org/v1/json-rpc?projectId=${projectId}&st=node&sv=js-pos-${POS_CLIENT_VERSION}&deviceId=${deviceId}`;\n};\n\nexport const RPC_ERROR_CODES = {\n  \"-18901\": \"ValidationError.InvalidAsset\",\n  \"-18902\": \"ValidationError.InvalidRecipient\",\n  \"-18903\": \"ValidationError.InvalidSender\",\n  \"-18904\": \"ValidationError.InvalidAmount\",\n  \"-18905\": \"ValidationError.InvalidAddress\",\n  \"-18906\": \"ValidationError.InvalidWalletResponse\",\n  \"-18907\": \"ValidationError.InvalidTransactionId\",\n  \"-18920\": \"ExecutionError.GasEstimation\",\n  \"-18940\": \"InternalError.InvalidProviderUrl\",\n  \"-18941\": \"InternalError.RpcError\",\n  \"-18942\": \"InternalError.Internal\",\n  \"-18970\": \"TransactionIdError.InvalidFormat\",\n  \"-18971\": \"TransactionIdError.InvalidChainId\",\n};\n","import { EventEmitter } from \"events\";\nimport { IPOSClientEngine, POSClientEngineTypes } from \"./engine.js\";\nimport { SessionTypes } from \"@walletconnect/types\";\n\nexport declare namespace POSClientTypes {\n  type Event =\n    | \"qr_ready\"\n    | \"connection_rejected\"\n    | \"connection_failed\"\n    | \"connected\"\n    | \"payment_requested\"\n    | \"payment_rejected\"\n    | \"payment_broadcasted\"\n    | \"payment_failed\"\n    | \"payment_successful\"\n    | \"disconnected\";\n\n  interface EventArguments {\n    qr_ready: { uri: string; userId?: string };\n    connection_rejected: any;\n    connection_failed: { error: { message: string; code: number } };\n    connected: { session: SessionTypes.Struct; userId?: string };\n    payment_requested: {\n      paymentIntent: PaymentIntent;\n      transaction: POSClientEngineTypes.Transaction;\n      sessionTopic: string;\n      userId?: string;\n    };\n    payment_rejected: {\n      error?: { message?: string; code: number };\n      paymentIntent: PaymentIntent;\n      sessionTopic: string;\n      userId?: string;\n    };\n    payment_broadcasted: {\n      paymentIntent: PaymentIntent;\n      transaction: POSClientEngineTypes.Transaction;\n      result: any;\n      sessionTopic: string;\n      userId?: string;\n    };\n    payment_failed: {\n      error?: { message?: string; code: number };\n      transaction: any;\n      sessionTopic: string;\n      userId?: string;\n    };\n    payment_successful: {\n      transaction: POSClientEngineTypes.Transaction;\n      result: any;\n      sessionTopic: string;\n      userId?: string;\n    };\n    disconnected: { sessionTopic: string; userId?: string };\n  }\n\n  interface Options {\n    projectId: string;\n    deviceId: string;\n    metadata: Metadata;\n    storageOptions?: {\n      databaseName: string;\n    };\n    loggerOptions?: {\n      posLevel?: \"info\" | \"debug\" | \"warn\" | \"error\" | \"silent\";\n      signLevel?: \"info\" | \"debug\" | \"warn\" | \"error\" | \"silent\";\n    };\n  }\n\n  type Metadata = {\n    merchantName: string;\n    description: string;\n    url: string;\n    logoIcon: string;\n  };\n\n  type Network = {\n    name: string;\n    chainId: string;\n  };\n\n  type Token = {\n    network: Network;\n    symbol: string;\n    standard: string;\n    address: string;\n  };\n\n  type PaymentIntent = {\n    token: Token;\n    amount: string;\n    recipient: string;\n  };\n}\n\nexport abstract class IPOSClient {\n  public abstract readonly name: string;\n  public abstract engine: IPOSClientEngine;\n  public abstract events: EventEmitter;\n  public abstract metadata: POSClientTypes.Metadata;\n  /** the first session in the client */\n  public abstract session?: SessionTypes.Struct;\n  /** all sessions in the client */\n  public abstract sessions: SessionTypes.Struct[];\n\n  constructor(public opts: POSClientTypes.Options) {}\n\n  // ---------- Public Methods ----------------------------------------------- //\n\n  public abstract setTokens: IPOSClientEngine[\"setTokens\"];\n  public abstract connect: IPOSClientEngine[\"connect\"];\n  public abstract createPaymentIntent: IPOSClientEngine[\"createPaymentIntent\"];\n  public abstract restart: IPOSClientEngine[\"restart\"];\n  public abstract sendPaymentsToWallet: IPOSClientEngine[\"sendPaymentsToWallet\"];\n  public abstract disconnect: IPOSClientEngine[\"disconnect\"];\n\n  // ---------- Event Handlers ----------------------------------------------- //\n  public abstract on: <E extends POSClientTypes.Event>(\n    event: E,\n    listener: (args: POSClientTypes.EventArguments[E]) => void,\n  ) => EventEmitter;\n\n  public abstract once: <E extends POSClientTypes.Event>(\n    event: E,\n    listener: (args: POSClientTypes.EventArguments[E]) => void,\n  ) => EventEmitter;\n\n  public abstract off: <E extends POSClientTypes.Event>(\n    event: E,\n    listener: (args: POSClientTypes.EventArguments[E]) => void,\n  ) => EventEmitter;\n\n  public abstract removeListener: <E extends POSClientTypes.Event>(\n    event: E,\n    listener: (args: POSClientTypes.EventArguments[E]) => void,\n  ) => EventEmitter;\n}\n","import EventEmitter from \"events\";\nimport { ISignClient, SessionTypes } from \"@walletconnect/types\";\nimport { IPOSClient, POSClientTypes } from \"./client.js\";\nimport { UtilsTypes } from \"./index.js\";\nimport { Logger } from \"@walletconnect/logger\";\n\nexport declare namespace POSClientEngineTypes {\n  /**\n   * @param userId - Arbitrary user ID to map a user to a session\n   */\n  interface ConnectParams {\n    userId: string;\n  }\n\n  type EngineEvents = POSClientTypes.Event | \"await_approval\";\n\n  interface EventArguments extends POSClientTypes.EventArguments {\n    await_approval: {\n      approval: () => Promise<SessionTypes.Struct>;\n      paymentIntents: POSClientTypes.PaymentIntent[];\n      userId?: string;\n      manualControl: boolean;\n    };\n  }\n\n  type TransactionParams = {\n    to: string;\n    from: string;\n    gas: string;\n    value: string;\n    data: string;\n    gasPrice: string;\n  };\n\n  type Transaction = {\n    method: string;\n    params: TransactionParams[];\n    id: string;\n    chainId: string;\n  };\n\n  type RPCTransactions = {\n    id: string;\n    jsonrpc: string;\n    result: {\n      transactions: Transaction[];\n    };\n  };\n\n  type RPCPaymentIntent = {\n    asset: string;\n    recipient: string;\n    amount: string;\n    sender: string;\n  };\n\n  type RPCSupportedNetworksResult = {\n    id: string;\n    jsonrpc: string;\n    result: {\n      namespaces: UtilsTypes.SupportedNamespaces;\n    };\n  };\n\n  type RPCCheckTransactionResult = {\n    id: string;\n    jsonrpc: string;\n    result: {\n      status: \"CONFIRMED\" | \"FAILED\" | \"PENDING\";\n      checkIn?: number;\n      error?: string;\n    };\n  };\n\n  type DisconnectParams = {\n    sessionTopic?: string;\n  };\n\n  type CreatePaymentIntentParams = {\n    paymentIntents: POSClientTypes.PaymentIntent[];\n    manualControl?: boolean;\n    sessionTopic?: string;\n    userId?: string;\n  };\n\n  type RestartParams = {\n    reinit?: boolean;\n    sessionTopic?: string;\n    userId?: string;\n  };\n\n  type SetTokensParams = {\n    tokens: POSClientTypes.Token[];\n  };\n\n  type AwaitPaymentConfirmedParams = {\n    transaction: POSClientEngineTypes.Transaction;\n    result: unknown;\n    sessionTopic: string;\n    userId?: string;\n  };\n\n  type SendPaymentsToWalletParams = {\n    sessionTopic?: string;\n    userId?: string;\n  };\n\n  type SendTransactionsToWalletParams = {\n    sessionTopic: string;\n    userId?: string;\n  };\n\n  type PrepareTransactionsFromPaymentIntentsParams = {\n    sessionTopic?: string;\n    userId?: string;\n  };\n\n  type OnSessionConnectedParams = {\n    session: SessionTypes.Struct;\n    userId?: string;\n    manualControl?: boolean;\n  };\n}\n\nexport abstract class IPOSClientEngine {\n  public abstract signClient: ISignClient;\n  public abstract logger: Logger;\n  public abstract tokens: POSClientTypes.Token[];\n  public abstract supportedNamespaces: UtilsTypes.SupportedNamespaces;\n  public abstract paymentIntents: Record<string, POSClientTypes.PaymentIntent[]>;\n  public abstract transactions: Record<string, POSClientEngineTypes.Transaction[]>;\n\n  constructor(public client: IPOSClient) {}\n  // ---------- Public Methods ------------------------------------------------- //\n  public abstract init(): Promise<void>;\n\n  public abstract setTokens(params: POSClientEngineTypes.SetTokensParams): Promise<void>;\n\n  public abstract connect(params: POSClientEngineTypes.ConnectParams): Promise<SessionTypes.Struct>;\n\n  public abstract createPaymentIntent(\n    params: POSClientEngineTypes.CreatePaymentIntentParams,\n  ): Promise<void>;\n\n  public abstract restart(params?: POSClientEngineTypes.RestartParams): Promise<void>;\n\n  public abstract disconnect(params?: POSClientEngineTypes.DisconnectParams): Promise<void>;\n\n  // ---------- Event Handlers ----------------------------------------------- //\n  public abstract on: <E extends POSClientEngineTypes.EngineEvents>(\n    event: E,\n    listener: (args: POSClientEngineTypes.EventArguments[E]) => void,\n  ) => EventEmitter;\n\n  public abstract once: <E extends POSClientEngineTypes.EngineEvents>(\n    event: E,\n    listener: (args: POSClientEngineTypes.EventArguments[E]) => void,\n  ) => EventEmitter;\n\n  public abstract off: <E extends POSClientTypes.Event>(\n    event: E,\n    listener: (args: POSClientEngineTypes.EventArguments[E]) => void,\n  ) => EventEmitter;\n\n  public abstract removeListener: <E extends POSClientEngineTypes.EngineEvents>(\n    event: E,\n    listener: (args: POSClientEngineTypes.EventArguments[E]) => void,\n  ) => EventEmitter;\n\n  public abstract emit: <E extends POSClientEngineTypes.EngineEvents>(\n    event: E,\n    args: POSClientEngineTypes.EventArguments[E],\n  ) => boolean;\n\n  // ---------- Internally used methods ----------------------------------------------- //\n  public abstract prepareTransactionsFromPaymentIntents(\n    params: POSClientEngineTypes.PrepareTransactionsFromPaymentIntentsParams,\n  ): Promise<void>;\n\n  public abstract onSessionConnected(\n    params: POSClientEngineTypes.OnSessionConnectedParams,\n  ): Promise<void>;\n\n  public abstract sendTransactionsToWallet(\n    params: POSClientEngineTypes.SendTransactionsToWalletParams,\n  ): Promise<void>;\n\n  public abstract awaitPaymentConfirmed(\n    params: POSClientEngineTypes.AwaitPaymentConfirmedParams,\n  ): Promise<void>;\n\n  public abstract sendPaymentsToWallet(\n    params?: POSClientEngineTypes.SendPaymentsToWalletParams,\n  ): Promise<void>;\n}\n","import { isValidChainId, parseChainId } from \"@walletconnect/utils\";\nimport { UtilsTypes } from \"../types/index.js\";\n\nexport const isValidToken = (params: UtilsTypes.isValidTokenParams) => {\n  const { supportedNamespaces, token } = params;\n  const { network, symbol, standard, address } = token;\n  if (!network || !symbol || !standard || !address || !isValidChainId(network?.chainId)) {\n    return false;\n  }\n\n  const { namespace } = parseChainId(network.chainId);\n  const supportedNamespaceDetails = supportedNamespaces.find(\n    (ns) => ns.name.toLowerCase() === namespace.toLowerCase(),\n  );\n  if (!supportedNamespaceDetails) {\n    throw new Error(`Unsupported token namespace: ${namespace}`);\n  }\n\n  const supportedStandards = supportedNamespaceDetails.assetNamespaces.map((ns) =>\n    ns.toLowerCase(),\n  );\n\n  if (!supportedStandards.includes(standard?.toLowerCase())) {\n    throw new Error(`Unsupported token standard: ${standard} for namespace: ${namespace}`);\n  }\n\n  return true;\n};\n\nexport const isValidPaymentIntent = (params: UtilsTypes.isValidPaymentIntentParams) => {\n  const { supportedNamespaces, paymentIntent } = params;\n  const { token, amount, recipient } = paymentIntent;\n  if (!token || !amount || !recipient || !isValidToken({ supportedNamespaces, token })) {\n    return false;\n  }\n  return true;\n};\n","/**\n * Creates a wrapper around an approval function that caches the result.\n * The approval is only executed once - subsequent calls return the cached result.\n */\nexport const createApprovalAwaiter = <T>(approval: () => Promise<T>) => {\n  let cachedResult: T | undefined;\n  let cachedPromise: Promise<T> | undefined;\n\n  return async (): Promise<T> => {\n    // If we already have a result, return it\n    if (cachedResult !== undefined) {\n      return cachedResult;\n    }\n\n    // If approval is already in progress, return the same promise\n    if (cachedPromise) {\n      return cachedPromise;\n    }\n\n    // Execute approval and cache both the promise and result\n    cachedPromise = approval();\n    cachedResult = await cachedPromise;\n    return cachedResult;\n  };\n};\n","import { SignClient } from \"@walletconnect/sign-client\";\nimport { ISignClient, ProposalTypes } from \"@walletconnect/types\";\nimport { payloadId } from \"@walletconnect/jsonrpc-utils\";\nimport { parseChainId } from \"@walletconnect/utils\";\nimport { Logger, pino } from \"@walletconnect/logger\";\n\nimport {\n  IPOSClientEngine,\n  POSClientEngineTypes,\n  POSClientTypes,\n  UtilsTypes,\n} from \"../types/index.js\";\nimport { createApprovalAwaiter, isValidPaymentIntent, isValidToken } from \"../utils/index.js\";\nimport {\n  CLIENT_STORAGE_OPTIONS,\n  MAX_TRANSACTION_STATUS_CHECKS,\n  DEFAULT_NAMESPACES,\n  RPC_URL,\n  RPC_ERROR_CODES,\n  DEFAULT_LOGGER_LEVEL,\n} from \"../constants/index.js\";\n\nexport class Engine extends IPOSClientEngine {\n  public signClient: ISignClient;\n  public logger: Logger;\n  public tokens: POSClientTypes.Token[] = [];\n  public supportedNamespaces: UtilsTypes.SupportedNamespaces = DEFAULT_NAMESPACES;\n\n  // map to keep track of pending payment intents\n  // private paymentIntentsMap: Map<number, POSClientTypes.PaymentIntent[]> = new Map();\n  public paymentIntents: IPOSClientEngine[\"paymentIntents\"] = {};\n\n  // transactions to be submitted to the wallet\n  public transactions: IPOSClientEngine[\"transactions\"] = {};\n\n  private paymentsSendingInProgress: Record<string, boolean> = {};\n  private manualControl: Record<string, boolean> = {};\n\n  constructor(client: IPOSClientEngine[\"client\"]) {\n    super(client);\n    // initialized in init()\n    this.signClient = {} as any;\n    this.logger = pino({\n      name: this.client.name,\n      level: this.client.opts.loggerOptions?.posLevel || DEFAULT_LOGGER_LEVEL,\n    });\n    this.setupEventHandlers();\n  }\n\n  public init = async () => {\n    this.signClient = await SignClient.init({\n      projectId: this.client.opts.projectId,\n      metadata: {\n        name: this.client.metadata.merchantName,\n        description: this.client.metadata.description,\n        url: this.client.metadata.url,\n        icons: [this.client.metadata.logoIcon],\n      },\n      storageOptions: {\n        database: this.client.opts.storageOptions?.databaseName || CLIENT_STORAGE_OPTIONS.database,\n      },\n      customStoragePrefix: CLIENT_STORAGE_OPTIONS.customStoragePrefix,\n      logger: this.client.opts.loggerOptions?.signLevel || DEFAULT_LOGGER_LEVEL,\n    });\n\n    this.signClient.events.on(\"session_delete\", ({ topic }) => {\n      this.cleanup({ sessionTopic: topic });\n      this.emit(\"disconnected\", { sessionTopic: topic });\n    });\n\n    try {\n      this.logger.debug(\"Fetching supported namespaces/networks\");\n      const supportedNamespaces =\n        await this.fetchRpcRequest<POSClientEngineTypes.RPCSupportedNetworksResult>({\n          payload: JSON.stringify({\n            id: payloadId(),\n            jsonrpc: \"2.0\",\n            method: \"wc_pos_supportedNetworks\",\n            params: {},\n          }),\n          userId: \"\",\n        });\n      this.logger.debug(\n        {\n          supportedNamespaces: supportedNamespaces.result.namespaces,\n        },\n        \"Received supported namespaces/networks\",\n      );\n      this.supportedNamespaces = supportedNamespaces.result.namespaces;\n    } catch (error) {\n      this.logger.error(error, \"Failed to fetch supported namespaces/networks\");\n    }\n  };\n\n  public setTokens: IPOSClientEngine[\"setTokens\"] = async (params) => {\n    const { tokens } = params;\n    this.logger.debug({ tokens }, \"Setting tokens\");\n    tokens.forEach((token) => {\n      if (!isValidToken({ token, supportedNamespaces: this.supportedNamespaces })) {\n        throw new Error(`Invalid token: ${JSON.stringify(token)}`);\n      }\n    });\n    await new Promise<void>((resolve) => {\n      this.tokens = tokens;\n      resolve();\n    });\n\n    this.logger.debug({ tokens }, \"Tokens set\");\n  };\n\n  public createPaymentIntent: IPOSClientEngine[\"createPaymentIntent\"] = async (params) => {\n    const { paymentIntents, sessionTopic, userId } = params;\n    this.logger.debug({ paymentIntents, userId }, \"Creating payment intent\");\n    const manualControl = params.manualControl || false;\n    if (paymentIntents.length === 0) {\n      throw new Error(\"No payment intents provided\");\n    }\n\n    for (const paymentIntent of paymentIntents) {\n      if (!isValidPaymentIntent({ paymentIntent, supportedNamespaces: this.supportedNamespaces })) {\n        throw new Error(`Invalid payment intent: ${JSON.stringify(paymentIntent)}`);\n      }\n    }\n    this.logger.debug({ paymentIntents, userId }, \"Payment intent validation success\");\n\n    if (sessionTopic) {\n      this.manualControl[sessionTopic] = manualControl;\n      try {\n        this.setPaymentIntents({ sessionTopic, paymentIntents, userId });\n        this.validateApprovedNamespacesWithPaymentIntents(sessionTopic);\n\n        if (!manualControl) {\n          await this.sendPaymentsToWallet({ sessionTopic, userId });\n        }\n        return;\n      } catch (error) {\n        this.logger.error(error);\n        await this.disconnect({ sessionTopic });\n      }\n    }\n\n    const namespaces = this.composeNamespacesFromPaymentIntents(paymentIntents);\n    const { uri, approval } = await this.signClient.connect({\n      optionalNamespaces: namespaces,\n    });\n    this.logger.debug({ uri, userId }, \"Connected to the WalletConnect network\");\n    if (!uri) {\n      this.client.events.emit(\"connection_failed\", {\n        error: {\n          message: \"Failed to connect to the WalletConnect network\",\n          code: 4001,\n        },\n        userId,\n      });\n      throw new Error(\"Failed to connect to the WalletConnect network\");\n    }\n\n    const approvalAwaiter = createApprovalAwaiter(approval);\n    this.emit(\"await_approval\", {\n      approval: approvalAwaiter,\n      paymentIntents,\n      userId,\n      manualControl,\n    });\n    this.logger.debug(\"Emitted await_approval event\");\n    this.emit(\"qr_ready\", { uri, userId });\n    this.logger.debug({ uri, userId }, \"Emitted qr_ready event\");\n\n    if (manualControl) {\n      const session = await approvalAwaiter();\n      this.manualControl[session.topic] = manualControl;\n    }\n  };\n\n  public restart: IPOSClientEngine[\"restart\"] = async (params) => {\n    this.logger.debug({ params }, \"Restarting\");\n\n    const { reinit, sessionTopic, userId } = params || {};\n    if (reinit) {\n      this.tokens = [];\n      await this.disconnect({ sessionTopic });\n      this.logger.debug(\"Restarted: Cleared payment intents, transactions and disconnected\");\n      return;\n    }\n\n    const topic = this.getSessionTopic(sessionTopic);\n    const manualControl = this.manualControl[topic];\n    // restart the payment intent flow from the beginning\n    const paymentIntents = this.paymentIntents[topic];\n    if (!paymentIntents || !paymentIntents?.length) {\n      throw new Error(\"No payment intents found for session topic: \" + topic);\n    }\n    await this.createPaymentIntent({\n      paymentIntents,\n      manualControl,\n      userId,\n      sessionTopic: topic,\n    });\n    this.logger.debug(\n      { paymentIntents, userId },\n      \"Restarted: Created payment intent flow from the beginning\",\n    );\n  };\n\n  public connect: IPOSClientEngine[\"connect\"] = async (params) => {\n    const { userId } = params;\n    const manualControl = true;\n    const namespaces = this.composeNamespacesFromTokens();\n    const { uri, approval } = await this.signClient.connect({\n      optionalNamespaces: namespaces,\n    });\n    this.logger.debug({ uri }, \"Connected to the WalletConnect network\");\n    if (!uri) {\n      this.client.events.emit(\"connection_failed\", {\n        error: {\n          message: \"Failed to connect to the WalletConnect network\",\n          code: 4001,\n        },\n        userId,\n      });\n      throw new Error(\"Failed to connect to the WalletConnect network\");\n    }\n\n    const approvalAwaiter = createApprovalAwaiter(approval);\n    this.emit(\"await_approval\", {\n      approval: approvalAwaiter,\n      manualControl,\n      paymentIntents: [],\n      userId,\n    });\n    this.logger.debug({ userId }, \"Emitted await_approval event\");\n    this.emit(\"qr_ready\", { uri, userId });\n    this.logger.debug({ uri, userId }, \"Emitted qr_ready event\");\n\n    const session = await approvalAwaiter();\n    this.manualControl[session.topic] = manualControl;\n    return session;\n  };\n\n  // ---------- Event Handlers ----------------------------------------------- //\n\n  public emit: IPOSClientEngine[\"emit\"] = (event, args) => {\n    this.logger.debug({ event, args }, \"Emit\");\n    return this.client.events.emit(event, args);\n  };\n\n  public on: IPOSClientEngine[\"on\"] = (event, listener) => {\n    this.logger.debug({ event, listener }, \"On\");\n    return this.client.events.on(event, listener);\n  };\n\n  public once: IPOSClientEngine[\"once\"] = (event, listener) => {\n    this.logger.debug({ event, listener }, \"Once\");\n    return this.client.events.once(event, listener);\n  };\n\n  public off: IPOSClientEngine[\"off\"] = (event, listener) => {\n    this.logger.debug({ event, listener }, \"Off\");\n    return this.client.events.off(event, listener);\n  };\n\n  public removeListener: IPOSClientEngine[\"removeListener\"] = (event, listener) => {\n    this.logger.debug({ event, listener }, \"Remove listener\");\n    return this.client.events.removeListener(event, listener);\n  };\n\n  // ---------- Private ----------------------------------------------- //\n\n  private composeNamespacesFromTokens(): ProposalTypes.OptionalNamespaces {\n    const tokens = this.tokens;\n    this.logger.debug({ tokens }, \"Composing namespaces from tokens\");\n\n    if (tokens.length === 0) {\n      throw new Error(\"No set tokens to compose namespaces from, call setTokens() first\");\n    }\n\n    const namespaces: ProposalTypes.OptionalNamespaces = {};\n    tokens.forEach((token) => {\n      const { network } = token;\n      const { namespace } = parseChainId(network.chainId);\n      const namespaceDetails = this.supportedNamespaces.find((ns) => ns.name === namespace);\n      if (!namespaceDetails) {\n        throw new Error(`Namespace not supported: ${namespace}`);\n      }\n\n      namespaces[namespace] = {\n        methods: namespaceDetails.methods,\n        chains: [...(namespaces[namespace]?.chains || []), network.chainId],\n        events: namespaceDetails.events,\n      };\n    });\n    this.logger.debug({ namespaces }, \"Composed namespaces\");\n    return namespaces;\n  }\n\n  private composeNamespacesFromPaymentIntents(\n    paymentIntents: POSClientTypes.PaymentIntent[],\n  ): ProposalTypes.OptionalNamespaces {\n    this.logger.debug({ paymentIntents }, \"Composing namespaces\");\n    const namespaces: ProposalTypes.OptionalNamespaces = {};\n    paymentIntents.forEach((paymentIntent) => {\n      const {\n        token: { network },\n      } = paymentIntent;\n      const { namespace } = parseChainId(network.chainId);\n      const namespaceDetails = this.supportedNamespaces.find((ns) => ns.name === namespace);\n      if (!namespaceDetails) {\n        throw new Error(`Namespace not supported: ${namespace}`);\n      }\n\n      namespaces[namespace] = {\n        methods: namespaceDetails.methods,\n        chains: [...(namespaces[namespace]?.chains || []), network.chainId],\n        events: namespaceDetails.events,\n      };\n    });\n    this.logger.debug({ namespaces }, \"Composed namespaces\");\n    return namespaces;\n  }\n\n  prepareTransactionsFromPaymentIntents: IPOSClientEngine[\"prepareTransactionsFromPaymentIntents\"] =\n    async (params) => {\n      const { sessionTopic, userId } = params;\n      const topic = this.getSessionTopic(sessionTopic);\n\n      const paymentIntents = this.paymentIntents[topic];\n      if (!paymentIntents) {\n        throw new Error(\"No payment intents found for session topic: \" + topic);\n      }\n\n      const session = this.signClient.session.get(topic);\n      this.logger.debug(\n        {\n          sessionTopic: topic,\n          userId,\n        },\n        \"Preparing transactions from payment intents\",\n      );\n      const intents: POSClientEngineTypes.RPCPaymentIntent[] = [];\n      for (const paymentIntent of paymentIntents) {\n        const { token, amount, recipient } = paymentIntent;\n        const { namespace } = parseChainId(token.network.chainId);\n        // gets the first address that matches the token network chain id\n        const account = session.namespaces?.[namespace]?.accounts?.find((account) =>\n          account.includes(`${token.network.chainId}:`),\n        );\n        if (!account) {\n          throw new Error(\n            `Address not found in session for chain id: ${\n              token.network.chainId\n            }, approved addresses: ${session.namespaces?.[namespace]?.accounts?.join(\", \")}`,\n          );\n        }\n\n        intents.push({\n          asset: `${token.network.chainId}/${token.standard.toLowerCase()}:${token.address}`,\n          recipient,\n          amount,\n          sender: account,\n        });\n      }\n\n      this.logger.debug(\n        {\n          sessionTopic: session.topic,\n          transactions: intents,\n          userId,\n        },\n        \"Prepared transactions from payment intents\",\n      );\n\n      const payload = {\n        id: payloadId(),\n        jsonrpc: \"2.0\",\n        method: \"wc_pos_buildTransactions\",\n        params: {\n          paymentIntents: intents,\n        },\n      };\n\n      this.logger.debug({ payload, userId }, \"Fetching wc_pos_buildTransactions\");\n      const response = await this.fetchRpcRequest<POSClientEngineTypes.RPCTransactions>({\n        payload: JSON.stringify(payload),\n        userId,\n      });\n      this.logger.debug({ response, userId }, \"Received wc_pos_buildTransactions\");\n      this.transactions[session.topic] = response.result.transactions;\n\n      this.logger.debug(\n        {\n          transactions: this.transactions[session.topic],\n          userId,\n        },\n        \"Payment intent to transactions map set\",\n      );\n    };\n\n  sendPaymentsToWallet: IPOSClientEngine[\"sendPaymentsToWallet\"] = async (params = {}) => {\n    const { sessionTopic, userId } = params;\n    const topic = this.getSessionTopic(sessionTopic);\n\n    if (!topic) {\n      throw new Error(\"No session topic found, call createPaymentIntent() first\");\n    }\n\n    if (this.paymentsSendingInProgress[topic]) {\n      throw new Error(\"Payments are already being sent, please wait for them to complete\");\n    }\n    this.paymentsSendingInProgress[topic] = true;\n\n    try {\n      await this.prepareTransactionsFromPaymentIntents({ sessionTopic: topic, userId });\n      await this.sendTransactionsToWallet({ sessionTopic: topic, userId });\n    } catch (error) {\n      this.logger.error(error, \"Error while sending payments to wallet\");\n      this.paymentsSendingInProgress[topic] = false;\n      throw error;\n    }\n    this.paymentsSendingInProgress[topic] = false;\n  };\n\n  sendTransactionsToWallet: IPOSClientEngine[\"sendTransactionsToWallet\"] = async (params) => {\n    const { sessionTopic, userId } = params;\n    const transactions = this.transactions[sessionTopic];\n    const paymentIntents = this.paymentIntents[sessionTopic];\n    if (!transactions || !paymentIntents) {\n      throw new Error(\n        \"No transactions or payment intents to send, call createPaymentIntent() first\",\n      );\n    }\n\n    if (transactions.length !== paymentIntents.length) {\n      throw new Error(\n        `Mismatch between transactions (${transactions.length}) and payment intents (${paymentIntents.length}). ` +\n          `The RPC response returned an unexpected number of transactions.`,\n      );\n    }\n\n    this.logger.debug(\n      {\n        transactions,\n        sessionTopic,\n        userId,\n      },\n      \"Sending transactions to wallet\",\n    );\n\n    for (let i = 0; i < transactions.length; i++) {\n      const transaction = transactions[i];\n      const paymentIntent = paymentIntents[i];\n      try {\n        this.emit(\"payment_requested\", { paymentIntent, transaction, sessionTopic, userId });\n        this.logger.debug(\n          {\n            transactionId: transaction.id,\n            userId,\n          },\n          \"Emitted payment_requested event\",\n        );\n\n        let result;\n        try {\n          result = await this.signClient.request({\n            topic: sessionTopic,\n            request: {\n              method: transaction.method,\n              params: transaction.params,\n            },\n            chainId: transaction.chainId,\n          });\n          this.logger.debug(\n            {\n              transactionId: transaction.id,\n              result,\n              userId,\n            },\n            \"Wallet responded to payment request\",\n          );\n        } catch (error) {\n          this.logger.error(error, \"Error while sending payment request\");\n          this.emit(\"payment_rejected\", {\n            error: {\n              message: (error as Error)?.message,\n              code: 4001,\n            },\n            paymentIntent,\n            sessionTopic,\n            userId,\n          });\n          throw error;\n        }\n        this.emit(\"payment_broadcasted\", {\n          paymentIntent,\n          transaction,\n          result,\n          sessionTopic,\n          userId,\n        });\n        this.logger.debug(\n          {\n            transactionId: transaction.id,\n            userId,\n          },\n          \"Emitted payment_broadcasted event\",\n        );\n        await this.awaitPaymentConfirmed({ transaction, result, sessionTopic, userId });\n        await new Promise((resolve) => setTimeout(resolve, 1000));\n      } catch (error) {\n        this.logger.error(error, \"Error while awaiting payment confirmed\");\n      }\n    }\n\n    if (this.manualControl[sessionTopic] === true) return;\n    await this.disconnect({ sessionTopic });\n  };\n\n  awaitPaymentConfirmed: IPOSClientEngine[\"awaitPaymentConfirmed\"] = async (params) => {\n    const { transaction, result, sessionTopic, userId } = params;\n    try {\n      this.logger.debug({ transactionId: transaction.id, result }, \"Awaiting payment confirmed\");\n      const payload = {\n        id: payloadId(),\n        jsonrpc: \"2.0\",\n        method: \"wc_pos_checkTransaction\",\n        params: {\n          id: transaction.id,\n          sendResult: typeof result === \"string\" ? result : JSON.stringify(result),\n        },\n      };\n\n      let numCheckAttempts = 0;\n      let transactionResult;\n      while (!transactionResult) {\n        if (numCheckAttempts >= MAX_TRANSACTION_STATUS_CHECKS) {\n          throw new Error(`Transaction status not found for id: ${transaction.id}`);\n        }\n        numCheckAttempts++;\n\n        const response = await this.fetchRpcRequest<POSClientEngineTypes.RPCCheckTransactionResult>(\n          { payload: JSON.stringify(payload), userId },\n        );\n        this.logger.debug(\n          {\n            transactionId: transaction.id,\n            response,\n          },\n          \"Received wc_pos_checkTransaction\",\n        );\n        if (response.result.status === \"CONFIRMED\") {\n          this.logger.debug({ response, userId }, \"Transaction status confirmed\");\n          this.emit(\"payment_successful\", {\n            transaction,\n            result,\n            sessionTopic,\n            userId,\n          });\n          transactionResult = response.result;\n          break;\n        } else if (response.result.status === \"FAILED\") {\n          this.logger.debug({ response }, \"Transaction failed\");\n          this.emit(\"payment_failed\", {\n            error: {\n              message: response.result.error,\n              code: 4001,\n            },\n            transaction: result,\n            sessionTopic,\n            userId,\n          });\n          transactionResult = response.result;\n          break;\n        } else if (response.result.status === \"PENDING\") {\n          this.logger.debug({ response, userId }, \"Transaction pending\");\n          await new Promise((resolve) => setTimeout(resolve, response.result.checkIn || 1000));\n        }\n      }\n    } catch (error) {\n      this.logger.error(error, \"Error while awaiting payment confirmations\");\n      this.emit(\"payment_failed\", {\n        error: {\n          message: (error as Error)?.message,\n          code: 4001,\n        },\n        transaction,\n        sessionTopic,\n        userId,\n      });\n    }\n  };\n\n  private setupEventHandlers = () => {\n    this.on(\"await_approval\", async ({ approval, paymentIntents, userId, manualControl }) => {\n      try {\n        this.logger.debug(\"On await_approval\");\n        const session = await approval();\n        this.setPaymentIntents({ sessionTopic: session.topic, paymentIntents });\n        await this.onSessionConnected({ session, userId, manualControl });\n      } catch (error) {\n        this.logger.error(error, \"Error while awaiting approval\");\n        this.emit(\"connection_rejected\", {\n          error: {\n            message: (error as Error)?.message,\n            code: 4001,\n          },\n          userId,\n        });\n      }\n    });\n  };\n\n  onSessionConnected: IPOSClientEngine[\"onSessionConnected\"] = async (params) => {\n    const { session, userId, manualControl } = params;\n    this.logger.debug({ sessionTopic: session.topic, userId }, \"On session connected\");\n    this.emit(\"connected\", { session, userId });\n    // disable deep links for the session\n    await this.signClient.session.update(session.topic, {\n      sessionConfig: {\n        disableDeepLink: true,\n      },\n    });\n    this.logger.debug({ sessionTopic: session.topic, userId }, \"Disabled deep links for session\");\n    this.logger.debug({ sessionTopic: session.topic, userId }, \"Emitted connected event\");\n\n    if (manualControl === true) return;\n    await this.sendPaymentsToWallet({ sessionTopic: session.topic, userId });\n  };\n\n  disconnect: IPOSClientEngine[\"disconnect\"] = async (params = {}) => {\n    try {\n      const { sessionTopic } = params;\n      const topicToDisconnect = this.getSessionTopic(sessionTopic);\n\n      if (!topicToDisconnect) return;\n      this.cleanup({ sessionTopic: topicToDisconnect });\n      await this.signClient.disconnect({\n        topic: topicToDisconnect,\n        reason: { code: 4001, message: \"User disconnected\" },\n      });\n    } catch (error) {\n      this.logger.error(error, \"Error while disconnecting\");\n    }\n  };\n\n  private fetchRpcRequest = async <T>(params: { payload: string; userId?: string }): Promise<T> => {\n    const { payload, userId } = params;\n    this.logger.debug({ url: this.getRpcUrl(), payload, userId }, \"Fetching RPC request\");\n    const result = await fetch(this.getRpcUrl(), {\n      method: \"POST\",\n      body: payload,\n    });\n\n    let data;\n    try {\n      data = await result.json();\n    } catch (error) {\n      this.logger.error(error, \"Error while getting json data from RPC response\");\n    }\n\n    this.logger.debug({ data }, \"Received RPC request response\");\n\n    if (!result.ok || !data || data?.error) {\n      const code = data?.error?.code || -18900;\n      const message = RPC_ERROR_CODES?.[code]\n        ? `${RPC_ERROR_CODES?.[code]}: ${data?.error?.message}`\n        : data?.error?.message || \"Failed to parse RPC response\";\n      this.emit(\"payment_failed\", {\n        error: {\n          message,\n          code,\n        },\n        transaction: \"\",\n        sessionTopic: this.client.session?.topic || \"\",\n        userId,\n      });\n      throw new Error(message);\n    }\n    return data as T;\n  };\n\n  // validates that the approved namespaces contain addresses that match ALL payment intents\n  private validateApprovedNamespacesWithPaymentIntents = (sessionTopic: string) => {\n    this.validateSessionTopic(sessionTopic);\n\n    const session = this.signClient.session.get(sessionTopic);\n    const paymentIntents = this.paymentIntents?.[sessionTopic];\n    if (!session || !paymentIntents) {\n      throw new Error(\"No session or payment intents found\");\n    }\n\n    for (const paymentIntent of paymentIntents) {\n      const { token } = paymentIntent;\n      const { namespace } = parseChainId(token.network.chainId);\n      // gets the first address that matches the token network chain id\n      const account = session.namespaces?.[namespace]?.accounts?.find((account) =>\n        account.includes(`${token.network.chainId}:`),\n      );\n      if (!account) {\n        throw new Error(\n          `Address not found in session for chain id: ${\n            token.network.chainId\n          }, approved addresses: ${session.namespaces?.[namespace]?.accounts?.join(\", \")}`,\n        );\n      }\n    }\n  };\n\n  private setPaymentIntents = (params: {\n    sessionTopic: string;\n    paymentIntents: POSClientTypes.PaymentIntent[];\n    userId?: string;\n  }) => {\n    const { sessionTopic, paymentIntents, userId } = params;\n    this.paymentIntents[sessionTopic] = paymentIntents;\n    this.logger.debug({ paymentIntents, userId }, \"Payment intents set\");\n  };\n\n  private cleanup = (params: { sessionTopic?: string } = {}) => {\n    const { sessionTopic } = params;\n    if (!sessionTopic) return;\n\n    delete this.paymentIntents[sessionTopic];\n    delete this.transactions[sessionTopic];\n    delete this.manualControl[sessionTopic];\n    delete this.paymentsSendingInProgress[sessionTopic];\n    this.logger.debug({ sessionTopic }, \"Cleaned up payment intents and transactions\");\n  };\n\n  private getRpcUrl = () => {\n    return RPC_URL({ projectId: this.client.opts.projectId, deviceId: this.client.opts.deviceId });\n  };\n\n  private validateSessionTopic = (sessionTopic?: string) => {\n    if (!sessionTopic) return;\n    try {\n      this.signClient.session.get(sessionTopic);\n    } catch (error) {\n      this.logger.error(error, `No session found for topic: ${sessionTopic}`);\n      throw new Error(`No session found for topic: ${sessionTopic}`);\n    }\n  };\n\n  private getSessionTopic = (sessionTopic?: string): string => {\n    if (!sessionTopic && this.client.sessions.length > 1) {\n      throw new Error(\n        \"Multiple sessions found, please specify the session topic in the params: { sessionTopic: '...' }\",\n      );\n    }\n\n    const topic = sessionTopic || this.client.session?.topic;\n    if (!topic) {\n      throw new Error(\n        \"No session topic found. Please provide a sessionTopic or establish a session first.\",\n      );\n    }\n    this.validateSessionTopic(topic);\n    return topic;\n  };\n}\n","import EventEmitter from \"events\";\nimport { CLIENT_CONTEXT } from \"./constants/index.js\";\nimport { Engine } from \"./controllers/index.js\";\nimport { IPOSClient, POSClientTypes } from \"./types/index.js\";\n\nexport class POSClient extends IPOSClient {\n  public name: IPOSClient[\"name\"];\n  public events: IPOSClient[\"events\"] = new EventEmitter();\n  public engine: IPOSClient[\"engine\"];\n  public metadata: IPOSClient[\"metadata\"];\n\n  static async init(opts: POSClientTypes.Options) {\n    const client = new POSClient(opts);\n    await client.initialize();\n\n    return client;\n  }\n\n  constructor(opts: POSClientTypes.Options) {\n    super(opts);\n    this.metadata = opts.metadata;\n    this.name = CLIENT_CONTEXT;\n    this.engine = new Engine(this);\n  }\n\n  get sessions(): IPOSClient[\"sessions\"] {\n    return this.engine.signClient.session.getAll();\n  }\n\n  get session(): IPOSClient[\"session\"] {\n    return this.sessions[0];\n  }\n\n  // ---------- Events ----------------------------------------------- //\n\n  public on: IPOSClient[\"on\"] = (name, listener) => {\n    return this.engine.on(name, listener);\n  };\n\n  public once: IPOSClient[\"once\"] = (name, listener) => {\n    return this.engine.once(name, listener);\n  };\n\n  public off: IPOSClient[\"off\"] = (name, listener) => {\n    return this.engine.off(name, listener);\n  };\n\n  public removeListener: IPOSClient[\"removeListener\"] = (name, listener) => {\n    return this.engine.removeListener(name, listener);\n  };\n\n  // ---------- Engine ----------------------------------------------- //\n\n  public setTokens: IPOSClient[\"setTokens\"] = async (params) => {\n    try {\n      return await this.engine.setTokens(params);\n    } catch (error: any) {\n      this.engine.logger.error(error.message);\n      throw error;\n    }\n  };\n\n  public createPaymentIntent: IPOSClient[\"createPaymentIntent\"] = async (params) => {\n    try {\n      return await this.engine.createPaymentIntent(params);\n    } catch (error: any) {\n      this.engine.logger.error(error.message);\n      throw error;\n    }\n  };\n\n  public restart: IPOSClient[\"restart\"] = async (params) => {\n    try {\n      return await this.engine.restart(params);\n    } catch (error: any) {\n      this.engine.logger.error(error.message);\n      throw error;\n    }\n  };\n\n  public sendPaymentsToWallet: IPOSClient[\"sendPaymentsToWallet\"] = async (params) => {\n    try {\n      return await this.engine.sendPaymentsToWallet(params);\n    } catch (error: any) {\n      this.engine.logger.error(error.message);\n      throw error;\n    }\n  };\n\n  public disconnect: IPOSClient[\"disconnect\"] = async (params) => {\n    try {\n      return await this.engine.disconnect(params);\n    } catch (error: any) {\n      this.engine.logger.error(error.message);\n      throw error;\n    }\n  };\n\n  public connect: IPOSClient[\"connect\"] = async (params) => {\n    try {\n      return await this.engine.connect(params);\n    } catch (error: any) {\n      this.engine.logger.error(error.message);\n      throw error;\n    }\n  };\n  // ---------- Private ----------------------------------------------- //\n\n  private async initialize() {\n    try {\n      await this.engine.init();\n      this.engine.logger.info(`POSClient Initialization Success`);\n    } catch (error: any) {\n      this.engine.logger.info(`POSClient Initialization Failure`);\n      this.engine.logger.error(error.message);\n      throw error;\n    }\n  }\n}\n","import { POSClient as Client } from \"./client.js\";\n\nexport * from \"./constants/index.js\";\nexport * from \"./types/index.js\";\n\nexport const POSClient = Client;\nexport default Client;\n"],"names":["R","ReflectApply","target","receiver","args","ReflectOwnKeys","ProcessEmitWarning","warning","NumberIsNaN","value","EventEmitter","eventsModule","once","defaultMaxListeners","checkListener","listener","arg","n","_getMaxListeners","that","type","i","doError","events","er","err","handler","len","listeners","arrayClone","_addListener","prepend","m","existing","w","onceWrapper","_onceWrap","state","wrapped","list","position","originalListener","spliceOne","keys","key","_listeners","unwrap","evlistener","unwrapListeners","emitter","listenerCount","arr","copy","index","ret","name","resolve","reject","errorListener","resolver","eventTargetAgnosticAddListener","addErrorHandlerIfEventEmitter","flags","wrapListener","PROTOCOL","PROTOCOL_VERSION","CLIENT_CONTEXT","CLIENT_STORAGE_PREFIX","CLIENT_STORAGE_OPTIONS","POS_CLIENT_VERSION","MAX_TRANSACTION_STATUS_CHECKS","DEFAULT_LOGGER_LEVEL","DEFAULT_NAMESPACES","RPC_URL","projectId","deviceId","RPC_ERROR_CODES","IPOSClient","opts","IPOSClientEngine","client","isValidToken","params","supportedNamespaces","token","network","symbol","standard","address","isValidChainId","namespace","parseChainId","supportedNamespaceDetails","ns","isValidPaymentIntent","paymentIntent","amount","recipient","createApprovalAwaiter","approval","cachedResult","cachedPromise","Engine","SignClient","topic","payloadId","error","tokens","paymentIntents","sessionTopic","userId","manualControl","namespaces","uri","approvalAwaiter","session","reinit","event","intents","account","payload","response","transactions","transaction","result","numCheckAttempts","transactionResult","topicToDisconnect","data","code","message","pino","namespaceDetails","POSClient","Client"],"mappings":"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","x_google_ignoreList":[0]}