From 90a7789ccda0eeab0b6444de0eeb5c4df791eb15 Mon Sep 17 00:00:00 2001 From: Guillermo Bescos Date: Fri, 26 Jan 2024 20:09:01 +0000 Subject: [PATCH 1/5] Add script --- package-lock.json | 98 +++++++++++++++++++++++++++++--- staking/.env.sample | 1 + staking/.gitignore | 1 + staking/app/ProfileConnection.ts | 10 +++- staking/app/StakeConnection.ts | 27 +++++++++ staking/package.json | 6 +- 6 files changed, 132 insertions(+), 11 deletions(-) create mode 100644 staking/.env.sample diff --git a/package-lock.json b/package-lock.json index 372ee89a..064b1d2e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -68,7 +68,8 @@ "node_modules/@adraffy/ens-normalize": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz", - "integrity": "sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==" + "integrity": "sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==", + "dev": true }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", @@ -5264,6 +5265,15 @@ "@octokit/openapi-types": "^18.0.0" } }, + "node_modules/@oneidentity/zstd-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@oneidentity/zstd-js/-/zstd-js-1.0.3.tgz", + "integrity": "sha512-Jm6sawqxLzBrjC4sg2BeXToa33yPzUmq20CKsehKY2++D/gHb/oSwVjNgT+RH4vys+r8FynrgcNzGwhZWMLzfQ==", + "dev": true, + "dependencies": { + "@types/emscripten": "^1.39.4" + } + }, "node_modules/@parcel/watcher": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.0.4.tgz", @@ -8469,6 +8479,12 @@ "@types/ms": "*" } }, + "node_modules/@types/emscripten": { + "version": "1.39.10", + "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.39.10.tgz", + "integrity": "sha512-TB/6hBkYQJxsZHSqyeuO1Jt0AB/bW6G7rHt9g7lML7SOF6lbgcHvw/Lr+69iqN0qxgXLhWKScAon73JNnptuDw==", + "dev": true + }, "node_modules/@types/glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", @@ -18632,6 +18648,12 @@ "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" }, + "node_modules/papaparse": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.4.1.tgz", + "integrity": "sha512-HipMsgJkZu8br23pW15uvo6sib6wne/4woLZPlFf3rpDyMe9ywEXUsuD7+6K9PRkJlVT51j/sCOYDKGGS3ZJrw==", + "dev": true + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -23989,7 +24011,6 @@ "@solana/spl-token": "^0.1.8", "@solana/web3.js": "^1.87.5", "encoding": "^0.1.13", - "ethers": "^6.10.0", "ts-node": "^10.7.0", "typescript": "^4.3.5" }, @@ -23998,12 +24019,17 @@ "@ledgerhq/hw-transport-node-hid": "^6.27.21", "@metaplex-foundation/js": "^0.17.5", "@metaplex-foundation/mpl-token-metadata": "^2.5.1", + "@oneidentity/zstd-js": "^1.0.3", "@types/bn.js": "^5.1.0", "@types/mocha": "^9.1.1", "@types/node": "^17.0.34", "@types/shelljs": "^0.8.11", + "axios": "^1.6.7", "chai": "^4.3.4", + "dotenv": "^16.4.1", + "ethers": "^6.10.0", "mocha": "^9.2.2", + "papaparse": "^5.4.1", "prettier": "^2.6.2", "shelljs": "^0.8.5", "ts-mocha": "^9.0.2", @@ -24030,7 +24056,8 @@ "staking/node_modules/aes-js": { "version": "4.0.0-beta.5", "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", - "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==" + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", + "dev": true }, "staking/node_modules/arg": { "version": "4.1.3", @@ -24060,10 +24087,23 @@ "node": ">=0.3.1" } }, + "staking/node_modules/dotenv": { + "version": "16.4.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.1.tgz", + "integrity": "sha512-CjA3y+Dr3FyFDOAMnxZEGtnW9KBR2M0JvvUtXNW+dYJL5ROWxP9DUHCwgFqpMk0OXCc0ljhaNTr2w/kutYIcHQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, "staking/node_modules/ethers": { "version": "6.10.0", "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.10.0.tgz", "integrity": "sha512-nMNwYHzs6V1FR3Y4cdfxSQmNgZsRj1RiTU25JwvnJLmyzw9z3SKxNc2XKDuiXXo/v9ds5Mp9m6HBabgYQQ26tA==", + "dev": true, "funding": [ { "type": "individual", @@ -24090,7 +24130,8 @@ "staking/node_modules/ethers/node_modules/@types/node": { "version": "18.15.13", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", - "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==" + "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==", + "dev": true }, "staking/node_modules/ts-node": { "version": "10.9.1", @@ -24136,7 +24177,8 @@ "staking/node_modules/tslib": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true }, "staking/node_modules/typescript": { "version": "4.9.5", @@ -24153,6 +24195,7 @@ "version": "8.5.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "dev": true, "engines": { "node": ">=10.0.0" }, @@ -24185,7 +24228,8 @@ "@adraffy/ens-normalize": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz", - "integrity": "sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==" + "integrity": "sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==", + "dev": true }, "@alloc/quick-lru": { "version": "5.2.0", @@ -27859,6 +27903,15 @@ "@octokit/openapi-types": "^18.0.0" } }, + "@oneidentity/zstd-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@oneidentity/zstd-js/-/zstd-js-1.0.3.tgz", + "integrity": "sha512-Jm6sawqxLzBrjC4sg2BeXToa33yPzUmq20CKsehKY2++D/gHb/oSwVjNgT+RH4vys+r8FynrgcNzGwhZWMLzfQ==", + "dev": true, + "requires": { + "@types/emscripten": "^1.39.4" + } + }, "@parcel/watcher": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.0.4.tgz", @@ -28020,6 +28073,7 @@ "@ledgerhq/hw-transport-node-hid": "^6.27.21", "@metaplex-foundation/js": "^0.17.5", "@metaplex-foundation/mpl-token-metadata": "^2.5.1", + "@oneidentity/zstd-js": "^1.0.3", "@pythnetwork/staking-wasm": "*", "@solana/spl-governance": "0.3.26", "@solana/spl-token": "^0.1.8", @@ -28028,10 +28082,13 @@ "@types/mocha": "^9.1.1", "@types/node": "^17.0.34", "@types/shelljs": "^0.8.11", + "axios": "^1.6.7", "chai": "^4.3.4", + "dotenv": "*", "encoding": "^0.1.13", "ethers": "^6.10.0", "mocha": "^9.2.2", + "papaparse": "^5.4.1", "prettier": "^2.6.2", "shelljs": "^0.8.5", "ts-mocha": "^9.0.2", @@ -28058,7 +28115,8 @@ "aes-js": { "version": "4.0.0-beta.5", "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", - "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==" + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", + "dev": true }, "arg": { "version": "4.1.3" @@ -28083,10 +28141,17 @@ "diff": { "version": "4.0.2" }, + "dotenv": { + "version": "16.4.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.1.tgz", + "integrity": "sha512-CjA3y+Dr3FyFDOAMnxZEGtnW9KBR2M0JvvUtXNW+dYJL5ROWxP9DUHCwgFqpMk0OXCc0ljhaNTr2w/kutYIcHQ==", + "dev": true + }, "ethers": { "version": "6.10.0", "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.10.0.tgz", "integrity": "sha512-nMNwYHzs6V1FR3Y4cdfxSQmNgZsRj1RiTU25JwvnJLmyzw9z3SKxNc2XKDuiXXo/v9ds5Mp9m6HBabgYQQ26tA==", + "dev": true, "requires": { "@adraffy/ens-normalize": "1.10.0", "@noble/curves": "1.2.0", @@ -28100,7 +28165,8 @@ "@types/node": { "version": "18.15.13", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", - "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==" + "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==", + "dev": true } } }, @@ -28125,7 +28191,8 @@ "tslib": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true }, "typescript": { "version": "4.9.5" @@ -28134,6 +28201,7 @@ "version": "8.5.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "dev": true, "requires": {} }, "yn": { @@ -30271,6 +30339,12 @@ "@types/ms": "*" } }, + "@types/emscripten": { + "version": "1.39.10", + "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.39.10.tgz", + "integrity": "sha512-TB/6hBkYQJxsZHSqyeuO1Jt0AB/bW6G7rHt9g7lML7SOF6lbgcHvw/Lr+69iqN0qxgXLhWKScAon73JNnptuDw==", + "dev": true + }, "@types/glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", @@ -38236,6 +38310,12 @@ "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" }, + "papaparse": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.4.1.tgz", + "integrity": "sha512-HipMsgJkZu8br23pW15uvo6sib6wne/4woLZPlFf3rpDyMe9ywEXUsuD7+6K9PRkJlVT51j/sCOYDKGGS3ZJrw==", + "dev": true + }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", diff --git a/staking/.env.sample b/staking/.env.sample new file mode 100644 index 00000000..b1e51543 --- /dev/null +++ b/staking/.env.sample @@ -0,0 +1 @@ +ENDPOINT="https://api.mainnet-beta.solana.com" diff --git a/staking/.gitignore b/staking/.gitignore index 77e7921c..741a6161 100644 --- a/staking/.gitignore +++ b/staking/.gitignore @@ -5,3 +5,4 @@ target **/*.rs.bk node_modules lib +.env diff --git a/staking/app/ProfileConnection.ts b/staking/app/ProfileConnection.ts index 8a39fae5..fbb019f6 100644 --- a/staking/app/ProfileConnection.ts +++ b/staking/app/ProfileConnection.ts @@ -68,6 +68,14 @@ export class ProfileConnection { .accounts({ identityAccount: identityAccountAddress }) .rpc(); } + + getIdentityFromProfileAccountData(accountData: Buffer): string { + const decoded = this.program.coder.accounts.decode( + "IdentityAccount", + Buffer.from(accountData) + ); + return getIdentityAsString(decoded.identity); + } } export function areDifferentProfiles( @@ -82,7 +90,7 @@ export function areDifferentProfiles( return false; } -function getIdentityAccountAddress( +export function getIdentityAccountAddress( user: PublicKey, ecosystem: Ecosystem ): PublicKey { diff --git a/staking/app/StakeConnection.ts b/staking/app/StakeConnection.ts index 0e28bfa1..4a7a84a1 100644 --- a/staking/app/StakeConnection.ts +++ b/staking/app/StakeConnection.ts @@ -1016,6 +1016,33 @@ export class StakeConnection { ); return receipt !== null; } + + public getStakerAndAmountFromPositionAccountData( + positionAccountData: Buffer + ): { owner: PublicKey; stakedAmount: BN } { + const positionAccountJs = new PositionAccountJs( + Buffer.from(positionAccountData), + IDL as Idl + ); + const positionAccountWasm = new wasm.WasmPositionData(positionAccountData); + + const time = new BN(Date.now() / 1000); + const currentEpoch = time.div(this.config.epochDuration); + const unlockingDuration = this.config.unlockingDuration; + const currentEpochBI = BigInt(currentEpoch.toString()); + + const lockedBalanceSummary = positionAccountWasm.getLockedBalanceSummary( + currentEpochBI, + unlockingDuration + ); + + return { + owner: positionAccountJs.owner, + stakedAmount: new BN(lockedBalanceSummary.locked.toString()).add( + new BN(lockedBalanceSummary.preunlocking.toString()) + ), + }; + } } export interface BalanceSummary { diff --git a/staking/package.json b/staking/package.json index dadc1f04..f7a987cc 100644 --- a/staking/package.json +++ b/staking/package.json @@ -18,7 +18,6 @@ "@solana/spl-token": "^0.1.8", "@solana/web3.js": "^1.87.5", "encoding": "^0.1.13", - "ethers": "^6.10.0", "ts-node": "^10.7.0", "typescript": "^4.3.5" }, @@ -27,12 +26,17 @@ "@ledgerhq/hw-transport-node-hid": "^6.27.21", "@metaplex-foundation/js": "^0.17.5", "@metaplex-foundation/mpl-token-metadata": "^2.5.1", + "@oneidentity/zstd-js": "^1.0.3", "@types/bn.js": "^5.1.0", "@types/mocha": "^9.1.1", "@types/node": "^17.0.34", "@types/shelljs": "^0.8.11", + "axios": "^1.6.7", "chai": "^4.3.4", + "dotenv": "^16.4.1", + "ethers": "^6.10.0", "mocha": "^9.2.2", + "papaparse": "^5.4.1", "prettier": "^2.6.2", "shelljs": "^0.8.5", "ts-mocha": "^9.0.2", From a763bdee2b5018e1040d549e1f7abd7311929a23 Mon Sep 17 00:00:00 2001 From: Guillermo Bescos Date: Fri, 26 Jan 2024 20:09:27 +0000 Subject: [PATCH 2/5] Go --- staking/app/scripts/snapshot.ts | 147 ++++++++++++++++++++++++++++++++ 1 file changed, 147 insertions(+) create mode 100644 staking/app/scripts/snapshot.ts diff --git a/staking/app/scripts/snapshot.ts b/staking/app/scripts/snapshot.ts new file mode 100644 index 00000000..69cea049 --- /dev/null +++ b/staking/app/scripts/snapshot.ts @@ -0,0 +1,147 @@ +import { Connection, Keypair, PublicKey } from "@solana/web3.js"; +import { StakeConnection } from "../StakeConnection"; +import { PROFILE_ADDRESS, STAKING_ADDRESS } from "../constants"; +import axios from "axios"; +import { bs58 } from "@coral-xyz/anchor/dist/cjs/utils/bytes"; +import { ZstdInit, ZstdStream } from "@oneidentity/zstd-js"; +import NodeWallet from "@coral-xyz/anchor/dist/cjs/nodewallet"; +import { + ProfileConnection, + getIdentityAccountAddress, +} from "../ProfileConnection"; +import * as fs from "fs"; +import Papa from "papaparse"; +import dotenv from "dotenv"; +dotenv.config(); + +const RPC_URL = process.env.ENDPOINT!; + +// The JSON payload is too big when using the @solana/web3.js getProgramAccounts +// We get around this by using the base64+ztsd encoding instead of base64 that @solana/web3.js uses +export async function getAllStakeAccounts( + url: string +): Promise> { + const response = await axios({ + method: "post", + url: url, + data: { + jsonrpc: "2.0", + id: 1, + method: "getProgramAccounts", + params: [ + STAKING_ADDRESS, + { + encoding: "base64+zstd", + filters: [ + { + memcmp: { + offset: 0, + bytes: bs58.encode(Buffer.from("55c3f14f7cc04f0b", "hex")), // Positions account discriminator + }, + }, + ], + }, + ], + }, + }); + + return response.data.result.map((x: any) => { + return { publicKey: x.pubkey, data: x.account.data[0] }; + }); +} + +export async function getAllProfileAccounts( + url: string +): Promise> { + const response = await axios({ + method: "post", + url: url, + data: { + jsonrpc: "2.0", + id: 1, + method: "getProgramAccounts", + params: [ + PROFILE_ADDRESS, + { + encoding: "base64+zstd", + filters: [ + { + memcmp: { + offset: 0, + bytes: bs58.encode(Buffer.from("c25ab5a0b6ce749e", "hex")), // Identity account discriminator + }, + }, + ], + }, + ], + }, + }); + + const mapping = response.data.result.reduce( + (obj: Record, x: any) => { + obj[x.pubkey] = x.account.data[0]; + return obj; + }, + {} as Record + ); + + return mapping; +} + +const connection = new Connection(RPC_URL); +const profileConnection = new ProfileConnection( + connection, + new NodeWallet(new Keypair()) +); + +async function main() { + await ZstdInit(); + + const stakeConnection = await StakeConnection.connect( + connection, + new NodeWallet(new Keypair()) + ); + const stakeAccounts = await getAllStakeAccounts(RPC_URL); + const profileAccounts = await getAllProfileAccounts(RPC_URL); + + const stakers: { owner: PublicKey; stakedAmount: string }[] = + stakeAccounts.map((x, index) => { + console.log("Processing staker :", index); + const buffer = Buffer.from(x.data, "base64"); + const accountData = ZstdStream.decompress(new Uint8Array(buffer)); + return stakeConnection.getStakerAndAmountFromPositionAccountData( + Buffer.from(accountData) + ); + }); + + const stakersWithProfile = stakers.map(({ owner, stakedAmount }, index) => { + console.log("Processing profile :", index); + const profileAddress = getIdentityAccountAddress(owner, "evm"); + let identity = ""; + if (profileAccounts[profileAddress.toString()]) { + const accountData = ZstdStream.decompress( + new Uint8Array( + Buffer.from(profileAccounts[profileAddress.toString()], "base64") + ) + ); + identity = profileConnection.getIdentityFromProfileAccountData( + Buffer.from(accountData) + ); + return { solana: owner, stakedAmount, evm: identity }; + } + return { solana: owner, stakedAmount, evm: "" }; + }); + + fs.writeFileSync( + "snapshot.json", + JSON.stringify(stakersWithProfile, null, 2), + "utf-8" + ); + fs.writeFileSync( + "snapshot.csv", + Papa.unparse(stakersWithProfile, { header: true, skipEmptyLines: true }), + "utf-8" + ); +} + +main(); From dd83cebdb74bf5e3ca848aa7637819674268a36c Mon Sep 17 00:00:00 2001 From: Guillermo Bescos Date: Fri, 26 Jan 2024 20:11:49 +0000 Subject: [PATCH 3/5] Cleanup --- staking/app/scripts/snapshot.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/staking/app/scripts/snapshot.ts b/staking/app/scripts/snapshot.ts index 69cea049..dfd876ba 100644 --- a/staking/app/scripts/snapshot.ts +++ b/staking/app/scripts/snapshot.ts @@ -18,9 +18,9 @@ const RPC_URL = process.env.ENDPOINT!; // The JSON payload is too big when using the @solana/web3.js getProgramAccounts // We get around this by using the base64+ztsd encoding instead of base64 that @solana/web3.js uses -export async function getAllStakeAccounts( +async function getAllStakeAccounts( url: string -): Promise> { +): Promise<{ publicKey: PublicKey; data: string }> { const response = await axios({ method: "post", url: url, @@ -50,7 +50,7 @@ export async function getAllStakeAccounts( }); } -export async function getAllProfileAccounts( +async function getAllProfileAccounts( url: string ): Promise> { const response = await axios({ From ecb9fa7452d2da904a5f07ed8b33454b360ef16b Mon Sep 17 00:00:00 2001 From: Guillermo Bescos Date: Fri, 26 Jan 2024 20:13:53 +0000 Subject: [PATCH 4/5] Rever this --- package-lock.json | 32 ++++++++++---------------------- staking/package.json | 2 +- 2 files changed, 11 insertions(+), 23 deletions(-) diff --git a/package-lock.json b/package-lock.json index 064b1d2e..57274b1d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -68,8 +68,7 @@ "node_modules/@adraffy/ens-normalize": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz", - "integrity": "sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==", - "dev": true + "integrity": "sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==" }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", @@ -24011,6 +24010,7 @@ "@solana/spl-token": "^0.1.8", "@solana/web3.js": "^1.87.5", "encoding": "^0.1.13", + "ethers": "^6.10.0", "ts-node": "^10.7.0", "typescript": "^4.3.5" }, @@ -24027,7 +24027,6 @@ "axios": "^1.6.7", "chai": "^4.3.4", "dotenv": "^16.4.1", - "ethers": "^6.10.0", "mocha": "^9.2.2", "papaparse": "^5.4.1", "prettier": "^2.6.2", @@ -24056,8 +24055,7 @@ "staking/node_modules/aes-js": { "version": "4.0.0-beta.5", "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", - "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", - "dev": true + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==" }, "staking/node_modules/arg": { "version": "4.1.3", @@ -24103,7 +24101,6 @@ "version": "6.10.0", "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.10.0.tgz", "integrity": "sha512-nMNwYHzs6V1FR3Y4cdfxSQmNgZsRj1RiTU25JwvnJLmyzw9z3SKxNc2XKDuiXXo/v9ds5Mp9m6HBabgYQQ26tA==", - "dev": true, "funding": [ { "type": "individual", @@ -24130,8 +24127,7 @@ "staking/node_modules/ethers/node_modules/@types/node": { "version": "18.15.13", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", - "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==", - "dev": true + "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==" }, "staking/node_modules/ts-node": { "version": "10.9.1", @@ -24177,8 +24173,7 @@ "staking/node_modules/tslib": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "staking/node_modules/typescript": { "version": "4.9.5", @@ -24195,7 +24190,6 @@ "version": "8.5.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", - "dev": true, "engines": { "node": ">=10.0.0" }, @@ -24228,8 +24222,7 @@ "@adraffy/ens-normalize": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz", - "integrity": "sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==", - "dev": true + "integrity": "sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==" }, "@alloc/quick-lru": { "version": "5.2.0", @@ -28084,7 +28077,7 @@ "@types/shelljs": "^0.8.11", "axios": "^1.6.7", "chai": "^4.3.4", - "dotenv": "*", + "dotenv": "^16.4.1", "encoding": "^0.1.13", "ethers": "^6.10.0", "mocha": "^9.2.2", @@ -28115,8 +28108,7 @@ "aes-js": { "version": "4.0.0-beta.5", "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", - "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", - "dev": true + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==" }, "arg": { "version": "4.1.3" @@ -28151,7 +28143,6 @@ "version": "6.10.0", "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.10.0.tgz", "integrity": "sha512-nMNwYHzs6V1FR3Y4cdfxSQmNgZsRj1RiTU25JwvnJLmyzw9z3SKxNc2XKDuiXXo/v9ds5Mp9m6HBabgYQQ26tA==", - "dev": true, "requires": { "@adraffy/ens-normalize": "1.10.0", "@noble/curves": "1.2.0", @@ -28165,8 +28156,7 @@ "@types/node": { "version": "18.15.13", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", - "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==", - "dev": true + "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==" } } }, @@ -28191,8 +28181,7 @@ "tslib": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "typescript": { "version": "4.9.5" @@ -28201,7 +28190,6 @@ "version": "8.5.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", - "dev": true, "requires": {} }, "yn": { diff --git a/staking/package.json b/staking/package.json index f7a987cc..a816e4e4 100644 --- a/staking/package.json +++ b/staking/package.json @@ -18,6 +18,7 @@ "@solana/spl-token": "^0.1.8", "@solana/web3.js": "^1.87.5", "encoding": "^0.1.13", + "ethers": "^6.10.0", "ts-node": "^10.7.0", "typescript": "^4.3.5" }, @@ -34,7 +35,6 @@ "axios": "^1.6.7", "chai": "^4.3.4", "dotenv": "^16.4.1", - "ethers": "^6.10.0", "mocha": "^9.2.2", "papaparse": "^5.4.1", "prettier": "^2.6.2", From 18c9c719ea9d99143f6a5f094e72823ad2691dd2 Mon Sep 17 00:00:00 2001 From: Guillermo Bescos Date: Fri, 26 Jan 2024 20:19:55 +0000 Subject: [PATCH 5/5] Cleanup --- staking/app/scripts/snapshot.ts | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/staking/app/scripts/snapshot.ts b/staking/app/scripts/snapshot.ts index dfd876ba..c294c801 100644 --- a/staking/app/scripts/snapshot.ts +++ b/staking/app/scripts/snapshot.ts @@ -12,6 +12,7 @@ import { import * as fs from "fs"; import Papa from "papaparse"; import dotenv from "dotenv"; +import BN from "bn.js"; dotenv.config(); const RPC_URL = process.env.ENDPOINT!; @@ -20,7 +21,7 @@ const RPC_URL = process.env.ENDPOINT!; // We get around this by using the base64+ztsd encoding instead of base64 that @solana/web3.js uses async function getAllStakeAccounts( url: string -): Promise<{ publicKey: PublicKey; data: string }> { +): Promise<{ publicKey: PublicKey; data: string }[]> { const response = await axios({ method: "post", url: url, @@ -104,15 +105,17 @@ async function main() { const stakeAccounts = await getAllStakeAccounts(RPC_URL); const profileAccounts = await getAllProfileAccounts(RPC_URL); - const stakers: { owner: PublicKey; stakedAmount: string }[] = - stakeAccounts.map((x, index) => { + const stakers: { owner: PublicKey; stakedAmount: BN }[] = stakeAccounts.map( + (x, index) => { console.log("Processing staker :", index); - const buffer = Buffer.from(x.data, "base64"); - const accountData = ZstdStream.decompress(new Uint8Array(buffer)); + const accountData = ZstdStream.decompress( + new Uint8Array(Buffer.from(x.data, "base64")) + ); return stakeConnection.getStakerAndAmountFromPositionAccountData( Buffer.from(accountData) ); - }); + } + ); const stakersWithProfile = stakers.map(({ owner, stakedAmount }, index) => { console.log("Processing profile :", index); @@ -127,9 +130,12 @@ async function main() { identity = profileConnection.getIdentityFromProfileAccountData( Buffer.from(accountData) ); - return { solana: owner, stakedAmount, evm: identity }; } - return { solana: owner, stakedAmount, evm: "" }; + return { + solana: owner, + stakedAmount: stakedAmount.toString(), + evm: identity, + }; }); fs.writeFileSync(