Onlife/common/demo.js
2025-04-19 15:38:48 +08:00

251 lines
8.1 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const express = require('express');
const {Web3} = require('web3');
const axios = require('axios');
const cors = require('cors');
const bip39 = require('bip39');
const util = require('ethereumjs-util');
const {hdkey} = require('ethereumjs-wallet');
const BSCSCAN_API_KEY = '1UQ3PHID4UJUDTVD4EJK35PZB8XDKS7K9T';
const app = express();
const web3 = new Web3('https://bsc-dataseed1.binance.org:443');
//便用cor5中间件
app.use(cors());
// 你的 BNB 钱包地址
// const BNB_WALLET_ADDRESS = '0x2335070d3FA557aAcD5F762903b050d0A358b421';
// BNB 合约地址
const BNB_CONTRACT_ADDRESS = '0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c';
// USDT 合约地址
const USDT_CONTRACT_ADDRESS = '0x55d398326f99059fF775485246999027B3197955';
// USDT 合约 ABI
const USDT_ABI = [
{
"constant": true,
"inputs": [{"name": "_owner", "type": "address"}],
"name": "balanceOf",
"outputs": [{"name": "", "type": "uint256"}],
"payable": false,
"stateMutability": "view",
"type": "function"
}
];
// 获取钱包地址
app.get('/generateWords', async (req, res) => {
try {
const mnemonic = await generateWordsOptions();
res.json(mnemonic);
} catch (error) {
res.status(500).json({ error: error.message });
}
});
//获取已有钱包地址
app.get('/getMoneyList', async (req, res) => {
try {
const mnemonic = req.query.mnemonic;
const moneyInfo = await getMoneyInfos(mnemonic);
res.json(moneyInfo);
} catch (error) {
res.status(500).json({ error: error.message });
}
});
//根据助记词获取已有钱包地址
function getMoneyInfos(mnemonic){
const seed = bip39.mnemonicToSeedSync(mnemonic);
const hdwallet = hdkey.fromMasterSeed(seed);
const wallet = hdwallet.derivePath(`m/44'/60'/0'/0/0`).getWallet();
const address = `0x${wallet.getAddress().toString('hex')}`;
const privateKey = wallet.getPrivateKey().toString('hex');
const userMoneyInfo = {
address,
privateKey
};
return userMoneyInfo
}
//生成钱包地址
function generateWordsOptions(){
const mnemonic = bip39.generateMnemonic();
let name=mnemonic.split(" ");
let max=100;
let min=0;
let rand = Math.floor(Math.random() * (max - min + 1) ) + min;
let seedBuffer = bip39.mnemonicToSeedSync(mnemonic,"");
let hdWallet = hdkey.fromMasterSeed(seedBuffer);
let key = hdWallet.derivePath("m/44'/60'/0'/0/0");
let privateKey = util.bufferToHex(key._hdkey._privateKey);
let publicKey = util.bufferToHex(key._hdkey._publicKey);
let address = util.pubToAddress(key._hdkey._publicKey, true);
address = util.toChecksumAddress("0x"+address.toString('hex'));
let wallet={
mnemonic,
publicKey,
privateKey,
address,
type:"Ethereum"
}
return wallet
}
// BNB的交易转账
app.get('/transfer', async (req, res) => {
// const { from_addr, siyao, to_addr, coin } = req.body;
const from_addr = req.query.from_addr;
const to_addr = req.query.to_addr;
const coin = req.query.coin;
const siyao = req.query.siyao;
try {
// 转账金额(以 wei 为单位)
const amount = web3.utils.toWei(coin + '', 'ether'); // 这里以 Gwei 为单位
// 获取当前 gasPrice
const gasPrice = await web3.eth.getGasPrice();
// 创建转账交易对象
const transactionObject = {
from: from_addr,
to: to_addr,
value: amount,
gas: 21000, // 假设固定 gas 为 21000
gasPrice: gasPrice // 使用当前 gasPrice
};
// 签名交易
const signedTx = await web3.eth.accounts.signTransaction(transactionObject, siyao);
// 发送已签名的交易
const receipt = await web3.eth.sendSignedTransaction(signedTx.rawTransaction);
res.status(200).json({ success: true });
} catch (error) {
res.status(500).json({ success: false, error: error.message });
}
});
// USDT的交易转账
async function qukuailian(from_addr, to_addr, coin, siyao) {
try {
const web3 = new Web3('https://bsc-dataseed1.binance.org:443');
const USDT_CONTRACT_ADDRESS = '0x55d398326f99059fF775485246999027B3197955';
const usdtContractABI = [{
"constant": false,
"inputs": [{
"name": "_to",
"type": "address"
},
{
"name": "_value",
"type": "uint256"
}
],
"name": "transfer",
"outputs": [{
"name": "",
"type": "bool"
}],
"type": "function"
}];
const usdtContract = new web3.eth.Contract(usdtContractABI, USDT_CONTRACT_ADDRESS);
const recipientAddress = to_addr;
const amountToSend = Number(coin) * 10 ** 18;
const txCount = await web3.eth.getTransactionCount(from_addr);
const txObject = {
from: from_addr,
to: USDT_CONTRACT_ADDRESS,
gasPrice: web3.utils.toHex(await web3.eth.getGasPrice()), // 使用区块链当前的 gas 价格
gasLimit: web3.utils.toHex(210000), // 设置一个适当的 gasLimit
value: '0', // 设置交易的价值为 0因为我们使用 BNB 作为 gas 费)
data: usdtContract.methods.transfer(recipientAddress, amountToSend).encodeABI(),
nonce: web3.utils.toHex(txCount)
};
console.log(web3.utils.toHex(await web3.eth.getGasPrice()),'gas费')
const signedTx = await web3.eth.accounts.signTransaction(txObject, siyao);
const receipt = await web3.eth.sendSignedTransaction(signedTx.rawTransaction); //交易成功
return receipt;
} catch (error) {
throw error;//交易失败
}
}
// 处理区块链打款请求
app.get('/qukuailian', async (req, res) => {
const from_addr = req.query.from_addr;
const to_addr = req.query.to_addr;
const coin = req.query.coin;
const siyao = req.query.siyao;
try {
const receipt = await qukuailian(from_addr, to_addr, coin, siyao);
res.json({ success: true });
} catch (error) {
res.status(500).json({ success: false, error: error.message });
}
});
// 获取指定地址的交易历史记录
async function getTransactions(address) {
try {
// 使用 BSCScan API 获取交易记录
const response = await axios.get('https://api.bscscan.com/api', {
params: {
module: 'account',
action: 'tokentx',
contractaddress: USDT_CONTRACT_ADDRESS,
address: address,
apikey: BSCSCAN_API_KEY,
sort: 'desc' // 按时间降序排序
}
});
// 处理 API 响应
if (response.data.status === '1') {
const transactions = response.data.result;
return transactions;
} else {
throw new Error(response.data.message);
}
} catch (error) {
return [];
}
};
// 获取历史记录的接口
app.get('/transactions', async (req, res) => {
const address = req.query.address;
try {
const transactions = await getTransactions(address);
res.json(transactions);
} catch (error) {
res.status(500).json({ error: error.message });
}
});
// 获取余额的路由
app.get('/balances', async (req, res) => {
const address = req.query.address;// 钱包地址
try {
// 获取 BNB 钱包余额
const bnbBalanceWei = await web3.eth.getBalance(address);
const bnbBalance = web3.utils.fromWei(bnbBalanceWei.toString(), 'ether');
// 获取 USDT 代币余额
const usdtContract = new web3.eth.Contract(USDT_ABI, USDT_CONTRACT_ADDRESS);
const usdtBalance = await usdtContract.methods.balanceOf(address).call();
res.json({
bnbBalance: bnbBalance,
usdtBalance: usdtBalance.toString()
});
} catch (error) {
res.status(500).json({ error: 'An error occurred' });
}
});
// 启动服务器
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
});