You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
221 lines
5.8 KiB
221 lines
5.8 KiB
import abi from 'utils/EthAbi.js'
|
|
import systemConfiguration from 'utils/SystemConfiguration.js'
|
|
const Web3 = require('web3');
|
|
const Tx = require('ethereumjs-tx');
|
|
let web3;
|
|
// let tx;
|
|
if (typeof web3 !== 'undefined') {
|
|
web3 = new Web3(web3.currentProvider);
|
|
} else {
|
|
web3 = new Web3(new Web3.providers.HttpProvider(systemConfiguration.constant.ethNode));
|
|
}
|
|
|
|
|
|
let eth = {
|
|
//获取主币eth余额
|
|
getBalance: async function(address) {
|
|
console.log("查询余额:",address)
|
|
let balance = await web3.eth.getBalance(address);
|
|
console.log("余额:",balance)
|
|
return Number(balance) / Math.pow(10, 18);
|
|
},
|
|
// //获取eth代币币余额
|
|
// getTokenBalance: async function(address, contract) {
|
|
// console.log(address, contract)
|
|
// var myContract = new web3.eth.Contract(abi, contract, {
|
|
// from: address
|
|
// });
|
|
// var decimals = await myContract.methods.decimals().call();
|
|
// var balance = await myContract.methods.balanceOf(address).call();
|
|
|
|
// return Number(balance) / Math.pow(10, decimals);
|
|
// },
|
|
getGas: async function() {
|
|
const gasPrice = await web3.eth.getGasPrice().then((v) => {
|
|
return v
|
|
});
|
|
console.log(gasPrice, 'gasPrice')
|
|
return gasPrice;
|
|
},
|
|
|
|
// //获取主币eth余额
|
|
// getBalance: async function(address) {
|
|
// web3 = new Web3();
|
|
// const data = {
|
|
// 'jsonrpc': '2.0',
|
|
// 'id': '1',
|
|
// 'method': 'eth_getBalance',
|
|
// 'params': [address, "latest"]
|
|
// };
|
|
// let res = await uni.request({
|
|
// url: systemConfiguration.constant.ethNode, //仅为示例,并非真实接口地址。
|
|
// method: 'POST',
|
|
// data: data,
|
|
// dataType: 'json'
|
|
// });
|
|
// try {
|
|
// let balance = Number(web3.utils.hexToNumberString(res[1].data.result)) / Math.pow(10, 18)
|
|
// return balance
|
|
// } catch (e) {
|
|
// return 0;
|
|
// }
|
|
// },
|
|
addPreZero: function(num) {
|
|
let t = (num + '').length,
|
|
s = '';
|
|
for (let i = 0; i < 64 - t; i++) {
|
|
s += '0';
|
|
}
|
|
return s + num;
|
|
},
|
|
// 获取bms,bmdt,usdt/erc余额
|
|
getTokenBalance: async function(address, contract, success) {
|
|
web3 = new Web3();
|
|
const data = {
|
|
'jsonrpc': '2.0',
|
|
'id': '1',
|
|
'method': 'eth_call',
|
|
'params': [{
|
|
"data": '0x70a08231' + this.addPreZero(address.replace('0x', '')),
|
|
"to": contract,
|
|
}, "latest"]
|
|
};
|
|
|
|
|
|
let res = await uni.request({
|
|
url: systemConfiguration.constant.ethNode, //仅为示例,并非真实接口地址。
|
|
method: 'POST',
|
|
data: data,
|
|
dataType: 'json'
|
|
});
|
|
let resData = res[res.length - 1];
|
|
console.log(resData, 5555555555)
|
|
let balance = Number(web3.utils.hexToNumberString(resData.data.result)) / Math.pow(10, 18)
|
|
console.log(balance, 'balance')
|
|
return balance;
|
|
},
|
|
|
|
|
|
|
|
sendTransaction: async function(fromAddress, toAddress, value, privateKey, success) {
|
|
|
|
var nonce = await web3.eth.getTransactionCount(fromAddress);
|
|
var gas = await web3.eth.estimateGas({
|
|
from: fromAddress
|
|
});
|
|
console.log(11111111111)
|
|
console.log(nonce)
|
|
console.log(fromAddress, toAddress, value, privateKey)
|
|
var txData = {
|
|
chainId: web3.utils.toHex(1899),
|
|
// nonce每次++,以免覆盖之前pending中的交易
|
|
nonce: web3.utils.toHex(nonce++),
|
|
// 设置gasLimit和gasPrice
|
|
gas: web3.utils.toHex(gas),
|
|
gasPrice: web3.utils.toHex(web3.eth.getGasPrice()),
|
|
// 要转账的哪个账号
|
|
to: toAddress,
|
|
// 从哪个账号转
|
|
from: fromAddress,
|
|
// 0.001 以太币
|
|
value: web3.utils.toHex(web3.utils.toWei(value, 'ether'))
|
|
}
|
|
|
|
|
|
|
|
// 引入私钥,并转换为16进制
|
|
|
|
// 用私钥签署交易
|
|
console.log(Buffer.from(privateKey).toString('hex'))
|
|
const tx = new Tx(txData);
|
|
tx.sign(Buffer.from(privateKey, 'hex'));
|
|
|
|
// 序列化
|
|
var serializedTx = tx.serialize().toString('hex');
|
|
|
|
web3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex'), function(err,
|
|
hash) {
|
|
console.log('hash' + hash)
|
|
if (!err) {
|
|
success(hash, undefined);
|
|
} else {
|
|
console.log(err, 789798)
|
|
success(undefined, err);
|
|
}
|
|
});
|
|
// 获取交易数据
|
|
|
|
|
|
|
|
|
|
},
|
|
sendTokenTransaction: async function(fromAddress, toAddress, value, privateKey, contract, success) {
|
|
|
|
var nonce = await web3.eth.getTransactionCount(fromAddress);
|
|
var gas = await web3.eth.estimateGas({
|
|
from: fromAddress
|
|
});
|
|
|
|
console.log('nonce' + nonce)
|
|
var myContract = new web3.eth.Contract(abi, contract)
|
|
myContract.methods.decimals().call()
|
|
.then(function(decimals) {
|
|
|
|
// 获取交易数据
|
|
console.log(Number(value) * Math.pow(10, decimals))
|
|
var txData = {
|
|
chainId: web3.utils.toHex(128),
|
|
// nonce每次++,以免覆盖之前pending中的交易
|
|
nonce: web3.utils.toHex(nonce++),
|
|
// 设置gasLimit和gasPrice
|
|
gas: web3.utils.toHex(gas),
|
|
gasPrice: web3.utils.toHex(web3.eth.getGasPrice()),
|
|
// 要转账的哪个账号
|
|
to: contract,
|
|
// 从哪个账号转
|
|
from: fromAddress,
|
|
// 0.001 以太币
|
|
value: "0x00",
|
|
data: myContract.methods.transfer(
|
|
toAddress, web3.utils.toWei(value, 'ether')).encodeABI()
|
|
}
|
|
|
|
|
|
// 引入私钥,并转换为16进制
|
|
|
|
// 用私钥签署交易
|
|
|
|
const tx = new Tx(txData, {
|
|
'chain': 'ropsten'
|
|
});
|
|
tx.sign(Buffer.from(privateKey, 'hex'));
|
|
console.log(Buffer.from(privateKey).toString('hex'))
|
|
// 序列化
|
|
var serializedTx = tx.serialize().toString('hex');
|
|
|
|
web3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex'), function(
|
|
err,
|
|
hash) {
|
|
if (!err) {
|
|
success(hash, undefined);
|
|
} else {
|
|
success(undefined, err);
|
|
}
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
},
|
|
transaction: async function(fromAddress, toAddress, value, privateKey, contract, success) {
|
|
if (contract) {
|
|
await this.sendTokenTransaction(fromAddress, toAddress, value, privateKey, contract, success);
|
|
} else {
|
|
await this.sendTransaction(fromAddress, toAddress, value, privateKey, success)
|
|
|
|
}
|
|
}
|
|
}
|
|
export default eth;
|
|
|