Resolves all [`AccountOverrideRequest`]s concurrently on a best-effort basis. Returns the fully resolved state overrides and [`AccountOverrideRequest`]s that failed to resolve.
(
requests: Vec<AccountOverrideRequest>,
state_overrides: &dyn StateOverriding,
authenticator: Address,
settlement_contract: Address,
)
| 569 | /// basis. Returns the fully resolved state overrides and |
| 570 | /// [`AccountOverrideRequest`]s that failed to resolve. |
| 571 | async fn build_final_state_overrides( |
| 572 | requests: Vec<AccountOverrideRequest>, |
| 573 | state_overrides: &dyn StateOverriding, |
| 574 | authenticator: Address, |
| 575 | settlement_contract: Address, |
| 576 | ) -> (StateOverride, Vec<AccountOverrideRequest>) { |
| 577 | let futures = requests.into_iter().map(|request| async move { |
| 578 | let state_override = match &request { |
| 579 | AccountOverrideRequest::SufficientEthBalance(addr) => Some(( |
| 580 | *addr, |
| 581 | AccountOverride::default().with_balance(U256::MAX / U256::from(2)), |
| 582 | )), |
| 583 | AccountOverrideRequest::AuthenticateAsSolver(addr) => { |
| 584 | // GPv2AllowListAuthentication stores `mapping(address => bool) solvers` |
| 585 | // at storage slot 1. Solidity mapping key: keccak256(address_padded ++ |
| 586 | // slot_padded). |
| 587 | // <https://github.com/cowprotocol/contracts/blob/main/src/contracts/GPv2AllowListAuthentication.sol#L22> |
| 588 | let mut buf = [0u8; 64]; |
| 589 | buf[12..32].copy_from_slice(addr.as_slice()); |
| 590 | buf[32..64].copy_from_slice(&U256::ONE.to_be_bytes::<32>()); |
| 591 | let slot = keccak256(buf); |
| 592 | Some(( |
| 593 | authenticator, |
| 594 | AccountOverride::default() |
| 595 | .with_state_diff(std::iter::once((slot, B256::with_last_byte(1)))), |
| 596 | )) |
| 597 | } |
| 598 | AccountOverrideRequest::Balance { |
| 599 | holder, |
| 600 | token, |
| 601 | amount, |
| 602 | } => { |
| 603 | state_overrides |
| 604 | .balance_override(BalanceOverrideRequest { |
| 605 | token: *token, |
| 606 | holder: *holder, |
| 607 | amount: *amount, |
| 608 | }) |
| 609 | .await |
| 610 | } |
| 611 | AccountOverrideRequest::Code { account, code } => Some(( |
| 612 | *account, |
| 613 | AccountOverride { |
| 614 | code: Some(code.clone()), |
| 615 | ..Default::default() |
| 616 | }, |
| 617 | )), |
| 618 | AccountOverrideRequest::PreSignature(order) => { |
| 619 | // GPv2Settlement stores the `mapping(bytes => uint256) public preSignature` at |
| 620 | // storage slot 0. |
| 621 | // Solidity mapping key: keccak256(order_uid_without_padding ++ slot_padded). |
| 622 | // <https://github.com/cowprotocol/contracts/blob/c6b61ce75841ce4c25ab126def9cc981c568e6c6/src/contracts/mixins/GPv2Signing.sol#L57> |
| 623 | let mut buf = [0u8; 56 + 32]; |
| 624 | buf[0..56].copy_from_slice(order.0.as_slice()); |
| 625 | // no need to copy anything for storage slot 0 since the array gets 0 |
| 626 | // initialized. |
| 627 | let slot = keccak256(buf); |
| 628 |
no test coverage detected