mirror of https://github.com/qortal/qortal-ui
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
209 lines
5.8 KiB
209 lines
5.8 KiB
/* |
|
Copyright 2017-2018 @ irontiga and vbcs (original developer) |
|
*/ |
|
'use strict'; |
|
import Base58 from './deps/Base58.js' |
|
import { Sha256, Sha512 } from 'asmcrypto.js' |
|
import nacl from './deps/nacl-fast.js' |
|
import utils from './deps/utils.js' |
|
|
|
import { generateSaveWalletData } from './storeWallet.js' |
|
|
|
import publicKeyToAddress from './wallet/publicKeyToAddress.js' |
|
import AltcoinHDWallet from "./bitcoin/AltcoinHDWallet"; |
|
|
|
export default class PhraseWallet { |
|
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); |
|
|
|
// Create Bitcoin HD Wallet |
|
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); |
|
|
|
// Create Litecoin HD Wallet |
|
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'); |
|
|
|
// Create Dogecoin HD Wallet |
|
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'); |
|
|
|
// Create Digibyte HD Wallet |
|
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'); |
|
|
|
// Create Ravencoin HD Wallet |
|
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'); |
|
|
|
// Create Pirate Chain HD Wallet |
|
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) |
|
} |
|
}
|
|
|