diff --git a/sdk/compiler/daml-lf-ast/src/DA/Daml/LF/Ast/Base.hs b/sdk/compiler/daml-lf-ast/src/DA/Daml/LF/Ast/Base.hs index a6ab9c18705e..f06d4296872c 100644 --- a/sdk/compiler/daml-lf-ast/src/DA/Daml/LF/Ast/Base.hs +++ b/sdk/compiler/daml-lf-ast/src/DA/Daml/LF/Ast/Base.hs @@ -332,6 +332,7 @@ data BuiltinExpr | BESecp256k1Bool -- :: Text -> Text -> Text -> Bool | BESecp256k1WithEcdsaBool -- :: Text -> Text -> Text -> Bool + | BESecp256k1ValidateKey -- :: Text -> Bool -- BigNumeric operations | BEScaleBigNumeric -- :: BigNumeric -> Int64 diff --git a/sdk/compiler/daml-lf-ast/src/DA/Daml/LF/Ast/Pretty.hs b/sdk/compiler/daml-lf-ast/src/DA/Daml/LF/Ast/Pretty.hs index 24d94361cae2..9c7ec282831a 100644 --- a/sdk/compiler/daml-lf-ast/src/DA/Daml/LF/Ast/Pretty.hs +++ b/sdk/compiler/daml-lf-ast/src/DA/Daml/LF/Ast/Pretty.hs @@ -308,6 +308,7 @@ instance Pretty BuiltinExpr where BEDecodeHex -> "HEX_TO_TEXT" BESecp256k1Bool -> "SECP256K1_BOOL" BESecp256k1WithEcdsaBool -> "SECP256K1_WITH_ECDSA_BOOL" + BESecp256k1ValidateKey -> "SECP256K1_VALIDATE_KEY" BETrace -> "TRACE" BETextToParty -> "TEXT_TO_PARTY" BETextToInt64 -> "TEXT_TO_INT64" diff --git a/sdk/compiler/daml-lf-proto-decode/src/DA/Daml/LF/Proto3/DecodeV2.hs b/sdk/compiler/daml-lf-proto-decode/src/DA/Daml/LF/Proto3/DecodeV2.hs index d873417b2087..f79d6a60b99d 100644 --- a/sdk/compiler/daml-lf-proto-decode/src/DA/Daml/LF/Proto3/DecodeV2.hs +++ b/sdk/compiler/daml-lf-proto-decode/src/DA/Daml/LF/Proto3/DecodeV2.hs @@ -444,6 +444,7 @@ decodeBuiltinFunction = \case LF2.BuiltinFunctionKECCAK256_TEXT -> pure BEKecCak256Text LF2.BuiltinFunctionSECP256K1_BOOL -> pure BESecp256k1Bool LF2.BuiltinFunctionSECP256K1_WITH_ECDSA_BOOL -> pure BESecp256k1WithEcdsaBool + LF2.BuiltinFunctionSECP256K1_VALIDATE_KEY -> pure BESecp256k1ValidateKey LF2.BuiltinFunctionHEX_TO_TEXT -> pure BEDecodeHex LF2.BuiltinFunctionTEXT_TO_HEX -> pure BEEncodeHex diff --git a/sdk/compiler/daml-lf-proto-encode/src/DA/Daml/LF/Proto3/EncodeV2.hs b/sdk/compiler/daml-lf-proto-encode/src/DA/Daml/LF/Proto3/EncodeV2.hs index b34273d3c575..1ff3e263953c 100644 --- a/sdk/compiler/daml-lf-proto-encode/src/DA/Daml/LF/Proto3/EncodeV2.hs +++ b/sdk/compiler/daml-lf-proto-encode/src/DA/Daml/LF/Proto3/EncodeV2.hs @@ -519,6 +519,7 @@ encodeBuiltinExpr = \case BEDecodeHex -> builtin P.BuiltinFunctionHEX_TO_TEXT BESecp256k1Bool -> builtin P.BuiltinFunctionSECP256K1_BOOL BESecp256k1WithEcdsaBool -> builtin P.BuiltinFunctionSECP256K1_WITH_ECDSA_BOOL + BESecp256k1ValidateKey -> builtin P.BuiltinFunctionSECP256K1_VALIDATE_KEY BEError -> builtin P.BuiltinFunctionERROR BEAnyExceptionMessage -> builtin P.BuiltinFunctionANY_EXCEPTION_MESSAGE diff --git a/sdk/compiler/daml-lf-tools/src/DA/Daml/LF/Simplifier.hs b/sdk/compiler/daml-lf-tools/src/DA/Daml/LF/Simplifier.hs index 647b3144194d..8f3ce49dce98 100644 --- a/sdk/compiler/daml-lf-tools/src/DA/Daml/LF/Simplifier.hs +++ b/sdk/compiler/daml-lf-tools/src/DA/Daml/LF/Simplifier.hs @@ -151,6 +151,7 @@ safetyStep = \case BEDecodeHex -> Safe 0 BESecp256k1Bool -> Safe 0 BESecp256k1WithEcdsaBool -> Safe 0 + BESecp256k1ValidateKey -> Safe 0 BEAppendText -> Safe 2 BETimestampToUnixMicroseconds -> Safe 1 BEUnixMicrosecondsToTimestamp -> Safe 0 -- can fail if the int represents an out-of-bounds date diff --git a/sdk/compiler/daml-lf-tools/src/DA/Daml/LF/TypeChecker/Check.hs b/sdk/compiler/daml-lf-tools/src/DA/Daml/LF/TypeChecker/Check.hs index b6a21ab63e8b..72379b0a7ed5 100644 --- a/sdk/compiler/daml-lf-tools/src/DA/Daml/LF/TypeChecker/Check.hs +++ b/sdk/compiler/daml-lf-tools/src/DA/Daml/LF/TypeChecker/Check.hs @@ -270,6 +270,7 @@ typeOfBuiltin = \case BEDecodeHex -> pure $ TText :-> TText BESecp256k1Bool -> pure $ TText :-> TText :-> TText :-> TBool BESecp256k1WithEcdsaBool -> pure $ TText :-> TText :-> TText :-> TBool + BESecp256k1ValidateKey -> pure $ TText :-> TBool BEFoldl -> pure $ TForall (alpha, KStar) $ TForall (beta, KStar) $ (tBeta :-> tAlpha :-> tBeta) :-> tBeta :-> TList tAlpha :-> tBeta BEFoldr -> pure $ TForall (alpha, KStar) $ TForall (beta, KStar) $ diff --git a/sdk/compiler/damlc/daml-lf-conversion/src/DA/Daml/LFConversion/Primitives.hs b/sdk/compiler/damlc/daml-lf-conversion/src/DA/Daml/LFConversion/Primitives.hs index 3fcca496a224..5c33d10f255a 100644 --- a/sdk/compiler/damlc/daml-lf-conversion/src/DA/Daml/LFConversion/Primitives.hs +++ b/sdk/compiler/damlc/daml-lf-conversion/src/DA/Daml/LFConversion/Primitives.hs @@ -46,6 +46,8 @@ convertPrim _ "BESecp256k1Bool" (TText :-> TText :-> TText :-> TBool) = pure $ EBuiltinFun BESecp256k1Bool convertPrim _ "BESecp256k1WithEcdsaBool" (TText :-> TText :-> TText :-> TBool) = pure $ EBuiltinFun BESecp256k1WithEcdsaBool +convertPrim _ "BESecp256k1ValidateKey" (TText :-> TBool) = + pure $ EBuiltinFun BESecp256k1ValidateKey -- Integer arithmetic convertPrim _ "BEAddInt64" (TInt64 :-> TInt64 :-> TInt64) = diff --git a/sdk/daml-lf/archive/src/main/scala/com/digitalasset/daml/lf/archive/DecodeV2.scala b/sdk/daml-lf/archive/src/main/scala/com/digitalasset/daml/lf/archive/DecodeV2.scala index 01b180e5f03e..c5340597ea6a 100644 --- a/sdk/daml-lf/archive/src/main/scala/com/digitalasset/daml/lf/archive/DecodeV2.scala +++ b/sdk/daml-lf/archive/src/main/scala/com/digitalasset/daml/lf/archive/DecodeV2.scala @@ -1784,6 +1784,7 @@ private[lf] object DecodeV2 { BuiltinFunctionInfo(KECCAK256_TEXT, BKECCAK256Text), BuiltinFunctionInfo(SECP256K1_BOOL, BSECP256K1Bool), BuiltinFunctionInfo(SECP256K1_WITH_ECDSA_BOOL, BSECP256K1WithEcdsaBool), + BuiltinFunctionInfo(SECP256K1_VALIDATE_KEY, BSECP256K1ValidateKey), BuiltinFunctionInfo(HEX_TO_TEXT, BDecodeHex), BuiltinFunctionInfo(TEXT_TO_HEX, BEncodeHex), BuiltinFunctionInfo(DATE_TO_UNIX_DAYS, BDateToUnixDays), diff --git a/sdk/daml-lf/archive/src/protobuf/com/digitalasset/daml/lf/archive/daml_lf2.proto b/sdk/daml-lf/archive/src/protobuf/com/digitalasset/daml/lf/archive/daml_lf2.proto index 31ec459d311f..c3ef340ec3c1 100644 --- a/sdk/daml-lf/archive/src/protobuf/com/digitalasset/daml/lf/archive/daml_lf2.proto +++ b/sdk/daml-lf/archive/src/protobuf/com/digitalasset/daml/lf/archive/daml_lf2.proto @@ -401,6 +401,8 @@ enum BuiltinFunction { BIGNUMERIC_TO_TEXT = 2010; // *Available in versions >= 2.dev* TYPE_REP_TYCON_NAME = 3011; // *Available in versions >= 2.dev* + + SECP256K1_VALIDATE_KEY = 4001; // *Available in versions >= 2.dev* } // Builtin literals diff --git a/sdk/daml-lf/encoder/src/test/lf/Builtin_2.dev_.lf b/sdk/daml-lf/encoder/src/test/lf/Builtin_2.dev_.lf index fabc81f84640..ccd920388945 100644 --- a/sdk/daml-lf/encoder/src/test/lf/Builtin_2.dev_.lf +++ b/sdk/daml-lf/encoder/src/test/lf/Builtin_2.dev_.lf @@ -97,6 +97,8 @@ module BuiltinMod { SECP256K1_BOOL; val secp256k1WithEcdsaBool: Text -> Text -> Text -> Bool = SECP256K1_WITH_ECDSA_BOOL; + val secp256k1ValidateKey: Text -> Bool = + SECP256K1_VALIDATE_KEY; val textToHex: Text -> Text = TEXT_TO_HEX; val hexToText: Text -> Text = HEX_TO_TEXT; val dateToUnixDays: Date -> Int64 = diff --git a/sdk/daml-lf/interpreter/src/main/scala/com/digitalasset/daml/lf/speedy/CostModel.scala b/sdk/daml-lf/interpreter/src/main/scala/com/digitalasset/daml/lf/speedy/CostModel.scala index 67d5f8065b50..7e366bbecd92 100644 --- a/sdk/daml-lf/interpreter/src/main/scala/com/digitalasset/daml/lf/speedy/CostModel.scala +++ b/sdk/daml-lf/interpreter/src/main/scala/com/digitalasset/daml/lf/speedy/CostModel.scala @@ -60,6 +60,7 @@ abstract class CostModel { val BKECCAK256Text: CostFunction1[Text] val BSECP256K1Bool: CostFunction3[Text, Text, Text] val BSECP256K1WithEcdsaBool: CostFunction3[Text, Text, Text] + val BSECP256K1ValidateKey: CostFunction1[Text] val BDecodeHex: CostFunction1[Text] val BEncodeHex: CostFunction1[Text] val BDateToUnixDays: CostFunction1[Date] @@ -272,6 +273,7 @@ object CostModel { override val BKECCAK256Text: CostFunction1[Text] = CostFunction1.Null override val BSECP256K1Bool: CostFunction3[Text, Text, Text] = CostFunction3.Null override val BSECP256K1WithEcdsaBool: CostFunction3[Text, Text, Text] = CostFunction3.Null + override val BSECP256K1ValidateKey: CostFunction1[Text] = CostFunction1.Null override val BDecodeHex: CostFunction1[Text] = CostFunction1.Null override val BEncodeHex: CostFunction1[Text] = CostFunction1.Null override val BDateToUnixDays: CostFunction1[Date] = CostFunction1.Null @@ -855,6 +857,8 @@ object CostModel { CostFunction3.Constant(SBoolSize) override val BSECP256K1WithEcdsaBool: CostFunction3[Text, Text, Text] = CostFunction3.Constant(SBoolSize) + override val BSECP256K1ValidateKey: CostFunction1[Text] = + CostFunction1.Constant(SBoolSize) override val BDecodeHex: CostFunction1[Text] = { val poly = LinearPolynomial(STextWrapperSize + StringSize.a, StringSize.b / 2) (t: String) => poly.calculate(t.length) diff --git a/sdk/daml-lf/interpreter/src/main/scala/com/digitalasset/daml/lf/speedy/compiler/PhaseOne.scala b/sdk/daml-lf/interpreter/src/main/scala/com/digitalasset/daml/lf/speedy/compiler/PhaseOne.scala index a3fc58b4c184..77ffd1b49c0f 100644 --- a/sdk/daml-lf/interpreter/src/main/scala/com/digitalasset/daml/lf/speedy/compiler/PhaseOne.scala +++ b/sdk/daml-lf/interpreter/src/main/scala/com/digitalasset/daml/lf/speedy/compiler/PhaseOne.scala @@ -443,6 +443,7 @@ private[lf] final class PhaseOne( case BGreaterEq => SBGreaterEq case BSECP256K1Bool => SBSECP256K1Bool case BSECP256K1WithEcdsaBool => SBSECP256K1WithEcdsaBool + case BSECP256K1ValidateKey => SBSECP256K1ValidateKey // TextMap diff --git a/sdk/daml-lf/language/src/main/scala/com/digitalasset/daml/lf/language/Ast.scala b/sdk/daml-lf/language/src/main/scala/com/digitalasset/daml/lf/language/Ast.scala index 1ece8fae8a44..46c7f1e43a90 100644 --- a/sdk/daml-lf/language/src/main/scala/com/digitalasset/daml/lf/language/Ast.scala +++ b/sdk/daml-lf/language/src/main/scala/com/digitalasset/daml/lf/language/Ast.scala @@ -540,6 +540,7 @@ object Ast { final case object BSECP256K1Bool extends BuiltinFunction // : Text -> Text -> Text -> Bool final case object BSECP256K1WithEcdsaBool extends BuiltinFunction // : Text -> Text -> Text -> Bool + final case object BSECP256K1ValidateKey extends BuiltinFunction // : Text -> Bool final case object BCoerceContractId extends BuiltinFunction // : ∀a b. ContractId a -> ContractId b diff --git a/sdk/daml-lf/parser/src/main/scala/com/digitalasset/daml/lf/testing/parser/ExprParser.scala b/sdk/daml-lf/parser/src/main/scala/com/digitalasset/daml/lf/testing/parser/ExprParser.scala index 51acb0853193..635af8c2084e 100644 --- a/sdk/daml-lf/parser/src/main/scala/com/digitalasset/daml/lf/testing/parser/ExprParser.scala +++ b/sdk/daml-lf/parser/src/main/scala/com/digitalasset/daml/lf/testing/parser/ExprParser.scala @@ -404,6 +404,7 @@ private[parser] class ExprParser[P](parserParameters: ParserParameters[P]) { "GREATER_EQ" -> BGreaterEq, "SECP256K1_BOOL" -> BSECP256K1Bool, "SECP256K1_WITH_ECDSA_BOOL" -> BSECP256K1WithEcdsaBool, + "SECP256K1_VALIDATE_KEY" -> BSECP256K1ValidateKey, "COERCE_CONTRACT_ID" -> BCoerceContractId, "ANY_EXCEPTION_MESSAGE" -> BAnyExceptionMessage, "SCALE_BIGNUMERIC" -> BScaleBigNumeric, diff --git a/sdk/daml-lf/validation/src/main/scala/com/digitalasset/daml/lf/validation/Typing.scala b/sdk/daml-lf/validation/src/main/scala/com/digitalasset/daml/lf/validation/Typing.scala index 2c5088f23fb8..8f35a79d6ec1 100644 --- a/sdk/daml-lf/validation/src/main/scala/com/digitalasset/daml/lf/validation/Typing.scala +++ b/sdk/daml-lf/validation/src/main/scala/com/digitalasset/daml/lf/validation/Typing.scala @@ -278,6 +278,7 @@ private[validation] object Typing { BGreaterEq -> tComparison, BSECP256K1Bool -> (TText ->: TText ->: TText ->: TBool), BSECP256K1WithEcdsaBool -> (TText ->: TText ->: TText ->: TBool), + BSECP256K1ValidateKey -> (TText ->: TBool), BCoerceContractId -> TForall( alpha.name -> KStar,