Kaia Contracts Wizard

导言
Kaia 优先考虑提供无缝的开发人员体验,这也是创建 Kaia 合同向导(KCW)的驱动力。 KCW 是一种交互式工具,可让您毫不费力地启动智能合约,并利用 Kaia Contracts 中经过测试的安全组件。从本质上讲,它通过利用 Kaia 合约的组件简化了智能合约的开发过程。值得注意的是,Kaia 合约向导建立在 OpenZeppelin 向导的基础之上,进一步加强了智能合约开发的安全性。
在本指南中,您将
- 了解 Kaia 合同向导的基本功能。
- 使用 Kaia Contracts Wizard 生成和定制智能合约代码。
- 使用 Foundry 脚本系统将 Kaia 合同部署到 Kaia 网络 (Kairos)。
探索 Kaia 合同向导
Kaia Contracts Wizard 将自己定位为使用 Kaia Contracts 编写智能合约的最快、最简单的方法。在本节中,我们将深入了解 Kaia 合同向导的各个组件和部分。
目前,Kaia 合约向导支持以下令牌标准:
- KIP-7 - 这是 Kaia 的可替代令牌标准。可互换是指所有代币都可分割和互换,即具有相同的价值。可替代代币的一个典型例子 就是法定货币,每张等面值的钞票都具有相同的价值。
- KIP-17 - 这是 Kaia 的不可篡改令牌标准。不可窜改是指每个标记都是不可分割的,因此也是独一无二的。 KIP17 代币可以代表一个独特物品的所有权,无论是实物财产还是虚拟收藏品,如图片、游戏中的物品、不动产等。
- KIP-37 - 这被称为 Kaia 的多令牌标准,因为它可以在单个智能合约中同时表示可替换令牌和不可替换令牌。
与我们的 Ethereum Equivalence 支持一致,Kaia 合约向导也支持 ERC20、ERC721、ERC1155。
Kaia 合同向导由以下部分组成:
-
令牌标准部分:该选项卡包含 Kaia 合约向导支持的所有不同令牌标准。
-
设置部分:该部分提供每个代币标准的初步设置,如代币名称、符号、预铸币(合约部署时的代币供应)和 URI(针对不可兑换代币)。
-
功能部分:包括每个令牌标准的所有功能。您可以在以下链接中找到更多关于每种令牌可用的不同扩展名的信息:
-
访问控制部分:包括每个令牌标准的所有可用访问控制机制。
-
交互式代码显示部分:显示根据用户设置的配置生成的智能合约代码。

在了解了 Kaia 合约向导的各个部分后,您现在可以选择想要的合约类型(目前支持 KIP7、KIP17、KIP37、ERC20、ERC721、ERC1155、Governor 和自定义合约),设置参数和所需功能(令牌名称、符号、预铸币量、访问控制等),然后合约向导将生成所有必要的代码。因此,生成的代码可以随时进行编译和部署,也可以作为起点,通过特定的应用逻辑进行进一步定制。
在 Kaia 网络上定制和部署 Kaia 合约
在本节中,您将使用 Foundry 将 kaia 合约向导生成的代码部署到 Kaia Testnet Kairos。生成的代码将作为起点,并进一步定制,以适应 KIP7 和 KIP17 代币的空投合约。而在另一端,生成的 KIP37 代码将按原样使用。
让我们开始吧!
先决条件
要跟上本教程,先决条件如下:
- 确保安装了 foundry。
- 克隆 foundry-starterkit 的代码。
- MetaMask:用于部署合同、签署交易和与合同交互。
- RPC 端点:可从受支持的 端点提供程序 中获取。
- 从 水龙头测试 KAIA:为账户注入足够的 KAIA。
开始
本指南将指导您简单实现 KIP7 和 KIP17 令牌标准的空投合约。在空投合约中,项目的创建者会直接向特定的钱包铸造各自的代币。在接下来的章节中,我们将分别介绍如何定制和部署每种令牌空投合约。
定制令牌合约
将 KIP7 合同定制为 KIP7 空投合同。
在将 KIP7 合同修改为空投合同之前,您需要对其进行定制。为此,请按照以下步骤操作:
- 请访问 Kaia Toolkit 合约向导。
- 在合同选项卡上选择KIP7
- 下一步是在设置选项卡中填写名称(KIP7 代币空投)和符号(KTA)。铸币前区域为空
- 随后,在功能选项卡上,勾选可薄荷功能框,它就会自动选择访问控制选项卡上的可拥有功能。
进行这些配置后,Kaia 合同向导就会变成这样:

以下是生成的代码:
// SPDX-License-Identifier: MITpragma solidity ^0.8.4;import "@kaiachain/contracts/KIP/token/KIP7/KIP7.sol";import "@kaiachain/contracts/access/Ownable.sol";contract KIP7TokenAirdrop is KIP7, Ownable { constructor() KIP7("KIP7 Token Airdrop", "KTA") {} function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return super.supportsInterface(interfaceId); } function mint(address to, uint256 amount) public onlyOwner { _mint(to, amount); }}
接下来要做的就是修改上面的代码,以适应我们的空投执行,看起来就像这样:
//SPDX-License-Identifier: MITpragma solidity ^0.8.4;import "@kaiachain/contracts/KIP/token/KIP7/KIP7.sol";import "@kaiachain/contracts/access/Ownable.sol";contract KIP7TokenAirdrop is KIP7, Ownable { constructor() KIP7("KIP7 Token Airdrop", "KTA") { } // airdrop fungible token function airdropTokens(address[] calldata wAddresses, uint[] calldata tAmount) public onlyOwner { require(wAddresses.length == tAmount.length, "Must be same lenght"); for (uint256 i = 0; i < wAddresses.length; i++) { _mintSingleTokens(wAddresses[i], tAmount[i]); } } function _mintSingleTokens(address wAddress, uint amount) private { _mint(wAddress, amount); } function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return super.supportsInterface(interfaceId); }}
从上面修改的代码中可以看到,我们添加了一个名为 airdropTokens() 的新函数。该函数向某些选定的地址铸造代币,且只能由合约的创建者--"onlyOwner"--调用。
随后,我们将公共 mint() onlyOwner函数修改为_mintSingleTokens() 私有。
现在我们已经准备好 KIP7 空投合同代码,下一步是在项目目录的 src 文件夹中新建一个名为 airdropKIP7.sol 的文件,并将修改后的代码粘贴到该文件中。
将 KIP17 合同定制为 KIP17 空投合同。
在将 KIP17 合同修改为空投合同之前,您需要对其进行定制。为此,请按照以下步骤操作:
- 请访问 Kaia Toolkit 合约向导。
- 在合同选项卡上选择KIP17
- 下一步是在设置选项卡中填写名称(KIP7 NFT Airdrop)和符号(KNA)。基础 URI 字段应为空。
- 随后,在特性选项卡上,勾选可编辑、自动递增索引和可数特性框。您会发现访问控制选项卡中的 "可拥有 "功能已被自动选中。
进行这些配置后,Kaia 合同向导就会变成这样:

以下是生成的代码:
// SPDX-License-Identifier: MITpragma solidity ^0.8.4;import "@kaiachain/contracts/KIP/token/KIP17/KIP17.sol";import "@kaiachain/contracts/KIP/token/KIP17/extensions/KIP17Enumerable.sol";import "@kaiachain/contracts/access/Ownable.sol";import "@kaiachain/contracts/utils/Counters.sol";contract KIP17NFTAirdrop is KIP17, KIP17Enumerable, Ownable { using Counters for Counters.Counter; Counters.Counter private _tokenIdCounter; constructor() KIP17("KIP17 NFT Airdrop", "KNA") {} function safeMint(address to) public onlyOwner { uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); _safeMint(to, tokenId); } // The following functions are overrides required by Solidity. function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(KIP17, KIP17Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } function supportsInterface(bytes4 interfaceId) public view override(KIP17, KIP17Enumerable) returns (bool) { return super.supportsInterface(interfaceId); }}
接下来要做的就是修改 上面的代码,以适应我们的空投执行,看起来就像这样:
// SPDX-License-Identifier: MITpragma solidity ^0.8.4;import "@kaiachain/contracts/KIP/token/KIP17/KIP17.sol";import "@kaiachain/contracts/KIP/token/KIP17/extensions/KIP17Enumerable.sol";import "@kaiachain/contracts/access/Ownable.sol";import "@kaiachain/contracts/utils/Counters.sol";contract KIP17NftAirdrop is KIP17, KIP17Enumerable, Ownable { using Counters for Counters.Counter; Counters.Counter private _tokenIdCounter; constructor() KIP17("KIP17 NFT Airdrop", "KNA") {} // Airdrop NFTs function airdropNfts(address[] calldata wAddresses) public onlyOwner { require(wAddresses.length != 0, "Must no be equal to zero"); for (uint256 i = 0; i < wAddresses.length; i++) { _mintSingleNFT(wAddresses[i]); } } function _mintSingleNFT(address to) private { uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); _safeMint(to, tokenId); } // The following functions are overrides required by Solidity. function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(KIP17, KIP17Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } function supportsInterface(bytes4 interfaceId) public view override(KIP17, KIP17Enumerable) returns (bool) { return super.supportsInterface(interfaceId); }}
从上面修改的代码中可以看到,我们添加了一个名为 airdropNfts() 的新函数。该函数向某些选定的地址铸造代币,并且只能由合约的创建者(onlyOwner)调用。
随后,我们将 safeMint() public onlyOwner 函数修改为 _mintSingleTokens() private。
现在我们已经准备好 KIP17 空投合同代码,下一步是在项目目录的 src 文件夹中新建一个名为 airdropKIP17.sol 的文件,并将修改后的代码粘贴到该文件中。
定制 KIP37 合同。
由于 KIP37 支持批量铸币,我们将只对合同进行定制并按原样使用。要定制我们的 KIP37Contract,请按以下步骤操作:
- 转到 Kaia Toolkit 合约向导
- 在合同选项卡上选择KIP37
- 下一步是在设置选项卡中填写名称(KIP7 NFT Airdrop)和符号(KNA)。基础 URI 字段应为空。
- 随后,在特性选项卡上,勾选可编辑、自动递增索引和可数特性框。 您会发现访问控制选项卡中的 "可拥有 "功能已被自动选中。
进行这些配置后,Kaia 合同向导就会变成这样:

以下是生成的代码:
// SPDX-License-Identifier: MITpragma solidity ^0.8.4;import "@kaiachain/contracts/KIP/token/KIP37/KIP37.sol";import "@kaiachain/contracts/access/Ownable.sol";contract KIP37MultiToken is KIP37, Ownable { constructor() KIP37("") {} function setURI(string memory newuri) public onlyOwner { _setURI(newuri); } function mint(address account, uint256 id, uint256 amount, bytes memory data) public onlyOwner { _mint(account, id, amount, data); } function mintBatch(address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data) public onlyOwner { _mintBatch(to, ids, amounts, data); }}
现在我们已经准备好 KIP37 合约代码,下一步是在项目目录的 src 文件夹中新建一个名为 KIP37MultiToken.sol 的文件,并将生成的代码粘贴到其中。
为所有 Kaia 合同生成合同代码后,下一步就是使用 Foundry solidity 脚本部署到 Kaia 测试网 Kairos。
使用 Foundry 脚本部署生成的智能合约代码
在本节中,我们将使用 Foundry 部署生成的智能合约代码,特别是在链上部署的 Foundry 脚本。