71 lines
1.9 KiB
TypeScript
71 lines
1.9 KiB
TypeScript
import { Secp256k1Wallet, StdSignDoc } from '@cosmjs/amino'
|
|
import { fromHex } from '@cosmjs/encoding'
|
|
import { DirectSecp256k1Wallet, makeSignBytes } from '@cosmjs/proto-signing'
|
|
// @ts-expect-error
|
|
import { SignDoc } from '@cosmjs/proto-signing/build/codec/cosmos/tx/v1beta1/tx'
|
|
import MnemonicKeyring from 'mnemonic-keyring'
|
|
|
|
/**
|
|
* Constants
|
|
*/
|
|
const DEFAULT_PATH = "m/44'/118'/0'/0/0"
|
|
|
|
/**
|
|
* Types
|
|
*/
|
|
interface IInitArguments {
|
|
mnemonic?: string
|
|
path?: string
|
|
prefix?: string
|
|
}
|
|
|
|
/**
|
|
* Utility
|
|
*/
|
|
export class Cosmos {
|
|
private keyring: MnemonicKeyring
|
|
private directSigner: DirectSecp256k1Wallet
|
|
private aminoSigner: Secp256k1Wallet
|
|
|
|
constructor(
|
|
keyring: MnemonicKeyring,
|
|
directSigner: DirectSecp256k1Wallet,
|
|
aminoSigner: Secp256k1Wallet
|
|
) {
|
|
this.directSigner = directSigner
|
|
this.keyring = keyring
|
|
this.aminoSigner = aminoSigner
|
|
}
|
|
|
|
static async init({ mnemonic, path, prefix }: IInitArguments) {
|
|
const keyring = await MnemonicKeyring.init({ mnemonic })
|
|
const privateKey = fromHex(keyring.getPrivateKey(path ?? DEFAULT_PATH))
|
|
const chainPrefix = prefix ?? 'cosmos'
|
|
const directSigner = await DirectSecp256k1Wallet.fromKey(privateKey, chainPrefix)
|
|
const aminoSigner = await Secp256k1Wallet.fromKey(privateKey, chainPrefix)
|
|
|
|
return new Cosmos(keyring, directSigner, aminoSigner)
|
|
}
|
|
|
|
public async getAccount(number = 0) {
|
|
const account = await this.directSigner.getAccounts()
|
|
|
|
return account[number]
|
|
}
|
|
|
|
public getMnemonic() {
|
|
return this.keyring.mnemonic
|
|
}
|
|
|
|
public async signDirect(address: string, signDoc: SignDoc) {
|
|
console.log(signDoc)
|
|
const signDocBytes = makeSignBytes(signDoc)
|
|
// @ts-expect-error
|
|
return await this.directSigner.signDirect(address, signDocBytes)
|
|
}
|
|
|
|
public async signAmino(address: string, signDoc: StdSignDoc) {
|
|
return await this.aminoSigner.signAmino(address, signDoc)
|
|
}
|
|
}
|