Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions api/src/db/models/params.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ pub struct SolanaProgramBuildParams {
pub mount_path: Option<String>,
/// Additional cargo build arguments
pub cargo_args: Option<Vec<String>>,
/// Passed to `solana-verify` as `--cargo-build-sbf-args=...`
pub cargo_build_sbf_args: Option<String>,
/// Architecture target
pub arch: Option<String>,
/// Optional webhook URL to POST verification result/error when job completes
Expand Down Expand Up @@ -48,6 +50,7 @@ impl From<OtterBuildParams> for SolanaProgramBuildParams {
base_image: otter.get_base_image(),
mount_path: otter.get_mount_path(),
cargo_args: otter.get_cargo_args(),
cargo_build_sbf_args: otter.get_cargo_build_sbf_args(),
arch: otter.get_arch(),
webhook_url: None,
}
Expand Down
1 change: 1 addition & 0 deletions api/src/db/verification.rs
Original file line number Diff line number Diff line change
Expand Up @@ -615,6 +615,7 @@ impl DbClient {
mount_path: build_params.mount_path,
bpf_flag: Some(build_params.bpf_flag),
cargo_args: build_params.cargo_args,
cargo_build_sbf_args: None,
arch: build_params.arch,
webhook_url: None,
};
Expand Down
71 changes: 71 additions & 0 deletions api/src/services/onchain/program_metadata_retriever.rs
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,32 @@ impl OtterBuildParams {
.position(|arg| arg == "--arch")
.map(|index| self.args[index + 1].clone())
}

/// `solana-verify --cargo-build-sbf-args` value
pub fn get_cargo_build_sbf_args(&self) -> Option<String> {
const PREFIX: &str = "--cargo-build-sbf-args";
for (i, arg) in self.args.iter().enumerate() {
if arg == PREFIX {
return self.args.get(i + 1).map(|v| strip_surrounding_quotes(v));
}
if let Some(value) = arg
.strip_prefix(PREFIX)
.and_then(|rest| rest.strip_prefix('='))
{
return Some(strip_surrounding_quotes(value));
}
}
None
}
}

fn strip_surrounding_quotes(value: &str) -> String {
let trimmed = value.trim();
if trimmed.len() >= 2 && trimmed.starts_with('"') && trimmed.ends_with('"') {
trimmed[1..trimmed.len() - 1].to_string()
} else {
trimmed.to_string()
}
}

/// Retrieves Otter Verify PDA for a program and signer
Expand Down Expand Up @@ -263,6 +289,51 @@ mod tests {
assert!(build_params.bpf_flag.unwrap());
}

#[test]
fn get_cargo_build_sbf_args_from_token_pda_args() {
let otter = OtterBuildParams {
address: Pubkey::default(),
signer: Pubkey::default(),
version: String::new(),
git_url: String::new(),
commit: String::new(),
args: vec![
"--library-name".to_string(),
"pinocchio_token_program".to_string(),
"--base-image".to_string(),
"solanafoundation/solana-verifiable-build:3.1.9".to_string(),
"--cargo-build-sbf-args=\"--tools-version v1.54\"".to_string(),
],
deployed_slot: 0,
bump: 0,
};
assert_eq!(
otter.get_cargo_build_sbf_args().as_deref(),
Some("--tools-version v1.54")
);
}

#[test]
fn get_cargo_build_sbf_args_two_token_form() {
let otter = OtterBuildParams {
address: Pubkey::default(),
signer: Pubkey::default(),
version: String::new(),
git_url: String::new(),
commit: String::new(),
args: vec![
"--cargo-build-sbf-args".to_string(),
"\"--tools-version v1.54\"".to_string(),
],
deployed_slot: 0,
bump: 0,
};
assert_eq!(
otter.get_cargo_build_sbf_args().as_deref(),
Some("--tools-version v1.54")
);
}

#[tokio::test]
async fn test_program_buffer_missing() {
let program_id = "2gFsaXeN9jngaKbQvZsLwxqfUrT2n4WRMraMpeL8NwZM";
Expand Down
3 changes: 3 additions & 0 deletions api/src/services/verification.rs
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,9 @@ pub fn build_verify_command(payload: &SolanaProgramBuildParams) -> Result<Comman
if let Some(ref base_image) = payload.base_image {
cmd.arg("--base-image").arg(base_image);
}
if let Some(ref sbf_args) = payload.cargo_build_sbf_args {
cmd.arg(format!("--cargo-build-sbf-args={sbf_args}"));
}
if let Some(ref mount_path) = payload.mount_path {
cmd.arg("--mount-path").arg(mount_path);
}
Expand Down
Loading