Demo Video: https://youtu.be/Erja2sIpR6U
Online: https://scaffold.rootmud.xyz
Github: https://github.com/NonceGeek/scaffold-move
Homepage: https://home.scaffold.rootmud.xyz
💡 感谢 Fynn 助力这个版本的 Scaffold Move ฅ^•ﻌ•^ฅ!
💡What is Scaffold-Move?
A modern, clean version of Scaffold-Move with NextJS, Supabase & Deno, strong-AI-powered in the future.
基于 NextJS、Supabase 和 Deno 技术栈的 Scaffold-Move 的现代、干净版本,未来将由强大的人工智能驱动。
灵感来自于Scaffold-ETH
,它是 Ethereum 生态中的「经典公共物品类项目」。Scaffold-ETH
主页:
https://scaffoldeth.io/
Scaffold 对于任何生态来说都是非常必要的基础型项目,因为 Scaffold 可以降低 dApp 开发者 90% 以上的工作量。然而,Move 生态中的 Scaffold 类项目还在非常早期的阶段。
此外,现有的 Scaffold 项目存在如下的升级空间:
NonceGeekDAO 致力于开发多种类型的脚手架,为 Buidlers 提供极速⚡搭建 dApp 的方式:
+-------------------+
| Scaffold-Move 🪜 |
+-------------------+
+-------------------+
|Scaffold-GPT-Bot 🏗️|
+-------------------+
+-------------------+
| Scaffold-AO 🔨 |
+-------------------+
+-------------------+
| Scaffold-ETH 🛠️ |
+-------------------+
我们通过 Aptos CLI
和 Movement 网络进行交互。
💡关于
Aptos CLI
的更多用法见文章:
安装 Aptos CLI。
见:
https://aptos.dev/cli-tools/aptos-cli-tool/install-aptos-cli
一般而言,推荐直接使用预编译工具( precompiled binary )的方式,这样会省去编译中可能遇到的错误。
通过如下方式初始化一个在 porto
测试网上的账户:
$ aptos init --network custom --rest-url https://aptos.testnet.porto.movementlabs.xyz/v1 --profile movement_acct_1
在主网上线后,只要把 --rest-url
替换为主网节点地址即可。
$ aptos init --network custom --rest-url https://aptos.testnet.porto.movementlabs.xyz/v1 --profile movement_acct_1
Configuring for profile movement_acct_1
Configuring for network Custom
Using command line argument for rest URL https://aptos.testnet.porto.movementlabs.xyz/v1
Enter your faucet endpoint [Current: None | No input: Skip (or keep the existing one if present) | 'skip' to not use a faucet]
No faucet url given, skipping faucet...
Enter your private key as a hex literal (0x...) [Current: None | No input: Generate new key (or keep one if present)]
No key given, generating key...
Account 0x6e7c05076c385337c5ea2dc522c7f147bb6ad7f60c16d68f6777bde658d12126 has been initialized locally, but you must transfer coins to it to create the account onchain
---
Aptos CLI is now set up for account 0x6e7c05076c385337c5ea2dc522c7f147bb6ad7f60c16d68f6777bde658d12126 as profile movement_acct_1! Run `aptos --help` for more information about commands
{
"Result": "Success"
}
在初始化的时候会让我们输入 faucet endpoint
地址领取测试币,我们填空即可。随后通过如下页面领取测试币:
https://faucet.movementnetwork.xyz/?network=testnet
$ # 下载源码并进入目录
$ git clone https://github.com/NonceGeek/scaffold-move.git
$ cd scaffold-move
编译合约以生成二进制代码,编译通过后可进行部署。
$ aptos move compile --package-dir ./contracts/hero --named-addresses hero=movement_acct_1
$aptos move compile --package-dir ./contracts/hero --named-addresses hero=movement_acct_1
...
{
"Result": [
"6e7c05076c385337c5ea2dc522c7f147bb6ad7f60c16d68f6777bde658d12126::hero"
]
}
部署:
$ aptos move publish --package-dir ./contracts/hero --named-addresses hero=movement_acct_1 --profile movement_acct_1
$ aptos move publish --package-dir ./contracts/hero --named-addresses hero=movement_acct_1 --profile movement_acct_1
Compiling, may take a little while to download git dependencies...
...
package size 7437 bytes
Do you want to submit a transaction for a range of [545200 - 817800] Octas at a gas unit price of 100 Octas? [yes/no] >
yes
{
"Result": {
"transaction_hash": "0x41b176ca7f823bfc57a842202135f458dfa19a0f74f14f9d3852c86d9fcc4c7f",
"gas_used": 5452,
"gas_unit_price": 100,
"sender": "6e7c05076c385337c5ea2dc522c7f147bb6ad7f60c16d68f6777bde658d12126",
"sequence_number": 0,
"success": true,
"timestamp_us": 1735302126711277,
"version": 204080358,
"vm_status": "Executed successfully"
}
}
在部署后可以在浏览器上查看到结果:
https://explorer.movementlabs.xyz/account/0x6e7c05076c385337c5ea2dc522c7f147bb6ad7f60c16d68f6777bde658d12126/modules/code/hero?network=testnet
# install
$ yarn
# modify the configuration
$ vim .env.local
# start with dev mode
$ yarn dev
# buidl
$ yarn build
$ yarn vercel --prod # 推荐部署到 vercel 托管平台上
修改 .env.local
中的 NEXT_PUBLIC_DAPP_ADDRESS
为你部署的合约的地址。
托管到 Vercel:
目前支持了 Nightly
、Petra
与OKX
三种主流钱包👛。
签名成功提示:
签名 + 验签成功提示:
以 view balance
为例:
源代码:
const getBalance = useCallback(async () => {
if (!adapter || !aptos) return;
const account = await adapter.account();
const balance = await doGetBalance(aptos, account.address.toString());
toast({
title: "balance",
description: balance!.toString(),
});
}, [aptos, account]);
async function doGetBalance(aptos: Aptos, accountAddress: string) {
const [balance] = await aptos.view({
payload: {
function: "0x1::coin::balance",
typeArguments: ["0x1::aptos_coin::AptosCoin"],
functionArguments: [accountAddress],
},
});
return balance;
}
...
<button
onClick={getBalance}
className="px-4 py-2 bg-blue-500 text-white rounded-md hover:bg-blue-600 transition-colors"
// disabled={!connected || !adapter || !aptos}
>
View Example: Get Balance
</button>
以调用 transfer
函数为例:
源代码:
const handleTransaction = useCallback(async () => {
// Docs: https://docs.nightly.app/docs/aptos/solana/connect
// console.log("info", account, adapter, aptos);
if (!account?.address) return;
const network = await adapter?.network();
if (network?.chainId !== 177) {
try {
await adapter?.changeNetwork({ name: Network.TESTNET, chainId: 177 });
} catch (error) {
console.error("Failed to change network:", error);
}
}
const aptosConfig = new AptosConfig({
network: network?.name || Network.TESTNET,
});
const aptosClient = new Aptos(aptosConfig);
const transaction: InputGenerateTransactionPayloadData = {
function: "0x1::coin::transfer",
typeArguments: ["0x1::aptos_coin::AptosCoin"],
functionArguments: [
"0x960dbc655b847cad38b6dd056913086e5e0475abc27152b81570fd302cb10c38",
100,
],
};
const userResponse = await signAndSubmitTransaction({
payload: transaction,
});
if (userResponse.status !== UserResponseStatus.APPROVED) {
throw new Error(userResponse.status);
}
// Confirm withdraw in backend
const hash = (userResponse as unknown as { args: { hash: string } }).args
.hash;
try {
await aptosClient.waitForTransaction({ transactionHash: hash });
} catch (error) {
console.error(error);
}
toast({
title: userResponse.status,
description: "This transaction has been " + userResponse.status,
});
}, [account]);
...
<button
onClick={handleTransaction}
className="px-4 py-2 bg-blue-500 text-white rounded-md hover:bg-blue-600 transition-colors"
// disabled={!connected || !adapter || !aptos}
>
Send Transaction Example: Transfer
</button>
通过链上协议,进行 开发者贡献 的智能结算与智能分配,鼓励通过开源协作的形式完善 Scaffold 案例,本质上相当于实现 Scaffold-Move-DAO
。
通过自治(Autonomous)的向量数据库,实现资料库从互联网与开发者社区多个渠道自扩充,在此基础上加入 LLM 支持,进一步降低开发者的心力负担与时间成本。
+--------------------+ +---- From Internet
| VectorDB | Data Growth |
| about |<-------------+---- From Dev Community
| Contract/dApp Code | |
+--------------------+ +---- ...
↓ Feed
+--------------------+ +----------------+
| LLM |----->| Scaffold-Move |---+--- Generate Contract Code
+--------------------+ +----------------+ |
+--- Generate dApp Code
【免责声明】市场有风险,投资需谨慎。本文不构成投资建议,用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。