Skip to content

Instantly share code, notes, and snippets.

@gevffy
Last active August 15, 2024 04:39
Show Gist options
  • Save gevffy/3a03f60ac1a0d0a8ccf0860f755f8d71 to your computer and use it in GitHub Desktop.
Save gevffy/3a03f60ac1a0d0a8ccf0860f755f8d71 to your computer and use it in GitHub Desktop.
Auto boost last boosted one
/**
* For Bitlayer
* Project link https://www.influpia.com/i
*
* download nodejs from `https://nodejs.org/en/download/package-manager` and install it.
*
* open terminal and check install status
* ```
* node -v
* ```
* then install dependency
* ```
* npm install [email protected]
* ```
* replace FILL_YOUR_PRIVATE_KEY with your private key
* run `node boost.mjs`
*/
import { ethers } from 'ethers'
const CONTRACT_MAKER_ABI = JSON.parse('[{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"CAST_TO_128_OVERFLOW","type":"error"},{"inputs":[],"name":"DISABLE_BUY_SELF","type":"error"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"name":"ERC1967InvalidImplementation","type":"error"},{"inputs":[],"name":"ERC1967NonPayable","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"INVALID_BUYER","type":"error"},{"inputs":[],"name":"INVALID_BUY_PRICE","type":"error"},{"inputs":[],"name":"INVALID_MINT_PRICE","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"MINNER_NOT_EXIST","type":"error"},{"inputs":[],"name":"MINSER_IS_NOT_IN_LIST","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"TRADE_NOT_STARTED","type":"error"},{"inputs":[],"name":"UNAUTHORIZED","type":"error"},{"inputs":[],"name":"UUPSUnauthorizedCallContext","type":"error"},{"inputs":[{"internalType":"bytes32","name":"slot","type":"bytes32"}],"name":"UUPSUnsupportedProxiableUUID","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"miner","type":"address"},{"indexed":false,"internalType":"uint256","name":"worth","type":"uint256"}],"name":"Discount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"toTreasury","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toMiner","type":"uint256"}],"name":"FeePointChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"miner","type":"address"},{"indexed":false,"internalType":"address","name":"host","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feeToTreasury","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feeToMiner","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nextWorth","type":"uint256"},{"indexed":false,"internalType":"address","name":"lastHost","type":"address"}],"name":"Grab","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"miner","type":"address"},{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"giff","type":"uint256"},{"indexed":false,"internalType":"string","name":"comment","type":"string"}],"name":"Like","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"miners","type":"address[]"},{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"MinerWhitelistChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"miner","type":"address"},{"indexed":false,"internalType":"address","name":"host","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newTreasury","type":"address"}],"name":"TreasuryChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"UPGRADE_INTERFACE_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"miner","type":"address"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"competition","outputs":[{"internalType":"contract ICompetition","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"feeShares","outputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"uint16","name":"feeBP","type":"uint16"},{"internalType":"uint240","name":"balance","type":"uint240"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"lastWorth","type":"uint256"}],"name":"getNextWorth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"vol","type":"uint256"},{"internalType":"uint256","name":"giff","type":"uint256"}],"name":"getPower","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"influpiaChef","outputs":[{"internalType":"contract IChef","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"influpiaToken","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"treasury_","type":"address"},{"internalType":"contract ERC20","name":"influpiaToken_","type":"address"},{"internalType":"contract IChef","name":"chef","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"miner","type":"address"},{"internalType":"uint256","name":"giff","type":"uint256"},{"internalType":"bytes","name":"influpiaPermitCallData","type":"bytes"},{"internalType":"string","name":"comment","type":"string"}],"name":"like","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"miner","type":"address"}],"name":"minerInfo","outputs":[{"internalType":"address","name":"host_","type":"address"},{"internalType":"uint256","name":"worth","type":"uint256"},{"internalType":"uint256","name":"giff","type":"uint256"},{"internalType":"uint256","name":"vol","type":"uint256"},{"internalType":"uint256","name":"power","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minerWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minerWhitelistEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"miners","outputs":[{"internalType":"address","name":"host","type":"address"},{"internalType":"uint128","name":"worth","type":"uint128"},{"internalType":"uint128","name":"giff","type":"uint128"},{"internalType":"uint256","name":"vol","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"pools","type":"address[]"},{"internalType":"uint256[]","name":"feeBP","type":"uint256[]"}],"name":"resetTradeSharePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChef","name":"chef","type":"address"}],"name":"setChef","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setCompetition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"toTreasuryBP","type":"uint256"},{"internalType":"uint256","name":"toMinerBP","type":"uint256"}],"name":"setFeeBP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"setTradeStartBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"list","type":"address[]"},{"internalType":"bool","name":"allow","type":"bool"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enable","type":"bool"}],"name":"setWhitelistStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalHoldWorth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradeFeeToMinerBP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradeFeeToTreasuryBP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradeStartBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transferFeeToPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]')
const CONTRACT_MAKER_ADDRESS = '0x056dFeCe813e78976274Da1197B240Fda62f60dC'
const PROVIDER = new ethers.WebSocketProvider('wss://ws.bitlayer-rpc.com', {
chainId: 200901,
name: 'Bitlayer Mainnet'
})
class Wallet {
contractMaker = new ethers.Contract(CONTRACT_MAKER_ADDRESS, CONTRACT_MAKER_ABI, PROVIDER)
wallet = null
status = 'done'
MIN_VALUE = null
MAX_VALUE = null
constructor(privateKey, minPrice, maxPrice) {
try {
this.wallet = new ethers.Wallet(privateKey, PROVIDER)
} catch (e) {
throw new Error('Invalid private key.')
}
if (maxPrice) {
this.MAX_VALUE = maxPrice
}
if (minPrice) {
this.MIN_VALUE = minPrice
}
this.eventListen()
}
eventListen() {
this.contractMaker.on(this.contractMaker.filters.Grab, (miner, host, value, feeToTreasury, feeToMiner, nextWorth, lastHost) => {
console.log(`Grab miner: ${miner}, host: ${host}, value: ${value}, feeToTreasury: ${feeToTreasury}, feeToMiner: ${feeToMiner}, nextWorth: ${nextWorth}, lastHost: ${lastHost} \n`)
if (this.status === 'done' && host.toLowerCase() !== this.wallet.address.toLowerCase()) {
this.buyInfluencer({
address: miner,
worth: nextWorth
})
}
})
}
getAddress() {
return this.wallet.getAddress()
}
signMessage(str) {
return this.wallet.signMessage(str)
}
getBalance() {
return PROVIDER.getBalance(this.wallet)
}
async buyInfluencer(influencer) {
const balance = ethers.formatEther(await this.getBalance())
console.log(`wallet balance: ${balance} BTC`)
console.log('\nwait for transaction to be confirmed...')
// TODO check balance and worth range [lower, higher]
// lower worth should be dropped
// higher worth than balance should be dropped
const worth = ethers.formatEther(influencer.worth)
console.log('Miner worth: ', worth)
if (balance <= worth) {
console.log('skip, balance not enough')
return false
}
if ((this.MAX_VALUE && worth > this.MAX_VALUE) || (this.MIN_VALUE && worth < this.MIN_VALUE)) {
console.log('skip, bid price not in range')
return false
}
const tx = {
to: CONTRACT_MAKER_ADDRESS,
value: influencer.worth,
data: this.contractMaker.interface.encodeFunctionData('buy', [influencer.address]),
gasLimit: 1000000
}
console.log('transaction data', tx)
try {
this.status = 'pending'
const receipt = await this.wallet.sendTransaction(tx)
const res = await receipt.wait()
this.status = 'done'
console.log(receipt)
return res
} catch (error) {
this.status = 'done'
if (error.code === 'INSUFFICIENT_FUNDS') {
console.error('Error: insufficient funds')
} else {
console.error('Error:', error.shortMessage)
}
}
return false
}
async minerInfo(address) {
const miner = await this.contractMaker.miners(address)
console.log(miner)
return miner
}
}
async function start() {
// 1. change YOUR_WALLET_PRIVATE_KEY to your wallet private key
// 2. change 0.0002 to your min price, 0.02 to your max price
const ins = new Wallet('FILL_YOUR_PRIVATE_KEY', 0.0002, 0.02)
console.log(`address: ${ins.wallet.address} balance: ${ethers.formatEther(await ins.getBalance())}`)
}
start()
process.stdin.resume()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment