Building an EVM Wallet

์ด๋ฒˆ ํŠœํ† ๋ฆฌ์–ผ์—์„œ๋Š” Nodit์ด ์ œ๊ณตํ•˜๋Š” Web3 Data API์™€ Node API๋ฅผ ์ด์šฉํ•ด EVM ๊ณ„์—ด์˜ ์ง€๊ฐ‘์„ ๋งŒ๋“ค์–ด๋ณด๋Š” ๊ณผ์ •์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“˜

์ด๋ฒˆ ํŠœํ† ๋ฆฌ์–ผ์„ ์ง„ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Nodit API Key๊ฐ€ ํ•„์š”ํ•ด์š”!

Nodit API Key๋Š” Nodit ์ฝ˜์†”์— ํšŒ์›๊ฐ€์ž…ํ•˜์—ฌ ํš๋“ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ๋งํฌ๋ฅผ ํด๋ฆญํ•˜์—ฌ Nodit ์ฝ˜์†”์— ํšŒ์›๊ฐ€์ž…ํ•˜๊ณ  ๋‹ค์–‘ํ•œ ๋ธ”๋ก์ฒด์ธ ๋…ธ๋“œ๋ฅผ ์ด์šฉํ•ด ๋ณด์„ธ์š”!


โœ๏ธ

๋ณธ ํŠœํ† ๋ฆฌ์–ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆœ์„œ๋กœ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.

Step 1. ์š”๊ตฌ์‚ฌํ•ญ ์ˆ˜๋ฆฝ ๋ฐ ์—ฐ๋™ํ•  API ์‚ดํŽด๋ณด๊ธฐ

Step 2. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ค์ •ํ•˜๊ธฐ

Step 3. API ์—ฐ๋™ํ•˜๊ธฐ

Step 4. ์˜ˆ์ œ ์ฝ”๋“œ๋กœ ๋™์ž‘ ํ™•์ธํ•˜๊ธฐ


Step 1. ์š”๊ตฌ์‚ฌํ•ญ ์ˆ˜๋ฆฝ ๋ฐ ์—ฐ๋™ํ•  API ์‚ดํŽด๋ณด๊ธฐ

์š”๊ตฌ์‚ฌํ•ญ ์ˆ˜๋ฆฝ

์ด๋ฒˆ ํŠœํ† ๋ฆฌ์–ผ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ ์š”๊ตฌ์‚ฌํ•ญ์„ ๊ฐ€์ง„ ์ง€๊ฐ‘ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ Nodit API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•ด๋ด…๋‹ˆ๋‹ค.

  1. ๊ณ„์ • ์ƒ์„ฑ / ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
    • EOA๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.
    • Private Key๋ฅผ ์ž…๋ ฅ์„ ํ†ตํ•ด ๊ธฐ์กด์— ์ƒ์„ฑํ•œ ๊ณ„์ •์„ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

  2. ๋„คํŠธ์›Œํฌ ์„ ํƒ
    • ํŠน์ • ๋„คํŠธ์›Œํฌ๋ฅผ ์„ ํƒํ•˜์—ฌ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

  3. ๋ณด์œ  ์ค‘์ธ ํ† ํฐ ์ˆ˜๋Ÿ‰ ์กฐํšŒ
    • ํ˜„์žฌ ๊ณ„์ •์ด ๋ณด์œ ํ•˜๊ณ  ์žˆ๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ํ† ํฐ์˜ ์ˆ˜๋Ÿ‰์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ํ˜„์žฌ ๊ณ„์ •์ด ๋ณด์œ ํ•˜๊ณ  ์žˆ๋Š” ERC-20๊ธฐ๋ฐ˜์˜ ํ† ํฐ(์ดํ•˜ ํ† ํฐ)์˜ ์ˆ˜๋Ÿ‰์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ํ˜„์žฌ ๊ณ„์ •์ด ๋ณด์œ ํ•˜๊ณ  ์žˆ๋Š” NFT์˜ ์ˆ˜๋Ÿ‰์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

  4. ๋ชฉ๋ก ์กฐํšŒ
    • ํ˜„์žฌ ๊ณ„์ •์ด ๋ณด์œ ํ•œ ํ† ํฐ์˜ ๋ชฉ๋ก์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ํ˜„์žฌ ๊ณ„์ •์ด ๋ณด์œ ํ•œ NFT์˜ ๋ชฉ๋ก์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

  5. ์ž์‚ฐ ์ „์†ก
    • ํ˜„์žฌ ๊ณ„์ •์ด ๋ณด์œ ํ•œ ๋„ค์ดํ‹ฐ๋ธŒ ํ† ํฐ์„ ๋‹ค๋ฅธ ๊ณ„์ •์œผ๋กœ ์ „์†กํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ํ˜„์žฌ ๊ณ„์ •์ด ๋ณด์œ ํ•œ ํ† ํฐ์„ ๋‹ค๋ฅธ ๊ณ„์ •์œผ๋กœ ์ „์†กํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ํ˜„์žฌ ๊ณ„์ •์ด ๋ณด์œ ํ•œ NFT๋ฅผ ๋‹ค๋ฅธ ๊ณ„์ •์œผ๋กœ ์ „์†กํ•  ์ˆ˜ ์žˆ๋‹ค.

  6. ์ž์‚ฐ ์ „์†ก ํžˆ์Šคํ† ๋ฆฌ ์กฐํšŒ
    • ๊ณ„์ •์ด ์ „์†กํ•œ ์ž์‚ฐ์— ๋Œ€ํ•œ ์ „์†ก ์ด๋ ฅ์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฐ„๋‹จํ•œ ํ™”๋ฉด์„ ๊ธฐํšํ•˜๊ณ  ์š”๊ตฌ์‚ฌํ•ญ์— ๋งž์ถฐ ํ•„์š”ํ•œ API๋ฅผ ์‚ดํŽด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-10-10 แ„‹แ…ฉแ„’แ…ฎ 4.45.51.png
  • ๊ณ„์ • ์ƒ์„ฑ ๋ฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ (Ethers.js)
  • ๋„คํŠธ์›Œํฌ ์„ ํƒ (eth_chainId)

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-10-10 แ„‹แ…ฉแ„’แ…ฎ 5.09.13.png
  • ๋ณด์œ  ์ค‘์ธ ํ† ํฐ ์ข…๋ฅ˜ ๋ฐ ์ˆ˜๋Ÿ‰ ์กฐํšŒ (getTokensOwnedByAccount)

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-10-10 แ„‹แ…ฉแ„’แ…ฎ 4.51.15.png
  • ๋ณด์œ  ์ค‘์ธ ๋„ค์ดํ‹ฐ๋ธŒ ํ† ํฐ ์ˆ˜๋Ÿ‰ ์กฐํšŒ (getNativeBalanceByAccount)

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-10-10 แ„‹แ…ฉแ„’แ…ฎ 4.47.52.png
  • ๋„ค์ดํ‹ฐ๋ธŒ ํ† ํฐ ์ „์†ก (eth_sendRawTransaction)
  • ํ† ํฐ ์ „์†ก (eth_sendRawTransaction)
  • NFT ์ „์†ก (eth_sendRawTransaction)

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-10-10 แ„‹แ…ฉแ„’แ…ฎ 4.48.06.png
  • ํ† ํฐ ์ „์†ก ํžˆ์Šคํ† ๋ฆฌ ์กฐํšŒ (getTokenTransfersByAccount)
  • NFT ์ „์†ก ํžˆ์Šคํ† ๋ฆฌ ์กฐํšŒ (getNftTransfersByAccount)

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-10-10 แ„‹แ…ฉแ„’แ…ฎ 4.48.20.png
  • ํ† ํฐ ์ „์†ก ํŠธ๋žœ์žญ์…˜ ๊ฒฐ๊ณผ ์กฐํšŒ (getTokenTransfersByAccount, getNftTransfersByAccount)

Step 2. ๊ฐœ๋ฐœํ™˜๊ฒฝ ์„ค์ •

Wallet DApp ๊ตฌํ˜„์„ ์œ„ํ•ด ์•„๋ž˜ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ตฌ์„ฑ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์„ค์น˜๋ฅผ ์œ„ํ•œ ๋„์›€์ด ํ•„์š”ํ•˜๋‹ค๋ฉดย ์—ฌ๊ธฐ๋ฅผ ํด๋ฆญํ•ด์ฃผ์„ธ์š”.

VS Codeย Required

์†Œ์Šค ์ฝ”๋“œ ํŽธ์ง‘๊ธฐ๋กœ ์ฝ”๋“œ๋ฅผ ์†์‰ฝ๊ฒŒ ์ž‘์„ฑํ•˜๊ณ  ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Node.jsย Required

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์„ ์œ„ํ•ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

gitย Optional

๋ถ„์‚ฐ ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์œผ๋กœ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋กœ์ปฌ ํ™˜๊ฒฝ์— ๋‹ค์šด๋กœ๋“œ ๋ฐ›๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์™ธ์— ์‚ฌ์šฉ๋œ ํ”„๋ ˆ์ž„์›Œํฌ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” Step 4. ์˜ˆ์ œ์ฝ”๋“œ์˜ย package.jsonย ํŒŒ์ผ์„ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”.


Step 3. API ์—ฐ๋™ํ•˜๊ธฐ

์ด๋ฏธ ํ”„๋กœ์ ํŠธ ๊ตฌํ˜„์— ํ•„์š”ํ•œ API๋“ค์„ ์‚ดํŽด๋ณด๊ณ  ํ˜ธ์ถœ ์‹œ ์‘๋‹ต์ด ์–ด๋–ป๊ฒŒ ์˜ค๋Š”์ง€ ํ™•์ธํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ด API๋“ค์„ ์ด์šฉํ•ด ํ”„๋ก ํŠธ์—”๋“œ ์ฝ”๋“œ์— ์—ฐ๋™ํ•ด ๋ณผ๊นŒ์š”?

๐Ÿ“˜

Nodit API Key๋ฅผ ๋ฐœ๊ธ‰ ๋ฐ›์œผ์…จ๋‚˜์š”?

Nodit API๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Nodit API Key๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์•„์ง Nodit์„ ์‹œ์ž‘ํ•˜์ง€ ์•Š์œผ์…จ๋‹ค๋ฉด ์•„๋ž˜ ๋งํฌ๋œ ํŽ˜์ด์ง€์˜ ์•ˆ๋‚ด์— ๋”ฐ๋ผ Nodit ์ฝ˜์†”์— ๊ฐ€์ž…ํ•˜๊ณ , ๊ฐœ๋ฐœ ์—ฐ๋™์„ ์œ„ํ•œ API Key๋ฅผ ๋ฐœ๊ธ‰๋ฐ›์•„๋ณด์„ธ์š”. ์‹œ์ž‘์€ ๋ฌด๋ฃŒ์ž…๋‹ˆ๋‹ค!

๐Ÿ‘‰ย Nodit Node Quickstart


ํ”„๋ก ํŠธ์—”๋“œ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ ์„ค๊ณ„ํ•˜์—ฌ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-10-10 แ„‹แ…ฉแ„’แ…ฎ 5.00.12.png
  1. ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์— ์˜ํ•ด ์‹ค์ œ ๋ธ”๋ก์ฒด์ธ๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ์„œ๋ฒ„
  2. ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ ์ „๋‹ฌํ•  ํ”„๋กœํ† ์ฝœ์„ ์„ค์ •ํ•˜๋Š” ์ฝ”๋“œ
  3. ํ”„๋กœํ† ์ฝœ ์ด์šฉํ•ด Nodit API๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜์™€ ์ด๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ฝ”๋“œ
  4. API ํ˜ธ์ถœ ์‘๋‹ต์œผ๋กœ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”์ธ๋”ฉํ•ด ์ปดํฌ๋„ŒํŠธ ๋ฐ ํŽ˜์ด์ง€๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์ฝ”๋“œ

์ด 4๊ฐ€์ง€ ์ค‘ 1๋ฒˆ, ๋ธ”๋ก์ฒด์ธ๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ์„œ๋ฒ„๋Š” ์ด๋ฏธ Nodit์—์„œ ์ œ๊ณตํ•˜๋ฏ€๋กœ ์ƒ๋žตํ•˜๊ณ  ๋‚˜๋จธ์ง€ ๋‹จ๊ณ„๋ฅผ ๊ตฌํ˜„ํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์šฐ์„  Nodit์˜ API Key๋ฅผ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์„ค์ •ํ•˜์—ฌ ํ•˜๋‚˜์˜ ํŒŒ์ผ์—์„œ ๊ด€๋ฆฌํ•˜๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

// .env

VITE_API_KEY=Your_Nodit_API_Key

ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ํŒŒ์ผ์— ์ž‘์„ฑํ•œ ๊ฐ’์„ ๋ถˆ๋Ÿฌ์™€ ์„ค์ •๋œ ํ”„๋กœํ† ์ฝœ, ๋„คํŠธ์›Œํฌ ๊ฐ’์„ ์ด์šฉํ•ด ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋Š” Aixos ์ธ์Šคํ„ด์Šค๋ฅผ ์„ค์ •ํ•˜๋Š” ์ฝ”๋“œ ์ž…๋‹ˆ๋‹ค.

// apis/instance.ts

import axios, { AxiosInstance } from "axios";
const apiKey = import.meta.env.VITE_API_KEY;

export function createWeb3ApiInstance(
  protocol: string,
  network: string
): AxiosInstance {
  const instance = axios.create({
    baseURL: `https://web3.nodit.io/v1/${protocol}/${network}`,
    headers: {
      "X-API-KEY": `${apiKey}`,
      "Content-Type": "application/json",
      Accept: "application/json",
    },
  });
  return instance;
}

...

Axios ์ธ์Šคํ„ด์Šค๋ฅผ ์ด์šฉํ•ด API๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ํ•จ์ˆ˜๋Š” ์œ ์ €์˜ ์•ก์…˜์— ๋”ฐ๋ผ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

// utils/useQueries.ts

export const useGetNativeTokenBalance = (
  protocol: string,
  network: string,
  address: string
) => {
  return useQuery({
    queryKey: ["getNativeTokenBalance", protocol, network, address],
    queryFn: async () => {
      try {
        const result = await createWeb3ApiInstance(protocol, network).post(
          "/native/getNativeBalanceByAccount",
          { accountAddress: address }
        );
        console.log(result);
        return result;
      } catch (error) {
        console.error(error);
      }
    },
    retry: false,
  });
};

...

API ํ˜ธ์ถœ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ์ด์šฉํ•ด ํ™”๋ฉด์— ๋ณด์ผ ํŽ˜์ด์ง€๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ์ฝ”๋“œ ์ž…๋‹ˆ๋‹ค.

// page/Main.tsx 

import React, { useEffect, useMemo, useState } from "react";
import { useWalletStore } from "../../stores/useStore";
import { useGetNativeTokenBalance } from "../utils/useQueries";
import { useProtocolAndNetworkStore } from "../../stores/useStore";
import { useNavigate } from "react-router-dom";
import { formatUnits } from "ethers";

const Main = (): React.ReactElement => {
  const { protocol, network } = useProtocolAndNetworkStore();
  const { address } = useWalletStore();

// Get the native token balance of a specific address
  const {
    data: nativeTokenData,
    isLoading: isGetNativeTokenBalanceLoading,
    isError: isGetNativeTokenBalanceError,
  } = useGetNativeTokenBalance(protocol, network, address);

	...
	
// Error and loading handling 
	if (isGetNativeTokenBalanceError) return <div>error</div>;
  if (isGetNativeTokenBalanceLoading) return <div>loading</div>;
  
  return (
    <div>
        <h1 className="font-bold mt-10">{address}</h1>
        <p className="mt-5">
          Native Token Balance : {getNativeTokenData}
        </p>
		</div>
	);
};
	
export default Main;

ํ™”๋ฉด์— ์•„๋ž˜์™€ ๊ฐ™์ด ํ•ด๋‹น ๊ณ„์ •์ด ๋ณด์œ ํ•œ ๋„ค์ดํ‹ฐ๋ธŒ ํ† ํฐ์˜ ์ž”๊ณ ๋ฅผ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-10-08 แ„‹แ…ฉแ„’แ…ฎ 3.19.46.png

์ด์™€ ๋™์ผํ•˜๊ฒŒ API๋ฅผ ํ˜ธ์ถœํ•ด ์–ป์€ ๊ฒฐ๊ณผ๊ฐ’์„ ์ด์šฉํ•ด ํ•„์š”ํ•œ ํŽ˜์ด์ง€๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ๋ณด์œ ํ•œ NFT์˜ ๋ชฉ๋ก์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ํŽ˜์ด์ง€๋ฅผ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.


์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•ด ๊ตฌํ˜„์ด ํ•„์š”ํ•œ ๋ชจ๋“  ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค์–ด ๋ณด์„ธ์š”. ํ˜น์€ Step 4์˜ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•ด Nodit EVM Wallet์˜ ๋™์ž‘์„ ํ™•์ธํ•ด ๋ณด์„ธ์š”!


Step 4. ์˜ˆ์ œ ์ฝ”๋“œ๋กœ ๋™์ž‘ ํ™•์ธํ•˜๊ธฐ

์œ„์—์„œ ๊ตฌํ˜„ํ•œ ๋‚ด์šฉ์„ ํฌํ•จํ•œ, ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด๋†“์€ ์˜ˆ์ œ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ณต์œ ํ•ด ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

  • ์†Œ์Šค ์ฝ”๋“œ ๋‹ค์šด๋กœ๋“œ ๋ฐ ์ ‘๊ทผ
$ git clone https://github.com/Lambda256/Nodit-EVM-Tutorials
$ cd Nodit-EVM-Tutorials
$ cd wallet_tutorial

  • ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐํ™” ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜
$ npm install

์‚ฌ์šฉ์ž์˜ Nodit API Key๋ฅผ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

// .env

VITE_API_KEY=Your_Nodit_API_Key

ํ™˜๊ฒฝ ์„ค์ •์„ ์™„๋ฃŒํ•œ ํ›„ ํ„ฐ๋ฏธ๋„์— ์•„๋ž˜์˜ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜์—ฌ Nodit EVM Wallet์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

$ npm run dev

์•„๋ž˜์™€ ๊ฐ™์€ ํ™”๋ฉด์ด ๋œจ๋ฉด ์ •์ƒ์ ์œผ๋กœ ๊ตฌ๋™๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค! ๊ธฐ๋Šฅ์„ ํ™•์ธํ•ด๋ณด์„ธ์š”.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-10-08 แ„‹แ…ฉแ„’แ…ฎ 1.15.30.png แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-10-10 แ„‹แ…ฉแ„’แ…ฎ 4.48.06.png

Congratulation! ๐ŸŽŠ

EVM ์ง€๊ฐ‘ ๋งŒ๋“ค๊ธฐ ํŠœํ† ๋ฆฌ์–ผ์„ ๋ชจ๋‘ ์™„๋ฃŒํ•˜์˜€์Šต๋‹ˆ๋‹ค! ์ด์ œ ๋‹ค๋ฅธ Nodit API๋ฅผ ์ด์šฉํ•˜์—ฌ ๋‚˜๋งŒ์˜ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด ๋ณด์„ธ์š”.

๐Ÿ“˜

๋”์šฑ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง„ Nodit์˜ API๊ฐ€ ๊ถ๊ธˆํ•˜์‹ ๊ฐ€์š”? ์•„๋ž˜ ๋งํฌ๋ฅผ ๋ˆŒ๋Ÿฌ ํ™•์ธํ•ด ๋ณด์„ธ์š”!

Nodit API Reference ๋ฐ”๋กœ๊ฐ€๊ธฐ