@cobaltx/sdk-v2
Version:
An SDK for building applications on top of CobaltX.
1 lines • 360 kB
Source Map (JSON)
{"version":3,"sources":["../../../src/cobaltx/token/constant.ts","../../../src/config.ts","../../../src/marshmallow/index.ts","../../../src/marshmallow/buffer-layout.ts","../../../src/cobaltx/token/layout.ts","../../../src/cobaltx/token/utils.ts","../../../src/module/amount.ts","../../../src/common/bignumber.ts","../../../../../node_modules/decimal.js/decimal.mjs","../../../src/module/token.ts","../../../src/common/pubKey.ts","../../../src/module/fraction.ts","../../../src/common/logger.ts","../../../src/common/constant.ts","../../../src/module/formatter.ts","../../../src/module/percent.ts","../../../src/module/price.ts","../../../src/common/utility.ts","../../../src/common/accountInfo.ts","../../../src/common/pda.ts","../../../src/common/txTool/txUtils.ts","../../../src/common/programId.ts","../../../src/common/transfer.ts","../../../src/common/txTool/lookupTable.ts","../../../src/common/txTool/txTool.ts"],"sourcesContent":["import { TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport { PublicKey } from \"@solana/web3.js\";\nimport { TokenInfo } from \"./type\";\nimport { NetworkName } from \"@/config\";\nimport { getNetworkConfig } from \"@/config\";\n\nexport function getSolInfo(network: NetworkName): TokenInfo {\n const config = getNetworkConfig(network);\n return {\n chainId: 101,\n address: PublicKey.default.toBase58(),\n programId: TOKEN_PROGRAM_ID.toBase58(),\n decimals: 9,\n symbol: config.NATIVE_TOKEN_SYMBOL,\n name: config.FULL_TOKEN_NAME,\n logoURI: config.GITHUB_LOGO_URL,\n tags: [],\n priority: 2,\n type: \"cobaltx\",\n extensions: {\n coingeckoId: \"solana\",\n },\n };\n}\n\nexport function getTokenWSol(network: NetworkName): TokenInfo {\n const config = getNetworkConfig(network);\n return {\n chainId: 101,\n address: config.WSOL_MINT_ADDRESS,\n programId: TOKEN_PROGRAM_ID.toBase58(),\n decimals: 9,\n symbol: config.WRAPPED_TOKEN_SYMBOL || \"\",\n name: config.FULL_TOKEN_NAME,\n logoURI: config.GITHUB_LOGO_URL,\n tags: [],\n priority: 2,\n type: \"cobaltx\",\n extensions: {\n coingeckoId: \"solana\",\n },\n};\n}\n","import { PublicKey } from \"@solana/web3.js\";\r\n\r\nexport enum NetworkName {\r\n sooneth = \"sooneth\",\r\n // sooneth_testnet = \"sooneth_testnet\",\r\n svmbnb = \"svmbnb\",\r\n svmbnb_testnet = \"svmbnb_testnet\",\r\n svmbase_testnet = \"svmbase_testnet\",\r\n soonbase_mainnet = \"soonbase_mainnet\",\r\n}\r\n\r\nexport interface NetworkConfig {\r\n SWAP_HOST: string;\r\n NATIVE_TOKEN_SYMBOL: string;\r\n BASE_HOST: string;\r\n OWNER_BASE_HOST: string;\r\n SERVICE_BASE_HOST: string;\r\n MONITOR_BASE_HOST: string;\r\n SERVICE_1_BASE_HOST: string;\r\n ANALYTICS_BASE_HOST: string;\r\n GITHUB_TOKEN_LIST_URL: string;\r\n WSOL_MINT_ADDRESS: string;\r\n GITHUB_LOGO_URL: string;\r\n LOOKUP_TABLE_CACHE: string; \r\n CLMM_PROGRAMM_ID: string;\r\n FULL_TOKEN_NAME: string;\r\n USDC_MINT_ADDRESS: string;\r\n USDT_MINT_ADDRESS: string;\r\n ETH_MINT_ADDRESS: string;\r\n BONK_MINT_ADDRESS?: string | undefined;\r\n SOL_MINT_ADDRESS?: string | undefined;\r\n WRAPPED_TOKEN_SYMBOL: string;\r\n WSOL_DECIMALS: number;\r\n INPUT_MINT_ADDRESS: string;\r\n OUTPUT_MINT_ADDRESS: string;\r\n POPULAR_TOKENS: {\r\n SOL?: string,\r\n ETH?: string,\r\n USDC?: string,\r\n USDT?: string,\r\n\r\n };\r\n}\r\n\r\nexport const NETWORK_CONFIG: Record<NetworkName, NetworkConfig> = {\r\n [NetworkName.sooneth]: {\r\n NATIVE_TOKEN_SYMBOL: \"ETH\",\r\n SWAP_HOST: \"https://trade-api.cobaltx.io\",\r\n BASE_HOST: \"https://api.cobaltx.io\",\r\n OWNER_BASE_HOST: \"https://api.cobaltx.io\",\r\n SERVICE_BASE_HOST: \"https://api.cobaltx.io\",\r\n MONITOR_BASE_HOST: \"https://api.cobaltx.io\",\r\n SERVICE_1_BASE_HOST: \"https://api.cobaltx.io\",\r\n ANALYTICS_BASE_HOST: \"https://api.cobaltx.io\",\r\n GITHUB_TOKEN_LIST_URL: \"https://raw.githubusercontent.com/cobaltx-io/tokens/main/tokens.json\",\r\n WSOL_MINT_ADDRESS: \"So11111111111111111111111111111111111111112\",\r\n GITHUB_LOGO_URL:\r\n \"https://raw.githubusercontent.com/cobaltx-io/tokens/main/logo/So11111111111111111111111111111111111111112.png\",\r\n LOOKUP_TABLE_CACHE: \"6fa5xTGwoYJPMLMXaQ4tQFKMoYvXuvsJFLigMJ9a5QeB\",\r\n CLMM_PROGRAMM_ID: \"2TnjBuwqyBB9to5jURagDT7jLmBPefGRiKL2yh1zPZ4V\",\r\n BONK_MINT_ADDRESS: \"71kRXzJMvSeArtXYNEWa8KAjpRJosdMQ7Dpgy5Jt5zfd\",\r\n SOL_MINT_ADDRESS: \"ERFzpDteGNo8LTDKW1WwVGrkRMmA2y9WZHXNHxMA6BSV\",\r\n USDC_MINT_ADDRESS: \"ExYxyorY2x3h8gLcuypnHFQV3F36rmMkQVn7HHV8mUy9\",\r\n USDT_MINT_ADDRESS: \"742wcXVzkhNuEePAot7L3GvPseh93pvYFPgyHLX8mUy9\",\r\n FULL_TOKEN_NAME: \"Wrapped Ethereum\",\r\n ETH_MINT_ADDRESS: \"71kRXzJMvSeArtXYNEWa8KAjpRJosdMQ7Dpgy5Jt5zfd\",\r\n WRAPPED_TOKEN_SYMBOL: \"WETH\",\r\n INPUT_MINT_ADDRESS: PublicKey.default.toString(),\r\n OUTPUT_MINT_ADDRESS: \"742wcXVzkhNuEePAot7L3GvPseh93pvYFPgyHLX8mUy9\",\r\n POPULAR_TOKENS: {\r\n SOL: PublicKey.default.toString(),\r\n ETH: \"71kRXzJMvSeArtXYNEWa8KAjpRJosdMQ7Dpgy5Jt5zfd\",\r\n USDC: \"ExYxyorY2x3h8gLcuypnHFQV3F36rmMkQVn7HHV8KjtA\",\r\n USDT: \"742wcXVzkhNuEePAot7L3GvPseh93pvYFPgyHLX8mUy9\",\r\n },\r\n WSOL_DECIMALS: 9,\r\n },\r\n [NetworkName.svmbnb]: {\r\n NATIVE_TOKEN_SYMBOL: \"BNB\",\r\n SWAP_HOST: \"https://trade-api.svmbnb.cobaltx.io\",\r\n BASE_HOST: \"https://api.svmbnb.cobaltx.io\",\r\n OWNER_BASE_HOST: \"https://api.svmbnb.cobaltx.io\",\r\n SERVICE_BASE_HOST: \"https://api.svmbnb.cobaltx.io\",\r\n MONITOR_BASE_HOST: \"https://api.svmbnb.cobaltx.io\",\r\n SERVICE_1_BASE_HOST: \"https://api.svmbnb.cobaltx.io\",\r\n ANALYTICS_BASE_HOST: \"https://api.svmbnb.cobaltx.io\",\r\n GITHUB_TOKEN_LIST_URL: \"https://raw.githubusercontent.com/cobaltx-io/svmbnb-tokens/main/tokens.json\",\r\n WSOL_MINT_ADDRESS: \"So11111111111111111111111111111111111111112\",\r\n GITHUB_LOGO_URL:\r\n \"https://raw.githubusercontent.com/cobaltx-io/svmbnb-tokens/main/logo/So11111111111111111111111111111111111111112.svg\",\r\n LOOKUP_TABLE_CACHE: \"GSR5XQGWhpzV9TTduBJR6qPNjYsepMQSGkpaqfrbrW9w\",\r\n CLMM_PROGRAMM_ID: \"6f1b3xyVZbnWMHXBjgW1KPwxmPAgXcRdrvKNn4Nmf1Cn\",\r\n ETH_MINT_ADDRESS: \"H3xpFH1yN5E1zFdAoBrC9Y7m7RfJUeQNLvkHi8kNf9Qu\",\r\n USDC_MINT_ADDRESS: \"5odzAHDpDETYhupMkc6kjiYen3K2nrf8oPmvqmsoNW4L\",\r\n USDT_MINT_ADDRESS: \"s8cRDxnp3VxjB6khRnGDdxv6QbCUPyY9Vn1bgSQQsnG\",\r\n SOL_MINT_ADDRESS: \"So11111111111111111111111111111111111111112\",\r\n FULL_TOKEN_NAME: \"Wrapped BNB\",\r\n WRAPPED_TOKEN_SYMBOL: \"WBNB\",\r\n INPUT_MINT_ADDRESS: PublicKey.default.toBase58(),\r\n OUTPUT_MINT_ADDRESS: \"ABoT7umUXnx8RtJTeRqKB6myebVjP2wdJGQuV23jVVH3\",\r\n POPULAR_TOKENS: {\r\n SOL: PublicKey.default.toString(),\r\n ETH: \"H3xpFH1yN5E1zFdAoBrC9Y7m7RfJUeQNLvkHi8kNf9Qu\",\r\n USDC: \"5odzAHDpDETYhupMkc6kjiYen3K2nrf8oPmvqmsoNW4L\",\r\n USDT: \"s8cRDxnp3VxjB6khRnGDdxv6QbCUPyY9Vn1bgSQQsnG\",\r\n },\r\n WSOL_DECIMALS: 9,\r\n },\r\n [NetworkName.svmbnb_testnet]: {\r\n NATIVE_TOKEN_SYMBOL: \"BNB\",\r\n SWAP_HOST: \"https://trade-api.svmbnb.cobaltx.io\",\r\n BASE_HOST: \"https://api.testnet.svmbnb.cobaltx.io\",\r\n OWNER_BASE_HOST: \"https://api.testnet.svmbnb.cobaltx.io\",\r\n SERVICE_BASE_HOST: \"https://api.testnet.svmbnb.cobaltx.io\",\r\n MONITOR_BASE_HOST: \"https://api.testnet.svmbnb.cobaltx.io\",\r\n SERVICE_1_BASE_HOST: \"https://api.testnet.svmbnb.cobaltx.io\",\r\n ANALYTICS_BASE_HOST: \"https://api.testnet.svmbnb.cobaltx.io\",\r\n GITHUB_TOKEN_LIST_URL: \"https://raw.githubusercontent.com/cobaltx-io/svmbnb-testnet-tokens/main/tokens.json\",\r\n WSOL_MINT_ADDRESS: \"So11111111111111111111111111111111111111112\",\r\n GITHUB_LOGO_URL:\r\n \"https://raw.githubusercontent.com/cobaltx-io/svmbnb-testnet-tokens/main/logo/So11111111111111111111111111111111111111112.svg\",\r\n LOOKUP_TABLE_CACHE: \"D79gSiTNV9pyLPJyscW5yZYwdPVDrtKsamL3ZfQi6JiM\",\r\n CLMM_PROGRAMM_ID: \"FgycD57kcCZsjpoTAi2u67GTPxm59bPEhycL2Lw1icm1\",\r\n ETH_MINT_ADDRESS: \"5aLr3sV4UNVcMB6CiA3PZTWbgVBRNyMdEp1s5LNfhR95\",\r\n USDC_MINT_ADDRESS: \"jrhUNRxEDpFmGV3sqaWyveS7bVtRQgtHsfBTCdjfMBw\",\r\n USDT_MINT_ADDRESS: \"Ex86C4gmdjvPRNrfyvsyejbjkP6RstNaBC5g3itZw2iv\",\r\n FULL_TOKEN_NAME: \"Wrapped BNB\",\r\n WRAPPED_TOKEN_SYMBOL: \"WBNB\",\r\n INPUT_MINT_ADDRESS: \"bnb\",\r\n OUTPUT_MINT_ADDRESS: \"jrhUNRxEDpFmGV3sqaWyveS7bVtRQgtHsfBTCdjfMBw\",\r\n POPULAR_TOKENS: {\r\n SOL: PublicKey.default.toString(),\r\n ETH: \"5aLr3sV4UNVcMB6CiA3PZTWbgVBRNyMdEp1s5LNfhR95\",\r\n USDC: \"jrhUNRxEDpFmGV3sqaWyveS7bVtRQgtHsfBTCdjfMBw\",\r\n USDT: \"Ex86C4gmdjvPRNrfyvsyejbjkP6RstNaBC5g3itZw2iv\",\r\n },\r\n WSOL_DECIMALS: 9,\r\n },\r\n [NetworkName.svmbase_testnet]: {\r\n NATIVE_TOKEN_SYMBOL: \"ETH\",\r\n SWAP_HOST: \"https://trade-api.testnet.svmbase.cobaltx.io\",\r\n BASE_HOST: \"https://api.testnet.svmbase.cobaltx.io\",\r\n OWNER_BASE_HOST: \"https://api.testnet.svmbase.cobaltx.io\",\r\n SERVICE_BASE_HOST: \"https://api.testnet.svmbase.cobaltx.io\",\r\n MONITOR_BASE_HOST: \"https://api.testnet.svmbase.cobaltx.io\",\r\n SERVICE_1_BASE_HOST: \"https://api.testnet.svmbase.cobaltx.io\",\r\n ANALYTICS_BASE_HOST: \"https://api.testnet.svmbase.cobaltx.io\",\r\n GITHUB_TOKEN_LIST_URL: \"https://raw.githubusercontent.com/cobaltx-io/svmbase-testnet-tokens/main/tokens.json\",\r\n WSOL_MINT_ADDRESS: \"So11111111111111111111111111111111111111112\",\r\n GITHUB_LOGO_URL:\r\n \"https://raw.githubusercontent.com/cobaltx-io/svmbase-testnet-tokens/main/logo/So11111111111111111111111111111111111111112.png\",\r\n LOOKUP_TABLE_CACHE: \"AyPMvNmUUY2jwZ75NxhkLYPraQGNk5DssVfP4TnMcPJF\",\r\n CLMM_PROGRAMM_ID: \"DnZnBqJKiGSYHUHYvkXAbQmkMbwrjfgo4orR7jWyMsik\",\r\n ETH_MINT_ADDRESS: \"71kRXzJMvSeArtXYNEWa8KAjpRJosdMQ7Dpgy5Jt5zfd\",\r\n USDC_MINT_ADDRESS: \"63tPXWPnYeZ9hA3dJsAY5RcQ8YbwEz8uZ5nKu3uFD1aK\",\r\n USDT_MINT_ADDRESS: \"4fyX7hSmPetQC2wRS3YVAhWeFzif7WStarKwTvCXrBtD\",\r\n FULL_TOKEN_NAME: \"Wrapped Ethereum\",\r\n WRAPPED_TOKEN_SYMBOL: \"WETH\",\r\n INPUT_MINT_ADDRESS: PublicKey.default.toString(),\r\n OUTPUT_MINT_ADDRESS: \"63tPXWPnYeZ9hA3dJsAY5RcQ8YbwEz8uZ5nKu3uFD1aK\",\r\n POPULAR_TOKENS: {\r\n SOL: PublicKey.default.toString(),\r\n ETH: \"So11111111111111111111111111111111111111112\",\r\n USDC: \"63tPXWPnYeZ9hA3dJsAY5RcQ8YbwEz8uZ5nKu3uFD1aK\",\r\n USDT: \"4fyX7hSmPetQC2wRS3YVAhWeFzif7WStarKwTvCXrBtD\",\r\n },\r\n WSOL_DECIMALS: 9,\r\n },\r\n [NetworkName.soonbase_mainnet]: {\r\n NATIVE_TOKEN_SYMBOL: \"ETH\",\r\n SWAP_HOST: \"https://trade-api.soonbase.cobaltx.io\",\r\n BASE_HOST: \"https://api.soonbase.cobaltx.io\",\r\n OWNER_BASE_HOST: \"https://api.soonbase.cobaltx.io\",\r\n SERVICE_BASE_HOST: \"https://api.soonbase.cobaltx.io\",\r\n MONITOR_BASE_HOST: \"https://api.soonbase.cobaltx.io\",\r\n SERVICE_1_BASE_HOST: \"https://api.soonbase.cobaltx.io\",\r\n ANALYTICS_BASE_HOST: \"https://api.soonbase.cobaltx.io\",\r\n GITHUB_TOKEN_LIST_URL: \"https://raw.githubusercontent.com/cobaltx-io/soonbase-tokens/main/tokens.json\",\r\n WSOL_MINT_ADDRESS: \"So11111111111111111111111111111111111111112\",\r\n GITHUB_LOGO_URL:\r\n \"https://raw.githubusercontent.com/cobaltx-io/soonbase-tokens/main/logo/So11111111111111111111111111111111111111112.png\",\r\n LOOKUP_TABLE_CACHE: \"FGRusuLycV6nhSPQc9VX55YjT6DCzJFc59mvTTarSTjK\",\r\n CLMM_PROGRAMM_ID: \"6f1b3xyVZbnWMHXBjgW1KPwxmPAgXcRdrvKNn4Nmf1Cn\",\r\n ETH_MINT_ADDRESS: \"71kRXzJMvSeArtXYNEWa8KAjpRJosdMQ7Dpgy5Jt5zfd\",\r\n USDC_MINT_ADDRESS: \"BoYN2f2gLQS4jpvMSV9dAZwfzKJiKGk4NPck5BjXfujo\",\r\n USDT_MINT_ADDRESS: \"J87bysZjwfS3n6KR21cwbdPZVJWNSFcXpWF5kiChAwQH\",\r\n FULL_TOKEN_NAME: \"Wrapped Ethereum\",\r\n WRAPPED_TOKEN_SYMBOL: \"WETH\",\r\n INPUT_MINT_ADDRESS: PublicKey.default.toString(),\r\n OUTPUT_MINT_ADDRESS: \"BoYN2f2gLQS4jpvMSV9dAZwfzKJiKGk4NPck5BjXfujo\",\r\n POPULAR_TOKENS: {\r\n SOL: PublicKey.default.toString(),\r\n ETH: \"FkvCG5DcuYCQ1BnPH4ZzTkCdk3VzutgyDAFBec4qAjhh\",\r\n USDC: \"BoYN2f2gLQS4jpvMSV9dAZwfzKJiKGk4NPck5BjXfujo\",\r\n USDT: \"J87bysZjwfS3n6KR21cwbdPZVJWNSFcXpWF5kiChAwQH\",\r\n },\r\n WSOL_DECIMALS: 9,\r\n },\r\n};\r\n\r\nexport const getNetworkConfig = (network: NetworkName): NetworkConfig => {\r\n return NETWORK_CONFIG[network];\r\n};\r\n\r\n\r\n","import { PublicKey } from \"@solana/web3.js\";\nimport BN, { isBN } from \"bn.js\";\n\nimport {\n bits,\n blob,\n Blob,\n Layout,\n offset as _offset,\n seq as _seq,\n Structure as _Structure,\n u32 as _u32,\n u8 as _u8,\n UInt,\n union as _union,\n Union as _Union,\n} from \"./buffer-layout\";\n\nexport * from \"./buffer-layout\";\nexport { blob };\n\nexport class BNLayout<P extends string = \"\"> extends Layout<BN, P> {\n blob: Layout<Buffer>;\n signed: boolean;\n\n constructor(span: number, signed: boolean, property?: P) {\n //@ts-expect-error type wrong for super()'s type different from extends, but it desn't matter\n super(span, property);\n this.blob = blob(span);\n this.signed = signed;\n }\n\n /** @override */\n decode(b: Buffer, offset = 0): BN {\n const num = new BN(this.blob.decode(b, offset), 10, \"le\");\n if (this.signed) {\n return num.fromTwos(this.span * 8).clone();\n }\n return num;\n }\n\n /** @override */\n encode(src: BN, b: Buffer, offset = 0): number {\n if (typeof src === \"number\") src = new BN(src); // src will pass a number accidently in union\n if (this.signed) {\n src = src.toTwos(this.span * 8);\n }\n return this.blob.encode(src.toArrayLike(Buffer, \"le\", this.span), b, offset);\n }\n}\n\nexport class WideBits<P extends string = \"\"> extends Layout<Record<string, boolean>, P> {\n _lower: any;\n _upper: any;\n // TODO: unknown\n constructor(property?: P) {\n //@ts-expect-error type wrong for super()'s type different from extends , but it desn't matter\n super(8, property);\n this._lower = bits(_u32(), false);\n this._upper = bits(_u32(), false);\n }\n\n addBoolean(property: string): void {\n if (this._lower.fields.length < 32) {\n this._lower.addBoolean(property);\n } else {\n this._upper.addBoolean(property);\n }\n }\n\n decode(b: Buffer, offset = 0): Record<string, boolean> {\n const lowerDecoded = this._lower.decode(b, offset);\n const upperDecoded = this._upper.decode(b, offset + this._lower.span);\n return { ...lowerDecoded, ...upperDecoded };\n }\n\n encode(src: any /* TEMP */, b: Buffer, offset = 0): any {\n return this._lower.encode(src, b, offset) + this._upper.encode(src, b, offset + this._lower.span);\n }\n}\n\nexport function u8<P extends string = \"\">(property?: P): UInt<number, P> {\n return new UInt(1, property);\n}\n\nexport function u32<P extends string = \"\">(property?: P): UInt<number, P> {\n return new UInt(4, property);\n}\n\nexport function u64<P extends string = \"\">(property?: P): BNLayout<P> {\n return new BNLayout(8, false, property);\n}\n\nexport function u128<P extends string = \"\">(property?: P): BNLayout<P> {\n return new BNLayout(16, false, property);\n}\n\nexport function i8<P extends string = \"\">(property?: P): BNLayout<P> {\n return new BNLayout(1, true, property);\n}\n\nexport function i64<P extends string = \"\">(property?: P): BNLayout<P> {\n return new BNLayout(8, true, property);\n}\n\nexport function i128<P extends string = \"\">(property?: P): BNLayout<P> {\n return new BNLayout(16, true, property);\n}\n\nexport class WrappedLayout<T, U, P extends string = \"\"> extends Layout<U, P> {\n layout: Layout<T>;\n decoder: (data: T) => U;\n encoder: (src: U) => T;\n\n constructor(layout: Layout<T>, decoder: (data: T) => U, encoder: (src: U) => T, property?: P) {\n //@ts-expect-error type wrong for super()'s type different from extends , but it desn't matter\n super(layout.span, property);\n this.layout = layout;\n this.decoder = decoder;\n this.encoder = encoder;\n }\n\n decode(b: Buffer, offset?: number): U {\n return this.decoder(this.layout.decode(b, offset));\n }\n\n encode(src: U, b: Buffer, offset?: number): number {\n return this.layout.encode(this.encoder(src), b, offset);\n }\n\n getSpan(b: Buffer, offset?: number): number {\n return this.layout.getSpan(b, offset);\n }\n}\n\nexport function publicKey<P extends string = \"\">(property?: P): Layout<PublicKey, P> {\n return new WrappedLayout(\n blob(32),\n (b: Buffer) => new PublicKey(b),\n (key: PublicKey) => key.toBuffer(),\n property,\n );\n}\n\nexport class OptionLayout<T, P> extends Layout<T | null, P> {\n layout: Layout<T>;\n discriminator: Layout<number>;\n\n constructor(layout: Layout<T>, property?: P) {\n //@ts-expect-error type wrong for super()'s type different from extends , but it desn't matter\n super(-1, property);\n this.layout = layout;\n this.discriminator = _u8();\n }\n\n encode(src: T | null, b: Buffer, offset = 0): number {\n if (src === null || src === undefined) {\n return this.discriminator.encode(0, b, offset);\n }\n this.discriminator.encode(1, b, offset);\n return this.layout.encode(src, b, offset + 1) + 1;\n }\n\n decode(b: Buffer, offset = 0): T | null {\n const discriminator = this.discriminator.decode(b, offset);\n if (discriminator === 0) {\n return null;\n } else if (discriminator === 1) {\n return this.layout.decode(b, offset + 1);\n }\n throw new Error(\"Invalid option \" + this.property);\n }\n\n getSpan(b: Buffer, offset = 0): number {\n const discriminator = this.discriminator.decode(b, offset);\n if (discriminator === 0) {\n return 1;\n } else if (discriminator === 1) {\n return this.layout.getSpan(b, offset + 1) + 1;\n }\n throw new Error(\"Invalid option \" + this.property);\n }\n}\n\nexport function option<T, P extends string = \"\">(layout: Layout<T>, property?: P): Layout<T | null, P> {\n return new OptionLayout<T, P>(layout, property);\n}\n\nexport function bool<P extends string = \"\">(property?: P): Layout<boolean, P> {\n return new WrappedLayout(_u8(), decodeBool, encodeBool, property);\n}\n\nexport function decodeBool(value: number): boolean {\n if (value === 0) {\n return false;\n } else if (value === 1) {\n return true;\n }\n throw new Error(\"Invalid bool: \" + value);\n}\n\nexport function encodeBool(value: boolean): number {\n return value ? 1 : 0;\n}\n\nexport function vec<T, P extends string = \"\">(elementLayout: Layout<T>, property?: P): Layout<T[], P> {\n const length = _u32(\"length\");\n const layout: Layout<{ values: T[] }> = struct([\n length,\n seq(elementLayout, _offset(length, -length.span), \"values\"),\n ]) as any; // Something I don't know\n return new WrappedLayout(\n layout,\n ({ values }) => values,\n (values) => ({ values }),\n property,\n );\n}\n\nexport function tagged<T, P extends string = \"\">(tag: BN, layout: Layout<T>, property?: P): Layout<T, P> {\n const wrappedLayout: Layout<{ tag: BN; data: T }> = struct([u64(\"tag\"), layout.replicate(\"data\")]) as any; // Something I don't know\n\n function decodeTag({ tag: receivedTag, data }: { tag: BN; data: T }): T {\n if (!receivedTag.eq(tag)) {\n throw new Error(\"Invalid tag, expected: \" + tag.toString(\"hex\") + \", got: \" + receivedTag.toString(\"hex\"));\n }\n return data;\n }\n\n return new WrappedLayout(wrappedLayout, decodeTag, (data) => ({ tag, data }), property);\n}\n\nexport function vecU8<P extends string = \"\">(property?: P): Layout<Buffer, P> {\n const length = _u32(\"length\");\n const layout: Layout<{ data: Buffer }> = struct([length, blob(_offset(length, -length.span), \"data\")]) as any; // Something I don't know\n return new WrappedLayout(\n layout,\n ({ data }) => data,\n (data) => ({ data }),\n property,\n );\n}\n\nexport function str<P extends string = \"\">(property?: P): Layout<string, P> {\n return new WrappedLayout(\n vecU8(),\n (data) => data.toString(\"utf-8\"),\n (s) => Buffer.from(s, \"utf-8\"),\n property,\n );\n}\n\nexport interface EnumLayout<T, P extends string = \"\"> extends Layout<T, P> {\n registry: Record<string, Layout<any>>;\n}\n\nexport function rustEnum<T, P extends string = \"\">(variants: Layout<any>[], property?: P): EnumLayout<T, P> {\n const unionLayout = _union(_u8(), property);\n variants.forEach((variant, index) => unionLayout.addVariant(index, variant, variant.property));\n return unionLayout as any; // ?why use UnionLayout? This must be a fault\n}\n\nexport function array<T, P extends string = \"\">(\n elementLayout: Layout<T>,\n length: number,\n property?: P,\n): Layout<T[], P> {\n const layout = struct([seq(elementLayout, length, \"values\")]) as any as Layout<{ values: T[] }>; // Something I don't know\n return new WrappedLayout(\n layout,\n ({ values }) => values,\n (values) => ({ values }),\n property,\n );\n}\n\nexport class Structure<T, P, D extends { [key: string]: any; }> extends _Structure<T, P, D> {\n /** @override */\n decode(b: Buffer, offset?: number): D {\n return super.decode(b, offset);\n }\n}\n\nexport function struct<T, P extends string = \"\">(\n fields: T,\n property?: P,\n decodePrefixes?: boolean,\n): T extends Layout<infer Value, infer Property>[]\n ? Structure<\n Value,\n P,\n {\n [K in Exclude<Extract<Property, string>, \"\">]: Extract<T[number], Layout<any, K>> extends Layout<infer V, any>\n ? V\n : any;\n }\n >\n : any {\n //@ts-expect-error this type is not quite satisfied the define, but, never no need to worry about.\n return new Structure(fields, property, decodePrefixes);\n}\n\nexport type GetLayoutSchemaFromStructure<T extends Structure<any, any, any>> = T extends Structure<any, any, infer S>\n ? S\n : any;\nexport type GetStructureFromLayoutSchema<S extends { [key: string]: any; }> = Structure<any, any, S>;\n\nexport class Union<Schema extends { [key: string]: any; }> extends _Union<Schema> {\n encodeInstruction(instruction: any): Buffer {\n const instructionMaxSpan = Math.max(...Object.values(this.registry).map((r) => r.span));\n const b = Buffer.alloc(instructionMaxSpan);\n return b.slice(0, this.encode(instruction, b));\n }\n\n decodeInstruction(instruction: any): Partial<Schema> {\n return this.decode(instruction);\n }\n}\nexport function union<UnionSchema extends { [key: string]: any } = any>(\n discr: any,\n defaultLayout?: any,\n property?: string,\n): Union<UnionSchema> {\n return new Union(discr, defaultLayout, property);\n}\n\nclass Zeros extends Blob {\n decode(b: Buffer, offset: number): Buffer {\n const slice = super.decode(b, offset);\n if (!slice.every((v) => v === 0)) {\n throw new Error(\"nonzero padding bytes\");\n }\n return slice;\n }\n}\n\nexport function zeros(length: number): Zeros {\n return new Zeros(length);\n}\n\nexport function seq<T, P extends string = \"\", AnotherP extends string = \"\">(\n elementLayout: Layout<T, P>,\n count: number | BN | Layout<BN | number, P>,\n property?: AnotherP,\n): Layout<T[], AnotherP> {\n let parsedCount: number;\n const superCount =\n typeof count === \"number\"\n ? count\n : isBN(count)\n ? count.toNumber()\n : new Proxy(count as unknown as Layout<number> /* pretend to be Layout<number> */, {\n get(target, property): any {\n if (!parsedCount) {\n // get count in targetLayout. note that count may be BN\n const countProperty = Reflect.get(target, \"count\");\n\n // let targetLayout's property:count be a number\n parsedCount = isBN(countProperty) ? countProperty.toNumber() : countProperty;\n\n // record the count\n Reflect.set(target, \"count\", parsedCount);\n }\n return Reflect.get(target, property);\n },\n set(target, property, value): any {\n if (property === \"count\") {\n parsedCount = value;\n }\n return Reflect.set(target, property, value);\n },\n });\n\n // @ts-expect-error force type\n return _seq(elementLayout, superCount, property);\n}\n","import {\n bits as _bits,\n BitStructure as _BitStructure,\n blob as _blob,\n Blob as _Blob,\n cstr as _cstr,\n f32 as _f32,\n f32be as _f32be,\n f64 as _f64,\n f64be as _f64be,\n greedy as _greedy,\n Layout as _Layout,\n ns64 as _ns64,\n ns64be as _ns64be,\n nu64 as _nu64,\n nu64be as _nu64be,\n offset as _offset,\n s16 as _s16,\n s16be as _s16be,\n s24 as _s24,\n s24be as _s24be,\n s32 as _s32,\n s32be as _s32be,\n s40 as _s40,\n s40be as _s40be,\n s48 as _s48,\n s48be as _s48be,\n s8 as _s8,\n seq as _seq,\n struct as _struct,\n Structure as _Structure,\n u16 as _u16,\n u16be as _u16be,\n u24 as _u24,\n u24be as _u24be,\n u32 as _u32,\n u32be as _u32be,\n u40 as _u40,\n u40be as _u40be,\n u48 as _u48,\n u48be as _u48be,\n u8 as _u8,\n UInt as _UInt,\n union as _union,\n Union as _Union,\n unionLayoutDiscriminator as _unionLayoutDiscriminator,\n utf8 as _utf8,\n} from \"@solana/buffer-layout\";\n\n//#region ------------------- Layout -------------------\nexport interface Layout<T = any, P = \"\"> {\n span: number;\n property?: P;\n decode(b: Buffer, offset?: number): T;\n encode(src: T, b: Buffer, offset?: number): number;\n getSpan(b: Buffer, offset?: number): number;\n replicate<AP extends string>(name: AP): Layout<T, AP>;\n}\nexport interface LayoutConstructor {\n new <T, P>(): Layout<T, P>; // for class extends syntex\n new <T, P>(span?: T, property?: P): Layout<T, P>;\n readonly prototype: Layout;\n}\nexport const Layout = _Layout as unknown as LayoutConstructor;\n//#endregion\n\n//#region ------------------- Structure -------------------\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport interface Structure<T = any, P = \"\", DecodeSchema extends { [key: string]: any } = any>\n extends Layout<DecodeSchema, P> {\n span: number;\n decode(b: Buffer, offset?: number): DecodeSchema;\n layoutFor<AP extends string>(property: AP): Layout<DecodeSchema[AP]>;\n offsetOf<AP extends string>(property: AP): number;\n}\ninterface StructureConstructor {\n new <T = any, P = \"\", DecodeSchema extends { [key: string]: any } = any>(): Structure<T, P, DecodeSchema>;\n new <T = any, P = \"\", DecodeSchema extends { [key: string]: any } = any>(\n fields: T,\n property?: P,\n decodePrefixes?: boolean,\n ): Structure<T, P, DecodeSchema>;\n}\nexport const Structure = _Structure as unknown as StructureConstructor;\n//#endregion\n\n//#region ------------------- Union -------------------\nexport interface Union<UnionSchema extends { [key: string]: any } = any> extends Layout {\n registry: object;\n decode(b: Buffer, offset?: number): Partial<UnionSchema>;\n addVariant(\n variant: number,\n layout: Structure<any, any, Partial<UnionSchema>> | Layout<any, keyof UnionSchema>,\n property?: string,\n ): any /* TEMP: code in Layout.js 1809 */;\n}\ninterface UnionConstructor {\n new <UnionSchema extends { [key: string]: any } = any>(): Union<UnionSchema>;\n new <UnionSchema extends { [key: string]: any } = any>(\n discr: Layout<any, any>,\n defaultLayout: Layout<any, any>,\n property?: string,\n ): Union<UnionSchema>;\n}\nexport const Union = _Union as unknown as UnionConstructor;\n//#endregion\n\n//#region ------------------- BitStructure -------------------\nexport type BitStructure<T = unknown /* TEMP */, P = \"\"> = Layout<T, P>;\ninterface BitStructureConstructor {\n new (...params: any[]): BitStructure;\n}\nexport const BitStructure = _BitStructure as BitStructureConstructor;\n//#endregion\n\n//#region ------------------- UInt -------------------\nexport type UInt<T = any, P = \"\"> = Layout<T, P>;\ninterface UIntConstructor {\n new <T, P>(span?: T, property?: P): UInt<T, P>;\n}\nexport const UInt = _UInt as UIntConstructor;\n//#endregion\n\n//#region ------------------- Blob -------------------\nexport type Blob<P extends string = \"\"> = Layout<Buffer, P>;\ninterface BlobConstructor {\n new (...params: ConstructorParameters<LayoutConstructor>): Blob;\n}\nexport const Blob = _Blob as unknown as BlobConstructor;\n//#endregion\n\nexport const greedy = _greedy as <P extends string = \"\">(elementSpan?: number, property?: P) => Layout<number, P>;\nexport const u8 = _u8 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u16 = _u16 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u24 = _u24 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u32 = _u32 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u40 = _u40 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u48 = _u48 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const nu64 = _nu64 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u16be = _u16be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u24be = _u24be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u32be = _u32be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u40be = _u40be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u48be = _u48be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const nu64be = _nu64be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s8 = _s8 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s16 = _s16 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s24 = _s24 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s32 = _s32 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s40 = _s40 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s48 = _s48 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const ns64 = _ns64 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s16be = _s16be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s24be = _s24be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s32be = _s32be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s40be = _s40be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s48be = _s48be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const ns64be = _ns64be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const f32 = _f32 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const f32be = _f32be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const f64 = _f64 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const f64be = _f64be as <P extends string = \"\">(property?: P) => Layout<number, P>;\n\nexport const struct = _struct as <T, P extends string = \"\">(\n fields: T,\n property?: P,\n decodePrefixes?: boolean,\n) => T extends Layout<infer Value, infer Property>[]\n ? Structure<\n Value,\n P,\n {\n [K in Exclude<Extract<Property, string>, \"\">]: Extract<T[number], Layout<any, K>> extends Layout<infer V, any>\n ? V\n : any;\n }\n >\n : any;\n\nexport const seq = _seq as unknown as <T, P>(\n elementLayout: Layout<T, string>,\n count: number | Layout<number, string>,\n property?: P,\n) => Layout<T[]>;\nexport const union = _union as <UnionSchema extends { [key: string]: any } = any>(\n discr: Layout<any, any>,\n defaultLayout?: any,\n property?: string,\n) => Union<UnionSchema>;\nexport const unionLayoutDiscriminator = _unionLayoutDiscriminator as <P extends string = \"\">(\n layout: Layout<any, P>,\n property?: P,\n) => any;\nexport const blob = _blob as unknown as <P extends string = \"\">(\n length: number | Layout<number, P>,\n property?: P,\n) => Blob<P>;\nexport const cstr = _cstr as <P extends string = \"\">(property?: P) => Layout<string, P>;\nexport const utf8 = _utf8 as <P extends string = \"\">(maxSpan: number, property?: P) => Layout<string, P>;\nexport const bits = _bits as unknown as <T, P extends string = \"\">(\n word: Layout<T>,\n msb?: boolean,\n property?: P,\n) => BitStructure<T, P>; // TODO: not quite sure\nexport const offset = _offset as unknown as <T, P extends string = \"\">(\n layout: Layout<T, P>,\n offset?: number,\n property?: P,\n) => Layout<T, P>;\n\nexport type GetStructureSchema<T extends Structure> = T extends Structure<any, any, infer S> ? S : unknown;\n","import { publicKey, struct, u32, u64, u8 } from \"../../marshmallow\";\n\nexport const SPL_MINT_LAYOUT = struct([\n u32(\"mintAuthorityOption\"),\n publicKey(\"mintAuthority\"),\n u64(\"supply\"),\n u8(\"decimals\"),\n u8(\"isInitialized\"),\n u32(\"freezeAuthorityOption\"),\n publicKey(\"freezeAuthority\"),\n]);\n\nexport type SplMintLayout = typeof SPL_MINT_LAYOUT;\n","import { Connection, PublicKey } from \"@solana/web3.js\";\nimport { MintLayout, RawMint, TOKEN_PROGRAM_ID, TransferFeeConfigLayout } from \"@solana/spl-token\";\nimport { BigNumberish } from \"@/common/bignumber\";\nimport { Token, TokenAmount } from \"../../module\";\nimport { getSolInfo, getTokenWSol } from \"./constant\";\nimport { TokenInfo } from \"./type\";\nimport { NetworkName } from \"@/config\";\nimport { ApiV3Token } from \"../../api\";\nimport { solToWSol } from \"@/common\";\n\nexport const parseTokenInfo = async ({\n connection,\n mint,\n}: {\n connection: Connection;\n mint: PublicKey | string;\n}): Promise<RawMint | undefined> => {\n const accountData = await connection.getAccountInfo(new PublicKey(mint));\n if (!accountData || accountData.data.length !== MintLayout.span) return;\n const tokenInfo = MintLayout.decode(accountData.data);\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n //@ts-ignore\n return tokenInfo;\n};\n\nexport const toTokenInfo = ({\n mint,\n decimals,\n programId = TOKEN_PROGRAM_ID,\n logoURI = \"\",\n priority = 3,\n}: {\n mint: PublicKey;\n decimals: number;\n programId?: PublicKey | string;\n priority?: number;\n logoURI?: string;\n}): TokenInfo => {\n const pubStr = mint.toBase58().substring(0, 6);\n return {\n address: mint.toBase58(),\n decimals,\n symbol: pubStr,\n logoURI,\n extensions: {},\n chainId: 101,\n programId: programId.toString(),\n name: pubStr,\n tags: [],\n priority,\n };\n};\n\nexport const toToken = (props: Omit<TokenInfo, \"priority\">): Token =>\n new Token({\n mint: props.address,\n decimals: props.decimals,\n symbol: props.symbol,\n name: props.name,\n });\n\nexport const toTokenAmount = ({\n amount,\n isRaw,\n name,\n network,\n ...props\n}: Omit<TokenInfo, \"priority\"> & {\n amount: BigNumberish;\n isRaw?: boolean;\n name?: string;\n network: NetworkName;\n}): TokenAmount =>\n new TokenAmount(\n new Token({\n mint: solToWSol(props.address,network).toBase58(),\n decimals: props.decimals,\n symbol: props.symbol,\n name,\n }),\n amount,\n isRaw,\n name,\n );\n\nexport function solToWSolToken<T extends ApiV3Token | TokenInfo>(token: T, network: NetworkName): T {\n if (token.address === getSolInfo(network).address) return getTokenWSol(network) as T;\n return token;\n}\n\nexport function wSolToSolToken<T extends ApiV3Token | TokenInfo>(token: T, network: NetworkName): T {\n if (token.address === getTokenWSol(network).address) return getSolInfo(network) as T;\n return token;\n}\n\nexport const toApiV3Token = ({\n address,\n programId,\n decimals,\n network,\n ...props\n}: {\n address: string;\n programId: string;\n decimals: number;\n network: NetworkName;\n} & Partial<ApiV3Token>): ApiV3Token => ({\n chainId: 101,\n address: solToWSol(address, network).toBase58(),\n programId,\n logoURI: \"\",\n symbol: \"\",\n name: \"\",\n decimals,\n tags: [],\n extensions: props.extensions || {},\n ...props,\n});\n\nexport const toFeeConfig = (\n config?: ReturnType<typeof TransferFeeConfigLayout.decode> | undefined | null,\n): ApiV3Token[\"extensions\"][\"feeConfig\"] | undefined =>\n config\n ? {\n ...config,\n transferFeeConfigAuthority: config.transferFeeConfigAuthority.toBase58(),\n withdrawWithheldAuthority: config.withdrawWithheldAuthority.toBase58(),\n withheldAmount: config.withheldAmount.toString(),\n olderTransferFee: {\n ...config.olderTransferFee,\n epoch: config.olderTransferFee.epoch.toString(),\n maximumFee: config.olderTransferFee.maximumFee.toString(),\n },\n newerTransferFee: {\n ...config.newerTransferFee,\n epoch: config.newerTransferFee.epoch.toString(),\n maximumFee: config.newerTransferFee.maximumFee.toString(),\n },\n }\n : undefined;\n","import _Big from \"big.js\";\nimport BN from \"bn.js\";\n\nimport { BigNumberish, BN_TEN } from \"../common/bignumber\";\nimport { createLogger, Logger } from \"../common/logger\";\n\nimport { parseBigNumberish, Rounding } from \"../common\";\nimport { Currency } from \"./currency\";\nimport toFormat, { WrappedBig } from \"./formatter\";\nimport { Fraction } from \"./fraction\";\nimport { Token } from \"./token\";\nimport { NetworkName } from \"@/config\";\n\nconst logger = createLogger(\"CobaltX_amount\");\n\nconst Big = toFormat(_Big);\ntype Big = WrappedBig;\n\nexport function splitNumber(num: string, decimals: number): [string, string] {\n let integral = \"0\";\n let fractional = \"0\";\n\n if (num.includes(\".\")) {\n const splited = num.split(\".\");\n if (splited.length === 2) {\n [integral, fractional] = splited;\n fractional = fractional.padEnd(decimals, \"0\");\n } else {\n logger.logWithError(`invalid number string, num: ${num}`);\n }\n } else {\n integral = num;\n }\n\n // fix decimals is 0\n return [integral, fractional.slice(0, decimals) || fractional];\n}\n\nexport class TokenAmount extends Fraction {\n public readonly token: Token;\n protected logger: Logger;\n public constructor(token: Token, amount: BigNumberish, isRaw = true, name?: string) {\n let parsedAmount = new BN(0);\n const multiplier = BN_TEN.pow(new BN(token.decimals));\n\n if (isRaw) {\n parsedAmount = parseBigNumberish(amount);\n } else {\n let integralAmount = new BN(0);\n let fractionalAmount = new BN(0);\n\n // parse fractional string\n if (typeof amount === \"string\" || typeof amount === \"number\" || typeof amount === \"bigint\") {\n const [integral, fractional] = splitNumber(amount.toString(), token.decimals);\n integralAmount = parseBigNumberish(integral);\n fractionalAmount = parseBigNumberish(fractional);\n }\n\n integralAmount = integralAmount.mul(multiplier);\n parsedAmount = integralAmount.add(fractionalAmount);\n }\n\n super(parsedAmount, multiplier);\n this.logger = createLogger(name || \"TokenAmount\");\n this.token = token;\n }\n\n public get raw(): BN {\n return this.numerator;\n }\n public isZero(): boolean {\n return this.raw.isZero();\n }\n public gt(other: TokenAmount): boolean {\n if (!this.token.equals(other.token)) this.logger.logWithError(\"gt token not equals\");\n return this.raw.gt(other.raw);\n }\n\n /**\n * a less than b\n */\n public lt(other: TokenAmount): boolean {\n if (!this.token.equals(other.token)) this.logger.logWithError(\"lt token not equals\");\n return this.raw.lt(other.raw);\n }\n\n public add(other: TokenAmount): TokenAmount {\n if (!this.token.equals(other.token)) this.logger.logWithError(\"add token not equals\");\n return new TokenAmount(this.token, this.raw.add(other.raw));\n }\n\n public subtract(other: TokenAmount): TokenAmount {\n if (!this.token.equals(other.token)) this.logger.logWithError(\"sub token not equals\");\n return new TokenAmount(this.token, this.raw.sub(other.raw));\n }\n\n public toSignificant(\n significantDigits = this.token.decimals,\n format?: object,\n rounding: Rounding = Rounding.ROUND_DOWN,\n ): string {\n return super.toSignificant(significantDigits, format, rounding);\n }\n\n /**\n * To fixed\n *\n * @example\n * ```\n * 1 -> 1.000000000\n * 1.234 -> 1.234000000\n * 1.123456789876543 -> 1.123456789\n * ```\n */\n public toFixed(\n decimalPlaces = this.token.decimals,\n format?: object,\n rounding: Rounding = Rounding.ROUND_DOWN,\n ): string {\n if (decimalPlaces > this.token.decimals) this.logger.logWithError(\"decimals overflow\");\n return super.toFixed(decimalPlaces, format, rounding);\n }\n\n /**\n * To exact\n *\n * @example\n * ```\n * 1 -> 1\n * 1.234 -> 1.234\n * 1.123456789876543 -> 1.123456789\n * ```\n */\n public toExact(format: object = { groupSeparator: \"\" }): string {\n Big.DP = this.token.decimals;\n return new Big(this.numerator.toString()).div(this.denominator.toString()).toFormat(format);\n }\n}\n\nexport class CurrencyAmount extends Fraction {\n public readonly currency: Currency;\n protected logger: Logger;\n\n public constructor(currency: Currency, amount: BigNumberish, isRaw = true, name?: string) {\n let parsedAmount = new BN(0);\n const multiplier = BN_TEN.pow(new BN(currency.decimals));\n\n if (isRaw) {\n parsedAmount = parseBigNumberish(amount);\n } else {\n let integralAmount = new BN(0);\n let fractionalAmount = new BN(0);\n\n // parse fractional string\n if (typeof amount === \"string\" || typeof amount === \"number\" || typeof amount === \"bigint\") {\n const [integral, fractional] = splitNumber(amount.toString(), currency.decimals);\n integralAmount = parseBigNumberish(integral);\n fractionalAmount = parseBigNumberish(fractional);\n }\n\n integralAmount = integralAmount.mul(multiplier);\n parsedAmount = integralAmount.add(fractionalAmount);\n }\n\n super(parsedAmount, multiplier);\n this.logger = createLogger(name || \"TokenAmount\");\n this.currency = currency;\n }\n\n public get raw(): BN {\n return this.numerator;\n }\n\n public isZero(): boolean {\n return this.raw.isZero();\n }\n\n /**\n * a greater than b\n */\n public gt(other: CurrencyAmount): boolean {\n if (!this.currency.equals(other.currency)) this.logger.logWithError(\"gt currency not equals\");\n return this.raw.gt(other.raw);\n }\n\n /**\n * a less than b\n */\n public lt(other: CurrencyAmount): boolean {\n if (!this.currency.equals(other.currency)) this.logger.logWithError(\"lt currency not equals\");\n return this.raw.lt(other.raw);\n }\n\n public add(other: CurrencyAmount): CurrencyAmount {\n if (!this.currency.equals(other.currency)) this.logger.logWithError(\"add currency not equals\");\n return new CurrencyAmount(this.currency, this.raw.add(other.raw));\n }\n\n public sub(other: CurrencyAmount): CurrencyAmount {\n if (!this.currency.equals(other.currency)) this.logger.logWithError(\"sub currency not equals\");\n return new CurrencyAmount(this.currency, this.raw.sub(other.raw));\n }\n\n public toSignificant(\n significantDigits = this.currency.decimals,\n format?: object,\n rounding: Rounding = Rounding.ROUND_DOWN,\n ): string {\n return super.toSignificant(significantDigits, format, rounding);\n }\n\n /**\n * To fixed\n *\n * @example\n * ```\n * 1 -> 1.000000000\n * 1.234 -> 1.234000000\n * 1.123456789876543 -> 1.123456789\n * ```\n */\n public toFixed(\n decimalPlaces = this.currency.decimals,\n format?: object,\n rounding: Rounding = Rounding.ROUND_DOWN,\n ): string {\n if (decimalPlaces > this.currency.decimals) this.logger.logWithError(\"decimals overflow\");\n\n return super.toFixed(decimalPlaces, format, rounding);\n }\n\n /**\n * To exact\n *\n * @example\n * ```\n * 1 -> 1\n * 1.234 -> 1.234\n * 1.123456789876543 -> 1.123456789\n * ```\n */\n public toExact(format: object = { groupSeparator: \"\" }): string {\n Big.DP = this.currency.decimals;\n return new Big(this.numerator.toString()).div(this.denominator.toString()).toFormat(format);\n }\n}\n","import BN from \"bn.js\";\nimport Decimal from \"decimal.js\";\nimport { SplToken, TokenJson } from \"../cobaltx/token/type\";\nimport { ReplaceType } from \"../cobaltx/type\";\nimport { CurrencyAmount, TokenAmount } from \"../module/amount\";\nimport { Currency } from \"../module/currency\";\nimport { Fraction } from \"../module/fraction\";\nimport { Percent } from \"../module/percent\";\nimport { Price } from \"../module/price\";\nimport { Token } from \"../module/token\";\nimport { parseBigNumberish } from \"./constant\";\nimport { mul } from \"./fractionUtil\";\nimport { notInnerObject } from \"./utility\";\n\nexport const BN_ZERO = new BN(0);\nexport const BN_ONE = new BN(1);\nexport const BN_TWO = new BN(2);\nexport const BN_THREE = new BN(3);\nexport const BN_FIVE = new BN(5);\nexport const BN_TEN = new BN(10);\nexport const BN_100 = new BN(100);\nexport const BN_1000 = new BN(1000);\nexport const BN_10000 = new BN(10000);\nexport type BigNumberish = BN | string | number | bigint;\nexport type Numberish = number | string | bigint | Fraction | BN;\n\nexport function tenExponential(shift: BigNumberish): BN {\n return BN_TEN.pow(parseBigNumberish(shift));\n}\n\n/**\n *\n * @example\n * getIntInfo(0.34) => { numerator: '34', denominator: '100'}\n * getIntInfo('0.34') //=> { numerator: '34', denominator: '100'}\n */\nexport function parseNumberInfo(n: Numberish | undefined): {\n denominator: string;\n numerator: string;\n sign?: string;\n int?: string;\n dec?: string;\n} {\n if (n === undefined) return { denominator: \"1\", numerator: \"0\" };\n if (n instanceof BN) {\n return { numerator: n.toString(), denominator: \"1\" };\n }\n\n if (n instanceof Fraction) {\n return { denominator: n.denominator.toString(), numerator: n.numerator.toString() };\n }\n\n const s = String(n);\n const [, sign = \"\", int = \"\", dec = \"\"] = s.replace(\",\", \"\").match(/(-?)(\\d*)\\.?(\\d*)/) ?? [];\n const denominator = \"1\" + \"0\".repeat(dec.length);\n const numerator = sign + (int === \"0\" ? \"\" : int) + dec || \"0\";\n return { denominator, numerator, sign, int, dec };\n}\n\n// round up\nexport function divCeil(a: BN, b: BN): BN {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const dm = a.divmod(b);\n\n // Fast case - exact division\n if (dm.mod.isZero()) return dm.div;\n\n // Round up\n return dm.div.isNeg() ? dm.div.isubn(1) : dm.div.iaddn(1);\n}\n\nexport function shakeFractionDecimal(n: Fraction): string {\n const [, sign = \"\", int = \"\"] = n.toFixed(2).match(/(-?)(\\d*)\\.?(\\d*)/) ?? [];\n return `${sign}${int}`;\n}\n\nexport function toBN(n: Numberish, decimal: BigNumberish = 0): BN {\n if (n instanceof BN) return n;\n return new BN(shakeFractionDecimal(toFraction(n).mul(BN_TEN.pow(new BN(String(decimal))))));\n}\n\nexport function toFraction(value: Numberish): Fraction {\n // to complete math format(may have decimal), not int\n if (value instanceof Percent) return new Fraction(value.numerator, value.denominator);\n\n if (value instanceof Price) return value.adjusted;\n\n // to complete math format(may have decimal), not BN\n if (value instanceof TokenAmount)\n try {\n return toFraction(value.toExact());\n } catch {\n return new Fraction(BN_ZERO);\n }\n\n // do not ideal with other fraction value\n if (value instanceof Fraction) return value;\n\n // wrap to Fraction\n const n = String(value);\n const details = parseNumberInfo(n);\n return new Fraction(details.numerator, details.denominator);\n}\n\n/**\n * @example\n * toPercent(3.14) // => Percent { 314.00% }\n * toPercent(3.14, { alreadyDecimaled: true }) // => Percent {3.14%}\n */\nexport function toPercent(\n n: Numberish,\n options?: { /* usually used for backend data */ alreadyDecimaled?: boolean },\n): Percent {\n const { numerator, denominator } = parseNumberInfo(n);\n return new Percent(new BN(numerator), new BN(denominator).mul(options?.alreadyDecimaled ? new BN(100) : new BN(1)));\n}\n\nexport function toTokenPrice(params: {\n token: TokenJson | Token | SplToken;\n numberPrice: Numberish;\n decimalDone?: boolean;\n}): Price {\n const { token, numberPrice, decimalDone } = params;\n const usdCurrency = new Token({ mint: \"\", decimals: 6, symbol: \"usd\", name: \"usd\", skipMint: true });\n const { numerator, denominator } = parseNumberInfo(numberPrice);\n const parsedNumerator = decimalDone ? new BN(numerator).mul(BN_TEN.pow(new BN(token.decimals))) : numerator;\n const parsedDenominator = new BN(denominator).mul(BN_TEN.pow(new BN(usdCurrency.decimals)));\n\n return new Price({\n baseToken: usdCurrency,\n denominator: parsedDenominator.toString(),\n quoteToken: new Token({ ...token, skipMint: true, mint: \"\" }),\n numerator: parsedNumerator.toString(),\n });\n}\n\nexport function toUsdCurrency(amount: Numberish): CurrencyAmount {\n const usdCurrency = new Currency({ decimals: 6, symbol: \"usd\", name: \"usd\" });\n const amountBigNumber = toBN