Rage quit and full withdrawal for Solo staker
```
const rageQuitTest = async () => {
const provider = new ethers.providers.InfuraProvider("goerli", {
projectId: INFURA_PROJECT_ID,
projectSecret: INFURA_PROJECT_SECRET
});
// const provider = new ethers.providers.JsonRpcProvider(`https://rpc.tenderly.co/fork/50699573-60b4-4241-8f3d-8929a6f28261`);
const signer = new ethers.Wallet(PRIV_KEY_1, provider);
const sdk = new StakehouseSDK(signer);
const blsPublicKey = "0xa33a8dba7796fcea62dad3a4fda273668dc8c4c245c1201768a0c82876b82481e9a714d6b83169717dfdfaa991f669a1";
const stakehouseAddress = "0x02efe99002854e3ec762cf99ab7146a694232c56";
// const contract = new ethers.Contract(
// '0x4aCB708eb8Def5D66Ff8Da7EE4796C4B3EDb44A4',//full withdr
// require("./full_withdrawal.json"),
// signer
// )
// console.log('sweepReportingContract', await contract.sweepReportingContract())
// return;
const finalisedReport = await sdk.balanceReport.getFinalisedEpochReport(BEACON_NODE, blsPublicKey);
console.log("finalisedReport: ", finalisedReport);
// let authenticatedReport = await sdk.balanceReport.authenticateReport(BEACON_NODE, finalisedReport);
// console.log("authenticatedReport: ", authenticatedReport);
// const exitFee = await sdk.utils.calculateExitFee(blsPublicKey);
// console.log("exitFee: ", exitFee.toString());
// const rageQuitTx = await sdk.rageQuitKnot(stakehouseAddress, authenticatedReport, ADDRESS_1, "0");
// console.log("rageQuitTx: ", rageQuitTx);
// return;
// The BLS public key has already exited Beacon chain, hence no need of broadcasting and voluntary withdrawal
// Next step is to execute full withdrawal
// NOTE: Do rage quit before final withdrawal
const validatorIndex = finalisedReport.validatorIndex;
console.log("validatorIndex: ", validatorIndex);
const totalETHSentToBLSPublicKey = await sdk.balanceReport.getTotalETHSentToBlsKey(blsPublicKey);
// const totalETHSentToBLSPublicKey = "32000000000";
console.log("totalETHSentToBLSPublicKey: ", totalETHSentToBLSPublicKey.toString());
let sweeps = await sdk.balanceReport.getDETHSweeps(validatorIndex, "5196198", "5625937");
console.log("dETHSweeps: ", sweeps);
let sweep = sweeps.sweeps;
for(let i=0; i<4; ++i) sweep.shift();
sweep.pop();
sweeps.sweeps = sweep;
console.log("sweeps: ", sweeps);
const sumOfSweeps = sdk.balanceReport.calculateSumOfSweeps(sweeps.sweeps);
// const sumOfSweeps = "32107424935";
console.log("sumOfSweeps: ", sumOfSweeps.toString());
/*
Sweep struct {
// Sweeps can be reported out of order apart from validators part of the set pre-shanghai
uint256 withdrawalIndex;
uint256 validatorIndex;
address recipient; // account manager
uint256 amount;
}
*/
const finalSweep = {
"sweep": {
"index": "5414948",
"validatorIndex": "387117",
"recipient": "0x952295078A226bF40c8cb076C16E0e7229F77B28",
"amount": "32000000000"
},
"slot": "5625937",
"block": "8995315"
}
let finalReport = await sdk.balanceReport.generateFinalReport(
BEACON_NODE,
blsPublicKey,
totalETHSentToBLSPublicKey,
sumOfSweeps,
sweeps,
finalSweep
);
console.log("sweep length: ", sweeps.sweeps.length);
console.log("totalETHSentToBLSPublicKey: ", totalETHSentToBLSPublicKey);
console.log("blsPublicKey: ", blsPublicKey);
console.log("finalisedReport: ", finalisedReport);
console.log("sumOfSweeps: ", sumOfSweeps);
console.log("sweeps.sweeps: ", sweeps.sweeps);
finalReport.blsPublicKey = sdk.utils.remove0x(finalReport.blsPublicKey);
finalReport.totalETHSentToBLSKey = totalETHSentToBLSPublicKey.toString();
finalReport.sumOfUnreportedSweeps = sumOfSweeps.toString();
finalReport.unreportedSweeps = await sdk.balanceReport.formatSweepReport(sweeps.sweeps, validatorIndex);
console.log("finalReport: ", finalReport);
// totalETHSentToBLSPublicKey,
// blsPublicKey,
// finalisedReport,
// sumOfSweeps,
// sweeps.sweeps
// const verifyFinalReport = await sdk.balanceReport.verifyFinalReport(
// finalReport,
// finalisedReport
// );
// console.log("verifyFinalReport: ", verifyFinalReport);
const depositRouterfinalReport = {
"validatorInfo": {
"blsPublicKey": "a33a8dba7796fcea62dad3a4fda273668dc8c4c245c1201768a0c82876b82481e9a714d6b83169717dfdfaa991f669a1",
"validatorIndex": "387117",
"withdrawalCredentials": "010000000000000000000000952295078a226bf40c8cb076c16e0e7229f77b28",
"slashed": false,
"activeBalance": "0",
"effectiveBalance": "0",
"exitEpoch": "175497",
"activationEpoch": "123432",
"withdrawalEpoch": "175753",
"currentCheckpointEpoch": 179537
},
"finalSweep": {
"sweep": {
"withdrawalIndex": "5414948",
"validatorIndex": "387117",
"recipient": "0x952295078A226bF40c8cb076C16E0e7229F77B28",
"amount": "32000000000"
},
"slot": "5625937",
"block": "8995315"
},
"designatedVerifierSignature": {
"deadline": 9091415,
"v": 27,
"r": "0x504ef75b7b840910b3fc1e601c93fe611150d16c753319fb3f449919f4da2ba4",
"s": "0x35683d918c95b673ee67d0ace7ca1295f16980fde6c16b039619c206bd690688"
}
}
// const authenticatedReport = await sdk.balanceReport.authenticateReport(BEACON_NODE, finalisedReport);
// authenticatedReport.report.blsPublicKey = _add0x(authenticatedReport.report.blsPublicKey);
// authenticatedReport.report.withdrawalCredentials = _add0x(authenticatedReport.report.withdrawalCredentials);
// const signature = {
// deadline: authenticatedReport.deadline,
// v: authenticatedReport.v,
// r: Buffer.from(authenticatedReport.r, 'hex'),
// s: Buffer.from(authenticatedReport.s, 'hex'),
// };
// const contract = new ethers.Contract(
// '0x4aCB708eb8Def5D66Ff8Da7EE4796C4B3EDb44A4',//full withdr
// require("./full_withdrawal.json"),
// signer
// )
// console.log("contract: ", contract.address);
// console.log("signer: ", signer);
// console.log("totalETHSentToBLSPublicKey: ", totalETHSentToBLSPublicKey);
// console.log("blsPublicKey: ", authenticatedReport.report.blsPublicKey);
// console.log("unreportedSweeps: ", sweeps.sweeps);
// console.log("finalSweep: ", finalSweep);
// console.log("report: ", authenticatedReport.report);
// console.log("signature: ", signature);
// const inputParams = [
// totalETHSentToBLSPublicKey,
// authenticatedReport.report.blsPublicKey,
// sweeps.sweeps,
// finalSweep,
// authenticatedReport.report,
// signature
// ];
// const fullWithdrawalTx = await contract.reportFinalSweepAndWithdraw(
// totalETHSentToBLSPublicKey,
// authenticatedReport.report.blsPublicKey,
// sweeps.sweeps,
// finalSweep,
// authenticatedReport.report,
// signature
// );
const sweepReport = await sdk.balanceReport.formatSweepReport(sweeps.sweeps, finalisedReport.validatorIndex);
console.log("sweepReport: ", sweepReport);
const fullWithdrawalTx = await sdk.withdrawal.reportFinalSweepAndWithdraw(
totalETHSentToBLSPublicKey,
sweepReport,
depositRouterfinalReport.finalSweep,
depositRouterfinalReport
);
console.log("fullWithdrawalTx: ", fullWithdrawalTx);
return;
/*
NOTE:
1) User broadcasts voluntary exit
2) Voluntary withdrawal to be reported on tx router (LSD requires to report before voluntary withdrawal)
3) rage quit (LSD - rage quit assistant) has recipient param that receives ETH and **can only call full withdrawal**
4) sweep and full withdrawal
5) Unstaking/ claiming
*/
};
rageQuitTest();
```