@turnkey/eip-1193-provider
Version:
EIP-1193 Provider for Turnkey.
134 lines (99 loc) • 4.31 kB
Markdown
# Turnkey EIP-1193 Provider
The `/eip-1193-provider` package delivers a Turnkey-compatible Ethereum provider that adheres to the EIP-1193 standards. It's built to integrate seamlessly with a broad spectrum of EVM-compatible chains, offering capabilities like account management, transaction signing, and blockchain interaction. This initial setup is intended for use in conjunction with the [`@turnkey/http`](https://www.npmjs.com/package/@turnkey/http) and [`/webauthn-stamper`](https://www.npmjs.com/package/@turnkey/webauthn-stamper) package, for initial authentication.
## Installation
Before you start using the Turnkey EIP-1193 Provider, make sure to install the necessary packages in your project. This guide assumes you have a Node.js environment ready for development.
Install the required packages using NPM or Yarn:
```bash
npm install /eip-1193-provider @turnkey/http /webauthn-stamper
```
```bash
pnpm add /eip-1193-provider @turnkey/http /webauthn-stamper
```
```bash
yarn add /eip-1193-provider @turnkey/http /webauthn-stamper
```
## Initialization
To set up the Turnkey EIP-1193 Provider, you need to initialize it with your configuration, which includes setting up the Turnkey client with your base URL and stamper.
```ts
import { WebauthnStamper } from "@turnkey/webauthn-stamper";
import { TurnkeyClient } from "@turnkey/http";
const stamper = new WebauthnStamper({
rpId: "example.com",
});
// Initialize the Turnkey HTTP client
const turnkeyClient = new TurnkeyClient(
{ baseUrl: "https://api.turnkey.com" },
stamper,
);
// Get the organizationId of the sub-organization connected to the users account
const { organizationId } = await turnkeyClient.getWhoami({
organizationId: process.env.ORGANIZATION_ID,
});
// Get the user wallets associated with their sub-organization
const { wallets } = await turnkeyClient.getWallets({
organizationId,
});
// Get the walletId to connect to the provider
const walletId = wallets[0].walletId;
const chain = {
chainName: "Ethereum Mainnet",
chainId: "0x1",
rpcUrls: ["https://mainnet.infura.io/v3/your-infura-project-id"],
};
// Initialize the EIP-1193 Provider with your configuration
const provider = await createEIP1193Provider({
walletId,
organizationId,
turnkeyClient,
chains: [
chain,
// Add more chains as needed
],
});
```
## Usage
### `eth_requestAccounts`
Requests the user to provide an Ethereum address for identification, as specified by [EIP-1102](https://eips.ethereum.org/EIPS/eip-1102). This method initiates connectivity with the client and will prompt for passkey authentication.
```javascript
const accounts = await provider.request({ method: "eth_requestAccounts" });
// Logs the array accounts associated with the provided walletId & organization
console.log(accounts);
```
### Authentication Prompt Methods
The following methods also prompt for passkey authentication:
- `personal_sign`: Signs a message with the specified account.
- `eth_sign`: Signs data with the specified account.
- `eth_signTransaction`: Signs a transaction with the specified account.
- `eth_signTypedData_v4`: Signs typed data according to EIP-712 with the specified account.
- `eth_sendTransaction`: Submits a transaction to the network for execution.
## Testing (Local)
1. Copy `.env.example` to `.env`
```bash
$ cp .env.example .env
```
2. Start the Anvil node in one shell:
- Install [Foundry](https://book.getfoundry.sh/getting-started/installation) & Anvil if you haven't done so already
- Add Foundry to your `$PATH`
```bash
$ export PATH="$PATH:$HOME/.foundry/bin"
```
- Source your env e.g.
```bash
$ source ~/.zshrc
```
- Run `foundryup` to install `Anvil`
```bash
$ foundryup
```
- Start Anvil
```
$ pnpm anvil
```
3. Run the tests in a new shell:
```
$ pnpm test
```
## Contributing
We welcome contributions to improve the `Turnkey EIP-1193 Provider`. Please follow the project's [contribution guidelines](https://github.com/tkhq/sdk/blob/ad9071716919d062ba67fd623a01cbd4523ed444/CONTRIBUTING.md).
## License
This project is licensed under [LICENSE](./LICENSE), with detailed information available in the repository.