diff --git a/CHANGELOG.md b/CHANGELOG.md index 90e35112..ea8ec6bf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -42,3 +42,4 @@ Ref: https://keepachangelog.com/en/1.0.0/ - (transactions)[#117](https://github.com/evmos/evmosjs/pull/117) Refactor Transactions `ERC-20` module using base infrastructure and add unit tests - (transactions)[#118](https://github.com/evmos/evmosjs/pull/118) Refactor Transactions `Gov` module using base infrastructure and add unit tests - (transactions)[#119](https://github.com/evmos/evmosjs/pull/119) Refactor Transactions `IBC` module using base infrastructure and add unit tests +- (transactions)[#120](https://github.com/evmos/evmosjs/pull/120) Refactor Transactions `Revenue` module using base infrastructure and add unit tests diff --git a/docs/transactions/revenue/README.md b/docs/transactions/revenue/README.md new file mode 100644 index 00000000..f86aa456 --- /dev/null +++ b/docs/transactions/revenue/README.md @@ -0,0 +1,86 @@ +# Revenue + +This package creates transaction payloads with messages from the [Revenue Module](https://docs.evmos.org/modules/revenue/). + +Find the `TxContext` and `TxPayload` types in the Transaction Docs. + +### MsgCancelRevenue + +```ts +export interface MsgCancelRevenueParams { + contractAddress: string + deployerAddress: string +} + +/** + * Creates a transaction for a `MsgCancelRevenue` object. + * + * @remarks + * This method creates a transaction wrapping the Evmos + * {@link https://docs.evmos.org/modules/revenue/04_transactions.html#msgcancelrevenue | MsgCancelRevenue} + * + * @param context - Transaction Context + * @param params - MsgCancelRevenue Params + * @returns Transaction with the MsgCancelRevenue payload + * + */ +export const createTxMsgCancelRevenue: ( + context: TxContext, + params: MsgCancelRevenueParams, +): TxPayload +``` + +### MsgRegisterRevenue + +```ts +export interface MsgRegisterRevenueParams { + contractAddress: string + deployerAddress: string + withdrawerAddress: string + nonces: number[] +} + +/** + * Creates a transaction for a `MsgRegisterRevenue` object. + * + * @remarks + * This method creates a transaction wrapping the Evmos + * {@link https://docs.evmos.org/modules/revenue/04_transactions.html#msgregisterrevenue | MsgRegisterRevenue} + * + * @param context - Transaction Context + * @param params - MsgRegisterRevenue Params + * @returns Transaction with the MsgRegisterRevenue payload + * + */ +export const createTxMsgRegisterRevenue: ( + context: TxContext, + params: MsgRegisterRevenueParams, +): TxPayload +``` + +### MsgUpdateRevenue + +```ts +export interface MsgUpdateRevenueParams { + contractAddress: string + deployerAddress: string + withdrawerAddress: string +} + +/** + * Creates a transaction for a `MsgUpdateRevenue` object. + * + * @remarks + * This method creates a transaction wrapping the Evmos + * {@link https://docs.evmos.org/modules/revenue/04_transactions.html#msgupdaterevenue | MsgUpdateRevenue} + * + * @param context - Transaction Context + * @param params - MsgUpdateRevenue Params + * @returns Transaction with the MsgUpdateRevenue payload + * + */ +export const createTxMsgUpdateRevenue: ( + context: TxContext, + params: MsgUpdateRevenueParams, +): TxPayload +``` diff --git a/packages/transactions/src/index.ts b/packages/transactions/src/index.ts index 06f0f89f..d0deeaf6 100644 --- a/packages/transactions/src/index.ts +++ b/packages/transactions/src/index.ts @@ -1,14 +1,12 @@ export * from './messages/authz' export * from './messages/bank' +export * from './messages/common' export * from './messages/erc20' export * from './messages/gov' export * from './messages/ibc' -export * from './messages/revenue/msgCancelRevenue' -export * from './messages/revenue/msgUpdateRevenue' -export * from './messages/revenue/msgRegisterRevenue' +export * from './messages/revenue' export * from './messages/vesting/msgCreateClawbackVestingAccount' export * from './messages/vesting/msgClawback' -export * from './messages/common' export * from './messages/staking' export * from './messages/txRaw' export * from './messages/validator' diff --git a/packages/transactions/src/messages/base.ts b/packages/transactions/src/messages/base.ts index aee0bc1f..c7edbb66 100644 --- a/packages/transactions/src/messages/base.ts +++ b/packages/transactions/src/messages/base.ts @@ -92,9 +92,9 @@ const createCosmosPayload = ( * Creates a signable transaction with SignDirect, * LegacyAmino, and EIP-712 components. * - * @param context Transaction Context - * @param typedData EIP-712 Typed Data - * @param cosmosMessage Cosmos SDK Message to sign + * @param context - Transaction Context + * @param typedData - EIP-712 Typed Data + * @param cosmosMessage - Cosmos SDK Message to sign * @returns Signable Payload * */ diff --git a/packages/transactions/src/messages/revenue/cancelRevenue.spec.ts b/packages/transactions/src/messages/revenue/cancelRevenue.spec.ts new file mode 100644 index 00000000..6bf2b060 --- /dev/null +++ b/packages/transactions/src/messages/revenue/cancelRevenue.spec.ts @@ -0,0 +1,48 @@ +import { createMsgCancelRevenue as protoMsgCancelRevenue } from '@evmos/proto' +import { + generateTypes, + createMsgCancelRevenue, + MSG_CANCEL_REVENUE_TYPES, +} from '@evmos/eip712' +import { + MsgCancelRevenueParams, + createTxMsgCancelRevenue, +} from './cancelRevenue' +import { createTransactionPayload } from '../base' +import TestUtils from '../../tests/utils' + +const { context } = TestUtils +const contractAddress = TestUtils.addrHex1 +const deployerAddress = context.sender.accountAddress + +const params: MsgCancelRevenueParams = { + contractAddress, + deployerAddress, +} + +describe('test tx payload', () => { + it('produces tx payloads as expected', () => { + const types = generateTypes(MSG_CANCEL_REVENUE_TYPES) + const message = createMsgCancelRevenue( + params.contractAddress, + params.deployerAddress, + ) + const typedData = { + types, + message, + } + + const messageCosmos = protoMsgCancelRevenue( + params.contractAddress, + params.deployerAddress, + ) + + const payload = createTxMsgCancelRevenue(context, params) + const expectedPayload = createTransactionPayload( + context, + typedData, + messageCosmos, + ) + expect(payload).toStrictEqual(expectedPayload) + }) +}) diff --git a/packages/transactions/src/messages/revenue/cancelRevenue.ts b/packages/transactions/src/messages/revenue/cancelRevenue.ts new file mode 100644 index 00000000..afcba398 --- /dev/null +++ b/packages/transactions/src/messages/revenue/cancelRevenue.ts @@ -0,0 +1,53 @@ +import { createMsgCancelRevenue as protoMsgCancelRevenue } from '@evmos/proto' + +import { + generateTypes, + createMsgCancelRevenue, + MSG_CANCEL_REVENUE_TYPES, +} from '@evmos/eip712' +import { createTransactionPayload, TxContext } from '../base' + +export interface MsgCancelRevenueParams { + contractAddress: string + deployerAddress: string +} + +const createEIP712MsgCancelRevenue = (params: MsgCancelRevenueParams) => { + const types = generateTypes(MSG_CANCEL_REVENUE_TYPES) + + const message = createMsgCancelRevenue( + params.contractAddress, + params.deployerAddress, + ) + + return { + types, + message, + } +} + +const createCosmosMsgCancelRevenue = (params: MsgCancelRevenueParams) => { + return protoMsgCancelRevenue(params.contractAddress, params.deployerAddress) +} + +/** + * Creates a transaction for a `MsgCancelRevenue` object. + * + * @remarks + * This method creates a transaction wrapping the Evmos + * {@link https://docs.evmos.org/modules/revenue/04_transactions.html#msgcancelrevenue | MsgCancelRevenue} + * + * @param context - Transaction Context + * @param params - MsgCancelRevenue Params + * @returns Transaction with the MsgCancelRevenue payload + * + */ +export const createTxMsgCancelRevenue = ( + context: TxContext, + params: MsgCancelRevenueParams, +) => { + const typedData = createEIP712MsgCancelRevenue(params) + const cosmosMsg = createCosmosMsgCancelRevenue(params) + + return createTransactionPayload(context, typedData, cosmosMsg) +} diff --git a/packages/transactions/src/messages/revenue/index.ts b/packages/transactions/src/messages/revenue/index.ts new file mode 100644 index 00000000..dac430b5 --- /dev/null +++ b/packages/transactions/src/messages/revenue/index.ts @@ -0,0 +1,3 @@ +export * from './cancelRevenue' +export * from './registerRevenue' +export * from './updateRevenue' diff --git a/packages/transactions/src/messages/revenue/msgCancelRevenue.ts b/packages/transactions/src/messages/revenue/msgCancelRevenue.ts deleted file mode 100644 index aa3c4cc1..00000000 --- a/packages/transactions/src/messages/revenue/msgCancelRevenue.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { - createMsgCancelRevenue as protoMsgCancelRevenue, - createTransaction, -} from '@evmos/proto' - -import { - createEIP712, - generateFee, - generateMessage, - generateTypes, - createMsgCancelRevenue, - MSG_CANCEL_REVENUE_TYPES, -} from '@evmos/eip712' - -import { Chain, Fee, Sender } from '../common' - -export interface MessageMsgCancelRevenue { - contractAddress: string - deployerAddress: string -} - -export function createTxMsgCancelRevenue( - chain: Chain, - sender: Sender, - fee: Fee, - memo: string, - params: MessageMsgCancelRevenue, -) { - // EIP712 - const feeObject = generateFee( - fee.amount, - fee.denom, - fee.gas, - sender.accountAddress, - ) - const types = generateTypes(MSG_CANCEL_REVENUE_TYPES) - - const msg = createMsgCancelRevenue( - params.contractAddress, - params.deployerAddress, - ) - const messages = generateMessage( - sender.accountNumber.toString(), - sender.sequence.toString(), - chain.cosmosChainId, - memo, - feeObject, - msg, - ) - const eipToSign = createEIP712(types, chain.chainId, messages) - - // Cosmos - const msgCosmos = protoMsgCancelRevenue( - params.contractAddress, - params.deployerAddress, - ) - const tx = createTransaction( - msgCosmos, - memo, - fee.amount, - fee.denom, - parseInt(fee.gas, 10), - 'ethsecp256', - sender.pubkey, - sender.sequence, - sender.accountNumber, - chain.cosmosChainId, - ) - - return { - signDirect: tx.signDirect, - legacyAmino: tx.legacyAmino, - eipToSign, - } -} diff --git a/packages/transactions/src/messages/revenue/msgRegisterRevenue.ts b/packages/transactions/src/messages/revenue/msgRegisterRevenue.ts deleted file mode 100644 index 9fd07e19..00000000 --- a/packages/transactions/src/messages/revenue/msgRegisterRevenue.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { - createMsgRegisterRevenue as protoMsgRegisterRevenue, - createTransaction, -} from '@evmos/proto' - -import { - createEIP712, - generateFee, - generateMessage, - generateTypes, - createMsgRegisterRevenue, - MSG_REGISTER_REVENUE_TYPES, -} from '@evmos/eip712' - -import { Chain, Fee, Sender } from '../common' - -export interface MessageMsgRegisterRevenue { - contractAddress: string - deployerAddress: string - withdrawerAddress: string - nonces: number[] -} - -export function createTxMsgRegisterRevenue( - chain: Chain, - sender: Sender, - fee: Fee, - memo: string, - params: MessageMsgRegisterRevenue, -) { - // EIP712 - const feeObject = generateFee( - fee.amount, - fee.denom, - fee.gas, - sender.accountAddress, - ) - const types = generateTypes(MSG_REGISTER_REVENUE_TYPES) - - const msg = createMsgRegisterRevenue( - params.contractAddress, - params.deployerAddress, - params.withdrawerAddress, - params.nonces, - ) - const messages = generateMessage( - sender.accountNumber.toString(), - sender.sequence.toString(), - chain.cosmosChainId, - memo, - feeObject, - msg, - ) - const eipToSign = createEIP712(types, chain.chainId, messages) - - // Cosmos - const msgCosmos = protoMsgRegisterRevenue( - params.contractAddress, - params.deployerAddress, - params.withdrawerAddress, - params.nonces, - ) - const tx = createTransaction( - msgCosmos, - memo, - fee.amount, - fee.denom, - parseInt(fee.gas, 10), - 'ethsecp256', - sender.pubkey, - sender.sequence, - sender.accountNumber, - chain.cosmosChainId, - ) - - return { - signDirect: tx.signDirect, - legacyAmino: tx.legacyAmino, - eipToSign, - } -} diff --git a/packages/transactions/src/messages/revenue/msgUpdateRevenue.ts b/packages/transactions/src/messages/revenue/msgUpdateRevenue.ts deleted file mode 100644 index 47fe2ae3..00000000 --- a/packages/transactions/src/messages/revenue/msgUpdateRevenue.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { - createMsgUpdateRevenue as protoMsgUpdateRevenue, - createTransaction, -} from '@evmos/proto' - -import { - createEIP712, - generateFee, - generateMessage, - generateTypes, - createMsgUpdateRevenue, - MSG_UPDATE_REVENUE_TYPES, -} from '@evmos/eip712' - -import { Chain, Fee, Sender } from '../common' - -export interface MessageMsgUpdateRevenue { - contractAddress: string - deployerAddress: string - withdrawerAddress: string - nonces: number[] -} - -export function createTxMsgUpdateRevenue( - chain: Chain, - sender: Sender, - fee: Fee, - memo: string, - params: MessageMsgUpdateRevenue, -) { - // EIP712 - const feeObject = generateFee( - fee.amount, - fee.denom, - fee.gas, - sender.accountAddress, - ) - const types = generateTypes(MSG_UPDATE_REVENUE_TYPES) - - const msg = createMsgUpdateRevenue( - params.contractAddress, - params.deployerAddress, - params.withdrawerAddress, - ) - const messages = generateMessage( - sender.accountNumber.toString(), - sender.sequence.toString(), - chain.cosmosChainId, - memo, - feeObject, - msg, - ) - const eipToSign = createEIP712(types, chain.chainId, messages) - - // Cosmos - const msgCosmos = protoMsgUpdateRevenue( - params.contractAddress, - params.deployerAddress, - params.withdrawerAddress, - ) - const tx = createTransaction( - msgCosmos, - memo, - fee.amount, - fee.denom, - parseInt(fee.gas, 10), - 'ethsecp256', - sender.pubkey, - sender.sequence, - sender.accountNumber, - chain.cosmosChainId, - ) - - return { - signDirect: tx.signDirect, - legacyAmino: tx.legacyAmino, - eipToSign, - } -} diff --git a/packages/transactions/src/messages/revenue/registerRevenue.spec.ts b/packages/transactions/src/messages/revenue/registerRevenue.spec.ts new file mode 100644 index 00000000..68f16233 --- /dev/null +++ b/packages/transactions/src/messages/revenue/registerRevenue.spec.ts @@ -0,0 +1,56 @@ +import { createMsgRegisterRevenue as protoMsgRegisterRevenue } from '@evmos/proto' +import { + generateTypes, + createMsgRegisterRevenue, + MSG_REGISTER_REVENUE_TYPES, +} from '@evmos/eip712' +import { + MsgRegisterRevenueParams, + createTxMsgRegisterRevenue, +} from './registerRevenue' +import { createTransactionPayload } from '../base' +import TestUtils from '../../tests/utils' + +const { context } = TestUtils +const contractAddress = TestUtils.addrHex1 +const deployerAddress = context.sender.accountAddress +const withdrawerAddress = TestUtils.addr2 +const nonces: number[] = [10, 15000, 30] + +const params: MsgRegisterRevenueParams = { + contractAddress, + deployerAddress, + withdrawerAddress, + nonces, +} + +describe('test tx payload', () => { + it('produces tx payloads as expected', () => { + const types = generateTypes(MSG_REGISTER_REVENUE_TYPES) + const message = createMsgRegisterRevenue( + params.contractAddress, + params.deployerAddress, + params.withdrawerAddress, + params.nonces, + ) + const typedData = { + types, + message, + } + + const messageCosmos = protoMsgRegisterRevenue( + params.contractAddress, + params.deployerAddress, + params.withdrawerAddress, + params.nonces, + ) + + const payload = createTxMsgRegisterRevenue(context, params) + const expectedPayload = createTransactionPayload( + context, + typedData, + messageCosmos, + ) + expect(payload).toStrictEqual(expectedPayload) + }) +}) diff --git a/packages/transactions/src/messages/revenue/registerRevenue.ts b/packages/transactions/src/messages/revenue/registerRevenue.ts new file mode 100644 index 00000000..d047cf18 --- /dev/null +++ b/packages/transactions/src/messages/revenue/registerRevenue.ts @@ -0,0 +1,62 @@ +import { createMsgRegisterRevenue as protoMsgRegisterRevenue } from '@evmos/proto' + +import { + generateTypes, + createMsgRegisterRevenue, + MSG_REGISTER_REVENUE_TYPES, +} from '@evmos/eip712' +import { createTransactionPayload, TxContext } from '../base' + +export interface MsgRegisterRevenueParams { + contractAddress: string + deployerAddress: string + withdrawerAddress: string + nonces: number[] +} + +const createEIP712MsgRegisterRevenue = (params: MsgRegisterRevenueParams) => { + const types = generateTypes(MSG_REGISTER_REVENUE_TYPES) + + const message = createMsgRegisterRevenue( + params.contractAddress, + params.deployerAddress, + params.withdrawerAddress, + params.nonces, + ) + + return { + types, + message, + } +} + +const createCosmosMsgRegisterRevenue = (params: MsgRegisterRevenueParams) => { + return protoMsgRegisterRevenue( + params.contractAddress, + params.deployerAddress, + params.withdrawerAddress, + params.nonces, + ) +} + +/** + * Creates a transaction for a `MsgRegisterRevenue` object. + * + * @remarks + * This method creates a transaction wrapping the Evmos + * {@link https://docs.evmos.org/modules/revenue/04_transactions.html#msgregisterrevenue | MsgRegisterRevenue} + * + * @param context - Transaction Context + * @param params - MsgRegisterRevenue Params + * @returns Transaction with the MsgRegisterRevenue payload + * + */ +export const createTxMsgRegisterRevenue = ( + context: TxContext, + params: MsgRegisterRevenueParams, +) => { + const typedData = createEIP712MsgRegisterRevenue(params) + const cosmosMsg = createCosmosMsgRegisterRevenue(params) + + return createTransactionPayload(context, typedData, cosmosMsg) +} diff --git a/packages/transactions/src/messages/revenue/updateRevenue.spec.ts b/packages/transactions/src/messages/revenue/updateRevenue.spec.ts new file mode 100644 index 00000000..88b2320f --- /dev/null +++ b/packages/transactions/src/messages/revenue/updateRevenue.spec.ts @@ -0,0 +1,52 @@ +import { createMsgUpdateRevenue as protoMsgUpdateRevenue } from '@evmos/proto' +import { + generateTypes, + createMsgUpdateRevenue, + MSG_UPDATE_REVENUE_TYPES, +} from '@evmos/eip712' +import { + MsgUpdateRevenueParams, + createTxMsgUpdateRevenue, +} from './updateRevenue' +import { createTransactionPayload } from '../base' +import TestUtils from '../../tests/utils' + +const { context } = TestUtils +const contractAddress = TestUtils.addrHex1 +const deployerAddress = context.sender.accountAddress +const withdrawerAddress = TestUtils.addr2 + +const params: MsgUpdateRevenueParams = { + contractAddress, + deployerAddress, + withdrawerAddress, +} + +describe('test tx payload', () => { + it('produces tx payloads as expected', () => { + const types = generateTypes(MSG_UPDATE_REVENUE_TYPES) + const message = createMsgUpdateRevenue( + params.contractAddress, + params.deployerAddress, + params.withdrawerAddress, + ) + const typedData = { + types, + message, + } + + const messageCosmos = protoMsgUpdateRevenue( + params.contractAddress, + params.deployerAddress, + params.withdrawerAddress, + ) + + const payload = createTxMsgUpdateRevenue(context, params) + const expectedPayload = createTransactionPayload( + context, + typedData, + messageCosmos, + ) + expect(payload).toStrictEqual(expectedPayload) + }) +}) diff --git a/packages/transactions/src/messages/revenue/updateRevenue.ts b/packages/transactions/src/messages/revenue/updateRevenue.ts new file mode 100644 index 00000000..431f82b2 --- /dev/null +++ b/packages/transactions/src/messages/revenue/updateRevenue.ts @@ -0,0 +1,60 @@ +import { createMsgUpdateRevenue as protoMsgUpdateRevenue } from '@evmos/proto' + +import { + generateTypes, + createMsgUpdateRevenue, + MSG_UPDATE_REVENUE_TYPES, +} from '@evmos/eip712' + +import { createTransactionPayload, TxContext } from '../base' + +export interface MsgUpdateRevenueParams { + contractAddress: string + deployerAddress: string + withdrawerAddress: string +} + +const createEIP712MsgUpdateRevenue = (params: MsgUpdateRevenueParams) => { + const types = generateTypes(MSG_UPDATE_REVENUE_TYPES) + + const message = createMsgUpdateRevenue( + params.contractAddress, + params.deployerAddress, + params.withdrawerAddress, + ) + + return { + types, + message, + } +} + +const createCosmosMsgUpdateRevenue = (params: MsgUpdateRevenueParams) => { + return protoMsgUpdateRevenue( + params.contractAddress, + params.deployerAddress, + params.withdrawerAddress, + ) +} + +/** + * Creates a transaction for a `MsgUpdateRevenue` object. + * + * @remarks + * This method creates a transaction wrapping the Evmos + * {@link https://docs.evmos.org/modules/revenue/04_transactions.html#msgupdaterevenue | MsgUpdateRevenue} + * + * @param context - Transaction Context + * @param params - MsgUpdateRevenue Params + * @returns Transaction with the MsgUpdateRevenue payload + * + */ +export const createTxMsgUpdateRevenue = ( + context: TxContext, + params: MsgUpdateRevenueParams, +) => { + const typedData = createEIP712MsgUpdateRevenue(params) + const cosmosMsg = createCosmosMsgUpdateRevenue(params) + + return createTransactionPayload(context, typedData, cosmosMsg) +}