MCPcopy Create free account
hub / github.com/cowprotocol/services / build_final_state_overrides

Function build_final_state_overrides

crates/simulator/src/encoding.rs:571–679  ·  view source on GitHub ↗

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,
)

Source from the content-addressed store, hash-verified

569/// basis. Returns the fully resolved state overrides and
570/// [`AccountOverrideRequest`]s that failed to resolve.
571async 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

Callers 1

Calls 6

apply_account_overrideFunction · 0.85
as_sliceMethod · 0.80
balance_overrideMethod · 0.80
approval_overrideMethod · 0.80
into_iterMethod · 0.45
cloneMethod · 0.45

Tested by

no test coverage detected