BondrailBond
The investors' vault and ERC-20 claim.
Monad testnet; not audited. These terms apply to the current implementation; see selected deployments.
Terms (fixed at creation)
| Field | Meaning |
|---|---|
raiseAmount | Capital raised; claims mint 1:1 |
repayCap | Most the bond can collect (≥ raise). Scales with released capital: repayCap × released ÷ raise. |
revenueBps | Base investor share of each payment while active (≤ 50%) |
firstReleaseBps | 25% or 50% released at activation |
minRevenue, minOperatingPeriod | The milestone for the second release |
fundingDeadline, secondReleaseNotBefore, secondReleaseDeadline, maturity | The schedule |
stake | Issuer stake, slashed to investors on default (required for Watched) |
milestoneMode | Onchain or Signed |
minFeeBps | Native fee floor while active (0 = none) |
triggerRevenue, triggerWindowDays, stepUpBps | Optional performance trigger: all zero disables, otherwise positive revenue floor over 1–30 days and a share above the base, at most 50% |
Performance trigger
Anyone can call checkTrigger() once per UTC day while Active and not defaulted. It sums the last
triggerWindowDays complete UTC buckets in the account's revenueByDay mapping, excluding today.
Every bucket must fall strictly after the activation UTC day; receipts before and after activation
on that day are excluded. The first eligible UTC day is activationDay + 1 + triggerWindowDays,
where activationDay = floor(activationTime / 86400). Below triggerRevenue selects stepUpBps;
equality or above restores the base share.
Payments use the last checked share until another check. Rounding carry and the cap are unchanged.
revenueBps() is the effective share; baseRevenueBps() and terms().revenueBps retain the base.
Issuer self-payments count. Padding revenue to avoid a trigger costs real money because investors receive their share, but is possible. This counter is not wash-adjusted; plain transfers count when swept. The current deployment includes this implementation. Historical immutable bonds do not gain the feature.
Lifecycle
- Funding:
deposituntil full before the deadline;withdrawtakes escrow back before that deadline; claims cannot transfer. A still-Funding bond can be cancelled after the deadline and holders callrefund. - Active: revenue repays; claims trade;
redeem(tokens, to)burns claims fortokens × pool ÷ supply, giving up future receipts. The last claim waits for Closed. - Closing → Closed: at the cap or maturity. Watched bonds keep a 120 s window for late evidence, then need
finalizeSettlement(). Partial redemption also works during Closing; the last claim waits for Closed. - Undrawn principal becomes investor recovery if the milestone deadline passes or the bond defaults.