# EPM-MB and staking-pallet integration ## Integration flow - Staking calls `elect(page)` and receives back a `Result<BoundedSupports>`, which contains a page of bounded supports from EPM-MB. - Staking transforms the supports into paged exposures by calling `Self::collect_exposures(supports)` - exposures: `BoundedVec<(AccountId, Exposure), MaxExposuresPerPage>` - `Exposure<AccountId, Balance> {total, own, others: Vec<IndividualExposure>}` The transformation from bounded supports to paged exposures may be problematic IF the supports of the same voter for a given target are spread across pages (since the `Exposure.others` vec would need a search, perhaps?). The new collect exposures would work as the following: ``` let bounded_supports = EPM::elect(page) for each support in bounded_supports get current metadata for the (validator, era) if it exists calculate how many voters are left to fill the last page extend/append the last page's `other` nominators until fill it up add (remaining) paginated individual exposures to the storage update exposures metadata in storage ``` (see current implementation of [`fn set_of_update_exposure`](https://github.com/paritytech/polkadot-sdk/pull/2504/files#diff-e88e18be93824b5e9d452a4a409a7d7982d3ae53508c7737d27269c200d0da0eR1231)) **API contact assumptions**: 1. ✅ For performance/fesibility reasons, pallet-staking should not iterate over the already processed `Exposures.others` vecs of all the paged exposures in storage. A tuple (`target, voter`) support needs to be atomic and the support of a given voter to a given target *must NOT* be spread across pages. 2. The supports with most stake will be included at the top pages and returned first by EPM-MB (to ensure that the election can run on partial pages and it has the highest stake possible). ## Paged bounded supports sorted by stake In order to maximize the