{"version":3,"sources":["../src/types/types.ts","../src/debug.ts","../src/xswd.ts","../src/utils.ts","../src/types/request.ts"],"sourcesContent":["export type Uint64 = number; // bigint ?\nexport type DVMString = string;\nexport type Hash = string;\nexport type SCCode = string;\nexport type Address = string;\nexport type DataType = \"S\" | \"U\" | \"H\";\n\nexport type Stringkeys = { [key: string]: number | string };\n\nexport type Entity = \"wallet\" | \"daemon\";\n\nexport type Config = {\n  address?: string;\n  port?: number;\n  debug?: boolean;\n  timeout?: {\n    AUTH_TIMEOUT?: number;\n    METHOD_TIMEOUT?: number;\n    BLOCK_TIMEOUT?: number;\n  };\n  secure?: boolean;\n};\n\nexport enum ConnectionState {\n  Initializing = \"initializing\",\n  WaitingAuth = \"waitingAuth\",\n  Accepted = \"accepted\",\n  Refused = \"refused\",\n  Closed = \"closed\",\n}\n\nexport type AppInfo = {\n  //! security threat => token based communication (generated by wallet)\n  id: string; //TODO\n  name: string;\n  description: string;\n  url?: string;\n};\n\nexport type EventType = \"new_topoheight\" | \"new_entry\" | \"new_balance\";\n","export default (DEBUG: boolean) => (label: string) =>\n  DEBUG ? (...data: any) => console.log(label + \":\", ...data) : () => {};\n","import {\n  Echo,\n  GetTransferbyTXID,\n  GetTransfers,\n  MakeIntegratedAddress,\n  QueryKey,\n  SplitIntegratedAddress,\n  SCInvoke,\n  DEROGetBlock,\n  DEROGetBlockHeaderByHash,\n  DEROGetBlockHeaderByTopoHeight,\n  DEROGetBlockTemplate,\n  DEROGetEncryptedBalance,\n  DEROGetGasEstimate,\n  DEROGetRandomAddress,\n  DEROGetSC,\n  DEROGetTransaction,\n  DERONameToAddress,\n  Transfer,\n  GetBalance,\n  GetTrackedAssets,\n  Method,\n  JSONRPCRequestBody,\n} from \"./types/request\";\nimport {\n  AppInfo,\n  Config,\n  ConnectionState,\n  Entity,\n  EventType,\n} from \"./types/types\";\nimport makeDebug from \"./debug\";\nimport {\n  Response,\n  Entry,\n  Balance,\n  Topoheight,\n  Result,\n  AuthResponse,\n  EventResponse,\n} from \"./types/response\";\n\nimport { Chan } from \"@lesomnus/channel\";\nimport { sleep } from \"./utils\";\n\nlet debug = makeDebug(false)(\"xswd\");\n\nconst DEFAULT_CONFIG: Config = {\n  address: \"127.0.0.1\",\n  port: 44326,\n  secure: false,\n  debug: false,\n};\nconst DEFAULT_TIMEOUT = {\n  AUTH_TIMEOUT: undefined,\n  METHOD_TIMEOUT: undefined,\n  BLOCK_TIMEOUT: undefined,\n};\nconst CHECK_INTERVAL = 500;\n\nfunction checkConfig(config: Config) {\n  if (!config.address) {\n    throw \"missing address in fallback config\";\n  }\n}\n\nenum ConnectionType {\n  XSWD = \"xswd\",\n  Fallback = \"fallback\",\n}\n\nexport class Api {\n  connection: { [ct in ConnectionType]: WebSocket | null } = {\n    xswd: null,\n    fallback: null,\n  };\n\n  state: { [ct in ConnectionType]: ConnectionState } = {\n    xswd: ConnectionState.Closed,\n    fallback: ConnectionState.Closed,\n  };\n\n  buffer: string = \"\";\n\n  appInfo: AppInfo;\n  config: {\n    [k in ConnectionType]: k extends ConnectionType.XSWD\n      ? Config\n      : Config | null;\n  };\n\n  response: Chan<Response<Entity, Method<Entity>, Result>> = new Chan(0);\n  subscriptions: {\n    events: {\n      [et in EventType]: {\n        enabled: boolean;\n        waiting: Chan<any>[]; // when using waitfor a channel is added here\n        callback?: (eventValue?: any) => void; // callback defined on subscription\n      };\n    };\n  } = {\n    events: {\n      new_topoheight: {\n        enabled: false,\n        waiting: [],\n        callback: undefined,\n      },\n      new_entry: {\n        enabled: false,\n        waiting: [],\n        callback: undefined,\n      },\n      new_balance: {\n        enabled: false,\n        waiting: [],\n        callback: undefined,\n      },\n    },\n  };\n\n  private nextId: number = 1;\n\n  public get mode(): ConnectionType {\n    return this.state.xswd == ConnectionState.Accepted\n      ? ConnectionType.XSWD\n      : this.state.fallback != ConnectionState.Accepted\n      ? ConnectionType.XSWD\n      : ConnectionType.Fallback;\n  }\n\n  constructor(\n    appInfo: AppInfo,\n    config?: Config,\n    // if xswd fails to connect, at least connect to a public node\n    fallback_config: Config | null = null // no fallback setup by default\n  ) {\n    debug = makeDebug(config?.debug || false)(\"xswd\");\n    debug(\"creating connection\");\n\n    checkAppInfo(appInfo);\n    this.appInfo = appInfo;\n    if (fallback_config) {\n      checkConfig(fallback_config);\n      debug(\"configured fallback:\", fallback_config);\n    }\n\n    this.config = {\n      xswd: {\n        ...DEFAULT_CONFIG,\n        ...(config || {}),\n        timeout: { ...DEFAULT_TIMEOUT, ...(config?.timeout || {}) },\n      },\n      fallback: fallback_config,\n    };\n  }\n\n  // deprecated\n  async initialize() {\n    debug(\"initializing api\");\n    if (this.config.fallback) {\n      await this.initializeFallback().finally(async () => {\n        await this.initializeXSWD();\n      });\n    } else {\n      await this.initializeXSWD();\n    }\n  }\n\n  async initializeFallback() {\n    return new Promise<void>(async (resolve, reject) => {\n      debug(\"initializing fallback\");\n\n      if (this.config.fallback) {\n        this._initializeWebsocket(ConnectionType.Fallback)\n          .then(() => {\n            debug(\"fallback intitialized\");\n            resolve();\n          })\n          .catch((error) => {\n            console.warn(\"failed to initialize fallback:\", error);\n            reject(error);\n          });\n      } else {\n        reject(\"fallback has no config\");\n      }\n    });\n  }\n\n  async initializeXSWD() {\n    return new Promise<void>(async (resolve, reject) => {\n      debug(\"initializing xswd\");\n\n      this._initializeWebsocket(ConnectionType.XSWD)\n        .then(() => {\n          debug(\"xswd initialized\");\n          this.closeFallback();\n\n          resolve();\n        })\n        .catch((error) => {\n          if (this.state.fallback == ConnectionState.Accepted) {\n            console.warn(\"failed to initialize xswd. staying in fallback mode\");\n            console.error(error);\n            reject(error);\n          } else {\n            console.error(\"failed to initialize xswd or fallback:\", error);\n            reject(error);\n          }\n        });\n    });\n  }\n\n  async _initializeWebsocket(connectionType: ConnectionType) {\n    return new Promise<void>((resolve, reject) => {\n      debug(\"initialize \" + connectionType);\n      const websocket = this.connection[connectionType];\n\n      if (websocket !== null && websocket.readyState == WebSocket.OPEN) {\n        throw \"WebSocket is aleady alive\";\n      }\n\n      this.state[connectionType] = ConnectionState.Initializing;\n      const config = this.config[connectionType];\n      if (config != null) {\n        const protocol = config.secure ? \"wss\" : \"ws\";\n        const port = config.port ? `:${config.port}` : \"\";\n        const path = connectionType == ConnectionType.XSWD ? \"xswd\" : \"ws\";\n        const url = `${protocol}://${config.address}${port}/${path}`;\n\n        this.connection[connectionType] = new WebSocket(url);\n        debug(connectionType + \" websocket created for \" + url);\n\n        this._setupHandlers(connectionType, resolve, reject);\n      }\n    });\n  }\n\n  _handleFragmentedData(\n    message: MessageEvent<any>\n  ):\n    | AuthResponse\n    | EventResponse\n    | Response<Entity, Method<Entity>, \"error\">\n    | Response<Entity, Method<Entity>, \"result\">\n    | null {\n    //debug(\"WebSocket:onmessage\", { message });\n    // fragmented messages handling\n    try {\n      // default parsing a single message\n      return JSON.parse(message.data.toString());\n    } catch (error) {\n      // sometimes the result is split in multiple message so we need to buffer\n      this.buffer = this.buffer + message.data.toString();\n      try {\n        // we keep parsing the buffer after updating it to check if the result is complete\n        const data = JSON.parse(this.buffer);\n        // success => we empty the buffer\n        this.buffer = \"\";\n        return data;\n      } catch (error) {\n        // not parsable yet, better luck next message\n        return null;\n      }\n    }\n  }\n\n  async _setupHandlers(\n    connectionType: ConnectionType,\n    resolve: (value: void | PromiseLike<void>) => void,\n    reject: (reason?: any) => void\n  ) {\n    const websocket = this.connection[connectionType];\n    if (websocket) {\n      websocket.onmessage = async (message) => {\n        let data:\n          | AuthResponse\n          | EventResponse\n          | Response<Entity, Method<Entity>, \"error\">\n          | Response<Entity, Method<Entity>, \"result\">\n          | null;\n\n        data = this._handleFragmentedData(message); // some message are not received in a single frame, this function buffers until message is parsable\n        if (data == null) return;\n\n        if (connectionType == ConnectionType.XSWD) {\n          if (\"accepted\" in data) {\n            if (data.accepted === true) {\n              this.state[ConnectionType.XSWD] = ConnectionState.Accepted;\n              debug(\"connection accepted\");\n              resolve();\n            } else if (data.accepted === false) {\n              this.state[ConnectionType.XSWD] = ConnectionState.Refused;\n              debug(\"connection refused\", data);\n              reject(\"connection refused: \" + data.message);\n            }\n          }\n        }\n\n        if (\"error\" in data) {\n          const errorData: Response<Entity, Method<Entity>, \"error\"> = data;\n          await this.response.send(errorData);\n          reject(errorData.error.message);\n        } else if (\"result\" in data) {\n          // event\n          if (\n            connectionType == ConnectionType.XSWD &&\n            typeof data.result == \"object\" &&\n            data.result != null &&\n            \"event\" in data.result\n          ) {\n            const eventData = data as EventResponse;\n            const eventType = eventData.result.event;\n            const eventValue = eventData.result.value;\n\n            if (this.subscriptions.events[eventType].enabled) {\n              const callback = this.subscriptions.events[eventType].callback;\n              if (callback !== undefined) callback(eventValue);\n\n              this.subscriptions.events[eventType].waiting.forEach(\n                (waitingChannel) => {\n                  waitingChannel.send(eventValue);\n                }\n              );\n              return;\n            }\n          }\n          // normal response\n          await this.response.send(data);\n        }\n      };\n\n      websocket.onerror = (error) => {\n        this.state[connectionType] = ConnectionState.Closed;\n        reject(error);\n      };\n\n      websocket.onopen = () => {\n        if (connectionType == ConnectionType.Fallback) {\n          debug(\"fallback websocket connection opened.\");\n          resolve();\n          this.state[connectionType] = ConnectionState.Accepted;\n        } else {\n          debug(\"xswd websocket connection opened, authorizing...\");\n          this.authorize(this.appInfo);\n          this.state.xswd = ConnectionState.WaitingAuth;\n          if (this.config.xswd.timeout?.AUTH_TIMEOUT) {\n            setTimeout(\n              () => reject(\"authorisation timeout\"),\n              this.config.xswd.timeout?.AUTH_TIMEOUT\n            );\n          }\n        }\n      };\n\n      websocket.onclose = (ev) => {\n        this.state[connectionType] = ConnectionState.Closed;\n        this.connection[connectionType] = null;\n        this.onclose(connectionType, ev);\n        debug(connectionType + \" connection closed\");\n        reject(connectionType + \" connection closed\");\n      };\n\n      debug(connectionType + \" websocket handlers are set\");\n    }\n  }\n\n  // callback meant to be set by user\n  onclose(connectionType: ConnectionType, ev: CloseEvent) {}\n\n  async closeXSWD() {\n    if (\n      this.state.xswd == ConnectionState.Accepted ||\n      this.state.xswd == ConnectionState.WaitingAuth\n    ) {\n      debug(\"closing xswd\");\n      this.connection.xswd?.close();\n      this.state.xswd = ConnectionState.Closed;\n    }\n  }\n  async closeFallback() {\n    if (this.state.fallback == ConnectionState.Accepted) {\n      debug(\"closing fallback\");\n      this.connection.fallback?.close();\n\n      this.state.fallback = ConnectionState.Closed;\n    }\n  }\n\n  async close() {\n    this.closeFallback();\n    this.closeXSWD();\n  }\n\n  async Send<E extends Entity, M extends Method<E>>( //! previously sendSync\n    entity: E,\n    method: M,\n    body: Omit<JSONRPCRequestBody<E, M>, \"id\">\n  ) {\n    return new Promise<Response<E, M, \"error\"> | Response<E, M, \"result\">>(\n      async (resolve, reject) => {\n        if (this.mode == ConnectionType.Fallback && entity == \"wallet\") {\n          reject(\"cannot send to wallet in fallback mode.\");\n        }\n\n        debug(\"\\n\\n----------- REQUEST -------\", entity, method, \"\\n\");\n\n        const websocket = this.connection[this.mode];\n\n        if (this.state[this.mode] == ConnectionState.Accepted && websocket) {\n          // assing id to the body\n          const id = this.nextId;\n          this.nextId += 1;\n          const bodyWithId: JSONRPCRequestBody<typeof entity, typeof method> = {\n            ...body,\n            id,\n          };\n\n          /*this.config[this.mode]?.debug &&\n            console.dir({ bodyWithId }, { depth: null });*/\n          debug(\"sending\", bodyWithId);\n\n          // send data\n          websocket.send(JSON.stringify(bodyWithId));\n\n          // listen for the response\n          for (;;) {\n            const response = await this.response.recv();\n            // if ids mismatch\n            if (response.id != String(id)) {\n              // send it back to the channel\n              debug(\"id mismatch: \", response.id, String(id), \", resetting\");\n              await this.response.send(response);\n              await sleep(CHECK_INTERVAL);\n            } else {\n              debug(\"id match\", { response });\n\n              resolve(\n                response as Response<E, M, \"error\"> | Response<E, M, \"result\">\n              );\n              return;\n            }\n          }\n        } else {\n          reject(\"sending without being connected\");\n          return;\n        }\n      }\n    );\n  }\n\n  async subscribe({\n    event,\n    callback,\n  }: {\n    event: EventType;\n    callback?: (value: any) => void;\n  }) {\n    if (\n      this.state.xswd == ConnectionState.Accepted &&\n      this.mode === ConnectionType.XSWD\n    ) {\n      const subscription = await this.Send(\"wallet\", \"Subscribe\", {\n        jsonrpc: \"2.0\",\n        method: \"Subscribe\",\n        params: { event },\n      });\n      if (\"result\" in subscription) {\n        if (subscription.result) {\n          this.subscriptions.events[event].enabled = true;\n          this.subscriptions.events[event].callback = callback;\n        }\n        return subscription.result;\n      }\n      return false;\n    }\n    console.warn(\"cannot subscibe to events in fallback mode\");\n    return false;\n  }\n\n  async waitFor<\n    ET extends EventType,\n    EV = ET extends \"new_balance\"\n      ? Balance\n      : ET extends \"new_topoheight\"\n      ? Topoheight\n      : ET extends \"new_entry\"\n      ? Entry\n      : unknown\n  >(event: ET, predicate?: (eventValue: EV) => boolean): Promise<EV> {\n    if (this.mode == ConnectionType.Fallback) {\n      throw \"cannot wait for event in fallback mode\";\n    }\n\n    if (!this.subscriptions.events[event].enabled) {\n      throw `event ${event} has not been subscribed to`;\n    }\n\n    if (this.state.xswd == ConnectionState.Accepted) {\n      const c = new Chan<any>();\n      this.subscriptions.events[event].waiting.push(c);\n      for (;;) {\n        const value = await c.recv();\n        if (predicate === undefined) {\n          return value;\n        } else if (predicate && predicate(value)) {\n          return value;\n        }\n      }\n    } else {\n      throw \"cannot wait for event if connection is not initialized\";\n    }\n  }\n\n  private authorize(appInfo: AppInfo) {\n    const websocket = this.connection.xswd;\n    if (websocket) {\n      const data = { ...appInfo };\n      debug(\"sending authorisation: \", { data });\n      websocket.send(JSON.stringify(data));\n    }\n  }\n\n  wallet = {\n    _api: this as Api,\n\n    async Echo(params: Echo) {\n      return await this._api.Send(\"wallet\", \"Echo\", {\n        jsonrpc: \"2.0\",\n        method: \"Echo\",\n        params,\n      });\n    },\n    async GetAddress() {\n      return await this._api.Send(\"wallet\", \"GetAddress\", {\n        jsonrpc: \"2.0\",\n        method: \"GetAddress\",\n        params: undefined,\n      });\n    },\n    async GetBalance(params: GetBalance = {}) {\n      return await this._api.Send(\"wallet\", \"GetBalance\", {\n        jsonrpc: \"2.0\",\n        method: \"GetBalance\",\n        params,\n      });\n    },\n    async GetHeight() {\n      return await this._api.Send(\"wallet\", \"GetHeight\", {\n        jsonrpc: \"2.0\",\n        method: \"GetHeight\",\n        params: undefined,\n      });\n    },\n    async GetTransferbyTXID(params: GetTransferbyTXID) {\n      return await this._api.Send(\"wallet\", \"GetTransferbyTXID\", {\n        jsonrpc: \"2.0\",\n        method: \"GetTransferbyTXID\",\n        params,\n      });\n    },\n    async GetTransfers(params: GetTransfers = {}) {\n      return await this._api.Send(\"wallet\", \"GetTransfers\", {\n        jsonrpc: \"2.0\",\n        method: \"GetTransfers\",\n        params,\n      });\n    },\n\n    async GetTrackedAssets(params: GetTrackedAssets) {\n      return await this._api.Send(\"wallet\", \"GetTrackedAssets\", {\n        jsonrpc: \"2.0\",\n        method: \"GetTrackedAssets\",\n        params,\n      });\n    },\n\n    async MakeIntegratedAddress(params: MakeIntegratedAddress) {\n      return await this._api.Send(\"wallet\", \"MakeIntegratedAddress\", {\n        jsonrpc: \"2.0\",\n        method: \"MakeIntegratedAddress\",\n        params,\n      });\n    },\n    async SplitIntegratedAddress(params: SplitIntegratedAddress) {\n      return await this._api.Send(\"wallet\", \"SplitIntegratedAddress\", {\n        jsonrpc: \"2.0\",\n        method: \"SplitIntegratedAddress\",\n        params,\n      });\n    },\n    async QueryKey(params: QueryKey) {\n      return await this._api.Send(\"wallet\", \"QueryKey\", {\n        jsonrpc: \"2.0\",\n        method: \"QueryKey\",\n        params,\n      });\n    },\n    async transfer(params: Transfer) {\n      const response = await this._api.Send(\"wallet\", \"transfer\", {\n        jsonrpc: \"2.0\",\n        method: \"transfer\",\n        params,\n      });\n      return response;\n    },\n    async scinvoke(params: SCInvoke) {\n      const response = await this._api.Send(\"wallet\", \"scinvoke\", {\n        jsonrpc: \"2.0\",\n        method: \"scinvoke\",\n        params,\n      });\n\n      if (\"error\" in response) {\n        throw \"could not scinvoke: \" + response.error.message;\n      }\n\n      return response;\n    },\n  };\n  node = {\n    _api: this as Api,\n\n    async Echo(params: Echo) {\n      return await this._api.Send(\"daemon\", \"DERO.Echo\", {\n        jsonrpc: \"2.0\",\n        method: \"DERO.Echo\",\n        params,\n      });\n    },\n    async Ping() {\n      return await this._api.Send(\"daemon\", \"DERO.Ping\", {\n        jsonrpc: \"2.0\",\n        method: \"DERO.Ping\",\n        params: undefined,\n      });\n    },\n    async GetInfo() {\n      return await this._api.Send(\"daemon\", \"DERO.GetInfo\", {\n        jsonrpc: \"2.0\",\n        method: \"DERO.GetInfo\",\n        params: undefined,\n      });\n    },\n    async GetBlock(params: DEROGetBlock) {\n      return await this._api.Send(\"daemon\", \"DERO.GetBlock\", {\n        jsonrpc: \"2.0\",\n        method: \"DERO.GetBlock\",\n        params,\n      });\n    },\n    async GetBlockHeaderByTopoHeight(params: DEROGetBlockHeaderByTopoHeight) {\n      return await this._api.Send(\"daemon\", \"DERO.GetBlockHeaderByTopoHeight\", {\n        jsonrpc: \"2.0\",\n        method: \"DERO.GetBlockHeaderByTopoHeight\",\n        params,\n      });\n    },\n    async GetBlockHeaderByHash(params: DEROGetBlockHeaderByHash) {\n      return await this._api.Send(\"daemon\", \"DERO.GetBlockHeaderByHash\", {\n        jsonrpc: \"2.0\",\n        method: \"DERO.GetBlockHeaderByHash\",\n        params,\n      });\n    },\n    async GetTxPool() {\n      return await this._api.Send(\"daemon\", \"DERO.GetTxPool\", {\n        jsonrpc: \"2.0\",\n        method: \"DERO.GetTxPool\",\n        params: undefined,\n      });\n    },\n    async GetRandomAddress(params: DEROGetRandomAddress = {}) {\n      return await this._api.Send(\"daemon\", \"DERO.GetRandomAddress\", {\n        jsonrpc: \"2.0\",\n        method: \"DERO.GetRandomAddress\",\n        params,\n      });\n    },\n    async GetTransaction(params: DEROGetTransaction) {\n      return await this._api.Send(\"daemon\", \"DERO.GetTransaction\", {\n        jsonrpc: \"2.0\",\n        method: \"DERO.GetTransaction\",\n        params,\n      });\n    },\n    /*async SendRawTransaction(params: DEROSendRawTransaction) {\n      return await this._api.sendSync(\n        \"daemon\",\n        \"DERO.SendRawTransaction\",\n        {\n          jsonrpc: \"2.0\",\n          method: \"DERO.SendRawTransaction\",\n          params,\n        }\n      );\n    },*/\n    async GetHeight() {\n      return await this._api.Send(\"daemon\", \"DERO.GetHeight\", {\n        jsonrpc: \"2.0\",\n        method: \"DERO.GetHeight\",\n        params: undefined,\n      });\n    },\n    async GetBlockCount() {\n      return await this._api.Send(\"daemon\", \"DERO.GetBlockCount\", {\n        jsonrpc: \"2.0\",\n        method: \"DERO.GetBlockCount\",\n        params: undefined,\n      });\n    },\n    async GetLastBlockHeader() {\n      return await this._api.Send(\"daemon\", \"DERO.GetLastBlockHeader\", {\n        jsonrpc: \"2.0\",\n        method: \"DERO.GetLastBlockHeader\",\n        params: undefined,\n      });\n    },\n    async GetBlockTemplate(params: DEROGetBlockTemplate) {\n      return await this._api.Send(\"daemon\", \"DERO.GetBlockTemplate\", {\n        jsonrpc: \"2.0\",\n        method: \"DERO.GetBlockTemplate\",\n        params,\n      });\n    },\n    async GetEncryptedBalance(params: DEROGetEncryptedBalance) {\n      return await this._api.Send(\"daemon\", \"DERO.GetEncryptedBalance\", {\n        jsonrpc: \"2.0\",\n        method: \"DERO.GetEncryptedBalance\",\n        params,\n      });\n    },\n    async GetSC(params: DEROGetSC, waitAfterNewBlock?: true) {\n      if (waitAfterNewBlock) {\n        debug(\"waiting for new block\");\n        this._api.subscribe({ event: \"new_topoheight\" });\n        await this._api.waitFor(\"new_topoheight\");\n      }\n      return await this._api.Send(\"daemon\", \"DERO.GetSC\", {\n        jsonrpc: \"2.0\",\n        method: \"DERO.GetSC\",\n        params,\n      });\n    },\n    async GetGasEstimate(params: DEROGetGasEstimate) {\n      // use gasEstimateSCArgs() to simplify usage\n      return await this._api.Send(\"daemon\", \"DERO.GetGasEstimate\", {\n        jsonrpc: \"2.0\",\n        method: \"DERO.GetGasEstimate\",\n        params,\n      });\n    },\n    async NameToAddress(params: DERONameToAddress) {\n      return await this._api.Send(\"daemon\", \"DERO.NameToAddress\", {\n        jsonrpc: \"2.0\",\n        method: \"DERO.NameToAddress\",\n        params,\n      });\n    },\n  };\n}\n\nfunction checkAppInfo(appInfo: AppInfo) {\n  if (appInfo.name !== undefined && appInfo.name.length == 0) {\n    throw \"invalid app name\";\n  }\n  if (appInfo.description !== undefined && appInfo.description.length == 0) {\n    throw \"invalid app description\";\n  }\n  if (appInfo.id !== undefined && appInfo.id.length != 64) {\n    throw \"invalid app id\";\n  }\n}\n","import {\n  ErrorResponse,\n  Response,\n  Result,\n  ResultResponse,\n} from \"./types/response\";\nimport { Entity } from \"./types/types\";\nimport { Method } from \"./types/request\";\nimport \"crypto\";\n\n/*\nasync function hash(message: string) {\n  const encoder = new TextEncoder();\n  const data = encoder.encode(message);\n  const hash = await crypto.subtle.digest(\"SHA-256\", data);\n  return buf2hex(hash);\n}*/\n\nfunction pseudoHash(message: string, length: number = 64) {\n  message = new Array(64 - message.length)\n    .fill(0)\n    .map((_) => message)\n    .join(\"\");\n  console.assert(message.length > 1, \"message length must be > 1\");\n  return [...message]\n    .map((char, i) =>\n      Math.floor(char.charCodeAt(0) * ((7 + i) / (1 + (i % 7)))).toString(16)\n    )\n    .join(\"\")\n    .slice(0, 64);\n}\n\n/*\nfunction buf2hex(buffer: ArrayBuffer) {\n  return [...new Uint8Array(buffer)]\n    .map((x) => x.toString(16).padStart(2, \"0\"))\n    .join(\"\");\n}*/\n\nexport function generateAppId(appName: string): string {\n  return pseudoHash(appName);\n}\n\nexport async function sleep(timems: number) {\n  await new Promise((r) => setTimeout(r, timems));\n}\n\nexport function to<\n  E extends Entity,\n  M extends Method<E>,\n  R extends Result = Result\n>(\n  response: Response<E, M, R>\n): [ErrorResponse | undefined, ResultResponse<E, M> | undefined] {\n  return [\n    \"error\" in response ? (response.error as ErrorResponse) : undefined,\n    \"result\" in response\n      ? (response.result as ResultResponse<E, M>)\n      : undefined,\n  ];\n}\n","import {\n  Address,\n  DVMString,\n  Entity,\n  EventType,\n  Hash,\n  SCCode,\n  Uint64,\n} from \"./types\";\n\nexport type JSONRPCRequest = {\n  method: \"POST\";\n  headers: {\n    \"Content-Type\": \"application/json\";\n  };\n  body: JSONRPCRequestBody<Entity, Method<Entity>>;\n};\n\nexport type JSONRPCRequestBody<E extends Entity, M extends Method<E>> = {\n  jsonrpc: \"2.0\";\n  id: string | number;\n  method: M;\n  params: Params<E, M>;\n};\n\nexport type Method<E extends Entity> = E extends \"daemon\"\n  ?\n      | \"DERO.Echo\"\n      | \"DERO.Ping\"\n      | \"DERO.GetInfo\"\n      | \"DERO.GetBlock\"\n      | \"DERO.GetBlockHeaderByTopoHeight\"\n      | \"DERO.GetBlockHeaderByHash\"\n      | \"DERO.GetTxPool\"\n      | \"DERO.GetRandomAddress\"\n      | \"DERO.GetTransaction\"\n      | \"DERO.SendRawTransaction\"\n      | \"DERO.GetHeight\"\n      | \"DERO.GetBlockCount\"\n      | \"DERO.GetLastBlockHeader\"\n      | \"DERO.GetBlockTemplate\"\n      | \"DERO.GetEncryptedBalance\"\n      | \"DERO.GetSC\"\n      | \"DERO.GetGasEstimate\"\n      | \"DERO.NameToAddress\"\n  :\n      | \"Echo\"\n      | \"GetAddress\"\n      | \"GetBalance\"\n      | \"GetHeight\"\n      | \"GetTransferbyTXID\"\n      | \"GetTransfers\"\n      | \"GetTrackedAssets\"\n      | \"MakeIntegratedAddress\"\n      | \"SplitIntegratedAddress\"\n      | \"QueryKey\"\n      | \"transfer\"\n      | \"scinvoke\"\n      | \"Subscribe\";\n\nexport type Params<\n  E extends Entity,\n  M extends Method<E>\n> = M extends \"DERO.Echo\"\n  ? Echo\n  : M extends \"DERO.Ping\"\n  ? undefined\n  : M extends \"DERO.GetInfo\"\n  ? undefined\n  : M extends \"DERO.GetBlock\"\n  ? DEROGetBlock\n  : M extends \"DERO.GetBlockHeaderByTopoHeight\"\n  ? DEROGetBlockHeaderByTopoHeight\n  : M extends \"DERO.GetBlockHeaderByHash\"\n  ? DEROGetBlockHeaderByHash\n  : M extends \"DERO.GetTxPool\"\n  ? undefined\n  : M extends \"DERO.GetRandomAddress\"\n  ? DEROGetRandomAddress\n  : M extends \"DERO.GetTransaction\"\n  ? DEROGetTransaction\n  : M extends \"DERO.SendRawTransaction\"\n  ? DEROSendRawTransaction\n  : M extends \"DERO.GetHeight\"\n  ? undefined\n  : M extends \"DERO.GetBlockCount\"\n  ? undefined\n  : M extends \"DERO.GetLastBlockHeader\"\n  ? undefined\n  : M extends \"DERO.GetBlockTemplate\"\n  ? DEROGetBlockTemplate\n  : M extends \"DERO.GetEncryptedBalance\"\n  ? DEROGetEncryptedBalance\n  : M extends \"DERO.GetSC\"\n  ? DEROGetSC\n  : M extends \"DERO.GetGasEstimate\"\n  ? DEROGetGasEstimate\n  : M extends \"DERO.NameToAddress\"\n  ? DERONameToAddress\n  : M extends \"GetAddress\"\n  ? undefined\n  : M extends \"GetBalance\"\n  ? GetBalance\n  : M extends \"GetHeight\"\n  ? undefined\n  : M extends \"GetTrackedAssets\"\n  ? GetTrackedAssets\n  : M extends \"GetTransferbyTXID\"\n  ? GetTransferbyTXID\n  : M extends \"GetTransfers\"\n  ? GetTransfers\n  : M extends \"MakeIntegratedAddress\"\n  ? MakeIntegratedAddress\n  : M extends \"SplitIntegratedAddress\"\n  ? SplitIntegratedAddress\n  : M extends \"QueryKey\"\n  ? QueryKey\n  : M extends \"transfer\"\n  ? Transfer\n  : M extends \"scinvoke\"\n  ? SCInvoke\n  : M extends \"Subscribe\"\n  ? { event: EventType }\n  : Echo;\n\nexport type Echo = DVMString[];\n\nexport type WalletTransfer = {\n  amount?: Uint64;\n  burn?: Uint64;\n  destination?: string;\n  scid?: Hash;\n  payload_rpc?: Arguments;\n};\n\ntype ArgumentType = Uint64 | DVMString | Hash;\ntype Argument<AT extends ArgumentType> = {\n  name: DVMString;\n  datatype: AT extends Uint64\n    ? \"U\"\n    : AT extends Hash | DVMString\n    ? \"H\" | \"S\"\n    : unknown;\n  value: AT;\n};\n\ntype Arguments = Argument<ArgumentType>[];\n\nexport type DEROGetBlock = {\n  hash?: Hash;\n  height?: Uint64;\n};\n\nexport type DEROGetBlockHeaderByTopoHeight = {\n  topoheight: Uint64;\n};\n\nexport type DEROGetBlockHeaderByHash = {\n  hash: Hash;\n};\n\nexport type DEROGetRandomAddress = {\n  scid?: Hash;\n};\n\nexport type DEROGetTransaction = {\n  txs_hashes: Hash[];\n  decode_as_json?: Uint64;\n};\n\nexport type DEROSendRawTransaction = {\n  tx_as_hex: DVMString;\n};\n\nexport type DEROGetBlockTemplate = {\n  wallet_address: DVMString;\n  block?: boolean;\n  miner?: DVMString;\n};\n\nexport type DEROGetEncryptedBalance = {\n  address: DVMString;\n  topoheight: Uint64;\n  scid?: Hash;\n  treehash?: Hash;\n};\n\nexport type DEROGetSC = {\n  scid: Hash;\n  code?: boolean;\n  variables?: boolean;\n  topoheight?: Uint64;\n  keysuint64?: Uint64[];\n  keysstring?: DVMString[];\n  keysbytes?: Int8Array[];\n};\n\n// TODO rename transferSCArgs, used in both transfer and gasEstimate\nexport function gasEstimateSCArgs(\n  scid: Hash,\n  entrypoint: string,\n  args: { name: string; value: DVMString | Uint64 }[]\n): Argument<ArgumentType>[] {\n  return [\n    {\n      name: \"SC_ACTION\",\n      datatype: \"U\",\n      value: 0,\n    },\n    {\n      name: \"SC_ID\",\n      datatype: \"H\",\n      value: scid,\n    },\n    ...scinvokeSCArgs(entrypoint, args),\n  ];\n}\n\nexport function scinvokeSCArgs(\n  entrypoint: string,\n  args: { name: string; value: DVMString | Uint64 }[]\n): Argument<ArgumentType>[] {\n  const formattedArgs: Argument<ArgumentType>[] = args.map(\n    ({ name, value }) => ({\n      name,\n      datatype: typeof value == \"number\" ? \"U\" : \"S\", //? bigint?\n      value,\n    })\n  );\n  return [\n    {\n      name: \"entrypoint\",\n      datatype: \"S\",\n      value: entrypoint,\n    },\n    ...formattedArgs,\n  ];\n}\n\nexport type DEROGetGasEstimate = {\n  transfers?: WalletTransfer[];\n  sc?: SCCode;\n  sc_rpc?: Argument<ArgumentType>[];\n  signer?: Address;\n};\n\nexport type DERONameToAddress = {\n  name: DVMString;\n  topoheight: Uint64;\n};\n\nexport type GetBalance = {\n  scid?: Hash;\n};\n\nexport type GetTrackedAssets = {\n  only_positive_balances: boolean;\n  skip_balance_check: boolean;\n};\n\nexport type GetTransferbyTXID = {\n  hash?: Hash;\n  txid?: Hash;\n};\n\nexport type GetTransfers = {\n  scid?: Hash;\n  coinbase?: boolean;\n  in?: boolean;\n  out?: boolean;\n  min_height?: Uint64;\n  max_height?: Uint64;\n  sender?: DVMString;\n  receiver?: DVMString;\n  dstport?: Uint64;\n  srcport?: Uint64;\n};\n\nexport type MakeIntegratedAddress = {\n  address?: DVMString;\n  payload_rpc?: Argument<ArgumentType>;\n};\n\nexport type SplitIntegratedAddress = {\n  integrated_address: DVMString;\n};\n\nexport type QueryKey = { key_type: \"mnemonic\" };\n\nexport type Transfer = {\n  transfers?: WalletTransfer[];\n  sc?: SCCode;\n  sc_rpc?: Arguments;\n  ringsize?: Uint64;\n  scid?: Hash;\n  fees?: Uint64;\n  signer?: Address;\n};\n\nexport type SCInvoke = {\n  scid: Hash;\n  sc_rpc: Arguments;\n\n  sc_dero_deposit?: Uint64;\n  sc_token_deposit?: Uint64;\n  ringsize?: Uint64;\n};\n"],"mappings":"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","names":["ConnectionState","error"]}