#anchor #solana #math #safe #wrapper #primitive #numeric

anchor-safe-math

Safe Math wrapper for the primitive numberic types used in an Anchor project

8 releases

0.4.0 Jan 6, 2024
0.2.2 Feb 28, 2023
0.2.1 Jul 7, 2022
0.1.3 Jun 13, 2022
0.1.2 Jan 31, 2022

#2599 in Magic Beans

Custom license

6KB
67 lines

Anchor Safe Math

use anchor_lang::prelude::*;
use safe_math::{SafeMath};

#[program]
pub mod example {
  use super::*;

  pub fn instruction(ctx: Context<Instruction>, amount: u64) -> ProgramResult {
    let state = &mut ctx.accounts.state;

    // You can apply any of the following operations
    state.total_amount = state.total_amount.safe_add(amount)?;
    state.total_amount = state.total_amount.safe_sub(amount)?;
    state.total_amount = state.total_amount.safe_mul(amount)?;
    state.total_amount = state.total_amount.safe_div(amount)?;
    state.total_amount = state.total_amount.safe_pow(8_u32)?;
  }
}

#[derive(Accounts)]
pub struct Instruction<'info> {
  ...
}

Works with u128, u64, u32, u16 and u8


lib.rs:

Anchor Safe Math

anchor_safe_math is a collection of helper numeric operation functions that removes the verbosity of checking for overflow, underflow and division by zero errors.

Examples

use anchor_lang::prelude::;
use anchor_safe_math::{SafeMath};

#[program]
pub mod example {
  use super::*;

  pub fn instruction(ctx: Context<Instruction>, amount: u64) -> ProgramResult {
    let state = &mut ctx.accounts.state;

    // You can apply any of the following operations
    state.total_amount = state.total_amount.safe_add(amount)?;
    state.total_amount = state.total_amount.safe_sub(amount)?;
    state.total_amount = state.total_amount.safe_mul(amount)?;
    state.total_amount = state.total_amount.safe_div(amount)?;
    state.total_amount = state.total_amount.safe_pow(8_u32)?;
  }
}

#[derive(Accounts)]
pub struct Instruction<'info> {
  ...
}

Dependencies

~17–26MB
~419K SLoC