@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.
- package/dist/cjs/createIrysUploader.cjs +60 -48
- package/dist/cjs/createIrysUploader.cjs.map +1 -1
- package/dist/cjs/errors.cjs +8 -1
- package/dist/cjs/errors.cjs.map +1 -1
- package/dist/cjs/index.cjs +1 -0
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/esm/createIrysUploader.mjs +61 -49
- package/dist/esm/createIrysUploader.mjs.map +1 -1
- package/dist/esm/errors.mjs +8 -2
- package/dist/esm/errors.mjs.map +1 -1
- package/dist/esm/index.mjs +1 -1
- package/dist/types/createIrysUploader.d.ts +5 -3
- package/dist/types/errors.d.ts +4 -0
- package/package.json +13 -9
- package/src/createIrysUploader.ts +94 -59
- package/src/errors.ts +9 -1
|
@@ -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
|
-
//
|
|
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
|
-
|
|
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
|
-
|
|
60
|
+
uploaderOptions = {
|
|
59
61
|
providerUrl: context.rpc.getEndpoint(),
|
|
60
|
-
...
|
|
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(
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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 =
|
|
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
|
|
146
|
-
const defaultAddress = context.rpc.getCluster() === 'devnet' ? 'https://devnet.irys.xyz' : 'https://
|
|
147
|
-
const address =
|
|
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:
|
|
150
|
-
providerUrl:
|
|
172
|
+
timeout: uploaderOptions.timeout,
|
|
173
|
+
providerUrl: uploaderOptions.providerUrl
|
|
151
174
|
};
|
|
152
|
-
const 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,
|
|
160
|
-
irys = await initWebIrys(address,
|
|
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(
|
|
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,
|
|
171
|
-
const bPackage = _removeDoubleDefault(await Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require('@irys/
|
|
172
|
-
|
|
173
|
-
return
|
|
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,
|
|
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/
|
|
206
|
-
const
|
|
207
|
-
|
|
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6CA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASA,oBAAoB,CAAIC,GAAM,EAAK;AAC1C,EAAA,IACEA,GAAG,IACH,OAAOA,GAAG,KAAK,QAAQ,IACvB,SAAS,IAAIA,GAAG,IAChB,SAAS,IAAKA,GAAG,CAASC,OAAO,EACjC;IACA,OAAQD,GAAG,CAASC,OAAO,CAAA;AAC7B,GAAA;AAEA,EAAA,OAAOD,GAAG,CAAA;AACZ,CAAA;AAoCA;AACA,MAAME,WAAW,GAAG,KAAK,CAAA;;AAEzB;AACA,MAAMC,YAAY,GAAG,MAAM,CAAA;AAE3B,MAAMC,UAAU,GAAIC,EAAU,IAAM,CAAA,yBAAA,EAA2BA,EAAG,CAAC,CAAA,CAAA;AAE5D,SAASC,kBAAkB,CAChCC,OAAiD,EACjDC,eAAoC,GAAG,EAAE,EAC3B;AACd;EACA,IAAIC,KAAwC,GAAG,IAAI,CAAA;AACnDD,EAAAA,eAAe,GAAG;AAChBE,IAAAA,WAAW,EAAEH,OAAO,CAACI,GAAG,CAACC,WAAW,EAAE;IACtC,GAAGJ,eAAAA;GACJ,CAAA;AAED,EAAA,MAAMK,uBAAuB,GAAG,MAAOC,KAAa,IAAyB;AAC3E,IAAA,MAAMC,IAAI,GAAG,MAAMC,OAAO,EAAE,CAAA;IAC5B,MAAMC,KAAK,GAAG,MAAMF,IAAI,CAACG,QAAQ,CAACJ,KAAK,CAAC,CAAA;AAExC,IAAA,OAAOK,iBAAiB,CACtBF,KAAK,CAACG,YAAY,CAACZ,eAAe,CAACa,eAAe,IAAI,GAAG,CAAC,CAC3D,CAAA;GACF,CAAA;AAED,EAAA,MAAMC,cAAc,GAAG,MAAOC,KAAoB,IAAyB;AACzE,IAAA,MAAMT,KAAa,GAAGS,KAAK,CAACC,MAAM,CAChC,CAACC,GAAG,EAAEC,IAAI,KACRD,GAAG,GAAGvB,WAAW,GAAGyB,IAAI,CAACC,GAAG,CAACzB,YAAY,EAAEuB,IAAI,CAACG,MAAM,CAACC,UAAU,CAAC,EACpE,CAAC,CACF,CAAA;IAED,OAAOjB,uBAAuB,CAACC,KAAK,CAAC,CAAA;GACtC,CAAA;AAED,EAAA,MAAMiB,MAAM,GAAG,OACbR,KAAoB,EACpBS,OAA+B,KACT;AACtB,IAAA,MAAMjB,IAAI,GAAG,MAAMC,OAAO,EAAE,CAAA;AAC5B,IAAA,MAAMiB,MAAM,GAAG,MAAMX,cAAc,CAACC,KAAK,CAAC,CAAA;IAC1C,MAAMW,IAAI,CAACD,MAAM,CAAC,CAAA;AAElB,IAAA,MAAME,WAAW,GAAGH,OAAO,EAAEI,QAAQ,KAAK,IAAI,GAAG,IAAIC,GAAG,EAAE,GAAGC,SAAS,CAAA;AAEtE,IAAA,MAAMC,MAAM,GAAG,MAAMC,uBAAW,CAACC,GAAG,CAAClB,KAAK,CAAC,CACxCmB,eAAe,CAAClC,eAAe,CAACmC,iBAAiB,IAAI,EAAE,CAAC,CACxDC,cAAc,CAAC,CAACC,CAAC,EAAEC,IAAI,KACtBd,OAAO,EAAEe,UAAU,GAAGD,IAAI,CAACE,mBAAmB,EAAE,CAAC,CAClD,CACAC,OAAO,CAAC,MAAOvB,IAAI,IAAK;MACvB,IAAIM,OAAO,EAAEkB,MAAM,EAAEC,OAAO,EAAE,MAAM,IAAIC,qBAAc,EAAE,CAAA;MAExD,MAAMvB,QAAM,GAAGwB,aAAM,CAACC,IAAI,CAAC5B,IAAI,CAACG,MAAM,CAAC,CAAA;AACvC,MAAA,MAAM0B,MAAM,GAAGxC,IAAI,CAACyC,iBAAiB,CAAC3B,QAAM,EAAE;QAC5C4B,IAAI,EAAEC,iCAAiC,CAAChC,IAAI,CAAA;AAC9C,OAAC,CAAC,CAAA;MACF,MAAM6B,MAAM,CAACI,IAAI,EAAE,CAAA;MACnB,MAAM;QACJC,MAAM;AACNC,QAAAA,IAAI,EAAE;AAAExD,UAAAA,EAAAA;AAAG,SAAA;OACZ,GAAG,MAAMU,IAAI,CAAC+C,QAAQ,CAACC,iBAAiB,CAACR,MAAM,CAAC,CAAA;MAEjD,IAAIK,MAAM,IAAI,GAAG,EAAE,MAAM,IAAII,6BAAsB,CAACJ,MAAM,CAAC,CAAA;MAE3DzB,WAAW,EAAE8B,GAAG,CAACvC,IAAI,CAACwC,QAAQ,EAAE7D,EAAE,CAAC,CAAA;AAEnC,MAAA,OAAOA,EAAE,CAAA;AACX,KAAC,CAAC,CAAA;AAEJ,IAAA,IAAI8B,WAAW,EAAE;MACf,MAAMC,QAAQ,GAAG,MAAMrB,IAAI,CAAC+C,QAAQ,CAACK,cAAc,CAAC;AAClDC,QAAAA,KAAK,EAAEjC,WAAAA;AACT,OAAC,CAAC,CAAA;MACF,MAAM;AAAE9B,QAAAA,EAAAA;AAAG,OAAC,GAAG,MAAMU,IAAI,CAACgB,MAAM,CAACsC,IAAI,CAACC,SAAS,CAAClC,QAAQ,CAAC,EAAE;AACzDqB,QAAAA,IAAI,EAAE,CACJ;AAAEc,UAAAA,IAAI,EAAE,MAAM;AAAEC,UAAAA,KAAK,EAAE,UAAA;AAAW,SAAC,EACnC;AAAED,UAAAA,IAAI,EAAE,cAAc;AAAEC,UAAAA,KAAK,EAAE,kCAAA;AAAmC,SAAA;AAClE;AAAA,SAAA;AAEJ,OAAC,CAAC,CAAA;;AACF,MAAA,OAAO,CAACpE,UAAU,CAACC,EAAE,CAAC,CAAC,CAAA;AACzB,KAAA;AAEA,IAAA,OAAOkC,MAAM,CAACkC,OAAO,CAACC,GAAG,CAACtE,UAAU,CAAC,CAAA;GACtC,CAAA;AAED,EAAA,MAAMuE,UAAU,GAAG,MAAUC,IAAO,IAAsB;AACxD,IAAA,MAAMlD,IAAI,GAAGmD,6BAAyB,CAACD,IAAI,CAAC,CAAA;IAC5C,MAAME,IAAI,GAAG,MAAM/C,MAAM,CAAC,CAACL,IAAI,CAAC,CAAC,CAAA;IACjC,OAAOoD,IAAI,CAAC,CAAC,CAAC,CAAA;GACf,CAAA;EAED,MAAMC,UAAU,GAAG,YAAgC;AACjD,IAAA,MAAMhE,IAAI,GAAG,MAAMC,OAAO,EAAE,CAAA;AAC5B,IAAA,MAAMgE,OAAO,GAAG,MAAMjE,IAAI,CAACgE,UAAU,EAAE,CAAA;IAEvC,OAAO5D,iBAAiB,CAAC6D,OAAO,CAAC,CAAA;GAClC,CAAA;EAED,MAAM9C,IAAI,GAAG,OACXD,MAAiB,EACjBgD,gBAAgB,GAAG,KAAK,KACN;AAClB,IAAA,MAAMlE,IAAI,GAAG,MAAMC,OAAO,EAAE,CAAA;AAC5B,IAAA,IAAIkE,MAAM,GAAGC,iBAAiB,CAAClD,MAAM,CAAC,CAAA;IAEtC,IAAI,CAACgD,gBAAgB,EAAE;AACrB,MAAA,MAAMD,OAAO,GAAG,MAAMjE,IAAI,CAACgE,UAAU,EAAE,CAAA;AAEvCG,MAAAA,MAAM,GAAGA,MAAM,CAACE,aAAa,CAACJ,OAAO,CAAC,GAClCE,MAAM,CAACG,KAAK,CAACL,OAAO,CAAC,GACrB,IAAIM,6BAAS,CAAC,CAAC,CAAC,CAAA;AACtB,KAAA;AAEA,IAAA,IAAIJ,MAAM,CAACK,mBAAmB,CAAC,CAAC,CAAC,EAAE;AACjC,MAAA,OAAA;AACF,KAAA;AAEA,IAAA,MAAMxE,IAAI,CAACmB,IAAI,CAACgD,MAAM,CAAC,CAAA;GACxB,CAAA;EAED,MAAMM,WAAW,GAAG,YAA2B;AAC7C,IAAA,MAAMzE,IAAI,GAAG,MAAMC,OAAO,EAAE,CAAA;AAC5B,IAAA,MAAMgE,OAAO,GAAG,MAAMjE,IAAI,CAACgE,UAAU,EAAE,CAAA;AACvC,IAAA,MAAMU,cAAc,GAAG,IAAIH,6BAAS,CAAC,IAAI,CAAC,CAAA;AAE1C,IAAA,IAAIN,OAAO,CAACU,UAAU,CAACD,cAAc,CAAC,EAAE;AACtC,MAAA,OAAA;AACF,KAAA;IAEA,MAAM1E,IAAI,CAACyE,WAAW,EAAE,CAAA;GACzB,CAAA;AAED,EAAA,MAAMG,QAAQ,GAAG,MAAO1D,MAAiB,IAAoB;AAC3D,IAAA,MAAMlB,IAAI,GAAG,MAAMC,OAAO,EAAE,CAAA;IAC5B,IAAI;MACF,MAAMD,IAAI,CAAC6E,eAAe,CAACT,iBAAiB,CAAClD,MAAM,CAAC,CAAC,CAAA;KACtD,CAAC,OAAO4D,CAAM,EAAE;AACf,MAAA,MAAM,IAAIC,wBAAiB,CACzBD,CAAC,YAAYE,KAAK,GAAGF,CAAC,CAACG,OAAO,GAAGH,CAAC,CAACI,QAAQ,EAAE,CAC9C,CAAA;AACH,KAAA;GACD,CAAA;EAED,MAAMjF,OAAO,GAAG,YAAiD;AAC/D,IAAA,MAAMkF,QAAQ,GAAGzF,KAAK,EAAE0F,SAAS,EAAE,CAACC,SAAS,CAAA;IAC7C,MAAMC,QAAQ,GAAG7F,eAAe,CAAC8F,KAAK,IAAI/F,OAAO,CAAC+F,KAAK,CAAA;AACvD,IAAA,IACEJ,QAAQ,IACRE,aAAS,CAAC,IAAIG,UAAU,CAACL,QAAQ,CAAC,CAAC,KAAKG,QAAQ,CAACD,SAAS,EAC1D;AACA3F,MAAAA,KAAK,GAAG,IAAI,CAAA;AACd,KAAA;IAEA,IAAI,CAACA,KAAK,EAAE;MACVA,KAAK,GAAG,MAAM+F,QAAQ,EAAE,CAAA;AAC1B,KAAA;AAEA,IAAA,OAAO/F,KAAK,CAAA;GACb,CAAA;EAED,MAAM+F,QAAQ,GAAG,YAAiD;IAChE,MAAMC,KAAK,GAAG,QAAQ,CAAA;AACtB,IAAA,MAAMC,cAAc,GAClBnG,OAAO,CAACI,GAAG,CAACgG,UAAU,EAAE,KAAK,QAAQ,GACjC,yBAAyB,GACzB,2BAA2B,CAAA;AACjC,IAAA,MAAMC,OAAO,GAAGpG,eAAe,EAAEoG,OAAO,IAAIF,cAAc,CAAA;AAC1D,IAAA,MAAMG,WAAW,GAAG;MAClBC,OAAO,EAAEtG,eAAe,CAACsG,OAAO;MAChCpG,WAAW,EAAEF,eAAe,CAACE,WAAAA;KAC9B,CAAA;IAED,MAAM4F,KAAa,GAAG9F,eAAe,CAAC8F,KAAK,IAAI/F,OAAO,CAAC+F,KAAK,CAAA;;AAE5D;AACA,IAAA,MAAMS,MAAM;AACV;IACA,OAAOC,MAAM,KAAK,WAAW,IAAIA,MAAM,CAAC/D,OAAO,EAAEgE,cAAc,CAAC,MAAM,CAAC,CAAA;AAEzE,IAAA,IAAIlG,IAAI,CAAA;AACR,IAAA,IAAIgG,MAAM,IAAIG,mBAAe,CAACZ,KAAK,CAAC,EAClCvF,IAAI,GAAG,MAAMoG,YAAY,CAACP,OAAO,EAAEN,KAAK,EAAEO,WAAW,CAAC,CAAC,KACpD;MACH9F,IAAI,GAAG,MAAMqG,WAAW,CAACR,OAAO,EAAEN,KAAK,EAAEO,WAAW,CAAC,CAAA;AACvD,KAAA;IAEA,IAAI;AACF;AACA,MAAA,MAAM9F,IAAI,CAACsG,KAAK,CAACC,iBAAiB,CAACb,KAAK,CAAC,CAAA;KAC1C,CAAC,OAAOc,KAAK,EAAE;AACd,MAAA,MAAM,IAAIC,wCAAiC,CAACZ,OAAO,EAAEW,KAAK,CAAU,CAAA;AACtE,KAAA;AAEA,IAAA,OAAOxG,IAAI,CAAA;GACZ,CAAA;EAED,MAAMoG,YAAY,GAAG,OACnBP,OAAe,EACfa,OAAgB,EAChBzF,OAAY,KACc;IAC1B,MAAM0F,QAAQ,GAAG3H,oBAAoB,CAAC,MAAM,mFAAO,cAAc,MAAC,CAAC,CAAA;IACnE,MAAM4H,QAAQ,GAAG5H,oBAAoB,CAAC,MAAM,mFAAO,qBAAqB,MAAC,CAAC,CAAA;IAC1E,OAAO2H,QAAQ,CACZE,QAAQ,CAACD,QAAQ,CAACE,MAAM,CAAC,CACzBC,UAAU,CAAClB,OAAO,CAAC,CACnBmB,UAAU,CAACN,OAAO,CAACO,SAAS,CAAC,CAC7BC,cAAc,CAACjG,OAAO,CAAC,CACvBkG,KAAK,EAAE,CAAA;GACX,CAAA;EAED,MAAMd,WAAW,GAAG,OAClBR,OAAe,EACfN,KAAa,EACbtE,OAAY,KACa;AACzB,IAAA,MAAMmG,MAAyB,GAAG;AAChC/B,MAAAA,SAAS,EAAEgC,mCAAiB,CAAC9B,KAAK,CAACF,SAAS,CAAC;MAC7CiC,WAAW,EAAGrC,OAAmB,IAAKM,KAAK,CAAC+B,WAAW,CAACrC,OAAO,CAAC;AAChEsC,MAAAA,eAAe,EAAE,MAAOC,iBAAoC,IAC1DC,2CAAyB,CACvB,MAAMlC,KAAK,CAACgC,eAAe,CACzBG,6CAA2B,CAACF,iBAAiB,CAAC,CAC/C,CACF;MACHG,mBAAmB,EAAE,MAAOC,kBAAuC,IAAK;AACtE,QAAA,MAAMC,YAAY,GAAGD,kBAAkB,CAACjE,GAAG,CACzC+D,6CAA2B,CAC5B,CAAA;QACD,MAAMI,kBAAkB,GAAG,MAAMvC,KAAK,CAACoC,mBAAmB,CACxDE,YAAY,CACb,CAAA;AACD,QAAA,OAAOC,kBAAkB,CAACnE,GAAG,CAAC8D,2CAAyB,CAAC,CAAA;OACzD;MACDM,eAAe,EAAE,OACfP,iBAAoC,EACpCQ,UAA4B,EAC5B/G,OAAyD,GAAG,EAAE,KACtB;QACxC,MAAM;UAAEgH,OAAO,EAAEC,aAAa,GAAG,EAAE;UAAE,GAAGC,WAAAA;AAAY,SAAC,GAAGlH,OAAO,CAAA;QAC/D,MAAMgH,OAAO,GAAGC,aAAa,CAACvE,GAAG,CAAEyE,YAAY,IAC7CC,2BAAuB,CACrB7I,OAAO,EACP8I,mCAAiB,CACfC,eAAa,CAACC,aAAa,CAACJ,YAAY,CAACnB,SAAS,CAAC,CACpD,CACF,CACF,CAAA;AAED,QAAA,IAAIwB,WAAW,GAAGf,6CAA2B,CAACF,iBAAiB,CAAC,CAAA;AAChEiB,QAAAA,WAAW,GAAG,MAAMlB,mBAAe,CAACkB,WAAW,EAAE,CAAClD,KAAK,EAAE,GAAG0C,OAAO,CAAC,CAAC,CAAA;QAErE,MAAMS,SAAS,GAAG,MAAMlJ,OAAO,CAACI,GAAG,CAACmI,eAAe,CAACU,WAAW,EAAE;AAC/D,UAAA,GAAGN,WAAW;UACdQ,mBAAmB,EAAER,WAAW,CAACQ,mBAAAA;AACnC,SAAC,CAAC,CAAA;QAEF,OAAOC,UAAM,CAACC,WAAW,CAACH,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA;AACzC,OAAA;KACD,CAAA;IAED,MAAM/B,QAAQ,GAAG3H,oBAAoB,CAAC,MAAM,mFAAO,kBAAkB,MAAC,CAAC,CAAA;IACvE,MAAM4H,QAAQ,GAAG5H,oBAAoB,CACnC,MAAM,mFAAO,yBAAyB,MAAC,CACxC,CAAA;AAED,IAAA,MAAMgB,IAAI,GAAG,MAAM2G,QAAQ,CACxBmC,WAAW,CAAClC,QAAQ,CAACmC,SAAS,CAAC,CAC/BC,YAAY,CAAC5B,MAAM,CAAC,CACpBL,UAAU,CAAClB,OAAO,CAAC,CACnBqB,cAAc,CAACjG,OAAO,CAAC,CACvBkG,KAAK,EAAE,CAAA;IAEV,IAAI;AACF;MACA,MAAMnH,IAAI,CAACiJ,KAAK,EAAE,CAAA;KACnB,CAAC,OAAOzC,KAAK,EAAE;AACd,MAAA,MAAM,IAAI0C,kCAA2B,CAAC1C,KAAK,CAAU,CAAA;AACvD,KAAA;AAEA,IAAA,OAAOxG,IAAI,CAAA;GACZ,CAAA;EAED,OAAO;IACLF,uBAAuB;IACvBS,cAAc;IACdS,MAAM;IACN4C,UAAU;IACVI,UAAU;IACV7C,IAAI;IACJsD,WAAW;IACXG,QAAQ;AACR5E,IAAAA,IAAI,EAAEC,OAAAA;GACP,CAAA;AACH,CAAA;MAEakJ,cAAc,GACzBpG,QAA2B,IAE3B,MAAM,IAAIA,QAAQ,IAClB,YAAY,IAAIA,QAAQ,IACxB,MAAM,IAAIA,QAAQ,IAClB,aAAa,IAAIA,SAAQ;AAE3B,MAAM3C,iBAAiB,GAAIgJ,SAAoB,IAC7CC,YAAQ,CAACD,SAAS,CAACE,aAAa,CAAC,CAAC,CAAC,CAACpE,QAAQ,EAAE,CAAC,CAAA;AAEjD,MAAMd,iBAAiB,GAAIlD,MAAiB,IAC1C,IAAIqD,6BAAS,CAACrD,MAAM,CAACqI,WAAW,CAACrE,QAAQ,EAAE,CAAC,CAAA;AAE9C,MAAMvC,iCAAiC,GACrChC,IAAiB,IACI;AACrB,EAAA,IAAI,CAACA,IAAI,CAAC6I,WAAW,EAAE;IACrB,OAAO7I,IAAI,CAAC+B,IAAI,CAAA;AAClB,GAAA;AAEA,EAAA,OAAO,CAAC;AAAEc,IAAAA,IAAI,EAAE,cAAc;IAAEC,KAAK,EAAE9C,IAAI,CAAC6I,WAAAA;AAAY,GAAC,EAAE,GAAG7I,IAAI,CAAC+B,IAAI,CAAC,CAAA;AAC1E,CAAC;;;;;"}
|
package/dist/cjs/errors.cjs
CHANGED
|
@@ -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://
|
|
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
|
package/dist/cjs/errors.cjs.map
CHANGED
|
@@ -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://
|
|
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;;;;;;;;;"}
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -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;
|
package/dist/cjs/index.cjs.map
CHANGED
|
@@ -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 {
|
|
6
|
+
import { PromisePool } from '@supercharge/promise-pool';
|
|
7
|
+
import { IrysAbortError, AssetUploadFailedError, IrysWithdrawError, FailedToConnectToIrysAddressError, FailedToInitializeIrysError } from './errors.mjs';
|
|
7
8
|
|
|
8
|
-
//
|
|
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
|
-
|
|
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
|
-
|
|
34
|
+
uploaderOptions = {
|
|
33
35
|
providerUrl: context.rpc.getEndpoint(),
|
|
34
|
-
...
|
|
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(
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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 =
|
|
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
|
|
120
|
-
const defaultAddress = context.rpc.getCluster() === 'devnet' ? 'https://devnet.irys.xyz' : 'https://
|
|
121
|
-
const address =
|
|
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:
|
|
124
|
-
providerUrl:
|
|
146
|
+
timeout: uploaderOptions.timeout,
|
|
147
|
+
providerUrl: uploaderOptions.providerUrl
|
|
125
148
|
};
|
|
126
|
-
const 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,
|
|
134
|
-
irys = await initWebIrys(address,
|
|
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(
|
|
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,
|
|
145
|
-
const bPackage = _removeDoubleDefault(await import('@irys/
|
|
146
|
-
|
|
147
|
-
return
|
|
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,
|
|
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/
|
|
180
|
-
const
|
|
181
|
-
|
|
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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"}
|
package/dist/esm/errors.mjs
CHANGED
|
@@ -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://
|
|
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
|
package/dist/esm/errors.mjs.map
CHANGED
|
@@ -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://
|
|
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;;;;"}
|
package/dist/esm/index.mjs
CHANGED
|
@@ -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 {
|
|
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<
|
|
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'>,
|
|
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;
|
package/dist/types/errors.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@metaplex-foundation/umi-uploader-irys",
|
|
3
|
-
"version": "
|
|
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/
|
|
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.
|
|
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.
|
|
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.
|
|
38
|
-
"@metaplex-foundation/umi-
|
|
39
|
-
"@metaplex-foundation/umi
|
|
40
|
-
"@metaplex-foundation/umi-http
|
|
41
|
-
"@metaplex-foundation/umi-rpc-web3js": "^0.
|
|
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
|
-
|
|
2
|
-
import type {
|
|
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<
|
|
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
|
-
|
|
113
|
+
uploaderOptions: IrysUploaderOptions = {}
|
|
107
114
|
): IrysUploader {
|
|
108
115
|
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
109
|
-
let _irys:
|
|
110
|
-
|
|
116
|
+
let _irys: BaseNodeIrys | BaseWebIrys | null = null;
|
|
117
|
+
uploaderOptions = {
|
|
111
118
|
providerUrl: context.rpc.getEndpoint(),
|
|
112
|
-
...
|
|
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(
|
|
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 (
|
|
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
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
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
|
-
|
|
171
|
+
manifestMap?.set(file.fileName, id);
|
|
147
172
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
}
|
|
173
|
+
return id;
|
|
174
|
+
});
|
|
151
175
|
|
|
152
|
-
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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<
|
|
251
|
+
const getIrys = async (): Promise<BaseWebIrys | BaseNodeIrys> => {
|
|
219
252
|
const oldPayer = _irys?.getSigner().publicKey;
|
|
220
|
-
const newPayer =
|
|
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<
|
|
236
|
-
const
|
|
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://
|
|
241
|
-
const address =
|
|
273
|
+
: 'https://uploader.irys.xyz';
|
|
274
|
+
const address = uploaderOptions?.address ?? defaultAddress;
|
|
242
275
|
const irysOptions = {
|
|
243
|
-
timeout:
|
|
244
|
-
providerUrl:
|
|
276
|
+
timeout: uploaderOptions.timeout,
|
|
277
|
+
providerUrl: uploaderOptions.providerUrl,
|
|
245
278
|
};
|
|
246
279
|
|
|
247
|
-
const payer: Signer =
|
|
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,
|
|
289
|
+
irys = await initNodeIrys(address, payer, irysOptions);
|
|
257
290
|
else {
|
|
258
|
-
irys = await initWebIrys(address,
|
|
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(
|
|
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<
|
|
277
|
-
const bPackage = _removeDoubleDefault(await import('@irys/
|
|
278
|
-
|
|
279
|
-
return
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
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<
|
|
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/
|
|
339
|
-
const
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
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://
|
|
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
|
+
}
|