{"content":{"title":"【MOVE】ts前端调用move合约function三步走","body":"![6825c43345b9445594f2a61d1ca2cdf.jpg](https://img.learnblockchain.cn/attachments/2025/01/mGcdZUJ56778b28dbd5e7.jpg)\r\n欢迎来到由[水分子社区（HOH）](https://mp.weixin.qq.com/s/ju9FrNFqPiwOOk0JmDtnkw)发起的Sui Move×前端共学营，在这里你可以学习到Move合约开发和Web3前端知识。\r\n\r\n不废话，直接上最干的干货。\r\n\r\n首先，默认你已经在ts或js环境中安装了所有关于[sui的sdk](https://sdk.mystenlabs.com/typescript)。\r\n\r\n我也假设你已经有了一个合约，里面有一个方法（function）。\r\n\r\n我写了一个非常简单的不是NFT的NFT，里面只有一个mint方法。\r\n```move\r\nmodule librarynft::librarynft {\r\n    use std::string::{String, utf8};\r\n    use sui::package;\r\n    use sui::display;\r\n    use sui::table::{Self, Table};\r\n    use sui::event;\r\n    use std::hash::sha3_256;\r\n    use std::bcs;\r\n    public struct LIBRARYNFT has drop {}\r\n\r\n    public struct LibraryNFT has key,store {\r\n        id:UID,\r\n        nft_id:vector<u8>,\r\n        name:String,\r\n        image:String,\r\n        description:String,\r\n        creator:address,\r\n    }\r\n\r\n    fun init(otw: LIBRARYNFT, ctx: &mut TxContext){\r\n        let publisher = package::claim(otw, ctx);\r\n        transfer::public_transfer(publisher, ctx.sender());\r\n    }\r\n\r\n    public entry fun mint(name:String,image:String,description:String,ctx: &mut TxContext){ //这个方法谁都可以调用，不用非得是发布者\r\n        let mut nft_id = sha3_256(bcs::to_bytes(&name));\r\n        let newnft = LibraryNFT{\r\n            id:object::new(ctx), // 创建含有key属性的object就用这个方法\r\n            nft_id:nft_id,\r\n            name:name,\r\n            image:image,\r\n            description:description,\r\n            creator:ctx.sender(),\r\n        };\r\n        transfer::public_transfer(newnft, ctx.sender()); // 创建一个object本身是没有所有者的，必须紧跟transfer语句来规定其所有者\r\n    }\r\n}\r\n// packageid: 0x9f78084ec9c0314248abf3c6d53747ad09a2648e371d531db535e6f7f007c624\r\n```\r\n\r\n我已将其发布在测试网，`packageid`为`0x9f78084ec9c0314248abf3c6d53747ad09a2648e371d531db535e6f7f007c624`\r\n\r\n现在，我想在前端调用mint函数。你只需要执行如下步骤：\r\n\r\n```ts\r\n            const tx = new Transaction();\r\n            // const account = useCurrentAccount();\r\n            // tx.setSender(account.address);\r\n            tx.moveCall({\r\n                target: \"0x9f78084ec9c0314248abf3c6d53747ad09a2648e371d531db535e6f7f007c624::librarynft::mint\",\r\n                arguments: [tx.pure.string(\"yanjiuyixia\"), tx.pure.string(\"https://pic.imgdb.cn/item/6756fd88d0e0a243d4e0b50d.webp\"), tx.pure.string(\"yanjiuyixia\")],\r\n            });\r\n            const result = await signAndExecuteTransaction({ transaction: tx, chain: \"sui:mainnet\" },\r\n                {\r\n                  onError: (error: any) => { // 为 error 参数指定类型\r\n                    console.error(\"Transaction failed:\", error);\r\n                  },\r\n                });\r\n            alert(result);\r\n            console.log(result);\r\n```\r\n第一步：构建交易`const tx = new Transaction();`\r\n\r\n第二步：调用合约` tx.moveCall`。target参数设置为packageid::模块名::函数名，arguments设置为函数的参数。\r\n\r\n第三步：执行`signAndExecuteTransaction`。\r\n\r\n整体框架就这三步。但这三部每一步的api所能接受参数的具体内容得翻阅文档。"},"author":{"user":"https://learnblockchain.cn/people/23923","address":"0xd2e9b8ffeaff95973d4649032c00c8aa759d333f"},"history":null,"timestamp":1735963517,"version":1}