@metaplex-foundation/umi-uploader-irys 0.8.11
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/README.md +9 -0
- package/dist/cjs/createIrysUploader.cjs +249 -0
- package/dist/cjs/createIrysUploader.cjs.map +1 -0
- package/dist/cjs/errors.cjs +47 -0
- package/dist/cjs/errors.cjs.map +1 -0
- package/dist/cjs/index.cjs +19 -0
- package/dist/cjs/index.cjs.map +1 -0
- package/dist/cjs/plugin.cjs +14 -0
- package/dist/cjs/plugin.cjs.map +1 -0
- package/dist/esm/createIrysUploader.mjs +222 -0
- package/dist/esm/createIrysUploader.mjs.map +1 -0
- package/dist/esm/errors.mjs +39 -0
- package/dist/esm/errors.mjs.map +1 -0
- package/dist/esm/index.mjs +4 -0
- package/dist/esm/index.mjs.map +1 -0
- package/dist/esm/plugin.mjs +10 -0
- package/dist/esm/plugin.mjs.map +1 -0
- package/dist/types/createIrysUploader.d.ts +29 -0
- package/dist/types/errors.d.ts +21 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/plugin.d.ts +3 -0
- package/package.json +72 -0
- package/src/createIrysUploader.ts +391 -0
- package/src/errors.ts +54 -0
- package/src/index.ts +3 -0
- package/src/plugin.ts +8 -0
package/README.md
ADDED
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var umi = require('@metaplex-foundation/umi');
|
|
6
|
+
var umiWeb3jsAdapters = require('@metaplex-foundation/umi-web3js-adapters');
|
|
7
|
+
var web3_js = require('@solana/web3.js');
|
|
8
|
+
var BigNumber = require('bignumber.js');
|
|
9
|
+
var buffer = require('buffer');
|
|
10
|
+
var errors = require('./errors.cjs');
|
|
11
|
+
|
|
12
|
+
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
13
|
+
|
|
14
|
+
function _interopNamespace(e) {
|
|
15
|
+
if (e && e.__esModule) return e;
|
|
16
|
+
var n = Object.create(null);
|
|
17
|
+
if (e) {
|
|
18
|
+
Object.keys(e).forEach(function (k) {
|
|
19
|
+
if (k !== 'default') {
|
|
20
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
21
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
22
|
+
enumerable: true,
|
|
23
|
+
get: function () { return e[k]; }
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
n["default"] = e;
|
|
29
|
+
return Object.freeze(n);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
var BigNumber__default = /*#__PURE__*/_interopDefaultLegacy(BigNumber);
|
|
33
|
+
|
|
34
|
+
// eslint-disable-next-line import/no-named-default
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* This method is necessary to import the Irys package on both ESM and CJS modules.
|
|
38
|
+
* Without this, we get a different structure on each module:
|
|
39
|
+
* - CJS: { default: [Getter], WebIrys: [Getter] }
|
|
40
|
+
* - ESM: { default: { default: [Getter], WebIrys: [Getter] } }
|
|
41
|
+
* This method fixes this by ensure there is not double default in the imported package.
|
|
42
|
+
*/
|
|
43
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
44
|
+
function _removeDoubleDefault(pkg) {
|
|
45
|
+
if (pkg && typeof pkg === 'object' && 'default' in pkg && 'default' in pkg.default) {
|
|
46
|
+
return pkg.default;
|
|
47
|
+
}
|
|
48
|
+
return pkg;
|
|
49
|
+
}
|
|
50
|
+
// Size of Irys transaction header.
|
|
51
|
+
const HEADER_SIZE = 2_000;
|
|
52
|
+
|
|
53
|
+
// Minimum file size for cost calculation.
|
|
54
|
+
const MINIMUM_SIZE = 80_000;
|
|
55
|
+
function createIrysUploader(context, options = {}) {
|
|
56
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
57
|
+
let _irys = null;
|
|
58
|
+
options = {
|
|
59
|
+
providerUrl: context.rpc.getEndpoint(),
|
|
60
|
+
...options
|
|
61
|
+
};
|
|
62
|
+
const getUploadPriceFromBytes = async bytes => {
|
|
63
|
+
const irys = await getIrys();
|
|
64
|
+
const price = await irys.getPrice(bytes);
|
|
65
|
+
return bigNumberToAmount(price.multipliedBy(options.priceMultiplier ?? 1.1));
|
|
66
|
+
};
|
|
67
|
+
const getUploadPrice = async files => {
|
|
68
|
+
const bytes = files.reduce((sum, file) => sum + HEADER_SIZE + Math.max(MINIMUM_SIZE, file.buffer.byteLength), 0);
|
|
69
|
+
return getUploadPriceFromBytes(bytes);
|
|
70
|
+
};
|
|
71
|
+
const upload = async files => {
|
|
72
|
+
const irys = await getIrys();
|
|
73
|
+
const amount = await getUploadPrice(files);
|
|
74
|
+
await fund(amount);
|
|
75
|
+
const promises = files.map(async file => {
|
|
76
|
+
const buffer$1 = buffer.Buffer.from(file.buffer);
|
|
77
|
+
const irysTx = irys.createTransaction(buffer$1, {
|
|
78
|
+
tags: getGenericFileTagsWithContentType(file)
|
|
79
|
+
});
|
|
80
|
+
await irysTx.sign();
|
|
81
|
+
const {
|
|
82
|
+
status,
|
|
83
|
+
data
|
|
84
|
+
} = await irys.uploader.uploadTransaction(irysTx);
|
|
85
|
+
if (status >= 300) {
|
|
86
|
+
throw new errors.AssetUploadFailedError(status);
|
|
87
|
+
}
|
|
88
|
+
return `https://arweave.net/${data.id}`;
|
|
89
|
+
});
|
|
90
|
+
return Promise.all(promises);
|
|
91
|
+
};
|
|
92
|
+
const uploadJson = async json => {
|
|
93
|
+
const file = umi.createGenericFileFromJson(json);
|
|
94
|
+
const uris = await upload([file]);
|
|
95
|
+
return uris[0];
|
|
96
|
+
};
|
|
97
|
+
const getBalance = async () => {
|
|
98
|
+
const irys = await getIrys();
|
|
99
|
+
const balance = await irys.getLoadedBalance();
|
|
100
|
+
return bigNumberToAmount(balance);
|
|
101
|
+
};
|
|
102
|
+
const fund = async (amount, skipBalanceCheck = false) => {
|
|
103
|
+
const irys = await getIrys();
|
|
104
|
+
let toFund = amountToBigNumber(amount);
|
|
105
|
+
if (!skipBalanceCheck) {
|
|
106
|
+
const balance = await irys.getLoadedBalance();
|
|
107
|
+
toFund = toFund.isGreaterThan(balance) ? toFund.minus(balance) : new BigNumber__default["default"](0);
|
|
108
|
+
}
|
|
109
|
+
if (toFund.isLessThanOrEqualTo(0)) {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
await irys.fund(toFund);
|
|
113
|
+
};
|
|
114
|
+
const withdrawAll = async () => {
|
|
115
|
+
// TODO(loris): Replace with "withdrawAll" when available on Irys.
|
|
116
|
+
const irys = await getIrys();
|
|
117
|
+
const balance = await irys.getLoadedBalance();
|
|
118
|
+
const minimumBalance = new BigNumber__default["default"](5000);
|
|
119
|
+
if (balance.isLessThan(minimumBalance)) {
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
const balanceToWithdraw = balance.minus(minimumBalance);
|
|
123
|
+
await withdraw(bigNumberToAmount(balanceToWithdraw));
|
|
124
|
+
};
|
|
125
|
+
const withdraw = async amount => {
|
|
126
|
+
const irys = await getIrys();
|
|
127
|
+
try {
|
|
128
|
+
await irys.withdrawBalance(amountToBigNumber(amount));
|
|
129
|
+
} catch (e) {
|
|
130
|
+
throw new errors.IrysWithdrawError(e instanceof Error ? e.message : e.toString());
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
const getIrys = async () => {
|
|
134
|
+
const oldPayer = _irys?.getSigner().publicKey;
|
|
135
|
+
const newPayer = options.payer ?? context.payer;
|
|
136
|
+
if (oldPayer && umi.publicKey(new Uint8Array(oldPayer)) !== newPayer.publicKey) {
|
|
137
|
+
_irys = null;
|
|
138
|
+
}
|
|
139
|
+
if (!_irys) {
|
|
140
|
+
_irys = await initIrys();
|
|
141
|
+
}
|
|
142
|
+
return _irys;
|
|
143
|
+
};
|
|
144
|
+
const initIrys = async () => {
|
|
145
|
+
const currency = 'solana';
|
|
146
|
+
const defaultAddress = context.rpc.getCluster() === 'devnet' ? 'https://devnet.irys.xyz' : 'https://node1.irys.xyz';
|
|
147
|
+
const address = options?.address ?? defaultAddress;
|
|
148
|
+
const irysOptions = {
|
|
149
|
+
timeout: options.timeout,
|
|
150
|
+
providerUrl: options.providerUrl
|
|
151
|
+
};
|
|
152
|
+
const payer = options.payer ?? context.payer;
|
|
153
|
+
|
|
154
|
+
// If in node use node irys, else use web irys.
|
|
155
|
+
const isNode =
|
|
156
|
+
// eslint-disable-next-line no-prototype-builtins
|
|
157
|
+
typeof window === 'undefined' || window.process?.hasOwnProperty('type');
|
|
158
|
+
let irys;
|
|
159
|
+
if (isNode && umi.isKeypairSigner(payer)) irys = await initNodeIrys(address, currency, payer, irysOptions);else {
|
|
160
|
+
irys = await initWebIrys(address, currency, payer, irysOptions);
|
|
161
|
+
}
|
|
162
|
+
try {
|
|
163
|
+
// Check for valid irys node.
|
|
164
|
+
await irys.utils.getBundlerAddress(currency);
|
|
165
|
+
} catch (error) {
|
|
166
|
+
throw new errors.FailedToConnectToIrysAddressError(address, error);
|
|
167
|
+
}
|
|
168
|
+
return irys;
|
|
169
|
+
};
|
|
170
|
+
const initNodeIrys = async (address, currency, keypair, options) => {
|
|
171
|
+
const bPackage = _removeDoubleDefault(await Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require('@irys/sdk')); }));
|
|
172
|
+
// eslint-disable-next-line new-cap
|
|
173
|
+
return new bPackage.default({
|
|
174
|
+
url: address,
|
|
175
|
+
token: currency,
|
|
176
|
+
key: keypair.secretKey,
|
|
177
|
+
config: options
|
|
178
|
+
});
|
|
179
|
+
};
|
|
180
|
+
const initWebIrys = async (address, currency, payer, options) => {
|
|
181
|
+
const wallet = {
|
|
182
|
+
publicKey: umiWeb3jsAdapters.toWeb3JsPublicKey(payer.publicKey),
|
|
183
|
+
signMessage: message => payer.signMessage(message),
|
|
184
|
+
signTransaction: async web3JsTransaction => umiWeb3jsAdapters.toWeb3JsLegacyTransaction(await payer.signTransaction(umiWeb3jsAdapters.fromWeb3JsLegacyTransaction(web3JsTransaction))),
|
|
185
|
+
signAllTransactions: async web3JsTransactions => {
|
|
186
|
+
const transactions = web3JsTransactions.map(umiWeb3jsAdapters.fromWeb3JsLegacyTransaction);
|
|
187
|
+
const signedTransactions = await payer.signAllTransactions(transactions);
|
|
188
|
+
return signedTransactions.map(umiWeb3jsAdapters.toWeb3JsLegacyTransaction);
|
|
189
|
+
},
|
|
190
|
+
sendTransaction: async (web3JsTransaction, connection, options = {}) => {
|
|
191
|
+
const {
|
|
192
|
+
signers: web3JsSigners = [],
|
|
193
|
+
...sendOptions
|
|
194
|
+
} = options;
|
|
195
|
+
const signers = web3JsSigners.map(web3JsSigner => umi.createSignerFromKeypair(context, umiWeb3jsAdapters.fromWeb3JsKeypair(web3_js.Keypair.fromSecretKey(web3JsSigner.secretKey))));
|
|
196
|
+
let transaction = umiWeb3jsAdapters.fromWeb3JsLegacyTransaction(web3JsTransaction);
|
|
197
|
+
transaction = await umi.signTransaction(transaction, [payer, ...signers]);
|
|
198
|
+
const signature = await context.rpc.sendTransaction(transaction, {
|
|
199
|
+
...sendOptions,
|
|
200
|
+
preflightCommitment: sendOptions.preflightCommitment
|
|
201
|
+
});
|
|
202
|
+
return umi.base58.deserialize(signature)[0];
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
const bPackage = _removeDoubleDefault(await Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require('@irys/sdk')); }));
|
|
206
|
+
const irys = new bPackage.WebIrys({
|
|
207
|
+
url: address,
|
|
208
|
+
token: currency,
|
|
209
|
+
wallet: {
|
|
210
|
+
provider: wallet
|
|
211
|
+
},
|
|
212
|
+
config: options
|
|
213
|
+
});
|
|
214
|
+
try {
|
|
215
|
+
// Try to initiate irys.
|
|
216
|
+
await irys.ready();
|
|
217
|
+
} catch (error) {
|
|
218
|
+
throw new errors.FailedToInitializeIrysError(error);
|
|
219
|
+
}
|
|
220
|
+
return irys;
|
|
221
|
+
};
|
|
222
|
+
return {
|
|
223
|
+
getUploadPriceFromBytes,
|
|
224
|
+
getUploadPrice,
|
|
225
|
+
upload,
|
|
226
|
+
uploadJson,
|
|
227
|
+
getBalance,
|
|
228
|
+
fund,
|
|
229
|
+
withdrawAll,
|
|
230
|
+
withdraw,
|
|
231
|
+
irys: getIrys
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
const isIrysUploader = uploader => 'irys' in uploader && 'getBalance' in uploader && 'fund' in uploader && 'withdrawAll' in uploader;
|
|
235
|
+
const bigNumberToAmount = bigNumber => umi.lamports(bigNumber.decimalPlaces(0).toString());
|
|
236
|
+
const amountToBigNumber = amount => new BigNumber__default["default"](amount.basisPoints.toString());
|
|
237
|
+
const getGenericFileTagsWithContentType = file => {
|
|
238
|
+
if (!file.contentType) {
|
|
239
|
+
return file.tags;
|
|
240
|
+
}
|
|
241
|
+
return [{
|
|
242
|
+
name: 'Content-Type',
|
|
243
|
+
value: file.contentType
|
|
244
|
+
}, ...file.tags];
|
|
245
|
+
};
|
|
246
|
+
|
|
247
|
+
exports.createIrysUploader = createIrysUploader;
|
|
248
|
+
exports.isIrysUploader = isIrysUploader;
|
|
249
|
+
//# sourceMappingURL=createIrysUploader.cjs.map
|
|
@@ -0,0 +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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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var umi = require('@metaplex-foundation/umi');
|
|
6
|
+
|
|
7
|
+
class IrysError extends umi.UmiError {
|
|
8
|
+
name = 'IrysError';
|
|
9
|
+
constructor(message, cause) {
|
|
10
|
+
super(message, 'plugin', 'Irys', cause);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
class FailedToInitializeIrysError extends IrysError {
|
|
14
|
+
name = 'FailedToInitializeIrysError';
|
|
15
|
+
constructor(cause) {
|
|
16
|
+
const message = 'Irys could not be initialized. ' + 'Please check the underlying error below for more details.';
|
|
17
|
+
super(message, cause);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
class FailedToConnectToIrysAddressError extends IrysError {
|
|
21
|
+
name = 'FailedToConnectToIrysAddressError';
|
|
22
|
+
constructor(address, cause) {
|
|
23
|
+
const message = `Irys could not connect to the provided address [${address}]. ` + 'Please ensure the provided address is valid. Some valid addresses include: ' + '"https://node1.irys.xyz" for mainnet and "https://devnet.irys.xyz" for devnet';
|
|
24
|
+
super(message, cause);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
class AssetUploadFailedError extends IrysError {
|
|
28
|
+
name = 'AssetUploadFailedError';
|
|
29
|
+
constructor(status) {
|
|
30
|
+
const message = `The asset could not be uploaded to the Irys network and ` + `returned the following status code [${status}].`;
|
|
31
|
+
super(message);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
class IrysWithdrawError extends IrysError {
|
|
35
|
+
name = 'IrysWithdrawError';
|
|
36
|
+
constructor(error) {
|
|
37
|
+
const message = `The balance could not be withdrawn from the Irys network and ` + `returned the following error: ${error}.`;
|
|
38
|
+
super(message);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
exports.AssetUploadFailedError = AssetUploadFailedError;
|
|
43
|
+
exports.FailedToConnectToIrysAddressError = FailedToConnectToIrysAddressError;
|
|
44
|
+
exports.FailedToInitializeIrysError = FailedToInitializeIrysError;
|
|
45
|
+
exports.IrysError = IrysError;
|
|
46
|
+
exports.IrysWithdrawError = IrysWithdrawError;
|
|
47
|
+
//# sourceMappingURL=errors.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.cjs","sources":["../../src/errors.ts"],"sourcesContent":["import { UmiError } from '@metaplex-foundation/umi';\n\nexport class IrysError extends UmiError {\n readonly name: string = 'IrysError';\n\n constructor(message: string, cause?: Error) {\n super(message, 'plugin', 'Irys', cause);\n }\n}\n\nexport class FailedToInitializeIrysError extends IrysError {\n readonly name: string = 'FailedToInitializeIrysError';\n\n constructor(cause: Error) {\n const message =\n 'Irys could not be initialized. ' +\n 'Please check the underlying error below for more details.';\n super(message, cause);\n }\n}\n\nexport class FailedToConnectToIrysAddressError extends IrysError {\n readonly name: string = 'FailedToConnectToIrysAddressError';\n\n constructor(address: string, cause: Error) {\n const message =\n `Irys could not connect to the provided address [${address}]. ` +\n 'Please ensure the provided address is valid. Some valid addresses include: ' +\n '\"https://node1.irys.xyz\" for mainnet and \"https://devnet.irys.xyz\" for devnet';\n super(message, cause);\n }\n}\n\nexport class AssetUploadFailedError extends IrysError {\n readonly name: string = 'AssetUploadFailedError';\n\n constructor(status: number) {\n const message =\n `The asset could not be uploaded to the Irys network and ` +\n `returned the following status code [${status}].`;\n super(message);\n }\n}\n\nexport class IrysWithdrawError extends IrysError {\n readonly name: string = 'IrysWithdrawError';\n\n constructor(error: string) {\n const message =\n `The balance could not be withdrawn from the Irys network and ` +\n `returned the following error: ${error}.`;\n super(message);\n }\n}\n"],"names":["IrysError","UmiError","name","constructor","message","cause","FailedToInitializeIrysError","FailedToConnectToIrysAddressError","address","AssetUploadFailedError","status","IrysWithdrawError","error"],"mappings":";;;;;;AAEO,MAAMA,SAAS,SAASC,YAAQ,CAAC;AAC7BC,EAAAA,IAAI,GAAW,WAAW,CAAA;AAEnCC,EAAAA,WAAW,CAACC,OAAe,EAAEC,KAAa,EAAE;IAC1C,KAAK,CAACD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAEC,KAAK,CAAC,CAAA;AACzC,GAAA;AACF,CAAA;AAEO,MAAMC,2BAA2B,SAASN,SAAS,CAAC;AAChDE,EAAAA,IAAI,GAAW,6BAA6B,CAAA;EAErDC,WAAW,CAACE,KAAY,EAAE;AACxB,IAAA,MAAMD,OAAO,GACX,iCAAiC,GACjC,2DAA2D,CAAA;AAC7D,IAAA,KAAK,CAACA,OAAO,EAAEC,KAAK,CAAC,CAAA;AACvB,GAAA;AACF,CAAA;AAEO,MAAME,iCAAiC,SAASP,SAAS,CAAC;AACtDE,EAAAA,IAAI,GAAW,mCAAmC,CAAA;AAE3DC,EAAAA,WAAW,CAACK,OAAe,EAAEH,KAAY,EAAE;IACzC,MAAMD,OAAO,GACV,CAAkDI,gDAAAA,EAAAA,OAAQ,KAAI,GAC/D,6EAA6E,GAC7E,+EAA+E,CAAA;AACjF,IAAA,KAAK,CAACJ,OAAO,EAAEC,KAAK,CAAC,CAAA;AACvB,GAAA;AACF,CAAA;AAEO,MAAMI,sBAAsB,SAAST,SAAS,CAAC;AAC3CE,EAAAA,IAAI,GAAW,wBAAwB,CAAA;EAEhDC,WAAW,CAACO,MAAc,EAAE;AAC1B,IAAA,MAAMN,OAAO,GACV,CAAA,wDAAA,CAAyD,GACzD,CAAA,oCAAA,EAAsCM,MAAO,CAAG,EAAA,CAAA,CAAA;IACnD,KAAK,CAACN,OAAO,CAAC,CAAA;AAChB,GAAA;AACF,CAAA;AAEO,MAAMO,iBAAiB,SAASX,SAAS,CAAC;AACtCE,EAAAA,IAAI,GAAW,mBAAmB,CAAA;EAE3CC,WAAW,CAACS,KAAa,EAAE;AACzB,IAAA,MAAMR,OAAO,GACV,CAAA,6DAAA,CAA8D,GAC9D,CAAA,8BAAA,EAAgCQ,KAAM,CAAE,CAAA,CAAA,CAAA;IAC3C,KAAK,CAACR,OAAO,CAAC,CAAA;AAChB,GAAA;AACF;;;;;;;;"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var createIrysUploader = require('./createIrysUploader.cjs');
|
|
6
|
+
var errors = require('./errors.cjs');
|
|
7
|
+
var plugin = require('./plugin.cjs');
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
exports.createIrysUploader = createIrysUploader.createIrysUploader;
|
|
12
|
+
exports.isIrysUploader = createIrysUploader.isIrysUploader;
|
|
13
|
+
exports.AssetUploadFailedError = errors.AssetUploadFailedError;
|
|
14
|
+
exports.FailedToConnectToIrysAddressError = errors.FailedToConnectToIrysAddressError;
|
|
15
|
+
exports.FailedToInitializeIrysError = errors.FailedToInitializeIrysError;
|
|
16
|
+
exports.IrysError = errors.IrysError;
|
|
17
|
+
exports.IrysWithdrawError = errors.IrysWithdrawError;
|
|
18
|
+
exports.irysUploader = plugin.irysUploader;
|
|
19
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var createIrysUploader = require('./createIrysUploader.cjs');
|
|
6
|
+
|
|
7
|
+
const irysUploader = options => ({
|
|
8
|
+
install(umi) {
|
|
9
|
+
umi.uploader = createIrysUploader.createIrysUploader(umi, options);
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
exports.irysUploader = irysUploader;
|
|
14
|
+
//# sourceMappingURL=plugin.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.cjs","sources":["../../src/plugin.ts"],"sourcesContent":["import type { UmiPlugin } from '@metaplex-foundation/umi';\nimport { IrysUploaderOptions, createIrysUploader } from './createIrysUploader';\n\nexport const irysUploader = (options?: IrysUploaderOptions): UmiPlugin => ({\n install(umi) {\n umi.uploader = createIrysUploader(umi, options);\n },\n});\n"],"names":["irysUploader","options","install","umi","uploader","createIrysUploader"],"mappings":";;;;;;AAGaA,MAAAA,YAAY,GAAIC,OAA6B,KAAiB;EACzEC,OAAO,CAACC,GAAG,EAAE;IACXA,GAAG,CAACC,QAAQ,GAAGC,qCAAkB,CAACF,GAAG,EAAEF,OAAO,CAAC,CAAA;AACjD,GAAA;AACF,CAAC;;;;"}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import { createGenericFileFromJson, publicKey, isKeypairSigner, createSignerFromKeypair, signTransaction, base58, lamports } from '@metaplex-foundation/umi';
|
|
2
|
+
import { toWeb3JsPublicKey, toWeb3JsLegacyTransaction, fromWeb3JsLegacyTransaction, fromWeb3JsKeypair } from '@metaplex-foundation/umi-web3js-adapters';
|
|
3
|
+
import { Keypair } from '@solana/web3.js';
|
|
4
|
+
import BigNumber from 'bignumber.js';
|
|
5
|
+
import { Buffer } from 'buffer';
|
|
6
|
+
import { AssetUploadFailedError, IrysWithdrawError, FailedToConnectToIrysAddressError, FailedToInitializeIrysError } from './errors.mjs';
|
|
7
|
+
|
|
8
|
+
// eslint-disable-next-line import/no-named-default
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* This method is necessary to import the Irys package on both ESM and CJS modules.
|
|
12
|
+
* Without this, we get a different structure on each module:
|
|
13
|
+
* - CJS: { default: [Getter], WebIrys: [Getter] }
|
|
14
|
+
* - ESM: { default: { default: [Getter], WebIrys: [Getter] } }
|
|
15
|
+
* This method fixes this by ensure there is not double default in the imported package.
|
|
16
|
+
*/
|
|
17
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
18
|
+
function _removeDoubleDefault(pkg) {
|
|
19
|
+
if (pkg && typeof pkg === 'object' && 'default' in pkg && 'default' in pkg.default) {
|
|
20
|
+
return pkg.default;
|
|
21
|
+
}
|
|
22
|
+
return pkg;
|
|
23
|
+
}
|
|
24
|
+
// Size of Irys transaction header.
|
|
25
|
+
const HEADER_SIZE = 2_000;
|
|
26
|
+
|
|
27
|
+
// Minimum file size for cost calculation.
|
|
28
|
+
const MINIMUM_SIZE = 80_000;
|
|
29
|
+
function createIrysUploader(context, options = {}) {
|
|
30
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
31
|
+
let _irys = null;
|
|
32
|
+
options = {
|
|
33
|
+
providerUrl: context.rpc.getEndpoint(),
|
|
34
|
+
...options
|
|
35
|
+
};
|
|
36
|
+
const getUploadPriceFromBytes = async bytes => {
|
|
37
|
+
const irys = await getIrys();
|
|
38
|
+
const price = await irys.getPrice(bytes);
|
|
39
|
+
return bigNumberToAmount(price.multipliedBy(options.priceMultiplier ?? 1.1));
|
|
40
|
+
};
|
|
41
|
+
const getUploadPrice = async files => {
|
|
42
|
+
const bytes = files.reduce((sum, file) => sum + HEADER_SIZE + Math.max(MINIMUM_SIZE, file.buffer.byteLength), 0);
|
|
43
|
+
return getUploadPriceFromBytes(bytes);
|
|
44
|
+
};
|
|
45
|
+
const upload = async files => {
|
|
46
|
+
const irys = await getIrys();
|
|
47
|
+
const amount = await getUploadPrice(files);
|
|
48
|
+
await fund(amount);
|
|
49
|
+
const promises = files.map(async file => {
|
|
50
|
+
const buffer = Buffer.from(file.buffer);
|
|
51
|
+
const irysTx = irys.createTransaction(buffer, {
|
|
52
|
+
tags: getGenericFileTagsWithContentType(file)
|
|
53
|
+
});
|
|
54
|
+
await irysTx.sign();
|
|
55
|
+
const {
|
|
56
|
+
status,
|
|
57
|
+
data
|
|
58
|
+
} = await irys.uploader.uploadTransaction(irysTx);
|
|
59
|
+
if (status >= 300) {
|
|
60
|
+
throw new AssetUploadFailedError(status);
|
|
61
|
+
}
|
|
62
|
+
return `https://arweave.net/${data.id}`;
|
|
63
|
+
});
|
|
64
|
+
return Promise.all(promises);
|
|
65
|
+
};
|
|
66
|
+
const uploadJson = async json => {
|
|
67
|
+
const file = createGenericFileFromJson(json);
|
|
68
|
+
const uris = await upload([file]);
|
|
69
|
+
return uris[0];
|
|
70
|
+
};
|
|
71
|
+
const getBalance = async () => {
|
|
72
|
+
const irys = await getIrys();
|
|
73
|
+
const balance = await irys.getLoadedBalance();
|
|
74
|
+
return bigNumberToAmount(balance);
|
|
75
|
+
};
|
|
76
|
+
const fund = async (amount, skipBalanceCheck = false) => {
|
|
77
|
+
const irys = await getIrys();
|
|
78
|
+
let toFund = amountToBigNumber(amount);
|
|
79
|
+
if (!skipBalanceCheck) {
|
|
80
|
+
const balance = await irys.getLoadedBalance();
|
|
81
|
+
toFund = toFund.isGreaterThan(balance) ? toFund.minus(balance) : new BigNumber(0);
|
|
82
|
+
}
|
|
83
|
+
if (toFund.isLessThanOrEqualTo(0)) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
await irys.fund(toFund);
|
|
87
|
+
};
|
|
88
|
+
const withdrawAll = async () => {
|
|
89
|
+
// TODO(loris): Replace with "withdrawAll" when available on Irys.
|
|
90
|
+
const irys = await getIrys();
|
|
91
|
+
const balance = await irys.getLoadedBalance();
|
|
92
|
+
const minimumBalance = new BigNumber(5000);
|
|
93
|
+
if (balance.isLessThan(minimumBalance)) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const balanceToWithdraw = balance.minus(minimumBalance);
|
|
97
|
+
await withdraw(bigNumberToAmount(balanceToWithdraw));
|
|
98
|
+
};
|
|
99
|
+
const withdraw = async amount => {
|
|
100
|
+
const irys = await getIrys();
|
|
101
|
+
try {
|
|
102
|
+
await irys.withdrawBalance(amountToBigNumber(amount));
|
|
103
|
+
} catch (e) {
|
|
104
|
+
throw new IrysWithdrawError(e instanceof Error ? e.message : e.toString());
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
const getIrys = async () => {
|
|
108
|
+
const oldPayer = _irys?.getSigner().publicKey;
|
|
109
|
+
const newPayer = options.payer ?? context.payer;
|
|
110
|
+
if (oldPayer && publicKey(new Uint8Array(oldPayer)) !== newPayer.publicKey) {
|
|
111
|
+
_irys = null;
|
|
112
|
+
}
|
|
113
|
+
if (!_irys) {
|
|
114
|
+
_irys = await initIrys();
|
|
115
|
+
}
|
|
116
|
+
return _irys;
|
|
117
|
+
};
|
|
118
|
+
const initIrys = async () => {
|
|
119
|
+
const currency = 'solana';
|
|
120
|
+
const defaultAddress = context.rpc.getCluster() === 'devnet' ? 'https://devnet.irys.xyz' : 'https://node1.irys.xyz';
|
|
121
|
+
const address = options?.address ?? defaultAddress;
|
|
122
|
+
const irysOptions = {
|
|
123
|
+
timeout: options.timeout,
|
|
124
|
+
providerUrl: options.providerUrl
|
|
125
|
+
};
|
|
126
|
+
const payer = options.payer ?? context.payer;
|
|
127
|
+
|
|
128
|
+
// If in node use node irys, else use web irys.
|
|
129
|
+
const isNode =
|
|
130
|
+
// eslint-disable-next-line no-prototype-builtins
|
|
131
|
+
typeof window === 'undefined' || window.process?.hasOwnProperty('type');
|
|
132
|
+
let irys;
|
|
133
|
+
if (isNode && isKeypairSigner(payer)) irys = await initNodeIrys(address, currency, payer, irysOptions);else {
|
|
134
|
+
irys = await initWebIrys(address, currency, payer, irysOptions);
|
|
135
|
+
}
|
|
136
|
+
try {
|
|
137
|
+
// Check for valid irys node.
|
|
138
|
+
await irys.utils.getBundlerAddress(currency);
|
|
139
|
+
} catch (error) {
|
|
140
|
+
throw new FailedToConnectToIrysAddressError(address, error);
|
|
141
|
+
}
|
|
142
|
+
return irys;
|
|
143
|
+
};
|
|
144
|
+
const initNodeIrys = async (address, currency, keypair, options) => {
|
|
145
|
+
const bPackage = _removeDoubleDefault(await import('@irys/sdk'));
|
|
146
|
+
// eslint-disable-next-line new-cap
|
|
147
|
+
return new bPackage.default({
|
|
148
|
+
url: address,
|
|
149
|
+
token: currency,
|
|
150
|
+
key: keypair.secretKey,
|
|
151
|
+
config: options
|
|
152
|
+
});
|
|
153
|
+
};
|
|
154
|
+
const initWebIrys = async (address, currency, payer, options) => {
|
|
155
|
+
const wallet = {
|
|
156
|
+
publicKey: toWeb3JsPublicKey(payer.publicKey),
|
|
157
|
+
signMessage: message => payer.signMessage(message),
|
|
158
|
+
signTransaction: async web3JsTransaction => toWeb3JsLegacyTransaction(await payer.signTransaction(fromWeb3JsLegacyTransaction(web3JsTransaction))),
|
|
159
|
+
signAllTransactions: async web3JsTransactions => {
|
|
160
|
+
const transactions = web3JsTransactions.map(fromWeb3JsLegacyTransaction);
|
|
161
|
+
const signedTransactions = await payer.signAllTransactions(transactions);
|
|
162
|
+
return signedTransactions.map(toWeb3JsLegacyTransaction);
|
|
163
|
+
},
|
|
164
|
+
sendTransaction: async (web3JsTransaction, connection, options = {}) => {
|
|
165
|
+
const {
|
|
166
|
+
signers: web3JsSigners = [],
|
|
167
|
+
...sendOptions
|
|
168
|
+
} = options;
|
|
169
|
+
const signers = web3JsSigners.map(web3JsSigner => createSignerFromKeypair(context, fromWeb3JsKeypair(Keypair.fromSecretKey(web3JsSigner.secretKey))));
|
|
170
|
+
let transaction = fromWeb3JsLegacyTransaction(web3JsTransaction);
|
|
171
|
+
transaction = await signTransaction(transaction, [payer, ...signers]);
|
|
172
|
+
const signature = await context.rpc.sendTransaction(transaction, {
|
|
173
|
+
...sendOptions,
|
|
174
|
+
preflightCommitment: sendOptions.preflightCommitment
|
|
175
|
+
});
|
|
176
|
+
return base58.deserialize(signature)[0];
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
const bPackage = _removeDoubleDefault(await import('@irys/sdk'));
|
|
180
|
+
const irys = new bPackage.WebIrys({
|
|
181
|
+
url: address,
|
|
182
|
+
token: currency,
|
|
183
|
+
wallet: {
|
|
184
|
+
provider: wallet
|
|
185
|
+
},
|
|
186
|
+
config: options
|
|
187
|
+
});
|
|
188
|
+
try {
|
|
189
|
+
// Try to initiate irys.
|
|
190
|
+
await irys.ready();
|
|
191
|
+
} catch (error) {
|
|
192
|
+
throw new FailedToInitializeIrysError(error);
|
|
193
|
+
}
|
|
194
|
+
return irys;
|
|
195
|
+
};
|
|
196
|
+
return {
|
|
197
|
+
getUploadPriceFromBytes,
|
|
198
|
+
getUploadPrice,
|
|
199
|
+
upload,
|
|
200
|
+
uploadJson,
|
|
201
|
+
getBalance,
|
|
202
|
+
fund,
|
|
203
|
+
withdrawAll,
|
|
204
|
+
withdraw,
|
|
205
|
+
irys: getIrys
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
const isIrysUploader = uploader => 'irys' in uploader && 'getBalance' in uploader && 'fund' in uploader && 'withdrawAll' in uploader;
|
|
209
|
+
const bigNumberToAmount = bigNumber => lamports(bigNumber.decimalPlaces(0).toString());
|
|
210
|
+
const amountToBigNumber = amount => new BigNumber(amount.basisPoints.toString());
|
|
211
|
+
const getGenericFileTagsWithContentType = file => {
|
|
212
|
+
if (!file.contentType) {
|
|
213
|
+
return file.tags;
|
|
214
|
+
}
|
|
215
|
+
return [{
|
|
216
|
+
name: 'Content-Type',
|
|
217
|
+
value: file.contentType
|
|
218
|
+
}, ...file.tags];
|
|
219
|
+
};
|
|
220
|
+
|
|
221
|
+
export { createIrysUploader, isIrysUploader };
|
|
222
|
+
//# sourceMappingURL=createIrysUploader.mjs.map
|