feat: handler withdraw purpose

This commit is contained in:
rvcas 2024-08-15 16:44:42 -04:00 committed by KtorZ
parent be7c0c8012
commit 5b61a75088
No known key found for this signature in database
GPG Key ID: 33173CB6F77F4277
3 changed files with 42 additions and 7 deletions

View File

@ -1,5 +1,8 @@
use crate::{ use crate::{
builtins::{self, g1_element, g2_element}, builtins::{
self, g1_element, g2_element, SCRIPT_CONTEXT, SCRIPT_PURPOSE, SCRIPT_PURPOSE_MINT,
SCRIPT_PURPOSE_SPEND, SCRIPT_PURPOSE_WITHDRAW,
},
expr::{TypedExpr, UntypedExpr}, expr::{TypedExpr, UntypedExpr},
line_numbers::LineNumbers, line_numbers::LineNumbers,
parser::token::{Base, Token}, parser::token::{Base, Token},
@ -429,14 +432,21 @@ impl TypedDataType {
constructors: vec![ constructors: vec![
RecordConstructor { RecordConstructor {
location: Span::empty(), location: Span::empty(),
name: "__Mint".to_string(), name: SCRIPT_PURPOSE_MINT.to_string(),
arguments: vec![], arguments: vec![],
doc: None, doc: None,
sugar: false, sugar: false,
}, },
RecordConstructor { RecordConstructor {
location: Span::empty(), location: Span::empty(),
name: "__Spend".to_string(), name: SCRIPT_PURPOSE_SPEND.to_string(),
arguments: vec![],
doc: None,
sugar: false,
},
RecordConstructor {
location: Span::empty(),
name: SCRIPT_PURPOSE_WITHDRAW.to_string(),
arguments: vec![], arguments: vec![],
doc: None, doc: None,
sugar: false, sugar: false,
@ -444,7 +454,7 @@ impl TypedDataType {
], ],
doc: None, doc: None,
location: Span::empty(), location: Span::empty(),
name: "__ScriptPurpose".to_string(), name: SCRIPT_PURPOSE.to_string(),
opaque: false, opaque: false,
parameters: vec![], parameters: vec![],
public: true, public: true,
@ -456,14 +466,14 @@ impl TypedDataType {
DataType { DataType {
constructors: vec![RecordConstructor { constructors: vec![RecordConstructor {
location: Span::empty(), location: Span::empty(),
name: "__ScriptContext".to_string(), name: SCRIPT_CONTEXT.to_string(),
arguments: vec![], arguments: vec![],
doc: None, doc: None,
sugar: false, sugar: false,
}], }],
doc: None, doc: None,
location: Span::empty(), location: Span::empty(),
name: "__ScriptContext".to_string(), name: SCRIPT_CONTEXT.to_string(),
opaque: false, opaque: false,
parameters: vec![], parameters: vec![],
public: true, public: true,

View File

@ -40,6 +40,10 @@ pub const FUZZER: &str = "Fuzzer";
pub const SCRIPT_PURPOSE: &str = "__ScriptPurpose"; pub const SCRIPT_PURPOSE: &str = "__ScriptPurpose";
pub const SCRIPT_PURPOSE_SPEND: &str = "__Spend"; pub const SCRIPT_PURPOSE_SPEND: &str = "__Spend";
pub const SCRIPT_PURPOSE_MINT: &str = "__Mint"; pub const SCRIPT_PURPOSE_MINT: &str = "__Mint";
pub const SCRIPT_PURPOSE_WITHDRAW: &str = "__Withdraw";
pub const SCRIPT_PURPOSE_PUBLISH: &str = "__Publish";
pub const SCRIPT_PURPOSE_VOTE: &str = "__Vote";
pub const SCRIPT_PURPOSE_PROPOSE: &str = "__Propose";
pub const SCRIPT_PURPOSES_COUNT: u16 = 6; pub const SCRIPT_PURPOSES_COUNT: u16 = 6;
pub const SCRIPT_CONTEXT: &str = "__ScriptContext"; pub const SCRIPT_CONTEXT: &str = "__ScriptContext";

View File

@ -19,7 +19,7 @@ use crate::{
}, },
builtins::{ builtins::{
bool, byte_array, data, function, int, list, option, pair, script_context, script_purpose, bool, byte_array, data, function, int, list, option, pair, script_context, script_purpose,
void, PRELUDE, SCRIPT_PURPOSE_MINT, SCRIPT_PURPOSE_SPEND, void, PRELUDE, SCRIPT_PURPOSE_MINT, SCRIPT_PURPOSE_SPEND, SCRIPT_PURPOSE_WITHDRAW,
}, },
expr::TypedExpr, expr::TypedExpr,
gen_uplc::{ gen_uplc::{
@ -293,6 +293,27 @@ impl<'a> CodeGenerator<'a> {
tipo: function(vec![byte_array()], script_purpose()), tipo: function(vec![byte_array()], script_purpose()),
}, },
"withdraw" => TypedPattern::Constructor {
is_record: false,
location: Span::empty(),
name: SCRIPT_PURPOSE_WITHDRAW.to_string(),
arguments: vec![CallArg {
label: None,
location: Span::empty(),
value: TypedPattern::Var {
name: "__purpose_arg__".to_string(),
location: Span::empty(),
},
}],
module: None,
constructor: PatternConstructor::Record {
name: SCRIPT_PURPOSE_WITHDRAW.to_string(),
field_map: None,
},
spread_location: None,
tipo: function(vec![data()], script_purpose()),
},
purpose => { purpose => {
unreachable!("unexpected/unknown purpose: {:?}", purpose) unreachable!("unexpected/unknown purpose: {:?}", purpose)
} }