본문 바로가기
블록체인 기술사업 교육/Node.js

블록체인 기술사업 교육 35일차

by Mecodata 2023. 5. 23.

JavaScript로 KAS를 이용하여 토큰 생성, 전송, 조회

token.js

const CaverExtKAS = require("caver-js-ext-kas");
const caver = new CaverExtKAS();

// KAS에 접속하기 위한 KAS ID, password (kas.json에 따로 저장함)
const kas_info = require("./kas.json");
const accessKeyId = kas_info.accessKeyId;
const secretAccessKey = kas_info.secretAccessKey;

// 테스트넷 chainID
const chainId = 1001;

caver.initKASAPI(chainId, accessKeyId, secretAccessKey);

// 사용할 외부 지갑 주소 등록
const keyringContainer = new caver.keyringContainer();
const keyring = keyringContainer.keyring.createFromPrivateKey(
  "private key"
);
keyringContainer.add(keyring);

// 토큰 생성 함수 (kip7)
async function create_token(_name, _symlbol, _decimal, _amount) {
  const kip7 = await caver.kct.kip7.deploy(
    {
      name: _name, // 토큰명
      symbol: _symlbol, // 토큰 심볼
      decimals: _decimal, // 소숫점 자리수
      initialSupply: _amount, // 초기 발행량
    },
    keyring.address,
    keyringContainer
  );
  console.log(kip7._address);
  return kip7._address;
}

// create_token("Lunch", "LH", 0, 1000000000);

// 토큰 거래 함수
async function trans_token(_token, _address, _amount) {
  const kip7 = await new caver.kct.kip7(_token);
  kip7.setWallet(keyringContainer);

  // 발행한 토큰을 지정한 주소로 전송
  const receipt = await kip7.transfer(_address, _amount, {
    from: keyring.address,
  });
  console.log(receipt);
  return receipt;
}

// trans_token("토큰 주소", 토큰 양);

// 유저가 토큰 발행자에게 토큰 전송
async function trans_from_token(_token, _private, _amount) {
  const kip7 = await new caver.kct.kip7(_token);
  kip7.setWallet(keyringContainer);

  // 토큰 발행자의 지갑 주소
  const owner = keyring.address;
  console.log(owner);

  // 유저의 지갑 주소를 container에 추가
  const keyring2 = keyringContainer.keyring.createFromPrivateKey(_private);
  keyringContainer.add(keyring2);

  // approve(권한을 받을 주소, 토큰의 양, from)
  await kip7.approve(owner, _amount, { from: keyring2.address });

  const receipt = await kip7.transferFrom(keyring2.address, owner, _amount, {
    from: owner,
  });
  console.log(receipt);
  return receipt;
}

// 오너가 오너의 지갑이 아닌 다른 사람의 지갑의 토큰을 이동하려고 하면 에러 발생
// 유저가 토큰에 대한 권한을 오너에게 지정하면 예방 가능 (approve())
// approve() : 자신의 지갑에서 일정 양의 토큰을 다른사람이 이동시킬 수 있도록 허가
// transferFrom()을 사용하려면 approve() 이용 필수!
// trans_from_token("지갑 주소", 토큰 양);

// 토큰 양 조회
// 데이터 변화 X => 트랜잭션 발생 X => 가스비 X
async function balance_of(_token, _address) {
  const kip7 = await new caver.kct.kip7(_token);
  kip7.setWallet(keyringContainer);

  const balance = await kip7.balanceOf(_address);
  console.log(balance);
  return balance;
}

// balance_of("지갑 주소");

// KAS 내에 지갑 생성
async function create_wallet() {
  const wallet = await caver.kas.wallet.createAccount();
  console.log(wallet);
  return wallet;
}

module.exports = {
  create_token,
  create_wallet,
  trans_token,
  balance_of,
  trans_from_token,
}; // 외부에서도 사용가능하게

index.js

const express = require("express");
const app = express();

app.set("views", __dirname + "/views");
app.set("view engine", "ejs");

app.use(express.urlencoded({ extended: false }));

const token = require("./token.js"); // token.js 모듈화

app.get("/", (req, res) => {
  res.render("index");
});

app.get("/create-wallet", async (req, res) => {
  const wallet = await token.create_wallet();
  console.log(wallet);
  res.send(wallet);
});

app.get("/create-token", (req, res) => {
  res.render("create_token");
});

app.post("/create-token2", async (req, res) => {
  const name = req.body._name;
  const symbol = req.body._symbol;
  const decimal = Number(req.body._decimal);
  const amount = Number(req.body._amount);
  console.log(name, symbol, decimal, amount);

  const token_address = await token.create_token(name, symbol, decimal, amount);
  console.log(token_address);
  res.send(token_address);
});

app.get("/trans-token", (req, res) => {
  res.render("trans_token");
});

app.post("/trans-token2", async (req, res) => {
  const _token = req.body._token;
  const _address = req.body._address;
  const _amount = Number(req.body._amount);
  console.log(_token, _address, _amount);

  await token.trans_token(_token, _address, _amount);
  res.redirect("/");
});

app.get("/token-balance", (req, res) => {
  res.render("token_balance");
});

app.post("/token-balance2", async (req, res) => {
  const _address = req.body._address;
  const _token = req.body._token;
  console.log(_address, _token);

  const balance = await token.balance_of(_token, _address);
  res.send(balance);
});

app.listen(3000, () => {
  console.log("Server Start");
});

댓글