Compare commits

..

4 Commits

Author SHA1 Message Date
Github Actions
289474e2ce Publish
- @0x/contracts-integrations@2.7.47
 - @0x/contracts-treasury@1.2.0
 - @0x/asset-swapper@6.17.0
2021-05-27 22:22:14 +00:00
Github Actions
407ca21168 Updated CHANGELOGS & MD docs 2021-05-27 22:22:09 +00:00
mzhu25
5c68fc24d2 Miscellaneous Liquidity Provider changes (#253)
* Update KNC address and reenable PLP

* Enable PLP VIP on BSC
2021-05-25 14:01:07 -07:00
mzhu25
548800e0a9 Add proposal 0 params and mainnet fork test (#252) 2021-05-25 13:48:34 -07:00
11 changed files with 235 additions and 21 deletions

View File

@@ -1,6 +1,6 @@
{
"name": "@0x/contracts-integrations",
"version": "2.7.46",
"version": "2.7.47",
"private": true,
"engines": {
"node": ">=6.12"
@@ -93,7 +93,7 @@
"typescript": "4.2.2"
},
"dependencies": {
"@0x/asset-swapper": "^6.16.0",
"@0x/asset-swapper": "^6.17.0",
"@0x/base-contract": "^6.4.0",
"@0x/contracts-asset-proxy": "^3.7.13",
"@0x/contracts-erc1155": "^2.1.31",

View File

@@ -1,4 +1,14 @@
[
{
"version": "1.2.0",
"changes": [
{
"note": "Added proposal 0 params and test",
"pr": 252
}
],
"timestamp": 1622154125
},
{
"timestamp": 1621944788,
"version": "1.1.8",

View File

@@ -5,6 +5,10 @@ Edit the package's CHANGELOG.json file only.
CHANGELOG
## v1.2.0 - _May 27, 2021_
* Added proposal 0 params and test (#252)
## v1.1.8 - _May 25, 2021_
* Dependencies updated

View File

@@ -1,6 +1,6 @@
{
"name": "@0x/contracts-treasury",
"version": "1.1.8",
"version": "1.2.0",
"engines": {
"node": ">=6.12"
},

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,154 @@
import { artifacts as erc20Artifacts, ERC20TokenEvents } from '@0x/contracts-erc20';
import { StakingContract, StakingProxyContract } from '@0x/contracts-staking';
import { blockchainTests, constants, verifyEventsFromLogs } from '@0x/contracts-test-utils';
import { BigNumber, hexUtils, logUtils } from '@0x/utils';
import * as _ from 'lodash';
import { proposals } from '../src/proposals';
import { artifacts } from './artifacts';
import { ZrxTreasuryContract, ZrxTreasuryEvents } from './wrappers';
const SUBGRAPH_URL = 'https://api.thegraph.com/subgraphs/name/mzhu25/zeroex-staking';
const STAKING_PROXY_ADDRESS = '0xa26e80e7dea86279c6d778d702cc413e6cffa777';
const TREASURY_ADDRESS = '0x0bb1810061c2f5b2088054ee184e6c79e1591101';
const PROPOSER = process.env.PROPOSER || constants.NULL_ADDRESS;
const VOTER = '0xba4f44e774158408e2dc6c5cb65bc995f0a89180';
const VOTER_OPERATED_POOLS = ['0x0000000000000000000000000000000000000000000000000000000000000017'];
blockchainTests.configure({
fork: {
unlockedAccounts: [PROPOSER, VOTER],
},
});
async function querySubgraphAsync(operatorAddress: string): Promise<string[]> {
const query = `
{
stakingActor(id: "${operatorAddress}") {
operatedPools {
id
}
}
}
`;
const response = await fetch(SUBGRAPH_URL, {
method: 'POST',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({
query,
}),
});
const {
data: { stakingActor },
} = await response.json();
if (stakingActor) {
return stakingActor.operatedPools.map((pool: { id: string }) => hexUtils.leftPad(pool.id));
} else {
return [];
}
}
blockchainTests.fork.skip('Treasury proposal mainnet fork tests', env => {
let staking: StakingContract;
let stakingProxy: StakingProxyContract;
let treasury: ZrxTreasuryContract;
let votingPeriod: BigNumber;
async function fastForwardToNextEpochAsync(): Promise<void> {
const epochEndTime = await staking.getCurrentEpochEarliestEndTimeInSeconds().callAsync();
const lastBlockTime = await env.web3Wrapper.getBlockTimestampAsync('latest');
const dt = Math.max(0, epochEndTime.minus(lastBlockTime).toNumber());
await env.web3Wrapper.increaseTimeAsync(dt);
// mine next block
await env.web3Wrapper.mineBlockAsync();
const lastPoolId = new BigNumber(await staking.lastPoolId().callAsync(), 16);
const batchExecuteCalldata = [
...[...new Array(lastPoolId.toNumber())].map((_x, i) =>
staking.finalizePool(hexUtils.leftPad(i + 1)).getABIEncodedTransactionData(),
),
staking.endEpoch().getABIEncodedTransactionData(),
...[...new Array(lastPoolId.toNumber())].map((_x, i) =>
staking.finalizePool(hexUtils.leftPad(i + 1)).getABIEncodedTransactionData(),
),
...[...new Array(lastPoolId.toNumber())].map((_x, i) =>
staking.finalizePool(hexUtils.leftPad(i + 1)).getABIEncodedTransactionData(),
),
];
await stakingProxy.batchExecute(batchExecuteCalldata).awaitTransactionSuccessAsync();
}
before(async () => {
const abis = _.mapValues({ ...artifacts, ...erc20Artifacts }, v => v.compilerOutput.abi);
treasury = new ZrxTreasuryContract(TREASURY_ADDRESS, env.provider, env.txDefaults, abis);
votingPeriod = await treasury.votingPeriod().callAsync();
staking = new StakingContract(STAKING_PROXY_ADDRESS, env.provider, env.txDefaults);
stakingProxy = new StakingProxyContract(STAKING_PROXY_ADDRESS, env.provider, env.txDefaults);
});
describe('Proposal 0', () => {
it('works', async () => {
const proposal = proposals[0];
let executionEpoch: BigNumber;
if (proposal.executionEpoch) {
executionEpoch = proposal.executionEpoch;
} else {
const currentEpoch = await staking.currentEpoch().callAsync();
executionEpoch = currentEpoch.plus(2);
}
const pools = await querySubgraphAsync(PROPOSER);
const proposeTx = treasury.propose(proposal.actions, executionEpoch, proposal.description, pools);
const calldata = proposeTx.getABIEncodedTransactionData();
logUtils.log('ZrxTreasury.propose calldata:');
logUtils.log(calldata);
const proposalId = await proposeTx.callAsync({ from: PROPOSER });
const receipt = await proposeTx.awaitTransactionSuccessAsync({ from: PROPOSER });
verifyEventsFromLogs(
receipt.logs,
[
{
...proposal,
proposalId,
executionEpoch,
proposer: PROPOSER,
operatedPoolIds: pools,
},
],
ZrxTreasuryEvents.ProposalCreated,
);
await fastForwardToNextEpochAsync();
await fastForwardToNextEpochAsync();
await treasury
.castVote(proposalId, true, VOTER_OPERATED_POOLS)
.awaitTransactionSuccessAsync({ from: VOTER });
await env.web3Wrapper.increaseTimeAsync(votingPeriod.plus(1).toNumber());
await env.web3Wrapper.mineBlockAsync();
const executeTx = await treasury.execute(proposalId, proposal.actions).awaitTransactionSuccessAsync();
verifyEventsFromLogs(
executeTx.logs,
[
{
proposalId,
},
],
ZrxTreasuryEvents.ProposalExecuted,
);
const recipient = '0xf9347f751a6a1467abc722ec7d80ba2698dd9d6c';
verifyEventsFromLogs(
executeTx.logs,
[
{
_from: TREASURY_ADDRESS,
_to: recipient,
_value: new BigNumber(400_000).times('1e18'),
},
],
ERC20TokenEvents.Transfer,
);
});
});
});

View File

@@ -1,4 +1,14 @@
[
{
"version": "6.17.0",
"changes": [
{
"note": "Re-enable liquidity provider and update KNC address",
"pr": 253
}
],
"timestamp": 1622154125
},
{
"version": "6.16.0",
"changes": [

View File

@@ -5,6 +5,10 @@ Edit the package's CHANGELOG.json file only.
CHANGELOG
## v6.17.0 - _May 27, 2021_
* Re-enable liquidity provider and update KNC address (#253)
## v6.16.0 - _May 25, 2021_
* Add support for the Polygon chain (#240)

View File

@@ -1,6 +1,6 @@
{
"name": "@0x/asset-swapper",
"version": "6.16.0",
"version": "6.17.0",
"engines": {
"node": ">=6.12"
},

View File

@@ -226,7 +226,7 @@ export class ExchangeProxySwapQuoteConsumer implements SwapQuoteConsumerBase {
}
if (
this.chainId === ChainId.Mainnet &&
[ChainId.Mainnet, ChainId.BSC].includes(this.chainId) &&
isDirectSwapCompatible(quote, optsWithDefaults, [ERC20BridgeSource.LiquidityProvider])
) {
const fillData = (slippedOrders[0] as OptimizedMarketBridgeOrder<LiquidityProviderFillData>).fillData;

View File

@@ -310,7 +310,7 @@ export const MAINNET_TOKENS = {
stETH: '0xae7ab96520de3a18e5e111b5eaab095312d7fe84',
LINK: '0x514910771af9ca656af840dff83e8264ecf986ca',
MANA: '0x0f5d2fb29fb7d3cfee444a200298f468908cc942',
KNC: '0xdd974d5c2e2928dea5f71b9825b8b646686bd200',
KNC: '0xdefa4e8a7bcba345f687a2f1456f5edd9ce97202',
AAVE: '0x7fc66500c84a76ad7e9c93437bfc5ac33e2ddae9',
sLINK: '0xbbc455cb4f1b9e4bfc4b73970d360c8f032efee6',
yUSD: '0x5dbcf33d8c2e976c6b560249878e6f1491bca25c',
@@ -915,21 +915,18 @@ export const LIQUIDITY_PROVIDER_REGISTRY_BY_CHAIN_ID = valueByChainId<LiquidityP
[ChainId.Mainnet]: {
['0x1d0d407c5af8c86f0a6494de86e56ae21e46a951']: {
tokens: [
// Disabled temporarily as the swap function requires
// gas price to be provided. Making it difficult to get
// a gas estimate
// MAINNET_TOKENS.WETH,
// MAINNET_TOKENS.USDC,
// MAINNET_TOKENS.USDT,
// MAINNET_TOKENS.WBTC,
// MAINNET_TOKENS.PAX,
// MAINNET_TOKENS.LINK,
// MAINNET_TOKENS.KNC,
// MAINNET_TOKENS.MANA,
// MAINNET_TOKENS.DAI,
// MAINNET_TOKENS.BUSD,
// MAINNET_TOKENS.AAVE,
// MAINNET_TOKENS.HT,
MAINNET_TOKENS.WETH,
MAINNET_TOKENS.USDC,
MAINNET_TOKENS.USDT,
MAINNET_TOKENS.WBTC,
MAINNET_TOKENS.PAX,
MAINNET_TOKENS.LINK,
MAINNET_TOKENS.KNC,
MAINNET_TOKENS.MANA,
MAINNET_TOKENS.DAI,
MAINNET_TOKENS.BUSD,
MAINNET_TOKENS.AAVE,
MAINNET_TOKENS.HT,
],
gasCost: (takerToken: string, makerToken: string) =>
[takerToken, makerToken].includes(MAINNET_TOKENS.WETH) ? 160e3 : 280e3,