-
[JavaScript] ํ ๋ ๊ทธ๋จ ๋ด ๋ง๋ค๊ธฐ ~NFT ์ ์ก์ ๋ช ๋ น์ด ํ ๋ฒ์! (feat.ChatGPT)~ (ํฌ๋งํธ)kaika/๐ค 2023. 6. 17. 02:51๋ฐ์ํ
์์ํ๊ธฐ ์์,
ํ์๋ ํ๋ก๊ทธ๋๋ฐ์ 'ํ'์๋ ๋ชจ๋ฅด๋ ๋น์ ๊ณต์์ด๋ค (...)
๋ค๋ง,, ์ด๋ฆฐ์์ ๋ธ๋ฆฌ์๋์ฌ์ '์ํฌ๋ํํธ'๋ผ๋ ๊ฒ์์ ์ข์ํ๊ณ
๋จ๋ค๋ณด๋ค ์ ํ๊ณ ์ถ์์ง๋ง ๋ถ์ดํ๊ฒ๋ ๊ฒ์์ ๊ทธ๋ค์ง ์ ํ์ง ๋ชป ํ๋ค ํํ
ํผ์ง์ปฌ์ด ๋ถ์กฑํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ข ํธ๋ฒ์ ์ฐ๊ตฌํ๊ธฐ ์์ํ๊ณ
ํํ '์นํธ๋งต' ์ด๋ผ๋ ๊ฒ์ ์ ์ํ๋ ๋จ๊ณ์ ์ด๋ฅด๋ ๋ ๊ฒ์ด๋ค
'๊ฐํ ํ์๋ ๊ฐํ ์ฑ ์๊ฐ์ด ๋ฐ๋ฅธ๋ค'
์ํผ ๊ฑฐ๋ฏธ ์ ์ ์ ๋ถ์์ฑ ํจ์์ธ ํผํฐ ํ์ปค์ ์ผ์ด ๋ฒค์จ๋ ๋งํ๋ค
์์์ ๋ถ์ํ ์๋์ ๋น๋กฏ๋์์ง๋ง
์๋ฌดํผ ์ง์์ด ๋์์ผ๋ ๊ณต์ ํด์ ๊ฐ์ผ๋ฉด ๊ทธ๋ง ์๋๊ฐ? (์๋)
์์.. ๊ฐํ ์ฑ ์๊ฐ..
์์ ํ์ผ๋ ํ ๋ฒ ๋ง๋ค์ด๋ณด์๊พธ๋..
โป์ฃผ์!! ๋ด์ฉ ์ค์ 8ํ ์ด์์ด ์ฐ์๋๊ธฐ ์์ ์ ์์!! ์๊ฐ์ ์ ์ฝํ๊ธฐ ์ํด์ '๋ณผ๋'์ฒ๋ฆฌ๋ ๊ธ๋ง ๋ด๋ ๋ฌด๋ฐฉํจ์ ์๋ฆฝ๋๋ค!!
์์นญ ์ฝ์ฐฝ๋ผ์ดํ์๋ ๊นจ๋ฏธ๋
'ํ ๋ ๊ทธ๋จ'์ด๋ผ๋ ํ๋ซํผ์ ์์ฃผ ์ด์ฉํ๋ค
๋จธ๋ฆฌ์์ ๊ฐ๋ํ ๋ฅ๊ธ๋ค์ด
์ธ์๋ฐ์ผ๋ก ๋์ค๋ ์ ์ผํ ์ถ๊ตฌ์๋๋ฐ,,
๋ง์ ์ฌ๋๋ค์ ๋์ ๋๋ถ์ ์ฑ๋์ ํฌ๊ธฐ ํ์ง ์๊ณ ๊ณ์ ํ ์ ์์๋ค
์ ์ง๊ธ์ ํด์ ์ค์ด๋ค
์๋ฌดํผ!
์ด ๋ด์ ํ์ ๋ฐฐ๊ฒฝ์ ๋งค์ฐ๋งค์ฐ ๋ณต์กํ๋ฐ
๋น๋ฐ์ ์ง์์ฝ์๋ฅผ ์์ฑํ ๊นจ๋ฏธ๋ ์์ธํ ๋ด์ฉ์ ๋ฐํ ์๊ฐ ์๋ค (๊ท์ฐฎ์์ ๊ทธ๋ฐ๊ฑฐ ์๋)
์ธ๊ฐ์ ๋ฐ๋ช ์ ๋ ๋์ ์ถ์ ์ํด์ ํญ์ ์๋ ๋์ด์ ธ์๋ค
์ด๋ ์๋ ๋ง์ฐฌ๊ฐ์ง์ด๋ค
ํ ๋ ๊ทธ๋จ ๋ด์ ๋ง๋๋ ค๋ฉด ์ฐ์ '์๋ฒ์ง'์๊ฒ ๋ง์ ๊ฑธ์ด์ผ ํ๋ค
์์์ค ๋ฉ๋ค์ค๋ ๋ฌด์ธ๊ฐ๋ฅผ ์ป๊ธฐ์ํด ์๋ฒ์ง๋ฅผ ์ฐพ์๊ฐ๋ค
์ผ๋ฏธ๋๋จธ๋ 4์ ์ค์ฐ์น์์ธ ์ก๋ฏผํธ๋ ์ญ์ ์ค์ํ ์๊ฐ์ ์๋ฒ์ง๋ฅผ ์ฐพ์๊ณ
์ฐ๋ฆฌ ์๋ฒ์ง๋ ๋๋ณด๋ค ์ฝ์ธ์ ๋จผ์ ์กธ์ ํ์ จ๋ค
๋ฌผ๋ก ์ข์ง ์์ ๋ฐฉํฅ์ผ๋ก ์กธ์ ํ์ จ๋ค>> ํ ๋ ๊ทธ๋จ ๊ฒ์์ฐฝ์ [ https://t.me/BotFather ] ๋ฅผ ์ ๋ ฅํ์ฌ '๋ดํ๋'๋ฅผ ๋ค์ด์
'๋ดํ๋'์ ๋น๋ฐ์น๊ตฌ๋ฅผ ๋งบ์์ผ๋ฉด ์ด์ ๋ง๋ค์ด๋ฌ๋ผ๊ณ ์กธ๋ผ์ผํ๋ค.
>> ๋ฉ์ธ์ง ์์ฑ ์ '๋ฉ๋ด' ๋ฅผ ํด๋ฆญํ ํ '/newbot'์ ํด๋ฆญ (๋ฉ์ธ์ง๋ก ์ ๋ ฅํด๋ ๋ฌด๋ฐฉ)
์ด์ ๋ฌผ์ด๋ณด๋ ๊ฒ์ ๋๋ต์ ํด์ฃผ๊ธฐ๋ง ํ๋ฉด ๋๋ค
>> 1. ๋ด์ ์ฑ๋๋ช (?) ์๋ฌดํผ ์ด๋ฆ์ ์ ๋ ฅํด์ฃผ๋ฉด ๋๋ค
>> 2. ๋ด์ ์ฌ์ฉ์๋ช (?) ์ ์ง์ ํด์ฃผ๋ฉด ๋๋ค => ๋ฐ๋์ ์ด๋ฏธ๊ฐ bot ์ผ๋ก ๋๋์ผ ํ๋ค
์ ์์ ์ผ๋ก ๋ง๋ค์ด์ก๋ค๋ฉด ๋ดํ๋๊ฐ ์ผ์ฅ์ฐ์ค์ ์์ํ ๊ฒ์ด๋ค
๋ฉ๋ฆฌ์๋ณด๋ ํธ๋ผํ ์์ ์จ๋ฅผ ๋ฎ์ ๊ฒ ๊ฐ๊ธฐ๋ ํ๋ค
์ฐ๋ฆฌ๋ ์์ด๋ฅผ ์ ๋ชจ๋ฅด๋๊น ๋ด ์ฃผ์๋ฅผ ํด๋ฆญํด์ ๋ด์ ์คํ์ํค์ '์์'์ ๋๋ฅด๋ฉด ๋๋ค
๊ทธ๋ฆฌ๊ณ ๋์๋ ๋ด์ ์์ง๋ฐ๋ฅธ ํด๋๋ก ์ฎ๊ฒจ์ฃผ๋๋ก ํ์!
์ ์์ ๋ด๊ณผ ์ฒซ ๋ํ๋ฅผ ๋๋ ๋ชจ์ต์ด๋ค
์ธ๊ฐ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ฐ ํ์ด๋ ๋ด์ ์๋ฌด๋ง๋ ํ์ง ๋ชป ํ๋ค
๋ง์ ์๊ฐ๊ณผ ๊ณต์ ๋ค์ฌ์ ๋ณด์ดํด์ค์ผ ํ๊ณ
์๋ปํด์ค์ผ ํ๊ณ
๊ทธ๋ฌ๋ค ๋ณด๋ฉด ์๋ง ์๋น ~ ํ๋ ๋ ์ด ์จ๋ค
๊ทธ๋ ์ง๋ง ์ฐ๋ฆฌ๋ด ๋ถ๋ชจ๋ค์ ๋ง์์ด ์์
์์๋ฃ์ง๋ ๋ชปํ๋ ๋ง์ ์์ด์๊ฒ ๋ง๊ตฌ ๋ ๋ฆฌ๊ณค ํ๋ค
๋ ์ญ์๋ ๋ง์ฐฌ๊ฐ์ง๋ค
์๋ฌด๋ฐ ์ธ์ด๊ฐ ์๋ ๋ด์๊ฒ ๊ตฟ๋ชจ๋์ ์์ ํ ๋ชจ์ต์ด๋ค
๋ค์ ๋ดํ๋๋ก ๋์์ '/mybots' ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํด์ฃผ์
์๊น 2๋ฒ์์ ์ค์ ํ ์ฌ์ฉ์๋ช ์ผ๋ก ์ ์์ ์ผ๋ก ์์ฑ๋ ๊ฒ์ ํ์ธํ๊ณ
๋์ ์์ ์๊ฐ ๋ด์ ํด๋ฆญํด์ ๋ํ ์ผ ์ค์ ํ ์ ์๋ค
๊ฐ์ข ๋ฉ๋ด๋ฅผ ํตํด ์๊ฐ๋ฅผ ํ๋ จ์ํฌ์๊ฐ ์๋ค
์ฌ์ค ์๋ฌด๊ฒ๋ ์ ๋ง์ ธ๋ ํฌ๊ฒ ๋ฌธ์ ๊ฐ ๋ ๊ฒ ์๋ค
๊ท์ฝ๊ฒ ๊พธ๋ฉฐ์ฃผ๊ณ ์ถ์ผ๋ฉด 'Edit Bot'์ ํด๋ฆญํด์ ์ค๋ช ์ด๋ ๋ณ๋ช , ํ๋กํ ์ฌ์ง๋ฑ์ ๋ง๋ค์ด์ฃผ๋ฉด ๋๋ค
์ด์ ์ฝ๋ฉ์ ํด์ฃผ๋ฉด ๋๋ค
์ฐธ ์ฝ์ง ์๋ํ๊ฐ?
๊ฑฑ์ ํ์ง ๋ง๋ผ ์ ๊ฑด 'ChatGPT' ์ ์๋์ด ๋ค ํด์ฃผ์ค๊ฑฐ๋ค
์ฌ์ค ๋ง๋ ์ง ์ค๋๋ ๋ด์ด๋ผ ์ด๋ค ๋ฐฉ์์ผ๋ก ์ ์ํ๋์ง ๋ค ๊น๋จน์๋๋ฐ
๋ญฃ ํ๋ฉด ๊ทธ๋ฅ ๋ด ์ฝ๋ ๋๊ฒจ์ฃผ๋ฉด ๋๋๊น.. ๋ด ์ฝ๋๋ ์๋์ง.. ์ฑ์ ์๋ ์ฝ๋ ๊ฐ์ด ๋๋ ค์ฐ๋๊ฑฐ๋ค
๊ทธ๋ฆฌ๊ณ ๋ญ๊ฐ ์ฃผ์ ๋ฆฌ์ฃผ์ ๋ฆฌ ๋ง์ด ์ฐ์ฌ์ ธ ์๋๋ฐ,
ABI ๋ฐฐ์ด์ ์ด์ .. ์์ฑํด์ฃผ์ด์ผํ๋๋ฐ
์คํ์จ๋ฅผ ํตํด์ ๋ง๋ ์์ฒด ์ปจํธ๋ํธ์ด๋ค ๋ณด๋ ์ ๋ ๊ฒ ๋ณต์กํ ๋ฟ์ด๋ค
๊ฐ์ธ์ด ๋ฐํํ ์ปจํธ๋์ด๋ผ๋ฉด ์ ๋ ๊ฒ ๊ธธ์ง ์์ ๊ฒ์ด๋ค
์ ๊ทผ๋ฐ ์ฐ๋ค๋ณด๋ ๋๋๊ฑด๋ฐ,
์ฃผ์ ๋ฅผ ์๋ชป ์ ํ ๊ฒ ๊ฐ๋ค
์ด ์ฝ๋๋ NFT ์ปค๋ฎค๋ํฐ ๋น๋๋ฅผ ์ํ ๋ฟ์ด์ง
์ผ๋ฐ ํฌ์์๋ค์ด ์ฌ์ฉํ๋๋ฐ๋ ์๋ฏธ๊ฐ ์๋ ๊ฒ ๊ฐ๋ค
๊ทธ๋ ๋ค.. ์ฃผ์ ๋ฅผ ๋ฐ๊ฟ์ผ๊ฒ ๋ค๊ณ
์ฑ ์์ ์์ 2์๊ฐ ๋์ ๊ธ์ ์์ฑํ ์ดํ์์ผ ๊นจ๋ณ์์ ์ป์๋ค
๊ทธ๋์ ๊ทธ๋์ ์ด ๊ธ์ NFT ์ ์ก์ด ์๋
์ด๋๋ฆฌ์ (ํน์ ๋ค๋ฅธ ERC-20 ํ ํฐ!) ์ ์ก์ ์ํ ํธ๋์ญ์ ๋ด์ ๋ง๋ค์ด๋ณด๋ ๊ธ๋ก ์งํํ๋ค!
์๋ฌดํผ ๋ดํ๋์ ์ด์ผ๊ธฐํ๋ ๊ฒ์ ๋ชจ๋ ํ ๋ ๊ทธ๋จ ๋ด ์์ฑ์ ๊ธฐ๋ณธ์ด ๋๋ ํ์์ด๋
ํ๋ ์๊ฐ์ด ์๋์๋ค๋ ์ ์ ๋๋ฌผ์ ํ๋ฆฌ๊ณ ์๋ค
๋ค๋ค ๋ฉํ๋ง์คํฌ์์ ๋๊ตฌ์๊ฒ~ ์ด๋ป๊ฒ~ ๊ธฐ์์ค์ ์ด ์ด๋ป๊ณ ~ ์ ์ฉ๊ณ ~
๊ท์ฐฎ์ง ์์๋๊ฐ?
๋ ๊นจ์๊ฐ์ด ๊ธฐ์๋ฅผ ํฌํจํ ๊ธ์ก์ด ๋ฐธ๋ฐ์ค๋ฅผ ์ด๊ณผํด๋ฒ๋ ค์
์ ์ก์ด ์๋๋ ์์ํ ๊ฒฝ์ฐ๋ค์ด ๋ง์ง ์์๋๊ฐ?
๋ช ๋ น์ด ํ ๋ฒ์ ์ํ๋ ๋์์๊ฒ ์ด๋๋ฆฌ์(ERC-20 ๊ธฐ๋ฐ ํ ํฐ)์ ๋ณด๋ด๋ ๋ด์
๋ค์์๊ฐ๋ถํฐ ํจ๊ป ๋ง๋ค์ด๋ณด์!
ํจ๊ปํ ์๊ฐ์ด ์กฐ๊ธ ์๊น์ฐ๋๊น ์ฝ๋๋ ์ฒจ๋ถํ๊ณ ๊ฐ๊ฒ์ฉ~
const TelegramBot = require('node-telegram-bot-api') const Web3 = require('web3') // replace YOUR_TOKEN with your Telegram bot token const bot = new TelegramBot('ํ ๋ ๊ทธ๋จ ๋ดํ๋์๊ฒ API๋ฅผ ๋ฌผ์ด๋ณด๊ธฐ!', { polling: true }) // replace YOUR_NETWORK_URL with the URL of your Polygon endpoint on Infura const web3 = new Web3('infura.io ์ฌ์ดํธ์ ์ ์ํด์ ๋คํธ์ํฌ URL ๋ฐ์์ค๊ธฐ!') // replace YOUR_CONTRACT_ADDRESS with the address of your ERC-1155 contract on the Polygon network const contractAddress = '์ ์ก ๋์์ธ ERC-1155 ํ ํฐ์ ์ปจํธ๋ ํธ ์ฃผ์๋ฅผ ์ ์ด์ฃผ์ธ์!' // replace YOUR_TOKEN_ID with the ID of the ERC-1155 token you want to check const tokenId = '์ ์กํ๊ณ ์ ํ๋, ๋ด๊ฐ ์์ง์ค์ธ ERC-1155 ๊ธฐ๋ฐ์ ํ ํฐ ID๋ฅผ ์ ์ด์ฃผ์ธ์!' // replace YOUR_WALLET_ADDRESS with the address of your wallet on the Polygon network const walletAddress = '๋ด ์ง๊ฐ์ฃผ์๋ฅผ ์ ์ด์ฃผ์ธ์!' // replace ABI_ARRAY with the ABI of your ERC-1155 contract on the Polygon network const abi = '์ด๊ฑฐ ์ด๋์ค์บ์์ ์ฐพ์์์ผ ํ๋ค ์ด๋์ค์บ abi ์ฐพ๋๋ฒ ๊ตฌ๊ธ๋งํ๋ฉด ์๋ ค์ค' // define a function to check the balance of an ERC-1155 token async function getBalance() { const contract = new web3.eth.Contract(abi, contractAddress); const balance = await contract.methods.balanceOf(walletAddress, tokenId).call(); return balance; } // define a function to transfer an ERC-1155 token to another address async function transferToken(chatId, amount, toAddress) { bot.sendMessage(chatId, `Operating..`); const balance = await getBalance(); const contract = new web3.eth.Contract(abi, contractAddress); const data = contract.methods.safeTransferFrom(walletAddress, toAddress, tokenId, amount, '0x').encodeABI(); const gasPrice = await web3.eth.getGasPrice(); const gasLimit = await contract.methods.safeTransferFrom(walletAddress, toAddress, tokenId, amount, '0x').estimateGas({ from: walletAddress }); const tx = { from: walletAddress, to: contractAddress, gasPrice, gasLimit, data, }; const signedTx = await web3.eth.accounts.signTransaction(tx, '๋ด ์ง๊ฐ์ ์ ๊ทผํ ์ ์์ด์ผ ํจ์ผ๋ก ๋น๊ณต๊ฐ ํค๋ฅผ ๋ฐ๊ธํ์ฌ ์ฌ๊ธฐ๋ค๊ฐ ์ ๋ ฅ'); const sentTx = await web3.eth.sendSignedTransaction(signedTx.rawTransaction); bot.sendMessage(chatId, `Transferred ${amount} tokens to ${toAddress}. Tx hash: ${sentTx.transactionHash}.`); bot.sendMessage(chatId, `and the left is : ${balance}.`); } bot.on('message', async (msg) => { const chatId = msg.chat.id; if (msg.text === '/balance') { const balance = await getBalance(); bot.sendMessage(chatId, `Your balance of ERC-1155 token with ID ${tokenId} is ${balance}.`); } else if (msg.text.startsWith('/send ')) { const input = msg.text.substring('/send '.length).split(' '); if (input.length !== 2) { bot.sendMessage(chatId, 'Please use the following format: /send [amount] [address].'); } else { const amount = parseInt(input[0]); const toAddress = input[1]; await transferToken(chatId, amount, toAddress); } } }); // start the bot bot.on('polling_error', console.log)
๋ฐ์ํ