Skip to content

Commit

Permalink
Merge pull request #98 from keypom/ben/large-arg-payload
Browse files Browse the repository at this point in the history
Large FC Args Serde JSON Skip
  • Loading branch information
mattlockyer committed Feb 16, 2023
2 parents 084c80c + d8f5663 commit 5a2c605
Showing 1 changed file with 164 additions and 69 deletions.
233 changes: 164 additions & 69 deletions contract/src/stage1/function_call.rs
Expand Up @@ -77,87 +77,182 @@ pub(crate) fn handle_fc_args(
funder_id: &AccountId,
i: usize,
) -> Result<String, String> {
let try_json: Result<Value, _> = from_str(&output_args);
if try_json.is_err() {
return Err("Cannot cast args to JSON. Returning and decrementing keys".to_string());
}

let mut output_args_json = try_json.unwrap();

// Check if user provided args is present and fc_args is some
if let (Some(rule), Some(user_args_str)) = (user_args_rule, user_args.as_ref().and_then(|a| a[i].clone())) {
let try_user_json: Result<Value, _> = from_str(&user_args_str);
if try_user_json.is_ok() {
let mut user_args_json = try_user_json.unwrap();

match rule {
UserArgsRule::AllUser => {
output_args_json = user_args_json;
}
UserArgsRule::FunderPreferred => {
// Take the final args string and merge the user args into it and overwrite any duplicate keys
merge_json(&mut user_args_json, &output_args_json);
output_args_json = user_args_json;
}
UserArgsRule::UserPreferred => {
// Take the final args string and merge the user args into it and overwrite any duplicate keys
merge_json(&mut output_args_json, &user_args_json);
}
}
} else {
return Err("Cannot cast user provided args to JSON. Returning and decrementing keys".to_string());
if output_args.len() > 4096 {
near_sdk::log!("Args length is greater than 4096. Skipping JSON steps.");

let keypom_args = KeypomArgs {
account_id_field: account_id_field.clone(),
drop_id_field: drop_id_field.clone(),
key_id_field: key_id_field.clone(),
funder_id_field: funder_id_field.clone(),
};

if output_args.contains("\"keypom_args\"") {
return Err("Keypom Args detected in client args. Returning and decrementing keys".to_string());
}
}

output_args_json["keypom_args"] = json!({
"account_id_field": account_id_field,
"drop_id_field": drop_id_field,
"key_id_field": key_id_field,
"funder_id_field": funder_id_field,
});

// Add the account ID that claimed the linkdrop as part of the args to the function call in the key specified by the user
if let Some(field) = account_id_field.as_ref() {
if add_keypom_field(&mut output_args_json, field, account_id.to_string()) == false {
return Err("Cannot add account ID to specified field. Returning and decrementing keys".to_string());
};
let mut modified_args = output_args.clone();

near_sdk::log!(
"Adding claimed account ID: {:?} to specified field: {:?}",
account_id,
field
modified_args.insert_str(
modified_args.len() - 1,
&format!(
",\"keypom_args\":{}",
near_sdk::serde_json::to_string(&keypom_args).unwrap()
),
);
}

// Add drop_id
if let Some(field) = drop_id_field.as_ref() {
if add_keypom_field(&mut output_args_json, field, drop_id.to_string()) == false {
return Err("Cannot add drop ID to specified field. Returning and decrementing keys".to_string());
// Add the account ID that claimed the linkdrop as part of the args to the function call in the key specified by the user
if let Some(field) = account_id_field.as_ref() {
if modified_args.contains(field) {
return Err("Account ID Field value present in args already. Returning and decrementing keys.".to_string());
}

modified_args.insert_str(
modified_args.len() - 1,
&format!(",\"{}\":\"{}\"", field, account_id),
);
near_sdk::log!(
"Adding claimed account ID: {:?} to specified field: {:?}",
account_id,
field
);
}
near_sdk::log!("Adding drop ID: {:?} to specified field {:?}", drop_id, field);
}

// Add the key_id
if let Some(field) = key_id_field.as_ref() {
if add_keypom_field(&mut output_args_json, field, key_id.to_string()) == false {
return Err("Cannot add key ID to specified field. Returning and decrementing keys".to_string());
// Add drop_id
if let Some(field) = drop_id_field.as_ref() {
if modified_args.contains(field) {
return Err("Drop ID Field value present in args already. Returning and decrementing keys.".to_string());
}

modified_args.insert_str(
modified_args.len() - 1,
&format!(",\"{}\":\"{}\"", field, drop_id),
);
near_sdk::log!(
"Adding drop ID: {:?} to specified field: {:?}",
drop_id,
field
);
}
near_sdk::log!("Adding key ID: {:?} to specified field {:?}", key_id, field);
}

// Add the funder_id
if let Some(field) = funder_id_field.as_ref() {
if add_keypom_field(&mut output_args_json, field, funder_id.to_string()) == false {
return Err("Cannot add funder ID to specified field. Returning and decrementing keys".to_string());
// Add the key_id
if let Some(field) = key_id_field.as_ref() {
if modified_args.contains(field) {
return Err("Key ID Field value present in args already. Returning and decrementing keys.".to_string());
}

modified_args.insert_str(
modified_args.len() - 1,
&format!(",\"{}\":\"{}\"", field, key_id),
);
near_sdk::log!(
"Adding key ID: {:?} to specified field: {:?}",
key_id,
field
);
}
near_sdk::log!("Adding funder ID: {:?} to specified field {:?}", funder_id, field);
}

if to_string(&output_args_json).is_err() {
return Err("Cannot cast final args to JSON. Returning and decrementing keys".to_string());
}
// Add the funder_id
if let Some(field) = funder_id_field.as_ref() {
if modified_args.contains(field) {
return Err("Funder ID Field value present in args already. Returning and decrementing keys.".to_string());
}

modified_args.insert_str(
modified_args.len() - 1,
&format!(",\"{}\":\"{}\"", field, funder_id),
);
near_sdk::log!(
"Adding funder account ID: {:?} to specified field: {:?}",
funder_id,
field
);
}

return Ok(to_string(&output_args_json).unwrap());
return Ok(modified_args.to_string());
} else {
let try_json: Result<Value, _> = from_str(&output_args);
if try_json.is_err() {
return Err("Cannot cast args to JSON. Returning and decrementing keys".to_string());
}

let mut output_args_json = try_json.unwrap();

// Check if user provided args is present and fc_args is some
if let (Some(rule), Some(user_args_str)) = (user_args_rule, user_args.as_ref().and_then(|a| a[i].clone())) {
let try_user_json: Result<Value, _> = from_str(&user_args_str);
if try_user_json.is_ok() {
let mut user_args_json = try_user_json.unwrap();

match rule {
UserArgsRule::AllUser => {
output_args_json = user_args_json;
}
UserArgsRule::FunderPreferred => {
// Take the final args string and merge the user args into it and overwrite any duplicate keys
merge_json(&mut user_args_json, &output_args_json);
output_args_json = user_args_json;
}
UserArgsRule::UserPreferred => {
// Take the final args string and merge the user args into it and overwrite any duplicate keys
merge_json(&mut output_args_json, &user_args_json);
}
}
} else {
return Err("Cannot cast user provided args to JSON. Returning and decrementing keys".to_string());
}
}

output_args_json["keypom_args"] = json!({
"account_id_field": account_id_field,
"drop_id_field": drop_id_field,
"key_id_field": key_id_field,
"funder_id_field": funder_id_field,
});

// Add the account ID that claimed the linkdrop as part of the args to the function call in the key specified by the user
if let Some(field) = account_id_field.as_ref() {
if add_keypom_field(&mut output_args_json, field, account_id.to_string()) == false {
return Err("Cannot add account ID to specified field. Returning and decrementing keys".to_string());
};

near_sdk::log!(
"Adding claimed account ID: {:?} to specified field: {:?}",
account_id,
field
);
}

// Add drop_id
if let Some(field) = drop_id_field.as_ref() {
if add_keypom_field(&mut output_args_json, field, drop_id.to_string()) == false {
return Err("Cannot add drop ID to specified field. Returning and decrementing keys".to_string());
}
near_sdk::log!("Adding drop ID: {:?} to specified field {:?}", drop_id, field);
}

// Add the key_id
if let Some(field) = key_id_field.as_ref() {
if add_keypom_field(&mut output_args_json, field, key_id.to_string()) == false {
return Err("Cannot add key ID to specified field. Returning and decrementing keys".to_string());
}
near_sdk::log!("Adding key ID: {:?} to specified field {:?}", key_id, field);
}

// Add the funder_id
if let Some(field) = funder_id_field.as_ref() {
if add_keypom_field(&mut output_args_json, field, funder_id.to_string()) == false {
return Err("Cannot add funder ID to specified field. Returning and decrementing keys".to_string());
}
near_sdk::log!("Adding funder ID: {:?} to specified field {:?}", funder_id, field);
}

if to_string(&output_args_json).is_err() {
return Err("Cannot cast final args to JSON. Returning and decrementing keys".to_string());
}

return Ok(to_string(&output_args_json).unwrap());
}
}

#[near_bindgen]
Expand Down

0 comments on commit 5a2c605

Please sign in to comment.