@ -153,7 +153,7 @@ var cnUtil = function(currencyConfig)
const ret _string = CNCrypto . is _subaddress ( args _str ) ;
const ret = JSON . parse ( ret _string ) ;
if ( typeof ret . err _msg !== 'undefined' && ret . err _msg ) {
throw ret . err _msg // TODO: maybe return this somehow
return { err _msg : ret . err _msg }
}
return ret _val _boolstring _to _bool ( ret . retVal ) ;
} ;
@ -169,7 +169,7 @@ var cnUtil = function(currencyConfig)
const ret _string = CNCrypto . is _integrated _address ( args _str ) ;
const ret = JSON . parse ( ret _string ) ;
if ( typeof ret . err _msg !== 'undefined' && ret . err _msg ) {
throw ret . err _msg // TODO: maybe return this somehow
return { err _msg : ret . err _msg }
}
return ret _val _boolstring _to _bool ( ret . retVal ) ;
} ;
@ -181,7 +181,7 @@ var cnUtil = function(currencyConfig)
const ret _string = CNCrypto . new _payment _id ( args _str ) ;
const ret = JSON . parse ( ret _string ) ;
if ( typeof ret . err _msg !== 'undefined' && ret . err _msg ) {
throw ret . err _msg // TODO: maybe return this somehow
return { err _msg : ret . err _msg }
}
return ret . retVal ;
} ;
@ -191,9 +191,8 @@ var cnUtil = function(currencyConfig)
short _pid ,
nettype
) {
// throws
if ( ! short _pid || short _pid . length != 16 ) {
throw "expected valid short_pid" ;
return { err _msg : "expected valid short_pid" } ;
}
const args =
{
@ -206,7 +205,7 @@ var cnUtil = function(currencyConfig)
const ret _string = CNCrypto . new _integrated _address ( args _str ) ;
const ret = JSON . parse ( ret _string ) ;
if ( typeof ret . err _msg !== 'undefined' && ret . err _msg ) {
throw ret . err _msg // TODO: maybe return this somehow
return { err _msg : ret . err _msg }
}
return ret . retVal ;
} ;
@ -219,7 +218,7 @@ var cnUtil = function(currencyConfig)
const ret _string = CNCrypto . new _fake _address _for _rct _tx ( args _str ) ;
const ret = JSON . parse ( ret _string ) ;
if ( typeof ret . err _msg !== 'undefined' && ret . err _msg ) {
throw ret . err _msg // TODO: maybe return this somehow
return { err _msg : ret . err _msg }
}
return ret . retVal ;
} ;
@ -236,7 +235,7 @@ var cnUtil = function(currencyConfig)
const ret _string = CNCrypto . decode _address ( args _str ) ;
const ret = JSON . parse ( ret _string ) ;
if ( typeof ret . err _msg !== 'undefined' && ret . err _msg ) {
throw ret . err _msg // TODO: maybe return this somehow
return { err _msg : ret . err _msg }
}
return {
spend : ret . pub _spendKey _string ,
@ -323,7 +322,7 @@ var cnUtil = function(currencyConfig)
const ret _string = CNCrypto . seed _and _keys _from _mnemonic ( args _str ) ;
const ret = JSON . parse ( ret _string ) ;
if ( typeof ret . err _msg !== 'undefined' && ret . err _msg ) {
throw ret . err _msg // TODO: maybe return this somehow
return { err _msg : ret . err _msg }
}
return { // calling these out so as to provide a stable ret val interface
sec _seed _string : ret . sec _seed _string ,
@ -356,7 +355,7 @@ var cnUtil = function(currencyConfig)
const ret _string = CNCrypto . validate _components _for _login ( args _str ) ;
const ret = JSON . parse ( ret _string ) ;
if ( typeof ret . err _msg !== 'undefined' && ret . err _msg ) {
throw ret . err _msg // TODO: maybe return this somehow
return { err _msg : ret . err _msg }
}
return { // calling these out so as to provide a stable ret val interface
isValid : ret _val _boolstring _to _bool ( ret . isValid ) ,
@ -374,16 +373,16 @@ var cnUtil = function(currencyConfig)
output _index
) {
if ( tx _pub . length !== 64 ) {
throw "Invalid tx_pub length" ;
return { err _msg : "Invalid tx_pub length" } ;
}
if ( view _sec . length !== 64 ) {
throw "Invalid view_sec length" ;
return { err _msg : "Invalid view_sec length" } ;
}
if ( spend _pub . length !== 64 ) {
throw "Invalid spend_pub length" ;
return { err _msg : "Invalid spend_pub length" } ;
}
if ( spend _sec . length !== 64 ) {
throw "Invalid spend_sec length" ;
return { err _msg : "Invalid spend_sec length" } ;
}
const args =
{
@ -398,79 +397,166 @@ var cnUtil = function(currencyConfig)
const ret _string = CNCrypto . generate _key _image ( args _str ) ;
const ret = JSON . parse ( ret _string ) ;
if ( typeof ret . err _msg !== 'undefined' && ret . err _msg ) {
throw ret . err _msg // TODO: maybe return this somehow
return { err _msg : ret . err _msg } ;
}
return ret . retVal ;
} ;
this . create _signed _transaction _ _IPCsafe = function (
pub_keys ,
from_address _string ,
sec _keys ,
to _address _string ,
serialized _ _dsts , // amounts are strings
outputs ,
mix _outs ,
fake _outputs _count ,
serialize _ _sending _amount ,
serialized _ _fee _amount , // string amount
payment _id ,
pid _encrypt ,
realDestViewKey ,
unlock _time ,
rct ,
nettype ,
nettype
) {
const dsts = serialized _ _dsts . map ( function ( i ) {
i . amount = new JSBigInt ( i . amount )
return i
} )
return this . create _signed _transaction (
pub_keys ,
from_address _string ,
sec _keys ,
to _address _string ,
dsts ,
outputs ,
mix _outs ,
fake _outputs _count ,
new JSBigInt ( serialized _ _fee _amount ) ,
new JSBigInt ( serialize _ _sending _amount ) ,
new JSBigInt ( serialized _ _fee _amount ) , // only to be deserialized again is a bit silly but this at least exposes a JSBigInt API for others
payment _id ,
pid _encrypt ,
realDestViewKey ,
unlock _time ,
rct ,
nettype ,
nettype
) ;
}
this . create _signed _transaction = function (
pub_keys ,
from_address _string ,
sec _keys ,
to _address _string ,
dsts ,
outputs ,
mix _outs ,
fake _outputs _count ,
sending _amount ,
fee _amount ,
payment _id ,
pid _encrypt ,
realDestViewKey ,
unlock _time ,
rct ,
nettype ,
nettype
) {
unlock _time = unlock _time || 0 ;
mix _outs = mix _outs || [ ] ;
if ( dsts . length === 0 ) {
throw "Destinations empty" ;
return { err _msg : "Destinations empty" } ;
}
if ( rct != true ) {
return { err _msg : "Expected rct=true" }
}
if ( mix _outs . length !== outputs . length && fake _outputs _count !== 0 ) {
throw "Wrong number of mix outs provided (" +
return { err _msg : "Wrong number of mix outs provided (" +
outputs . length +
" outputs, " +
mix _outs . length +
" mix outs)" ;
" mix outs)" } ;
}
for ( i = 0 ; i < mix _outs . length ; i ++ ) {
if ( ( mix _outs [ i ] . outputs || [ ] ) . length < fake _outputs _count ) {
throw "Not enough outputs to mix with" ;
return { err _msg : "Not enough outputs to mix with" } ;
}
}
//
// Now we need to convert all non-JSON-serializable objects such as JSBigInts to strings etc
var sanitary _ _dsts = [ ] ;
for ( let i in dsts ) {
const sanitary _ _dst =
{
amount : dsts [ i ] . amount . toString ( ) ,
addr : dsts [ i ] . address // key changes
// no need to pass is_subaddress - core C++ gets it
} ;
sanitary _ _dsts . push ( sanitary _ _dst ) ;
}
var sanitary _ _outputs = [ ] ;
for ( let i in outputs ) {
const sanitary _ _output =
{
amount : outputs [ i ] . amount . toString ( ) ,
public _key : outputs [ i ] . public _key ,
global _index : "" + outputs [ i ] . global _index ,
index : "" + outputs [ i ] . index ,
tx _pub _key : outputs [ i ] . tx _pub _key
} ;
if ( outputs [ i ] . rct && typeof outputs [ i ] . rct !== 'undefined' ) {
sanitary _ _output . rct = outputs [ i ] . rct ;
}
sanitary _ _outputs . push ( sanitary _ _output ) ;
}
var sanitary _ _mix _outs = [ ] ;
for ( let i in mix _outs ) {
const sanitary _ _mix _outs _and _amount =
{
amount : "" + mix _outs [ i ] . amount ,
outputs : [ ]
} ;
if ( mix _outs [ i ] . outputs && typeof mix _outs [ i ] . outputs !== 'undefined' ) {
for ( let j in mix _outs [ i ] . outputs ) {
const sanitary _ _mix _out =
{
global _index : "" + mix _outs [ i ] . outputs [ j ] . global _index ,
public _key : mix _outs [ i ] . outputs [ j ] . public _key
} ;
if ( mix _outs [ i ] . outputs [ j ] . rct && typeof mix _outs [ i ] . outputs [ j ] . rct !== 'undefined' ) {
sanitary _ _mix _out . rct = mix _outs [ i ] . outputs [ j ] . rct ;
}
sanitary _ _mix _outs _and _amount . outputs . push ( sanitary _ _mix _out ) ;
}
}
sanitary _ _mix _outs . push ( sanitary _ _mix _outs _and _amount ) ;
}
const args =
{
from _address _string : from _address _string ,
sec _viewKey _string : sec _keys . view ,
sec _spendKey _string : sec _keys . spend ,
to _address _string : to _address _string ,
amount : sending _amount . toString ( ) ,
fee _amount : fee _amount . toString ( ) ,
dsts : sanitary _ _dsts ,
outputs : sanitary _ _outputs ,
mix _outs : sanitary _ _mix _outs ,
nettype _string : nettype _utils . nettype _to _API _string ( nettype )
} ;
if ( typeof payment _id !== "undefined" && payment _id ) {
args . payment _id _string = payment _id ;
}
const args _str = JSON . stringify ( args ) ;
const ret _string = loaded _CNCrypto ( ) . create _transaction ( args _str ) ;
const ret = JSON . parse ( ret _string ) ;
///
if ( typeof ret . err _msg !== 'undefined' && ret . err _msg ) {
return { err _msg : ret . err _msg } ;
}
return { // calling these out to set an interface
signed _serialized _tx : ret . serialized _signed _tx ,
tx _hash : ret . tx _hash ,
tx _key : ret . tx _key
} ;
} ;
function assert ( stmt , val ) {