198 lines
8.9 KiB
Rust
198 lines
8.9 KiB
Rust
use flat::de;
|
|
use strum_macros::EnumString;
|
|
|
|
/// All the possible builtin functions in Untyped Plutus Core.
|
|
#[repr(u8)]
|
|
#[allow(non_camel_case_types)]
|
|
#[derive(Debug, Clone, EnumString, PartialEq, Copy)]
|
|
#[strum(serialize_all = "camelCase")]
|
|
pub enum DefaultFunction {
|
|
// Integer functions
|
|
AddInteger = 0,
|
|
SubtractInteger = 1,
|
|
MultiplyInteger = 2,
|
|
DivideInteger = 3,
|
|
QuotientInteger = 4,
|
|
RemainderInteger = 5,
|
|
ModInteger = 6,
|
|
EqualsInteger = 7,
|
|
LessThanInteger = 8,
|
|
LessThanEqualsInteger = 9,
|
|
// ByteString functions
|
|
AppendByteString = 10,
|
|
ConsByteString = 11,
|
|
SliceByteString = 12,
|
|
LengthOfByteString = 13,
|
|
IndexByteString = 14,
|
|
EqualsByteString = 15,
|
|
LessThanByteString = 16,
|
|
LessThanEqualsByteString = 17,
|
|
// Cryptography and hash functions
|
|
#[strum(serialize = "sha2_256")]
|
|
Sha2_256 = 18,
|
|
Sha3_256 = 19,
|
|
Blake2b_256 = 20,
|
|
VerifySignature = 21,
|
|
VerifyEcdsaSecp256k1Signature = 52,
|
|
VerifySchnorrSecp256k1Signature = 53,
|
|
// String functions
|
|
AppendString = 22,
|
|
EqualsString = 23,
|
|
EncodeUtf8 = 24,
|
|
DecodeUtf8 = 25,
|
|
// Bool function
|
|
IfThenElse = 26,
|
|
// Unit function
|
|
ChooseUnit = 27,
|
|
// Tracing function
|
|
Trace = 28,
|
|
// Pairs functions
|
|
FstPair = 29,
|
|
SndPair = 30,
|
|
// List functions
|
|
ChooseList = 31,
|
|
MkCons = 32,
|
|
HeadList = 33,
|
|
TailList = 34,
|
|
NullList = 35,
|
|
// Data functions
|
|
// It is convenient to have a "choosing" function for a data type that has more than two
|
|
// constructors to get pattern matching over it and we may end up having multiple such data
|
|
// types, hence we include the name of the data type as a suffix.
|
|
ChooseData = 36,
|
|
ConstrData = 37,
|
|
MapData = 38,
|
|
ListData = 39,
|
|
IData = 40,
|
|
BData = 41,
|
|
UnConstrData = 42,
|
|
UnMapData = 43,
|
|
UnListData = 44,
|
|
UnIData = 45,
|
|
UnBData = 46,
|
|
EqualsData = 47,
|
|
SerialiseData = 51,
|
|
// Misc constructors
|
|
// Constructors that we need for constructing e.g. Data. Polymorphic builtin
|
|
// constructors are often problematic (See note [Representable built-in
|
|
// functions over polymorphic built-in types])
|
|
MkPairData = 48,
|
|
MkNilData = 49,
|
|
MkNilPairData = 50,
|
|
}
|
|
|
|
impl TryFrom<u8> for DefaultFunction {
|
|
type Error = de::Error;
|
|
|
|
fn try_from(v: u8) -> Result<Self, Self::Error> {
|
|
match v {
|
|
v if v == DefaultFunction::AddInteger as u8 => Ok(DefaultFunction::AddInteger),
|
|
v if v == DefaultFunction::SubtractInteger as u8 => {
|
|
Ok(DefaultFunction::SubtractInteger)
|
|
}
|
|
v if v == DefaultFunction::MultiplyInteger as u8 => {
|
|
Ok(DefaultFunction::MultiplyInteger)
|
|
}
|
|
v if v == DefaultFunction::DivideInteger as u8 => Ok(DefaultFunction::DivideInteger),
|
|
v if v == DefaultFunction::QuotientInteger as u8 => {
|
|
Ok(DefaultFunction::QuotientInteger)
|
|
}
|
|
v if v == DefaultFunction::RemainderInteger as u8 => {
|
|
Ok(DefaultFunction::RemainderInteger)
|
|
}
|
|
v if v == DefaultFunction::ModInteger as u8 => Ok(DefaultFunction::ModInteger),
|
|
v if v == DefaultFunction::EqualsInteger as u8 => Ok(DefaultFunction::EqualsInteger),
|
|
v if v == DefaultFunction::LessThanInteger as u8 => {
|
|
Ok(DefaultFunction::LessThanInteger)
|
|
}
|
|
v if v == DefaultFunction::LessThanEqualsInteger as u8 => {
|
|
Ok(DefaultFunction::LessThanEqualsInteger)
|
|
}
|
|
// ByteString functions
|
|
v if v == DefaultFunction::AppendByteString as u8 => {
|
|
Ok(DefaultFunction::AppendByteString)
|
|
}
|
|
v if v == DefaultFunction::ConsByteString as u8 => Ok(DefaultFunction::ConsByteString),
|
|
v if v == DefaultFunction::SliceByteString as u8 => {
|
|
Ok(DefaultFunction::SliceByteString)
|
|
}
|
|
v if v == DefaultFunction::LengthOfByteString as u8 => {
|
|
Ok(DefaultFunction::LengthOfByteString)
|
|
}
|
|
v if v == DefaultFunction::IndexByteString as u8 => {
|
|
Ok(DefaultFunction::IndexByteString)
|
|
}
|
|
v if v == DefaultFunction::EqualsByteString as u8 => {
|
|
Ok(DefaultFunction::EqualsByteString)
|
|
}
|
|
v if v == DefaultFunction::LessThanByteString as u8 => {
|
|
Ok(DefaultFunction::LessThanByteString)
|
|
}
|
|
v if v == DefaultFunction::LessThanEqualsByteString as u8 => {
|
|
Ok(DefaultFunction::LessThanEqualsByteString)
|
|
}
|
|
// Cryptography and hash functions
|
|
v if v == DefaultFunction::Sha2_256 as u8 => Ok(DefaultFunction::Sha2_256),
|
|
v if v == DefaultFunction::Sha3_256 as u8 => Ok(DefaultFunction::Sha3_256),
|
|
v if v == DefaultFunction::Blake2b_256 as u8 => Ok(DefaultFunction::Blake2b_256),
|
|
v if v == DefaultFunction::VerifySignature as u8 => {
|
|
Ok(DefaultFunction::VerifySignature)
|
|
}
|
|
v if v == DefaultFunction::VerifyEcdsaSecp256k1Signature as u8 => {
|
|
Ok(DefaultFunction::VerifyEcdsaSecp256k1Signature)
|
|
}
|
|
v if v == DefaultFunction::VerifySchnorrSecp256k1Signature as u8 => {
|
|
Ok(DefaultFunction::VerifySchnorrSecp256k1Signature)
|
|
}
|
|
// String functions
|
|
v if v == DefaultFunction::AppendString as u8 => Ok(DefaultFunction::AppendString),
|
|
v if v == DefaultFunction::EqualsString as u8 => Ok(DefaultFunction::EqualsString),
|
|
v if v == DefaultFunction::EncodeUtf8 as u8 => Ok(DefaultFunction::EncodeUtf8),
|
|
v if v == DefaultFunction::DecodeUtf8 as u8 => Ok(DefaultFunction::DecodeUtf8),
|
|
// Bool function
|
|
v if v == DefaultFunction::IfThenElse as u8 => Ok(DefaultFunction::IfThenElse),
|
|
// Unit function
|
|
v if v == DefaultFunction::ChooseUnit as u8 => Ok(DefaultFunction::ChooseUnit),
|
|
// Tracing function
|
|
v if v == DefaultFunction::Trace as u8 => Ok(DefaultFunction::Trace),
|
|
// Pairs functions
|
|
v if v == DefaultFunction::FstPair as u8 => Ok(DefaultFunction::FstPair),
|
|
v if v == DefaultFunction::SndPair as u8 => Ok(DefaultFunction::SndPair),
|
|
// List functions
|
|
v if v == DefaultFunction::ChooseList as u8 => Ok(DefaultFunction::ChooseList),
|
|
v if v == DefaultFunction::MkCons as u8 => Ok(DefaultFunction::MkCons),
|
|
v if v == DefaultFunction::HeadList as u8 => Ok(DefaultFunction::HeadList),
|
|
v if v == DefaultFunction::TailList as u8 => Ok(DefaultFunction::TailList),
|
|
v if v == DefaultFunction::NullList as u8 => Ok(DefaultFunction::NullList),
|
|
// Data functions
|
|
// It is convenient to have a "choosing" function for a data type that has more than two
|
|
// constructors to get pattern matching over it and we may end up having multiple such data
|
|
// types, hence we include the name of the data type as a suffix.
|
|
v if v == DefaultFunction::ChooseData as u8 => Ok(DefaultFunction::ChooseData),
|
|
v if v == DefaultFunction::ConstrData as u8 => Ok(DefaultFunction::ConstrData),
|
|
v if v == DefaultFunction::MapData as u8 => Ok(DefaultFunction::MapData),
|
|
v if v == DefaultFunction::ListData as u8 => Ok(DefaultFunction::ListData),
|
|
v if v == DefaultFunction::IData as u8 => Ok(DefaultFunction::IData),
|
|
v if v == DefaultFunction::BData as u8 => Ok(DefaultFunction::BData),
|
|
v if v == DefaultFunction::UnConstrData as u8 => Ok(DefaultFunction::UnConstrData),
|
|
v if v == DefaultFunction::UnMapData as u8 => Ok(DefaultFunction::UnMapData),
|
|
v if v == DefaultFunction::UnListData as u8 => Ok(DefaultFunction::UnListData),
|
|
v if v == DefaultFunction::UnIData as u8 => Ok(DefaultFunction::UnIData),
|
|
v if v == DefaultFunction::UnBData as u8 => Ok(DefaultFunction::UnBData),
|
|
v if v == DefaultFunction::EqualsData as u8 => Ok(DefaultFunction::EqualsData),
|
|
v if v == DefaultFunction::SerialiseData as u8 => Ok(DefaultFunction::SerialiseData),
|
|
// Misc constructors
|
|
// Constructors that we need for constructing e.g. Data. Polymorphic builtin
|
|
// constructors are often problematic (See note [Representable built-in
|
|
// functions over polymorphic built-in types])
|
|
v if v == DefaultFunction::MkPairData as u8 => Ok(DefaultFunction::MkPairData),
|
|
v if v == DefaultFunction::MkNilData as u8 => Ok(DefaultFunction::MkNilData),
|
|
v if v == DefaultFunction::MkNilPairData as u8 => Ok(DefaultFunction::MkNilPairData),
|
|
_ => Err(de::Error::Message(format!(
|
|
"Default Function not found - {}",
|
|
v
|
|
))),
|
|
}
|
|
}
|
|
}
|