JavaScript
Blockchain
NEM
nemDay 12

仮想通貨NEMアプリをスピード開発する小技・Tips

More than 1 year has passed since last update.

仮想通貨NEMがIT技術者の周りでにわかに注目を集めています。
NEMは柔軟なAPIが提供されているため、送金や情報管理などのアプリケーションを手軽に構築できる可能性を秘めています。

今回は仮想通貨NEMのAPIを利用してWebアプリをスピード開発するためのノウハウを紹介します。

後日整理するかもしれませんが、突貫エントリーのため、解説なしです。

金額を3ケタカンマ、小数点表記に変換する

sample.js
var dispAmount2 = function(amount,divisibility){
    if(divisibility > 0){

        if(amount < Math.pow(10, divisibility)){

            return "0." + paddingright(amount.toString(),0,divisibility);
        }else{
            var str_amount = amount.toString();
            var r = str_amount.slice(-divisibility);
            var l = str_amount.substring(0,str_amount.length - divisibility);
            l = l.replace( /(\d)(?=(\d\d\d)+(?!\d))/g, '$1,');
        }
        return l + "." + r;

    }else{
        l = amount.toString().replace( /(\d)(?=(\d\d\d)+(?!\d))/g, '$1,');
        return l
    }

}
function paddingright(val,char,n){
    for(; val.length < n; val= char + val);
    return val;
}

チェーンに刻まれたHEX文字を日本語メッセージに変換する

sample.js
var hex2a = function hex2a(hexx) {
    var hex = hexx.toString();
    var str = '';
    for (var i = 0; i < hex.length; i += 2) {
        str += String.fromCharCode(parseInt(hex.substr(i, 2), 16));
    }
    return str;
};

ハイフン無し、小文字アドレスを大文字に統一する

sample.js
address = address.replace( /-/g , "" ).toUpperCase();

Google先生にウォレット対応QRコードを出力してもらう

sample.js
var bill = '{"v":2,"type":2,"data":{"addr":"' + ADDRESS + '","amount":1000000,"msg":"' + msg + '"}}';
$("#qr").attr("src","http://chart.apis.google.com/chart?chs=180x180&cht=qr&chl=" + bill);

poloniexとblockchain.infoからxemの現在価格を日本円で計算する

sample.js
$.when(
    sendAjax("https://poloniex.com/public?command=returnTicker"),
    sendAjax("https://blockchain.info/ticker?cors=true")
)
.done(function(res1, res2) {

    POLO_JPY_XEM = res1[0].BTC_XEM.last * res2[0].JPY.last;
    POLO_JPY_XEM = Math.round(POLO_JPY_XEM * 1000) / 1000;
})
.fail(function(xhr, textStatus, errorThrown) {
    alert("時価の取得に失敗しました。");
});

URL部分に指定されたアドレスをスクリプト内で利用する。

sample.js
var address ="";
if (1 < document.location.search.length) {

    var query = document.location.search.substring(1);
    var prms = query.split('&');
    var item = new Object();
    for (var i = 0; i < prms.length; i++) {
        var elm   = prms[i].split('=');
        var idx   = decodeURIComponent(elm[0]);
        var val   = decodeURIComponent(elm[1]);
        item[idx] = decodeURIComponent(val);
    }
    address = item["address"];
}

if( address == ""){
    var address = prompt('NEMアドレスを入力してください',address);
}

モザイク、マルチシグなどで構成された複雑なトランザクションからXEMだけを抽出する。

sample.js
var tran = val.transaction;

var tran_amount = 0;
var tran_fee = tran.fee;

if(tran.type == 4100){

    tran_fee    = tran.otherTrans.fee + tran.fee ;
    tran = tran.otherTrans;
}

if (tran.type == 257 || tran.type == 8193 ){

    //モザイクが存在した場合
    var has_mosaic = false;
    if(tran.mosaics){

        for(key  in tran.mosaics){
            has_mosaic = true;
            var mosaic = tran.mosaics[key];
            if(mosaic.mosaicId.name == "xem" && mosaic.mosaicId.namespaceId == "nem"){
                tran_amount = mosaic.quantity;
            }
        }
    }
    //通常送金
    if(!has_mosaic){
        if (tran.type == 8193 ){
            tran_amount = tran.rentalFee;

        }else{
            tran_amount = tran.amount;
        }
    }
}