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");
});
댓글