@alephium/web3-wallet
Version:
Simple wallets for Alephium
66 lines • 2.98 kB
JavaScript
import * as secp from '@noble/secp256k1';
import { SignerProviderSimple, utils, web3 } from '@alephium/web3';
import { publicKeyFromPrivateKey, addressFromPublicKey, groupOfAddress } from '@alephium/web3';
import { deriveHDWalletPrivateKey, deriveHDWalletPrivateKeyForGroup } from './hd-wallet.js';
export class PrivateKeyWallet extends SignerProviderSimple {
get nodeProvider() {
return this._nodeProvider ?? web3.getCurrentNodeProvider();
}
get explorerProvider() {
return this._explorerProvider ?? web3.getCurrentExplorerProvider();
}
unsafeGetSelectedAccount() {
return Promise.resolve(this.account);
}
getPublicKey(address) {
if (address !== this.address) {
throw Error('The signer address is invalid');
}
return Promise.resolve(this.publicKey);
}
get account() {
return { keyType: this.keyType, address: this.address, publicKey: this.publicKey, group: this.group };
}
constructor({ privateKey, keyType, nodeProvider, explorerProvider }) {
super();
this.keyType = keyType ?? 'default';
this.privateKey = privateKey;
this.publicKey = publicKeyFromPrivateKey(privateKey, this.keyType);
this.address = addressFromPublicKey(this.publicKey, this.keyType);
this.group = groupOfAddress(this.address);
this._nodeProvider = nodeProvider;
this._explorerProvider = explorerProvider;
}
static Random(targetGroup, nodeProvider, keyType) {
const privateKeyBytes = secp.utils.randomPrivateKey();
const wallet = new PrivateKeyWallet({
privateKey: utils.binToHex(privateKeyBytes),
keyType,
nodeProvider
});
if (targetGroup === undefined || wallet.group === targetGroup) {
return wallet;
}
else {
return PrivateKeyWallet.Random(targetGroup, nodeProvider, keyType);
}
}
static FromMnemonic({ mnemonic, keyType, addressIndex, passphrase, nodeProvider }) {
const privateKey = deriveHDWalletPrivateKey(mnemonic, keyType ?? 'default', addressIndex ?? 0, passphrase);
return new PrivateKeyWallet({ privateKey, keyType, nodeProvider });
}
static FromMnemonicWithGroup(mnemonic, targetGroup, keyType, fromAddressIndex, passphrase, nodeProvider) {
const [privateKey] = deriveHDWalletPrivateKeyForGroup(mnemonic, targetGroup, keyType ?? 'default', fromAddressIndex, passphrase);
return new PrivateKeyWallet({ privateKey, keyType, nodeProvider });
}
async signRaw(signerAddress, hexString) {
if (signerAddress !== this.address) {
throw Error('Unmatched signer address');
}
return PrivateKeyWallet.sign(this.privateKey, hexString, this.keyType);
}
static sign(privateKey, hexString, _keyType) {
return utils.sign(hexString, privateKey, _keyType);
}
}
//# sourceMappingURL=privatekey-wallet.js.map