As of 3 Nov 2026, Zebec has 1 audit report on Trustblock, by CertiK, dated 30 Mar 2024. That report lists no open critical findings.
Record last updated . It holds audits, findings and contracts up to Nov 2026, and incidents up to Oct 2026. Trustblock does not review code.
Newest first
| Audit | Security firm | Date | Scope | Critical findings | Report |
|---|---|---|---|---|---|
| Zebec - Rust | Security firm: CertiK | Date: | Scope: Not recorded (see the report) | No open critical findings | Open · skynet.certik.com |
Statuses are the security firm’s own, from each report.
| Severity | Open | Acknowledged | Fixed |
|---|---|---|---|
| Critical | 0 | 0 | 0 |
| High | 0 | 1 | 0 |
| Medium | 0 | 0 | 1 |
| Low | 1 | 0 | 6 |
Based on the code logic below, it's clear that the value of the `amount` argument provided is used for both burning `ZBC` and minting `ZBCN`. Notably, there is no code logic for decimal conversion. Consequently, the minted amount of `ZBCN` does not match the expected value. **[migrate_token.rs#L97](https://github.com/Zebec-protocol/migration-program/blob/938b8d6e58860f210ac1110ce6850399329e68ba/programs/migration-program/src/instructions/migrate_token.rs#L97)** ```rust=97 // Burn ZBC tokens. burn(burn_ctx, amount)?; ``` **[migrate_token.rs#L114](https://github.com/Zebec-protocol/migration-program/blob/938b8d6e58860f210ac1110ce6850399329e68ba/programs/migration-program/src/instructions/migrate_token.rs#L114)** ```rust=114 // Mint equivalent ZBCN tokens that were burned. mint_to(mint_ctx, amount)?; ```
Open the reportBased on the code logic below, it's evident that the provided `amount` argument value is used for both burning `ZBC` and minting `ZBCN`. This implies that the conversion rate between `ZBC` and `ZBCN` tokens is 1:1 when they have the same decimal precision. **[migrate_token.rs#L97](https://github.com/Zebec-protocol/migration-program/blob/938b8d6e58860f210ac1110ce6850399329e68ba/programs/migration-program/src/instructions/migrate_token.rs#L97)** ```rust=97 // Burn ZBC tokens. burn(burn_ctx, amount)?; ``` **[migrate_token.rs#L114](https://github.com/Zebec-protocol/migration-program/blob/938b8d6e58860f210ac1110ce6850399329e68ba/programs/migration-program/src/instructions/migrate_token.rs#L114)** ```rust=114 // Mint equivalent ZBCN tokens that were burned. mint_to(mint_ctx, amount)?; ``` The holders of `ZBC` token assets accesses the `migrate_token()` function to convert a specified amount, rather than their entire holding, of `ZBC` to `ZBCN`. Therefore, the duration of the token migration is not predetermined. Throughout the migration process, the prices of `ZBC` and `ZBCN` may differ. In such instances, a 1:1 amount conversion could potentially reduce the value of the holder's assets if the price of `ZBCN` is lower than that of `ZBC`. **[lib.rs#L21](https://github.com/Zebec-protocol/migration-program/blob/938b8d6e58860f210ac1110ce6850399329e68ba/programs/migration-program/src/lib.rs#L21)** ```rust=21 pub fn migrate_token(ctx: Context<MigrateToken>, amount: u64) -> Result<()> { migrate_token::handler(ctx, amount) } ```
Open the reportAccording to the logic outlined in the following code, it is evident that only 10 billion `ZBCN` tokens are minted via the `migration-program`, implying that only 10 billion `ZBC` tokens undergo migration. **[migrate_token.rs#L84](https://github.com/Zebec-protocol/migration-program/blob/938b8d6e58860f210ac1110ce6850399329e68ba/programs/migration-program/src/instructions/migrate_token.rs#L84)** ```rust=84 // The migration program is one way ZBC -> ZBCN. The migration program will stop once 10,000,000,000 ZBCN tokens are minted. require!( migrate_pda.total_migrated + amount <= 10_000_000_000 * 10u64.pow(zbcn_decimals as u32), MigrationError::MaxMigrationReached ); ```
Open the reportAccording to the comment at L27, the `mint_authority` account has been designated the mint authority role for the `ZBCN` token. However, the current codebase lacks the necessary logic to assign the mint authority role for the `ZBCN` token to the `mint_authority` account. ```rust=19 #[account( init, payer = admin, space = 8, seeds = [b"zbcn_mint"], bump )] /// CHECK: seeds has been checked /// This account has mint authority for ZBCN tokens. pub mint_authority: AccountInfo<'info>, /// ZBC (new) mint account. pub zbc_mint: Account<'info, Mint>, /// ZBCN (old) mint account. pub zbcn_mint: Account<'info, Mint>, ```
Open the reportThe following `CPI` is utilized for minting `ZBCN`, however, the variable name `mint_zbc` fails to accurately convey the meaning of `MintTo` struct instance. ```rust=103 let mint_zbc = MintTo { mint: zbcn_mint.to_account_info(), to: sender_zbcn_ata.to_account_info(), authority: mint_authority.to_account_info(), }; let mint_ctx = CpiContext::new_with_signer( token_program.to_account_info(), mint_zbc, mint_authority_seed, ); ```
Open the reportBased on the comment at L27, the `mint_authority` account has been assigned the role of mint authority for the `ZBCN` token. However, a current flaw in the code is the lack of a check to verify whether the `zbcn_mint` mint authority truly corresponds to the `mint_authority` PDA. And after executing `init_config()` instruction, `migrate_pda.zbcn_mint` and `migrate_pda.mint_authority` cannot be updated. **[init_config.rs#L19](https://github.com/Zebec-protocol/migration-program/blob/938b8d6e58860f210ac1110ce6850399329e68ba/programs/migration-program/src/instructions/init_config.rs#L19)** ```rust=19 #[account( init, payer = admin, space = 8, seeds = [b"zbcn_mint"], bump )] /// CHECK: seeds has been checked /// This account has mint authority for ZBCN tokens. pub mint_authority: AccountInfo<'info>, /// ZBC (new) mint account. pub zbc_mint: Account<'info, Mint>, /// ZBCN (old) mint account. pub zbcn_mint: Account<'info, Mint>, ``` A similar issue also exists in `migrate_token.rs`. **[migrate_token.rs#L39](https://github.com/Zebec-protocol/migration-program/blob/938b8d6e58860f210ac1110ce6850399329e68ba/programs/migration-program/src/instructions/migrate_token.rs#L39)** ```rust=39 /// ZBCN (new) mint account. pub zbcn_mint: Account<'info, Mint>, #[account( mut, seeds = [b"zbcn_mint"], bump )] /// CHECK: seeds has been checked /// This account has mint authority for ZBCN tokens. pub mint_authority: AccountInfo<'info>, ```
Open the reportThe space constraint at L13 serves to restrict the on-chain storage size of `migrate_pad`. In general, the `#[derive(InitSpace)]` macro is used to record `Migrate` storage size through adding an `INIT_SPACE` constant. This constant's value equals the sum of the sizes of the struct's fields with fixed byte sizes. However, the usage of the `std::mem::size_of::<Migrate>()` function will get the size for the `Migrate` struct, including padding, exceeds the value of the `INIT_SPACE` constant. Consequently, the on-chain storage size of `migrate_pad` becomes larger than necessary, and will pay more rent lamports than actually needed. **[init_config.rs#L10](https://github.com/Zebec-protocol/migration-program/blob/938b8d6e58860f210ac1110ce6850399329e68ba/programs/migration-program/src/instructions/init_config.rs#L10)** ```rust=10 #[account( init, payer = admin, space = 8 + std::mem::size_of::<Migrate>(), seeds = [b"migrate"], bump )] /// PDA that stores the migration state and authority. pub migrate_pda: Box<Account<'info, Migrate>>, ```
Open the reportThe reports name a repository or files. Open a report to see its scope.
Is this your project? Show this record on your own website. The label states what the record holds, links to this page and updates by itself. It is free and needs no sign-in.
Automatic: the three strongest facts of this project’s own record (its last audit and two more), highlighted. They update with the record. Picking a fact turns Automatic off.
<head><script src="https://widget.trustblock.run/project-widget.min.js" defer></script></head><body><divdata-tb-project-widgetdata-tb-project-slug="zebec"></div></body>
Paste the code where the label should appear. It uses no API credit and updates by itself.
Something wrong on this page? A missing report, a wrong date, a finding that was fixed since. Tell us and we check it against its source.
Tell us