2021-12-25 14:39:47 +01:00
|
|
|
/*
|
|
|
|
Copyright 2017-2018 @ irontiga and vbcs (original developer)
|
|
|
|
*/
|
2024-05-10 18:00:47 +02:00
|
|
|
import Base58 from './deps/Base58'
|
|
|
|
import { Sha256, Sha512 } from 'asmcrypto.js'
|
|
|
|
import nacl from './deps/nacl-fast'
|
|
|
|
import utils from './deps/utils'
|
|
|
|
import { generateSaveWalletData } from './storeWallet'
|
|
|
|
import publicKeyToAddress from './wallet/publicKeyToAddress'
|
2023-01-13 09:52:14 +01:00
|
|
|
import AltcoinHDWallet from "./bitcoin/AltcoinHDWallet"
|
2021-12-25 14:39:47 +01:00
|
|
|
|
|
|
|
export default class PhraseWallet {
|
2023-01-13 09:52:14 +01:00
|
|
|
constructor(seed, walletVersion) {
|
|
|
|
|
|
|
|
this._walletVersion = walletVersion || 2
|
|
|
|
this.seed = seed
|
|
|
|
|
|
|
|
this.savedSeedData = {}
|
|
|
|
this.hasBeenSaved = false
|
|
|
|
}
|
|
|
|
|
|
|
|
set seed(seed) {
|
|
|
|
this._byteSeed = seed
|
|
|
|
this._base58Seed = Base58.encode(seed)
|
|
|
|
|
|
|
|
this._addresses = []
|
|
|
|
|
|
|
|
this.genAddress(0)
|
|
|
|
}
|
|
|
|
|
|
|
|
getAddress(nonce) {
|
|
|
|
return this._addresses[nonce]
|
|
|
|
}
|
|
|
|
|
|
|
|
get addresses() {
|
|
|
|
return this._addresses
|
|
|
|
}
|
|
|
|
|
|
|
|
get addressIDs() {
|
|
|
|
return this._addresses.map(addr => {
|
|
|
|
return addr.address
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
get seed() {
|
|
|
|
return this._byteSeed
|
|
|
|
}
|
|
|
|
|
|
|
|
addressExists(nonce) {
|
|
|
|
return this._addresses[nonce] != undefined
|
|
|
|
}
|
|
|
|
|
|
|
|
_genAddressSeed(seed) {
|
|
|
|
let newSeed = new Sha512().process(seed).finish().result
|
|
|
|
newSeed = new Sha512().process(utils.appendBuffer(newSeed, seed)).finish().result
|
|
|
|
return newSeed
|
|
|
|
}
|
|
|
|
|
|
|
|
genAddress(nonce) {
|
|
|
|
if (nonce >= this._addresses.length) {
|
|
|
|
this._addresses.length = nonce + 1
|
|
|
|
}
|
|
|
|
|
|
|
|
if (this.addressExists(nonce)) {
|
|
|
|
return this.addresses[nonce]
|
|
|
|
}
|
|
|
|
|
|
|
|
const nonceBytes = utils.int32ToBytes(nonce)
|
|
|
|
|
|
|
|
let addrSeed = new Uint8Array()
|
|
|
|
addrSeed = utils.appendBuffer(addrSeed, nonceBytes)
|
|
|
|
addrSeed = utils.appendBuffer(addrSeed, this._byteSeed)
|
|
|
|
addrSeed = utils.appendBuffer(addrSeed, nonceBytes)
|
|
|
|
|
|
|
|
if (this._walletVersion == 1) {
|
|
|
|
addrSeed = new Sha256().process(
|
|
|
|
new Sha256()
|
|
|
|
.process(addrSeed)
|
|
|
|
.finish()
|
|
|
|
.result
|
|
|
|
).finish().result
|
|
|
|
|
|
|
|
addrSeed = this._byteSeed
|
|
|
|
} else {
|
|
|
|
addrSeed = this._genAddressSeed(addrSeed).slice(0, 32)
|
|
|
|
}
|
|
|
|
|
|
|
|
const addrKeyPair = nacl.sign.keyPair.fromSeed(new Uint8Array(addrSeed));
|
|
|
|
|
|
|
|
const address = publicKeyToAddress(addrKeyPair.publicKey);
|
|
|
|
const qoraAddress = publicKeyToAddress(addrKeyPair.publicKey, true);
|
|
|
|
|
2023-11-05 14:30:07 +01:00
|
|
|
// Create Bitcoin HD Wallet
|
2023-01-13 09:52:14 +01:00
|
|
|
const btcSeed = [...addrSeed];
|
|
|
|
const btcWallet = new AltcoinHDWallet({
|
|
|
|
mainnet: {
|
|
|
|
private: 0x0488ADE4,
|
|
|
|
public: 0x0488B21E,
|
|
|
|
prefix: 0
|
|
|
|
},
|
|
|
|
testnet: {
|
|
|
|
private: 0x04358394,
|
|
|
|
public: 0x043587CF,
|
|
|
|
prefix: 0x6F
|
|
|
|
}
|
|
|
|
}).createWallet(new Uint8Array(btcSeed), false);
|
|
|
|
|
2023-11-05 14:30:07 +01:00
|
|
|
// Create Litecoin HD Wallet
|
2023-01-13 09:52:14 +01:00
|
|
|
const ltcSeed = [...addrSeed];
|
|
|
|
const ltcWallet = new AltcoinHDWallet({
|
|
|
|
mainnet: {
|
|
|
|
private: 0x0488ADE4,
|
|
|
|
public: 0x0488B21E,
|
|
|
|
prefix: 0x30
|
|
|
|
},
|
|
|
|
testnet: {
|
|
|
|
private: 0x04358394,
|
|
|
|
public: 0x043587CF,
|
|
|
|
prefix: 0x6F
|
|
|
|
}
|
|
|
|
}).createWallet(new Uint8Array(ltcSeed), false, 'LTC');
|
|
|
|
|
2023-11-05 14:30:07 +01:00
|
|
|
// Create Dogecoin HD Wallet
|
2023-01-13 09:52:14 +01:00
|
|
|
const dogeSeed = [...addrSeed];
|
|
|
|
const dogeWallet = new AltcoinHDWallet({
|
|
|
|
mainnet: {
|
|
|
|
private: 0x02FAC398,
|
|
|
|
public: 0x02FACAFD,
|
|
|
|
prefix: 0x1E
|
|
|
|
},
|
|
|
|
testnet: {
|
|
|
|
private: 0x04358394,
|
|
|
|
public: 0x043587CF,
|
|
|
|
prefix: 0x71
|
|
|
|
}
|
|
|
|
}).createWallet(new Uint8Array(dogeSeed), false, 'DOGE');
|
|
|
|
|
2023-11-05 14:30:07 +01:00
|
|
|
// Create Digibyte HD Wallet
|
2023-01-13 09:52:14 +01:00
|
|
|
const dgbSeed = [...addrSeed];
|
|
|
|
const dgbWallet = new AltcoinHDWallet({
|
|
|
|
mainnet: {
|
|
|
|
private: 0x0488ADE4,
|
|
|
|
public: 0x0488B21E,
|
|
|
|
prefix: 0x1E
|
|
|
|
},
|
|
|
|
testnet: {
|
|
|
|
private: 0x04358394,
|
|
|
|
public: 0x043587CF,
|
|
|
|
prefix: 0x7E
|
|
|
|
}
|
|
|
|
}).createWallet(new Uint8Array(dgbSeed), false, 'DGB');
|
2022-04-21 11:30:05 -04:00
|
|
|
|
2023-11-05 14:30:07 +01:00
|
|
|
// Create Ravencoin HD Wallet
|
2023-01-13 09:52:14 +01:00
|
|
|
const rvnSeed = [...addrSeed];
|
|
|
|
const rvnWallet = new AltcoinHDWallet({
|
|
|
|
mainnet: {
|
|
|
|
private: 0x0488ADE4,
|
|
|
|
public: 0x0488B21E,
|
|
|
|
prefix: 0x3C
|
|
|
|
},
|
|
|
|
testnet: {
|
|
|
|
private: 0x04358394,
|
|
|
|
public: 0x043587CF,
|
|
|
|
prefix: 0x6F
|
|
|
|
}
|
|
|
|
}).createWallet(new Uint8Array(rvnSeed), false, 'RVN');
|
|
|
|
|
2023-11-05 14:30:07 +01:00
|
|
|
// Create Pirate Chain HD Wallet
|
2023-01-13 09:52:14 +01:00
|
|
|
const arrrSeed = [...addrSeed];
|
|
|
|
const arrrWallet = new AltcoinHDWallet({
|
|
|
|
mainnet: {
|
|
|
|
private: 0x0488ADE4,
|
|
|
|
public: 0x0488B21E,
|
|
|
|
prefix: [0x16, 0x9A]
|
|
|
|
},
|
|
|
|
testnet: {
|
|
|
|
private: 0x04358394,
|
|
|
|
public: 0x043587CF,
|
|
|
|
prefix: [0x14, 0x51]
|
|
|
|
}
|
|
|
|
}).createWallet(new Uint8Array(arrrSeed), false, 'ARRR');
|
|
|
|
|
|
|
|
this._addresses[nonce] = {
|
|
|
|
address,
|
|
|
|
btcWallet,
|
|
|
|
ltcWallet,
|
|
|
|
dogeWallet,
|
|
|
|
dgbWallet,
|
|
|
|
rvnWallet,
|
|
|
|
arrrWallet,
|
|
|
|
qoraAddress,
|
|
|
|
keyPair: {
|
|
|
|
publicKey: addrKeyPair.publicKey,
|
|
|
|
privateKey: addrKeyPair.secretKey
|
|
|
|
},
|
|
|
|
base58PublicKey: Base58.encode(addrKeyPair.publicKey),
|
|
|
|
seed: addrSeed,
|
|
|
|
nonce: nonce
|
|
|
|
}
|
|
|
|
return this._addresses[nonce]
|
|
|
|
}
|
|
|
|
|
|
|
|
generateSaveWalletData(...args) {
|
|
|
|
return generateSaveWalletData(this, ...args)
|
|
|
|
}
|
2021-12-25 14:39:47 +01:00
|
|
|
}
|