@interchainjs/injective
Version:
38 lines (37 loc) • 1.98 kB
JavaScript
import { HDPath } from '@interchainjs/types';
import { Secp256k1HDWallet } from '@interchainjs/cosmos';
import * as bip39 from 'bip39';
import { PrivateKey } from '@interchainjs/auth';
import { createInjectiveEthConfig } from '../auth/config';
import deepmerge from 'deepmerge';
/**
* HD Wallet implementation for secp256k1 with Ethereum-style address derivation for Injective
* Extends Secp256k1HDWallet from Cosmos for consistent wallet behavior
* Uses proper HD derivation with configurable derivation paths
* Uses keccak256 hashing for address generation instead of standard Cosmos approach
*/
export class EthSecp256k1HDWallet extends Secp256k1HDWallet {
constructor(privateKeys, config) {
const preset = createInjectiveEthConfig(config?.derivations, config?.privateKeyConfig?.passphrase);
const mergedConfig = deepmerge(preset, config || {});
super(privateKeys, mergedConfig);
}
/**
* Create wallet from mnemonic with derivation paths from config
* @param mnemonic BIP39 mnemonic phrase
* @param config Wallet configuration including derivation paths and address prefix
* @returns Promise<EthSecp256k1HDWallet> instance
*/
static async fromMnemonic(mnemonic, config) {
if (!bip39.validateMnemonic(mnemonic)) {
throw new Error('Invalid mnemonic');
}
const presetInjectiveConfig = createInjectiveEthConfig(config?.derivations, config?.privateKeyConfig?.passphrase);
const walletConfig = deepmerge(presetInjectiveConfig, config || {});
const privateKeyConfig = walletConfig.privateKeyConfig;
const hdPaths = config?.derivations?.map((derivation) => HDPath.fromString(derivation.hdPath)) || [HDPath.eth(0, 0, 0)];
// Use PrivateKey.fromMnemonic to create private keys
const privateKeys = await PrivateKey.fromMnemonic(mnemonic, hdPaths, privateKeyConfig);
return new EthSecp256k1HDWallet(privateKeys, walletConfig);
}
}