|
|
@@ -1,277 +0,0 @@
|
|
|
-const ChainLib = require("../lib/chain-lib");
|
|
|
-const logger = require("../../utils/logger");
|
|
|
-const secretConfig = require("../../.secret-config.js")
|
|
|
-const AccountLib = require("../lib/account-lib");
|
|
|
-const WalletLib = require("../lib/wallet-lib");
|
|
|
-const Time = require("../../utils/time");
|
|
|
-const Web3 = require("web3");
|
|
|
-const {isDev} = require("../../utils/debug");
|
|
|
-const Web3HttpProvider = require('web3-providers-http')
|
|
|
-const { SocksProxyAgent } = require('socks-proxy-agent')
|
|
|
-
|
|
|
-// 状态-方法映射器
|
|
|
-const stateFunctionArray = [
|
|
|
- shareGoerliToWallet,
|
|
|
- proxyGoerliToScroll,
|
|
|
- recoveryGoerliEthToWallet,
|
|
|
- proxyScrollToGoerli,
|
|
|
- // claimUSDC,
|
|
|
- swapWETH,
|
|
|
- approve,
|
|
|
- addLiquidity,
|
|
|
- removeLiquidity,
|
|
|
- shareScrollEth,
|
|
|
- Time.delay
|
|
|
-]
|
|
|
-
|
|
|
-// 分发GoerliETH给指定账户
|
|
|
-async function shareGoerliToWallet(goerli, scroll, gWallet, sWallet) {
|
|
|
- const value = goerli.web3.utils.toWei('0.4')
|
|
|
-
|
|
|
- return (await AccountLib.transfer(goerli.web3, goerli.mainWallet, gWallet.address, value, 21000))
|
|
|
-}
|
|
|
-
|
|
|
-// Goerli ETH跨链Scroll Alpha Testnet
|
|
|
-async function proxyGoerliToScroll(goerli, scroll, gWallet, sWallet) {
|
|
|
- const inProxyAbi = require('../../abi/IN_PROXY.json')
|
|
|
- const inProxyAddr = '0xe5e30e7c24e4dfcb281a682562e53154c15d3332'
|
|
|
- const inProxyContract = new goerli.web3.eth.Contract(inProxyAbi, inProxyAddr)
|
|
|
-
|
|
|
- const inAmount = goerli.web3.utils.toWei('0.05')
|
|
|
- const value = goerli.web3.utils.toWei('0.10')
|
|
|
- const gasLimit = 40000
|
|
|
- const inProxyData = inProxyContract.methods.depositETH(inAmount, gasLimit).encodeABI()
|
|
|
-
|
|
|
- return (await AccountLib.call(goerli.web3, gWallet, inProxyAddr, value, inProxyData))
|
|
|
-}
|
|
|
-
|
|
|
-async function recoveryGoerliEthToWallet(goerli, scroll, gWallet, sWallet) {
|
|
|
- const value = await goerli.web3.eth.getBalance(gWallet.address) - 1e16
|
|
|
-
|
|
|
- return (await AccountLib.transfer(goerli.web3, gWallet, goerli.mainWallet.address, value, 21000))
|
|
|
-}
|
|
|
-
|
|
|
-// Scroll Alpha Testne跨链Goerli ETH
|
|
|
-async function proxyScrollToGoerli(goerli, scroll, gWallet, sWallet) {
|
|
|
- const outProxyAbi = require('../../abi/OUT_PROXY.json')
|
|
|
- const outProxyAddr = '0x6d79Aa2e4Fbf80CF8543Ad97e294861853fb0649'
|
|
|
- const outProxyContract = new scroll.web3.eth.Contract(outProxyAbi, outProxyAddr)
|
|
|
-
|
|
|
- const outAmount = scroll.web3.utils.toWei('0.001')
|
|
|
- const value = scroll.web3.utils.toWei('0.04')
|
|
|
- const gasLimit = 160000
|
|
|
- const outProxyData = outProxyContract.methods.withdrawETH(outAmount, gasLimit).encodeABI()
|
|
|
-
|
|
|
- return (await AccountLib.call(scroll.web3, sWallet, outProxyAddr, value, outProxyData))
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-// 领取测试usdc
|
|
|
-async function claimUSDC(goerli, scroll, gWallet, sWallet) {
|
|
|
- const claimAbi = require('../../abi/CLAIM.json')
|
|
|
- const claimAddr = '0xeF71Ddc12Bac8A2ba0b9068b368189FFa2628942'
|
|
|
- const claimContract = new scroll.web3.eth.Contract(claimAbi, claimAddr)
|
|
|
-
|
|
|
- const claimData = claimContract.methods.claim().encodeABI()
|
|
|
-
|
|
|
- return (await AccountLib.call(scroll.web3, sWallet, claimAddr, 0, claimData))
|
|
|
-}
|
|
|
-
|
|
|
-// 兑换WETH
|
|
|
-async function swapWETH(goerli, scroll, gWallet, sWallet) {
|
|
|
- const contractAbi = require('../../abi/WETH.json')
|
|
|
- const contractAddr = '0xa1EA0B2354F5A344110af2b6AD68e75545009a03'
|
|
|
- const contract = new scroll.web3.eth.Contract(contractAbi, contractAddr)
|
|
|
- const value = scroll.web3.utils.toWei('0.01')
|
|
|
- const data = contract.methods.deposit().encodeABI()
|
|
|
-
|
|
|
- return (await AccountLib.call(scroll.web3, sWallet, contractAddr, value, data))
|
|
|
-}
|
|
|
-
|
|
|
-async function approve(goerli, scroll, gWallet, sWallet) {
|
|
|
- const weth = '0xa1EA0B2354F5A344110af2b6AD68e75545009a03'
|
|
|
- const usdc = '0xA0D71B9877f44C744546D649147E3F1e70a93760'
|
|
|
- const value = 0
|
|
|
- const data = '0x095ea7b3000000000000000000000000bd1a5920303f45d628630e88afbaf012ba078f37ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'
|
|
|
-
|
|
|
- await AccountLib.call(scroll.web3, sWallet, weth, value, data)
|
|
|
-
|
|
|
- return await AccountLib.call(scroll.web3, sWallet, usdc, value, data)
|
|
|
-}
|
|
|
-
|
|
|
-// 添加WETH和USDC的LP池子
|
|
|
-async function addLiquidity(goerli, scroll, gWallet, sWallet) {
|
|
|
- const contractAbi = require('../../abi/UNIV3_POS.json')
|
|
|
- const contractAddr = '0xbd1A5920303F45d628630E88aFbAF012bA078F37'
|
|
|
- const contract = new scroll.web3.eth.Contract(contractAbi, contractAddr)
|
|
|
- const value = 0
|
|
|
-
|
|
|
- const token0 = '0xa0d71b9877f44c744546d649147e3f1e70a93760'
|
|
|
- const token1 = '0xa1EA0B2354F5A344110af2b6AD68e75545009a03'
|
|
|
- const fee = 500
|
|
|
- const tickLower = -887270
|
|
|
- const tickUpper = 887270
|
|
|
- const amount0Des = '0xbf36c0c00dd351b9'
|
|
|
- const amount1Des = "0x9184e72a000"
|
|
|
- const amount0Min = '0x1'
|
|
|
- const amount1Min = '0x1'
|
|
|
- const recipient = sWallet.address
|
|
|
- const deadline = 1689365795
|
|
|
-
|
|
|
- const data = contract.methods
|
|
|
- .mint([token0, token1, fee, tickLower, tickUpper,
|
|
|
- amount0Des, amount1Des, amount0Min, amount1Min,
|
|
|
- recipient, deadline])
|
|
|
- .encodeABI()
|
|
|
-
|
|
|
- return (await AccountLib.call(scroll.web3, sWallet, contractAddr, value, data))
|
|
|
-}
|
|
|
-
|
|
|
-// 去除流动池百分比
|
|
|
-async function removeLiquidity(goerli, scroll, gWallet, sWallet) {
|
|
|
- const contractAbi = require('../../abi/UNIV3_POS.json')
|
|
|
- const contractAddr = '0xbd1A5920303F45d628630E88aFbAF012bA078F37'
|
|
|
- const contract = new scroll.web3.eth.Contract(contractAbi, contractAddr)
|
|
|
- const value = 0
|
|
|
-
|
|
|
- let lastPosition = await contract.methods.tokenOfOwnerByIndex(sWallet.address, 0).call()
|
|
|
- for (let positionIndex = 0; positionIndex < 100; positionIndex++) {
|
|
|
- try {
|
|
|
- lastPosition = await contract.methods.tokenOfOwnerByIndex(sWallet.address, positionIndex).call()
|
|
|
- } catch (e) {
|
|
|
- logger.info(`addr: ${sWallet.address}, position index: ${positionIndex}.`)
|
|
|
- break
|
|
|
- }
|
|
|
- }
|
|
|
- const tempHex = contract.methods.tokenOfOwnerByIndex(sWallet.address, lastPosition).encodeABI()
|
|
|
-
|
|
|
- const addrHex = tempHex.slice(10, 10+64)
|
|
|
- const positionHex = tempHex.slice(10+64, 10+64+64)
|
|
|
-
|
|
|
- const data = '0xac9650d8'
|
|
|
- .concat('0000000000000000000000000000000000000000000000000000000000000020')
|
|
|
- .concat('0000000000000000000000000000000000000000000000000000000000000004')
|
|
|
- .concat('0000000000000000000000000000000000000000000000000000000000000080')
|
|
|
- .concat('0000000000000000000000000000000000000000000000000000000000000160')
|
|
|
- .concat('0000000000000000000000000000000000000000000000000000000000000220')
|
|
|
- .concat('00000000000000000000000000000000000000000000000000000000000002a0')
|
|
|
- .concat('00000000000000000000000000000000000000000000000000000000000000a4')
|
|
|
- .concat('0c49ccbe')
|
|
|
- .concat(positionHex) // position,tokenId
|
|
|
- .concat('0000000000000000000000000000000000000000000000000010540af5a6bdf1') // liquidity
|
|
|
- .concat('0000000000000000000000000000000000000000000000001e2cbb2290f23b5a') // amount0Min
|
|
|
- .concat('0000000000000000000000000000000000000000000000000000024dda5297e5') // amount1Min
|
|
|
- .concat('0000000000000000000000000000000000000000000000000000000065b1ad23') // deadline
|
|
|
- .concat('0000000000000000000000000000000000000000000000000000000000000000')
|
|
|
- .concat('00000000000000000000000000000000000000000000000000000084')
|
|
|
- .concat('fc6f7865')
|
|
|
- .concat(positionHex) // position,tokenId
|
|
|
- .concat('0000000000000000000000000000000000000000000000000000000000000000')
|
|
|
- .concat('00000000000000000000000000000000ffffffffffffffffffffffffffffffff')
|
|
|
- .concat('00000000000000000000000000000000ffffffffffffffffffffffffffffffff')
|
|
|
- .concat('0000000000000000000000000000000000000000000000000000000000000000')
|
|
|
- .concat('0000000000000000000000000000000000000000000000000000004449404b7c')
|
|
|
- .concat('000000000000000000000000000000000000000000000000000002361b66490d')
|
|
|
- .concat(addrHex) // addr
|
|
|
- .concat('0000000000000000000000000000000000000000000000000000000000000000')
|
|
|
- .concat('00000000000000000000000000000000000000000000000000000064df2ab5bb')
|
|
|
- .concat('000000000000000000000000a0d71b9877f44c744546d649147e3f1e70a93760')
|
|
|
- .concat('0000000000000000000000000000000000000000000000000dae9cd55a8bd739')
|
|
|
- .concat(addrHex) // addr
|
|
|
- .concat('00000000000000000000000000000000000000000000000000000000')
|
|
|
-
|
|
|
- return (await AccountLib.call(scroll.web3, sWallet, contractAddr, value, data))
|
|
|
-}
|
|
|
-
|
|
|
-// Scroll Alpha Testnet ETH转给好友
|
|
|
-async function shareScrollEth(goerli, scroll, gWallet, sWallet) {
|
|
|
- const value = scroll.web3.utils.toWei('0.0015')
|
|
|
-
|
|
|
- return (await AccountLib.transfer(scroll.web3, sWallet, scroll.mainWallet.address, value, 21000))
|
|
|
-}
|
|
|
-
|
|
|
-async function logicHandler(goerli, scroll, targetIndex) {
|
|
|
- const walletDb = await WalletLib.readWallet(targetIndex)
|
|
|
- const gWallet = goerli.web3.eth.accounts.privateKeyToAccount(walletDb.privateKey)
|
|
|
- const sWallet = scroll.web3.eth.accounts.privateKeyToAccount(walletDb.privateKey)
|
|
|
- const fun = stateFunctionArray[walletDb.state]
|
|
|
-
|
|
|
- if (walletDb.state >= stateFunctionArray.length - 1) {
|
|
|
- logger.info(`index: ${targetIndex} addr: ${gWallet.address} step: ${walletDb.state} break.`)
|
|
|
-
|
|
|
- return true
|
|
|
- }
|
|
|
-
|
|
|
- try {
|
|
|
- logger.info(`index: ${targetIndex} addr: ${gWallet.address} step: ${walletDb.state}(${fun.name}).`)
|
|
|
- const callRst = await fun(goerli, scroll, gWallet, sWallet)
|
|
|
- await WalletLib.updateWalletState(targetIndex, walletDb.state+1)
|
|
|
- logger.info(callRst.transactionHash)
|
|
|
- } catch (e) {
|
|
|
- logger.error(walletDb.privateKey)
|
|
|
- logger.error(e)
|
|
|
- }
|
|
|
-
|
|
|
- return false
|
|
|
-}
|
|
|
-
|
|
|
-async function main() {
|
|
|
- const options = {
|
|
|
- keepAlive: true,
|
|
|
- timeout: 10000
|
|
|
- }
|
|
|
-
|
|
|
- if (isDev()) {
|
|
|
- options.agent = {
|
|
|
- http: new SocksProxyAgent('socks5h://127.0.0.1:9080'),
|
|
|
- https: new SocksProxyAgent('socks5h://127.0.0.1:9080')
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- const goerliChain = await ChainLib.parseChainById(5)
|
|
|
- const goerliProvider = new Web3HttpProvider(goerliChain.http, options)
|
|
|
- const goerliWeb3 = new Web3(goerliProvider)
|
|
|
- const goerliWallet = goerliWeb3.eth.accounts.privateKeyToAccount(secretConfig.privateKey)
|
|
|
- const goerli = {
|
|
|
- chain: goerliChain,
|
|
|
- web3: goerliWeb3,
|
|
|
- mainWallet: goerliWallet
|
|
|
- }
|
|
|
-
|
|
|
- const scrollChain = await ChainLib.parseChainById(534353)
|
|
|
- const scrollProvider = new Web3HttpProvider(scrollChain.http, options)
|
|
|
- const scrollWeb3 = new Web3(scrollProvider)
|
|
|
- const scrollWallet = scrollWeb3.eth.accounts.privateKeyToAccount(secretConfig.privateKey)
|
|
|
- const scroll = {
|
|
|
- chain: scrollChain,
|
|
|
- web3: scrollWeb3,
|
|
|
- mainWallet: scrollWallet
|
|
|
- }
|
|
|
-
|
|
|
- logger.info(goerliChain.http, scrollChain.http)
|
|
|
- logger.info(await goerliWeb3.eth.getBlockNumber(), await scrollWeb3.eth.getBlockNumber())
|
|
|
-
|
|
|
- // logger.info(await claimUSDC(goerli, scroll, goerliWallet, scrollWallet))
|
|
|
- // logger.info(await swapWETH(goerli, scroll, goerliWallet, scrollWallet))
|
|
|
- // logger.info(await approve(goerli, scroll, goerliWallet, scrollWallet))
|
|
|
- // logger.info(await addLiquidity(goerli, scroll, goerliWallet, scrollWallet))
|
|
|
-
|
|
|
- // logger.info(await removeLiquidity(goerli, scroll, goerliWallet, scrollWallet))
|
|
|
-
|
|
|
- for (let i = 0; i < secretConfig.walletMax; i++) {
|
|
|
- if (i >= 100) return
|
|
|
-
|
|
|
- while (true) {
|
|
|
- if (await logicHandler(goerli, scroll, i)) {
|
|
|
- break
|
|
|
- }
|
|
|
-
|
|
|
- await Time.delay(1000)
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-main().catch((error) => {
|
|
|
- console.error(error);
|
|
|
- process.exitCode = 1;
|
|
|
-})
|