Contracts and facilitator

Contract functions, events and errors from the SDK ABIs, plus the settlement service.

Monad testnet; not audited. These are current ABIs. Historical judged contracts are not upgraded by this documentation. Use the selected deployment.

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_) → address
  • createBond(address account, tuple terms_, tuple config, string name_, string symbol_) → address
  • deployNative(address account, bytes creationCode, bytes args, bytes32 salt) → address
  • releaseSecond(address bond)
  • releaseSecondSigned(address bond, tuple m, bytes signature)
  • setNativeApproval(address project, bool approved)
  • setNativeTemplate(bytes32 initCodeHash, bool approved)

Reads

  • accountImplementation() → address
  • bondImplementation() → address
  • bondsCreated(address account) → uint256
  • covenant() → address
  • depositAllowed(address bond) → bool
  • eip712Domain() → bytes1, string, string, uint256, address, bytes32, uint256[]
  • hashMilestone(tuple m) → bytes32
  • isAccount(address) → bool
  • isBond(address) → bool
  • MILESTONE_TYPEHASH() → bytes32
  • milestoneSigner() → address
  • minHistory() → uint256
  • nativeApproved(address) → bool
  • nativeTemplate(bytes32 initCodeHash) → bool
  • reviewer() → address
  • templateOf(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) → uint256
  • collectWithPermit(address payer, uint256 gross, uint256 fee, uint256 deadline, uint8 v, bytes32 r, bytes32 s) → uint256
  • initialize(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) → uint256
  • sweep()
  • withdraw(address to, uint256 amount)

Reads

  • activeBond() → address
  • asset() → address
  • collectedCount() → uint64
  • cumulativeRevenue() → uint256
  • cumulativeVolume() → uint256
  • factory() → address
  • firstRevenueAt() → uint64
  • isPayer(address payer) → bool
  • issuer() → address
  • issuerCredit() → uint256
  • lastRevenueAt() → uint64
  • paymentCount() → uint64
  • project() → address
  • revenueByDay(uint256 day) → uint256
  • splitRemainder() → uint256
  • uniquePayers() → 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) → bool
  • cancelFundingFromAccount()
  • 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) → uint256
  • refund(uint256 amount, address to)
  • releaseSecondFactoryOnly(bytes32 evidenceHash)
  • transfer(address to, uint256 value) → bool
  • transferFrom(address from, address to, uint256 value) → bool
  • withdraw(uint256 amount, address to)

Reads

  • account() → address
  • accountedBalance() → uint256
  • activationTime() → uint64
  • adapter() → uint8
  • allowance(address owner, address spender) → uint256
  • asset() → address
  • backingPerToken() → uint256
  • balanceOf(address account) → uint256
  • baseRevenueBps() → uint16
  • closeReason() → uint8
  • collectionClosedAt() → uint64
  • collectionClosedBlock() → uint256
  • covenant() → address
  • decimals() → uint8
  • defaultedAt() → uint64
  • defaultEvidenceHash() → bytes32
  • effectiveRevenueCap() → uint256
  • factory() → address
  • fundingEscrow() → uint256
  • issuer() → address
  • lastTriggerCheckDay() → uint64
  • maturity() → uint64
  • minFeeBps() → uint16
  • name() → string
  • phase() → uint8
  • policyHash() → bytes32
  • pool() → uint256
  • principalRecovery() → uint256
  • raiseRecipient() → address
  • releasedPrincipal() → uint256
  • releaseNonce() → uint256
  • remainingRevenueCap() → uint256
  • REPORT_GRACE() → uint64
  • revenueBps() → uint16
  • revenuePool() → uint256
  • revenueSnapshot() → uint256
  • settleAfter() → uint64
  • source() → address
  • stakeHeld() → uint256
  • stakeRecovery() → uint256
  • stakeReturnCredit() → uint256
  • symbol() → string
  • terms() → tuple
  • totalRedeemed() → uint256
  • totalRevenueCollected() → uint256
  • totalSupply() → uint256
  • triggered() → bool
  • undrawnPrincipal() → 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() → uint64
  • DARK_MAX_GAP() → uint64
  • DARK_WARN() → uint64
  • darkFor(address bond) → uint64
  • darkLast(address) → uint64
  • darkSince(address) → uint64
  • eip712Domain() → bytes1, string, string, uint256, address, bytes32, uint256[]
  • EPOCH_SECONDS() → uint64
  • factory() → address
  • forwarder() → address
  • hashObservation(tuple o) → bytes32
  • hasObservation(address) → bool
  • initializer() → address
  • inViolation(address bond) → bool
  • isHealthy(address bond) → bool
  • lastDecisiveAt(address) → uint64
  • latestEpoch(address) → uint64
  • MAX_AGE() → uint64
  • MAX_CLOCK_SKEW() → uint64
  • OBSERVATION_TYPEHASH() → bytes32
  • observationAt(address bond, uint64 epoch) → tuple
  • observationSigner() → address
  • policyHashes(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) → bool
  • checkpointIncome()
  • collect(address bond) → uint256
  • deposit(uint256 assets, address receiver) → uint256
  • mint(uint256 shares, address receiver) → uint256
  • proposeCurator(address next)
  • redeem(uint256 shares, address receiver, address owner) → uint256
  • transfer(address to, uint256 value) → bool
  • transferFrom(address from, address to, uint256 value) → bool
  • withdraw(uint256 assets, address receiver, address owner) → uint256
  • withdrawFromRaise(address bond, uint256 amount)

Reads

  • allowance(address owner, address spender) → uint256
  • asset() → address
  • balanceOf(address account) → uint256
  • convertToAssets(uint256 shares) → uint256
  • convertToShares(uint256 assets) → uint256
  • costBasis(address) → uint256
  • curator() → address
  • CURATOR_DELAY() → uint256
  • curatorChangeAfter() → uint256
  • decimals() → uint8
  • entryAssets() → uint256
  • factory() → address
  • holdingEntryValue(address bond) → uint256
  • holdingRealizedValue(address bond) → uint256
  • holdingRecovered(address bond) → uint256
  • holdings() → address[]
  • holdingValue(address bond) → uint256
  • idleAssets() → uint256
  • INCOME_VESTING_PERIOD() → uint256
  • incomeVestingStart() → uint256
  • lockedIncome() → uint256
  • MAX_BOND_BPS() → uint256
  • MAX_BONDS() → uint256
  • maxDeposit(address) → uint256
  • maxMint(address) → uint256
  • maxRedeem(address holder) → uint256
  • maxWithdraw(address holder) → uint256
  • MIN_IDLE_BPS() → uint256
  • name() → string
  • owner() → address
  • pendingCurator() → address
  • previewDeposit(uint256 assets) → uint256
  • previewMint(uint256 shares) → uint256
  • previewRedeem(uint256 shares) → uint256
  • previewWithdraw(uint256 assets) → uint256
  • symbol() → string
  • totalAssets() → uint256
  • totalSupply() → uint256
  • unvestedIncome() → uint256
  • WRITEDOWN_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() → bytes32
  • attestedProfile(address account) → tuple, address, bool
  • attester() → address
  • ATTESTER_DELAY() → uint256
  • attesterChangeAfter() → uint256
  • eip712Domain() → bytes1, string, string, uint256, address, bytes32, uint256[]
  • factory() → address
  • hashAttestation(tuple a) → bytes32
  • MAX_BONDS() → uint256
  • onchainProfile(address account) → tuple
  • owner() → address
  • pendingAttester() → address
  • recorded(address) → bool
  • recordedBonds(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.

EndpointPurpose
GET /supportedConfigured x402 scheme/network capabilities
POST /verifyValidate signed offer and simulate account settlement
POST /settleJournal and submit settlement; success requires a successful receipt
GET /healthGas 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.

On this page