diff --git a/data/shared/src/main/scala/sigma/data/UnsignedBigIntegerOps.scala b/data/shared/src/main/scala/sigma/data/UnsignedBigIntegerOps.scala index e66740b1e..e0170b14d 100644 --- a/data/shared/src/main/scala/sigma/data/UnsignedBigIntegerOps.scala +++ b/data/shared/src/main/scala/sigma/data/UnsignedBigIntegerOps.scala @@ -1,6 +1,7 @@ package sigma.data import sigma._ +import sigma.crypto.BigIntegers import sigma.data.UnsignedBigIntOrderingOps.UnsignedBigIntOrdering import sigma.eval.Extensions.IntExt @@ -98,9 +99,13 @@ object UnsignedBigIntNumericOps { override def toBigEndianBytes(x: UnsignedBigInt): Coll[Byte] = x.toBytes /** - * @return a numeric value which is inverse of `x` (every bit, including sign, is flipped) + * @return a numeric value which is inverse of `x` (every bit is flipped) */ - override def bitwiseInverse(x: UnsignedBigInt): UnsignedBigInt = ??? + override def bitwiseInverse(x: UnsignedBigInt): UnsignedBigInt = { + val bytes = BigIntegers.asUnsignedByteArray(x.asInstanceOf[CUnsignedBigInt].wrappedValue) + val res: Array[Byte] = bytes.map(b => (b ^ Byte.MinValue).toByte) + CUnsignedBigInt(BigIntegers.fromUnsignedByteArray(res)) + } /** * @return a numeric value which is `this | that` diff --git a/sc/shared/src/test/scala/sigmastate/utxo/BasicOpsSpecification.scala b/sc/shared/src/test/scala/sigmastate/utxo/BasicOpsSpecification.scala index 9a7afd40a..6c95071a0 100644 --- a/sc/shared/src/test/scala/sigmastate/utxo/BasicOpsSpecification.scala +++ b/sc/shared/src/test/scala/sigmastate/utxo/BasicOpsSpecification.scala @@ -829,6 +829,23 @@ class BasicOpsSpecification extends CompilerTestingCommons } } + property("UnsignedBigInt.bitwiseInverse") { + def bitwiseInverseTest(): Assertion = test("UnsignedBigInt.bitwiseInverse", env, ext, + s"""{ + | val b = unsignedBigInt("${CryptoConstants.groupOrder}") + | val bi = b.bitwiseInverse + | bi.bitwiseInverse == b + |}""".stripMargin, + null + ) + + if (VersionContext.current.isV6SoftForkActivated) { + bitwiseInverseTest() + } else { + an[sigma.validation.ValidationException] shouldBe thrownBy(bitwiseInverseTest()) + } + } + property("Byte.bitwiseInverse") { def bitwiseInverseTest(): Assertion = test("Byte.bitwiseInverse", env, ext,