> For the complete documentation index, see [llms.txt](https://docs.selcier.xyz/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.selcier.xyz/markets-and-capital/primary-raises.md).

# Raising primary capital

A walk through primary offerings in the OfferingVault, covering setup, escrowed subscriptions, minting at close, pro-rata allocation when demand exceeds the cap, and refunds.

Companies bring in fresh capital on Selcier through primary offerings, each of which runs inside that company's `OfferingVault`. Stablecoin from investors sits in escrow during the subscription period. A successful close happens in one transaction: the company receives the funds and investors receive newly minted shares. Should the minimum be missed, each investor can recover the entire deposit.

Escrowed funds have only two possible destinations: the company treasury after a successful close, or the investor who put them there. Nobody can direct them elsewhere, and that includes the company and Selcier.

## Terms of an offering

These terms are entered in [Console](/the-platform/issuer-console.md) or sent to `POST /v1/offerings` at creation, and they cannot change after the offering opens.

| Term                   | Meaning                                                                                                      |
| ---------------------- | ------------------------------------------------------------------------------------------------------------ |
| `shareToken`           | Token of the class on sale                                                                                   |
| `pricePerShare`        | What one share costs, denominated in the chosen stablecoin                                                   |
| `minRaise`             | Total needed for success                                                                                     |
| `maxRaise`             | Upper limit on what is accepted. Demand beyond it is allocated pro-rata                                      |
| `minTicket`            | Lowest subscription allowed per investor                                                                     |
| `opensAt` / `closesAt` | When investors can subscribe                                                                                 |
| `stablecoin`           | Asset used for settlement, with USDG as the default                                                          |
| `requiredClaims`       | Gate for participation, expressed as claim topics like `IDENTITY_VERIFIED`, `INVESTOR_ELIGIBLE` and `REGION` |
| `treasury`             | Destination of the proceeds, belonging to the company                                                        |
| `documentId`           | Reference to the entry in `DisclosureRegistry` that holds this offering's document                           |

A subscription is also tested against the share class's [transfer rules](/fundamentals/compliance-modules.md), exactly as though the shares were moving to that investor. If the rules would stop someone receiving shares, they cannot subscribe, which means an offering never mints into a blocked wallet.

## States an offering moves through

| State       | What it means                                                                                                                |
| ----------- | ---------------------------------------------------------------------------------------------------------------------------- |
| `SCHEDULED` | Exists and awaits `opensAt`, with terms and documents already visible.                                                       |
| `OPEN`      | Taking subscriptions.                                                                                                        |
| `CLOSED`    | Met `minRaise` or better, so shares are minted and funds released.                                                           |
| `FAILED`    | Fell short of `minRaise` by `closesAt`, or the company called `cancelOffering` ahead of close. All deposits can be refunded. |

After `closesAt` an offering continues to report `OPEN` until settlement, though subscriptions are no longer taken. The transition to `CLOSED` or `FAILED` happens through `close()`, called after `closesAt`. Selcier's operator triggers it automatically, though the call is open to anyone. Once `maxRaise` has been reached, the company has the option of closing early.

## How to subscribe

Start by giving the vault a stablecoin allowance. The call that follows is `subscribe(offeringId, amount)`. Portfolio folds this into one step and sponsors the gas. Four conditions are checked in order:

1. the state of the offering is `OPEN`
2. the investor's combined subscription meets `minTicket`
3. each claim in `requiredClaims` is held by the investor's identity and is unexpired
4. `canTransfer` would allow the resulting shares to reach the investor

When all four hold, the stablecoin enters escrow and `Subscribed` is emitted. Repeat subscriptions are allowed, and they accumulate. A cap of 500 distinct subscribers (`MAX_SUBSCRIBERS`) ensures close fits in a single transaction.

## What happens at close

Close starts by measuring total subscriptions against `minRaise` and `maxRaise`.

**The minimum was met.** With totals at `minRaise` or above, the vault works through these steps:

1. work out the allocation for each investor
2. repeat the rule check for everyone, since eligibility may have changed. Anyone who now fails (an expired claim, for instance) receives no shares, and their entire subscription turns refundable
3. mint to each investor still eligible, emitting `SharesIssued` with the offering id as `ref`
4. record whatever was not allocated as refundable to its investor
5. pay proceeds to `treasury`, net of the platform fee
6. record a `PRICED_ROUND` Reference Valuation equal to `pricePerShare` in the class's `ValuationOracle`
7. report the outcome through `OfferingClosed(offeringId, raised, sharesIssued)`. The `raised` figure there counts only what was accepted

For each investor, the minted shares create a separate lot. A `HoldingPeriodModule` on the class starts counting for that lot at close.

**The minimum was missed.** With totals under `minRaise`, the vault emits `OfferingFailed`, deposits become fully refundable, and no fee applies.

## Scaling back oversubscribed demand

When subscriptions go past `maxRaise`, one fraction applies to all investors:

```
fill ratio  = maxRaise / totalSubscribed
allocation  = subscription × fill ratio
shares      = allocation / pricePerShare
refund      = subscription - allocation
```

Take a `maxRaise` of 5,000,000 USDG against 6,250,000 USDG of subscriptions, which gives a fill ratio of 0.8. At 20 USDG per share, a 100,000 USDG subscription turns into an 80,000 USDG allocation, or 4,000 shares, leaving 20,000 USDG to reclaim.

Charges cover only the whole raw token units an investor actually receives, and rounding remainders go back into the refund. Because allocation is strictly pro-rata, timing plays no part, and subscribing in the opening minutes brings no benefit.

## Getting money back

A refundable balance waits in the vault until its investor calls `refund(offeringId)`. That call pays out the full amount and emits `Refunded`. Portfolio reminds investors to claim and sponsors the gas. There is no expiry on refunds.

## Event reference

| Event                                              | Trigger                                                      |
| -------------------------------------------------- | ------------------------------------------------------------ |
| `OfferingCreated(offeringId)`                      | An offering is set up by the company                         |
| `Subscribed(offeringId, investor, amount)`         | Escrow takes in stablecoin after every check has passed      |
| `OfferingClosed(offeringId, raised, sharesIssued)` | Close completes with the minimum met and shares minted       |
| `OfferingFailed(offeringId)`                       | Cancellation, or the minimum goes unmet                      |
| `Refunded(offeringId, investor, amount)`           | Stablecoin owed to someone leaves the vault at their request |
| `SharesIssued(to, amount, ref)`                    | The share token mints to an investor during close            |

Matching webhooks are `offering.subscribed`, `offering.closed` and `offering.failed`, covered in [Event delivery](/build-on-selcier/event-delivery.md).

{% hint style="info" %}
Issuers can follow [Launch a raise](/walkthroughs/launch-a-raise.md) for a full walkthrough, and investors can use [Subscribe to a raise](/walkthroughs/subscribe-to-a-raise.md).
{% endhint %}


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.selcier.xyz/markets-and-capital/primary-raises.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
