This is the live ioniqx platform. Try the demo site, with test data, at staging.ioniqx.io →

The Issuance Pipeline

How an investor account becomes an eligible holder, how an asset becomes an accepted offering, what legal shape that offering is given, and how it becomes a transfer-restricted token on Solana. This page is the technical walkthrough of all four, and of the checks that sit between them.

The shape of it

Three pipelines run independently and meet at the token. An account becomes an eligible holder; an asset becomes an accepted offering; the offering becomes a mint whose transfer hook checks holders against the offering's own policy on every transfer. A fourth decision sits across them — what the token legally is — and it has to be settled and frozen before a mint exists, because the mint is configured against the answer.

Account register → 2FA → KYC → accreditation → wallet → on-chain attestation
Asset classify → automated gates → risk scoring → human review → approved → active
Structure choose a model → derived fields materialised → coherence check → counsel approval → frozen
Token mint with extensions → offering config + account resolution → live → issue → transfer → redeem

One principle runs through all of it, and it is worth stating before the detail: the chain enforces the output of a decision, never the decision itself. Every determination — who someone is, whether they are accredited, whether an asset may be offered — is made and recorded off-chain. What reaches the chain is a compact, expiring assertion that the determination was made, and a program that refuses transfers when that assertion is missing, stale, or from an issuer the offering does not trust.

1. Creating an account

An account reaches eligibility through five distinct states, each of which produces a durable record. Nothing is inferred: an account that has cleared KYC but has no accreditation on file is not eligible for anything, and the system will say so rather than guess.

StepProducesGate it opens
Registration User record, email confirmed Sign-in
Two-factor enrolment TOTP secret, otp_required_for_login Everything — 2FA is mandatory, not optional
Identity verification KycVerification, user.kyc_status Holding a position at all
Accreditation AccreditedCertification with a verification level Offerings whose floor that level clears
Wallet registration InvestorWallet, ownership proven by signature Receiving tokens
Attestation SAS attestation account for that wallet Transfers — this is what the hook reads

Identity and KYC

Accounts are created either by a company employee in the portal or by the investor through the embeddable widget. Both paths converge on the same records. Authentication is password plus mandatory TOTP: a 12-character minimum, a 30-minute session timeout, and a lockout after ten failed attempts. Until TOTP is enrolled, every authenticated route redirects to enrolment.

Identity verification is delegated to a third-party provider that performs the document scan, the liveness check, and AML and sanctions screening. The platform holds a KycVerification row per check, moving through pending → processing → approved | rejected | needs_review.

Results arrive by webhook. The webhook endpoint verifies an HMAC-SHA256 signature, stores the raw event before interpreting it, and deduplicates on the provider's event id — so a replayed or repeated delivery is a no-op rather than a second state change. A background job then fetches the authoritative decision from the provider's API rather than trusting the payload, applies it to the verification, syncs the account's status, and triggers whatever the new status unlocks.

ℹ️
Store first, interpret second. The webhook's only job is to durably record that something happened. Every decision that follows is made by a job that can be retried, which is what makes the pipeline safe to re-run.

Accreditation and verification level

Accreditation is recorded separately from identity, per investor per company, because they answer different questions: identity verification confirms who someone is, and says nothing about their income or net worth.

Each certification carries a basis — which Rule 501(a) test is being relied on — and a verification level, which records how the determination was reached rather than what it concluded. The level is the part that governs which offerings the investor can hold:

LevelMeaningSufficient for
self_certified The investor's own attestation, or an employee recording one. 506(b) only
verified_reasonable_steps Documentary verification — income or asset evidence reviewed. 506(b) 506(c)
letter_credential Third-party letter from a CPA, attorney, or broker-dealer. 506(b) 506(c)

Anything above self-certification is a claim that someone checked something, so the record is required to name them: a verifier identity and an external reference are mandatory at those levels, and a SHA-256 evidence_hash is computed over the verification record on every save. That hash is the only part of the accreditation that ever reaches the chain, and it exists so an on-chain assertion can be tied back to the off-chain record behind it — and so a record altered afterwards no longer matches what was attested.

⚠️
506(c) requires reasonable steps to verify. A self-certified investor does not clear a 506(c) offering, and the platform refuses the position rather than recording it and hoping. An offering that has not declared which Reg D safe harbour it relies on is treated as the stricter one.

The evidence file

A verification level above self-certification is a claim that documents were reviewed, so the documents are held. A documentary certification is created pending and accumulates its file first; approval is the checkpoint, not creation. Each document is an AccreditationEvidence row with its own type, and the types are split along the lines Rule 506(c)(2)(ii) draws rather than lumped into one bucket:

SetDocumentsLevel it supports
Income — 506(c)(2)(ii)(A) tax_return, w2, form_1099, k1 verified_reasonable_steps
Net worth — 506(c)(2)(ii)(B) bank_statement, brokerage_statement, credit_report, property_appraisal, liabilities_schedule verified_reasonable_steps
Letters — 506(c)(2)(ii)(C) cpa_letter, attorney_letter, broker_dealer_letter, investment_adviser_letter letter_credential — the only set that reaches it
Other license_verification, other Supporting — backs a status check such as licensed_broker

The split is not cosmetic. Reviewing an investor's own statements in-house is reasonable steps; a letter moves the determination to someone licensed and accountable for it, which is why it ranks higher. Approving a certification at letter_credential with no letter in the file is refused, as is approving any documentary level with nothing behind it, and as is a certification where the investor is their own certifier — nobody takes reasonable steps to verify themselves. The review screen lists the gaps before anyone presses approve rather than failing at the press.

Uploads are PDFs or images only, capped at 25 MB, and each is hashed with SHA-256 streamed from the upload itself. The certification's evidence_hash is then a digest over the record fields and the sorted document hashes, so it depends on the set of documents rather than the order they arrived in — and a document swapped, edited, or removed after the fact moves the hash away from the one written on chain. Adding or removing a document recomputes it immediately.

⚠️
Documents cannot be pulled out of an approved certification. An attestation was written on chain from those hashes and an investor may already hold tokens on the strength of them. Withdrawing a determination is a revocation, which leaves the file intact — the difference between “this was wrong” and “this never happened”, and only the first is available.

What the offering asks for

The question an investor is asked about their accreditation belongs to the offering, not to the form. Each offering declares which Rule 501(a) bases it accepts and carries a verification floor derived from its safe harbour, and the embeddable widget asks that offering's question — the bases it will actually take, and a self-attestation step only where a self-certified investor could clear it.

Embedded without a specific offering, the criteria are the union across the company's live offerings, so what an investor is told still corresponds to something they could buy. A company with no live offering yet is the one case where nothing has stated a requirement: onboarding proceeds self-certified, and the floor applies later at the offering that has one.

Wallets and the qualified-investor attestation

A wallet is registered by proving control of it: the investor signs a challenge with the wallet's key and the platform verifies the Ed25519 signature against the address. An address that is well-formed base58 but does not decode to a 32-byte public key is rejected at the model level — it could never hold a token or carry an attestation.

Once an account is KYC-approved, accredited, and has a verified primary wallet, the platform writes a qualified-investor attestation to the Solana Attestation Service for that wallet. This is the artifact the transfer hook reads. Its address is a program-derived address of ["attestation", credential, schema, wallet] — note the absence of any mint. One attestation covers every offering; the per-offering decision happens at transfer time.

The payload asserts status and nothing else:

FieldTypeNotes
schema_versionu8The hook rejects versions it does not support.
subject_walletpubkeyMust equal the attestation holder.
investor_classu8 enumAccredited, qualified purchaser, QIB, Reg S, and so on.
jurisdictionu16ISO 3166-1 numeric.
us_personboolReg S turns on this; tracked explicitly.
verification_levelu8 enumThe level from the certification above.
issued_at / expires_ati64Unix seconds. No attestation is non-expiring.
revokedboolSoft revocation; hard revocation closes the account.
evidence_hash32 bytesSHA-256 of the off-chain verification record and its document hashes.

No names, no documents, no evidentiary basis — on-chain data is world-readable, and the reasonable-steps record is an examination artifact that belongs off-chain and stays there. Attestations are capped at one year and re-issued by a daily sweep before they lapse; nothing on-chain initiates a refresh, so an attestation that expires simply stops authorising transfers. Re-issuance is skipped when the assertion has not changed, so the sweep is usually a no-op.

2. Identifying an asset and accepting it

An asset arrives as a project belonging to a company that has already cleared business verification. Two things then have to be true before it can be tokenized: it has to be described in a form machines can read, and it has to be accepted by the compliance pipeline.

Classification

Description follows a two-axis classification, because a first-lien note and an equity stake in the same building are both real estate with inverted risk — neither axis can be inferred from the other:

KeyRequiredMeaning
rwa.classYesWhat the asset is: real-estate, treasury, private-credit, fund, and so on — a closed set.
rwa.claimYesWhat the holder owns: equity, debt-senior, fund-lp, revenue-share, direct-title, and so on — also closed.
rwa.subclassNoOpen registry: multifamily, industrial, data-center. Unknown values are surfaced, never rejected.
rwa.jurisdictionNoWhere the asset sits, e.g. US-TX.
rwa.issuer_leiNoThe issuing company's Legal Entity Identifier.
rwa.apiNoPer-mint discovery URL for the fuller record.

Where a specific property is identified, the identifier is stored hashed with a per-project salt. An unsalted parcel number is recoverable by enumerating the county register, which would make the on-chain record a pointer to a street address; the salt is generated automatically the moment an identifier is set.

⚠️
Classification completeness is a mint precondition. Token-2022 allocates extension space when the mint account is created, so a mint made without a complete classification can never carry one. The tokenization job refuses rather than minting something unfixable.

Acceptance criteria

Acceptance runs in three stages, and the same shape is used for the company and for each project. Automated gates run first, an AI pass scores what the gates could not decide, and a human makes any decision that is not clear-cut.

1

Automated gates

Deterministic checks, in order, each recorded as its own row with a pass, fail, or warning. Any hard-flag failure routes immediately — no scoring, no discretion.

2

Risk scoring

The remaining signals are scored against a versioned, attorney-authored ruleset. Below the auto-approve threshold with no hard flags, the item proceeds; otherwise it queues for review.

3

Human review

A reviewer sees the full dossier: every check, the score, the narrative, and the ruleset version it was judged under. Decisions are recorded with a SHA-256 signature over the decision record.

For a company, the gates are:

For a project, the gates are:

The ruleset itself is data, not code: a versioned record holding the auto-approve threshold, the hard flags with their regulatory basis and routing action, the weighted soft flags, the excluded jurisdictions, and the scoring guidance. Publishing a new version supersedes the previous one, and every review records the version it was judged under — an examiner asking why a 2026 decision was made gets the rules as they stood that day, not as they stand now.

A hard flag is not a score input. An OFAC match, a sanctioned jurisdiction, a failed business verification, or missing beneficial ownership routes to immediate rejection or counsel review regardless of how favourable everything else looks. Soft flags — entity age, complex ownership structures, unusual terms — carry weights that accumulate into the risk score.

A project that clears review is approved, and an approved project is active once published. Only an active project can be tokenized.

3. Choosing the offering's structure

An approved asset still has one question outstanding, and it is the one that decides what everything downstream means: what does the holder of this token legally own? The answer settles who receives the K-1, whether the holder is a partner, whether §7704 transfer limits have to be enforced, and what happens when someone redeems. It is chosen once per offering — never per tranche, never per investor — and frozen before a mint exists.

ℹ️
The 506(b)/506(c)/Reg S split is orthogonal to this. Structure is the outer envelope; the tranche split lives inside it. Both tranches of an offering share one structure and differ only on investor eligibility and compliance periods.

The two models

There are exactly two coherent answers, and they are mutually exclusive:

direct_memberspv_wrapper
What the token is A wrapper on a real membership interest A derivative claim against an SPV
Partner of record The token holder The SPV
Tax form to the holder K-1 — true pass-through, not a choice 1099 or statement; the SPV takes the K-1
Redemption is A partner exit, taxable at the partnership level An SPV buyback, taxable only between holder and SPV
§7704 exposure Live — holders are partners and interests transfer, so transfer limits are mandatory Contained at the SPV boundary; the partner set never changes

For a direct_member offering the §7704(b) private-transfer safe harbour is recorded as parameters rather than code: a window in days and a cap in basis points on interests transferred within it, defaulting to the statutory 2% over 365 days. Counsel may set an offering tighter, never looser. A spv_wrapper offering must carry no limits at all — the hook zeroes that branch, so storing limits there would be a claim about enforcement with nothing behind it.

One model, every other field

A single model choice implies partner of record, token legal character, K-1 recipient, whether the holder is a partner, the redemption event type, where it is taxable, and whether partner eligibility is enforced. Those fields are still materialised into the stored document rather than re-derived at each call site, so the hook provisioner, the ATS feed, and the tax pipeline read one authoritative record instead of three interpretations of an enum.

The cost of materialising is that a hand-edited document could disagree with its own model, so every save validates the whole object: derived fields against the model, the §7704 limits against the model, the tax form against the model, the vocabularies (accounting cycle, valuation method, funding source), and the redemption timing. The offering form asks only for what a model leaves open and fills the rest in, so no submission can produce a hybrid in the first place — the validation exists for documents that arrive from anywhere else.

⚠️
A structure that disagrees with its own model is not a variant. A document saying spv_wrapper while sending the K-1 to the token holder is two structures at once, and the hook, the ATS, and the tax pipeline would each read it differently. It is refused at the boundary rather than reconciled later.

Counsel approval, and what it freezes

The structure is editable in the portal right up to sign-off, and never after. Approval is a site-admin action on the offering, recorded with who approved it and when, and it re-validates the structure at the one moment it is still possible to fix. From that point:

Irrevocability is the point. Investors from here on subscribe to the legal shape the structure describes — partner or not, K-1 or 1099, partner exit or SPV buyback — and an offering whose legal shape can be revised after subscription has told its investors something that stopped being true.

Redemption terms

The structure also carries the terms that make redemption a scheduled event rather than a request: a notice period in days, an accounting cycle (monthly, quarterly, annual), and a first redemption date. The recurrence itself is not stored — the next date is the first date stepped by the cycle, and a stored list of dates would be a second answer that silently stops being right the year nobody extends it. The notice deadline for a given date is that date minus the notice period.

Two more fields name sources rather than figures. valuation_method — appraisal, third_party_mark, cap_rate, cost_basis — says where the strike price comes from. funding_source — reserve, in_kind, gated — says who pays, where gated means the offering may defer or refuse when neither is available, a term that has to be disclosed up front rather than discovered at the window.

4. Creating the token

Tokenization is a single queued job with an unusual property: most of what it does cannot be undone or amended later, because Token-2022 fixes a mint's extensions at account creation. There is no migration back, so the preconditions are checked before anything is sent.

PreconditionWhy it cannot wait
Project is active Tokenizing an unapproved offering would put an unreviewed asset on chain.
Classification complete Metadata space is allocated at creation; a mint without it can never carry one.
Structure approved by counsel The mint is configured against one rule branch — partner exit or SPV buyback — and the two are different taxable events. A mint cannot be re-pointed at the other.
Transfer hook program known The hook extension is allocated at creation. A mint made without it is permanently unrestricted — transferable to any wallet, forever, with no KYC gate.
Freeze authority retained Without it the frozen-by-default backstop could never be lifted, and no compliance halt would be possible.

The mint

The mint is created as a Token-2022 mint carrying five extensions, all initialised before the mint itself, because Token-2022 rejects extension initialisation on an already-initialised mint:

ExtensionPurpose
MetadataPointer Points the mint at itself, so the classification lives in the mint rather than a separate account.
TransferHook Names the program Token-2022 calls into on every transfer of this mint.
DefaultAccountState = Frozen Every token account for this mint is created frozen. Fail-closed backstop: if hook account resolution is ever misconfigured, nothing moves anyway.
PermanentDelegate A key that can move or burn tokens from any holder's account without the holder's signature, for clawback, court-ordered transfers and lost-key recovery. Held outside the app, behind the multisig. A mint created without it can never gain it, so minting is refused when none is configured.
TokenMetadata Carries the rwa.* classification pairs as additional metadata.

The account is allocated for the fixed extensions and funded for the size the variable-length metadata will grow it to, since the metadata write reallocates the account and would otherwise fail for rent.

Offering configuration

Pointing a mint at the hook program is not configuring it. The program needs two accounts per mint before a single transfer can succeed, and both are written immediately after the mint, in one transaction:

The policy is derived from the offering itself. The verification floor comes from the exemption — a 506(c) offering demands documentary verification and a 506(b) one does not — and a Reg S tranche sets the US-person rule to exclude. Constraints the platform cannot substantiate are left permissive rather than invented: a rule written here is enforced on every transfer for the life of the token.

ℹ️
Until both accounts exist, every transfer of the mint fails in Token-2022's account resolution. That is the safe direction — a gated mint that cannot resolve its hook accounts moves nothing — but it is why configuration is part of issuance rather than something discovered on the first transfer.

What a transfer checks

Token-2022 calls the hook on every transfer of a gated mint. The hook reads the counterparty's attestation and the offering's config, and returns an error — aborting the whole transfer atomically — unless all of the following hold:

  1. The attestation's schema version is one this offering supports.
  2. Its subject is the counterparty's own wallet.
  3. It was issued under the credential and schema this offering pins. Shape is not trust: the owning program, credential, and schema are all verified.
  4. Its investor class is one the offering accepts.
  5. Its verification level meets the offering's floor.
  6. Its jurisdiction and US-person status satisfy the offering's policy.
  7. It has not expired and is not revoked — evaluated against the current time on every transfer, never cached.

Each failure returns a distinct error code. The hook writes nothing, emits no event, and makes no cross-program call: it is read-and-validate only, which is what keeps it free of reentrancy surface and cheap enough to run on every transfer.

⚠️
Every client that moves these tokens must build transfers with hook-aware account resolution. A plain transferChecked omits the extra accounts and fails — with an error about a missing account that names nothing about the hook. Verify every wallet, custodian, and venue path before relying on it; the ioniqx Ruby client does this resolution for you. Where an offering also publishes an eligibility roster, the proof travels as instruction data rather than as an account, so resolution alone does not produce it — fetch it from GET /eligibility/:mint/:wallet, which is public and CORS-enabled.

Issuing to investors

Because every token account is created frozen, holding requires a deliberate act by the platform as freeze authority. That act is gated on the same eligibility as everything else: an account is opened only for a wallet carrying a current attestation, for an offering whose verification floor that investor's accreditation clears. A backstop that opened every account would not be a backstop.

Primary issuance therefore cannot outrun the attestation that authorises the wallet — there would be nothing to open the account on the strength of, and Token-2022 refuses to mint into a frozen account. Distributions follow the same shape in the settlement asset: pro-rata USDC against ownership at the record date, with the recipient's token account created if this is the first time they have held it.

A periodic reconciliation job compares the sum of the off-chain ledger against the on-chain supply for every live token and alerts on any mismatch. The cap table is the platform's source of truth for ownership; the chain is the enforcement layer. They are expected to agree, and the system checks rather than assumes.

Redemption and settlement

Redemption runs the issuance pipeline backwards, with one deliberate asymmetry: the token leg is on-chain and the value leg is not. A redemption recorded against the cap table burns the holder's tokens on Solana and decrements the recorded supply; the money moves off the rail, via the ATS or paying agent.

That asymmetry is a privacy decision, not a convenience. Pairing an on-chain USDC payout with the burn would let anyone divide payout by tokens burned and recover per-token NAV every cycle — a continuous, permissionless price oracle for an illiquid asset whose valuation is supposed to be disclosed to eligible investors on a schedule the issuer controls. What leaks from a burn is the quantity and the fact of redemption, not the value. A redemption reference tying the burn to its off-chain settlement is an opaque id, never an amount.

Settlement lag is affordable precisely because redemption is gated to a notice period plus an accounting cycle: the wire lands inside a window investors were already told about. Off-chain settlement is also where reporting already lives — value and holder identity sit in the ATS layer, so an on-chain payout would force that layer to reconstruct settlement facts from chain data and reconcile them, without relieving a single off-chain obligation.

Notice, and the window it settles in

A holder gives notice to redeem. The platform computes the date that notice settles — the first redemption date far enough out that the whole notice period still fits before it — and stores it on the notice rather than deriving it later. A holder was told a date; that is a fact about the notice, not a function of the offering's current configuration.

Notice given exactly on a date's deadline makes that date. A day later moves it a full cycle, which for a quarterly offering is three months, so the boundary is the part worth being exact about.

Nothing is on chain while the clock runs. When the date arrives, a daily sweep writes a redemption marker for that wallet — a small account seeded on the mint and the wallet, carrying the quantity the notice authorised and the date it settles. Token-2022 calls the hook identically for every transfer, so without the marker the hook cannot tell a redemption leg from an ordinary transfer, and the two have different rules: an ordinary transfer checks the recipient against the roster, while a redemption moves tokens to the issuer on a date and the recipient is not an eligible holder at all.

ℹ️
The marker is written when the window opens, not when notice is given. A marker standing for the whole notice period would turn a redemption gated to a date into one that can happen at any point in the weeks before it. The gate would be the notice rather than the window, and those are different promises. For the same reason the marker carries the amount: without it, it is a standing permission to redeem any quantity.

A notice can be withdrawn while the clock runs and not after. Once the marker exists the hook holds a standing authorisation, and a cancelled record would say the notice is gone while the chain still says it is not.

The burn, and what ties it to the money

With the window open and the marker standing, the tokens are burned. A burn instruction has no room for anything but a discriminator and an amount, so the reference that ties this burn to the payment discharging it rides alongside it in the same transaction as a memo: ioniqx:rdm:<32 hex>.

The reference is random, and that is the point. Anything derived from the amount, the holder or the offering would let an observer work backwards from a public memo to facts this system keeps off the chain. It means nothing to anyone without the platform's records — which is exactly what a join key between a public ledger and a private one should be.

Two records are written before the transaction is sent, because a burn cannot be undone. The reference is persisted first, so a retry after a lost response reuses it rather than minting a second id for one obligation. Then a start marker, so a later run that finds a start with no finish knows a burn may already be on chain and refuses to send another. The ledger entry and the marker cleanup come after: both are recoverable, and the burn is not.

⚠️
Nothing burns on a schedule. Burning creates an obligation to pay. A nightly job burning every open window would manufacture unpaid obligations faster than anyone could reconcile them, so this is an action someone takes knowing the money is arranged.

Settlement, and burned-but-unpaid

The two legs of a redemption cannot be made atomic. The burn commits on Solana, the money moves on a banking rail, and nothing spans both. The gap between them is a real state with a name — burned-but-unpaid — in which the holder has neither the tokens nor the cash. It is recorded as an obligation rather than left as an implication.

burned tokens gone, nothing struck yet — the debt begins
settling an amount is struck from the NAV and a paying agent is instructed — still unpaid
settled the money landed, against the agent's own payment reference
settlement_failed the rail refused or returned it — not terminal, the debt stands
reinstated payment is impossible, so the tokens are minted back

Only two of those discharge the obligation, and they discharge it in different currencies. settled means the holder got the money. reinstated means they could not be paid at all and got their position back instead — which is what never strand the holder has to mean when money cannot move. A failed payment returns to settling on another attempt; the failure reason is kept, because the remedy depends on it. Wrong routing details get another try; a closed estate does not.

A daily sweep reports every redemption that has burned and not been paid, because nothing on chain or off it notices on its own and the holder should not be the one who tells you. It resolves nothing: paying and reinstating are both decisions with a person behind them.

The strike itself is entered, not computed. valuation_method on the offering structure names where a NAV comes from; producing the figure is the issuer's job, and it is recorded against the redemption because that is the number the holder was paid on. Withholding is recorded the same way and for the same reason — a foreign partner in a direct_member offering carries a §1446 obligation, and the rate is counsel's to decide rather than this platform's to infer.

Verifying the pipeline end to end

The whole sequence is exercised against a real cluster by a single task, bin/rake devnet:e2e. What makes it worth having is what it refuses to do: it runs the production jobs inline — tokenize, attest, thaw, mint, transfer — rather than reimplementing the chain calls, so a passing run says something about the pipeline an investor goes through rather than about a parallel implementation of it.

Investor wallets in a run are keypairs generated in memory. The address is persisted on the InvestorWallet row exactly as a real one would be; the private key is never written anywhere, which is why a run does its transfers inside the same process that created the wallets. The same provisioner backs demo companies, so a demo asset is a real devnet mint rather than a fabricated address.

What lives on-chain, and what does not

On-chain publicOff-chain private
Asset classification: class, claim, subclass, jurisdiction, issuer LEI Offering terms: price, minimums, projected returns, the memorandum
Hashed, salted property identifier The property identifier itself, and the address behind it
Investor class, jurisdiction, US-person flag, verification level, validity window Names, documents, identity evidence, income and asset evidence
SHA-256 hash of the verification record and its document set The verification record and the documents themselves — the reasonable-steps file produced on examination
Rule-branch discriminant and redemption window timing: notice days, cycle length, next valid date Tax-reporting mode, valuation method and the NAV it produces, redemption price, funding source, the entity stack and partner of record
Burn quantity, and the fact that a redemption happened What was paid for it, and the rail it settled on
Token balances and transfers Cap table, cost basis, accrued yield, tax reporting

Last updated November 10, 2026 · Questions: admin@ioniqx.io