์ด ๊ธ์ ์๋ ๊ณต์ ๋ฌธ์๋ฅผ ๋ณด๊ณ Aptos์ Typescript SDK๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๊ธฐ๋กํ ๊ธ์ ๋๋ค.
Mint NFTs with the SDKs | Aptos Docs
์ด ๊ธ์ ํตํด ์ฝ๋ ์ ์์ฑ(ํ ํฐ์ด ๋ค์ด๊ฐ๋ ๊ณณ), ํ ํฐ ์์ฑ, ํ ํฐ ์ ์ก(๋ฏผํ ) ๋ฐฉ๋ฒ์ ๋ฐฐ์ธ ์ ์์ต๋๋ค.
์ฌ์ ์ค๋น
๋จผ์ ์์ ์ฝ๋๋ฅผ ํด๋ก ๋ฐ๊ณ , ์ฝ๋๋ฅผ ์คํ์์ผ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. vs์ฝ๋์์ ํด๋๋ฅผ ๋ง๋ ๋ค ์๋ ๋ช ๋ น์ด๋ฅผ ์คํ์์ผ์ฃผ์ธ์.
git clone git@github.com:aptos-labs/aptos-core.git
cd aptos-core/ecosystem/typescript/sdk/examples/typescript
pnpm install
pnpm run simple_nft
์ ์ฝ๋์ ์คํ ๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ์ต๋๋ค.
=== Addresses ===
Alice: 0xeef95e86c160fa10a71675c6075f44f8f2c6125f57b4b589424f1fbee385f754
Bob: 0x4dcd7b180c123fdb989d10f71fba6c978bda268c2e3660c169bdb55f67aab776
=== Initial Coin Balances ===
Alice: 100000000
Bob: 100000000
=== Creating Collection and Token ===
Alice's collection: {
"description": "Alice's simple collection",
"maximum": "18446744073709551615",
"mutability_config": {
"description": false,
"maximum": false,
"uri": false
},
"name": "Alice's",
"supply": "1",
"uri": "<https://alice.com>"
}
Alice's token balance: 1
Alice's token data: {
"default_properties": {
"map": {
"data": []
}
},
"description": "Alice's simple token",
"largest_property_version": "0",
"maximum": "18446744073709551615",
"mutability_config": {
"description": false,
"maximum": false,
"properties": false,
"royalty": false,
"uri": false
},
"name": "Alice's first token",
"royalty": {
"payee_address": "0xeef95e86c160fa10a71675c6075f44f8f2c6125f57b4b589424f1fbee385f754",
"royalty_points_denominator": "0",
"royalty_points_numerator": "0"
},
"supply": "1",
"uri": "<https://aptos.dev/img/nyan.jpeg>"
}
=== Transferring the token to Bob ===
Alice's token balance: 0
Bob's token balance: 1
=== Transferring the token back to Alice using MultiAgent ===
Alice's token balance: 1
Bob's token balance: 0
์ฐ์ ๊ฒฐ๊ณผ๋ก ๋์จ ๊ฒ๋ค์ ์ข ํฉํด๋ณด๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
- REST, Faucet Client๋ฅผ ์ด๊ธฐํํ๋ค.
- Alice, Bob ๋ ๋ช ์ ๊ณ์ ์ ๋ง๋ ๋ค.(The funding and creation of Alice and Bob's accounts.)
- Collections์ ๋ง๋ค๊ณ Alice ์ ๊ณ์ ์์ ํ ํฐ์ ์ฌ์ฉํ๋ค.
- Alice๋ Bob์๊ฒ ํ ํฐ์ ์์ฒญํ๋ค
- Bob๋ multiagent transaction์ ์ด์ฉํด์ bob์๊ฒ ๋ณด๋ธ๋ค.
๊ทธ๋ฆฌ๊ณ pnpm run simple_nft๋ฅผ ํตํด ์ฝ๋๋ฅผ ์คํํ๋๋ฐ package.json์ ๋ณด๋ฉด ์๋์ ๊ฐ์ด ๋์ด์์ต๋๋ค.
ts-node๋ ํ์ ์คํฌ๋ฆฝํธ ํ์ผ์ ์คํํด์ฃผ๋ ๋ช ๋ น์ด์ ๋๋ค. ์ฆ ์ฐ๋ฆฌ๋ simple_nft.tsํ์ผ์ ์คํ์ํจ ๊ฒ์ ๋๋ค. ์ด์ ๋จ๊ณ์ ๋ฐ๋ผ์ ์ฝ๋๋ฅผ ์ฒ์ฒํ ๋ณด๋ฉฐ ์ดํดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
ํด๋ผ์ด์ธํธ ๋ฐ ๊ณ์ ์์ฑ
ํ ํฐ์ ๋ง๋ค๊ณ , ์ ์กํ๋ ์์ ์ ํ๊ธฐ ์ , SDK๋ฅผ ์ด์ฉํ๊ธฐ ์ํด ๋ช ๊ฐ์ง ์ฌ์ ์์ ์ ํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. client๋ฅผ ๋ง๋ค๊ณ , ํ ํฐ์ ์์ฑํ ์ฌ๋(alice), ๋ฐ์ ์ฌ๋(bob)์ ๊ฐ๊ฐ ์ ์ธํ ๊ฒ์ ๋๋ค. ๊ฐ client๋ค์ SDK์ ๋ด์ฅ๋์ด์๋ ํจ์๋ค์ ์ฌ์ฉํ ์ ์๋๋ก ํด์ค๋๋ค.
API Client๋ REST API๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํด์ค๋๋ค. Faucet Client๋ devnet Faucet Service๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํด์ค๋๋ค. ๊ทธ ๊ฒฐ๊ณผ ๊ณ์ ์ ์์ฑํ๊ณ ์ฝ์ธ์ ๋ฃ์ด์ค ์ ์๊ฒ ๋๋ ๊ฒ์ ๋๋ค. ์ดํ API Client๋ฅผ ์ด์ฉํด Token Client๋ฅผ ๋ง๋ญ๋๋ค. ์ด Token Client๋ collection์์ฑ, token์์ฑ, token์ ์ก ๋ฑ ํ ํฐ ๊ด๋ จ ์์ ์ ํ ์ ์๊ฒ ํด์ค๋๋ค.
// Create API and faucet clients.
// :!:>section_1a
const client = new AptosClient(NODE_URL);
const faucetClient = new FaucetClient(NODE_URL, FAUCET_URL); // <:!:section_1a
// Create client for working with the token module.
// :!:>section_1b
const tokenClient = new TokenClient(client); // <:!:section_1b
// Create a coin client for checking account balances.
const coinClient = new CoinClient(client);
์ด์ aptos๊ณ์ ์ 2๊ฐ์ง ๋ง๋ค์ด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ๋ ์์ ๋ง๋ faucetClient๋ฅผ ํตํด ์ฝ์ธ์ ๋ฃ์ด์ฃผ๋๋ก ํ๊ฒ ์ต๋๋ค. faucetClient๋ฅผ ํตํด ์ฝ์ธ์ ๋ฃ์ด์ฃผ๊ธฐ ์ด์ ์๋ off-chain ๊ณ์ ์ด๋ผ์ ํ ํฐ์ ๋ณด๋ด๋ ค ํด๋ ์ฐพ์ ์ ์๋ ๊ณ์ ์ด๋ผ๊ณ ๋์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฃ์ด์ค ์ฝ์ธ์ ํธ๋์ ์ (ํ ํฐ์ ์์ฑํ๊ฑฐ๋, ๋ณด๋ด๋ ๋ฑ์ ๋ธ๋ก์ฒด์ธ๊ณผ ์ํธ์์ฉ ํ๋ ์์ )์ ํ๋ ๋ฐ์ ์๋น๋๊ธฐ ๋๋ฌธ์ ์ฝ์ธ์ ๋ฃ์ด์ฃผ๋๋ก ํฉ์๋ค.
const alice = new AptosAccount();
const bob = new AptosAccount();
await faucetClient.fundAccount(alice.address(), 100_000_000);
await faucetClient.fundAccount(bob.address(), 100_000_000);
์ฝ๋ ์ ๋ฐ ํ ํฐ ์์ฑ
์ด์ ์ฝ๋ ์ ๊ณผ ํ ํฐ์ ์์ฑํด์ฃผ๋๋ก ํ๊ฒ ์ต๋๋ค. ์ฑํ ์ค์์๋ ํ ํฐ์ ๋ง๋๋ ค๋ ์ฌ๋์ด ‘Collection’์ด๋ผ๋ ๊ฒ์ ๊ฐ์ง๊ณ ์์ด์ผ ํฉ๋๋ค. ์ด Collection์ ํ ํฐ๋ค์ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ๋๋ค. CreateCollection์ ๋ค์๊ณผ ๊ฐ์ ๊ฐ๋ค์ ๋ฐ์ต๋๋ค.
async createCollection(
account: AptosAccount,
name: string,
description: string,
uri: string,
maxAmount?: AnyNumber = MAX_U64_BIG_INT,
extraArgs?: OptionalTransactionArgs,
): Promise<string> {}
์ฝ๋ ์ ์ ์์ฑํ๋ ์ฝ๋๋ ์๋์ ๊ฐ์ต๋๋ค.
const txnHash1 = await tokenClient.createCollection(
alice,
collectionName,
"Alice's simple collection",
"<https://alice.com>",
);
await client.waitForTransaction(txnHash1, { checkSuccess: true });
waitForTransaction์ ํธ๋์ญ์ ํด์ฌ์ ๊ฐ์ ๋ฐ์ ์ํ๊ฐ true๊ฐ ๋๋ฉด ๋์ด๊ฐ๋ ํจ์์ ๋๋ค.
์ด์ ๋ ๋ง๋ ์ฝ๋ ์ ์ ํ ํฐ์ ๋ง๋ค์ด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ์ฑํ ์ค์ ์ํ๋ฉด ํ ํฐ์ ์์ฑํ๋ ํจ์๋ ์๋์ ๊ฐ์ ์ธ์๋ฅผ ๋ฐ๋๋ค๊ณ ๋์ด์์ต๋๋ค.
async createToken(
account: AptosAccount,
collectionName: string,
name: string,
description: string,
supply: number,
uri: string,
max: AnyNumber = MAX_U64_BIG_INT,
royalty_payee_address: MaybeHexString = account.address(),
royalty_points_denominator: number = 0,
royalty_points_numerator: number = 0,
property_keys: Array<string> = [],
property_values: Array<string> = [],
property_types: Array<string> = [],
extraArgs?: OptionalTransactionArgs,
): Promise<string> {
๊ณต์ ์์ ์์๋ ์ต์ํ์ ์ธ์๋ฅผ ์ฃผ๊ณ ์๋์ ๊ฐ์ด ํ ํฐ์ ์์ฑํ๊ณ ์์ต๋๋ค.
const txnHash2 =await tokenClient.createToken(
alice, //account
collectionName, //collectionName
tokenName, //tokenName
"Alice's simple token", //description
1, //supply(๋ฐํ๋)
"<https://aptos.dev/img/nyan.jpeg>", //uri: ์ฌ์ง์ด๋ฏธ์ง
);
์ด์ ์ฝ๋ ์ , ํ ํฐ, ๊ณ์ ๋ฑ์ด ์ ์์ฑ๋์๋์ง ํ์ธํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ์๋ ์ฝ๋๋ค์ ํน์ collection, token์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์ญํ ์ ํฉ๋๋ค.
const collectionData = await tokenClient.getCollectionData(alice.address(), collectionName);
console.log(`Alice's collection: ${JSON.stringify(collectionData, null, 4)}`);
const tokenData = await tokenClient.getTokenData(alice.address(), collectionName, tokenName);
console.log(`Alice's token data: ${JSON.stringify(tokenData, null, 4)}`);
์ด์ ํน์ ์ง๊ฐ์ ํ ํฐ ์๊ณ ๋ฅผ ์ฝ์ด์ค๋ ์ฝ๋๋ฅผ ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ์์ await faucetClient.fundAccount(alice.address(), 100_000_000); ๋ฅผ ํด์คฌ๊ธฐ ๋๋ฌธ์ 100000000์ด ์ถ๋ ฅ๋ฉ๋๋ค.
const aliceBalance1 = await tokenClient.getToken(
alice.address(),
collectionName,
tokenName,
`${tokenPropertyVersion}`,
);
console.log(`Alice's token balance: ${aliceBalance1["amount"]}`);
ํ ํฐ ์ ์กํ๊ธฐ 1 (Offer & Claim)
์ด์ alice -> bob์ผ๋ก ํ ํฐ์ ์ ์กํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ์ฑํ ์ค๋ ํ ํฐ์ ๋ฐ๋ ์ฌ๋์ด ์์น ์๋ ํ ํฐ์ ๋ฐ๋ ์ํฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด offer → claim, 2๊ฐ์ง ๋จ๊ณ๋ก ํ ํฐ์ ์ ๋ฌ(Transfer)ํ๋ ๊ณผ์ ์ ๋๋ ๋์์ต๋๋ค. ๊ฐ ์ฝ๋๋ ์๋์ ๊ฐ์ด ์ฌ์ฉํฉ๋๋ค.
const txnHash3 = await tokenClient.offerToken(
alice, //์ ๋ฌ์
bob.address(), //์๋ น์ ์ฃผ์
alice.address(), //ํ ํฐ ์์ฑ์ ์ฃผ์
collectionName,
tokenName,
1, //์ ๋ฌ ์๋
tokenPropertyVersion,
);
const txnHash4 = await tokenClient.claimToken(
bob, //์๋ น์
alice.address(), //์ ๋ฌ์ ์ฃผ์
alice.address(), //ํ ํฐ ์์ฑ์ ์ฃผ์
collectionName,
tokenName,
tokenPropertyVersion,
);
ํ ํฐ ์ ์กํ๊ธฐ 2 (directTransferToken)
์๋น์ค์ ๋ฐ๋ผ ์ ๊ณผ์ ์ ๋๋๊ณ ์ถ์ง ์์ ์ ์์ต๋๋ค. ๊ทธ๋์ ์ฑํ ์ค sdk์์๋ directTransferToken์ด๋ผ๋ ํจ์๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด ํจ์๋ฅผ ์ด์ฉํ๋ฉด offer, claim์ ํ๋ฒ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
let txnHash5 = await tokenClient.directTransferToken(
bob, //์ ๋ฌ์
alice, //์๋ น์
alice.address(), //์์ฑ์ ์ฃผ์
collectionName,
tokenName,
1, //์ ๋ฌ ์๋
tokenPropertyVersion,
);
๋ค๋ง ๋ฐ๋ ์ฌ๋(receiver)์ ๊ณ์ ์ aptosAccountํ์์ผ๋ก ๋๊ฒจ์ค์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ฐ๋์ฌ๋์ private key๋ฅผ ์๊ณ ์๋ค๋ ์ ์ ํ์ ์ ์ฝ๋๋ฅผ ์คํํ ์ ์์ต๋๋ค.
์ง๊ธ ํ๋ ๋ด์ฉ์ ๊ณต์๋ฌธ์์์ ์งํํ๋ ์์ ์ฝ๋์ด๊ธฐ ๋๋ฌธ์ ์ฌ์ ์ bob = new AptosClient()๋ผ๊ณ ์ง์ ํด๋์์ง๋ง(์์์ ๊ณ์ ), ์ค์ Petra wallet ๊ณผ ์ํธ์์ฉํ๊ธฐ ์ํด์๋ ํด๋น wallet์ privateKey, address๋ฅผ ๊ฐ์ง๊ณ aptosAccount๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ์๋ น์์ privateKey๋ฅผ ์๊ณ ์์ด์ผ ํฉ๋๋ค.
offerToken๊น์ง๋ง ํ๋ฉด ์๋ น์์ petra wallet์์ ์๋ นํ ์ง ๊ฑฐ์ ํ ์ง ์ ํํ ์ ์์ต๋๋ค. ์๋น์ค ์์์๋ offerToken๊น์ง๋ง ํ๊ณ claim์ฌ๋ถ๋ petra wallet์์ ๊ฒฐ์ ํ๋๋ก ํ๋ ๊ฒ์ด ์์ฐ์ค๋ฝ๊ฒ ๋ณด์ ๋๋ค.
'๋์ธํ๋ > ํ์ฅ ์ค์ต' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Solidity+hardhat+JavaScript] ์ค๋งํธ์ปจํธ๋ ๋ฐฐํฌ ์ค์ต (0) | 2023.04.07 |
---|
๋๊ธ