@kaiachain/ethers-ext
Version:
ethers.js extension for kaia blockchain
247 lines (201 loc) • 7.39 kB
Markdown
# Ethers.js Extension for Kaia
Ethers.js Extension for Kaia offers:
- Drop-in replacement to `ethers.Wallet` that handles both Ethereum and Kaia transaction types
involving AccountKey and TxTypes.
- Drop-in replacement to `ethers.providers.JsonRpcProvider` that provides accesses to both Ethereum RPCs and
Kaia-specific RPCs.
- Drop-in replacement to `ethers.Web3Provider` to work with both MetaMask (`window.ethereum`) and Kaikas (`window.klaytn`)
## Note for ethers v6
`@kaiachain/ethers-ext` supports both ethers v5 and v6. However, you need to use the right packages which are specified for each `ethers` version. So ethers v5 must be used with packages from `@kaiachain/ethers-ext/v5` and ethers v6 is only compatible with `@kaiachain/ethers-ext/v6`.
> **_NOTE:_**
> If the import path has no version sub-path (`@kaiachain/ethers-ext`), ethers v5 will be used by default.
> **_NOTE:_**
> @kaiachain/ethers-ext@^1.2.0 recommends node 22 or later if you have issues with ES Module resolution.
- **Don't**: Mixing ethers v6 and ethers-ext for ethers v5
```js
const ethers = require("ethers"); // ethers v6
const { Wallet } = require("@kaiachain/ethers-ext/v5");
const provider = new ethers.JsonRpcProvider(
"https://public-en-kairos.node.kaia.io"
);
const wallet = new Wallet("<private key>", provider);
```
- **Do**: Using with ethers v5
```js
const ethers = require("ethers"); // ethers v5
const { Wallet } = require("@kaiachain/ethers-ext/v5");
const provider = new ethers.providers.JsonRpcProvider(
"https://public-en-kairos.node.kaia.io"
);
const wallet = new Wallet("<private key>", provider);
```
- **Do**: Using with ethers v6
```js
const ethers = require("ethers"); // ethers v6
const { Wallet } = require("@kaiachain/ethers-ext/v6");
const provider = new ethers.JsonRpcProvider(
"https://public-en-kairos.node.kaia.io"
);
const wallet = new Wallet("<private key>", provider);
```
- **Do**: Using ethers-ext only
```js
const { Wallet, JsonRpcProvider } = require("@kaiachain/ethers-ext/v5");
// or
const { Wallet, JsonRpcProvider } = require("@kaiachain/ethers-ext/v6");
const provider = new JsonRpcProvider("https://public-en-kairos.node.kaia.io");
const wallet = new Wallet("<private key>", provider);
```
## Install
### Node.js
- Install
```sh
npm install --save @kaiachain/ethers-ext ethers@5 # or ethers@6
```
- ESM or TypeScript
```ts
import { Wallet, JsonRpcProvider } from "@kaiachain/ethers-ext";
// esm
// v5
import { v5 } from "@kaiachain/ethers-ext";
const { Wallet, JsonRpcProvider } = v5;
// v6
import { v6 } from "@kaiachain/ethers-ext";
const { Wallet, JsonRpcProvider } = v6;
// esm subpath import. If using typescript, add "moduleResolution": "nodenext" to tsconfig.json
// v5
import { Wallet, JsonRpcProvider } from "@kaiachain/ethers-ext/v5";
// v6
import { Wallet, JsonRpcProvider } from "@kaiachain/ethers-ext/v6";
const provider = new JsonRpcProvider("https://public-en-kairos.node.kaia.io");
const wallet = new Wallet("<private key>", provider);
```
- CommonJS
```js
// v5
const { Wallet, JsonRpcProvider } = require("@kaiachain/ethers-ext");
const { Wallet, JsonRpcProvider } = require("@kaiachain/ethers-ext").v5;
const { Wallet, JsonRpcProvider } = require("@kaiachain/ethers-ext/v5");
// v6
const { Wallet, JsonRpcProvider } = require("@kaiachain/ethers-ext").v6;
const { Wallet, JsonRpcProvider } = require("@kaiachain/ethers-ext/v6");
const provider = new JsonRpcProvider("https://public-en-kairos.node.kaia.io");
const wallet = new Wallet("<private key>", provider);
```
### Browser
It is not recommended to use CDNs in production, But you can use below for quick prototyping. using `ethers-ext.buldle.js` for ethers v5 and `ethers-ext.v6.bundle.js` for ethers v6
```html
<script src="https://cdn.jsdelivr.net/npm/@kaiachain/ethers-ext@latest/dist/ethers-ext.bundle.js"></script>
<script>
const provider = new ethers_ext.providers.Web3Provider(window.klaytn);
</script>
```
## Usage
See [example](./example) and [test](./test).
## Class extension design
```mermaid
classDiagram
namespace ethers_v5 {
class ethers_Signer["ethers.Signer"] {
provider
checkTransaction()
populateTransaction()
sendTransaction()
}
class ethers_Wallet["ethers.Wallet"] {
connect()
getAddress()
signMessage()
signTransaction()
static fromEncryptedJson()
static fromEncryptedJsonSync()
}
class ethers_JsonRpcSigner["ethers.JsonRpcSigner"] {
connect()
connectUnchecked()
getAddress()
signMessage()
signTransaction()
sendUncheckedTransaction()
_legacySignMessage()
_signTypedData()
override sendTransaction()
}
class ethers_Provider["ethers.Provider"] {
}
class ethers_BaseProvider["ethers.BaseProvider"] {
}
class ethers_JsonRpcProvider["ethers.JsonRpcProvider"] {
getSigner()
send()
}
class ethers_Web3Provider["ethers.Web3Provider"] {
override send()
}
class ethers_ExternalProvider["ethers.ExternalProvider"] {
isMetaMask
request()
}
}
namespace klaytn_ethers_ext {
class Wallet {
override getAddress()
override checkTransaction()
override populateTransaction()
override signTransaction()
override sendTransaction()
override static fromEncryptedJson()
override static fromEncryptedJsonSync()
signTransactionAsFeePayer()
sendTransactionAsFeePayer()
static fromEncryptedJsonList()
static fromEncryptedJsonListSync()
}
class JsonRpcSigner {
override connectUnchecked()
override getAddress()
override signMessage()
override checkTransaction()
override populateTransaction()
override signTransaction()
override _legacySignMessage()
override _signTypedData()
override sendTransaction()
override sendUncheckedTransaction()
}
class JsonRpcProvider {
admin
debug
governance
klay
net
personal
txpool
override getSigner()
override send()
}
class Web3Provider {
admin
debug
governance
klay
net
personal
txpool
override getSigner()
}
class ExternalProvider {
isKaikas
}
}
ethers_Signer <|-- ethers_Wallet
ethers_Signer <|-- ethers_JsonRpcSigner
ethers_Wallet <|-- Wallet
ethers_JsonRpcSigner <|-- JsonRpcSigner
ethers_Provider <|-- ethers_BaseProvider
ethers_BaseProvider <|-- ethers_JsonRpcProvider
ethers_JsonRpcProvider <|-- ethers_Web3Provider
ethers_JsonRpcProvider <|-- JsonRpcProvider
ethers_Web3Provider <|-- Web3Provider
ethers_ExternalProvider <|-- ExternalProvider
```