@parifi/synthetix-sdk-ts
Version:
A Typescript SDK for interactions with the Synthetix protocol
1 lines • 10.9 kB
Source Map (JSON)
{"version":3,"sources":["../../src/utils/common.ts","../../src/constants/common.ts","../../src/contracts/addreses/zap.ts"],"sourcesContent":["import { Address, formatEther, maxUint128, parseEther } from 'viem';\n\nimport { mainnet, base, optimism, arbitrum, baseSepolia, arbitrumSepolia, Chain } from 'viem/chains';\nimport { randomBytes } from 'crypto';\nimport { publicRpcEndpoints } from '../constants';\nimport { ZAP_BY_CHAIN } from '../contracts/addreses/zap';\n\nexport function getPublicRpcEndpoint(chainId: number) {\n return publicRpcEndpoints[chainId];\n}\n\n/**\n * Gets the chain object for the given chain id.\n * @param chainId - Chain id of the target EVM chain.\n * @returns Viem's chain object.\n */\nexport function getChain(chainId: number): Chain {\n const chains = [mainnet, base, optimism, arbitrum, baseSepolia, arbitrumSepolia];\n for (const chain of Object.values(chains)) {\n if (chain.id === chainId) {\n return chain;\n }\n }\n throw new Error(`Chain with id ${chainId} not found`);\n}\n\nexport function convertWeiToEther(amountInWei: string | bigint | undefined): number {\n if (amountInWei == undefined) {\n throw new Error('Invalid amount received during conversion: undefined');\n }\n if (typeof amountInWei == 'bigint') {\n return Number(formatEther(amountInWei));\n } else if (typeof amountInWei == 'string') {\n return Number(formatEther(BigInt(amountInWei)));\n } else {\n throw new Error('Expected string or bigint for conversion');\n }\n}\n\nexport function convertEtherToWei(amount: string | number | undefined): bigint {\n if (amount == undefined) {\n throw new Error('Invalid amount received during conversion: undefined');\n }\n if (typeof amount == 'number') {\n return parseEther(amount.toString());\n } else if (typeof amount == 'string') {\n return parseEther(amount);\n } else {\n throw new Error('Expected string or bigint for conversion');\n }\n}\n\nexport function sleep(seconds: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, seconds * 1000));\n}\n\nexport function generateRandomAccountId(): bigint {\n const maxUint128Half = maxUint128 / BigInt(2);\n\n const buffer = randomBytes(8); // 8 bytes * 8 bits/byte = 64 bits\n const randomAccountId = BigInt('0x' + buffer.toString('hex'));\n if (randomAccountId > maxUint128Half) {\n throw new Error('Account ID greater than Maxuint128');\n }\n return randomAccountId;\n}\n\n/**\n * @name batchArray\n * @description This function batches an array into smaller subarrays based on a given size. It uses the reduce method to iterate over the array and push each batch into an accumulator array.\n * @param {any[]} arr - The array that needs to be batched.\n * @param {number} batchSize - The number of elements to include in each subarray.\n * @returns {any[][]} - An array of arrays, where each inner array contains the batched subarrays.\n */\nexport const batchArray = <T>(arr: T[], batchSize: number): T[][] => {\n return arr.reduce((acc, _, i) => (i % batchSize ? acc : [...acc, arr.slice(i, i + batchSize)]), [] as T[][]);\n};\n\nexport type QuoteParams = {\n fromChain: number;\n fromToken: Address;\n toToken: Address;\n fromAmount: string;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type FetcherArgs = Omit<RequestInit, 'body'> & { body?: any };\n\nexport const fetcher = (\n url: string,\n init: FetcherArgs = {\n headers: {\n 'Content-Type': 'application/json',\n },\n },\n) =>\n fetch(url, {\n ...init,\n body: JSON.stringify(init.body),\n headers: init.headers,\n method: init.body && !init.method ? 'POST' : init.method,\n });\n\nconst odoFetcher = async (url: string, options: FetcherArgs) => {\n return fetcher(`https://api.odos.xyz/sor${url}`, options);\n};\n\nconst assemblePath = async (user: string, pathId: string) => {\n const response = await odoFetcher(`/assemble`, {\n body: {\n userAddr: user,\n pathId,\n },\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) return '';\n const data = (await response.json()) as { transaction: { data: string } };\n\n return data.transaction.data;\n};\n\nexport const getOdosPath = async (quoteParams: QuoteParams) => {\n if (!quoteParams.fromToken || !quoteParams.toToken || !quoteParams.fromAmount) {\n throw new Error('Missing required parameters for Odos path generation');\n }\n\n const data = {\n chainId: quoteParams.fromChain,\n inputTokens: [{ tokenAddress: quoteParams.fromToken, amount: quoteParams.fromAmount }],\n outputTokens: [{ tokenAddress: quoteParams.toToken, proportion: 1 }],\n userAddr: ZAP_BY_CHAIN[quoteParams.fromChain],\n };\n\n const response = await odoFetcher('/quote/v2', {\n body: data,\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n console.error(`Failed to get Odos quote: ${response.status} ${response.statusText}`);\n return { path: '' };\n }\n\n const quote = (await response.json()) as { pathId: string };\n if (!quote?.pathId) {\n console.error('Invalid response from Odos API: missing pathId');\n return { path: '' };\n }\n const quoteId = quote.pathId;\n\n const path = await assemblePath(data.userAddr, quoteId);\n if (!path) {\n console.error('Failed to assemble path from pathId');\n }\n\n return { path };\n};\n","import { Hex, zeroAddress } from 'viem';\nimport { MarketIdOrName } from '../interface/commonTypes';\nimport { SUPPORTED_CHAINS } from './chains';\n\nexport const ZERO_ADDRESS: Hex = zeroAddress;\n\nexport const SIG_ORACLE_DATA_REQUIRED = '0xcf2cabdf';\nexport const SIG_FEE_REQUIRED = '0x0e7186fb';\nexport const SIG_ERRORS = '0x0b42fd17';\n\n// for markets metadata it is requesting too much oracle updates\nexport const MAX_ERC7412_RETRIES = 80; // Limit the max failures to prevent infinite loops\n\n// List of market ids disabled by chainId\nexport const DISABLED_MARKETS: { [key: number]: number[] } = {\n 84532: [3, 6300],\n 8453: [6300],\n};\n\nexport const publicRpcEndpoints: { [key: number]: string } = {\n 8453: 'https://base.llamarpc.com',\n 84532: 'https://sepolia.base.org',\n 42161: 'https://arbitrum.llamarpc.com',\n 421614: 'https://sepolia-rollup.arbitrum.io/rpc',\n};\n\n// Logger constants\nexport type LOGGER_MESSAGE_TYPE = 'json' | 'pretty' | 'hidden';\n\n// 0: silly, 1: trace, 2: debug, 3: info, 4: warn, 5: error, 6: fatal\nexport const DEFAULT_LOGGER_LEVEL = 4; // https://tslog.js.org/#/?id=highlights to see more levels\nexport const CUSTOM_DECIMALS: Record<number, Record<MarketIdOrName, number>> = {\n [SUPPORTED_CHAINS.ARBITUM_SEPOLIA]: {\n 2: 6,\n USDC: 6,\n },\n [SUPPORTED_CHAINS.ARBITRUM]: {\n 2: 6,\n USDC: 6,\n },\n [SUPPORTED_CHAINS.BASE_SEPOLIA]: {\n 1: 6,\n USDC: 6,\n },\n [SUPPORTED_CHAINS.BASE]: {\n 1: 6,\n USDC: 6,\n },\n};\n","import { Address, zeroAddress } from 'viem';\nimport { SUPPORTED_CHAINS } from '../../constants/chains';\n\nexport const ZAP_BY_CHAIN: Record<number, Address> = {\n [SUPPORTED_CHAINS.BASE]: '0x459Bbb4231f0a606DC514BacD5712A5922CBe6c8',\n [SUPPORTED_CHAINS.BASE_SEPOLIA]: zeroAddress,\n [SUPPORTED_CHAINS.ARBITRUM]: '0x9ec181B2E69fB36C50031F0c87Bc0749b766A9f4',\n [SUPPORTED_CHAINS.ARBITUM_SEPOLIA]: '0xb569ed692206a1d73996088ae646333b1d59d9c5',\n};\n\nexport const SYNTHETIX_ZAP: Record<number, Address> = {\n [SUPPORTED_CHAINS.BASE_SEPOLIA]: '0xA6Fab50eB36F3eB2118eE2f4C12C968F8608bbc9',\n [SUPPORTED_CHAINS.BASE]: '0xA6Fab50eB36F3eB2118eE2f4C12C968F8608bbc9',\n};\n"],"mappings":"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","names":["zeroAddress","zeroAddress"]}