Account abstraction patterns for reducing user friction across smart contract wallets and dapps