From 2ad4aef446403c6c3034331fb575e5f5986f1a15 Mon Sep 17 00:00:00 2001 From: CanardMandarin Date: Sun, 7 May 2023 00:50:25 +0200 Subject: [PATCH 1/3] add new error message --- lang/syn/src/parser/accounts/mod.rs | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/lang/syn/src/parser/accounts/mod.rs b/lang/syn/src/parser/accounts/mod.rs index d0c8aee763..7d5ced5604 100644 --- a/lang/syn/src/parser/accounts/mod.rs +++ b/lang/syn/src/parser/accounts/mod.rs @@ -126,7 +126,7 @@ fn constraints_cross_checks(fields: &[AccountField]) -> ParseResult<()> { } } - for field in init_fields { + for (pos, field) in init_fields.iter().enumerate() { // Get payer for init-ed account let associated_payer_name = match field.constraints.init.clone().unwrap().payer { // composite payer, check not supported @@ -178,6 +178,23 @@ fn constraints_cross_checks(fields: &[AccountField]) -> ParseResult<()> { )); } } + + // Make sure initialiazed token accounts are always declared after their corresponding mint. + InitKind::Mint { .. } => { + if init_fields.iter().enumerate().any(|(f_pos, f)| { + match &f.constraints.init.as_ref().unwrap().kind { + InitKind::Token { mint, .. } | InitKind::AssociatedToken { mint, .. } => { + mint.to_token_stream().to_string().starts_with(&field.ident.to_string()) && pos > f_pos + } + _ => false + } + }) { + return Err(ParseError::new( + field.ident.span(), + "because of the init constraint, the mint has to be declared before any corresponding token account", + )); + } + } _ => (), } } @@ -545,4 +562,4 @@ fn parse_sysvar(path: &syn::Path) -> ParseResult { } }; Ok(ty) -} +} \ No newline at end of file From 8570185c11c2c3b29aba833204dacbe80c610ba5 Mon Sep 17 00:00:00 2001 From: CanardMandarin Date: Sun, 7 May 2023 14:04:51 +0200 Subject: [PATCH 2/3] cargo fmt --- lang/syn/src/parser/accounts/mod.rs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/lang/syn/src/parser/accounts/mod.rs b/lang/syn/src/parser/accounts/mod.rs index 6e11565466..f36020cb94 100644 --- a/lang/syn/src/parser/accounts/mod.rs +++ b/lang/syn/src/parser/accounts/mod.rs @@ -183,10 +183,14 @@ fn constraints_cross_checks(fields: &[AccountField]) -> ParseResult<()> { InitKind::Mint { .. } => { if init_fields.iter().enumerate().any(|(f_pos, f)| { match &f.constraints.init.as_ref().unwrap().kind { - InitKind::Token { mint, .. } | InitKind::AssociatedToken { mint, .. } => { - mint.to_token_stream().to_string().starts_with(&field.ident.to_string()) && pos > f_pos + InitKind::Token { mint, .. } + | InitKind::AssociatedToken { mint, .. } => { + mint.to_token_stream() + .to_string() + .starts_with(&field.ident.to_string()) + && pos > f_pos } - _ => false + _ => false, } }) { return Err(ParseError::new( @@ -562,4 +566,4 @@ fn parse_sysvar(path: &syn::Path) -> ParseResult { } }; Ok(ty) -} \ No newline at end of file +} From a66730a4d61c89b36783426fc4b8f9301766349e Mon Sep 17 00:00:00 2001 From: CanardMandarin Date: Mon, 8 May 2023 16:26:05 +0200 Subject: [PATCH 3/3] fix equality check + typo --- lang/syn/src/parser/accounts/mod.rs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/lang/syn/src/parser/accounts/mod.rs b/lang/syn/src/parser/accounts/mod.rs index f36020cb94..dedb6cdb92 100644 --- a/lang/syn/src/parser/accounts/mod.rs +++ b/lang/syn/src/parser/accounts/mod.rs @@ -185,17 +185,14 @@ fn constraints_cross_checks(fields: &[AccountField]) -> ParseResult<()> { match &f.constraints.init.as_ref().unwrap().kind { InitKind::Token { mint, .. } | InitKind::AssociatedToken { mint, .. } => { - mint.to_token_stream() - .to_string() - .starts_with(&field.ident.to_string()) - && pos > f_pos + field.ident == mint.to_token_stream().to_string() && pos > f_pos } _ => false, } }) { return Err(ParseError::new( field.ident.span(), - "because of the init constraint, the mint has to be declared before any corresponding token account", + "because of the init constraint, the mint has to be declared before the corresponding token account", )); } }