import axios from "axios";
import crypto from '@shardus/crypto-utils';
import { ethers } from 'ethers'
import { fromAscii } from "@ethereumjs/util";
crypto.init("69fa4195670576c0160d660c3be36556ff8d504725be8a59b5a96509e0c994bc")
const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms))
let keyPair = {
address: "0xE0291324263D7EC15fa3494bFDc1e902d8bd5d3d",
publicKey: '0x7255db7f8aa57518fd0bceb743eb85fa110c791cc78661818677255006269855',
secretKey: '0x759418c4f40e463452b15eda4b27478d152f2a2c04e6cd324fb620a9eede60217255db7f8aa57518fd0bceb743eb85fa110c791cc78661818677255006269855',
privateKey: '0x759418c4f40e463452b15eda4b27478d152f2a2c04e6cd324fb620a9eede6021'
}
const JSON_RPC_URL = "http://127.0.0.1:8080";
const stake_to_address = "0x0000000000000000000000000000000000010000";
const provider = new ethers.providers.JsonRpcProvider(JSON_RPC_URL);
const wallet = new ethers.Wallet(keyPair.privateKey, provider);
async function sendStakeTransaction() {
const stake_data = {
stake: 10000000000000000000,
internalTXType: 6, // Stake
nominee: keyPair.publicKey.replace('0x', '').padEnd(64, '0'),
nominator: keyPair.address,
};
const stake_tx = {
to: stake_to_address,
value: BigInt(10000000000000000000),
data: fromAscii(JSON.stringify(stake_data))
};
const tx = await wallet.sendTransaction(stake_tx);
const receipt = await tx.wait();
return receipt;
}
async function sendUnstakeTransaction() {
const stake_data = {
internalTXType: 7, // Unstake
nominee: keyPair.publicKey.replace('0x', '').padEnd(64, '0'),
nominator: keyPair.address,
};
const stake_tx = {
to: stake_to_address,
value: 0,
data: fromAscii(JSON.stringify(stake_data))
};
const tx = await wallet.sendTransaction(stake_tx);
const receipt = await tx.wait();
return receipt;
}
async function sendFirstInitRewardTimes(randomNode) {
let initRewardTimesTx = {
isInternalTx: true,
internalTXType: 8, // InternalTXType.InitRewardTimes
nominee: keyPair.publicKey.replace('0x', '').padEnd(64, '0'),
nodeActivatedTime: Math.floor(Date.now() / 1000) - 6000,
timestamp: Date.now()
}
crypto.signObj(initRewardTimesTx, keyPair.secretKey.replace('0x', ''), keyPair.publicKey.replace('0x', ''))
console.log("Signing InternalTx: ", initRewardTimesTx)
let res = await axios.post(`http://${randomNode.ip}:${randomNode.port}/inject`, initRewardTimesTx)
if(!res.data.success) throw new Error(res.data.reason)
}
async function sendFirstClaimRewards(randomNode) {
let claimRewardTx = {
isInternalTx: true,
internalTXType: 9, // InternalTXType.ClaimRewards
nominee: keyPair.publicKey.replace('0x', '').padEnd(64, '0'),
nominator: keyPair.address,
deactivatedNodeId: 'blockian'.padEnd(64, '0'),
nodeDeactivatedTime: 9999999999999999999999,
timestamp: Date.now()
}
crypto.signObj(claimRewardTx, keyPair.secretKey.replace('0x', ''), keyPair.publicKey.replace('0x', ''))
console.log("Signing InternalTx: ", claimRewardTx)
let res = await axios.post(`http://${randomNode.ip}:${randomNode.port}/inject`, claimRewardTx)
if(!res.data.success) throw new Error(res.data.reason)
}
async function sendSecondInitRewardTimes(randomNode) {
let initRewardTimesTx = {
isInternalTx: true,
internalTXType: 8, // InternalTXType.InitRewardTimes
nominee: keyPair.publicKey.replace('0x', '').padEnd(64, '0'),
nodeActivatedTime: Math.floor(Date.now() / 1000) - 6000,
timestamp: Date.now()
}
crypto.signObj(initRewardTimesTx, keyPair.secretKey.replace('0x', ''), keyPair.publicKey.replace('0x', ''))
console.log("Signing InternalTx: ", initRewardTimesTx)
let res = await axios.post(`http://${randomNode.ip}:${randomNode.port}/inject`, initRewardTimesTx)
if(!res.data.success) throw new Error(res.data.reason)
}
async function sendSecondClaimRewards(randomNode) {
let claimRewardTx = {
isInternalTx: true,
internalTXType: 9, // InternalTXType.ClaimRewards
nominee: keyPair.publicKey.replace('0x', '').padEnd(64, '0'),
nominator: keyPair.address,
deactivatedNodeId: 'blockian'.padEnd(64, '0'),
nodeDeactivatedTime: Math.floor(Date.now() / 1000) - 60,
timestamp: Date.now()
}
crypto.signObj(claimRewardTx, keyPair.secretKey.replace('0x', ''), keyPair.publicKey.replace('0x', ''))
console.log("Signing InternalTx: ", claimRewardTx)
let res = await axios.post(`http://${randomNode.ip}:${randomNode.port}/inject`, claimRewardTx)
if(!res.data.success) throw new Error(res.data.reason)
}
async function printState(randomNode) {
let data1 = await axios.get(`http://${randomNode.ip}:${randomNode.port}/account/${keyPair.publicKey.replace('0x', '').padEnd(64, '0')}`)
let data2 = await axios.get(`http://${randomNode.ip}:${randomNode.port}/account/${keyPair.address.replace('0x', '').padEnd(64, '0')}`)
console.log(data1.data);
console.log(data2.data);
}
async function waitTillFinish() {
console.log("Waiting 60 sec for transaction to be finalized");
await sleep(60000)
}
const main = async () => {
console.log("Grabbing Nodelist ....");
let res = await axios.get('http://0.0.0.0:4000/nodelist')
const nodelist = res.data.nodeList
const randomNode = nodelist[Math.floor(Math.random() * nodelist.length)]
console.log("Data before stake --------------------------------------")
await printState(randomNode)
await sendStakeTransaction()
await waitTillFinish()
console.log("Data after stake, before 1st initRewardTimes --------------------------------------")
await printState(randomNode)
await sendFirstInitRewardTimes(randomNode);
await waitTillFinish()
console.log("Data after 1st initRewardTimes, before 1st claimRewards --------------------------------------")
await printState(randomNode)
await sendFirstClaimRewards(randomNode);
await waitTillFinish()
console.log("Data after 1st claimRewards, before 2nd initRewardTimes --------------------------------------")
await printState(randomNode)
await sendSecondInitRewardTimes(randomNode)
await waitTillFinish()
console.log("Data after 2st initRewardTimes, before 2nd claimRewards --------------------------------------")
await printState(randomNode)
await sendSecondClaimRewards(randomNode);
await waitTillFinish()
console.log("Data after 2nd claimRewards, before unstake --------------------------------------")
await printState(randomNode)
await sendUnstakeTransaction();
await waitTillFinish()
console.log("Data after unstake --------------------------------------")
await printState(randomNode)
}
main();