Skip to content

dom-token API

ICRC-1/2 compliant DOM token ledger with policy-based burning for deflationary tokenomics.

Candid file: dom-token/src/dom_token.didStandard: ICRC-1, ICRC-2

Types

Account

Standard ICRC-1 account:

candid
type Account = record {
  owner: principal;
  subaccount: opt blob;
};

TransferArgs

candid
type TransferArgs = record {
  from_subaccount: opt blob;
  to: Account;
  amount: nat;
  fee: opt nat;
  memo: opt blob;
  created_at_time: opt nat64;
};

TransferError

candid
type TransferError = variant {
  BadFee: record { expected_fee: nat };
  BadBurn: record { min_burn_amount: nat };
  InsufficientFunds: record { balance: nat };
  TooOld;
  CreatedInFuture: record { ledger_time: nat64 };
  Duplicate: record { duplicate_of: nat };
  TemporarilyUnavailable;
  GenericError: record { error_code: nat; message: text };
};

BurnPolicy

Available burn policies:

candid
type BurnPolicy = variant {
  GeneralDonation;      // 1:1 burn rate
  EcologicalDonation;   // 5:1 amplified burn
  MarketplaceUnder50k;  // 5% burn
  MarketplaceOver50k;   // 7% burn
  InGamePurchase;       // 5% burn
};

BurnResult

candid
type BurnResult = record {
  transaction_index: nat;
  tokens_burned: nat;
  effective_burn_rate: float64;
};

ICRC-1 Standard Methods

Metadata

icrc1_name (query)

candid
"icrc1_name": () -> (text) query;

Returns: "DOM Token"

icrc1_symbol (query)

candid
"icrc1_symbol": () -> (text) query;

Returns: "DOM"

icrc1_decimals (query)

candid
"icrc1_decimals": () -> (nat8) query;

Returns: 8

icrc1_fee (query)

candid
"icrc1_fee": () -> (nat) query;

Returns transfer fee amount.

icrc1_total_supply (query)

candid
"icrc1_total_supply": () -> (nat) query;

Total tokens in existence (decreases with burns).

icrc1_balance_of (query)

candid
"icrc1_balance_of": (Account) -> (nat) query;

Transfer

icrc1_transfer

Transfer tokens between accounts.

candid
"icrc1_transfer": (TransferArgs) -> (variant { Ok: nat; Err: TransferError });

TypeScript Example:

typescript
const result = await domTokenActor.icrc1_transfer({
  from_subaccount: [],
  to: {
    owner: Principal.fromText(recipientPrincipal),
    subaccount: [],
  },
  amount: 1000_00000000n, // 1000 DOM with 8 decimals
  fee: [],
  memo: [],
  created_at_time: [],
});

Burn

icrc1_burn

Simple burn without policy.

candid
"icrc1_burn": (amount: nat) -> (variant { Ok: nat; Err: TransferError });

Burn Policy System

burn_with_policy

Burn tokens with a specific policy multiplier.

candid
"burn_with_policy": (BurnWithPolicyArgs) -> (variant { Ok: BurnResult; Err: TransferError });

type BurnWithPolicyArgs = record {
  amount: nat;
  policy: BurnPolicy;
  memo: opt blob;
};

Policy Rates:

PolicyBurn RateUse Case
GeneralDonation1:1Standard donations
EcologicalDonation5:1Environmental causes
MarketplaceUnder50k5%Small purchases
MarketplaceOver50k7%Large purchases
InGamePurchase5%Otter Camp games

TypeScript Example:

typescript
const result = await domTokenActor.burn_with_policy({
  amount: 100_00000000n, // 100 DOM
  policy: { EcologicalDonation: null },
  memo: [],
});

if ('Ok' in result) {
  console.log('Burned:', result.Ok.tokens_burned);
  console.log('Effective rate:', result.Ok.effective_burn_rate);
}

Policy Management (Admin Only)

enable_policy

candid
"enable_policy": (policy_name: text) -> (variant { Ok; Err: text });

disable_policy

candid
"disable_policy": (policy_name: text) -> (variant { Ok; Err: text });

get_policy_states (query)

candid
"get_policy_states": () -> (vec record { text; bool }) query;

Analytics

total_burned (query)

Total tokens burned across all time.

candid
"total_burned": () -> (nat) query;

circulating_supply (query)

Current circulating supply (total - burned - treasury).

candid
"circulating_supply": () -> (nat) query;

burn_history (query)

Get burn event history.

candid
"burn_history": (start_time: opt nat64, end_time: opt nat64) -> (vec BurnEvent) query;

type BurnEvent = record {
  timestamp: nat64;
  policy: text;
  amount: nat;
  caller: principal;
  transaction_index: nat;
};

Token Distribution (Admin Only)

mint_tokens

Mint new tokens (genesis distribution only).

candid
"mint_tokens": (Account, amount: nat) -> (variant { Ok: nat; Err: text });

batch_distribute

Distribute tokens to multiple accounts.

candid
"batch_distribute": (vec record { Account; nat }) -> (variant { Ok: nat64; Err: text });

Returns distribution ID.

Authorization

authorize_burner

Authorize a canister to burn tokens.

candid
"authorize_burner": (principal) -> (variant { Ok; Err: TransferError });

revoke_burner

Revoke burn authorization.

candid
"revoke_burner": (principal) -> (variant { Ok; Err: TransferError });

get_burners (query)

List authorized burners.

candid
"get_burners": () -> (vec principal) query;

Error Messages

ErrorCauseResolution
InsufficientFundsBalance too lowCheck balance first
BadBurnAmount below minimumIncrease burn amount
BadFeeFee mismatchUse correct fee
TooOldTransaction too oldUse current timestamp
Policy disabledBurn policy not activeUse different policy

Hello World Co-Op DAO