167 lines
4.7 KiB
JavaScript
167 lines
4.7 KiB
JavaScript
/**
|
|
* web3.js
|
|
* @example
|
|
* import Web3 from './web3.js' // 根据你实际文件路径引入这个类
|
|
* const web3 = new Web3('https://...');
|
|
* web3.wakeUpWallet() // 唤醒钱包
|
|
*/
|
|
let Web3 = require('web3')
|
|
|
|
export default class EthJs {
|
|
/**
|
|
* 初始化链接
|
|
* @param {String} url 链址
|
|
*/
|
|
constructor(url) {
|
|
this.web3 = new Web3(url);
|
|
}
|
|
|
|
// 唤醒钱包
|
|
wakeUpWallet = async () => {
|
|
if (window.ethereum) {
|
|
console.log("132");
|
|
return await window.ethereum.enable();
|
|
} else {
|
|
console.error("请安装meteMask钱包!");
|
|
return false;
|
|
}
|
|
};
|
|
|
|
/**
|
|
* 查看钱包余额
|
|
* @param {String} address 地址
|
|
* @return 余额
|
|
*/
|
|
getTokenBalance = async (address) => {
|
|
if (!address) {
|
|
let web3 = new Web3(window.web3.currentProvider); // 初始化
|
|
let arr = await web3.eth.getAccounts();
|
|
address = arr[0];
|
|
}
|
|
let wei = await this.web3.eth.getBalance(address);
|
|
return this.web3.utils.fromWei(wei.toString(), "ether");
|
|
};
|
|
|
|
/**
|
|
* 发起转账 - 主币
|
|
* @param {Object} res 转账需要的数据
|
|
* @param {string} res.from 转账发起地址
|
|
* @param {string} res.to 转账接受地址
|
|
* @param {string} res.value 转账金额 单位/eth
|
|
* @param {string} res.gasPrice 费率
|
|
* @param {Function} callBack 回调函数
|
|
*/
|
|
send = async (res = {}, callBack) => {
|
|
let { from = "", to = "", gasPrice = "", value = 0, gas = 21000 } = res;
|
|
if (!to || !value)
|
|
return console.error({ code: 0, error: "缺少必要参数!" });
|
|
let web3 = new Web3(window.web3.currentProvider); // 初始化
|
|
if (!from) {
|
|
let arr = await web3.eth.getAccounts(); // 获取钱包地址 @return - Array
|
|
from = arr[0];
|
|
}
|
|
if (!gasPrice) gasPrice = await web3.eth.getGasPrice();
|
|
value = this.web3.utils.toWei(value, "ether"); // eth -> wei
|
|
const trans = web3.eth.sendTransaction(
|
|
{
|
|
gas,
|
|
gasPrice,
|
|
from,
|
|
to,
|
|
value,
|
|
},
|
|
(err, result) => {
|
|
console.log(err, "e");
|
|
console.log("转账Hash=", result);
|
|
}
|
|
);
|
|
trans.on("transactionHash", (txid) => {
|
|
callBack({ event: "transactionHash", data: txid });
|
|
});
|
|
// 第一个节点确认 - 执行一次
|
|
trans.on("receipt", (res) => {
|
|
callBack({ event: "receipt", data: res });
|
|
});
|
|
// 第n个节点确认 - 执行n次
|
|
trans.on("confirmation", (res) => {
|
|
callBack({ event: "confirmation", data: res });
|
|
});
|
|
};
|
|
|
|
/**
|
|
* 发起转账-代币
|
|
*/
|
|
sendToken = async (res = {}, callBack) => {
|
|
let {
|
|
from = "", // 付款地址
|
|
to = "", // 收款地址
|
|
tokenURl = "", // 合约地址
|
|
value = 0,
|
|
gas = "50000",
|
|
nonce = 0,
|
|
money = 0.00001, // 合约币数量
|
|
} = res;
|
|
console.log(window.web3.currentProvider);
|
|
let web3 = new Web3(window.web3.currentProvider); // 初始化
|
|
if (!from) {
|
|
let arr = await web3.eth.getAccounts(); // 获取钱包地址 @return - Array
|
|
from = arr[0];
|
|
}
|
|
const gasPrice = await this.web3.eth.getGasPrice(); // 获取预计转账费用
|
|
nonce = await this.web3.eth.getBlockTransactionCount(from); // 获取转账次数
|
|
value = this.web3.utils.toWei(value, "ether"); // eth -> wei
|
|
const addPreZero = (num) => {
|
|
let t = (num + "").length,
|
|
s = "";
|
|
for (let i = 0; i < 64 - t; i++) {
|
|
s += "0";
|
|
}
|
|
return s + num;
|
|
};
|
|
let code = `0xa9059cbb${addPreZero(to.substring(2))}${addPreZero(
|
|
this.web3.utils
|
|
.fromDecimal(this.web3.utils.toWei(money, "ether"))
|
|
.substring(2)
|
|
)}`;
|
|
|
|
const txraw = {
|
|
gas: this.web3.utils.toHex(gas),
|
|
gasPrice: this.web3.utils.toHex(gasPrice),
|
|
from,
|
|
to: tokenURl,
|
|
value: value,
|
|
data: code,
|
|
};
|
|
const trans = web3.eth.sendTransaction(txraw, (err, result) => {
|
|
console.log(err, "e");
|
|
console.log("转账Hash=", result);
|
|
});
|
|
trans.on("transactionHash", (txid) => {
|
|
callBack({ event: "transactionHash", data: txid });
|
|
});
|
|
trans.on("error", (e) => {
|
|
console.log(e);
|
|
});
|
|
// 调用钱包转账
|
|
// const s = await window.ethereum.request({
|
|
// method: "eth_sendTransaction",
|
|
// params: [
|
|
// {
|
|
// to: tokenURl,
|
|
// from,
|
|
// gas: this.web3.utils.toHex(gas),
|
|
// value: this.web3.utils.toHex(value),
|
|
// gasPrice: this.web3.utils.toHex(gasPrice),
|
|
// data: code,
|
|
// // data: `0xa9059cbb${addPreZero(
|
|
// // to.substring(2)
|
|
// // )}0000000000000000000000000000000000000000000000001bc16d674ec80000`,
|
|
// },
|
|
// ],
|
|
// });
|
|
// console.log(`output->s`, s);
|
|
};
|
|
}
|
|
|
|
|