本文介绍HOH水分子社区Move共学营的task6学习笔记。1.使用脚手架快速创建SuidApp项目Sui生态为开发者提供了一个名为@mysten/create-dapp的脚手架工具,帮助我们快速初始化一个功能完善的dApp项目。以下是使用脚手架的简单步骤:1.1安装和创建项目运行以下
本文介绍HOH水分子社区Move共学营的task6学习笔记。
Sui生态为开发者提供了一个名为@mysten/create-dapp
的脚手架工具,帮助我们快速初始化一个功能完善的dApp项目。以下是使用脚手架的简单步骤:
运行以下命令启动脚手架工具:
npm create @mysten/dapp
脚手架会通过交互式提示,引导你完成新项目的创建。
项目创建过程中,你可以选择以下两种模板:
react-client-dapp
:一个简单的React模板,包含展示钱包内资产列表的示例功能。react-e2e-counter
:一个更复杂的端到端模板,结合了Move代码和简单的计数器UI。该脚手架基于Vite TypeScript项目,并预配置了以下功能:
完成项目创建后,进入项目目录并运行以下命令启动本地开发服务器:
cd your-dapp-project
npm install
npm run dev
随后,通过浏览器访问项目,即可开始你的dApp开发之旅。
创建项目后,你可以通过集成@mysten/dapp-kit
和navi-sdk
,实现复杂的链上交互功能。以下是具体步骤:
在项目根目录运行以下命令安装必要的库:
npm install @mysten/dapp-kit @mysten/sui @tanstack/react-query navi-sdk
在应用的入口文件(如App.js
或App.tsx
)中配置网络连接和Provider组件:
import { createNetworkConfig, SuiClientProvider, WalletProvider } from '@mysten/dapp-kit';
import { getFullnodeUrl } from '@mysten/sui/client';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
const { networkConfig } = createNetworkConfig({
localnet: { url: getFullnodeUrl('localnet') },
mainnet: { url: getFullnodeUrl('mainnet') },
});
const queryClient = new QueryClient();
function App() {
return (
<QueryClientProvider client={queryClient}>
<SuiClientProvider networks={networkConfig} defaultNetwork="localnet">
<WalletProvider>
<YourApp />
</WalletProvider>
</SuiClientProvider>
</QueryClientProvider>
);
}
export default App;
此配置确保应用能够连接到Sui网络,并提供了钱包和状态管理的支持。
以下逐步解析代码中的每个关键点,详细说明其作用和实现逻辑,并辅以具体代码段。
import { useCurrentAccount, useSignAndExecuteTransaction } from "@mysten/dapp-kit";
import { Transaction } from "@mysten/sui/transactions";
import { depositCoin, borrowCoin } from 'navi-sdk/dist/libs/PTB';
import { pool, wUSDC } from 'navi-sdk/dist/address';
useCurrentAccount
:获取当前连接的钱包账户信息。useSignAndExecuteTransaction
:提供一个签名并执行交易的函数。Transaction
:用于构造复杂的链上交易。depositCoin
和 borrowCoin
:Navi SDK 提供的功能,用于存款和借款操作。pool
和 wUSDC
:Navi协议中预设的资源池配置和资产信息。const NaviPage = () => {
const { mutate: signAndExecuteTransaction } = useSignAndExecuteTransaction();
const currentAccount = useCurrentAccount();
signAndExecuteTransaction
:通过useSignAndExecuteTransaction
钩子获取链上交易提交的函数。currentAccount
:使用useCurrentAccount
获取当前连接的钱包账户。如果未连接钱包,返回null
。if (!currentAccount) {
alert("请先连接钱包");
return;
}
确保用户已连接钱包,否则提示用户操作并终止后续逻辑。
const tx = new Transaction();
tx.setSender(currentAccount.address);
new Transaction()
:创建一个新的交易对象tx
。setSender
:指定交易发起方为当前钱包地址currentAccount.address
。const suiPoolConfig = pool['Sui'];
const splitCoin = tx.splitCoins(tx.gas, [1_000_000_000]);
await depositCoin(tx, suiPoolConfig, splitCoin, 1_000_000_000);
pool['Sui']
从Navi协议的资源池中获取针对Sui资产的配置。splitCoins
将Gas Coin拆分出1 SUI(1,000,000,000 MIST)。depositCoin
将分割出的1 SUI存入指定资源池。const currentDate = new Date();
const borrowAmount = parseFloat(`0.${currentDate.getMonth() + 1}${currentDate.getDate()}${currentDate.getHours()}`);
const loanPoolConfig = pool[wUSDC.symbol as keyof typeof pool];
const [borrowedUSDC] = await borrowCoin(tx, loanPoolConfig, borrowAmount * Math.pow(10, wUSDC.decimal));
pool[wUSDC.symbol]
获取USDC资产配置。borrowCoin
从USDC资源池中借款。await depositCoin(tx, loanPoolConfig, borrowedUSDC, borrowAmount * Math.pow(10, wUSDC.decimal));
将步骤6中借出的USDC按相同金额存回资源池。
await signAndExecuteTransaction({ transaction: tx });
alert("交易完成!");
签名并提交交易,完成整个流程。
return <button onClick={handleTransaction}>执行交易</button>;
定义一个按钮,当用户点击时,执行handleTransaction
函数。
import { useCurrentAccount, useSignAndExecuteTransaction } from "@mysten/dapp-kit";
import { Transaction } from "@mysten/sui/transactions";
import { depositCoin, borrowCoin } from 'navi-sdk/dist/libs/PTB';
import { pool, wUSDC } from 'navi-sdk/dist/address';
const NaviPage = () => {
const { mutate: signAndExecuteTransaction } = useSignAndExecuteTransaction();
const currentAccount = useCurrentAccount();
const handleTransaction = async () => {
if (!currentAccount) {
alert("请先连接钱包");
return;
}
const tx = new Transaction();
tx.setSender(currentAccount.address);
try {
// 1. 拆分Gas Coin并存款
const suiPoolConfig = pool['Sui'];
const splitCoin = tx.splitCoins(tx.gas, [1_000_000_000]);
await depositCoin(tx, suiPoolConfig, splitCoin, 1_000_000_000);
// 2. 动态计算借款金额并借出USDC
const currentDate = new Date();
const borrowAmount = parseFloat(`0.${currentDate.getMonth() + 1}${currentDate.getDate()}${currentDate.getHours()}`);
const loanPoolConfig = pool[wUSDC.symbol];
const [borrowedUSDC] = await borrowCoin(tx, loanPoolConfig, borrowAmount * Math.pow(10, wUSDC.decimal));
// 3. 存回借款
await depositCoin(tx, loanPoolConfig, borrowedUSDC, borrowAmount * Math.pow(10, wUSDC.decimal));
// 4. 提交交易
await signAndExecuteTransaction({ transaction: tx });
alert("交易完成!");
} catch (error) {
console.error("交易失败:", error);
alert("交易失败,请检查控制台日志。");
}
};
return <button onClick={handleTransaction}>执行交易</button>;
};
export default NaviPage;
通过这段代码,你可以实现以下链上操作:
利用 @mysten/create-dapp 快速创建项目,并结合 @mysten/dapp-kit 和 navi-sdk,你可以轻松打造功能强大的去中心化defi应用。
为什么推荐这套工具? • 简单高效:脚手架让你省去繁琐的配置环节。 • 功能丰富:支持钱包连接、网络切换、链上操作等多种功能。 • 高度灵活:适合初学者学习,也适合资深开发者进行复杂场景开发。
请用微信关注《HOH水分子》公众号,我们将持续分享和制作变成语言教程,让大家对编程产生化学反应。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!