From 28e1214186c3285ca61de9bd7ca38ec84f9cbf32 Mon Sep 17 00:00:00 2001 From: Fabio B Date: Thu, 4 Jun 2020 06:56:05 +0200 Subject: [PATCH 1/5] fix: Add RFQT configs when instantiating SwapQuoter (#218) * Add RFQT configs when instantiating SwapQuoter * Set permitted order fee types in meta-txn Co-authored-by: Jacob Evans --- src/services/meta_transaction_service.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/services/meta_transaction_service.ts b/src/services/meta_transaction_service.ts index 9f2e4d649..0441d3fc5 100644 --- a/src/services/meta_transaction_service.ts +++ b/src/services/meta_transaction_service.ts @@ -1,4 +1,5 @@ import { Orderbook, SwapQuoter, SwapQuoterOpts } from '@0x/asset-swapper'; +import { OrderPrunerPermittedFeeTypes } from '@0x/asset-swapper/lib/src/types'; import { ContractWrappers } from '@0x/contract-wrappers'; import { DevUtilsContract } from '@0x/contracts-dev-utils'; import { generatePseudoRandomSalt, SupportedProvider, ZeroExTransaction } from '@0x/order-utils'; @@ -15,6 +16,9 @@ import { LIQUIDITY_POOL_REGISTRY_ADDRESS, META_TXN_RELAY_EXPECTED_MINED_SEC, META_TXN_SUBMIT_WHITELISTED_API_KEYS, + RFQT_API_KEY_WHITELIST, + RFQT_MAKER_ASSET_OFFERINGS, + RFQT_SKIP_BUY_REQUESTS, } from '../config'; import { ONE_GWEI, @@ -64,6 +68,14 @@ export class MetaTransactionService { chainId: CHAIN_ID, expiryBufferMs: QUOTE_ORDER_EXPIRATION_BUFFER_MS, liquidityProviderRegistryAddress: LIQUIDITY_POOL_REGISTRY_ADDRESS, + rfqt: { + takerApiKeyWhitelist: RFQT_API_KEY_WHITELIST, + makerAssetOfferings: RFQT_MAKER_ASSET_OFFERINGS, + skipBuyRequests: RFQT_SKIP_BUY_REQUESTS, + warningLogger: logger.warn.bind(logger), + infoLogger: logger.info.bind(logger), + }, + permittedOrderFeeTypes: new Set([OrderPrunerPermittedFeeTypes.NoFees]), }; this._swapQuoter = new SwapQuoter(this._provider, orderbook, swapQuoterOpts); this._contractWrappers = new ContractWrappers(this._provider, { chainId: CHAIN_ID }); From a756ad5c177559ed706d60d5557bc11c769a02a5 Mon Sep 17 00:00:00 2001 From: Jacob Evans Date: Thu, 4 Jun 2020 15:39:24 +1000 Subject: [PATCH 2/5] Attribute Metatxn calldata (#244) --- src/handlers/meta_transaction_handlers.ts | 2 ++ src/services/meta_transaction_service.ts | 11 ++++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/handlers/meta_transaction_handlers.ts b/src/handlers/meta_transaction_handlers.ts index 039b4f6c4..18201e650 100644 --- a/src/handlers/meta_transaction_handlers.ts +++ b/src/handlers/meta_transaction_handlers.ts @@ -193,6 +193,7 @@ export class MetaTransactionHandlers { } public async submitZeroExTransactionIfWhitelistedAsync(req: express.Request, res: express.Response): Promise { const apiKey = req.header('0x-api-key'); + const affiliateAddress = req.query.affiliateAddress as string | undefined; if (apiKey !== undefined && !isValidUUID(apiKey)) { res.status(HttpStatus.BAD_REQUEST).send({ code: GeneralErrorCodes.InvalidAPIKey, @@ -237,6 +238,7 @@ export class MetaTransactionHandlers { zeroExTransaction, signature, protocolFee, + affiliateAddress, ); res.status(HttpStatus.OK).send({ ethereumTransactionHash, diff --git a/src/services/meta_transaction_service.ts b/src/services/meta_transaction_service.ts index 0441d3fc5..c4ea42ab8 100644 --- a/src/services/meta_transaction_service.ts +++ b/src/services/meta_transaction_service.ts @@ -307,15 +307,20 @@ export class MetaTransactionService { zeroExTransaction: ZeroExTransactionWithoutDomain, signature: string, protocolFee: BigNumber, + affiliateAddress?: string, ): Promise { + const data = serviceUtils.attributeCallData( + this._contractWrappers.exchange + .executeTransaction(zeroExTransaction, signature) + .getABIEncodedTransactionData(), + affiliateAddress, + ); const transactionEntity = TransactionEntity.make({ refHash: zeroExTransactionHash, status: TransactionStates.Unsubmitted, takerAddress: zeroExTransaction.signerAddress, to: this._contractWrappers.exchange.address, - data: this._contractWrappers.exchange - .executeTransaction(zeroExTransaction, signature) - .getABIEncodedTransactionData(), + data, value: protocolFee, gasPrice: zeroExTransaction.gasPrice, expectedMinedInSec: META_TXN_RELAY_EXPECTED_MINED_SEC, From ce973a2cac07fd9dcf783f284f3db125c242317f Mon Sep 17 00:00:00 2001 From: Oskar Paolini Date: Thu, 4 Jun 2020 21:59:27 +0200 Subject: [PATCH 3/5] feat: return ethereum transaction status in the response from metatxn status (#247) * add ethereum transaction status to the response from metatxn * add meta transaction status response type --- src/handlers/meta_transaction_handlers.ts | 10 ++++++++-- src/types.ts | 11 +++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/handlers/meta_transaction_handlers.ts b/src/handlers/meta_transaction_handlers.ts index 18201e650..7b599df55 100644 --- a/src/handlers/meta_transaction_handlers.ts +++ b/src/handlers/meta_transaction_handlers.ts @@ -22,7 +22,12 @@ import { logger } from '../logger'; import { isAPIError, isRevertError } from '../middleware/error_handling'; import { schemas } from '../schemas/schemas'; import { MetaTransactionService } from '../services/meta_transaction_service'; -import { GetMetaTransactionPriceResponse, GetTransactionRequestParams, ZeroExTransactionWithoutDomain } from '../types'; +import { + GetMetaTransactionPriceResponse, + GetMetaTransactionStatusResponse, + GetTransactionRequestParams, + ZeroExTransactionWithoutDomain, +} from '../types'; import { parseUtils } from '../utils/parse_utils'; import { schemaUtils } from '../utils/schema_utils'; import { findTokenAddressOrThrowApiError } from '../utils/token_metadata_utils'; @@ -350,7 +355,7 @@ const parsePostTransactionRequestBody = (req: any): PostTransactionRequestBody = }; }; -const marshallTransactionEntity = (tx: TransactionEntity): any => { +const marshallTransactionEntity = (tx: TransactionEntity): GetMetaTransactionStatusResponse => { return { refHash: tx.refHash, hash: tx.txHash, @@ -359,5 +364,6 @@ const marshallTransactionEntity = (tx: TransactionEntity): any => { updatedAt: tx.updatedAt, blockNumber: tx.blockNumber, expectedMinedInSec: tx.expectedMinedInSec, + ethereumTxStatus: tx.txStatus, }; }; diff --git a/src/types.ts b/src/types.ts index cf0a35fa5..6eef502bd 100644 --- a/src/types.ts +++ b/src/types.ts @@ -417,6 +417,17 @@ export interface GetMetaTransactionQuoteResponse { export interface GetMetaTransactionPriceResponse extends BasePriceResponse {} +export interface GetMetaTransactionStatusResponse { + refHash: string; + hash?: string; + status: string; + gasPrice?: BigNumber; + updatedAt?: Date; + blockNumber?: number; + expectedMinedInSec?: number; + ethereumTxStatus?: number; +} + // takerAddress, sellAmount, buyAmount, swapQuote, price export interface CalculateMetaTransactionPriceResponse { price: BigNumber; From d8b8941f9492720254b6a8d7c491ad16a3deedd4 Mon Sep 17 00:00:00 2001 From: Alex Kroeger Date: Thu, 4 Jun 2020 16:53:00 -0700 Subject: [PATCH 4/5] feat: added rewards per ZRX to pools endpoint (#235) * added rewards per ZRX to pools endpoint * fixed reward epoch ID join --- src/queries/staking_queries.ts | 18 ++++++++++++++++-- src/services/staking_data_service.ts | 2 ++ src/types.ts | 4 ++++ src/utils/staking_utils.ts | 8 +++++++- 4 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/queries/staking_queries.ts b/src/queries/staking_queries.ts index 93e7f3818..e3eea9012 100644 --- a/src/queries/staking_queries.ts +++ b/src/queries/staking_queries.ts @@ -231,17 +231,24 @@ export const poolsAvgRewardsQuery = ` WITH avg_rewards AS ( SELECT - pool_id + rpe.pool_id , AVG(members_reward) / 1e18 AS avg_member_reward_in_eth , AVG(operator_reward + members_reward) / 1e18 AS avg_total_reward_in_eth + , AVG(esps.member_zrx_delegated) AS avg_member_stake + , AVG((members_reward / 1e18) / esps.member_zrx_delegated) AS avg_member_reward_eth_per_zrx FROM events.rewards_paid_events rpe JOIN staking.current_epoch ce ON rpe.epoch_id > (ce.epoch_id - 4) + -- subtract one from the reward epoch ID, since reward events are stamped with the epoch + -- after the epoch for which they are paid out + JOIN staking.epoch_start_pool_status esps ON esps.epoch_id = (rpe.epoch_id - 1) AND esps.pool_id = rpe.pool_id GROUP BY 1 ) SELECT p.pool_id , COALESCE(r.avg_member_reward_in_eth, 0) AS avg_member_reward_in_eth , COALESCE(r.avg_total_reward_in_eth, 0) AS avg_total_reward_in_eth + , COALESCE(r.avg_member_stake, 0) AS avg_member_stake + , COALESCE(r.avg_member_reward_eth_per_zrx, 0) AS avg_member_reward_eth_per_zrx FROM events.staking_pool_created_events p LEFT JOIN avg_rewards r ON r.pool_id = p.pool_id; `; @@ -250,11 +257,16 @@ export const poolAvgRewardsQuery = ` WITH avg_rewards AS ( SELECT - pool_id + rpe.pool_id , AVG(members_reward) / 1e18 AS avg_member_reward_in_eth , AVG(operator_reward + members_reward) / 1e18 AS avg_total_reward_in_eth + , AVG(esps.member_zrx_delegated) AS avg_member_stake + , AVG((members_reward / 1e18) / esps.member_zrx_delegated) AS avg_member_reward_eth_per_zrx FROM events.rewards_paid_events rpe JOIN staking.current_epoch ce ON rpe.epoch_id > (ce.epoch_id - 4) + -- subtract one from the reward epoch ID, since reward events are stamped with the epoch + -- after the epoch for which they are paid out + JOIN staking.epoch_start_pool_status esps ON esps.epoch_id = (rpe.epoch_id - 1) AND esps.pool_id = rpe.pool_id WHERE rpe.pool_id = $1 GROUP BY 1 @@ -263,6 +275,8 @@ export const poolAvgRewardsQuery = ` p.pool_id , COALESCE(r.avg_member_reward_in_eth, 0) AS avg_member_reward_in_eth , COALESCE(r.avg_total_reward_in_eth, 0) AS avg_total_reward_in_eth + , COALESCE(r.avg_member_stake, 0) AS avg_member_stake + , COALESCE(r.avg_member_reward_eth_per_zrx, 0) AS avg_member_reward_eth_per_zrx FROM events.staking_pool_created_events p LEFT JOIN avg_rewards r ON r.pool_id = p.pool_id WHERE diff --git a/src/services/staking_data_service.ts b/src/services/staking_data_service.ts index 30abed667..fea1fe87d 100644 --- a/src/services/staking_data_service.ts +++ b/src/services/staking_data_service.ts @@ -176,6 +176,7 @@ export class StakingDataService { sevenDayProtocolFeesGeneratedInEth: pool7dProtocolFeesGenerated.sevenDayProtocolFeesGeneratedInEth, avgMemberRewardInEth: poolAvgReward.avgMemberRewardInEth, avgTotalRewardInEth: poolAvgReward.avgTotalRewardInEth, + avgMemberRewardEthPerZrx: poolAvgReward.avgMemberRewardEthPerZrx, currentEpochStats: currentEpochPoolStats, nextEpochStats: nextEpochPoolStats, }; @@ -211,6 +212,7 @@ export class StakingDataService { poolProtocolFeesGeneratedMap[pool.poolId].sevenDayProtocolFeesGeneratedInEth, avgMemberRewardInEth: poolAvgRewardsMap[pool.poolId].avgMemberRewardInEth, avgTotalRewardInEth: poolAvgRewardsMap[pool.poolId].avgTotalRewardInEth, + avgMemberRewardEthPerZrx: poolAvgRewardsMap[pool.poolId].avgMemberRewardEthPerZrx, currentEpochStats: currentEpochPoolStatsMap[pool.poolId], nextEpochStats: nextEpochPoolStatsMap[pool.poolId], })); diff --git a/src/types.ts b/src/types.ts index 6eef502bd..7d806658b 100644 --- a/src/types.ts +++ b/src/types.ts @@ -151,6 +151,7 @@ export interface PoolWithStats extends Pool { sevenDayProtocolFeesGeneratedInEth: number; avgMemberRewardInEth: number; avgTotalRewardInEth: number; + avgMemberRewardEthPerZrx: number; } export interface PoolWithHistoricalStats extends PoolWithStats { @@ -211,12 +212,15 @@ export interface RawPoolAvgRewards { pool_id: string; avg_member_reward_in_eth: string; avg_total_reward_in_eth: string; + avg_member_stake: string; + avg_member_reward_eth_per_zrx: string; } export interface PoolAvgRewards { poolId: string; avgMemberRewardInEth: number; avgTotalRewardInEth: number; + avgMemberRewardEthPerZrx: number; } export interface RawPoolTotalProtocolFeesGenerated { diff --git a/src/utils/staking_utils.ts b/src/utils/staking_utils.ts index 81b7799de..3e814080a 100644 --- a/src/utils/staking_utils.ts +++ b/src/utils/staking_utils.ts @@ -193,11 +193,17 @@ export const stakingUtils = { return rawPoolsProtocolFeesGenerated.map(stakingUtils.getPoolProtocolFeesGeneratedFromRaw); }, getPoolAvgRewardsFromRaw: (rawPoolAvgRewards: RawPoolAvgRewards): PoolAvgRewards => { - const { pool_id, avg_member_reward_in_eth, avg_total_reward_in_eth } = rawPoolAvgRewards; + const { + pool_id, + avg_member_reward_in_eth, + avg_total_reward_in_eth, + avg_member_reward_eth_per_zrx, + } = rawPoolAvgRewards; return { poolId: pool_id, avgMemberRewardInEth: Number(avg_member_reward_in_eth || 0), avgTotalRewardInEth: Number(avg_total_reward_in_eth || 0), + avgMemberRewardEthPerZrx: Number(avg_member_reward_eth_per_zrx || 0), }; }, getPoolsAvgRewardsFromRaw: (rawPoolsAvgRewards: RawPoolAvgRewards[]): PoolAvgRewards[] => { From f0101b66ee3b2fbdbfc1985368b83f411c33f22f Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Mon, 8 Jun 2020 17:11:58 +0000 Subject: [PATCH 5/5] chore(release): 1.7.0 [skip ci] # [1.7.0](https://github.com/0xProject/0x-api/compare/v1.6.0...v1.7.0) (2020-06-08) ### Bug Fixes * Add RFQT configs when instantiating SwapQuoter ([#218](https://github.com/0xProject/0x-api/issues/218)) ([28e1214](https://github.com/0xProject/0x-api/commit/28e1214186c3285ca61de9bd7ca38ec84f9cbf32)) ### Features * added rewards per ZRX to pools endpoint ([#235](https://github.com/0xProject/0x-api/issues/235)) ([d8b8941](https://github.com/0xProject/0x-api/commit/d8b8941f9492720254b6a8d7c491ad16a3deedd4)) * return ethereum transaction status in the response from metatxn status ([#247](https://github.com/0xProject/0x-api/issues/247)) ([ce973a2](https://github.com/0xProject/0x-api/commit/ce973a2cac07fd9dcf783f284f3db125c242317f)) --- CHANGELOG.md | 13 +++++++++++++ package.json | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ef85d6a4e..39971f5f1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,16 @@ +# [1.7.0](https://github.com/0xProject/0x-api/compare/v1.6.0...v1.7.0) (2020-06-08) + + +### Bug Fixes + +* Add RFQT configs when instantiating SwapQuoter ([#218](https://github.com/0xProject/0x-api/issues/218)) ([28e1214](https://github.com/0xProject/0x-api/commit/28e1214186c3285ca61de9bd7ca38ec84f9cbf32)) + + +### Features + +* added rewards per ZRX to pools endpoint ([#235](https://github.com/0xProject/0x-api/issues/235)) ([d8b8941](https://github.com/0xProject/0x-api/commit/d8b8941f9492720254b6a8d7c491ad16a3deedd4)) +* return ethereum transaction status in the response from metatxn status ([#247](https://github.com/0xProject/0x-api/issues/247)) ([ce973a2](https://github.com/0xProject/0x-api/commit/ce973a2cac07fd9dcf783f284f3db125c242317f)) + # [1.6.0](https://github.com/0xProject/0x-api/compare/v1.5.0...v1.6.0) (2020-06-01) diff --git a/package.json b/package.json index 1b85cf763..bb58559d9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "0x-api", - "version": "1.6.0", + "version": "1.7.0", "description": "0x API", "repository": "git@github.com:0xProject/0x-api.git", "author": "Francesco Agosti ",