Skip to content

Commit b65a4e7

Browse files
author
Andres Adjimann
committed
feat: new set of scripts that use relayer group
1 parent e10fdaa commit b65a4e7

File tree

10 files changed

+1906
-261
lines changed

10 files changed

+1906
-261
lines changed

packages/deploy/package.json

+5
Original file line numberDiff line numberDiff line change
@@ -53,12 +53,16 @@
5353
},
5454
"devDependencies": {
5555
"@ethersproject/abi": "^5.7.0",
56+
"@ethersproject/abstract-signer": "^5.8.0",
5657
"@ethersproject/bignumber": "^5.7.0",
58+
"@ethersproject/hash": "^5.8.0",
5759
"@ethersproject/providers": "^5.7.2",
5860
"@nomicfoundation/hardhat-chai-matchers": "^2.0.3",
5961
"@nomicfoundation/hardhat-ethers": "^3.0.5",
6062
"@nomicfoundation/hardhat-network-helpers": "^1.0.8",
6163
"@nomicfoundation/hardhat-verify": "^2.0.0",
64+
"@openzeppelin/defender-sdk": "^2.5.0",
65+
"@openzeppelin/defender-sdk-relay-signer-client": "^2.5.0",
6266
"@openzeppelin/hardhat-upgrades": "^2.5.0",
6367
"@openzeppelin/upgrades-core": "^1.32.3",
6468
"@typechain/ethers-v5": "^11.0.0",
@@ -73,6 +77,7 @@
7377
"chai": "^4.3.7",
7478
"child_process": "^1.0.2",
7579
"cross-env": "^7.0.3",
80+
"csv-parser": "^3.2.0",
7681
"dotenv": "^16.4.5",
7782
"dotenv-cli": "^7.2.1",
7883
"eslint": "^8.43.0",
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
chunks
2+
done_chunks
3+
enabled_claims_denied_users.csv
4+
txs_data.json
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# How to run the transactions.
2+
3+
- Save the list in `enabled_claims_denied_users.csv` must have the column: `blockchainclaimid`
4+
- Run `yarn ts-node scripts/claimRevoke/split.ts`
5+
- Run `yarn hardhat run --network <NETWORK> scripts/claimRevoke/claimRevoke.ts`
6+
7+
This script needs the `RELAYER_API_KEY` and `RELAYER_API_SECRET` `.env` vars
8+
9+
# Verification
10+
11+
- Run `yarn ts-node scripts/claimRevoke/saveTxs.ts` to get the txs from defender
12+
13+
This script needs the `RELAYER_API_KEY` and `RELAYER_API_SECRET` `.env` vars
14+
- Run `yarn hardhat run --network <NETWORK> scripts/claimRevoke/parseTxs.ts` to verify, expect an empty array as
15+
response

packages/deploy/scripts/claimRevoke/check.ts

-62
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -1,76 +1,86 @@
11
/**
22
* How to use:
3+
* create the chunks and done_chunks directories
4+
* call split to split the chunks
35
* - yarn hardhat run --network <NETWORK> scripts/claimRevoke/claimRevoke.ts
46
* This script always use: ./enabled_claims_denied_users.csv
57
* This script needs: RELAYER_API_KEY and RELAYER_API_SECRET
68
*/
7-
import {ethers} from 'hardhat';
8-
import csv from 'csv-parser';
9-
import * as fs from 'fs';
9+
import {RelayerGroupStatus} from '@openzeppelin/defender-sdk-relay-signer-client';
10+
import {configDotenv} from 'dotenv';
11+
import {Defender} from '@openzeppelin/defender-sdk';
1012
import {
1113
DefenderRelayProvider,
1214
DefenderRelaySigner,
1315
} from '@openzeppelin/defender-sdk-relay-signer-client/lib/ethers';
14-
import * as path from 'path';
16+
import {ApiRelayerParams} from '@openzeppelin/defender-sdk-relay-signer-client/lib/models/relayer';
17+
// @ts-ignore
18+
import {deployments, ethers} from 'hardhat';
19+
import * as fs from 'node:fs';
20+
// @ts-ignore
21+
import path from 'path';
1522

16-
const CHUNK_SIZE = 1000;
23+
async function getChunks() {
24+
const regexp = /^chunk_([0-9]+)\.json$/g;
25+
const files = fs.readdirSync(path.join(__dirname, 'chunks'));
26+
return files
27+
.map((x) => Array.from(x.matchAll(regexp)))
28+
.filter((x) => x.length > 0)
29+
.map((x) => x[0][1]);
30+
}
1731

18-
async function main(filename: string) {
19-
if (
20-
!process.env.RELAYER_API_KEY ||
21-
!process.env.RELAYER_API_SECRET ||
22-
!process.env.RELAYER_ADDRESS
23-
) {
24-
throw new Error(
25-
'Missing env vars RELAYER_API_KEY, RELAYER_API_SECRET and RELAYER_ADDRESS'
26-
);
32+
async function main() {
33+
configDotenv();
34+
if (!process.env.RELAYER_API_KEY || !process.env.RELAYER_API_SECRET) {
35+
throw new Error('Missing env vars RELAYER_API_KEY, RELAYER_API_SECRET');
2736
}
37+
console.log('using ethers version ', ethers.version);
38+
const chunks = await getChunks();
39+
40+
const defender = new Defender({
41+
relayerApiKey: process.env.RELAYER_API_KEY,
42+
relayerApiSecret: process.env.RELAYER_API_SECRET,
43+
});
44+
const relayerStatus =
45+
(await defender.relaySigner.getRelayerStatus()) as RelayerGroupStatus;
46+
const rAddresses = relayerStatus.relayers.map((x) => x.address);
47+
console.log('relayer addresses', rAddresses);
2848

29-
const ids: BitInt[] = ([] = await new Promise((resolve) => {
30-
const ret: {user_id: string; claim_id: string}[] = [];
31-
fs.createReadStream(filename)
32-
.pipe(csv())
33-
.on('data', (data) => {
34-
ret.push(BigInt(data.claim_id));
35-
})
36-
.on('end', () => {
37-
resolve(ret);
38-
});
39-
}));
40-
const chunks = [];
41-
for (let i = 0; i < ids.length; i += CHUNK_SIZE) {
42-
chunks.push(ids.slice(i, i + CHUNK_SIZE));
43-
}
4449
const credentials = {
4550
apiKey: process.env.RELAYER_API_KEY,
4651
apiSecret: process.env.RELAYER_API_SECRET,
47-
authConfig: undefined,
48-
};
52+
} as ApiRelayerParams;
4953
const provider = new DefenderRelayProvider(credentials);
50-
const signer = new DefenderRelaySigner(
51-
credentials,
52-
provider,
53-
process.env.RELAYER_ADDRESS,
54-
{speed: 'fast', ethersVersion: 'v6'}
55-
);
56-
const signedMultiGiveaway = await ethers.getContract(
57-
'SignedMultiGiveaway',
58-
signer
54+
const signedMultiGiveaway = await deployments.get('SignedMultiGiveaway');
55+
console.log('signedMultiGiveaway.address', signedMultiGiveaway.address);
56+
57+
await Promise.allSettled(
58+
rAddresses.map(async (rAddress, rIdx) => {
59+
const signer = new DefenderRelaySigner(credentials, provider, rAddress, {
60+
speed: 'fast',
61+
ethersVersion: 'v6',
62+
});
63+
const contract = await ethers.getContract('SignedMultiGiveaway', signer);
64+
while (chunks.length > 0) {
65+
const idx = chunks.shift();
66+
67+
const fileName = `chunk_${idx}.json`;
68+
const src = path.join(__dirname, 'chunks', fileName);
69+
const chunk = JSON.parse(fs.readFileSync(src, 'utf-8'));
70+
console.log(
71+
`sending tx for chunk ${idx}, chunk len ${chunk.length}, using contract ${rIdx}`
72+
);
73+
const tx = await contract.revokeClaims(chunk);
74+
const receipt = await tx.wait();
75+
console.log('contract', rIdx, receipt.blockNumber, receipt.hash);
76+
fs.renameSync(src, path.join(__dirname, 'done_chunks', fileName));
77+
// const status =
78+
// (await defender.relaySigner.getRelayerStatus()) as RelayerGroupStatus;
79+
// const myStatus = status.relayers.filter((x) => x.address == rAddress);
80+
// console.log(rIdx, myStatus);
81+
}
82+
})
5983
);
60-
for (const [i, c] of chunks.entries()) {
61-
// if (i > 1) {
62-
// console.log(`skip tx for chunk ${i} of ${chunks.length}`);
63-
// continue;
64-
// }
65-
console.log(
66-
`sending tx for chunk ${i} of ${chunks.length}, len ${c.length}`
67-
);
68-
const tx = await signedMultiGiveaway.revokeClaims(c);
69-
const receipt = await tx.wait();
70-
console.log(receipt);
71-
}
7284
}
7385

74-
main(path.join(__dirname, 'enabled_claims_denied_users.csv')).catch((err) =>
75-
console.error(err)
76-
);
86+
main().catch((err) => console.error(err));

packages/deploy/scripts/claimRevoke/event_data.csv

-7
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
/**
2+
* Get the transactions from the tx group
3+
* How to use:
4+
* - yarn hardhat run --network <NETWORK> scripts/claimRevoke/parseTxs.ts
5+
*/
6+
import * as fs from 'node:fs';
7+
// @ts-ignore
8+
import path from 'path';
9+
import {RelayerTransaction} from '@openzeppelin/defender-sdk-relay-signer-client/lib/models/transactions';
10+
// @ts-ignore
11+
import {deployments, ethers} from 'hardhat';
12+
// @ts-ignore
13+
import csv from 'csv-parser';
14+
15+
async function getIds(): Promise<bigint[]> {
16+
const filename = path.join(__dirname, 'enabled_claims_denied_users.csv');
17+
return await new Promise((resolve) => {
18+
const ret: bigint[] = [];
19+
fs.createReadStream(filename)
20+
.pipe(csv())
21+
.on('data', (data) => {
22+
ret.push(BigInt(data.blockchainclaimid));
23+
})
24+
.on('end', () => {
25+
resolve(ret);
26+
});
27+
});
28+
}
29+
30+
async function main() {
31+
const txs = JSON.parse(
32+
fs.readFileSync(path.join(__dirname, 'txs_data.json'), 'utf-8')
33+
) as RelayerTransaction[];
34+
console.log(
35+
txs.filter((x) => x.to != '0x3d49b60783dB5FA4341355f31e4D9CBa63E53035')
36+
);
37+
const ids = await getIds();
38+
const signedMultiGiveaway = await deployments.get('SignedMultiGiveaway');
39+
const iface = new ethers.Interface(signedMultiGiveaway.abi);
40+
const decodedIds = new Set<BigInt>();
41+
for (const t of txs) {
42+
const decoded = iface.decodeFunctionData('revokeClaims', t.data);
43+
decoded[0].forEach((x) => decodedIds.add(x));
44+
}
45+
const vals = Array.from(decodedIds.values());
46+
console.log(ids.length, vals.length);
47+
console.log(
48+
'diff',
49+
ids.filter((x) => !decodedIds.has(x))
50+
);
51+
}
52+
53+
main().catch((err) => console.error(err));
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
/**
2+
* Get the transactions from the tx group
3+
* How to use:
4+
* - yarn ts-node scripts/claimRevoke/saveTxs.ts
5+
*/
6+
import {configDotenv} from 'dotenv';
7+
import {Defender} from '@openzeppelin/defender-sdk';
8+
import {PaginatedTransactionResponse} from '@openzeppelin/defender-sdk-relay-signer-client/lib/models/transactions';
9+
import * as fs from 'node:fs';
10+
// @ts-ignore
11+
import path from 'path';
12+
13+
async function main() {
14+
configDotenv();
15+
if (!process.env.RELAYER_API_KEY || !process.env.RELAYER_API_SECRET) {
16+
throw new Error('Missing env vars RELAYER_API_KEY, RELAYER_API_SECRET');
17+
}
18+
const defender = new Defender({
19+
relayerApiKey: process.env.RELAYER_API_KEY,
20+
relayerApiSecret: process.env.RELAYER_API_SECRET,
21+
});
22+
const LIMIT = 30;
23+
const txs = [];
24+
let status = await defender.relaySigner.listTransactions({limit: LIMIT});
25+
for (let i = 0; ; i++) {
26+
const t = status as PaginatedTransactionResponse;
27+
console.log(i, t.items.length);
28+
txs.push(...t.items);
29+
if (!t.next) {
30+
console.log('done');
31+
break;
32+
}
33+
status = await defender.relaySigner.listTransactions({
34+
next: t.next,
35+
limit: LIMIT,
36+
});
37+
}
38+
console.log('TOTAL', txs.length);
39+
fs.writeFileSync(
40+
path.join(__dirname, 'txs_data.json'),
41+
JSON.stringify(txs, null, 4)
42+
);
43+
}
44+
45+
main().catch((err) => console.error(err));
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/**
2+
* How to use:
3+
* - yarn ts-node scripts/claimRevoke/split.ts
4+
*/
5+
// @ts-ignore
6+
import csv from 'csv-parser';
7+
import * as fs from 'fs';
8+
import * as path from 'path';
9+
10+
const CHUNK_SIZE = 1000;
11+
12+
async function main() {
13+
const filename = path.join(__dirname, 'enabled_claims_denied_users.csv');
14+
const ids: string[] = await new Promise((resolve) => {
15+
const ret: string[] = [];
16+
fs.createReadStream(filename)
17+
.pipe(csv())
18+
.on('data', (data) => {
19+
ret.push(BigInt(data.blockchainclaimid).toString());
20+
})
21+
.on('end', () => {
22+
resolve(ret);
23+
});
24+
});
25+
fs.mkdirSync(path.join(__dirname, 'chunks'));
26+
fs.mkdirSync(path.join(__dirname, 'done_chunks'));
27+
const chunks = [];
28+
let j = 0;
29+
for (let i = 0; i < ids.length; i += CHUNK_SIZE) {
30+
fs.writeFileSync(
31+
path.join(__dirname, 'chunks', `chunk_${j++}.json`),
32+
JSON.stringify(ids.slice(i, i + CHUNK_SIZE), null, 4)
33+
);
34+
}
35+
}
36+
37+
main().catch((err) => console.error(err));

0 commit comments

Comments
 (0)