์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐ŸŽฏ ERC-20 ํ‘œ์ค€์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€: ์ด๋”๋ฆฌ์›€ ํ† ํฐ์˜ ๊ณตํ†ต ์–ธ์–ด๋ฅผ ํŒŒํ—ค์ณ๋ณด์ž!

๐ŸŽฏ ERC-20 ํ‘œ์ค€์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€: ์ด๋”๋ฆฌ์›€ ํ† ํฐ์˜ ๊ณตํ†ต ์–ธ์–ด๋ฅผ ํŒŒํ—ค์ณ๋ณด์ž!

๋ธ”๋ก์ฒด์ธ ์„ธ๊ณ„์˜ ํ‘œ์ค€ ํ”„๋กœํ† ์ฝœ, ERC-20์˜ ๋ชจ๋“  ๊ฒƒ

์•ˆ๋…•! ๐Ÿ‘‹ ์˜ค๋Š˜์€ ๋ธ”๋ก์ฒด์ธ ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ๋ฐ˜๋“œ์‹œ ์•Œ์•„์•ผ ํ•  ERC-20 ํ‘œ์ค€์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด๋ณผ ๊ฑฐ์•ผ. ํ˜น์‹œ ์•”ํ˜ธํ™”ํ ๊ฑฐ๋ž˜์†Œ์—์„œ ํ† ํฐ์„ ์ „์†กํ•ด๋ณธ ์  ์žˆ์–ด? ๊ทธ๋•Œ ์‚ฌ์šฉํ•œ ํ† ํฐ ๋Œ€๋ถ€๋ถ„์ด ๋ฐ”๋กœ ERC-20 ํ‘œ์ค€์„ ๋”ฐ๋ฅด๊ณ  ์žˆ์„ ํ™•๋ฅ ์ด ๋†’์•„! ๐Ÿช™

์ด๋”๋ฆฌ์›€ ์ƒํƒœ๊ณ„์—์„œ ERC-20์€ ๋งˆ์น˜ USB ๊ทœ๊ฒฉ์ฒ˜๋Ÿผ ๋ชจ๋“  ํ† ํฐ์ด ๋”ฐ๋ผ์•ผ ํ•˜๋Š” ๊ณตํ†ต ๊ทœ์น™์ด์•ผ. ์ด ํ‘œ์ค€ ๋•๋ถ„์— ์ˆ˜์ฒœ ๊ฐœ์˜ ํ† ํฐ์ด ์ง€๊ฐ‘, ๊ฑฐ๋ž˜์†Œ, DApp์—์„œ ๋ฌธ์ œ์—†์ด ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์ง€. ์žฌ๋Šฅ๋„ท ๊ฐ™์€ ํ”Œ๋žซํผ์—์„œ๋„ ๋ธ”๋ก์ฒด์ธ ๊ด€๋ จ ์žฌ๋Šฅ์„ ๊ฑฐ๋ž˜ํ•  ๋•Œ ์ด๋Ÿฐ ๊ธฐ์ˆ ์  ์ดํ•ด๊ฐ€ ํฐ ๋„์›€์ด ๋˜๊ณค ํ•ด! ๐Ÿ˜Š

๐Ÿ” ERC-20, ๋„๋Œ€์ฒด ๋ญ๊ธธ๋ž˜?

ERC-20์€ "Ethereum Request for Comment 20"์˜ ์•ฝ์ž์•ผ. 2015๋…„ 11์›”, ํŒŒ๋น„์•ˆ ๋ณด๊ฒ”์Šคํ…”๋Ÿฌ(Fabian Vogelsteller)๋ผ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ œ์•ˆํ•œ ์ด๋”๋ฆฌ์›€ ๊ฐœ์„  ์ œ์•ˆ์„œ(EIP-20)์—์„œ ์‹œ์ž‘๋์–ด. ๐Ÿš€

์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด, ์ด๋”๋ฆฌ์›€ ๋ธ”๋ก์ฒด์ธ ์œ„์—์„œ ํ† ํฐ์„ ๋งŒ๋“ค ๋•Œ ์ง€์ผœ์•ผ ํ•  ๊ณตํ†ต ๊ทœ์น™์ง‘์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ผ. ๋งˆ์น˜ ๋ชจ๋“  ์Šค๋งˆํŠธํฐ ์ถฉ์ „๊ธฐ๊ฐ€ USB-C ๊ทœ๊ฒฉ์„ ๋”ฐ๋ฅด๋ฉด ์–ด๋–ค ๊ธฐ๊ธฐ๋“  ์ถฉ์ „ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ERC-20 ํ‘œ์ค€์„ ๋”ฐ๋ฅด๋ฉด ๋ชจ๋“  ์ด๋”๋ฆฌ์›€ ์ง€๊ฐ‘๊ณผ ๊ฑฐ๋ž˜์†Œ์—์„œ ํ† ํฐ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฑฐ์ง€! ๐Ÿ”Œ

๐Ÿ“Œ ์™œ ํ‘œ์ค€์ด ํ•„์š”ํ–ˆ์„๊นŒ?

์ดˆ๊ธฐ ์ด๋”๋ฆฌ์›€ ์ƒํƒœ๊ณ„์—์„œ๋Š” ๊ฐ ํ”„๋กœ์ ํŠธ๊ฐ€ ์ž๊ธฐ๋งŒ์˜ ๋ฐฉ์‹์œผ๋กœ ํ† ํฐ์„ ๋งŒ๋“ค์—ˆ์–ด. ๊ทธ๋Ÿฌ๋‹ค ๋ณด๋‹ˆ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ์ง€:

โ€ข ์ง€๊ฐ‘ ๊ฐœ๋ฐœ์ž๋“ค์ด ๊ฐ ํ† ํฐ๋งˆ๋‹ค ๋ณ„๋„ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ–ˆ์–ด ๐Ÿ˜ฐ
โ€ข ๊ฑฐ๋ž˜์†Œ์—์„œ ์ƒˆ ํ† ํฐ์„ ์ƒ์žฅํ•  ๋•Œ๋งˆ๋‹ค ํ†ตํ•ฉ ์ž‘์—…์ด ๋ณต์žกํ–ˆ์–ด
โ€ข ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ ๊ฐ„ ์ƒํ˜ธ์ž‘์šฉ์ด ์–ด๋ ค์› ์–ด
โ€ข ๋ณด์•ˆ ์ทจ์•ฝ์ ์ด ํ† ํฐ๋งˆ๋‹ค ๋‹ฌ๋ผ์„œ ๊ฐ์‚ฌ๊ฐ€ ํž˜๋“ค์—ˆ์–ด

ERC-20 ํ‘œ์ค€์ด ๋“ฑ์žฅํ•˜๋ฉด์„œ ์ด ๋ชจ๋“  ๋ฌธ์ œ๊ฐ€ ํ•œ ๋ฐฉ์— ํ•ด๊ฒฐ๋์–ด! ๐ŸŽ‰

ERC-20 ์ง€๊ฐ‘ ํ˜ธํ™˜์„ฑ 100% ๊ฑฐ๋ž˜์†Œ ์‰ฌ์šด ํ†ตํ•ฉ DApp ํ‘œ์ค€ ์ธํ„ฐํŽ˜์ด์Šค ์Šค๋งˆํŠธ์ปจํŠธ๋ž™ํŠธ ์ƒํ˜ธ์šด์šฉ์„ฑ ERC-20 ํ‘œ์ค€: ์ด๋”๋ฆฌ์›€ ์ƒํƒœ๊ณ„์˜ ๊ณตํ†ต ์–ธ์–ด

๐Ÿ“‹ ERC-20์˜ ํ•ต์‹ฌ ํ•จ์ˆ˜๋“ค

ERC-20 ํ‘œ์ค€์€ ์ด 6๊ฐœ์˜ ํ•„์ˆ˜ ํ•จ์ˆ˜์™€ 3๊ฐœ์˜ ์„ ํƒ์  ํ•จ์ˆ˜๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์–ด. ๊ฐ๊ฐ์˜ ์—ญํ• ์„ ์นœ๊ตฌ์—๊ฒŒ ์„ค๋ช…ํ•˜๋“ฏ ์‰ฝ๊ฒŒ ํ’€์–ด๋ณผ๊ฒŒ! ๐ŸŽ“

๐Ÿ”ง ํ•„์ˆ˜ ํ•จ์ˆ˜ 6๊ฐœ (Must-Have)

1๏ธโƒฃ totalSupply()

์—ญํ• : ํ† ํฐ์˜ ์ด ๋ฐœํ–‰๋Ÿ‰์„ ์•Œ๋ ค์ค˜

์ด ํ•จ์ˆ˜๋Š” ํ•ด๋‹น ํ† ํฐ์ด ์ด ๋ช‡ ๊ฐœ๋‚˜ ์กด์žฌํ•˜๋Š”์ง€ ์•Œ๋ ค์ฃผ๋Š” ๊ฑฐ์•ผ. ์˜ˆ๋ฅผ ๋“ค์–ด, ์–ด๋–ค ํ† ํฐ์˜ ์ด ๋ฐœํ–‰๋Ÿ‰์ด 1์–ต ๊ฐœ๋ผ๋ฉด ์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด 100,000,000์„ ๋ฐ˜ํ™˜ํ•˜์ง€! ๐Ÿ’ฐ

function totalSupply() public view returns (uint256)

2๏ธโƒฃ balanceOf(address account)

์—ญํ• : ํŠน์ • ์ฃผ์†Œ๊ฐ€ ๊ฐ€์ง„ ํ† ํฐ ์ž”์•ก์„ ํ™•์ธํ•ด

๋‚ด ์ง€๊ฐ‘์— ํ† ํฐ์ด ์–ผ๋งˆ๋‚˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜์•ผ. ์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๊ทธ ์ฃผ์†Œ๊ฐ€ ๋ณด์œ ํ•œ ํ† ํฐ ๊ฐœ์ˆ˜๋ฅผ ์•Œ๋ ค์ค˜. ์€ํ–‰ ๊ณ„์ขŒ ์ž”์•ก ์กฐํšŒ์™€ ๋น„์Šทํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ผ! ๐Ÿฆ

function balanceOf(address account) public view returns (uint256)

3๏ธโƒฃ transfer(address recipient, uint256 amount)

์—ญํ• : ํ† ํฐ์„ ๋‹ค๋ฅธ ์ฃผ์†Œ๋กœ ์ „์†กํ•ด

๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์†ก๊ธˆ ๊ธฐ๋Šฅ์ด์•ผ! ์นœ๊ตฌ์—๊ฒŒ ํ† ํฐ์„ ๋ณด๋‚ด๊ณ  ์‹ถ์„ ๋•Œ ์ด ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€. ๋ฐ›๋Š” ์‚ฌ๋žŒ์˜ ์ฃผ์†Œ์™€ ๋ณด๋‚ผ ๊ธˆ์•ก์„ ์ž…๋ ฅํ•˜๋ฉด ๋! ์„ฑ๊ณตํ•˜๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•ด. ๐Ÿ“ค

function transfer(address recipient, uint256 amount) public returns (bool)

4๏ธโƒฃ allowance(address owner, address spender)

์—ญํ• : ์Šน์ธ๋œ ์ง€์ถœ ํ•œ๋„๋ฅผ ํ™•์ธํ•ด

A๊ฐ€ B์—๊ฒŒ ์ž์‹ ์˜ ํ† ํฐ์„ ๋Œ€์‹  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ๋ฝํ•œ ๊ธˆ์•ก์„ ํ™•์ธํ•˜๋Š” ํ•จ์ˆ˜์•ผ. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‚ด๊ฐ€ ๊ฑฐ๋ž˜์†Œ์— 100๊ฐœ ํ† ํฐ๊นŒ์ง€ ์‚ฌ์šฉ ๊ถŒํ•œ์„ ์คฌ๋‹ค๋ฉด, ์ด ํ•จ์ˆ˜๋กœ ๊ทธ ํ•œ๋„๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด. ๐Ÿ”

function allowance(address owner, address spender) public view returns (uint256)

5๏ธโƒฃ approve(address spender, uint256 amount)

์—ญํ• : ๋‹ค๋ฅธ ์ฃผ์†Œ์—๊ฒŒ ํ† ํฐ ์‚ฌ์šฉ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ด

์ด๊ฑด ์ข€ ํŠน๋ณ„ํ•œ ํ•จ์ˆ˜์•ผ! ๋‹ค๋ฅธ ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ๋‚˜ ์ฃผ์†Œ๊ฐ€ ๋‚ด ํ† ํฐ์„ ๋Œ€์‹  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ๋ฝํ•˜๋Š” ๊ฑฐ์ง€. DeFi ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•  ๋•Œ ์ž์ฃผ ๋ณด๊ฒŒ ๋  ๊ฑฐ์•ผ. ์Šน์ธ ํ›„์—๋Š” ๋ฐ˜๋“œ์‹œ Approval ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•ด! โœ…

function approve(address spender, uint256 amount) public returns (bool)

6๏ธโƒฃ transferFrom(address sender, address recipient, uint256 amount)

์—ญํ• : ์Šน์ธ๋ฐ›์€ ํ† ํฐ์„ ๋Œ€์‹  ์ „์†กํ•ด

approve๋กœ ๊ถŒํ•œ์„ ๋ฐ›์€ ํ›„ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜์•ผ. A๊ฐ€ B์—๊ฒŒ ๊ถŒํ•œ์„ ์คฌ๋‹ค๋ฉด, B๋Š” ์ด ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ A์˜ ํ† ํฐ์„ C์—๊ฒŒ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์–ด. DEX(ํƒˆ์ค‘์•™ํ™” ๊ฑฐ๋ž˜์†Œ)์—์„œ ํ† ํฐ ์Šค์™‘ํ•  ๋•Œ ํ•ต์‹ฌ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜์ง€! ๐Ÿ”„

function transferFrom(address sender, address recipient, uint256 amount) public returns (bool)

๐ŸŽจ ์„ ํƒ์  ํ•จ์ˆ˜ 3๊ฐœ (Nice-to-Have)

๐Ÿ’ก ์ฐธ๊ณ : ์ด ํ•จ์ˆ˜๋“ค์€ ํ•„์ˆ˜๋Š” ์•„๋‹ˆ์ง€๋งŒ, ๋Œ€๋ถ€๋ถ„์˜ ERC-20 ํ† ํฐ์ด ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์–ด. ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ค๊ฑฐ๋“ !

๐Ÿท๏ธ name()

ํ† ํฐ์˜ ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•ด. ์˜ˆ: "Ethereum", "Chainlink" ๊ฐ™์€ ๊ฑฐ!
function name() public view returns (string)

๐Ÿ”ค symbol()

ํ† ํฐ์˜ ์‹ฌ๋ณผ(ํ‹ฐ์ปค)์„ ๋ฐ˜ํ™˜ํ•ด. ์˜ˆ: "ETH", "LINK" ๊ฐ™์€ ์งง์€ ์•ฝ์ž!
function symbol() public view returns (string)

๐Ÿ”ข decimals()

ํ† ํฐ์˜ ์†Œ์ˆ˜์  ์ž๋ฆฟ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ด. ๋Œ€๋ถ€๋ถ„ 18์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ, USDC๋Š” 6์„ ์‚ฌ์šฉํ•ด. ์ด๊ฑด ํ† ํฐ์„ ์–ผ๋งˆ๋‚˜ ์ž˜๊ฒŒ ์ชผ๊ฐค ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ฑฐ์•ผ!
function decimals() public view returns (uint8)

๐ŸŽฏ ERC-20 ํ† ํฐ์˜ ์ž‘๋™ ์›๋ฆฌ

์ด์ œ ERC-20 ํ† ํฐ์ด ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ๋‹จ๊ณ„๋ณ„๋กœ ์‚ดํŽด๋ณผ๊ฒŒ! ๐Ÿ”ฌ

๐Ÿ“Š ํ† ํฐ ์ž”์•ก ๊ด€๋ฆฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜

ERC-20 ํ† ํฐ์€ ๋งคํ•‘(mapping)์ด๋ผ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐ ์ฃผ์†Œ์˜ ์ž”์•ก์„ ๊ด€๋ฆฌํ•ด. ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด, ๊ฑฐ๋Œ€ํ•œ ์žฅ๋ถ€์— "์ด ์ฃผ์†Œ๋Š” 100๊ฐœ, ์ € ์ฃผ์†Œ๋Š” 50๊ฐœ" ์ด๋Ÿฐ ์‹์œผ๋กœ ๊ธฐ๋กํ•˜๋Š” ๊ฑฐ์ง€! ๐Ÿ“–

์‹ค์ œ ์ฝ”๋“œ๋กœ ๋ณด๋ฉด ์ด๋ ‡๊ฒŒ ์ƒ๊ฒผ์–ด:

mapping(address => uint256) private _balances;

์ด ํ•œ ์ค„์ด ๋ชจ๋“  ์‚ฌ์šฉ์ž์˜ ํ† ํฐ ์ž”์•ก์„ ๊ด€๋ฆฌํ•˜๋Š” ํ•ต์‹ฌ์ด์•ผ! ๋ธ”๋ก์ฒด์ธ์— ์˜๊ตฌ์ ์œผ๋กœ ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ˆ„๊ตฌ๋„ ํ•จ๋ถ€๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†์ง€. ๐Ÿ”’

๐Ÿ”„ ํ† ํฐ ์ „์†ก ํ”„๋กœ์„ธ์Šค

ํ† ํฐ์„ ์ „์†กํ•  ๋•Œ ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€ ์•Œ์•„๋ณผ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด, Alice๊ฐ€ Bob์—๊ฒŒ 100๊ฐœ ํ† ํฐ์„ ๋ณด๋‚ธ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž:

Step 1: Alice๊ฐ€ transfer ํ•จ์ˆ˜ ํ˜ธ์ถœ ๐Ÿš€
token.transfer(bobAddress, 100)

Step 2: ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ๊ฐ€ Alice์˜ ์ž”์•ก ํ™•์ธ โœ…
โ€ข Alice ์ž”์•ก์ด 100๊ฐœ ์ด์ƒ์ธ๊ฐ€? โ†’ OK!
โ€ข 100๊ฐœ ๋ฏธ๋งŒ์ด๋ฉด? โ†’ ํŠธ๋žœ์žญ์…˜ ์‹คํŒจ! โŒ

Step 3: ์ž”์•ก ์—…๋ฐ์ดํŠธ ๐Ÿ’ฑ
โ€ข Alice ์ž”์•ก: 500 โ†’ 400 (100 ์ฐจ๊ฐ)
โ€ข Bob ์ž”์•ก: 200 โ†’ 300 (100 ์ถ”๊ฐ€)

Step 4: Transfer ์ด๋ฒคํŠธ ๋ฐœ์ƒ ๐Ÿ“ข
emit Transfer(alice, bob, 100)

Step 5: ๋ธ”๋ก์ฒด์ธ์— ์˜๊ตฌ ๊ธฐ๋ก โ›“๏ธ

๐ŸŽซ Approve & TransferFrom ํŒจํ„ด

์ด๊ฑด ERC-20์˜ ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜์•ผ! DeFi ์ƒํƒœ๊ณ„์˜ ํ•ต์‹ฌ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์ง€. ์‹ค์ œ ์‚ฌ์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๋ณด์ž:

๐ŸŒŸ ์‹ค์ „ ์˜ˆ์‹œ: Uniswap์—์„œ ํ† ํฐ ์Šค์™‘ํ•˜๊ธฐ

์ƒํ™ฉ: Alice๊ฐ€ Uniswap์—์„œ 100 DAI๋ฅผ ETH๋กœ ๊ตํ™˜ํ•˜๊ณ  ์‹ถ์–ด.

1๋‹จ๊ณ„ - Approve:
Alice๊ฐ€ ๋จผ์ € DAI ์ปจํŠธ๋ž™ํŠธ์— ์Šน์ธ์„ ํ•ด์ค˜์•ผ ํ•ด:
daiToken.approve(uniswapAddress, 100)
โ†’ "Uniswap์•„, ๋‚ด DAI 100๊ฐœ๊นŒ์ง€ ์‚ฌ์šฉํ•ด๋„ ๋ผ!" ๐Ÿค

2๋‹จ๊ณ„ - Swap ์‹คํ–‰:
Alice๊ฐ€ Uniswap์˜ swap ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด:
uniswap.swap(daiAddress, ethAddress, 100)

3๋‹จ๊ณ„ - TransferFrom:
Uniswap ์ปจํŠธ๋ž™ํŠธ๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์‹คํ–‰:
daiToken.transferFrom(alice, uniswapPool, 100)
โ†’ Alice์˜ DAI๊ฐ€ Uniswap ํ’€๋กœ ์ด๋™! ๐Ÿ’ธ

4๋‹จ๊ณ„ - ETH ์ „์†ก:
Uniswap์ด Alice์—๊ฒŒ ํ•ด๋‹นํ•˜๋Š” ETH๋ฅผ ๋ณด๋‚ด์ค˜! ๐ŸŽ‰

โš ๏ธ ๋ณด์•ˆ ์ฃผ์˜์‚ฌํ•ญ:
approve ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์ปจํŠธ๋ž™ํŠธ์—๋งŒ ๊ถŒํ•œ์„ ์ค˜์•ผ ํ•ด! ์•…์˜์ ์ธ ์ปจํŠธ๋ž™ํŠธ์— approveํ•˜๋ฉด ํ† ํฐ์„ ๋ชจ๋‘ ์žƒ์„ ์ˆ˜ ์žˆ๊ฑฐ๋“ . ์‚ฌ์šฉ ํ›„์—๋Š” allowance๋ฅผ 0์œผ๋กœ ์žฌ์„ค์ •ํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์€ ์Šต๊ด€์ด์•ผ! ๐Ÿ›ก๏ธ

ํ† ํฐ ์ „์†ก ํ”„๋กœ์„ธ์Šค Alice 500 ํ† ํฐ Bob 200 ํ† ํฐ transfer(Bob, 100) ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ ์ฒ˜๋ฆฌ ๊ณผ์ • 1 ์ž”์•ก ํ™•์ธ: Alice โ‰ฅ 100? โœ“ 2 Alice ์ž”์•ก ์ฐจ๊ฐ: 500 โ†’ 400 3 Bob ์ž”์•ก ์ฆ๊ฐ€: 200 โ†’ 300 4 Transfer ์ด๋ฒคํŠธ ๋ฐœ์ƒ โœ“ ํŠธ๋žœ์žญ์…˜ ์„ฑ๊ณต! ๋ธ”๋ก์ฒด์ธ์— ์˜๊ตฌ ๊ธฐ๋ก

๐Ÿ’ป ์‹ค์ „ ERC-20 ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ ์ฝ”๋“œ

์ด๋ก ๋งŒ ๋ฐฐ์šฐ๋ฉด ์žฌ๋ฏธ์—†์ง€! ์‹ค์ œ๋กœ ERC-20 ํ† ํฐ์„ ๋งŒ๋“œ๋Š” ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž. Solidity๋กœ ์ž‘์„ฑ๋œ ๊ธฐ๋ณธ์ ์ธ ERC-20 ์ปจํŠธ๋ž™ํŠธ์•ผ. ๐Ÿ› ๏ธ

๐Ÿ“ ๊ธฐ๋ณธ ERC-20 ๊ตฌํ˜„ ์˜ˆ์ œ

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract MyToken {
    // ํ† ํฐ ๊ธฐ๋ณธ ์ •๋ณด
    string public name = "My Awesome Token";
    string public symbol = "MAT";
    uint8 public decimals = 18;
    uint256 private _totalSupply;
    
    // ์ž”์•ก ์ €์žฅ ๋งคํ•‘
    mapping(address => uint256) private _balances;
    
    // ์Šน์ธ ์ €์žฅ ๋งคํ•‘ (owner => spender => amount)
    mapping(address => mapping(address => uint256)) private _allowances;
    
    // ์ด๋ฒคํŠธ ์ •์˜
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
    
    // ์ƒ์„ฑ์ž: ์ดˆ๊ธฐ ๊ณต๊ธ‰๋Ÿ‰ ์„ค์ •
    constructor(uint256 initialSupply) {
        _totalSupply = initialSupply * 10**decimals;
        _balances[msg.sender] = _totalSupply;
        emit Transfer(address(0), msg.sender, _totalSupply);
    }
    
    // ์ด ๊ณต๊ธ‰๋Ÿ‰ ๋ฐ˜ํ™˜
    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }
    
    // ํŠน์ • ์ฃผ์†Œ์˜ ์ž”์•ก ๋ฐ˜ํ™˜
    function balanceOf(address account) public view returns (uint256) {
        return _balances[account];
    }
    
    // ํ† ํฐ ์ „์†ก
    function transfer(address recipient, uint256 amount) public returns (bool) {
        require(recipient != address(0), "์ „์†ก ๋ถˆ๊ฐ€: 0 ์ฃผ์†Œ");
        require(_balances[msg.sender] >= amount, "์ž”์•ก ๋ถ€์กฑ");
        
        _balances[msg.sender] -= amount;
        _balances[recipient] += amount;
        
        emit Transfer(msg.sender, recipient, amount);
        return true;
    }
    
    // ์Šน์ธ๋œ ๊ธˆ์•ก ํ™•์ธ
    function allowance(address owner, address spender) public view returns (uint256) {
        return _allowances[owner][spender];
    }
    
    // ์ง€์ถœ ์Šน์ธ
    function approve(address spender, uint256 amount) public returns (bool) {
        require(spender != address(0), "์Šน์ธ ๋ถˆ๊ฐ€: 0 ์ฃผ์†Œ");
        
        _allowances[msg.sender][spender] = amount;
        
        emit Approval(msg.sender, spender, amount);
        return true;
    }
    
    // ์Šน์ธ๋œ ํ† ํฐ ์ „์†ก
    function transferFrom(address sender, address recipient, uint256 amount) 
        public returns (bool) {
        require(sender != address(0), "์ „์†ก ๋ถˆ๊ฐ€: 0 ์ฃผ์†Œ");
        require(recipient != address(0), "์ „์†ก ๋ถˆ๊ฐ€: 0 ์ฃผ์†Œ");
        require(_balances[sender] >= amount, "์ž”์•ก ๋ถ€์กฑ");
        require(_allowances[sender][msg.sender] >= amount, "์Šน์ธ ํ•œ๋„ ์ดˆ๊ณผ");
        
        _balances[sender] -= amount;
        _balances[recipient] += amount;
        _allowances[sender][msg.sender] -= amount;
        
        emit Transfer(sender, recipient, amount);
        return true;
    }
}

๐Ÿ’ก ์ฝ”๋“œ ์„ค๋ช…:

โ€ข ๋งคํ•‘ ๊ตฌ์กฐ: _balances๋Š” ๊ฐ ์ฃผ์†Œ์˜ ์ž”์•ก์„, _allowances๋Š” ์Šน์ธ ๊ด€๊ณ„๋ฅผ ์ €์žฅํ•ด
โ€ข require ๋ฌธ: ์กฐ๊ฑด์„ ๊ฒ€์ฆํ•˜๊ณ , ์‹คํŒจํ•˜๋ฉด ํŠธ๋žœ์žญ์…˜์„ ๋˜๋Œ๋ ค(revert)
โ€ข ์ด๋ฒคํŠธ: Transfer์™€ Approval ์ด๋ฒคํŠธ๋กœ ๋ชจ๋“  ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๊ธฐ๋กํ•ด
โ€ข decimals: 18๋กœ ์„ค์ •ํ•˜๋ฉด 1 ํ† ํฐ = 10^18 ์ตœ์†Œ ๋‹จ์œ„๊ฐ€ ๋ผ

๐Ÿ”ฅ OpenZeppelin์„ ํ™œ์šฉํ•œ ์•ˆ์ „ํ•œ ๊ตฌํ˜„

์‹ค์ œ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” ์ง์ ‘ ๊ตฌํ˜„ํ•˜๊ธฐ๋ณด๋‹ค OpenZeppelin ๊ฐ™์€ ๊ฒ€์ฆ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ํ›จ์”ฌ ์•ˆ์ „ํ•ด! ์ด๋ฏธ ์ˆ˜๋งŽ์€ ๊ฐ์‚ฌ๋ฅผ ๊ฑฐ์ณค๊ณ , ๋ณด์•ˆ ์ทจ์•ฝ์ ์ด ํŒจ์น˜๋˜์–ด ์žˆ๊ฑฐ๋“ . ๐Ÿ›ก๏ธ

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract MySecureToken is ERC20, Ownable {
    constructor(uint256 initialSupply) ERC20("My Secure Token", "MST") {
        _mint(msg.sender, initialSupply * 10**decimals());
    }
    
    // ์†Œ์œ ์ž๋งŒ ์ถ”๊ฐ€ ๋ฐœํ–‰ ๊ฐ€๋Šฅ
    function mint(address to, uint256 amount) public onlyOwner {
        _mint(to, amount);
    }
    
    // ํ† ํฐ ์†Œ๊ฐ ๊ธฐ๋Šฅ
    function burn(uint256 amount) public {
        _burn(msg.sender, amount);
    }
}

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋‹จ ๋ช‡ ์ค„๋กœ ์•ˆ์ „ํ•˜๊ณ  ๊ธฐ๋Šฅ์ด ํ’๋ถ€ํ•œ ERC-20 ํ† ํฐ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด! OpenZeppelin์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ๋„ ์ œ๊ณตํ•ด:

โ€ข Pausable: ๊ธด๊ธ‰ ์ƒํ™ฉ ์‹œ ํ† ํฐ ์ „์†ก ์ผ์‹œ ์ค‘์ง€ โธ๏ธ
โ€ข Burnable: ํ† ํฐ ์†Œ๊ฐ ๊ธฐ๋Šฅ ๐Ÿ”ฅ
โ€ข Snapshot: ํŠน์ • ์‹œ์ ์˜ ์ž”์•ก ๊ธฐ๋ก ๐Ÿ“ธ
โ€ข Permit: ๊ฐ€์Šค๋น„ ์—†๋Š” ์Šน์ธ(EIP-2612) โ›ฝ

๐ŸŒ ERC-20 ํ† ํฐ์˜ ์‹ค์ œ ํ™œ์šฉ ์‚ฌ๋ก€

ERC-20 ํ‘œ์ค€์€ ๋‹จ์ˆœํ•œ ๊ธฐ์ˆ  ๋ช…์„ธ๊ฐ€ ์•„๋‹ˆ์•ผ. ์‹ค์ œ๋กœ ์ˆ˜์‹ญ์–ต ๋‹ฌ๋Ÿฌ ๊ทœ๋ชจ์˜ ์ƒํƒœ๊ณ„๋ฅผ ์ง€ํƒฑํ•˜๊ณ  ์žˆ์ง€! ๋Œ€ํ‘œ์ ์ธ ํ™œ์šฉ ์‚ฌ๋ก€๋“ค์„ ์‚ดํŽด๋ณด์ž. ๐Ÿš€

๐Ÿ’ฐ ์ฃผ์š” ERC-20 ํ† ํฐ๋“ค

ํ† ํฐ ์‹ฌ๋ณผ ์šฉ๋„ ์‹œ๊ฐ€์ด์•ก ์ˆœ์œ„
Tether USDT ์Šคํ…Œ์ด๋ธ”์ฝ”์ธ (1 USDT = 1 USD) Top 3
USD Coin USDC ๊ทœ์ œ ์ค€์ˆ˜ ์Šคํ…Œ์ด๋ธ”์ฝ”์ธ Top 10
Chainlink LINK ์˜ค๋ผํด ๋„คํŠธ์›Œํฌ ํ† ํฐ Top 20
Uniswap UNI DEX ๊ฑฐ๋ฒ„๋„Œ์Šค ํ† ํฐ Top 30
Shiba Inu SHIB ๋ฐˆ ์ฝ”์ธ Top 20

๐ŸŽฏ ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ํ™œ์šฉ

1. ์Šคํ…Œ์ด๋ธ”์ฝ”์ธ (Stablecoins) ๐Ÿ’ต

๊ฐ€๊ฒฉ ๋ณ€๋™์„ฑ์„ ์ตœ์†Œํ™”ํ•œ ํ† ํฐ๋“ค์ด์•ผ. ๋ฒ•์ •ํ™”ํ๋‚˜ ์ž์‚ฐ์— ํŽ˜๊น…๋˜์–ด ์žˆ์–ด์„œ ๊ฒฐ์ œ ์ˆ˜๋‹จ์œผ๋กœ ๋งŽ์ด ์‚ฌ์šฉ๋ผ.

์˜ˆ์‹œ:
โ€ข USDT, USDC: ๋‹ฌ๋Ÿฌ ํŽ˜๊น…
โ€ข DAI: ์•”ํ˜ธํ™”ํ ๋‹ด๋ณด ๊ธฐ๋ฐ˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์Šคํ…Œ์ด๋ธ”์ฝ”์ธ
โ€ข PAXG: ๊ธˆ ๊ฐ€๊ฒฉ์— ์—ฐ๋™

ํ™œ์šฉ: ๊ตญ์ œ ์†ก๊ธˆ, DeFi ๊ฑฐ๋ž˜, ๊ฐ€์น˜ ์ €์žฅ ๐Ÿ’ฐ

2. ๊ฑฐ๋ฒ„๋„Œ์Šค ํ† ํฐ (Governance Tokens) ๐Ÿ—ณ๏ธ

ํ”„๋กœํ† ์ฝœ์˜ ์˜์‚ฌ๊ฒฐ์ •์— ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ๋Š” ํˆฌํ‘œ๊ถŒ์„ ์ œ๊ณตํ•˜๋Š” ํ† ํฐ์ด์•ผ.

์˜ˆ์‹œ:
โ€ข UNI (Uniswap): DEX ์ˆ˜์ˆ˜๋ฃŒ์œจ, ์ƒˆ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ๋“ฑ ํˆฌํ‘œ
โ€ข AAVE: ๋Œ€์ถœ ํ”„๋กœํ† ์ฝœ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐ์ •
โ€ข COMP (Compound): ์ด์ž์œจ ๋ชจ๋ธ ๋ณ€๊ฒฝ ๊ฒฐ์ •

ํ™œ์šฉ: ํƒˆ์ค‘์•™ํ™” ์กฐ์ง(DAO) ์šด์˜, ํ”„๋กœํ† ์ฝœ ์—…๊ทธ๋ ˆ์ด๋“œ ๊ฒฐ์ • ๐Ÿ›๏ธ

3. ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ† ํฐ (Utility Tokens) ๐Ÿ”ง

ํŠน์ • ํ”Œ๋žซํผ์ด๋‚˜ ์„œ๋น„์Šค ๋‚ด์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํ† ํฐ์ด์•ผ.

์˜ˆ์‹œ:
โ€ข LINK: Chainlink ์˜ค๋ผํด ์„œ๋น„์Šค ์ด์šฉ๋ฃŒ
โ€ข BAT: Brave ๋ธŒ๋ผ์šฐ์ € ๊ด‘๊ณ  ๋ณด์ƒ
โ€ข MANA: Decentraland ๊ฐ€์ƒ์„ธ๊ณ„ ๋‚ด ๊ฑฐ๋ž˜

ํ™œ์šฉ: ์„œ๋น„์Šค ์ด์šฉ๋ฃŒ ๊ฒฐ์ œ, ์ƒํƒœ๊ณ„ ์ธ์„ผํ‹ฐ๋ธŒ ๐ŸŽฎ

4. ์ฆ๊ถŒํ˜• ํ† ํฐ (Security Tokens) ๐Ÿ“œ

์‹ค์ œ ์ž์‚ฐ์˜ ์†Œ์œ ๊ถŒ์„ ๋‚˜ํƒ€๋‚ด๋Š” ํ† ํฐ์ด์•ผ. ๊ทœ์ œ๋ฅผ ๋ฐ›๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„.

์˜ˆ์‹œ:
โ€ข ๋ถ€๋™์‚ฐ ์ง€๋ถ„ ํ† ํฐํ™”
โ€ข ๊ธฐ์—… ์ฃผ์‹ ํ† ํฐ
โ€ข ์ฑ„๊ถŒ ํ† ํฐ

ํ™œ์šฉ: ์ž์‚ฐ์˜ ์œ ๋™์„ฑ ์ฆ๊ฐ€, ์†Œ์•ก ํˆฌ์ž ๊ฐ€๋Šฅ ๐Ÿข

5. ๋ฆฌ์›Œ๋“œ ํ† ํฐ (Reward Tokens) ๐ŸŽ

์‚ฌ์šฉ์ž ํ™œ๋™์— ๋Œ€ํ•œ ๋ณด์ƒ์œผ๋กœ ์ง€๊ธ‰๋˜๋Š” ํ† ํฐ์ด์•ผ.

์˜ˆ์‹œ:
โ€ข ์œ ๋™์„ฑ ๊ณต๊ธ‰ ๋ณด์ƒ (Liquidity Mining)
โ€ข ์Šคํ…Œ์ดํ‚น ๋ณด์ƒ
โ€ข ํ”Œ๋ ˆ์ดํˆฌ์–ธ(P2E) ๊ฒŒ์ž„ ๋ณด์ƒ

ํ™œ์šฉ: ์‚ฌ์šฉ์ž ์ฐธ์—ฌ ์œ ๋„, ๋„คํŠธ์›Œํฌ ํšจ๊ณผ ์ฆ๋Œ€ ๐ŸŒŸ

๐Ÿ”ฅ DeFi์—์„œ์˜ ERC-20 ํ™œ์šฉ

์‹ค์ „ ์‹œ๋‚˜๋ฆฌ์˜ค: DeFi ์ˆ˜์ต ๋†์‚ฌ(Yield Farming)

1๏ธโƒฃ ์œ ๋™์„ฑ ๊ณต๊ธ‰:
Alice๊ฐ€ Uniswap์— ETH-USDC ํŽ˜์–ด๋กœ ์œ ๋™์„ฑ์„ ๊ณต๊ธ‰ํ•ด. ์ด๋•Œ ๋‘ ํ† ํฐ ๋ชจ๋‘ ERC-20 ํ‘œ์ค€์„ ๋”ฐ๋ผ์„œ approve โ†’ transferFrom ํŒจํ„ด์œผ๋กœ ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ์— ์˜ˆ์น˜๋ผ.

2๏ธโƒฃ LP ํ† ํฐ ์ˆ˜๋ น:
์œ ๋™์„ฑ ๊ณต๊ธ‰์˜ ์ฆ๊ฑฐ๋กœ LP(Liquidity Provider) ํ† ํฐ์„ ๋ฐ›์•„. ์ด๊ฒƒ๋„ ERC-20์ด์•ผ! ๋‚˜์ค‘์— ์ด ํ† ํฐ์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์›๊ธˆ๊ณผ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ๋Œ๋ ค๋ฐ›์„ ์ˆ˜ ์žˆ์ง€.

3๏ธโƒฃ ์Šคํ…Œ์ดํ‚น:
๋ฐ›์€ LP ํ† ํฐ์„ ๋‹ค์‹œ ๋‹ค๋ฅธ ํ”„๋กœํ† ์ฝœ์— ์Šคํ…Œ์ดํ‚นํ•ด์„œ ์ถ”๊ฐ€ ๋ณด์ƒ์„ ๋ฐ›์•„. ์ด๊ฒƒ๋„ ERC-20 approve ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•ด!

4๏ธโƒฃ ๋ณด์ƒ ์ˆ˜๋ น:
๊ฑฐ๋ฒ„๋„Œ์Šค ํ† ํฐ์ด๋‚˜ ๋ฆฌ์›Œ๋“œ ํ† ํฐ์„ ERC-20 ํ˜•ํƒœ๋กœ ๋ฐ›์•„. ์ด๊ฑธ ๋‹ค์‹œ ์Šค์™‘ํ•˜๊ฑฐ๋‚˜ ์žฌํˆฌ์žํ•  ์ˆ˜ ์žˆ์–ด.

์ด ๋ชจ๋“  ๊ณผ์ •์ด ERC-20 ํ‘œ์ค€ ๋•๋ถ„์— ๋งค๋„๋Ÿฝ๊ฒŒ ์—ฐ๊ฒฐ๋ผ! ๐ŸŽฏ

ERC-20 ํ† ํฐ ์ƒํƒœ๊ณ„ ERC-20 ํ‘œ์ค€ ์Šคํ…Œ์ด๋ธ”์ฝ”์ธ USDT, USDC DAI ๊ฑฐ๋ฒ„๋„Œ์Šค UNI, AAVE COMP ์œ ํ‹ธ๋ฆฌํ‹ฐ LINK, BAT MANA ๋ฆฌ์›Œ๋“œ LP ํ† ํฐ ์Šคํ…Œ์ดํ‚น ๋ณด์ƒ ํ†ตํ•ฉ ์ƒํƒœ๊ณ„ ์žฅ์  ๋ชจ๋“  ์ง€๊ฐ‘ยท๊ฑฐ๋ž˜์†ŒยทDApp์—์„œ ํ˜ธํ™˜ | ๊ฐœ๋ฐœ์ž ์นœํ™”์  | ๋ณด์•ˆ ๊ฐ์‚ฌ ์šฉ์ด ์œ ๋™์„ฑ ๊ณต์œ  | ์ปดํฌ์ €๋นŒ๋ฆฌํ‹ฐ(์กฐํ•ฉ ๊ฐ€๋Šฅ์„ฑ) | ๋„คํŠธ์›Œํฌ ํšจ๊ณผ

โš ๏ธ ERC-20์˜ ํ•œ๊ณ„์™€ ๋ฌธ์ œ์ 

ERC-20์ด ์™„๋ฒฝํ•œ ๊ฑด ์•„๋‹ˆ์•ผ. ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋‹ค ๋ณด๋ฉด ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ์ ์ด ์žˆ์–ด. ์ด๊ฑธ ์•Œ์•„์•ผ ๋” ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€! ๐Ÿ”

๐Ÿšจ ์ฃผ์š” ๋ฌธ์ œ์ ๋“ค

1. ํ† ํฐ ์†์‹ค ๋ฌธ์ œ (Lost Tokens) ๐Ÿ’ธ

๋ฌธ์ œ ์ƒํ™ฉ:
์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ˆ˜๋กœ ํ† ํฐ์„ ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ ์ฃผ์†Œ๋กœ ์ง์ ‘ ์ „์†กํ•˜๋ฉด ์˜๊ตฌ์ ์œผ๋กœ ์žƒ์–ด๋ฒ„๋ ค! ๐Ÿ˜ฑ

์™œ ๋ฐœ์ƒํ•˜๋‚˜?
ERC-20์˜ transfer ํ•จ์ˆ˜๋Š” ๋ฐ›๋Š” ์ฃผ์†Œ๊ฐ€ ์ปจํŠธ๋ž™ํŠธ์ธ์ง€ ์ผ๋ฐ˜ ์ฃผ์†Œ์ธ์ง€ ๊ตฌ๋ถ„ํ•˜์ง€ ๋ชปํ•ด. ์ปจํŠธ๋ž™ํŠธ๊ฐ€ ํ† ํฐ์„ ๋ฐ›์„ ์ค€๋น„๊ฐ€ ์•ˆ ๋˜์–ด ์žˆ์œผ๋ฉด ๊ทธ๋ƒฅ ๊ฐ‡ํ˜€๋ฒ„๋ฆฌ๋Š” ๊ฑฐ์ง€.

์‹ค์ œ ํ”ผํ•ด ๊ทœ๋ชจ:
์ˆ˜๋ฐฑ๋งŒ ๋‹ฌ๋Ÿฌ ์ƒ๋‹น์˜ ํ† ํฐ์ด ์ด๋Ÿฐ ์‹์œผ๋กœ ์†์‹ค๋์–ด. ํŠนํžˆ ์ดˆ๋ณด์ž๋“ค์ด ๋งŽ์ด ๋‹นํ•˜๋Š” ์‹ค์ˆ˜์•ผ. ๐Ÿ˜ข

ํ•ด๊ฒฐ์ฑ…:
ERC-223, ERC-777 ๊ฐ™์€ ๊ฐœ์„ ๋œ ํ‘œ์ค€์ด ๋‚˜์™”์ง€๋งŒ, ERC-20์˜ ๋„คํŠธ์›Œํฌ ํšจ๊ณผ ๋•Œ๋ฌธ์— ๋„๋ฆฌ ์ฑ„ํƒ๋˜์ง€๋Š” ๋ชปํ–ˆ์–ด.

2. Approve ๊ณต๊ฒฉ ๋ฒกํ„ฐ ๐ŸŽฏ

๋ฌธ์ œ ์ƒํ™ฉ:
approve ํ•จ์ˆ˜์— ๋ณด์•ˆ ์ทจ์•ฝ์ ์ด ์žˆ์–ด. ํŠนํžˆ ์Šน์ธ ๊ธˆ์•ก์„ ๋ณ€๊ฒฝํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์–ด!

๊ณต๊ฒฉ ์‹œ๋‚˜๋ฆฌ์˜ค:
1. Alice๊ฐ€ Bob์—๊ฒŒ 100 ํ† ํฐ ์Šน์ธ
2. Alice๊ฐ€ ์Šน์ธ์„ 50์œผ๋กœ ์ค„์ด๋ ค๊ณ  ํŠธ๋žœ์žญ์…˜ ์ „์†ก
3. Bob์ด ์ด๊ฑธ ๊ฐ์ง€ํ•˜๊ณ  ๋จผ์ € 100 ํ† ํฐ์„ ์‚ฌ์šฉ
4. Alice์˜ ํŠธ๋žœ์žญ์…˜์ด ์ฒ˜๋ฆฌ๋˜์–ด ๋‹ค์‹œ 50 ์Šน์ธ
5. Bob์ด ๋˜ 50 ํ† ํฐ ์‚ฌ์šฉ โ†’ ์ด 150 ํ† ํฐ ์‚ฌ์šฉ! ๐Ÿ˜ˆ

ํ•ด๊ฒฐ์ฑ…:
โ€ข ์Šน์ธ์„ ๋ณ€๊ฒฝํ•  ๋•Œ๋Š” ๋จผ์ € 0์œผ๋กœ ์„ค์ •ํ•œ ํ›„ ์ƒˆ ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝ
โ€ข increaseAllowance, decreaseAllowance ํ•จ์ˆ˜ ์‚ฌ์šฉ (OpenZeppelin)
โ€ข EIP-2612 (Permit) ์‚ฌ์šฉ

3. ๊ฐ€์Šค๋น„ ๋ฌธ์ œ โ›ฝ

๋ฌธ์ œ ์ƒํ™ฉ:
ํ† ํฐ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํ•ญ์ƒ ETH๊ฐ€ ํ•„์š”ํ•ด. approve + transferFrom ํŒจํ„ด์€ ๋‘ ๋ฒˆ์˜ ํŠธ๋žœ์žญ์…˜์ด ํ•„์š”ํ•ด์„œ ๊ฐ€์Šค๋น„๊ฐ€ ๋‘ ๋ฐฐ์•ผ!

์‹ค์ œ ์˜ํ–ฅ:
โ€ข ๋„คํŠธ์›Œํฌ ํ˜ผ์žก ์‹œ ์ˆ˜์‹ญ ๋‹ฌ๋Ÿฌ์˜ ๊ฐ€์Šค๋น„
โ€ข ์†Œ์•ก ๊ฑฐ๋ž˜๊ฐ€ ๋น„๊ฒฝ์ œ์ 
โ€ข ์‹ ๊ทœ ์‚ฌ์šฉ์ž ์ง„์ž… ์žฅ๋ฒฝ

ํ•ด๊ฒฐ์ฑ…:
โ€ข Layer 2 ์†”๋ฃจ์…˜ (Polygon, Arbitrum, Optimism)
โ€ข ๊ฐ€์Šค ํ† ํฐ ์‚ฌ์šฉ
โ€ข ๋ฉ”ํƒ€ ํŠธ๋žœ์žญ์…˜ (Gasless Transaction)

4. ์ด๋ฒคํŠธ ํ‘œ์ค€ํ™” ๋ถ€์กฑ ๐Ÿ“ข

๋ฌธ์ œ ์ƒํ™ฉ:
Transfer์™€ Approval ์ด๋ฒคํŠธ๋งŒ ํ‘œ์ค€ํ™”๋˜์–ด ์žˆ๊ณ , ๋‹ค๋ฅธ ์ค‘์š”ํ•œ ์ด๋ฒคํŠธ๋“ค์€ ๊ฐ์ž ๊ตฌํ˜„ํ•ด์•ผ ํ•ด.

์‹ค์ œ ๋ฌธ์ œ:
โ€ข Mint, Burn ์ด๋ฒคํŠธ๊ฐ€ ํ‘œ์ค€ํ™”๋˜์ง€ ์•Š์Œ
โ€ข ์˜คํ”„์ฒด์ธ ์ธ๋ฑ์‹ฑ์ด ์–ด๋ ค์›€
โ€ข ํ”„๋ก ํŠธ์—”๋“œ ํ†ตํ•ฉ ๋ณต์žก๋„ ์ฆ๊ฐ€

๐Ÿ›ก๏ธ ๋ณด์•ˆ ๋ฒ ์ŠคํŠธ ํ”„๋ž™ํ‹ฐ์Šค

ERC-20 ํ† ํฐ์„ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ํŒ๋“ค์ด์•ผ! ๊ฐœ๋ฐœ์ž๋“  ์‚ฌ์šฉ์ž๋“  ๊ผญ ์•Œ์•„๋‘ฌ์•ผ ํ•ด. ๐Ÿ’ก

๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ํŒ:

1๏ธโƒฃ OpenZeppelin ์‚ฌ์šฉ:
์ง์ ‘ ๊ตฌํ˜„ํ•˜์ง€ ๋ง๊ณ  ๊ฒ€์ฆ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด! ์ˆ˜๋งŽ์€ ๊ฐ์‚ฌ๋ฅผ ๊ฑฐ์ณค๊ณ  ์ง€์†์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ๋ผ.

2๏ธโƒฃ SafeMath ์‚ฌ์šฉ:
Solidity 0.8.0 ์ด์ „ ๋ฒ„์ „์—์„œ๋Š” ํ•„์ˆ˜! ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ/์–ธ๋”ํ”Œ๋กœ์šฐ ๋ฐฉ์ง€.

3๏ธโƒฃ Reentrancy Guard:
์™ธ๋ถ€ ํ˜ธ์ถœ์ด ์žˆ๋Š” ํ•จ์ˆ˜์—๋Š” ๋ฐ˜๋“œ์‹œ ์žฌ์ง„์ž… ๊ณต๊ฒฉ ๋ฐฉ์–ด ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด.

4๏ธโƒฃ ์ „๋ฌธ ๊ฐ์‚ฌ ๋ฐ›๊ธฐ:
๋ฉ”์ธ๋„ท ๋ฐฐํฌ ์ „์— CertiK, OpenZeppelin, Trail of Bits ๊ฐ™์€ ์ „๋ฌธ ์—…์ฒด์˜ ๊ฐ์‚ฌ๋ฅผ ๋ฐ›์•„.

5๏ธโƒฃ ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ 100%:
๋ชจ๋“  ํ•จ์ˆ˜์™€ ์—ฃ์ง€ ์ผ€์ด์Šค๋ฅผ ํ…Œ์ŠคํŠธํ•ด. Hardhat, Foundry ๊ฐ™์€ ํ”„๋ ˆ์ž„์›Œํฌ ํ™œ์šฉ!

์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•œ ํŒ:

1๏ธโƒฃ ์ฃผ์†Œ ํ™•์ธ:
ํ† ํฐ ์ „์†ก ์ „์— ๋ฐ›๋Š” ์ฃผ์†Œ๋ฅผ ์„ธ ๋ฒˆ ํ™•์ธํ•ด! ๋ธ”๋ก์ฒด์ธ์€ ๋˜๋Œ๋ฆด ์ˆ˜ ์—†์–ด. โš ๏ธ

2๏ธโƒฃ Approve ์ตœ์†Œํ™”:
ํ•„์š”ํ•œ ๋งŒํผ๋งŒ ์Šน์ธํ•˜๊ณ , ์‚ฌ์šฉ ํ›„์—๋Š” ์ทจ์†Œํ•ด. ๋ฌดํ•œ ์Šน์ธ์€ ์œ„ํ—˜ํ•ด!

3๏ธโƒฃ ํ”ผ์‹ฑ ์ฃผ์˜:
๊ฐ€์งœ ํ† ํฐ ์ปจํŠธ๋ž™ํŠธ ์ฃผ์†Œ๋ฅผ ์กฐ์‹ฌํ•ด. ๊ณต์‹ ์›น์‚ฌ์ดํŠธ์—์„œ ํ™•์ธํ•˜๊ณ , Etherscan์—์„œ ๊ฒ€์ฆ๋œ ์ปจํŠธ๋ž™ํŠธ์ธ์ง€ ์ฒดํฌ!

4๏ธโƒฃ ํ•˜๋“œ์›จ์–ด ์ง€๊ฐ‘ ์‚ฌ์šฉ:
ํฐ ๊ธˆ์•ก์€ Ledger, Trezor ๊ฐ™์€ ํ•˜๋“œ์›จ์–ด ์ง€๊ฐ‘์— ๋ณด๊ด€ํ•ด. ๐Ÿ”

5๏ธโƒฃ ํ…Œ์ŠคํŠธ๋„ท ๋จผ์ €:
์ƒˆ๋กœ์šด DApp์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ํ…Œ์ŠคํŠธ๋„ท์—์„œ ๋จผ์ € ์‹œ๋„ํ•ด๋ด!

๐Ÿš€ ERC-20์˜ ๋ฐœ์ „: ๊ฐœ์„ ๋œ ํ‘œ์ค€๋“ค

ERC-20์˜ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๊ฐœ์„ ๋œ ํ‘œ์ค€๋“ค์ด ์ œ์•ˆ๋์–ด. ๊ฐ๊ฐ์˜ ํŠน์ง•์„ ์‚ดํŽด๋ณด์ž! ๐Ÿ”ฌ

๐Ÿ“Š ERC-20 vs ๊ฐœ์„  ํ‘œ์ค€ ๋น„๊ต

ํ‘œ์ค€ ์ฃผ์š” ๊ฐœ์„ ์‚ฌํ•ญ ์žฅ์  ๋‹จ์ 
ERC-223 ์ปจํŠธ๋ž™ํŠธ๋กœ ์ „์†ก ์‹œ ํ† ํฐ ์†์‹ค ๋ฐฉ์ง€ ์•ˆ์ „ํ•œ ์ „์†ก, ๊ฐ€์Šค๋น„ ์ ˆ๊ฐ ๋‚ฎ์€ ์ฑ„ํƒ๋ฅ , ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ
ERC-777 ํ›…(Hook) ๋ฉ”์ปค๋‹ˆ์ฆ˜, ์˜คํผ๋ ˆ์ดํ„ฐ ๊ฐœ๋… ์œ ์—ฐ์„ฑ ์ฆ๊ฐ€, ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ๊ฐœ์„  ๋ณต์žก๋„ ์ฆ๊ฐ€, ์žฌ์ง„์ž… ๊ณต๊ฒฉ ์œ„ํ—˜
ERC-1155 ๋‹ค์ค‘ ํ† ํฐ ํ‘œ์ค€ (FT + NFT) ๊ฐ€์Šค ํšจ์œจ์ , ๋ฐฐ์น˜ ์ „์†ก ์ฃผ๋กœ ๊ฒŒ์ž„/NFT์šฉ, ๋ณต์žกํ•œ ๊ตฌ์กฐ
EIP-2612 Permit ํ•จ์ˆ˜ (๊ฐ€์Šค๋ฆฌ์Šค ์Šน์ธ) ๊ฐ€์Šค๋น„ ์ ˆ๊ฐ, UX ๊ฐœ์„  ์ถ”๊ฐ€ ๊ตฌํ˜„ ํ•„์š”, ์„œ๋ช… ๋ณต์žก๋„

๐Ÿ”ฎ ERC-777: ์ฐจ์„ธ๋Œ€ ํ† ํฐ ํ‘œ์ค€

ERC-777์€ ERC-20์˜ ์ƒ์œ„ ํ˜ธํ™˜ ํ‘œ์ค€์ด์•ผ. ๊ธฐ์กด ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ํฌํ•จํ•˜๋ฉด์„œ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ–ˆ์ง€! ๐ŸŽฏ

ํ•ต์‹ฌ ๊ธฐ๋Šฅ:

1๏ธโƒฃ ํ›…(Hook) ๋ฉ”์ปค๋‹ˆ์ฆ˜:
ํ† ํฐ์„ ๋ณด๋‚ด๊ฑฐ๋‚˜ ๋ฐ›์„ ๋•Œ ์ž๋™์œผ๋กœ ํŠน์ • ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋ผ. ์ด๋ฅผ ํ†ตํ•ด ํ† ํฐ ์ „์†ก ์‹œ ์ถ”๊ฐ€ ๋กœ์ง์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์–ด!

2๏ธโƒฃ ์˜คํผ๋ ˆ์ดํ„ฐ(Operator):
approve/transferFrom ๋Œ€์‹  ๋” ์œ ์—ฐํ•œ ๊ถŒํ•œ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ. ์—ฌ๋Ÿฌ ์ฃผ์†Œ์— ๋™์‹œ์— ๊ถŒํ•œ์„ ์ค„ ์ˆ˜ ์žˆ์–ด.

3๏ธโƒฃ ํ† ํฐ ์†์‹ค ๋ฐฉ์ง€:
์ปจํŠธ๋ž™ํŠธ๊ฐ€ ํ† ํฐ์„ ๋ฐ›์„ ์ค€๋น„๊ฐ€ ์•ˆ ๋˜์–ด ์žˆ์œผ๋ฉด ์ „์†ก์ด ์‹คํŒจํ•ด. ERC-20์˜ ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์ง€!

4๏ธโƒฃ ํ•˜์œ„ ํ˜ธํ™˜์„ฑ:
ERC-20 ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ชจ๋‘ ๊ตฌํ˜„ํ•ด์„œ ๊ธฐ์กด ์ธํ”„๋ผ์™€ ํ˜ธํ™˜๋ผ.

// ERC-777 ํ›… ์˜ˆ์‹œ
function tokensReceived(
    address operator,
    address from,
    address to,
    uint256 amount,
    bytes calldata userData,
    bytes calldata operatorData
) external {
    // ํ† ํฐ์„ ๋ฐ›์•˜์„ ๋•Œ ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๋Š” ๋กœ์ง
    // ์˜ˆ: ์ž๋™ ์Šคํ…Œ์ดํ‚น, ๋ฆฌ์›Œ๋“œ ๋ถ„๋ฐฐ ๋“ฑ
}

โš ๏ธ ์ฃผ์˜: ERC-777์€ ๊ฐ•๋ ฅํ•˜์ง€๋งŒ ์žฌ์ง„์ž… ๊ณต๊ฒฉ์— ์ทจ์•ฝํ•  ์ˆ˜ ์žˆ์–ด. ํ›… ํ•จ์ˆ˜์—์„œ ์™ธ๋ถ€ ํ˜ธ์ถœ์ด ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์ด์•ผ. ๋ฐ˜๋“œ์‹œ Checks-Effects-Interactions ํŒจํ„ด์„ ๋”ฐ๋ฅด๊ณ , ReentrancyGuard๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ด!

โšก EIP-2612: Permit (๊ฐ€์Šค๋ฆฌ์Šค ์Šน์ธ)

EIP-2612๋Š” ERC-20์— permit ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•œ ํ™•์žฅ์ด์•ผ. ์ด๊ฒŒ ์™œ ํ˜๋ช…์ ์ด๋ƒ๋ฉด... ๐Ÿš€

๊ธฐ์กด ๋ฐฉ์‹์˜ ๋ฌธ์ œ:
1. approve ํŠธ๋žœ์žญ์…˜ ์ „์†ก (๊ฐ€์Šค๋น„ ์ง€๋ถˆ) ๐Ÿ’ธ
2. ์‹ค์ œ ์‚ฌ์šฉ ํŠธ๋žœ์žญ์…˜ ์ „์†ก (๊ฐ€์Šค๋น„ ๋˜ ์ง€๋ถˆ) ๐Ÿ’ธ
โ†’ ์ด 2๋ฒˆ์˜ ํŠธ๋žœ์žญ์…˜, 2๋ฐฐ์˜ ๊ฐ€์Šค๋น„!

Permit ๋ฐฉ์‹:
1. ์˜คํ”„์ฒด์ธ์—์„œ ์„œ๋ช… ์ƒ์„ฑ (๊ฐ€์Šค๋น„ 0์›!) โœจ
2. ์„œ๋ช…๊ณผ ํ•จ๊ป˜ ์‹ค์ œ ์‚ฌ์šฉ ํŠธ๋žœ์žญ์…˜ ์ „์†ก (๊ฐ€์Šค๋น„ 1๋ฒˆ๋งŒ!) ๐Ÿ’ธ
โ†’ 1๋ฒˆ์˜ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ๋!

์‹ค์ œ ์ฝ”๋“œ:

// Permit ํ•จ์ˆ˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜
function permit(
    address owner,
    address spender,
    uint256 value,
    uint256 deadline,
    uint8 v,
    bytes32 r,
    bytes32 s
) external;

// ์‚ฌ์šฉ ์˜ˆ์‹œ (JavaScript)
const signature = await signer._signTypedData(domain, types, value);
const { v, r, s } = ethers.utils.splitSignature(signature);

await token.permit(owner, spender, amount, deadline, v, r, s);
await dapp.doSomething(); // ์ด์ œ ๋ฐ”๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ!

์ฑ„ํƒ ํ˜„ํ™ฉ:
โ€ข USDC, DAI, USDT ๋“ฑ ์ฃผ์š” ์Šคํ…Œ์ด๋ธ”์ฝ”์ธ์ด ์ง€์›
โ€ข Uniswap V2/V3, Aave, Compound ๋“ฑ DeFi ํ”„๋กœํ† ์ฝœ ํ†ตํ•ฉ
โ€ข ์‹ ๊ทœ ํ† ํฐ๋“ค์€ ๋Œ€๋ถ€๋ถ„ ๊ธฐ๋ณธ์œผ๋กœ ํฌํ•จ

์žฌ๋Šฅ๋„ท์—์„œ ๋ธ”๋ก์ฒด์ธ ๊ฐœ๋ฐœ ์žฌ๋Šฅ์„ ๊ฑฐ๋ž˜ํ•  ๋•Œ๋„ ์ด๋Ÿฐ ์ตœ์‹  ๊ธฐ์ˆ ์„ ์•„๋Š” ๊ฒŒ ํฐ ๊ฐ•์ ์ด ๋  ๊ฑฐ์•ผ! ๐Ÿ’ช

๐Ÿ› ๏ธ ERC-20 ํ† ํฐ ๊ฐœ๋ฐœ ์‹ค์ „ ๊ฐ€์ด๋“œ

์ด์ œ ์ง์ ‘ ERC-20 ํ† ํฐ์„ ๋งŒ๋“ค์–ด๋ณด์ž! ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ๋‹จ๊ณ„๋ณ„๋กœ ์„ค๋ช…ํ• ๊ฒŒ. ๐ŸŽ“

๐Ÿ”ง ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ค์ •

1๋‹จ๊ณ„: ํ•„์ˆ˜ ๋„๊ตฌ ์„ค์น˜

# Node.js ์„ค์น˜ ํ™•์ธ
node --version  # v16 ์ด์ƒ ๊ถŒ์žฅ

# Hardhat ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐํ™”
mkdir my-token-project
cd my-token-project
npm init -y
npm install --save-dev hardhat

# Hardhat ์ดˆ๊ธฐํ™”
npx hardhat

# OpenZeppelin ์„ค์น˜
npm install @openzeppelin/contracts

# ๊ธฐํƒ€ ์œ ์šฉํ•œ ํŒจํ‚ค์ง€
npm install --save-dev @nomiclabs/hardhat-ethers ethers
npm install --save-dev @nomiclabs/hardhat-waffle ethereum-waffle chai

๐Ÿ’ก Tip: Hardhat ๋Œ€์‹  Foundry๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์–ด. Foundry๋Š” Rust๋กœ ์ž‘์„ฑ๋˜์–ด ํ›จ์”ฌ ๋น ๋ฅด๊ณ , Solidity๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์–ด!

2๋‹จ๊ณ„: ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ ์ž‘์„ฑ

contracts/MyToken.sol ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด๋ณด์ž:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract MyAwesomeToken is ERC20, ERC20Burnable, ERC20Permit, Ownable {
    // ์ตœ๋Œ€ ๊ณต๊ธ‰๋Ÿ‰ ์„ค์ • (1์–ต ๊ฐœ)
    uint256 public constant MAX_SUPPLY = 100_000_000 * 10**18;
    
    constructor() 
        ERC20("My Awesome Token", "MAT")
        ERC20Permit("My Awesome Token")
    {
        // ์ดˆ๊ธฐ ๊ณต๊ธ‰๋Ÿ‰ 1์ฒœ๋งŒ ๊ฐœ๋ฅผ ๋ฐฐํฌ์ž์—๊ฒŒ ๋ฏผํŒ…
        _mint(msg.sender, 10_000_000 * 10**decimals());
    }
    
    /**
     * @dev ์†Œ์œ ์ž๋งŒ ์ถ”๊ฐ€ ๋ฐœํ–‰ ๊ฐ€๋Šฅ (์ตœ๋Œ€ ๊ณต๊ธ‰๋Ÿ‰๊นŒ์ง€)
     */
    function mint(address to, uint256 amount) public onlyOwner {
        require(totalSupply() + amount <= MAX_SUPPLY, "์ตœ๋Œ€ ๊ณต๊ธ‰๋Ÿ‰ ์ดˆ๊ณผ");
        _mint(to, amount);
    }
    
    /**
     * @dev ๊ธด๊ธ‰ ์ƒํ™ฉ ์‹œ ํŠน์ • ์ฃผ์†Œ์˜ ํ† ํฐ ์†Œ๊ฐ (์†Œ์œ ์ž๋งŒ)
     */
    function burnFrom(address account, uint256 amount) public override onlyOwner {
        _burn(account, amount);
    }
    
    /**
     * @dev ์—์–ด๋“œ๋ž ๊ธฐ๋Šฅ: ์—ฌ๋Ÿฌ ์ฃผ์†Œ์— ํ•œ ๋ฒˆ์— ์ „์†ก
     */
    function airdrop(address[] calldata recipients, uint256[] calldata amounts) 
        external onlyOwner {
        require(recipients.length == amounts.length, "๋ฐฐ์—ด ๊ธธ์ด ๋ถˆ์ผ์น˜");
        
        for (uint256 i = 0; i < recipients.length; i++) {
            _transfer(msg.sender, recipients[i], amounts[i]);
        }
    }
}

์ฝ”๋“œ ์„ค๋ช…:
โ€ข ERC20Burnable: ํ† ํฐ ์†Œ๊ฐ ๊ธฐ๋Šฅ
โ€ข ERC20Permit: ๊ฐ€์Šค๋ฆฌ์Šค ์Šน์ธ ๊ธฐ๋Šฅ
โ€ข Ownable: ์†Œ์œ ์ž ๊ถŒํ•œ ๊ด€๋ฆฌ
โ€ข MAX_SUPPLY: ์ธํ”Œ๋ ˆ์ด์…˜ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•œ ์ตœ๋Œ€ ๊ณต๊ธ‰๋Ÿ‰
โ€ข airdrop: ๋งˆ์ผ€ํŒ…์šฉ ๋Œ€๋Ÿ‰ ์ „์†ก ๊ธฐ๋Šฅ

3๋‹จ๊ณ„: ํ…Œ์ŠคํŠธ ์ž‘์„ฑ

test/MyToken.test.js ํŒŒ์ผ:

const { expect } = require("chai");
const { ethers } = require("hardhat");

describe("MyAwesomeToken", function () {
    let token;
    let owner;
    let addr1;
    let addr2;
    
    beforeEach(async function () {
        [owner, addr1, addr2] = await ethers.getSigners();
        
        const Token = await ethers.getContractFactory("MyAwesomeToken");
        token = await Token.deploy();
        await token.deployed();
    });
    
    describe("๋ฐฐํฌ", function () {
        it("์˜ฌ๋ฐ”๋ฅธ ์ด๋ฆ„๊ณผ ์‹ฌ๋ณผ์„ ๊ฐ€์ ธ์•ผ ํ•จ", async function () {
            expect(await token.name()).to.equal("My Awesome Token");
            expect(await token.symbol()).to.equal("MAT");
        });
        
        it("์ดˆ๊ธฐ ๊ณต๊ธ‰๋Ÿ‰์ด ๋ฐฐํฌ์ž์—๊ฒŒ ํ• ๋‹น๋˜์–ด์•ผ ํ•จ", async function () {
            const ownerBalance = await token.balanceOf(owner.address);
            expect(await token.totalSupply()).to.equal(ownerBalance);
        });
    });
    
    describe("ํŠธ๋žœ์žญ์…˜", function () {
        it("ํ† ํฐ์„ ์ „์†กํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ", async function () {
            await token.transfer(addr1.address, 50);
            expect(await token.balanceOf(addr1.address)).to.equal(50);
        });
        
        it("์ž”์•ก์ด ๋ถ€์กฑํ•˜๋ฉด ์‹คํŒจํ•ด์•ผ ํ•จ", async function () {
            const initialBalance = await token.balanceOf(owner.address);
            
            await expect(
                token.connect(addr1).transfer(owner.address, 1)
            ).to.be.revertedWith("ERC20: transfer amount exceeds balance");
        });
        
        it("approve์™€ transferFrom์ด ์ž‘๋™ํ•ด์•ผ ํ•จ", async function () {
            await token.approve(addr1.address, 100);
            await token.connect(addr1).transferFrom(owner.address, addr2.address, 50);
            
            expect(await token.balanceOf(addr2.address)).to.equal(50);
            expect(await token.allowance(owner.address, addr1.address)).to.equal(50);
        });
    });
    
    describe("๋ฏผํŒ…", function () {
        it("์†Œ์œ ์ž๋งŒ ๋ฏผํŒ…ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ", async function () {
            await expect(
                token.connect(addr1).mint(addr1.address, 1000)
            ).to.be.revertedWith("Ownable: caller is not the owner");
        });
        
        it("์ตœ๋Œ€ ๊ณต๊ธ‰๋Ÿ‰์„ ์ดˆ๊ณผํ•  ์ˆ˜ ์—†์–ด์•ผ ํ•จ", async function () {
            const maxSupply = await token.MAX_SUPPLY();
            const currentSupply = await token.totalSupply();
            const remaining = maxSupply.sub(currentSupply);
            
            await expect(
                token.mint(addr1.address, remaining.add(1))
            ).to.be.revertedWith("์ตœ๋Œ€ ๊ณต๊ธ‰๋Ÿ‰ ์ดˆ๊ณผ");
        });
    });
    
    describe("์—์–ด๋“œ๋ž", function () {
        it("์—ฌ๋Ÿฌ ์ฃผ์†Œ์— ๋™์‹œ ์ „์†กํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ", async function () {
            const recipients = [addr1.address, addr2.address];
            const amounts = [100, 200];
            
            await token.airdrop(recipients, amounts);
            
            expect(await token.balanceOf(addr1.address)).to.equal(100);
            expect(await token.balanceOf(addr2.address)).to.equal(200);
        });
    });
});

ํ…Œ์ŠคํŠธ ์‹คํ–‰:

npx hardhat test

๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผํ•˜๋ฉด ์ดˆ๋ก๋ถˆ! โœ…

4๋‹จ๊ณ„: ๋ฐฐํฌ ์Šคํฌ๋ฆฝํŠธ

scripts/deploy.js ํŒŒ์ผ:

const hre = require("hardhat");

async function main() {
    console.log("ํ† ํฐ ๋ฐฐํฌ ์‹œ์ž‘...");
    
    // ์ปจํŠธ๋ž™ํŠธ ๊ฐ€์ ธ์˜ค๊ธฐ
    const Token = await hre.ethers.getContractFactory("MyAwesomeToken");
    
    // ๋ฐฐํฌ
    const token = await Token.deploy();
    await token.deployed();
    
    console.log(`ํ† ํฐ์ด ๋ฐฐํฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค: ${token.address}`);
    
    // ์ดˆ๊ธฐ ์ •๋ณด ์ถœ๋ ฅ
    const name = await token.name();
    const symbol = await token.symbol();
    const totalSupply = await token.totalSupply();
    const decimals = await token.decimals();
    
    console.log(`์ด๋ฆ„: ${name}`);
    console.log(`์‹ฌ๋ณผ: ${symbol}`);
    console.log(`์ด ๊ณต๊ธ‰๋Ÿ‰: ${ethers.utils.formatUnits(totalSupply, decimals)}`);
    console.log(`์†Œ์ˆ˜์ : ${decimals}`);
    
    // Etherscan ๊ฒ€์ฆ์„ ์œ„ํ•œ ๋Œ€๊ธฐ
    console.log("Etherscan ๊ฒ€์ฆ์„ ์œ„ํ•ด 30์ดˆ ๋Œ€๊ธฐ...");
    await new Promise(resolve => setTimeout(resolve, 30000));
    
    // ์ž๋™ ๊ฒ€์ฆ
    try {
        await hre.run("verify:verify", {
            address: token.address,
            constructorArguments: [],
        });
        console.log("Etherscan ๊ฒ€์ฆ ์™„๋ฃŒ!");
    } catch (error) {
        console.log("๊ฒ€์ฆ ์‹คํŒจ:", error.message);
    }
}

main()
    .then(() => process.exit(0))
    .catch((error) => {
        console.error(error);
        process.exit(1);
    });

5๋‹จ๊ณ„: ๋„คํŠธ์›Œํฌ ์„ค์ • ๋ฐ ๋ฐฐํฌ

hardhat.config.js ํŒŒ์ผ ์ˆ˜์ •:

require("@nomiclabs/hardhat-waffle");
require("@nomiclabs/hardhat-etherscan");
require("dotenv").config();

module.exports = {
    solidity: {
        version: "0.8.20",
        settings: {
            optimizer: {
                enabled: true,
                runs: 200
            }
        }
    },
    networks: {
        // ํ…Œ์ŠคํŠธ๋„ท (Sepolia)
        sepolia: {
            url: process.env.SEPOLIA_RPC_URL,
            accounts: [process.env.PRIVATE_KEY],
            chainId: 11155111
        },
        // ๋ฉ”์ธ๋„ท
        mainnet: {
            url: process.env.MAINNET_RPC_URL,
            accounts: [process.env.PRIVATE_KEY],
            chainId: 1
        },
        // Polygon
        polygon: {
            url: process.env.POLYGON_RPC_URL,
            accounts: [process.env.PRIVATE_KEY],
            chainId: 137
        }
    },
    etherscan: {
        apiKey: process.env.ETHERSCAN_API_KEY
    }
};

.env ํŒŒ์ผ ์ƒ์„ฑ:

SEPOLIA_RPC_URL=https://sepolia.infura.io/v3/YOUR_INFURA_KEY
MAINNET_RPC_URL=https://mainnet.infura.io/v3/YOUR_INFURA_KEY
POLYGON_RPC_URL=https://polygon-rpc.com
PRIVATE_KEY=your_private_key_here
ETHERSCAN_API_KEY=your_etherscan_api_key

โš ๏ธ ๋ณด์•ˆ ์ฃผ์˜:
โ€ข .env ํŒŒ์ผ์€ ์ ˆ๋Œ€ Git์— ์ปค๋ฐ‹ํ•˜์ง€ ๋งˆ! .gitignore์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•ด
โ€ข ํ”„๋ผ์ด๋น— ํ‚ค๋Š” ํ…Œ์ŠคํŠธ์šฉ ๊ณ„์ •๋งŒ ์‚ฌ์šฉํ•ด
โ€ข ๋ฉ”์ธ๋„ท ๋ฐฐํฌ ์ „์—๋Š” ํ•˜๋“œ์›จ์–ด ์ง€๊ฐ‘ ์‚ฌ์šฉ ๊ถŒ์žฅ

๋ฐฐํฌ ์‹คํ–‰:

# ํ…Œ์ŠคํŠธ๋„ท ๋ฐฐํฌ
npx hardhat run scripts/deploy.js --network sepolia

# ๋ฉ”์ธ๋„ท ๋ฐฐํฌ (์‹ ์ค‘ํ•˜๊ฒŒ!)
npx hardhat run scripts/deploy.js --network mainnet

๐Ÿ“Š ๊ฐ€์Šค ์ตœ์ ํ™” ํŒ

๐Ÿ’ฐ ๊ฐ€์Šค๋น„๋ฅผ ์ค„์ด๋Š” ์‹ค์ „ ํ…Œํฌ๋‹‰:

1๏ธโƒฃ ๋ณ€์ˆ˜ ํŒจํ‚น:
uint256 ๋Œ€์‹  uint128, uint64 ๋“ฑ ์ž‘์€ ํƒ€์ž… ์‚ฌ์šฉ. ๊ฐ™์€ ์Šฌ๋กฏ์— ์—ฌ๋Ÿฌ ๋ณ€์ˆ˜๋ฅผ ํŒจํ‚นํ•˜๋ฉด SLOAD ๋น„์šฉ ์ ˆ๊ฐ!

2๏ธโƒฃ Immutable & Constant:
๋ณ€ํ•˜์ง€ ์•Š๋Š” ๊ฐ’์€ immutable์ด๋‚˜ constant๋กœ ์„ ์–ธ. ์Šคํ† ๋ฆฌ์ง€ ๋Œ€์‹  ๋ฐ”์ดํŠธ์ฝ”๋“œ์— ์ €์žฅ๋ผ!

3๏ธโƒฃ Short-circuit ํ‰๊ฐ€:
์กฐ๊ฑด๋ฌธ์—์„œ ๊ฐ€๋ฒผ์šด ๊ฒ€์‚ฌ๋ฅผ ๋จผ์ € ๋ฐฐ์น˜. && ์—ฐ์‚ฐ์ž๋Š” ์ฒซ ๋ฒˆ์งธ๊ฐ€ false๋ฉด ๋‘ ๋ฒˆ์งธ๋ฅผ ํ‰๊ฐ€ํ•˜์ง€ ์•Š์•„.

4๏ธโƒฃ ๋ฐฐ์น˜ ์ž‘์—…:
์—ฌ๋Ÿฌ ์ „์†ก์„ ํ•œ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ๋ฌถ์–ด์„œ ์ฒ˜๋ฆฌ. ์—์–ด๋“œ๋ž ํ•จ์ˆ˜๊ฐ€ ์ข‹์€ ์˜ˆ์‹œ!

5๏ธโƒฃ ์ด๋ฒคํŠธ ํ™œ์šฉ:
์Šคํ† ๋ฆฌ์ง€ ๋Œ€์‹  ์ด๋ฒคํŠธ๋กœ ๋ฐ์ดํ„ฐ ๊ธฐ๋ก. ํ›จ์”ฌ ์ €๋ ดํ•ด!

6๏ธโƒฃ Unchecked ๋ธ”๋ก:
์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ unchecked ์‚ฌ์šฉ. Solidity 0.8.0+์—์„œ ์œ ์šฉ!

// ์ตœ์ ํ™” ์˜ˆ์‹œ
function optimizedTransfer(address[] calldata recipients, uint256 amount) external {
    uint256 length = recipients.length; // ์บ์‹ฑ
    
    unchecked {
        for (uint256 i = 0; i < length; ++i) { // ++i๊ฐ€ i++๋ณด๋‹ค ์ €๋ ด
            _transfer(msg.sender, recipients[i], amount);
        }
    }
}

๐ŸŒ ERC-20 ์ƒํƒœ๊ณ„์™€ ๋ฏธ๋ž˜

ERC-20์€ ๋‹จ์ˆœํ•œ ๊ธฐ์ˆ  ํ‘œ์ค€์„ ๋„˜์–ด ๊ฑฐ๋Œ€ํ•œ ๊ฒฝ์ œ ์ƒํƒœ๊ณ„๋ฅผ ๋งŒ๋“ค์–ด๋ƒˆ์–ด. ์•ž์œผ๋กœ์˜ ์ „๋ง์„ ์‚ดํŽด๋ณด์ž! ๐Ÿ”ฎ

๐Ÿ“ˆ ํ˜„์žฌ ์ƒํƒœ๊ณ„ ๊ทœ๋ชจ

๋†€๋ผ์šด ํ†ต๊ณ„๋“ค:

โ€ข 50๋งŒ ๊ฐœ ์ด์ƒ์˜ ERC-20 ํ† ํฐ์ด ์กด์žฌํ•ด ๐Ÿ“Š
โ€ข ์ƒ์œ„ 100๊ฐœ ํ† ํฐ์˜ ์‹œ๊ฐ€์ด์•ก: ์ˆ˜์ฒœ์–ต ๋‹ฌ๋Ÿฌ ๐Ÿ’ฐ
โ€ข ์ผ์ผ ๊ฑฐ๋ž˜๋Ÿ‰: ์ˆ˜๋ฐฑ์–ต ๋‹ฌ๋Ÿฌ ๐Ÿ”„
โ€ข DeFi TVL(Total Value Locked): $50B+ ๐Ÿฆ
โ€ข ํ™œ์„ฑ ์ง€๊ฐ‘ ์ฃผ์†Œ: ์ˆ˜์ฒœ๋งŒ ๊ฐœ ๐Ÿ‘ฅ

์ด ๋ชจ๋“  ๊ฒŒ ํ•˜๋‚˜์˜ ํ‘œ์ค€ ์œ„์—์„œ ์ž‘๋™ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒŒ ๋†€๋ž์ง€ ์•Š์•„? ๐Ÿคฏ

๐Ÿ”ฎ ๋ฏธ๋ž˜ ํŠธ๋ Œ๋“œ

1. Layer 2 ํ†ตํ•ฉ ๐Ÿš€

์ด๋”๋ฆฌ์›€ ๋ฉ”์ธ๋„ท์˜ ๋†’์€ ๊ฐ€์Šค๋น„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Layer 2 ์†”๋ฃจ์…˜์ด ๊ธ‰์„ฑ์žฅํ•˜๊ณ  ์žˆ์–ด:

โ€ข Optimistic Rollups: Optimism, Arbitrum
โ€ข ZK Rollups: zkSync, StarkNet
โ€ข Sidechains: Polygon, Gnosis Chain

์ด๋“ค์€ ๋ชจ๋‘ ERC-20 ํ‘œ์ค€์„ ์ง€์›ํ•˜๋ฉด์„œ ๊ฑฐ๋ž˜ ๋น„์šฉ์„ 1/100 ์ดํ•˜๋กœ ์ค„์—ฌ! ๐Ÿ’ธ

2. ํฌ๋กœ์Šค์ฒด์ธ ๋ธŒ๋ฆฟ์ง€ ๐ŸŒ‰

์„œ๋กœ ๋‹ค๋ฅธ ๋ธ”๋ก์ฒด์ธ ๊ฐ„ ํ† ํฐ ์ด๋™์ด ์ ์  ์‰ฌ์›Œ์ง€๊ณ  ์žˆ์–ด:

โ€ข Wrapped Tokens: WBTC (๋น„ํŠธ์ฝ”์ธ์„ ERC-20์œผ๋กœ)
โ€ข Bridge Protocols: Multichain, Synapse, Hop
โ€ข Interoperability: Cosmos IBC, Polkadot XCM

๋ฏธ๋ž˜์—๋Š” ์–ด๋–ค ์ฒด์ธ์— ์žˆ๋“  ํ† ํฐ์„ ์ž์œ ๋กญ๊ฒŒ ์ด๋™ํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ์•ผ! ๐ŸŒ

3. ์‹ค๋ฌผ ์ž์‚ฐ ํ† ํฐํ™” (RWA) ๐Ÿ 

ํ˜„์‹ค ์„ธ๊ณ„์˜ ์ž์‚ฐ์„ ERC-20 ํ† ํฐ์œผ๋กœ ๋งŒ๋“œ๋Š” ํŠธ๋ Œ๋“œ:

โ€ข ๋ถ€๋™์‚ฐ: ๊ฑด๋ฌผ ์ง€๋ถ„์„ ํ† ํฐ์œผ๋กœ ๋ถ„ํ•  ์†Œ์œ 
โ€ข ์ฑ„๊ถŒ: ๊ตญ์ฑ„, ํšŒ์‚ฌ์ฑ„๋ฅผ ๋ธ”๋ก์ฒด์ธ์—์„œ ๊ฑฐ๋ž˜
โ€ข ์›์ž์žฌ: ๊ธˆ, ์€, ์„์œ  ๋“ฑ์„ ํ† ํฐํ™”
โ€ข ํƒ„์†Œ ๋ฐฐ์ถœ๊ถŒ: ํ™˜๊ฒฝ ์ž์‚ฐ์˜ ๋””์ง€ํ„ธํ™”

์ „ํ†ต ๊ธˆ์œต๊ณผ DeFi์˜ ๊ฒฝ๊ณ„๊ฐ€ ํ—ˆ๋ฌผ์–ด์ง€๊ณ  ์žˆ์–ด! ๐Ÿฆโžก๏ธโ›“๏ธ

4. AI์™€์˜ ์œตํ•ฉ ๐Ÿค–

์ธ๊ณต์ง€๋Šฅ๊ณผ ๋ธ”๋ก์ฒด์ธ์˜ ๊ฒฐํ•ฉ์ด ์ƒˆ๋กœ์šด ๊ฐ€๋Šฅ์„ฑ์„ ์—ด๊ณ  ์žˆ์–ด:

โ€ข AI ์—์ด์ „ํŠธ: ์ž๋™์œผ๋กœ ํ† ํฐ์„ ๊ฑฐ๋ž˜ํ•˜๋Š” ๋ด‡
โ€ข ์˜ˆ์ธก ์‹œ์žฅ: AI ๊ธฐ๋ฐ˜ ํ† ํฐ ๊ฐ€๊ฒฉ ์˜ˆ์ธก
โ€ข ์Šค๋งˆํŠธ ๋ฆฌ๋ฐธ๋Ÿฐ์‹ฑ: ํฌํŠธํด๋ฆฌ์˜ค ์ž๋™ ์ตœ์ ํ™”
โ€ข ์‚ฌ๊ธฐ ํƒ์ง€: AI๋กœ ์•…์˜์  ํ† ํฐ ์‹๋ณ„

์žฌ๋Šฅ๋„ท ๊ฐ™์€ ํ”Œ๋žซํผ์—์„œ๋„ AI์™€ ๋ธ”๋ก์ฒด์ธ์„ ๊ฒฐํ•ฉํ•œ ์„œ๋น„์Šค๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๊ฒ ์ง€? ๐ŸŽฏ

5. ๊ทœ์ œ์™€ ์ปดํ”Œ๋ผ์ด์–ธ์Šค โš–๏ธ

๊ฐ๊ตญ ์ •๋ถ€์˜ ์•”ํ˜ธํ™”ํ ๊ทœ์ œ๊ฐ€ ๊ตฌ์ฒดํ™”๋˜๋ฉด์„œ ์ƒˆ๋กœ์šด ํ‘œ์ค€๋“ค์ด ๋“ฑ์žฅํ•˜๊ณ  ์žˆ์–ด:

โ€ข KYC/AML ํ†ตํ•ฉ: ์‹ ์› ํ™•์ธ์ด ๋‚ด์žฅ๋œ ํ† ํฐ
โ€ข ์ œํ•œ์  ์ „์†ก: ๊ทœ์ œ ์ค€์ˆ˜๋ฅผ ์œ„ํ•œ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ
โ€ข ์„ธ๊ธˆ ์ž๋™ ๊ณ„์‚ฐ: ๊ฑฐ๋ž˜ ์‹œ ์ž๋™์œผ๋กœ ์„ธ๊ธˆ ์ •๋ณด ๊ธฐ๋ก
โ€ข ์ฆ๊ถŒํ˜• ํ† ํฐ: ERC-1400 ๊ฐ™์€ ๊ทœ์ œ ์นœํ™”์  ํ‘œ์ค€

ํ•ฉ๋ฒ•์ ์ด๊ณ  ์•ˆ์ „ํ•œ ์ƒํƒœ๊ณ„๋กœ ๋ฐœ์ „ํ•˜๊ณ  ์žˆ์–ด! ๐Ÿ›ก๏ธ

๐Ÿ’ก ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ์ปค๋ฆฌ์–ด ์กฐ์–ธ

ERC-20์„ ๋งˆ์Šคํ„ฐํ•˜๋ฉด ์—ด๋ฆฌ๋Š” ๊ธฐํšŒ๋“ค:

1๏ธโƒฃ ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ ๊ฐœ๋ฐœ์ž:
์—ฐ๋ด‰ $100k~$300k, ์ „ ์„ธ๊ณ„ ์›๊ฒฉ ๊ทผ๋ฌด ๊ฐ€๋Šฅ! ์ˆ˜์š”๊ฐ€ ๊ณต๊ธ‰์„ ํ›จ์”ฌ ์ดˆ๊ณผํ•˜๊ณ  ์žˆ์–ด. ๐Ÿ’ผ

2๏ธโƒฃ DeFi ํ”„๋กœํ† ์ฝœ ์—”์ง€๋‹ˆ์–ด:
Uniswap, Aave, Compound ๊ฐ™์€ ํ”„๋กœ์ ํŠธ์—์„œ ์ผํ•  ์ˆ˜ ์žˆ์–ด. ํ˜์‹ ์˜ ์ตœ์ „์„ ! ๐Ÿš€

3๏ธโƒฃ ๋ณด์•ˆ ๊ฐ์‚ฌ์ž:
์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ ๊ฐ์‚ฌ๋Š” ํ”„๋กœ์ ํŠธ๋‹น $10k~$100k+. ์ „๋ฌธ์„ฑ์ด ๋งค์šฐ ์ค‘์š”ํ•œ ๋ถ„์•ผ์•ผ. ๐Ÿ”

4๏ธโƒฃ ๋ธ”๋ก์ฒด์ธ ์ปจ์„คํ„ดํŠธ:
๊ธฐ์—…๋“ค์˜ ํ† ํฐ ์ด์ฝ”๋…ธ๋ฏธ ์„ค๊ณ„๋ฅผ ๋„์™€์ค˜. ๊ธฐ์ˆ ๊ณผ ๋น„์ฆˆ๋‹ˆ์Šค์˜ ๊ต์ฐจ์ ! ๐Ÿ’ก

5๏ธโƒฃ ๊ต์œก์ž/์ฝ˜ํ…์ธ  ํฌ๋ฆฌ์—์ดํ„ฐ:
๋ธ”๋ก์ฒด์ธ ๊ต์œก ์ˆ˜์š”๊ฐ€ ํญ๋ฐœ์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๊ณ  ์žˆ์–ด. ์žฌ๋Šฅ๋„ท์—์„œ๋„ ๊ด€๋ จ ๊ฐ•์˜๋ฅผ ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๊ฒ ์ง€? ๐Ÿ“š

ํ•™์Šต ๋กœ๋“œ๋งต:
1. Solidity ๊ธฐ์ดˆ โ†’ 2. ERC-20 ๊ตฌํ˜„ โ†’ 3. DeFi ํ”„๋กœํ† ์ฝœ ๋ถ„์„ โ†’ 4. ๋ณด์•ˆ ๋ฒ ์ŠคํŠธ ํ”„๋ž™ํ‹ฐ์Šค โ†’ 5. ์‹ค์ „ ํ”„๋กœ์ ํŠธ โ†’ 6. ์˜คํ”ˆ์†Œ์Šค ๊ธฐ์—ฌ ๐ŸŽฏ

ERC-20์˜ ๋ฏธ๋ž˜ ๋น„์ „ ERC-20 ํ† ํฐ ํ‘œ์ค€ Layer 2 ํ™•์žฅ์„ฑ ํฌ๋กœ์Šค์ฒด์ธ ์ƒํ˜ธ์šด์šฉ์„ฑ RWA ์ž์‚ฐํ† ํฐํ™” AI ์œตํ•ฉ ์ž๋™ํ™” ๊ทœ์ œ ์ปดํ”Œ๋ผ์ด์–ธ์Šค ๋ณด์•ˆ ๊ฐ์‚ฌ ํ†ตํ•ฉ๋œ ๊ธ€๋กœ๋ฒŒ ๊ธˆ์œต ์ธํ”„๋ผ๋กœ ์ง„ํ™” ์ค‘

๐ŸŽ“ ํ•™์Šต ๋ฆฌ์†Œ์Šค ๋ฐ ์ปค๋ฎค๋‹ˆํ‹ฐ

ERC-20์„ ๋” ๊นŠ์ด ๊ณต๋ถ€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด? ์ตœ๊ณ ์˜ ํ•™์Šต ์ž๋ฃŒ๋“ค์„ ๋ชจ์•„๋ดค์–ด! ๐Ÿ“š

๐Ÿ“– ๊ณต์‹ ๋ฌธ์„œ ๋ฐ ํ‘œ์ค€

ํ•„์ˆ˜ ์ฝ๊ธฐ ์ž๋ฃŒ:

โ€ข EIP-20 ์›๋ฌธ: ethereum.org/en/eips/eip-20
โ†’ ํ‘œ์ค€์˜ ์›์กฐ! ๋ชจ๋“  ๊ฒƒ์˜ ์‹œ์ž‘์ ์ด์•ผ

โ€ข OpenZeppelin Docs: docs.openzeppelin.com
โ†’ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๊ตฌํ˜„์ฒด์˜ ๊ณต์‹ ๋ฌธ์„œ

โ€ข Solidity ๋ฌธ์„œ: docs.soliditylang.org
โ†’ ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ ์–ธ์–ด์˜ ๋ฐ”์ด๋ธ”

โ€ข Ethereum.org: ethereum.org/en/developers
โ†’ ์ด๋”๋ฆฌ์›€ ๊ฐœ๋ฐœ์˜ ๋ชจ๋“  ๊ฒƒ

๐ŸŽฅ ์˜จ๋ผ์ธ ๊ฐ•์˜

์ถ”์ฒœ ๊ฐ•์˜ ํ”Œ๋žซํผ:

โ€ข CryptoZombies: cryptozombies.io
โ†’ ๊ฒŒ์ž„ํ•˜๋“ฏ Solidity ๋ฐฐ์šฐ๊ธฐ! ์™„์ „ ๋ฌด๋ฃŒ ๐ŸŽฎ

โ€ข Alchemy University: university.alchemy.com
โ†’ ๋ฌด๋ฃŒ ๋ธ”๋ก์ฒด์ธ ๊ฐœ๋ฐœ ๋ถ€ํŠธ์บ ํ”„

โ€ข Udemy: "Ethereum and Solidity: The Complete Developer's Guide"
โ†’ ์ฒด๊ณ„์ ์ธ ์œ ๋ฃŒ ๊ฐ•์˜

โ€ข YouTube: Patrick Collins, Dapp University
โ†’ ๋ฌด๋ฃŒ ๊ณ ํ’ˆ์งˆ ํŠœํ† ๋ฆฌ์–ผ

โ€ข ์žฌ๋Šฅ๋„ท: ํ•œ๊ตญ์–ด๋กœ ๋œ ๋ธ”๋ก์ฒด์ธ ๊ฐ•์˜๋„ ์ฐพ์•„๋ณผ ์ˆ˜ ์žˆ์–ด! ๐Ÿ‡ฐ๐Ÿ‡ท

๐Ÿ’ป ์‹ค์Šต ํ”Œ๋žซํผ

์ฝ”๋”ฉ ์—ฐ์Šตํ•˜๊ธฐ:

โ€ข Remix IDE: remix.ethereum.org
โ†’ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ฐ”๋กœ Solidity ์ฝ”๋”ฉ! ์„ค์น˜ ํ•„์š” ์—†์Œ โœจ

โ€ข Hardhat: hardhat.org
โ†’ ํ”„๋กœํŽ˜์…”๋„ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ

โ€ข Foundry: getfoundry.sh
โ†’ ๋น ๋ฅด๊ณ  ๊ฐ•๋ ฅํ•œ ํ…Œ์ŠคํŒ… ํ”„๋ ˆ์ž„์›Œํฌ

โ€ข Tenderly: tenderly.co
โ†’ ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ ๋””๋ฒ„๊น… ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง

โ€ข Etherscan: etherscan.io
โ†’ ์‹ค์ œ ์ปจํŠธ๋ž™ํŠธ ์ฝ”๋“œ ๋ถ„์„ํ•˜๊ธฐ

๐Ÿ‘ฅ ์ปค๋ฎค๋‹ˆํ‹ฐ

ํ•จ๊ป˜ ์„ฑ์žฅํ•˜๊ธฐ:

โ€ข Discord:
- OpenZeppelin Community
- Ethereum R&D
- Buildspace

โ€ข Reddit:
- r/ethdev (์ด๋”๋ฆฌ์›€ ๊ฐœ๋ฐœ)
- r/solidity
- r/ethereum

โ€ข Twitter:
- @VitalikButerin
- @OpenZeppelin
- @PatrickAlphaC

โ€ข ํ•œ๊ตญ ์ปค๋ฎค๋‹ˆํ‹ฐ:
- ์ด๋”๋ฆฌ์›€ ์—ฐ๊ตฌํšŒ
- ๋ธ”๋ก์ฒด์ธ ๊ฐœ๋ฐœ์ž ๋ชจ์ž„
- ์žฌ๋Šฅ๋„ท ๋ธ”๋ก์ฒด์ธ ์นดํ…Œ๊ณ ๋ฆฌ ๐ŸŽฏ

๐Ÿ”ง ์œ ์šฉํ•œ ๋„๊ตฌ๋“ค

๊ฐœ๋ฐœ ํšจ์œจ์„ ๋†’์ด๋Š” ํˆด:

โ€ข Metamask: ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ์ด๋”๋ฆฌ์›€ ์ง€๊ฐ‘
โ€ข Infura/Alchemy: ๋…ธ๋“œ ์ธํ”„๋ผ ์„œ๋น„์Šค
โ€ข The Graph: ๋ธ”๋ก์ฒด์ธ ๋ฐ์ดํ„ฐ ์ธ๋ฑ์‹ฑ
โ€ข Chainlink: ์˜ค๋ผํด ์„œ๋น„์Šค
โ€ข IPFS: ํƒˆ์ค‘์•™ํ™” ํŒŒ์ผ ์ €์žฅ
โ€ข Gnosis Safe: ๋ฉ€ํ‹ฐ์‹œ๊ทธ ์ง€๊ฐ‘
โ€ข Defender: ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ ์ž๋™ํ™”
โ€ข Slither: ์ •์  ๋ถ„์„ ๋„๊ตฌ

๐ŸŽฏ ์‹ค์ „ ํ”„๋กœ์ ํŠธ ์•„์ด๋””์–ด

์ด๋ก ์„ ๋ฐฐ์› ์œผ๋ฉด ์ด์ œ ์ง์ ‘ ๋งŒ๋“ค์–ด๋ด์•ผ์ง€! ๋‚œ์ด๋„๋ณ„ ํ”„๋กœ์ ํŠธ ์•„์ด๋””์–ด๋ฅผ ์†Œ๊ฐœํ• ๊ฒŒ. ๐Ÿš€

๐ŸŒฑ ์ดˆ๊ธ‰ ํ”„๋กœ์ ํŠธ

1. ๋‚˜๋งŒ์˜ ๋ฐˆ ์ฝ”์ธ ๋งŒ๋“ค๊ธฐ ๐Ÿ•

๋ชฉํ‘œ: ๊ธฐ๋ณธ ERC-20 ํ† ํฐ ๋ฐฐํฌ
๊ธฐ๋Šฅ: ์ด๋ฆ„, ์‹ฌ๋ณผ, ์ดˆ๊ธฐ ๊ณต๊ธ‰๋Ÿ‰ ์„ค์ •
ํ•™์Šต ํฌ์ธํŠธ: ์ปจํŠธ๋ž™ํŠธ ๋ฐฐํฌ, Etherscan ๊ฒ€์ฆ
์˜ˆ์ƒ ์‹œ๊ฐ„: 2-3์‹œ๊ฐ„

2. ํ† ํฐ ์—์–ด๋“œ๋ž ์‹œ์Šคํ…œ ๐ŸŽ

๋ชฉํ‘œ: ์—ฌ๋Ÿฌ ์ฃผ์†Œ์— ๋™์‹œ ์ „์†ก
๊ธฐ๋Šฅ: CSV ํŒŒ์ผ ์ฝ๊ธฐ, ๋ฐฐ์น˜ ์ „์†ก, ๊ฐ€์Šค ์ตœ์ ํ™”
ํ•™์Šต ํฌ์ธํŠธ: ๋ฃจํ”„ ์ตœ์ ํ™”, ์ด๋ฒคํŠธ ํ™œ์šฉ
์˜ˆ์ƒ ์‹œ๊ฐ„: 4-6์‹œ๊ฐ„

๐ŸŒฟ ์ค‘๊ธ‰ ํ”„๋กœ์ ํŠธ

3. ๋ฒ ์ŠคํŒ… ์ปจํŠธ๋ž™ํŠธ โฐ

๋ชฉํ‘œ: ์‹œ๊ฐ„์— ๋”ฐ๋ผ ํ† ํฐ์„ ์ ์ง„์ ์œผ๋กœ ํ•ด์ œ
๊ธฐ๋Šฅ: ํด๋ฆฌํ”„ ๊ธฐ๊ฐ„, ์„ ํ˜• ๋ฒ ์ŠคํŒ…, ์กฐ๊ธฐ ํ•ด์ง€
ํ•™์Šต ํฌ์ธํŠธ: ์‹œ๊ฐ„ ๊ธฐ๋ฐ˜ ๋กœ์ง, ์ˆ˜ํ•™ ์—ฐ์‚ฐ
์˜ˆ์ƒ ์‹œ๊ฐ„: 1-2์ผ

์‹ค์ œ ์‚ฌ์šฉ ์‚ฌ๋ก€: ํŒ€ ํ† ํฐ, ํˆฌ์ž์ž ํ† ํฐ ๋ฝ์—…

4. ์Šคํ…Œ์ดํ‚น ํ’€ ๐Ÿ’Ž

๋ชฉํ‘œ: ํ† ํฐ์„ ์˜ˆ์น˜ํ•˜๊ณ  ๋ณด์ƒ ๋ฐ›๊ธฐ
๊ธฐ๋Šฅ: ์˜ˆ์น˜, ์ธ์ถœ, ๋ณด์ƒ ๊ณ„์‚ฐ, APY ํ‘œ์‹œ
ํ•™์Šต ํฌ์ธํŠธ: ๋ณต์žกํ•œ ์ˆ˜ํ•™, ๋ณด์ƒ ๋ถ„๋ฐฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜
์˜ˆ์ƒ ์‹œ๊ฐ„: 3-5์ผ

์ถ”๊ฐ€ ๊ธฐ๋Šฅ: ๋ฝ์—… ๊ธฐ๊ฐ„, ๋ถ€์Šคํ„ฐ, ํŽ˜๋„ํ‹ฐ

๐ŸŒณ ๊ณ ๊ธ‰ ํ”„๋กœ์ ํŠธ

5. DEX (ํƒˆ์ค‘์•™ํ™” ๊ฑฐ๋ž˜์†Œ) ๐Ÿ”„

๋ชฉํ‘œ: Uniswap ์Šคํƒ€์ผ์˜ AMM ๊ตฌํ˜„
๊ธฐ๋Šฅ: ์œ ๋™์„ฑ ํ’€, ์Šค์™‘, LP ํ† ํฐ, ์ˆ˜์ˆ˜๋ฃŒ
ํ•™์Šต ํฌ์ธํŠธ: AMM ์•Œ๊ณ ๋ฆฌ์ฆ˜, ๊ฐ€๊ฒฉ ๊ณ„์‚ฐ, ์Šฌ๋ฆฌํ”ผ์ง€
์˜ˆ์ƒ ์‹œ๊ฐ„: 1-2์ฃผ

ํ•ต์‹ฌ ๊ฐœ๋…: x * y = k ๊ณต์‹, ์ž„ํผ๋จธ๋„ŒํŠธ ๋กœ์Šค

6. ๋Œ€์ถœ ํ”„๋กœํ† ์ฝœ ๐Ÿฆ

๋ชฉํ‘œ: Aave/Compound ์Šคํƒ€์ผ์˜ ๋Œ€์ถœ ํ”Œ๋žซํผ
๊ธฐ๋Šฅ: ๋‹ด๋ณด ์˜ˆ์น˜, ๋Œ€์ถœ, ์ฒญ์‚ฐ, ์ด์ž ๊ณ„์‚ฐ
ํ•™์Šต ํฌ์ธํŠธ: ๋‹ด๋ณด ๋น„์œจ, ์˜ค๋ผํด ํ†ตํ•ฉ, ์ฒญ์‚ฐ ๋ฉ”์ปค๋‹ˆ์ฆ˜
์˜ˆ์ƒ ์‹œ๊ฐ„: 2-3์ฃผ

๊ณ ๊ธ‰ ๊ธฐ๋Šฅ: ํ”Œ๋ž˜์‹œ ๋ก , ์ด์ž์œจ ๋ชจ๋ธ, ๊ฑฐ๋ฒ„๋„Œ์Šค

7. DAO (ํƒˆ์ค‘์•™ํ™” ์ž์œจ ์กฐ์ง) ๐Ÿ—ณ๏ธ

๋ชฉํ‘œ: ๊ฑฐ๋ฒ„๋„Œ์Šค ํ† ํฐ ๊ธฐ๋ฐ˜ ํˆฌํ‘œ ์‹œ์Šคํ…œ
๊ธฐ๋Šฅ: ์ œ์•ˆ ์ƒ์„ฑ, ํˆฌํ‘œ, ์‹คํ–‰, ํƒ€์ž„๋ฝ
ํ•™์Šต ํฌ์ธํŠธ: ๊ฑฐ๋ฒ„๋„Œ์Šค ํŒจํ„ด, ์œ„์ž„, ์ฟผ๋Ÿผ
์˜ˆ์ƒ ์‹œ๊ฐ„: 2-3์ฃผ

์‹ค์ „ ํ™œ์šฉ: ํ”„๋กœํ† ์ฝœ ์—…๊ทธ๋ ˆ์ด๋“œ, ์žฌ๋ฌด ๊ด€๋ฆฌ

๐Ÿ’ก ํ”„๋กœ์ ํŠธ ์„ฑ๊ณต ํŒ

ํ”„๋กœ์ ํŠธ๋ฅผ ์™„์„ฑํ•˜๋Š” ๋น„๊ฒฐ:

1๏ธโƒฃ ์ž‘๊ฒŒ ์‹œ์ž‘ํ•˜๊ธฐ:
์ฒ˜์Œ๋ถ€ํ„ฐ ์™„๋ฒฝํ•œ ๊ฑธ ๋งŒ๋“ค๋ ค๊ณ  ํ•˜์ง€ ๋งˆ. MVP(Minimum Viable Product)๋ถ€ํ„ฐ!

2๏ธโƒฃ ๊ธฐ์กด ์ฝ”๋“œ ๋ถ„์„:
Uniswap, Aave ๊ฐ™์€ ํ”„๋กœ์ ํŠธ์˜ ์ฝ”๋“œ๋ฅผ ์ฝ์–ด๋ด. ์ตœ๊ณ ์˜ ํ•™์Šต ์ž๋ฃŒ์•ผ!

3๏ธโƒฃ ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ:
ํ…Œ์ŠคํŠธ๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด. ๋ฒ„๊ทธ๋ฅผ ์กฐ๊ธฐ์— ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์–ด!

4๏ธโƒฃ ๋ณด์•ˆ ์ตœ์šฐ์„ :
๋ˆ์ด ๊ฑธ๋ฆฐ ์ฝ”๋“œ์•ผ. ํ•ญ์ƒ ๋ณด์•ˆ์„ ์ตœ์šฐ์„ ์œผ๋กœ ์ƒ๊ฐํ•ด!

5๏ธโƒฃ ์ปค๋ฎค๋‹ˆํ‹ฐ ํ”ผ๋“œ๋ฐฑ:
Discord, Reddit์— ๊ณต์œ ํ•˜๊ณ  ํ”ผ๋“œ๋ฐฑ ๋ฐ›์•„. ํ˜ผ์ž๋ณด๋‹ค ํ•จ๊ป˜!

6๏ธโƒฃ ๋ฌธ์„œํ™”:
README, ์ฃผ์„, ์•„ํ‚คํ…์ฒ˜ ๋‹ค์ด์–ด๊ทธ๋žจ์„ ๊ผผ๊ผผํžˆ ์ž‘์„ฑํ•ด. ๋ฏธ๋ž˜์˜ ๋‚˜๋ฅผ ์œ„ํ•ด!

7๏ธโƒฃ ํฌํŠธํด๋ฆฌ์˜ค ๊ตฌ์ถ•:
GitHub์— ์˜ฌ๋ฆฌ๊ณ , ๋ธ”๋กœ๊ทธ์— ๊ฐœ๋ฐœ ๊ณผ์ •์„ ๊ธฐ๋กํ•ด. ์ทจ์—…/ํ”„๋ฆฌ๋žœ์‹ฑ์— ํฐ ๋„์›€!

๐ŸŽฌ ๋งˆ๋ฌด๋ฆฌํ•˜๋ฉฐ

์™€! ์—ฌ๊ธฐ๊นŒ์ง€ ์ฝ์—ˆ๋‹ค๋ฉด ์ •๋ง ๋Œ€๋‹จํ•ด! ๐Ÿ‘ ERC-20 ํ‘œ์ค€์— ๋Œ€ํ•ด ๊ฝค ๊นŠ์ด ์žˆ๊ฒŒ ์•Œ์•„๋ดค์–ด. ๊ฐ„๋‹จํ•œ ํ† ํฐ ํ‘œ์ค€์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” ์ˆ˜์ฒœ์–ต ๋‹ฌ๋Ÿฌ ๊ทœ๋ชจ์˜ ์ƒํƒœ๊ณ„๋ฅผ ์ง€ํƒฑํ•˜๋Š” ํ•ต์‹ฌ ๊ธฐ์ˆ ์ด์•ผ. ๐ŸŒŸ

๐Ÿ“ ํ•ต์‹ฌ ์š”์•ฝ

์šฐ๋ฆฌ๊ฐ€ ๋ฐฐ์šด ๊ฒƒ๋“ค:

โœ… ERC-20์€ ์ด๋”๋ฆฌ์›€ ํ† ํฐ์˜ ๊ณตํ†ต ํ‘œ์ค€์ด์•ผ
โœ… 6๊ฐœ์˜ ํ•„์ˆ˜ ํ•จ์ˆ˜์™€ 3๊ฐœ์˜ ์„ ํƒ์  ํ•จ์ˆ˜๋กœ ๊ตฌ์„ฑ๋ผ
โœ… approve/transferFrom ํŒจํ„ด์ด DeFi์˜ ํ•ต์‹ฌ์ด์•ผ
โœ… OpenZeppelin์„ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ์ „ํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์–ด
โœ… ํ† ํฐ ์†์‹ค, approve ๊ณต๊ฒฉ ๊ฐ™์€ ํ•œ๊ณ„์ ์ด ์žˆ์–ด
โœ… ERC-777, EIP-2612 ๊ฐ™์€ ๊ฐœ์„  ํ‘œ์ค€๋“ค์ด ๋‚˜์™”์–ด
โœ… Layer 2, ํฌ๋กœ์Šค์ฒด์ธ, RWA ๋“ฑ์œผ๋กœ ์ง„ํ™” ์ค‘์ด์•ผ
โœ… ๋ธ”๋ก์ฒด์ธ ๊ฐœ๋ฐœ์ž๋Š” ์ˆ˜์š”๊ฐ€ ๋งค์šฐ ๋†’์€ ์ง์—…์ด์•ผ

๐Ÿ’ญ ๊ฐœ์ธ์ ์ธ ์กฐ์–ธ:

๋ธ”๋ก์ฒด์ธ ๊ฐœ๋ฐœ์€ ์ฒ˜์Œ์—” ์–ด๋ ค์›Œ ๋ณด์ด์ง€๋งŒ, ํ•œ ๊ฑธ์Œ์”ฉ ๋‚˜์•„๊ฐ€๋‹ค ๋ณด๋ฉด ์–ด๋А์ƒˆ ๋ฉ‹์ง„ DApp์„ ๋งŒ๋“ค๊ณ  ์žˆ๋Š” ์ž์‹ ์„ ๋ฐœ๊ฒฌํ•˜๊ฒŒ ๋  ๊ฑฐ์•ผ! ๐Ÿš€

์ค‘์š”ํ•œ ๊ฑด ๊พธ์ค€ํ•จ์ด์•ผ. ๋งค์ผ ์กฐ๊ธˆ์”ฉ์ด๋ผ๋„ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ , ์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ๋ฅผ ๋ถ„์„ํ•˜๊ณ , ์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ์†Œํ†ตํ•˜๋ฉด์„œ ์„ฑ์žฅํ•ด๋ด. ์‹ค์ˆ˜๋ฅผ ๋‘๋ ค์›Œํ•˜์ง€ ๋งˆ! ํ…Œ์ŠคํŠธ๋„ท์€ ๋ฌดํ•œ๋Œ€๋กœ ์‹คํŒจํ•ด๋„ ๊ดœ์ฐฎ์€ ๊ณณ์ด๋‹ˆ๊นŒ. ๐Ÿ˜Š

๊ทธ๋ฆฌ๊ณ  ํ˜ผ์ž ๊ณต๋ถ€ํ•˜๊ธฐ ํž˜๋“ค๋‹ค๋ฉด ์žฌ๋Šฅ๋„ท ๊ฐ™์€ ํ”Œ๋žซํผ์—์„œ ๋ฉ˜ํ† ๋ฅผ ์ฐพ๊ฑฐ๋‚˜, ์Šคํ„ฐ๋”” ๊ทธ๋ฃน์„ ๋งŒ๋“ค์–ด๋ด. ํ•จ๊ป˜ ๋ฐฐ์šฐ๋ฉด ํ›จ์”ฌ ์žฌ๋ฏธ์žˆ๊ณ  ๋น ๋ฅด๊ฒŒ ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ์–ด! ๐Ÿค

๐ŸŽฏ ๋‹ค์Œ ๋‹จ๊ณ„:

1. ์ด ๊ธ€์„ ๋ถ๋งˆํฌํ•˜๊ณ  ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ์ฐธ๊ณ ํ•ด ๐Ÿ“‘
2. Remix์—์„œ ๊ฐ„๋‹จํ•œ ERC-20 ํ† ํฐ์„ ๋งŒ๋“ค์–ด๋ด ๐Ÿ’ป
3. ํ…Œ์ŠคํŠธ๋„ท์— ๋ฐฐํฌํ•˜๊ณ  ์นœ๊ตฌ๋“ค์—๊ฒŒ ์ „์†กํ•ด๋ด ๐Ÿš€
4. OpenZeppelin ์ฝ”๋“œ๋ฅผ ์ฝ๊ณ  ๋ถ„์„ํ•ด๋ด ๐Ÿ”
5. ์ž‘์€ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•ด๋ด (์—์–ด๋“œ๋ž ์‹œ์Šคํ…œ ์ถ”์ฒœ!) ๐ŸŽ
6. Discord ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๊ฐ€์ž…ํ•ด์„œ ์งˆ๋ฌธํ•˜๊ณ  ๋‹ต๋ณ€ํ•ด๋ด ๐Ÿ’ฌ
7. ๋ธ”๋กœ๊ทธ๋‚˜ GitHub์— ํ•™์Šต ๋‚ด์šฉ์„ ๊ธฐ๋กํ•ด๋ด ๐Ÿ“

๋ธ”๋ก์ฒด์ธ ์„ธ๊ณ„๋Š” ๋งค์ผ ์ƒˆ๋กœ์šด ํ˜์‹ ์ด ์ผ์–ด๋‚˜๋Š” ๊ณณ์ด์•ผ. ERC-20์€ ๊ทธ ์—ฌ์ •์˜ ์‹œ์ž‘์ ์ผ ๋ฟ์ด์ง€. ์—ฌ๊ธฐ์„œ ๋ฐฐ์šด ์ง€์‹์„ ๋ฐ”ํƒ•์œผ๋กœ NFT(ERC-721), ๋ฉ€ํ‹ฐํ† ํฐ(ERC-1155), Layer 2, ํฌ๋กœ์Šค์ฒด์ธ ๋“ฑ ๋” ๋„“์€ ์„ธ๊ณ„๋กœ ๋‚˜์•„๊ฐ€๋ด! ๐ŸŒ

์–ธ์  ๊ฐ€ ๋‹น์‹ ์ด ๋งŒ๋“  ํ† ํฐ์ด ์ˆ˜๋ฐฑ๋งŒ ๋ช…์ด ์‚ฌ์šฉํ•˜๋Š” ๋‚ ์ด ์˜ฌ์ง€๋„ ๋ชฐ๋ผ. ๊ทธ๋•Œ๋ฅผ ์ƒ์ƒํ•˜๋ฉฐ ์˜ค๋Š˜๋„ ํ•œ ์ค„์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์ž! ๐Ÿ’ช

์งˆ๋ฌธ์ด๋‚˜ ํ”ผ๋“œ๋ฐฑ์ด ์žˆ๋‹ค๋ฉด ์–ธ์ œ๋“  ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๊ณต์œ ํ•ด์ค˜. ์šฐ๋ฆฌ๋Š” ๋ชจ๋‘ ํ•จ๊ป˜ ๋ฐฐ์šฐ๊ณ  ์„ฑ์žฅํ•˜๋Š” ์ค‘์ด๋‹ˆ๊นŒ! ๐ŸŒฑ

ํ–‰์šด์„ ๋นŒ์–ด! May the blockchain be with you! ๐Ÿš€โœจ

๐ŸŽ‰ ์ถ•ํ•˜ํ•ฉ๋‹ˆ๋‹ค!

ERC-20 ํ‘œ์ค€์˜ ๋ชจ๋“  ๊ฒƒ์„ ๋งˆ์Šคํ„ฐํ–ˆ์–ด์š”!
์ด์ œ ๋‹น์‹ ๋„ ๋ธ”๋ก์ฒด์ธ ๊ฐœ๋ฐœ์ž์˜ ๊ธธ์„ ๊ฑท๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿš€

๋Œ“๊ธ€ ์ž‘์„ฑ

์ด ๊ธ€์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ƒ๊ฐ์„ ๋“ค๋ ค์ฃผ์„ธ์š”

๋Œ“๊ธ€ 0
๋Œ“๊ธ€์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘์ž…๋‹ˆ๋‹ค.

์•„์ง ๋Œ“๊ธ€์ด ์—†์Šต๋‹ˆ๋‹ค.