6. Homework "Tamagotchi Shop"
In this assignment, the Tamagotchi will interact with two other contracts: tamagotchi-store and fungible-token.
Smart contract
0️⃣ Don't forget to sync your fork with the template repository upstream. Then copy all changes from 03-tamagotchi-nft folder that you made in the previous lesson to the 04-tamagotchi-shop folder and push them to the master branch. Create a new branch for your current homework. All new changes should be made in the 04-tamagotchi-shop folder.
1️⃣ Add ft-main-io and store-io crates to your Tamagotchi Cargo.toml as shown below:
# ...
[dependencies]
# ...
ft-main-io.workspace = true
store-io.workspace = true
# ...
2️⃣ Add fields to the Tamagotchi contract with the address of the fungible token, transaction ID for communication with the fungible token contract, and approving transaction details.
#[derive(Default, Encode, Decode, TypeInfo)]
pub struct Tamagotchi {
    // ... (copy fields from the previous lesson)
    pub ft_contract_id: ActorId,
    pub transaction_id: u64,
    pub approve_transaction: Option<(TransactionId, ActorId, u128)>,
}
3️⃣ Add the following actions:
- SetFTokenContractto set the fungible token address;
- ApproveTokensto approve the transfer of tokens to the store contract;
- BuyAttributeto buy attributes in the store.
#[derive(Encode, Decode, TypeInfo)]
pub enum TmgAction {
    // ... (copy variants from the previous lesson)
    SetFTokenContract(ActorId),
    ApproveTokens {
        account: ActorId,
        amount: u128,
    },
    BuyAttribute {
        store_id: ActorId,
        attribute_id: AttributeId,
    },
}
4️⃣ Add the following events:
- FTokenContractSetto notify that the fungible token address has been set;
- TokensApprovedto notify that the tokens have been approved;
- ApprovalErrorto notify that the tokens have not been approved;
- AttributeBoughtto notify that the attribute has been bought;
- CompletePrevPurchaseto notify that the previous purchase has been completed;
- ErrorDuringPurchaseto notify that an error occurred during the purchase.
#[derive(Encode, Decode, TypeInfo)]
pub enum TmgEvent {
    // ... (copy variants from the previous lesson)
    FTokenContractSet,
    TokensApproved { account: ActorId, amount: u128 },
    ApprovalError,
    AttributeBought(AttributeId),
    CompletePrevPurchase(AttributeId),
    ErrorDuringPurchase,
}
5️⃣ To approve tokens, you should send the LogicAction::Approve message to the fungible token:
use ft_main_io::{FTokenAction, FTokenEvent, LogicAction};
// ...
async fn approve_tokens(&mut self, account: &ActorId, amount: u128) {
    // ...
    msg::send_for_reply_as::<_, FTokenEvent>(
        self.ft_contract_id,
        FTokenAction::Message {
            transaction_id: self.transaction_id,
            payload: LogicAction::Approve {
                approved_account: account,
                amount,
            },
        },
        0,
        0,
    )
    .expect("Error in sending a message `FTokenAction::Message`")
    .await;
    // ...
}
6️⃣ While processing the BuyAttribute message, the Tamagotchi must send the following message to the shop contract:
StoreAction::BuyAttribute { attribute_id }
Frontend
Next, we'll deploy the fungible token and the store contract to the chain. Go to the upload folder.
The transactions.yaml file contains the transactions for uploading the contracts and filling the store contract with attributes.
- 
In this folder, run the following (Linux, macOS or Windows Subsystem for Linux): make init
 make runIn the console, you should see the addresses of the fungible token and store contracts. 
- 
Paste their addresses to your .envfile in thefrontenddirectory:VITE_NODE_ADDRESS=wss://testnet.vara.rs
 VITE_FT_ADDRESS=0x…
 VITE_STORE_ADDRESS=0x…
- 
Set the fungible token address to your Tamagotchi contract. 
- 
Run the application and choose Lesson 4. 
- 
Get the test fungible tokens:  
- 
Approve the store contract to transfer the tokens of your Tamagotchi. 
- 
Open the store. Buy attributes and see how your Tamagotchi is transforming.  
Please attach a link to the pull request (PR) in your repo with your Tamagotchi contract. Also, please paste your Tamagotchi program address as shown in the example below:
- PR: https://github.com/mynick/myname-gear-academy/pull/4
- Program address: 0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d