UNPKG

@parifi/sdk

Version:

Parifi SDK with common utility functions

1 lines 22.8 kB
{"version":3,"sources":["../../src/distribution/index.ts","../../src/common/constants.ts"],"sourcesContent":["import { StandardMerkleTree } from '@openzeppelin/merkle-tree';\nimport { encodeFunctionData } from 'viem';\nimport { REWARD_DISTRIBUTOR_ABI, REWARD_DISTRIBUTOR_ADDRESSES, SUPPORTED_CHAINS } from '../common/constants';\n\nexport type RewardList = Record<string, Record<number, { address: string; amount: string }[]>>;\n\nexport class RewardDistribution {\n rewards: RewardList;\n\n constructor(_rewards?: RewardList) {\n this.rewards = _rewards || {};\n }\n\n /**\n * Sets the reward list.\n * @param rewards The reward list to set.\n */\n setRewardList(rewards: RewardList) {\n this.rewards = rewards;\n }\n\n /**\n * Gets the reward contract address and ABI for a specific token.\n * @param tokenSymbol The symbol of the token.\n * @returns The reward contract address and ABI.\n */\n async getRewardContract(tokenSymbol: string) {\n tokenSymbol = tokenSymbol.toLowerCase();\n\n const rewardContract = REWARD_DISTRIBUTOR_ADDRESSES[SUPPORTED_CHAINS.BASE][tokenSymbol];\n\n if (!rewardContract) {\n throw new Error(`No reward contract found for token ${tokenSymbol}`);\n }\n\n return {\n address: rewardContract,\n abi: REWARD_DISTRIBUTOR_ABI,\n };\n }\n\n /**\n * Gets the Merkle tree for a specific token and round.\n * @param tokenSymbol The symbol of the token.\n * @param round The round number.\n * @returns The Merkle tree for the specified token and round.\n */\n async getTree(tokenSymbol: string, round: number) {\n tokenSymbol = tokenSymbol.toLowerCase();\n const treeData = this.rewards?.[tokenSymbol]?.[round];\n\n if (!treeData) {\n throw new Error(`No rewards found for token ${tokenSymbol}`);\n }\n\n const tree = StandardMerkleTree.of(\n treeData.map((u) => [u.address, u.amount]),\n ['address', 'uint256'],\n );\n\n return tree;\n }\n\n async getUserData(user: string, tokenSymbol: string, round: number) {\n const tree = await this.getTree(tokenSymbol, round);\n\n // serach the index of the user in the tree\n const indexOf = tree.dump().values.findIndex((data) => data.value.at(0)?.toLowerCase() === user.toLowerCase());\n // it return an [address, number] array so we parse to {address, amount}\n const userData = tree\n .dump()\n .values.find((data) => data.value.at(0)?.toLowerCase() === user.toLowerCase())\n ?.value?.reduce(\n (acc, curr, index) => {\n const keys: ['address', 'amount'] = ['address', 'amount'];\n const key: 'address' | 'amount' = keys[index];\n\n if (!key) return acc;\n\n acc[key] = curr;\n\n return acc;\n },\n {} as { address: string; amount: string },\n );\n\n return { userData, indexOf, tree };\n }\n\n /**\n * Claims rewards for a user in multiple rounds.\n * @param user The address of the user.\n * @param rounds The array of round numbers.\n * @param tokenSymbol The symbol of the token.\n * @returns An array of transactions to be sent.\n */\n\n async claimRewards({ user, rounds, tokenSymbol }: { user: string; rounds: number[]; tokenSymbol: string }) {\n const txs = [];\n for (const round of rounds) {\n try {\n const tx = await this.claimReward({ user, round, tokenSymbol });\n txs.push(tx);\n } catch (error) {\n console.error(`Error claiming rewards for ${user} in round ${round}:`, error);\n }\n }\n\n return txs.flat();\n }\n\n /**\n * Claims the reward for a user in a specific round.\n * @param user The address of the user.\n * @param round The round number.\n * @param tokenSymbol The symbol of the token.\n * @returns An array of transactions to be sent.\n */\n\n async claimReward({ user, round, tokenSymbol }: { user: string; tokenSymbol: string; round: number }) {\n tokenSymbol = tokenSymbol.toLowerCase();\n\n const { userData, indexOf, tree } = await this.getUserData(user, tokenSymbol, round);\n if (!userData || !userData?.address) throw new Error(`User ${user} not found in the tree`);\n\n const proof = tree.getProof(indexOf);\n const distributor = await this.getRewardContract(tokenSymbol);\n\n return [\n {\n tx: {\n to: distributor.address,\n data: encodeFunctionData({\n abi: distributor.abi,\n functionName: 'claimReward',\n args: [round, userData.amount, proof],\n }),\n value: '0',\n },\n amount: userData.amount,\n },\n ];\n }\n}\n","import { Decimal } from 'decimal.js';\nimport { Address } from 'viem';\n\nexport const PRECISION_MULTIPLIER = new Decimal('10000');\nexport const DEVIATION_PRECISION_MULTIPLIER = new Decimal(10).pow(12);\nexport const SECONDS_IN_A_YEAR = new Decimal(365 * 24 * 60 * 60);\nexport const MAX_FEE = new Decimal(10000000); // 1% = 100_000\nexport const WAD = new Decimal(10).pow(18); // 10^18\nexport const EMPTY_BYTES32 = '0x0000000000000000000000000000000000000000000000000000000000000000';\n// export const PRICE_FEED_DECIMALS = 18;\n// export const PRICE_FEED_PRECISION = new Decimal(10).pow(PRICE_FEED_DECIMALS);\nexport const DECIMAL_10 = new Decimal(10);\nexport const DECIMAL_ZERO = new Decimal(0);\nexport const DEFAULT_BATCH_COUNT = 10;\nexport const BIGINT_ZERO = BigInt(0);\n\nexport const GAS_LIMIT_SETTLEMENT = 10000000; // 10M gas\nexport const GAS_LIMIT_LIQUIDATION = 15000000; // 15M gas\n\nexport const ONE_GWEI = 1000000000; // 10^9\nexport const DEFAULT_GAS_PRICE = 2 * ONE_GWEI; // 1 gwei\n\n// Constants for Pyth price ids of collaterals\nexport const PYTH_ETH_USD_PRICE_ID_BETA = '0xca80ba6dc32e08d06f1aa886011eed1d77c77be9eb761cc10d72b7d0a2fd57a6';\nexport const PYTH_ETH_USD_PRICE_ID_STABLE = '0xff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace';\n\nexport const PYTH_USDC_USD_PRICE_ID_BETA = '0x41f3625971ca2ed2263e78573fe5ce23e13d2558ed3f2e47ab0f84fb9e7ae722';\nexport const PYTH_USDC_USD_PRICE_ID_STABLE = '0xeaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a';\n\n// Constants for Pimlico relayer\nexport const FACTORY_ADDRESS_SIMPLE_ACCOUNT = '0x91E60e0613810449d098b0b5Ec8b51A0FE8c8985';\n\n// Temporary constants\nexport const SUBGRAPH_HELPER_ADDRESS = '0xf012d32505df6853187170F00C7b789A8ecC41c2';\n\nexport const SYMBOL_TO_PYTH_FEED = new Map<string, string>([\n // market\n ['BTC', '0xc9d8b075a5c69303365ae23633d4e085199bf5c520a3b90fed1322a0342ffc33'],\n ['SOL', '0xef0d8b6fda2ceba41da15d4095d1da392a0d2f8ed0c6c7bc0f4cfac8c280b56d'],\n ['WIF', '0x4ca4beeca86f0d164160323817a4e42b10010a724c2217c6ee41b54cd4cc61fc'],\n ['ETH', '0xff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace'],\n ['AAVE', '0x2b9ab1e972a281585084148ba1389800799bd4be63b957507db1349314e47445'],\n ['ADA', '0x2a01deaec9e51a579277b34b122399984d0bbf57e2458a7e42fecd2829867a0d'],\n ['ARB', '0x3fa4252848f9f0a1480be62745a4629d9eb1322aebab8a791e344b3b9c1adcf5'],\n ['AVAX', '0x93da3352f9f1d105fdfe4971cfa80e9dd777bfc5d0f683ebb6e1294b92137bb7'],\n ['BCH', '0x3dd2b63686a450ec7290df3a1e0b583c0481f651351edfa7636f39aed55cf8a3'],\n ['BNB', '0x2f95862b045670cd22bee3114c39763a4a08beeb663b145d283c31d7d1101c4f'],\n ['CRV', '0xa19d04ac696c7a6616d291c7e5d1377cc8be437c327b75adb5dc1bad745fcae8'],\n ['DOGE', '0xdcef50dd0a4cd2dcc17e45df1676dcb336a11a61c69df7a0299b0150c672d25c'],\n ['DYDX', '0x6489800bb8974169adfe35937bf6736507097d13c190d760c557108c7e93a81b'],\n ['GMX', '0xb962539d0fcb272a494d65ea56f94851c2bcf8823935da05bd628916e2e9edbf'],\n ['LINK', '0x8ac0c70fff57e9aefdf5edf44b51d62c2d433653cbb2cf5cc06bb115af04d221'],\n ['LTC', '0x6e3f3fa8253588df9326580180233eb791e03b443a3ba7a1d892e73874e19a54'],\n ['MKR', '0x9375299e31c0deb9c6bc378e6329aab44cb48ec655552a70d4b9050346a30378'],\n ['NEAR', '0xc415de8d2eba7db216527dff4b60e8f3a5311c740dadb233e13e12547e226750'],\n ['OP', '0x385f64d993f7b77d8182ed5003d97c60aa3361f3cecfe711544d2d59165e9bdf'],\n ['ORDI', '0x193c739db502aadcef37c2589738b1e37bdb257d58cf1ab3c7ebc8e6df4e3ec0'],\n ['PEPE', '0xd69731a2e74ac1ce884fc3890f7ee324b6deb66147055249568869ed700882e4'],\n ['POL', '0xffd11c5a1cfd42f80afb2df4d9f264c15f956d68153335374ec10722edd70472'],\n ['PYTH', '0x0bbf28e9a841a1cc788f6a361b17ca072d0ea3098a1e5df1c3922d06719579ff'],\n ['RUNE', '0x5fcf71143bb70d41af4fa9aa1287e2efd3c5911cee59f909f915c9f61baacb1e'],\n ['SHIB', '0xf0d57deca57b3da2fe63a493f4c25925fdfd8edf834b20f93e1f84dbd1504d4a'],\n ['STX', '0xec7a775f46379b5e943c3526b1c8d54cd49749176b0b98e02dde68d1bd335c17'],\n ['TIA', '0x09f7c1d7dfbb7df2b8fe3d3d87ee94a2259d212da4f30c1f0540d066dfa44723'],\n ['UNI', '0x78d185a741d07edb3412b09008b7c5cfb9bbbd7d568bf00ba737b456ba171501'],\n ['XLM', '0xb7a8eba68a997cd0210c2e1e4ee811ad2d174b3611c22d9ebf16f4cb7e9ba850'],\n ['XRP', '0xec5d399846a9209f3fe5881d70aae9268c94339ff9817e8d18ff19fa05eea1c8'],\n // collateral\n ['USDC', '0xeaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a'],\n ['USDE', '0x6ec879b1e9963de5ee97e9c8710b742d6228252a5e2ca12d4ae81d7fe5ee8c5d'],\n ['DAI', '0xb0948a5e5313200c632b51bb5ca32f6de0d36e9950a942d19751e833f70dabfd'],\n]);\n\nexport const collateralMappingWithRegularSymbol = new Map<string, string>([\n ['seth', 'eth'],\n ['wbtc', 'btc'],\n ['fbtc', 'btc'],\n ['wsteth', 'eth'],\n ['fdai', 'dai'],\n ['susdc', 'usdc'],\n ['susde', 'usde'],\n ['steth', 'eth'],\n ['fsol', 'sol'],\n ['fusdc', 'usdc'],\n ['fusdt', 'usdt'],\n ['ssol', 'sol'],\n ['sdai', 'dai'],\n ['usdx', 'usdc'],\n ['stbtc', 'btc'],\n]);\n// === TOKEN DISTRIBUTION ===\n\nexport enum SUPPORTED_CHAINS {\n BASE = 8453,\n}\n\nexport const REWARD_DISTRIBUTOR_ADDRESSES: Record<number, Record<string, Address>> = {\n [SUPPORTED_CHAINS.BASE]: {\n esprf: '0x6511718804180CC57833fEA036389A24604Dfc69',\n prf: '0x0000000000000000000000000000000000000000',\n rt: '0x648d6D711860699A11aBa192E9daBAfb6408af18',\n },\n};\n\nexport const REWARD_DISTRIBUTOR_ABI = [\n {\n inputs: [{ internalType: 'contract IERC20', name: '_rewardToken', type: 'address' }],\n stateMutability: 'nonpayable',\n type: 'constructor',\n },\n { inputs: [], name: 'AccessControlBadConfirmation', type: 'error' },\n {\n inputs: [\n { internalType: 'address', name: 'account', type: 'address' },\n { internalType: 'bytes32', name: 'neededRole', type: 'bytes32' },\n ],\n name: 'AccessControlUnauthorizedAccount',\n type: 'error',\n },\n {\n anonymous: false,\n inputs: [\n { indexed: true, internalType: 'address', name: 'user', type: 'address' },\n { indexed: false, internalType: 'uint256', name: 'amount', type: 'uint256' },\n ],\n name: 'RewardClaimed',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n { indexed: true, internalType: 'bytes32', name: 'role', type: 'bytes32' },\n { indexed: true, internalType: 'bytes32', name: 'previousAdminRole', type: 'bytes32' },\n { indexed: true, internalType: 'bytes32', name: 'newAdminRole', type: 'bytes32' },\n ],\n name: 'RoleAdminChanged',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n { indexed: true, internalType: 'bytes32', name: 'role', type: 'bytes32' },\n { indexed: true, internalType: 'address', name: 'account', type: 'address' },\n { indexed: true, internalType: 'address', name: 'sender', type: 'address' },\n ],\n name: 'RoleGranted',\n type: 'event',\n },\n {\n anonymous: false,\n inputs: [\n { indexed: true, internalType: 'bytes32', name: 'role', type: 'bytes32' },\n { indexed: true, internalType: 'address', name: 'account', type: 'address' },\n { indexed: true, internalType: 'address', name: 'sender', type: 'address' },\n ],\n name: 'RoleRevoked',\n type: 'event',\n },\n {\n inputs: [],\n name: 'DEFAULT_ADMIN_ROLE',\n outputs: [{ internalType: 'bytes32', name: '', type: 'bytes32' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [],\n name: 'actualRound',\n outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'uint256', name: '_round', type: 'uint256' },\n { internalType: 'uint256', name: 'amount', type: 'uint256' },\n { internalType: 'bytes32[]', name: 'proof', type: 'bytes32[]' },\n ],\n name: 'claimReward',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'uint256[]', name: '_rounds', type: 'uint256[]' },\n { internalType: 'uint256[]', name: 'amounts', type: 'uint256[]' },\n { internalType: 'bytes32[][]', name: 'proofs', type: 'bytes32[][]' },\n ],\n name: 'claimRewards',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'uint256', name: '', type: 'uint256' },\n { internalType: 'address', name: '', type: 'address' },\n ],\n name: 'claimed',\n outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'bytes32', name: 'role', type: 'bytes32' }],\n name: 'getRoleAdmin',\n outputs: [{ internalType: 'bytes32', name: '', type: 'bytes32' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'bytes32', name: 'role', type: 'bytes32' },\n { internalType: 'address', name: 'account', type: 'address' },\n ],\n name: 'grantRole',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'bytes32', name: 'role', type: 'bytes32' },\n { internalType: 'address', name: 'account', type: 'address' },\n ],\n name: 'hasRole',\n outputs: [{ internalType: 'bool', name: '', type: 'bool' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'bytes32', name: 'role', type: 'bytes32' },\n { internalType: 'address', name: 'callerConfirmation', type: 'address' },\n ],\n name: 'renounceRole',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'bytes32', name: 'role', type: 'bytes32' },\n { internalType: 'address', name: 'account', type: 'address' },\n ],\n name: 'revokeRole',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [],\n name: 'rewardToken',\n outputs: [{ internalType: 'contract IERC20', name: '', type: 'address' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'uint256', name: '_round', type: 'uint256' }],\n name: 'setActualRound',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'uint256', name: '_round', type: 'uint256' },\n { internalType: 'bytes32', name: '_root', type: 'bytes32' },\n ],\n name: 'setRootPerRound',\n outputs: [],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'bytes4', name: 'interfaceId', type: 'bytes4' }],\n name: 'supportsInterface',\n outputs: [{ internalType: 'bool', name: '', type: 'bool' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],\n name: 'verifiersPerRound',\n outputs: [{ internalType: 'contract Verifier', name: '', type: 'address' }],\n stateMutability: 'view',\n type: 'function',\n },\n];\n"],"mappings":"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","names":[]}