First of all you can read about the accounts and wallets [here][1].

Second of all, as far as I know, the best method in both ether.js and web3.js to interact with a contract is by passing ABI and address of the contract.

As for the link you have provided, the multi-sig wallet method they are using, under hood, they should be fetching the ABI from the etherscan through their APIs.

> it's not a practical solution

Do remember, there is a reason we have standards in the ethereum. For all the tokens you have mentioned above, they have build following the same standard ERC20. So it is enough if you pass erc20 token generic ABI.

If you are still not convinced and do not want to pass the ABI every time, you can use the etherscan API to fetch ABI by passing the contract address before interacting with the contract or doing some transfer functions.

Here's the [link][2] for instructions.

Tell me if it helps!


  [1]: https://ethereum.org/en/developers/docs/accounts/
  [2]: https://docs.etherscan.io/api-endpoints/contracts#get-contract-abi-for-verified-contract-source-codes