@dydxfoundation/governance
Version:
dYdX governance smart contracts
81 lines (80 loc) • 4.69 kB
JavaScript
;
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const bignumber_js_1 = __importDefault(require("bignumber.js"));
const utils_1 = require("ethers/lib/utils");
const types_1 = require("../../../types");
const config_1 = require("../config");
const types_2 = require("../types");
const methodValidators_1 = require("../validators/methodValidators");
const BaseService_1 = __importDefault(require("./BaseService"));
class ClaimsProxyService extends BaseService_1.default {
constructor(config, safetyModule, liquidityModule, merkleDistributor, hardhatClaimsProxyAddresses, hardhatTokenAddresses, hardhatTreasuryAddresses) {
super(config, types_1.ClaimsProxy__factory);
this.safetyModule = safetyModule;
this.liquidityModule = liquidityModule;
this.merkleDistributor = merkleDistributor;
// Get the contract address.
const { network } = this.config;
const isHardhatNetwork = network === types_2.Network.hardhat;
if (isHardhatNetwork &&
(!hardhatClaimsProxyAddresses ||
!hardhatTokenAddresses ||
!hardhatTreasuryAddresses)) {
throw new Error('Must specify token and treasury addresses when on hardhat network');
}
const tokenAddresses = isHardhatNetwork ? hardhatTokenAddresses : config_1.dydxTokenAddresses[network];
this.tokenAddress = tokenAddresses.TOKEN_ADDRESS;
this.treasuryAddresses = isHardhatNetwork ? hardhatTreasuryAddresses : config_1.dydxTreasuryAddresses[network];
const addresses = isHardhatNetwork
? hardhatClaimsProxyAddresses
: config_1.claimsProxyAddresses[network];
this.claimsProxyAddress = addresses.CLAIMS_PROXY_ADDRESS;
}
get contract() {
return this.getContractInstance(this.claimsProxyAddress);
}
async claimRewards(user) {
const { provider } = this.config;
const dydxToken = types_1.DydxToken__factory.connect(this.tokenAddress, provider);
const [safetyModuleRewards, liquidityStakingRewards, merkleProof, rewardsTreasuryBalance,] = await Promise.all([
this.safetyModule.getUserUnclaimedRewards(user),
this.liquidityModule.getUserUnclaimedRewards(user),
this.merkleDistributor.getActiveRootMerkleProof(user),
dydxToken.balanceOf(this.treasuryAddresses.REWARDS_TREASURY_ADDRESS),
]);
const hasSafetyModuleRewards = !new bignumber_js_1.default(safetyModuleRewards).isZero();
const hasLiquidityStakingRewards = !new bignumber_js_1.default(liquidityStakingRewards).isZero();
const userUnclaimedRewards = await this.contract.callStatic.claimRewards(true, true, merkleProof.cumulativeAmount, merkleProof.merkleProof, true, { from: user });
const vestFromTreasuryVester = rewardsTreasuryBalance.lt(userUnclaimedRewards);
const txCallback = this.generateTxCallback({
rawTxMethod: () => this.contract.populateTransaction.claimRewards(hasSafetyModuleRewards, hasLiquidityStakingRewards, merkleProof.cumulativeAmount, merkleProof.merkleProof, vestFromTreasuryVester),
from: user,
gasLimit: 600000,
});
return [
{
tx: txCallback,
txType: types_2.eEthereumTxType.CLAIMS_PROXY_ACTION,
gas: this.generateTxPriceEstimation([], txCallback),
},
];
}
async getUserUnclaimedRewards(user) {
const merkleProof = await this.merkleDistributor.getActiveRootMerkleProof(user);
const userUnclaimedRewards = await this.contract.callStatic.claimRewards(true, true, merkleProof.cumulativeAmount, merkleProof.merkleProof, true, { from: user });
return (0, utils_1.formatEther)(userUnclaimedRewards);
}
}
__decorate([
methodValidators_1.StakingValidator
], ClaimsProxyService.prototype, "claimRewards", null);
exports.default = ClaimsProxyService;