Skip to content
Open
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
130 changes: 0 additions & 130 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
"@types/node": "^18.0.0",
"chai": "^4.3.4",
"mocha": "^10.0.0",
"prettier": "^3.6.2",
"ts-mocha": "^10.0.0",
"ts-node": "^10.9.0",
"typescript": "^5.0.0"
Expand Down
5 changes: 1 addition & 4 deletions programs/safe_harbor/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,4 @@ no-idl = []
idl-build = ["anchor-lang/idl-build"]

[dependencies]
anchor-lang = { version = "0.31.1", features = ["init-if-needed"] }

[dev-dependencies]
tokio = { version = "1.37", features = ["macros", "rt-multi-thread"] }
anchor-lang = { version = "0.31.1", features = ["init-if-needed"] }
2 changes: 2 additions & 0 deletions programs/safe_harbor/src/contexts/adopt.rs
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,12 @@ pub struct CreateOrUpdateAdoption<'info> {
pub system_program: Program<'info, System>,
}
impl CreateOrUpdateAdoption<'_> {
/// Creates or updates an adoption record for the given agreement.
pub fn create_or_update_adoption(&mut self) -> Result<()> {
let old_agreement = self.adoption.agreement.key();

let adoption = &mut self.adoption;
// Set the new agreement key in the adoption record
adoption.agreement = self.agreement.key();

emit!(SafeHarborAdopted {
Expand Down
31 changes: 27 additions & 4 deletions programs/safe_harbor/src/contexts/agreement.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
use crate::states::registry::Registry;
use crate::states::{AgreementData, AgreementUpdateType};
use crate::utils::events::AgreementUpdated;
use anchor_lang::prelude::*;
Expand Down Expand Up @@ -34,44 +35,66 @@ pub struct CreateOrUpdateAgreement<'info> {
init_nonce.to_le_bytes().as_ref(),
],
payer = signer,
space = AgreementData::INITIAL_SPACE,
space = 8 + AgreementData::INIT_SPACE,
bump,
)]
pub agreement: Account<'info, AgreementData>,

#[account(
mut,
seeds=[Registry::REGISTRY_SEED],
bump
)]
pub registry: Account<'info, Registry>,

#[account(mut)]
pub signer: Signer<'info>,

pub system_program: Program<'info, System>,
}

impl CreateOrUpdateAgreement<'_> {
/// Creates or updates an agreement with the given data and update type.
pub fn create_or_update_agreement(
&mut self,
data: AgreementData,
owner: Pubkey,
update_type: AgreementUpdateType,
) -> Result<()> {
let agreement = &mut self.agreement;
data.validate_agreement_data()?;

match update_type {
// Update the protocol name
AgreementUpdateType::ProtocolName => {
data.validate_protocol_name()?;
agreement.protocol_name = data.protocol_name;
}
// Update the contact details
AgreementUpdateType::ContactDetails => {
data.validate_contact_details()?;
agreement.contact_details = data.contact_details;
}
// Update the bounty terms
AgreementUpdateType::BountyTerms => {
data.validate_bounty_terms_data()?;
agreement.bounty_terms = data.bounty_terms;
}

// Update the agreement URI
AgreementUpdateType::AgreementUri => {
data.validate_agreement_uri()?;
agreement.agreement_uri = data.agreement_uri;
}

// Update the chains
AgreementUpdateType::Chains => {
data.validate_chains(&self.registry)?;
agreement.chains = data.chains;
}
// Initialize or update the whole agreement data
AgreementUpdateType::InitializeOrUpdate => {
// Validate the new data before updating
data.validate_agreement_data(&self.registry)?;
agreement.owner = owner;
agreement.chains = data.chains;
agreement.agreement_uri = data.agreement_uri;
agreement.protocol_name = data.protocol_name;
agreement.contact_details = data.contact_details;
Expand Down
67 changes: 67 additions & 0 deletions programs/safe_harbor/src/contexts/initialize.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
use anchor_lang::prelude::*;

use crate::errors::*;
use crate::states::registry::Registry;
use crate::utils::events::{RegistryInitialized, ValidChainsSet};

/// Initializes the global Registry PDA.
#[derive(Accounts)]
pub struct Initialize<'info> {
#[account(
init_if_needed,
seeds = [Registry::REGISTRY_SEED],
bump,
payer = signer,
space = 8 + Registry::INIT_SPACE,
)]
pub registry: Account<'info, Registry>,

#[account(mut)]
pub signer: Signer<'info>,
pub system_program: Program<'info, System>,
}

impl<'info> Initialize<'info> {
pub fn initialize(&mut self, valid_chains: Vec<u64>) -> Result<()> {
require!(
!valid_chains.is_empty(),
crate::errors::ChainError::InvalidChainId
);

let registry = &mut self.registry;
require!(!registry.initialized, RegistryError::AlreadyInitialized);

registry.initialized = true;
registry.owner = self.signer.key();

registry.add_valid_chains(valid_chains)?;

emit!(RegistryInitialized {
owner: self.signer.key(),
registry: self.registry.key(),
valid_chains: self.registry.valid_chains.clone()
});

Ok(())
}

pub fn set_valid_chains(&mut self, valid_chains: Vec<u64>) -> Result<()> {
self.registry.validate_owner(&self.signer.key())?;
self.registry.add_valid_chains(valid_chains)?;

emit!(ValidChainsSet {
valid_chains: self.registry.valid_chains.clone()
});
Ok(())
}

pub fn set_invalid_chains(&mut self, invalid_chains: Vec<u64>) -> Result<()> {
self.registry.validate_owner(&self.signer.key())?;
self.registry.remove_invalid_chains(invalid_chains)?;

emit!(ValidChainsSet {
valid_chains: self.registry.valid_chains.clone()
});
Ok(())
}
}
2 changes: 2 additions & 0 deletions programs/safe_harbor/src/contexts/mod.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
pub mod adopt;
pub mod agreement;
pub mod initialize;

pub use adopt::*;
pub use agreement::*;
pub use initialize::*;
Loading