wallet-connect-web-examples/wallets/react-wallet-v2/src/lib/ElrondLib.ts
2022-10-31 11:21:33 +01:00

91 lines
2.5 KiB
TypeScript

import { Transaction, SignableMessage } from '@elrondnetwork/erdjs'
import { Mnemonic, UserSecretKey, UserWallet, UserSigner } from '@elrondnetwork/erdjs-walletcore'
/**
* Types
*/
interface IInitArgs {
mnemonic?: string
}
/**
* Library
*/
export default class ElrondLib {
wallet: UserWallet
mnemonic: Mnemonic
password: string
constructor(mnemonic: Mnemonic) {
this.mnemonic = mnemonic
this.password = 'password' // test purposes only
const secretKey = mnemonic.deriveKey(0)
const secretKeyHex = secretKey.hex()
let fromHex = UserSecretKey.fromString(secretKeyHex)
this.wallet = new UserWallet(fromHex, this.password)
}
static init({ mnemonic }: IInitArgs) {
const mnemonicObj = mnemonic ? Mnemonic.fromString(mnemonic) : Mnemonic.generate()
return new ElrondLib(mnemonicObj)
}
getMnemonic() {
const secretKey = this.mnemonic.getWords().join(' ')
return secretKey
}
getAddress() {
const secretKey = UserWallet.decryptSecretKey(this.wallet.toJSON(), this.password)
const address = secretKey.generatePublicKey().toAddress().bech32()
return address
}
async signMessage(message: string) {
const secretKey = UserWallet.decryptSecretKey(this.wallet.toJSON(), this.password)
const secretKeyHex = secretKey.hex()
const signMessage = new SignableMessage({
message: Buffer.from(message)
})
const signer = new UserSigner(UserSecretKey.fromString(secretKeyHex))
await signer.sign(signMessage)
return { signature: signMessage.signature.hex() }
}
async signTransaction(transaction: any) {
const secretKey = UserWallet.decryptSecretKey(this.wallet.toJSON(), this.password)
const secretKeyHex = secretKey.hex()
const signTransaction = Transaction.fromPlainObject(transaction)
const signer = new UserSigner(UserSecretKey.fromString(secretKeyHex))
await signer.sign(signTransaction)
return { signature: signTransaction.getSignature().hex() }
}
async signTransactions(transactions: any[]) {
const secretKey = UserWallet.decryptSecretKey(this.wallet.toJSON(), this.password)
const secretKeyHex = secretKey.hex()
const signatures = await Promise.all(
transactions.map(async (transaction: any): Promise<any> => {
const signTransaction = Transaction.fromPlainObject(transaction)
const signer = new UserSigner(UserSecretKey.fromString(secretKeyHex))
await signer.sign(signTransaction)
return { signature: signTransaction.getSignature().hex() }
})
)
return { signatures }
}
}