solutions/frontend/js/bundle-polkadot-extension-d...

206 lines
9.6 KiB
JavaScript
Raw Normal View History

2023-12-05 01:31:41 +00:00
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@polkadot/util'), require('@polkadot/util-crypto')) :
typeof define === 'function' && define.amd ? define(['exports', '@polkadot/util', '@polkadot/util-crypto'], factory) :
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.polkadotExtensionDapp = {}, global.polkadotUtil, global.polkadotUtilCrypto));
})(this, (function (exports, util, utilCrypto) { 'use strict';
const global = typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : window;
var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
function documentReadyPromise(creator) {
return new Promise((resolve) => {
if (document.readyState === 'complete') {
resolve(creator());
}
else {
window.addEventListener('load', () => resolve(creator()));
}
});
}
const packageInfo = { name: '@polkadot/extension-dapp', path: (({ url: (typeof document === 'undefined' && typeof location === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : typeof document === 'undefined' ? location.href : (_documentCurrentScript && _documentCurrentScript.src || new URL('bundle-polkadot-extension-dapp.js', document.baseURI).href)) }) && (typeof document === 'undefined' && typeof location === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : typeof document === 'undefined' ? location.href : (_documentCurrentScript && _documentCurrentScript.src || new URL('bundle-polkadot-extension-dapp.js', document.baseURI).href))) ? new URL((typeof document === 'undefined' && typeof location === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : typeof document === 'undefined' ? location.href : (_documentCurrentScript && _documentCurrentScript.src || new URL('bundle-polkadot-extension-dapp.js', document.baseURI).href))).pathname.substring(0, new URL((typeof document === 'undefined' && typeof location === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : typeof document === 'undefined' ? location.href : (_documentCurrentScript && _documentCurrentScript.src || new URL('bundle-polkadot-extension-dapp.js', document.baseURI).href))).pathname.lastIndexOf('/') + 1) : 'auto', type: 'esm', version: '0.46.6' };
const unwrapBytes = util.u8aUnwrapBytes;
const wrapBytes = util.u8aWrapBytes;
const win = window;
win.injectedWeb3 = win.injectedWeb3 || {};
exports.isWeb3Injected = web3IsInjected();
exports.web3EnablePromise = null;
function web3IsInjected() {
return Object
.values(win.injectedWeb3)
.filter(({ connect, enable }) => !!(connect || enable))
.length !== 0;
}
function throwError(method) {
throw new Error(`${method}: web3Enable(originName) needs to be called before ${method}`);
}
function mapAccounts(source, list, ss58Format) {
return list.map(({ address, genesisHash, name, type }) => ({
address: address.length === 42
? address
: utilCrypto.encodeAddress(utilCrypto.decodeAddress(address), ss58Format),
meta: { genesisHash, name, source },
type
}));
}
function filterAccounts(list, genesisHash, type) {
return list.filter((a) => (!a.type || !type || type.includes(a.type)) &&
(!a.genesisHash || !genesisHash || a.genesisHash === genesisHash));
}
function getWindowExtensions(originName) {
return Promise
.all(Object
.entries(win.injectedWeb3)
.map(([nameOrHash, { connect, enable, version }]) => Promise
.resolve()
.then(() => connect
? connect(originName)
: enable
? enable(originName).then((e) => util.objectSpread({ name: nameOrHash, version: version || 'unknown' }, e))
: Promise.reject(new Error('No connect(..) or enable(...) hook found')))
.catch(({ message }) => {
console.error(`Error initializing ${nameOrHash}: ${message}`);
})))
.then((exts) => exts.filter((e) => !!e));
}
async function filterEnable(caller, extensions) {
if (!exports.web3EnablePromise) {
return throwError(caller);
}
const sources = await exports.web3EnablePromise;
return sources.filter(({ name }) => !extensions ||
extensions.includes(name));
}
function web3Enable(originName, compatInits = []) {
if (!originName) {
throw new Error('You must pass a name for your app to the web3Enable function');
}
const initCompat = compatInits.length
? Promise.all(compatInits.map((c) => c().catch(() => false)))
: Promise.resolve([true]);
exports.web3EnablePromise = documentReadyPromise(() => initCompat.then(() => getWindowExtensions(originName)
.then((values) => values.map((e) => {
if (!e.accounts.subscribe) {
e.accounts.subscribe = (cb) => {
e.accounts
.get()
.then(cb)
.catch(console.error);
return () => {
};
};
}
return e;
}))
.catch(() => [])
.then((values) => {
const names = values.map(({ name, version }) => `${name}/${version}`);
exports.isWeb3Injected = web3IsInjected();
console.info(`web3Enable: Enabled ${values.length} extension${values.length !== 1 ? 's' : ''}: ${names.join(', ')}`);
return values;
})));
return exports.web3EnablePromise;
}
async function web3Accounts({ accountType, extensions, genesisHash, ss58Format } = {}) {
const accounts = [];
const sources = await filterEnable('web3Accounts', extensions);
const retrieved = await Promise.all(sources.map(async ({ accounts, name: source }) => {
try {
const list = await accounts.get();
return mapAccounts(source, filterAccounts(list, genesisHash, accountType), ss58Format);
}
catch {
return [];
}
}));
retrieved.forEach((result) => {
accounts.push(...result);
});
console.info(`web3Accounts: Found ${accounts.length} address${accounts.length !== 1 ? 'es' : ''}`);
return accounts;
}
async function web3AccountsSubscribe(cb, { accountType, extensions, genesisHash, ss58Format } = {}) {
const sources = await filterEnable('web3AccountsSubscribe', extensions);
const accounts = {};
const triggerUpdate = () => cb(Object
.entries(accounts)
.reduce((result, [source, list]) => {
result.push(...mapAccounts(source, filterAccounts(list, genesisHash, accountType), ss58Format));
return result;
}, []));
const unsubs = sources.map(({ accounts: { subscribe }, name: source }) => subscribe((result) => {
accounts[source] = result;
try {
const result = triggerUpdate();
if (result && util.isPromise(result)) {
result.catch(console.error);
}
}
catch (error) {
console.error(error);
}
}));
return () => {
unsubs.forEach((unsub) => {
unsub();
});
};
}
async function web3FromSource(source) {
if (!exports.web3EnablePromise) {
return throwError('web3FromSource');
}
const sources = await exports.web3EnablePromise;
const found = source && sources.find(({ name }) => name === source);
if (!found) {
throw new Error(`web3FromSource: Unable to find an injected ${source}`);
}
return found;
}
async function web3FromAddress(address) {
if (!exports.web3EnablePromise) {
return throwError('web3FromAddress');
}
const accounts = await web3Accounts();
let found;
if (address) {
const accountU8a = utilCrypto.decodeAddress(address);
found = accounts.find((account) => util.u8aEq(utilCrypto.decodeAddress(account.address), accountU8a));
}
if (!found) {
throw new Error(`web3FromAddress: Unable to find injected ${address}`);
}
return web3FromSource(found.meta.source);
}
async function web3ListRpcProviders(source) {
const { provider } = await web3FromSource(source);
if (!provider) {
console.warn(`Extension ${source} does not expose any provider`);
return null;
}
return provider.listProviders();
}
async function web3UseRpcProvider(source, key) {
const { provider } = await web3FromSource(source);
if (!provider) {
throw new Error(`Extension ${source} does not expose any provider`);
}
const meta = await provider.startProvider(key);
return { meta, provider };
}
exports.packageInfo = packageInfo;
exports.unwrapBytes = unwrapBytes;
exports.web3Accounts = web3Accounts;
exports.web3AccountsSubscribe = web3AccountsSubscribe;
exports.web3Enable = web3Enable;
exports.web3FromAddress = web3FromAddress;
exports.web3FromSource = web3FromSource;
exports.web3ListRpcProviders = web3ListRpcProviders;
exports.web3UseRpcProvider = web3UseRpcProvider;
exports.wrapBytes = wrapBytes;
}));