Skip to content

Commit

Permalink
integrations/ethers-v6: updated README
Browse files Browse the repository at this point in the history
  • Loading branch information
CedarMist committed Apr 30, 2024
1 parent d7e9863 commit f1ffea9
Show file tree
Hide file tree
Showing 5 changed files with 82 additions and 28 deletions.
14 changes: 2 additions & 12 deletions clients/js/src/calldatapublickey.ts
Original file line number Diff line number Diff line change
Expand Up @@ -156,25 +156,15 @@ export async function fetchRuntimePublicKey(
return fetchRuntimePublicKeyByChainId(chainId);
}

export abstract class AbstractKeyFetcher {
public abstract fetch(
upstream: EIP2696_EthereumProvider,
timeoutMilliseconds?: number,
): Promise<CallDataPublicKey>;
public abstract cipher(upstream: EIP2696_EthereumProvider): Promise<Cipher>;
}

/**
* Retrieves calldata public keys from RPC provider
*/
export class KeyFetcher extends AbstractKeyFetcher {
export class KeyFetcher {
public pubkey?: CallDataPublicKey;

constructor(
readonly timeoutMilliseconds: number = DEFAULT_PUBKEY_CACHE_EXPIRATION_MS,
) {
super();
}
) {}

/**
* Retrieve cached key if possible, otherwise fetch a fresh one
Expand Down
4 changes: 2 additions & 2 deletions contracts/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@ build lint format test::
clean:
rm -rf artifacts cache typechain-types

veryclean:
distclean:
rm -rf node_modules *.tgz

dependencies:
$(MAKE) -C ../../clients/js full

full: clean dependencies all

.PHONY: all clean test veryclean dependencies full
.PHONY: all clean test distclean dependencies full
4 changes: 2 additions & 2 deletions examples/hardhat-boilerplate/frontend/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ all: build
clean:
rm -rf build report.html src/contracts

veryclean: clean
distclean: clean
rm -rf node_modules

report.html: build/bundle-stats.json
Expand All @@ -19,4 +19,4 @@ build:
start eject::
$(NPM) $@

.PHONY: build clean veryclean all
.PHONY: build clean distclean all
4 changes: 3 additions & 1 deletion examples/wagmi-v2/README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
This is a [Vite](https://vitejs.dev) project bootstrapped with [`create-wagmi`](https://github.com/wevm/wagmi/tree/main/packages/create-wagmi).
This is a [Vite](https://vitejs.dev) project bootstrapped with [create-wagmi].

[create-wagmi]: https://github.com/wevm/wagmi/tree/main/packages/create-wagmi

It uses the Sapphire wrapper to encrypt contract deployments, transactions,
view calls & gas estimations using the `injectedWithSapphire()` connector and
Expand Down
84 changes: 73 additions & 11 deletions integrations/ethers-v6/README.md
Original file line number Diff line number Diff line change
@@ -1,24 +1,86 @@
# Sapphire support for Ethers v6
# Sapphire + [Ethers.js v6]
[Ethers.js v6]: https://docs.ethers.org/v6/

[![version][ethers-v6-version]][ethers-v6-npm]
[![size][ethers-v6-size]][ethers-v6-bundlephobia]
![downloads][ethers-v6-downloads]

Integrate your Ethereum-based applications with the privacy features of Oasis
Sapphire when using the Ethers.js library (version 6). This README provides a
guide on how to get started with the `@oasisprotocol/sapphire-ethers-v6` package.

## Example Usage
It may be necessary to use this package to enable automatic end-to-end
encryption between the application and the smart contracts deployed on Sapphire.
It does this by exporting two useful functions:

```ts
import { getDefaultProvider, BrowserProvider, Wallet } from 'ethers';
import { NETWORKS, wrapEthersSigner, wrapEthersSigner } from '@oasisprotocol/sapphire-ethers-v6';
* `wrapEthersProvider` - encrypts `eth_call` and `eth_estimateGas`
* `wrapEthersSigner` - encrypts `eth_signTransaction` + [Wallet] signing

Many browser-based dApps can use the lightweight `@oasisprotocol/sapphire-paratime`
package if they rely entirely on the injected EIP-1193 wallet provider to
communicate with and sign transactions on Sapphire. However, server-side apps,
test suites and dApps using account abstraction (or those which directly use a
Wallet) will need to use this Ethers v6 integration package.

[Wallet]: https://docs.ethers.org/v6/api/wallet/
[ethers-v6-npm]: https://www.npmjs.com/package/@oasisprotocol/sapphire-ethers-v6
[ethers-v6-version]: https://img.shields.io/npm/v/@oasisprotocol/sapphire-ethers-v6
[ethers-v6-size]: https://img.shields.io/bundlephobia/minzip/@oasisprotocol/sapphire-ethers-v6
[ethers-v6-bundlephobia]: https://bundlephobia.com/package/@oasisprotocol/sapphire-ethers-v6
[ethers-v6-downloads]: https://img.shields.io/npm/dm/@oasisprotocol/sapphire-ethers-v6.svg


## Prerequisites

- Node.js (version 18.x or higher)
- An active internet connection, or the `sapphire-localnet` docker container.
- Optionally, an [EIP-1193] compatible Ethereum wallet provider (e.g. [MetaMask], [Rabby])

[EIP-1193]: https://eips.ethereum.org/EIPS/eip-1193
[MetaMask]: https://metamask.io/
[Rabby]: https://rabby.io/

## Usage

Add the Sapphire Ethers.js wrapper to your project:

```
pnpm add '[email protected]' '@oasisprotocol/sapphire-ethers-v6'
```

### In the Browser

To use Oasis Sapphire with Ethers.js in a browser environment:

```typescript
import { BrowserProvider } from 'ethers';
import { wrapEthersSigner } from '@oasisprotocol/sapphire-ethers-v6';

// In the browser via `window.ethereum`.
const signer = wrapEthersSigner(
new BrowserProvider(window.ethereum).getSigner(),
new BrowserProvider(window.ethereum).getSigner()
);
```

### In Node.js

```typescript
import { getDefaultProvider, Wallet } from 'ethers';
import { NETWORKS, wrapEthersSigner } from '@oasisprotocol/sapphire-ethers-v6';

const defaultProvider = getDefaultProvider(NETWORKS.testnet.defaultGateway);
const signer = wrapEthersSigner(new Wallet('YOUR_PRIVATE_KEY').connect(defaultProvider));
```

### Using Just a Provider

Where no transactions require signing the Sapphire wrapper can be used with a [Provider], this will transparently encrypt both gas estimates and view calls (queries).

// In Node via `ethers.Wallet`.
const signer = wrapEthersSigner(new Wallet('0x0a5155afec0de...')
.connect(defaultProvider));
[Provider]: https://docs.ethers.org/v6/api/providers/

// Just a provider, no signer.
```typescript
import { getDefaultProvider } from 'ethers';
import { NETWORKS, wrapEthersProvider } from '@oasisprotocol/sapphire-ethers-v6';

const defaultProvider = getDefaultProvider(NETWORKS.testnet.defaultGateway);
const provider = wrapEthersProvider(defaultProvider);
```

0 comments on commit f1ffea9

Please sign in to comment.