pub fn decode(token: Token) -> anyhow::Result<Self> {
        let tokens = token.into_tuple().context("not a tuple")?;
        anyhow::ensure!(tokens.len() == 7);
        let mut t = tokens.into_iter();
        let mut next = || t.next().unwrap();

        let force_deployments_array = next().into_array().context("force_deployments_array")?;
        let mut force_deployments = vec![];
        for token in force_deployments_array {
            force_deployments.push(ForceDeployment::decode(token)?);
        }

        Ok(Self {
            force_deployments,
            l2_gateway_upgrade_position: next()
                .into_uint()
                .context("l2_gateway_upgrade_position")?
                .as_usize(),
            fixed_force_deployments_data: next()
                .into_bytes()
                .context("fixed_force_deployments_data")?,
            ctm_deployer: next().into_address().context("ctm_deployer")?,
            old_validator_timelock: next().into_address().context("old_validator_timelock")?,
            new_validator_timelock: next().into_address().context("new_validator_timelock")?,
            wrapped_base_token_store: next().into_address().context("wrapped_base_token_store")?,
        })
    }
Decodes `GatewayUpgradeEncodedInput` from a RLP token.
Returns an error if token doesn't match the `schema()`.
core/lib/types/src/abi.rs