Kaia Contracts Wizard
소개
카이아는 원활한 개발자 경험을 제공하는 것을 우선시하며, 이것이 바로 Kaia Contracts Wizard(KCW)를 만든 원동력입니다. KCW serves as an interactive tool for effortlessly bootstrapping your smart contracts and utilizing the secure, tested components available in Kaia Contracts. 즉, 카이아 컨트랙트의 구성요소를 활용하여 스마트 컨트랙트를 개발하는 과정을 간소화합니다. Kaia Contracts Wizard는 OpenZeppelin 마법사의 기반 위에 구축되어 스마트 컨트랙트 개발의 보안을 더욱 강화한다는 점에 주목할 필요가 있습니다.
이 가이드에서는 다음과 같이 설명합니다:
- Kaia Contracts Wizard의 기본 기능을 이해합니다.
- Kaia Contracts Wizard를 사용하여 스마트 컨트랙트 코드 생성 및 커스터마이징하기.
- Foundry 스크립팅 시스템을 사용하여 카이아 컨트랙트를 카이아 네트워크(Kairos)에 배포합니다.
Kaia Contracts Wizard 살펴보기
Kaia Contracts Wizard는 카이아 컨트랙트를 사용하여 스마트 컨트랙트를 작성하는 가장 빠르고 쉬운 방법이라고 자부합니다. 이번 섹션에서는 Kaia Contracts Wizard의 다양한 구성 요소와 세그먼트에 대해 자세히 살펴보겠습니다.
현재 Kaia Contracts Wizard는 다음과 같은 토큰 표준을 지원합니다:
- KIP-7 — This is a fungible token standard for Kaia. 대체 가능이란 모든 토큰이 분할 및 교환이 가능하며, 즉 동일한 가치를 갖는다는 것을 의미합니다. 대체 가능한 토큰의 대표적인 예로는 동일한 액면가의 지폐가 동일한 가치를 갖는 법정화폐를 들 수 있습니다.
- KIP-17 — This is a non-fungible token standard for Kaia. 대체 불가능하다는 것은 각 토큰이 분할할 수 없으므로 고유하다는 것을 의미합니다. KIP17 토큰은 그림, 게임 아이템, 부동산 등 물리적 자산이든 가상의 수집품이든 고유한 아이템의 소유권을 나타낼 수 있습니다.
- KIP-37 — This is known as the multi-token standard for Kaia, because it can represent both fungible and non-fungible tokens in a single smart contract.
이더리움 컨트랙트 마법사는 이더리움 동등성 지원과 함께 ERC20, ERC721, ERC1155도 지원합니다.
Kaia Contracts Wizard는 다음 섹션으로 구성되어 있습니다:
-
토큰 표준 섹션: 이 탭은 Kaia Contracts Wizard가 지원하는 모든 토큰 표준으로 구성되어 있습니다.
-
설정 섹션: 이 섹션에서는 토큰 이름, 심볼, 프리 민트(컨트랙트 배포 시 토큰 공급), URI(대체 불가능한 토큰의 경우) 등 각 토큰 표준에 대한 예비 설정을 제공합니다.
-
기능 섹션: 각 토큰 표준에서 사용할 수 있는 모든 기능으로 구성됩니다. 각 토큰에서 사용할 수 있는 다양한 확장 기능에 대한 자세한 정보는 다음 링크에서 확인할 수 있습니다:
-
접근 제어 섹션: 각 토큰 표준에 대해 사용 가능한 모든 접근 제어 메커니즘으로 구성됩니다.
-
대화형 코드 표시 섹션: 사용자가 설정한 구성으로 생성된 스마트 컨트랙트 코드를 표시합니다.
Kaia Contracts Wizard의 여러 부분을 살펴봤다면 이제 원하는 컨트랙트 종류(현재 KIP7, KIP17, KIP37, ERC20, ERC721, ERC1155, 거버너 및 사용자 정의 컨트랙트 지원)를 선택하고 파라미터와 원하 는 기능(토큰 이름, 심볼, 사전 발행량, 접근 제어 등)을 설정하면 컨트랙트 마법사가 필요한 모든 코드를 생성해줍니다. 생성된 코드는 컴파일 및 배포할 준비가 된 상태이며, 시작점으로 사용하거나 애플리케이션별 로직으로 추가 사용자 지정할 수 있습니다.
카이아 네트워크에서 카이아 컨트랙트 커스터마이징 및 배포하기
In this section, you will deploy the generated code from kaia contracts wizard to the Kaia Testnet Kairos using Foundry. 생성된 코드는 시작점으로 사용되며, KIP7 및 KIP17 토큰의 에어드랍 컨트랙트에 맞게 추가로 커스터마이징할 수 있습니다. 다른 쪽에서는 KIP37에 대해 생성된 코드가 그대로 사용됩니다.
시작해보겠습니다!
전제 조건
이 튜토리얼을 따라하기 위한 사전 요구 사항은 아래에 강조 표시되어 있습니다:
- Foundry가 설치되어 있는지 확인합니다.
- klaytn-foundry-starterkit 코드를 복제합니다.
- MetaMask: used to deploy the contracts, sign transactions and interact with the contracts.
- RPC Endpoint: you can get this from one of the supported endpoint providers.
- Test KAIA from Faucet: fund your account with sufficient KAIA.
시작하기
이 가이드는 KIP7 및 KIP17 토큰 표준에 대한 에어드랍 컨트랙트를 간단하게 구현하는 방법을 안내합니다. 에어드랍 콘트랙트에서 프로젝트 생성자는 각각의 토큰을 특정 지갑에 직접 채굴합니다. 다음 섹션에서는 각 토큰 에어드랍 컨트랙트를 각각 커스터마이즈하고 배포하는 방법을 살펴보겠습니다.
Customizing Token contracts
KIP7 컨트랙트를 KIP7 에어드랍 컨트랙트로 커스터마이징하기.
에어드랍 컨트랙트로 수정하기 전에 KIP7 컨트랙트를 사용자 지정해야 합니다. 이를 위해서는 아래 단계를 따르세요:
- wizard.klaytn.foundation으로 이동합니다.
- Contracts 탭에서 KIP7을 선택합니다.
- 다음으로 SETTINGS 탭에서 이름(KIP7 토큰 에어드랍)과 심볼(KTA)을 입력합니다. The pre-mint field is left empty
- 그 후 FEATURES 탭에서 Mintable 기능 상자를 선택하면 ACCESS CONTROL 탭에서 자동으로 소유 가능 기능을 선택합니다.
이렇게 구성한 후 Kaia Contracts Wizard의 모습은 다음과 같습니다:
생성된 코드는 다음과 같습니다:
// 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
만이 호출할 수 있습니다.
그 후, public mint() onlyOwner 함수를 _mintSingleTokens() 비공개로 수정했습니다.
이제 KIP7 에어드랍 컨트랙트 코드가 준비되었으므로, 다음 단계는 프로젝트 디렉터리의 src 폴더에 airdropKIP7.sol이라는 새 파일을 생성하고 수정된 코드를 파일에 붙여넣는 것입니다.
KIP17 컨트랙트를 KIP17 에어드랍 컨트랙트로 커스터마이징하기.
에어드랍 컨트랙트로 수정하기 전에 KIP17 컨트랙트를 사용자 지정해야 합니다. 이를 위해서는 아래 단계를 따르세요:
- wizard.klaytn.foundation으로 이동합니다.
- Contracts 탭에서 KIP17을 선택합니다.
- 다음으로 SETTINGS 탭에서 이름(KIP7 NFT 에어드랍)과 심볼(KNA)을 입력합니다. 기본 URI 필드는 비워둬야 합니다.
- 이어서 FEATURES 탭에서 Mintable, Auto-increment Ids, Enumerable 기능 상자를 선택합니다. ACCESS CONTROL 탭의 소유 가능 기능이 자동으로 선택된 것을 확인할 수 있습니다.
이렇게 구성한 후 Kaia Contracts Wizard의 모습은 다음과 같습니다:
생성된 코드는 다음과 같습니다:
// 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은 일괄 발행을 지원하므로 컨트랙트만 사용자 지정하여 그대로 사용할 것입니다. KIP37 컨트랙트를 사용자 지정하려면 아래 단계를 따르세요:
- wizard.klaytn.foundation.으로 이동합니다.
- Contracts 탭에서 KIP37을 선택합니다.
- 다음으로 SETTINGS 탭에서 이름(KIP7 NFT 에어드랍)과 심볼(KNA)을 입력합니 다. 기본 URI 필드는 비워둬야 합니다.
- 이어서 FEATURES 탭에서 Mintable, Auto-increment Ids, Enumerable 기능 상자를 선택합니다. ACCESS CONTROL 탭의 Ownable 기능이 자동으로 선택된 것을 확인할 수 있습니다.
이렇게 구성한 후 Kaia Contracts Wizard의 모습은 다음과 같습니다:
생성된 코드는 다음과 같습니다:
// 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이라는 새 파일을 생성하고 생성된 코드를 붙여넣는 것입니다.
모든 카이아 컨트랙트에 대한 컨트랙트 코드를 생성했으면, 다음 단계는 Foundry Solidity 스크립트를 사용하여 카이아 테스트넷 Kairos에 배포하는 것입니다.