Security News
Research
Data Theft Repackaged: A Case Study in Malicious Wrapper Packages on npm
The Socket Research Team breaks down a malicious wrapper package that uses obfuscation to harvest credentials and exfiltrate sensitive data.
TypeScript Utilities for EIP-6963: Multi Injected Provider Discovery
npm i mipd
pnpm add mipd
yarn add mipd
The MIPD Store stores the Providers that have been emitted by a Wallet (or other source), and provides a way to subscribe to the store and retrieve the Providers.
import { createStore } from 'mipd'
// Set up a MIPD Store, and request Providers.
const store = createStore()
// Subscribe to the MIPD Store.
store.subscribe(providerDetails => {
console.log(providerDetails)
// => [EIP6963ProviderDetail, EIP6963ProviderDetail, ...]
})
// Retrieve emitted Providers.
store.getProviders()
// => [EIP6963ProviderDetail, EIP6963ProviderDetail, ...]
// Find a Provider Detail.
store.findProvider({ rdns: 'com.example' })
// => EIP6963ProviderDetail | undefined
// Clear the store, including all Providers.
store.clear()
// Reset the store, and emit an event to request Providers.
store.reset()
// Destroy the store, and remove all Providers and event listeners.
store.destroy()
import { useSyncExternalStore } from 'react'
import { createStore } from 'mipd'
const store = createStore()
let providers = store.getProviders()
store.subscribe(providerDetails => (providers = providerDetails))
import { useSyncExternalStore } from 'react'
import { createStore } from 'mipd'
const store = createStore()
function Example() {
const providers = useSyncExternalStore(store.subscribe, store.getProviders)
// ...
}
<script lang="ts">
import { readable } from 'svelte/store'
import { createStore } from 'mipd'
const store = createStore()
const providers = readable(store.getProviders(), store.subscribe)
</script>
<!-- ... -->
<script setup lang="ts">
import { reactive } from 'vue'
import { createStore } from 'mipd'
const store = createStore()
const state = reactive({ providers: store.getProviders() })
store.subscribe(providers => (state.providers = providers))
</script>
<!-- ... -->
Creates a MIPD Store, and emits an event to request Providers from the Wallet(s).
const store = createStore()
Subscribes to the MIPD Store, and returns a function to unsubscribe.
const unsubscribe = store.subscribe(providers => {
console.log(providers)
// => [EIP6963ProviderDetail, EIP6963ProviderDetail, ...]
})
Definition
export type Listener = (
// The updated Providers store.
providerDetails: EIP6963ProviderDetail[],
meta?: {
// The Providers that were added to the store.
added?: EIP6963ProviderDetail[]
// The Providers that were removed from the store.
removed?: EIP6963ProviderDetail[]
},
) => void
function subscribe(
// The listener function.
listener: Listener,
args?: {
// If `true`, the listener will be called immediately with the stored Providers.
emitImmediately?: boolean
}
): () => void // Returns an unsubscribe function.
Returns the current Providers.
const providers = store.getProviders()
// => [EIP6963ProviderDetail, EIP6963ProviderDetail, ...]
Definition
function getProviders(): EIP6963ProviderDetail[]
Finds a provider detail by its RDNS (Reverse Domain Name Identifier).
const provider = store.findProvider({ rdns: 'com.example' })
Definition
function findProvider(args: {
// The RDNS of the Provider Detail to find.
rdns: string
}): EIP6963ProviderDetail | undefined
Clears the store, including all Providers.
store.clear()
Definition
function clear(): void
Resets the store, and emits an event to request Providers from the Wallet(s).
store.reset()
Definition
function reset(): void
Destroys the store, and removes all Providers and event listeners.
store.destroy()
Definition
function destroy(): void
The requestProviders
utility emits an event to request Providers from the Wallet(s). It returns an unsubscribe
function to clean up event listeners.
import { requestProviders } from 'mipd'
let providers = []
const unsubscribe = requestProviders(providerDetail => providers.push(providerDetail))
Definition
function requestProviders(
// The listener.
listener: (providerDetail: EIP6963ProviderDetail) => void
// Unsubscribe function to clean up the listener.
): () => void
The announceProvider
utility emits an event to announce a Provider to the Wallet(s), and also listen for incoming requests. It returns an unsubscribe
function to clean up event listeners.
import { announceProvider } from 'mipd'
const unsubscribe = announceProvider({
info: {
icon: 'data:image/svg+xml,<svg width="32px" height="32px" viewBox="0 0 32 32"/>',
name: 'Example',
rdns: 'com.example',
uuid: '00000000-0000-0000-0000-000000000000'
},
provider: new EIP1193Provider()
})
Definition
function requestProviders(
// The EIP-1193 Provider and Provider Info.
detail: EIP6963ProviderDetail
// Unsubscribe function to clean up the listener.
): () => void
window
PolyfillBy importing the mipd/window
Polyfill, the types on window.addEventListener
will be inferred to include the EIP6963AnnounceProviderEvent
and EIP6963RequestProviderEvent
types.
import 'mipd/window'
window.addEventListener(
'eip6963:announceProvider'
// ^? 'eip6963:announceProvider' | 'eip6963:requestProvider' | 'click' | ...
event => {
// ^? EIP6963AnnounceProviderEvent
event.type
// ^? 'eip6963:announceProvider'
event.detail
// ^? EIP6963ProviderDetail
event.detail.info
// ^? EIP6963ProviderInfo
event.detail.provider
// ^? EIP1193Provider
}
)
window.addEventListener(
'eip6963:requestProvider'
// ^? 'eip6963:announceProvider' | 'eip6963:requestProvider' | 'click' | ...
event => {
// ^? EIP6963RequestProviderEvent
event.type
// ^? 'eip6963:requestProvider'
}
)
Event detail from eip6963:announceProvider
.
import { type EIP6963ProviderDetail } from 'mipd'
export interface EIP6963ProviderDetail<TProvider = Config['EIP1193Provider']> {
info: EIP6963ProviderInfo
provider: TProvider
}
Metadata of the EIP-1193 Provider.
import { type EIP6963ProviderInfo } from 'mipd'
export interface EIP6963ProviderInfo {
icon: string
name: string
rdns?: ... | (string & {})
uuid: string
}
Event type to announce an EIP-1193 Provider.
import { type EIP6963AnnounceProviderEvent } from 'mipd'
export interface EIP6963AnnounceProviderEvent<TProvider = DefaultProvider>
extends CustomEvent<EIP6963ProviderDetail<TProvider>> {
type: 'eip6963:announceProvider'
}
Event type to request EIP-1193 Providers.
import { type EIP6963RequestProviderEvent } from 'mipd'
export interface EIP6963RequestProviderEvent extends Event {
type: 'eip6963:requestProvider'
}
In some cases you might want to tune the global types (e.g. the EIP1193Provider
). To do this, the following configuration options are available:
Type | Default | Description |
---|---|---|
provider | import('viem').EIP1193Provider | The EIP-1193 Provider. |
rdns | 'com.coinbase' | 'com.enkrypt' | 'io.metamask' | 'io.zerion' | (string & {}) | Deterministic identifier for the Provider in the form of an rDNS (Reverse Domain Name Notation) |
Configuration options are customizable using declaration merging. Extend the Register
interface either directly in your code or in a d.ts
file (e.g. eip6963.d.ts
):
import { type EIP1193Provider } from './eip1193-provider'
declare module 'mipd' {
interface Register {
provider: EIP1193Provider
}
}
MIT License
FAQs
TypeScript Utilities for EIP-6963
We found that mipd demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 2 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Research
The Socket Research Team breaks down a malicious wrapper package that uses obfuscation to harvest credentials and exfiltrate sensitive data.
Research
Security News
Attackers used a malicious npm package typosquatting a popular ESLint plugin to steal sensitive data, execute commands, and exploit developer systems.
Security News
The Ultralytics' PyPI Package was compromised four times in one weekend through GitHub Actions cache poisoning and failure to rotate previously compromised API tokens.