@@ -897,37 +897,38 @@ class Script extends bio.Struct {
897
897
if ( stack . length < 1 )
898
898
throw new ScriptError ( 'INVALID_STACK_OPERATION' , op , ip ) ;
899
899
900
- let num = stack . getNum ( - 1 , minimal , 4 ) ;
900
+ let binum = stack . getNum ( - 1 , minimal , 4 ) . toBigInt ( ) ;
901
901
let cmp ;
902
902
903
903
switch ( op . value ) {
904
904
case opcodes . OP_1ADD :
905
- num . iaddn ( 1 ) ;
905
+ binum = bigInt64 ( binum + 1n ) ;
906
906
break ;
907
907
case opcodes . OP_1SUB :
908
- num . isubn ( 1 ) ;
908
+ binum = bigInt64 ( binum - 1n ) ;
909
909
break ;
910
910
case opcodes . OP_NEGATE :
911
- num . ineg ( ) ;
911
+ binum = bigInt64 ( - binum ) ;
912
912
break ;
913
913
case opcodes . OP_ABS :
914
- num . iabs ( ) ;
914
+ if ( binum < 0n )
915
+ binum = bigInt64 ( - binum ) ;
915
916
break ;
916
917
case opcodes . OP_NOT :
917
- cmp = num . isZero ( ) ;
918
- num = ScriptNum . fromBool ( cmp ) ;
918
+ cmp = binum === 0n ;
919
+ binum = cmp ? 1n : 0n ;
919
920
break ;
920
921
case opcodes . OP_0NOTEQUAL :
921
- cmp = ! num . isZero ( ) ;
922
- num = ScriptNum . fromBool ( cmp ) ;
922
+ cmp = binum !== 0n ;
923
+ binum = BigInt ( cmp ) ;
923
924
break ;
924
925
default :
925
926
assert ( false , 'Fatal script error.' ) ;
926
927
break ;
927
928
}
928
929
929
930
stack . pop ( ) ;
930
- stack . pushNum ( num ) ;
931
+ stack . pushNum ( ScriptNum . fromBigInt ( binum ) ) ;
931
932
932
933
break ;
933
934
}
@@ -947,59 +948,59 @@ class Script extends bio.Struct {
947
948
if ( stack . length < 2 )
948
949
throw new ScriptError ( 'INVALID_STACK_OPERATION' , op , ip ) ;
949
950
950
- const n1 = stack . getNum ( - 2 , minimal , 4 ) ;
951
- const n2 = stack . getNum ( - 1 , minimal , 4 ) ;
951
+ const bn1 = stack . getNum ( - 2 , minimal , 4 ) . toBigInt ( ) ;
952
+ const bn2 = stack . getNum ( - 1 , minimal , 4 ) . toBigInt ( ) ;
952
953
953
- let num , cmp ;
954
+ let binum , cmp ;
954
955
955
956
switch ( op . value ) {
956
957
case opcodes . OP_ADD :
957
- num = n1 . iadd ( n2 ) ;
958
+ binum = bigInt64 ( bn1 + bn2 ) ;
958
959
break ;
959
960
case opcodes . OP_SUB :
960
- num = n1 . isub ( n2 ) ;
961
+ binum = bigInt64 ( bn1 - bn2 ) ;
961
962
break ;
962
963
case opcodes . OP_BOOLAND :
963
- cmp = n1 . toBool ( ) && n2 . toBool ( ) ;
964
- num = ScriptNum . fromBool ( cmp ) ;
964
+ cmp = bn1 !== 0n && bn2 !== 0n ;
965
+ binum = BigInt ( cmp ) ;
965
966
break ;
966
967
case opcodes . OP_BOOLOR :
967
- cmp = n1 . toBool ( ) || n2 . toBool ( ) ;
968
- num = ScriptNum . fromBool ( cmp ) ;
968
+ cmp = bn1 !== 0n || bn2 !== 0n ;
969
+ binum = BigInt ( cmp ) ;
969
970
break ;
970
971
case opcodes . OP_NUMEQUAL :
971
- cmp = n1 . eq ( n2 ) ;
972
- num = ScriptNum . fromBool ( cmp ) ;
972
+ cmp = bn1 === bn2 ;
973
+ binum = BigInt ( cmp ) ;
973
974
break ;
974
975
case opcodes . OP_NUMEQUALVERIFY :
975
- cmp = n1 . eq ( n2 ) ;
976
- num = ScriptNum . fromBool ( cmp ) ;
976
+ cmp = bn1 === bn2 ;
977
+ binum = BigInt ( cmp ) ;
977
978
break ;
978
979
case opcodes . OP_NUMNOTEQUAL :
979
- cmp = ! n1 . eq ( n2 ) ;
980
- num = ScriptNum . fromBool ( cmp ) ;
980
+ cmp = bn1 !== bn2 ;
981
+ binum = BigInt ( cmp ) ;
981
982
break ;
982
983
case opcodes . OP_LESSTHAN :
983
- cmp = n1 . lt ( n2 ) ;
984
- num = ScriptNum . fromBool ( cmp ) ;
984
+ cmp = bn1 < bn2 ;
985
+ binum = BigInt ( cmp ) ;
985
986
break ;
986
987
case opcodes . OP_GREATERTHAN :
987
- cmp = n1 . gt ( n2 ) ;
988
- num = ScriptNum . fromBool ( cmp ) ;
988
+ cmp = bn1 > bn2 ;
989
+ binum = BigInt ( cmp ) ;
989
990
break ;
990
991
case opcodes . OP_LESSTHANOREQUAL :
991
- cmp = n1 . lte ( n2 ) ;
992
- num = ScriptNum . fromBool ( cmp ) ;
992
+ cmp = bn1 <= bn2 ;
993
+ binum = BigInt ( cmp ) ;
993
994
break ;
994
995
case opcodes . OP_GREATERTHANOREQUAL :
995
- cmp = n1 . gte ( n2 ) ;
996
- num = ScriptNum . fromBool ( cmp ) ;
996
+ cmp = bn1 >= bn2 ;
997
+ binum = BigInt ( cmp ) ;
997
998
break ;
998
999
case opcodes . OP_MIN :
999
- num = ScriptNum . min ( n1 , n2 ) ;
1000
+ binum = bn1 < bn2 ? bn1 : bn2 ;
1000
1001
break ;
1001
1002
case opcodes . OP_MAX :
1002
- num = ScriptNum . max ( n1 , n2 ) ;
1003
+ binum = bn1 > bn2 ? bn1 : bn2 ;
1003
1004
break ;
1004
1005
default :
1005
1006
assert ( false , 'Fatal script error.' ) ;
@@ -1008,7 +1009,7 @@ class Script extends bio.Struct {
1008
1009
1009
1010
stack . pop ( ) ;
1010
1011
stack . pop ( ) ;
1011
- stack . pushNum ( num ) ;
1012
+ stack . pushNum ( ScriptNum . fromBigInt ( binum ) ) ;
1012
1013
1013
1014
if ( op . value === opcodes . OP_NUMEQUALVERIFY ) {
1014
1015
if ( ! stack . getBool ( - 1 ) )
@@ -1022,11 +1023,11 @@ class Script extends bio.Struct {
1022
1023
if ( stack . length < 3 )
1023
1024
throw new ScriptError ( 'INVALID_STACK_OPERATION' , op , ip ) ;
1024
1025
1025
- const n1 = stack . getNum ( - 3 , minimal , 4 ) ;
1026
- const n2 = stack . getNum ( - 2 , minimal , 4 ) ;
1027
- const n3 = stack . getNum ( - 1 , minimal , 4 ) ;
1026
+ const n1 = stack . getNum ( - 3 , minimal , 4 ) . toBigInt ( ) ;
1027
+ const n2 = stack . getNum ( - 2 , minimal , 4 ) . toBigInt ( ) ;
1028
+ const n3 = stack . getNum ( - 1 , minimal , 4 ) . toBigInt ( ) ;
1028
1029
1029
- const val = n2 . lte ( n1 ) && n1 . lt ( n3 ) ;
1030
+ const val = n2 <= n1 && n1 < n3 ;
1030
1031
1031
1032
stack . pop ( ) ;
1032
1033
stack . pop ( ) ;
@@ -2457,6 +2458,16 @@ function checksig(msg, sig, key) {
2457
2458
return secp256k1 . verify ( msg , sig . slice ( 0 , - 1 ) , key ) ;
2458
2459
}
2459
2460
2461
+ /**
2462
+ * Make sure number is int64.
2463
+ * @param {BigInt } value
2464
+ * @returns {BigInt }
2465
+ */
2466
+
2467
+ function bigInt64 ( value ) {
2468
+ return BigInt . asIntN ( 64 , value ) ;
2469
+ }
2470
+
2460
2471
/*
2461
2472
* Expose
2462
2473
*/
0 commit comments