mirror of
https://github.com/OneKeyHQ/bip39.git
synced 2026-04-05 18:43:47 +00:00
Add BIP84 tab
This commit is contained in:
@@ -204,6 +204,9 @@
|
||||
<li id="bip49-tab">
|
||||
<a href="#bip49" role="tab" data-toggle="tab">BIP49</a>
|
||||
</li>
|
||||
<li id="bip84-tab">
|
||||
<a href="#bip84" role="tab" data-toggle="tab">BIP84</a>
|
||||
</li>
|
||||
<li id="bip141-tab">
|
||||
<a href="#bip141" role="tab" data-toggle="tab">BIP141</a>
|
||||
</li>
|
||||
@@ -487,6 +490,86 @@
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div id="bip84" class="tab-pane">
|
||||
<form class="form-horizontal" role="form">
|
||||
<br>
|
||||
<div class="col-sm-2"></div>
|
||||
<div class="col-sm-10">
|
||||
<p>
|
||||
For more info see the
|
||||
<a href="https://github.com/bitcoin/bips/blob/master/bip-0084.mediawiki" target="_blank">BIP84 spec</a>.
|
||||
</p>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="purpose" class="col-sm-2 control-label">
|
||||
Purpose
|
||||
</label>
|
||||
<div class="col-sm-10">
|
||||
<input id="purpose" type="text" class="purpose form-control" value="84" readonly>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="coin" class="col-sm-2 control-label">
|
||||
Coin
|
||||
</label>
|
||||
<div class="col-sm-10">
|
||||
<input id="coin" type="text" class="coin form-control" value="0" readonly>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="account" class="col-sm-2 control-label">
|
||||
Account
|
||||
</label>
|
||||
<div class="col-sm-10">
|
||||
<input id="account" type="text" class="account form-control" value="0">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="change" class="col-sm-2 control-label">
|
||||
External / Internal
|
||||
</label>
|
||||
<div class="col-sm-10">
|
||||
<input id="change" type="text" class="change form-control" value="0">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label">
|
||||
</label>
|
||||
<div class="col-sm-10">
|
||||
<p>The account extended keys can be used for importing to most BIP84 compatible wallets.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="account-xprv" class="col-sm-2 control-label">
|
||||
<span>Account Extended Private Key</span>
|
||||
</label>
|
||||
<div class="col-sm-10">
|
||||
<textarea id="account-xprv" type="text" class="account-xprv form-control" readonly data-show-qr></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="account-xpub" class="col-sm-2 control-label">
|
||||
<span>Account Extended Public Key</span>
|
||||
</label>
|
||||
<div class="col-sm-10">
|
||||
<textarea id="account-xpub" type="text" class="account-xpub form-control" readonly data-show-qr></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="col-sm-2 control-label">
|
||||
</label>
|
||||
<div class="col-sm-10">
|
||||
<p>The BIP32 derivation path and extended keys are the basis for the derived addresses.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="bip84-path" class="col-sm-2 control-label">BIP32 Derivation Path</label>
|
||||
<div class="col-sm-10">
|
||||
<input id="bip84-path" type="text" class="path form-control" value="m/84'/0'/0'/0" readonly="readonly">
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<form class="form-horizontal" role="form">
|
||||
<div class="form-group">
|
||||
|
||||
@@ -53,6 +53,7 @@
|
||||
DOM.bip32tab = $("#bip32-tab");
|
||||
DOM.bip44tab = $("#bip44-tab");
|
||||
DOM.bip49tab = $("#bip49-tab");
|
||||
DOM.bip84tab = $("#bip84-tab");
|
||||
DOM.bip141tab = $("#bip141-tab");
|
||||
DOM.bip32panel = $("#bip32");
|
||||
DOM.bip44panel = $("#bip44");
|
||||
@@ -74,6 +75,13 @@
|
||||
DOM.bip49accountXprv = $("#bip49 .account-xprv");
|
||||
DOM.bip49accountXpub = $("#bip49 .account-xpub");
|
||||
DOM.bip49change = $("#bip49 .change");
|
||||
DOM.bip84path = $("#bip84-path");
|
||||
DOM.bip84purpose = $("#bip84 .purpose");
|
||||
DOM.bip84coin = $("#bip84 .coin");
|
||||
DOM.bip84account = $("#bip84 .account");
|
||||
DOM.bip84accountXprv = $("#bip84 .account-xprv");
|
||||
DOM.bip84accountXpub = $("#bip84 .account-xpub");
|
||||
DOM.bip84change = $("#bip84 .change");
|
||||
DOM.bip141unavailable = $("#bip141 .unavailable");
|
||||
DOM.bip141available = $("#bip141 .available");
|
||||
DOM.bip141path = $("#bip141-path");
|
||||
@@ -117,6 +125,8 @@
|
||||
DOM.bip44change.on("input", calcForDerivationPath);
|
||||
DOM.bip49account.on("input", calcForDerivationPath);
|
||||
DOM.bip49change.on("input", calcForDerivationPath);
|
||||
DOM.bip84account.on("input", calcForDerivationPath);
|
||||
DOM.bip84change.on("input", calcForDerivationPath);
|
||||
DOM.bip141path.on("input", calcForDerivationPath);
|
||||
DOM.bip141semantics.on("change", tabChanged);
|
||||
DOM.tab.on("shown.bs.tab", tabChanged);
|
||||
@@ -357,6 +367,9 @@
|
||||
else if (bip49TabSelected()) {
|
||||
displayBip49Info();
|
||||
}
|
||||
else if (bip84TabSelected()) {
|
||||
displayBip84Info();
|
||||
}
|
||||
displayBip32Info();
|
||||
}
|
||||
|
||||
@@ -559,6 +572,21 @@
|
||||
console.log("Using derivation path from BIP49 tab: " + derivationPath);
|
||||
return derivationPath;
|
||||
}
|
||||
else if (bip84TabSelected()) {
|
||||
var purpose = parseIntNoNaN(DOM.bip84purpose.val(), 84);
|
||||
var coin = parseIntNoNaN(DOM.bip84coin.val(), 0);
|
||||
var account = parseIntNoNaN(DOM.bip84account.val(), 0);
|
||||
var change = parseIntNoNaN(DOM.bip84change.val(), 0);
|
||||
var path = "m/";
|
||||
path += purpose + "'/";
|
||||
path += coin + "'/";
|
||||
path += account + "'/";
|
||||
path += change;
|
||||
DOM.bip84path.val(path);
|
||||
var derivationPath = DOM.bip84path.val();
|
||||
console.log("Using derivation path from BIP84 tab: " + derivationPath);
|
||||
return derivationPath;
|
||||
}
|
||||
else if (bip32TabSelected()) {
|
||||
var derivationPath = DOM.bip32path.val();
|
||||
console.log("Using derivation path from BIP32 tab: " + derivationPath);
|
||||
@@ -659,6 +687,24 @@
|
||||
DOM.bip49accountXpub.val(accountXpub);
|
||||
}
|
||||
|
||||
function displayBip84Info() {
|
||||
// Get the derivation path for the account
|
||||
var purpose = parseIntNoNaN(DOM.bip84purpose.val(), 84);
|
||||
var coin = parseIntNoNaN(DOM.bip84coin.val(), 0);
|
||||
var account = parseIntNoNaN(DOM.bip84account.val(), 0);
|
||||
var path = "m/";
|
||||
path += purpose + "'/";
|
||||
path += coin + "'/";
|
||||
path += account + "'/";
|
||||
// Calculate the account extended keys
|
||||
var accountExtendedKey = calcBip32ExtendedKey(path);
|
||||
var accountXprv = accountExtendedKey.toBase58();
|
||||
var accountXpub = accountExtendedKey.neutered().toBase58();
|
||||
// Display the extended keys
|
||||
DOM.bip84accountXprv.val(accountXprv);
|
||||
DOM.bip84accountXpub.val(accountXpub);
|
||||
}
|
||||
|
||||
function displayBip32Info() {
|
||||
// Display the key
|
||||
DOM.seed.val(seed);
|
||||
@@ -699,11 +745,12 @@
|
||||
}
|
||||
|
||||
function segwitSelected() {
|
||||
return bip49TabSelected() || bip141TabSelected();
|
||||
return bip49TabSelected() || bip84TabSelected() || bip141TabSelected();
|
||||
}
|
||||
|
||||
function p2wpkhSelected() {
|
||||
return bip141TabSelected() && DOM.bip141semantics.val() == "p2wpkh";
|
||||
return bip84TabSelected() ||
|
||||
bip141TabSelected() && DOM.bip141semantics.val() == "p2wpkh";
|
||||
}
|
||||
|
||||
function p2wpkhInP2shSelected() {
|
||||
@@ -1284,6 +1331,10 @@
|
||||
return DOM.bip49tab.hasClass("active");
|
||||
}
|
||||
|
||||
function bip84TabSelected() {
|
||||
return DOM.bip84tab.hasClass("active");
|
||||
}
|
||||
|
||||
function bip141TabSelected() {
|
||||
return DOM.bip141tab.hasClass("active");
|
||||
}
|
||||
@@ -1291,6 +1342,7 @@
|
||||
function setHdCoin(coinValue) {
|
||||
DOM.bip44coin.val(coinValue);
|
||||
DOM.bip49coin.val(coinValue);
|
||||
DOM.bip84coin.val(coinValue);
|
||||
}
|
||||
|
||||
function showSegwitAvailable() {
|
||||
|
||||
@@ -2684,4 +2684,152 @@ it('Shows the index of each word in the mnemonic', function(done) {
|
||||
});
|
||||
});
|
||||
|
||||
it('Shows the derivation path for bip84 tab', function(done) {
|
||||
driver.findElement(By.css('#bip84-tab a'))
|
||||
.click()
|
||||
driver.findElement(By.css('.phrase'))
|
||||
.sendKeys('abandon abandon ability');
|
||||
driver.sleep(generateDelay).then(function() {
|
||||
driver.findElement(By.css('#bip84 .path'))
|
||||
.getAttribute("value")
|
||||
.then(function(path) {
|
||||
expect(path).toBe("m/84'/0'/0'/0");
|
||||
done();
|
||||
})
|
||||
});
|
||||
});
|
||||
|
||||
it('Shows the extended private key for bip84 tab', function(done) {
|
||||
driver.findElement(By.css('#bip84-tab a'))
|
||||
.click()
|
||||
driver.findElement(By.css('.phrase'))
|
||||
.sendKeys('abandon abandon ability');
|
||||
driver.sleep(generateDelay).then(function() {
|
||||
driver.findElement(By.css('.extended-priv-key'))
|
||||
.getAttribute("value")
|
||||
.then(function(path) {
|
||||
expect(path).toBe("zprvAev3RKrZ3QVKiUFCfdeMRen1BPDJgdNt1XpxiDy8acSs4kkAGTCvq7HeRYRNNpo8EtEjCFQBWavJwtCUR29y4TUCH4X5RXMcyq48uN8y9BP");
|
||||
done();
|
||||
})
|
||||
});
|
||||
});
|
||||
|
||||
it('Shows the extended public key for bip84 tab', function(done) {
|
||||
driver.findElement(By.css('#bip84-tab a'))
|
||||
.click()
|
||||
driver.findElement(By.css('.phrase'))
|
||||
.sendKeys('abandon abandon ability');
|
||||
driver.sleep(generateDelay).then(function() {
|
||||
driver.findElement(By.css('.extended-pub-key'))
|
||||
.getAttribute("value")
|
||||
.then(function(path) {
|
||||
expect(path).toBe("zpub6suPpqPSsn3cvxKfmfBMnnijjR3o666jNkkZWcNk8wyqwZ5JozXBNuc8Gs7DB3uLwTDvGVTspVEAUQcEjKF3pZHgywVbubdTqbXTUg7usyx");
|
||||
done();
|
||||
})
|
||||
});
|
||||
});
|
||||
|
||||
it('Changes the address list if bip84 account is changed', function(done) {
|
||||
driver.findElement(By.css('#bip84-tab a'))
|
||||
.click()
|
||||
driver.findElement(By.css('#bip84 .account'))
|
||||
.sendKeys('1');
|
||||
driver.findElement(By.css('.phrase'))
|
||||
.sendKeys('abandon abandon ability');
|
||||
driver.sleep(generateDelay).then(function() {
|
||||
getFirstAddress(function(address) {
|
||||
expect(address).toBe("bc1qp7vv669t2fy965jdzvqwrraana89ctd5ewc662");
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('Changes the address list if bip84 change is changed', function(done) {
|
||||
driver.findElement(By.css('#bip84-tab a'))
|
||||
.click()
|
||||
driver.findElement(By.css('#bip84 .change'))
|
||||
.sendKeys('1');
|
||||
driver.findElement(By.css('.phrase'))
|
||||
.sendKeys('abandon abandon ability');
|
||||
driver.sleep(generateDelay).then(function() {
|
||||
getFirstAddress(function(address) {
|
||||
expect(address).toBe("bc1qr39vj6rh06ff05m53uxq8uazehwhccswylhrs2");
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('Passes the official BIP84 test spec for rootpriv', function(done) {
|
||||
driver.findElement(By.css('#bip84-tab a'))
|
||||
.click()
|
||||
driver.findElement(By.css('.phrase'))
|
||||
.sendKeys('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about');
|
||||
driver.sleep(generateDelay).then(function() {
|
||||
driver.findElement(By.css(".root-key"))
|
||||
.getAttribute("value")
|
||||
.then(function(rootKey) {
|
||||
expect(rootKey).toBe("zprvAWgYBBk7JR8Gjrh4UJQ2uJdG1r3WNRRfURiABBE3RvMXYSrRJL62XuezvGdPvG6GFBZduosCc1YP5wixPox7zhZLfiUm8aunE96BBa4Kei5");
|
||||
done();
|
||||
})
|
||||
});
|
||||
});
|
||||
|
||||
it('Passes the official BIP84 test spec for account 0 xprv', function(done) {
|
||||
driver.findElement(By.css('#bip84-tab a'))
|
||||
.click()
|
||||
driver.findElement(By.css('.phrase'))
|
||||
.sendKeys('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about');
|
||||
driver.sleep(generateDelay).then(function() {
|
||||
driver.findElement(By.css("#bip84 .account-xprv"))
|
||||
.getAttribute("value")
|
||||
.then(function(rootKey) {
|
||||
expect(rootKey).toBe("zprvAdG4iTXWBoARxkkzNpNh8r6Qag3irQB8PzEMkAFeTRXxHpbF9z4QgEvBRmfvqWvGp42t42nvgGpNgYSJA9iefm1yYNZKEm7z6qUWCroSQnE");
|
||||
done();
|
||||
})
|
||||
});
|
||||
});
|
||||
|
||||
it('Passes the official BIP84 test spec for account 0 xpub', function(done) {
|
||||
driver.findElement(By.css('#bip84-tab a'))
|
||||
.click()
|
||||
driver.findElement(By.css('.phrase'))
|
||||
.sendKeys('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about');
|
||||
driver.sleep(generateDelay).then(function() {
|
||||
driver.findElement(By.css("#bip84 .account-xpub"))
|
||||
.getAttribute("value")
|
||||
.then(function(rootKey) {
|
||||
expect(rootKey).toBe("zpub6rFR7y4Q2AijBEqTUquhVz398htDFrtymD9xYYfG1m4wAcvPhXNfE3EfH1r1ADqtfSdVCToUG868RvUUkgDKf31mGDtKsAYz2oz2AGutZYs");
|
||||
done();
|
||||
})
|
||||
});
|
||||
});
|
||||
|
||||
it('Passes the official BIP84 test spec for account 0 first address', function(done) {
|
||||
driver.findElement(By.css('#bip84-tab a'))
|
||||
.click()
|
||||
driver.findElement(By.css('.phrase'))
|
||||
.sendKeys('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about');
|
||||
driver.sleep(generateDelay).then(function() {
|
||||
getFirstAddress(function(address) {
|
||||
expect(address).toBe("bc1qcr8te4kr609gcawutmrza0j4xv80jy8z306fyu");
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('Passes the official BIP84 test spec for account 0 first change address', function(done) {
|
||||
driver.findElement(By.css('#bip84-tab a'))
|
||||
.click()
|
||||
driver.findElement(By.css('.phrase'))
|
||||
.sendKeys('abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about');
|
||||
driver.findElement(By.css('#bip84 .change'))
|
||||
.sendKeys('1');
|
||||
driver.sleep(generateDelay).then(function() {
|
||||
getFirstAddress(function(address) {
|
||||
expect(address).toBe("bc1q8c6fshw2dlwun7ekn9qwf37cu2rn755upcp6el");
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user