Hi,
Your plan for the subscription-based app seems solid. Here are a couple of suggestions based on your questions:
-
You can create a Ledger Canister to handle all approval and transfer operations. This way, your other canisters can verify transaction correctness and provide services based on the user principal interacting with your application.
-
To get a canister’s principal, you can use on rust
ic_cdk::id()
inside your canister logic, and for Motoko follow this post.