74 Commits

Author SHA1 Message Date
OutCast3k 44ba1b3d30 update readme 2019-12-25 22:15:55 +00:00
OutCast3k 5583675390 custom hd key derivation addded 2019-12-25 22:10:55 +00:00
OutCast3k 56cb104ea4 updated sha1sum 2019-12-24 23:01:50 +00:00
OutCast3k c6f70d000e Merge pull request #194 from jmacxx/fix_issue_140
fix Issue 140: error logged to console when switching tabs.
2019-12-24 23:00:22 +00:00
OutCast3k 4836b20fae updated sha1sum 2019-12-24 22:47:28 +00:00
OutCast3k f364ae4b4a Merge pull request #198 from jmacxx/fix_issue_193
fix: RBF always set when redeeming OP_CHECKLOCKTIMEVERIFY
2019-12-24 22:44:43 +00:00
OutCast3k 64cb387247 updated as outcast3k 2019-12-24 21:53:20 +00:00
btc b2a86006cf updated sha1sum file 2019-12-24 21:51:33 +00:00
OutCast3k b5ebaafed8 Merge pull request #202 from junderw/fixScriptNum
Fix script num
2019-12-24 21:49:03 +00:00
kinoshitajona d4f47fce28 Must do OPs with script method 2019-11-14 15:13:51 +09:00
kinoshitajona 5bd3786f94 Fix ScriptNum 2019-11-14 15:07:15 +09:00
Wowee0 b77f3cf06a fix: RBF always set when redeeming OP_CHECKLOCKTIMEVERIFY 2019-10-18 23:19:52 -05:00
Wowee0 b0c6c3a516 fix Uncaught TypeError logged to console when switching Tx Input and Output tabs 2019-09-23 21:01:03 -05:00
OutCast3k a6f5dcf7f0 removed debugger code 2019-09-22 20:32:42 +00:00
OutCast3k cf2a8b01cb update sha1sum file 2019-08-30 17:03:31 +00:00
OutCast3k 261c4ace40 Merge pull request #191 from Wowee0/choose_backend
fix for #189 .. three backend API options for btc/ltc/doge
2019-08-30 17:58:50 +01:00
Wowee0 e18b634c4e fix issue where empty broadcast did not handle the error response appropriately 2019-08-27 11:17:08 -05:00
Wowee0 1f3b878d63 bugfix for blockcypher when address used that has no UTXO 2019-08-22 07:41:36 -05:00
Wowee0 efc16c10fb allow backend API choice between blockcypher/blockchair/chain.so 2019-08-16 16:28:29 -05:00
Wowee0 477ca8890d Merge pull request #1 from OutCast3k/master
sync with OutCast3k/coinbin
2019-06-15 09:18:15 -05:00
OutCast3k e73e8093b3 change made to avoid captcha provided by cloudflare to TOR users 2019-06-05 19:34:45 +00:00
OutCast3k 40ea3230fd removed blockchain.com links 2019-05-28 15:21:58 +00:00
OutCast3k dc416c6521 changes made to paper wallet 2019-05-24 14:44:47 +00:00
OutCast3k fc66bc9423 Merge pull request #127 from olivergregorius/paperwallet
Paperwallet
2019-05-24 15:41:54 +01:00
OutCast3k 1c10bef510 Merge pull request #183 from yottalogical/blockchain-explorer-link
Add Link to Blockchain Explorer after Broadcasting Transaction (Litecoin)
2019-05-06 11:49:48 +01:00
yottalogical b22e79391f Update sha1sum 2019-05-05 12:36:32 -04:00
yottalogical 0be8fd9a97 Add link to blockchain explorer for Chain.so (Litecoin) 2019-05-05 12:30:28 -04:00
OutCast3k 1a364ff770 updated sha1sum file 2019-05-05 09:22:52 +00:00
OutCast3k bc0c72117e Merge pull request #182 from Wowee0/litecoin
re-enabled Litecoin
2019-05-05 10:11:31 +01:00
OutCast3k 13c50cf4b6 Merge pull request #170 from ivy-dong/ivy_remove_redundant_quotation_marks
remove redundant quotation marks
2019-05-05 10:09:08 +01:00
OutCast3k dea1d1b274 Merge pull request #178 from yottalogical/blockchain-explorer-link 2019-05-05 10:07:00 +01:00
Wowee0 e6c70d133b set appropriate hrp for Litecoin SegWit addresses
set chain.so/address/LTC for view of address (previously was referencing BTC block explorer)
2019-04-22 22:09:20 -05:00
Wowee0 10aa011c6e LTC SegWit (pre-bech32) address version changed from 5 to 50 (i.e. 3-addresses changed to M-addresses) 2019-04-20 23:28:40 -05:00
Wowee0 c7a0fda7e5 re-enabled Litecoin 2019-04-19 10:40:59 -05:00
yottalogical c9cfeefc86 Correct month in sha1sum 2019-02-22 18:19:35 -05:00
yottalogical cdf4aa105b Fix variable name in broadcast success message 2019-02-06 15:43:23 -05:00
yottalogical 2fc574dde0 Remove unnecessary linebreak at end 2019-02-06 15:34:25 -05:00
yottalogical f088ec2e52 Update sha1sum 2019-02-06 15:28:04 -05:00
yottalogical 9ccd73808d Capitalize TXID in success message 2019-02-06 15:23:09 -05:00
yottalogical cb81362330 Add link to blockchain explorer for Cryptoid.info (Carboncoin) 2019-02-06 15:21:39 -05:00
yottalogical fcbf25eaec Add link to blockchain explorer for coinb.in (Bitcoin) 2019-02-06 15:20:43 -05:00
yottalogical 2aca9ab28d Add link to blockchain explorer for Blockcypher.com 2019-02-06 14:46:19 -05:00
yottalogical 5c581316fe Add link to blockchain explorer for Chain.so (Bitcoin) 2019-02-06 14:39:48 -05:00
yottalogical ebfb940dd5 Fix typo in comment 2019-02-06 14:32:49 -05:00
yottalogical 3201550d40 Add link to blockchain explorer for Chain.so (Dogecoin) 2019-02-06 14:23:27 -05:00
OutCast3k d88ec3db4b update sha1sum file 2018-12-28 23:49:01 +00:00
OutCast3k 530453a701 improvement to previous timelock address bug fix 2018-12-28 23:42:00 +00:00
OutCast3k 194df37d56 bug fix for time locked addresses. transactions not being built correctly (no loss of funds!!!!) 2018-12-28 23:33:42 +00:00
Ivy Dong 87461b58b8 remove redundant quotation marks 2018-12-16 20:04:27 +08:00
OutCast3k 739aee3c0f couple of bug fixes with transaction building 2018-08-26 20:53:25 +00:00
OutCast3k fd81fafdff segwit signing bug fix 2018-06-19 15:45:21 +00:00
OutCast3k 9bede2aef4 Update sha1sum 2018-06-17 11:37:21 +01:00
OutCast3k 37f4395d9f wallet segwit spend bugfix 2018-06-17 09:22:44 +00:00
OutCast3k 5a65a77bd2 added a bech32 address to the #wallet section of coinb.in 2018-06-11 16:23:18 +00:00
OutCast3k 734e6b2eeb removed some coded that was no longer needed 2018-05-27 12:10:49 +00:00
OutCast3k 90a309d4b4 first stage of adding bech32 support added to coinb.in 2018-05-27 11:49:09 +00:00
OutCast3k abd2191c50 updated readme 2018-01-15 19:05:45 +00:00
OutCast3k bb8abb4ded some changes and bug fixes to the fees page 2018-01-15 18:58:17 +00:00
OutCast3k 40d514e0f0 couple of minor updates 2018-01-11 16:54:27 +00:00
OutCast3k c3b1a47199 few minor changes, plus the wallet now enables rbf by default 2018-01-06 16:11:20 +00:00
OutCast3k ed7d5d6411 small bugfix so that the #wallet inputs/outputs are properly set on the #fees page 2018-01-04 10:42:45 +00:00
OutCast3k 10e083bd89 add css changes 2018-01-03 19:30:36 +00:00
OutCast3k 56fa7b5139 various tweaks made to the #fees page 2018-01-03 19:27:53 +00:00
OutCast3k e85276dd89 added css changes 2018-01-01 18:58:33 +00:00
OutCast3k c843685662 added new #fee section to coinb.in 2018-01-01 18:53:23 +00:00
OutCast3k 64af126bc5 added segwit redeemscript to wallet, fixed typo, added links 2017-12-09 09:56:06 +00:00
oliverdorn b997751791 Added functionality for printing Paper Wallet 2017-11-25 00:53:00 +01:00
oliverdorn 9bccc5c512 Added Buttons for printing Paper Wallets
Added Buttons for printint Paper Wallets for generated Legacy- and SegWit-Adresses
2017-11-25 00:49:16 +01:00
OutCast3k 217897285e bug fix for issue #118 (do not generate a multisig address when the redeemscript is too large >520bytes) 2017-10-04 08:35:51 +00:00
OutCast3k b1603821da at the risk of upsetting some users segwit addresses have now been enabled by default in the #wallet section, with the option to switch between legacy and segwit very easily. 2017-10-01 18:06:57 +00:00
btc c2ef949dd0 segwit spending bug fixes 2017-09-21 13:38:48 +00:00
btc ecb18acb0f code was missing for the segwit feature from the #wallet section 2017-09-20 09:56:20 +00:00
OutCast3k 4a4f302fe6 added segwit support to the wallet section of #coinb.in 2017-09-16 09:03:10 +00:00
OutCast3k 4afee020b0 Update sha1sum
updated sha1sum
2017-09-12 06:25:00 +01:00
7 changed files with 1355 additions and 169 deletions
+5 -3
View File
@@ -1,7 +1,7 @@
coinbin
=======
A Open Source Browser Based Bitcoin Wallet. Version 1.3 beta by OutCast3k
A Open Source Browser Based Bitcoin Wallet. Version 1.5 beta by OutCast3k
Live version available at http://coinb.in/ or http://4zpinp6gdkjfplhk.onion
@@ -28,6 +28,8 @@ Coinb.in supports a number of key features such as:
- HD (bip32) support
- Supports altcoins such as litecoin
- Replace by fee (RBF) Support
- Segwit support
- Segwit Support
- Bech32 address support
- Fee calculator - https://coinb.in/#fees
Donate to 1CWHWkTWaq1K5hevimJia3cyinQsrgXUvg to see more development!
Donate to 3K1oFZMks41C7qDYBsr72SYjapLqDuSYuN to see more development!
+86
View File
@@ -32,3 +32,89 @@ body {
text-overflow: ellipsis;
display: block;
}
#fees .txi_regular {
background: #d3d3d3;
}
#fees .txi_segwit {
background: #bae1ff;
}
#fees .txi_multisig {
background: #baffc9;
}
#fees .txi_hodl {
background: #ffdfba;
}
#fees .txi_unknown {
background: #ffb3ba;
}
#fees .txo_p2pkh {
background: #E679C8;
}
#fees .txo_p2sh {
background: #FAFE92;
}
#fees .txinputs {
}
#fees .txoutputs {
}
.hideOverflow {
overflow:hidden;
white-space:nowrap;
text-overflow:ellipsis;
}
#fees .slider {
-webkit-appearance: none;
appearance: none;
width: 100%;
height: 30px;
outline: none;
opacity: 0.7;
-webkit-transition: .2s;
transition: opacity .2s;
border: 2px dotted #c3c3c3;
}
#fees .sliderbtn {
height: 30px;
width: 30px;
padding: 0px;
margin: 0px;
border: 0px;
}
#fees .slider:hover {
opacity: 1;
}
#fees .slider::-webkit-slider-thumb {
-webkit-appearance: none;
appearance: none;
width: 32px;
height: 32px;
border: 0;
background: url('https://coinb.in/images/btc32x.png');
cursor: pointer;
}
#fees .slider::-moz-range-thumb {
width: 32px;
height: 32px;
border: 0;
background: url('https://coinb.in/images/btc32x.png');
cursor: pointer;
}
#fees .total {
font-size: 100px;
}
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

+337 -26
View File
@@ -4,9 +4,9 @@
<title>Bitcoin Wallet by Coinb.in</title>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<meta name="keywords" content="bitcoin, wallet, multisig, multisignature, address, browser, javascript, js, broadcast, transaction, verify, decode" />
<meta name="description" content="A Bitcoin Wallet written in Javascript. Supports Multisig, Custom Transactions, nLockTime and more!" />
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<meta name="keywords" content="bitcoin, wallet, multisig, multisignature, address, browser, segwit, javascript, js, broadcast, transaction, verify, decode" />
<meta name="description" content="A Bitcoin Wallet written in Javascript. Supports Multisig, SegWit, Custom Transactions, nLockTime and more!" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
@@ -74,6 +74,7 @@
<li><a href="#about" data-toggle="tab"><span class="glyphicon glyphicon-info-sign"></span> About</a></li>
<li class="hidden"><a href="#settings" data-toggle="tab"><span class="glyphicon glyphicon-cog"></span> Settings</a></li>
<li class="hidden"><a href="#fees" data-toggle="tab"><span class="glyphicon glyphicon-tag"></span> Fees</a></li>
</ul>
</div>
</div>
@@ -119,12 +120,12 @@
<div class="row">
<div class="col-md-4">
<h3><span class="glyphicon glyphicon-piggy-bank"></span> Wallet</h3>
<p>Quick access to an <a href="#wallet">online wallet</a> where only you have access to your own private keys!</p>
<p>Quick access to an <a href="#wallet">online wallet</a> where only you have access to your own private keys &amp; can <a href="#fees">calculate your own fee</a>!</p>
</div>
<div class="col-md-4">
<h3><span class="glyphicon glyphicon-globe"></span> Addresses</h3>
<p>We support <a href="#newAddress">regular addresses</a>, <a href="#newMultiSig">multisig</a>, <a href="#newSegWit">segwit</a> and stealth all with access to your own private keys!</p>
<p>We support <a href="#newAddress">regular addresses</a>, <a href="#newMultiSig">multisig</a>, <a href="#newSegWit">segwit / bech32</a> and stealth all with access to your own private keys!</p>
</div>
<div class="col-md-4">
@@ -151,6 +152,24 @@
<input id="openPass" type="password" class="form-control" placeholder="Password" required>
<input id="openPassConfirm" type="password" class="form-control" placeholder="Password confirm" required>
<br>
<div>
<a href="javascript:;" class="optionsCollapse"><div class="well well-sm"><span class="glyphicon glyphicon-collapse-down" id="glyphcollapse"></span> Advanced Options</div></a>
<div class="hidden optionsAdvanced">
<label>Segregated Witness Address</label>
<p class="checkbox">
<label><input type="checkbox" id="walletSegwit" class="checkbox-inline" checked> Use a segwit address instead of a regular address. <span class="text-muted"><i>(recommended)</i></span></label></label> <br>
<label><input type="radio" id="walletSegwitp2sh" class="walletSegwitType" name="walletSegWitType" value="p2sh" checked> p2sh address</label> <br>
<label><input type="radio" id="walletSegwitBech32" class="walletSegwitType" name="walletSegWitType" value="bech32"> bech32 address</label>
</p>
<label>Enable Replace by Fee (RBF)</label>
<p class="checkbox">
<label><input type="checkbox" id="walletRBF" class="checkbox-inline" checked> Enable RBF on all transactions, allowing you to manually raise the transaction fee later if required. <span class="text-muted"><i>(recommended)</i></span></label></label>
</p>
</div>
</div>
<div id="openLoginStatus" class="alert alert-danger hidden"></div>
<button id="openBtn" class="btn btn-primary" type="submit">Submit</button>
</form>
@@ -166,6 +185,15 @@
<div>
<span id="walletLoader" class="hidden"><img src="images/loader.gif"></span>
<span id="walletAddress"></span>
<div class="btn-group">
<button type="button" class="btn btn-default btn-xs dropdown-toggle" data-toggle="dropdown" id="walletToBtn">SegWit <span class="caret"></span></button>
<ul class="dropdown-menu">
<li><a href="javascript:;" id="walletToSegWit">SegWit</a></li>
<li><a href="javascript:;" id="walletToSegWitBech32">SegWit/Bech32</a></li>
<li><a href="javascript:;" id="walletToLegacy">Legacy</a></li>
</ul>
</div>
</div>
<br>
<div style="text-align:center; width:350px;">
@@ -182,6 +210,12 @@
<div id="walletKeys" class="hidden">
<label>Public Key</label>
<input class="form-control pubkey" type="text" readonly>
<div class="walletSegWitRS hidden">
<label>Redeem Script <i>(SegWit)</i></label>
<input class="form-control" type="text" readonly>
</div>
<label>Private key</label>
<div class="input-group">
<input class="form-control privkey" type="password" readonly>
@@ -190,6 +224,7 @@
<button class="showKey btn btn-default" type="button">Show</button>
</span>
</div>
<label>Private Key (AES256 encrypted key)</label>
<input class="form-control privkeyaes" type="text" readonly>
</div>
@@ -223,8 +258,8 @@
</div>
<div class="row">
<div class="col-xs-6">
<label><abbr title="the amount to pay in network miner fees - 0.0004 or more recommended for a faster processing time">Transaction Fee</abbr>&nbsp;&nbsp;<a href="https://bitcoinfees.21.co/" target="_blank"><span class="glyphicon glyphicon-question-sign"></span></a></label>
<input type="text" class="form-control" value="0.0004" id="txFee">
<label><abbr title="the amount to pay in network miner fee">Transaction Fee</abbr>&nbsp;&nbsp;<a href="javascript:;" id="feesestwallet"><span class="glyphicon glyphicon-question-sign"></span></a></label>
<input type="text" class="form-control" value="0.00004000" id="txFee">
</div>
<div class="col-xs-5">
<label><abbr title="the amount to donate to coinb.in">Donation</abbr></label>
@@ -303,7 +338,16 @@
</div>
<input type="button" class="btn btn-primary" value="Generate" id="newKeysBtn">
<div class="btn-group">
<input type="button" class="btn btn-primary" value="Generate" id="newKeysBtn">
<button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span class="caret"></span>
<span class="sr-only">Toggle Dropdown</span>
</button>
<ul class="dropdown-menu">
<li><a href="#" id="newPaperwalletBtn">Print</a></li>
</ul>
</div>
<br>
</div>
@@ -339,12 +383,26 @@
<h3>Address Options</h3>
<p>You can use the advanced options below to generate different kind of keys and addresses.</p>
<div class="checkbox">
<label><input type="checkbox" id="newSegWitBech32addr" class="checkbox-inline" checked> Enable <a href="https://en.bitcoin.it/wiki/Bech32" target="_blank">Bech32</a>?</label>
</div>
<div class="checkbox">
<label><input type="checkbox" id="newSegWitBrainwallet" class="checkbox-inline"> Custom Seed or Brain Wallet</label>
<input type="text" class="form-control hidden" id="brainwalletSegWit">
</div>
<input type="button" class="btn btn-primary" value="Generate" id="newSegWitKeysBtn">
<div class="btn-group">
<input type="button" class="btn btn-primary" value="Generate" id="newSegWitKeysBtn">
<button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span class="caret"></span>
<span class="sr-only">Toggle Dropdown</span>
</button>
<ul class="dropdown-menu">
<li><a href="#" id="newSegwitPaperwalletBtn">Print</a></li>
</ul>
</div>
<br>
</div>
@@ -557,9 +615,9 @@
<div class="hidden alert alert-info" id="redeemFromAddress"></div>
<div>
<a href="javascript:;" id="optionsCollapse"><div class="well well-sm"><span class="glyphicon glyphicon-collapse-down" id="glyphcollapse"></span> Advanced Options</div></a>
<a href="javascript:;" class="optionsCollapse"><div class="well well-sm"><span class="glyphicon glyphicon-collapse-down" id="glyphcollapse"></span> Advanced Options</div></a>
<div class="hidden" id="optionsAdvanced">
<div class="hidden optionsAdvanced">
<label>Clear Inputs</label>
<p class="checkbox">
@@ -570,7 +628,7 @@
<label>Null Data</label> <span class="text-muted text-normal">(80 byte limit, <i>40 bytes recommended</i>)</span>
<p class="checkbox">
<label><input type="checkbox" id="opReturn" class="checkbox-inline"> Allow data to be sent within the transaction and stored in the blockchain by using <a href="https://bitcoin.org/en/developer-guide#null-data" target="_"blank">OP_RETURN</a>.</label>
<label><input type="checkbox" id="opReturn" class="checkbox-inline"> Allow data to be sent within the transaction and stored in the blockchain by using <a href="https://bitcoin.org/en/developer-guide#null-data" target="_blank">OP_RETURN</a>.</label>
<div class="text-muted">When using this option you may enter a hex string or address into the address field on the output tab.</div>
</p>
@@ -685,7 +743,7 @@
<div class="row">
<div class="col-xs-3">
<label><abbr title="What is not spent will be used as a transaction fee">Transaction Fee</abbr>&nbsp;&nbsp;<a href="https://bitcoinfees.21.co/" target="_blank"><span class="glyphicon glyphicon-question-sign"></span></a></label>
<label><abbr title="What is not spent will be used as a transaction fee, so remember to add a &quot;change address&quot;">Transaction Fee</abbr>&nbsp;&nbsp;<a href="javascript:;" id="feesestnewtx"><span class="glyphicon glyphicon-question-sign"></span></a></label>
<input type="text" id="transactionFee" class="form-control" value="0.0000" readonly>
</div>
</div>
@@ -710,6 +768,211 @@
<br>
</div>
<div class="tab-pane tab-content" id="fees">
<h2>Bitcoin Fee Calculator</h2>
<p>This page will give you a guide on the lowest fee to use to get your transaction included within the next few blocks. It works by predicting the size of a transaction and comparing it to another transaction in a recent block to determine an appropriate fee.</p>
<div align="center" class="alert alert-info">
<h2><span class="glyphicon glyphicon-question-sign"></span> Recommended Fee: <span class="recommendedFee">0.00000000</span> BTC <small> <br> for a transaction of <span class="feeTxSize">0</span> bytes</small></h2>
<span class="text-muted"><i><span class="feeSatByte">?</span> Sat/Byte</i></span>
</div>
<div id="txsliders" class="row">
<div class="col-md-6 txinputs">
<div align="center"><b><span class="txtotal total">0</span><br>Inputs</b></div>
<div id="txinputstype" align="center" class="small text-muted">
<br>
<span><span class="txsize">0</span> Bytes</span>
</div>
<h4 class="regular"><abbr title="Spending from a compressed legacy address. p2pkh">Regular</abbr> <small>Compressed</small>
<span class="badge inputno" title="Number of Regular Inputs">1</span>
<small><span class="bytes">148</span> bytes</small>
<small class="estimate hidden"><em> *estimate</em></small>
</h4>
<div class="input-group">
<span class="input-group-btn"><button class="btn sliderbtn down" type="button"><span class="glyphicon glyphicon-chevron-left"></span></button></span>
<input type="range" min="0" max="100" value="1" class="slider txinput txi_regular" rel="regular">
<span class="input-group-btn"><button class="btn sliderbtn up" type="button"><span class="glyphicon glyphicon-chevron-right"></span></button></span>
</div>
<h4 class="segwit"><abbr title="Spending from a segwit address. p2sh">SegWit</abbr>
<span class="badge inputno" title="Number of SegWit Inputs">0</span>
<small><span class="bytes">0</span> bytes</small>
<small class="estimate hidden"><em> *estimate</em></small>
</h4>
<div class="input-group">
<span class="input-group-btn"><button class="btn sliderbtn down" type="button"><span class="glyphicon glyphicon-chevron-left"></span></button></span>
<input type="range" min="0" max="100" value="0" class="slider txinput txi_segwit" rel="segwit">
<span class="input-group-btn"><button class="btn sliderbtn up" type="button"><span class="glyphicon glyphicon-chevron-right"></span></button></span>
</div>
<h4 class="multisig"><abbr title="Spending from a multisig address. p2sh">MultiSig</abbr>
<span class="badge inputno" title="Number of MultiSig Inputs">0</span>
<small><span class="bytes">0</span> bytes</small>
<small class="estimate hidden"><em> *estimate</em></small>
</h4>
<div class="input-group">
<span class="input-group-btn"><button class="btn sliderbtn down" type="button"><span class="glyphicon glyphicon-chevron-left"></span></button></span>
<input type="range" min="0" max="100" value="0" class="slider txinput txi_multisig" rel="multisig">
<span class="input-group-btn"><button class="btn sliderbtn up" type="button"><span class="glyphicon glyphicon-chevron-right"></span></button></span>
</div>
<h4 class="hodl"><abbr title="Spending from a time locked address. p2sh">Hodl</abbr> <small>Time Locked</small>
<span class="badge inputno" title="Number of Hodl Inputs">0</span>
<small><span class="bytes">0</span> bytes</small>
<small class="estimate hidden"><em> *estimate</em></small>
</h4>
<div class="input-group">
<span class="input-group-btn"><button class="btn sliderbtn down" type="button"><span class="glyphicon glyphicon-chevron-left"></span></button></span>
<input type="range" min="0" max="100" value="0" class="slider txinput txi_hodl" rel="hodl">
<span class="input-group-btn"><button class="btn sliderbtn up" type="button"><span class="glyphicon glyphicon-chevron-right"></span></button></span>
</div>
<h4 class="unknown"><abbr title="Spending from an unrecognized input. p2sh">Unknown</abbr>
<span class="badge inputno" title="Number of Unknown Inputs">0</span>
<small><span class="bytes">0</span> bytes</small>
<small class="estimate hidden"><em> *estimate</em></small>
</h4>
<div class="input-group">
<span class="input-group-btn"><button class="btn sliderbtn down" type="button"><span class="glyphicon glyphicon-chevron-left"></span></button></span>
<input type="range" min="0" max="100" value="0" class="slider txinput txi_unknown" rel="unknown">
<span class="input-group-btn"><button class="btn sliderbtn up" type="button"><span class="glyphicon glyphicon-chevron-right"></span></button></span>
</div>
<br>
</div>
<div class="col-md-6 txoutputs">
<div align="center"><b><span class="txtotal total">0</span><br>Outputs</b></div>
<div id="txoutputtype" align="center" class="small text-muted">
<br>
<span><span class="txsize">0</span> Bytes</span>
</div>
<h4 class="p2pkh"><abbr title="A pay 2 public key hash. Starts with 1. Used with legacy addresses">Regular</abbr> <small>p2pkh (1...)</small>
<span class="badge outputno" title="Number of p2pkh Outputs">2</span>
<small><span class="bytes">68</span> bytes</small>
<small class="estimate hidden"><em> *estimate</em></small>
</h4>
<div class="input-group">
<span class="input-group-btn"><button class="btn sliderbtn down" type="button"><span class="glyphicon glyphicon-chevron-left"></span></button></span>
<input type="range" min="0" max="100" value="2" class="slider txoutput txo_p2pkh" rel="p2pkh">
<span class="input-group-btn"><button class="btn sliderbtn up" type="button"><span class="glyphicon glyphicon-chevron-right"></span></button></span>
</div>
<h4 class="p2sh"><abbr title="A pay 2 script hash address. Starts with a 3. For example a segwit or multisig address">Regular</abbr> <small>p2sh (3...)</small>
<span class="badge outputno" title="Number of p2sh Outputs">0</span>
<small><span class="bytes">0</span> bytes</small>
<small class="estimate hidden"><em> *estimate</em></small>
</h4>
<div class="input-group">
<span class="input-group-btn"><button class="btn sliderbtn down" type="button"><span class="glyphicon glyphicon-chevron-left"></span></button></span>
<input type="range" min="0" max="100" value="0" class="slider txoutput txo_p2sh" rel="p2sh">
<span class="input-group-btn"><button class="btn sliderbtn up" type="button"><span class="glyphicon glyphicon-chevron-right"></span></button></span>
</div>
<br>
</div>
</div>
<br>
<div class="row">
<div class="col-md-12">
<div class="text-muted">Chargable Transaction Size: <span class="feeTxSize">0</span> bytes</div>
</div>
</div>
<hr>
<div class="row">
<div class="col-md-12 recommended">
<h3>Blockchain Data <span class="pull-right"><button type="button" id="feeStatsReload" class="btn btn-default btn-sm"><span class="glyphicon glyphicon-refresh"></span></button></span></h3>
<p>This is based on us comparing your transaction against a very recent transaction found in a very recent block</p>
<p><b>Block Height</b>: <span class="blockHeight">?</span></p>
<p class="hideOverflow"><b>Block #</b>: <span class="blockHash">?</span></p>
<p><b>Block Time</b>: <span class="blockTime">?</span> <span class="blockDateTime text-muted"></span></p>
<p class="hideOverflow"><b>Transaction ID</b>: <span class="txId">?</span></p>
<p><b>Transaction Size</b>: <span class="txSize">0</span> bytes</p>
<p><b>Transaction Fee</b>: <span class="txFee">0.00000000</span></p>
<p><b>Satoshi per Byte</b>: <span class="feeSatByte">0</span></p>
<p>Based on your data and this recently mined transaction we recommend a fee of <b><span class="recommendedFee">0.00000000</span> BTC</b> to get it into the next few blocks</p>
</div>
</div>
<br>
<div class="row">
<div class="col-md-12">
<a href="javascript:;" id="advancedFeesCollapse">
<div class="well well-sm"><span class="glyphicon glyphicon-collapse-down"></span> Advanced Options &amp; Raw Transaction</div>
</a>
</div>
</div>
<div class="row hidden" id="advancedFees">
<div class="col-md-12">
<p>Enter your unsigned or signed hex encoded transaction below:</p>
<textarea class="form-control txhex" style="height:160px"></textarea><br>
<button type="button" class="btn btn-primary" id="feesAnalyseBtn">Analyse Transaction</button>
<hr>
<h4>Estimate Input Size <small>in bytes</small></h4>
<div class="form-inline">
<div class="form-group">
<label for="est_txi_regular">Regular</label>
<input type="number" class="form-control" id="est_txi_regular" value="107">
</div>
<div class="form-group">
<label for="est_txi_segwit">SegWit</label>
<input type="number" class="form-control" id="est_txi_segwit" value="27">
</div>
<div class="form-group">
<label for="est_txi_multisig">MultiSig</label>
<input type="number" class="form-control" id="est_txi_multisig" value="351">
</div>
<div class="form-group">
<label for="est_txi_hodl">Hodl</label>
<input type="number" class="form-control" id="est_txi_hodl" value="78">
</div>
<div class="form-group">
<label for="est_txi_unknown">Unknown</label>
<input type="number" class="form-control" id="est_txi_unknown" value="512">
</div>
</div>
<h4>Estimate Output Size <small> in bytes</small></h4>
<div class="form-inline">
<div class="form-group">
<label for="est_txo_p2pkh">Regular P2PKH</label>
<input type="number" class="form-control" id="est_txo_p2pkh" value="25">
</div>
<div class="form-group">
<label for="est_txo_p2sh">Regular P2SH</label>
<input type="number" class="form-control" id="est_txo_p2sh" value="23">
</div>
</div>
</div>
</div>
</div>
<div class="tab-pane tab-content" id="verify">
<h2>Verify <small>transactions and other scripts</small></h2>
<div class="row">
@@ -847,7 +1110,33 @@
<div class="hidden verifyData" id="verifyPubKey">
<h4>Public key</h4>
<p><span style="float:right"><a href="" target="_blank" class="verifyLink" title="Link to this page"><span class="glyphicon glyphicon-link"></span></a></span>The above public key has been encoded to its address</p>
<p><b>Address</b>: <input type="text" class="form-control address" readonly></p>
<p><b>Legacy Address</b>: <input type="text" class="form-control address" readonly></p>
<div class="hidden verifyDataSw">
<hr>
<div class="row">
<div class="col-md-6">
<p><b>P2SH Segwit Address</b>: <input type="text" class="form-control addressSegWit" readonly></p>
</div>
<div class="col-md-6">
<p><b>P2SH Segwit Redeem Script</b>: <input type="text" class="form-control addressSegWitRedeemScript" readonly></p>
</div>
</div>
<hr>
<div class="row">
<div class="col-md-6">
<p><b>Bech32 Address</b>: <input type="text" class="form-control addressBech32" readonly></p>
</div>
<div class="col-md-6">
<p><b>Bech32 Redeem Script</b>: <input type="text" class="form-control addressBech32RedeemScript" readonly></p>
</div>
</div>
<br>
</div>
</div>
<div class="hidden verifyData" id="verifyHDaddress">
@@ -904,18 +1193,26 @@
<div class="row">
<div class="col-md-8">
<b>Path</b><br>
<select class="form-control">
<option>Simple: m/i</option>
<select class="form-control" id="hdpathtype"">
<option value="simple">Simple: m/i</option>
<option value="custom">Custom</option>
</select>
<div id="hdpath" class="hidden" style="margin-top:4px">
<span class="input-group">
<input type="text" class="form-control" value="m/0/1"> <br>
<span class="input-group-addon"> / </span>
</span>
</div>
</div>
<div class="col-md-2">
<b>Index (Start)</b><br>
<b><u>I</u>ndex (Start)</b><br>
<input type="text" class="form-control derivation_index_start" value="0">
</div>
<div class="col-md-2">
<b>Index (End)</b><br>
<b><u>I</u>ndex (End)</b><br>
<input type="text" class="form-control derivation_index_end" value="1">
</div>
@@ -1036,8 +1333,8 @@
<div class="tab-pane tab-content" id="about">
<h2>About <small>open source bitcoin wallet</small></h2>
<p>Version 1.3</p>
<p>Compatible with bitcoin-qt</p>
<p>Version 1.5</p>
<p>Compatible with bitcoin core</p>
<p>Github <a href="https://github.com/OutCast3k/coinbin/">https://github.com/OutCast3k/coinbin/</a></p>
<p>TOR <a href="http://4zpinp6gdkjfplhk.onion">4zpinp6gdkjfplhk.onion</a></p>
<h3>What is Bitcoin?</h3>
@@ -1047,11 +1344,11 @@
<p>Coinb.in is a free and open source project released under the MIT license, originally by <a href="https://bitcointalk.org/index.php?action=profile;u=34834" target="_blank">OutCast3k</a> in 2013. Discussion of the project can be found at <a href="https://bitcointalk.org/index.php?topic=390046" target="_blank">bitcointalk.org</a> during its early testing stages when its primary focus was to develop a proof of concept multisig solution in javascript.</p>
<p>Coinb.in is run and funded by the generosity of others in terms of <a href="https://github.com/OutCast3k/coinbin/graphs/contributors" target="_blank">development</a> and hosting.</p>
<h3>Privacy</h3>
<p>Coinb.in beleives strongly in privacy, not only do we support the use of TOR, the site does not collect and store IP or transaction data via our servers nor do we store your bitcoins private key. We do route traffic via cloudflare using an SSL certificate.</p>
<p>Coinb.in believes strongly in privacy, not only do we support the use of TOR, the site does not collect and store IP or transaction data via our servers nor do we store your bitcoins private key. We do route traffic via cloudflare using an SSL certificate.</p>
<h3>Support</h3>
<p>We recommend that you first check our <a href="https://status.coinb.in/" target="_blank">service status</a> page, if the problem persists you can contact us by emailing support{at}coinb.in.</p>
<p>We recommend that you first check our <a href="https://status.coinb.in/" target="_blank">service status</a> page and then <a href="https://blog.coinb.in/" target="_blank">blog</a> page which has multiple <a href="https://blog.coinb.in/guides" target="_blank">guides</a>. However if the problem persists you can contact us by emailing support{at}coinb.in.</p>
<h3>Donate</h3>
<p>Please donate to <a href="bitcoin:1CWHWkTWaq1K5hevimJia3cyinQsrgXUvg">1CWHWkTWaq1K5hevimJia3cyinQsrgXUvg</a> if you found this project useful or want to see more features!</p>
<p>Please donate to <a href="bitcoin:3K1oFZMks41C7qDYBsr72SYjapLqDuSYuN">3K1oFZMks41C7qDYBsr72SYjapLqDuSYuN</a> if you found this project useful or want to see more features!</p>
</div>
<div class="tab-pane tab-content" id="settings">
@@ -1064,7 +1361,8 @@
<p class="text-muted">Select which network you'd like to use for key pair generation.</p>
<select class="form-control" id="coinjs_coin">
<option value="bitcoin_mainnet" rel="0x00;0x80;0x05;0x488b21e;0x488ade4;coinb.in;coinb.in">Bitcoin (mainnet)</option>
<option value="dogecoin_mainnet" rel="0x1e;0x9e;0x16;0x0827421e;0x089944e4;chain.so_dogecoin;chain.so_dogecoin">Dogecoin (mainnet)</option>
<option value="litecoin_mainnet" rel="0x30;0xb0;0x32;0x019da462;0x019d9cfe;blockcypher_litecoin;blockcypher_litecoin">Litecoin (mainnet)</option>
<option value="dogecoin_mainnet" rel="0x1e;0x9e;0x16;0x0827421e;0x089944e4;blockcypher_dogecoin;blockcypher_dogecoin">Dogecoin (mainnet)</option>
<option value="carboncoin_mainnet" rel="0x2f;0xaf;0x05;0x488b21e;0x488ade4;cryptoid.info_carboncoin;cryptoid.info_carboncoin">Carboncoin (mainnet)</option>
<option value="shadowcash_mainnet" rel="0x3f;0xbf;0x7d;0xee80286a;0xee8031e8;false;false">ShadowCash (mainnet)</option>
<option value="bitcoin_testnet" rel="0x6f;0xef;0xc4;0x043587cf;0x04358394;false;false">Bitcoin (testnet)</option>
@@ -1121,8 +1419,14 @@
<p class="text-muted">Select the network you wish to broadcast the transaction via</p>
<select class="form-control" id="coinjs_broadcast">
<option value="coinb.in">coinb.in (Bitcoin mainnet)</option>
<option value="chain.so_bitcoinmainnet"> Chain.so (Bitcoin mainnet)</option>
<option value="blockcypher_bitcoinmainnet"> Blockcypher.com (Bitcoin mainnet)</option>
<option value="blockcypher_litecoin"> Blockcypher.com (Litecoin)</option>
<option value="blockcypher_dogecoin"> Blockcypher.com (Dogecoin)</option>
<option value="blockchair_bitcoinmainnet"> Blockchair.com (Bitcoin mainnet)</option>
<option value="blockchair_litecoin"> Blockchair.com (Litecoin)</option>
<option value="blockchair_dogecoin"> Blockchair.com (Dogecoin)</option>
<option value="chain.so_bitcoinmainnet"> Chain.so (Bitcoin mainnet)</option>
<option value="chain.so_litecoin"> Chain.so (Litecoin)</option>
<option value="chain.so_dogecoin"> Chain.so (Dogecoin)</option>
<option value="cryptoid.info_carboncoin"> Cryptoid.info (Carboncoin)</option>
</select>
@@ -1137,6 +1441,13 @@
<p class="text-muted">Select the network you wish to retreive your unspent inputs from</p>
<select class="form-control" id="coinjs_utxo">
<option value="coinb.in">coinb.in (Bitcoin mainnet)</option>
<option value="blockcypher_bitcoinmainnet"> Blockcypher.com (Bitcoin mainnet)</option>
<option value="blockcypher_litecoin"> Blockcypher.com (Litecoin)</option>
<option value="blockcypher_dogecoin"> Blockcypher.com (Dogecoin)</option>
<option value="blockchair_bitcoinmainnet"> Blockchair.com (Bitcoin mainnet)</option>
<option value="blockchair_litecoin"> Blockchair.com (Litecoin)</option>
<option value="blockchair_dogecoin"> Blockchair.com (Dogecoin)</option>
<option value="chain.so_bitcoinmainnet"> Chain.so (Bitcoin mainnet)</option>
<option value="chain.so_litecoin"> Chain.so (Litecoin)</option>
<option value="chain.so_dogecoin"> Chain.so (Dogecoin)</option>
<option value="cryptoid.info_carboncoin"> Cryptoid.info (Carboncoin)</option>
@@ -1163,7 +1474,7 @@
<div id="footer">
<div class="container text-right">
<p class="text-muted">Version 1.3</p>
<p class="text-muted">Version 1.5</p>
</div>
</div>
+291 -36
View File
@@ -14,14 +14,16 @@
coinjs.priv = 0x80;
coinjs.multisig = 0x05;
coinjs.hdkey = {'prv':0x0488ade4, 'pub':0x0488b21e};
coinjs.bech32 = {'charset':'qpzry9x8gf2tvdw0s3jn54khce6mua7l', 'version':0, 'hrp':'bc'};
coinjs.compressed = false;
/* other vars */
coinjs.developer = '1CWHWkTWaq1K5hevimJia3cyinQsrgXUvg'; // bitcoin
coinjs.developer = '3K1oFZMks41C7qDYBsr72SYjapLqDuSYuN'; //bitcoin
/* bit(coinb.in) api vars */
coinjs.host = ('https:'==document.location.protocol?'https://':'http://')+'coinb.in/api/';
coinjs.hostname = ((document.location.hostname.split(".")[(document.location.hostname.split(".")).length-1]) == 'onion') ? '4zpinp6gdkjfplhk.onion' : 'coinb.in';
coinjs.host = ('https:'==document.location.protocol?'https://':'http://')+coinjs.hostname+'/api/';
coinjs.uid = '1';
coinjs.key = '12345678901234567890123456789012';
@@ -132,7 +134,13 @@
var checksum = r.slice(0,4);
var redeemScript = Crypto.util.bytesToHex(s.buffer);
var address = coinjs.base58encode(x.concat(checksum));
return {'address':address, 'redeemScript':redeemScript};
if(s.buffer.length > 520){ // too large
address = 'invalid';
redeemScript = 'invalid';
}
return {'address':address, 'redeemScript':redeemScript, 'size': s.buffer.length};
}
/* new time locked address, provide the pubkey and time necessary to unlock the funds.
@@ -148,7 +156,11 @@
}
var s = coinjs.script();
s.writeBytes(coinjs.numToByteArray(checklocktimeverify));
if (checklocktimeverify <= 16 && checklocktimeverify >= 1) {
s.writeOp(0x50 + checklocktimeverify);//OP_1 to OP_16 for minimal encoding
} else {
s.writeBytes(coinjs.numToScriptNumBytes(checklocktimeverify));
}
s.writeOp(177);//OP_CHECKLOCKTIMEVERIFY
s.writeOp(117);//OP_DROP
s.writeBytes(Crypto.util.hexToBytes(pubkey));
@@ -178,6 +190,24 @@
return {'address':address, 'type':'segwit', 'redeemscript':Crypto.util.bytesToHex(keyhash)};
}
/* create a new segwit bech32 encoded address */
coinjs.bech32Address = function(pubkey){
var program = ripemd160(Crypto.SHA256(Crypto.util.hexToBytes(pubkey), {asBytes: true}), {asBytes: true});
var address = coinjs.bech32_encode(coinjs.bech32.hrp, [coinjs.bech32.version].concat(coinjs.bech32_convert(program, 8, 5, true)));
return {'address':address, 'type':'bech32', 'redeemscript':Crypto.util.bytesToHex(program)};
}
/* extract the redeemscript from a bech32 address */
coinjs.bech32redeemscript = function(address){
var r = false;
var decode = coinjs.bech32_decode(address);
if(decode){
decode.data.shift();
return Crypto.util.bytesToHex(coinjs.bech32_convert(decode.data, 5, 8, true));
}
return r;
}
/* provide a privkey and return an WIF */
coinjs.privkey2wif = function(h){
var r = Crypto.util.hexToBytes(h);
@@ -280,7 +310,12 @@
return false;
}
} catch(e) {
return false;
bech32rs = coinjs.bech32redeemscript(addr);
if(bech32rs){
return {'type':'bech32', 'redeemscript':bech32rs};
} else {
return false;
}
}
}
@@ -310,6 +345,126 @@
return false;
}
coinjs.bech32_polymod = function(values) {
var chk = 1;
var BECH32_GENERATOR = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3];
for (var p = 0; p < values.length; ++p) {
var top = chk >> 25;
chk = (chk & 0x1ffffff) << 5 ^ values[p];
for (var i = 0; i < 5; ++i) {
if ((top >> i) & 1) {
chk ^= BECH32_GENERATOR[i];
}
}
}
return chk;
}
coinjs.bech32_hrpExpand = function(hrp) {
var ret = [];
var p;
for (p = 0; p < hrp.length; ++p) {
ret.push(hrp.charCodeAt(p) >> 5);
}
ret.push(0);
for (p = 0; p < hrp.length; ++p) {
ret.push(hrp.charCodeAt(p) & 31);
}
return ret;
}
coinjs. bech32_verifyChecksum = function(hrp, data) {
return coinjs.bech32_polymod(coinjs.bech32_hrpExpand(hrp).concat(data)) === 1;
}
coinjs.bech32_createChecksum = function(hrp, data) {
var values = coinjs.bech32_hrpExpand(hrp).concat(data).concat([0, 0, 0, 0, 0, 0]);
var mod = coinjs.bech32_polymod(values) ^ 1;
var ret = [];
for (var p = 0; p < 6; ++p) {
ret.push((mod >> 5 * (5 - p)) & 31);
}
return ret;
}
coinjs.bech32_encode = function(hrp, data) {
var combined = data.concat(coinjs.bech32_createChecksum(hrp, data));
var ret = hrp + '1';
for (var p = 0; p < combined.length; ++p) {
ret += coinjs.bech32.charset.charAt(combined[p]);
}
return ret;
}
coinjs.bech32_decode = function(bechString) {
var p;
var has_lower = false;
var has_upper = false;
for (p = 0; p < bechString.length; ++p) {
if (bechString.charCodeAt(p) < 33 || bechString.charCodeAt(p) > 126) {
return null;
}
if (bechString.charCodeAt(p) >= 97 && bechString.charCodeAt(p) <= 122) {
has_lower = true;
}
if (bechString.charCodeAt(p) >= 65 && bechString.charCodeAt(p) <= 90) {
has_upper = true;
}
}
if (has_lower && has_upper) {
return null;
}
bechString = bechString.toLowerCase();
var pos = bechString.lastIndexOf('1');
if (pos < 1 || pos + 7 > bechString.length || bechString.length > 90) {
return null;
}
var hrp = bechString.substring(0, pos);
var data = [];
for (p = pos + 1; p < bechString.length; ++p) {
var d = coinjs.bech32.charset.indexOf(bechString.charAt(p));
if (d === -1) {
return null;
}
data.push(d);
}
if (!coinjs.bech32_verifyChecksum(hrp, data)) {
return null;
}
return {
hrp: hrp,
data: data.slice(0, data.length - 6)
};
}
coinjs.bech32_convert = function(data, inBits, outBits, pad) {
var value = 0;
var bits = 0;
var maxV = (1 << outBits) - 1;
var result = [];
for (var i = 0; i < data.length; ++i) {
value = (value << inBits) | data[i];
bits += inBits;
while (bits >= outBits) {
bits -= outBits;
result.push((value >> bits) & maxV);
}
}
if (pad) {
if (bits > 0) {
result.push((value << (outBits - bits)) & maxV);
}
} else {
if (bits >= inBits) throw new Error('Excess padding');
if ((value << (outBits - bits)) & maxV) throw new Error('Non-zero padding');
}
return result;
}
coinjs.testdeterministicK = function() {
// https://github.com/bitpay/bitcore/blob/9a5193d8e94b0bd5b8e7f00038e7c0b935405a03/test/crypto/ecdsa.js
// Line 21 and 22 specify digest hash and privkey for the first 2 test vectors.
@@ -483,6 +638,8 @@
coinjs.compressed = c; // reset to default
}
return r;
}
// extend prv/pub key
@@ -496,8 +653,37 @@
'pubkey':this.keys.pubkey});
}
// derive from path
r.derive_path = function(path) {
if( path == 'm' || path == 'M' || path == 'm\'' || path == 'M\'' ) return this;
var p = path.split('/');
var hdp = coinjs.clone(this); // clone hd path
for( var i in p ) {
if((( i == 0 ) && c != 'm') || i == 'remove'){
continue;
}
var c = p[i];
var use_private = (c.length > 1) && (c[c.length-1] == '\'');
var child_index = parseInt(use_private ? c.slice(0, c.length - 1) : c) & 0x7fffffff;
if(use_private)
child_index += 0x80000000;
hdp = hdp.derive(child_index);
var key = ((hdp.keys_extended.privkey) && hdp.keys_extended.privkey!='') ? hdp.keys_extended.privkey : hdp.keys_extended.pubkey;
hdp = coinjs.hd(key);
}
return hdp;
}
// derive key from index
r.derive = function(i){
i = (i)?i:0;
var blob = (Crypto.util.hexToBytes(this.keys.pubkey)).concat(coinjs.numToBytes(i,4).reverse());
@@ -552,7 +738,6 @@
o.parent_fingerprint = (ripemd160(Crypto.SHA256(Crypto.util.hexToBytes(r.keys.pubkey),{asBytes:true}),{asBytes:true})).slice(0,4);
o.keys_extended = o.extend();
return o;
}
@@ -617,8 +802,7 @@
return o;
}
r.parse();
return r;
return r.parse();
}
@@ -696,6 +880,9 @@
var multi = coinjs.pubkeys2MultisigAddress(pubkeys, r.signaturesRequired);
r.address = multi['address'];
r.type = 'multisig__'; // using __ for now to differentiat from the other object .type == "multisig"
var rs = Crypto.util.bytesToHex(s.buffer);
r.redeemscript = rs;
} else if((s.chunks.length==2) && (s.buffer[0] == 0 && s.buffer[1] == 20)){ // SEGWIT
r = {};
r.type = "segwit__";
@@ -709,6 +896,8 @@
r.pubkey = Crypto.util.bytesToHex(s.chunks[3]);
r.checklocktimeverify = coinjs.bytesToNum(s.chunks[0].slice());
r.address = coinjs.simpleHodlAddress(r.pubkey, r.checklocktimeverify).address;
var rs = Crypto.util.bytesToHex(s.buffer);
r.redeemscript = rs;
r.type = "hodl__";
}
} catch(e) {
@@ -722,7 +911,10 @@
r.spendToScript = function(address){
var addr = coinjs.addressDecode(address);
var s = coinjs.script();
if(addr.version==coinjs.multisig){ // multisig address
if(addr.type == "bech32"){
s.writeOp(0);
s.writeBytes(Crypto.util.hexToBytes(addr.redeemscript));
} else if(addr.version==coinjs.multisig){ // multisig address
s.writeOp(169); //OP_HASH160
s.writeBytes(addr.bytes);
s.writeOp(135); //OP_EQUAL
@@ -792,7 +984,7 @@
r.lock_time = 0;
r.ins = [];
r.outs = [];
r.witness = [];
r.witness = false;
r.timestamp = null;
r.block = null;
@@ -876,11 +1068,10 @@
}
/* add unspent to transaction */
r.addUnspent = function(address, callback){
r.addUnspent = function(address, callback, script, segwit, sequence){
var self = this;
this.listUnspent(address, function(data){
var s = coinjs.script();
var pubkeyScript = s.pubkeyHash(address);
var value = 0;
var total = 0;
var x = {};
@@ -900,10 +1091,21 @@
var u = xmlDoc.getElementsByTagName("unspent_"+i)[0]
var txhash = (u.getElementsByTagName("tx_hash")[0].childNodes[0].nodeValue).match(/.{1,2}/g).reverse().join("")+'';
var n = u.getElementsByTagName("tx_output_n")[0].childNodes[0].nodeValue;
var script = u.getElementsByTagName("script")[0].childNodes[0].nodeValue;
var scr = script || u.getElementsByTagName("script")[0].childNodes[0].nodeValue;
self.addinput(txhash, n, script);
if(segwit){
/* this is a small hack to include the value with the redeemscript to make the signing procedure smoother.
It is not standard and removed during the signing procedure. */
s = coinjs.script();
s.writeBytes(Crypto.util.hexToBytes(script));
s.writeOp(0);
s.writeBytes(coinjs.numToBytes(u.getElementsByTagName("value")[0].childNodes[0].nodeValue*1, 8));
scr = Crypto.util.bytesToHex(s.buffer);
}
var seq = sequence || false;
self.addinput(txhash, n, scr, seq);
value += u.getElementsByTagName("value")[0].childNodes[0].nodeValue*1;
total++;
}
@@ -1026,20 +1228,24 @@
return {'result':0, 'fail':'redeemscript', 'response':'redeemscript missing or not valid for segwit'};
}
var scriptcode = Crypto.util.hexToBytes(extract['script']);
if(scriptcode[0] != 0){
return {'result':0, 'fail':'scriptcode', 'response':'redeemscript is not valid'};
}
if(extract['value'] == -1){
return {'result':0, 'fail':'value', 'response':'unable to generate a valid segwit hash without a value'};
}
var scriptcode = Crypto.util.hexToBytes(extract['script']);
// end of redeem script check
scriptcode = scriptcode.slice(1);
scriptcode.unshift(25, 118, 169);
scriptcode.push(136, 172);
/* P2WPKH */
if(scriptcode.length == 20){
scriptcode = [0x00,0x14].concat(scriptcode);
}
if(scriptcode.length == 22){
scriptcode = scriptcode.slice(1);
scriptcode.unshift(25, 118, 169);
scriptcode.push(136, 172);
}
var value = coinjs.numToBytes(extract['value'], 8);
@@ -1120,8 +1326,7 @@
} else if(this.ins[index].script.chunks.length == 5 && this.ins[index].script.chunks[1] == 177){//OP_CHECKLOCKTIMEVERIFY
// hodl script (not signed)
return {'type':'hodl', 'signed':'false', 'signatures': 0, 'script': Crypto.util.bytesToHex(this.ins[index].script.buffer)};
} else if((this.ins[index].script.chunks.length <= 3 && this.ins[index].script.chunks.length > 0) && this.ins[index].script.chunks[0].length == 22 && this.ins[index].script.chunks[0][0] == 0){
// segwit script
} else if((this.ins[index].script.chunks.length <= 3 && this.ins[index].script.chunks.length > 0) && ((this.ins[index].script.chunks[0].length == 22 && this.ins[index].script.chunks[0][0] == 0) || (this.ins[index].script.chunks[0].length == 20 && this.ins[index].script.chunks[1] == 0))){
var signed = ((this.witness[index]) && this.witness[index].length==2) ? 'true' : 'false';
var sigs = (signed == 'true') ? 1 : 0;
var value = -1; // no value found
@@ -1350,10 +1555,13 @@
var wif2 = coinjs.wif2pubkey(wif);
var segwit = coinjs.segwitAddress(wif2['pubkey']);
var bech32 = coinjs.bech32Address(wif2['pubkey']);
if(segwit['redeemscript'] == Crypto.util.bytesToHex(this.ins[index].script.chunks[0])){
if((segwit['redeemscript'] == Crypto.util.bytesToHex(this.ins[index].script.chunks[0])) || (bech32['redeemscript'] == Crypto.util.bytesToHex(this.ins[index].script.chunks[0]))){
var txhash = this.transactionHashSegWitV0(index, shType);
if(txhash.result == 1){
var segwitHash = Crypto.util.hexToBytes(txhash.hash);
var signature = this.transactionSig(index, wif, shType, segwitHash);
@@ -1362,18 +1570,46 @@
script.writeBytes(this.ins[index].script.chunks[0]);
this.ins[index].script = script;
if(!coinjs.isArray(this.witness)){
this.witness = [];
}
this.witness.push([signature, wif2['pubkey']]);
/* reorder witness data */
/* attempt to reorder witness data as best as we can.
data can't be easily validated at this stage as
we dont have access to the inputs value and
making a web call will be too slow. */
var witness_order = [];
var witness_used = [];
for(var i = 0; i < this.ins.length; i++){
for(var y = 0; y < this.witness.length; y++){
var sw = coinjs.segwitAddress(this.witness[y][1]);
if(sw['redeemscript'] == Crypto.util.bytesToHex(this.ins[i].script.chunks[0])){
witness_order.push(this.witness[y]);
if(!witness_used.includes(y)){
var sw = coinjs.segwitAddress(this.witness[y][1]);
var b32 = coinjs.bech32Address(this.witness[y][1]);
var rs = '';
if(this.ins[i].script.chunks.length>=1){
rs = Crypto.util.bytesToHex(this.ins[i].script.chunks[0]);
} else if (this.ins[i].script.chunks.length==0){
rs = b32['redeemscript'];
}
if((sw['redeemscript'] == rs) || (b32['redeemscript'] == rs)){
witness_order.push(this.witness[y]);
witness_used.push(y);
// bech32, empty redeemscript
if(b32['redeemscript'] == rs){
this.ins[index].script = coinjs.script();
}
break;
}
}
}
}
this.witness = witness_order;
}
}
@@ -1414,7 +1650,7 @@
var buffer = [];
buffer = buffer.concat(coinjs.numToBytes(parseInt(this.version),4));
if(this.witness.length>=1){
if(coinjs.isArray(this.witness)){
buffer = buffer.concat([0x00, 0x01]);
}
@@ -1438,7 +1674,7 @@
buffer = buffer.concat(scriptBytes);
}
if(this.witness.length>=1){
if((coinjs.isArray(this.witness)) && this.witness.length>=1){
for(var i = 0; i < this.witness.length; i++){
buffer = buffer.concat(coinjs.numToVarInt(this.witness[i].length));
for(var x = 0; x < this.witness[i].length; x++){
@@ -1721,12 +1957,31 @@
}
}
coinjs.numToByteArray = function(num) {
if (num <= 256) {
return [num];
} else {
return [num % 256].concat(coinjs.numToByteArray(Math.floor(num / 256)));
function scriptNumSize(i) {
return i > 0x7fffffff ? 5
: i > 0x7fffff ? 4
: i > 0x7fff ? 3
: i > 0x7f ? 2
: i > 0x00 ? 1
: 0;
}
coinjs.numToScriptNumBytes = function(_number) {
var value = Math.abs(_number);
var size = scriptNumSize(value);
var result = [];
for (var i = 0; i < size; ++i) {
result.push(0);
}
var negative = _number < 0;
for (i = 0; i < size; ++i) {
result[i] = value & 0xff;
value = Math.floor(value / 256);
}
if (negative) {
result[size - 1] |= 0x80;
}
return result;
}
coinjs.numToVarInt = function(num) {
+625 -94
View File
File diff suppressed because it is too large Load Diff
+7 -6
View File
@@ -1,9 +1,9 @@
---- Version 1.3 2017.09.10 ----
---- Version 1.4 2019.12.25 ----
77e4519962e2f6a9fc93342137dbb31c33b76b04 ./js/aes.js
3a09a8fc0cfe828b57fc798d668234d0490ee1a6 ./js/bootstrap-datetimepicker.min.js
253711c6d825de55a8360552573be950da180614 ./js/bootstrap.min.js
b98f718f0400fada4e0f15471031f92ce31e2b83 ./js/coinbin.js
3e7b9b1a30412f827d4709a53014d0b6f06103f0 ./js/coin.js
17cc6a56ee601fbe3858563f26232f64ce12abcb ./js/coinbin.js
dc83017470f3ced2b0d522781b3ccded0d3a8d28 ./js/coin.js
988565bc2cb402d63ed5c5fd7ff47c4278efc2c5 ./js/collapse.js
9ba5ede3d7f9d4c8fd623395f196adfdcf7e970f ./js/crypto-min.js
f7c09f2f5a721371e7d478050119f7e2d58e3ef9 ./js/crypto-sha256-hmac.js
@@ -21,7 +21,8 @@ ad038e1f39646b68ae666324ed4c2882a8c42474 ./js/qrcode.js
255c58c17e63eb54adb3cd02b5c06224c67fc364 ./css/bootstrap-datetimepicker.min.css
ed29315e0ffb3f14382431f2724235bf67f44eb3 ./css/bootstrap.min.css
fc6b4268fbd57ad95d2b41a1d4d6866f222fbdb2 ./css/bootstrap-theme.min.css
4198ed869836ea5727ad6b80bf2df0a9c1a83244 ./css/style.css
eb54f374256b75a17f274847b4ca9985fd046f9f ./css/style.css
2e3217a3f3b7c2fb30562ab9a4ef9a407ae81897 ./images/btc32x.png
8ac24915d59cef71c542e7cb7d7e153f560cba1f ./images/coinbin.gif
f2af060f1cadbc9065c8c465c648dc01be67cc12 ./images/loader.gif
86b6f62b7853e67d3e635f6512a5a5efc58ea3c3 ./fonts/glyphicons-halflings-regular.eot
@@ -29,5 +30,5 @@ ca35b697d99cae4d1b60f2d60fcd37771987eb07 ./fonts/glyphicons-halflings-regular.w
de51a8494180a6db074af2dee2383f0a363c5b08 ./fonts/glyphicons-halflings-regular.svg
278e49a86e634da6f2a02f3b47dd9d2a8f26210f ./fonts/glyphicons-halflings-regular.woff
44bc1850f570972267b169ae18f1cb06b611ffa2 ./fonts/glyphicons-halflings-regular.ttf
d8a324a13501cd5705dc26b945fc8088f00907ae ./README.md
da6e4cbb4a168a3583086e0997c8c678a7a80925 ./index.html
4665ee4d8ca96db25954f6f3587ac367386eb9e8 ./README.md
9cf7084c331b7c536f5f6e34533300c3d9d3e038 ./index.html