mirror of
https://github.com/ok2/coinbin.git
synced 2026-05-09 18:15:23 +02:00
Compare commits
175 Commits
1.2a
...
full_featured
| Author | SHA1 | Date | |
|---|---|---|---|
| cea94af32f | |||
| 3b1e44e4b4 | |||
| 06054a7000 | |||
| 6a6c2c6beb | |||
| 04609947e8 | |||
| 40a235eb04 | |||
| 20bf365d29 | |||
| 632572fc66 | |||
| 00519cb2ab | |||
| 2b6de3edef | |||
| f408c9b251 | |||
| bd82cfd76f | |||
| 27a2d4efb1 | |||
| 704f2c96a3 | |||
| 29baeff8c8 | |||
| 9a0175e18f | |||
| 507b44f719 | |||
| c868cf984e | |||
| b4fd55aebe | |||
| f51be92a72 | |||
| 06cf50abb3 | |||
| 35de4228d8 | |||
| a4ef169031 | |||
| 6bb5e3785a | |||
| a199d3a55c | |||
| 7e92530e1a | |||
| f5c2f48efc | |||
| 4f3ceeb3ea | |||
| 73369dd253 | |||
| 6ed0d3e07e | |||
| 84304f23ea | |||
| 44ba1b3d30 | |||
| 5583675390 | |||
| 56cb104ea4 | |||
| c6f70d000e | |||
| 4836b20fae | |||
| f364ae4b4a | |||
| 64cb387247 | |||
| b2a86006cf | |||
| b5ebaafed8 | |||
| d4f47fce28 | |||
| 5bd3786f94 | |||
| b77f3cf06a | |||
| b0c6c3a516 | |||
| a6f5dcf7f0 | |||
| cf2a8b01cb | |||
| 261c4ace40 | |||
| e18b634c4e | |||
| 1f3b878d63 | |||
| efc16c10fb | |||
| 477ca8890d | |||
| e73e8093b3 | |||
| 40ea3230fd | |||
| dc416c6521 | |||
| fc66bc9423 | |||
| 1c10bef510 | |||
| b22e79391f | |||
| 0be8fd9a97 | |||
| 1a364ff770 | |||
| bc0c72117e | |||
| 13c50cf4b6 | |||
| dea1d1b274 | |||
| e6c70d133b | |||
| 10aa011c6e | |||
| c7a0fda7e5 | |||
| c9cfeefc86 | |||
| cdf4aa105b | |||
| 2fc574dde0 | |||
| f088ec2e52 | |||
| 9ccd73808d | |||
| cb81362330 | |||
| fcbf25eaec | |||
| 2aca9ab28d | |||
| 5c581316fe | |||
| ebfb940dd5 | |||
| 3201550d40 | |||
| d88ec3db4b | |||
| 530453a701 | |||
| 194df37d56 | |||
| 87461b58b8 | |||
| 739aee3c0f | |||
| fd81fafdff | |||
| 9bede2aef4 | |||
| 37f4395d9f | |||
| 5a65a77bd2 | |||
| 734e6b2eeb | |||
| 90a309d4b4 | |||
| abd2191c50 | |||
| bb8abb4ded | |||
| 40d514e0f0 | |||
| c3b1a47199 | |||
| ed7d5d6411 | |||
| 10e083bd89 | |||
| 56fa7b5139 | |||
| e85276dd89 | |||
| c843685662 | |||
| 64af126bc5 | |||
| b997751791 | |||
| 9bccc5c512 | |||
| 217897285e | |||
| b1603821da | |||
| c2ef949dd0 | |||
| ecb18acb0f | |||
| 4a4f302fe6 | |||
| 4afee020b0 | |||
| 2e0422656d | |||
| 6c480a1102 | |||
| d5fe5ea828 | |||
| 52b206c7d6 | |||
| 1f9d9e97c2 | |||
| d12b9d9072 | |||
| 6c22adaa5a | |||
| 605a6df343 | |||
| 60efbb5174 | |||
| 1b111b335d | |||
| 24028a001d | |||
| f4c2b3d425 | |||
| 20547ff133 | |||
| 858774b640 | |||
| 21ecedaa48 | |||
| 3c1e957519 | |||
| 44e6f5c639 | |||
| d176899774 | |||
| 970cd756ec | |||
| b6dfa6b822 | |||
| 85c9267379 | |||
| 0c3530590f | |||
| 74a0fad4d2 | |||
| 67f9c1f926 | |||
| 67bd6e927c | |||
| 284c6361e7 | |||
| 347ccf4947 | |||
| 8ac9f4207d | |||
| 3ba79f0e3d | |||
| cad1f6e98b | |||
| e818fc738d | |||
| 0a94fb64ef | |||
| e3fff74690 | |||
| 0154514309 | |||
| 1e8773c195 | |||
| 1ea47f6ff5 | |||
| b943cbd6de | |||
| 53c48af90c | |||
| 6970a07d60 | |||
| 695947b02d | |||
| 0a8bb6f33a | |||
| 27c9bff17e | |||
| c276998687 | |||
| 4f16149a26 | |||
| 7bfacd51b1 | |||
| 1da38e46f7 | |||
| 133a5d2858 | |||
| a9cfa44c44 | |||
| cedc6dddaf | |||
| d53c236ec3 | |||
| c8577e03be | |||
| 9a669885b3 | |||
| 8652fe789d | |||
| 6b39b86447 | |||
| 902370679f | |||
| ab395a82f2 | |||
| fe141b0b8a | |||
| e33b2dc58e | |||
| a62a822b71 | |||
| 91ee89282f | |||
| 42391aba8e | |||
| 8e0742d64c | |||
| a1c3c60244 | |||
| 004de1f318 | |||
| 6f8cd22d5f | |||
| cacc30cc95 | |||
| d2f1d3a5d5 | |||
| 1c3e81bfd2 | |||
| cf71efcf59 | |||
| da2d20f477 |
@@ -1,7 +1,7 @@
|
|||||||
coinbin
|
coinbin
|
||||||
=======
|
=======
|
||||||
|
|
||||||
A Open Source Browser Based Bitcoin Wallet. Version 1.2 beta by OutCast3k
|
A Open Source Browser Based Bitcoin Wallet. Version 1.6 beta by OutCast3k
|
||||||
|
|
||||||
Live version available at http://coinb.in/ or http://4zpinp6gdkjfplhk.onion
|
Live version available at http://coinb.in/ or http://4zpinp6gdkjfplhk.onion
|
||||||
|
|
||||||
@@ -24,7 +24,13 @@ Coinb.in supports a number of key features such as:
|
|||||||
- Brain wallet support.
|
- Brain wallet support.
|
||||||
- Compatible with bitcoin-qt
|
- Compatible with bitcoin-qt
|
||||||
- An offical .onion address for tor users.
|
- An offical .onion address for tor users.
|
||||||
- Offline qrcode creator and scanning tool
|
- Offline qrcode creator and scanning tool.
|
||||||
- HD (bip32) support
|
- HD (bip32) support.
|
||||||
|
- Supports altcoins such as litecoin.
|
||||||
|
- Replace by fee (RBF) Support.
|
||||||
|
- Segwit Support.
|
||||||
|
- Bech32 address support.
|
||||||
|
- Fee calculator - https://coinb.in/#fees
|
||||||
|
- Transaction rebuild support for RBF and double spending.
|
||||||
|
|
||||||
Donate to 1CWHWkTWaq1K5hevimJia3cyinQsrgXUvg to see more development!
|
Donate to 33tht1bKDgZVxb39MnZsWa8oxHXHvUYE4G to see more development!
|
||||||
|
|||||||
Vendored
+5
File diff suppressed because one or more lines are too long
@@ -24,3 +24,97 @@ body {
|
|||||||
background-color: #f5f5f5;
|
background-color: #f5f5f5;
|
||||||
padding-top: 20px;
|
padding-top: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.alert {
|
||||||
|
overflow: hidden;
|
||||||
|
-ms-text-overflow: ellipsis;
|
||||||
|
-o-text-overflow: ellipsis;
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 1.4 KiB |
+747
-56
File diff suppressed because it is too large
Load Diff
Vendored
+9
File diff suppressed because one or more lines are too long
+747
-90
File diff suppressed because it is too large
Load Diff
+1286
-175
File diff suppressed because it is too large
Load Diff
+211
@@ -0,0 +1,211 @@
|
|||||||
|
/* ========================================================================
|
||||||
|
* Bootstrap: collapse.js v3.3.4
|
||||||
|
* http://getbootstrap.com/javascript/#collapse
|
||||||
|
* ========================================================================
|
||||||
|
* Copyright 2011-2015 Twitter, Inc.
|
||||||
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||||
|
* ======================================================================== */
|
||||||
|
|
||||||
|
|
||||||
|
+function ($) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
// COLLAPSE PUBLIC CLASS DEFINITION
|
||||||
|
// ================================
|
||||||
|
|
||||||
|
var Collapse = function (element, options) {
|
||||||
|
this.$element = $(element)
|
||||||
|
this.options = $.extend({}, Collapse.DEFAULTS, options)
|
||||||
|
this.$trigger = $('[data-toggle="collapse"][href="#' + element.id + '"],' +
|
||||||
|
'[data-toggle="collapse"][data-target="#' + element.id + '"]')
|
||||||
|
this.transitioning = null
|
||||||
|
|
||||||
|
if (this.options.parent) {
|
||||||
|
this.$parent = this.getParent()
|
||||||
|
} else {
|
||||||
|
this.addAriaAndCollapsedClass(this.$element, this.$trigger)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.options.toggle) this.toggle()
|
||||||
|
}
|
||||||
|
|
||||||
|
Collapse.VERSION = '3.3.4'
|
||||||
|
|
||||||
|
Collapse.TRANSITION_DURATION = 350
|
||||||
|
|
||||||
|
Collapse.DEFAULTS = {
|
||||||
|
toggle: true
|
||||||
|
}
|
||||||
|
|
||||||
|
Collapse.prototype.dimension = function () {
|
||||||
|
var hasWidth = this.$element.hasClass('width')
|
||||||
|
return hasWidth ? 'width' : 'height'
|
||||||
|
}
|
||||||
|
|
||||||
|
Collapse.prototype.show = function () {
|
||||||
|
if (this.transitioning || this.$element.hasClass('in')) return
|
||||||
|
|
||||||
|
var activesData
|
||||||
|
var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing')
|
||||||
|
|
||||||
|
if (actives && actives.length) {
|
||||||
|
activesData = actives.data('bs.collapse')
|
||||||
|
if (activesData && activesData.transitioning) return
|
||||||
|
}
|
||||||
|
|
||||||
|
var startEvent = $.Event('show.bs.collapse')
|
||||||
|
this.$element.trigger(startEvent)
|
||||||
|
if (startEvent.isDefaultPrevented()) return
|
||||||
|
|
||||||
|
if (actives && actives.length) {
|
||||||
|
Plugin.call(actives, 'hide')
|
||||||
|
activesData || actives.data('bs.collapse', null)
|
||||||
|
}
|
||||||
|
|
||||||
|
var dimension = this.dimension()
|
||||||
|
|
||||||
|
this.$element
|
||||||
|
.removeClass('collapse')
|
||||||
|
.addClass('collapsing')[dimension](0)
|
||||||
|
.attr('aria-expanded', true)
|
||||||
|
|
||||||
|
this.$trigger
|
||||||
|
.removeClass('collapsed')
|
||||||
|
.attr('aria-expanded', true)
|
||||||
|
|
||||||
|
this.transitioning = 1
|
||||||
|
|
||||||
|
var complete = function () {
|
||||||
|
this.$element
|
||||||
|
.removeClass('collapsing')
|
||||||
|
.addClass('collapse in')[dimension]('')
|
||||||
|
this.transitioning = 0
|
||||||
|
this.$element
|
||||||
|
.trigger('shown.bs.collapse')
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$.support.transition) return complete.call(this)
|
||||||
|
|
||||||
|
var scrollSize = $.camelCase(['scroll', dimension].join('-'))
|
||||||
|
|
||||||
|
this.$element
|
||||||
|
.one('bsTransitionEnd', $.proxy(complete, this))
|
||||||
|
.emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])
|
||||||
|
}
|
||||||
|
|
||||||
|
Collapse.prototype.hide = function () {
|
||||||
|
if (this.transitioning || !this.$element.hasClass('in')) return
|
||||||
|
|
||||||
|
var startEvent = $.Event('hide.bs.collapse')
|
||||||
|
this.$element.trigger(startEvent)
|
||||||
|
if (startEvent.isDefaultPrevented()) return
|
||||||
|
|
||||||
|
var dimension = this.dimension()
|
||||||
|
|
||||||
|
this.$element[dimension](this.$element[dimension]())[0].offsetHeight
|
||||||
|
|
||||||
|
this.$element
|
||||||
|
.addClass('collapsing')
|
||||||
|
.removeClass('collapse in')
|
||||||
|
.attr('aria-expanded', false)
|
||||||
|
|
||||||
|
this.$trigger
|
||||||
|
.addClass('collapsed')
|
||||||
|
.attr('aria-expanded', false)
|
||||||
|
|
||||||
|
this.transitioning = 1
|
||||||
|
|
||||||
|
var complete = function () {
|
||||||
|
this.transitioning = 0
|
||||||
|
this.$element
|
||||||
|
.removeClass('collapsing')
|
||||||
|
.addClass('collapse')
|
||||||
|
.trigger('hidden.bs.collapse')
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$.support.transition) return complete.call(this)
|
||||||
|
|
||||||
|
this.$element
|
||||||
|
[dimension](0)
|
||||||
|
.one('bsTransitionEnd', $.proxy(complete, this))
|
||||||
|
.emulateTransitionEnd(Collapse.TRANSITION_DURATION)
|
||||||
|
}
|
||||||
|
|
||||||
|
Collapse.prototype.toggle = function () {
|
||||||
|
this[this.$element.hasClass('in') ? 'hide' : 'show']()
|
||||||
|
}
|
||||||
|
|
||||||
|
Collapse.prototype.getParent = function () {
|
||||||
|
return $(this.options.parent)
|
||||||
|
.find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]')
|
||||||
|
.each($.proxy(function (i, element) {
|
||||||
|
var $element = $(element)
|
||||||
|
this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)
|
||||||
|
}, this))
|
||||||
|
.end()
|
||||||
|
}
|
||||||
|
|
||||||
|
Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {
|
||||||
|
var isOpen = $element.hasClass('in')
|
||||||
|
|
||||||
|
$element.attr('aria-expanded', isOpen)
|
||||||
|
$trigger
|
||||||
|
.toggleClass('collapsed', !isOpen)
|
||||||
|
.attr('aria-expanded', isOpen)
|
||||||
|
}
|
||||||
|
|
||||||
|
function getTargetFromTrigger($trigger) {
|
||||||
|
var href
|
||||||
|
var target = $trigger.attr('data-target')
|
||||||
|
|| (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
|
||||||
|
|
||||||
|
return $(target)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// COLLAPSE PLUGIN DEFINITION
|
||||||
|
// ==========================
|
||||||
|
|
||||||
|
function Plugin(option) {
|
||||||
|
return this.each(function () {
|
||||||
|
var $this = $(this)
|
||||||
|
var data = $this.data('bs.collapse')
|
||||||
|
var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
|
||||||
|
|
||||||
|
if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false
|
||||||
|
if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
|
||||||
|
if (typeof option == 'string') data[option]()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
var old = $.fn.collapse
|
||||||
|
|
||||||
|
$.fn.collapse = Plugin
|
||||||
|
$.fn.collapse.Constructor = Collapse
|
||||||
|
|
||||||
|
|
||||||
|
// COLLAPSE NO CONFLICT
|
||||||
|
// ====================
|
||||||
|
|
||||||
|
$.fn.collapse.noConflict = function () {
|
||||||
|
$.fn.collapse = old
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// COLLAPSE DATA-API
|
||||||
|
// =================
|
||||||
|
|
||||||
|
$(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) {
|
||||||
|
var $this = $(this)
|
||||||
|
|
||||||
|
if (!$this.attr('data-target')) e.preventDefault()
|
||||||
|
|
||||||
|
var $target = getTargetFromTrigger($this)
|
||||||
|
var data = $target.data('bs.collapse')
|
||||||
|
var option = data ? 'toggle' : $this.data()
|
||||||
|
|
||||||
|
Plugin.call($target, option)
|
||||||
|
})
|
||||||
|
|
||||||
|
}(jQuery);
|
||||||
Vendored
+7
File diff suppressed because one or more lines are too long
@@ -0,0 +1,59 @@
|
|||||||
|
/* ========================================================================
|
||||||
|
* Bootstrap: transition.js v3.3.4
|
||||||
|
* http://getbootstrap.com/javascript/#transitions
|
||||||
|
* ========================================================================
|
||||||
|
* Copyright 2011-2015 Twitter, Inc.
|
||||||
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||||
|
* ======================================================================== */
|
||||||
|
|
||||||
|
|
||||||
|
+function ($) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
// CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
|
||||||
|
// ============================================================
|
||||||
|
|
||||||
|
function transitionEnd() {
|
||||||
|
var el = document.createElement('bootstrap')
|
||||||
|
|
||||||
|
var transEndEventNames = {
|
||||||
|
WebkitTransition : 'webkitTransitionEnd',
|
||||||
|
MozTransition : 'transitionend',
|
||||||
|
OTransition : 'oTransitionEnd otransitionend',
|
||||||
|
transition : 'transitionend'
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var name in transEndEventNames) {
|
||||||
|
if (el.style[name] !== undefined) {
|
||||||
|
return { end: transEndEventNames[name] }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false // explicit for ie8 ( ._.)
|
||||||
|
}
|
||||||
|
|
||||||
|
// http://blog.alexmaccaw.com/css-transitions
|
||||||
|
$.fn.emulateTransitionEnd = function (duration) {
|
||||||
|
var called = false
|
||||||
|
var $el = this
|
||||||
|
$(this).one('bsTransitionEnd', function () { called = true })
|
||||||
|
var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
|
||||||
|
setTimeout(callback, duration)
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
$(function () {
|
||||||
|
$.support.transition = transitionEnd()
|
||||||
|
|
||||||
|
if (!$.support.transition) return
|
||||||
|
|
||||||
|
$.event.special.bsTransitionEnd = {
|
||||||
|
bindType: $.support.transition.end,
|
||||||
|
delegateType: $.support.transition.end,
|
||||||
|
handle: function (e) {
|
||||||
|
if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
}(jQuery);
|
||||||
@@ -1,22 +1,28 @@
|
|||||||
---- Version 1.2 2015.07.23 ----
|
---- Version 1.6 2020.10.02 ----
|
||||||
e6810907c901e6bd34a28735a68850936f0823b8 ./js/ellipticcurve.js
|
|
||||||
9ba5ede3d7f9d4c8fd623395f196adfdcf7e970f ./js/crypto-min.js
|
|
||||||
77e4519962e2f6a9fc93342137dbb31c33b76b04 ./js/aes.js
|
77e4519962e2f6a9fc93342137dbb31c33b76b04 ./js/aes.js
|
||||||
0ce26da5ef686d4ece91acd6cb6506559e11ab07 ./js/qcode-decoder.min.js
|
3a09a8fc0cfe828b57fc798d668234d0490ee1a6 ./js/bootstrap-datetimepicker.min.js
|
||||||
be17ca7c834204bff711f582e41f76c06d472bac ./js/jsbn.js
|
|
||||||
0700fc9ad2e39adeca0b50614bb3d327fb49f609 ./js/crypto-sha256.js
|
|
||||||
253711c6d825de55a8360552573be950da180614 ./js/bootstrap.min.js
|
253711c6d825de55a8360552573be950da180614 ./js/bootstrap.min.js
|
||||||
|
cb5717166bf1c99abbd75a06013067c4a5897d5a ./js/coinbin.js
|
||||||
|
911fb7bdba24269029f27659e4040cd991b2307c ./js/coin.js
|
||||||
|
988565bc2cb402d63ed5c5fd7ff47c4278efc2c5 ./js/collapse.js
|
||||||
|
9ba5ede3d7f9d4c8fd623395f196adfdcf7e970f ./js/crypto-min.js
|
||||||
f7c09f2f5a721371e7d478050119f7e2d58e3ef9 ./js/crypto-sha256-hmac.js
|
f7c09f2f5a721371e7d478050119f7e2d58e3ef9 ./js/crypto-sha256-hmac.js
|
||||||
|
0700fc9ad2e39adeca0b50614bb3d327fb49f609 ./js/crypto-sha256.js
|
||||||
|
e6810907c901e6bd34a28735a68850936f0823b8 ./js/ellipticcurve.js
|
||||||
|
ae49e56999d82802727455f0ba83b63acd90a22b ./js/jquery-1.9.1.min.js
|
||||||
|
be17ca7c834204bff711f582e41f76c06d472bac ./js/jsbn.js
|
||||||
|
ce4fa351a2e62accf7fad77110fa4ddb09a324bf ./js/moment.min.js
|
||||||
|
0ce26da5ef686d4ece91acd6cb6506559e11ab07 ./js/qcode-decoder.min.js
|
||||||
ad038e1f39646b68ae666324ed4c2882a8c42474 ./js/qrcode.js
|
ad038e1f39646b68ae666324ed4c2882a8c42474 ./js/qrcode.js
|
||||||
64eb4ea5c882f8bce3e1885bf00728455f1c2f4c ./js/ripemd160.js
|
64eb4ea5c882f8bce3e1885bf00728455f1c2f4c ./js/ripemd160.js
|
||||||
114089ef2a3feb6d4db4f9cabcb186d7750d5884 ./js/sha512.js
|
114089ef2a3feb6d4db4f9cabcb186d7750d5884 ./js/sha512.js
|
||||||
3ff26f7ca616b01742a25f9aa304bdb653ce4a4d ./js/coin.js
|
506c40035e0d22560478629434d0fea27643b77a ./js/transition.js
|
||||||
3d054bbad57fca0c091c8099a25e3cc802cf35c1 ./js/coinbin.js
|
5f570018ed044eafd464f7e0ab1783b966224055 ./LICENSE
|
||||||
ae49e56999d82802727455f0ba83b63acd90a22b ./js/jquery-1.9.1.min.js
|
255c58c17e63eb54adb3cd02b5c06224c67fc364 ./css/bootstrap-datetimepicker.min.css
|
||||||
5f570018ed044eafd464f7e0ab1783b966224055 ./LICENCE
|
|
||||||
ed29315e0ffb3f14382431f2724235bf67f44eb3 ./css/bootstrap.min.css
|
ed29315e0ffb3f14382431f2724235bf67f44eb3 ./css/bootstrap.min.css
|
||||||
fc6b4268fbd57ad95d2b41a1d4d6866f222fbdb2 ./css/bootstrap-theme.min.css
|
fc6b4268fbd57ad95d2b41a1d4d6866f222fbdb2 ./css/bootstrap-theme.min.css
|
||||||
8297b8f4d686ec6c65981077514975e06ce41812 ./css/style.css
|
eb54f374256b75a17f274847b4ca9985fd046f9f ./css/style.css
|
||||||
|
2e3217a3f3b7c2fb30562ab9a4ef9a407ae81897 ./images/btc32x.png
|
||||||
8ac24915d59cef71c542e7cb7d7e153f560cba1f ./images/coinbin.gif
|
8ac24915d59cef71c542e7cb7d7e153f560cba1f ./images/coinbin.gif
|
||||||
f2af060f1cadbc9065c8c465c648dc01be67cc12 ./images/loader.gif
|
f2af060f1cadbc9065c8c465c648dc01be67cc12 ./images/loader.gif
|
||||||
86b6f62b7853e67d3e635f6512a5a5efc58ea3c3 ./fonts/glyphicons-halflings-regular.eot
|
86b6f62b7853e67d3e635f6512a5a5efc58ea3c3 ./fonts/glyphicons-halflings-regular.eot
|
||||||
@@ -24,5 +30,6 @@ ca35b697d99cae4d1b60f2d60fcd37771987eb07 ./fonts/glyphicons-halflings-regular.w
|
|||||||
de51a8494180a6db074af2dee2383f0a363c5b08 ./fonts/glyphicons-halflings-regular.svg
|
de51a8494180a6db074af2dee2383f0a363c5b08 ./fonts/glyphicons-halflings-regular.svg
|
||||||
278e49a86e634da6f2a02f3b47dd9d2a8f26210f ./fonts/glyphicons-halflings-regular.woff
|
278e49a86e634da6f2a02f3b47dd9d2a8f26210f ./fonts/glyphicons-halflings-regular.woff
|
||||||
44bc1850f570972267b169ae18f1cb06b611ffa2 ./fonts/glyphicons-halflings-regular.ttf
|
44bc1850f570972267b169ae18f1cb06b611ffa2 ./fonts/glyphicons-halflings-regular.ttf
|
||||||
fe8d57914bb036ab94e86ec35b2671eeb6d20d0d ./README.md
|
ee481606d8d48f402d152fa632ba9e5f9da7f169 ./README.md
|
||||||
528c2fd42260033391105215401bf122e3304f7b ./index.html
|
a706e95f6436ee4a31dc26b17a9ac8ab1f0d3750 ./index.html
|
||||||
|
7130b64e3ef4cf6f2f1550e902f081c58dc053de ./test.html
|
||||||
|
|||||||
@@ -0,0 +1,379 @@
|
|||||||
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
|
||||||
|
<!-- =================================================================== -->
|
||||||
|
<head>
|
||||||
|
<title>TESTING COINBIN</title>
|
||||||
|
<link rel="stylesheet" href="css/bootstrap.min.css" media="screen">
|
||||||
|
<link rel="stylesheet" href="css/bootstrap-datetimepicker.min.css">
|
||||||
|
<link rel="stylesheet" href="css/style.css" media="screen">
|
||||||
|
|
||||||
|
<script type="text/javascript" src="js/jquery-1.9.1.min.js"></script>
|
||||||
|
<script type="text/javascript" src="js/moment.min.js"></script>
|
||||||
|
<script type="text/javascript" src="js/transition.js"></script>
|
||||||
|
<script type="text/javascript" src="js/collapse.js"></script>
|
||||||
|
|
||||||
|
<script type="text/javascript" src="js/bootstrap.min.js"></script>
|
||||||
|
<script type="text/javascript" src="js/bootstrap-datetimepicker.min.js"></script>
|
||||||
|
|
||||||
|
<script type="text/javascript" src="js/crypto-min.js"></script>
|
||||||
|
<script type="text/javascript" src="js/crypto-sha256.js"></script>
|
||||||
|
<script type="text/javascript" src="js/crypto-sha256-hmac.js"></script>
|
||||||
|
<script type="text/javascript" src="js/sha512.js"></script>
|
||||||
|
<script type="text/javascript" src="js/ripemd160.js"></script>
|
||||||
|
<script type="text/javascript" src="js/aes.js"></script>
|
||||||
|
|
||||||
|
<script type="text/javascript" src="js/jsbn.js"></script>
|
||||||
|
<script type="text/javascript" src="js/ellipticcurve.js"></script>
|
||||||
|
|
||||||
|
<script type="text/javascript" src="js/coin.js"></script>
|
||||||
|
</head>
|
||||||
|
<!-- =================================================================== -->
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<!-- =================================================================== -->
|
||||||
|
|
||||||
|
<div id="fwrap">
|
||||||
|
<!-- Fixed navbar -->
|
||||||
|
<div id="header" class="navbar navbar-default " role="navigation">
|
||||||
|
<div class="container">
|
||||||
|
<div class="navbar-header">
|
||||||
|
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
|
||||||
|
<span class="sr-only">Toggle navigation</span>
|
||||||
|
<span class="icon-bar"></span>
|
||||||
|
<span class="icon-bar"></span>
|
||||||
|
<span class="icon-bar"></span>
|
||||||
|
</button>
|
||||||
|
<a href="#home" class="navbar-brand" id="homeBtn"><img src="images/coinbin.gif" style="height:25px;margin-top:-5px"></a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="content" class="container">
|
||||||
|
|
||||||
|
<div class="tab-content">
|
||||||
|
<div class="tab-pane tab-content active" id="home">
|
||||||
|
<br />
|
||||||
|
<button id="test1Btn" class="btn btn-primary" type="submit">Run Coinbin Test Suite</button>
|
||||||
|
<br />
|
||||||
|
<textarea rows=20 cols=86 id="testResults"></textarea>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div> <!-- content -->
|
||||||
|
</div> <!-- wrap -->
|
||||||
|
</div> <!-- navbar -->
|
||||||
|
</div> <!-- container -->
|
||||||
|
</body>
|
||||||
|
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
|
||||||
|
$(document).ready(function() {
|
||||||
|
}); // end of document.ready
|
||||||
|
|
||||||
|
|
||||||
|
$("#test1Btn").click(function(){
|
||||||
|
{
|
||||||
|
var testName = "hex private key to compressed address";
|
||||||
|
var testInput = "0000000000000000000000000000000000000000000000000000000000000001";
|
||||||
|
var testExpected = "1BgGZ9tcN4rm9KBzDn7KprQz87SZ26SAMH";
|
||||||
|
coinjs.compressed = true;
|
||||||
|
var pubkeyHex = coinjs.newPubkey(testInput);
|
||||||
|
var testOutput = coinjs.pubkey2address(pubkeyHex, coinjs.pub);
|
||||||
|
addTestOutput(testName, testOutput, testExpected);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
var testName = "hex private key to uncompressed address";
|
||||||
|
var testInput = "0000000000000000000000000000000000000000000000000000000000000001";
|
||||||
|
var testExpected = "1EHNa6Q4Jz2uvNExL497mE43ikXhwF6kZm";
|
||||||
|
coinjs.compressed = false;
|
||||||
|
var pubkeyHex = coinjs.newPubkey(testInput);
|
||||||
|
var testOutput = coinjs.pubkey2address(pubkeyHex, coinjs.pub);
|
||||||
|
addTestOutput(testName, testOutput, testExpected);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
var testName = "WIF uncompressed private key to address";
|
||||||
|
var testInput = "5J1LYLWqNxJBTwdGAmzYnpkqqSuFu48fsHv8jgojFMV2Z8exk9L";
|
||||||
|
var testExpected ="16SK7HnxBMRxSpLhhdf8RYcqv8MPJiSF6Q";
|
||||||
|
coinjs.compressed = false;
|
||||||
|
var testOutput = coinjs.wif2address(testInput).address;
|
||||||
|
addTestOutput(testName, testOutput, testExpected);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
var testName = "raw private key to uncompressed base58check WIF private key";
|
||||||
|
var testInput = "62A87AD3272B41E67108FEA10C57BA6ED609F2F7A2264A83B690CD45707090D1";
|
||||||
|
var testExpected = "5JZjfs5wJv1gNkJXCmYpyj6VxciqPkwmK4yHW8zMmPN1PW7Hk7F";
|
||||||
|
coinjs.compressed = false;
|
||||||
|
var testOutput = coinjs.privkey2wif(testInput);
|
||||||
|
addTestOutput(testName, testOutput, testExpected);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
var testName = "raw private key to compressed base58check WIF private key";
|
||||||
|
var testInput = "62A87AD3272B41E67108FEA10C57BA6ED609F2F7A2264A83B690CD45707090D1";
|
||||||
|
var testExpected = "KzXVLY4ni4yznz8LJwdUmNoGpUfebSxiakXRqcGAeuhihzaVe3Rz";
|
||||||
|
coinjs.compressed = true;
|
||||||
|
var testOutput = coinjs.privkey2wif(testInput);
|
||||||
|
addTestOutput(testName, testOutput, testExpected);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
var testName = "hex ripemd160 hash of public key, to base58check address";
|
||||||
|
var testInput = "62E907B15CBF27D5425399EBF6F0FB50EBB88F18";
|
||||||
|
var testExpected = "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa";
|
||||||
|
var testOutput = coinjs.scripthash2address(testInput);
|
||||||
|
addTestOutput(testName, testOutput, testExpected);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
var testName = "base58check address, to hex ripemd160 hash of public key";
|
||||||
|
var testInput = "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa";
|
||||||
|
var testExpected = "62e907b15cbf27d5425399ebf6f0fb50ebb88f18";
|
||||||
|
var bytes = coinjs.base58decode(testInput);
|
||||||
|
var front = bytes.slice(1, bytes.length-4);
|
||||||
|
var testOutput = Crypto.util.bytesToHex(front);
|
||||||
|
addTestOutput(testName, testOutput, testExpected);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
var testName = "convert 'Hash 160' to address";
|
||||||
|
var testInput = "119b098e2e980a229e139a9ed01a469e518e6f26";
|
||||||
|
var testExpected = "12c6DSiU4Rq3P4ZxziKxzrL5LmMBrzjrJX";
|
||||||
|
var testOutput = coinjs.scripthash2address(testInput);
|
||||||
|
addTestOutput(testName, testOutput, testExpected);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
var testName = "convert 'SHA256' to address";
|
||||||
|
var testInput = "904b8a01c68095a9e825d28082c04b75b1f56277648256985717620e8913b79b";
|
||||||
|
var testExpected = "1JNC98D5LZbrGHFR8shDwiqLPGfpg15BUM";
|
||||||
|
var r = ripemd160(Crypto.util.hexToBytes(testInput));
|
||||||
|
r.unshift(coinjs.pub);
|
||||||
|
var hash = Crypto.SHA256(Crypto.SHA256(r, {asBytes: true}), {asBytes: true});
|
||||||
|
var checksum = hash.slice(0, 4);
|
||||||
|
var testOutput = coinjs.base58encode(r.concat(checksum));
|
||||||
|
addTestOutput(testName, testOutput, testExpected);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
var testName = "convert WIF private key to address bech32";
|
||||||
|
var testInput = "L3GzRAGwCqfSNFr6g1NQm7edn29DgAKZJ6owUBqYELpP6Kbim5kM";
|
||||||
|
var testExpected = "bc1qhmc0vk4xzr37ayv7tlyhns7x4dk04tyvflk8ey";
|
||||||
|
var pubkey = coinjs.wif2pubkey(testInput);
|
||||||
|
var testOutput = coinjs.bech32Address(pubkey.pubkey).address;
|
||||||
|
addTestOutput(testName, testOutput, testExpected);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
var testName = "bech32 address, to hex ripemd160 hash of public key";
|
||||||
|
var testInput = "bc1qhmc0vk4xzr37ayv7tlyhns7x4dk04tyvflk8ey";
|
||||||
|
var testExpected = "bef0f65aa610e3ee919e5fc979c3c6ab6cfaac8c";
|
||||||
|
var testOutput = coinjs.bech32redeemscript(testInput);
|
||||||
|
addTestOutput(testName, testOutput, testExpected);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
var testName = "prefix1 - WIF compressed private key to address (bitcoin)";
|
||||||
|
var testInput = "Kx4VFK8gXu4qBv73x9b1KFnWYqKekkprYyfX9QhFUMQhrTUooXKc";
|
||||||
|
var testExpected = "1NFeCVtA3zuCUAmYheRvfyABnSZCHfrR3j";
|
||||||
|
var testOutput = coinjs.wif2address(testInput).address;
|
||||||
|
addTestOutput(testName, testOutput, testExpected);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
var testName = "prefix2 - WIF compressed private key to address (bitcoin-testnet)";
|
||||||
|
var testInput = "92Wn1EBgiwDNT8SC7WMZfcSk2y3mQkLUPAQtwMNYZQGAzCFUTdu";
|
||||||
|
var testExpected = "mxToLbBqPcSNnqPCSnrYjFv172TFPLjVNf";
|
||||||
|
var saved = pushNetworkVars("btc-testnet");
|
||||||
|
var testOutput = coinjs.wif2address(testInput).address;
|
||||||
|
popNetworkVars(saved);
|
||||||
|
addTestOutput(testName, testOutput, testExpected);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
var testName = "prefix3 - WIF compressed private key to address (litecoin)";
|
||||||
|
var testInput = "6vVAeKejJRV5wgrAqtqi7eQsS4Zf79nkw8xuYntU3JwHCiexYaJ";
|
||||||
|
var testExpected = "LMzBLYQG2opHvMBihMQgJBboxunoj5pssC";
|
||||||
|
var saved = pushNetworkVars("ltc-mainnet");
|
||||||
|
var testOutput = coinjs.wif2address(testInput).address;
|
||||||
|
popNetworkVars(saved);
|
||||||
|
addTestOutput(testName, testOutput, testExpected);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
var testName = "prefix4 - WIF compressed private key to address (dogecoin)";
|
||||||
|
var testInput = "6KayMYAEQfFACQhZUzbBpFhvGzDWSmRtaY9NrPQGig9qVzRCzQf";
|
||||||
|
var testExpected = "DHEPGdnS46dHT79tkfm5DyhGAbQj4Xi8Ni";
|
||||||
|
var saved = pushNetworkVars("doge-mainnet");
|
||||||
|
var testOutput = coinjs.wif2address(testInput).address;
|
||||||
|
popNetworkVars(saved);
|
||||||
|
addTestOutput(testName, testOutput, testExpected);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
// this test comes from https://bitcoindev.network/guides/bitcoinjs-lib/bitcoin-script-puzzles/
|
||||||
|
var testName = "P2SH redeem script to address (bitcoin testnet)";
|
||||||
|
var testInput = "935587";
|
||||||
|
var testExpected = "2N7WfHK1ftrTdhWej8rnFNR7guhvhfGWwFR";
|
||||||
|
var saved = pushNetworkVars("btc-testnet");
|
||||||
|
var hash = Crypto.SHA256(Crypto.util.hexToBytes(testInput), {asBytes: true});
|
||||||
|
var r = ripemd160(hash);
|
||||||
|
r.unshift(coinjs.multisig);
|
||||||
|
var hash = Crypto.SHA256(Crypto.SHA256(r, {asBytes: true}), {asBytes: true});
|
||||||
|
var checksum = hash.slice(0, 4);
|
||||||
|
var testOutput = coinjs.base58encode(r.concat(checksum));
|
||||||
|
addTestOutput(testName, testOutput, testExpected);
|
||||||
|
popNetworkVars(saved);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
// this test comes from https://bitcoindev.network/guides/bitcoinjs-lib/bitcoin-script-puzzles/
|
||||||
|
var testName = "P2WSH redeem script to address (bitcoin testnet)";
|
||||||
|
var testInput = "935587";
|
||||||
|
var testExpected = "bcrt1qpt7c23c0wep9e8up4ywn070w3tqz3828ngy34aj8slsfxrh08ddq2d2pyu";
|
||||||
|
var hash = Crypto.SHA256(Crypto.util.hexToBytes(testInput), {asBytes: true});
|
||||||
|
var testOutput = coinjs.bech32_encode(/*coinjs.bech32.hrp*/"bcrt", [coinjs.bech32.version].concat(coinjs.bech32_convert(hash, 8, 5, true)));
|
||||||
|
addTestOutput(testName, testOutput, testExpected);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
// data from https://bitcoin.stackexchange.com/questions/3374/how-to-redeem-a-basic-tx (runeks)
|
||||||
|
var testName = "basic transaction building bitcoin";
|
||||||
|
var testExpectedUnsigned = "0100000001eccf7e3034189b851985d871f91384b8ee357cd47c3024736e5676eb2debb3f2010000001976a914010966776006953d5567439e5e39f86a0d273bee88acffffffff01605af405000000001976a914097072524438d003d23a2f23edb65aae1bb3e46988ac00000000";
|
||||||
|
var testExpectedSigned = "0100000001eccf7e3034189b851985d871f91384b8ee357cd47c3024736e5676eb2debb3f2010000008a4730440220299fffaf20745458111e7826e5c2cca3b78dd27c97e0a513aab807f0d724103402203247498cfb019bbbd3d629814c8703e974f177478f6fde53503a9b1088852fad01410450863ad64a87ae8a2fe83c1af1a8403cb53f53e486d8511dad8a04887e5b23522cd470243453a299fa9e77237716103abc11a1df38855ed6f2ee187e9c582ba6ffffffff01605af405000000001976a914097072524438d003d23a2f23edb65aae1bb3e46988ac00000000";
|
||||||
|
var privKeyHex = "18E14A7B6A307F426A94F8114701E7C8E774E7F9A47E2C2035DB29A206321725";
|
||||||
|
var inputTx = "f2b3eb2deb76566e7324307cd47c35eeb88413f971d88519859b1834307ecfec";
|
||||||
|
var inputScript = "76a914010966776006953d5567439e5e39f86a0d273bee88ac";
|
||||||
|
var inputN = 1;
|
||||||
|
var address0 = "097072524438d003d23a2f23edb65aae1bb3e469";
|
||||||
|
var amount = 0.999;
|
||||||
|
coinjs.compressed = false;
|
||||||
|
var r = coinjs.transaction();
|
||||||
|
var wif = coinjs.privkey2wif(privKeyHex);
|
||||||
|
var address1 = coinjs.scripthash2address(address0);
|
||||||
|
r.addinput(inputTx, inputN, inputScript, 0xffffffff/*sequence*/);
|
||||||
|
r.addoutput(address1, amount);
|
||||||
|
var testOutputUnsigned = r.serialize();
|
||||||
|
debugger;
|
||||||
|
r.sign(wif, 1/*sighashtype*/);
|
||||||
|
var testOutputSigned = r.serialize();
|
||||||
|
addTestOutput(testName+" (unsigned)", testOutputUnsigned, testExpectedUnsigned);
|
||||||
|
addTestOutput(testName+" (signed)", testOutputSigned, testExpectedSigned);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
// bitcoin testnet transaction https://tbtc.bitaps.com/04bbae5806d2b8fb17ed9339f42c6f6d731191a974b975d2e1df8e7601e90f6f
|
||||||
|
var saved = pushNetworkVars("btc-testnet");
|
||||||
|
var testName = "basic transaction building bitcoin-testnet";
|
||||||
|
var testExpectedUnsigned = "0100000001c72eabf9f208cacc908538e2609bbe665ffda680e2a6c39475941389dd5b14de000000001976a914b9e16a03bbf40ebb78cbc35e22d72a695f27624088acffffffff01703a0f00000000001976a914a447681601eef322926c0b3de5dfbb4157bbe40988ac00000000";
|
||||||
|
var testExpectedSigned = "0100000001c72eabf9f208cacc908538e2609bbe665ffda680e2a6c39475941389dd5b14de000000008b483045022100d909d4d3d2b540891c102d06fc8eaf1e9b914b93ea28626990666554a75b369102205a73b38071eab5b0acb8381c1454e7d998c80cd6d229645231b6bc1fb024d1d70141046fad107ba21fae3f047096152d0298291168bc0cb6b834f7cc77510dcb41839206b936649623988f7ca58c6104a22105c5b398912ded514685ebd0d8ac4011c2ffffffff01703a0f00000000001976a914a447681601eef322926c0b3de5dfbb4157bbe40988ac00000000";
|
||||||
|
var wif = "92Wn1EBgiwDNT8SC7WMZfcSk2y3mQkLUPAQtwMNYZQGAzCFUTdu";
|
||||||
|
var inputTx = "de145bdd8913947594c3a6e280a6fd5f66be9b60e2388590ccca08f2f9ab2ec7";
|
||||||
|
var inputScript = "76a914b9e16a03bbf40ebb78cbc35e22d72a695f27624088ac";
|
||||||
|
var inputN = 0;
|
||||||
|
var address1 = "mvVaevwNK2SdNj9kcugh29HbSLPhv7xszY";
|
||||||
|
var amount = 0.00998;
|
||||||
|
|
||||||
|
coinjs.compressed = true;
|
||||||
|
var r = coinjs.transaction();
|
||||||
|
r.addinput(inputTx, inputN, inputScript, 0xffffffff/*sequence*/);
|
||||||
|
r.addoutput(address1, amount);
|
||||||
|
var warnings = new Array;
|
||||||
|
var testOutputUnsigned = r.serialize();
|
||||||
|
r.sign(wif, 1/*sighashtype*/, warnings);
|
||||||
|
var testOutputSigned = r.serialize();
|
||||||
|
|
||||||
|
popNetworkVars(saved);
|
||||||
|
addTestOutput(testName+" (unsigned)", testOutputUnsigned, testExpectedUnsigned);
|
||||||
|
addTestOutput(testName+" (signed)", testOutputSigned, testExpectedSigned);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// create a lot of timelock scripts, compare them to known ones created using bitcoinjs-lib
|
||||||
|
// focus on edge cases like described in https://github.com/OutCast3k/coinbin/issues/201
|
||||||
|
// ranges 80-ff, 8000-ffff, 800000-ffffff, 80000000-ffffffff.
|
||||||
|
{
|
||||||
|
var testExpected = "HODL_depositAddress: 2NAx7Sx9B6epdUGyPeUEAU2tJiPectEym4F HODL_redeemScript: 050000008000b175210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798ac\n" +
|
||||||
|
"HODL_depositAddress: 2N5VZkAjtGerFUrc3bKjuK3whVEyaoKQceg HODL_redeemScript: 0400000008b175210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798ac\n" +
|
||||||
|
"HODL_depositAddress: 2MyN366sJLwXTMVMsMTHxi1bSJBwZwmNsQ4 HODL_redeemScript: 0400008000b175210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798ac\n" +
|
||||||
|
"HODL_depositAddress: 2NFjqkVBLKXjFLGPDpSoBTbhVsccUrqhRLW HODL_redeemScript: 03000008b175210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798ac\n" +
|
||||||
|
"HODL_depositAddress: 2N555b2vUzCJ5t8DryLYTw6vggH87SrK14b HODL_redeemScript: 03008000b175210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798ac\n" +
|
||||||
|
"HODL_depositAddress: 2N31s67tdRuaVfQipgkozEXd9jAt4saniH5 HODL_redeemScript: 020008b175210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798ac\n" +
|
||||||
|
"HODL_depositAddress: 2N9vLAD9f1WqFiJXinC9oCxDhypz36ZzaT7 HODL_redeemScript: 028000b175210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798ac\n" +
|
||||||
|
"HODL_depositAddress: 2MxRBGmDkNK44wCw2NMNq12UKxuPmkN8Wrx HODL_redeemScript: 58b175210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798ac\n";
|
||||||
|
var testOutput = "";
|
||||||
|
var saved = pushNetworkVars("btc-testnet");
|
||||||
|
var testName = "timelocks";
|
||||||
|
var timeLock = 0x80000000;
|
||||||
|
while (timeLock > 0) {
|
||||||
|
//var timeLock = Math.pow(2,n)-1;
|
||||||
|
//var timeLock = 16777215;
|
||||||
|
var wif = "cMahea7zqjxrtgAbB7LSGbcQUr1uX1ojuat9jZodMN87JcbXMTcA"; // TESTNET pubKey="0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", addr="mrCDrCybB6J1vRfbwM5hemdJz73FwDBC8r"
|
||||||
|
var pubkey = coinjs.wif2pubkey(wif);
|
||||||
|
var myHodl = coinjs.simpleHodlAddress(pubkey.pubkey, timeLock);
|
||||||
|
testOutput += 'HODL_depositAddress: ' + myHodl.address + ' ';
|
||||||
|
testOutput += 'HODL_redeemScript: ' + myHodl.redeemScript + '\n';
|
||||||
|
timeLock = (timeLock >>> 4);
|
||||||
|
}
|
||||||
|
popNetworkVars(saved);
|
||||||
|
addTestOutput(testName, testOutput, testExpected);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
function addTestOutput(testName, testOutput, testExpected) {
|
||||||
|
var testResult = "Fail ❌";
|
||||||
|
if (testOutput == testExpected) { testResult = "Pass ✓"; }
|
||||||
|
document.getElementById('testResults').value += testName + " : " + testResult + "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function popNetworkVars(saved) {
|
||||||
|
coinjs.pub = saved.pub;
|
||||||
|
coinjs.priv = saved.priv;
|
||||||
|
coinjs.multisig = saved.multisig;
|
||||||
|
}
|
||||||
|
|
||||||
|
function pushNetworkVars(network) {
|
||||||
|
var savedParams = {
|
||||||
|
'pub':coinjs.pub,
|
||||||
|
'priv':coinjs.priv,
|
||||||
|
'multisig':coinjs.multisig
|
||||||
|
};
|
||||||
|
if (network == "btc-mainnet") {
|
||||||
|
coinjs.pub = 0x00;
|
||||||
|
coinjs.priv = 0x80;
|
||||||
|
coinjs.multisig = 0x05;
|
||||||
|
}
|
||||||
|
if (network == "btc-testnet") {
|
||||||
|
coinjs.pub = 0x6f;
|
||||||
|
coinjs.priv = 0xef;
|
||||||
|
coinjs.multisig = 0xc4;
|
||||||
|
}
|
||||||
|
if (network == "ltc-mainnet") {
|
||||||
|
coinjs.pub = 0x30;
|
||||||
|
coinjs.priv = 0xb0;
|
||||||
|
coinjs.multisig = 0x32;
|
||||||
|
}
|
||||||
|
if (network == "ltc-testnet") {
|
||||||
|
coinjs.pub = 0x6f;
|
||||||
|
coinjs.priv = 0xef;
|
||||||
|
coinjs.multisig = 0x3a4;
|
||||||
|
}
|
||||||
|
if (network == "doge-mainnet") {
|
||||||
|
coinjs.pub = 0x1e;
|
||||||
|
coinjs.priv = 0x9e;
|
||||||
|
coinjs.multisig = 0x16;
|
||||||
|
}
|
||||||
|
return savedParams;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
</html>
|
||||||
Reference in New Issue
Block a user