steemkr
Version:
스팀잇 기반 CLI 툴 : CLI(Command Line Interface) Tool for steemit.
238 lines (203 loc) • 6.85 kB
JavaScript
const help = require('./help');
const {getLocalTime} = require('../util/wdate');
const {to} = require('../util/wutil');
const {question} = require('../util/wutil');
const {getMoney} = require('../util/wsteem');
const steem = require('steem');
const dateFormat = require('dateformat');
const ora = require('ora');
// 기본값
const STEEM_AUTHOR = process.env.STEEM_AUTHOR;
const STEEM_KEY_ACTIVE = process.env.STEEM_KEY_ACTIVE;
/*
* 파라미터 정보를 초기화 해준다
* @param args 외부로부터 입력받은 파라미터
*/
function initParams(args)
{
// 초기화
args = args?args:[]; // new 처리 하므로 return 처리 해야 됨에 유의
// 1번째 : 작가
if(args.length==0){
if(STEEM_AUTHOR){
args.push(STEEM_AUTHOR);
}
}
// 2번째 : 엑티브키(3 steem 필요 하기 때문)
if(args.length==1){
if(STEEM_KEY_ACTIVE){
args.push(STEEM_KEY_ACTIVE);
}
}
return args;
}
/*
* 계정 생성 비용을 반환한다
* @param config 설정정보
* @param chainProps 설정정보
* @return 계정 생성비용
*/
function getFee(config, chainProps) {
var ratio = config['STEEM_CREATE_ACCOUNT_WITH_STEEM_MODIFIER'];
var fee = Number(chainProps.account_creation_fee.split(" ")[0]); // 0.100 STEEM
return (ratio * fee).toFixed(3) + " STEEM";
}
/*
* 계정을 생성한다
* @param cid 신규계정명
*/
async function createAccount(account, wif, cid, fee, remain)
{
const roles = ["POSTING", "ACTIVE", "OWNER", "MEMO"];
// 랜덤 암호 생성 및 공개키, 개인키를 생성한다.
const newAccountPassword = steem.formatter.createSuggestedPassword();
const arrPublicKey = steem.auth.generateKeys(cid, newAccountPassword, roles);
const arrPrivateKey = steem.auth.getPrivateKeys(cid, newAccountPassword, roles);
const owner = {
weight_threshold: 1,
account_auths: [],
key_auths: [
[arrPublicKey["OWNER"], 1]
]
};
const active = {
weight_threshold: 1,
account_auths: [],
key_auths: [
[arrPublicKey["ACTIVE"], 1]
]
};
const posting = {
weight_threshold: 1,
account_auths: [],
key_auths: [
[arrPublicKey["POSTING"], 1]
]
};
let err,created;
[err, created] = await to(steem.broadcast.accountCreateAsync(wif, fee, account, cid, owner, active, posting, arrPublicKey.MEMO,''));
if(err){
return Promise.reject(err);
}else{
return Promise.resolve({account:account, cid:cid, fee:fee, remain:remain, arrPrivateKey:arrPrivateKey });
}
}
/*
* 비동기 작업을 수행한다 (계정생성처리)
* @param account 계정명
* @param wif 해당 계정의 ACTIVE키
*/
async function processAsyc(account, wif){
let err;
// 생성하려는 아이디정보 확인
let cid;
[err,cid] = await to(question(`만들려고 하는 ID를 입력 바랍니다 : `));
// 아이디 유효성 검증
let isValidUsername = steem.utils.validateAccountName(cid);
if(isValidUsername!=null){
// 최소 3자, 최대 16자, .기준 최소 3글자 이상
return Promise.reject(isValidUsername);
}
// 생성하려는 아이디 존재여부 확인
let mid;
spinner = ora().start(`check ${cid} is exist ?`);
[err,mid] = await to(steem.api.getAccountsAsync([cid]));
if(!err){
spinner.succeed();
if(mid && mid.length==1){
return Promise.reject(`${cid} 은(는) 존재하는 ID 입니다.`);
}else{
console.log(`${cid} 은(는) 사용하실 수 있습니다.`);
}
}
// config 정보 읽어들이기
let config;
if(!err){
spinner = ora().start('loading config');
[err,config] = await to(steem.api.getConfigAsync());
}
// chainProps 정보 읽어들이기
let chainProps;
if(!err){
spinner.succeed();
spinner = ora().start('loading chainProps');
[err,chainProps] = await to(steem.api.getChainPropertiesAsync());
}
// 내계정의 잔고 확인
let myacc;
if(!err){
spinner.succeed();
spinner = ora().start(`check my account balance`);
[err,myacc] = await to(steem.api.getAccountsAsync([account]));
}
// 가져온 값 유효성 검증
let fee, remain;
if(!err){
spinner.succeed();
if(myacc && myacc.length==0){
return Promise.reject(`내 계정 ( ${account} ) 정보가 존재하지 않습니다.`);
}
// 추후(HF20) 이후에는 증인들이 제시한 값만 가지고 생성 할 예정이라 함.
let balance = myacc[0].balance;
fee = getFee(config, chainProps);
remain = getMoney(balance) - getMoney(fee);
if(remain<0){
return Promise.reject(`내 계정 잔고( ${balance} )가 모자릅니다 : 최소 ${fee} 이상 필요`);
}
}
// 가져온 값 연산처리
let cacc;
if(!err){
spinner = ora().start(`create account`);
[err,cacc] = await to(createAccount(account, wif, cid, fee, remain));
if(!err){
spinner.succeed();
}
}
if(err){
// 오류처리
spinner.fail();
return Promise.reject(err.toString());
}
return Promise.resolve(cacc);
}
module.exports = (args)=>{
// 파라미터 초기화
args = initParams(args);
// 입력 파라미터 유효성 검증
if(args.length<2){
console.error('\n [경고] 파라미터 오류 : 아래 메뉴얼을 참조 바랍니다');
help('create');
return;
}
let account = args[0];
let wif = args[1];
processAsyc(account, wif)
.then(res=>{
// 생성된 계정 정보를 화면에 출력한다
console.log(`____________________________________________________________`);
console.log(`${res.account} 계정에서 ${res.fee} 를 소모하여 @${res.cid} 계정을 생성하였습니다. ( 계정 잔액 : ${res.remain} STEEM )`);
console.log(`____________________________________________________________`);
console.log(`private key`);
console.log(`____________________________________________________________`);
console.log(`POSTING : ${res.arrPrivateKey.POSTING}`);
console.log(`ACTIVE : ${res.arrPrivateKey.ACTIVE}`);
console.log(`OWNER : ${res.arrPrivateKey.OWNER}`);
console.log(`MEMO : ${res.arrPrivateKey.MEMO}`);
console.log(`____________________________________________________________`);
console.log(`public key`);
console.log(`____________________________________________________________`);
console.log(`POSTING : ${res.arrPrivateKey.POSTINGPubkey}`);
console.log(`ACTIVE : ${res.arrPrivateKey.ACTIVEPubkey}`);
console.log(`OWNER : ${res.arrPrivateKey.OWNERPubkey}`);
console.log(`MEMO : ${res.arrPrivateKey.MEMOPubkey}`);
console.log(`____________________________________________________________`);
})
.catch(e=>{
console.log(`____________________________________________________________`);
console.error(e);
console.log(`____________________________________________________________`);
console.error('오류가 발생 했습니다.위쪽 라인을 참조 바랍니다.');
console.log(`____________________________________________________________`);
});
};