SettleMint
API referenceGuides

Send an issuer its shareholder list after an auction or at month end

Produce one security's shareholder list at a record block, check that it adds up to total supply, and send the CSV, XLSX or PDF file to the issuer.

Overview

After each auction cycle settles, and on the last trading day of each month for securities that trade continuously, the settlement team sends each issuer the list of its shareholders and their settled holdings. DALP produces that list for one security at one record block. Every holder's balance in the list is the on-chain balance after that block.

The settlement team runs this procedure and sends the file. DALP does not start it after an auction and does not deliver it to the issuer yet.

Before you start

  • The security must have the historical-balances feature, attached when the security was created. DALP reads holders from the balance history that feature records. A security without it, a record block before the feature was attached, or a security that already had supply when the feature was attached is rejected, because its balance history is incomplete.
  • You need a reporting role on the organization's system: admin, auditor, compliance manager or system manager.
  • For the Platform API, use an API key from the organization that holds the security. Send it as X-Api-Key.

Choose when to run it

Trading modelWhen to runRecord block
AuctionAfter every trade of the auction cycle is final.The block that holds the cycle's last settlement, or any later block before the next trade of that security.
Continuous tradingOn the last trading day of the month in the venue calendar, after the close, once the day's trades are final.The last block of that trading day. DALP does not compute the last trading day; take it from the venue calendar.

The record block must be final. DALP returns an error for a block later than the newest final block, so the list cannot change after you send it. Leave the record block out to use the newest final block. The answer names the block it used.

Export from the Console

  1. Open the security and go to Historical balances.
  2. Enter the record block in As-of block, or leave it empty for the newest final block.
  3. In Issuer shareholder list, read the record block, the number of holders, the shares held and the total supply.
  4. Check that Adds up to total supply shows Yes.
  5. Select Download PDF, Download CSV or Download XLSX. The file is read at the record block shown above the buttons.

Export with the Platform API

Read the totals first:

curl "https://your-instance.example.com/api/v2/reporting/shareholder-lists/<tokenAddress>?atBlock=<recordBlock>" \
  -H "X-Api-Key: <your api key>"

data.reconciled is true when the holders' balances add up to data.totalSupply. data.recordBlock is the block the list is read at.

Then download the file at that same block. format is csv, xlsx or pdf:

curl "https://your-instance.example.com/api/v2/reporting/shareholder-lists/<tokenAddress>/download?atBlock=<recordBlock>&format=csv" \
  -H "X-Api-Key: <your api key>" \
  -o shareholder-list.csv

Pass atBlock on the download even when you left it out of the first request. The newest final block moves as the chain grows, and a fixed block keeps the file equal to the totals you checked.

What the file contains

The CSV and XLSX files have one row per wallet that holds the security after the record block, largest holding first. A wallet with a zero balance is left out. The PDF shows the same holders with the record block and its time, the totals and the reconciliation result.

The columns follow the shareholder response of Commission Implementing Regulation (EU) 2018/1212, Annex Table 2, and the register of members of the ADGM Companies Regulations 2020, section 118. They hold the fields the chain records.

ColumnContentTable 2 fieldSection 118 entry
securityThe security's contract address, in place of an ISIN.A.4Shares held, by class
symbolThe security's symbol.
recordDateThe date of the record block, as YYYYMMDD in UTC.A.5
recordBlockThe record block.
accountThe holder's wallet, the account the shares are held in.B.7
identityThe holder's registered OnchainID identity. Empty when the wallet has no registered identity.C.1Member
countryThe holder's registered country as an ISO 3166-1 alpha-2 code.C.6
sharesThe holder's balance in the security's own units.C.11Shares held
percentOfSupplyThe holder's share of total supply, cut to four decimal places and not rounded, so the column never adds up to more than 100.

The file does not hold names or postal addresses. The issuer matches each identity to the member's name and address in its own records.

Check the list before you send it

  • Adds up to total supply must be Yes, or reconciled must be true. A No means a holder is missing from the list. Do not send it; contact support with the security and the record block.
  • The number of holders should match the investors you expect after the auction or month.

Send the list

Send the CSV or XLSX file, and the PDF as the record of what was sent, through the channel agreed with the issuer. Keep the security address and the record block with the sent file, so that the same list can be produced again.

When DALP cannot produce the list

A refused list returns DALP-0753 with a reason in data.reason:

data.reasonWhat it meansWhat to do
feature-not-attachedThe security had no historical-balances feature at the record block, so there is no balance history to list.For a security created without the feature, none: DALP attaches the feature only when it creates a security, so issue new securities with it. For a security whose feature was detached, choose a record block from before the detachment.
enablement-after-record-blockThe feature was attached after the record block. data.boundaryBlock is the block it was attached at.Choose a record block at or after data.boundaryBlock.
history-incompleteThe security had supply before the feature was attached, so the balance history is incomplete. data.boundaryBlock is the block the feature was attached at.No record block can be listed.
record-block-not-finalThe record block is later than the newest final block, data.boundaryBlock.Wait until the block is final, or leave the record block out.

On this page