cocos_android/js/main.js
2022-08-19 17:06:56 +08:00

337 lines
9.4 KiB
JavaScript

console.log('>>hi tiny wallet3')
if (window.JavascriptJavaBridge) {
console.log('regist android jsb.reflection')
jsb.reflection = new JavascriptJavaBridge();
} else if (window.JavaScriptObjCBridge) {
jsb.reflection = new JavaScriptObjCBridge();
}
/**
* 初始化钱包, 所有操作进行前, 必须调用此方法
* @param {string} password: 用于加密钱包数据的密码
*/
function initWallet(funId,password) {
try {
if ( !window.jc || !jc.wallet ) {
var wallet = new jcwallet.default(password);
}
let address = jc.wallet.currentAccount().address
return JSON.stringify({errcode: 0, data: address});
} catch(err) {
return JSON.stringify({errcode: 1, errmsg: err});
}
}
/**
* 钱包当前激活的帐号的详细信息
*/
function currentAccount(funId) {
try {
let data = jc.wallet.currentAccountData;
return JSON.stringify({errcode: 0, data});
} catch(err) {
return JSON.stringify({errcode: 1, errmsg: err});
}
}
/**
* 获取当前链所有帐号列表
*/
function accountList(funId) {
try {
let data = jc.wallet.accounts;
return JSON.stringify({errcode: 0, data});
}catch(err) {
return JSON.stringify({errcode: 1, errmsg: err});
}
}
/**
* 获取所有支持的链的列表
*/
function chainList(funId) {
try {
let data = jc.wallet.chainList;
return JSON.stringify({errcode: 0, data});
}catch(err) {
return JSON.stringify({errcode: 1, errmsg: err});
}
}
/**
* 当前链的信息
*/
function currentChain(funId) {
try {
let data = jc.wallet.currentChain;
return JSON.stringify({errcode: 0, data});
}catch(err) {
return JSON.stringify({errcode: 1, errmsg: err});
}
}
/**
* 切换当前链
* 切换链需要调用currentAccount方法, 以刷新界面显示
*/
function changeChain(funId,chainId) {
try {
chainId = parseInt(chainId);
let data = jc.wallet.updateCurrentChain(chainId);
return JSON.stringify({errcode: 0, data});
}catch(err) {
return JSON.stringify({errcode: 1, errmsg: err});
}
}
/**
* 获取当前帐户的登录签名
* @param {string} nonce: 从服务端获取的nonce
* @param {string} tips: 签名时的提示
*/
function loginSign(funId, nonce, tips) {
try {
let result = jc.wallet.loginSign(nonce, tips);
return JSON.stringify({errcode: 0, data: result});
} catch(err) {
return JSON.stringify({errcode: 1, errmsg: err});
}
}
/**
* 创建一个新帐号, 并将新建帐号设为当前激活帐号
* @return {string} 当前激活帐户的地址
*/
function createAccount(funId) {
try {
let result = jc.wallet.createAccount();
return JSON.stringify({errcode: 0, data: result});
} catch(err) {
return JSON.stringify({errcode: 1, errmsg: err});
}
}
/**
* 用导入一个密钥, 并将导入的帐号设为当前激活帐号
* @return {string} 当前激活帐户的地址
*/
function importAccount(funId, privateKey) {
try {
let address = jc.wallet.importAccount(privateKey)
return JSON.stringify({errcode: 0, data: address});
} catch(err) {
return JSON.stringify({errcode: 1, errmsg: err});
}
}
/**
* 将一个帐号地址设为当前激活帐号
*/
function selectAccount(funId, address) {
try {
let result = jc.wallet.selectAccount(address);
return JSON.stringify({errcode: 0, data: result});
} catch(err) {
return JSON.stringify({errcode: 1, errmsg: err});
}
}
/**
* 获取当前链上基础代币的余额
* @param {string} address: 待查询的帐户地址
* 不传的话, 则获取当前帐户的余额
*/
function getEthBalance(funId, address) {
jc.wallet.getBalance(address)
.then(result => {
jsb.jcCallback(funId, JSON.stringify({errcode: 0, data: result}));
}).catch(err => {
jsb.jcCallback(funId, JSON.stringify({errcode: 1, errmsg: err}));
})
}
/**
* 将当前帐户里的基础代币转账给别人
* @param {string} to: 转账目标地址
* @param {string} amount: 转账数量
*/
function sendEth(funId, to, amount) {
jc.wallet.sendEth(to, amount)
.then(result => {
jsb.jcCallback(funId, JSON.stringify({errcode: 0, data: result}));
}).catch(err => {
jsb.jcCallback(funId, JSON.stringify({errcode: 1, errmsg: err}));
})
}
/**
* 生成hash图片
* @param {string} msg: 要生成图片的内容
* @param {string} diameter: 图片尺寸
*/
function generateIcon(funId, msg, diameter) {
try {
diameter = parseFloat(diameter);
let result = jc.wallet.generateIconData(msg, diameter);
return JSON.stringify({errcode: 0, data: result});
} catch(err) {
return JSON.stringify({errcode: 1, errmsg: err});
}
}
/**
* 获取ERC20代币的基本信息, 包括symbol和decimal
* 这些信息一般都不会变化, 客户端需缓存这些信息
* @param {string} address: 代币的地址
*/
function erc20Info(funId, address) {
jc.wallet.erc20Info(address)
.then(result => {
jsb.jcCallback(funId, JSON.stringify({errcode: 0, data: result}));
}).catch(err => {
jsb.jcCallback(funId, JSON.stringify({errcode: 1, errmsg: err}));
})
}
/**
* 获取erc20代币的余额
* @param {string} address: 代币地址
* @param {string} account: 所属帐户的地址, 不传该参数的话, 获取当前钱包激活帐户的余额
*/
function erc20Balance(funId, address, account) {
jc.wallet.erc20Balance(address, account)
.then(result => {
jsb.jcCallback(funId, JSON.stringify({errcode: 0, data: result}));
}).catch(err => {
jsb.jcCallback(funId, JSON.stringify({errcode: 1, errmsg: err}));
})
}
function sendErc20(funId, address, to, amount) {
jc.wallet.sendErc20(address, to, amount)
.then(result => {
jsb.jcCallback(funId, JSON.stringify({errcode: 0, data: result}));
}).catch(err => {
jsb.jcCallback(funId, JSON.stringify({errcode: 1, errmsg: err}));
})
}
function restoreFromMnemonic(funId, mnemonic, password) {
try {
diameter = parseFloat(diameter);
let result = jc.wallet.restoreFromMnemonic(mnemonic, password);
return JSON.stringify({errcode: 0, data: result});
} catch(err) {
return JSON.stringify({errcode: 1, errmsg: err});
}
}
function _subscribeToEvents(connector) {
// Subscribe to connection events
connector.on("connect", (error, payload) => {
if (error) {
console.log('connect wallet error: ' + error);
return;
}
// Get provided accounts and chainId
const { accounts, chainId } = payload.params[0];
console.log('connected: ' + accounts[0] + ' ' + chainId);
window.account = accounts[0];
});
connector.on("session_update", (error, payload) => {
if (error) {
console.log('session_update error: ' + error);
return;
}
// Get updated accounts and chainId
const { accounts, chainId } = payload.params[0];
console.log("session_update", accounts, chainId);
this.node.emit("client_session_update", {
account: accounts[0],
chainId,
});
});
connector.on("disconnect", (error, payload) => {
if (error) {
console.log('disconnect error: ' + error);
return;
}
// Delete connector
console.log("disconnect");
});
}
function initWalletConnect() {
try {
const connector = jcwallet.WalletConnect.getInstance({
bridge: "https://bridge.walletconnect.org"
});
console.log(connector);
window.connector = connector;
this._subscribeToEvents(connector);
if (!connector.connected) {
// create new session
connector.createSession({chainId: 1})
.then(() => {
console.log("wc uri: " + connector.uri);
setTimeout(function() {
jsb.reflection.callStaticMethod(
'com/jc/jcfw/JcSDK',
'connectwallet',
'(Ljava/lang/String;)V',
connector.uri
)
}, 50);
})
} else {
console.log("already connected. wc uri:" + connector.uri);
console.log("account: " + connector.accounts[0]);
window.account = connector.accounts[0];
}
return JSON.stringify({errcode: 0});
} catch(err) {
return JSON.stringify({errcode: 1, errmsg: err});
}
}
function _buildSingMsg(nonce) {
nonce += "";
const signMsg = {
tips: 'login tip',
nonce,
};
const signObj = {
types: {
EIP712Domain: [
{ name: "name", type: "string" },
{ name: "version", type: "string" },
],
set: [
{ name: "tips", type: "string" },
{ name: "nonce", type: "string" },
],
},
primaryType: "set",
domain: {
name: "Auth",
version: "1",
},
message: signMsg,
};
return signObj;
}
function signWithExternal() {
var nonce = (Math.random() * 100000) | 0;
let singObj = _buildSingMsg(nonce);
let params = [window.account, JSON.stringify(singObj)];
console.log(params);
window.connector.signTypedData(params).then((signature)=> {
console.log("signature: " + signature);
}).catch (err => {
console.log('sign error: ' + err);
})
setTimeout(function() {
jsb.reflection.callStaticMethod(
'com/jc/jcfw/JcSDK',
'toWallet',
'(Ljava/lang/String;)V',
'wc://'
)
}, 10);
}