{"version":3,"file":"createIrysUploader.mjs","sources":["../../src/createIrysUploader.ts"],"sourcesContent":["import type { BaseWebIrys } from '@irys/web-upload/dist/types/base';\nimport type { BaseNodeIrys } from '@irys/upload/dist/types/base';\nimport {\n  Context,\n  GenericFile,\n  GenericFileTag,\n  Signer,\n  SolAmount,\n  UploaderInterface,\n  UploaderUploadOptions,\n  createGenericFileFromJson,\n  lamports,\n  publicKey,\n} from '@metaplex-foundation/umi';\n\nimport {\n  Connection as Web3JsConnection,\n  PublicKey as Web3JsPublicKey,\n  SendOptions as Web3JsSendOptions,\n  Signer as Web3JsSigner,\n  Transaction as Web3JsTransaction,\n  TransactionSignature as Web3JsTransactionSignature,\n} from '@solana/web3.js';\nimport BigNumber from 'bignumber.js';\nimport { Buffer } from 'buffer';\nimport { PromisePool } from '@supercharge/promise-pool';\nimport {\n  AssetUploadFailedError,\n  IrysWithdrawError,\n  FailedToConnectToIrysAddressError,\n  IrysAbortError,\n} from './errors';\n\n// PromisePool is a dependency the Irys client already requires, so using it here has no extra cost.\n\nexport type IrysUploader = UploaderInterface & {\n  irys: () => Promise<BaseNodeIrys | BaseWebIrys>;\n  getUploadPriceFromBytes: (bytes: number) => Promise<SolAmount>;\n  getBalance: () => Promise<SolAmount>;\n  fund: (amount: SolAmount, skipBalanceCheck: boolean) => Promise<void>;\n  withdrawAll: (amount: SolAmount) => Promise<void>;\n  withdraw: (amount: SolAmount) => Promise<void>;\n};\n\nexport type IrysUploaderOptions = {\n  address?: string;\n  timeout?: number;\n  providerUrl?: string;\n  priceMultiplier?: number;\n  payer?: Signer;\n  uploadConcurrency?: number;\n};\n\nexport type IrysWalletAdapter = {\n  publicKey: Web3JsPublicKey | null;\n  signMessage?: (message: Uint8Array) => Promise<Uint8Array>;\n  signTransaction?: (\n    transaction: Web3JsTransaction\n  ) => Promise<Web3JsTransaction>;\n  signAllTransactions?: (\n    transactions: Web3JsTransaction[]\n  ) => Promise<Web3JsTransaction[]>;\n  sendTransaction: (\n    transaction: Web3JsTransaction,\n    connection: Web3JsConnection,\n    options?: Web3JsSendOptions & { signers?: Web3JsSigner[] }\n  ) => Promise<Web3JsTransactionSignature>;\n};\n\n// Size of Irys transaction header.\nconst HEADER_SIZE = 2_000;\n\n// Minimum file size for cost calculation.\nconst MINIMUM_SIZE = 80_000;\n\nconst gatewayUrl = (id: string) => `https://gateway.irys.xyz/${id}`;\n\nexport function createBaseIrysUploader(\n  initFn: (\n    address: string,\n    payer: Signer,\n    options: any,\n    context: any\n  ) => Promise<BaseWebIrys | BaseNodeIrys>,\n  context: Pick<Context, 'rpc' | 'payer' | 'eddsa'>,\n  uploaderOptions: IrysUploaderOptions = {}\n): IrysUploader {\n  // eslint-disable-next-line @typescript-eslint/naming-convention\n  let _irys: BaseNodeIrys | BaseWebIrys | null = null;\n  uploaderOptions = {\n    providerUrl: context.rpc.getEndpoint(),\n    ...uploaderOptions,\n  };\n\n  const getUploadPriceFromBytes = async (bytes: number): Promise<SolAmount> => {\n    const irys = await getIrys();\n    const price = await irys.getPrice(bytes);\n\n    return bigNumberToAmount(\n      price.multipliedBy(uploaderOptions.priceMultiplier ?? 1.1)\n    );\n  };\n\n  const getUploadPrice = async (files: GenericFile[]): Promise<SolAmount> => {\n    const bytes: number = files.reduce(\n      (sum, file) =>\n        sum + HEADER_SIZE + Math.max(MINIMUM_SIZE, file.buffer.byteLength),\n      0\n    );\n\n    return getUploadPriceFromBytes(bytes);\n  };\n\n  const upload = async (\n    files: GenericFile[],\n    options?: UploaderUploadOptions\n  ): Promise<string[]> => {\n    const irys = await getIrys();\n    const amount = await getUploadPrice(files);\n    await fund(amount);\n\n    const manifestMap = options?.manifest === true ? new Map() : undefined;\n\n    const result = await PromisePool.for(files)\n      .withConcurrency(uploaderOptions.uploadConcurrency ?? 10)\n      .onTaskFinished((_, pool) =>\n        options?.onProgress?.(pool.processedPercentage())\n      )\n      .process(async (file) => {\n        if (options?.signal?.aborted) throw new IrysAbortError();\n\n        const buffer = Buffer.from(file.buffer);\n        const irysTx = irys.createTransaction(buffer, {\n          tags: getGenericFileTagsWithContentType(file),\n        });\n        await irysTx.sign();\n        const {\n          status,\n          data: { id },\n        } = await irys.uploader.uploadTransaction(irysTx);\n\n        if (status >= 300) throw new AssetUploadFailedError(status);\n\n        manifestMap?.set(file.fileName, id);\n\n        return id;\n      });\n\n    if (manifestMap) {\n      const manifest = await irys.uploader.generateFolder({\n        items: manifestMap,\n      });\n      const { id } = await irys.upload(JSON.stringify(manifest), {\n        tags: [\n          { name: 'Type', value: 'manifest' },\n          { name: 'Content-Type', value: 'application/x.irys-manifest+json' },\n          // ...(options?.manifestTags ?? []),\n        ],\n      });\n      return [gatewayUrl(id)];\n    }\n\n    return result.results.map(gatewayUrl);\n  };\n\n  const uploadJson = async <T>(json: T): Promise<string> => {\n    const file = createGenericFileFromJson(json);\n    const uris = await upload([file]);\n    return uris[0];\n  };\n\n  const getBalance = async (): Promise<SolAmount> => {\n    const irys = await getIrys();\n    const balance = await irys.getBalance();\n\n    return bigNumberToAmount(balance);\n  };\n\n  const fund = async (\n    amount: SolAmount,\n    skipBalanceCheck = false\n  ): Promise<void> => {\n    const irys = await getIrys();\n    let toFund = amountToBigNumber(amount);\n\n    if (!skipBalanceCheck) {\n      const balance = await irys.getBalance();\n\n      toFund = toFund.isGreaterThan(balance)\n        ? toFund.minus(balance)\n        : new BigNumber(0);\n    }\n\n    if (toFund.isLessThanOrEqualTo(0)) {\n      return;\n    }\n\n    await irys.fund(toFund);\n  };\n\n  const withdrawAll = async (): Promise<void> => {\n    const irys = await getIrys();\n    const balance = await irys.getBalance();\n    const minimumBalance = new BigNumber(5000);\n\n    if (balance.isLessThan(minimumBalance)) {\n      return;\n    }\n\n    await irys.withdrawAll();\n  };\n\n  const withdraw = async (amount: SolAmount): Promise<void> => {\n    const irys = await getIrys();\n    try {\n      await irys.withdrawBalance(amountToBigNumber(amount));\n    } catch (e: any) {\n      throw new IrysWithdrawError(\n        e instanceof Error ? e.message : e.toString()\n      );\n    }\n  };\n\n  const getIrys = async (): Promise<BaseWebIrys | BaseNodeIrys> => {\n    const oldPayer = _irys?.getSigner().publicKey;\n    const newPayer = uploaderOptions.payer ?? context.payer;\n    if (\n      oldPayer &&\n      publicKey(new Uint8Array(oldPayer)) !== newPayer.publicKey\n    ) {\n      _irys = null;\n    }\n\n    if (!_irys) {\n      _irys = await initIrys();\n    }\n\n    return _irys;\n  };\n\n  const initIrys = async (): Promise<BaseWebIrys | BaseNodeIrys> => {\n    const token = 'solana';\n    const defaultAddress =\n      context.rpc.getCluster() === 'devnet'\n        ? 'https://devnet.irys.xyz'\n        : 'https://uploader.irys.xyz';\n    const address = uploaderOptions?.address ?? defaultAddress;\n    const irysOptions = {\n      timeout: uploaderOptions.timeout,\n      providerUrl: uploaderOptions.providerUrl,\n    };\n\n    const payer: Signer = uploaderOptions.payer ?? context.payer;\n\n    const irys = await initFn(address, payer, irysOptions, context);\n    try {\n      // Check for valid irys node.\n      await irys.utils.getBundlerAddress(token);\n    } catch (error) {\n      throw new FailedToConnectToIrysAddressError(address, error as Error);\n    }\n\n    return irys;\n  };\n\n  return {\n    getUploadPriceFromBytes,\n    getUploadPrice,\n    upload,\n    uploadJson,\n    getBalance,\n    fund,\n    withdrawAll,\n    withdraw,\n    irys: getIrys,\n  };\n}\n\nexport const isIrysUploader = (\n  uploader: UploaderInterface\n): uploader is IrysUploader =>\n  'irys' in uploader &&\n  'getBalance' in uploader &&\n  'fund' in uploader &&\n  'withdrawAll' in uploader;\n\nconst bigNumberToAmount = (bigNumber: BigNumber): SolAmount =>\n  lamports(bigNumber.decimalPlaces(0).toString());\n\nconst amountToBigNumber = (amount: SolAmount): BigNumber =>\n  new BigNumber(amount.basisPoints.toString());\n\nconst getGenericFileTagsWithContentType = (\n  file: GenericFile\n): GenericFileTag[] => {\n  if (!file.contentType) {\n    return file.tags;\n  }\n\n  return [{ name: 'Content-Type', value: file.contentType }, ...file.tags];\n};\n"],"names":["HEADER_SIZE","MINIMUM_SIZE","gatewayUrl","id","createBaseIrysUploader","initFn","context","uploaderOptions","_irys","providerUrl","rpc","getEndpoint","getUploadPriceFromBytes","bytes","irys","getIrys","price","getPrice","bigNumberToAmount","multipliedBy","priceMultiplier","getUploadPrice","files","reduce","sum","file","Math","max","buffer","byteLength","upload","options","amount","fund","manifestMap","manifest","Map","undefined","result","PromisePool","for","withConcurrency","uploadConcurrency","onTaskFinished","_","pool","onProgress","processedPercentage","process","signal","aborted","IrysAbortError","Buffer","from","irysTx","createTransaction","tags","getGenericFileTagsWithContentType","sign","status","data","uploader","uploadTransaction","AssetUploadFailedError","set","fileName","generateFolder","items","JSON","stringify","name","value","results","map","uploadJson","json","createGenericFileFromJson","uris","getBalance","balance","skipBalanceCheck","toFund","amountToBigNumber","isGreaterThan","minus","BigNumber","isLessThanOrEqualTo","withdrawAll","minimumBalance","isLessThan","withdraw","withdrawBalance","e","IrysWithdrawError","Error","message","toString","oldPayer","getSigner","publicKey","newPayer","payer","Uint8Array","initIrys","token","defaultAddress","getCluster","address","irysOptions","timeout","utils","getBundlerAddress","error","FailedToConnectToIrysAddressError","isIrysUploader","bigNumber","lamports","decimalPlaces","basisPoints","contentType"],"mappings":"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"}