@dydxfoundation/governance
Version:
dYdX governance smart contracts
256 lines (255 loc) • 12.4 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 __param = (this && this.__param) || function (paramIndex, decorator) {
return function (target, key) { decorator(target, key, paramIndex); }
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const utils_1 = require("ethers/lib/utils");
const types_1 = require("../../../types");
const types_2 = require("../types");
const parsings_1 = require("../utils/parsings");
const methodValidators_1 = require("../validators/methodValidators");
const paramValidators_1 = require("../validators/paramValidators");
const BaseService_1 = __importDefault(require("./BaseService"));
class GovernanceDelegationTokenService extends BaseService_1.default {
constructor(config) {
super(config, types_1.DydxToken__factory);
}
async delegate({ user, delegatee, governanceToken }) {
const txs = [];
const governanceDelegationToken = this.getContractInstance(governanceToken);
const delegateeAddress = await this.getDelegateeAddress(delegatee);
const txCallback = this.generateTxCallback({
rawTxMethod: () => governanceDelegationToken.populateTransaction.delegate(delegateeAddress),
from: user,
});
txs.push({
tx: txCallback,
txType: types_2.eEthereumTxType.GOV_DELEGATION_ACTION,
gas: this.generateTxPriceEstimation(txs, txCallback),
});
return txs;
}
async delegateByType({ user, delegatee, delegationType, governanceToken }) {
const txs = [];
const governanceDelegationToken = this.getContractInstance(governanceToken);
const delegateeAddress = await this.getDelegateeAddress(delegatee);
const txCallback = this.generateTxCallback({
rawTxMethod: () => governanceDelegationToken.populateTransaction.delegateByType(delegateeAddress, delegationType.valueOf()),
from: user,
});
txs.push({
tx: txCallback,
txType: types_2.eEthereumTxType.GOV_DELEGATION_ACTION,
gas: this.generateTxPriceEstimation(txs, txCallback),
});
return txs;
}
async delegateBySig({ user, delegatee, expiry, signature, governanceToken }) {
const txs = [];
const governanceDelegationToken = this.getContractInstance(governanceToken);
const nonce = await this.getNonce({ user, governanceToken });
const { v, r, s } = (0, utils_1.splitSignature)(signature);
const delegateeAddress = await this.getDelegateeAddress(delegatee);
const txCallback = this.generateTxCallback({
rawTxMethod: () => governanceDelegationToken.populateTransaction.delegateBySig(delegateeAddress, nonce, expiry, v, r, s),
from: user,
});
txs.push({
tx: txCallback,
txType: types_2.eEthereumTxType.GOV_DELEGATION_ACTION,
gas: this.generateTxPriceEstimation(txs, txCallback),
});
return txs;
}
async delegateByTypeBySig({ user, delegatee, delegationType, expiry, signature, governanceToken, }) {
const txs = [];
const governanceDelegationToken = this.getContractInstance(governanceToken);
const nonce = await this.getNonce({ user, governanceToken });
const { v, r, s } = (0, utils_1.splitSignature)(signature);
const delegateeAddress = await this.getDelegateeAddress(delegatee);
const txCallback = this.generateTxCallback({
rawTxMethod: () => governanceDelegationToken.populateTransaction.delegateByTypeBySig(delegateeAddress, delegationType, nonce, expiry, v, r, s),
from: user,
});
txs.push({
tx: txCallback,
txType: types_2.eEthereumTxType.GOV_DELEGATION_ACTION,
gas: this.generateTxPriceEstimation(txs, txCallback),
});
return txs;
}
async prepareDelegateSignature({ delegatee, nonce, expiry, governanceTokenName, governanceToken, }) {
const delegateeAddress = await this.getDelegateeAddress(delegatee);
const typeData = {
types: {
EIP712Domain: [
{ name: 'name', type: 'string' },
{ name: 'chainId', type: 'uint256' },
{ name: 'verifyingContract', type: 'address' },
],
Delegate: [
{ name: 'delegatee', type: 'address' },
{ name: 'nonce', type: 'uint256' },
{ name: 'expiry', type: 'uint256' },
],
},
primaryType: 'Delegate',
domain: {
name: governanceTokenName,
chainId: types_2.ChainId[this.config.network],
verifyingContract: governanceToken,
},
message: {
delegatee: delegateeAddress,
nonce,
expiry,
},
};
return JSON.stringify(typeData);
}
async prepareDelegateByTypeSignature({ delegatee, type, nonce, expiry, governanceTokenName, governanceToken, }) {
const delegateeAddress = await this.getDelegateeAddress(delegatee);
const typeData = {
types: {
EIP712Domain: [
{ name: 'name', type: 'string' },
{ name: 'chainId', type: 'uint256' },
{ name: 'verifyingContract', type: 'address' },
],
DelegateByType: [
{ name: 'delegatee', type: 'address' },
{ name: 'type', type: 'uint256' },
{ name: 'nonce', type: 'uint256' },
{ name: 'expiry', type: 'uint256' },
],
},
primaryType: 'DelegateByType',
domain: {
name: governanceTokenName,
chainId: types_2.ChainId[this.config.network],
verifyingContract: governanceToken,
},
message: {
delegatee: delegateeAddress,
type,
nonce,
expiry,
},
};
return JSON.stringify(typeData);
}
async getDelegateeByType({ delegator, delegationType, governanceToken }) {
const governanceDelegationToken = this.getContractInstance(governanceToken);
return governanceDelegationToken.getDelegateeByType(delegator, delegationType);
}
async getDelegatees(delegator, governanceToken) {
const [propositionDelegatee, votingDelegatee,] = await Promise.all([
this.getDelegateeByType({
delegator,
delegationType: types_2.DelegationType.PROPOSITION_POWER,
governanceToken,
}),
this.getDelegateeByType({
delegator,
delegationType: types_2.DelegationType.VOTING_POWER,
governanceToken,
}),
]);
return {
PROPOSITION_DELEGATEE: propositionDelegatee,
VOTING_DELEGATEE: votingDelegatee,
};
}
async getPowerCurrent({ user, delegationType, governanceToken }) {
const governanceDelegationToken = this.getContractInstance(governanceToken);
return (await governanceDelegationToken.getPowerCurrent(user, delegationType)).toString();
}
async getPowerAtBlock({ user, blockNumber, delegationType, governanceToken }) {
const governanceDelegationToken = this.getContractInstance(governanceToken);
return (await governanceDelegationToken.getPowerAtBlock(user, blockNumber, delegationType)).toString();
}
async getNonce({ user, governanceToken }) {
const governanceDelegationToken = this.getContractInstance(governanceToken);
// eslint-disable-next-line no-underscore-dangle
return (await governanceDelegationToken.nonces(user)).toString();
}
async getDelegateeAddress(delegatee) {
if ((0, parsings_1.canBeEnsAddress)(delegatee)) {
const delegateeAddress = await this.config.provider.resolveName(delegatee);
if (!delegateeAddress)
throw new Error(`Address ${delegatee} is not a valid ENS address`);
return delegateeAddress;
}
return delegatee;
}
}
__decorate([
methodValidators_1.GovDelegationValidator,
__param(0, (0, paramValidators_1.IsEthAddress)('user')),
__param(0, (0, paramValidators_1.IsEthAddressOrENS)('delegatee')),
__param(0, (0, paramValidators_1.IsEthAddress)('governanceToken'))
], GovernanceDelegationTokenService.prototype, "delegate", null);
__decorate([
methodValidators_1.GovDelegationValidator,
__param(0, (0, paramValidators_1.IsEthAddress)('user')),
__param(0, (0, paramValidators_1.IsEthAddressOrENS)('delegatee')),
__param(0, (0, paramValidators_1.IsEthAddress)('governanceToken'))
], GovernanceDelegationTokenService.prototype, "delegateByType", null);
__decorate([
methodValidators_1.GovDelegationValidator,
__param(0, (0, paramValidators_1.IsEthAddress)('user')),
__param(0, (0, paramValidators_1.IsEthAddressOrENS)('delegatee')),
__param(0, (0, paramValidators_1.IsEthAddress)('governanceToken'))
], GovernanceDelegationTokenService.prototype, "delegateBySig", null);
__decorate([
methodValidators_1.GovDelegationValidator,
__param(0, (0, paramValidators_1.IsEthAddress)('user')),
__param(0, (0, paramValidators_1.IsEthAddressOrENS)('delegatee')),
__param(0, (0, paramValidators_1.IsEthAddress)('governanceToken'))
], GovernanceDelegationTokenService.prototype, "delegateByTypeBySig", null);
__decorate([
methodValidators_1.GovDelegationValidator,
__param(0, (0, paramValidators_1.IsEthAddressOrENS)('delegatee')),
__param(0, (0, paramValidators_1.IsEthAddress)('governanceToken')),
__param(0, (0, paramValidators_1.Is0OrPositiveAmount)('nonce'))
], GovernanceDelegationTokenService.prototype, "prepareDelegateSignature", null);
__decorate([
methodValidators_1.GovDelegationValidator,
__param(0, (0, paramValidators_1.IsEthAddressOrENS)('delegatee')),
__param(0, (0, paramValidators_1.IsEthAddress)('governanceToken')),
__param(0, (0, paramValidators_1.Is0OrPositiveAmount)('nonce'))
], GovernanceDelegationTokenService.prototype, "prepareDelegateByTypeSignature", null);
__decorate([
methodValidators_1.GovDelegationValidator,
__param(0, (0, paramValidators_1.IsEthAddress)('delegator')),
__param(0, (0, paramValidators_1.IsEthAddress)('governanceToken'))
], GovernanceDelegationTokenService.prototype, "getDelegateeByType", null);
__decorate([
methodValidators_1.GovDelegationValidator
], GovernanceDelegationTokenService.prototype, "getDelegatees", null);
__decorate([
methodValidators_1.GovDelegationValidator,
__param(0, (0, paramValidators_1.IsEthAddress)('user')),
__param(0, (0, paramValidators_1.IsEthAddress)('governanceToken'))
], GovernanceDelegationTokenService.prototype, "getPowerCurrent", null);
__decorate([
methodValidators_1.GovDelegationValidator,
__param(0, (0, paramValidators_1.IsEthAddress)('user')),
__param(0, (0, paramValidators_1.IsEthAddress)('governanceToken')),
__param(0, (0, paramValidators_1.IsPositiveAmount)('blockNumber'))
], GovernanceDelegationTokenService.prototype, "getPowerAtBlock", null);
__decorate([
methodValidators_1.GovDelegationValidator,
__param(0, (0, paramValidators_1.IsEthAddress)('user')),
__param(0, (0, paramValidators_1.IsEthAddress)('governanceToken'))
], GovernanceDelegationTokenService.prototype, "getNonce", null);
exports.default = GovernanceDelegationTokenService;