SorobanClientService's TODO comment documents an assumed split_release function distinct from release: fn split_release(env, bounty_id: BytesN<32>, recipients: Vec<Address>, bps: Vec<u32>) -> i128. The real mergefi-escrow contract (MergeFi/contracts, contracts/escrow/src/lib.rs) has no split_release entrypoint at all — team-split payouts are handled by the same release() function used for single-recipient payouts, which always takes a recipients: Vec<(Address, u32)> (a vector of (address, basis_points) tuples, not two parallel Vec<Address>/Vec<u32> arrays as the backend's assumed signature has it); a single recipient at 10,000 bps is just the degenerate case of the same call.
EscrowController.splitRelease → EscrowService.splitRelease → soroban.invoke('split_release', ...) will call a method name that a real deployment of mergefi-escrow simply does not export, meaning every team-split bounty payout will fail simulation outright once dry-run mode is turned off. This also means EscrowService.release() and EscrowService.splitRelease() — two separate backend code paths today, with separately-recorded Payment logic in each — should likely converge into a single on-chain call once wired to the real contract, since the contract itself doesn't distinguish them.
SorobanClientService's TODO comment documents an assumedsplit_releasefunction distinct fromrelease:fn split_release(env, bounty_id: BytesN<32>, recipients: Vec<Address>, bps: Vec<u32>) -> i128. The realmergefi-escrowcontract (MergeFi/contracts,contracts/escrow/src/lib.rs) has nosplit_releaseentrypoint at all — team-split payouts are handled by the samerelease()function used for single-recipient payouts, which always takes arecipients: Vec<(Address, u32)>(a vector of(address, basis_points)tuples, not two parallelVec<Address>/Vec<u32>arrays as the backend's assumed signature has it); a single recipient at 10,000 bps is just the degenerate case of the same call.EscrowController.splitRelease→EscrowService.splitRelease→soroban.invoke('split_release', ...)will call a method name that a real deployment ofmergefi-escrowsimply does not export, meaning every team-split bounty payout will fail simulation outright once dry-run mode is turned off. This also meansEscrowService.release()andEscrowService.splitRelease()— two separate backend code paths today, with separately-recordedPaymentlogic in each — should likely converge into a single on-chain call once wired to the real contract, since the contract itself doesn't distinguish them.