I guess I have to make use of the utility.batch call but I am not sure how to pass the different anonymous proxy TXs in the batch call.
I am also not sure of the use of the variable index in the anonymous
call. Maybe it is there to distinguish the different anonymous proxy transactions?
1 Answer
The reason for the index
in the anonymous
call in pallet-proxy
is exactly for the purposes of disambiguating multiple anonymous proxies in a single transaction.
It's because of the way that the proxies module deterministically generates account IDs for proxies: https://github.com/paritytech/substrate/blob/f98ef8abfc54bb7801b21be899e63f5058350e14/frame/proxy/src/lib.rs#L648-L664
pub fn anonymous_account(
who: &T::AccountId,
proxy_type: &T::ProxyType,
index: u16,
maybe_when: Option<(T::BlockNumber, u32)>,
) -> T::AccountId {
let (height, ext_index) = maybe_when.unwrap_or_else(|| {
(
system::Pallet::<T>::block_number(),
system::Pallet::<T>::extrinsic_index().unwrap_or_default(),
)
});
let entropy = (b"modlpy/proxy____", who, height, ext_index, proxy_type, index)
.using_encoded(blake2_256);
Decode::decode(&mut TrailingZeroInput::new(entropy.as_ref()))
.expect("infinite length input; no invalid inputs for type; qed")
}
As you can see, it takes the block height and current extrinsic index within the block as inputs. If this isn't within a batch call, then there's no need for disambiguation. However, if multiple calls to anonymous_account
occur within the same extrinsic, they need a disambiguating input to the account ID generation function.
pub fn anonymous(
origin: OriginFor<T>,
proxy_type: T::ProxyType,
delay: T::BlockNumber,
index: u16,
) -> DispatchResult {
let who = ensure_signed(origin)?;
let anonymous = Self::anonymous_account(&who, &proxy_type, index, None);
// .. remainder omitted
}
This is why fn anonymous
accepts an index the user can use to avoid collisions in a batch.