Avoid using `AddressOrAlias` in morley-client's public API
Clarification and motivation
The AddressOrAlias
type is meant to be used to parse CLI options where the user could provide an address of an implicit account/contract or, for their convenience, an alias if an alias exists.
The only meaningful thing you can do with an AddressOrAlias
is:
- call
resolveAddressMaybe
/resolveAddress
to fetch the corresponding address. - call
getAlias
to fetch the corresponding alias.
However, this type is used across multiple other functions, e.g. originateContracts
. Under the hood, they always end up using resolveAddressMaybe
.
I would argue this is not a good API design because it leads to situations like this, where resolveAddressMaybe
is needlessly called many times, even though only 1 call would suffice.
f :: ImplicitAddressOrAlias -> MorleyClientM ()
f senderAddrOrALias = do
originateContracts senderAddrOrALias ops1
originateContracts senderAddrOrALias ops2
In order to do the "right thing", the user would have to consciously write something cumbersome like:
f :: ImplicitAddressOrAlias -> MorleyClientM ()
f senderAddrOrALias = do
addr <- resolveAddress addrOrAlias
let alreadyResolvedSenderAddrorAlias = AddressResolved addr
originateContracts alreadyResolvedSenderAddrorAlias ops1
originateContracts alreadyResolvedSenderAddrorAlias ops2
Good APIs make it easy to do the "right thing" and hard to do the "wrong thing", so I think all morley-client functions (beside resolveAddressMaybe
and getAlias
) should take either an address or an alias, not AddressOrAlias
.
It should be up to the user to resolve an AddressOrAlias
as soon as it's parsed from the CLI.
Another problem with the current design is that it often forces us to re-wrap address/aliases in AddressOrAlias
just to make the pieces fit.
For example, runTransactions
(correctly) takes an ImplicitAddress
, and then immediately wraps it so that it can be passed to runOperations
(even though this really shouldn't be needed).
Acceptance criteria
- All morley-client functions (beside
resolveAddressMaybe
andgetAlias
) take either an address or an alias, notAddressOrAlias
.