@ -2,6 +2,8 @@ var Stealthkey = require('./stealthkey');
var Base58check = require ( '../base58check' ) ;
var Pubkey = require ( '../pubkey' ) ;
var KDF = require ( '../kdf' ) ;
var BufferWriter = require ( '../bufferwriter' ) ;
var BufferReader = require ( '../bufferreader' ) ;
var StealthAddress = function StealthAddress ( addrstr ) {
if ( ! ( this instanceof StealthAddress ) )
@ -20,6 +22,9 @@ var StealthAddress = function StealthAddress(addrstr) {
}
} ;
StealthAddress . mainver = 42 ;
StealthAddress . testver = 43 ;
StealthAddress . prototype . set = function ( obj ) {
this . payloadPubkey = obj . payloadPubkey || this . payloadPubkey ;
this . scanPubkey = obj . scanPubkey || this . scanPubkey ;
@ -56,6 +61,29 @@ StealthAddress.prototype.fromBuffer = function(buf) {
return this ;
} ;
StealthAddress . prototype . fromDWBuffer = function ( buf ) {
var parsed = StealthAddress . parseDWBuffer ( buf ) ;
if ( ( parsed . version !== StealthAddress . mainver ) && ( parsed . version !== StealthAddress . testver ) )
throw new Error ( 'Invalid version' ) ;
if ( parsed . options !== 0 )
throw new Error ( 'Invalid options' ) ;
if ( ! parsed . scanPubkey )
throw new Error ( 'Invalid scanPubkey' ) ;
if ( parsed . payloadPubkeys . length !== 1 )
throw new Error ( 'Must have exactly one payloadPubkey' ) ;
if ( parsed . nSigs !== 1 )
throw new Error ( 'Must require exactly one signature' ) ;
if ( parsed . prefix . toString ( ) !== "" )
throw new Error ( 'Only blank prefixes supported' ) ;
this . scanPubkey = parsed . scanPubkey ;
this . payloadPubkey = parsed . payloadPubkeys [ 0 ] ;
return this ;
} ;
StealthAddress . prototype . fromDWString = function ( str ) {
return this . fromDWBuffer ( Base58check ( str ) . toBuffer ( ) ) ;
} ;
StealthAddress . prototype . fromString = function ( str ) {
var buf = Base58check . decode ( str ) ;
this . fromBuffer ( buf ) ;
@ -86,6 +114,27 @@ StealthAddress.prototype.toBuffer = function() {
return Buffer . concat ( [ pBuf , sBuf ] ) ;
} ;
StealthAddress . prototype . toDWBuffer = function ( networkstr ) {
if ( networkstr === 'testnet' )
var version = StealthAddress . testver ;
else
var version = StealthAddress . mainver ;
var bw = new BufferWriter ( ) ;
bw . writeUInt8 ( version ) ;
bw . writeUInt8 ( 0 ) ; //options
bw . write ( this . scanPubkey . toDER ( true ) ) ;
bw . writeUInt8 ( 1 ) ; //number of payload keys - we only support 1 (not multisig)
bw . write ( this . payloadPubkey . toDER ( true ) ) ;
bw . writeUInt8 ( 1 ) ; //number of signatures - we only support 1 (not multisig)
bw . writeUInt8 ( 0 ) ; //prefix length - we do not support prefix yet
var buf = bw . concat ( ) ;
return buf ;
} ;
StealthAddress . prototype . toDWString = function ( networkstr ) {
return Base58check ( this . toDWBuffer ( networkstr ) ) . toString ( ) ;
} ;
StealthAddress . prototype . toString = function ( ) {
var buf = this . toBuffer ( ) ;
var b58 = Base58check . encode ( buf ) ;
@ -93,4 +142,20 @@ StealthAddress.prototype.toString = function() {
return b58 ;
} ;
StealthAddress . parseDWBuffer = function ( buf ) {
var br = new BufferReader ( buf ) ;
var parsed = { } ;
parsed . version = br . readUInt8 ( ) ;
parsed . options = br . readUInt8 ( ) ;
parsed . scanPubkey = Pubkey ( ) . fromBuffer ( br . read ( 33 ) ) ;
parsed . nPayloadPubkeys = br . readUInt8 ( ) ;
parsed . payloadPubkeys = [ ] ;
for ( var i = 0 ; i < parsed . nPayloadPubkeys ; i ++ )
parsed . payloadPubkeys . push ( Pubkey ( ) . fromBuffer ( br . read ( 33 ) ) ) ;
parsed . nSigs = br . readUInt8 ( ) ;
parsed . nPrefix = br . readUInt8 ( ) ;
parsed . prefix = br . read ( parsed . nPrefix / 8 ) ;
return parsed ;
} ;
module . exports = StealthAddress ;