@metaplex-foundation/umi-uploader-irys 0.10.0-beta.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -7,6 +7,7 @@ var umiWeb3jsAdapters = require('@metaplex-foundation/umi-web3js-adapters');
7
7
  var web3_js = require('@solana/web3.js');
8
8
  var BigNumber = require('bignumber.js');
9
9
  var buffer = require('buffer');
10
+ var promisePool = require('@supercharge/promise-pool');
10
11
  var errors = require('./errors.cjs');
11
12
 
12
13
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
@@ -31,7 +32,7 @@ function _interopNamespace(e) {
31
32
 
32
33
  var BigNumber__default = /*#__PURE__*/_interopDefaultLegacy(BigNumber);
33
34
 
34
- // eslint-disable-next-line import/no-named-default
35
+ // PromisePool is a dependency the Irys client already requires, so using it here has no extra cost.
35
36
 
36
37
  /**
37
38
  * This method is necessary to import the Irys package on both ESM and CJS modules.
@@ -52,27 +53,30 @@ const HEADER_SIZE = 2_000;
52
53
 
53
54
  // Minimum file size for cost calculation.
54
55
  const MINIMUM_SIZE = 80_000;
55
- function createIrysUploader(context, options = {}) {
56
+ const gatewayUrl = id => `https://gateway.irys.xyz/${id}`;
57
+ function createIrysUploader(context, uploaderOptions = {}) {
56
58
  // eslint-disable-next-line @typescript-eslint/naming-convention
57
59
  let _irys = null;
58
- options = {
60
+ uploaderOptions = {
59
61
  providerUrl: context.rpc.getEndpoint(),
60
- ...options
62
+ ...uploaderOptions
61
63
  };
62
64
  const getUploadPriceFromBytes = async bytes => {
63
65
  const irys = await getIrys();
64
66
  const price = await irys.getPrice(bytes);
65
- return bigNumberToAmount(price.multipliedBy(options.priceMultiplier ?? 1.1));
67
+ return bigNumberToAmount(price.multipliedBy(uploaderOptions.priceMultiplier ?? 1.1));
66
68
  };
67
69
  const getUploadPrice = async files => {
68
70
  const bytes = files.reduce((sum, file) => sum + HEADER_SIZE + Math.max(MINIMUM_SIZE, file.buffer.byteLength), 0);
69
71
  return getUploadPriceFromBytes(bytes);
70
72
  };
71
- const upload = async files => {
73
+ const upload = async (files, options) => {
72
74
  const irys = await getIrys();
73
75
  const amount = await getUploadPrice(files);
74
76
  await fund(amount);
75
- const promises = files.map(async file => {
77
+ const manifestMap = options?.manifest === true ? new Map() : undefined;
78
+ const result = await promisePool.PromisePool.for(files).withConcurrency(uploaderOptions.uploadConcurrency ?? 10).onTaskFinished((_, pool) => options?.onProgress?.(pool.processedPercentage())).process(async file => {
79
+ if (options?.signal?.aborted) throw new errors.IrysAbortError();
76
80
  const buffer$1 = buffer.Buffer.from(file.buffer);
77
81
  const irysTx = irys.createTransaction(buffer$1, {
78
82
  tags: getGenericFileTagsWithContentType(file)
@@ -80,14 +84,35 @@ function createIrysUploader(context, options = {}) {
80
84
  await irysTx.sign();
81
85
  const {
82
86
  status,
83
- data
87
+ data: {
88
+ id
89
+ }
84
90
  } = await irys.uploader.uploadTransaction(irysTx);
85
- if (status >= 300) {
86
- throw new errors.AssetUploadFailedError(status);
87
- }
88
- return `https://arweave.net/${data.id}`;
91
+ if (status >= 300) throw new errors.AssetUploadFailedError(status);
92
+ manifestMap?.set(file.fileName, id);
93
+ return id;
89
94
  });
90
- return Promise.all(promises);
95
+ if (manifestMap) {
96
+ const manifest = await irys.uploader.generateFolder({
97
+ items: manifestMap
98
+ });
99
+ const {
100
+ id
101
+ } = await irys.upload(JSON.stringify(manifest), {
102
+ tags: [{
103
+ name: 'Type',
104
+ value: 'manifest'
105
+ }, {
106
+ name: 'Content-Type',
107
+ value: 'application/x.irys-manifest+json'
108
+ }
109
+ // ...(options?.manifestTags ?? []),
110
+ ]
111
+ });
112
+
113
+ return [gatewayUrl(id)];
114
+ }
115
+ return result.results.map(gatewayUrl);
91
116
  };
92
117
  const uploadJson = async json => {
93
118
  const file = umi.createGenericFileFromJson(json);
@@ -96,14 +121,14 @@ function createIrysUploader(context, options = {}) {
96
121
  };
97
122
  const getBalance = async () => {
98
123
  const irys = await getIrys();
99
- const balance = await irys.getLoadedBalance();
124
+ const balance = await irys.getBalance();
100
125
  return bigNumberToAmount(balance);
101
126
  };
102
127
  const fund = async (amount, skipBalanceCheck = false) => {
103
128
  const irys = await getIrys();
104
129
  let toFund = amountToBigNumber(amount);
105
130
  if (!skipBalanceCheck) {
106
- const balance = await irys.getLoadedBalance();
131
+ const balance = await irys.getBalance();
107
132
  toFund = toFund.isGreaterThan(balance) ? toFund.minus(balance) : new BigNumber__default["default"](0);
108
133
  }
109
134
  if (toFund.isLessThanOrEqualTo(0)) {
@@ -112,15 +137,13 @@ function createIrysUploader(context, options = {}) {
112
137
  await irys.fund(toFund);
113
138
  };
114
139
  const withdrawAll = async () => {
115
- // TODO(loris): Replace with "withdrawAll" when available on Irys.
116
140
  const irys = await getIrys();
117
- const balance = await irys.getLoadedBalance();
141
+ const balance = await irys.getBalance();
118
142
  const minimumBalance = new BigNumber__default["default"](5000);
119
143
  if (balance.isLessThan(minimumBalance)) {
120
144
  return;
121
145
  }
122
- const balanceToWithdraw = balance.minus(minimumBalance);
123
- await withdraw(bigNumberToAmount(balanceToWithdraw));
146
+ await irys.withdrawAll();
124
147
  };
125
148
  const withdraw = async amount => {
126
149
  const irys = await getIrys();
@@ -132,7 +155,7 @@ function createIrysUploader(context, options = {}) {
132
155
  };
133
156
  const getIrys = async () => {
134
157
  const oldPayer = _irys?.getSigner().publicKey;
135
- const newPayer = options.payer ?? context.payer;
158
+ const newPayer = uploaderOptions.payer ?? context.payer;
136
159
  if (oldPayer && umi.publicKey(new Uint8Array(oldPayer)) !== newPayer.publicKey) {
137
160
  _irys = null;
138
161
  }
@@ -142,42 +165,37 @@ function createIrysUploader(context, options = {}) {
142
165
  return _irys;
143
166
  };
144
167
  const initIrys = async () => {
145
- const currency = 'solana';
146
- const defaultAddress = context.rpc.getCluster() === 'devnet' ? 'https://devnet.irys.xyz' : 'https://node1.irys.xyz';
147
- const address = options?.address ?? defaultAddress;
168
+ const token = 'solana';
169
+ const defaultAddress = context.rpc.getCluster() === 'devnet' ? 'https://devnet.irys.xyz' : 'https://uploader.irys.xyz';
170
+ const address = uploaderOptions?.address ?? defaultAddress;
148
171
  const irysOptions = {
149
- timeout: options.timeout,
150
- providerUrl: options.providerUrl
172
+ timeout: uploaderOptions.timeout,
173
+ providerUrl: uploaderOptions.providerUrl
151
174
  };
152
- const payer = options.payer ?? context.payer;
175
+ const payer = uploaderOptions.payer ?? context.payer;
153
176
 
154
177
  // If in node use node irys, else use web irys.
155
178
  const isNode =
156
179
  // eslint-disable-next-line no-prototype-builtins
157
180
  typeof window === 'undefined' || window.process?.hasOwnProperty('type');
158
181
  let irys;
159
- if (isNode && umi.isKeypairSigner(payer)) irys = await initNodeIrys(address, currency, payer, irysOptions);else {
160
- irys = await initWebIrys(address, currency, payer, irysOptions);
182
+ if (isNode && umi.isKeypairSigner(payer)) irys = await initNodeIrys(address, payer, irysOptions);else {
183
+ irys = await initWebIrys(address, payer, irysOptions);
161
184
  }
162
185
  try {
163
186
  // Check for valid irys node.
164
- await irys.utils.getBundlerAddress(currency);
187
+ await irys.utils.getBundlerAddress(token);
165
188
  } catch (error) {
166
189
  throw new errors.FailedToConnectToIrysAddressError(address, error);
167
190
  }
168
191
  return irys;
169
192
  };
170
- const initNodeIrys = async (address, currency, keypair, options) => {
171
- const bPackage = _removeDoubleDefault(await Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require('@irys/sdk')); }));
172
- // eslint-disable-next-line new-cap
173
- return new bPackage.default({
174
- url: address,
175
- token: currency,
176
- key: keypair.secretKey,
177
- config: options
178
- });
193
+ const initNodeIrys = async (address, keypair, options) => {
194
+ const bPackage = _removeDoubleDefault(await Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require('@irys/upload')); }));
195
+ const cPackage = _removeDoubleDefault(await Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require('@irys/upload-solana')); }));
196
+ return bPackage.Uploader(cPackage.Solana).bundlerUrl(address).withWallet(keypair.secretKey).withIrysConfig(options).build();
179
197
  };
180
- const initWebIrys = async (address, currency, payer, options) => {
198
+ const initWebIrys = async (address, payer, options) => {
181
199
  const wallet = {
182
200
  publicKey: umiWeb3jsAdapters.toWeb3JsPublicKey(payer.publicKey),
183
201
  signMessage: message => payer.signMessage(message),
@@ -202,15 +220,9 @@ function createIrysUploader(context, options = {}) {
202
220
  return umi.base58.deserialize(signature)[0];
203
221
  }
204
222
  };
205
- const bPackage = _removeDoubleDefault(await Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require('@irys/sdk')); }));
206
- const irys = new bPackage.WebIrys({
207
- url: address,
208
- token: currency,
209
- wallet: {
210
- provider: wallet
211
- },
212
- config: options
213
- });
223
+ const bPackage = _removeDoubleDefault(await Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require('@irys/web-upload')); }));
224
+ const cPackage = _removeDoubleDefault(await Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require('@irys/web-upload-solana')); }));
225
+ const irys = await bPackage.WebUploader(cPackage.WebSolana).withProvider(wallet).bundlerUrl(address).withIrysConfig(options).build();
214
226
  try {
215
227
  // Try to initiate irys.
216
228
  await irys.ready();
@@ -1 +1 @@
1
- {"version":3,"file":"createIrysUploader.cjs","sources":["../../src/createIrysUploader.ts"],"sourcesContent":["// eslint-disable-next-line import/no-named-default\nimport type { default as NodeIrys, WebIrys } from '@irys/sdk';\nimport {\n Commitment,\n Context,\n GenericFile,\n GenericFileTag,\n Keypair,\n Signer,\n SolAmount,\n UploaderInterface,\n base58,\n createGenericFileFromJson,\n createSignerFromKeypair,\n isKeypairSigner,\n lamports,\n publicKey,\n signTransaction,\n} from '@metaplex-foundation/umi';\nimport {\n fromWeb3JsKeypair,\n fromWeb3JsLegacyTransaction,\n toWeb3JsLegacyTransaction,\n toWeb3JsPublicKey,\n} from '@metaplex-foundation/umi-web3js-adapters';\nimport {\n Connection as Web3JsConnection,\n Keypair as Web3JsKeypair,\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 {\n AssetUploadFailedError,\n IrysWithdrawError,\n FailedToConnectToIrysAddressError,\n FailedToInitializeIrysError,\n} from './errors';\n\n/**\n * This method is necessary to import the Irys package on both ESM and CJS modules.\n * Without this, we get a different structure on each module:\n * - CJS: { default: [Getter], WebIrys: [Getter] }\n * - ESM: { default: { default: [Getter], WebIrys: [Getter] } }\n * This method fixes this by ensure there is not double default in the imported package.\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nfunction _removeDoubleDefault<T>(pkg: T): T {\n if (\n pkg &&\n typeof pkg === 'object' &&\n 'default' in pkg &&\n 'default' in (pkg as any).default\n ) {\n return (pkg as any).default;\n }\n\n return pkg;\n}\n\nexport type IrysUploader = UploaderInterface & {\n irys: () => Promise<NodeIrys | WebIrys>;\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};\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\nexport function createIrysUploader(\n context: Pick<Context, 'rpc' | 'payer' | 'eddsa'>,\n options: IrysUploaderOptions = {}\n): IrysUploader {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n let _irys: WebIrys | NodeIrys | null = null;\n options = {\n providerUrl: context.rpc.getEndpoint(),\n ...options,\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(options.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 (files: GenericFile[]): Promise<string[]> => {\n const irys = await getIrys();\n const amount = await getUploadPrice(files);\n await fund(amount);\n\n const promises = files.map(async (file) => {\n const buffer = Buffer.from(file.buffer);\n const irysTx = irys.createTransaction(buffer, {\n tags: getGenericFileTagsWithContentType(file),\n });\n await irysTx.sign();\n\n const { status, data } = await irys.uploader.uploadTransaction(irysTx);\n\n if (status >= 300) {\n throw new AssetUploadFailedError(status);\n }\n\n return `https://arweave.net/${data.id}`;\n });\n\n return Promise.all(promises);\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.getLoadedBalance();\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.getLoadedBalance();\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 // TODO(loris): Replace with \"withdrawAll\" when available on Irys.\n const irys = await getIrys();\n const balance = await irys.getLoadedBalance();\n const minimumBalance = new BigNumber(5000);\n\n if (balance.isLessThan(minimumBalance)) {\n return;\n }\n\n const balanceToWithdraw = balance.minus(minimumBalance);\n await withdraw(bigNumberToAmount(balanceToWithdraw));\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<WebIrys | NodeIrys> => {\n const oldPayer = _irys?.getSigner().publicKey;\n const newPayer = options.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<WebIrys | NodeIrys> => {\n const currency = 'solana';\n const defaultAddress =\n context.rpc.getCluster() === 'devnet'\n ? 'https://devnet.irys.xyz'\n : 'https://node1.irys.xyz';\n const address = options?.address ?? defaultAddress;\n const irysOptions = {\n timeout: options.timeout,\n providerUrl: options.providerUrl,\n };\n\n const payer: Signer = options.payer ?? context.payer;\n\n // If in node use node irys, else use web irys.\n const isNode =\n // eslint-disable-next-line no-prototype-builtins\n typeof window === 'undefined' || window.process?.hasOwnProperty('type');\n\n let irys;\n if (isNode && isKeypairSigner(payer))\n irys = await initNodeIrys(address, currency, payer, irysOptions);\n else {\n irys = await initWebIrys(address, currency, payer, irysOptions);\n }\n\n try {\n // Check for valid irys node.\n await irys.utils.getBundlerAddress(currency);\n } catch (error) {\n throw new FailedToConnectToIrysAddressError(address, error as Error);\n }\n\n return irys;\n };\n\n const initNodeIrys = async (\n address: string,\n currency: string,\n keypair: Keypair,\n options: any\n ): Promise<NodeIrys> => {\n const bPackage = _removeDoubleDefault(await import('@irys/sdk'));\n // eslint-disable-next-line new-cap\n return new bPackage.default({\n url: address,\n token: currency,\n key: keypair.secretKey,\n config: options,\n });\n };\n\n const initWebIrys = async (\n address: string,\n currency: string,\n payer: Signer,\n options: any\n ): Promise<WebIrys> => {\n const wallet: IrysWalletAdapter = {\n publicKey: toWeb3JsPublicKey(payer.publicKey),\n signMessage: (message: Uint8Array) => payer.signMessage(message),\n signTransaction: async (web3JsTransaction: Web3JsTransaction) =>\n toWeb3JsLegacyTransaction(\n await payer.signTransaction(\n fromWeb3JsLegacyTransaction(web3JsTransaction)\n )\n ),\n signAllTransactions: async (web3JsTransactions: Web3JsTransaction[]) => {\n const transactions = web3JsTransactions.map(\n fromWeb3JsLegacyTransaction\n );\n const signedTransactions = await payer.signAllTransactions(\n transactions\n );\n return signedTransactions.map(toWeb3JsLegacyTransaction);\n },\n sendTransaction: async (\n web3JsTransaction: Web3JsTransaction,\n connection: Web3JsConnection,\n options: Web3JsSendOptions & { signers?: Web3JsSigner[] } = {}\n ): Promise<Web3JsTransactionSignature> => {\n const { signers: web3JsSigners = [], ...sendOptions } = options;\n const signers = web3JsSigners.map((web3JsSigner) =>\n createSignerFromKeypair(\n context,\n fromWeb3JsKeypair(\n Web3JsKeypair.fromSecretKey(web3JsSigner.secretKey)\n )\n )\n );\n\n let transaction = fromWeb3JsLegacyTransaction(web3JsTransaction);\n transaction = await signTransaction(transaction, [payer, ...signers]);\n\n const signature = await context.rpc.sendTransaction(transaction, {\n ...sendOptions,\n preflightCommitment: sendOptions.preflightCommitment as Commitment,\n });\n\n return base58.deserialize(signature)[0];\n },\n };\n\n const bPackage = _removeDoubleDefault(await import('@irys/sdk'));\n const irys = new bPackage.WebIrys({\n url: address,\n token: currency,\n wallet: { provider: wallet },\n config: options,\n });\n\n try {\n // Try to initiate irys.\n await irys.ready();\n } catch (error) {\n throw new FailedToInitializeIrysError(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":["_removeDoubleDefault","pkg","default","HEADER_SIZE","MINIMUM_SIZE","createIrysUploader","context","options","_irys","providerUrl","rpc","getEndpoint","getUploadPriceFromBytes","bytes","irys","getIrys","price","getPrice","bigNumberToAmount","multipliedBy","priceMultiplier","getUploadPrice","files","reduce","sum","file","Math","max","buffer","byteLength","upload","amount","fund","promises","map","Buffer","from","irysTx","createTransaction","tags","getGenericFileTagsWithContentType","sign","status","data","uploader","uploadTransaction","AssetUploadFailedError","id","Promise","all","uploadJson","json","createGenericFileFromJson","uris","getBalance","balance","getLoadedBalance","skipBalanceCheck","toFund","amountToBigNumber","isGreaterThan","minus","BigNumber","isLessThanOrEqualTo","withdrawAll","minimumBalance","isLessThan","balanceToWithdraw","withdraw","withdrawBalance","e","IrysWithdrawError","Error","message","toString","oldPayer","getSigner","publicKey","newPayer","payer","Uint8Array","initIrys","currency","defaultAddress","getCluster","address","irysOptions","timeout","isNode","window","process","hasOwnProperty","isKeypairSigner","initNodeIrys","initWebIrys","utils","getBundlerAddress","error","FailedToConnectToIrysAddressError","keypair","bPackage","url","token","key","secretKey","config","wallet","toWeb3JsPublicKey","signMessage","signTransaction","web3JsTransaction","toWeb3JsLegacyTransaction","fromWeb3JsLegacyTransaction","signAllTransactions","web3JsTransactions","transactions","signedTransactions","sendTransaction","connection","signers","web3JsSigners","sendOptions","web3JsSigner","createSignerFromKeypair","fromWeb3JsKeypair","Web3JsKeypair","fromSecretKey","transaction","signature","preflightCommitment","base58","deserialize","WebIrys","provider","ready","FailedToInitializeIrysError","isIrysUploader","bigNumber","lamports","decimalPlaces","basisPoints","contentType","name","value"],"mappings":"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"}
1
+ {"version":3,"file":"createIrysUploader.cjs","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 Commitment,\n Context,\n GenericFile,\n GenericFileTag,\n Keypair,\n Signer,\n SolAmount,\n UploaderInterface,\n UploaderUploadOptions,\n base58,\n createGenericFileFromJson,\n createSignerFromKeypair,\n isKeypairSigner,\n lamports,\n publicKey,\n signTransaction,\n} from '@metaplex-foundation/umi';\nimport {\n fromWeb3JsKeypair,\n fromWeb3JsLegacyTransaction,\n toWeb3JsLegacyTransaction,\n toWeb3JsPublicKey,\n} from '@metaplex-foundation/umi-web3js-adapters';\nimport {\n Connection as Web3JsConnection,\n Keypair as Web3JsKeypair,\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 FailedToInitializeIrysError,\n IrysAbortError,\n} from './errors';\n// PromisePool is a dependency the Irys client already requires, so using it here has no extra cost.\n\n/**\n * This method is necessary to import the Irys package on both ESM and CJS modules.\n * Without this, we get a different structure on each module:\n * - CJS: { default: [Getter], WebIrys: [Getter] }\n * - ESM: { default: { default: [Getter], WebIrys: [Getter] } }\n * This method fixes this by ensure there is not double default in the imported package.\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nfunction _removeDoubleDefault<T>(pkg: T): T {\n if (\n pkg &&\n typeof pkg === 'object' &&\n 'default' in pkg &&\n 'default' in (pkg as any).default\n ) {\n return (pkg as any).default;\n }\n\n return pkg;\n}\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 createIrysUploader(\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 // If in node use node irys, else use web irys.\n const isNode =\n // eslint-disable-next-line no-prototype-builtins\n typeof window === 'undefined' || window.process?.hasOwnProperty('type');\n\n let irys;\n if (isNode && isKeypairSigner(payer))\n irys = await initNodeIrys(address, payer, irysOptions);\n else {\n irys = await initWebIrys(address, payer, irysOptions);\n }\n\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 const initNodeIrys = async (\n address: string,\n keypair: Keypair,\n options: any\n ): Promise<BaseNodeIrys> => {\n const bPackage = _removeDoubleDefault(await import('@irys/upload'));\n const cPackage = _removeDoubleDefault(await import('@irys/upload-solana'));\n return bPackage\n .Uploader(cPackage.Solana)\n .bundlerUrl(address)\n .withWallet(keypair.secretKey)\n .withIrysConfig(options)\n .build();\n };\n\n const initWebIrys = async (\n address: string,\n payer: Signer,\n options: any\n ): Promise<BaseWebIrys> => {\n const wallet: IrysWalletAdapter = {\n publicKey: toWeb3JsPublicKey(payer.publicKey),\n signMessage: (message: Uint8Array) => payer.signMessage(message),\n signTransaction: async (web3JsTransaction: Web3JsTransaction) =>\n toWeb3JsLegacyTransaction(\n await payer.signTransaction(\n fromWeb3JsLegacyTransaction(web3JsTransaction)\n )\n ),\n signAllTransactions: async (web3JsTransactions: Web3JsTransaction[]) => {\n const transactions = web3JsTransactions.map(\n fromWeb3JsLegacyTransaction\n );\n const signedTransactions = await payer.signAllTransactions(\n transactions\n );\n return signedTransactions.map(toWeb3JsLegacyTransaction);\n },\n sendTransaction: async (\n web3JsTransaction: Web3JsTransaction,\n connection: Web3JsConnection,\n options: Web3JsSendOptions & { signers?: Web3JsSigner[] } = {}\n ): Promise<Web3JsTransactionSignature> => {\n const { signers: web3JsSigners = [], ...sendOptions } = options;\n const signers = web3JsSigners.map((web3JsSigner) =>\n createSignerFromKeypair(\n context,\n fromWeb3JsKeypair(\n Web3JsKeypair.fromSecretKey(web3JsSigner.secretKey)\n )\n )\n );\n\n let transaction = fromWeb3JsLegacyTransaction(web3JsTransaction);\n transaction = await signTransaction(transaction, [payer, ...signers]);\n\n const signature = await context.rpc.sendTransaction(transaction, {\n ...sendOptions,\n preflightCommitment: sendOptions.preflightCommitment as Commitment,\n });\n\n return base58.deserialize(signature)[0];\n },\n };\n\n const bPackage = _removeDoubleDefault(await import('@irys/web-upload'));\n const cPackage = _removeDoubleDefault(\n await import('@irys/web-upload-solana')\n );\n\n const irys = await bPackage\n .WebUploader(cPackage.WebSolana)\n .withProvider(wallet)\n .bundlerUrl(address)\n .withIrysConfig(options)\n .build();\n\n try {\n // Try to initiate irys.\n await irys.ready();\n } catch (error) {\n throw new FailedToInitializeIrysError(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":["_removeDoubleDefault","pkg","default","HEADER_SIZE","MINIMUM_SIZE","gatewayUrl","id","createIrysUploader","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","isNode","window","hasOwnProperty","isKeypairSigner","initNodeIrys","initWebIrys","utils","getBundlerAddress","error","FailedToConnectToIrysAddressError","keypair","bPackage","cPackage","Uploader","Solana","bundlerUrl","withWallet","secretKey","withIrysConfig","build","wallet","toWeb3JsPublicKey","signMessage","signTransaction","web3JsTransaction","toWeb3JsLegacyTransaction","fromWeb3JsLegacyTransaction","signAllTransactions","web3JsTransactions","transactions","signedTransactions","sendTransaction","connection","signers","web3JsSigners","sendOptions","web3JsSigner","createSignerFromKeypair","fromWeb3JsKeypair","Web3JsKeypair","fromSecretKey","transaction","signature","preflightCommitment","base58","deserialize","WebUploader","WebSolana","withProvider","ready","FailedToInitializeIrysError","isIrysUploader","bigNumber","lamports","decimalPlaces","basisPoints","contentType"],"mappings":"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"}
@@ -20,7 +20,7 @@ class FailedToInitializeIrysError extends IrysError {
20
20
  class FailedToConnectToIrysAddressError extends IrysError {
21
21
  name = 'FailedToConnectToIrysAddressError';
22
22
  constructor(address, cause) {
23
- const message = `Irys could not connect to the provided address [${address}]. ` + 'Please ensure the provided address is valid. Some valid addresses include: ' + '"https://node1.irys.xyz" for mainnet and "https://devnet.irys.xyz" for devnet';
23
+ const message = `Irys could not connect to the provided address [${address}]. ` + 'Please ensure the provided address is valid. Some valid addresses include: ' + '"https://uploader.irys.xyz" for mainnet and "https://devnet.irys.xyz" for devnet';
24
24
  super(message, cause);
25
25
  }
26
26
  }
@@ -38,10 +38,17 @@ class IrysWithdrawError extends IrysError {
38
38
  super(message);
39
39
  }
40
40
  }
41
+ class IrysAbortError extends IrysError {
42
+ name = 'IrysAbortError';
43
+ constructor() {
44
+ super('The upload was aborted');
45
+ }
46
+ }
41
47
 
42
48
  exports.AssetUploadFailedError = AssetUploadFailedError;
43
49
  exports.FailedToConnectToIrysAddressError = FailedToConnectToIrysAddressError;
44
50
  exports.FailedToInitializeIrysError = FailedToInitializeIrysError;
51
+ exports.IrysAbortError = IrysAbortError;
45
52
  exports.IrysError = IrysError;
46
53
  exports.IrysWithdrawError = IrysWithdrawError;
47
54
  //# sourceMappingURL=errors.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.cjs","sources":["../../src/errors.ts"],"sourcesContent":["import { UmiError } from '@metaplex-foundation/umi';\n\nexport class IrysError extends UmiError {\n readonly name: string = 'IrysError';\n\n constructor(message: string, cause?: Error) {\n super(message, 'plugin', 'Irys', cause);\n }\n}\n\nexport class FailedToInitializeIrysError extends IrysError {\n readonly name: string = 'FailedToInitializeIrysError';\n\n constructor(cause: Error) {\n const message =\n 'Irys could not be initialized. ' +\n 'Please check the underlying error below for more details.';\n super(message, cause);\n }\n}\n\nexport class FailedToConnectToIrysAddressError extends IrysError {\n readonly name: string = 'FailedToConnectToIrysAddressError';\n\n constructor(address: string, cause: Error) {\n const message =\n `Irys could not connect to the provided address [${address}]. ` +\n 'Please ensure the provided address is valid. Some valid addresses include: ' +\n '\"https://node1.irys.xyz\" for mainnet and \"https://devnet.irys.xyz\" for devnet';\n super(message, cause);\n }\n}\n\nexport class AssetUploadFailedError extends IrysError {\n readonly name: string = 'AssetUploadFailedError';\n\n constructor(status: number) {\n const message =\n `The asset could not be uploaded to the Irys network and ` +\n `returned the following status code [${status}].`;\n super(message);\n }\n}\n\nexport class IrysWithdrawError extends IrysError {\n readonly name: string = 'IrysWithdrawError';\n\n constructor(error: string) {\n const message =\n `The balance could not be withdrawn from the Irys network and ` +\n `returned the following error: ${error}.`;\n super(message);\n }\n}\n"],"names":["IrysError","UmiError","name","constructor","message","cause","FailedToInitializeIrysError","FailedToConnectToIrysAddressError","address","AssetUploadFailedError","status","IrysWithdrawError","error"],"mappings":";;;;;;AAEO,MAAMA,SAAS,SAASC,YAAQ,CAAC;AAC7BC,EAAAA,IAAI,GAAW,WAAW,CAAA;AAEnCC,EAAAA,WAAW,CAACC,OAAe,EAAEC,KAAa,EAAE;IAC1C,KAAK,CAACD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAEC,KAAK,CAAC,CAAA;AACzC,GAAA;AACF,CAAA;AAEO,MAAMC,2BAA2B,SAASN,SAAS,CAAC;AAChDE,EAAAA,IAAI,GAAW,6BAA6B,CAAA;EAErDC,WAAW,CAACE,KAAY,EAAE;AACxB,IAAA,MAAMD,OAAO,GACX,iCAAiC,GACjC,2DAA2D,CAAA;AAC7D,IAAA,KAAK,CAACA,OAAO,EAAEC,KAAK,CAAC,CAAA;AACvB,GAAA;AACF,CAAA;AAEO,MAAME,iCAAiC,SAASP,SAAS,CAAC;AACtDE,EAAAA,IAAI,GAAW,mCAAmC,CAAA;AAE3DC,EAAAA,WAAW,CAACK,OAAe,EAAEH,KAAY,EAAE;IACzC,MAAMD,OAAO,GACV,CAAkDI,gDAAAA,EAAAA,OAAQ,KAAI,GAC/D,6EAA6E,GAC7E,+EAA+E,CAAA;AACjF,IAAA,KAAK,CAACJ,OAAO,EAAEC,KAAK,CAAC,CAAA;AACvB,GAAA;AACF,CAAA;AAEO,MAAMI,sBAAsB,SAAST,SAAS,CAAC;AAC3CE,EAAAA,IAAI,GAAW,wBAAwB,CAAA;EAEhDC,WAAW,CAACO,MAAc,EAAE;AAC1B,IAAA,MAAMN,OAAO,GACV,CAAA,wDAAA,CAAyD,GACzD,CAAA,oCAAA,EAAsCM,MAAO,CAAG,EAAA,CAAA,CAAA;IACnD,KAAK,CAACN,OAAO,CAAC,CAAA;AAChB,GAAA;AACF,CAAA;AAEO,MAAMO,iBAAiB,SAASX,SAAS,CAAC;AACtCE,EAAAA,IAAI,GAAW,mBAAmB,CAAA;EAE3CC,WAAW,CAACS,KAAa,EAAE;AACzB,IAAA,MAAMR,OAAO,GACV,CAAA,6DAAA,CAA8D,GAC9D,CAAA,8BAAA,EAAgCQ,KAAM,CAAE,CAAA,CAAA,CAAA;IAC3C,KAAK,CAACR,OAAO,CAAC,CAAA;AAChB,GAAA;AACF;;;;;;;;"}
1
+ {"version":3,"file":"errors.cjs","sources":["../../src/errors.ts"],"sourcesContent":["import { UmiError } from '@metaplex-foundation/umi';\n\nexport class IrysError extends UmiError {\n readonly name: string = 'IrysError';\n\n constructor(message: string, cause?: Error) {\n super(message, 'plugin', 'Irys', cause);\n }\n}\n\nexport class FailedToInitializeIrysError extends IrysError {\n readonly name: string = 'FailedToInitializeIrysError';\n\n constructor(cause: Error) {\n const message =\n 'Irys could not be initialized. ' +\n 'Please check the underlying error below for more details.';\n super(message, cause);\n }\n}\n\nexport class FailedToConnectToIrysAddressError extends IrysError {\n readonly name: string = 'FailedToConnectToIrysAddressError';\n\n constructor(address: string, cause: Error) {\n const message =\n `Irys could not connect to the provided address [${address}]. ` +\n 'Please ensure the provided address is valid. Some valid addresses include: ' +\n '\"https://uploader.irys.xyz\" for mainnet and \"https://devnet.irys.xyz\" for devnet';\n super(message, cause);\n }\n}\n\nexport class AssetUploadFailedError extends IrysError {\n readonly name: string = 'AssetUploadFailedError';\n\n constructor(status: number) {\n const message =\n `The asset could not be uploaded to the Irys network and ` +\n `returned the following status code [${status}].`;\n super(message);\n }\n}\n\nexport class IrysWithdrawError extends IrysError {\n readonly name: string = 'IrysWithdrawError';\n\n constructor(error: string) {\n const message =\n `The balance could not be withdrawn from the Irys network and ` +\n `returned the following error: ${error}.`;\n super(message);\n }\n}\n\nexport class IrysAbortError extends IrysError {\n readonly name: string = 'IrysAbortError';\n\n constructor() {\n super('The upload was aborted');\n }\n}\n"],"names":["IrysError","UmiError","name","constructor","message","cause","FailedToInitializeIrysError","FailedToConnectToIrysAddressError","address","AssetUploadFailedError","status","IrysWithdrawError","error","IrysAbortError"],"mappings":";;;;;;AAEO,MAAMA,SAAS,SAASC,YAAQ,CAAC;AAC7BC,EAAAA,IAAI,GAAW,WAAW,CAAA;AAEnCC,EAAAA,WAAW,CAACC,OAAe,EAAEC,KAAa,EAAE;IAC1C,KAAK,CAACD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAEC,KAAK,CAAC,CAAA;AACzC,GAAA;AACF,CAAA;AAEO,MAAMC,2BAA2B,SAASN,SAAS,CAAC;AAChDE,EAAAA,IAAI,GAAW,6BAA6B,CAAA;EAErDC,WAAW,CAACE,KAAY,EAAE;AACxB,IAAA,MAAMD,OAAO,GACX,iCAAiC,GACjC,2DAA2D,CAAA;AAC7D,IAAA,KAAK,CAACA,OAAO,EAAEC,KAAK,CAAC,CAAA;AACvB,GAAA;AACF,CAAA;AAEO,MAAME,iCAAiC,SAASP,SAAS,CAAC;AACtDE,EAAAA,IAAI,GAAW,mCAAmC,CAAA;AAE3DC,EAAAA,WAAW,CAACK,OAAe,EAAEH,KAAY,EAAE;IACzC,MAAMD,OAAO,GACV,CAAkDI,gDAAAA,EAAAA,OAAQ,KAAI,GAC/D,6EAA6E,GAC7E,kFAAkF,CAAA;AACpF,IAAA,KAAK,CAACJ,OAAO,EAAEC,KAAK,CAAC,CAAA;AACvB,GAAA;AACF,CAAA;AAEO,MAAMI,sBAAsB,SAAST,SAAS,CAAC;AAC3CE,EAAAA,IAAI,GAAW,wBAAwB,CAAA;EAEhDC,WAAW,CAACO,MAAc,EAAE;AAC1B,IAAA,MAAMN,OAAO,GACV,CAAA,wDAAA,CAAyD,GACzD,CAAA,oCAAA,EAAsCM,MAAO,CAAG,EAAA,CAAA,CAAA;IACnD,KAAK,CAACN,OAAO,CAAC,CAAA;AAChB,GAAA;AACF,CAAA;AAEO,MAAMO,iBAAiB,SAASX,SAAS,CAAC;AACtCE,EAAAA,IAAI,GAAW,mBAAmB,CAAA;EAE3CC,WAAW,CAACS,KAAa,EAAE;AACzB,IAAA,MAAMR,OAAO,GACV,CAAA,6DAAA,CAA8D,GAC9D,CAAA,8BAAA,EAAgCQ,KAAM,CAAE,CAAA,CAAA,CAAA;IAC3C,KAAK,CAACR,OAAO,CAAC,CAAA;AAChB,GAAA;AACF,CAAA;AAEO,MAAMS,cAAc,SAASb,SAAS,CAAC;AACnCE,EAAAA,IAAI,GAAW,gBAAgB,CAAA;AAExCC,EAAAA,WAAW,GAAG;IACZ,KAAK,CAAC,wBAAwB,CAAC,CAAA;AACjC,GAAA;AACF;;;;;;;;;"}
@@ -13,6 +13,7 @@ exports.isIrysUploader = createIrysUploader.isIrysUploader;
13
13
  exports.AssetUploadFailedError = errors.AssetUploadFailedError;
14
14
  exports.FailedToConnectToIrysAddressError = errors.FailedToConnectToIrysAddressError;
15
15
  exports.FailedToInitializeIrysError = errors.FailedToInitializeIrysError;
16
+ exports.IrysAbortError = errors.IrysAbortError;
16
17
  exports.IrysError = errors.IrysError;
17
18
  exports.IrysWithdrawError = errors.IrysWithdrawError;
18
19
  exports.irysUploader = plugin.irysUploader;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;"}
@@ -3,9 +3,10 @@ import { toWeb3JsPublicKey, toWeb3JsLegacyTransaction, fromWeb3JsLegacyTransacti
3
3
  import { Keypair } from '@solana/web3.js';
4
4
  import BigNumber from 'bignumber.js';
5
5
  import { Buffer } from 'buffer';
6
- import { AssetUploadFailedError, IrysWithdrawError, FailedToConnectToIrysAddressError, FailedToInitializeIrysError } from './errors.mjs';
6
+ import { PromisePool } from '@supercharge/promise-pool';
7
+ import { IrysAbortError, AssetUploadFailedError, IrysWithdrawError, FailedToConnectToIrysAddressError, FailedToInitializeIrysError } from './errors.mjs';
7
8
 
8
- // eslint-disable-next-line import/no-named-default
9
+ // PromisePool is a dependency the Irys client already requires, so using it here has no extra cost.
9
10
 
10
11
  /**
11
12
  * This method is necessary to import the Irys package on both ESM and CJS modules.
@@ -26,27 +27,30 @@ const HEADER_SIZE = 2_000;
26
27
 
27
28
  // Minimum file size for cost calculation.
28
29
  const MINIMUM_SIZE = 80_000;
29
- function createIrysUploader(context, options = {}) {
30
+ const gatewayUrl = id => `https://gateway.irys.xyz/${id}`;
31
+ function createIrysUploader(context, uploaderOptions = {}) {
30
32
  // eslint-disable-next-line @typescript-eslint/naming-convention
31
33
  let _irys = null;
32
- options = {
34
+ uploaderOptions = {
33
35
  providerUrl: context.rpc.getEndpoint(),
34
- ...options
36
+ ...uploaderOptions
35
37
  };
36
38
  const getUploadPriceFromBytes = async bytes => {
37
39
  const irys = await getIrys();
38
40
  const price = await irys.getPrice(bytes);
39
- return bigNumberToAmount(price.multipliedBy(options.priceMultiplier ?? 1.1));
41
+ return bigNumberToAmount(price.multipliedBy(uploaderOptions.priceMultiplier ?? 1.1));
40
42
  };
41
43
  const getUploadPrice = async files => {
42
44
  const bytes = files.reduce((sum, file) => sum + HEADER_SIZE + Math.max(MINIMUM_SIZE, file.buffer.byteLength), 0);
43
45
  return getUploadPriceFromBytes(bytes);
44
46
  };
45
- const upload = async files => {
47
+ const upload = async (files, options) => {
46
48
  const irys = await getIrys();
47
49
  const amount = await getUploadPrice(files);
48
50
  await fund(amount);
49
- const promises = files.map(async file => {
51
+ const manifestMap = options?.manifest === true ? new Map() : undefined;
52
+ const result = await PromisePool.for(files).withConcurrency(uploaderOptions.uploadConcurrency ?? 10).onTaskFinished((_, pool) => options?.onProgress?.(pool.processedPercentage())).process(async file => {
53
+ if (options?.signal?.aborted) throw new IrysAbortError();
50
54
  const buffer = Buffer.from(file.buffer);
51
55
  const irysTx = irys.createTransaction(buffer, {
52
56
  tags: getGenericFileTagsWithContentType(file)
@@ -54,14 +58,35 @@ function createIrysUploader(context, options = {}) {
54
58
  await irysTx.sign();
55
59
  const {
56
60
  status,
57
- data
61
+ data: {
62
+ id
63
+ }
58
64
  } = await irys.uploader.uploadTransaction(irysTx);
59
- if (status >= 300) {
60
- throw new AssetUploadFailedError(status);
61
- }
62
- return `https://arweave.net/${data.id}`;
65
+ if (status >= 300) throw new AssetUploadFailedError(status);
66
+ manifestMap?.set(file.fileName, id);
67
+ return id;
63
68
  });
64
- return Promise.all(promises);
69
+ if (manifestMap) {
70
+ const manifest = await irys.uploader.generateFolder({
71
+ items: manifestMap
72
+ });
73
+ const {
74
+ id
75
+ } = await irys.upload(JSON.stringify(manifest), {
76
+ tags: [{
77
+ name: 'Type',
78
+ value: 'manifest'
79
+ }, {
80
+ name: 'Content-Type',
81
+ value: 'application/x.irys-manifest+json'
82
+ }
83
+ // ...(options?.manifestTags ?? []),
84
+ ]
85
+ });
86
+
87
+ return [gatewayUrl(id)];
88
+ }
89
+ return result.results.map(gatewayUrl);
65
90
  };
66
91
  const uploadJson = async json => {
67
92
  const file = createGenericFileFromJson(json);
@@ -70,14 +95,14 @@ function createIrysUploader(context, options = {}) {
70
95
  };
71
96
  const getBalance = async () => {
72
97
  const irys = await getIrys();
73
- const balance = await irys.getLoadedBalance();
98
+ const balance = await irys.getBalance();
74
99
  return bigNumberToAmount(balance);
75
100
  };
76
101
  const fund = async (amount, skipBalanceCheck = false) => {
77
102
  const irys = await getIrys();
78
103
  let toFund = amountToBigNumber(amount);
79
104
  if (!skipBalanceCheck) {
80
- const balance = await irys.getLoadedBalance();
105
+ const balance = await irys.getBalance();
81
106
  toFund = toFund.isGreaterThan(balance) ? toFund.minus(balance) : new BigNumber(0);
82
107
  }
83
108
  if (toFund.isLessThanOrEqualTo(0)) {
@@ -86,15 +111,13 @@ function createIrysUploader(context, options = {}) {
86
111
  await irys.fund(toFund);
87
112
  };
88
113
  const withdrawAll = async () => {
89
- // TODO(loris): Replace with "withdrawAll" when available on Irys.
90
114
  const irys = await getIrys();
91
- const balance = await irys.getLoadedBalance();
115
+ const balance = await irys.getBalance();
92
116
  const minimumBalance = new BigNumber(5000);
93
117
  if (balance.isLessThan(minimumBalance)) {
94
118
  return;
95
119
  }
96
- const balanceToWithdraw = balance.minus(minimumBalance);
97
- await withdraw(bigNumberToAmount(balanceToWithdraw));
120
+ await irys.withdrawAll();
98
121
  };
99
122
  const withdraw = async amount => {
100
123
  const irys = await getIrys();
@@ -106,7 +129,7 @@ function createIrysUploader(context, options = {}) {
106
129
  };
107
130
  const getIrys = async () => {
108
131
  const oldPayer = _irys?.getSigner().publicKey;
109
- const newPayer = options.payer ?? context.payer;
132
+ const newPayer = uploaderOptions.payer ?? context.payer;
110
133
  if (oldPayer && publicKey(new Uint8Array(oldPayer)) !== newPayer.publicKey) {
111
134
  _irys = null;
112
135
  }
@@ -116,42 +139,37 @@ function createIrysUploader(context, options = {}) {
116
139
  return _irys;
117
140
  };
118
141
  const initIrys = async () => {
119
- const currency = 'solana';
120
- const defaultAddress = context.rpc.getCluster() === 'devnet' ? 'https://devnet.irys.xyz' : 'https://node1.irys.xyz';
121
- const address = options?.address ?? defaultAddress;
142
+ const token = 'solana';
143
+ const defaultAddress = context.rpc.getCluster() === 'devnet' ? 'https://devnet.irys.xyz' : 'https://uploader.irys.xyz';
144
+ const address = uploaderOptions?.address ?? defaultAddress;
122
145
  const irysOptions = {
123
- timeout: options.timeout,
124
- providerUrl: options.providerUrl
146
+ timeout: uploaderOptions.timeout,
147
+ providerUrl: uploaderOptions.providerUrl
125
148
  };
126
- const payer = options.payer ?? context.payer;
149
+ const payer = uploaderOptions.payer ?? context.payer;
127
150
 
128
151
  // If in node use node irys, else use web irys.
129
152
  const isNode =
130
153
  // eslint-disable-next-line no-prototype-builtins
131
154
  typeof window === 'undefined' || window.process?.hasOwnProperty('type');
132
155
  let irys;
133
- if (isNode && isKeypairSigner(payer)) irys = await initNodeIrys(address, currency, payer, irysOptions);else {
134
- irys = await initWebIrys(address, currency, payer, irysOptions);
156
+ if (isNode && isKeypairSigner(payer)) irys = await initNodeIrys(address, payer, irysOptions);else {
157
+ irys = await initWebIrys(address, payer, irysOptions);
135
158
  }
136
159
  try {
137
160
  // Check for valid irys node.
138
- await irys.utils.getBundlerAddress(currency);
161
+ await irys.utils.getBundlerAddress(token);
139
162
  } catch (error) {
140
163
  throw new FailedToConnectToIrysAddressError(address, error);
141
164
  }
142
165
  return irys;
143
166
  };
144
- const initNodeIrys = async (address, currency, keypair, options) => {
145
- const bPackage = _removeDoubleDefault(await import('@irys/sdk'));
146
- // eslint-disable-next-line new-cap
147
- return new bPackage.default({
148
- url: address,
149
- token: currency,
150
- key: keypair.secretKey,
151
- config: options
152
- });
167
+ const initNodeIrys = async (address, keypair, options) => {
168
+ const bPackage = _removeDoubleDefault(await import('@irys/upload'));
169
+ const cPackage = _removeDoubleDefault(await import('@irys/upload-solana'));
170
+ return bPackage.Uploader(cPackage.Solana).bundlerUrl(address).withWallet(keypair.secretKey).withIrysConfig(options).build();
153
171
  };
154
- const initWebIrys = async (address, currency, payer, options) => {
172
+ const initWebIrys = async (address, payer, options) => {
155
173
  const wallet = {
156
174
  publicKey: toWeb3JsPublicKey(payer.publicKey),
157
175
  signMessage: message => payer.signMessage(message),
@@ -176,15 +194,9 @@ function createIrysUploader(context, options = {}) {
176
194
  return base58.deserialize(signature)[0];
177
195
  }
178
196
  };
179
- const bPackage = _removeDoubleDefault(await import('@irys/sdk'));
180
- const irys = new bPackage.WebIrys({
181
- url: address,
182
- token: currency,
183
- wallet: {
184
- provider: wallet
185
- },
186
- config: options
187
- });
197
+ const bPackage = _removeDoubleDefault(await import('@irys/web-upload'));
198
+ const cPackage = _removeDoubleDefault(await import('@irys/web-upload-solana'));
199
+ const irys = await bPackage.WebUploader(cPackage.WebSolana).withProvider(wallet).bundlerUrl(address).withIrysConfig(options).build();
188
200
  try {
189
201
  // Try to initiate irys.
190
202
  await irys.ready();
@@ -1 +1 @@
1
- {"version":3,"file":"createIrysUploader.mjs","sources":["../../src/createIrysUploader.ts"],"sourcesContent":["// eslint-disable-next-line import/no-named-default\nimport type { default as NodeIrys, WebIrys } from '@irys/sdk';\nimport {\n Commitment,\n Context,\n GenericFile,\n GenericFileTag,\n Keypair,\n Signer,\n SolAmount,\n UploaderInterface,\n base58,\n createGenericFileFromJson,\n createSignerFromKeypair,\n isKeypairSigner,\n lamports,\n publicKey,\n signTransaction,\n} from '@metaplex-foundation/umi';\nimport {\n fromWeb3JsKeypair,\n fromWeb3JsLegacyTransaction,\n toWeb3JsLegacyTransaction,\n toWeb3JsPublicKey,\n} from '@metaplex-foundation/umi-web3js-adapters';\nimport {\n Connection as Web3JsConnection,\n Keypair as Web3JsKeypair,\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 {\n AssetUploadFailedError,\n IrysWithdrawError,\n FailedToConnectToIrysAddressError,\n FailedToInitializeIrysError,\n} from './errors';\n\n/**\n * This method is necessary to import the Irys package on both ESM and CJS modules.\n * Without this, we get a different structure on each module:\n * - CJS: { default: [Getter], WebIrys: [Getter] }\n * - ESM: { default: { default: [Getter], WebIrys: [Getter] } }\n * This method fixes this by ensure there is not double default in the imported package.\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nfunction _removeDoubleDefault<T>(pkg: T): T {\n if (\n pkg &&\n typeof pkg === 'object' &&\n 'default' in pkg &&\n 'default' in (pkg as any).default\n ) {\n return (pkg as any).default;\n }\n\n return pkg;\n}\n\nexport type IrysUploader = UploaderInterface & {\n irys: () => Promise<NodeIrys | WebIrys>;\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};\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\nexport function createIrysUploader(\n context: Pick<Context, 'rpc' | 'payer' | 'eddsa'>,\n options: IrysUploaderOptions = {}\n): IrysUploader {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n let _irys: WebIrys | NodeIrys | null = null;\n options = {\n providerUrl: context.rpc.getEndpoint(),\n ...options,\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(options.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 (files: GenericFile[]): Promise<string[]> => {\n const irys = await getIrys();\n const amount = await getUploadPrice(files);\n await fund(amount);\n\n const promises = files.map(async (file) => {\n const buffer = Buffer.from(file.buffer);\n const irysTx = irys.createTransaction(buffer, {\n tags: getGenericFileTagsWithContentType(file),\n });\n await irysTx.sign();\n\n const { status, data } = await irys.uploader.uploadTransaction(irysTx);\n\n if (status >= 300) {\n throw new AssetUploadFailedError(status);\n }\n\n return `https://arweave.net/${data.id}`;\n });\n\n return Promise.all(promises);\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.getLoadedBalance();\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.getLoadedBalance();\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 // TODO(loris): Replace with \"withdrawAll\" when available on Irys.\n const irys = await getIrys();\n const balance = await irys.getLoadedBalance();\n const minimumBalance = new BigNumber(5000);\n\n if (balance.isLessThan(minimumBalance)) {\n return;\n }\n\n const balanceToWithdraw = balance.minus(minimumBalance);\n await withdraw(bigNumberToAmount(balanceToWithdraw));\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<WebIrys | NodeIrys> => {\n const oldPayer = _irys?.getSigner().publicKey;\n const newPayer = options.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<WebIrys | NodeIrys> => {\n const currency = 'solana';\n const defaultAddress =\n context.rpc.getCluster() === 'devnet'\n ? 'https://devnet.irys.xyz'\n : 'https://node1.irys.xyz';\n const address = options?.address ?? defaultAddress;\n const irysOptions = {\n timeout: options.timeout,\n providerUrl: options.providerUrl,\n };\n\n const payer: Signer = options.payer ?? context.payer;\n\n // If in node use node irys, else use web irys.\n const isNode =\n // eslint-disable-next-line no-prototype-builtins\n typeof window === 'undefined' || window.process?.hasOwnProperty('type');\n\n let irys;\n if (isNode && isKeypairSigner(payer))\n irys = await initNodeIrys(address, currency, payer, irysOptions);\n else {\n irys = await initWebIrys(address, currency, payer, irysOptions);\n }\n\n try {\n // Check for valid irys node.\n await irys.utils.getBundlerAddress(currency);\n } catch (error) {\n throw new FailedToConnectToIrysAddressError(address, error as Error);\n }\n\n return irys;\n };\n\n const initNodeIrys = async (\n address: string,\n currency: string,\n keypair: Keypair,\n options: any\n ): Promise<NodeIrys> => {\n const bPackage = _removeDoubleDefault(await import('@irys/sdk'));\n // eslint-disable-next-line new-cap\n return new bPackage.default({\n url: address,\n token: currency,\n key: keypair.secretKey,\n config: options,\n });\n };\n\n const initWebIrys = async (\n address: string,\n currency: string,\n payer: Signer,\n options: any\n ): Promise<WebIrys> => {\n const wallet: IrysWalletAdapter = {\n publicKey: toWeb3JsPublicKey(payer.publicKey),\n signMessage: (message: Uint8Array) => payer.signMessage(message),\n signTransaction: async (web3JsTransaction: Web3JsTransaction) =>\n toWeb3JsLegacyTransaction(\n await payer.signTransaction(\n fromWeb3JsLegacyTransaction(web3JsTransaction)\n )\n ),\n signAllTransactions: async (web3JsTransactions: Web3JsTransaction[]) => {\n const transactions = web3JsTransactions.map(\n fromWeb3JsLegacyTransaction\n );\n const signedTransactions = await payer.signAllTransactions(\n transactions\n );\n return signedTransactions.map(toWeb3JsLegacyTransaction);\n },\n sendTransaction: async (\n web3JsTransaction: Web3JsTransaction,\n connection: Web3JsConnection,\n options: Web3JsSendOptions & { signers?: Web3JsSigner[] } = {}\n ): Promise<Web3JsTransactionSignature> => {\n const { signers: web3JsSigners = [], ...sendOptions } = options;\n const signers = web3JsSigners.map((web3JsSigner) =>\n createSignerFromKeypair(\n context,\n fromWeb3JsKeypair(\n Web3JsKeypair.fromSecretKey(web3JsSigner.secretKey)\n )\n )\n );\n\n let transaction = fromWeb3JsLegacyTransaction(web3JsTransaction);\n transaction = await signTransaction(transaction, [payer, ...signers]);\n\n const signature = await context.rpc.sendTransaction(transaction, {\n ...sendOptions,\n preflightCommitment: sendOptions.preflightCommitment as Commitment,\n });\n\n return base58.deserialize(signature)[0];\n },\n };\n\n const bPackage = _removeDoubleDefault(await import('@irys/sdk'));\n const irys = new bPackage.WebIrys({\n url: address,\n token: currency,\n wallet: { provider: wallet },\n config: options,\n });\n\n try {\n // Try to initiate irys.\n await irys.ready();\n } catch (error) {\n throw new FailedToInitializeIrysError(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":["_removeDoubleDefault","pkg","default","HEADER_SIZE","MINIMUM_SIZE","createIrysUploader","context","options","_irys","providerUrl","rpc","getEndpoint","getUploadPriceFromBytes","bytes","irys","getIrys","price","getPrice","bigNumberToAmount","multipliedBy","priceMultiplier","getUploadPrice","files","reduce","sum","file","Math","max","buffer","byteLength","upload","amount","fund","promises","map","Buffer","from","irysTx","createTransaction","tags","getGenericFileTagsWithContentType","sign","status","data","uploader","uploadTransaction","AssetUploadFailedError","id","Promise","all","uploadJson","json","createGenericFileFromJson","uris","getBalance","balance","getLoadedBalance","skipBalanceCheck","toFund","amountToBigNumber","isGreaterThan","minus","BigNumber","isLessThanOrEqualTo","withdrawAll","minimumBalance","isLessThan","balanceToWithdraw","withdraw","withdrawBalance","e","IrysWithdrawError","Error","message","toString","oldPayer","getSigner","publicKey","newPayer","payer","Uint8Array","initIrys","currency","defaultAddress","getCluster","address","irysOptions","timeout","isNode","window","process","hasOwnProperty","isKeypairSigner","initNodeIrys","initWebIrys","utils","getBundlerAddress","error","FailedToConnectToIrysAddressError","keypair","bPackage","url","token","key","secretKey","config","wallet","toWeb3JsPublicKey","signMessage","signTransaction","web3JsTransaction","toWeb3JsLegacyTransaction","fromWeb3JsLegacyTransaction","signAllTransactions","web3JsTransactions","transactions","signedTransactions","sendTransaction","connection","signers","web3JsSigners","sendOptions","web3JsSigner","createSignerFromKeypair","fromWeb3JsKeypair","Web3JsKeypair","fromSecretKey","transaction","signature","preflightCommitment","base58","deserialize","WebIrys","provider","ready","FailedToInitializeIrysError","isIrysUploader","bigNumber","lamports","decimalPlaces","basisPoints","contentType","name","value"],"mappings":"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"}
1
+ {"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 Commitment,\n Context,\n GenericFile,\n GenericFileTag,\n Keypair,\n Signer,\n SolAmount,\n UploaderInterface,\n UploaderUploadOptions,\n base58,\n createGenericFileFromJson,\n createSignerFromKeypair,\n isKeypairSigner,\n lamports,\n publicKey,\n signTransaction,\n} from '@metaplex-foundation/umi';\nimport {\n fromWeb3JsKeypair,\n fromWeb3JsLegacyTransaction,\n toWeb3JsLegacyTransaction,\n toWeb3JsPublicKey,\n} from '@metaplex-foundation/umi-web3js-adapters';\nimport {\n Connection as Web3JsConnection,\n Keypair as Web3JsKeypair,\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 FailedToInitializeIrysError,\n IrysAbortError,\n} from './errors';\n// PromisePool is a dependency the Irys client already requires, so using it here has no extra cost.\n\n/**\n * This method is necessary to import the Irys package on both ESM and CJS modules.\n * Without this, we get a different structure on each module:\n * - CJS: { default: [Getter], WebIrys: [Getter] }\n * - ESM: { default: { default: [Getter], WebIrys: [Getter] } }\n * This method fixes this by ensure there is not double default in the imported package.\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nfunction _removeDoubleDefault<T>(pkg: T): T {\n if (\n pkg &&\n typeof pkg === 'object' &&\n 'default' in pkg &&\n 'default' in (pkg as any).default\n ) {\n return (pkg as any).default;\n }\n\n return pkg;\n}\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 createIrysUploader(\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 // If in node use node irys, else use web irys.\n const isNode =\n // eslint-disable-next-line no-prototype-builtins\n typeof window === 'undefined' || window.process?.hasOwnProperty('type');\n\n let irys;\n if (isNode && isKeypairSigner(payer))\n irys = await initNodeIrys(address, payer, irysOptions);\n else {\n irys = await initWebIrys(address, payer, irysOptions);\n }\n\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 const initNodeIrys = async (\n address: string,\n keypair: Keypair,\n options: any\n ): Promise<BaseNodeIrys> => {\n const bPackage = _removeDoubleDefault(await import('@irys/upload'));\n const cPackage = _removeDoubleDefault(await import('@irys/upload-solana'));\n return bPackage\n .Uploader(cPackage.Solana)\n .bundlerUrl(address)\n .withWallet(keypair.secretKey)\n .withIrysConfig(options)\n .build();\n };\n\n const initWebIrys = async (\n address: string,\n payer: Signer,\n options: any\n ): Promise<BaseWebIrys> => {\n const wallet: IrysWalletAdapter = {\n publicKey: toWeb3JsPublicKey(payer.publicKey),\n signMessage: (message: Uint8Array) => payer.signMessage(message),\n signTransaction: async (web3JsTransaction: Web3JsTransaction) =>\n toWeb3JsLegacyTransaction(\n await payer.signTransaction(\n fromWeb3JsLegacyTransaction(web3JsTransaction)\n )\n ),\n signAllTransactions: async (web3JsTransactions: Web3JsTransaction[]) => {\n const transactions = web3JsTransactions.map(\n fromWeb3JsLegacyTransaction\n );\n const signedTransactions = await payer.signAllTransactions(\n transactions\n );\n return signedTransactions.map(toWeb3JsLegacyTransaction);\n },\n sendTransaction: async (\n web3JsTransaction: Web3JsTransaction,\n connection: Web3JsConnection,\n options: Web3JsSendOptions & { signers?: Web3JsSigner[] } = {}\n ): Promise<Web3JsTransactionSignature> => {\n const { signers: web3JsSigners = [], ...sendOptions } = options;\n const signers = web3JsSigners.map((web3JsSigner) =>\n createSignerFromKeypair(\n context,\n fromWeb3JsKeypair(\n Web3JsKeypair.fromSecretKey(web3JsSigner.secretKey)\n )\n )\n );\n\n let transaction = fromWeb3JsLegacyTransaction(web3JsTransaction);\n transaction = await signTransaction(transaction, [payer, ...signers]);\n\n const signature = await context.rpc.sendTransaction(transaction, {\n ...sendOptions,\n preflightCommitment: sendOptions.preflightCommitment as Commitment,\n });\n\n return base58.deserialize(signature)[0];\n },\n };\n\n const bPackage = _removeDoubleDefault(await import('@irys/web-upload'));\n const cPackage = _removeDoubleDefault(\n await import('@irys/web-upload-solana')\n );\n\n const irys = await bPackage\n .WebUploader(cPackage.WebSolana)\n .withProvider(wallet)\n .bundlerUrl(address)\n .withIrysConfig(options)\n .build();\n\n try {\n // Try to initiate irys.\n await irys.ready();\n } catch (error) {\n throw new FailedToInitializeIrysError(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":["_removeDoubleDefault","pkg","default","HEADER_SIZE","MINIMUM_SIZE","gatewayUrl","id","createIrysUploader","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","isNode","window","hasOwnProperty","isKeypairSigner","initNodeIrys","initWebIrys","utils","getBundlerAddress","error","FailedToConnectToIrysAddressError","keypair","bPackage","cPackage","Uploader","Solana","bundlerUrl","withWallet","secretKey","withIrysConfig","build","wallet","toWeb3JsPublicKey","signMessage","signTransaction","web3JsTransaction","toWeb3JsLegacyTransaction","fromWeb3JsLegacyTransaction","signAllTransactions","web3JsTransactions","transactions","signedTransactions","sendTransaction","connection","signers","web3JsSigners","sendOptions","web3JsSigner","createSignerFromKeypair","fromWeb3JsKeypair","Web3JsKeypair","fromSecretKey","transaction","signature","preflightCommitment","base58","deserialize","WebUploader","WebSolana","withProvider","ready","FailedToInitializeIrysError","isIrysUploader","bigNumber","lamports","decimalPlaces","basisPoints","contentType"],"mappings":"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"}
@@ -16,7 +16,7 @@ class FailedToInitializeIrysError extends IrysError {
16
16
  class FailedToConnectToIrysAddressError extends IrysError {
17
17
  name = 'FailedToConnectToIrysAddressError';
18
18
  constructor(address, cause) {
19
- const message = `Irys could not connect to the provided address [${address}]. ` + 'Please ensure the provided address is valid. Some valid addresses include: ' + '"https://node1.irys.xyz" for mainnet and "https://devnet.irys.xyz" for devnet';
19
+ const message = `Irys could not connect to the provided address [${address}]. ` + 'Please ensure the provided address is valid. Some valid addresses include: ' + '"https://uploader.irys.xyz" for mainnet and "https://devnet.irys.xyz" for devnet';
20
20
  super(message, cause);
21
21
  }
22
22
  }
@@ -34,6 +34,12 @@ class IrysWithdrawError extends IrysError {
34
34
  super(message);
35
35
  }
36
36
  }
37
+ class IrysAbortError extends IrysError {
38
+ name = 'IrysAbortError';
39
+ constructor() {
40
+ super('The upload was aborted');
41
+ }
42
+ }
37
43
 
38
- export { AssetUploadFailedError, FailedToConnectToIrysAddressError, FailedToInitializeIrysError, IrysError, IrysWithdrawError };
44
+ export { AssetUploadFailedError, FailedToConnectToIrysAddressError, FailedToInitializeIrysError, IrysAbortError, IrysError, IrysWithdrawError };
39
45
  //# sourceMappingURL=errors.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.mjs","sources":["../../src/errors.ts"],"sourcesContent":["import { UmiError } from '@metaplex-foundation/umi';\n\nexport class IrysError extends UmiError {\n readonly name: string = 'IrysError';\n\n constructor(message: string, cause?: Error) {\n super(message, 'plugin', 'Irys', cause);\n }\n}\n\nexport class FailedToInitializeIrysError extends IrysError {\n readonly name: string = 'FailedToInitializeIrysError';\n\n constructor(cause: Error) {\n const message =\n 'Irys could not be initialized. ' +\n 'Please check the underlying error below for more details.';\n super(message, cause);\n }\n}\n\nexport class FailedToConnectToIrysAddressError extends IrysError {\n readonly name: string = 'FailedToConnectToIrysAddressError';\n\n constructor(address: string, cause: Error) {\n const message =\n `Irys could not connect to the provided address [${address}]. ` +\n 'Please ensure the provided address is valid. Some valid addresses include: ' +\n '\"https://node1.irys.xyz\" for mainnet and \"https://devnet.irys.xyz\" for devnet';\n super(message, cause);\n }\n}\n\nexport class AssetUploadFailedError extends IrysError {\n readonly name: string = 'AssetUploadFailedError';\n\n constructor(status: number) {\n const message =\n `The asset could not be uploaded to the Irys network and ` +\n `returned the following status code [${status}].`;\n super(message);\n }\n}\n\nexport class IrysWithdrawError extends IrysError {\n readonly name: string = 'IrysWithdrawError';\n\n constructor(error: string) {\n const message =\n `The balance could not be withdrawn from the Irys network and ` +\n `returned the following error: ${error}.`;\n super(message);\n }\n}\n"],"names":["IrysError","UmiError","name","constructor","message","cause","FailedToInitializeIrysError","FailedToConnectToIrysAddressError","address","AssetUploadFailedError","status","IrysWithdrawError","error"],"mappings":";;AAEO,MAAMA,SAAS,SAASC,QAAQ,CAAC;AAC7BC,EAAAA,IAAI,GAAW,WAAW,CAAA;AAEnCC,EAAAA,WAAW,CAACC,OAAe,EAAEC,KAAa,EAAE;IAC1C,KAAK,CAACD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAEC,KAAK,CAAC,CAAA;AACzC,GAAA;AACF,CAAA;AAEO,MAAMC,2BAA2B,SAASN,SAAS,CAAC;AAChDE,EAAAA,IAAI,GAAW,6BAA6B,CAAA;EAErDC,WAAW,CAACE,KAAY,EAAE;AACxB,IAAA,MAAMD,OAAO,GACX,iCAAiC,GACjC,2DAA2D,CAAA;AAC7D,IAAA,KAAK,CAACA,OAAO,EAAEC,KAAK,CAAC,CAAA;AACvB,GAAA;AACF,CAAA;AAEO,MAAME,iCAAiC,SAASP,SAAS,CAAC;AACtDE,EAAAA,IAAI,GAAW,mCAAmC,CAAA;AAE3DC,EAAAA,WAAW,CAACK,OAAe,EAAEH,KAAY,EAAE;IACzC,MAAMD,OAAO,GACV,CAAkDI,gDAAAA,EAAAA,OAAQ,KAAI,GAC/D,6EAA6E,GAC7E,+EAA+E,CAAA;AACjF,IAAA,KAAK,CAACJ,OAAO,EAAEC,KAAK,CAAC,CAAA;AACvB,GAAA;AACF,CAAA;AAEO,MAAMI,sBAAsB,SAAST,SAAS,CAAC;AAC3CE,EAAAA,IAAI,GAAW,wBAAwB,CAAA;EAEhDC,WAAW,CAACO,MAAc,EAAE;AAC1B,IAAA,MAAMN,OAAO,GACV,CAAA,wDAAA,CAAyD,GACzD,CAAA,oCAAA,EAAsCM,MAAO,CAAG,EAAA,CAAA,CAAA;IACnD,KAAK,CAACN,OAAO,CAAC,CAAA;AAChB,GAAA;AACF,CAAA;AAEO,MAAMO,iBAAiB,SAASX,SAAS,CAAC;AACtCE,EAAAA,IAAI,GAAW,mBAAmB,CAAA;EAE3CC,WAAW,CAACS,KAAa,EAAE;AACzB,IAAA,MAAMR,OAAO,GACV,CAAA,6DAAA,CAA8D,GAC9D,CAAA,8BAAA,EAAgCQ,KAAM,CAAE,CAAA,CAAA,CAAA;IAC3C,KAAK,CAACR,OAAO,CAAC,CAAA;AAChB,GAAA;AACF;;;;"}
1
+ {"version":3,"file":"errors.mjs","sources":["../../src/errors.ts"],"sourcesContent":["import { UmiError } from '@metaplex-foundation/umi';\n\nexport class IrysError extends UmiError {\n readonly name: string = 'IrysError';\n\n constructor(message: string, cause?: Error) {\n super(message, 'plugin', 'Irys', cause);\n }\n}\n\nexport class FailedToInitializeIrysError extends IrysError {\n readonly name: string = 'FailedToInitializeIrysError';\n\n constructor(cause: Error) {\n const message =\n 'Irys could not be initialized. ' +\n 'Please check the underlying error below for more details.';\n super(message, cause);\n }\n}\n\nexport class FailedToConnectToIrysAddressError extends IrysError {\n readonly name: string = 'FailedToConnectToIrysAddressError';\n\n constructor(address: string, cause: Error) {\n const message =\n `Irys could not connect to the provided address [${address}]. ` +\n 'Please ensure the provided address is valid. Some valid addresses include: ' +\n '\"https://uploader.irys.xyz\" for mainnet and \"https://devnet.irys.xyz\" for devnet';\n super(message, cause);\n }\n}\n\nexport class AssetUploadFailedError extends IrysError {\n readonly name: string = 'AssetUploadFailedError';\n\n constructor(status: number) {\n const message =\n `The asset could not be uploaded to the Irys network and ` +\n `returned the following status code [${status}].`;\n super(message);\n }\n}\n\nexport class IrysWithdrawError extends IrysError {\n readonly name: string = 'IrysWithdrawError';\n\n constructor(error: string) {\n const message =\n `The balance could not be withdrawn from the Irys network and ` +\n `returned the following error: ${error}.`;\n super(message);\n }\n}\n\nexport class IrysAbortError extends IrysError {\n readonly name: string = 'IrysAbortError';\n\n constructor() {\n super('The upload was aborted');\n }\n}\n"],"names":["IrysError","UmiError","name","constructor","message","cause","FailedToInitializeIrysError","FailedToConnectToIrysAddressError","address","AssetUploadFailedError","status","IrysWithdrawError","error","IrysAbortError"],"mappings":";;AAEO,MAAMA,SAAS,SAASC,QAAQ,CAAC;AAC7BC,EAAAA,IAAI,GAAW,WAAW,CAAA;AAEnCC,EAAAA,WAAW,CAACC,OAAe,EAAEC,KAAa,EAAE;IAC1C,KAAK,CAACD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAEC,KAAK,CAAC,CAAA;AACzC,GAAA;AACF,CAAA;AAEO,MAAMC,2BAA2B,SAASN,SAAS,CAAC;AAChDE,EAAAA,IAAI,GAAW,6BAA6B,CAAA;EAErDC,WAAW,CAACE,KAAY,EAAE;AACxB,IAAA,MAAMD,OAAO,GACX,iCAAiC,GACjC,2DAA2D,CAAA;AAC7D,IAAA,KAAK,CAACA,OAAO,EAAEC,KAAK,CAAC,CAAA;AACvB,GAAA;AACF,CAAA;AAEO,MAAME,iCAAiC,SAASP,SAAS,CAAC;AACtDE,EAAAA,IAAI,GAAW,mCAAmC,CAAA;AAE3DC,EAAAA,WAAW,CAACK,OAAe,EAAEH,KAAY,EAAE;IACzC,MAAMD,OAAO,GACV,CAAkDI,gDAAAA,EAAAA,OAAQ,KAAI,GAC/D,6EAA6E,GAC7E,kFAAkF,CAAA;AACpF,IAAA,KAAK,CAACJ,OAAO,EAAEC,KAAK,CAAC,CAAA;AACvB,GAAA;AACF,CAAA;AAEO,MAAMI,sBAAsB,SAAST,SAAS,CAAC;AAC3CE,EAAAA,IAAI,GAAW,wBAAwB,CAAA;EAEhDC,WAAW,CAACO,MAAc,EAAE;AAC1B,IAAA,MAAMN,OAAO,GACV,CAAA,wDAAA,CAAyD,GACzD,CAAA,oCAAA,EAAsCM,MAAO,CAAG,EAAA,CAAA,CAAA;IACnD,KAAK,CAACN,OAAO,CAAC,CAAA;AAChB,GAAA;AACF,CAAA;AAEO,MAAMO,iBAAiB,SAASX,SAAS,CAAC;AACtCE,EAAAA,IAAI,GAAW,mBAAmB,CAAA;EAE3CC,WAAW,CAACS,KAAa,EAAE;AACzB,IAAA,MAAMR,OAAO,GACV,CAAA,6DAAA,CAA8D,GAC9D,CAAA,8BAAA,EAAgCQ,KAAM,CAAE,CAAA,CAAA,CAAA;IAC3C,KAAK,CAACR,OAAO,CAAC,CAAA;AAChB,GAAA;AACF,CAAA;AAEO,MAAMS,cAAc,SAASb,SAAS,CAAC;AACnCE,EAAAA,IAAI,GAAW,gBAAgB,CAAA;AAExCC,EAAAA,WAAW,GAAG;IACZ,KAAK,CAAC,wBAAwB,CAAC,CAAA;AACjC,GAAA;AACF;;;;"}
@@ -1,4 +1,4 @@
1
1
  export { createIrysUploader, isIrysUploader } from './createIrysUploader.mjs';
2
- export { AssetUploadFailedError, FailedToConnectToIrysAddressError, FailedToInitializeIrysError, IrysError, IrysWithdrawError } from './errors.mjs';
2
+ export { AssetUploadFailedError, FailedToConnectToIrysAddressError, FailedToInitializeIrysError, IrysAbortError, IrysError, IrysWithdrawError } from './errors.mjs';
3
3
  export { irysUploader } from './plugin.mjs';
4
4
  //# sourceMappingURL=index.mjs.map
@@ -1,8 +1,9 @@
1
- import type { default as NodeIrys, WebIrys } from '@irys/sdk';
1
+ import type { BaseWebIrys } from '@irys/web-upload/dist/types/base';
2
+ import type { BaseNodeIrys } from '@irys/upload/dist/types/base';
2
3
  import { Context, Signer, SolAmount, UploaderInterface } from '@metaplex-foundation/umi';
3
4
  import { Connection as Web3JsConnection, PublicKey as Web3JsPublicKey, SendOptions as Web3JsSendOptions, Signer as Web3JsSigner, Transaction as Web3JsTransaction, TransactionSignature as Web3JsTransactionSignature } from '@solana/web3.js';
4
5
  export type IrysUploader = UploaderInterface & {
5
- irys: () => Promise<NodeIrys | WebIrys>;
6
+ irys: () => Promise<BaseNodeIrys | BaseWebIrys>;
6
7
  getUploadPriceFromBytes: (bytes: number) => Promise<SolAmount>;
7
8
  getBalance: () => Promise<SolAmount>;
8
9
  fund: (amount: SolAmount, skipBalanceCheck: boolean) => Promise<void>;
@@ -15,6 +16,7 @@ export type IrysUploaderOptions = {
15
16
  providerUrl?: string;
16
17
  priceMultiplier?: number;
17
18
  payer?: Signer;
19
+ uploadConcurrency?: number;
18
20
  };
19
21
  export type IrysWalletAdapter = {
20
22
  publicKey: Web3JsPublicKey | null;
@@ -25,5 +27,5 @@ export type IrysWalletAdapter = {
25
27
  signers?: Web3JsSigner[];
26
28
  }) => Promise<Web3JsTransactionSignature>;
27
29
  };
28
- export declare function createIrysUploader(context: Pick<Context, 'rpc' | 'payer' | 'eddsa'>, options?: IrysUploaderOptions): IrysUploader;
30
+ export declare function createIrysUploader(context: Pick<Context, 'rpc' | 'payer' | 'eddsa'>, uploaderOptions?: IrysUploaderOptions): IrysUploader;
29
31
  export declare const isIrysUploader: (uploader: UploaderInterface) => uploader is IrysUploader;
@@ -19,3 +19,7 @@ export declare class IrysWithdrawError extends IrysError {
19
19
  readonly name: string;
20
20
  constructor(error: string);
21
21
  }
22
+ export declare class IrysAbortError extends IrysError {
23
+ readonly name: string;
24
+ constructor();
25
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metaplex-foundation/umi-uploader-irys",
3
- "version": "0.10.0-beta.0",
3
+ "version": "1.0.1",
4
4
  "description": "An uploader implementation relying on Irys",
5
5
  "license": "MIT",
6
6
  "sideEffects": false,
@@ -21,24 +21,28 @@
21
21
  "/src"
22
22
  ],
23
23
  "dependencies": {
24
- "@irys/sdk": "^0.2.10",
24
+ "@irys/upload": "^0.0.14",
25
+ "@irys/upload-solana": "^0.1.7",
26
+ "@irys/web-upload": "^0.0.14",
27
+ "@irys/web-upload-solana": "^0.1.7",
28
+ "@supercharge/promise-pool": "^3.2.0",
25
29
  "bignumber.js": "^9.1.2",
26
30
  "buffer": "^6.0.3",
27
- "@metaplex-foundation/umi-web3js-adapters": "^0.9.2"
31
+ "@metaplex-foundation/umi-web3js-adapters": "^1.0.0"
28
32
  },
29
33
  "peerDependencies": {
30
34
  "@solana/web3.js": "^1.72.0",
31
- "@metaplex-foundation/umi": "^0.9.2"
35
+ "@metaplex-foundation/umi": "^1.0.0"
32
36
  },
33
37
  "devDependencies": {
34
38
  "@ava/typescript": "^3.0.1",
35
39
  "@solana/web3.js": "^1.72.0",
36
40
  "ava": "^5.1.0",
37
- "@metaplex-foundation/umi": "^0.9.2",
38
- "@metaplex-foundation/umi-downloader-http": "^0.9.2",
39
- "@metaplex-foundation/umi-eddsa-web3js": "^0.9.2",
40
- "@metaplex-foundation/umi-http-fetch": "^0.9.2",
41
- "@metaplex-foundation/umi-rpc-web3js": "^0.9.2"
41
+ "@metaplex-foundation/umi-eddsa-web3js": "^1.0.0",
42
+ "@metaplex-foundation/umi-http-fetch": "^1.0.0",
43
+ "@metaplex-foundation/umi": "^1.0.0",
44
+ "@metaplex-foundation/umi-downloader-http": "^1.0.0",
45
+ "@metaplex-foundation/umi-rpc-web3js": "^1.0.0"
42
46
  },
43
47
  "publishConfig": {
44
48
  "access": "public"
@@ -1,5 +1,5 @@
1
- // eslint-disable-next-line import/no-named-default
2
- import type { default as NodeIrys, WebIrys } from '@irys/sdk';
1
+ import type { BaseWebIrys } from '@irys/web-upload/dist/types/base';
2
+ import type { BaseNodeIrys } from '@irys/upload/dist/types/base';
3
3
  import {
4
4
  Commitment,
5
5
  Context,
@@ -9,6 +9,7 @@ import {
9
9
  Signer,
10
10
  SolAmount,
11
11
  UploaderInterface,
12
+ UploaderUploadOptions,
12
13
  base58,
13
14
  createGenericFileFromJson,
14
15
  createSignerFromKeypair,
@@ -34,12 +35,15 @@ import {
34
35
  } from '@solana/web3.js';
35
36
  import BigNumber from 'bignumber.js';
36
37
  import { Buffer } from 'buffer';
38
+ import { PromisePool } from '@supercharge/promise-pool';
37
39
  import {
38
40
  AssetUploadFailedError,
39
41
  IrysWithdrawError,
40
42
  FailedToConnectToIrysAddressError,
41
43
  FailedToInitializeIrysError,
44
+ IrysAbortError,
42
45
  } from './errors';
46
+ // PromisePool is a dependency the Irys client already requires, so using it here has no extra cost.
43
47
 
44
48
  /**
45
49
  * This method is necessary to import the Irys package on both ESM and CJS modules.
@@ -63,7 +67,7 @@ function _removeDoubleDefault<T>(pkg: T): T {
63
67
  }
64
68
 
65
69
  export type IrysUploader = UploaderInterface & {
66
- irys: () => Promise<NodeIrys | WebIrys>;
70
+ irys: () => Promise<BaseNodeIrys | BaseWebIrys>;
67
71
  getUploadPriceFromBytes: (bytes: number) => Promise<SolAmount>;
68
72
  getBalance: () => Promise<SolAmount>;
69
73
  fund: (amount: SolAmount, skipBalanceCheck: boolean) => Promise<void>;
@@ -77,6 +81,7 @@ export type IrysUploaderOptions = {
77
81
  providerUrl?: string;
78
82
  priceMultiplier?: number;
79
83
  payer?: Signer;
84
+ uploadConcurrency?: number;
80
85
  };
81
86
 
82
87
  export type IrysWalletAdapter = {
@@ -101,15 +106,17 @@ const HEADER_SIZE = 2_000;
101
106
  // Minimum file size for cost calculation.
102
107
  const MINIMUM_SIZE = 80_000;
103
108
 
109
+ const gatewayUrl = (id: string) => `https://gateway.irys.xyz/${id}`;
110
+
104
111
  export function createIrysUploader(
105
112
  context: Pick<Context, 'rpc' | 'payer' | 'eddsa'>,
106
- options: IrysUploaderOptions = {}
113
+ uploaderOptions: IrysUploaderOptions = {}
107
114
  ): IrysUploader {
108
115
  // eslint-disable-next-line @typescript-eslint/naming-convention
109
- let _irys: WebIrys | NodeIrys | null = null;
110
- options = {
116
+ let _irys: BaseNodeIrys | BaseWebIrys | null = null;
117
+ uploaderOptions = {
111
118
  providerUrl: context.rpc.getEndpoint(),
112
- ...options,
119
+ ...uploaderOptions,
113
120
  };
114
121
 
115
122
  const getUploadPriceFromBytes = async (bytes: number): Promise<SolAmount> => {
@@ -117,7 +124,7 @@ export function createIrysUploader(
117
124
  const price = await irys.getPrice(bytes);
118
125
 
119
126
  return bigNumberToAmount(
120
- price.multipliedBy(options.priceMultiplier ?? 1.1)
127
+ price.multipliedBy(uploaderOptions.priceMultiplier ?? 1.1)
121
128
  );
122
129
  };
123
130
 
@@ -131,28 +138,56 @@ export function createIrysUploader(
131
138
  return getUploadPriceFromBytes(bytes);
132
139
  };
133
140
 
134
- const upload = async (files: GenericFile[]): Promise<string[]> => {
141
+ const upload = async (
142
+ files: GenericFile[],
143
+ options?: UploaderUploadOptions
144
+ ): Promise<string[]> => {
135
145
  const irys = await getIrys();
136
146
  const amount = await getUploadPrice(files);
137
147
  await fund(amount);
138
148
 
139
- const promises = files.map(async (file) => {
140
- const buffer = Buffer.from(file.buffer);
141
- const irysTx = irys.createTransaction(buffer, {
142
- tags: getGenericFileTagsWithContentType(file),
143
- });
144
- await irysTx.sign();
149
+ const manifestMap = options?.manifest === true ? new Map() : undefined;
150
+
151
+ const result = await PromisePool.for(files)
152
+ .withConcurrency(uploaderOptions.uploadConcurrency ?? 10)
153
+ .onTaskFinished((_, pool) =>
154
+ options?.onProgress?.(pool.processedPercentage())
155
+ )
156
+ .process(async (file) => {
157
+ if (options?.signal?.aborted) throw new IrysAbortError();
158
+
159
+ const buffer = Buffer.from(file.buffer);
160
+ const irysTx = irys.createTransaction(buffer, {
161
+ tags: getGenericFileTagsWithContentType(file),
162
+ });
163
+ await irysTx.sign();
164
+ const {
165
+ status,
166
+ data: { id },
167
+ } = await irys.uploader.uploadTransaction(irysTx);
168
+
169
+ if (status >= 300) throw new AssetUploadFailedError(status);
145
170
 
146
- const { status, data } = await irys.uploader.uploadTransaction(irysTx);
171
+ manifestMap?.set(file.fileName, id);
147
172
 
148
- if (status >= 300) {
149
- throw new AssetUploadFailedError(status);
150
- }
173
+ return id;
174
+ });
151
175
 
152
- return `https://arweave.net/${data.id}`;
153
- });
176
+ if (manifestMap) {
177
+ const manifest = await irys.uploader.generateFolder({
178
+ items: manifestMap,
179
+ });
180
+ const { id } = await irys.upload(JSON.stringify(manifest), {
181
+ tags: [
182
+ { name: 'Type', value: 'manifest' },
183
+ { name: 'Content-Type', value: 'application/x.irys-manifest+json' },
184
+ // ...(options?.manifestTags ?? []),
185
+ ],
186
+ });
187
+ return [gatewayUrl(id)];
188
+ }
154
189
 
155
- return Promise.all(promises);
190
+ return result.results.map(gatewayUrl);
156
191
  };
157
192
 
158
193
  const uploadJson = async <T>(json: T): Promise<string> => {
@@ -163,7 +198,7 @@ export function createIrysUploader(
163
198
 
164
199
  const getBalance = async (): Promise<SolAmount> => {
165
200
  const irys = await getIrys();
166
- const balance = await irys.getLoadedBalance();
201
+ const balance = await irys.getBalance();
167
202
 
168
203
  return bigNumberToAmount(balance);
169
204
  };
@@ -176,7 +211,7 @@ export function createIrysUploader(
176
211
  let toFund = amountToBigNumber(amount);
177
212
 
178
213
  if (!skipBalanceCheck) {
179
- const balance = await irys.getLoadedBalance();
214
+ const balance = await irys.getBalance();
180
215
 
181
216
  toFund = toFund.isGreaterThan(balance)
182
217
  ? toFund.minus(balance)
@@ -191,17 +226,15 @@ export function createIrysUploader(
191
226
  };
192
227
 
193
228
  const withdrawAll = async (): Promise<void> => {
194
- // TODO(loris): Replace with "withdrawAll" when available on Irys.
195
229
  const irys = await getIrys();
196
- const balance = await irys.getLoadedBalance();
230
+ const balance = await irys.getBalance();
197
231
  const minimumBalance = new BigNumber(5000);
198
232
 
199
233
  if (balance.isLessThan(minimumBalance)) {
200
234
  return;
201
235
  }
202
236
 
203
- const balanceToWithdraw = balance.minus(minimumBalance);
204
- await withdraw(bigNumberToAmount(balanceToWithdraw));
237
+ await irys.withdrawAll();
205
238
  };
206
239
 
207
240
  const withdraw = async (amount: SolAmount): Promise<void> => {
@@ -215,9 +248,9 @@ export function createIrysUploader(
215
248
  }
216
249
  };
217
250
 
218
- const getIrys = async (): Promise<WebIrys | NodeIrys> => {
251
+ const getIrys = async (): Promise<BaseWebIrys | BaseNodeIrys> => {
219
252
  const oldPayer = _irys?.getSigner().publicKey;
220
- const newPayer = options.payer ?? context.payer;
253
+ const newPayer = uploaderOptions.payer ?? context.payer;
221
254
  if (
222
255
  oldPayer &&
223
256
  publicKey(new Uint8Array(oldPayer)) !== newPayer.publicKey
@@ -232,19 +265,19 @@ export function createIrysUploader(
232
265
  return _irys;
233
266
  };
234
267
 
235
- const initIrys = async (): Promise<WebIrys | NodeIrys> => {
236
- const currency = 'solana';
268
+ const initIrys = async (): Promise<BaseWebIrys | BaseNodeIrys> => {
269
+ const token = 'solana';
237
270
  const defaultAddress =
238
271
  context.rpc.getCluster() === 'devnet'
239
272
  ? 'https://devnet.irys.xyz'
240
- : 'https://node1.irys.xyz';
241
- const address = options?.address ?? defaultAddress;
273
+ : 'https://uploader.irys.xyz';
274
+ const address = uploaderOptions?.address ?? defaultAddress;
242
275
  const irysOptions = {
243
- timeout: options.timeout,
244
- providerUrl: options.providerUrl,
276
+ timeout: uploaderOptions.timeout,
277
+ providerUrl: uploaderOptions.providerUrl,
245
278
  };
246
279
 
247
- const payer: Signer = options.payer ?? context.payer;
280
+ const payer: Signer = uploaderOptions.payer ?? context.payer;
248
281
 
249
282
  // If in node use node irys, else use web irys.
250
283
  const isNode =
@@ -253,14 +286,14 @@ export function createIrysUploader(
253
286
 
254
287
  let irys;
255
288
  if (isNode && isKeypairSigner(payer))
256
- irys = await initNodeIrys(address, currency, payer, irysOptions);
289
+ irys = await initNodeIrys(address, payer, irysOptions);
257
290
  else {
258
- irys = await initWebIrys(address, currency, payer, irysOptions);
291
+ irys = await initWebIrys(address, payer, irysOptions);
259
292
  }
260
293
 
261
294
  try {
262
295
  // Check for valid irys node.
263
- await irys.utils.getBundlerAddress(currency);
296
+ await irys.utils.getBundlerAddress(token);
264
297
  } catch (error) {
265
298
  throw new FailedToConnectToIrysAddressError(address, error as Error);
266
299
  }
@@ -270,26 +303,24 @@ export function createIrysUploader(
270
303
 
271
304
  const initNodeIrys = async (
272
305
  address: string,
273
- currency: string,
274
306
  keypair: Keypair,
275
307
  options: any
276
- ): Promise<NodeIrys> => {
277
- const bPackage = _removeDoubleDefault(await import('@irys/sdk'));
278
- // eslint-disable-next-line new-cap
279
- return new bPackage.default({
280
- url: address,
281
- token: currency,
282
- key: keypair.secretKey,
283
- config: options,
284
- });
308
+ ): Promise<BaseNodeIrys> => {
309
+ const bPackage = _removeDoubleDefault(await import('@irys/upload'));
310
+ const cPackage = _removeDoubleDefault(await import('@irys/upload-solana'));
311
+ return bPackage
312
+ .Uploader(cPackage.Solana)
313
+ .bundlerUrl(address)
314
+ .withWallet(keypair.secretKey)
315
+ .withIrysConfig(options)
316
+ .build();
285
317
  };
286
318
 
287
319
  const initWebIrys = async (
288
320
  address: string,
289
- currency: string,
290
321
  payer: Signer,
291
322
  options: any
292
- ): Promise<WebIrys> => {
323
+ ): Promise<BaseWebIrys> => {
293
324
  const wallet: IrysWalletAdapter = {
294
325
  publicKey: toWeb3JsPublicKey(payer.publicKey),
295
326
  signMessage: (message: Uint8Array) => payer.signMessage(message),
@@ -335,13 +366,17 @@ export function createIrysUploader(
335
366
  },
336
367
  };
337
368
 
338
- const bPackage = _removeDoubleDefault(await import('@irys/sdk'));
339
- const irys = new bPackage.WebIrys({
340
- url: address,
341
- token: currency,
342
- wallet: { provider: wallet },
343
- config: options,
344
- });
369
+ const bPackage = _removeDoubleDefault(await import('@irys/web-upload'));
370
+ const cPackage = _removeDoubleDefault(
371
+ await import('@irys/web-upload-solana')
372
+ );
373
+
374
+ const irys = await bPackage
375
+ .WebUploader(cPackage.WebSolana)
376
+ .withProvider(wallet)
377
+ .bundlerUrl(address)
378
+ .withIrysConfig(options)
379
+ .build();
345
380
 
346
381
  try {
347
382
  // Try to initiate irys.
package/src/errors.ts CHANGED
@@ -26,7 +26,7 @@ export class FailedToConnectToIrysAddressError extends IrysError {
26
26
  const message =
27
27
  `Irys could not connect to the provided address [${address}]. ` +
28
28
  'Please ensure the provided address is valid. Some valid addresses include: ' +
29
- '"https://node1.irys.xyz" for mainnet and "https://devnet.irys.xyz" for devnet';
29
+ '"https://uploader.irys.xyz" for mainnet and "https://devnet.irys.xyz" for devnet';
30
30
  super(message, cause);
31
31
  }
32
32
  }
@@ -52,3 +52,11 @@ export class IrysWithdrawError extends IrysError {
52
52
  super(message);
53
53
  }
54
54
  }
55
+
56
+ export class IrysAbortError extends IrysError {
57
+ readonly name: string = 'IrysAbortError';
58
+
59
+ constructor() {
60
+ super('The upload was aborted');
61
+ }
62
+ }