Contracts and facilitator
Contract functions, events and errors from the SDK ABIs, plus the settlement service.
Source: contracts/src. Amounts use the
contract asset's base units unless a function specifies shares, seconds or basis points. Tables come
from @bondrail/sdk/abis. Solidity consumers can import @bondrail/contracts.
BondrailFactory
Writes
activate(address bond)createAccount(address asset_) → addresscreateBond(address account, tuple terms_, tuple config, string name_, string symbol_) → addressdeployNative(address account, bytes creationCode, bytes args, bytes32 salt) → addressreleaseSecond(address bond)releaseSecondSigned(address bond, tuple m, bytes signature)setNativeApproval(address project, bool approved)setNativeTemplate(bytes32 initCodeHash, bool approved)
Reads
accountImplementation() → addressbondImplementation() → addressbondsCreated(address account) → uint256covenant() → addressdepositAllowed(address bond) → booleip712Domain() → bytes1, string, string, uint256, address, bytes32, uint256[]hashMilestone(tuple m) → bytes32isAccount(address) → boolisBond(address) → boolMILESTONE_TYPEHASH() → bytes32milestoneSigner() → addressminHistory() → uint256nativeApproved(address) → boolnativeTemplate(bytes32 initCodeHash) → boolreviewer() → addresstemplateOf(address project) → bytes32
Events
AccountCreated(address issuer, address account, address asset)BondCreated(address issuer, address account, address bond, uint8 adapter, bytes32 policyHash, bytes32 termsHash)EIP712DomainChanged()NativeApproval(address project, bool approved)NativeDeployed(address account, address project, bytes32 initCodeHash)NativeTemplate(bytes32 initCodeHash, bool approved)SecondReleaseApproved(address bond, uint8 mode, uint256 eligibleRevenue)
Errors
ECDSAInvalidSignature()ECDSAInvalidSignatureLength(uint256 length)ECDSAInvalidSignatureS(bytes32 s)FailedDeployment()InsufficientBalance(uint256 balance, uint256 needed)InsufficientHistory()InvalidAdapter()InvalidMilestone()InvalidShortString()InvalidTerms()ReentrancyGuardReentrantCall()SafeERC20FailedOperation(address token)StringTooLong(string str)Unauthorized()Unhealthy()UnsupportedAsset()
BondrailAccount
Writes
attach(address bond)bindProject(address project_)bindProjectFromFactory(address project_)cancelFunding(address expectedBond)closeBondAtMaturity(address expectedBond)collect(address payer, uint256 gross, uint256 fee) → uint256collectWithPermit(address payer, uint256 gross, uint256 fee, uint256 deadline, uint8 v, bytes32 r, bytes32 s) → uint256initialize(address asset_, address issuer_)settle(address from, uint256 value, uint256 validAfter, uint256 validBefore, bytes32 nonce, uint8 v, bytes32 r, bytes32 s)settleBeforeActivation(address expectedBond)settleOut(address payer, uint256 gross, uint256 fee) → uint256sweep()withdraw(address to, uint256 amount)
Reads
activeBond() → addressasset() → addresscollectedCount() → uint64cumulativeRevenue() → uint256cumulativeVolume() → uint256factory() → addressfirstRevenueAt() → uint64isPayer(address payer) → boolissuer() → addressissuerCredit() → uint256lastRevenueAt() → uint64paymentCount() → uint64project() → addressrevenueByDay(uint256 day) → uint256splitRemainder() → uint256uniquePayers() → uint64
Events
Attached(address bond)Collected(address payer, uint256 gross, uint256 fee, bool outgoing)Detached(address bond)ProjectBound(address project)Revenue(address bond, address payer, uint256 amount, uint256 toBond, uint256 toIssuer, bool collected)Settled(address payer, uint256 value, bytes32 nonce)Withdrawal(address to, uint256 amount)
Errors
FeeBelowFloor()InvalidAmount()InvalidState()ReentrancyGuardReentrantCall()SafeERC20FailedOperation(address token)Unauthorized()WrongBond()
BondrailBond
Writes
activateFactoryOnly(uint256 accountRevenueAtActivation)approve(address spender, uint256 value) → boolcancelFundingFromAccount()checkTrigger()claimStake(address to, uint256 amount)deposit(uint256 amount)expireUndrawn()finalizeCollection(uint8 reason)finalizeSettlement()initialize(address asset_, address issuer_, address account_, address covenant_, address recipient_, tuple terms_, tuple config, string name_, string symbol_)markDefault(bytes32 evidenceHash)onRepayment(uint256 amount)redeem(uint256 tokens, address to) → uint256refund(uint256 amount, address to)releaseSecondFactoryOnly(bytes32 evidenceHash)transfer(address to, uint256 value) → booltransferFrom(address from, address to, uint256 value) → boolwithdraw(uint256 amount, address to)
Reads
account() → addressaccountedBalance() → uint256activationTime() → uint64adapter() → uint8allowance(address owner, address spender) → uint256asset() → addressbackingPerToken() → uint256balanceOf(address account) → uint256baseRevenueBps() → uint16closeReason() → uint8collectionClosedAt() → uint64collectionClosedBlock() → uint256covenant() → addressdecimals() → uint8defaultedAt() → uint64defaultEvidenceHash() → bytes32effectiveRevenueCap() → uint256factory() → addressfundingEscrow() → uint256issuer() → addresslastTriggerCheckDay() → uint64maturity() → uint64minFeeBps() → uint16name() → stringphase() → uint8policyHash() → bytes32pool() → uint256principalRecovery() → uint256raiseRecipient() → addressreleasedPrincipal() → uint256releaseNonce() → uint256remainingRevenueCap() → uint256REPORT_GRACE() → uint64revenueBps() → uint16revenuePool() → uint256revenueSnapshot() → uint256settleAfter() → uint64source() → addressstakeHeld() → uint256stakeRecovery() → uint256stakeReturnCredit() → uint256symbol() → stringterms() → tupletotalRedeemed() → uint256totalRevenueCollected() → uint256totalSupply() → uint256triggered() → boolundrawnPrincipal() → uint256
Events
Activated(address issuer, uint256 released, uint256 undrawn, uint256 effectiveCap)Approval(address owner, address spender, uint256 value)CollectionClosed(uint8 reason, uint64 closedAt, uint64 settleAfter, uint256 pool)DefaultRecorded(bytes32 evidenceHash, uint256 stakeRecovered)Deposited(address payer, uint256 amount, uint256 funded)FundingCancelled(uint256 refundable, uint256 issuerStakeCredit)PrincipalReleased(uint256 amount, uint256 releasedTotal, uint256 effectiveCap, bytes32 evidenceHash)Redeemed(address holder, address receiver, uint256 tokens, uint256 amount)Refunded(address holder, address receiver, uint256 amount)RevenueReceived(uint256 amount, uint256 totalRevenue, uint256 pool)SettlementFinalized(uint256 pool, uint256 supply, uint256 issuerStakeCredit)StakeClaimed(address receiver, uint256 amount)Transfer(address from, address to, uint256 value)TriggerChanged(bool triggered)TriggerChecked(uint256 windowRevenue, bool triggered)UndrawnRecovered(uint256 amount, uint256 recoveryTotal)Withdrawn(address holder, address receiver, uint256 amount, uint256 funded)
Errors
AlreadyCheckedToday()ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed)ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed)ERC20InvalidApprover(address approver)ERC20InvalidReceiver(address receiver)ERC20InvalidSender(address sender)ERC20InvalidSpender(address spender)InvalidAmount()InvalidState()LastHolderWaitsForClose()ReentrancyGuardReentrantCall()SafeERC20FailedOperation(address token)TooEarly()TransferLocked()Unauthorized()Unhealthy()
BondrailCovenant
Writes
initializeFactory(address factory_)onReport(bytes, bytes report)registerBond(address bond, bytes32 policyHash)
Reads
DARK_DEFAULT() → uint64DARK_MAX_GAP() → uint64DARK_WARN() → uint64darkFor(address bond) → uint64darkLast(address) → uint64darkSince(address) → uint64eip712Domain() → bytes1, string, string, uint256, address, bytes32, uint256[]EPOCH_SECONDS() → uint64factory() → addressforwarder() → addresshashObservation(tuple o) → bytes32hasObservation(address) → boolinitializer() → addressinViolation(address bond) → boolisHealthy(address bond) → boollastDecisiveAt(address) → uint64latestEpoch(address) → uint64MAX_AGE() → uint64MAX_CLOCK_SKEW() → uint64OBSERVATION_TYPEHASH() → bytes32observationAt(address bond, uint64 epoch) → tupleobservationSigner() → addresspolicyHashes(address) → bytes32
Events
CovenantDefault(address bond, uint64 firstEpoch, uint64 secondEpoch, bytes32 evidenceHash)DarkDefault(address bond, uint64 darkSince, uint64 darkLast, bytes32 evidenceHash)EIP712DomainChanged()FactoryInitialized(address factory)ObservationAccepted(address bond, uint64 epoch, uint8 result, uint64 observedAt, bytes32 evidenceHash, bytes32 digest)WatchRegistered(address bond, bytes32 policyHash)
Errors
AlreadyInitialized()DuplicateEpoch()ECDSAInvalidSignature()ECDSAInvalidSignatureLength(uint256 length)ECDSAInvalidSignatureS(bytes32 s)InvalidObservation()InvalidShortString()ReentrancyGuardReentrantCall()StringTooLong(string str)Unauthorized()
BondrailEarner
Reads
bondrailAccount() → address
Errors
BondrailAccountRequired()
BondrailVault
totalAssets reports exit NAV. Use previewDeposit / previewMint for entries, and check
maxWithdraw / maxRedeem for idle liquidity. See credit vault.
Writes
acceptCurator()allocate(address bond, uint256 amount)approve(address spender, uint256 value) → boolcheckpointIncome()collect(address bond) → uint256deposit(uint256 assets, address receiver) → uint256mint(uint256 shares, address receiver) → uint256proposeCurator(address next)redeem(uint256 shares, address receiver, address owner) → uint256transfer(address to, uint256 value) → booltransferFrom(address from, address to, uint256 value) → boolwithdraw(uint256 assets, address receiver, address owner) → uint256withdrawFromRaise(address bond, uint256 amount)
Reads
allowance(address owner, address spender) → uint256asset() → addressbalanceOf(address account) → uint256convertToAssets(uint256 shares) → uint256convertToShares(uint256 assets) → uint256costBasis(address) → uint256curator() → addressCURATOR_DELAY() → uint256curatorChangeAfter() → uint256decimals() → uint8entryAssets() → uint256factory() → addressholdingEntryValue(address bond) → uint256holdingRealizedValue(address bond) → uint256holdingRecovered(address bond) → uint256holdings() → address[]holdingValue(address bond) → uint256idleAssets() → uint256INCOME_VESTING_PERIOD() → uint256incomeVestingStart() → uint256lockedIncome() → uint256MAX_BOND_BPS() → uint256MAX_BONDS() → uint256maxDeposit(address) → uint256maxMint(address) → uint256maxRedeem(address holder) → uint256maxWithdraw(address holder) → uint256MIN_IDLE_BPS() → uint256name() → stringowner() → addresspendingCurator() → addresspreviewDeposit(uint256 assets) → uint256previewMint(uint256 shares) → uint256previewRedeem(uint256 shares) → uint256previewWithdraw(uint256 assets) → uint256symbol() → stringtotalAssets() → uint256totalSupply() → uint256unvestedIncome() → uint256WRITEDOWN_PERIOD() → uint256
Events
Allocated(address bond, uint256 assets)Approval(address owner, address spender, uint256 value)Collected(address bond, uint256 claims, uint256 assets)CuratorChanged(address previousCurator, address curator)CuratorProposed(address curator, uint256 executableAt)Deposit(address sender, address owner, uint256 assets, uint256 shares)IncomeCheckpointed(uint256 newIncome, uint256 lockedIncome)RaiseWithdrawn(address bond, uint256 assets)Transfer(address from, address to, uint256 value)Withdraw(address sender, address receiver, address owner, uint256 assets, uint256 shares)
Errors
BondLimit()ConcentrationLimit()ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed)ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed)ERC20InvalidApprover(address approver)ERC20InvalidReceiver(address receiver)ERC20InvalidSender(address sender)ERC20InvalidSpender(address spender)ERC4626ExceededMaxDeposit(address receiver, uint256 assets, uint256 max)ERC4626ExceededMaxMint(address receiver, uint256 shares, uint256 max)ERC4626ExceededMaxRedeem(address owner, uint256 shares, uint256 max)ERC4626ExceededMaxWithdraw(address owner, uint256 assets, uint256 max)IdleBuffer()InvalidAmount()InvalidBond()InvalidConfiguration()InvalidState()ReentrancyGuardReentrantCall()SafeERC20FailedOperation(address token)TooEarly()Unauthorized()Unhealthy()WrongAsset()
BondrailCreditRegistry
onchainProfile and attestedProfile have separate trust assumptions. Always check coverage and
current signer/expiry. See credit profiles.
Writes
acceptAttester()attest(tuple a, bytes signature)proposeAttester(address next)recordBond(address bond)
Reads
ATTESTATION_TYPEHASH() → bytes32attestedProfile(address account) → tuple, address, boolattester() → addressATTESTER_DELAY() → uint256attesterChangeAfter() → uint256eip712Domain() → bytes1, string, string, uint256, address, bytes32, uint256[]factory() → addresshashAttestation(tuple a) → bytes32MAX_BONDS() → uint256onchainProfile(address account) → tupleowner() → addresspendingAttester() → addressrecorded(address) → boolrecordedBonds(address account) → address[]usedNonces(address, uint256) → bool
Events
Attested(address account, address signer, uint256 chainId, uint64 periodStart, uint64 periodEnd, uint256 attributedRevenue, uint256 excludedRevenue, uint256 distinctPayers, uint16 topPayerShareBps, uint256 creditLine, bytes32 evidenceHash, uint64 issuedAt, uint64 expiresAt, uint256 nonce)AttesterChanged(address previousAttester, address attester)AttesterProposed(address attester, uint256 executableAt)BondRecorded(address account, address bond)EIP712DomainChanged()
Errors
AlreadyRecorded()BondLimit()ECDSAInvalidSignature()ECDSAInvalidSignatureLength(uint256 length)ECDSAInvalidSignatureS(bytes32 s)InvalidAccount()InvalidAttestation()InvalidBond()InvalidConfiguration()InvalidShortString()InvalidState()NonceUsed()StaleAttestation()StringTooLong(string str)TooEarly()Unauthorized()
Facilitator (HTTP service)
The facilitator submits BondrailAccount.settle; it is not a separate Solidity contract. Its gas-wallet
address comes from roles.facilitator in the selected manifest on the deployment page.
| Endpoint | Purpose |
|---|---|
GET /supported | Configured x402 scheme/network capabilities |
POST /verify | Validate signed offer and simulate account settlement |
POST /settle | Journal and submit settlement; success requires a successful receipt |
GET /health | Gas balance/budget, pending nonce and recovery state in the current service code |
POST bodies contain {x402Version: 2, paymentPayload, paymentRequirements}. See the
x402 guide for funding, retries and reconciliation, and the
service source.