BandoFulfillmentManager
Last updated
Was this helpful?
Last updated
Was this helpful?
The BandoFulfillmentManager
is the central component of the EVM Fulfillment Protocol that manages the registration of fulfillment results and coordinates between fulfillable contracts and the service registry. It serves as the primary entry point for fulfillers to register the results of fulfillment operations and manages the withdrawal of funds for both native currency and ERC20 tokens.
The BandoFulfillmentManager
is responsible for:
Validating that only authorized fulfillers can register results for their services
Registering fulfillment results with the appropriate fulfillable contracts
Managing withdrawals of released funds to beneficiaries
Managing withdrawals of accumulated fees to fulfillers
In V1_2, managing DEX aggregator whitelisting and token swapping to stablecoins
The contract follows a versioned inheritance pattern:
BandoFulfillmentManagerV1
: Base functionality for fulfillment registration
BandoFulfillmentManagerV1_1
: Enhanced functionality and optimizations
BandoFulfillmentManagerV1_2
: Added support for stablecoin swapping via DEX aggregators
The BandoFulfillmentManager
responsibilities can be broken down into the following concepts:
The following methods are called by fulfillers to register the results of fulfillment operations:
registerFulfillment
Registers a fulfillment result for a native currency service. The function validates that the caller is the authorized fulfiller for the service and then registers the result with the native currency fulfillable contract.
Effects:
Validates the caller is the authorized fulfiller for the service
Calls IBandoFulfillable(_escrow).registerFulfillment(serviceID, result)
to register the result
Emits FulfillmentRegistered(serviceID, result)
event
Requirements:
Caller MUST be the authorized fulfiller for the service or the contract owner
registerERC20Fulfillment
Registers a fulfillment result for an ERC20 token service. The function validates that the caller is the authorized fulfiller for the service and then registers the result with the ERC20 token fulfillable contract.
Effects:
Validates the caller is the authorized fulfiller for the service
Calls IBandoERC20Fulfillable(_erc20_escrow).registerFulfillment(serviceID, result)
to register the result
Emits ERC20FulfillmentRegistered(serviceID, result)
event
Requirements:
Caller MUST be the authorized fulfiller for the service or the contract owner
The following methods are called by fulfillers to withdraw funds for their services:
beneficiaryWithdraw
Withdraws the beneficiary's available native currency balance to release (fulfilled with success). Only the fulfiller can withdraw the releaseable pool.
Effects:
Validates the caller is the authorized fulfiller for the service
Calls IBandoFulfillable(_escrow).beneficiaryWithdraw(serviceId)
to withdraw funds
Emits WithdrawnToBeneficiary(serviceId, service.beneficiary)
event
Requirements:
Caller MUST be the authorized fulfiller for the service
beneficiaryWithdrawERC20
Withdraws the beneficiary's available ERC20 token balance to release (fulfilled with success). Only the fulfiller can withdraw the releaseable pool.
Effects:
Validates the caller is the authorized fulfiller for the service
Calls IBandoERC20Fulfillable(_erc20_escrow).beneficiaryWithdraw(serviceId, token)
to withdraw tokens
Emits WithdrawnToBeneficiary(serviceId, service.beneficiary)
event
Requirements:
Caller MUST be the authorized fulfiller for the service
token
MUST be a valid token address
The following methods are available in V1_2 for swapping funds to stablecoins:
fulfillERC20AndSwap
Registers a fulfillment result and optionally swaps both releaseable pool and accumulated fees to stablecoins in a single transaction for ERC20 tokens. The swap is done using an off-chain generated DEX aggregator call.
Effects:
Validates the caller is the authorized fulfiller for the service
Validates the result status is SUCCESS
Validates the aggregator is whitelisted
Calls IBandoERC20Fulfillable(_erc20_escrow).registerFulfillment(serviceID, result)
to register the result
If swap
is true, calls IBandoERC20FulfillableV1_2(_erc20_escrow).swapPoolsToStable(serviceID, result.id, swapData)
to swap tokens
Calls _accumulateFulfillerReleaseablePoolAndFees(serviceID, swapData.toToken)
to accumulate funds
Emits ERC20FulfillmentRegistered(serviceID, result)
event
Requirements:
Caller MUST be the authorized fulfiller for the service or the contract owner
result.status
MUST be FulFillmentResultState.SUCCESS
swapData.callTo
MUST be a whitelisted aggregator
The following methods are available in V1_2 for managing DEX aggregators:
addAggregator
Adds a DEX aggregator address to the whitelist. Only the contract owner can add aggregators.
Effects:
Validates the aggregator address is not zero
Adds the aggregator to the whitelist
Emits AggregatorAdded(aggregator)
event
Requirements:
Caller MUST be the contract owner
aggregator
MUST NOT be the zero address
_escrow
: Address of the native currency fulfillable contract
_erc20_escrow
: Address of the ERC20 token fulfillable contract
_serviceRegistry
: Address of the service registry contract