Socket
Socket
Sign inDemoInstall

@metamask/providers

Package Overview
Dependencies
Maintainers
12
Versions
25
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@metamask/providers - npm Package Compare versions

Comparing version 14.0.2 to 15.0.0

dist/BaseProvider.mjs

99

CHANGELOG.md
# Changelog
All notable changes to this project will be documented in this file.

@@ -9,15 +10,33 @@

## [15.0.0]
### Added
- **BREAKING:** Add ESM build ([#296](https://github.com/MetaMask/providers/pull/296))
- It's no longer possible to import files from the `dist` folder directly, with the exception of `./dist/StreamProvider`
### Changed
- Bump several MetaMask dependencies ([#304](https://github.com/MetaMask/providers/pull/304))
- Export `RequestArguments` and `ConsoleLike` types ([#302](https://github.com/MetaMask/providers/pull/302))
## [14.0.2]
### Fixed
- Don't send `null` params to underlying provider ([#292](https://github.com/MetaMask/providers/pull/292))
## [14.0.1]
### Fixed
- Don't send `undefined` params to underlying provider ([#290](https://github.com/MetaMask/providers/pull/290))
## [14.0.0]
### Changed
- **BREAKING**: Update to streams3 API ([#288](https://github.com/MetaMask/providers/pull/288))
- Update `extension-port-stream` from `^2.1.1` to `^3.0.0`
- Force subdependency `readable-stream` to `^3.6.2` in resolutions
- Force subdependency `readable-stream` to `^3.6.2` in resolutions
- Update `json-rpc-middleware-stream` from `^4.2.3` to `^5.0.1`

@@ -29,3 +48,5 @@ - Update `@metamask/object-multiplex` from `^1.3.0` to `^2.0.0`

## [13.1.0]
### Added
- Add support for EIP-6963 ([#263](https://github.com/MetaMask/providers/pull/263))

@@ -41,3 +62,5 @@ - `initializeProvider()` params object now accepts an optional `providerInfo` property with a value of [EIP6963ProviderInfo object](https://eips.ethereum.org/EIPS/eip-6963#provider-info)

## [13.0.0]
### Changed
- **BREAKING**: Update `chainId`, `networkVersion`, and `selectedAddress` to be read-only ([#280](https://github.com/MetaMask/providers/pull/280))

@@ -48,3 +71,5 @@ - Log deprecation warning when accessing `chainId`, `networkVersion`, and `selectedAddress` ([#280](https://github.com/MetaMask/providers/pull/280))

## [12.0.0]
### Changed
- **BREAKING**: Replace `eth-rpc-errors`@`^4.0.2` with `@metamask/rpc-errors`@`6.0.0` ([#277](https://github.com/MetaMask/providers/pull/277))

@@ -55,15 +80,23 @@ - **BREAKING**: Replace `json-rpc-engine`@`^6.1.0` with `@metamask/json-rpc-engine`@`7.1.1` ([#277](https://github.com/MetaMask/providers/pull/277))

## [11.1.2]
### Changed
- Update `extension-port-stream` to `^2.1.1` ([#273](https://github.com/MetaMask/providers/pull/273))
## [11.1.1]
### Changed
- Update `fast-deep-equal` ([#258](https://github.com/MetaMask/providers/pull/258))
## [11.1.0]
### Added
- Add warning for callers of `wallet_watchAsset` with ERC721 and ERC1155 token types, that support is currently considered experimental ([#264](https://github.com/MetaMask/providers/pull/264))
## [11.0.0]
### Changed
- **BREAKING**: Minimum Node.js version 16 ([#254](https://github.com/MetaMask/providers/pull/254))

@@ -74,2 +107,3 @@ - Support Flask and Beta in the external extension provider ([#252](https://github.com/MetaMask/providers/pull/252))

### Fixed
- Fix console warning about deprecated `webextension-polyfill-ts` ([#249](https://github.com/MetaMask/providers/pull/249))

@@ -80,15 +114,23 @@ - Prevent `accountsChanged` + `eth_accounts` callback loop ([#248](https://github.com/MetaMask/providers/pull/248))

## [10.2.1]
### Changed
- Update `json-rpc-middleware-stream` ([#234](https://github.com/MetaMask/providers/pull/234))
## [10.2.0]
### Changed
- Update `json-rpc-middleware-stream` ([#230](https://github.com/MetaMask/providers/pull/230))
## [10.1.0]
### Changed
- Update `json-rpc-middleware-stream` ([#228](https://github.com/MetaMask/providers/pull/228))
## [10.0.0]
### Changed
- Retry sending messages to extension when `METAMASK_EXTENSION_STREAM_CONNECT` is received ([#223](https://github.com/MetaMask/providers/pull/223))

@@ -98,7 +140,11 @@ - **BREAKING:** Update minimum Node.js version to v14 ([#225](https://github.com/MetaMask/providers/pull/225))

## [9.1.0]
### Added
- Add deprecation warning for encryption methods ([#218](https://github.com/MetaMask/providers/pull/218))
## [9.0.0]
### Changed
- **BREAKING:** Move stream functionality from `BaseProvider` to new `StreamProvider` ([#209](https://github.com/MetaMask/providers/pull/209))

@@ -109,10 +155,15 @@ - `BaseProvider` is now a transport-agnostic abstract class. `StreamProvider` accepts a stream and relies on MetaMask's internal JSON-RPC API for its behavior. See the `StreamProvider` class for more details.

## [8.1.1] - 2021-05-12
### Changed
- Rename package to `@metamask/providers` ([#168](https://github.com/MetaMask/providers/pull/168))
### Fixed
- Restore `networkChanged` event in `MetaMaskInpageProvider` ([#171](https://github.com/MetaMask/providers/pull/171))
## [8.1.0] - 2021-05-05
### Added
- `BaseProvider`, implementing EIP-1193 without any legacy features ([#144](https://github.com/MetaMask/providers/pull/144))

@@ -122,19 +173,29 @@ - `createExternalExtensionProvider`, from the [extension-provider](https://github.com/MetaMask/extension-provider/) package ([#152](https://github.com/MetaMask/providers/pull/152))

## [8.0.4] - 2021-02-04
### Fixed
- Fix warning on second `currentProvider` access ([#138](https://github.com/MetaMask/providers/pull/138))
## [8.0.3] - 2021-01-20
### Fixed
- Restore 'data' provider event ([#135](https://github.com/MetaMask/providers/pull/135))
## [8.0.2] - 2021-01-12
### Changed
- Reduce `window.web3` shim console noise ([#133](https://github.com/MetaMask/providers/pull/133))
## [8.0.1] - 2020-12-08
### Fixed
- Fix `8.0.0` types ([#127](https://github.com/MetaMask/providers/pull/127))
## [8.0.0] - 2020-12-07
### Added
- Add `logger` parameter to `initializeProvider` ([#116](https://github.com/MetaMask/providers/pull/116))

@@ -146,2 +207,3 @@ - Add `window.web3` shim, `shimWeb3` export ([#113](https://github.com/MetaMask/providers/pull/113), [#115](https://github.com/MetaMask/providers/pull/115))

### Changed
- **BREAKING:** Rename `initProvider` export to `initializeProvider` ([#114](https://github.com/MetaMask/providers/pull/114))

@@ -151,2 +213,3 @@ - **BREAKING:** Replace `ethereum.publicConfigStore` with new set of JSON-RPC notifications ([#109](https://github.com/MetaMask/providers/pull/109))

### Removed
- **BREAKING:** Remove `_metamask.isEnabled` and `_metamask.isApproved` ([#112](https://github.com/MetaMask/providers/pull/112))

@@ -160,2 +223,3 @@ - **BREAKING:** Remove the `chainIdChanged` event ([#111](https://github.com/MetaMask/providers/pull/111))

### Fixed
- Correctly implement `connect` and `disconnect` events ([#120](https://github.com/MetaMask/providers/pull/120))

@@ -174,3 +238,5 @@ - See [EIP-1193](https://eips.ethereum.org/EIPS/eip-1193#connect) for the specification of these events.

## [7.0.0] - 2020-09-08
### Changed
- **BREAKING:** Changed casing of `Metamask` in all exports to `MetaMask`

@@ -180,6 +246,9 @@ - A brand is a brand ¯\\\_(ツ)\_/¯

## [6.3.0] - 2020-09-04
### Added
- Types
### Changed
- `ethereum.networkVersion` and `.chainId` now default to `null` instead of `undefined`

@@ -189,3 +258,5 @@ - Improved JSDoc comments and tags

## [6.2.0] - 2020-08-04
### Added
- Package consumers can now provide a `logger` object to the provider constructor, to override the default logger

@@ -196,7 +267,11 @@ - The default logger is the `console` global

## [6.1.1] - 2020-07-28
### Changed
- Updated dependencies, which produces a smaller bundle size
## [6.1.0] - 2020-07-21
### Changed
- Only emit `data` event for notifications present in `^4.0.0`

@@ -210,2 +285,3 @@ ([#73](https://github.com/MetaMask/providers/pull/73))

### Fixed
- Emit `accountsChanged` event _after_ all related state has been updated

@@ -219,3 +295,5 @@ ([#72](https://github.com/MetaMask/providers/pull/72))

## [6.0.1] - 2020-07-15
### Fixed
- Warning message for the `data` event

@@ -229,3 +307,5 @@ - This deprecated event was added back in `6.0.0`, but the warning message was not defined.

## [6.0.0] - 2020-07-04
### Added
- The `data` event

@@ -236,2 +316,3 @@ - This event was removed in `4.0.0`, as it was thought to only be used internally.

### Changed
- **BREAKING:** Restore the `notification` event value to its pre-`4.0.0` state

@@ -242,7 +323,11 @@ - Prior to `4.0.0` this event was emitted by code in the MetaMask extension.

## [5.2.1] - 2020-06-29
### Changed
- Un-deprecate `isConnected` method.
## [5.2.0] - 2020-06-24
### Changed
- Remove property protections

@@ -254,3 +339,5 @@ - Unless we lock down the entire provide object, which we can't do, a determined consumer can break our provider. Thus, protected properties are pointless.

## [5.1.0] - 2020-06-01
### Changed
- Update `request` `params` type to `unknown[] | object`

@@ -260,3 +347,5 @@ - This is not breaking in practice, since no RPC methods with other `params` values exist.

## [5.0.2] - 2020-05-22
### Changed
- Fix `ethereum.send` return value for certain argument combination

@@ -272,3 +361,5 @@ - Reverted to pre-`4.0.0` state

## [5.0.1] - 2020-05-11
### Changed
- Rename package to [@metamask/inpage-provider](https://www.npmjs.com/package/@metamask/inpage-provider)

@@ -281,3 +372,5 @@ - Prevent overwrite of certain properties on the Provider

## [5.0.0] - 2020-04-22
### Added
- The [most recent EIP 1193 API](https://github.com/ethereum/EIPs/blob/89e373d5d3a62a28f2646830247579f323ef6b40/EIPS/eip-1193.md) ([#30](https://github.com/MetaMask/providers/pull/30))

@@ -291,2 +384,3 @@ - The method `request`

### Changed
- **BREAKING:** Use named instead of default exports ([#31](https://github.com/MetaMask/providers/pull/31))

@@ -303,3 +397,4 @@ - **BREAKING:** `MetaMaskInpage` constructor now takes a `connectionStream` and an

[Unreleased]: https://github.com/MetaMask/providers/compare/v14.0.2...HEAD
[Unreleased]: https://github.com/MetaMask/providers/compare/v15.0.0...HEAD
[15.0.0]: https://github.com/MetaMask/providers/compare/v14.0.2...v15.0.0
[14.0.2]: https://github.com/MetaMask/providers/compare/v14.0.1...v14.0.2

@@ -306,0 +401,0 @@ [14.0.1]: https://github.com/MetaMask/providers/compare/v14.0.0...v14.0.1

366

dist/BaseProvider.js

@@ -1,356 +0,12 @@

"use strict";
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
if (kind === "m") throw new TypeError("Private method is not writable");
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
};
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
var _BaseProvider_chainId, _BaseProvider_selectedAddress;
Object.defineProperty(exports, "__esModule", { value: true });
exports.BaseProvider = void 0;
const json_rpc_engine_1 = require("@metamask/json-rpc-engine");
const rpc_errors_1 = require("@metamask/rpc-errors");
const safe_event_emitter_1 = __importDefault(require("@metamask/safe-event-emitter"));
const fast_deep_equal_1 = __importDefault(require("fast-deep-equal"));
const messages_1 = __importDefault(require("./messages"));
const utils_1 = require("./utils");
/**
* An abstract class implementing the EIP-1193 interface. Implementers must:
*
* 1. At initialization, push a middleware to the internal `_rpcEngine` that
* hands off requests to the server and receives responses in return.
* 2. At initialization, retrieve initial state and call
* {@link BaseProvider._initializeState} **once**.
* 3. Ensure that the provider's state is synchronized with the wallet.
* 4. Ensure that notifications are received and emitted as appropriate.
*/
class BaseProvider extends safe_event_emitter_1.default {
/**
* Create a new instance of the provider.
*
* @param options - An options bag.
* @param options.logger - The logging API to use. Default: `console`.
* @param options.maxEventListeners - The maximum number of event
* listeners. Default: 100.
* @param options.rpcMiddleware - The RPC middleware stack. Default: [].
*/
constructor({ logger = console, maxEventListeners = 100, rpcMiddleware = [], } = {}) {
super();
/**
* The chain ID of the currently connected Ethereum chain.
* See [chainId.network]{@link https://chainid.network} for more information.
*/
_BaseProvider_chainId.set(this, void 0);
/**
* The user's currently selected Ethereum address.
* If null, MetaMask is either locked or the user has not permitted any
* addresses to be viewed.
*/
_BaseProvider_selectedAddress.set(this, void 0);
this._log = logger;
this.setMaxListeners(maxEventListeners);
// Private state
this._state = {
...BaseProvider._defaultState,
};
// Public state
__classPrivateFieldSet(this, _BaseProvider_selectedAddress, null, "f");
__classPrivateFieldSet(this, _BaseProvider_chainId, null, "f");
// Bind functions to prevent consumers from making unbound calls
this._handleAccountsChanged = this._handleAccountsChanged.bind(this);
this._handleConnect = this._handleConnect.bind(this);
this._handleChainChanged = this._handleChainChanged.bind(this);
this._handleDisconnect = this._handleDisconnect.bind(this);
this._handleUnlockStateChanged = this._handleUnlockStateChanged.bind(this);
this._rpcRequest = this._rpcRequest.bind(this);
this.request = this.request.bind(this);
// Handle RPC requests via dapp-side RPC engine.
//
// ATTN: Implementers must push a middleware that hands off requests to
// the server.
const rpcEngine = new json_rpc_engine_1.JsonRpcEngine();
rpcMiddleware.forEach((middleware) => rpcEngine.push(middleware));
this._rpcEngine = rpcEngine;
}
//====================
// Public Properties
//====================
get chainId() {
return __classPrivateFieldGet(this, _BaseProvider_chainId, "f");
}
get selectedAddress() {
return __classPrivateFieldGet(this, _BaseProvider_selectedAddress, "f");
}
//====================
// Public Methods
//====================
/**
* Returns whether the provider can process RPC requests.
*
* @returns Whether the provider can process RPC requests.
*/
isConnected() {
return this._state.isConnected;
}
/**
* Submits an RPC request for the given method, with the given params.
* Resolves with the result of the method call, or rejects on error.
*
* @param args - The RPC request arguments.
* @param args.method - The RPC method name.
* @param args.params - The parameters for the RPC method.
* @returns A Promise that resolves with the result of the RPC method,
* or rejects if an error is encountered.
*/
async request(args) {
if (!args || typeof args !== 'object' || Array.isArray(args)) {
throw rpc_errors_1.rpcErrors.invalidRequest({
message: messages_1.default.errors.invalidRequestArgs(),
data: args,
});
}
const { method, params } = args;
if (typeof method !== 'string' || method.length === 0) {
throw rpc_errors_1.rpcErrors.invalidRequest({
message: messages_1.default.errors.invalidRequestMethod(),
data: args,
});
}
if (params !== undefined &&
!Array.isArray(params) &&
(typeof params !== 'object' || params === null)) {
throw rpc_errors_1.rpcErrors.invalidRequest({
message: messages_1.default.errors.invalidRequestParams(),
data: args,
});
}
const payload = params === undefined || params === null
? {
method,
}
: {
method,
params,
};
return new Promise((resolve, reject) => {
this._rpcRequest(payload, (0, utils_1.getRpcPromiseCallback)(resolve, reject));
});
}
//====================
// Private Methods
//====================
/**
* MUST be called by child classes.
*
* Sets initial state if provided and marks this provider as initialized.
* Throws if called more than once.
*
* Permits the `networkVersion` field in the parameter object for
* compatibility with child classes that use this value.
*
* @param initialState - The provider's initial state.
* @param initialState.accounts - The user's accounts.
* @param initialState.chainId - The chain ID.
* @param initialState.isUnlocked - Whether the user has unlocked MetaMask.
* @param initialState.networkVersion - The network version.
* @fires BaseProvider#_initialized - If `initialState` is defined.
* @fires BaseProvider#connect - If `initialState` is defined.
*/
_initializeState(initialState) {
if (this._state.initialized) {
throw new Error('Provider already initialized.');
}
if (initialState) {
const { accounts, chainId, isUnlocked, networkVersion } = initialState;
// EIP-1193 connect
this._handleConnect(chainId);
this._handleChainChanged({ chainId, networkVersion });
this._handleUnlockStateChanged({ accounts, isUnlocked });
this._handleAccountsChanged(accounts);
}
// Mark provider as initialized regardless of whether initial state was
// retrieved.
this._state.initialized = true;
this.emit('_initialized');
}
/**
* Internal RPC method. Forwards requests to background via the RPC engine.
* Also remap ids inbound and outbound.
*
* @param payload - The RPC request object.
* @param callback - The consumer's callback.
* @returns The result of the RPC request.
*/
_rpcRequest(payload, callback) {
let callbackWrapper = callback;
if (!Array.isArray(payload)) {
if (!payload.jsonrpc) {
payload.jsonrpc = '2.0';
}
if (payload.method === 'eth_accounts' ||
payload.method === 'eth_requestAccounts') {
// handle accounts changing
callbackWrapper = (error, response) => {
this._handleAccountsChanged(response.result ?? [], payload.method === 'eth_accounts');
callback(error, response);
};
}
return this._rpcEngine.handle(payload, callbackWrapper);
}
return this._rpcEngine.handle(payload, callbackWrapper);
}
/**
* When the provider becomes connected, updates internal state and emits
* required events. Idempotent.
*
* @param chainId - The ID of the newly connected chain.
* @fires MetaMaskInpageProvider#connect
*/
_handleConnect(chainId) {
if (!this._state.isConnected) {
this._state.isConnected = true;
this.emit('connect', { chainId });
this._log.debug(messages_1.default.info.connected(chainId));
}
}
/**
* When the provider becomes disconnected, updates internal state and emits
* required events. Idempotent with respect to the isRecoverable parameter.
*
* Error codes per the CloseEvent status codes as required by EIP-1193:
* https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent#Status_codes.
*
* @param isRecoverable - Whether the disconnection is recoverable.
* @param errorMessage - A custom error message.
* @fires BaseProvider#disconnect - If the disconnection is not recoverable.
*/
_handleDisconnect(isRecoverable, errorMessage) {
if (this._state.isConnected ||
(!this._state.isPermanentlyDisconnected && !isRecoverable)) {
this._state.isConnected = false;
let error;
if (isRecoverable) {
error = new rpc_errors_1.JsonRpcError(1013, // Try again later
errorMessage ?? messages_1.default.errors.disconnected());
this._log.debug(error);
}
else {
error = new rpc_errors_1.JsonRpcError(1011, // Internal error
errorMessage ?? messages_1.default.errors.permanentlyDisconnected());
this._log.error(error);
__classPrivateFieldSet(this, _BaseProvider_chainId, null, "f");
this._state.accounts = null;
__classPrivateFieldSet(this, _BaseProvider_selectedAddress, null, "f");
this._state.isUnlocked = false;
this._state.isPermanentlyDisconnected = true;
}
this.emit('disconnect', error);
}
}
/**
* Upon receipt of a new `chainId`, emits the corresponding event and sets
* and sets relevant public state. Does nothing if the given `chainId` is
* equivalent to the existing value.
*
* Permits the `networkVersion` field in the parameter object for
* compatibility with child classes that use this value.
*
* @fires BaseProvider#chainChanged
* @param networkInfo - An object with network info.
* @param networkInfo.chainId - The latest chain ID.
*/
_handleChainChanged({ chainId, } = {}) {
if (!(0, utils_1.isValidChainId)(chainId)) {
this._log.error(messages_1.default.errors.invalidNetworkParams(), { chainId });
return;
}
this._handleConnect(chainId);
if (chainId !== __classPrivateFieldGet(this, _BaseProvider_chainId, "f")) {
__classPrivateFieldSet(this, _BaseProvider_chainId, chainId, "f");
if (this._state.initialized) {
this.emit('chainChanged', __classPrivateFieldGet(this, _BaseProvider_chainId, "f"));
}
}
}
/**
* Called when accounts may have changed. Diffs the new accounts value with
* the current one, updates all state as necessary, and emits the
* accountsChanged event.
*
* @param accounts - The new accounts value.
* @param isEthAccounts - Whether the accounts value was returned by
* a call to eth_accounts.
*/
_handleAccountsChanged(accounts, isEthAccounts = false) {
let _accounts = accounts;
if (!Array.isArray(accounts)) {
this._log.error('MetaMask: Received invalid accounts parameter. Please report this bug.', accounts);
_accounts = [];
}
for (const account of accounts) {
if (typeof account !== 'string') {
this._log.error('MetaMask: Received non-string account. Please report this bug.', accounts);
_accounts = [];
break;
}
}
// emit accountsChanged if anything about the accounts array has changed
if (!(0, fast_deep_equal_1.default)(this._state.accounts, _accounts)) {
// we should always have the correct accounts even before eth_accounts
// returns
if (isEthAccounts && this._state.accounts !== null) {
this._log.error(`MetaMask: 'eth_accounts' unexpectedly updated accounts. Please report this bug.`, _accounts);
}
this._state.accounts = _accounts;
// handle selectedAddress
if (__classPrivateFieldGet(this, _BaseProvider_selectedAddress, "f") !== _accounts[0]) {
__classPrivateFieldSet(this, _BaseProvider_selectedAddress, _accounts[0] || null, "f");
}
// finally, after all state has been updated, emit the event
if (this._state.initialized) {
const _nextAccounts = [..._accounts];
this.emit('accountsChanged', _nextAccounts);
}
}
}
/**
* Upon receipt of a new isUnlocked state, sets relevant public state.
* Calls the accounts changed handler with the received accounts, or an empty
* array.
*
* Does nothing if the received value is equal to the existing value.
* There are no lock/unlock events.
*
* @param opts - Options bag.
* @param opts.accounts - The exposed accounts, if any.
* @param opts.isUnlocked - The latest isUnlocked value.
*/
_handleUnlockStateChanged({ accounts, isUnlocked, } = {}) {
if (typeof isUnlocked !== 'boolean') {
this._log.error('MetaMask: Received invalid isUnlocked parameter. Please report this bug.');
return;
}
if (isUnlocked !== this._state.isUnlocked) {
this._state.isUnlocked = isUnlocked;
this._handleAccountsChanged(accounts ?? []);
}
}
}
exports.BaseProvider = BaseProvider;
_BaseProvider_chainId = new WeakMap(), _BaseProvider_selectedAddress = new WeakMap();
BaseProvider._defaultState = {
accounts: null,
isConnected: false,
isUnlocked: false,
initialized: false,
isPermanentlyDisconnected: false,
};
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
var _chunkA3W22U42js = require('./chunk-A3W22U42.js');
require('./chunk-O5ECOCX2.js');
require('./chunk-6QNVTE4W.js');
require('./chunk-ZOFGBGOM.js');
require('./chunk-4EQNSGSR.js');
require('./chunk-3W5G4CYI.js');
exports.BaseProvider = _chunkA3W22U42js.BaseProvider;
//# sourceMappingURL=BaseProvider.js.map

@@ -1,8 +0,12 @@

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ERC20 = exports.ERC1155 = exports.ERC721 = void 0;
// TOKEN STANDARDS
exports.ERC721 = 'ERC721';
exports.ERC1155 = 'ERC1155';
exports.ERC20 = 'ERC20';
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
var _chunkZOFGBGOMjs = require('./chunk-ZOFGBGOM.js');
require('./chunk-3W5G4CYI.js');
exports.ERC1155 = _chunkZOFGBGOMjs.ERC1155; exports.ERC20 = _chunkZOFGBGOMjs.ERC20; exports.ERC721 = _chunkZOFGBGOMjs.ERC721;
//# sourceMappingURL=constants.js.map

@@ -1,113 +0,10 @@

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.announceProvider = exports.requestProvider = void 0;
const utils_1 = require("@metamask/utils");
/**
* Describes the possible EIP-6963 event names
*/
var EIP6963EventNames;
(function (EIP6963EventNames) {
EIP6963EventNames["Announce"] = "eip6963:announceProvider";
EIP6963EventNames["Request"] = "eip6963:requestProvider";
})(EIP6963EventNames || (EIP6963EventNames = {}));
// https://github.com/thenativeweb/uuidv4/blob/bdcf3a3138bef4fb7c51f389a170666f9012c478/lib/uuidv4.ts#L5
const UUID_V4_REGEX = /(?:^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[a-f0-9]{4}-[a-f0-9]{12}$)|(?:^0{8}-0{4}-0{4}-0{4}-0{12}$)/u;
// https://stackoverflow.com/a/20204811
const FQDN_REGEX = /(?=^.{4,253}$)(^((?!-)[a-zA-Z0-9-]{0,62}[a-zA-Z0-9]\.)+[a-zA-Z]{2,63}$)/u;
/**
* Intended to be used by a dapp. Forwards every announced provider to the
* provided handler by listening for * {@link EIP6963AnnounceProviderEvent},
* and dispatches an {@link EIP6963RequestProviderEvent}.
*
* @param handleProvider - A function that handles an announced provider.
*/
function requestProvider(handleProvider) {
window.addEventListener(EIP6963EventNames.Announce, (event) => {
if (!isValidAnnounceProviderEvent(event)) {
throwErrorEIP6963(`Invalid EIP-6963 AnnounceProviderEvent object received from ${EIP6963EventNames.Announce} event.`);
}
handleProvider(event.detail);
});
window.dispatchEvent(new Event(EIP6963EventNames.Request));
}
exports.requestProvider = requestProvider;
/**
* Intended to be used by a wallet. Announces a provider by dispatching
* an {@link EIP6963AnnounceProviderEvent}, and listening for
* {@link EIP6963RequestProviderEvent} to re-announce.
*
* @throws If the {@link EIP6963ProviderDetail} is invalid.
* @param providerDetail - The {@link EIP6963ProviderDetail} to announce.
* @param providerDetail.info - The {@link EIP6963ProviderInfo} to announce.
* @param providerDetail.provider - The provider to announce.
*/
function announceProvider(providerDetail) {
if (!isValidProviderDetail(providerDetail)) {
throwErrorEIP6963('Invalid EIP-6963 ProviderDetail object.');
}
const { info, provider } = providerDetail;
const _announceProvider = () => window.dispatchEvent(new CustomEvent(EIP6963EventNames.Announce, {
detail: Object.freeze({ info: { ...info }, provider }),
}));
_announceProvider();
window.addEventListener(EIP6963EventNames.Request, (event) => {
if (!isValidRequestProviderEvent(event)) {
throwErrorEIP6963(`Invalid EIP-6963 RequestProviderEvent object received from ${EIP6963EventNames.Request} event.`);
}
_announceProvider();
});
}
exports.announceProvider = announceProvider;
/**
* Validates an {@link EIP6963RequestProviderEvent} object.
*
* @param event - The {@link EIP6963RequestProviderEvent} to validate.
* @returns Whether the {@link EIP6963RequestProviderEvent} is valid.
*/
function isValidRequestProviderEvent(event) {
return event instanceof Event && event.type === EIP6963EventNames.Request;
}
/**
* Validates an {@link EIP6963AnnounceProviderEvent} object.
*
* @param event - The {@link EIP6963AnnounceProviderEvent} to validate.
* @returns Whether the {@link EIP6963AnnounceProviderEvent} is valid.
*/
function isValidAnnounceProviderEvent(event) {
return (event instanceof CustomEvent &&
event.type === EIP6963EventNames.Announce &&
Object.isFrozen(event.detail) &&
isValidProviderDetail(event.detail));
}
/**
* Validates an {@link EIP6963ProviderDetail} object.
*
* @param providerDetail - The {@link EIP6963ProviderDetail} to validate.
* @returns Whether the {@link EIP6963ProviderDetail} is valid.
*/
function isValidProviderDetail(providerDetail) {
if (!(0, utils_1.isObject)(providerDetail) ||
!(0, utils_1.isObject)(providerDetail.info) ||
!(0, utils_1.isObject)(providerDetail.provider)) {
return false;
}
const { info } = providerDetail;
return (typeof info.uuid === 'string' &&
UUID_V4_REGEX.test(info.uuid) &&
typeof info.name === 'string' &&
Boolean(info.name) &&
typeof info.icon === 'string' &&
info.icon.startsWith('data:image') &&
typeof info.rdns === 'string' &&
FQDN_REGEX.test(info.rdns));
}
/**
* Throws an error with link to EIP-6963 specifications.
*
* @param message - The message to include.
* @throws a friendly error with a link to EIP-6963.
*/
function throwErrorEIP6963(message) {
throw new Error(`${message} See https://eips.ethereum.org/EIPS/eip-6963 for requirements.`);
}
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
var _chunkWBB62AKCjs = require('./chunk-WBB62AKC.js');
require('./chunk-3W5G4CYI.js');
exports.announceProvider = _chunkWBB62AKCjs.announceProvider; exports.requestProvider = _chunkWBB62AKCjs.requestProvider;
//# sourceMappingURL=EIP6963.js.map

@@ -1,54 +0,16 @@

"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.createExternalExtensionProvider = void 0;
const detect_browser_1 = require("detect-browser");
const extension_port_stream_1 = __importDefault(require("extension-port-stream"));
const external_extension_config_json_1 = __importDefault(require("./external-extension-config.json"));
const MetaMaskInpageProvider_1 = require("../MetaMaskInpageProvider");
const StreamProvider_1 = require("../StreamProvider");
const utils_1 = require("../utils");
const browser = (0, detect_browser_1.detect)();
/**
* Creates an external extension provider for the given extension type or ID.
*
* @param typeOrId - The extension type or ID.
* @returns The external extension provider.
*/
function createExternalExtensionProvider(typeOrId = 'stable') {
let provider;
try {
const extensionId = getExtensionId(typeOrId);
const metamaskPort = chrome.runtime.connect(extensionId);
const pluginStream = new extension_port_stream_1.default(metamaskPort);
provider = new StreamProvider_1.StreamProvider(pluginStream, {
jsonRpcStreamName: MetaMaskInpageProvider_1.MetaMaskInpageProviderStreamName,
logger: console,
rpcMiddleware: (0, utils_1.getDefaultExternalMiddleware)(console),
});
// This is asynchronous but merely logs an error and does not throw upon
// failure. Previously this just happened as a side-effect in the
// constructor.
// eslint-disable-next-line @typescript-eslint/no-floating-promises
provider.initialize();
}
catch (error) {
console.dir(`MetaMask connect error.`, error);
throw error;
}
return provider;
}
exports.createExternalExtensionProvider = createExternalExtensionProvider;
/**
* Gets the extension ID for the given extension type or ID.
*
* @param typeOrId - The extension type or ID.
* @returns The extension ID.
*/
function getExtensionId(typeOrId) {
const ids = browser?.name === 'firefox' ? external_extension_config_json_1.default.firefoxIds : external_extension_config_json_1.default.chromeIds;
return ids[typeOrId] ?? typeOrId;
}
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
var _chunkKUKZKOBUjs = require('../chunk-KUKZKOBU.js');
require('../chunk-HP7EYLLY.js');
require('../chunk-Q4DN6VYN.js');
require('../chunk-DWR5HIZK.js');
require('../chunk-A3W22U42.js');
require('../chunk-O5ECOCX2.js');
require('../chunk-6QNVTE4W.js');
require('../chunk-ZOFGBGOM.js');
require('../chunk-4EQNSGSR.js');
require('../chunk-3W5G4CYI.js');
exports.createExternalExtensionProvider = _chunkKUKZKOBUjs.createExternalExtensionProvider;
//# sourceMappingURL=createExternalExtensionProvider.js.map

@@ -1,21 +0,43 @@

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.eip6963RequestProvider = exports.eip6963AnnounceProvider = exports.StreamProvider = exports.shimWeb3 = exports.setGlobalProvider = exports.MetaMaskInpageProvider = exports.MetaMaskInpageProviderStreamName = exports.initializeProvider = exports.createExternalExtensionProvider = exports.BaseProvider = void 0;
const BaseProvider_1 = require("./BaseProvider");
Object.defineProperty(exports, "BaseProvider", { enumerable: true, get: function () { return BaseProvider_1.BaseProvider; } });
const EIP6963_1 = require("./EIP6963");
Object.defineProperty(exports, "eip6963AnnounceProvider", { enumerable: true, get: function () { return EIP6963_1.announceProvider; } });
Object.defineProperty(exports, "eip6963RequestProvider", { enumerable: true, get: function () { return EIP6963_1.requestProvider; } });
const createExternalExtensionProvider_1 = require("./extension-provider/createExternalExtensionProvider");
Object.defineProperty(exports, "createExternalExtensionProvider", { enumerable: true, get: function () { return createExternalExtensionProvider_1.createExternalExtensionProvider; } });
const initializeInpageProvider_1 = require("./initializeInpageProvider");
Object.defineProperty(exports, "initializeProvider", { enumerable: true, get: function () { return initializeInpageProvider_1.initializeProvider; } });
Object.defineProperty(exports, "setGlobalProvider", { enumerable: true, get: function () { return initializeInpageProvider_1.setGlobalProvider; } });
const MetaMaskInpageProvider_1 = require("./MetaMaskInpageProvider");
Object.defineProperty(exports, "MetaMaskInpageProvider", { enumerable: true, get: function () { return MetaMaskInpageProvider_1.MetaMaskInpageProvider; } });
Object.defineProperty(exports, "MetaMaskInpageProviderStreamName", { enumerable: true, get: function () { return MetaMaskInpageProvider_1.MetaMaskInpageProviderStreamName; } });
const shimWeb3_1 = require("./shimWeb3");
Object.defineProperty(exports, "shimWeb3", { enumerable: true, get: function () { return shimWeb3_1.shimWeb3; } });
const StreamProvider_1 = require("./StreamProvider");
Object.defineProperty(exports, "StreamProvider", { enumerable: true, get: function () { return StreamProvider_1.StreamProvider; } });
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
var _chunkKUKZKOBUjs = require('./chunk-KUKZKOBU.js');
var _chunkIZY7ABOLjs = require('./chunk-IZY7ABOL.js');
var _chunkDD6YP3BVjs = require('./chunk-DD6YP3BV.js');
var _chunkWBB62AKCjs = require('./chunk-WBB62AKC.js');
var _chunkHP7EYLLYjs = require('./chunk-HP7EYLLY.js');
require('./chunk-Q4DN6VYN.js');
var _chunkDWR5HIZKjs = require('./chunk-DWR5HIZK.js');
var _chunkA3W22U42js = require('./chunk-A3W22U42.js');
require('./chunk-O5ECOCX2.js');
require('./chunk-6QNVTE4W.js');
require('./chunk-ZOFGBGOM.js');
require('./chunk-4EQNSGSR.js');
require('./chunk-3W5G4CYI.js');
exports.BaseProvider = _chunkA3W22U42js.BaseProvider; exports.MetaMaskInpageProvider = _chunkHP7EYLLYjs.MetaMaskInpageProvider; exports.MetaMaskInpageProviderStreamName = _chunkHP7EYLLYjs.MetaMaskInpageProviderStreamName; exports.StreamProvider = _chunkDWR5HIZKjs.StreamProvider; exports.createExternalExtensionProvider = _chunkKUKZKOBUjs.createExternalExtensionProvider; exports.eip6963AnnounceProvider = _chunkWBB62AKCjs.announceProvider; exports.eip6963RequestProvider = _chunkWBB62AKCjs.requestProvider; exports.initializeProvider = _chunkIZY7ABOLjs.initializeProvider; exports.setGlobalProvider = _chunkIZY7ABOLjs.setGlobalProvider; exports.shimWeb3 = _chunkDD6YP3BVjs.shimWeb3;
//# sourceMappingURL=index.js.map

@@ -1,63 +0,20 @@

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.setGlobalProvider = exports.initializeProvider = void 0;
const EIP6963_1 = require("./EIP6963");
const MetaMaskInpageProvider_1 = require("./MetaMaskInpageProvider");
const shimWeb3_1 = require("./shimWeb3");
/**
* Initializes a MetaMaskInpageProvider and (optionally) assigns it as window.ethereum.
*
* @param options - An options bag.
* @param options.connectionStream - A Node.js stream.
* @param options.jsonRpcStreamName - The name of the internal JSON-RPC stream.
* @param options.maxEventListeners - The maximum number of event listeners.
* @param options.providerInfo - The EIP-6963 provider info that should be announced if set.
* @param options.shouldSendMetadata - Whether the provider should send page metadata.
* @param options.shouldSetOnWindow - Whether the provider should be set as window.ethereum.
* @param options.shouldShimWeb3 - Whether a window.web3 shim should be injected.
* @param options.logger - The logging API to use. Default: `console`.
* @returns The initialized provider (whether set or not).
*/
function initializeProvider({ connectionStream, jsonRpcStreamName, logger = console, maxEventListeners = 100, providerInfo, shouldSendMetadata = true, shouldSetOnWindow = true, shouldShimWeb3 = false, }) {
const provider = new MetaMaskInpageProvider_1.MetaMaskInpageProvider(connectionStream, {
jsonRpcStreamName,
logger,
maxEventListeners,
shouldSendMetadata,
});
const proxiedProvider = new Proxy(provider, {
// some common libraries, e.g. web3@1.x, mess with our API
deleteProperty: () => true,
// fix issue with Proxy unable to access private variables from getters
// https://stackoverflow.com/a/73051482
get(target, propName) {
return target[propName];
},
});
if (providerInfo) {
(0, EIP6963_1.announceProvider)({
info: providerInfo,
provider: proxiedProvider,
});
}
if (shouldSetOnWindow) {
setGlobalProvider(proxiedProvider);
}
if (shouldShimWeb3) {
(0, shimWeb3_1.shimWeb3)(proxiedProvider, logger);
}
return proxiedProvider;
}
exports.initializeProvider = initializeProvider;
/**
* Sets the given provider instance as window.ethereum and dispatches the
* 'ethereum#initialized' event on window.
*
* @param providerInstance - The provider instance.
*/
function setGlobalProvider(providerInstance) {
window.ethereum = providerInstance;
window.dispatchEvent(new Event('ethereum#initialized'));
}
exports.setGlobalProvider = setGlobalProvider;
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
var _chunkIZY7ABOLjs = require('./chunk-IZY7ABOL.js');
require('./chunk-DD6YP3BV.js');
require('./chunk-WBB62AKC.js');
require('./chunk-HP7EYLLY.js');
require('./chunk-Q4DN6VYN.js');
require('./chunk-DWR5HIZK.js');
require('./chunk-A3W22U42.js');
require('./chunk-O5ECOCX2.js');
require('./chunk-6QNVTE4W.js');
require('./chunk-ZOFGBGOM.js');
require('./chunk-4EQNSGSR.js');
require('./chunk-3W5G4CYI.js');
exports.initializeProvider = _chunkIZY7ABOLjs.initializeProvider; exports.setGlobalProvider = _chunkIZY7ABOLjs.setGlobalProvider;
//# sourceMappingURL=initializeInpageProvider.js.map

@@ -1,45 +0,8 @@

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const messages = {
errors: {
disconnected: () => 'MetaMask: Disconnected from chain. Attempting to connect.',
permanentlyDisconnected: () => 'MetaMask: Disconnected from MetaMask background. Page reload required.',
sendSiteMetadata: () => `MetaMask: Failed to send site metadata. This is an internal error, please report this bug.`,
unsupportedSync: (method) => `MetaMask: The MetaMask Ethereum provider does not support synchronous methods like ${method} without a callback parameter.`,
invalidDuplexStream: () => 'Must provide a Node.js-style duplex stream.',
invalidNetworkParams: () => 'MetaMask: Received invalid network parameters. Please report this bug.',
invalidRequestArgs: () => `Expected a single, non-array, object argument.`,
invalidRequestMethod: () => `'args.method' must be a non-empty string.`,
invalidRequestParams: () => `'args.params' must be an object or array if provided.`,
invalidLoggerObject: () => `'args.logger' must be an object if provided.`,
invalidLoggerMethod: (method) => `'args.logger' must include required method '${method}'.`,
},
info: {
connected: (chainId) => `MetaMask: Connected to chain with ID "${chainId}".`,
},
warnings: {
// deprecated properties
chainIdDeprecation: `MetaMask: 'ethereum.chainId' is deprecated and may be removed in the future. Please use the 'eth_chainId' RPC method instead.\nFor more information, see: https://github.com/MetaMask/metamask-improvement-proposals/discussions/23`,
networkVersionDeprecation: `MetaMask: 'ethereum.networkVersion' is deprecated and may be removed in the future. Please use the 'net_version' RPC method instead.\nFor more information, see: https://github.com/MetaMask/metamask-improvement-proposals/discussions/23`,
selectedAddressDeprecation: `MetaMask: 'ethereum.selectedAddress' is deprecated and may be removed in the future. Please use the 'eth_accounts' RPC method instead.\nFor more information, see: https://github.com/MetaMask/metamask-improvement-proposals/discussions/23`,
// deprecated methods
enableDeprecation: `MetaMask: 'ethereum.enable()' is deprecated and may be removed in the future. Please use the 'eth_requestAccounts' RPC method instead.\nFor more information, see: https://eips.ethereum.org/EIPS/eip-1102`,
sendDeprecation: `MetaMask: 'ethereum.send(...)' is deprecated and may be removed in the future. Please use 'ethereum.sendAsync(...)' or 'ethereum.request(...)' instead.\nFor more information, see: https://eips.ethereum.org/EIPS/eip-1193`,
// deprecated events
events: {
close: `MetaMask: The event 'close' is deprecated and may be removed in the future. Please use 'disconnect' instead.\nFor more information, see: https://eips.ethereum.org/EIPS/eip-1193#disconnect`,
data: `MetaMask: The event 'data' is deprecated and will be removed in the future. Use 'message' instead.\nFor more information, see: https://eips.ethereum.org/EIPS/eip-1193#message`,
networkChanged: `MetaMask: The event 'networkChanged' is deprecated and may be removed in the future. Use 'chainChanged' instead.\nFor more information, see: https://eips.ethereum.org/EIPS/eip-1193#chainchanged`,
notification: `MetaMask: The event 'notification' is deprecated and may be removed in the future. Use 'message' instead.\nFor more information, see: https://eips.ethereum.org/EIPS/eip-1193#message`,
},
rpc: {
ethDecryptDeprecation: `MetaMask: The RPC method 'eth_decrypt' is deprecated and may be removed in the future.\nFor more information, see: https://medium.com/metamask/metamask-api-method-deprecation-2b0564a84686`,
ethGetEncryptionPublicKeyDeprecation: `MetaMask: The RPC method 'eth_getEncryptionPublicKey' is deprecated and may be removed in the future.\nFor more information, see: https://medium.com/metamask/metamask-api-method-deprecation-2b0564a84686`,
walletWatchAssetNFTExperimental: `MetaMask: The RPC method 'wallet_watchAsset' is experimental for ERC721/ERC1155 assets and may change in the future.\nFor more information, see: https://github.com/MetaMask/metamask-improvement-proposals/blob/main/MIPs/mip-1.md and https://github.com/MetaMask/metamask-improvement-proposals/blob/main/PROCESS-GUIDE.md#proposal-lifecycle`,
},
// misc
experimentalMethods: `MetaMask: 'ethereum._metamask' exposes non-standard, experimental methods. They may be removed or changed without warning.`,
},
};
exports.default = messages;
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
var _chunk4EQNSGSRjs = require('./chunk-4EQNSGSR.js');
require('./chunk-3W5G4CYI.js');
exports.default = _chunk4EQNSGSRjs.messages_default;
//# sourceMappingURL=messages.js.map

@@ -1,352 +0,17 @@

"use strict";
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
if (kind === "m") throw new TypeError("Private method is not writable");
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
};
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
var _MetaMaskInpageProvider_networkVersion;
Object.defineProperty(exports, "__esModule", { value: true });
exports.MetaMaskInpageProvider = exports.MetaMaskInpageProviderStreamName = void 0;
const rpc_errors_1 = require("@metamask/rpc-errors");
const messages_1 = __importDefault(require("./messages"));
const siteMetadata_1 = require("./siteMetadata");
const StreamProvider_1 = require("./StreamProvider");
const utils_1 = require("./utils");
/**
* The name of the stream consumed by {@link MetaMaskInpageProvider}.
*/
exports.MetaMaskInpageProviderStreamName = 'metamask-provider';
class MetaMaskInpageProvider extends StreamProvider_1.AbstractStreamProvider {
/**
* Creates a new `MetaMaskInpageProvider`.
*
* @param connectionStream - A Node.js duplex stream.
* @param options - An options bag.
* @param options.jsonRpcStreamName - The name of the internal JSON-RPC stream.
* Default: `metamask-provider`.
* @param options.logger - The logging API to use. Default: `console`.
* @param options.maxEventListeners - The maximum number of event
* listeners. Default: 100.
* @param options.shouldSendMetadata - Whether the provider should
* send page metadata. Default: `true`.
*/
constructor(connectionStream, { jsonRpcStreamName = exports.MetaMaskInpageProviderStreamName, logger = console, maxEventListeners = 100, shouldSendMetadata, } = {}) {
super(connectionStream, {
jsonRpcStreamName,
logger,
maxEventListeners,
rpcMiddleware: (0, utils_1.getDefaultExternalMiddleware)(logger),
});
this._sentWarnings = {
// properties
chainId: false,
networkVersion: false,
selectedAddress: false,
// methods
enable: false,
experimentalMethods: false,
send: false,
// events
events: {
close: false,
data: false,
networkChanged: false,
notification: false,
},
};
_MetaMaskInpageProvider_networkVersion.set(this, void 0);
// We shouldn't perform asynchronous work in the constructor, but at one
// point we started doing so, and changing this class isn't worth it at
// the time of writing.
// eslint-disable-next-line @typescript-eslint/no-floating-promises
this._initializeStateAsync();
__classPrivateFieldSet(this, _MetaMaskInpageProvider_networkVersion, null, "f");
this.isMetaMask = true;
this._sendSync = this._sendSync.bind(this);
this.enable = this.enable.bind(this);
this.send = this.send.bind(this);
this.sendAsync = this.sendAsync.bind(this);
this._warnOfDeprecation = this._warnOfDeprecation.bind(this);
this._metamask = this._getExperimentalApi();
// handle JSON-RPC notifications
this._jsonRpcConnection.events.on('notification', (payload) => {
const { method } = payload;
if (utils_1.EMITTED_NOTIFICATIONS.includes(method)) {
// deprecated
// emitted here because that was the original order
this.emit('data', payload);
// deprecated
this.emit('notification', payload.params.result);
}
});
// send website metadata
if (shouldSendMetadata) {
if (document.readyState === 'complete') {
// eslint-disable-next-line @typescript-eslint/no-floating-promises
(0, siteMetadata_1.sendSiteMetadata)(this._rpcEngine, this._log);
}
else {
const domContentLoadedHandler = () => {
// eslint-disable-next-line @typescript-eslint/no-floating-promises
(0, siteMetadata_1.sendSiteMetadata)(this._rpcEngine, this._log);
window.removeEventListener('DOMContentLoaded', domContentLoadedHandler);
};
window.addEventListener('DOMContentLoaded', domContentLoadedHandler);
}
}
}
//====================
// Deprecated Properties
//====================
get chainId() {
if (!this._sentWarnings.chainId) {
this._log.warn(messages_1.default.warnings.chainIdDeprecation);
this._sentWarnings.chainId = true;
}
return super.chainId;
}
get networkVersion() {
if (!this._sentWarnings.networkVersion) {
this._log.warn(messages_1.default.warnings.networkVersionDeprecation);
this._sentWarnings.networkVersion = true;
}
return __classPrivateFieldGet(this, _MetaMaskInpageProvider_networkVersion, "f");
}
get selectedAddress() {
if (!this._sentWarnings.selectedAddress) {
this._log.warn(messages_1.default.warnings.selectedAddressDeprecation);
this._sentWarnings.selectedAddress = true;
}
return super.selectedAddress;
}
//====================
// Public Methods
//====================
/**
* Submits an RPC request per the given JSON-RPC request object.
*
* @param payload - The RPC request object.
* @param callback - The callback function.
*/
sendAsync(payload, callback) {
this._rpcRequest(payload, callback);
}
/**
* We override the following event methods so that we can warn consumers
* about deprecated events:
* `addListener`, `on`, `once`, `prependListener`, `prependOnceListener`.
*/
addListener(eventName, listener) {
this._warnOfDeprecation(eventName);
return super.addListener(eventName, listener);
}
on(eventName, listener) {
this._warnOfDeprecation(eventName);
return super.on(eventName, listener);
}
once(eventName, listener) {
this._warnOfDeprecation(eventName);
return super.once(eventName, listener);
}
prependListener(eventName, listener) {
this._warnOfDeprecation(eventName);
return super.prependListener(eventName, listener);
}
prependOnceListener(eventName, listener) {
this._warnOfDeprecation(eventName);
return super.prependOnceListener(eventName, listener);
}
//====================
// Private Methods
//====================
/**
* When the provider becomes disconnected, updates internal state and emits
* required events. Idempotent with respect to the isRecoverable parameter.
*
* Error codes per the CloseEvent status codes as required by EIP-1193:
* https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent#Status_codes.
*
* @param isRecoverable - Whether the disconnection is recoverable.
* @param errorMessage - A custom error message.
* @fires BaseProvider#disconnect - If the disconnection is not recoverable.
*/
_handleDisconnect(isRecoverable, errorMessage) {
super._handleDisconnect(isRecoverable, errorMessage);
if (__classPrivateFieldGet(this, _MetaMaskInpageProvider_networkVersion, "f") && !isRecoverable) {
__classPrivateFieldSet(this, _MetaMaskInpageProvider_networkVersion, null, "f");
}
}
/**
* Warns of deprecation for the given event, if applicable.
*
* @param eventName - The name of the event.
*/
_warnOfDeprecation(eventName) {
// eslint-disable-next-line @typescript-eslint/no-unnecessary-boolean-literal-compare
if (this._sentWarnings?.events[eventName] === false) {
this._log.warn(messages_1.default.warnings.events[eventName]);
this._sentWarnings.events[eventName] = true;
}
}
//====================
// Deprecated Methods
//====================
/**
* Equivalent to: `ethereum.request('eth_requestAccounts')`.
*
* @deprecated Use request({ method: 'eth_requestAccounts' }) instead.
* @returns A promise that resolves to an array of addresses.
*/
async enable() {
if (!this._sentWarnings.enable) {
this._log.warn(messages_1.default.warnings.enableDeprecation);
this._sentWarnings.enable = true;
}
return new Promise((resolve, reject) => {
try {
this._rpcRequest({ method: 'eth_requestAccounts', params: [] }, (0, utils_1.getRpcPromiseCallback)(resolve, reject));
}
catch (error) {
reject(error);
}
});
}
// eslint-disable-next-line @typescript-eslint/promise-function-async
send(methodOrPayload, callbackOrArgs) {
if (!this._sentWarnings.send) {
this._log.warn(messages_1.default.warnings.sendDeprecation);
this._sentWarnings.send = true;
}
if (typeof methodOrPayload === 'string' &&
(!callbackOrArgs || Array.isArray(callbackOrArgs))) {
return new Promise((resolve, reject) => {
try {
this._rpcRequest({ method: methodOrPayload, params: callbackOrArgs }, (0, utils_1.getRpcPromiseCallback)(resolve, reject, false));
}
catch (error) {
reject(error);
}
});
}
else if (methodOrPayload &&
typeof methodOrPayload === 'object' &&
typeof callbackOrArgs === 'function') {
return this._rpcRequest(methodOrPayload, callbackOrArgs);
}
return this._sendSync(methodOrPayload);
}
/**
* Internal backwards compatibility method, used in send.
*
* @param payload - A JSON-RPC request object.
* @returns A JSON-RPC response object.
* @deprecated
*/
_sendSync(payload) {
let result;
switch (payload.method) {
case 'eth_accounts':
result = this.selectedAddress ? [this.selectedAddress] : [];
break;
case 'eth_coinbase':
result = this.selectedAddress ?? null;
break;
case 'eth_uninstallFilter':
this._rpcRequest(payload, utils_1.NOOP);
result = true;
break;
case 'net_version':
result = __classPrivateFieldGet(this, _MetaMaskInpageProvider_networkVersion, "f") ?? null;
break;
default:
throw new Error(messages_1.default.errors.unsupportedSync(payload.method));
}
return {
id: payload.id,
jsonrpc: payload.jsonrpc,
result,
};
}
/**
* Constructor helper.
*
* Gets the experimental _metamask API as Proxy, so that we can warn consumers
* about its experimental nature.
*
* @returns The experimental _metamask API.
*/
_getExperimentalApi() {
return new Proxy({
/**
* Determines if MetaMask is unlocked by the user.
*
* @returns Promise resolving to true if MetaMask is currently unlocked.
*/
isUnlocked: async () => {
if (!this._state.initialized) {
await new Promise((resolve) => {
this.on('_initialized', () => resolve());
});
}
return this._state.isUnlocked;
},
/**
* Make a batch RPC request.
*
* @param requests - The RPC requests to make.
*/
requestBatch: async (requests) => {
if (!Array.isArray(requests)) {
throw rpc_errors_1.rpcErrors.invalidRequest({
message: 'Batch requests must be made with an array of request objects.',
data: requests,
});
}
return new Promise((resolve, reject) => {
this._rpcRequest(requests, (0, utils_1.getRpcPromiseCallback)(resolve, reject));
});
},
}, {
get: (obj, prop, ...args) => {
if (!this._sentWarnings.experimentalMethods) {
this._log.warn(messages_1.default.warnings.experimentalMethods);
this._sentWarnings.experimentalMethods = true;
}
return Reflect.get(obj, prop, ...args);
},
});
}
/**
* Upon receipt of a new chainId and networkVersion, emits corresponding
* events and sets relevant public state. Does nothing if neither the chainId
* nor the networkVersion are different from existing values.
*
* @fires MetamaskInpageProvider#networkChanged
* @param networkInfo - An object with network info.
* @param networkInfo.chainId - The latest chain ID.
* @param networkInfo.networkVersion - The latest network ID.
*/
_handleChainChanged({ chainId, networkVersion, } = {}) {
// This will validate the params and disconnect the provider if the
// networkVersion is 'loading'.
super._handleChainChanged({ chainId, networkVersion });
if (this._state.isConnected && networkVersion !== __classPrivateFieldGet(this, _MetaMaskInpageProvider_networkVersion, "f")) {
__classPrivateFieldSet(this, _MetaMaskInpageProvider_networkVersion, networkVersion, "f");
if (this._state.initialized) {
this.emit('networkChanged', __classPrivateFieldGet(this, _MetaMaskInpageProvider_networkVersion, "f"));
}
}
}
}
exports.MetaMaskInpageProvider = MetaMaskInpageProvider;
_MetaMaskInpageProvider_networkVersion = new WeakMap();
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
var _chunkHP7EYLLYjs = require('./chunk-HP7EYLLY.js');
require('./chunk-Q4DN6VYN.js');
require('./chunk-DWR5HIZK.js');
require('./chunk-A3W22U42.js');
require('./chunk-O5ECOCX2.js');
require('./chunk-6QNVTE4W.js');
require('./chunk-ZOFGBGOM.js');
require('./chunk-4EQNSGSR.js');
require('./chunk-3W5G4CYI.js');
exports.MetaMaskInpageProvider = _chunkHP7EYLLYjs.MetaMaskInpageProvider; exports.MetaMaskInpageProviderStreamName = _chunkHP7EYLLYjs.MetaMaskInpageProviderStreamName;
//# sourceMappingURL=MetaMaskInpageProvider.js.map

@@ -1,41 +0,10 @@

"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.createRpcWarningMiddleware = void 0;
const constants_1 = require("../constants");
const messages_1 = __importDefault(require("../messages"));
/**
* Create JSON-RPC middleware that logs warnings for deprecated RPC methods.
*
* @param log - The logging API to use.
* @returns The JSON-RPC middleware.
*/
function createRpcWarningMiddleware(log) {
const sentWarnings = {
ethDecryptDeprecation: false,
ethGetEncryptionPublicKeyDeprecation: false,
walletWatchAssetNFTExperimental: false,
};
return (req, _res, next) => {
if (!sentWarnings.ethDecryptDeprecation && req.method === 'eth_decrypt') {
log.warn(messages_1.default.warnings.rpc.ethDecryptDeprecation);
sentWarnings.ethDecryptDeprecation = true;
}
else if (!sentWarnings.ethGetEncryptionPublicKeyDeprecation &&
req.method === 'eth_getEncryptionPublicKey') {
log.warn(messages_1.default.warnings.rpc.ethGetEncryptionPublicKeyDeprecation);
sentWarnings.ethGetEncryptionPublicKeyDeprecation = true;
}
else if (!sentWarnings.walletWatchAssetNFTExperimental &&
req.method === 'wallet_watchAsset' &&
[constants_1.ERC721, constants_1.ERC1155].includes(req.params?.type || '')) {
log.warn(messages_1.default.warnings.rpc.walletWatchAssetNFTExperimental);
sentWarnings.walletWatchAssetNFTExperimental = true;
}
next();
};
}
exports.createRpcWarningMiddleware = createRpcWarningMiddleware;
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
var _chunk6QNVTE4Wjs = require('../chunk-6QNVTE4W.js');
require('../chunk-ZOFGBGOM.js');
require('../chunk-4EQNSGSR.js');
require('../chunk-3W5G4CYI.js');
exports.createRpcWarningMiddleware = _chunk6QNVTE4Wjs.createRpcWarningMiddleware;
//# sourceMappingURL=createRpcWarningMiddleware.js.map

@@ -1,56 +0,8 @@

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.shimWeb3 = void 0;
/**
* If no existing window.web3 is found, this function injects a web3 "shim" to
* not break dapps that rely on window.web3.currentProvider.
*
* @param provider - The provider to set as window.web3.currentProvider.
* @param log - The logging API to use.
*/
function shimWeb3(provider, log = console) {
let loggedCurrentProvider = false;
let loggedMissingProperty = false;
if (!window.web3) {
const SHIM_IDENTIFIER = '__isMetaMaskShim__';
let web3Shim = { currentProvider: provider };
Object.defineProperty(web3Shim, SHIM_IDENTIFIER, {
value: true,
enumerable: true,
configurable: false,
writable: false,
});
web3Shim = new Proxy(web3Shim, {
get: (target, property, ...args) => {
if (property === 'currentProvider' && !loggedCurrentProvider) {
loggedCurrentProvider = true;
log.warn('You are accessing the MetaMask window.web3.currentProvider shim. This property is deprecated; use window.ethereum instead. For details, see: https://docs.metamask.io/guide/provider-migration.html#replacing-window-web3');
}
else if (property !== 'currentProvider' &&
property !== SHIM_IDENTIFIER &&
!loggedMissingProperty) {
loggedMissingProperty = true;
log.error(`MetaMask no longer injects web3. For details, see: https://docs.metamask.io/guide/provider-migration.html#replacing-window-web3`);
provider
.request({ method: 'metamask_logWeb3ShimUsage' })
.catch((error) => {
log.debug('MetaMask: Failed to log web3 shim usage.', error);
});
}
return Reflect.get(target, property, ...args);
},
set: (...args) => {
log.warn('You are accessing the MetaMask window.web3 shim. This object is deprecated; use window.ethereum instead. For details, see: https://docs.metamask.io/guide/provider-migration.html#replacing-window-web3');
return Reflect.set(...args);
},
});
Object.defineProperty(window, 'web3', {
value: web3Shim,
enumerable: false,
configurable: true,
writable: true,
});
}
}
exports.shimWeb3 = shimWeb3;
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
var _chunkDD6YP3BVjs = require('./chunk-DD6YP3BV.js');
require('./chunk-3W5G4CYI.js');
exports.shimWeb3 = _chunkDD6YP3BVjs.shimWeb3;
//# sourceMappingURL=shimWeb3.js.map

@@ -1,101 +0,12 @@

"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.sendSiteMetadata = void 0;
const messages_1 = __importDefault(require("./messages"));
const utils_1 = require("./utils");
/**
* Sends site metadata over an RPC request.
*
* @param engine - The JSON RPC Engine to send metadata over.
* @param log - The logging API to use.
*/
async function sendSiteMetadata(engine, log) {
try {
const domainMetadata = await getSiteMetadata();
// call engine.handle directly to avoid normal RPC request handling
engine.handle({
jsonrpc: '2.0',
id: 1,
method: 'metamask_sendDomainMetadata',
params: domainMetadata,
}, utils_1.NOOP);
}
catch (error) {
log.error({
message: messages_1.default.errors.sendSiteMetadata(),
originalError: error,
});
}
}
exports.sendSiteMetadata = sendSiteMetadata;
/**
* Get site metadata.
*
* @returns The site metadata.
*/
async function getSiteMetadata() {
return {
name: getSiteName(window),
icon: await getSiteIcon(window),
};
}
/**
* Extract a name for the site from the DOM.
*
* @param windowObject - The window object to extract the site name from.
* @returns The site name.
*/
function getSiteName(windowObject) {
const { document } = windowObject;
const siteName = document.querySelector('head > meta[property="og:site_name"]');
if (siteName) {
return siteName.content;
}
const metaTitle = document.querySelector('head > meta[name="title"]');
if (metaTitle) {
return metaTitle.content;
}
if (document.title && document.title.length > 0) {
return document.title;
}
return window.location.hostname;
}
/**
* Extract an icon for the site from the DOM.
*
* @param windowObject - The window object to extract the site icon from.
* @returns An icon URL, if one exists.
*/
async function getSiteIcon(windowObject) {
const { document } = windowObject;
const icons = document.querySelectorAll('head > link[rel~="icon"]');
for (const icon of Array.from(icons)) {
if (icon && (await imgExists(icon.href))) {
return icon.href;
}
}
return null;
}
/**
* Return whether the given image URL exists.
*
* @param url - The url of the image.
* @returns Whether the image exists.
*/
async function imgExists(url) {
return new Promise((resolve, reject) => {
try {
const img = document.createElement('img');
img.onload = () => resolve(true);
img.onerror = () => resolve(false);
img.src = url;
}
catch (error) {
reject(error);
}
});
}
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
var _chunkQ4DN6VYNjs = require('./chunk-Q4DN6VYN.js');
require('./chunk-O5ECOCX2.js');
require('./chunk-6QNVTE4W.js');
require('./chunk-ZOFGBGOM.js');
require('./chunk-4EQNSGSR.js');
require('./chunk-3W5G4CYI.js');
exports.sendSiteMetadata = _chunkQ4DN6VYNjs.sendSiteMetadata;
//# sourceMappingURL=siteMetadata.js.map

@@ -1,167 +0,15 @@

"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.StreamProvider = exports.AbstractStreamProvider = void 0;
const object_multiplex_1 = __importDefault(require("@metamask/object-multiplex"));
const is_stream_1 = require("is-stream");
const json_rpc_middleware_stream_1 = require("json-rpc-middleware-stream");
const readable_stream_1 = require("readable-stream");
const BaseProvider_1 = require("./BaseProvider");
const messages_1 = __importDefault(require("./messages"));
const utils_1 = require("./utils");
/**
* An abstract EIP-1193 provider wired to some duplex stream via a
* `json-rpc-middleware-stream` JSON-RPC stream middleware. Implementers must
* call {@link AbstractStreamProvider._initializeStateAsync} after instantiation
* to initialize the provider's state.
*/
class AbstractStreamProvider extends BaseProvider_1.BaseProvider {
/**
* Creates a new AbstractStreamProvider instance.
*
* @param connectionStream - A Node.js duplex stream.
* @param options - An options bag.
* @param options.jsonRpcStreamName - The name of the internal JSON-RPC stream.
* @param options.logger - The logging API to use. Default: `console`.
* @param options.maxEventListeners - The maximum number of event
* listeners. Default: 100.
* @param options.rpcMiddleware - The RPC middleware stack to use.
*/
constructor(connectionStream, { jsonRpcStreamName, logger = console, maxEventListeners = 100, rpcMiddleware = [], }) {
super({ logger, maxEventListeners, rpcMiddleware });
if (!(0, is_stream_1.duplex)(connectionStream)) {
throw new Error(messages_1.default.errors.invalidDuplexStream());
}
// Bind functions to prevent consumers from making unbound calls
this._handleStreamDisconnect = this._handleStreamDisconnect.bind(this);
// Set up connectionStream multiplexing
const mux = new object_multiplex_1.default();
(0, readable_stream_1.pipeline)(connectionStream, mux, connectionStream, this._handleStreamDisconnect.bind(this, 'MetaMask'));
// Set up RPC connection
// Typecast: The type of `Duplex` is incompatible with the type of
// `JsonRpcConnection`.
this._jsonRpcConnection = (0, json_rpc_middleware_stream_1.createStreamMiddleware)({
retryOnMessage: 'METAMASK_EXTENSION_CONNECT_CAN_RETRY',
});
(0, readable_stream_1.pipeline)(this._jsonRpcConnection.stream, mux.createStream(jsonRpcStreamName), this._jsonRpcConnection.stream, this._handleStreamDisconnect.bind(this, 'MetaMask RpcProvider'));
// Wire up the JsonRpcEngine to the JSON-RPC connection stream
this._rpcEngine.push(this._jsonRpcConnection.middleware);
// Handle JSON-RPC notifications
this._jsonRpcConnection.events.on('notification', (payload) => {
const { method, params } = payload;
if (method === 'metamask_accountsChanged') {
this._handleAccountsChanged(params);
}
else if (method === 'metamask_unlockStateChanged') {
this._handleUnlockStateChanged(params);
}
else if (method === 'metamask_chainChanged') {
this._handleChainChanged(params);
}
else if (utils_1.EMITTED_NOTIFICATIONS.includes(method)) {
this.emit('message', {
type: method,
data: params,
});
}
else if (method === 'METAMASK_STREAM_FAILURE') {
connectionStream.destroy(new Error(messages_1.default.errors.permanentlyDisconnected()));
}
});
}
//====================
// Private Methods
//====================
/**
* MUST be called by child classes.
*
* Calls `metamask_getProviderState` and passes the result to
* {@link BaseProvider._initializeState}. Logs an error if getting initial state
* fails. Throws if called after initialization has completed.
*/
async _initializeStateAsync() {
let initialState;
try {
initialState = (await this.request({
method: 'metamask_getProviderState',
}));
}
catch (error) {
this._log.error('MetaMask: Failed to get initial state. Please report this bug.', error);
}
this._initializeState(initialState);
}
/**
* Called when connection is lost to critical streams. Emits an 'error' event
* from the provider with the error message and stack if present.
*
* @param streamName - The name of the stream that disconnected.
* @param error - The error that caused the disconnection.
* @fires BaseProvider#disconnect - If the provider is not already
* disconnected.
*/
// eslint-disable-next-line no-restricted-syntax
_handleStreamDisconnect(streamName, error) {
let warningMsg = `MetaMask: Lost connection to "${streamName}".`;
if (error?.stack) {
warningMsg += `\n${error.stack}`;
}
this._log.warn(warningMsg);
if (this.listenerCount('error') > 0) {
this.emit('error', warningMsg);
}
this._handleDisconnect(false, error ? error.message : undefined);
}
/**
* Upon receipt of a new chainId and networkVersion, emits corresponding
* events and sets relevant public state. This class does not have a
* `networkVersion` property, but we rely on receiving a `networkVersion`
* with the value of `loading` to detect when the network is changing and
* a recoverable `disconnect` even has occurred. Child classes that use the
* `networkVersion` for other purposes must implement additional handling
* therefore.
*
* @fires BaseProvider#chainChanged
* @param networkInfo - An object with network info.
* @param networkInfo.chainId - The latest chain ID.
* @param networkInfo.networkVersion - The latest network ID.
*/
_handleChainChanged({ chainId, networkVersion, } = {}) {
if (!(0, utils_1.isValidChainId)(chainId) || !(0, utils_1.isValidNetworkVersion)(networkVersion)) {
this._log.error(messages_1.default.errors.invalidNetworkParams(), {
chainId,
networkVersion,
});
return;
}
if (networkVersion === 'loading') {
this._handleDisconnect(true);
}
else {
super._handleChainChanged({ chainId });
}
}
}
exports.AbstractStreamProvider = AbstractStreamProvider;
/**
* An EIP-1193 provider wired to some duplex stream via a
* `json-rpc-middleware-stream` JSON-RPC stream middleware. Consumers must
* call {@link StreamProvider.initialize} after instantiation to complete
* initialization.
*/
class StreamProvider extends AbstractStreamProvider {
/**
* MUST be called after instantiation to complete initialization.
*
* Calls `metamask_getProviderState` and passes the result to
* {@link BaseProvider._initializeState}. Logs an error if getting initial state
* fails. Throws if called after initialization has completed.
*/
async initialize() {
return this._initializeStateAsync();
}
}
exports.StreamProvider = StreamProvider;
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
var _chunkDWR5HIZKjs = require('./chunk-DWR5HIZK.js');
require('./chunk-A3W22U42.js');
require('./chunk-O5ECOCX2.js');
require('./chunk-6QNVTE4W.js');
require('./chunk-ZOFGBGOM.js');
require('./chunk-4EQNSGSR.js');
require('./chunk-3W5G4CYI.js');
exports.AbstractStreamProvider = _chunkDWR5HIZKjs.AbstractStreamProvider; exports.StreamProvider = _chunkDWR5HIZKjs.StreamProvider;
//# sourceMappingURL=StreamProvider.js.map

@@ -1,83 +0,21 @@

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.NOOP = exports.isValidNetworkVersion = exports.isValidChainId = exports.getRpcPromiseCallback = exports.getDefaultExternalMiddleware = exports.EMITTED_NOTIFICATIONS = void 0;
const json_rpc_engine_1 = require("@metamask/json-rpc-engine");
const rpc_errors_1 = require("@metamask/rpc-errors");
const createRpcWarningMiddleware_1 = require("./middleware/createRpcWarningMiddleware");
// Constants
exports.EMITTED_NOTIFICATIONS = Object.freeze([
'eth_subscription', // per eth-json-rpc-filters/subscriptionManager
]);
// Utility functions
/**
* Gets the default middleware for external providers, consisting of an ID
* remapping middleware and an error middleware.
*
* @param logger - The logger to use in the error middleware.
* @returns An array of @metamask/json-rpc-engine middleware functions.
*/
const getDefaultExternalMiddleware = (logger = console) => [
(0, json_rpc_engine_1.createIdRemapMiddleware)(),
createErrorMiddleware(logger),
(0, createRpcWarningMiddleware_1.createRpcWarningMiddleware)(logger),
];
exports.getDefaultExternalMiddleware = getDefaultExternalMiddleware;
/**
* A `json-rpc-engine` middleware that logs RPC errors and validates the request
* method.
*
* @param log - The logging API to use.
* @returns A @metamask/json-rpc-engine middleware function.
*/
function createErrorMiddleware(log) {
return (request, response, next) => {
// json-rpc-engine will terminate the request when it notices this error
if (typeof request.method !== 'string' || !request.method) {
response.error = rpc_errors_1.rpcErrors.invalidRequest({
message: `The request 'method' must be a non-empty string.`,
data: request,
});
}
next((done) => {
const { error } = response;
if (!error) {
return done();
}
log.error(`MetaMask - RPC Error: ${error.message}`, error);
return done();
});
};
}
// resolve response.result or response, reject errors
const getRpcPromiseCallback = (resolve, reject, unwrapResult = true) => (error, response) => {
if (error || response.error) {
reject(error || response.error);
}
else {
!unwrapResult || Array.isArray(response)
? resolve(response)
: resolve(response.result);
}
};
exports.getRpcPromiseCallback = getRpcPromiseCallback;
/**
* Checks whether the given chain ID is valid, meaning if it is non-empty,
* '0x'-prefixed string.
*
* @param chainId - The chain ID to validate.
* @returns Whether the given chain ID is valid.
*/
const isValidChainId = (chainId) => Boolean(chainId) && typeof chainId === 'string' && chainId.startsWith('0x');
exports.isValidChainId = isValidChainId;
/**
* Checks whether the given network version is valid, meaning if it is non-empty
* string.
*
* @param networkVersion - The network version to validate.
* @returns Whether the given network version is valid.
*/
const isValidNetworkVersion = (networkVersion) => Boolean(networkVersion) && typeof networkVersion === 'string';
exports.isValidNetworkVersion = isValidNetworkVersion;
const NOOP = () => undefined;
exports.NOOP = NOOP;
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
var _chunkO5ECOCX2js = require('./chunk-O5ECOCX2.js');
require('./chunk-6QNVTE4W.js');
require('./chunk-ZOFGBGOM.js');
require('./chunk-4EQNSGSR.js');
require('./chunk-3W5G4CYI.js');
exports.EMITTED_NOTIFICATIONS = _chunkO5ECOCX2js.EMITTED_NOTIFICATIONS; exports.NOOP = _chunkO5ECOCX2js.NOOP; exports.getDefaultExternalMiddleware = _chunkO5ECOCX2js.getDefaultExternalMiddleware; exports.getRpcPromiseCallback = _chunkO5ECOCX2js.getRpcPromiseCallback; exports.isValidChainId = _chunkO5ECOCX2js.isValidChainId; exports.isValidNetworkVersion = _chunkO5ECOCX2js.isValidNetworkVersion;
//# sourceMappingURL=utils.js.map
{
"name": "@metamask/providers",
"version": "14.0.2",
"description": "A JavaScript Ethereum provider that connects to the wallet over a stream.",
"version": "15.0.0",
"description": "A JavaScript Ethereum provider that connects to the wallet over a stream",
"keywords": [

@@ -20,17 +20,34 @@ "MetaMask",

"author": "MetaMask",
"main": "dist/index.js",
"types": "dist/index.d.ts",
"sideEffects": false,
"exports": {
".": {
"import": "./dist/index.mjs",
"require": "./dist/index.js",
"types": "./dist/types/index.d.ts"
},
"./dist/StreamProvider": {
"import": "./dist/StreamProvider.mjs",
"require": "./dist/StreamProvider.js",
"types": "./dist/types/StreamProvider.d.ts"
},
"./package.json": "./package.json"
},
"main": "./dist/index.js",
"module": "./dist/index.mjs",
"types": "./dist/types/index.d.ts",
"files": [
"dist/"
"dist"
],
"scripts": {
"build": "tsc --project tsconfig.build.json",
"build": "tsup --clean && yarn build:types",
"build:clean": "rimraf dist && yarn build",
"build:docs": "typedoc",
"lint": "yarn lint:eslint && yarn lint:misc --check && yarn lint:dependencies --check && yarn lint:changelog",
"lint:changelog": "auto-changelog validate",
"build:types": "tsc --project tsconfig.build.json",
"lint": "yarn lint:eslint && yarn lint:constraints && yarn lint:misc --check && yarn lint:dependencies --check && yarn lint:changelog",
"lint:changelog": "auto-changelog validate --prettier",
"lint:constraints": "yarn constraints",
"lint:dependencies": "depcheck && yarn dedupe",
"lint:eslint": "eslint . --cache --ext js,ts",
"lint:fix": "yarn lint:eslint --fix && yarn lint:misc --write && yarn lint:dependencies && yarn lint:changelog",
"lint:misc": "prettier '**/*.json' '**/*.md' '!CHANGELOG.md' '**/*.yml' '!.yarnrc.yml' --ignore-path .gitignore --no-error-on-unmatched-pattern",
"lint:fix": "yarn lint:eslint --fix && yarn lint:constraints --fix && yarn lint:misc --write && yarn lint:dependencies && yarn lint:changelog",
"lint:misc": "prettier '**/*.json' '**/*.md' '**/*.yml' '!.yarnrc.yml' --ignore-path .gitignore --no-error-on-unmatched-pattern",
"prepack": "./scripts/prepack.sh",

@@ -44,7 +61,8 @@ "test": "jest && jest-it-up",

"dependencies": {
"@metamask/json-rpc-engine": "^7.1.1",
"@metamask/json-rpc-engine": "^7.3.2",
"@metamask/json-rpc-middleware-stream": "^6.0.2",
"@metamask/object-multiplex": "^2.0.0",
"@metamask/rpc-errors": "^6.0.0",
"@metamask/rpc-errors": "^6.2.1",
"@metamask/safe-event-emitter": "^3.0.0",
"@metamask/utils": "^8.1.0",
"@metamask/utils": "^8.3.0",
"detect-browser": "^5.2.0",

@@ -54,3 +72,2 @@ "extension-port-stream": "^3.0.0",

"is-stream": "^2.0.0",
"json-rpc-middleware-stream": "^5.0.1",
"readable-stream": "^3.6.2",

@@ -60,8 +77,9 @@ "webextension-polyfill": "^0.10.0"

"devDependencies": {
"@lavamoat/allow-scripts": "^2.3.1",
"@metamask/auto-changelog": "^3.1.0",
"@metamask/eslint-config": "^11.0.1",
"@metamask/eslint-config-jest": "^11.0.0",
"@metamask/eslint-config-nodejs": "^11.0.1",
"@metamask/eslint-config-typescript": "^11.0.0",
"@lavamoat/allow-scripts": "^3.0.0",
"@lavamoat/preinstall-always-fail": "^2.0.0",
"@metamask/auto-changelog": "^3.4.3",
"@metamask/eslint-config": "^12.2.0",
"@metamask/eslint-config-jest": "^12.1.0",
"@metamask/eslint-config-nodejs": "^12.1.0",
"@metamask/eslint-config-typescript": "^12.1.0",
"@types/chrome": "^0.0.233",

@@ -75,9 +93,10 @@ "@types/jest": "^28.1.6",

"depcheck": "^1.4.3",
"eslint": "^8.27.0",
"eslint-config-prettier": "^8.5.0",
"eslint": "^8.44.0",
"eslint-config-prettier": "^8.8.0",
"eslint-plugin-import": "^2.26.0",
"eslint-plugin-jest": "^27.1.5",
"eslint-plugin-jsdoc": "^39.6.2",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-jest": "^27.2.2",
"eslint-plugin-jsdoc": "^39.9.1",
"eslint-plugin-n": "^15.7.0",
"eslint-plugin-prettier": "^4.2.1",
"eslint-plugin-promise": "^6.1.1",
"jest": "^28.1.3",

@@ -92,2 +111,3 @@ "jest-chrome": "^0.7.1",

"ts-node": "^10.7.0",
"tsup": "^7.2.0",
"typedoc": "^0.23.15",

@@ -98,3 +118,3 @@ "typescript": "~4.8.4"

"engines": {
"node": ">=16.0.0"
"node": "^18.18 || >=20"
},

@@ -106,4 +126,7 @@ "publishConfig": {

"lavamoat": {
"allowScripts": {}
"allowScripts": {
"@lavamoat/preinstall-always-fail": false,
"tsup>esbuild": true
}
}
}

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc