Proxy voting for tokenized securities
What is proxy voting for tokenized securities?
Proxy voting for tokenized securities is how holders of tokenized shares or fund units vote at a meeting, or choose an option in a corporate action election, with each holder’s votes set by what they held at the record date; it’s also called tokenized shareholder voting.
Transfer agents and tokenization platforms run the holder side of it, because the proxy agent can only send ballots and count votes against a list of who held what on that date.
Goldsky turns the record date into a block and backfills every transfer up to it into your database, while building the holder list, sharing it and the tally stay with you and your proxy agent.
You can build the voting list two ways: backfill transfers up to the record block into your own database with a one-time Turbo Pipelines job, or query a subgraph register at the record block over GraphQL.
Who runs proxy voting for tokenized securities?
Transfer agents, tokenization platforms and fund administrators that keep tokenized registers and work with a proxy agent.
How the record date sets who can vote
The diagram follows one meeting or election, from the record date the issuer sets to the votes your proxy agent tallies, and shows who does each step. Your setup may differ.
Ways to build the voting list for tokenized securities
With the backfill, transfers land in your database and your team sums them into the list for your proxy agent; the subgraph keeps positions current and returns them for any block from a hosted endpoint.
- Best for
- Occasional votes, with the list kept in your database
- What you run
- The destination: your database, queue or bucket, or a Postgres database Goldsky hosts
- What you write
- Pipeline YAML and SQL; TypeScript transforms when needed
- Where your data lives
- In your own database or systems
- How results reach you
- Pushed to you
- Best for
- One chain, with a register you query for any date
- What you run
- Nothing; Goldsky runs indexing, storage and the API
- What you write
- A schema and mapping handlers, or a no-code or low-code config for simple contracts
- Where your data lives
- Hosted by Goldsky
- How results reach you
- You query; changes are pushed
| Usual setupOption 1: Record-date backfill | Option 2: Subgraph register | |
|---|---|---|
| Best for | Occasional votes, with the list kept in your database | One chain, with a register you query for any date |
| Products | TurboFeeds | SubgraphsFeeds |
| What you run | The destination: your database, queue or bucket, or a Postgres database Goldsky hosts | Nothing; Goldsky runs indexing, storage and the API |
| What you write | Pipeline YAML and SQL; TypeScript transforms when needed | A schema and mapping handlers, or a no-code or low-code config for simple contracts |
| Where your data lives | In your own database or systems | Hosted by Goldsky |
| How results reach you | Pushed to you | You query; changes are pushed |
Set the record date
Only holders on the record date can vote, so the date decides who gets a ballot.
The issuer sets the meeting or election and its record date, and your team confirms the date with the proxy agent. If the date you snapshot differs from the one the proxy agent uses, ballots go to the wrong people.
Find the record block
Handled by Goldsky FeedsThe record date is a clock time, but a chain keeps balances by block, so the time has to become a block number.
Decide which moment counts, such as the close of business in the time zone the terms use, then take the last block at or before it on the chain where the token lives. A block from just after the cutoff puts late buyers on the list.
The Feeds blocks endpoint returns the newest block at or before a time when you call it with
Turn a timestamp into a block (opens in a new tab)timestamp_lte,sort=number_descandlimit=1.Backfill transfers to the record block
Handled by Goldsky TurboPositions on the record date have to be rebuilt from every transfer up to it.
Every mint, burn and transfer of the token from its first block to the record block has to land in your database, with nothing after the cutoff. A gap in early history understates some holders’ votes.
With Goldsky, you can run a Turbo Pipelines pipeline with
Run a pipeline as a one-time job (opens in a new tab)job: trueand ablock_numberlimit in its source filter, so it backfills the token’s transfers up to the record block into your database and then exits.Build the holder list
The proxy agent needs one line per holder with the position that sets their votes.
Sum each wallet’s transfers into a position, drop empty wallets, link each wallet to its holder from your register, and share the list with your proxy agent. A wallet you can’t link to a verified holder needs a decision before ballots go out.
Collect and tally votes
The vote is decided by counting each holder’s choices against the position that sets their votes.
Your proxy agent sends ballots, collects votes or elections and counts them against the holder list. Any correction to the list after ballots go out has to reach the agent before the tally closes.
What to know about backfilling voters to the record block
- The job runs once per record date and exits, so nothing keeps running between meetings.
- Summing transfers into positions at the record block is a query your team runs in your database once the backfill has finished.
- The list sits in your database, so your access rules decide who sees it.
- Getting the list to the proxy agent is your code, over whatever channel you agree with them.
Set the record date
Only holders on the record date can vote, so the date decides who gets a ballot.
The issuer sets the meeting or election and its record date, and your team confirms the date with the proxy agent. If the date you snapshot differs from the one the proxy agent uses, ballots go to the wrong people.
Find the record block
Handled by Goldsky FeedsThe record date is a clock time, but a chain keeps balances by block, so the time has to become a block number.
Decide which moment counts, such as the close of business in the time zone the terms use, then take the last block at or before it on the chain where the token lives. A block from just after the cutoff puts late buyers on the list.
The Feeds blocks endpoint returns the newest block at or before a time when you call it with
Turn a timestamp into a block (opens in a new tab)timestamp_lte,sort=number_descandlimit=1.Read every holder at the record block
Handled by Goldsky SubgraphsHoldings change all the time, so you need each holder’s balance as it stood at the record block, not today.
The register has to return balances for a past block as well as the latest one. A register that only keeps current balances can’t say who held what on the record date once anyone has traded since.
With Goldsky Subgraphs as the holder register, the task reads each holder’s balance at the record block over GraphQL, the same way the tokenized equities guide has its dividend task read the registry at a record-date block.
Build a tokenized equities registry (opens in a new tab)Serve the list to your proxy agent
Handled by Goldsky SubgraphsThe proxy agent counts votes against the list, so it needs the list from a source both sides trust.
Link each wallet to its holder from your register and give the agent the list, or access to it. Anyone who can query the list can see who holds what, so access has to be limited to the people running the vote.
Subgraphs serves the register at a GraphQL endpoint. Turn on the private endpoint so each request needs an API token in the
Set up public and private endpoints (opens in a new tab)Authorizationheader.Collect and tally votes
The vote is decided by counting each holder’s choices against the position that sets their votes.
Your proxy agent sends ballots, collects votes or elections and counts them against the holder list. Any correction to the list after ballots go out has to reach the agent before the tally closes.
What to know about reading voters from a subgraph
- The register stays indexed, so a list for a new record date needs a query, not a backfill.
- Your mappings keep each position, so the list comes back already summed.
- The endpoint can require an API token, which keeps the holder list from being public.
- A subgraph indexes one chain; a token on several chains needs one subgraph each and a merge in your code.
What you control
- Your team
- Set the record date
- Build the holder list
- Your providers
- Proxy voting agent
Questions and answers
What are corporate action elections?
Corporate action elections are the choices holders make in an optional corporate action, such as taking a dividend in cash or in shares, or tendering shares into an offer. Each holder’s election applies to the position they held at the record date, and the agent running the action counts elections against the holder list. For tokenized securities, that list comes from the token’s balances at the record block.
Security and deployment
- SOC 2 Type IIIndependently audited security controls.
- Dedicated infrastructureSingle-tenant options for production workloads.
- Data residencyCloud, on-premises or co-located.
More use cases that run corporate actions
- Tokenized money market fund dividends paid as new tokensSnapshot holders and mint each one’s yield as new fund tokens.
- Dividends and splits on tokenized stocksApply dividends and splits to tokenized-stock holders as of the record date.
- Tokenized bond coupon paymentsPay bond coupons to holders at the record date.
- Tokenized loan participation paymentsPay out loan-participation shares between banks in tokenized deposits.
Run proxy voting for tokenized securities with Goldsky
We’ll map it to your systems and show you what Goldsky runs, so your team builds the product, not the pipelines underneath it.