Edited at
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;
}
}
}