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)

FieldMeaning
raiseAmountCapital raised; claims mint 1:1
repayCapMost the bond can collect (≥ raise). Scales with released capital: repayCap × released ÷ raise.
revenueBpsBase investor share of each payment while active (≤ 50%)
firstReleaseBps25% or 50% released at activation
minRevenue, minOperatingPeriodThe milestone for the second release
fundingDeadline, secondReleaseNotBefore, secondReleaseDeadline, maturityThe schedule
stakeIssuer stake, slashed to investors on default (required for Watched)
milestoneModeOnchain or Signed
minFeeBpsNative fee floor while active (0 = none)
triggerRevenue, triggerWindowDays, stepUpBpsOptional 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: deposit until full before the deadline; withdraw takes escrow back before that deadline; claims cannot transfer. A still-Funding bond can be cancelled after the deadline and holders call refund.
  • Active: revenue repays; claims trade; redeem(tokens, to) burns claims for tokens × 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.

On this page