6. 课后作业 “Tamagotchi 商店”
在这个任务中,Tamagotchi 与两个其他合约进行交互: tamagotchi-store
和 fungible-token
。
智能合约
0️⃣ 不要忘记与上游的模板存储库 同步你的分支 。然后将在前一课程中所做的 03-tamagotchi-nft
文件夹中的所有更改复制到 04-tamagotchi-shop
文件夹并将它们推送到 master
分支。为当前的作业创建一个新分支。所有新的更改应在04-tamagotchi-shop
文件夹中完成。
1️⃣ 在你的 Tamagotchi 的 Cargo.toml
中添加 ft-main-io
和 store-io
包,如下所示:
# ...
[dependencies]
# ...
ft-main-io.workspace = true
store-io.workspace = true
# ...
2️⃣ 为 Tamagotchi 合约添加字段,包括同质化代币的地址、与同质化代币合约通信的交易 ID 以及批准交易的详细信息。
#[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️⃣ 添加以下操作:
SetFTokenContract
以设置同质化代币地址;ApproveTokens
以批准将代币转移给商店合约;BuyAttribute
以购买商店中的属性。
#[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️⃣ 添加以下事件:
FTokenContractSet
以通知同质化代币地址已设置;TokensApproved
以通知代币已获得批准;ApprovalError
以通知代币未获得批准;AttributeBought
以通知已购买属性;CompletePrevPurchase
以通知上一个购买已完成;ErrorDuringPurchase
以通知购买期间发生错误。
#[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️⃣ 要批准代币,你应该向同质化代币发送 LogicAction::Approve
消息:
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️⃣ 在处理 BuyAttribute
消息时,Tamagotchi 必须向商店合约发送以下消息:
StoreAction::BuyAttribute { attribute_id }
前端
接下来,我们将在链上部署同质化代币和商店合约。前往 upload
文件夹。
transactions.yaml
文件包含了上传合约和填充商店合约属性的交易。
-
在此文件夹中运行以下命令(对于 Linux、macOS 或 Windows 子系统 for Linux):
make init
make run在控制台中,你可以看到同质化代币和商店合约的地址。
-
将它们的地址粘贴到位于
frontend
目录中的.env
文件中:VITE_NODE_ADDRESS=wss://testnet.vara.rs
VITE_FT_ADDRESS=0x…
VITE_STORE_ADDRESS=0x… -
将同质化代币的地址设置到你的 Tamagotchi 合约中。
-
运行应用程序并选择 Lesson 4。
-
获取测试用的同质化代币:
-
批准商店合约以转移你的 Tamagotchi 的代币。
-
打开商店。购买属性并查看你的 Tamagotchi 如何变化。
请附上包含 Tamagotchi 合约的存储库中的 PR 链接。此外,请粘贴你的 Tamagotchi 程序地址,如下例所示:
- PR: https://github.com/mynick/myname-gear-academy/pull/4
- 程序地址:
0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d