@okxweb3/coin-kaia
Version:
An kaia SDK for building Web3 wallets and applications.
352 lines (287 loc) • 12.2 kB
Markdown
# /coin-kaia
kaia SDK is used to interact with the Ethereum blockchain or Evm blockchains, it contains various functions can be used to web3 wallet.
## Installation
### Npm
To obtain the latest version, simply require the project using npm :
```shell
npm install /coin-kaia
```
## Usage
### Generate Private Key
```typescript
import { EthWallet } from "@okxweb3/coin-kaia"
let wallet = new EthWallet();
// get random key
let randomPrivateKey = await wallet.getRandomPrivateKey();
// get derived key
let params = {
mnemonic: "stool trumpet fame umbrella bench provide battle toward story fruit lock view",
chainPath: "m/44'/60'/0'/0/1"
}
let derivePrivateKey = await wallet.getDerivedPrivateKey(params);
```
### Private Key Derivation
```typescript
import { EthWallet } from "@okxweb3/coin-kaia"
let wallet = new EthWallet();
let mnemonic = "stool trumpet fame umbrella bench provide battle toward story fruit lock view"
let param = {
mnemonic: mnemonic,
hdPath: "m/44'/60'/0'/0/0"
};
let privateKey = await wallet.getDerivedPrivateKey(param)
```
### Generate Address
```typescript
import { EthWallet } from "@okxweb3/coin-kaia"
let wallet = new EthWallet();
let params = {
privateKey: '0x9fe340274262b4a3bec88e107b09f784d5f8c27bfe6ff178019ed25130a750e1'
}
let newAddress = await wallet.getNewAddress(params);
```
### Verify Address
```typescript
import { EthWallet } from "@okxweb3/coin-kaia"
let wallet = new EthWallet();
let params = {
address: "0x01560cd3bac62cc6d7e6380600d9317363400896"
};
let valid = await wallet.validAddress(60, params);
```
### Sending a Transaction
Use the signTransaction function to get the signed hex to broadcast
#### Example
```javascript
import { EthWallet } from "@okxweb3/coin-kaia"
let wallet = new EthWallet();
let signParams = {
privateKey: '0x49c0722d56d6bac802bdf5c480a17c870d1d18bc4355d8344aa05390eb778280',
data: {
to: "0xee7c7f76795cd0cab3885fee6f2c50def89f48a3",
value: new BigNumber(0),
nonce: 5,
gasPrice: new BigNumber(100 * 1000000000),
gasLimit: new BigNumber(21000),
chainId: 42
}
}
let tx = await wallet.signTransaction(60, signParams)
```
#### Input Params
```typescript
export type EthTxParams ={
from?: string,
to?: string,
value: BigNumber,
nonce: number,
contractAddress?: string // contract address
gasPrice?: BigNumber,
gasLimit: BigNumber,
data?: string;
chainId?: number; // default: 1
// Typed-Transaction features
// null, 1:legacy transaction, 2:eip1559 transaction
type?: number | null;
// EIP-2930; Type 1 & EIP-1559; Type 2
// accessList?: AccessListish;
// EIP-1559; Type 2
maxPriorityFeePerGas?: BigNumber;
maxFeePerGas?: BigNumber;
}
```
#### Support Transaction Types Params
##### Native Coin Transfer
```json
{
"to": "0xee7c7f76795cd0cab3885fee6f2c50def89f48a3",
"value": "0x1",
"nonce": "0x1",
"gasPrice": "0x1",
"gasLimit": "0x5208",
"chainId": "0x2a"
}
```
| Name | Type | Description |
|:-------------------|:--------------------|:-------------------------------------------------------------------|
| `gasLimit` | `string` | The transaction's gas limit. |
| `gasPrice` | `string` | The transaction's gas price. |
| `nonce` | `string` | The transaction's nonce. |
| `to` | `string` | The transaction's the address is sent to. |
| `value` | `string` | The amount of Ether sent. |
| `chainId` | `string` | The id number of the chain, default value is 1, means eth mainnet. |
##### Token Transfer
```json
{
"contractAddress": "0x45Ef35936F0EB8F588Eb9C851C5B1C42B22e61EC",
"to": "0xee7c7f76795cd0cab3885fee6f2c50def89f48a3",
"value": "0x1",
"nonce": "0x8",
"gasPrice": "0x174876e800",
"gasLimit": "0x5208",
"chainId": "0x2a"
}
```
| Name | Type | Description |
|:-------------------|:------------|:-------------------------------------------------------------------|
| `contractAddress` | `string` | The address of a contract. |
| `gasLimit` | `string` | The transaction's gas limit. |
| `gasPrice` | `string` | The transaction's gas price. |
| `nonce` | `string` | The transaction's nonce. |
| `to` | `string` | The transaction's the address is sent to. |
| `value` | `string` | The amount of Ether sent. |
| `chainId` | `string` | The id number of the chain, default value is 1, means eth mainnet. |
##### Data
```json
{
"to": "0xee7c7f76795cd0cab3885fee6f2c50def89f48a3",
"value": "0x0",
"nonce": "0x5",
"gasPrice": "0x174876e800",
"gasLimit": "0x5208",
"chainId": "0x2a",
"data": "0xa9059cbb000000000000000000000000ee7c7f76795cd0cab3885fee6f2c50def89f48a30000000000000000000000000000000000000000000000000000000000002710"
}
```
| Name | Type | Description |
|:------------------|:---------------------|:-------------------------------------------------------------------|
| `gasLimit` | `string` | The transaction's gas limit. |
| `gasPrice` | `string` | The transaction's gas price. |
| `nonce` | `string` | The transaction's nonce. |
| `to` | `string` | The transaction's the address is sent to. |
| `value` | `string` | The amount of Ether sent. |
| `chainId` | `string` | The id number of the chain, default value is 1, means eth mainnet. |
| `data` | `string` | The data of contract interface. |
##### EIP-1559 Transaction
```json
{
"gasPrice": "0xa5c681d00",
"gasLimit": "0xa410",
"to": "0x35b2438d33c7dc449ae9ffbda14f56dc39a4c6b8",
"value": "0xde0b6b3a7640000",
"nonce": "0xb",
"maxFeePerGas": "0x826299e00",
"maxPriorityFeePerGas": "0x77359400",
"chainId": "0x1",
"type": 2
}
```
| Name | Type | Description |
|:-----------------------|:---------|:-------------------------------------------------------------------|
| `gasLimit` | `string` | The transaction's gas limit. |
| `gasPrice` | `string` | The transaction's gas price. |
| `nonce` | `string` | The transaction's nonce. |
| `to` | `string` | The transaction's the address is sent to. |
| `value` | `string` | The amount of Ether sent. |
| `chainId` | `string` | The id number of the chain, default value is 1, means eth mainnet. |
| `data` | `string` | The data of contract interface. |
| `maxFeePerGas` | `string` | The transaction's maxFeePerGas. |
| `maxPriorityFeePerGas` | `string` | The transaction's maxPriorityFeePerGas, means miner tips. |
| `type` | `number` | must be 2, means eip1559 transaction fee |
#### Sign Message
**Different transaction types enum values**
```typescript
enum MessageTypes {
ETH_SIGN = 0,
PERSONAL_SIGN = 1,
TYPE_DATA_V1 = 2,
TYPE_DATA_V3 = 3,
TYPE_DATA_V4 = 4,
}
```
##### ETH_SIGN
```typescript
let signParams: SignTxParams = {
privateKey: privateKey,
data: {
type: MessageTypes.ETH_SIGN,
message: Buffer.from(ethUtil.stripHexPrefix("0x879a053d4800c6354e76c7985a865d2922c82fb5b3f4577b2fe08b998954f2e0"), "hex")
}
}
```
##### PERSONAL_SIGN
```typescript
let signParams: SignTxParams = {
privateKey: privateKey,
data: {
type: MessageTypes.PERSONAL_SIGN,
message: "Example `personal_sign` message"
}
};
```
##### TYPE_DATA_V1
```typescript
let param = {
privateKey: '0x49c0722d56d6bac802bdf5c480a17c870d1d18bc4355d8344aa05390eb778280',
data: {
type: 2,
message: '[{"type":"string","name":"Message","value":"Hi, Alice!"},{"type":"uint32","name":"A number","value":"1337"}]'
}
}
```
##### TYPE_DATA_V3
```typescript
let param = {
privateKey: '0x49c0722d56d6bac802bdf5c480a17c870d1d18bc4355d8344aa05390eb778280',
data: {
type: 3,
message: '{"types":{"EIP712Domain":[{"name":"name","type":"string"},{"name":"version","type":"string"},{"name":"chainId","type":"uint256"},{"name":"verifyingContract","type":"address"}],"Person":[{"name":"name","type":"string"},{"name":"wallet","type":"address"}],"Mail":[{"name":"from","type":"Person"},{"name":"to","type":"Person"},{"name":"contents","type":"string"}]},"primaryType":"Mail","domain":{"name":"Ether Mail","version":"1","chainId":42,"verifyingContract":"0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC"},"message":{"from":{"name":"Cow","wallet":"0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826"},"to":{"name":"Bob","wallet":"0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB"},"contents":"Hello, Bob!"}}'
}
}
```
##### TYPE_DATA_V4
```typescript
let param = {
privateKey: '0x49c0722d56d6bac802bdf5c480a17c870d1d18bc4355d8344aa05390eb778280',
data: {
type: 4,
message: '{"domain":{"chainId":"42","name":"Ether Mail","verifyingContract":"0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC","version":"1"},"message":{"contents":"Hello, Bob!","from":{"name":"Cow","wallets":["0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826","0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF"]},"to":[{"name":"Bob","wallets":["0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB","0xB0BdaBea57B0BDABeA57b0bdABEA57b0BDabEa57","0xB0B0b0b0b0b0B000000000000000000000000000"]}]},"primaryType":"Mail","types":{"EIP712Domain":[{"name":"name","type":"string"},{"name":"version","type":"string"},{"name":"chainId","type":"uint256"},{"name":"verifyingContract","type":"address"}],"Group":[{"name":"name","type":"string"},{"name":"members","type":"Person[]"}],"Mail":[{"name":"from","type":"Person"},{"name":"to","type":"Person[]"},{"name":"contents","type":"string"}],"Person":[{"name":"name","type":"string"},{"name":"wallets","type":"address[]"}]}}'
}
}
```
#### Signing with a hardware wallet
##### Build raw transaction
```typescript
import { EthWallet } from "@okxweb3/coin-kaia"
let wallet = new EthWallet();
let ethTxParams = {
to: "0xee7c7f76795cd0cab3885fee6f2c50def89f48a3",
value: 1,
nonce: 5,
gasPrice: "100000000000",
gasLimit: 21000,
chainId: 42,
};
let signParams = {
data: ethTxParams
};
const rawTx = await wallet.getHardWareRawTransaction(signParams);
console.info(rawTx);
```
**input param**
```typescript
let param = {
data: {
to: "0xee7c7f76795cd0cab3885fee6f2c50def89f48a3",
value: 1,
nonce: 5,
gasPrice: "100000000000",
gasLimit: 21000,
chainId: 42,
}
}
```
##### Build signed transaction
```typescript
import { EthWallet } from "@okxweb3/coin-kaia"
let wallet = new EthWallet();
const hardwareRawTransactionParam = {
raw: rawTx,
r: r,
s: s,
v: v,
}
const signedTx = await wallet.getHardWareSignedTransaction(hardwareRawTransactionParam);
```
## License
[MPL-2.0](<https://tldrlegal.com/license/mozilla-public-license-2.0-(mpl-2)>)