# Provider

Utilities & types for working with [EIP-1193 Providers](https://eips.ethereum.org/EIPS/eip-1193)

## Examples

Below are some examples demonstrating common usages of the `Provider` module:

* [Instantiating External Providers](#instantiating-external-providers)

* [Instantiating with an RPC Transport](#instantiating-with-an-rpc-transport)

* [Instantiating a Provider with Events](#instantiating-a-provider-with-events)

### Instantiating External Providers

External EIP-1193 Providers can be instantiated with [`Provider.from`](/api/Provider/from):

```ts twoslash
import 'ox/window'
import { Provider } from 'ox'

const provider = Provider.from(window.ethereum)

const blockNumber = await provider.request({
  method: 'eth_blockNumber'
})
```

:::tip
There are also libraries that distribute EIP-1193 Provider objects that you can use with `Provider.from`:

* [`@walletconnect/ethereum-provider`](https://www.npmjs.com/package/@walletconnect/ethereum-provider)

* [`@coinbase/wallet-sdk`](https://www.npmjs.com/package/@coinbase/wallet-sdk)

* [`@metamask/detect-provider`](https://www.npmjs.com/package/@metamask/detect-provider)

* [`@safe-global/safe-apps-provider`](https://github.com/safe-global/safe-apps-sdk/tree/main/packages/safe-apps-provider)

* [`mipd`](https://github.com/wevm/mipd): EIP-6963 Multi Injected Providers
:::

### Instantiating with an RPC Transport

Ox's [`RpcTransport`](/api/) is also EIP-1193 compliant, and can be used to instantiate an EIP-1193 Provider. This means you can use any HTTP RPC endpoint as an EIP-1193 Provider.

```ts twoslash
import { Provider, RpcTransport } from 'ox'

const transport = RpcTransport.fromHttp(
  'https://1.rpc.thirdweb.com'
)
const provider = Provider.from(transport)
```

### Instantiating a Provider with Events

Event emitters for EIP-1193 Providers can be created using [`Provider.createEmitter`](/api/Provider/createEmitter):

Useful for Wallets that distribute an EIP-1193 Provider (e.g. webpage injection via `window.ethereum`).

```ts twoslash
// @noErrors
import { Provider, RpcRequest, RpcResponse } from 'ox'

// 1. Instantiate a Provider Emitter.
const emitter = Provider.createEmitter() // [!code ++]

const store = RpcRequest.createStore()

const provider = Provider.from({
  // 2. Pass the Emitter to the Provider.
  ...emitter, // [!code ++]
  async request(args) {
    return await fetch('https://1.rpc.thirdweb.com', {
      body: JSON.stringify(store.prepare(args)),
      method: 'POST',
      headers: {
        'Content-Type': 'application/json'
      }
    })
      .then((res) => res.json())
      .then(RpcResponse.parse)
  }
})

// 3. Emit Provider Events.
emitter.emit('accountsChanged', ['0x...']) // [!code ++]
```

## Functions

| Name                | Description                         |
| ------------------- | ----------------------------------- |
| [`Provider.createEmitter`](/api/Provider/createEmitter) | Creates an EIP-1193 flavored event emitter to be injected onto a Provider. |
| [`Provider.from`](/api/Provider/from) | Instantiates an [EIP-1193](https://eips.ethereum.org/EIPS/eip-1193) [`Provider.Provider`](/api/Provider/types#provider) from an arbitrary [EIP-1193 Provider](https://eips.ethereum.org/EIPS/eip-1193) interface. |
| [`Provider.parseError`](/api/Provider/parseError) | Parses an error into a Provider error instance. |

## Errors

| Name                | Description                         |
| ------------------- | ----------------------------------- |
| [`Provider.AtomicityNotSupportedError`](/api/Provider/errors#provideratomicitynotsupportederror) | The wallet does not support atomic execution but the request requires it. |
| [`Provider.AtomicReadyWalletRejectedUpgradeError`](/api/Provider/errors#provideratomicreadywalletrejectedupgradeerror) | The Wallet can support atomicity after an upgrade, but the user rejected the upgrade. |
| [`Provider.BundleTooLargeError`](/api/Provider/errors#providerbundletoolargeerror) | The call bundle is too large for the Wallet to process. |
| [`Provider.ChainDisconnectedError`](/api/Provider/errors#providerchaindisconnectederror) | The provider is not connected to the requested chain. |
| [`Provider.DisconnectedError`](/api/Provider/errors#providerdisconnectederror) | The provider is disconnected from all chains. |
| [`Provider.DuplicateIdError`](/api/Provider/errors#providerduplicateiderror) | There is already a bundle submitted with this ID. |
| [`Provider.IsUndefinedError`](/api/Provider/errors#providerisundefinederror) | Thrown when the provider is undefined. |
| [`Provider.ProviderRpcError`](/api/Provider/errors#providerproviderrpcerror) |  |
| [`Provider.SwitchChainError`](/api/Provider/errors#providerswitchchainerror) | An error occurred when attempting to switch chain. |
| [`Provider.UnauthorizedError`](/api/Provider/errors#providerunauthorizederror) | The requested method and/or account has not been authorized by the user. |
| [`Provider.UnknownBundleIdError`](/api/Provider/errors#providerunknownbundleiderror) | This bundle id is unknown / has not been submitted. |
| [`Provider.UnsupportedChainIdError`](/api/Provider/errors#providerunsupportedchainiderror) | This Wallet does not support the requested chain ID. |
| [`Provider.UnsupportedMethodError`](/api/Provider/errors#providerunsupportedmethoderror) | The provider does not support the requested method. |
| [`Provider.UnsupportedNonOptionalCapabilityError`](/api/Provider/errors#providerunsupportednonoptionalcapabilityerror) | This Wallet does not support a capability that was not marked as optional. |
| [`Provider.UserRejectedRequestError`](/api/Provider/errors#provideruserrejectedrequesterror) | The user rejected the request. |

## Types

| Name                | Description                         |
| ------------------- | ----------------------------------- |
| [`Provider.ConnectInfo`](/api/Provider/types#providerconnectinfo) |  |
| [`Provider.Emitter`](/api/Provider/types#provideremitter) | Type for an EIP-1193 Provider's event emitter. |
| [`Provider.EventMap`](/api/Provider/types#providereventmap) |  |
| [`Provider.Message`](/api/Provider/types#providermessage) |  |
| [`Provider.Options`](/api/Provider/types#provideroptions) | Options for a [`Provider.Provider`](/api/Provider/types#provider). |
| [`Provider.Provider`](/api/Provider/types#providerprovider) | Root type for an EIP-1193 Provider. |
| [`Provider.RequestFn`](/api/Provider/types#providerrequestfn) | EIP-1193 Provider's `request` function. |
