Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Staging -> Master #179

Merged
merged 28 commits into from
Oct 21, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
8e8f5af
Bump word-wrap from 1.2.3 to 1.2.4
dependabot[bot] Jul 20, 2023
329640d
Merge pull request #158 from makerdao/dependabot/npm_and_yarn/word-wr…
adamgoth Apr 25, 2024
01067af
Add sepolia contract, starting block
adamgoth Apr 25, 2024
b5c4db2
Merge pull request #168 from makerdao/update-arb-sepolia
adamgoth Apr 25, 2024
0d9922b
new sepolia contract
tyler17 May 10, 2024
b25306d
Merge pull request #169 from makerdao/new-sepolia-contract
adamgoth May 10, 2024
8bee7d3
replace multi_goerli with multi_tenderly
tyler17 May 10, 2024
a457acb
Merge pull request #170 from makerdao/multi_tenderly
tyler17 May 13, 2024
b2e68d3
delete goerli and kovan config & references
tyler17 Sep 24, 2024
4ba2e10
Add second transformer
tyler17 Sep 24, 2024
f0d49a5
arbitrum transformer - handle case where one address has v1 and v2 de…
tyler17 Sep 25, 2024
af9e897
handle usr in CreateVoteDelegate event
tyler17 Sep 25, 2024
c6a6689
require USE_TENDERLY_CONFIG=true
tyler17 Sep 25, 2024
c1200dd
delete USE_TENDERLY_CONFIG
tyler17 Sep 26, 2024
cdd3111
add version to delegates query, change name to delegate_version
tyler17 Sep 30, 2024
b20a374
fix transformer
tyler17 Sep 30, 2024
ae6906c
update arbitrum sepolia polling address
tyler17 Sep 30, 2024
4f677cc
Merge pull request #173 from makerdao/version-query
adamgoth Oct 1, 2024
b749d75
Merge pull request #174 from makerdao/new-address
tyler17 Oct 1, 2024
0fcf3f3
Merge pull request #172 from makerdao/v2-delegates
tyler17 Oct 1, 2024
3b12093
update v2 factory address
tyler17 Oct 2, 2024
0e5cd76
Merge pull request #175 from makerdao/new-factory
tyler17 Oct 2, 2024
fa9daf2
add delegateVersion to allDelegates query in whitelist
tyler17 Oct 3, 2024
741d7d6
Merge pull request #176 from makerdao/update-whitelist
tyler17 Oct 3, 2024
ba565d1
update allDelegates query to include version
tyler17 Oct 3, 2024
b746e7c
Merge pull request #177 from makerdao/update-all-delegates
tyler17 Oct 3, 2024
382d342
add mainnet v2 delegate factory contract
tyler17 Oct 17, 2024
872955e
Merge pull request #178 from makerdao/mainnet-v2-delegate-factory
tyler17 Oct 18, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
84 changes: 14 additions & 70 deletions config.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ const voteProxyFactoryTransformer = require('./transformers/VoteProxyFactoryTran
const esmTransformer = require('./transformers/EsmTransformer');
const esmV2Transformer = require('./transformers/EsmV2Transformer');
const voteDelegateFactoryTransformer = require('./transformers/VoteDelegateFactoryTransformer');
const v2VoteDelegateFactoryTransformer = require('./transformers/V2VoteDelegateFactoryTransformer');

//mainnet
const MKR_ADDRESS = '0x9f8f72aa9304c8b593d555f12ef6589cc3a579a2';
Expand All @@ -28,80 +29,21 @@ const VOTE_PROXY_FACTORY_12_ADDRESS =
'0x6FCD258af181B3221073A96dD90D1f7AE7eEc408';
const VOTE_DELEGATE_FACTORY_ADDRESS =
'0xD897F108670903D1d6070fcf818f9db3615AF272';

//goerli
// note: there is no v1 of DSCHIEF or VOTE_PROXY_FACTORY deployed to goerli, only the newer versions
const MKR_GOERLI_ADDRESS = '0xc5E4eaB513A7CD12b2335e8a0D57273e13D499f7';
const BATCH_VOTING_CONTRACT_GOERLI_ADDRESS =
'0xdbE5d00b2D8C13a77Fb03Ee50C87317dbC1B15fb';
const ESM_ADDRESS_GOERLI = '0x105BF37e7D81917b6fEACd6171335B4838e53D5e';
const ESM_V2_ADDRESS_GOERLI = '0x023A960cb9BE7eDE35B433256f4AfE9013334b55';
const DSCHIEF_12_GOERLI_ADDRESS = '0x33Ed584fc655b08b2bca45E1C5b5f07c98053bC1';
const VOTE_PROXY_FACTORY_12_GOERLI_ADDRESS =
'0x1a7c1ee5eE2A3B67778ff1eA8c719A3fA1b02b6f';
const VOTE_DELEGATE_FACTORY_GOERLI_ADDRESS =
'0xE2d249AE3c156b132C40D07bd4d34e73c1712947';
const V2_VOTE_DELEGATE_FACTORY_ADDRESS =
process.env.VL_CONFIG_NAME === 'multi_tenderly'
? '0x093d305366218d6d09ba10448922f10814b031dd'
: '0xC3D809E87A2C9da4F6d98fECea9135d834d6F5A0';

//Arbitrum mainnet
const ARB_POLLING_ADDRESS = '0x4f4e551b4920a5417F8d4e7f8f099660dAdadcEC';

// arbitrum testnet
// arbitrum testnet (sepolia)
const ARB_TESTNET_POLLING_ADDRESS =
'0x4d196378e636D22766d6A9C6C6f4F32AD3ECB050';
'0xE63329692fA90B3efd5eB675c601abeDB2DF715a';

const CHAIN_HOST_L1 = process.env.VL_CHAIN_HOST;
const CHAIN_HOST_L2 = process.env.VL_CHAIN_HOST_L2;

const goerli = {
name: 'goerli',
processorSchema: 'vulcan2x',
extractedSchema: 'extracted',
chain: {
name: 'goerli',
host: CHAIN_HOST_L1,
retries: 15,
},
startingBlock: 5273000,
extractors: [
...makeRawLogExtractors([
BATCH_VOTING_CONTRACT_GOERLI_ADDRESS,
MKR_GOERLI_ADDRESS,
ESM_ADDRESS_GOERLI,
ESM_V2_ADDRESS_GOERLI,
DSCHIEF_12_GOERLI_ADDRESS,
VOTE_PROXY_FACTORY_12_GOERLI_ADDRESS,
VOTE_DELEGATE_FACTORY_GOERLI_ADDRESS,
]),
],
transformers: [
pollingTransformer(BATCH_VOTING_CONTRACT_GOERLI_ADDRESS),
mkrTransformer(MKR_GOERLI_ADDRESS),
mkrBalanceTransformer(MKR_GOERLI_ADDRESS),
esmTransformer(ESM_ADDRESS_GOERLI),
esmV2Transformer(ESM_V2_ADDRESS_GOERLI),
dsChiefTransformer(DSCHIEF_12_GOERLI_ADDRESS, '_v1.2'),
chiefBalanceTransformer(DSCHIEF_12_GOERLI_ADDRESS, '_v1.2'),
voteProxyFactoryTransformer(VOTE_PROXY_FACTORY_12_GOERLI_ADDRESS, '_v1.2'),
voteDelegateFactoryTransformer(VOTE_DELEGATE_FACTORY_GOERLI_ADDRESS),
],
migrations: {
mkr: './migrations',
},
api: {
whitelisting: {
enabled: true,
whitelistedQueriesDir: './queries',
bypassSecret: process.env.BYPASS_SECRET,
},
responseCaching: {
enabled: false,
duration: '15 seconds',
},
},
onStart: (services) =>
console.log(`Starting with these services: ${Object.keys(services)}`),
};

const mainnet = {
name: 'mainnet',
processorSchema: 'vulcan2x',
Expand All @@ -124,6 +66,7 @@ const mainnet = {
ESM_ADDRESS,
ESM_V2_ADDRESS,
VOTE_DELEGATE_FACTORY_ADDRESS,
V2_VOTE_DELEGATE_FACTORY_ADDRESS,
]),
],
transformers: [
Expand All @@ -140,6 +83,7 @@ const mainnet = {
esmTransformer(ESM_ADDRESS),
esmV2Transformer(ESM_V2_ADDRESS),
voteDelegateFactoryTransformer(VOTE_DELEGATE_FACTORY_ADDRESS),
v2VoteDelegateFactoryTransformer(V2_VOTE_DELEGATE_FACTORY_ADDRESS),
],
migrations: {
mkr: './migrations',
Expand All @@ -157,7 +101,7 @@ const mainnet = {
},
onStart: (services) =>
console.log(
`Starting Mainnet config with these services: ${Object.keys(services)}`
`Starting Mainnet config with these services: ${Object.keys(services)}`,
),
};

Expand Down Expand Up @@ -202,7 +146,7 @@ const arbitrumTestnet = {
host: CHAIN_HOST_L2,
retries: 15,
},
startingBlock: 154800,
startingBlock: 37261050,
extractors: [...makeRawLogExtractors([ARB_TESTNET_POLLING_ADDRESS])],
transformers: [arbitrumPollingTransformer(ARB_TESTNET_POLLING_ADDRESS)],
migrations: {
Expand All @@ -227,9 +171,9 @@ let config;
if (process.env.VL_CONFIG_NAME === 'multi') {
console.log('Using Mainnet multi-chain config');
config = [mainnet, arbitrum];
} else if (process.env.VL_CONFIG_NAME === 'multi_goerli') {
console.log('Using Goerli multi-chain config');
config = [goerli, arbitrumTestnet];
} else if (process.env.VL_CONFIG_NAME === 'multi_tenderly') {
console.log('Using Tenderly multi-chain config');
config = [mainnet, arbitrumTestnet];
}

module.exports.default = config;
3 changes: 3 additions & 0 deletions migrations/074-delegate-version-row.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
-- Add optional version column as a number to dschief.vote_delegate_created_event table
ALTER TABLE dschief.vote_delegate_created_event
ADD COLUMN delegate_version INTEGER NULL;
102 changes: 102 additions & 0 deletions migrations/075-add-delegate-version.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
-- Dropping function as the return type changed
drop function if exists api.delegates;

drop type delegate_entry;

create type delegate_entry as (
delegate character varying(66),
vote_delegate character varying(66),
creation_date timestamp with time zone,
expiration_date timestamp with time zone,
expired boolean,
last_voted timestamp with time zone,
delegator_count int,
total_mkr numeric(78,18),
delegate_version int
);

-- Same function, but also return the delegate version
create or replace function api.delegates(_first int, order_by delegate_order_by_type default 'DATE', order_direction order_direction_type default 'DESC', include_expired boolean default false, seed double precision default random(), constitutional_delegates char[] default '{}')
returns setof delegate_entry as $$
declare
max_page_size_value int := (select api.max_page_size());
begin
if _first > max_page_size_value then
raise exception 'Parameter FIRST cannot be greater than %.', max_page_size_value;
elsif seed > 1 or seed < -1 then
raise exception 'Parameter SEED must have a value between -1 and 1';
else
return query
-- Merge poll votes from Mainnet and Arbitrum and attach the timestamp to them
with merged_vote_events as (
select voter, vote_timestamp
from (
select voter, timestamp as vote_timestamp
from polling.voted_event A
left join vulcan2x.block B
on A.block_id = B.id
) AB
union all
select voter, vote_timestamp
from (
select voter, timestamp as vote_timestamp
from polling.voted_event_arbitrum C
left join vulcan2xarbitrum.block D
on C.block_id = D.id
) CD
),
delegates_table as (
select E.delegate, E.vote_delegate, F.timestamp as creation_date, F.timestamp + '1 year' as expiration_date, now() > F.timestamp + '1 year' as expired, E.delegate_version
from dschief.vote_delegate_created_event E
left join vulcan2x.block F
on E.block_id = F.id
-- Filter out expired delegates if include_expired is false
where include_expired or now() < F.timestamp + '1 year'
),
-- Merge delegates with their last votes
delegates_with_last_vote as (
select G.*, max(H.vote_timestamp) as last_voted
from delegates_table G
left join merged_vote_events H
on G.vote_delegate = H.voter
group by G.vote_delegate, G.delegate, G.creation_date, G.expiration_date, G.expired, G.delegate_version
),
delegations_table as (
select contract_address, count(immediate_caller) as delegators, sum(delegations) as delegations
from (
select immediate_caller, sum(lock) as delegations, contract_address
from dschief.delegate_lock
group by contract_address, immediate_caller
) as I
where delegations > 0
group by contract_address
)
select delegate::character varying(66), vote_delegate::character varying(66), creation_date, expiration_date, expired, last_voted, coalesce(delegators, 0)::int as delegator_count, coalesce(delegations, 0)::numeric(78,18) as total_mkr, delegate_version
from (
-- We call setseed here to make sure it's executed before the main select statement and the order by random clause.
-- By appending it to the delegates_with_last_vote table and then removing the row with offset 1, we make sure the table remains unmodified.
select setseed(seed), null delegate, null vote_delegate, null creation_date, null expiration_date, null expired, null last_voted, null delegate_version
union all
select null, delegate, vote_delegate, creation_date, expiration_date, expired, last_voted, delegate_version from delegates_with_last_vote
offset 1
) sd
left join delegations_table
on sd.vote_delegate::character varying(66) = delegations_table.contract_address
order by
-- Ordering first by expiration: expired at the end, second by delegate type: constitutional delegates first
-- and third by the sorting criterion selected.
case when expired then 1 else 0 end,
case when vote_delegate = ANY (constitutional_delegates) then 0 else 1 end,
case
when order_by = 'DELEGATORS' then
case when order_direction = 'ASC' then coalesce(delegators, 0)::int else -coalesce(delegators, 0)::int end
when order_by = 'MKR' then
case when order_direction = 'ASC' then coalesce(delegations, 0)::numeric(78,18) else -coalesce(delegations, 0)::numeric(78,18) end
when order_by = 'DATE' then
case when order_direction = 'ASC' then extract(epoch from creation_date) else -extract(epoch from creation_date) end
else
random()
end;
end if;
end;
$$ language plpgsql stable strict;
28 changes: 28 additions & 0 deletions migrations/076-new-all-delegates.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
-- Drop existing functions
DROP FUNCTION IF EXISTS dschief.all_delegates();
DROP FUNCTION IF EXISTS api.all_delegates();

CREATE OR REPLACE FUNCTION dschief.all_delegates()
RETURNS TABLE (
delegate character varying(66),
vote_delegate character varying(66),
delegate_version int
) AS $$
SELECT delegate, vote_delegate, delegate_version
FROM dschief.vote_delegate_created_event
$$ LANGUAGE sql STABLE STRICT;


--This query would be called by allDelegates() in the sdk
CREATE OR REPLACE FUNCTION api.all_delegates()
RETURNS TABLE (
delegate character varying(66),
vote_delegate character varying(66),
delegate_version int,
block_timestamp TIMESTAMP WITH TIME ZONE
) AS $$
SELECT delegate, vote_delegate, delegate_version, b.timestamp
FROM dschief.vote_delegate_created_event d
LEFT JOIN vulcan2x.block b
ON d.block_id = b.id;
$$ LANGUAGE sql STABLE STRICT;
1 change: 1 addition & 0 deletions queries/allDelegates.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ query allDelegates {
delegate
voteDelegate
blockTimestamp
delegateVersion
}
}
}
1 change: 1 addition & 0 deletions queries/delegates.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ query delegates(
lastVoted
delegatorCount
totalMkr
delegateVersion
}
}
}
4 changes: 3 additions & 1 deletion transformers/ArbitrumPollingTransformer.js
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,9 @@ const handlers = {
const vdQuery = `SELECT ce.vote_delegate as voter, (SELECT now() >= b.timestamp + interval '1 year') as expired
FROM dschief.vote_delegate_created_event ce
JOIN vulcan2x.block b ON b.id = ce.block_id
WHERE ce.delegate = $1`;
WHERE ce.delegate = $1
ORDER BY ce.delegate_version DESC
LIMIT 1`; //get latest version if there are multiple

const row = await services.db.oneOrNone(vdQuery, [voter]);

Expand Down
22 changes: 3 additions & 19 deletions transformers/PollingTransformer.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,18 +19,12 @@ const authorizedCreators = process.env.AUTHORIZED_CREATORS
: [];

// TODO
module.exports.VOTING_CONTRACT_GOERLI_ADDRESS =
'0xdbE5d00b2D8C13a77Fb03Ee50C87317dbC1B15fb';
module.exports.VOTING_CONTRACT_KOVAN_ADDRESS =
'0x518a0702701BF98b5242E73b2368ae07562BEEA3';
module.exports.VOTING_CONTRACT_ADDRESS =
'0xF9be8F0945acDdeeDaA64DFCA5Fe9629D0CF8E5D';

module.exports.default = (address) => ({
name:
address === module.exports.VOTING_CONTRACT_ADDRESS ||
address === module.exports.VOTING_CONTRACT_KOVAN_ADDRESS ||
address === module.exports.VOTING_CONTRACT_GOERLI_ADDRESS
address === module.exports.VOTING_CONTRACT_ADDRESS
? `Polling_Transformer`
: `Polling_Transformer_${address}`,
dependencies: [getExtractorName(address)],
Expand All @@ -43,12 +37,7 @@ const handlers = {
async PollCreated(services, info) {
if (
info.event.address.toLowerCase() !==
module.exports.VOTING_CONTRACT_KOVAN_ADDRESS.toLowerCase() &&
info.event.address.toLowerCase() !==
module.exports.VOTING_CONTRACT_ADDRESS.toLowerCase() &&
// goerli uses batch polling contract for creating polls
info.event.address.toLowerCase() !==
module.exports.VOTING_CONTRACT_GOERLI_ADDRESS.toLowerCase()
module.exports.VOTING_CONTRACT_ADDRESS.toLowerCase()
) {
logger.info(
`Ignoring PollCreated event because ${info.event.address} is not the primary voting contract`
Expand Down Expand Up @@ -100,12 +89,7 @@ const handlers = {
async PollWithdrawn(services, info) {
if (
info.event.address.toLowerCase() !==
module.exports.VOTING_CONTRACT_KOVAN_ADDRESS.toLowerCase() &&
info.event.address.toLowerCase() !==
module.exports.VOTING_CONTRACT_ADDRESS.toLowerCase() &&
// goerli uses batch polling contract for withdrawing polls
info.event.address.toLowerCase() !==
module.exports.VOTING_CONTRACT_GOERLI_ADDRESS.toLowerCase()
module.exports.VOTING_CONTRACT_ADDRESS.toLowerCase()
) {
logger.info(
`Ignoring PollWithdrawn event because ${info.event.address} is not the primary voting contract`
Expand Down
37 changes: 37 additions & 0 deletions transformers/V2VoteDelegateFactoryTransformer.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
const {
getExtractorName,
} = require('@makerdao-dux/spock-utils/dist/extractors/rawEventDataExtractor');

const {
handleEvents,
} = require('@makerdao-dux/spock-utils/dist/transformers/common');

// @ts-ignore
const abi = require('../abis/vote_delegate_factory.json');

module.exports = (voteDelegateFactoryAddress, nameSuffix = '') => ({
name: `V2_vote_delegate_factory_transformer${nameSuffix}`,
dependencies: [getExtractorName(voteDelegateFactoryAddress)],
transform: async (services, logs) => {
await handleEvents(services, abi, logs[0], handlers);
},
});

const handlers = {
async CreateVoteDelegate(services, info) {
const sql = `INSERT INTO dschief.vote_delegate_created_event
(delegate, vote_delegate, log_index, tx_id, block_id, delegate_version)
VALUES(\${delegate}, \${vote_delegate}, \${log_index}, \${tx_id}, \${block_id}, \${delegate_version});`;

const delegate = info.event.params.usr || info.event.params.delegate; //TODO: why isn't it just usr?

await services.tx.none(sql, {
delegate: delegate.toLowerCase(),
vote_delegate: info.event.params.voteDelegate.toLowerCase(),
log_index: info.log.log_index,
tx_id: info.log.tx_id,
block_id: info.log.block_id,
delegate_version: 2,
});
},
};
Loading
Loading