@@ -112,16 +112,16 @@ Lock.prototype.verify = function (trs, sender, cb) {
112112 }
113113
114114 var lastBlock = modules . blocks . lastBlock . get ( ) ;
115- self . calcLockBytes ( lastBlock . height , trs . amount , trs . timestamp , function ( err , result ) {
115+ self . calcLockBytes ( lastBlock . height , trs . amount , trs . timestamp , function ( err , bytes ) {
116116 if ( err ) {
117117 // Unable to calculate | incomplete stats
118118 return setImmediate ( cb , err , trs ) ;
119119 }
120120
121- var lockBytes = Math . round ( result ) ;
122-
121+ var lockBytes = Math . floor ( bytes ) ;
123122 if ( lockBytes < trs . asset . lock . bytes ) {
124- return setImmediate ( cb , 'Bytes to lock (' + trs . asset . lock . bytes + ') cannot exceed calculated bytes (' + lockBytes + ')' ) ;
123+ var err = 'Bytes to lock (' + trs . asset . lock . bytes + ') cannot exceed calculated bytes (' + lockBytes + ')' ;
124+ return setImmediate ( cb , err ) ;
125125 }
126126
127127 return setImmediate ( cb , err , trs ) ;
@@ -132,31 +132,34 @@ Lock.prototype.verify = function (trs, sender, cb) {
132132 return setImmediate ( cb , err ) ;
133133 }
134134
135+ var totalAmount = new bignum ( trs . amount . toString ( ) ) ;
136+ var lockedBalance = new bignum ( sender . locked_balance . toString ( ) ) ;
137+ if ( lockedBalance . lessThan ( totalAmount ) ) {
138+ var err = "SHIFT to unlock " + totalAmount . div ( Math . pow ( 10 , 8 ) ) + " cannot exceed locked SHIFT (" + lockedBalance . div ( Math . pow ( 10 , 8 ) ) + ')' ;
139+ return setImmediate ( cb , err ) ;
140+ }
141+
135142 var publicKey = trs . senderPublicKey ;
136- self . calcUnlockBytes ( trs , function ( err , bytes ) {
137- if ( err || ! bytes ) {
143+ self . calcUnlockBytes ( trs , function ( err , unlockBytes ) {
144+ if ( err || ! unlockBytes ) {
138145 return cb ( 'calcUnlockBytes error: ' + err ) ;
139146 }
140147
141- var unlockBytes = new bignum ( bytes . toString ( ) ) . toNumber ( ) ;
142-
143- modules . locks . getLockedBytes ( publicKey , function ( err , bytes ) {
144- if ( err ) {
148+ modules . locks . getLockedBytes ( publicKey , function ( err , lockedBytes ) {
149+ if ( err || ! lockedBytes ) {
145150 return cb ( 'getLockedBytes error: ' + err ) ;
146151 }
147152
148- var lockedBytes = new bignum ( bytes . toString ( ) ) . toNumber ( ) ;
149-
150153 if ( lockedBytes < trs . asset . lock . bytes ) {
151- return setImmediate ( cb , "Bytes to unlock " + trs . asset . lock . bytes + " cannot exceed locked bytes (" + lockedBytes + ')' ) ;
154+ return setImmediate ( cb , "Bytes to unlock " + trs . asset . lock . bytes + " cannot exceed locked bytes (" + lockedBytes + ')' ) ;
152155 }
153156
154- modules . pins . getPinnedBytes ( publicKey , function ( err , bytes ) {
155- var pinnedBytes = new bignum ( bytes . toString ( ) ) . toNumber ( ) ;
157+ modules . pins . getPinnedBytes ( publicKey , function ( err , pinnedBytes ) {
156158 var availableLockedBytes = lockedBytes - pinnedBytes ;
157159
158- if ( availableLockedBytes - unlockBytes < 0 ) {
159- return setImmediate ( cb , 'Account does not have enough available bytes locked to complete unlock request' ) ;
160+ if ( availableLockedBytes < unlockBytes ) {
161+ var err = 'Account does not have enough available bytes locked to complete unlock request' ;
162+ return setImmediate ( cb , err ) ;
160163 }
161164
162165 return setImmediate ( cb , err , trs ) ;
@@ -252,7 +255,6 @@ Lock.prototype.calcLockBytes = function (height, amount, timestamp, cb) {
252255
253256Lock . prototype . calcUnlockBytes = function ( trs , cb ) {
254257 var publicKey = trs . senderPublicKey ;
255- var amount = trs . amount ;
256258
257259 modules . locks . getLockedBytes ( publicKey , function ( err , bytes ) {
258260 if ( err || ! bytes ) {
@@ -266,13 +268,13 @@ Lock.prototype.calcUnlockBytes = function (trs, cb) {
266268 return setImmediate ( cb , "Locked balance is 0" ) ;
267269 }
268270
269- var lockedBalance = new bignum ( balance . toString ( ) ) . toNumber ( ) ;
270-
271- if ( amount > lockedBalance ) {
272- return setImmediate ( cb , "Amount to unlock " + amount + " cannot exceed locked balance " + lockedBalance ) ;
271+ var lockedBalance = new bignum ( balance . toString ( ) ) ;
272+ var totalAmount = new bignum ( trs . amount . toString ( ) ) ;
273+ if ( lockedBalance . lessThan ( totalAmount ) ) {
274+ return setImmediate ( cb , "Amount to unlock " + totalAmount . div ( Math . pow ( 10 , 8 ) ) + " cannot exceed locked balance " + lockedBalance . div ( Math . pow ( 10 , 8 ) ) ) ;
273275 }
274276
275- var bytes = ( lockedBytes / lockedBalance ) * amount ;
277+ var bytes = Math . round ( ( lockedBytes / lockedBalance ) * trs . amount ) ;
276278
277279 return setImmediate ( cb , null , bytes ) ;
278280 } ) ;
@@ -323,7 +325,7 @@ Lock.prototype.apply = function (trs, block, sender, cb) {
323325 return setImmediate ( cb , err ) ;
324326 }
325327
326- library . logger . trace ( 'Logic/Lock->apply ' + ( trs . type == 8 ? 'lock' : 'unlock' ) , { sender : trs . senderId , balance : lockAmount , bytes : lockBytes , height : block . height } ) ;
328+ library . logger . trace ( 'Logic/Lock->apply ' + ( trs . type == transactionTypes . LOCK ? 'lock' : 'unlock' ) , { sender : trs . senderId , balance : lockAmount , bytes : lockBytes , height : block . height } ) ;
327329
328330 modules . accounts . mergeAccountAndGet ( {
329331 address : trs . senderId ,
@@ -354,7 +356,6 @@ Lock.prototype.undo = function (trs, block, sender, cb) {
354356 return setImmediate ( cb , err ) ;
355357 }
356358
357-
358359 modules . accounts . mergeAccountAndGet ( {
359360 address : trs . senderId ,
360361 locked_balance : lockAmount ,
@@ -377,7 +378,7 @@ Lock.prototype.applyUnconfirmed = function (trs, sender, cb) {
377378 return setImmediate ( cb , err ) ;
378379 }
379380
380- library . logger . trace ( 'Logic/Lock->applyUnconfirmed ' + ( trs . type == 8 ? 'lock' : 'unlock' ) , { sender : trs . senderId , balance : lockAmount , bytes : lockBytes } ) ;
381+ library . logger . trace ( 'Logic/Lock->applyUnconfirmed ' + ( trs . type == transactionTypes . LOCK ? 'lock' : 'unlock' ) , { sender : trs . senderId , balance : lockAmount , bytes : lockBytes } ) ;
381382
382383 modules . accounts . mergeAccountAndGet ( {
383384 address : trs . senderId ,
0 commit comments