UNPKG

@dydxfoundation/governance

Version:
256 lines (255 loc) 12.4 kB
"use strict"; 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;