@allbridge/bridge-core-sdk 3.27.0 → 3.27.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/services/models/sui/_framework/util.ts", "../../src/services/models/sui/bridge/index.ts", "../../src/services/models/sui/cctp-bridge/index.ts", "../../src/services/models/sui/utils/index.ts", "../../src/configs/mainnet.ts", "../../src/services/bridge/index.ts", "../../src/exceptions/exceptions.ts", "../../src/chains/chain.enums.ts", "../../src/chains/index.ts", "../../src/client/core-api/core-api.model.ts", "../../src/utils/utils.ts", "../../src/services/bridge/evm/index.ts", "../../src/services/models/abi/Bridge.ts", "../../src/services/models/abi/CctpBridge.ts", "../../src/services/models/abi/OftBridge.ts", "../../src/services/bridge/get-cctp-sol-token-recipient-address.ts", "../../src/services/utils/sol/accounts.ts", "../../src/services/utils/sol/anchor-provider.ts", "../../src/services/bridge/utils.ts", "../../src/utils/calculation/index.ts", "../../src/services/bridge/models/bridge.ts", "../../src/services/bridge/raw-bridge-transaction-builder.ts", "../../src/services/bridge/sol/index.ts", "../../src/services/models/sol/types/bridge.ts", "../../src/services/models/sol/types/cctp_bridge.ts", "../../src/services/utils/sol/index.ts", "../../src/services/utils/sol/compute-budget.ts", "../../src/utils/sol/utils.ts", "../../src/services/models/sol/index.ts", "../../src/services/bridge/sol/jupiter.ts", "../../src/services/bridge/srb/index.ts", "../../src/services/models/srb/bridge-contract.ts", "../../src/services/bridge/sui/index.ts", "../../src/services/models/sui/bridge/bridge-interface/functions.ts", "../../src/services/models/sui/cctp-bridge/cctp-bridge-interface/functions.ts", "../../src/services/models/sui/utils/bytes32/functions.ts", "../../src/services/models/sui/_framework/reified.ts", "../../src/services/models/sui/_framework/vector.ts", "../../src/services/models/sui/_dependencies/source/0x1/ascii/structs.ts", "../../src/services/models/sui/_dependencies/source/0x1/index.ts", "../../src/services/models/sui/_dependencies/source/0x1/string/structs.ts", "../../src/services/models/sui/sui/object/structs.ts", "../../src/services/models/sui/sui/index.ts", "../../src/services/utils/sui/paginated.ts", "../../src/services/bridge/trx/index.ts", "../../src/services/utils/index.ts", "../../src/services/utils/trx/index.ts", "../../src/services/liquidity-pool/index.ts", "../../src/services/utils/calculation/index.ts", "../../src/services/liquidity-pool/evm/index.ts", "../../src/services/models/abi/Pool.ts", "../../src/services/liquidity-pool/models/pool.model.ts", "../../src/services/liquidity-pool/models/pool.ts", "../../src/services/liquidity-pool/raw-pool-transaction-builder.ts", "../../src/services/liquidity-pool/sol/index.ts", "../../src/services/liquidity-pool/srb/index.ts", "../../src/services/models/srb/pool-contract.ts", "../../src/services/models/srb/utils.ts", "../../src/services/liquidity-pool/sui/index.ts", "../../src/services/models/sui/bridge/pool/structs.ts", "../../src/services/models/sui/sui/balance/structs.ts", "../../src/services/models/sui/bridge/pool-rewards/structs.ts", "../../src/services/models/sui/bridge/pool-state/structs.ts", "../../src/services/models/sui/bridge/user-deposit/structs.ts", "../../src/services/utils/sui/coins.ts", "../../src/services/utils/sui/view.ts", "../../src/services/liquidity-pool/trx/index.ts", "../../src/services/yield/index.ts", "../../src/services/models/abi/PortfolioToken.ts", "../../src/services/yield/models/yield.ts", "../../src/services/yield/evm/index.ts", "../../src/services/yield/raw-yield-transaction-builder.ts", "../../src/services/yield/trx/index.ts", "../../src/services/yield/validations.ts", "../../src/utils/calculation/swap-and-bridge-fee-calc.ts", "../../src/utils/calculation/swap-and-bridge-details.ts", "../../src/client/core-api/api-client.ts", "../../src/version.ts", "../../src/client/core-api/core-api-mapper.ts", "../../src/client/core-api/api-client-caching.ts", "../../src/client/core-api/core-client-base.ts", "../../src/client/core-api/core-client-filtered.ts", "../../src/client/core-api/core-client-pool-info-caching.ts", "../../src/services/token/index.ts", "../../src/services/models/abi/ERC20.ts", "../../src/services/token/models/token.ts", "../../src/services/token/evm/index.ts", "../../src/services/token/sol/index.ts", "../../src/services/token/srb/index.ts", "../../src/services/token/sui/index.ts", "../../src/services/token/trx/index.ts", "../../src/utils/evm/index.ts", "../../src/utils/sol/index.ts", "../../src/utils/srb/index.ts", "../../src/services/models/srb/token-contract.ts", "../../src/utils/sui/index.ts", "../../src/utils/index.ts", "../../src/models/index.ts", "../../src/services/index.ts", "../../src/index.ts"],
4
- "sourcesContent": ["// @ts-nocheck\n\nimport { bcs, BcsType } from \"@mysten/sui/bcs\";\nimport {\n Transaction,\n TransactionArgument,\n TransactionObjectArgument,\n TransactionObjectInput,\n} from \"@mysten/sui/transactions\";\n\nexport interface FieldsWithTypes {\n fields: Record<string, any>;\n type: string;\n}\n\nexport type ObjectId = string;\n\nexport type PureArg = bigint | string | number | boolean | null | TransactionArgument | Array<PureArg>;\nexport type GenericArg =\n | TransactionObjectInput\n | PureArg\n | Array<TransactionObjectInput>\n | Array<PureArg>\n | Array<GenericArg>;\n\nexport function splitGenericParameters(str: string, genericSeparators: [string, string] = [\"<\", \">\"]) {\n const [left, right] = genericSeparators;\n const tok: string[] = [];\n let word = \"\";\n let nestedAngleBrackets = 0;\n\n for (let i = 0; i < str.length; i++) {\n const char = str[i];\n if (char === left) {\n nestedAngleBrackets++;\n }\n if (char === right) {\n nestedAngleBrackets--;\n }\n if (nestedAngleBrackets === 0 && char === \",\") {\n tok.push(word.trim());\n word = \"\";\n continue;\n }\n word += char;\n }\n\n tok.push(word.trim());\n\n return tok;\n}\n\nexport function parseTypeName(name: string): {\n typeName: string;\n typeArgs: string[];\n} {\n if (typeof name !== \"string\") {\n throw new Error(`Illegal type passed as a name of the type: ${name}`);\n }\n\n const [left, right] = [\"<\", \">\"];\n\n const l_bound = name.indexOf(left);\n const r_bound = Array.from(name).reverse().indexOf(right);\n\n // if there are no generics - exit gracefully.\n if (l_bound === -1 && r_bound === -1) {\n return { typeName: name, typeArgs: [] };\n }\n\n // if one of the bounds is not defined - throw an Error.\n if (l_bound === -1 || r_bound === -1) {\n throw new Error(`Unclosed generic in name '${name}'`);\n }\n\n const typeName = name.slice(0, l_bound);\n const typeArgs = splitGenericParameters(name.slice(l_bound + 1, name.length - r_bound - 1), [left, right]);\n\n return { typeName, typeArgs };\n}\n\nexport function isTransactionArgument(arg: GenericArg): arg is TransactionArgument {\n if (!arg || typeof arg !== \"object\" || Array.isArray(arg)) {\n return false;\n }\n\n return \"GasCoin\" in arg || \"Input\" in arg || \"Result\" in arg || \"NestedResult\" in arg;\n}\n\nexport function obj(tx: Transaction, arg: TransactionObjectInput) {\n return isTransactionArgument(arg) ? arg : tx.object(arg);\n}\n\nexport function pure(tx: Transaction, arg: PureArg, type: string): TransactionArgument {\n if (isTransactionArgument(arg)) {\n return obj(tx, arg);\n }\n\n function getBcsForType(type: string): BcsType<any> {\n const { typeName, typeArgs } = parseTypeName(type);\n switch (typeName) {\n case \"bool\":\n return bcs.Bool;\n case \"u8\":\n return bcs.U8;\n case \"u16\":\n return bcs.U16;\n case \"u32\":\n return bcs.U32;\n case \"u64\":\n return bcs.U64;\n case \"u128\":\n return bcs.U128;\n case \"u256\":\n return bcs.U256;\n case \"address\":\n return bcs.Address;\n case \"0x1::string::String\":\n case \"0x1::ascii::String\":\n return bcs.String;\n case \"0x2::object::ID\":\n return bcs.Address;\n case \"0x1::option::Option\":\n return bcs.option(getBcsForType(typeArgs[0]));\n case \"vector\":\n return bcs.vector(getBcsForType(typeArgs[0]));\n default:\n throw new Error(`invalid primitive type ${type}`);\n }\n }\n\n function hasUndefinedOrNull(items: PureArg[]) {\n for (const item of items) {\n if (typeof item === \"undefined\" || item === null) {\n return true;\n }\n\n if (Array.isArray(item)) {\n return hasUndefinedOrNull(item);\n }\n }\n\n return false;\n }\n\n function consistsOnlyOfPrimitiveValues(items: PureArg[]) {\n for (const item of items) {\n if (!Array.isArray(item)) {\n if (item === null) {\n continue;\n }\n switch (typeof item) {\n case \"string\":\n case \"number\":\n case \"bigint\":\n case \"boolean\":\n continue;\n default:\n return false;\n }\n }\n\n return consistsOnlyOfPrimitiveValues(item);\n }\n\n return true;\n }\n\n function hasPrimitiveValues(items: PureArg[]) {\n for (const item of items) {\n if (!Array.isArray(item)) {\n switch (typeof item) {\n case \"string\":\n case \"number\":\n case \"bigint\":\n case \"boolean\":\n return true;\n default:\n continue;\n }\n }\n\n return hasPrimitiveValues(item);\n }\n\n return false;\n }\n\n // handle some cases when TransactionArgument is nested within a vector or option\n const { typeName, typeArgs } = parseTypeName(type);\n switch (typeName) {\n case \"0x1::option::Option\":\n if (arg === null) {\n return tx.pure.option(\"bool\", null); // 'bool' is arbitrary\n }\n if (consistsOnlyOfPrimitiveValues([arg])) {\n return tx.pure(getBcsForType(type).serialize(arg));\n }\n if (hasPrimitiveValues([arg])) {\n throw new Error(\"mixing primitive and TransactionArgument values is not supported\");\n }\n\n // wrap it with some\n return tx.moveCall({\n target: `0x1::option::some`,\n typeArguments: [typeArgs[0]],\n arguments: [pure(tx, arg, typeArgs[0])],\n });\n case \"vector\":\n if (!Array.isArray(arg)) {\n throw new Error(\"expected an array for vector type\");\n }\n if (arg.length === 0) {\n return tx.pure(bcs.vector(bcs.Bool).serialize([])); // bcs.Bool is arbitrary\n }\n if (hasUndefinedOrNull(arg)) {\n throw new Error(\"the provided array contains undefined or null values\");\n }\n if (consistsOnlyOfPrimitiveValues(arg)) {\n return tx.pure(getBcsForType(type).serialize(arg));\n }\n if (hasPrimitiveValues(arg)) {\n throw new Error(\"mixing primitive and TransactionArgument values is not supported\");\n }\n\n return tx.makeMoveVec({\n type: typeArgs[0],\n elements: arg as Array<TransactionObjectArgument>,\n });\n default:\n return tx.pure(getBcsForType(type).serialize(arg));\n }\n}\n\nexport function option(tx: Transaction, type: string, arg: GenericArg | null) {\n if (isTransactionArgument(arg)) {\n return arg;\n }\n\n if (typeArgIsPure(type)) {\n return pure(tx, arg as PureArg | TransactionArgument, `0x1::option::Option<${type}>`);\n }\n\n if (arg === null) {\n return tx.moveCall({\n target: `0x1::option::none`,\n typeArguments: [type],\n arguments: [],\n });\n }\n\n // wrap it with some\n const val = generic(tx, type, arg);\n return tx.moveCall({\n target: `0x1::option::some`,\n typeArguments: [type],\n arguments: [val],\n });\n}\n\nexport function generic(tx: Transaction, type: string, arg: GenericArg) {\n if (typeArgIsPure(type)) {\n return pure(tx, arg as PureArg | TransactionArgument, type);\n } else {\n const { typeName, typeArgs } = parseTypeName(type);\n if (typeName === \"vector\" && Array.isArray(arg)) {\n const itemType = typeArgs[0];\n\n return tx.makeMoveVec({\n type: itemType,\n elements: arg.map((item) => obj(tx, item as TransactionObjectInput)) as Array<TransactionObjectArgument>,\n });\n } else {\n return obj(tx, arg as TransactionObjectInput);\n }\n }\n}\n\nexport function vector(tx: Transaction, itemType: string, items: Array<GenericArg> | TransactionArgument) {\n if (typeof items === \"function\") {\n throw new Error(\"Transaction plugins are not supported\");\n }\n\n if (typeArgIsPure(itemType)) {\n return pure(tx, items as PureArg, `vector<${itemType}>`);\n } else if (isTransactionArgument(items)) {\n return items;\n } else {\n const { typeName: itemTypeName, typeArgs: itemTypeArgs } = parseTypeName(itemType);\n if (itemTypeName === \"0x1::option::Option\") {\n const elements = items.map((item) => option(tx, itemTypeArgs[0], item)) as Array<TransactionObjectArgument>;\n return tx.makeMoveVec({\n type: itemType,\n elements,\n });\n }\n\n return tx.makeMoveVec({\n type: itemType,\n elements: items as Array<TransactionObjectArgument>,\n });\n }\n}\n\nexport function typeArgIsPure(type: string): boolean {\n const { typeName, typeArgs } = parseTypeName(type);\n switch (typeName) {\n case \"bool\":\n case \"u8\":\n case \"u16\":\n case \"u32\":\n case \"u64\":\n case \"u128\":\n case \"u256\":\n case \"address\":\n case \"signer\":\n return true;\n case \"vector\":\n return typeArgIsPure(typeArgs[0]);\n case \"0x1::string::String\":\n case \"0x1::ascii::String\":\n case \"0x2::object::ID\":\n return true;\n case \"0x1::option::Option\":\n return typeArgIsPure(typeArgs[0]);\n default:\n return false;\n }\n}\n\nexport function compressSuiAddress(addr: string): string {\n // remove leading zeros\n const stripped = addr.split(\"0x\").join(\"\");\n for (let i = 0; i < stripped.length; i++) {\n if (stripped[i] !== \"0\") {\n return `0x${stripped.substring(i)}`;\n }\n }\n return \"0x0\";\n}\n\n// Recursively removes leading zeros from a type.\n// e.g. `0x00000002::module::Name<0x00001::a::C>` -> `0x2::module::Name<0x1::a::C>`\nexport function compressSuiType(type: string): string {\n const { typeName, typeArgs } = parseTypeName(type);\n switch (typeName) {\n case \"bool\":\n case \"u8\":\n case \"u16\":\n case \"u32\":\n case \"u64\":\n case \"u128\":\n case \"u256\":\n case \"address\":\n case \"signer\":\n return typeName;\n case \"vector\":\n return `vector<${compressSuiType(typeArgs[0])}>`;\n default: {\n const tok = typeName.split(\"::\");\n tok[0] = compressSuiAddress(tok[0]);\n const compressedName = tok.join(\"::\");\n if (typeArgs.length > 0) {\n return `${compressedName}<${typeArgs.map((typeArg) => compressSuiType(typeArg)).join(\",\")}>`;\n } else {\n return compressedName;\n }\n }\n }\n}\n\nexport function composeSuiType(typeName: string, ...typeArgs: string[]): string {\n if (typeArgs.length > 0) {\n return `${typeName}<${typeArgs.join(\", \")}>`;\n } else {\n return typeName;\n }\n}\n", "// @ts-nocheck\nimport { compressSuiType } from \"../_framework/util\";\n\nclass PackageAddress {\n private static $PACKAGE_ID = \"\";\n private static $PUBLISHED_AT = \"\";\n private static $PKG_V = [];\n\n get PACKAGE_ID() {\n return compressSuiType(PackageAddress.$PACKAGE_ID);\n }\n\n get PUBLISHED_AT() {\n return compressSuiType(PackageAddress.$PUBLISHED_AT);\n }\n\n get PKG_V1() {\n return compressSuiType(PackageAddress.$PKG_V[1]);\n }\n\n setPackageId(address: string): void {\n PackageAddress.$PACKAGE_ID = address;\n }\n\n setPublishedAt(address: string): void {\n PackageAddress.$PUBLISHED_AT = address;\n }\n\n setPkgV(v: number, address: string): void {\n PackageAddress.$PKG_V[v] = address;\n }\n\n setAddress(address: string, pkgV1?: string) {\n PackageAddress.$PACKAGE_ID = address;\n PackageAddress.$PUBLISHED_AT = address;\n PackageAddress.$PKG_V[1] = pkgV1 || address;\n }\n}\n\nconst packageAddress = new PackageAddress();\nexport = packageAddress;\n", "// @ts-nocheck\nimport { compressSuiType } from \"../_framework/util\";\n\nclass PackageAddress {\n private static $PACKAGE_ID = \"\";\n private static $PUBLISHED_AT = \"\";\n private static $PKG_V = [];\n get PACKAGE_ID() {\n return compressSuiType(PackageAddress.$PACKAGE_ID);\n }\n get PUBLISHED_AT() {\n return compressSuiType(PackageAddress.$PUBLISHED_AT);\n }\n get PKG_V1() {\n return compressSuiType(PackageAddress.$PKG_V[1]);\n }\n setPackageId(address: string): void {\n PackageAddress.$PACKAGE_ID = address;\n }\n setPublishedAt(address: string): void {\n PackageAddress.$PUBLISHED_AT = address;\n }\n setPkgV(v: number, address: string): void {\n PackageAddress.$PKG_V[v] = address;\n }\n setAddress(address: string, pkgV1?: string) {\n PackageAddress.$PACKAGE_ID = address;\n PackageAddress.$PUBLISHED_AT = address;\n PackageAddress.$PKG_V[1] = pkgV1 || address;\n }\n}\nconst packageAddress = new PackageAddress();\nexport = packageAddress;\n", "// @ts-nocheck\nimport { compressSuiType } from \"../_framework/util\";\n\nclass PackageAddress {\n private static $PACKAGE_ID = \"\";\n private static $PUBLISHED_AT = \"\";\n private static $PKG_V = [];\n get PACKAGE_ID() {\n return compressSuiType(PackageAddress.$PACKAGE_ID);\n }\n get PUBLISHED_AT() {\n return compressSuiType(PackageAddress.$PUBLISHED_AT);\n }\n get PKG_V1() {\n return compressSuiType(PackageAddress.$PKG_V[1]);\n }\n setPackageId(address: string): void {\n PackageAddress.$PACKAGE_ID = address;\n }\n setPublishedAt(address: string): void {\n PackageAddress.$PUBLISHED_AT = address;\n }\n setPkgV(v: number, address: string): void {\n PackageAddress.$PKG_V[v] = address;\n }\n setAddress(address: string, pkgV1?: string) {\n PackageAddress.$PACKAGE_ID = address;\n PackageAddress.$PUBLISHED_AT = address;\n PackageAddress.$PKG_V[1] = pkgV1 || address;\n }\n}\nconst packageAddress = new PackageAddress();\nexport = packageAddress;\n", "import { AllbridgeCoreSdkOptions, NodeRpcUrls, NodeUrlsConfig } from \"../index\";\n\nexport const mainnet: AllbridgeCoreSdkOptions = {\n coreApiUrl: \"https://core.api.allbridgecoreapi.net\",\n coreApiQueryParams: {},\n coreApiHeaders: {},\n jupiterUrl: \"https://lite-api.jup.ag/swap/v1\",\n wormholeMessengerProgramId: \"worm2ZoG2kUd4vFXhvjh93UUH596ayRfgQ2MgjNMTth\",\n solanaLookUpTable: \"2JcBAEVnAwVo4u8d61iqgHPrzZuugur7cVTjWubsVLHj\",\n sorobanNetworkPassphrase: \"Public Global Stellar Network ; September 2015\",\n tronJsonRpc: \"https://api.trongrid.io/jsonrpc\",\n cctpParams: {\n cctpTransmitterProgramId: \"CCTPmbSD7gX1bxKPAmg77w8oFzNFpaQiQUWD43TKaecd\",\n cctpTokenMessengerMinter: \"CCTPiPYPc6AsJuwueEnWgSgucamXDZwBd53dQ11YiKX3\",\n cctpDomains: { ETH: 0, AVA: 1, OPT: 2, ARB: 3, SOL: 5, BAS: 6, POL: 7, SUI: 8 },\n },\n cachePoolInfoChainSec: 20,\n};\n\n/**\n * This is default rpc urls for Solana and Tron,<p/> Override and use your own for proper and stable work\n * @deprecated use {@link nodeRpcUrlsDefault}\n */\nexport const nodeUrlsDefault: NodeUrlsConfig = {\n solanaRpcUrl: \"https://api.mainnet-beta.solana.com\",\n tronRpcUrl: \"https://api.trongrid.io\",\n};\n\n/**\n * This is default rpc urls for Solana and Tron,<p/> Override and use your own for proper and stable work\n */\nexport const nodeRpcUrlsDefault: NodeRpcUrls = {\n SOL: \"https://api.mainnet-beta.solana.com\",\n TRX: \"https://api.trongrid.io\",\n SRB: \"https://rpc.stellar.org:443\",\n STLR: \"https://horizon.stellar.org\",\n SUI: \"https://fullnode.mainnet.sui.io\",\n};\n", "import { TronWeb } from \"tronweb\";\nimport { Web3 } from \"web3\";\nimport { NodeRpcUrlsConfig } from \"..\";\nimport { Chains } from \"../../chains\";\nimport { Messenger } from \"../../client/core-api/core-api.model\";\nimport { AllbridgeCoreClient } from \"../../client/core-api/core-client-base\";\nimport { CCTPDoesNotSupportedError, OFTDoesNotSupportedError } from \"../../exceptions\";\nimport { AllbridgeCoreSdkOptions, ChainSymbol, ChainType, EssentialWeb3 } from \"../../index\";\nimport { TokenWithChainDetails } from \"../../tokens-info\";\nimport { validateAmountDecimals, validateAmountGtZero } from \"../../utils/utils\";\nimport { Provider, TransactionResponse } from \"../models\";\nimport { TokenService } from \"../token\";\nimport { EvmBridgeService } from \"./evm\";\nimport { ApproveParams, ChainBridgeService, CheckAllowanceParams, GetAllowanceParams, SendParams } from \"./models\";\nimport { DefaultRawBridgeTransactionBuilder, RawBridgeTransactionBuilder } from \"./raw-bridge-transaction-builder\";\nimport { SolanaBridgeService } from \"./sol\";\nimport { SrbBridgeService } from \"./srb\";\nimport { SuiBridgeService } from \"./sui\";\nimport { TronBridgeService } from \"./trx\";\n\nexport interface BridgeService {\n rawTxBuilder: RawBridgeTransactionBuilder;\n\n /**\n * Get amount of tokens approved to be sent by the bridge\n * @param provider - will be used to access the network\n * @param params See {@link GetAllowanceParams}\n * @returns the amount of approved tokens\n */\n getAllowance(provider: Provider, params: GetAllowanceParams): Promise<string>;\n\n /**\n * Get amount of tokens approved to be sent by the bridge\n * @param params See {@link GetAllowanceParams}\n * @returns the amount of approved tokens\n */\n getAllowance(params: GetAllowanceParams): Promise<string>;\n\n /**\n * Check if the amount of approved tokens is enough to make a transfer\n * @param provider - will be used to access the network\n * @param params See {@link CheckAllowanceParams}\n * @returns true if the amount of approved tokens is enough to make a transfer\n */\n checkAllowance(provider: Provider, params: CheckAllowanceParams): Promise<boolean>;\n\n /**\n * Check if the amount of approved tokens is enough to make a transfer\n * @param params See {@link CheckAllowanceParams}\n * @returns true if the amount of approved tokens is enough to make a transfer\n */\n checkAllowance(params: CheckAllowanceParams): Promise<boolean>;\n\n /**\n * @deprecated Use {@link rawTxBuilder}.{@link RawBridgeTransactionBuilder.approve}<p>\n * Approve tokens usage by another address on chains\n * <p>\n * For ETH/USDT: due to specificity of the USDT contract:<br/>\n * If the current allowance is not 0, this function will perform an additional transaction to set allowance to 0 before setting the new allowance value.\n * @param provider - will be used to access the network\n * @param approveData\n */\n approve(provider: Provider, approveData: ApproveParams): Promise<TransactionResponse>;\n\n /**\n * @deprecated Use {@link rawTxBuilder}.{@link RawBridgeTransactionBuilder.send}<p>\n * Send tokens through the ChainBridgeService\n * @param provider - will be used to access the network\n * @param params\n */\n send(provider: Provider, params: SendParams): Promise<TransactionResponse>;\n}\n\nexport class DefaultBridgeService implements BridgeService {\n public rawTxBuilder: RawBridgeTransactionBuilder;\n\n constructor(\n private api: AllbridgeCoreClient,\n private nodeRpcUrlsConfig: NodeRpcUrlsConfig,\n private params: AllbridgeCoreSdkOptions,\n private tokenService: TokenService\n ) {\n this.rawTxBuilder = new DefaultRawBridgeTransactionBuilder(api, nodeRpcUrlsConfig, params, tokenService);\n }\n\n async getAllowance(a: Provider | GetAllowanceParams, b?: GetAllowanceParams): Promise<string> {\n let provider: Provider | undefined;\n let params: GetAllowanceParams;\n if (b) {\n provider = a as Provider;\n params = b;\n } else {\n params = a as GetAllowanceParams;\n }\n const spender = getSpender(params.token, params.messenger);\n return await this.tokenService.getAllowance({ ...params, spender }, provider);\n }\n\n async checkAllowance(a: Provider | CheckAllowanceParams, b?: CheckAllowanceParams): Promise<boolean> {\n let provider: Provider | undefined;\n let params: CheckAllowanceParams;\n if (b) {\n provider = a as Provider;\n params = b;\n } else {\n params = a as CheckAllowanceParams;\n }\n const spender = getSpender(params.token, params.messenger);\n return this.tokenService.checkAllowance({ ...params, spender }, provider);\n }\n\n async approve(provider: Provider, approveData: ApproveParams): Promise<TransactionResponse> {\n const spender = getSpender(approveData.token, approveData.messenger);\n return this.tokenService.approve(provider, { ...approveData, spender });\n }\n\n async send(provider: Provider, params: SendParams): Promise<TransactionResponse> {\n validateAmountGtZero(params.amount);\n validateAmountDecimals(\"amount\", params.amount, params.sourceToken.decimals);\n return getChainBridgeService(\n params.sourceToken.chainSymbol,\n this.api,\n this.nodeRpcUrlsConfig,\n this.params,\n provider\n ).send(params);\n }\n}\n\nexport function getSpender(token: TokenWithChainDetails, messenger: Messenger = Messenger.ALLBRIDGE): string {\n switch (messenger) {\n case Messenger.CCTP:\n if (token.cctpAddress) {\n return token.cctpAddress;\n } else {\n throw new CCTPDoesNotSupportedError(\"Such route does not support CCTP protocol\");\n }\n case Messenger.CCTP_V2:\n if (token.cctpV2Address) {\n return token.cctpV2Address;\n } else {\n throw new CCTPDoesNotSupportedError(\"Such route does not support CCTP V2 protocol\");\n }\n case Messenger.OFT:\n if (token.oftBridgeAddress) {\n return token.oftBridgeAddress;\n } else {\n throw new OFTDoesNotSupportedError(\"Such route does not support OFT protocol\");\n }\n case Messenger.ALLBRIDGE:\n case Messenger.WORMHOLE:\n return token.bridgeAddress;\n }\n}\n\nexport function getChainBridgeService(\n chainSymbol: string,\n api: AllbridgeCoreClient,\n nodeRpcUrlsConfig: NodeRpcUrlsConfig,\n params: AllbridgeCoreSdkOptions,\n provider?: Provider\n): ChainBridgeService {\n switch (Chains.getChainProperty(chainSymbol).chainType) {\n case ChainType.EVM: {\n if (provider) {\n return new EvmBridgeService(provider as EssentialWeb3, api, nodeRpcUrlsConfig);\n } else {\n const nodeRpcUrl = nodeRpcUrlsConfig.getNodeRpcUrl(chainSymbol);\n return new EvmBridgeService(new Web3(nodeRpcUrl), api, nodeRpcUrlsConfig);\n }\n }\n case ChainType.TRX: {\n if (provider) {\n return new TronBridgeService(provider as TronWeb, api);\n } else {\n const nodeRpcUrl = nodeRpcUrlsConfig.getNodeRpcUrl(chainSymbol);\n return new TronBridgeService(\n new TronWeb({\n fullHost: nodeRpcUrl,\n solidityNode: nodeRpcUrl,\n eventServer: nodeRpcUrl,\n }),\n api\n );\n }\n }\n case ChainType.SOLANA: {\n return new SolanaBridgeService(\n nodeRpcUrlsConfig.getNodeRpcUrl(ChainSymbol.SOL),\n {\n wormholeMessengerProgramId: params.wormholeMessengerProgramId,\n solanaLookUpTable: params.solanaLookUpTable,\n cctpParams: params.cctpParams,\n jupiterParams: {\n jupiterUrl: params.jupiterUrl,\n jupiterApiKeyHeader: params.jupiterApiKeyHeader,\n jupiterMaxAccounts: params.jupiterMaxAccounts,\n },\n },\n api\n );\n }\n case ChainType.SRB: {\n return new SrbBridgeService(nodeRpcUrlsConfig, params, api);\n }\n case ChainType.SUI: {\n return new SuiBridgeService(nodeRpcUrlsConfig, api);\n }\n }\n}\n", "export abstract class SdkRootError extends Error {\n public errorCode: ErrorCode;\n\n protected constructor(code: ErrorCode, message?: string) {\n super(message);\n this.errorCode = code;\n }\n}\n\nexport class SdkError extends SdkRootError {\n constructor(message?: string) {\n super(ErrorCode.SDK_ERROR, message);\n }\n}\n\nexport class InvalidAmountError extends SdkRootError {\n constructor(message?: string) {\n super(ErrorCode.INVALID_AMOUNT_ERROR, message);\n }\n}\n\nexport class AmountNotEnoughError extends SdkRootError {\n constructor(message?: string) {\n super(ErrorCode.AMOUNT_NOT_ENOUGH_ERROR, message);\n }\n}\n\nexport class InsufficientPoolLiquidityError extends SdkRootError {\n constructor(message?: string) {\n super(ErrorCode.INSUFFICIENT_POOL_LIQUIDITY_ERROR, message);\n }\n}\n\nexport class JupiterError extends SdkRootError {\n constructor(message?: string) {\n super(ErrorCode.JUPITER_ERROR, message);\n }\n}\n\nexport class InvalidGasFeePaymentOptionError extends SdkRootError {\n constructor(message?: string) {\n super(ErrorCode.INVALID_GAS_FEE_PAYMENT_OPTION_ERROR, message);\n }\n}\n\nexport class InvalidMessengerOptionError extends SdkRootError {\n constructor(message?: string) {\n super(ErrorCode.INVALID_MESSENGER_OPTION_ERROR, message);\n }\n}\n\nexport class MethodNotSupportedError extends SdkRootError {\n constructor(message?: string) {\n super(ErrorCode.METHOD_NOT_SUPPORTED_ERROR, message);\n }\n}\n\nexport class VerifyTxError extends SdkRootError {\n constructor(message?: string) {\n super(ErrorCode.VERIFY_TX_ERROR, message);\n }\n}\n\nexport class InvalidTxError extends SdkRootError {\n constructor(message?: string) {\n super(ErrorCode.INVALID_TX_ERROR, message);\n }\n}\n\nexport class ExtraGasMaxLimitExceededError extends SdkRootError {\n constructor(message?: string) {\n super(ErrorCode.EXTRA_GAS_MAX_LIMIT_EXCEEDED_ERROR, message);\n }\n}\n\nexport class ArgumentInvalidDecimalsError extends SdkRootError {\n constructor(argName: string, decimalsIs: number, decimalsRequired: number) {\n super(\n ErrorCode.ARGUMENT_INVALID_DECIMALS_ERROR,\n `Argument '${argName}' decimals '${decimalsIs}' cannot be greater than '${decimalsRequired}'`\n );\n }\n}\n\nexport class TimeoutError extends SdkRootError {\n constructor(message?: string) {\n super(ErrorCode.TIMEOUT_ERROR, message);\n }\n}\n\nexport class NodeRpcUrlNotInitializedError extends SdkRootError {\n constructor(chainSymbol: string) {\n super(ErrorCode.NODE_RPC_URL_NOT_INITIALIZED_ERROR, `For chain '${chainSymbol}' Node RPC URL not initialized`);\n }\n}\n\nexport class CCTPDoesNotSupportedError extends SdkRootError {\n constructor(message?: string) {\n super(ErrorCode.CCTP_DOES_NOT_SUPPORTED_ERROR, message);\n }\n}\n\nexport class OFTDoesNotSupportedError extends SdkRootError {\n constructor(message?: string) {\n super(ErrorCode.OFT_DOES_NOT_SUPPORTED_ERROR, message);\n }\n}\n\nexport class YieldDoesNotSupportedError extends SdkRootError {\n constructor(message?: string) {\n super(ErrorCode.YIELD_DOES_NOT_SUPPORTED_ERROR, message);\n }\n}\n\nexport class TxTooLargeError extends SdkRootError {\n constructor() {\n super(\n ErrorCode.TX_TOO_LARGE,\n \"Transaction too large: try again later or switch to another messenger or pay relayer fee in native gas currency\"\n );\n }\n}\n\nexport enum ErrorCode {\n SDK_ERROR = \"SdkError\",\n INVALID_AMOUNT_ERROR = \"InvalidAmountError\",\n AMOUNT_NOT_ENOUGH_ERROR = \"AmountNotEnoughError\",\n INSUFFICIENT_POOL_LIQUIDITY_ERROR = \"InsufficientPoolLiquidityError\",\n JUPITER_ERROR = \"JupiterError\",\n INVALID_GAS_FEE_PAYMENT_OPTION_ERROR = \"InvalidGasFeePaymentOptionError\",\n INVALID_MESSENGER_OPTION_ERROR = \"InvalidMessengerOptionError\",\n METHOD_NOT_SUPPORTED_ERROR = \"MethodNotSupportedError\",\n VERIFY_TX_ERROR = \"VerifyTxError\",\n INVALID_TX_ERROR = \"InvalidTxError\",\n EXTRA_GAS_MAX_LIMIT_EXCEEDED_ERROR = \"ExtraGasMaxLimitExceededError\",\n ARGUMENT_INVALID_DECIMALS_ERROR = \"ArgumentInvalidDecimalsError\",\n TIMEOUT_ERROR = \"TimeoutError\",\n NODE_RPC_URL_NOT_INITIALIZED_ERROR = \"NodeRpcUrlNotInitializedError\",\n CCTP_DOES_NOT_SUPPORTED_ERROR = \"CCTPDoesNotSupportedError\",\n OFT_DOES_NOT_SUPPORTED_ERROR = \"OFTDoesNotSupportedError\",\n YIELD_DOES_NOT_SUPPORTED_ERROR = \"YieldDoesNotSupportedError\",\n TX_TOO_LARGE = \"TxTooLargeError\",\n}\n", "export enum ChainSymbol {\n /**\n * The BNB Smart Chain main network.\n */\n BSC = \"BSC\",\n\n /**\n * The Ethereum main network.\n */\n ETH = \"ETH\",\n\n /**\n * The Base main network.\n */\n BAS = \"BAS\",\n\n /**\n * The Solana network.\n */\n SOL = \"SOL\",\n\n /**\n * The TRON network.\n */\n TRX = \"TRX\",\n\n /**\n * The Polygon network.\n */\n POL = \"POL\",\n\n /**\n * The Arbitrum network.\n */\n ARB = \"ARB\",\n\n /**\n * The Celo network.\n */\n CEL = \"CEL\",\n\n /**\n * The Avalanche main network.\n */\n AVA = \"AVA\",\n\n /**\n * The Soroban network.\n */\n SRB = \"SRB\",\n\n /**\n * The Stellar network.\n */\n STLR = \"STLR\",\n\n /**\n * The OP Mainnet network.\n */\n OPT = \"OPT\",\n\n /**\n * The SUI network.\n */\n SUI = \"SUI\",\n\n /**\n * The Sonic network.\n */\n SNC = \"SNC\",\n\n /**\n * The Unichain network.\n */\n UNI = \"UNI\",\n\n /**\n * The Linea network.\n */\n LIN = \"LIN\",\n}\n\nexport enum ChainType {\n EVM = \"EVM\",\n SOLANA = \"SOLANA\",\n TRX = \"TRX\",\n SRB = \"SRB\",\n SUI = \"SUI\",\n}\n", "import { SdkError } from \"../exceptions\";\nimport { ChainSymbol, ChainType } from \"./chain.enums\";\nimport { BasicChainProperties } from \"./models\";\n\n/**\n * Native gas tokens decimals by ChainType\n */\nconst chainDecimalsByType: Record<ChainType, number> = {\n EVM: 18,\n SOLANA: 9,\n TRX: 6,\n SRB: 7,\n SUI: 9,\n};\n\nconst defaultProperties: Record<string, BasicChainProperties> = {\n [ChainSymbol.BSC]: {\n chainSymbol: ChainSymbol.BSC,\n chainId: \"0x38\",\n name: \"BNB Chain\",\n chainType: ChainType.EVM,\n },\n [ChainSymbol.ETH]: {\n chainSymbol: ChainSymbol.ETH,\n chainId: \"0x1\",\n name: \"Ethereum\",\n chainType: ChainType.EVM,\n },\n [ChainSymbol.BAS]: {\n chainSymbol: ChainSymbol.BAS,\n chainId: \"0x2105\",\n name: \"Base\",\n chainType: ChainType.EVM,\n },\n [ChainSymbol.ARB]: {\n chainSymbol: ChainSymbol.ARB,\n chainId: \"0xa4b1\",\n name: \"Arbitrum\",\n chainType: ChainType.EVM,\n },\n [ChainSymbol.AVA]: {\n chainSymbol: ChainSymbol.AVA,\n chainId: \"0xa86a\",\n name: \"Avalanche\",\n chainType: ChainType.EVM,\n },\n [ChainSymbol.CEL]: {\n chainSymbol: ChainSymbol.CEL,\n chainId: \"0xa4ec\",\n name: \"Celo\",\n chainType: ChainType.EVM,\n },\n [ChainSymbol.POL]: {\n chainSymbol: ChainSymbol.POL,\n chainId: \"0x89\",\n name: \"Polygon\",\n chainType: ChainType.EVM,\n },\n [ChainSymbol.OPT]: {\n chainSymbol: ChainSymbol.OPT,\n chainId: \"0xa\",\n name: \"OP Mainnet\",\n chainType: ChainType.EVM,\n },\n [ChainSymbol.SNC]: {\n chainSymbol: ChainSymbol.SNC,\n chainId: \"0x92\",\n name: \"Sonic\",\n chainType: ChainType.EVM,\n },\n [ChainSymbol.UNI]: {\n chainSymbol: ChainSymbol.UNI,\n chainId: \"0x82\",\n name: \"Unichain\",\n chainType: ChainType.EVM,\n },\n [ChainSymbol.LIN]: {\n chainSymbol: ChainSymbol.LIN,\n chainId: \"0xe708\",\n name: \"Linea\",\n chainType: ChainType.EVM,\n },\n [ChainSymbol.SOL]: {\n chainSymbol: ChainSymbol.SOL,\n name: \"Solana\",\n chainType: ChainType.SOLANA,\n },\n [ChainSymbol.TRX]: {\n chainSymbol: ChainSymbol.TRX,\n name: \"Tron\",\n chainType: ChainType.TRX,\n },\n [ChainSymbol.SRB]: {\n chainSymbol: ChainSymbol.SRB,\n name: \"Stellar\",\n chainType: ChainType.SRB,\n },\n [ChainSymbol.STLR]: {\n chainSymbol: ChainSymbol.STLR,\n name: \"Stellar\",\n chainType: ChainType.SRB,\n },\n [ChainSymbol.SUI]: {\n chainSymbol: ChainSymbol.SUI,\n name: \"Sui\",\n chainType: ChainType.SUI,\n },\n};\n\nexport const Chains = (() => {\n let chainProperties: Record<string, BasicChainProperties> = { ...defaultProperties };\n\n return {\n addChainsProperties(additionalProperties?: Record<string, BasicChainProperties>) {\n chainProperties = { ...chainProperties, ...additionalProperties };\n },\n\n getChainProperty(chainSymbol: string): BasicChainProperties {\n const property = chainProperties[chainSymbol];\n if (!property) {\n throw new SdkError(`Cannot find chain properties for ${chainSymbol}`);\n }\n return property;\n },\n\n getChainsProperties(): Record<string, BasicChainProperties> {\n return chainProperties;\n },\n\n getChainDecimalsByType(chainType: ChainType): number {\n return chainDecimalsByType[chainType];\n },\n };\n})();\n", "import { ChainSymbol } from \"../../chains/chain.enums\";\nimport { PoolInfo, SuiAddresses } from \"../../tokens-info\";\n\nexport type ChainDetailsResponse = Record<string, ChainDetailsDTO>;\n\nexport interface ChainDetailsDTO {\n tokens: TokenDTO[];\n chainId: number;\n bridgeAddress: string;\n oftBridgeAddress?: string;\n swapAddress: string;\n yieldAddress?: string;\n transferTime: TransferTimeDTO;\n txCostAmount: TxCostAmountDTO;\n confirmations: number;\n suiAddresses?: SuiAddresses;\n}\n\nexport enum AddressStatus {\n OK = \"OK\",\n INVALID = \"INVALID\",\n FORBIDDEN = \"FORBIDDEN\",\n UNINITIALIZED = \"UNINITIALIZED\",\n CONTRACT_ADDRESS = \"CONTRACT_ADDRESS\",\n WRONG_ASSOCIATED_ACCOUNT_OWNER = \"WRONG_ASSOCIATED_ACCOUNT_OWNER\",\n}\n\nexport interface TokenDTO {\n symbol: string;\n name: string;\n decimals: number;\n poolAddress: string;\n tokenAddress: string;\n poolInfo: PoolInfoDTO;\n oftId?: string;\n feeShare: string;\n apr: string;\n apr7d: string;\n apr30d: string;\n lpRate: string;\n cctpAddress?: string;\n cctpFeeShare?: string;\n yieldId?: number;\n flags: {\n swap: boolean;\n pool: boolean;\n };\n}\n\nexport interface PoolInfoDTO {\n aValue: string;\n dValue: string;\n tokenBalance: string;\n vUsdBalance: string;\n totalLpAmount: string;\n accRewardPerShareP: string;\n p: number;\n}\n\nexport enum MessengerKeyDTO {\n ALLBRIDGE = \"allbridge\",\n WORMHOLE = \"wormhole\",\n CCTP = \"cctp\",\n CCTP_V2 = \"cctpV2\",\n OFT = \"oft\",\n}\n\nexport type TransferTimeDTO = Record<string, MessengerTransferTimeDTO>;\n\nexport interface TxCostAmountDTO {\n maxAmount: string;\n swap: string;\n transfer: string;\n}\n\nexport type MessengerTransferTimeDTO = {\n [messenger in MessengerKeyDTO]: number | null;\n};\n\nexport enum Messenger {\n ALLBRIDGE = 1,\n WORMHOLE = 2,\n CCTP = 3,\n CCTP_V2 = 4,\n OFT = 5,\n}\n\nexport interface ReceiveTransactionCostRequest {\n sourceChainId: number;\n destinationChainId: number;\n messenger: Messenger;\n sourceToken?: string;\n}\n\nexport interface ReceiveTransactionCostResponse {\n exchangeRate: string;\n fee: string;\n sourceNativeTokenPrice: string;\n adminFeeShareWithExtras?: string;\n}\n\nexport interface GasBalanceResponse {\n gasBalance: string | null;\n status: AddressStatus;\n}\n\nexport interface CheckAddressResponse {\n gasBalance: string | null;\n status: AddressStatus;\n}\n\nexport interface TransferStatusResponse {\n txId: string;\n\n sourceChainSymbol: ChainSymbol;\n destinationChainSymbol: ChainSymbol;\n\n sendAmount: string;\n sendAmountFormatted: number;\n\n stableFee: string;\n stableFeeFormatted: number;\n\n sourceTokenAddress: string;\n destinationTokenAddress: string;\n\n originSourceTokenAddress?: string;\n originDestinationTokenAddress?: string;\n\n senderAddress: string;\n recipientAddress: string;\n\n signaturesCount: number;\n signaturesNeeded: number;\n\n send: BridgeTransaction;\n receive?: BridgeTransaction;\n\n responseTime?: number;\n}\n\nexport interface BridgeTransaction {\n txId: string;\n\n sourceChainId: number;\n destinationChainId: number;\n\n fee: string;\n feeFormatted: number;\n\n stableFee: string;\n stableFeeFormatted: number;\n\n amount: string;\n amountFormatted: number;\n virtualAmount: string;\n\n bridgeContract: string;\n sender: string;\n recipient: string;\n\n sourceTokenAddress: string;\n destinationTokenAddress: string;\n\n originSourceTokenAddress?: string;\n originDestinationTokenAddress?: string;\n\n hash: string;\n\n messenger: Messenger;\n\n blockTime: number;\n blockId: string;\n\n confirmations: number;\n confirmationsNeeded: number;\n\n isClaimable?: boolean;\n}\n\nexport type PoolInfoResponse = Record<ChainSymbol, PoolInfo>;\nexport type PendingInfoResponse = Partial<Record<ChainSymbol, TokenPendingInfoDTO>>;\nexport type TokenPendingInfoDTO = Record<string, PendingInfoDTO>;\n\nexport interface PendingInfoDTO {\n pendingTxs: number;\n totalSentAmount: string;\n}\n", "import { Big, BigSource } from \"big.js\";\nimport { AllbridgeCoreClientPoolsExt } from \"../client/core-api/core-client-pool-info-caching\";\nimport { ArgumentInvalidDecimalsError, InvalidAmountError, TimeoutError } from \"../exceptions\";\nimport { PoolInfo, TokenWithChainDetails } from \"../tokens-info\";\n\nexport async function getPoolInfoByToken(\n api: AllbridgeCoreClientPoolsExt,\n sourceChainToken: TokenWithChainDetails\n): Promise<PoolInfo> {\n return await api.getPoolInfoByKey({\n chainSymbol: sourceChainToken.chainSymbol,\n poolAddress: sourceChainToken.poolAddress,\n });\n}\n\nexport function validateAmountGtZero(amount: BigSource) {\n if (Big(amount).lte(0)) {\n throw new InvalidAmountError(\"Amount must be greater than zero\");\n }\n}\n\nexport function validateAmountDecimals(argName: string, amountFloat: number | string | Big, decimalRequired: number) {\n const amount = Big(amountFloat).toFixed();\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [integerPart, fractionalPart] = amount.split(\".\");\n\n if (fractionalPart && fractionalPart.length > decimalRequired) {\n throw new ArgumentInvalidDecimalsError(argName, fractionalPart.length, decimalRequired);\n }\n}\n\nexport async function promiseWithTimeout<T>(promise: Promise<T>, msg: string, timeoutMs: number): Promise<T> {\n return (await Promise.race([\n promise,\n new Promise((resolve, reject) => {\n setTimeout(() => reject(new TimeoutError(msg)), timeoutMs);\n }),\n ])) as any as T;\n}\n\nexport async function promiseWithTimeoutAndRetries<T>(\n toTry: () => Promise<T>,\n msg: string,\n maxRetries: number,\n timeoutMs: number\n): Promise<T> {\n if (maxRetries < 1)\n throw new Error(`Bad argument: 'maxRetries' must be greater than 0, but ${maxRetries} was received.`);\n let attemptCount = 0;\n while (true) {\n try {\n return await promiseWithTimeout(toTry(), msg, timeoutMs);\n } catch (ignoreError) {\n if (++attemptCount >= maxRetries) throw new TimeoutError(msg);\n }\n }\n}\n\n/**\n * Keep calling a `fn` for `secondsToWait` seconds, if `keepWaitingIf` is true.\n * Returns an array of all attempts to call the function.\n */\nexport async function withExponentialBackoff<T>(\n fn: (previousFailure?: T) => Promise<T>,\n keepWaitingIf: (result: T) => boolean,\n secondsToWait: number,\n exponentialFactor = 1.5,\n verbose = false\n): Promise<T[]> {\n const attempts: T[] = [];\n\n let count = 0;\n const initialAttempt = await fn();\n attempts.push(initialAttempt);\n if (!keepWaitingIf(initialAttempt)) return attempts;\n\n const waitUntil = new Date(Date.now() + secondsToWait * 1000).valueOf();\n let waitTime = 1000;\n let totalWaitTime = waitTime;\n\n while (Date.now() < waitUntil) {\n const lastAttempt = attempts[attempts.length - 1];\n if (lastAttempt === undefined || !keepWaitingIf(lastAttempt)) break;\n\n count++;\n // Wait a beat\n if (verbose) {\n console.info(\n `Waiting ${waitTime}ms before trying again (bringing the total wait time to ${totalWaitTime}ms so far, of total ${\n secondsToWait * 1000\n }ms)`\n );\n }\n await new Promise((res) => setTimeout(res, waitTime));\n // Exponential backoff\n waitTime = waitTime * exponentialFactor;\n if (new Date(Date.now() + waitTime).valueOf() > waitUntil) {\n waitTime = waitUntil - Date.now();\n if (verbose) {\n console.info(`was gonna wait too long; new waitTime: ${waitTime}ms`);\n }\n }\n totalWaitTime = waitTime + totalWaitTime;\n // Try again\n const nextAttempt = await fn(lastAttempt);\n attempts.push(nextAttempt);\n if (verbose && keepWaitingIf(nextAttempt)) {\n console.info(\n `${count}. Called ${fn.name}; ${attempts.length} prev attempts. Most recent: ${JSON.stringify(\n attempts[attempts.length - 1],\n null,\n 2\n )}`\n );\n }\n }\n\n return attempts;\n}\n", "import { Big } from \"big.js\";\nimport BN from \"bn.js\";\nimport { Contract, Transaction as Web3Transaction } from \"web3\";\nimport { PayableMethodObject } from \"web3-eth-contract\";\nimport { AllbridgeCoreClient } from \"../../../client/core-api/core-client-base\";\nimport {\n ChainSymbol,\n ChainType,\n EssentialWeb3,\n FeePaymentMethod,\n Messenger,\n SwapParams,\n TransactionResponse,\n} from \"../../../models\";\nimport { NodeRpcUrlsConfig } from \"../../index\";\nimport { RawTransaction } from \"../../models\";\nimport Bridge from \"../../models/abi/Bridge\";\nimport CctpBridge from \"../../models/abi/CctpBridge\";\nimport OftBridge from \"../../models/abi/OftBridge\";\nimport { getCctpSolTokenRecipientAddress } from \"../get-cctp-sol-token-recipient-address\";\nimport { ChainBridgeService, SendParams, TxSendParamsEvm, TxSwapParamsEvm } from \"../models\";\nimport { getNonce, prepareTxSendParams, prepareTxSwapParams } from \"../utils\";\n\nexport class EvmBridgeService extends ChainBridgeService {\n chainType: ChainType.EVM = ChainType.EVM;\n\n constructor(\n public web3: EssentialWeb3,\n public api: AllbridgeCoreClient,\n private nodeRpcUrlsConfig: NodeRpcUrlsConfig\n ) {\n super();\n }\n\n async send(params: SendParams): Promise<TransactionResponse> {\n const rawTransaction = await this.buildRawTransactionSend(params);\n return this.sendRawTransaction(rawTransaction);\n }\n\n async buildRawTransactionSwap(params: SwapParams): Promise<RawTransaction> {\n const txSwapParams = prepareTxSwapParams(this.chainType, params);\n return await this.buildRawTransactionSwapFromParams(txSwapParams);\n }\n\n async buildRawTransactionSwapFromParams(params: TxSwapParamsEvm): Promise<RawTransaction> {\n const {\n amount,\n contractAddress,\n fromAccountAddress,\n fromTokenAddress,\n toAccountAddress,\n toTokenAddress,\n minimumReceiveAmount,\n } = params;\n\n const bridgeContract = this.getBridgeContract(contractAddress);\n\n const swapMethod = bridgeContract.methods.swap(\n amount,\n fromTokenAddress,\n toTokenAddress,\n toAccountAddress,\n minimumReceiveAmount\n );\n\n return Promise.resolve({\n from: fromAccountAddress,\n to: contractAddress,\n data: swapMethod.encodeABI(),\n });\n }\n\n async buildRawTransactionSend(params: SendParams): Promise<RawTransaction> {\n const txSendParams = await prepareTxSendParams(this.chainType, params, this.api);\n const {\n amount,\n contractAddress,\n fromAccountAddress,\n fromTokenAddress,\n toChainId,\n toAccountAddress,\n toTokenAddress,\n messenger,\n fee,\n gasFeePaymentMethod,\n extraGas,\n extraGasDest,\n } = txSendParams;\n\n const nonce = \"0x\" + getNonce().toString(\"hex\");\n let sendMethod: PayableMethodObject;\n let value: string;\n\n let totalFee = fee;\n if (extraGas) {\n totalFee = Big(totalFee).plus(extraGas).toFixed();\n }\n\n switch (messenger) {\n case Messenger.CCTP:\n case Messenger.CCTP_V2: {\n const cctp = await this.buildRawTransactionCctpSend(params, txSendParams, totalFee);\n sendMethod = cctp.sendMethod;\n value = cctp.value;\n break;\n }\n case Messenger.OFT: {\n const oft = this.buildRawTransactionOftSend(params, txSendParams, totalFee, extraGasDest);\n sendMethod = oft.sendMethod;\n value = oft.value;\n break;\n }\n case Messenger.ALLBRIDGE:\n case Messenger.WORMHOLE:\n {\n const bridgeContract = this.getBridgeContract(contractAddress);\n if (gasFeePaymentMethod === FeePaymentMethod.WITH_STABLECOIN) {\n sendMethod = bridgeContract.methods.swapAndBridge(\n fromTokenAddress,\n amount,\n toAccountAddress,\n toChainId,\n toTokenAddress,\n nonce,\n messenger,\n totalFee\n );\n value = \"0\";\n } else {\n sendMethod = bridgeContract.methods.swapAndBridge(\n fromTokenAddress,\n amount,\n toAccountAddress,\n toChainId,\n toTokenAddress,\n nonce,\n messenger,\n 0\n );\n value = totalFee;\n }\n }\n break;\n }\n\n return Promise.resolve({\n from: fromAccountAddress,\n to: contractAddress,\n value: value,\n data: sendMethod.encodeABI(),\n });\n }\n\n private async buildRawTransactionCctpSend(\n params: SendParams,\n txSendParams: TxSendParamsEvm,\n totalFee: string\n ): Promise<{\n sendMethod: PayableMethodObject;\n value: string;\n }> {\n const { amount, contractAddress, toChainId, toAccountAddress, gasFeePaymentMethod } = txSendParams;\n\n const cctpBridgeContract = this.getCctpBridgeContract(contractAddress);\n let sendMethod: PayableMethodObject;\n let value: string;\n\n if (params.destinationToken.chainType === ChainType.SOLANA) {\n const recipient = await getCctpSolTokenRecipientAddress(\n this.chainType,\n params.toAccountAddress,\n params.destinationToken.tokenAddress,\n this.nodeRpcUrlsConfig.getNodeRpcUrl(ChainSymbol.SOL)\n );\n\n if (gasFeePaymentMethod === FeePaymentMethod.WITH_STABLECOIN) {\n sendMethod = cctpBridgeContract.methods.bridgeWithWalletAddress(\n amount,\n recipient,\n toAccountAddress,\n toChainId,\n totalFee\n );\n value = \"0\";\n } else {\n sendMethod = cctpBridgeContract.methods.bridgeWithWalletAddress(\n amount,\n recipient,\n toAccountAddress,\n toChainId,\n 0\n );\n value = totalFee;\n }\n } else {\n if (gasFeePaymentMethod === FeePaymentMethod.WITH_STABLECOIN) {\n sendMethod = cctpBridgeContract.methods.bridge(amount, toAccountAddress, toChainId, totalFee);\n value = \"0\";\n } else {\n sendMethod = cctpBridgeContract.methods.bridge(amount, toAccountAddress, toChainId, 0);\n value = totalFee;\n }\n }\n return { sendMethod, value };\n }\n\n private buildRawTransactionOftSend(\n params: SendParams,\n txSendParams: TxSendParamsEvm,\n totalFee: string,\n extraGasDest?: string\n ): {\n sendMethod: PayableMethodObject;\n value: string;\n } {\n const { amount, contractAddress, toChainId, toAccountAddress, gasFeePaymentMethod } = txSendParams;\n\n const oftBridgeContract = this.getOftBridgeContract(contractAddress);\n let sendMethod: PayableMethodObject;\n let value: string;\n\n if (gasFeePaymentMethod === FeePaymentMethod.WITH_STABLECOIN) {\n sendMethod = oftBridgeContract.methods.bridge(\n params.sourceToken.tokenAddress,\n amount,\n toAccountAddress,\n toChainId,\n totalFee,\n extraGasDest ?? \"0\",\n \"10\"\n );\n value = \"0\";\n } else {\n sendMethod = oftBridgeContract.methods.bridge(\n params.sourceToken.tokenAddress,\n amount,\n toAccountAddress,\n toChainId,\n 0,\n extraGasDest ?? \"0\",\n \"10\"\n );\n value = totalFee;\n }\n\n return { sendMethod, value };\n }\n\n private async sendRawTransaction(rawTransaction: RawTransaction) {\n const estimateGas = await this.web3.eth.estimateGas(rawTransaction as Web3Transaction);\n\n // @ts-expect-error DISABLE SITE SUGGESTED GAS FEE IN METAMASK\n // prettier-ignore\n const feeOptions: { maxPriorityFeePerGas?: number | string | BN; maxFeePerGas?: number | string | BN } = { maxPriorityFeePerGas: null, maxFeePerGas: null };\n const { transactionHash } = await this.web3.eth.sendTransaction({\n ...(rawTransaction as object),\n gas: estimateGas,\n ...feeOptions,\n } as Web3Transaction);\n return { txId: transactionHash.toString() };\n }\n\n private getBridgeContract(contractAddress: string) {\n return new this.web3.eth.Contract(Bridge.abi, contractAddress) as Contract<typeof Bridge.abi>;\n }\n\n private getCctpBridgeContract(contractAddress: string) {\n return new this.web3.eth.Contract(CctpBridge.abi, contractAddress) as Contract<typeof CctpBridge.abi>;\n }\n\n private getOftBridgeContract(contractAddress: string) {\n return new this.web3.eth.Contract(OftBridge.abi, contractAddress) as Contract<typeof OftBridge.abi>;\n }\n}\n", "const artifact = {\n abi: [\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"_chainId\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"_chainPrecision\",\n type: \"uint256\",\n },\n {\n internalType: \"contract Messenger\",\n name: \"_allbridgeMessenger\",\n type: \"address\",\n },\n {\n internalType: \"contract WormholeMessenger\",\n name: \"_wormholeMessenger\",\n type: \"address\",\n },\n {\n internalType: \"contract IGasOracle\",\n name: \"_gasOracle\",\n type: \"address\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"constructor\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"gas\",\n type: \"uint256\",\n },\n ],\n name: \"BridgingFeeFromTokens\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"previousOwner\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"newOwner\",\n type: \"address\",\n },\n ],\n name: \"OwnershipTransferred\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"bridgeTransactionCost\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"messageTransactionCost\",\n type: \"uint256\",\n },\n ],\n name: \"ReceiveFee\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"address\",\n name: \"sender\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n ],\n name: \"Received\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"address\",\n name: \"sender\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"address\",\n name: \"recipient\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"bytes32\",\n name: \"sendToken\",\n type: \"bytes32\",\n },\n {\n indexed: false,\n internalType: \"bytes32\",\n name: \"receiveToken\",\n type: \"bytes32\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"sendAmount\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"receiveAmount\",\n type: \"uint256\",\n },\n ],\n name: \"Swapped\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"bytes32\",\n name: \"recipient\",\n type: \"bytes32\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"nonce\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"enum MessengerProtocol\",\n name: \"messenger\",\n type: \"uint8\",\n },\n {\n indexed: false,\n internalType: \"bytes32\",\n name: \"message\",\n type: \"bytes32\",\n },\n ],\n name: \"TokensReceived\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"bytes32\",\n name: \"recipient\",\n type: \"bytes32\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"destinationChainId\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"bytes32\",\n name: \"receiveToken\",\n type: \"bytes32\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"nonce\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"enum MessengerProtocol\",\n name: \"messenger\",\n type: \"uint8\",\n },\n ],\n name: \"TokensSent\",\n type: \"event\",\n },\n {\n stateMutability: \"payable\",\n type: \"fallback\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"_chainId\",\n type: \"uint256\",\n },\n {\n internalType: \"bytes32\",\n name: \"tokenAddress\",\n type: \"bytes32\",\n },\n ],\n name: \"addBridgeToken\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"contract Pool\",\n name: \"pool\",\n type: \"address\",\n },\n {\n internalType: \"bytes32\",\n name: \"token\",\n type: \"bytes32\",\n },\n ],\n name: \"addPool\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"canSwap\",\n outputs: [\n {\n internalType: \"uint8\",\n name: \"\",\n type: \"uint8\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"chainId\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"chainId\",\n type: \"uint256\",\n },\n ],\n name: \"gasUsage\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"destinationChainId\",\n type: \"uint256\",\n },\n {\n internalType: \"enum MessengerProtocol\",\n name: \"messenger\",\n type: \"uint8\",\n },\n {\n internalType: \"address\",\n name: \"tokenAddress\",\n type: \"address\",\n },\n ],\n name: \"getBridgingCostInTokens\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"chainId\",\n type: \"uint256\",\n },\n {\n internalType: \"enum MessengerProtocol\",\n name: \"protocol\",\n type: \"uint8\",\n },\n ],\n name: \"getMessageCost\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"chainId\",\n type: \"uint256\",\n },\n {\n internalType: \"enum MessengerProtocol\",\n name: \"protocol\",\n type: \"uint8\",\n },\n ],\n name: \"getMessageGasUsage\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"chainId\",\n type: \"uint256\",\n },\n ],\n name: \"getTransactionCost\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"bytes32\",\n name: \"message\",\n type: \"bytes32\",\n },\n {\n internalType: \"enum MessengerProtocol\",\n name: \"protocol\",\n type: \"uint8\",\n },\n ],\n name: \"hasReceivedMessage\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"bytes32\",\n name: \"message\",\n type: \"bytes32\",\n },\n ],\n name: \"hasSentMessage\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n {\n internalType: \"bytes32\",\n name: \"recipient\",\n type: \"bytes32\",\n },\n {\n internalType: \"uint256\",\n name: \"sourceChainId\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"destinationChainId\",\n type: \"uint256\",\n },\n {\n internalType: \"bytes32\",\n name: \"receiveToken\",\n type: \"bytes32\",\n },\n {\n internalType: \"uint256\",\n name: \"nonce\",\n type: \"uint256\",\n },\n {\n internalType: \"enum MessengerProtocol\",\n name: \"messenger\",\n type: \"uint8\",\n },\n ],\n name: \"hashMessage\",\n outputs: [\n {\n internalType: \"bytes32\",\n name: \"\",\n type: \"bytes32\",\n },\n ],\n stateMutability: \"pure\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"chainId\",\n type: \"uint256\",\n },\n {\n internalType: \"bytes32\",\n name: \"tokenAddress\",\n type: \"bytes32\",\n },\n ],\n name: \"otherBridgeTokens\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"isSupported\",\n type: \"bool\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"chainId\",\n type: \"uint256\",\n },\n ],\n name: \"otherBridges\",\n outputs: [\n {\n internalType: \"bytes32\",\n name: \"bridgeAddress\",\n type: \"bytes32\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"owner\",\n outputs: [\n {\n internalType: \"address\",\n name: \"\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"bytes32\",\n name: \"tokenId\",\n type: \"bytes32\",\n },\n ],\n name: \"pools\",\n outputs: [\n {\n internalType: \"contract Pool\",\n name: \"\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"bytes32\",\n name: \"messageHash\",\n type: \"bytes32\",\n },\n ],\n name: \"processedMessages\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"isProcessed\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n {\n internalType: \"bytes32\",\n name: \"recipient\",\n type: \"bytes32\",\n },\n {\n internalType: \"uint256\",\n name: \"sourceChainId\",\n type: \"uint256\",\n },\n {\n internalType: \"bytes32\",\n name: \"receiveToken\",\n type: \"bytes32\",\n },\n {\n internalType: \"uint256\",\n name: \"nonce\",\n type: \"uint256\",\n },\n {\n internalType: \"enum MessengerProtocol\",\n name: \"messenger\",\n type: \"uint8\",\n },\n {\n internalType: \"uint256\",\n name: \"receiveAmountMin\",\n type: \"uint256\",\n },\n ],\n name: \"receiveTokens\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"_chainId\",\n type: \"uint256\",\n },\n {\n internalType: \"bytes32\",\n name: \"bridgeAddress\",\n type: \"bytes32\",\n },\n ],\n name: \"registerBridge\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"_chainId\",\n type: \"uint256\",\n },\n {\n internalType: \"bytes32\",\n name: \"tokenAddress\",\n type: \"bytes32\",\n },\n ],\n name: \"removeBridgeToken\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"renounceOwnership\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"bytes32\",\n name: \"messageHash\",\n type: \"bytes32\",\n },\n ],\n name: \"sentMessages\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"isSent\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"contract Messenger\",\n name: \"_allbridgeMessenger\",\n type: \"address\",\n },\n ],\n name: \"setAllbridgeMessenger\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"contract IGasOracle\",\n name: \"_gasOracle\",\n type: \"address\",\n },\n ],\n name: \"setGasOracle\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"chainId\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"gasAmount\",\n type: \"uint256\",\n },\n ],\n name: \"setGasUsage\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"_rebalancer\",\n type: \"address\",\n },\n ],\n name: \"setRebalancer\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"_stopAuthority\",\n type: \"address\",\n },\n ],\n name: \"setStopAuthority\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"contract WormholeMessenger\",\n name: \"_wormholeMessenger\",\n type: \"address\",\n },\n ],\n name: \"setWormholeMessenger\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"startSwap\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"stopSwap\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n {\n internalType: \"bytes32\",\n name: \"token\",\n type: \"bytes32\",\n },\n {\n internalType: \"bytes32\",\n name: \"receiveToken\",\n type: \"bytes32\",\n },\n {\n internalType: \"address\",\n name: \"recipient\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"receiveAmountMin\",\n type: \"uint256\",\n },\n ],\n name: \"swap\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"bytes32\",\n name: \"token\",\n type: \"bytes32\",\n },\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n {\n internalType: \"bytes32\",\n name: \"recipient\",\n type: \"bytes32\",\n },\n {\n internalType: \"uint256\",\n name: \"destinationChainId\",\n type: \"uint256\",\n },\n {\n internalType: \"bytes32\",\n name: \"receiveToken\",\n type: \"bytes32\",\n },\n {\n internalType: \"uint256\",\n name: \"nonce\",\n type: \"uint256\",\n },\n {\n internalType: \"enum MessengerProtocol\",\n name: \"messenger\",\n type: \"uint8\",\n },\n {\n internalType: \"uint256\",\n name: \"feeTokenAmount\",\n type: \"uint256\",\n },\n ],\n name: \"swapAndBridge\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"newOwner\",\n type: \"address\",\n },\n ],\n name: \"transferOwnership\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"contract IERC20\",\n name: \"token\",\n type: \"address\",\n },\n ],\n name: \"withdrawBridgingFeeInTokens\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n ],\n name: \"withdrawGasTokens\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n stateMutability: \"payable\",\n type: \"receive\",\n },\n ],\n} as const;\nexport default artifact;\n", "const artifact = {\n abi: [\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"chainId_\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"chainPrecision_\",\n type: \"uint256\",\n },\n {\n internalType: \"address\",\n name: \"tokenAddress\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"cctpMessenger_\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"cctpTransmitter_\",\n type: \"address\",\n },\n {\n internalType: \"contract IGasOracle\",\n name: \"gasOracle_\",\n type: \"address\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"constructor\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"previousOwner\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"newOwner\",\n type: \"address\",\n },\n ],\n name: \"OwnershipTransferred\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"address\",\n name: \"recipient\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n ],\n name: \"ReceivedExtraGas\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"address\",\n name: \"sender\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n ],\n name: \"ReceivedGas\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"address\",\n name: \"sender\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"nonce\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"bytes32\",\n name: \"newRecipient\",\n type: \"bytes32\",\n },\n ],\n name: \"RecipientReplaced\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"bytes32\",\n name: \"recipientWalletAddress\",\n type: \"bytes32\",\n },\n ],\n name: \"TokensSentExtras\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"address\",\n name: \"sender\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"bytes32\",\n name: \"recipient\",\n type: \"bytes32\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"destinationChainId\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"nonce\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"receivedRelayerFeeFromGas\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"receivedRelayerFeeFromTokens\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"relayerFee\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"receivedRelayerFeeTokenAmount\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"adminFeeTokenAmount\",\n type: \"uint256\",\n },\n ],\n name: \"TokensSent\",\n type: \"event\",\n },\n {\n stateMutability: \"payable\",\n type: \"fallback\",\n },\n {\n inputs: [],\n name: \"adminFeeShareBP\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n {\n internalType: \"bytes32\",\n name: \"recipient\",\n type: \"bytes32\",\n },\n {\n internalType: \"uint256\",\n name: \"destinationChainId\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"relayerFeeTokenAmount\",\n type: \"uint256\",\n },\n ],\n name: \"bridge\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n {\n internalType: \"bytes32\",\n name: \"recipient\",\n type: \"bytes32\",\n },\n {\n internalType: \"bytes32\",\n name: \"recipientWalletAddress\",\n type: \"bytes32\",\n },\n {\n internalType: \"uint256\",\n name: \"destinationChainId\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"relayerFeeTokenAmount\",\n type: \"uint256\",\n },\n ],\n name: \"bridgeWithWalletAddress\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"chainId\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"bytes\",\n name: \"originalMessage\",\n type: \"bytes\",\n },\n {\n internalType: \"bytes\",\n name: \"originalAttestation\",\n type: \"bytes\",\n },\n {\n internalType: \"bytes32\",\n name: \"newRecipient\",\n type: \"bytes32\",\n },\n ],\n name: \"changeRecipient\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"chainId\",\n type: \"uint256\",\n },\n ],\n name: \"gasUsage\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"destinationChainId\",\n type: \"uint256\",\n },\n ],\n name: \"getBridgingCostInTokens\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"chainId_\",\n type: \"uint256\",\n },\n ],\n name: \"getDomainByChainId\",\n outputs: [\n {\n internalType: \"uint32\",\n name: \"\",\n type: \"uint32\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"chainId\",\n type: \"uint256\",\n },\n ],\n name: \"getTransactionCost\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"sourceChainId\",\n type: \"uint256\",\n },\n {\n internalType: \"uint64\",\n name: \"nonce\",\n type: \"uint64\",\n },\n ],\n name: \"isMessageProcessed\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"owner\",\n outputs: [\n {\n internalType: \"address\",\n name: \"\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"recipient\",\n type: \"address\",\n },\n {\n internalType: \"bytes\",\n name: \"message\",\n type: \"bytes\",\n },\n {\n internalType: \"bytes\",\n name: \"signature\",\n type: \"bytes\",\n },\n ],\n name: \"receiveTokens\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"chainId_\",\n type: \"uint256\",\n },\n {\n internalType: \"uint32\",\n name: \"domain\",\n type: \"uint32\",\n },\n ],\n name: \"registerBridgeDestination\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"renounceOwnership\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"adminFeeShareBP_\",\n type: \"uint256\",\n },\n ],\n name: \"setAdminFeeShare\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"contract IGasOracle\",\n name: \"gasOracle_\",\n type: \"address\",\n },\n ],\n name: \"setGasOracle\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"chainId\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"gasAmount\",\n type: \"uint256\",\n },\n ],\n name: \"setGasUsage\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"newOwner\",\n type: \"address\",\n },\n ],\n name: \"transferOwnership\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"chainId_\",\n type: \"uint256\",\n },\n ],\n name: \"unregisterBridgeDestination\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"withdrawFeeInTokens\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n ],\n name: \"withdrawGas\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n stateMutability: \"payable\",\n type: \"receive\",\n },\n ],\n} as const;\nexport default artifact;\n", "const artifact = {\n abi: [\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"chainId_\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"chainPrecision_\",\n type: \"uint256\",\n },\n {\n internalType: \"contract IGasOracle\",\n name: \"gasOracle_\",\n type: \"address\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"constructor\",\n },\n {\n inputs: [\n {\n internalType: \"uint16\",\n name: \"optionType\",\n type: \"uint16\",\n },\n ],\n name: \"InvalidOptionType\",\n type: \"error\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"address\",\n name: \"sender\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"bytes32\",\n name: \"recipient\",\n type: \"bytes32\",\n },\n {\n indexed: false,\n internalType: \"address\",\n name: \"tokenAddress\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"destinationChainId\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"receivedRelayerFeeFromGas\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"receivedRelayerFeeFromTokens\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"relayerFeeWithExtraGas\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"receivedRelayerFeeTokenAmount\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"adminFeeTokenAmount\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"extraGasDestinationToken\",\n type: \"uint256\",\n },\n ],\n name: \"OftTokensSent\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"previousOwner\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"newOwner\",\n type: \"address\",\n },\n ],\n name: \"OwnershipTransferred\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"address\",\n name: \"sender\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n ],\n name: \"ReceivedGas\",\n type: \"event\",\n },\n {\n stateMutability: \"payable\",\n type: \"fallback\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"oft_\",\n type: \"address\",\n },\n ],\n name: \"addToken\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"tokenAddress\",\n type: \"address\",\n },\n ],\n name: \"adminFeeShareBP\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"feeShare\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"tokenAddress\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n {\n internalType: \"bytes32\",\n name: \"recipient\",\n type: \"bytes32\",\n },\n {\n internalType: \"uint256\",\n name: \"destinationChainId\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"relayerFeeTokenAmount\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"extraGasInDestinationToken\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"slippageBP\",\n type: \"uint256\",\n },\n ],\n name: \"bridge\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"chainId\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"tokenAddress_\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"destinationChainId_\",\n type: \"uint256\",\n },\n {\n internalType: \"uint128\",\n name: \"extraGasAmount_\",\n type: \"uint128\",\n },\n ],\n name: \"extraGasPrice\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"chainId_\",\n type: \"uint256\",\n },\n ],\n name: \"getEidByChainId\",\n outputs: [\n {\n internalType: \"uint32\",\n name: \"\",\n type: \"uint32\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"tokenAddress\",\n type: \"address\",\n },\n ],\n name: \"oftAddress\",\n outputs: [\n {\n internalType: \"address\",\n name: \"oftAddress\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"owner\",\n outputs: [\n {\n internalType: \"address\",\n name: \"\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"chainId_\",\n type: \"uint256\",\n },\n {\n internalType: \"uint32\",\n name: \"eid_\",\n type: \"uint32\",\n },\n {\n internalType: \"uint128\",\n name: \"lzGasLimit_\",\n type: \"uint128\",\n },\n ],\n name: \"registerBridgeDestination\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"tokenAddress_\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"destinationChainId_\",\n type: \"uint256\",\n },\n ],\n name: \"relayerFee\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"oft_\",\n type: \"address\",\n },\n ],\n name: \"removeToken\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"renounceOwnership\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"tokenAddress_\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"adminFeeShareBP_\",\n type: \"uint256\",\n },\n ],\n name: \"setAdminFeeShare\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"chainId_\",\n type: \"uint256\",\n },\n {\n internalType: \"uint128\",\n name: \"lzGasLimit_\",\n type: \"uint128\",\n },\n ],\n name: \"setLzGasLimit\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"chainId_\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"maxExtraGas_\",\n type: \"uint256\",\n },\n ],\n name: \"setMaxExtraGas\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"newOwner\",\n type: \"address\",\n },\n ],\n name: \"transferOwnership\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"chainId_\",\n type: \"uint256\",\n },\n ],\n name: \"unregisterBridgeDestination\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"contract IERC20\",\n name: \"token_\",\n type: \"address\",\n },\n ],\n name: \"withdrawFeeInTokens\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"amount_\",\n type: \"uint256\",\n },\n ],\n name: \"withdrawGas\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n stateMutability: \"payable\",\n type: \"receive\",\n },\n ],\n} as const;\nexport default artifact;\n", "import * as anchor from \"@project-serum/anchor\";\nimport { PublicKey } from \"@solana/web3.js\";\nimport { ChainType } from \"../../chains/chain.enums\";\nimport { SdkError } from \"../../exceptions\";\nimport { getAssociatedAccount } from \"../utils/sol/accounts\";\nimport { buildAnchorProvider } from \"../utils/sol/anchor-provider\";\nimport { formatAddress } from \"./utils\";\n\n// 1. OVERLOADS\nexport function getCctpSolTokenRecipientAddress(\n chainType: ChainType.EVM | ChainType.SUI,\n toAccountAddress: string,\n destinationTokenAddress: string,\n solRpcUrl: string\n): Promise<string>;\nexport function getCctpSolTokenRecipientAddress(\n chainType: ChainType.TRX,\n toAccountAddress: string,\n destinationTokenAddress: string,\n solRpcUrl: string\n): Promise<Buffer>;\nexport function getCctpSolTokenRecipientAddress(\n chainType: ChainType.SOLANA | ChainType.SRB,\n toAccountAddress: string,\n destinationTokenAddress: string,\n solRpcUrl: string\n): Promise<number[]>;\nexport function getCctpSolTokenRecipientAddress(\n chainType: ChainType,\n toAccountAddress: string,\n destinationTokenAddress: string,\n solRpcUrl: string\n): Promise<string | number[] | Buffer>;\n\n// 2. COMMON Realization\nexport async function getCctpSolTokenRecipientAddress(\n chainType: ChainType,\n toAccountAddress: string,\n destinationTokenAddress: string,\n solRpcUrl: string\n): Promise<string | number[] | Buffer> {\n let recipientWalletAddress: string | number[] | Buffer;\n const receiverAccount = new PublicKey(toAccountAddress);\n const receiveMint = new PublicKey(destinationTokenAddress);\n const receiveUserToken = await getAssociatedAccount(receiverAccount, receiveMint);\n const provider = buildAnchorProvider(solRpcUrl, toAccountAddress);\n anchor.setProvider(provider);\n const accountData = await anchor.Spl.token(provider).account.token.fetchNullable(receiveUserToken);\n if (accountData?.authority.equals(receiverAccount)) {\n recipientWalletAddress = formatAddress(receiveUserToken.toBase58(), ChainType.SOLANA, chainType);\n } else {\n const tokenAccounts = await provider.connection.getTokenAccountsByOwner(receiverAccount, {\n mint: receiveMint,\n });\n if (tokenAccounts.value.length === 0 && !accountData) {\n recipientWalletAddress = formatAddress(receiveUserToken.toBase58(), ChainType.SOLANA, chainType);\n } else if (tokenAccounts.value.length > 0) {\n const firstTokenAccount = tokenAccounts.value[0];\n\n if (!firstTokenAccount?.pubkey) {\n throw new SdkError(\"First token account or its public key is undefined\");\n }\n recipientWalletAddress = formatAddress(firstTokenAccount.pubkey.toBase58(), ChainType.SOLANA, chainType);\n } else {\n throw new SdkError(\"Associated account has wrong owner\");\n }\n }\n return recipientWalletAddress;\n}\n", "import * as anchor from \"@project-serum/anchor\";\nimport { PublicKey } from \"@solana/web3.js\";\n\nexport async function getAssociatedAccount(publicKey: PublicKey, mintAccount: PublicKey): Promise<PublicKey> {\n return anchor.utils.token.associatedAddress({\n mint: mintAccount,\n owner: publicKey,\n });\n}\n\nexport async function getConfigAccount(programId: PublicKey): Promise<PublicKey> {\n const [configPda] = await PublicKey.findProgramAddress([anchor.utils.bytes.utf8.encode(\"config\")], programId);\n return configPda;\n}\n\nexport async function getLockAccount(nonce: number[], bridgeProgramId: PublicKey): Promise<PublicKey> {\n const [lockPda] = await PublicKey.findProgramAddress(\n [anchor.utils.bytes.utf8.encode(\"lock\"), Uint8Array.from(nonce)],\n bridgeProgramId\n );\n return lockPda;\n}\n\nexport async function getPriceAccount(chainId: number, gasOracleProgramId: PublicKey): Promise<PublicKey> {\n const [pricePda] = await PublicKey.findProgramAddress(\n [anchor.utils.bytes.utf8.encode(\"price_v2\"), Uint8Array.from([chainId])],\n gasOracleProgramId\n );\n return pricePda;\n}\n\nexport async function getAuthorityAccount(bridgeProgramId: PublicKey): Promise<PublicKey> {\n const configAccount = await getConfigAccount(bridgeProgramId);\n const [poolAuthority] = await PublicKey.findProgramAddress([configAccount.toBuffer()], bridgeProgramId);\n return poolAuthority;\n}\n\nexport async function getCctpAuthorityAccount(\n cctpBridgeAccount: PublicKey,\n cctpBridgeProgramId: PublicKey\n): Promise<PublicKey> {\n const [poolAuthority] = await PublicKey.findProgramAddress([cctpBridgeAccount.toBuffer()], cctpBridgeProgramId);\n return poolAuthority;\n}\n\nexport async function getBridgeTokenAccount(mintAccount: PublicKey, bridgeProgramId: PublicKey): Promise<PublicKey> {\n const [poolPda] = await PublicKey.findProgramAddress(\n [anchor.utils.bytes.utf8.encode(\"token\"), mintAccount.toBytes()],\n bridgeProgramId\n );\n return poolPda;\n}\n\nexport async function getOtherChainTokenAccount(\n chainId: number,\n token: Buffer,\n bridgeProgramId: PublicKey\n): Promise<PublicKey> {\n const [otherChainTokenPda] = await PublicKey.findProgramAddress(\n [anchor.utils.bytes.utf8.encode(\"other_bridge_token\"), Buffer.from([chainId]), token],\n bridgeProgramId\n );\n return otherChainTokenPda;\n}\n\nexport async function getChainBridgeAccount(chainId: number, bridgeProgramId: PublicKey): Promise<PublicKey> {\n const [chainBridgePda] = await PublicKey.findProgramAddress(\n [anchor.utils.bytes.utf8.encode(\"chain_bridge\"), Uint8Array.from([chainId])],\n bridgeProgramId\n );\n return chainBridgePda;\n}\n\nexport async function getGasUsageAccount(chainId: number, messengerProgramId: PublicKey): Promise<PublicKey> {\n const [chainBridgePda] = await PublicKey.findProgramAddress(\n [anchor.utils.bytes.utf8.encode(\"gas_usage\"), Uint8Array.from([chainId])],\n messengerProgramId\n );\n return chainBridgePda;\n}\n\nexport async function getSendMessageAccount(\n messageWithSigner: Uint8Array,\n messengerProgramId: PublicKey\n): Promise<PublicKey> {\n const [sentMessagePda] = await PublicKey.findProgramAddress(\n [anchor.utils.bytes.utf8.encode(\"sent_message\"), messageWithSigner],\n messengerProgramId\n );\n return sentMessagePda;\n}\n\nexport async function getUserDepositAccount(\n userPublicKey: PublicKey,\n tokenMintAccount: PublicKey,\n bridgeProgramId: PublicKey\n): Promise<PublicKey> {\n const [userDepositPda] = await PublicKey.findProgramAddress(\n [anchor.utils.bytes.utf8.encode(\"user_deposit\"), tokenMintAccount.toBytes(), userPublicKey.toBytes()],\n bridgeProgramId\n );\n return userDepositPda;\n}\n\nexport async function getCctpBridgeAccount(mintAccount: PublicKey, cctpBridgeProgramId: PublicKey): Promise<PublicKey> {\n const [configPda] = await PublicKey.findProgramAddress(\n [anchor.utils.bytes.utf8.encode(\"cctp_bridge\"), mintAccount.toBytes()],\n cctpBridgeProgramId\n );\n return configPda;\n}\n\nexport async function getCctpBridgeTokenAccount(token: PublicKey, cctpBridgeProgramId: PublicKey): Promise<PublicKey> {\n const [poolPda] = await PublicKey.findProgramAddress(\n [anchor.utils.bytes.utf8.encode(\"token\"), token.toBytes()],\n cctpBridgeProgramId\n );\n return poolPda;\n}\n\nexport function getCctpLockAccount(cctpBridgeProgramId: PublicKey, messageSentEventDataAccount: PublicKey): PublicKey {\n const [tokenMessengerEventAuthority] = PublicKey.findProgramAddressSync(\n [anchor.utils.bytes.utf8.encode(\"lock\"), messageSentEventDataAccount.toBuffer()],\n cctpBridgeProgramId\n );\n return tokenMessengerEventAuthority;\n}\n\nexport function getCctpAccounts(\n domain: number,\n mintAccount: PublicKey,\n cctpTransmitterProgramId: PublicKey,\n cctpTokenMessengerMinter: PublicKey\n) {\n const messageTransmitterAccount = findProgramAddress(\"message_transmitter\", cctpTransmitterProgramId);\n const tokenMessenger = findProgramAddress(\"token_messenger\", cctpTokenMessengerMinter);\n const tokenMessengerEventAuthority = findProgramAddress(\"__event_authority\", cctpTokenMessengerMinter);\n const tokenMinter = findProgramAddress(\"token_minter\", cctpTokenMessengerMinter);\n const localToken = findProgramAddress(\"local_token\", cctpTokenMessengerMinter, [mintAccount]);\n const remoteTokenMessengerKey = findProgramAddress(\"remote_token_messenger\", cctpTokenMessengerMinter, [\n domain.toString(),\n ]);\n const authorityPda = findProgramAddress(\"sender_authority\", cctpTokenMessengerMinter);\n return {\n messageTransmitterAccount,\n tokenMessenger,\n tokenMessengerEventAuthority,\n tokenMinter,\n localToken,\n remoteTokenMessengerKey,\n authorityPda,\n };\n}\n\nfunction findProgramAddress(\n label: string,\n programId: PublicKey,\n extraSeeds: (string | number[] | Buffer | PublicKey)[] = []\n): PublicKey {\n const seeds = [Buffer.from(anchor.utils.bytes.utf8.encode(label))];\n for (const extraSeed of extraSeeds) {\n if (typeof extraSeed === \"string\") {\n seeds.push(Buffer.from(anchor.utils.bytes.utf8.encode(extraSeed)));\n } else if (Array.isArray(extraSeed)) {\n seeds.push(Buffer.from(Uint8Array.from(extraSeed)));\n } else if (Buffer.isBuffer(extraSeed)) {\n seeds.push(Buffer.from(Uint8Array.from(extraSeed)));\n } else {\n seeds.push(Buffer.from(Uint8Array.from(extraSeed.toBuffer())));\n }\n }\n const res = PublicKey.findProgramAddressSync(seeds, programId);\n return res[0];\n}\n", "import { AnchorProvider, Provider } from \"@project-serum/anchor\";\nimport { Connection, PublicKey } from \"@solana/web3.js\";\n\nexport function buildAnchorProvider(solanaRpcUrl: string, accountAddress: string): Provider {\n const connection = new Connection(solanaRpcUrl, \"confirmed\");\n\n const publicKey = new PublicKey(accountAddress);\n\n return new AnchorProvider(\n connection,\n // @ts-expect-error enough wallet for fetch actions\n { publicKey: publicKey },\n {\n preflightCommitment: \"confirmed\",\n commitment: \"confirmed\",\n }\n );\n}\n", "import { PublicKey } from \"@solana/web3.js\";\nimport { Address } from \"@stellar/stellar-sdk\";\nimport { Big, BigSource } from \"big.js\";\nimport randomBytes from \"randombytes\";\nimport { utils as TronWebUtils } from \"tronweb\";\nimport { Chains } from \"../../chains\";\nimport { Messenger } from \"../../client/core-api/core-api.model\";\nimport { AllbridgeCoreClient } from \"../../client/core-api/core-client-base\";\nimport {\n AmountNotEnoughError,\n CCTPDoesNotSupportedError,\n ExtraGasMaxLimitExceededError,\n InvalidGasFeePaymentOptionError,\n OFTDoesNotSupportedError,\n SdkError,\n} from \"../../exceptions\";\nimport {\n AmountFormat,\n ChainType,\n ExtraGasMaxLimitResponse,\n ExtraGasMaxLimits,\n FeePaymentMethod,\n GasFeeOptions,\n SwapParams,\n} from \"../../models\";\nimport { ChainDetailsMap, TokenWithChainDetails } from \"../../tokens-info\";\nimport { convertAmountPrecision, convertFloatAmountToInt, convertIntAmountToFloat } from \"../../utils/calculation\";\nimport {\n SendParams,\n TxSendParams,\n TxSendParamsEvm,\n TxSendParamsSol,\n TxSendParamsSrb,\n TxSendParamsSui,\n TxSendParamsTrx,\n TxSwapParams,\n TxSwapParamsEvm,\n TxSwapParamsSol,\n TxSwapParamsSrb,\n TxSwapParamsSui,\n TxSwapParamsTrx,\n} from \"./models\"; // 1. OVERLOADS\n\n// 1. OVERLOADS\nexport function formatAddress(address: string, from: ChainType, to: ChainType.EVM | ChainType.SUI): string;\nexport function formatAddress(address: string, from: ChainType, to: ChainType.TRX): Buffer;\nexport function formatAddress(address: string, from: ChainType, to: ChainType.SOLANA | ChainType.SRB): number[];\nexport function formatAddress(address: string, from: ChainType, to: ChainType): string | number[] | Buffer;\n\n// 2. COMMON Realization\nexport function formatAddress(address: string, from: ChainType, to: ChainType): string | number[] | Buffer {\n let buffer: Buffer;\n switch (from) {\n case ChainType.EVM: {\n buffer = evmAddressToBuffer32(address);\n break;\n }\n case ChainType.SOLANA: {\n buffer = new PublicKey(address).toBuffer();\n break;\n }\n case ChainType.TRX: {\n buffer = tronAddressToBuffer32(address);\n break;\n }\n case ChainType.SRB: {\n buffer = new Address(address).toBuffer();\n break;\n }\n case ChainType.SUI: {\n buffer = evmAddressToBuffer32(address);\n break;\n }\n }\n\n switch (to) {\n case ChainType.EVM: {\n return \"0x\" + buffer.toString(\"hex\");\n }\n case ChainType.SOLANA: {\n return Array.from(buffer);\n }\n case ChainType.TRX: {\n return buffer;\n }\n case ChainType.SRB: {\n return buffer.toJSON().data;\n }\n case ChainType.SUI: {\n return \"0x\" + buffer.toString(\"hex\");\n }\n }\n}\n\nexport function normalizeSuiHex(hex: string): string {\n return hex.replace(/^0x/i, \"\");\n}\n\nexport function hexToBuffer(hex: string): Buffer {\n return Buffer.from(hex.replace(/^0x/i, \"\"), \"hex\");\n}\n\nexport function evmAddressToBuffer32(address: string): Buffer {\n const length = 32;\n const buff = hexToBuffer(address);\n return Buffer.concat([Buffer.alloc(length - buff.length, 0), buff], length);\n}\n\nexport function tronAddressToBuffer32(address: string): Buffer {\n const ethAddress = tronAddressToEthAddress(address);\n const buffer = hexToBuffer(ethAddress);\n return bufferToSize(buffer, 32);\n}\n\nexport function tronAddressToEthAddress(address: string): string {\n const bytes = TronWebUtils.crypto.decodeBase58Address(address);\n if (!bytes) return \"\";\n return TronWebUtils.bytes.byteArray2hexStr(bytes).replace(/^41/, \"0x\");\n}\n\nfunction bufferToSize(buffer: Buffer, size: number): Buffer {\n if (buffer.length >= size) {\n return buffer;\n }\n const result = Buffer.alloc(size, 0);\n buffer.copy(result, size - buffer.length);\n return result;\n}\n\nexport function getTokenByTokenAddress(\n chainDetailsMap: ChainDetailsMap,\n chainSymbol: string,\n tokenAddress: string\n): TokenWithChainDetails {\n const chainDetail = chainDetailsMap[chainSymbol];\n if (!chainDetail) {\n throw new SdkError(\"Cannot find chain detail for \" + chainSymbol);\n }\n const token = chainDetail.tokens.find((value) => value.tokenAddress.toUpperCase() === tokenAddress.toUpperCase());\n if (!token) {\n throw new SdkError(\"Cannot find token info about token \" + tokenAddress + \" on chain \" + chainSymbol);\n }\n return token;\n}\n\nexport function getNonce(): Buffer {\n return randomBytes(32);\n}\n\nexport function getNonceBigInt(): bigint {\n const bigint = randomBytes(32).readBigInt64BE();\n if (bigint < 0) {\n return bigint * -1n;\n }\n return bigint;\n}\n\n// 1. OVERLOADS\nexport function prepareTxSwapParams(\n bridgeChainType: ChainType.EVM | ChainType.SUI,\n params: SwapParams\n): TxSwapParamsEvm | TxSwapParamsSui;\nexport function prepareTxSwapParams(bridgeChainType: ChainType.TRX, params: SwapParams): TxSwapParamsTrx;\nexport function prepareTxSwapParams(\n bridgeChainType: ChainType.SOLANA | ChainType.SRB,\n params: SwapParams\n): TxSwapParamsSol | TxSwapParamsSrb;\nexport function prepareTxSwapParams(bridgeChainType: ChainType, params: SwapParams): TxSwapParams;\n\n// 2. COMMON Realization\nexport function prepareTxSwapParams(bridgeChainType: ChainType, params: SwapParams): TxSwapParams {\n const txSwapParams = {} as TxSwapParams;\n const sourceToken = params.sourceToken;\n txSwapParams.amount = convertFloatAmountToInt(params.amount, sourceToken.decimals).toFixed();\n txSwapParams.contractAddress = sourceToken.bridgeAddress;\n txSwapParams.fromAccountAddress = params.fromAccountAddress;\n if (bridgeChainType === ChainType.SUI) {\n if (!sourceToken.originTokenAddress) {\n throw new SdkError(\"SUI sourceToken must contain 'originTokenAddress'\");\n }\n txSwapParams.fromTokenAddress = sourceToken.originTokenAddress;\n } else {\n txSwapParams.fromTokenAddress = formatAddress(sourceToken.tokenAddress, bridgeChainType, bridgeChainType);\n }\n txSwapParams.toAccountAddress = params.toAccountAddress;\n if (bridgeChainType === ChainType.SUI) {\n if (!params.destinationToken.originTokenAddress) {\n throw new SdkError(\"SUI destinationToken must contain 'originTokenAddress'\");\n }\n txSwapParams.toTokenAddress = params.destinationToken.originTokenAddress;\n } else {\n txSwapParams.toTokenAddress = formatAddress(params.destinationToken.tokenAddress, bridgeChainType, bridgeChainType);\n }\n txSwapParams.minimumReceiveAmount = params.minimumReceiveAmount\n ? convertFloatAmountToInt(params.minimumReceiveAmount, params.destinationToken.decimals).toFixed()\n : \"0\";\n return txSwapParams;\n}\n\n// 1. OVERLOADS\nexport function prepareTxSendParams(\n bridgeChainType: ChainType.EVM | ChainType.SUI,\n params: SendParams,\n api: AllbridgeCoreClient\n): Promise<TxSendParamsEvm | TxSendParamsSui>;\nexport function prepareTxSendParams(\n bridgeChainType: ChainType.TRX,\n params: SendParams,\n api: AllbridgeCoreClient\n): Promise<TxSendParamsTrx>;\nexport function prepareTxSendParams(\n bridgeChainType: ChainType.SOLANA | ChainType.SRB,\n params: SendParams,\n api: AllbridgeCoreClient\n): Promise<TxSendParamsSol | TxSendParamsSrb>;\nexport function prepareTxSendParams(\n bridgeChainType: ChainType,\n params: SendParams,\n api: AllbridgeCoreClient\n): Promise<TxSendParams>;\n\n// 2. COMMON Realization\nexport async function prepareTxSendParams(\n bridgeChainType: ChainType,\n params: SendParams,\n api: AllbridgeCoreClient\n): Promise<TxSendParams> {\n const txSendParams = {} as TxSendParams;\n\n txSendParams.fromChainId = params.sourceToken.allbridgeChainId;\n txSendParams.fromChainSymbol = params.sourceToken.chainSymbol;\n const toChainType = Chains.getChainProperty(params.destinationToken.chainSymbol).chainType;\n if (bridgeChainType === ChainType.SUI) {\n if (!params.sourceToken.originTokenAddress) {\n throw new SdkError(\"SUI token must contain 'originTokenAddress'\");\n }\n txSendParams.fromTokenAddress = params.sourceToken.originTokenAddress;\n } else {\n txSendParams.fromTokenAddress = params.sourceToken.tokenAddress;\n }\n\n txSendParams.toChainId = params.destinationToken.allbridgeChainId;\n txSendParams.toTokenAddress = params.destinationToken.tokenAddress;\n\n if (params.gasFeePaymentMethod === FeePaymentMethod.WITH_STABLECOIN) {\n txSendParams.gasFeePaymentMethod = FeePaymentMethod.WITH_STABLECOIN;\n } else {\n // default FeePaymentMethod.WITH_NATIVE_CURRENCY\n txSendParams.gasFeePaymentMethod = FeePaymentMethod.WITH_NATIVE_CURRENCY;\n }\n const sourceToken = params.sourceToken;\n\n switch (params.messenger) {\n case Messenger.CCTP:\n if (!sourceToken.cctpAddress || !params.destinationToken.cctpAddress) {\n throw new CCTPDoesNotSupportedError(\"Such route does not support CCTP protocol\");\n }\n txSendParams.contractAddress = sourceToken.cctpAddress;\n break;\n case Messenger.CCTP_V2:\n if (!sourceToken.cctpV2Address || !params.destinationToken.cctpV2Address) {\n throw new CCTPDoesNotSupportedError(\"Such route does not support CCTP V2 protocol\");\n }\n txSendParams.contractAddress = sourceToken.cctpV2Address;\n\n break;\n case Messenger.OFT:\n if (\n !sourceToken.oftBridgeAddress ||\n !params.destinationToken.oftBridgeAddress ||\n sourceToken.oftId !== params.destinationToken.oftId\n ) {\n throw new OFTDoesNotSupportedError(\"Such route does not support OFT protocol\");\n }\n txSendParams.contractAddress = sourceToken.oftBridgeAddress;\n break;\n case Messenger.ALLBRIDGE:\n case Messenger.WORMHOLE:\n txSendParams.contractAddress = sourceToken.bridgeAddress;\n break;\n }\n\n txSendParams.messenger = params.messenger;\n txSendParams.fromAccountAddress = params.fromAccountAddress;\n txSendParams.amount = convertFloatAmountToInt(params.amount, sourceToken.decimals).toFixed();\n\n //Fee\n let { fee, feeFormat } = params;\n if (!fee) {\n const gasFeeOptions = await getGasFeeOptions(\n params.sourceToken,\n txSendParams.toChainId,\n txSendParams.messenger,\n api\n );\n\n const gasFeeOption = gasFeeOptions[txSendParams.gasFeePaymentMethod];\n if (!gasFeeOption) {\n throw new InvalidGasFeePaymentOptionError();\n }\n fee = gasFeeOption[AmountFormat.INT];\n feeFormat = AmountFormat.INT;\n }\n if (feeFormat == AmountFormat.FLOAT) {\n switch (txSendParams.gasFeePaymentMethod) {\n case FeePaymentMethod.WITH_NATIVE_CURRENCY:\n txSendParams.fee = convertFloatAmountToInt(fee, Chains.getChainDecimalsByType(sourceToken.chainType)).toFixed(\n 0\n );\n break;\n case FeePaymentMethod.WITH_STABLECOIN:\n txSendParams.fee = convertFloatAmountToInt(fee, sourceToken.decimals).toFixed(0);\n break;\n }\n } else {\n txSendParams.fee = fee;\n }\n\n //ExtraGas\n const { extraGas, extraGasFormat } = params;\n if (extraGas && +extraGas > 0) {\n const extraGasLimits = await getExtraGasMaxLimits(\n sourceToken,\n params.destinationToken,\n txSendParams.messenger,\n api\n );\n\n let extraGasDecimals: number;\n let extraGasDestRate: Big;\n switch (txSendParams.gasFeePaymentMethod) {\n case FeePaymentMethod.WITH_NATIVE_CURRENCY:\n extraGasDecimals = Chains.getChainDecimalsByType(sourceToken.chainType);\n extraGasDestRate = Big(extraGasLimits.exchangeRate);\n break;\n case FeePaymentMethod.WITH_STABLECOIN:\n extraGasDecimals = sourceToken.decimals;\n extraGasDestRate = Big(extraGasLimits.exchangeRate).div(extraGasLimits.sourceNativeTokenPrice);\n break;\n }\n\n switch (extraGasFormat ?? AmountFormat.INT) {\n case AmountFormat.FLOAT: {\n txSendParams.extraGas = convertFloatAmountToInt(extraGas, extraGasDecimals).toFixed(0);\n\n const extraGasDestFloat = extraGasDestRate.mul(extraGas);\n txSendParams.extraGasDest = convertFloatAmountToInt(\n extraGasDestFloat,\n Chains.getChainDecimalsByType(params.destinationToken.chainType)\n ).toFixed(0, Big.roundDown);\n break;\n }\n case AmountFormat.INT: {\n txSendParams.extraGas = extraGas;\n\n const extraGasFloat = convertIntAmountToFloat(\n txSendParams.extraGas,\n Chains.getChainDecimalsByType(sourceToken.chainType)\n );\n const extraGasDestFloat = extraGasDestRate.mul(extraGasFloat);\n txSendParams.extraGasDest = convertFloatAmountToInt(\n extraGasDestFloat,\n Chains.getChainDecimalsByType(params.destinationToken.chainType)\n ).toFixed(0, Big.roundDown);\n break;\n }\n }\n\n validateExtraGasNotExceeded(txSendParams.extraGas, txSendParams.gasFeePaymentMethod, extraGasLimits);\n }\n\n if (bridgeChainType !== ChainType.SUI) {\n txSendParams.fromTokenAddress = formatAddress(txSendParams.fromTokenAddress, bridgeChainType, bridgeChainType);\n }\n txSendParams.toAccountAddress = formatAddress(params.toAccountAddress, toChainType, bridgeChainType);\n txSendParams.toTokenAddress = formatAddress(txSendParams.toTokenAddress, toChainType, bridgeChainType);\n if (txSendParams.gasFeePaymentMethod == FeePaymentMethod.WITH_STABLECOIN) {\n validateAmountEnough(txSendParams.amount, sourceToken.decimals, txSendParams.fee, txSendParams.extraGas);\n }\n return txSendParams;\n}\n\nfunction validateAmountEnough(\n amountInt: BigSource,\n decimals: number,\n feeInt: BigSource,\n extraGasInt: BigSource | undefined\n) {\n const amountTotal = Big(amountInt)\n .minus(feeInt)\n .minus(extraGasInt ?? 0);\n if (amountTotal.lte(0)) {\n throw new AmountNotEnoughError(\n `Amount not enough to pay fee, ${convertIntAmountToFloat(\n Big(amountTotal).minus(1).neg(),\n decimals\n ).toFixed()} stables is missing`\n );\n }\n}\n\nexport async function getGasFeeOptions(\n sourceChainToken: TokenWithChainDetails,\n destinationAllbridgeChainId: number,\n messenger: Messenger,\n api: AllbridgeCoreClient\n): Promise<GasFeeOptions> {\n const transactionCostResponse = await api.getReceiveTransactionCost({\n sourceChainId: sourceChainToken.allbridgeChainId,\n destinationChainId: destinationAllbridgeChainId,\n messenger,\n sourceToken: sourceChainToken.tokenAddress,\n });\n\n const gasFeeOptions: GasFeeOptions = {\n [FeePaymentMethod.WITH_NATIVE_CURRENCY]: {\n [AmountFormat.INT]: transactionCostResponse.fee,\n [AmountFormat.FLOAT]: convertIntAmountToFloat(\n transactionCostResponse.fee,\n Chains.getChainDecimalsByType(sourceChainToken.chainType)\n ).toFixed(),\n },\n adminFeeShareWithExtras: transactionCostResponse.adminFeeShareWithExtras,\n };\n if (transactionCostResponse.sourceNativeTokenPrice) {\n const gasFeeIntWithStables = convertAmountPrecision(\n new Big(transactionCostResponse.fee).mul(transactionCostResponse.sourceNativeTokenPrice),\n Chains.getChainDecimalsByType(sourceChainToken.chainType),\n sourceChainToken.decimals\n ).toFixed(0, Big.roundUp);\n gasFeeOptions[FeePaymentMethod.WITH_STABLECOIN] = {\n [AmountFormat.INT]: gasFeeIntWithStables,\n [AmountFormat.FLOAT]: convertIntAmountToFloat(gasFeeIntWithStables, sourceChainToken.decimals).toFixed(),\n };\n }\n\n return gasFeeOptions;\n}\n\nfunction validateExtraGasNotExceeded(\n extraGasInt: string,\n gasFeePaymentMethod: FeePaymentMethod,\n extraGasLimits: ExtraGasMaxLimitResponse\n) {\n const extraGasMaxLimit = extraGasLimits.extraGasMax[gasFeePaymentMethod];\n if (!extraGasMaxLimit) {\n throw new InvalidGasFeePaymentOptionError(`Impossible to pay extra gas by '${gasFeePaymentMethod}' payment method`);\n }\n const extraGasMaxIntLimit = extraGasMaxLimit[AmountFormat.INT];\n if (Big(extraGasInt).gt(extraGasMaxIntLimit)) {\n throw new ExtraGasMaxLimitExceededError(\n `Extra gas ${extraGasInt} in int format, exceeded limit ${extraGasMaxIntLimit} for '${gasFeePaymentMethod}' payment method`\n );\n }\n}\n\nexport async function getExtraGasMaxLimits(\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n messenger: Messenger,\n api: AllbridgeCoreClient\n): Promise<ExtraGasMaxLimitResponse> {\n const extraGasMaxLimits: ExtraGasMaxLimits = {};\n const transactionCostResponse = await api.getReceiveTransactionCost({\n sourceChainId: sourceChainToken.allbridgeChainId,\n destinationChainId: destinationChainToken.allbridgeChainId,\n messenger,\n sourceToken: sourceChainToken.tokenAddress,\n });\n const maxAmount = destinationChainToken.txCostAmount.maxAmount;\n const maxAmountFloat = convertIntAmountToFloat(\n maxAmount,\n Chains.getChainDecimalsByType(destinationChainToken.chainType)\n ).toFixed();\n const maxAmountFloatInSourceNative = Big(maxAmountFloat)\n .div(transactionCostResponse.exchangeRate)\n .toFixed(Chains.getChainDecimalsByType(sourceChainToken.chainType), Big.roundDown);\n const maxAmountInSourceNative = convertFloatAmountToInt(\n maxAmountFloatInSourceNative,\n Chains.getChainDecimalsByType(sourceChainToken.chainType)\n ).toFixed(0);\n extraGasMaxLimits[FeePaymentMethod.WITH_NATIVE_CURRENCY] = {\n [AmountFormat.INT]: maxAmountInSourceNative,\n [AmountFormat.FLOAT]: maxAmountFloatInSourceNative,\n };\n if (transactionCostResponse.sourceNativeTokenPrice) {\n const maxAmountFloatInStable = Big(maxAmountFloatInSourceNative)\n .mul(transactionCostResponse.sourceNativeTokenPrice)\n .toFixed(sourceChainToken.decimals, Big.roundDown);\n extraGasMaxLimits[FeePaymentMethod.WITH_STABLECOIN] = {\n [AmountFormat.INT]: convertFloatAmountToInt(maxAmountFloatInStable, sourceChainToken.decimals).toFixed(0),\n [AmountFormat.FLOAT]: maxAmountFloatInStable,\n };\n }\n return {\n extraGasMax: extraGasMaxLimits,\n destinationChain: {\n gasAmountMax: {\n [AmountFormat.INT]: maxAmount,\n [AmountFormat.FLOAT]: maxAmountFloat,\n },\n swap: {\n [AmountFormat.INT]: destinationChainToken.txCostAmount.swap,\n [AmountFormat.FLOAT]: convertIntAmountToFloat(\n destinationChainToken.txCostAmount.swap,\n Chains.getChainDecimalsByType(destinationChainToken.chainType)\n ).toFixed(),\n },\n transfer: {\n [AmountFormat.INT]: destinationChainToken.txCostAmount.transfer,\n [AmountFormat.FLOAT]: convertIntAmountToFloat(\n destinationChainToken.txCostAmount.transfer,\n Chains.getChainDecimalsByType(destinationChainToken.chainType)\n ).toFixed(),\n },\n },\n exchangeRate: transactionCostResponse.exchangeRate,\n sourceNativeTokenPrice: transactionCostResponse.sourceNativeTokenPrice,\n };\n}\n\nexport function isSendParams(params: SwapParams | SendParams): params is SendParams {\n return params.sourceToken.chainSymbol !== params.destinationToken.chainSymbol;\n}\n", "import { Big, BigSource } from \"big.js\";\nimport BN from \"bn.js\";\nimport { InsufficientPoolLiquidityError } from \"../../exceptions\";\nimport { PoolInfo, Token } from \"../../tokens-info\";\nimport { SYSTEM_PRECISION } from \"./constants\";\n\nexport function getFeePercent(input: BigSource, output: BigSource): number {\n return Big(100).minus(Big(100).times(output).div(input)).toNumber();\n}\n\nexport function toSystemPrecision(amount: BigSource, decimals: number): Big {\n return convertAmountPrecision(amount, decimals, SYSTEM_PRECISION).round(0, Big.roundDown);\n}\n\nexport function fromSystemPrecision(amount: BigSource, decimals: number): Big {\n return convertAmountPrecision(amount, SYSTEM_PRECISION, decimals);\n}\n\nexport function convertAmountPrecision(amount: BigSource, decimalsFrom: number, decimalsTo: number): Big {\n const dif = Big(decimalsTo).minus(decimalsFrom).toNumber();\n return Big(amount).times(toPowBase10(dif));\n}\n\nexport function toPowBase10(decimals: number): Big {\n return Big(10).pow(decimals);\n}\n\nexport function convertFloatAmountToInt(amountFloat: BigSource, decimals: number): Big {\n return Big(amountFloat).times(toPowBase10(decimals));\n}\n\nexport function convertIntAmountToFloat(amountInt: BigSource, decimals: number): Big {\n const amountValue = Big(amountInt);\n if (amountValue.eq(0)) {\n return Big(0);\n }\n return Big(amountValue).div(toPowBase10(decimals));\n}\n\nexport function calculatePoolInfoImbalance(poolInfo: Pick<PoolInfo, \"tokenBalance\" | \"vUsdBalance\">): string {\n return convertIntAmountToFloat(Big(poolInfo.tokenBalance).minus(poolInfo.vUsdBalance).toFixed(), SYSTEM_PRECISION)\n .div(2)\n .toFixed();\n}\n\nexport function swapToVUsd(\n amount: BigSource,\n { feeShare, decimals }: Pick<Token, \"feeShare\" | \"decimals\">,\n poolInfo: Omit<PoolInfo, \"p\" | \"imbalance\">\n): string {\n const amountValue = Big(amount);\n if (amountValue.lte(0)) {\n return \"0\";\n }\n const fee = amountValue.times(feeShare);\n const amountWithoutFee = amountValue.minus(fee);\n const inSystemPrecision = toSystemPrecision(amountWithoutFee, decimals);\n const tokenBalance = Big(poolInfo.tokenBalance).plus(inSystemPrecision);\n const vUsdNewAmount = getY(tokenBalance, poolInfo.aValue, poolInfo.dValue);\n return Big(poolInfo.vUsdBalance).minus(vUsdNewAmount).round(0, Big.roundDown).toFixed();\n}\n\nexport function swapFromVUsd(\n amount: BigSource,\n { feeShare, decimals }: Pick<Token, \"feeShare\" | \"decimals\">,\n poolInfo: Pick<PoolInfo, \"vUsdBalance\" | \"aValue\" | \"dValue\" | \"tokenBalance\">\n): string {\n const amountValue = Big(amount);\n if (amountValue.lte(0)) {\n return Big(0).toFixed();\n }\n const vUsdBalance = amountValue.plus(poolInfo.vUsdBalance);\n const newAmount = getY(vUsdBalance, poolInfo.aValue, poolInfo.dValue);\n const result = fromSystemPrecision(Big(poolInfo.tokenBalance).minus(newAmount), decimals);\n const fee = Big(result).times(feeShare);\n return Big(result).minus(fee).round(0, Big.roundDown).toFixed();\n}\n\nexport function getSwapFromVUsdPoolInfo(\n vUsdAmount: BigSource,\n poolInfo: Omit<PoolInfo, \"imbalance\">\n): Pick<PoolInfo, \"vUsdBalance\" | \"aValue\" | \"dValue\" | \"tokenBalance\"> {\n const amountValue = Big(vUsdAmount);\n if (amountValue.lte(0)) {\n return poolInfo;\n }\n const vUsdBalance = amountValue.plus(poolInfo.vUsdBalance);\n const newAmount = getY(vUsdBalance, poolInfo.aValue, poolInfo.dValue);\n return {\n aValue: poolInfo.aValue,\n dValue: poolInfo.dValue,\n tokenBalance: newAmount.toFixed(0),\n vUsdBalance: vUsdBalance.toFixed(0),\n };\n}\n\n/**\n * @param amount - vUsd amount should be received\n * @param feeShare\n * @param decimals\n * @param poolInfo\n */\nexport function swapToVUsdReverse(\n amount: BigSource,\n { feeShare, decimals }: Pick<Token, \"feeShare\" | \"decimals\">,\n poolInfo: Omit<PoolInfo, \"imbalance\">\n): Big {\n if (Big(amount).lte(0)) {\n return Big(0);\n }\n const vUsdNewAmount = Big(poolInfo.vUsdBalance).minus(amount);\n if (vUsdNewAmount.lte(0)) {\n throw new InsufficientPoolLiquidityError();\n }\n const tokenBalance = getY(vUsdNewAmount, poolInfo.aValue, poolInfo.dValue);\n const inSystemPrecision = Big(tokenBalance).minus(poolInfo.tokenBalance);\n const amountWithoutFee = fromSystemPrecision(inSystemPrecision, decimals);\n const reversedFeeShare = Big(feeShare).div(Big(1).minus(feeShare));\n const fee = Big(amountWithoutFee).times(reversedFeeShare).round(0, Big.roundUp);\n return Big(amountWithoutFee).plus(fee).round(0, Big.roundDown);\n}\n\n/**\n * @param amount - amount should be received\n * @param feeShare\n * @param decimals\n * @param poolInfo\n */\nexport function swapFromVUsdReverse(\n amount: BigSource,\n { feeShare, decimals }: Pick<Token, \"feeShare\" | \"decimals\">,\n poolInfo: Omit<PoolInfo, \"imbalance\">\n): Big {\n if (Big(amount).lte(0)) {\n return Big(0);\n }\n const reversedFeeShare = Big(feeShare).div(Big(1).minus(feeShare));\n const fee = Big(amount).times(reversedFeeShare).round(0, Big.roundUp);\n const amountWithFee = Big(amount).plus(fee);\n const inSystemPrecision = toSystemPrecision(amountWithFee, decimals);\n const tokenBalance = Big(poolInfo.tokenBalance).minus(inSystemPrecision);\n if (tokenBalance.lte(0)) {\n throw new InsufficientPoolLiquidityError();\n }\n const vUsdNewAmount = getY(tokenBalance, poolInfo.aValue, poolInfo.dValue);\n return Big(vUsdNewAmount).minus(poolInfo.vUsdBalance).round(0, Big.roundDown);\n}\n\n// y = (sqrt(x(4ad\u00B3 + x (4a(d - x) - d )\u00B2)) + x (4a(d - x) - d ))/8ax\n// commonPart = 4a(d - x) - d\n// sqrt = sqrt(x * (4ad\u00B3 + x * commonPart\u00B2)\n// y = (sqrt + x * commonPart) / divider\nexport function getY(x: BigSource, a: BigSource, d: BigSource): Big {\n const commonPartBig = Big(4).times(a).times(Big(d).minus(x)).minus(d);\n const dCubed = Big(d).pow(3);\n const commonPartSquared = commonPartBig.pow(2);\n const sqrtBig = Big(x)\n .times(Big(x).times(commonPartSquared).plus(Big(4).times(a).times(dCubed)))\n .sqrt()\n .round(0, Big.roundDown);\n const dividerBig = Big(8).times(a).times(x);\n const result = commonPartBig.times(x).plus(sqrtBig).div(dividerBig).round(0, Big.roundDown);\n if (result.eq(0)) {\n return Big(0);\n }\n return result.plus(1); // +1 to offset rounding errors\n}\n\nexport function getEarned(userLpAmount: string, userRewardDebt: string, accRewardPerShareP: string, p: number): string {\n const userLpAmountBN = new BN(userLpAmount);\n const accRewardPerSharePBN = new BN(accRewardPerShareP);\n const userRewardDebtBN = new BN(userRewardDebt);\n const rewards = userLpAmountBN.mul(accRewardPerSharePBN).shrn(p);\n return rewards.sub(userRewardDebtBN).toString();\n}\n\nexport function aprInPercents(apr: string): string {\n return Big(apr).gt(0) ? `${Number(Big(apr).times(100).toFixed(2)).toLocaleString()}%` : \"N/A\";\n}\n\n// a = 8Axy(x+y)\n// b = xy(16A - 4) / 3\n// c = sqrt(a\u00B2 + b\u00B3)\n// D = cbrt(a + c) + cbrt(a - c)\nexport function getD(aValue: string, x: string, y: string): string {\n const xy = Big(x).times(y);\n const xPlusY = Big(x).plus(y);\n const a = Big(8).times(aValue).times(xy).times(xPlusY);\n const b = xy.times(Big(16).times(aValue).minus(4)).div(3);\n const aSquared = a.times(a);\n const bCubed = b.times(b).times(b);\n const a2b3 = aSquared.plus(bCubed);\n const c = Big(a2b3).sqrt();\n const cbrtAPlusC = Big(Math.cbrt(+a.plus(c).toFixed()));\n const cbrtAMinusC = Big(Math.cbrt(+a.minus(c).toFixed()));\n return cbrtAPlusC.plus(cbrtAMinusC).toFixed();\n}\n", "import { ChainType } from \"../../../chains/chain.enums\";\nimport { AllbridgeCoreClient } from \"../../../client/core-api/core-client-base\";\nimport { RawTransaction, TransactionResponse } from \"../../models\";\nimport { SendParams, SwapParams } from \"./bridge.model\";\n\nexport abstract class ChainBridgeService {\n abstract chainType: ChainType;\n abstract api: AllbridgeCoreClient;\n\n /**\n * @deprecated Use {@link buildRawTransactionSend} or {@link buildRawTransactionSwap} instead<p>\n * Send tokens through the ChainBridgeService\n * @param params\n */\n abstract send(params: SendParams): Promise<TransactionResponse>;\n abstract buildRawTransactionSend(params: SendParams): Promise<RawTransaction>;\n abstract buildRawTransactionSwap(params: SwapParams): Promise<RawTransaction>;\n}\n", "import { NodeRpcUrlsConfig } from \"..\";\nimport { AllbridgeCoreClient } from \"../../client/core-api/core-client-base\";\nimport { AllbridgeCoreSdkOptions } from \"../../index\";\nimport { validateAmountDecimals, validateAmountGtZero } from \"../../utils/utils\";\nimport { Provider, RawTransaction } from \"../models\";\nimport { TokenService } from \"../token\";\nimport { ApproveParams, SendParams, SwapParams } from \"./models\";\nimport { isSendParams } from \"./utils\";\nimport { getChainBridgeService, getSpender } from \"./index\";\n\nexport interface RawBridgeTransactionBuilder {\n /**\n * Creates a Raw Transaction for approving tokens usage by the bridge\n * @param provider - will be used to access the network\n * @param approveData\n */\n approve(provider: Provider, approveData: ApproveParams): Promise<RawTransaction>;\n /**\n * Creates a Raw Transaction for approving tokens usage by the bridge\n * @param approveData\n */\n approve(approveData: ApproveParams): Promise<RawTransaction>;\n /**\n * Creates a Raw Transaction for initiating the transfer of tokens\n * @param params\n * @param provider - will be used to access the network\n */\n send(params: SwapParams | SendParams, provider?: Provider): Promise<RawTransaction>;\n}\n\nexport class DefaultRawBridgeTransactionBuilder implements RawBridgeTransactionBuilder {\n constructor(\n private api: AllbridgeCoreClient,\n private nodeRpcUrlsConfig: NodeRpcUrlsConfig,\n private params: AllbridgeCoreSdkOptions,\n private tokenService: TokenService\n ) {}\n\n async approve(a: Provider | ApproveParams, b?: ApproveParams): Promise<RawTransaction> {\n let provider: Provider | undefined;\n let approveData: ApproveParams;\n if (b) {\n provider = a as Provider;\n approveData = b;\n } else {\n approveData = a as ApproveParams;\n }\n const spender = getSpender(approveData.token, approveData.messenger);\n return this.tokenService.buildRawTransactionApprove(\n {\n ...approveData,\n spender,\n },\n provider\n );\n }\n\n async send(params: SwapParams | SendParams, provider?: Provider): Promise<RawTransaction> {\n validateAmountGtZero(params.amount);\n validateAmountDecimals(\"amount\", params.amount, params.sourceToken.decimals);\n if (isSendParams(params)) {\n return getChainBridgeService(\n params.sourceToken.chainSymbol,\n this.api,\n this.nodeRpcUrlsConfig,\n this.params,\n provider\n ).buildRawTransactionSend(params);\n }\n return getChainBridgeService(\n params.sourceToken.chainSymbol,\n this.api,\n this.nodeRpcUrlsConfig,\n this.params,\n provider\n ).buildRawTransactionSwap(params);\n }\n}\n", "/* eslint-disable @typescript-eslint/ban-ts-comment */\n/* eslint-disable @typescript-eslint/no-unused-vars */\nimport { BN, Program, Spl, web3 } from \"@project-serum/anchor\";\nimport {\n Connection,\n Keypair,\n PublicKey,\n SystemProgram,\n Transaction,\n TransactionInstruction,\n TransactionMessageArgs,\n VersionedTransaction,\n} from \"@solana/web3.js\";\nimport { Big } from \"big.js\";\nimport { Chains } from \"../../../chains\";\nimport { Messenger } from \"../../../client/core-api/core-api.model\";\nimport { AllbridgeCoreClient } from \"../../../client/core-api/core-client-base\";\nimport {\n AmountNotEnoughError,\n CCTPDoesNotSupportedError,\n JupiterError,\n MethodNotSupportedError,\n OFTDoesNotSupportedError,\n SdkError,\n SdkRootError,\n} from \"../../../exceptions\";\nimport { ChainType, FeePaymentMethod, SwapParams, TokenWithChainDetails, TxFeeParams } from \"../../../models\";\nimport { convertIntAmountToFloat } from \"../../../utils/calculation\";\nimport { RawTransaction, TransactionResponse } from \"../../models\";\nimport { SwapAndBridgeSolData, SwapAndBridgeSolDataCctpData } from \"../../models/sol\";\nimport { Bridge as BridgeType, IDL as bridgeIdl } from \"../../models/sol/types/bridge\";\nimport { CctpBridge as CctpBridgeType, IDL as cctpBridgeIdl } from \"../../models/sol/types/cctp_bridge\";\nimport { getMessage, getTokenAccountData, getVUsdAmount } from \"../../utils/sol\";\nimport {\n getAssociatedAccount,\n getAuthorityAccount,\n getBridgeTokenAccount,\n getCctpAccounts,\n getCctpAuthorityAccount,\n getCctpBridgeAccount,\n getCctpBridgeTokenAccount,\n getCctpLockAccount,\n getChainBridgeAccount,\n getConfigAccount,\n getGasUsageAccount,\n getLockAccount,\n getOtherChainTokenAccount,\n getPriceAccount,\n getSendMessageAccount,\n} from \"../../utils/sol/accounts\";\nimport { buildAnchorProvider } from \"../../utils/sol/anchor-provider\";\nimport { addUnitLimitAndUnitPriceToTx, addUnitLimitAndUnitPriceToVersionedTx } from \"../../utils/sol/compute-budget\";\nimport { SendParams, TxSendParamsSol, TxSwapParamsSol } from \"../models\";\nimport { ChainBridgeService } from \"../models/bridge\";\nimport { getNonce, prepareTxSendParams, prepareTxSwapParams } from \"../utils\";\nimport { JupiterService } from \"./jupiter\";\n\nexport interface SolanaBridgeParams {\n wormholeMessengerProgramId: string;\n solanaLookUpTable: string;\n cctpParams: CctpParams;\n jupiterParams: JupiterParams;\n}\n\nexport interface JupiterParams {\n jupiterUrl: string;\n jupiterApiKeyHeader?: string;\n jupiterMaxAccounts?: number;\n}\n\nexport interface CctpParams {\n cctpTransmitterProgramId: string;\n cctpTokenMessengerMinter: string;\n cctpDomains: CctpDomains;\n}\n\n/**\n * Type representing a map of CCTP domains to their corresponding numeric values.\n *\n * @typedef {Record<string, number>} CctpDomains\n * @property {string} chainSymbol - The symbol of the chain representing one of the supported blockchain networks (e.g., \"ETH\" for Ethereum). For more details, see: {@link ChainSymbol}.\n * @property {number} value - The numeric value associated with the specified chain.\n */\nexport type CctpDomains = Record<string, number>;\n\nconst COMPUTE_UNIT_LIMIT = 1000000;\n\nconst JUP_ADD_INDEX = 1.1;\n\nexport class SolanaBridgeService extends ChainBridgeService {\n chainType: ChainType.SOLANA = ChainType.SOLANA;\n jupiterService: JupiterService;\n\n constructor(\n public solanaRpcUrl: string,\n public params: SolanaBridgeParams,\n public api: AllbridgeCoreClient\n ) {\n super();\n this.jupiterService = new JupiterService(solanaRpcUrl, params.jupiterParams);\n }\n\n async buildRawTransactionSwap(params: SwapParams): Promise<RawTransaction> {\n const txSwapParams = prepareTxSwapParams(this.chainType, params);\n return await this.buildSwapTransaction(\n txSwapParams,\n params.sourceToken.poolAddress,\n params.destinationToken.poolAddress,\n params.txFeeParams\n );\n }\n\n private async buildSwapTransaction(\n params: TxSwapParamsSol,\n poolAddress: string,\n toPoolAddress: string,\n txFeeParams?: TxFeeParams\n ): Promise<VersionedTransaction> {\n const {\n fromAccountAddress,\n amount,\n contractAddress,\n fromTokenAddress,\n toTokenAddress,\n toAccountAddress,\n minimumReceiveAmount,\n } = params;\n const account = fromAccountAddress;\n const bridgeAddress = contractAddress;\n const tokenAddress = fromTokenAddress;\n const receiveTokenAddress = toTokenAddress;\n const receivePoolAddress = toPoolAddress;\n const receiverOriginal = toAccountAddress;\n\n const userAccount = new PublicKey(account);\n const provider = buildAnchorProvider(this.solanaRpcUrl, userAccount.toString());\n const bridge = new Program<BridgeType>(bridgeIdl, bridgeAddress, provider);\n\n const bridgeAuthority = await getAuthorityAccount(bridge.programId);\n const configAccount = await getConfigAccount(bridge.programId);\n\n const sendMint = new PublicKey(tokenAddress);\n const sendBridgeToken = await getBridgeTokenAccount(sendMint, bridge.programId);\n const sendPool = new PublicKey(poolAddress);\n const sendUserToken = await getAssociatedAccount(userAccount, sendMint);\n\n const receiverAccount = new PublicKey(receiverOriginal);\n const receiveMint = new PublicKey(receiveTokenAddress);\n const receiveBridgeToken = await getBridgeTokenAccount(receiveMint, bridge.programId);\n const receivePool = new PublicKey(receivePoolAddress);\n const receiveUserToken = await getAssociatedAccount(receiverAccount, receiveMint);\n\n const preInstructions: TransactionInstruction[] = [\n web3.ComputeBudgetProgram.setComputeUnitLimit({\n units: COMPUTE_UNIT_LIMIT,\n }),\n ];\n\n try {\n await getTokenAccountData(receiveUserToken, provider);\n } catch (e) {\n const associatedProgram = Spl.associatedToken(provider);\n const createReceiveUserTokenInstruction: TransactionInstruction = await associatedProgram.methods\n .create()\n .accounts({\n mint: receiveMint,\n owner: receiverAccount,\n associatedAccount: receiveUserToken,\n })\n .instruction();\n preInstructions.push(createReceiveUserTokenInstruction);\n }\n const transaction = await bridge.methods\n .swap(new BN(amount), new BN(minimumReceiveAmount || 0))\n .accounts({\n payer: userAccount,\n config: configAccount,\n bridgeAuthority,\n user: userAccount,\n sendBridgeToken,\n sendMint,\n sendPool,\n sendUserToken,\n receiveBridgeToken,\n receiveMint,\n receivePool,\n receiveUserToken,\n })\n .preInstructions(preInstructions)\n .transaction();\n\n const connection = provider.connection;\n transaction.recentBlockhash = (await connection.getLatestBlockhash()).blockhash;\n transaction.feePayer = userAccount;\n await addUnitLimitAndUnitPriceToTx(transaction, txFeeParams, this.solanaRpcUrl);\n return await this.convertToVersionedTransaction(transaction, connection);\n }\n\n async buildRawTransactionSend(params: SendParams): Promise<RawTransaction> {\n const txSendParams = await prepareTxSendParams(this.chainType, params, this.api);\n let solTxSendParams = this.addPoolAddress(params, txSendParams);\n\n const isJupiterForStableCoin = solTxSendParams.gasFeePaymentMethod == FeePaymentMethod.WITH_STABLECOIN;\n\n let jupTx;\n if (isJupiterForStableCoin) {\n try {\n const { tx, solTxSendUpdatedParams } = await this.processJup(solTxSendParams, params, true);\n jupTx = tx;\n solTxSendParams = { ...solTxSendParams, ...solTxSendUpdatedParams };\n } catch (e) {\n try {\n const { tx, solTxSendUpdatedParams } = await this.processJup(solTxSendParams, params, false);\n jupTx = tx;\n solTxSendParams = { ...solTxSendParams, ...solTxSendUpdatedParams };\n } catch (e) {\n if (e instanceof SdkRootError) {\n throw e;\n }\n if (e instanceof Error && e.message) {\n throw new JupiterError(`Some error occurred during creation Jupiter swap transaction. ${e.message}`);\n }\n throw new JupiterError(\"Some error occurred during creation Jupiter swap transaction\");\n }\n }\n }\n\n let swapAndBridgeTx: VersionedTransaction;\n let requiredMessageSigner: Keypair | undefined = undefined;\n switch (txSendParams.messenger) {\n case Messenger.ALLBRIDGE: {\n const swapAndBridgeSolData = await this.prepareSwapAndBridgeData(solTxSendParams);\n swapAndBridgeTx = await this.buildSwapAndBridgeAllbridgeTransaction(swapAndBridgeSolData);\n break;\n }\n case Messenger.WORMHOLE: {\n const swapAndBridgeSolData = await this.prepareSwapAndBridgeData(solTxSendParams);\n const { transaction, messageAccount } = await this.buildSwapAndBridgeWormholeTransaction(swapAndBridgeSolData);\n swapAndBridgeTx = transaction;\n requiredMessageSigner = messageAccount;\n break;\n }\n case Messenger.CCTP:\n case Messenger.CCTP_V2: {\n const swapAndBridgeSolData = await this.prepareSwapAndBridgeCctpData(solTxSendParams);\n const { transaction, messageSentEventDataKeypair } = await this.buildSwapAndBridgeCctpTransaction(\n params.destinationToken.chainSymbol,\n swapAndBridgeSolData\n );\n swapAndBridgeTx = transaction;\n requiredMessageSigner = messageSentEventDataKeypair;\n break;\n }\n case Messenger.OFT:\n throw new OFTDoesNotSupportedError(\"Messenger OFT is not supported yet.\");\n }\n\n if (isJupiterForStableCoin) {\n if (!jupTx) {\n throw new JupiterError(\"Swap tx is absent\");\n }\n swapAndBridgeTx = await this.jupiterService.amendJupiterWithSdkTx(jupTx, swapAndBridgeTx);\n }\n\n await addUnitLimitAndUnitPriceToVersionedTx(swapAndBridgeTx, params.txFeeParams, this.solanaRpcUrl);\n\n if (requiredMessageSigner) {\n swapAndBridgeTx.sign([requiredMessageSigner]);\n }\n return swapAndBridgeTx;\n }\n\n private async processJup(\n solTxSendParams: SolTxSendParams,\n params: SendParams,\n exactOut: boolean\n ): Promise<{\n tx: VersionedTransaction;\n solTxSendUpdatedParams: {\n amount: string;\n fee: string;\n extraGas?: string;\n gasFeePaymentMethod: FeePaymentMethod;\n };\n }> {\n const { fee, extraGas, gasFeePaymentMethod } = await this.convertStableCoinFeeAndExtraGasToNativeCurrency(\n params.sourceToken,\n solTxSendParams\n );\n\n let amountToProcess = exactOut ? Big(fee) : Big(solTxSendParams.fee);\n if (extraGas) {\n amountToProcess = amountToProcess.plus(extraGas);\n }\n if (!exactOut) {\n amountToProcess = amountToProcess.mul(JUP_ADD_INDEX);\n }\n\n const { tx, amountIn } = await this.jupiterService.getJupiterSwapTx(\n params.fromAccountAddress,\n params.sourceToken.tokenAddress,\n amountToProcess.toFixed(0),\n exactOut\n );\n\n let newAmount: string;\n if (exactOut) {\n if (!amountIn) {\n throw new JupiterError(\"Cannot get inAmount\");\n }\n newAmount = Big(solTxSendParams.amount).minus(Big(amountIn).mul(JUP_ADD_INDEX)).toFixed(0);\n } else {\n newAmount = Big(solTxSendParams.amount).minus(amountToProcess).toFixed(0);\n }\n if (Big(newAmount).lte(0)) {\n throw new AmountNotEnoughError(\n `Amount not enough to pay fee, ${convertIntAmountToFloat(\n Big(newAmount).minus(1).neg(),\n params.sourceToken.decimals\n ).toFixed()} stables is missing`\n );\n }\n return {\n tx: tx,\n solTxSendUpdatedParams: {\n amount: newAmount,\n fee: fee,\n extraGas: extraGas,\n gasFeePaymentMethod: gasFeePaymentMethod,\n },\n };\n }\n\n private addPoolAddress(params: SendParams, txSendParams: TxSendParamsSol): SolTxSendParams {\n return {\n ...txSendParams,\n poolAddress: params.sourceToken.poolAddress,\n };\n }\n\n async convertStableCoinFeeAndExtraGasToNativeCurrency(\n sourceToken: TokenWithChainDetails,\n solTxSendParams: SolTxSendParams\n ): Promise<{ fee: string; extraGas?: string; gasFeePaymentMethod: FeePaymentMethod }> {\n if (solTxSendParams.gasFeePaymentMethod == FeePaymentMethod.WITH_STABLECOIN) {\n const sourceNativeTokenPrice = (\n await this.api.getReceiveTransactionCost({\n sourceChainId: solTxSendParams.fromChainId,\n destinationChainId: solTxSendParams.toChainId,\n messenger: solTxSendParams.messenger,\n sourceToken: sourceToken.tokenAddress,\n })\n ).sourceNativeTokenPrice;\n const fee = Big(solTxSendParams.fee)\n .div(sourceNativeTokenPrice)\n .mul(Big(10).pow(Chains.getChainDecimalsByType(ChainType.SOLANA) - sourceToken.decimals))\n .toFixed(0);\n let extraGas;\n if (solTxSendParams.extraGas) {\n extraGas = Big(solTxSendParams.extraGas)\n .div(sourceNativeTokenPrice)\n .mul(Big(10).pow(Chains.getChainDecimalsByType(ChainType.SOLANA) - sourceToken.decimals))\n .toFixed(0);\n }\n return { fee, extraGas, gasFeePaymentMethod: FeePaymentMethod.WITH_NATIVE_CURRENCY };\n }\n return {\n fee: solTxSendParams.fee,\n extraGas: solTxSendParams.extraGas,\n gasFeePaymentMethod: FeePaymentMethod.WITH_NATIVE_CURRENCY,\n };\n }\n\n private getExtraGasInstruction(\n extraGas: string,\n userAccount: PublicKey,\n configAccount: PublicKey\n ): TransactionInstruction | undefined {\n return web3.SystemProgram.transfer({\n fromPubkey: userAccount,\n toPubkey: configAccount,\n lamports: +extraGas,\n });\n }\n\n private async prepareSwapAndBridgeData(txSendParams: SolTxSendParams): Promise<SwapAndBridgeSolData> {\n const {\n amount,\n contractAddress,\n fromChainId,\n fromAccountAddress,\n fromTokenAddress,\n toChainId,\n toAccountAddress,\n toTokenAddress,\n poolAddress,\n extraGas,\n } = txSendParams;\n const tokenAddress = fromTokenAddress;\n const account = fromAccountAddress;\n const destinationChainId = toChainId;\n const receiveTokenAddress = toTokenAddress;\n const receiverInBuffer32 = toAccountAddress;\n const bridgeAddress = contractAddress;\n const sourceChainId = fromChainId;\n\n const provider = buildAnchorProvider(this.solanaRpcUrl, account);\n const bridge = new Program<BridgeType>(bridgeIdl, bridgeAddress, provider);\n const nonce = Array.from(getNonce());\n const poolAccount = new PublicKey(poolAddress);\n const vUsdAmount = await getVUsdAmount(amount, bridge, poolAccount);\n\n const lockAccount = await getLockAccount(nonce, bridge.programId);\n const bridgeAuthority = await getAuthorityAccount(bridge.programId);\n const userToken = await getAssociatedAccount(new PublicKey(account), new PublicKey(tokenAddress));\n const bridgeTokenAccount = await getBridgeTokenAccount(new PublicKey(tokenAddress), bridge.programId);\n const chainBridgeAccount = await getChainBridgeAccount(destinationChainId, bridge.programId);\n const otherBridgeTokenAccount = await getOtherChainTokenAccount(\n destinationChainId,\n Buffer.from(receiveTokenAddress),\n bridge.programId\n );\n\n const configAccount = await getConfigAccount(bridge.programId);\n const configAccountInfo = await bridge.account.config.fetch(configAccount);\n const priceAccount = await getPriceAccount(destinationChainId, configAccountInfo.gasOracleProgramId);\n const thisGasPriceAccount = await getPriceAccount(sourceChainId, configAccountInfo.gasOracleProgramId);\n\n const message = getMessage({\n amount: vUsdAmount,\n recipient: Buffer.from(receiverInBuffer32),\n nonce: Buffer.from(nonce),\n receiveToken: Buffer.from(receiveTokenAddress),\n destinationChainId,\n sourceChainId,\n chainBridge: (await getAuthorityAccount(bridge.programId)).toBuffer(),\n });\n\n const swapAndBridgeData = {} as SwapAndBridgeSolData;\n\n swapAndBridgeData.bridge = bridge;\n swapAndBridgeData.amount = new BN(amount);\n swapAndBridgeData.vusdAmount = new BN(vUsdAmount);\n swapAndBridgeData.nonce = nonce;\n swapAndBridgeData.recipient = Array.from(receiverInBuffer32);\n swapAndBridgeData.receiveToken = Array.from(receiveTokenAddress);\n swapAndBridgeData.poolAccount = poolAccount;\n swapAndBridgeData.lockAccount = lockAccount;\n swapAndBridgeData.bridgeAuthority = bridgeAuthority;\n swapAndBridgeData.userToken = userToken;\n swapAndBridgeData.bridgeTokenAccount = bridgeTokenAccount;\n swapAndBridgeData.chainBridgeAccount = chainBridgeAccount;\n swapAndBridgeData.otherBridgeTokenAccount = otherBridgeTokenAccount;\n swapAndBridgeData.userAccount = new PublicKey(account);\n swapAndBridgeData.destinationChainId = destinationChainId;\n // @ts-expect-error\n swapAndBridgeData.mint = new PublicKey(tokenAddress);\n swapAndBridgeData.config = configAccount;\n swapAndBridgeData.configAccountInfo = configAccountInfo;\n swapAndBridgeData.gasPrice = priceAccount;\n swapAndBridgeData.thisGasPrice = thisGasPriceAccount;\n swapAndBridgeData.message = message;\n\n if (extraGas) {\n swapAndBridgeData.extraGasInstruction = this.getExtraGasInstruction(\n extraGas,\n swapAndBridgeData.userAccount,\n configAccount\n );\n }\n return swapAndBridgeData;\n }\n\n private async buildSwapAndBridgeAllbridgeTransaction(\n swapAndBridgeData: SwapAndBridgeSolData\n ): Promise<VersionedTransaction> {\n const {\n bridge,\n vusdAmount,\n nonce,\n recipient,\n receiveToken,\n poolAccount,\n lockAccount,\n bridgeAuthority,\n userToken,\n bridgeTokenAccount,\n chainBridgeAccount,\n otherBridgeTokenAccount,\n userAccount,\n destinationChainId,\n mint,\n config,\n configAccountInfo,\n gasPrice,\n thisGasPrice,\n message,\n extraGasInstruction,\n } = swapAndBridgeData;\n const allbridgeMessengerProgramId = configAccountInfo.allbridgeMessengerProgramId;\n const messengerGasUsageAccount = await getGasUsageAccount(destinationChainId, allbridgeMessengerProgramId);\n const messengerConfig = await getConfigAccount(allbridgeMessengerProgramId);\n\n const sentMessageAccount = await getSendMessageAccount(message, allbridgeMessengerProgramId);\n\n const instructions: TransactionInstruction[] = [];\n if (extraGasInstruction) {\n instructions.push(extraGasInstruction);\n }\n\n const transaction = await bridge.methods\n .swapAndBridge({\n vusdAmount,\n nonce,\n destinationChainId,\n recipient,\n receiveToken,\n })\n .accounts({\n mint,\n user: userAccount,\n config,\n lock: lockAccount,\n pool: poolAccount,\n gasPrice,\n thisGasPrice,\n bridgeAuthority,\n userToken,\n bridgeToken: bridgeTokenAccount,\n chainBridge: chainBridgeAccount,\n messenger: allbridgeMessengerProgramId,\n messengerGasUsage: messengerGasUsageAccount,\n messengerConfig,\n sentMessageAccount,\n otherBridgeToken: otherBridgeTokenAccount,\n })\n .preInstructions([\n web3.ComputeBudgetProgram.setComputeUnitLimit({\n units: COMPUTE_UNIT_LIMIT,\n }),\n ])\n .postInstructions(instructions)\n .transaction();\n const connection = buildAnchorProvider(this.solanaRpcUrl, userAccount.toString()).connection;\n transaction.recentBlockhash = (await connection.getLatestBlockhash()).blockhash;\n transaction.feePayer = userAccount;\n return await this.convertToVersionedTransaction(transaction, connection);\n }\n\n private async convertToVersionedTransaction(tx: Transaction, connection: Connection): Promise<VersionedTransaction> {\n const allbridgeTableAccount = await connection\n .getAddressLookupTable(new PublicKey(this.params.solanaLookUpTable))\n .then((res) => res.value);\n if (!allbridgeTableAccount) {\n throw new SdkError(\"Cannot find allbridgeLookupTableAccount\");\n }\n const messageV0 = new web3.TransactionMessage({\n payerKey: tx.feePayer,\n recentBlockhash: tx.recentBlockhash,\n instructions: tx.instructions,\n } as TransactionMessageArgs).compileToV0Message([allbridgeTableAccount]);\n return new web3.VersionedTransaction(messageV0);\n }\n\n private async buildSwapAndBridgeWormholeTransaction(\n swapAndBridgeData: SwapAndBridgeSolData\n ): Promise<{ transaction: VersionedTransaction; messageAccount: Keypair }> {\n const {\n bridge,\n vusdAmount,\n nonce,\n recipient,\n receiveToken,\n poolAccount,\n lockAccount,\n bridgeAuthority,\n userToken,\n bridgeTokenAccount,\n chainBridgeAccount,\n otherBridgeTokenAccount,\n userAccount,\n destinationChainId,\n mint,\n config,\n configAccountInfo,\n gasPrice,\n thisGasPrice,\n message,\n extraGasInstruction,\n } = swapAndBridgeData;\n const wormholeProgramId = this.params.wormholeMessengerProgramId;\n\n const [whBridgeAccount] = PublicKey.findProgramAddressSync(\n [Buffer.from(\"Bridge\")],\n new PublicKey(wormholeProgramId)\n );\n const [whFeeCollectorAccount] = PublicKey.findProgramAddressSync(\n [Buffer.from(\"fee_collector\")],\n new PublicKey(wormholeProgramId)\n );\n const [whSequenceAccount] = PublicKey.findProgramAddressSync(\n [Buffer.from(\"Sequence\"), bridgeAuthority.toBuffer()],\n new PublicKey(wormholeProgramId)\n );\n\n const messengerGasUsageAccount = await getGasUsageAccount(\n destinationChainId,\n configAccountInfo.wormholeMessengerProgramId\n );\n const wormholeMessengerConfigAccount = await getConfigAccount(configAccountInfo.wormholeMessengerProgramId);\n const messageAccount = Keypair.generate();\n\n const provider = buildAnchorProvider(this.solanaRpcUrl, userAccount.toString());\n\n const bridgeAccountInfo = await provider.connection.getAccountInfo(whBridgeAccount);\n if (bridgeAccountInfo == null) {\n throw new SdkError(\"Cannot fetch wormhole bridge account info\");\n }\n const feeLamports = new BN(bridgeAccountInfo.data.slice(16, 24), \"le\").toString();\n\n const feeInstruction = SystemProgram.transfer({\n fromPubkey: userAccount,\n toPubkey: whFeeCollectorAccount,\n lamports: +feeLamports,\n });\n\n const instructions: TransactionInstruction[] = [];\n if (extraGasInstruction) {\n instructions.push(extraGasInstruction);\n }\n\n const accounts = {\n mint,\n user: userAccount,\n config,\n lock: lockAccount,\n pool: poolAccount,\n gasPrice,\n thisGasPrice,\n bridgeAuthority,\n userToken,\n bridgeToken: bridgeTokenAccount,\n chainBridge: chainBridgeAccount,\n otherBridgeToken: otherBridgeTokenAccount,\n messengerGasUsage: messengerGasUsageAccount,\n wormholeProgram: wormholeProgramId,\n bridge: whBridgeAccount,\n message: messageAccount.publicKey,\n wormholeMessenger: configAccountInfo.wormholeMessengerProgramId,\n sequence: whSequenceAccount,\n feeCollector: whFeeCollectorAccount,\n wormholeMessengerConfig: wormholeMessengerConfigAccount,\n clock: web3.SYSVAR_CLOCK_PUBKEY,\n };\n\n const transaction = await bridge.methods\n .swapAndBridgeWormhole({\n vusdAmount,\n nonce: nonce,\n destinationChainId,\n recipient,\n receiveToken,\n })\n .accounts(accounts)\n .preInstructions([\n web3.ComputeBudgetProgram.setComputeUnitLimit({\n units: COMPUTE_UNIT_LIMIT,\n }),\n feeInstruction,\n ])\n .postInstructions(instructions)\n .signers([messageAccount])\n .transaction();\n transaction.recentBlockhash = (await provider.connection.getLatestBlockhash()).blockhash;\n transaction.feePayer = userAccount;\n return { transaction: await this.convertToVersionedTransaction(transaction, provider.connection), messageAccount };\n }\n\n private async prepareSwapAndBridgeCctpData(txSendParams: SolTxSendParams): Promise<SwapAndBridgeSolDataCctpData> {\n const {\n contractAddress,\n amount,\n fromAccountAddress,\n fromTokenAddress,\n toChainId,\n toAccountAddress,\n toTokenAddress,\n extraGas,\n } = txSendParams;\n const cctpAddress = contractAddress;\n if (!cctpAddress) {\n throw new CCTPDoesNotSupportedError(\"Such route does not support CCTP protocol\");\n }\n const CHAIN_ID = 4;\n\n const account = fromAccountAddress;\n const receiveTokenAddress = toTokenAddress;\n const receiverInBuffer32 = toAccountAddress;\n\n const provider = buildAnchorProvider(this.solanaRpcUrl, account);\n const cctpBridge: Program<CctpBridgeType> = new Program<CctpBridgeType>(cctpBridgeIdl, cctpAddress, provider);\n const mint = new PublicKey(fromTokenAddress);\n const cctpBridgeAccount = await getCctpBridgeAccount(mint, cctpBridge.programId);\n const userAccount = new PublicKey(account);\n\n const configAccountInfo = await cctpBridge.account.cctpBridge.fetch(cctpBridgeAccount);\n\n const swapAndBridgeData = {} as SwapAndBridgeSolDataCctpData;\n\n swapAndBridgeData.cctpBridge = cctpBridge;\n swapAndBridgeData.cctpBridgeAccount = cctpBridgeAccount;\n swapAndBridgeData.cctpAddressAccount = new PublicKey(cctpAddress);\n swapAndBridgeData.amount = new BN(amount);\n swapAndBridgeData.recipient = Array.from(receiverInBuffer32);\n swapAndBridgeData.receiveToken = Array.from(receiveTokenAddress);\n swapAndBridgeData.userToken = await getAssociatedAccount(userAccount, mint);\n swapAndBridgeData.bridgeAuthority = await getCctpAuthorityAccount(cctpBridgeAccount, cctpBridge.programId);\n swapAndBridgeData.bridgeTokenAccount = await getCctpBridgeTokenAccount(mint, cctpBridge.programId);\n swapAndBridgeData.chainBridgeAccount = await getChainBridgeAccount(toChainId, cctpBridge.programId);\n swapAndBridgeData.userAccount = userAccount;\n swapAndBridgeData.destinationChainId = toChainId;\n swapAndBridgeData.mint = mint;\n swapAndBridgeData.gasPrice = await getPriceAccount(toChainId, configAccountInfo.gasOracleProgramId);\n swapAndBridgeData.thisGasPrice = await getPriceAccount(CHAIN_ID, configAccountInfo.gasOracleProgramId);\n swapAndBridgeData.provider = provider;\n\n if (extraGas) {\n swapAndBridgeData.extraGasInstruction = this.getExtraGasInstruction(\n extraGas,\n swapAndBridgeData.userAccount,\n cctpBridgeAccount\n );\n }\n return swapAndBridgeData;\n }\n\n async buildSwapAndBridgeCctpTransaction(\n destinationChainSymbol: string,\n swapAndBridgeData: SwapAndBridgeSolDataCctpData\n ): Promise<{ transaction: VersionedTransaction; messageSentEventDataKeypair: Keypair }> {\n const {\n cctpBridge,\n cctpBridgeAccount,\n amount,\n recipient,\n receiveToken,\n bridgeAuthority,\n userToken,\n bridgeTokenAccount,\n chainBridgeAccount,\n userAccount,\n destinationChainId,\n mint,\n gasPrice,\n thisGasPrice,\n extraGasInstruction,\n provider,\n } = swapAndBridgeData;\n const domain = this.params.cctpParams.cctpDomains[destinationChainSymbol];\n const cctpTransmitterProgramIdAddress = this.params.cctpParams.cctpTransmitterProgramId;\n const cctpTokenMessengerMinterAddress = this.params.cctpParams.cctpTokenMessengerMinter;\n if (domain == undefined || !cctpTransmitterProgramIdAddress || !cctpTokenMessengerMinterAddress) {\n throw new SdkError(\"CCTP is not configured\");\n }\n const cctpTransmitterProgramId = new PublicKey(cctpTransmitterProgramIdAddress);\n const cctpTokenMessengerMinter = new PublicKey(cctpTokenMessengerMinterAddress);\n const {\n messageTransmitterAccount,\n tokenMessenger,\n tokenMessengerEventAuthority,\n tokenMinter,\n localToken,\n remoteTokenMessengerKey,\n authorityPda,\n } = getCctpAccounts(domain, mint, cctpTransmitterProgramId, cctpTokenMessengerMinter);\n\n const instructions: TransactionInstruction[] = [];\n if (extraGasInstruction) {\n instructions.push(extraGasInstruction);\n }\n\n const messageSentEventDataKeypair = Keypair.generate();\n const lockAccount = getCctpLockAccount(cctpBridge.programId, messageSentEventDataKeypair.publicKey);\n\n const tx = await cctpBridge.methods\n .bridge({\n amount,\n destinationChainId,\n recipient,\n receiveToken,\n })\n .accounts({\n mint: mint,\n user: userAccount,\n cctpBridge: cctpBridgeAccount,\n\n messageSentEventData: messageSentEventDataKeypair.publicKey,\n lock: lockAccount,\n\n cctpMessenger: cctpTokenMessengerMinter,\n messageTransmitterProgram: cctpTransmitterProgramId,\n messageTransmitterAccount: messageTransmitterAccount,\n tokenMessenger: tokenMessenger,\n tokenMinter: tokenMinter,\n localToken: localToken,\n remoteTokenMessengerKey: remoteTokenMessengerKey,\n authorityPda: authorityPda,\n eventAuthority: tokenMessengerEventAuthority,\n\n bridgeToken: bridgeTokenAccount,\n gasPrice: gasPrice,\n thisGasPrice: thisGasPrice,\n chainBridge: chainBridgeAccount,\n userToken,\n bridgeAuthority: bridgeAuthority,\n })\n .preInstructions([\n web3.ComputeBudgetProgram.setComputeUnitLimit({\n units: 2000000,\n }),\n ])\n .postInstructions(instructions)\n .transaction();\n const connection = provider.connection;\n tx.recentBlockhash = (await connection.getLatestBlockhash()).blockhash;\n tx.feePayer = userAccount;\n return { transaction: await this.convertToVersionedTransaction(tx, connection), messageSentEventDataKeypair };\n }\n\n send(params: SendParams): Promise<TransactionResponse> {\n throw new MethodNotSupportedError();\n }\n}\n\ninterface SolTxSendParams extends TxSendParamsSol {\n poolAddress: string;\n}\n", "export interface Bridge {\n version: \"0.1.0\";\n name: \"bridge\";\n instructions: [\n {\n name: \"initialize\";\n accounts: [\n {\n name: \"admin\";\n isMut: true;\n isSigner: true;\n },\n {\n name: \"config\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"systemProgram\";\n isMut: false;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"args\";\n type: {\n defined: \"InitializeArgs\";\n };\n },\n ];\n },\n {\n name: \"initializePool\";\n accounts: [\n {\n name: \"payer\";\n isMut: true;\n isSigner: true;\n },\n {\n name: \"admin\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"config\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"pool\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"bridgeAuthority\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"mint\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"token\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"tokenProgram\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"systemProgram\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"rent\";\n isMut: false;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"args\";\n type: {\n defined: \"InitializePoolArgs\";\n };\n },\n ];\n },\n {\n name: \"initDepositAccount\";\n accounts: [\n {\n name: \"user\";\n isMut: true;\n isSigner: true;\n },\n {\n name: \"payer\";\n isMut: true;\n isSigner: true;\n },\n {\n name: \"mint\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"userDeposit\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"systemProgram\";\n isMut: false;\n isSigner: false;\n },\n ];\n args: [];\n },\n {\n name: \"deposit\";\n accounts: [\n {\n name: \"user\";\n isMut: true;\n isSigner: true;\n },\n {\n name: \"mint\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"config\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"pool\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"bridgeToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"userToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"userDeposit\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"bridgeAuthority\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"tokenProgram\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"systemProgram\";\n isMut: false;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"amount\";\n type: \"u64\";\n },\n ];\n },\n {\n name: \"withdraw\";\n accounts: [\n {\n name: \"user\";\n isMut: true;\n isSigner: true;\n },\n {\n name: \"mint\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"config\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"pool\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"bridgeToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"userToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"userDeposit\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"bridgeAuthority\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"tokenProgram\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"systemProgram\";\n isMut: false;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"amountLp\";\n type: \"u64\";\n },\n ];\n },\n {\n name: \"swapAndBridge\";\n accounts: [\n {\n name: \"user\";\n isMut: true;\n isSigner: true;\n },\n {\n name: \"payer\";\n isMut: true;\n isSigner: true;\n },\n {\n name: \"lock\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"mint\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"config\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"otherBridgeToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"messenger\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"messengerConfig\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"sentMessageAccount\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"messengerGasUsage\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"pool\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"bridgeToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"gasPrice\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"thisGasPrice\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"chainBridge\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"userToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"bridgeAuthority\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"tokenProgram\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"systemProgram\";\n isMut: false;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"args\";\n type: {\n defined: \"BridgeArgs\";\n };\n },\n ];\n },\n {\n name: \"swapAndBridgeWormhole\";\n accounts: [\n {\n name: \"user\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"payer\";\n isMut: true;\n isSigner: true;\n },\n {\n name: \"lock\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"mint\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"config\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"otherBridgeToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"pool\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"bridgeToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"gasPrice\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"thisGasPrice\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"chainBridge\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"userToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"bridgeAuthority\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"wormholeMessenger\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"wormholeMessengerConfig\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"wormholeProgram\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"bridge\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"message\";\n isMut: true;\n isSigner: true;\n },\n {\n name: \"sequence\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"feeCollector\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"messengerGasUsage\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"clock\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"rent\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"tokenProgram\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"systemProgram\";\n isMut: false;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"args\";\n type: {\n defined: \"BridgeArgs\";\n };\n },\n ];\n },\n {\n name: \"swap\";\n accounts: [\n {\n name: \"user\";\n isMut: true;\n isSigner: true;\n },\n {\n name: \"payer\";\n isMut: true;\n isSigner: true;\n },\n {\n name: \"sendMint\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"receiveMint\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"config\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"sendPool\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"receivePool\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"sendBridgeToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"receiveBridgeToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"sendUserToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"receiveUserToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"bridgeAuthority\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"tokenProgram\";\n isMut: false;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"amount\";\n type: \"u64\";\n },\n {\n name: \"receiveAmountMin\";\n type: \"u64\";\n },\n ];\n },\n {\n name: \"registerChainBridge\";\n accounts: [\n {\n name: \"admin\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"payer\";\n isMut: true;\n isSigner: true;\n },\n {\n name: \"config\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"chainBridge\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"systemProgram\";\n isMut: false;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"args\";\n type: {\n defined: \"RegisterChainBridgeArgs\";\n };\n },\n ];\n },\n {\n name: \"updateChainBridge\";\n accounts: [\n {\n name: \"admin\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"config\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"chainBridge\";\n isMut: true;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"args\";\n type: {\n defined: \"UpdateChainBridgeArgs\";\n };\n },\n ];\n },\n {\n name: \"receiveAndSwap\";\n accounts: [\n {\n name: \"user\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"payer\";\n isMut: true;\n isSigner: true;\n },\n {\n name: \"mint\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"config\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"pool\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"bridgeToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"receivedMessageAccount\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"unlock\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"chainBridge\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"userToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"bridgeAuthority\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"tokenProgram\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"systemProgram\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"messengerProgram\";\n isMut: false;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"args\";\n type: {\n defined: \"UnlockArgs\";\n };\n },\n ];\n },\n {\n name: \"receiveAndSwapWormhole\";\n accounts: [\n {\n name: \"user\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"payer\";\n isMut: true;\n isSigner: true;\n },\n {\n name: \"mint\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"config\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"pool\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"bridgeToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"receivedMessageAccount\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"unlock\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"chainBridge\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"userToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"bridgeAuthority\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"tokenProgram\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"systemProgram\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"messengerProgram\";\n isMut: false;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"args\";\n type: {\n defined: \"UnlockArgs\";\n };\n },\n ];\n },\n {\n name: \"withdrawGasToken\";\n accounts: [\n {\n name: \"admin\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"recipient\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"config\";\n isMut: true;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"amount\";\n type: \"u64\";\n },\n ];\n },\n {\n name: \"claimRewards\";\n accounts: [\n {\n name: \"user\";\n isMut: true;\n isSigner: true;\n },\n {\n name: \"mint\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"config\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"pool\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"bridgeToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"userToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"userDeposit\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"bridgeAuthority\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"tokenProgram\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"systemProgram\";\n isMut: false;\n isSigner: false;\n },\n ];\n args: [];\n },\n {\n name: \"setAdmin\";\n accounts: [\n {\n name: \"admin\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"newAdmin\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"config\";\n isMut: true;\n isSigner: false;\n },\n ];\n args: [];\n },\n {\n name: \"startBridge\";\n accounts: [\n {\n name: \"admin\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"config\";\n isMut: true;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"actionType\";\n type: {\n defined: \"ActionType\";\n };\n },\n ];\n },\n {\n name: \"stopBridge\";\n accounts: [\n {\n name: \"stopAuthority\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"config\";\n isMut: true;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"actionType\";\n type: {\n defined: \"ActionType\";\n };\n },\n ];\n },\n {\n name: \"setRebalancer\";\n accounts: [\n {\n name: \"admin\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"config\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"rebalancer\";\n isMut: false;\n isSigner: false;\n },\n ];\n args: [];\n },\n {\n name: \"setStopAuthority\";\n accounts: [\n {\n name: \"admin\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"newAuthority\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"config\";\n isMut: true;\n isSigner: false;\n },\n ];\n args: [];\n },\n {\n name: \"setAllbridgeMessengerProgramId\";\n accounts: [\n {\n name: \"admin\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"config\";\n isMut: true;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"newProgramId\";\n type: \"publicKey\";\n },\n ];\n },\n {\n name: \"setWormholeMessengerProgramId\";\n accounts: [\n {\n name: \"admin\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"config\";\n isMut: true;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"newProgramId\";\n type: \"publicKey\";\n },\n ];\n },\n {\n name: \"setGasOracleProgramId\";\n accounts: [\n {\n name: \"admin\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"config\";\n isMut: true;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"newProgramId\";\n type: \"publicKey\";\n },\n ];\n },\n {\n name: \"setPoolFeeShare\";\n accounts: [\n {\n name: \"admin\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"config\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"pool\";\n isMut: true;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"feeShareBp\";\n type: \"u64\";\n },\n ];\n },\n {\n name: \"setBalanceRatioMin\";\n accounts: [\n {\n name: \"admin\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"config\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"pool\";\n isMut: true;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"balanceRatioMinBp\";\n type: \"u16\";\n },\n ];\n },\n {\n name: \"setPoolAdminFeeShare\";\n accounts: [\n {\n name: \"admin\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"config\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"pool\";\n isMut: true;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"feeShareBp\";\n type: \"u64\";\n },\n ];\n },\n {\n name: \"addOtherBridgeToken\";\n accounts: [\n {\n name: \"admin\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"payer\";\n isMut: true;\n isSigner: true;\n },\n {\n name: \"config\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"otherBridgeToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"systemProgram\";\n isMut: false;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"chainId\";\n type: \"u8\";\n },\n {\n name: \"tokenAddress\";\n type: {\n array: [\"u8\", 32];\n };\n },\n ];\n },\n {\n name: \"removeOtherBridgeToken\";\n accounts: [\n {\n name: \"admin\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"payer\";\n isMut: true;\n isSigner: true;\n },\n {\n name: \"config\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"otherBridgeToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"systemProgram\";\n isMut: false;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"chainId\";\n type: \"u8\";\n },\n {\n name: \"tokenAddress\";\n type: {\n array: [\"u8\", 32];\n };\n },\n ];\n },\n {\n name: \"withdrawAdminFee\";\n accounts: [\n {\n name: \"admin\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"mint\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"config\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"pool\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"bridgeToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"adminToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"bridgeAuthority\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"tokenProgram\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"systemProgram\";\n isMut: false;\n isSigner: false;\n },\n ];\n args: [];\n },\n {\n name: \"adjustTotalLpAmount\";\n accounts: [\n {\n name: \"admin\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"mint\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"config\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"pool\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"bridgeToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"userToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"userDeposit\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"bridgeAuthority\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"tokenProgram\";\n isMut: false;\n isSigner: false;\n },\n ];\n args: [];\n },\n ];\n accounts: [\n {\n name: \"chainBridge\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"address\";\n type: {\n array: [\"u8\", 32];\n };\n },\n {\n name: \"chainId\";\n type: \"u8\";\n },\n {\n name: \"gasUsage\";\n type: \"u64\";\n },\n ];\n };\n },\n {\n name: \"config\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"admin\";\n type: \"publicKey\";\n },\n {\n name: \"allbridgeMessengerProgramId\";\n type: \"publicKey\";\n },\n {\n name: \"wormholeMessengerProgramId\";\n type: \"publicKey\";\n },\n {\n name: \"gasOracleProgramId\";\n type: \"publicKey\";\n },\n {\n name: \"rebalancer\";\n type: \"publicKey\";\n },\n {\n name: \"stopAuthority\";\n type: \"publicKey\";\n },\n {\n name: \"authorityBumpSeed\";\n type: \"u8\";\n },\n {\n name: \"canSwap\";\n type: \"bool\";\n },\n {\n name: \"canDeposit\";\n type: \"bool\";\n },\n {\n name: \"canWithdraw\";\n type: \"bool\";\n },\n ];\n };\n },\n {\n name: \"lock\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"sender\";\n type: \"publicKey\";\n },\n {\n name: \"sentTokenAddress\";\n type: \"publicKey\";\n },\n {\n name: \"amount\";\n type: \"u64\";\n },\n {\n name: \"vusdAmount\";\n type: \"u64\";\n },\n {\n name: \"recipient\";\n type: {\n array: [\"u8\", 32];\n };\n },\n {\n name: \"destinationChainId\";\n type: \"u8\";\n },\n {\n name: \"receiveToken\";\n type: {\n array: [\"u8\", 32];\n };\n },\n {\n name: \"nonce\";\n type: {\n array: [\"u8\", 32];\n };\n },\n {\n name: \"messenger\";\n type: {\n defined: \"Messenger\";\n };\n },\n {\n name: \"slot\";\n type: \"u64\";\n },\n {\n name: \"fee\";\n type: \"u64\";\n },\n ];\n };\n },\n {\n name: \"otherBridgeToken\";\n type: {\n kind: \"struct\";\n fields: [];\n };\n },\n {\n name: \"pool\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"mint\";\n type: \"publicKey\";\n },\n {\n name: \"a\";\n type: \"u64\";\n },\n {\n name: \"d\";\n type: \"u64\";\n },\n {\n name: \"tokenBalance\";\n type: \"u64\";\n },\n {\n name: \"vUsdBalance\";\n type: \"u64\";\n },\n {\n name: \"reserves\";\n type: \"u64\";\n },\n {\n name: \"decimals\";\n type: \"u8\";\n },\n {\n name: \"totalLpAmount\";\n type: \"u64\";\n },\n {\n name: \"feeShareBp\";\n type: \"u64\";\n },\n {\n name: \"adminFeeShareBp\";\n type: \"u64\";\n },\n {\n name: \"accRewardPerShareP\";\n type: \"u128\";\n },\n {\n name: \"adminFeeAmount\";\n type: \"u64\";\n },\n {\n name: \"balanceRatioMinBp\";\n type: \"u16\";\n },\n ];\n };\n },\n {\n name: \"unlock\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"hash\";\n type: {\n array: [\"u8\", 32];\n };\n },\n {\n name: \"amount\";\n type: \"u64\";\n },\n {\n name: \"fee\";\n type: \"u64\";\n },\n {\n name: \"vUsdAmount\";\n type: \"u64\";\n },\n {\n name: \"slot\";\n type: \"u64\";\n },\n ];\n };\n },\n {\n name: \"userDeposit\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"userAddress\";\n type: \"publicKey\";\n },\n {\n name: \"mint\";\n type: \"publicKey\";\n },\n {\n name: \"lpAmount\";\n type: \"u64\";\n },\n {\n name: \"rewardDebt\";\n type: \"u64\";\n },\n ];\n };\n },\n ];\n types: [\n {\n name: \"RegisterChainBridgeArgs\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"chainBridgeAddress\";\n type: {\n array: [\"u8\", 32];\n };\n },\n {\n name: \"chainId\";\n type: \"u8\";\n },\n {\n name: \"gasUsage\";\n type: \"u64\";\n },\n ];\n };\n },\n {\n name: \"UpdateChainBridgeArgs\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"chainBridgeAddress\";\n type: {\n array: [\"u8\", 32];\n };\n },\n {\n name: \"chainId\";\n type: \"u8\";\n },\n {\n name: \"gasUsage\";\n type: \"u64\";\n },\n ];\n };\n },\n {\n name: \"InitializeArgs\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"allbridgeMessengerProgramId\";\n type: \"publicKey\";\n },\n {\n name: \"wormholeMessengerProgramId\";\n type: \"publicKey\";\n },\n {\n name: \"gasOracleProgramId\";\n type: \"publicKey\";\n },\n ];\n };\n },\n {\n name: \"InitializePoolArgs\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"a\";\n type: \"u64\";\n },\n {\n name: \"feeShareBp\";\n type: \"u64\";\n },\n {\n name: \"adminFeeShareBp\";\n type: \"u64\";\n },\n {\n name: \"balanceRatioMinBp\";\n type: \"u16\";\n },\n ];\n };\n },\n {\n name: \"BridgeArgs\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"nonce\";\n type: {\n array: [\"u8\", 32];\n };\n },\n {\n name: \"recipient\";\n type: {\n array: [\"u8\", 32];\n };\n },\n {\n name: \"destinationChainId\";\n type: \"u8\";\n },\n {\n name: \"receiveToken\";\n type: {\n array: [\"u8\", 32];\n };\n },\n {\n name: \"vusdAmount\";\n type: \"u64\";\n },\n ];\n };\n },\n {\n name: \"UnlockArgs\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"nonce\";\n type: {\n array: [\"u8\", 32];\n };\n },\n {\n name: \"amount\";\n type: \"u64\";\n },\n {\n name: \"recipient\";\n type: \"publicKey\";\n },\n {\n name: \"sourceChainId\";\n type: \"u8\";\n },\n {\n name: \"receiveToken\";\n type: \"publicKey\";\n },\n {\n name: \"messenger\";\n type: {\n defined: \"Messenger\";\n };\n },\n {\n name: \"hash\";\n type: {\n array: [\"u8\", 32];\n };\n },\n {\n name: \"receiveAmountMin\";\n type: \"u64\";\n },\n ];\n };\n },\n {\n name: \"RewardError\";\n type: {\n kind: \"enum\";\n variants: [\n {\n name: \"FeeTooHigh\";\n },\n ];\n };\n },\n {\n name: \"Messenger\";\n type: {\n kind: \"enum\";\n variants: [\n {\n name: \"None\";\n },\n {\n name: \"Allbridge\";\n },\n {\n name: \"Wormhole\";\n },\n ];\n };\n },\n {\n name: \"ActionType\";\n type: {\n kind: \"enum\";\n variants: [\n {\n name: \"Deposit\";\n },\n {\n name: \"Withdraw\";\n },\n {\n name: \"Swap\";\n },\n ];\n };\n },\n ];\n errors: [\n {\n code: 6000;\n name: \"AccountAlreadyInitialized\";\n msg: \"This account has already been initialized\";\n },\n {\n code: 6001;\n name: \"AdminAuthorityInvalid\";\n msg: \"This instruction requires admin authority\";\n },\n {\n code: 6002;\n name: \"InvalidSignature\";\n msg: \"Provided signature has wrong signer or message\";\n },\n {\n code: 6003;\n name: \"InvalidHash\";\n msg: \"Wrong unlock message hash\";\n },\n {\n code: 6004;\n name: \"PoolOverflow\";\n msg: \"PoolInfo overflow\";\n },\n {\n code: 6005;\n name: \"ReservesExhausted\";\n msg: \"Reserves exhausted\";\n },\n {\n code: 6006;\n name: \"ZeroAmount\";\n msg: \"Zero amount\";\n },\n {\n code: 6007;\n name: \"ZeroChanges\";\n msg: \"Zero changes\";\n },\n {\n code: 6008;\n name: \"HighVusdAmount\";\n msg: \"vUSD amount is too high\";\n },\n {\n code: 6009;\n name: \"BalanceRatioExceeded\";\n msg: \"Balance ratio exceeded\";\n },\n {\n code: 6010;\n name: \"InsufficientReceivedAmount\";\n msg: \"Received insufficient amount\";\n },\n {\n code: 6011;\n name: \"ForbiddenAction\";\n msg: \"ForbiddenAction\";\n },\n {\n code: 6012;\n name: \"ValueTooHigh\";\n msg: \"Value is too high\";\n },\n ];\n}\n\nexport const IDL: Bridge = {\n version: \"0.1.0\",\n name: \"bridge\",\n instructions: [\n {\n name: \"initialize\",\n accounts: [\n {\n name: \"admin\",\n isMut: true,\n isSigner: true,\n },\n {\n name: \"config\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"systemProgram\",\n isMut: false,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"args\",\n type: {\n defined: \"InitializeArgs\",\n },\n },\n ],\n },\n {\n name: \"initializePool\",\n accounts: [\n {\n name: \"payer\",\n isMut: true,\n isSigner: true,\n },\n {\n name: \"admin\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"config\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"pool\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"bridgeAuthority\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"mint\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"token\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"tokenProgram\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"systemProgram\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"rent\",\n isMut: false,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"args\",\n type: {\n defined: \"InitializePoolArgs\",\n },\n },\n ],\n },\n {\n name: \"initDepositAccount\",\n accounts: [\n {\n name: \"user\",\n isMut: true,\n isSigner: true,\n },\n {\n name: \"payer\",\n isMut: true,\n isSigner: true,\n },\n {\n name: \"mint\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"userDeposit\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"systemProgram\",\n isMut: false,\n isSigner: false,\n },\n ],\n args: [],\n },\n {\n name: \"deposit\",\n accounts: [\n {\n name: \"user\",\n isMut: true,\n isSigner: true,\n },\n {\n name: \"mint\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"config\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"pool\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"bridgeToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"userToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"userDeposit\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"bridgeAuthority\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"tokenProgram\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"systemProgram\",\n isMut: false,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"amount\",\n type: \"u64\",\n },\n ],\n },\n {\n name: \"withdraw\",\n accounts: [\n {\n name: \"user\",\n isMut: true,\n isSigner: true,\n },\n {\n name: \"mint\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"config\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"pool\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"bridgeToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"userToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"userDeposit\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"bridgeAuthority\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"tokenProgram\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"systemProgram\",\n isMut: false,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"amountLp\",\n type: \"u64\",\n },\n ],\n },\n {\n name: \"swapAndBridge\",\n accounts: [\n {\n name: \"user\",\n isMut: true,\n isSigner: true,\n },\n {\n name: \"payer\",\n isMut: true,\n isSigner: true,\n },\n {\n name: \"lock\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"mint\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"config\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"otherBridgeToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"messenger\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"messengerConfig\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"sentMessageAccount\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"messengerGasUsage\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"pool\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"bridgeToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"gasPrice\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"thisGasPrice\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"chainBridge\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"userToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"bridgeAuthority\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"tokenProgram\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"systemProgram\",\n isMut: false,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"args\",\n type: {\n defined: \"BridgeArgs\",\n },\n },\n ],\n },\n {\n name: \"swapAndBridgeWormhole\",\n accounts: [\n {\n name: \"user\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"payer\",\n isMut: true,\n isSigner: true,\n },\n {\n name: \"lock\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"mint\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"config\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"otherBridgeToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"pool\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"bridgeToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"gasPrice\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"thisGasPrice\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"chainBridge\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"userToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"bridgeAuthority\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"wormholeMessenger\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"wormholeMessengerConfig\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"wormholeProgram\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"bridge\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"message\",\n isMut: true,\n isSigner: true,\n },\n {\n name: \"sequence\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"feeCollector\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"messengerGasUsage\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"clock\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"rent\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"tokenProgram\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"systemProgram\",\n isMut: false,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"args\",\n type: {\n defined: \"BridgeArgs\",\n },\n },\n ],\n },\n {\n name: \"swap\",\n accounts: [\n {\n name: \"user\",\n isMut: true,\n isSigner: true,\n },\n {\n name: \"payer\",\n isMut: true,\n isSigner: true,\n },\n {\n name: \"sendMint\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"receiveMint\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"config\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"sendPool\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"receivePool\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"sendBridgeToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"receiveBridgeToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"sendUserToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"receiveUserToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"bridgeAuthority\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"tokenProgram\",\n isMut: false,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"amount\",\n type: \"u64\",\n },\n {\n name: \"receiveAmountMin\",\n type: \"u64\",\n },\n ],\n },\n {\n name: \"registerChainBridge\",\n accounts: [\n {\n name: \"admin\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"payer\",\n isMut: true,\n isSigner: true,\n },\n {\n name: \"config\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"chainBridge\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"systemProgram\",\n isMut: false,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"args\",\n type: {\n defined: \"RegisterChainBridgeArgs\",\n },\n },\n ],\n },\n {\n name: \"updateChainBridge\",\n accounts: [\n {\n name: \"admin\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"config\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"chainBridge\",\n isMut: true,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"args\",\n type: {\n defined: \"UpdateChainBridgeArgs\",\n },\n },\n ],\n },\n {\n name: \"receiveAndSwap\",\n accounts: [\n {\n name: \"user\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"payer\",\n isMut: true,\n isSigner: true,\n },\n {\n name: \"mint\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"config\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"pool\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"bridgeToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"receivedMessageAccount\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"unlock\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"chainBridge\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"userToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"bridgeAuthority\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"tokenProgram\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"systemProgram\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"messengerProgram\",\n isMut: false,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"args\",\n type: {\n defined: \"UnlockArgs\",\n },\n },\n ],\n },\n {\n name: \"receiveAndSwapWormhole\",\n accounts: [\n {\n name: \"user\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"payer\",\n isMut: true,\n isSigner: true,\n },\n {\n name: \"mint\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"config\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"pool\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"bridgeToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"receivedMessageAccount\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"unlock\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"chainBridge\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"userToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"bridgeAuthority\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"tokenProgram\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"systemProgram\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"messengerProgram\",\n isMut: false,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"args\",\n type: {\n defined: \"UnlockArgs\",\n },\n },\n ],\n },\n {\n name: \"withdrawGasToken\",\n accounts: [\n {\n name: \"admin\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"recipient\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"config\",\n isMut: true,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"amount\",\n type: \"u64\",\n },\n ],\n },\n {\n name: \"claimRewards\",\n accounts: [\n {\n name: \"user\",\n isMut: true,\n isSigner: true,\n },\n {\n name: \"mint\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"config\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"pool\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"bridgeToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"userToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"userDeposit\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"bridgeAuthority\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"tokenProgram\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"systemProgram\",\n isMut: false,\n isSigner: false,\n },\n ],\n args: [],\n },\n {\n name: \"setAdmin\",\n accounts: [\n {\n name: \"admin\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"newAdmin\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"config\",\n isMut: true,\n isSigner: false,\n },\n ],\n args: [],\n },\n {\n name: \"startBridge\",\n accounts: [\n {\n name: \"admin\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"config\",\n isMut: true,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"actionType\",\n type: {\n defined: \"ActionType\",\n },\n },\n ],\n },\n {\n name: \"stopBridge\",\n accounts: [\n {\n name: \"stopAuthority\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"config\",\n isMut: true,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"actionType\",\n type: {\n defined: \"ActionType\",\n },\n },\n ],\n },\n {\n name: \"setRebalancer\",\n accounts: [\n {\n name: \"admin\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"config\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"rebalancer\",\n isMut: false,\n isSigner: false,\n },\n ],\n args: [],\n },\n {\n name: \"setStopAuthority\",\n accounts: [\n {\n name: \"admin\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"newAuthority\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"config\",\n isMut: true,\n isSigner: false,\n },\n ],\n args: [],\n },\n {\n name: \"setAllbridgeMessengerProgramId\",\n accounts: [\n {\n name: \"admin\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"config\",\n isMut: true,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"newProgramId\",\n type: \"publicKey\",\n },\n ],\n },\n {\n name: \"setWormholeMessengerProgramId\",\n accounts: [\n {\n name: \"admin\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"config\",\n isMut: true,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"newProgramId\",\n type: \"publicKey\",\n },\n ],\n },\n {\n name: \"setGasOracleProgramId\",\n accounts: [\n {\n name: \"admin\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"config\",\n isMut: true,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"newProgramId\",\n type: \"publicKey\",\n },\n ],\n },\n {\n name: \"setPoolFeeShare\",\n accounts: [\n {\n name: \"admin\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"config\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"pool\",\n isMut: true,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"feeShareBp\",\n type: \"u64\",\n },\n ],\n },\n {\n name: \"setBalanceRatioMin\",\n accounts: [\n {\n name: \"admin\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"config\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"pool\",\n isMut: true,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"balanceRatioMinBp\",\n type: \"u16\",\n },\n ],\n },\n {\n name: \"setPoolAdminFeeShare\",\n accounts: [\n {\n name: \"admin\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"config\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"pool\",\n isMut: true,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"feeShareBp\",\n type: \"u64\",\n },\n ],\n },\n {\n name: \"addOtherBridgeToken\",\n accounts: [\n {\n name: \"admin\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"payer\",\n isMut: true,\n isSigner: true,\n },\n {\n name: \"config\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"otherBridgeToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"systemProgram\",\n isMut: false,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"chainId\",\n type: \"u8\",\n },\n {\n name: \"tokenAddress\",\n type: {\n array: [\"u8\", 32],\n },\n },\n ],\n },\n {\n name: \"removeOtherBridgeToken\",\n accounts: [\n {\n name: \"admin\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"payer\",\n isMut: true,\n isSigner: true,\n },\n {\n name: \"config\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"otherBridgeToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"systemProgram\",\n isMut: false,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"chainId\",\n type: \"u8\",\n },\n {\n name: \"tokenAddress\",\n type: {\n array: [\"u8\", 32],\n },\n },\n ],\n },\n {\n name: \"withdrawAdminFee\",\n accounts: [\n {\n name: \"admin\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"mint\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"config\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"pool\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"bridgeToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"adminToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"bridgeAuthority\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"tokenProgram\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"systemProgram\",\n isMut: false,\n isSigner: false,\n },\n ],\n args: [],\n },\n {\n name: \"adjustTotalLpAmount\",\n accounts: [\n {\n name: \"admin\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"mint\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"config\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"pool\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"bridgeToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"userToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"userDeposit\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"bridgeAuthority\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"tokenProgram\",\n isMut: false,\n isSigner: false,\n },\n ],\n args: [],\n },\n ],\n accounts: [\n {\n name: \"chainBridge\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"address\",\n type: {\n array: [\"u8\", 32],\n },\n },\n {\n name: \"chainId\",\n type: \"u8\",\n },\n {\n name: \"gasUsage\",\n type: \"u64\",\n },\n ],\n },\n },\n {\n name: \"config\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"admin\",\n type: \"publicKey\",\n },\n {\n name: \"allbridgeMessengerProgramId\",\n type: \"publicKey\",\n },\n {\n name: \"wormholeMessengerProgramId\",\n type: \"publicKey\",\n },\n {\n name: \"gasOracleProgramId\",\n type: \"publicKey\",\n },\n {\n name: \"rebalancer\",\n type: \"publicKey\",\n },\n {\n name: \"stopAuthority\",\n type: \"publicKey\",\n },\n {\n name: \"authorityBumpSeed\",\n type: \"u8\",\n },\n {\n name: \"canSwap\",\n type: \"bool\",\n },\n {\n name: \"canDeposit\",\n type: \"bool\",\n },\n {\n name: \"canWithdraw\",\n type: \"bool\",\n },\n ],\n },\n },\n {\n name: \"lock\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"sender\",\n type: \"publicKey\",\n },\n {\n name: \"sentTokenAddress\",\n type: \"publicKey\",\n },\n {\n name: \"amount\",\n type: \"u64\",\n },\n {\n name: \"vusdAmount\",\n type: \"u64\",\n },\n {\n name: \"recipient\",\n type: {\n array: [\"u8\", 32],\n },\n },\n {\n name: \"destinationChainId\",\n type: \"u8\",\n },\n {\n name: \"receiveToken\",\n type: {\n array: [\"u8\", 32],\n },\n },\n {\n name: \"nonce\",\n type: {\n array: [\"u8\", 32],\n },\n },\n {\n name: \"messenger\",\n type: {\n defined: \"Messenger\",\n },\n },\n {\n name: \"slot\",\n type: \"u64\",\n },\n {\n name: \"fee\",\n type: \"u64\",\n },\n ],\n },\n },\n {\n name: \"otherBridgeToken\",\n type: {\n kind: \"struct\",\n fields: [],\n },\n },\n {\n name: \"pool\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"mint\",\n type: \"publicKey\",\n },\n {\n name: \"a\",\n type: \"u64\",\n },\n {\n name: \"d\",\n type: \"u64\",\n },\n {\n name: \"tokenBalance\",\n type: \"u64\",\n },\n {\n name: \"vUsdBalance\",\n type: \"u64\",\n },\n {\n name: \"reserves\",\n type: \"u64\",\n },\n {\n name: \"decimals\",\n type: \"u8\",\n },\n {\n name: \"totalLpAmount\",\n type: \"u64\",\n },\n {\n name: \"feeShareBp\",\n type: \"u64\",\n },\n {\n name: \"adminFeeShareBp\",\n type: \"u64\",\n },\n {\n name: \"accRewardPerShareP\",\n type: \"u128\",\n },\n {\n name: \"adminFeeAmount\",\n type: \"u64\",\n },\n {\n name: \"balanceRatioMinBp\",\n type: \"u16\",\n },\n ],\n },\n },\n {\n name: \"unlock\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"hash\",\n type: {\n array: [\"u8\", 32],\n },\n },\n {\n name: \"amount\",\n type: \"u64\",\n },\n {\n name: \"fee\",\n type: \"u64\",\n },\n {\n name: \"vUsdAmount\",\n type: \"u64\",\n },\n {\n name: \"slot\",\n type: \"u64\",\n },\n ],\n },\n },\n {\n name: \"userDeposit\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"userAddress\",\n type: \"publicKey\",\n },\n {\n name: \"mint\",\n type: \"publicKey\",\n },\n {\n name: \"lpAmount\",\n type: \"u64\",\n },\n {\n name: \"rewardDebt\",\n type: \"u64\",\n },\n ],\n },\n },\n ],\n types: [\n {\n name: \"RegisterChainBridgeArgs\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"chainBridgeAddress\",\n type: {\n array: [\"u8\", 32],\n },\n },\n {\n name: \"chainId\",\n type: \"u8\",\n },\n {\n name: \"gasUsage\",\n type: \"u64\",\n },\n ],\n },\n },\n {\n name: \"UpdateChainBridgeArgs\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"chainBridgeAddress\",\n type: {\n array: [\"u8\", 32],\n },\n },\n {\n name: \"chainId\",\n type: \"u8\",\n },\n {\n name: \"gasUsage\",\n type: \"u64\",\n },\n ],\n },\n },\n {\n name: \"InitializeArgs\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"allbridgeMessengerProgramId\",\n type: \"publicKey\",\n },\n {\n name: \"wormholeMessengerProgramId\",\n type: \"publicKey\",\n },\n {\n name: \"gasOracleProgramId\",\n type: \"publicKey\",\n },\n ],\n },\n },\n {\n name: \"InitializePoolArgs\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"a\",\n type: \"u64\",\n },\n {\n name: \"feeShareBp\",\n type: \"u64\",\n },\n {\n name: \"adminFeeShareBp\",\n type: \"u64\",\n },\n {\n name: \"balanceRatioMinBp\",\n type: \"u16\",\n },\n ],\n },\n },\n {\n name: \"BridgeArgs\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"nonce\",\n type: {\n array: [\"u8\", 32],\n },\n },\n {\n name: \"recipient\",\n type: {\n array: [\"u8\", 32],\n },\n },\n {\n name: \"destinationChainId\",\n type: \"u8\",\n },\n {\n name: \"receiveToken\",\n type: {\n array: [\"u8\", 32],\n },\n },\n {\n name: \"vusdAmount\",\n type: \"u64\",\n },\n ],\n },\n },\n {\n name: \"UnlockArgs\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"nonce\",\n type: {\n array: [\"u8\", 32],\n },\n },\n {\n name: \"amount\",\n type: \"u64\",\n },\n {\n name: \"recipient\",\n type: \"publicKey\",\n },\n {\n name: \"sourceChainId\",\n type: \"u8\",\n },\n {\n name: \"receiveToken\",\n type: \"publicKey\",\n },\n {\n name: \"messenger\",\n type: {\n defined: \"Messenger\",\n },\n },\n {\n name: \"hash\",\n type: {\n array: [\"u8\", 32],\n },\n },\n {\n name: \"receiveAmountMin\",\n type: \"u64\",\n },\n ],\n },\n },\n {\n name: \"RewardError\",\n type: {\n kind: \"enum\",\n variants: [\n {\n name: \"FeeTooHigh\",\n },\n ],\n },\n },\n {\n name: \"Messenger\",\n type: {\n kind: \"enum\",\n variants: [\n {\n name: \"None\",\n },\n {\n name: \"Allbridge\",\n },\n {\n name: \"Wormhole\",\n },\n ],\n },\n },\n {\n name: \"ActionType\",\n type: {\n kind: \"enum\",\n variants: [\n {\n name: \"Deposit\",\n },\n {\n name: \"Withdraw\",\n },\n {\n name: \"Swap\",\n },\n ],\n },\n },\n ],\n errors: [\n {\n code: 6000,\n name: \"AccountAlreadyInitialized\",\n msg: \"This account has already been initialized\",\n },\n {\n code: 6001,\n name: \"AdminAuthorityInvalid\",\n msg: \"This instruction requires admin authority\",\n },\n {\n code: 6002,\n name: \"InvalidSignature\",\n msg: \"Provided signature has wrong signer or message\",\n },\n {\n code: 6003,\n name: \"InvalidHash\",\n msg: \"Wrong unlock message hash\",\n },\n {\n code: 6004,\n name: \"PoolOverflow\",\n msg: \"PoolInfo overflow\",\n },\n {\n code: 6005,\n name: \"ReservesExhausted\",\n msg: \"Reserves exhausted\",\n },\n {\n code: 6006,\n name: \"ZeroAmount\",\n msg: \"Zero amount\",\n },\n {\n code: 6007,\n name: \"ZeroChanges\",\n msg: \"Zero changes\",\n },\n {\n code: 6008,\n name: \"HighVusdAmount\",\n msg: \"vUSD amount is too high\",\n },\n {\n code: 6009,\n name: \"BalanceRatioExceeded\",\n msg: \"Balance ratio exceeded\",\n },\n {\n code: 6010,\n name: \"InsufficientReceivedAmount\",\n msg: \"Received insufficient amount\",\n },\n {\n code: 6011,\n name: \"ForbiddenAction\",\n msg: \"ForbiddenAction\",\n },\n {\n code: 6012,\n name: \"ValueTooHigh\",\n msg: \"Value is too high\",\n },\n ],\n};\n", "export interface CctpBridge {\n version: \"0.1.0\";\n name: \"cctp_bridge\";\n instructions: [\n {\n name: \"initialize\";\n accounts: [\n {\n name: \"payer\";\n isMut: true;\n isSigner: true;\n },\n {\n name: \"admin\";\n isMut: true;\n isSigner: true;\n },\n {\n name: \"mint\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"cctpBridge\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"bridgeAuthority\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"bridgeToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"systemProgram\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"tokenProgram\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"rent\";\n isMut: false;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"args\";\n type: {\n defined: \"InitializeArgs\";\n };\n },\n ];\n },\n {\n name: \"bridge\";\n accounts: [\n {\n name: \"user\";\n isMut: true;\n isSigner: true;\n },\n {\n name: \"payer\";\n isMut: true;\n isSigner: true;\n },\n {\n name: \"messageSentEventData\";\n isMut: true;\n isSigner: true;\n },\n {\n name: \"lock\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"mint\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"cctpBridge\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"cctpMessenger\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"messageTransmitterProgram\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"messageTransmitterAccount\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"tokenMessenger\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"tokenMinter\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"localToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"remoteTokenMessengerKey\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"authorityPda\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"eventAuthority\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"bridgeToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"gasPrice\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"thisGasPrice\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"chainBridge\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"userToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"bridgeAuthority\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"tokenProgram\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"systemProgram\";\n isMut: false;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"args\";\n type: {\n defined: \"BridgeArgs\";\n };\n },\n ];\n },\n {\n name: \"registerChainBridge\";\n accounts: [\n {\n name: \"admin\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"payer\";\n isMut: true;\n isSigner: true;\n },\n {\n name: \"cctpBridge\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"chainBridge\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"systemProgram\";\n isMut: false;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"args\";\n type: {\n defined: \"RegisterChainBridgeArgs\";\n };\n },\n ];\n },\n {\n name: \"updateChainBridge\";\n accounts: [\n {\n name: \"admin\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"cctpBridge\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"chainBridge\";\n isMut: true;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"args\";\n type: {\n defined: \"UpdateChainBridgeArgs\";\n };\n },\n ];\n },\n {\n name: \"setAdminFeeShare\";\n accounts: [\n {\n name: \"admin\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"mint\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"cctpBridge\";\n isMut: true;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"feeShareBp\";\n type: \"u64\";\n },\n ];\n },\n {\n name: \"setGasOracleProgramId\";\n accounts: [\n {\n name: \"admin\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"mint\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"cctpBridge\";\n isMut: true;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"newProgramId\";\n type: \"publicKey\";\n },\n ];\n },\n {\n name: \"withdrawGasToken\";\n accounts: [\n {\n name: \"admin\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"recipient\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"mint\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"cctpBridge\";\n isMut: true;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"amount\";\n type: \"u64\";\n },\n ];\n },\n {\n name: \"withdrawAdminFee\";\n accounts: [\n {\n name: \"admin\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"mint\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"cctpBridge\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"bridgeToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"adminToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"bridgeAuthority\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"tokenProgram\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"systemProgram\";\n isMut: false;\n isSigner: false;\n },\n ];\n args: [];\n },\n {\n name: \"setCctpTokenMessengerMinter\";\n accounts: [\n {\n name: \"admin\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"mint\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"cctpBridge\";\n isMut: true;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"newProgramId\";\n type: \"publicKey\";\n },\n ];\n },\n ];\n accounts: [\n {\n name: \"cctpBridge\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"mint\";\n type: \"publicKey\";\n },\n {\n name: \"admin\";\n type: \"publicKey\";\n },\n {\n name: \"cctpTokenMessengerMinter\";\n type: \"publicKey\";\n },\n {\n name: \"gasOracleProgramId\";\n type: \"publicKey\";\n },\n {\n name: \"authorityBumpSeed\";\n type: \"u8\";\n },\n {\n name: \"adminFeeShareBp\";\n type: \"u64\";\n },\n {\n name: \"adminFeeAmount\";\n type: \"u64\";\n },\n ];\n };\n },\n {\n name: \"chainBridge\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"chainId\";\n type: \"u8\";\n },\n {\n name: \"gasUsage\";\n type: \"u64\";\n },\n {\n name: \"domain\";\n type: \"u32\";\n },\n ];\n };\n },\n {\n name: \"lock\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"sender\";\n type: \"publicKey\";\n },\n {\n name: \"amount\";\n type: \"u64\";\n },\n {\n name: \"adminFee\";\n type: \"u64\";\n },\n {\n name: \"relayerFee\";\n type: \"u64\";\n },\n {\n name: \"recipient\";\n type: {\n array: [\"u8\", 32];\n };\n },\n {\n name: \"destinationChainId\";\n type: \"u8\";\n },\n {\n name: \"slot\";\n type: \"u64\";\n },\n ];\n };\n },\n ];\n types: [\n {\n name: \"RegisterChainBridgeArgs\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"chainId\";\n type: \"u8\";\n },\n {\n name: \"gasUsage\";\n type: \"u64\";\n },\n {\n name: \"domain\";\n type: \"u32\";\n },\n {\n name: \"mint\";\n type: \"publicKey\";\n },\n ];\n };\n },\n {\n name: \"UpdateChainBridgeArgs\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"chainId\";\n type: \"u8\";\n },\n {\n name: \"gasUsage\";\n type: \"u64\";\n },\n {\n name: \"domain\";\n type: \"u32\";\n },\n {\n name: \"mint\";\n type: \"publicKey\";\n },\n ];\n };\n },\n {\n name: \"BridgeArgs\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"recipient\";\n type: {\n array: [\"u8\", 32];\n };\n },\n {\n name: \"destinationChainId\";\n type: \"u8\";\n },\n {\n name: \"receiveToken\";\n type: {\n array: [\"u8\", 32];\n };\n },\n {\n name: \"amount\";\n type: \"u64\";\n },\n ];\n };\n },\n {\n name: \"InitializeArgs\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"gasOracleProgramId\";\n type: \"publicKey\";\n },\n {\n name: \"cctpTokenMessengerMinter\";\n type: \"publicKey\";\n },\n ];\n };\n },\n ];\n errors: [\n {\n code: 6000;\n name: \"ValueTooHigh\";\n msg: \"Value is too high\";\n },\n ];\n}\n\nexport const IDL: CctpBridge = {\n version: \"0.1.0\",\n name: \"cctp_bridge\",\n instructions: [\n {\n name: \"initialize\",\n accounts: [\n {\n name: \"payer\",\n isMut: true,\n isSigner: true,\n },\n {\n name: \"admin\",\n isMut: true,\n isSigner: true,\n },\n {\n name: \"mint\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"cctpBridge\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"bridgeAuthority\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"bridgeToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"systemProgram\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"tokenProgram\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"rent\",\n isMut: false,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"args\",\n type: {\n defined: \"InitializeArgs\",\n },\n },\n ],\n },\n {\n name: \"bridge\",\n accounts: [\n {\n name: \"user\",\n isMut: true,\n isSigner: true,\n },\n {\n name: \"payer\",\n isMut: true,\n isSigner: true,\n },\n {\n name: \"messageSentEventData\",\n isMut: true,\n isSigner: true,\n },\n {\n name: \"lock\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"mint\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"cctpBridge\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"cctpMessenger\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"messageTransmitterProgram\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"messageTransmitterAccount\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"tokenMessenger\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"tokenMinter\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"localToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"remoteTokenMessengerKey\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"authorityPda\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"eventAuthority\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"bridgeToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"gasPrice\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"thisGasPrice\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"chainBridge\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"userToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"bridgeAuthority\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"tokenProgram\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"systemProgram\",\n isMut: false,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"args\",\n type: {\n defined: \"BridgeArgs\",\n },\n },\n ],\n },\n {\n name: \"registerChainBridge\",\n accounts: [\n {\n name: \"admin\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"payer\",\n isMut: true,\n isSigner: true,\n },\n {\n name: \"cctpBridge\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"chainBridge\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"systemProgram\",\n isMut: false,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"args\",\n type: {\n defined: \"RegisterChainBridgeArgs\",\n },\n },\n ],\n },\n {\n name: \"updateChainBridge\",\n accounts: [\n {\n name: \"admin\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"cctpBridge\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"chainBridge\",\n isMut: true,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"args\",\n type: {\n defined: \"UpdateChainBridgeArgs\",\n },\n },\n ],\n },\n {\n name: \"setAdminFeeShare\",\n accounts: [\n {\n name: \"admin\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"mint\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"cctpBridge\",\n isMut: true,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"feeShareBp\",\n type: \"u64\",\n },\n ],\n },\n {\n name: \"setGasOracleProgramId\",\n accounts: [\n {\n name: \"admin\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"mint\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"cctpBridge\",\n isMut: true,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"newProgramId\",\n type: \"publicKey\",\n },\n ],\n },\n {\n name: \"withdrawGasToken\",\n accounts: [\n {\n name: \"admin\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"recipient\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"mint\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"cctpBridge\",\n isMut: true,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"amount\",\n type: \"u64\",\n },\n ],\n },\n {\n name: \"withdrawAdminFee\",\n accounts: [\n {\n name: \"admin\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"mint\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"cctpBridge\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"bridgeToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"adminToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"bridgeAuthority\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"tokenProgram\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"systemProgram\",\n isMut: false,\n isSigner: false,\n },\n ],\n args: [],\n },\n {\n name: \"setCctpTokenMessengerMinter\",\n accounts: [\n {\n name: \"admin\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"mint\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"cctpBridge\",\n isMut: true,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"newProgramId\",\n type: \"publicKey\",\n },\n ],\n },\n ],\n accounts: [\n {\n name: \"cctpBridge\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"mint\",\n type: \"publicKey\",\n },\n {\n name: \"admin\",\n type: \"publicKey\",\n },\n {\n name: \"cctpTokenMessengerMinter\",\n type: \"publicKey\",\n },\n {\n name: \"gasOracleProgramId\",\n type: \"publicKey\",\n },\n {\n name: \"authorityBumpSeed\",\n type: \"u8\",\n },\n {\n name: \"adminFeeShareBp\",\n type: \"u64\",\n },\n {\n name: \"adminFeeAmount\",\n type: \"u64\",\n },\n ],\n },\n },\n {\n name: \"chainBridge\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"chainId\",\n type: \"u8\",\n },\n {\n name: \"gasUsage\",\n type: \"u64\",\n },\n {\n name: \"domain\",\n type: \"u32\",\n },\n ],\n },\n },\n {\n name: \"lock\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"sender\",\n type: \"publicKey\",\n },\n {\n name: \"amount\",\n type: \"u64\",\n },\n {\n name: \"adminFee\",\n type: \"u64\",\n },\n {\n name: \"relayerFee\",\n type: \"u64\",\n },\n {\n name: \"recipient\",\n type: {\n array: [\"u8\", 32],\n },\n },\n {\n name: \"destinationChainId\",\n type: \"u8\",\n },\n {\n name: \"slot\",\n type: \"u64\",\n },\n ],\n },\n },\n ],\n types: [\n {\n name: \"RegisterChainBridgeArgs\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"chainId\",\n type: \"u8\",\n },\n {\n name: \"gasUsage\",\n type: \"u64\",\n },\n {\n name: \"domain\",\n type: \"u32\",\n },\n {\n name: \"mint\",\n type: \"publicKey\",\n },\n ],\n },\n },\n {\n name: \"UpdateChainBridgeArgs\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"chainId\",\n type: \"u8\",\n },\n {\n name: \"gasUsage\",\n type: \"u64\",\n },\n {\n name: \"domain\",\n type: \"u32\",\n },\n {\n name: \"mint\",\n type: \"publicKey\",\n },\n ],\n },\n },\n {\n name: \"BridgeArgs\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"recipient\",\n type: {\n array: [\"u8\", 32],\n },\n },\n {\n name: \"destinationChainId\",\n type: \"u8\",\n },\n {\n name: \"receiveToken\",\n type: {\n array: [\"u8\", 32],\n },\n },\n {\n name: \"amount\",\n type: \"u64\",\n },\n ],\n },\n },\n {\n name: \"InitializeArgs\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"gasOracleProgramId\",\n type: \"publicKey\",\n },\n {\n name: \"cctpTokenMessengerMinter\",\n type: \"publicKey\",\n },\n ],\n },\n },\n ],\n errors: [\n {\n code: 6000,\n name: \"ValueTooHigh\",\n msg: \"Value is too high\",\n },\n ],\n};\n", "import { Program, Provider, Spl } from \"@project-serum/anchor\";\nimport { PublicKey } from \"@solana/web3.js\";\n/* eslint-disable-next-line import/no-named-as-default */\nimport Big from \"big.js\";\nimport { Web3 } from \"web3\";\nimport { InvalidTxError, SdkError } from \"../../../exceptions\";\nimport { PoolInfo } from \"../../../tokens-info\";\nimport { swapToVUsd } from \"../../../utils/calculation\";\nimport { TokenAccountData } from \"../../models/sol\";\nimport { Bridge as BridgeType } from \"../../models/sol/types/bridge\";\n\nexport async function getTokenAccountData(account: PublicKey, provider: Provider): Promise<TokenAccountData> {\n return await Spl.token(provider).account.token.fetch(account);\n}\n\nexport async function getVUsdAmount(\n amount: string,\n bridge: Program<BridgeType>,\n poolAccount: PublicKey\n): Promise<string> {\n const poolAccountInfo = await bridge.account.pool.fetch(poolAccount);\n const decimals = poolAccountInfo.decimals;\n const feeShare = Big(poolAccountInfo.feeShareBp.toString()).div(10000).toFixed();\n const poolInfo: Omit<PoolInfo, \"p\" | \"imbalance\"> = {\n aValue: poolAccountInfo.a.toString(),\n dValue: poolAccountInfo.d.toString(),\n totalLpAmount: poolAccountInfo.totalLpAmount.toString(),\n tokenBalance: poolAccountInfo.tokenBalance.toString(),\n vUsdBalance: poolAccountInfo.vUsdBalance.toString(),\n accRewardPerShareP: poolAccountInfo.accRewardPerShareP.toString(),\n };\n return swapToVUsd(amount, { decimals, feeShare }, poolInfo);\n}\n\nexport function getMessage(args: {\n amount: string;\n recipient: Buffer;\n sourceChainId: number;\n destinationChainId: number;\n receiveToken: Buffer;\n nonce: Buffer;\n chainBridge: Buffer;\n}): Buffer {\n const amount = args.amount;\n const recipient = \"0x\" + args.recipient.toString(\"hex\");\n const sourceChainId = args.sourceChainId;\n const destinationsChainId = args.destinationChainId;\n const receiveToken = \"0x\" + args.receiveToken.toString(\"hex\");\n const nonce = \"0x\" + args.nonce.toString(\"hex\");\n const messenger = 1;\n const chainBridge = \"0x\" + args.chainBridge.toString(\"hex\");\n\n const message = Web3.utils.encodePacked(\n { t: \"uint256\", v: amount },\n { t: \"bytes32\", v: recipient },\n { t: \"uint256\", v: sourceChainId },\n { t: \"bytes32\", v: receiveToken },\n { t: \"uint256\", v: nonce },\n { t: \"uint8\", v: messenger }\n );\n\n if (!message) {\n throw new SdkError(\"message cannot be undefined\");\n }\n const hash = Web3.utils.keccak256(Buffer.from(message.replace(\"0x\", \"\"), \"hex\") as any);\n\n const hashBuffer = Buffer.from(hash.replace(\"0x\", \"\"), \"hex\");\n hashBuffer[0] = sourceChainId;\n hashBuffer[1] = destinationsChainId;\n\n const messageWithSigner = Web3.utils.encodePacked(\n { t: \"bytes32\", v: \"0x\" + hashBuffer.toString(\"hex\") },\n { t: \"bytes32\", v: chainBridge }\n );\n\n if (!messageWithSigner) {\n throw new InvalidTxError(\"messageWithSigner cannot be undefined\");\n }\n\n const hashWithSigner = Web3.utils.keccak256(Buffer.from(messageWithSigner.replace(\"0x\", \"\"), \"hex\") as any);\n\n const hashWithSignerBuffer = Buffer.from(hashWithSigner.replace(\"0x\", \"\"), \"hex\");\n\n hashWithSignerBuffer[0] = hashBuffer[0];\n hashWithSignerBuffer[1] = hashBuffer[1];\n return hashWithSignerBuffer;\n}\n", "import {\n ComputeBudgetInstruction,\n ComputeBudgetProgram,\n Connection,\n Transaction,\n TransactionInstruction,\n TransactionMessage,\n VersionedTransaction,\n} from \"@solana/web3.js\";\nimport { Big } from \"big.js\";\nimport { TxTooLargeError } from \"../../../exceptions\";\nimport { toPowBase10 } from \"../../../utils/calculation\";\nimport { fetchAddressLookupTableAccountsFromTx } from \"../../../utils/sol/utils\";\nimport { SolanaAutoTxFee, TxFeeParams } from \"../../models\";\n\nexport async function addUnitLimitAndUnitPriceToTx(\n transaction: Transaction,\n txFeeParams: TxFeeParams | undefined,\n solanaRpcUrl: string\n) {\n const connection = new Connection(solanaRpcUrl, \"confirmed\");\n /* eslint-disable-next-line @typescript-eslint/no-non-null-assertion */\n const simUnitsConsumed = (await connection.simulateTransaction(transaction)).value.unitsConsumed!;\n await addUnitLimitAndUnitPriceToInstructions(transaction.instructions, simUnitsConsumed, txFeeParams, connection);\n}\n\nexport async function addUnitLimitAndUnitPriceToVersionedTx(\n transaction: VersionedTransaction,\n txFeeParams: TxFeeParams | undefined,\n solanaRpcUrl: string\n) {\n const connection = new Connection(solanaRpcUrl, \"confirmed\");\n const addressLookupTableAccounts = await fetchAddressLookupTableAccountsFromTx(transaction, connection);\n const message = TransactionMessage.decompile(transaction.message, {\n addressLookupTableAccounts: addressLookupTableAccounts,\n });\n\n if (transaction.serialize().length > 1232) {\n throw new TxTooLargeError();\n }\n\n // const simUnitsConsumed = (await connection.simulateTransaction(transaction, { replaceRecentBlockhash: true })).value\n // .unitsConsumed!;\n const simUnitsConsumed = 769230; // 1000000/1.3\n\n await addUnitLimitAndUnitPriceToInstructions(message.instructions, simUnitsConsumed, txFeeParams, connection);\n\n transaction.message = message.compileToV0Message(addressLookupTableAccounts);\n}\n\nasync function addUnitLimitAndUnitPriceToInstructions(\n instructions: TransactionInstruction[],\n simUnitsConsumed: number,\n txFeeParams: TxFeeParams | undefined,\n connection: Connection\n) {\n if (simUnitsConsumed > 0) {\n const units = updateUnitLimit(simUnitsConsumed, instructions);\n if (txFeeParams?.solana) {\n const solanaTxFee = txFeeParams.solana;\n if (solanaTxFee === SolanaAutoTxFee) {\n await updateUnitPrice(instructions, connection);\n } else if (\"pricePerUnitInMicroLamports\" in solanaTxFee) {\n await updateUnitPrice(instructions, connection, solanaTxFee.pricePerUnitInMicroLamports);\n } else {\n const pricePerUnitInMicroLamports = Big(solanaTxFee.extraFeeInLamports)\n .div(units)\n .mul(toPowBase10(6))\n .toFixed(0);\n await updateUnitPrice(instructions, connection, pricePerUnitInMicroLamports);\n }\n }\n }\n}\n\nfunction updateUnitLimit(simUnitsConsumed: number, instructions: TransactionInstruction[]): string {\n const computeUnitLimitIndex = instructions.findIndex(\n (instruction) =>\n instruction.programId.equals(ComputeBudgetProgram.programId) &&\n ComputeBudgetInstruction.decodeInstructionType(instruction) === \"SetComputeUnitLimit\"\n );\n const units = Number((simUnitsConsumed * 1.3).toFixed(0));\n const computeUnitLimitInstruction = ComputeBudgetProgram.setComputeUnitLimit({\n units: units,\n });\n if (computeUnitLimitIndex >= 0) {\n instructions[computeUnitLimitIndex] = computeUnitLimitInstruction;\n } else {\n instructions.push(computeUnitLimitInstruction);\n }\n return units.toString();\n}\n\nasync function updateUnitPrice(\n instructions: TransactionInstruction[],\n connection: Connection,\n pricePerUnitInMicroLamports?: string\n): Promise<string> {\n const computeUnitPriceIndex = instructions.findIndex(\n (instruction) =>\n instruction.programId.equals(ComputeBudgetProgram.programId) &&\n ComputeBudgetInstruction.decodeInstructionType(instruction) === \"SetComputeUnitPrice\"\n );\n const unitPrice = pricePerUnitInMicroLamports\n ? BigInt(pricePerUnitInMicroLamports)\n : BigInt(await getAveragePrioritizationFee(connection));\n const computeUnitPriceInstruction = ComputeBudgetProgram.setComputeUnitPrice({\n microLamports: unitPrice,\n });\n if (computeUnitPriceIndex >= 0) {\n instructions[computeUnitPriceIndex] = computeUnitPriceInstruction;\n } else {\n instructions.push(computeUnitPriceInstruction);\n }\n return unitPrice.toString();\n}\n\nasync function getAveragePrioritizationFee(connection: Connection) {\n const prioritizationFees = await connection.getRecentPrioritizationFees();\n let sum = 0;\n for (const prioritizationFee of prioritizationFees) {\n sum += prioritizationFee.prioritizationFee;\n }\n return (sum / prioritizationFees.length).toFixed(0);\n}\n", "import { AddressLookupTableAccount, Connection, VersionedTransaction } from \"@solana/web3.js\";\nimport { SdkError } from \"../../exceptions\";\n\nexport async function fetchAddressLookupTableAccountsFromTx(\n transaction: VersionedTransaction,\n connection: Connection\n): Promise<AddressLookupTableAccount[]> {\n return await Promise.all(\n transaction.message.addressTableLookups.map(async (lookup) => {\n return new AddressLookupTableAccount({\n key: lookup.accountKey,\n state: AddressLookupTableAccount.deserialize(\n await connection.getAccountInfo(lookup.accountKey).then((res) => {\n if (!res) {\n throw new SdkError(\"Cannot get AccountInfo\");\n }\n return res.data;\n })\n ),\n });\n })\n );\n}\n", "import { BN, Program, Provider } from \"@project-serum/anchor\";\nimport { PublicKey, TransactionInstruction } from \"@solana/web3.js\";\nimport { Bridge as BridgeType } from \"./types/bridge\";\nimport { CctpBridge as CctpBridgeType } from \"./types/cctp_bridge\";\n\nexport type SolanaTxFee = PricePerUnitInMicroLamports | ExtraFeeInLamports | typeof SolanaAutoTxFee;\n/**\n * Priority Fee will be calculated based on {@link https://solana-labs.github.io/solana-web3.js/classes/Connection.html#getRecentPrioritizationFees}\n */\nexport const SolanaAutoTxFee = \"AUTO\";\n\n/**\n * Add Priority Fee as price per unit in micro-lamports\n */\nexport interface PricePerUnitInMicroLamports {\n pricePerUnitInMicroLamports: string;\n}\n\n/**\n * Total Priority Fee impact will be as extraFeeInLamports param\n */\nexport interface ExtraFeeInLamports {\n extraFeeInLamports: string;\n}\n\nexport interface SwapAndBridgeSolData {\n bridge: Program<BridgeType>;\n amount: BN;\n vusdAmount: BN;\n nonce: number[];\n recipient: number[];\n receiveToken: number[];\n poolAccount: PublicKey;\n lockAccount: PublicKey;\n bridgeAuthority: PublicKey;\n userToken: PublicKey;\n bridgeTokenAccount: PublicKey;\n chainBridgeAccount: PublicKey;\n otherBridgeTokenAccount: PublicKey;\n userAccount: PublicKey;\n destinationChainId: number;\n mint: string;\n config: PublicKey;\n configAccountInfo: ConfigAccountInfo;\n gasPrice: PublicKey;\n thisGasPrice: PublicKey;\n message: Buffer;\n extraGasInstruction?: TransactionInstruction;\n provider: Provider;\n}\n\nexport interface SwapAndBridgeSolDataCctpData {\n cctpBridge: Program<CctpBridgeType>;\n cctpBridgeAccount: PublicKey;\n cctpAddressAccount: PublicKey;\n amount: BN;\n recipient: number[];\n receiveToken: number[];\n userToken: PublicKey;\n bridgeAuthority: PublicKey;\n bridgeTokenAccount: PublicKey;\n chainBridgeAccount: PublicKey;\n userAccount: PublicKey;\n destinationChainId: number;\n mint: PublicKey;\n gasPrice: PublicKey;\n thisGasPrice: PublicKey;\n extraGasInstruction?: TransactionInstruction;\n provider: Provider;\n}\n\ninterface ConfigAccountInfo {\n allbridgeMessengerProgramId: PublicKey;\n wormholeMessengerProgramId: PublicKey;\n gasOracleProgramId: PublicKey;\n}\n\nexport interface TokenAccountData {\n amount: BN;\n authority: PublicKey;\n closeAuthority: unknown;\n delegate: unknown;\n delegatedAmount: BN;\n isNative: unknown;\n mint: PublicKey;\n state: unknown;\n}\n", "import { NATIVE_MINT } from \"@solana/spl-token\";\nimport { Connection, TransactionMessage, VersionedTransaction } from \"@solana/web3.js\";\nimport axios, { AxiosError } from \"axios\";\nimport { JupiterError, SdkError } from \"../../../exceptions\";\nimport { fetchAddressLookupTableAccountsFromTx } from \"../../../utils/sol/utils\";\nimport { JupiterParams } from \"./index\";\n\nexport class JupiterService {\n connection: Connection;\n jupiterUrl: string;\n apiKeyHeader?: string;\n maxAccounts?: number;\n\n constructor(solanaRpcUrl: string, jupiterParams: JupiterParams) {\n this.connection = new Connection(solanaRpcUrl);\n this.jupiterUrl = jupiterParams.jupiterUrl.replace(/\\/$/, \"\"); // trim last \"/\" if exist\n this.apiKeyHeader = jupiterParams.jupiterApiKeyHeader;\n this.maxAccounts = jupiterParams.jupiterMaxAccounts;\n }\n\n async getJupiterSwapTx(\n userAddress: string,\n stableTokenAddress: string,\n amount: string,\n exactOut: boolean\n ): Promise<{ tx: VersionedTransaction; amountIn?: string }> {\n let quoteResponse: any;\n try {\n const swapMode = exactOut ? \"ExactOut\" : \"ExactIn\";\n let url = `${this.jupiterUrl}/quote?inputMint=${stableTokenAddress}&outputMint=${NATIVE_MINT.toString()}&amount=${amount}&swapMode=${swapMode}&slippageBps=100&onlyDirectRoutes=true`;\n\n if (this.maxAccounts) {\n url += `&maxAccounts=${this.maxAccounts}`;\n }\n quoteResponse = await axios.get(url, {\n headers: this.apiKeyHeader ? { \"x-api-key\": this.apiKeyHeader } : undefined,\n });\n } catch (err) {\n if (err instanceof AxiosError && err.response && err.response.data && err.response.data.error) {\n throw new JupiterError(err.response.data.error);\n }\n throw new JupiterError(\"Cannot get route\");\n }\n\n let inAmount;\n if (exactOut && quoteResponse?.data?.inAmount) {\n inAmount = quoteResponse.data.inAmount;\n } else if (exactOut) {\n throw new JupiterError(\"Cannot get inAmount\");\n }\n\n let transactionResponse: any;\n try {\n transactionResponse = await axios.post(\n `${this.jupiterUrl}/swap`,\n {\n quoteResponse: quoteResponse.data,\n userPublicKey: userAddress,\n wrapAndUnwrapSol: true,\n },\n {\n headers: this.apiKeyHeader ? { \"x-api-key\": this.apiKeyHeader } : undefined,\n }\n );\n } catch (err) {\n if (err instanceof AxiosError && err.response && err.response.data && err.response.data.error) {\n throw new JupiterError(err.response.data.error);\n }\n throw new JupiterError(\"Cannot get swap transaction\");\n }\n\n let swapTransaction;\n if (transactionResponse?.data?.swapTransaction) {\n swapTransaction = transactionResponse.data.swapTransaction;\n } else {\n throw new JupiterError(\"Cannot get swap transaction\");\n }\n\n const swapTransactionBuf = Buffer.from(swapTransaction, \"base64\");\n const tx = VersionedTransaction.deserialize(swapTransactionBuf);\n\n return exactOut ? { tx, amountIn: inAmount } : { tx };\n }\n\n async amendJupiterWithSdkTx(\n transaction: VersionedTransaction,\n sdkTx: VersionedTransaction\n ): Promise<VersionedTransaction> {\n try {\n const addressLookupTableAccounts = await fetchAddressLookupTableAccountsFromTx(transaction, this.connection);\n const sdkAddressLookupTableAccounts = await fetchAddressLookupTableAccountsFromTx(sdkTx, this.connection);\n\n const message = TransactionMessage.decompile(transaction.message, {\n addressLookupTableAccounts: addressLookupTableAccounts,\n });\n const sdkMessage = TransactionMessage.decompile(sdkTx.message, {\n addressLookupTableAccounts: sdkAddressLookupTableAccounts,\n });\n sdkMessage.instructions.shift();\n message.instructions.push(...sdkMessage.instructions);\n\n addressLookupTableAccounts.push(...sdkAddressLookupTableAccounts);\n\n transaction.message = message.compileToV0Message(addressLookupTableAccounts);\n\n if (sdkTx.message.header.numRequiredSignatures === 2 && transaction.signatures.length === 1) {\n const signature = sdkTx.signatures[0];\n if (!signature) {\n throw new SdkError(\"Signature is undefined\");\n }\n transaction.signatures.push(signature);\n }\n return transaction;\n } catch (e) {\n if (e instanceof Error && e.message) {\n throw new JupiterError(`Some error occurred during creation final swap and bridge transaction. ${e.message}`);\n }\n throw new JupiterError(\"Some error occurred during creation final swap and bridge transaction\");\n }\n }\n}\n", "import { Address, contract } from \"@stellar/stellar-sdk\";\nimport { Big } from \"big.js\";\nimport { ChainSymbol } from \"../../../chains/chain.enums\";\nimport { AllbridgeCoreClient } from \"../../../client/core-api/core-client-base\";\nimport { MethodNotSupportedError } from \"../../../exceptions\";\nimport { AllbridgeCoreSdkOptions, ChainType } from \"../../../index\";\nimport { FeePaymentMethod } from \"../../../models\";\nimport { NodeRpcUrlsConfig } from \"../../index\";\nimport { RawTransaction, TransactionResponse } from \"../../models\";\nimport { BridgeContract } from \"../../models/srb/bridge-contract\";\nimport { ChainBridgeService, SendParams, SwapParams, TxSendParamsSrb, TxSwapParamsSol } from \"../models\";\nimport { getNonceBigInt, prepareTxSendParams, prepareTxSwapParams } from \"../utils\";\nimport ContractClientOptions = contract.ClientOptions;\n\nexport class SrbBridgeService extends ChainBridgeService {\n chainType: ChainType.SRB = ChainType.SRB;\n\n constructor(\n readonly nodeRpcUrlsConfig: NodeRpcUrlsConfig,\n readonly params: AllbridgeCoreSdkOptions,\n readonly api: AllbridgeCoreClient\n ) {\n super();\n }\n\n async buildRawTransactionSend(params: SendParams): Promise<RawTransaction> {\n const txSendParams = await prepareTxSendParams(this.chainType, params, this.api);\n return await this.buildRawTransactionSendFromParams(txSendParams);\n }\n\n async buildRawTransactionSendFromParams(params: TxSendParamsSrb): Promise<RawTransaction> {\n const {\n amount,\n contractAddress,\n fromAccountAddress,\n fromTokenAddress,\n toChainId,\n toAccountAddress,\n toTokenAddress,\n fee,\n gasFeePaymentMethod,\n extraGas,\n } = params;\n\n let totalFee = fee;\n if (extraGas) {\n totalFee = Big(totalFee).plus(extraGas).toFixed();\n }\n const contract = this.getContract(BridgeContract, contractAddress, fromAccountAddress);\n let tx;\n if (gasFeePaymentMethod === FeePaymentMethod.WITH_STABLECOIN) {\n tx = await contract.swap_and_bridge({\n sender: fromAccountAddress,\n token: Address.contract(Buffer.from(fromTokenAddress)).toString(),\n amount: BigInt(amount),\n recipient: Buffer.from(toAccountAddress),\n destination_chain_id: +toChainId,\n receive_token: Buffer.from(toTokenAddress),\n nonce: getNonceBigInt(),\n gas_amount: BigInt(0),\n fee_token_amount: BigInt(totalFee),\n });\n } else {\n tx = await contract.swap_and_bridge({\n sender: fromAccountAddress,\n token: Address.contract(Buffer.from(fromTokenAddress)).toString(),\n amount: BigInt(amount),\n recipient: Buffer.from(toAccountAddress),\n destination_chain_id: +toChainId,\n receive_token: Buffer.from(toTokenAddress),\n nonce: getNonceBigInt(),\n gas_amount: BigInt(totalFee),\n fee_token_amount: BigInt(0),\n });\n }\n return tx.toXDR();\n }\n\n async buildRawTransactionSwap(params: SwapParams): Promise<RawTransaction> {\n const txSwapParams = prepareTxSwapParams(this.chainType, params);\n return await this.buildRawTransactionSwapFromParams(txSwapParams);\n }\n\n async buildRawTransactionSwapFromParams(params: TxSwapParamsSol): Promise<RawTransaction> {\n const {\n amount,\n contractAddress,\n fromAccountAddress,\n fromTokenAddress,\n toAccountAddress,\n toTokenAddress,\n minimumReceiveAmount,\n } = params;\n const contract = this.getContract(BridgeContract, contractAddress, fromAccountAddress);\n return (\n await contract.swap({\n sender: fromAccountAddress,\n amount: BigInt(amount),\n token: Address.contract(Buffer.from(fromTokenAddress)).toBuffer(),\n receive_token: Buffer.from(toTokenAddress),\n recipient: toAccountAddress,\n receive_amount_min: BigInt(minimumReceiveAmount),\n })\n ).toXDR();\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n send(params: SendParams): Promise<TransactionResponse> {\n throw new MethodNotSupportedError();\n }\n\n private getContract<T>(contract: new (args: ContractClientOptions) => T, address: string, sender?: string): T {\n const config: ContractClientOptions = {\n publicKey: sender,\n contractId: address,\n networkPassphrase: this.params.sorobanNetworkPassphrase,\n rpcUrl: this.nodeRpcUrlsConfig.getNodeRpcUrl(ChainSymbol.SRB),\n };\n return new contract(config);\n }\n}\n", "import { contract } from \"@stellar/stellar-sdk\";\nimport u128 = contract.u128;\nimport u32 = contract.u32;\nimport u256 = contract.u256;\nimport AssembledTransaction = contract.AssembledTransaction;\nimport Result = contract.Result;\nimport Option = contract.Option;\nimport ContractSpec = contract.Spec;\nimport ContractClient = contract.Client;\nimport ContractClientOptions = contract.ClientOptions;\n\nexport interface Swapped {\n receive_amount: u128;\n receive_token: Buffer;\n recipient: string;\n send_amount: u128;\n send_token: Buffer;\n sender: string;\n}\n\nexport interface TokensSent {\n amount: u128;\n destination_chain_id: u32;\n nonce: u256;\n receive_token: Buffer;\n recipient: Buffer;\n}\n\nexport interface TokensReceived {\n amount: u128;\n message: Buffer;\n nonce: u256;\n recipient: Buffer;\n}\n\nexport interface ReceiveFee {\n bridge_transaction_cost: u128;\n extra_gas: u128;\n message_transaction_cost: u128;\n}\n\nexport interface BridgingFeeFromTokens {\n fee_token_amount: u128;\n gas: u128;\n}\n\nexport interface AnotherBridge {\n address: Buffer;\n tokens: Map<Buffer, boolean>;\n}\n\nexport interface Bridge {\n /**\n * precomputed values of the scaling factor required for paying the bridging fee with stable tokens\n */\n bridging_fee_conversion_factor: Map<string, u128>;\n can_swap: boolean;\n /**\n * precomputed values to divide by to change the precision from the Gas Oracle precision to the token precision\n */\n from_gas_oracle_factor: Map<string, u128>;\n messenger: string;\n pools: Map<Buffer, string>;\n rebalancer: string;\n}\n\nexport type DataKey =\n | { tag: \"OtherBridge\"; values: readonly [u32] }\n | { tag: \"SentMessage\"; values: readonly [Buffer] }\n | { tag: \"ReceivedMessage\"; values: readonly [Buffer] };\n\nexport type Admin = readonly [string];\nexport type GasOracleAddress = readonly [string];\nexport type GasUsage = readonly [Map<u32, u128>];\nexport type NativeToken = readonly [string];\nexport type StopAuthority = readonly [string];\nexport const Errors = {\n 0: { message: \"\" },\n 1: { message: \"\" },\n 2: { message: \"\" },\n 3: { message: \"\" },\n 4: { message: \"\" },\n 5: { message: \"\" },\n 6: { message: \"\" },\n 7: { message: \"\" },\n 8: { message: \"\" },\n 9: { message: \"\" },\n 10: { message: \"\" },\n 11: { message: \"\" },\n 12: { message: \"\" },\n 103: { message: \"\" },\n 104: { message: \"\" },\n 105: { message: \"\" },\n 106: { message: \"\" },\n 107: { message: \"\" },\n 108: { message: \"\" },\n 109: { message: \"\" },\n 203: { message: \"\" },\n 204: { message: \"\" },\n 205: { message: \"\" },\n 206: { message: \"\" },\n 207: { message: \"\" },\n 208: { message: \"\" },\n 209: { message: \"\" },\n 210: { message: \"\" },\n 211: { message: \"\" },\n 212: { message: \"\" },\n 214: { message: \"\" },\n 215: { message: \"\" },\n 216: { message: \"\" },\n 217: { message: \"\" },\n 218: { message: \"\" },\n 300: { message: \"\" },\n 301: { message: \"\" },\n 302: { message: \"\" },\n 303: { message: \"\" },\n 400: { message: \"\" },\n};\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging\nexport interface BridgeContract {\n /**\n * Construct and simulate a initialize transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n initialize: (\n {\n admin,\n messenger,\n gas_oracle,\n native_token,\n }: {\n admin: string;\n messenger: string;\n gas_oracle: string;\n native_token: string;\n },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a swap_and_bridge transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n swap_and_bridge: (\n {\n sender,\n token,\n amount,\n recipient,\n destination_chain_id,\n receive_token,\n nonce,\n gas_amount,\n fee_token_amount,\n }: {\n sender: string;\n token: string;\n amount: u128;\n recipient: Buffer;\n destination_chain_id: u32;\n receive_token: Buffer;\n nonce: u256;\n gas_amount: u128;\n fee_token_amount: u128;\n },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a receive_tokens transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n receive_tokens: (\n {\n sender,\n amount,\n recipient,\n source_chain_id,\n receive_token,\n nonce,\n receive_amount_min,\n extra_gas,\n }: {\n sender: string;\n amount: u128;\n recipient: string;\n source_chain_id: u32;\n receive_token: Buffer;\n nonce: u256;\n receive_amount_min: u128;\n extra_gas: Option<u128>;\n },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a swap transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n swap: (\n {\n sender,\n amount,\n token,\n receive_token,\n recipient,\n receive_amount_min,\n }: {\n sender: string;\n amount: u128;\n token: Buffer;\n receive_token: Buffer;\n recipient: string;\n receive_amount_min: u128;\n },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a stop_swap transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n stop_swap: (options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a start_swap transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n start_swap: (options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a set_gas_oracle transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n set_gas_oracle: (\n { new_address }: { new_address: string },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a set_stop_authority transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n set_stop_authority: (\n { stop_authority }: { stop_authority: string },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a set_rebalancer transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n set_rebalancer: (\n { rebalancer }: { rebalancer: string },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a set_messenger transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n set_messenger: (\n { messenger }: { messenger: string },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a set_gas_usage transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n set_gas_usage: (\n { chain_id, gas_usage }: { chain_id: u32; gas_usage: u128 },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a register_bridge transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n register_bridge: (\n { chain_id, bridge_address }: { chain_id: u32; bridge_address: Buffer },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a add_bridge_token transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n add_bridge_token: (\n { chain_id, token_address }: { chain_id: u32; token_address: Buffer },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a remove_bridge_token transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n remove_bridge_token: (\n { chain_id, token_address }: { chain_id: u32; token_address: Buffer },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a add_pool transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n add_pool: (\n { pool, token }: { pool: string; token: string },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a withdraw_gas_tokens transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n withdraw_gas_tokens: (\n { sender, amount }: { sender: string; amount: u128 },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a withdraw_bridging_fee_in_tokens transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n withdraw_bridging_fee_in_tokens: (\n { sender, token_address }: { sender: string; token_address: string },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a has_processed_message transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n has_processed_message: (\n { message }: { message: Buffer },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<boolean>>>;\n\n /**\n * Construct and simulate a has_received_message transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n has_received_message: (\n { message }: { message: Buffer },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<boolean>>>;\n\n /**\n * Construct and simulate a get_pool_address transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n get_pool_address: (\n { token_address }: { token_address: Buffer },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<string>>>;\n\n /**\n * Construct and simulate a get_config transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n get_config: (options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }) => Promise<AssembledTransaction<Result<Bridge>>>;\n\n /**\n * Construct and simulate a get_stop_authority transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n get_stop_authority: (options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }) => Promise<AssembledTransaction<Result<string>>>;\n\n /**\n * Construct and simulate a get_transaction_cost transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n get_transaction_cost: (\n { chain_id }: { chain_id: u32 },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<u128>>>;\n\n /**\n * Construct and simulate a get_gas_usage transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n get_gas_usage: (\n { chain_id }: { chain_id: u32 },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<u128>>>;\n\n /**\n * Construct and simulate a get_admin transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n get_admin: (options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }) => Promise<AssembledTransaction<Result<string>>>;\n\n /**\n * Construct and simulate a get_gas_oracle transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n get_gas_oracle: (options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }) => Promise<AssembledTransaction<Result<string>>>;\n\n /**\n * Construct and simulate a get_another_bridge transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n get_another_bridge: (\n { chain_id }: { chain_id: u32 },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<AnotherBridge>>>;\n\n /**\n * Construct and simulate a set_admin transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n set_admin: (\n { new_admin }: { new_admin: string },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a upgrade transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n upgrade: (\n { new_wasm_hash }: { new_wasm_hash: Buffer },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging\nexport class BridgeContract extends ContractClient {\n constructor(public readonly options: ContractClientOptions) {\n super(\n new ContractSpec([\n \"AAAAAAAAAAAAAAAKaW5pdGlhbGl6ZQAAAAAABAAAAAAAAAAFYWRtaW4AAAAAAAATAAAAAAAAAAltZXNzZW5nZXIAAAAAAAATAAAAAAAAAApnYXNfb3JhY2xlAAAAAAATAAAAAAAAAAxuYXRpdmVfdG9rZW4AAAATAAAAAQAAA+kAAAPtAAAAAAAAAAM=\",\n \"AAAAAAAAAAAAAAAPc3dhcF9hbmRfYnJpZGdlAAAAAAkAAAAAAAAABnNlbmRlcgAAAAAAEwAAAAAAAAAFdG9rZW4AAAAAAAATAAAAAAAAAAZhbW91bnQAAAAAAAoAAAAAAAAACXJlY2lwaWVudAAAAAAAA+4AAAAgAAAAAAAAABRkZXN0aW5hdGlvbl9jaGFpbl9pZAAAAAQAAAAAAAAADXJlY2VpdmVfdG9rZW4AAAAAAAPuAAAAIAAAAAAAAAAFbm9uY2UAAAAAAAAMAAAAAAAAAApnYXNfYW1vdW50AAAAAAAKAAAAAAAAABBmZWVfdG9rZW5fYW1vdW50AAAACgAAAAEAAAPpAAAD7QAAAAAAAAAD\",\n \"AAAAAAAAAAAAAAAOcmVjZWl2ZV90b2tlbnMAAAAAAAgAAAAAAAAABnNlbmRlcgAAAAAAEwAAAAAAAAAGYW1vdW50AAAAAAAKAAAAAAAAAAlyZWNpcGllbnQAAAAAAAATAAAAAAAAAA9zb3VyY2VfY2hhaW5faWQAAAAABAAAAAAAAAANcmVjZWl2ZV90b2tlbgAAAAAAA+4AAAAgAAAAAAAAAAVub25jZQAAAAAAAAwAAAAAAAAAEnJlY2VpdmVfYW1vdW50X21pbgAAAAAACgAAAAAAAAAJZXh0cmFfZ2FzAAAAAAAD6AAAAAoAAAABAAAD6QAAA+0AAAAAAAAAAw==\",\n \"AAAAAAAAAAAAAAAEc3dhcAAAAAYAAAAAAAAABnNlbmRlcgAAAAAAEwAAAAAAAAAGYW1vdW50AAAAAAAKAAAAAAAAAAV0b2tlbgAAAAAAA+4AAAAgAAAAAAAAAA1yZWNlaXZlX3Rva2VuAAAAAAAD7gAAACAAAAAAAAAACXJlY2lwaWVudAAAAAAAABMAAAAAAAAAEnJlY2VpdmVfYW1vdW50X21pbgAAAAAACgAAAAEAAAPpAAAD7QAAAAAAAAAD\",\n \"AAAAAAAAAAAAAAAJc3RvcF9zd2FwAAAAAAAAAAAAAAEAAAPpAAAD7QAAAAAAAAAD\",\n \"AAAAAAAAAAAAAAAKc3RhcnRfc3dhcAAAAAAAAAAAAAEAAAPpAAAD7QAAAAAAAAAD\",\n \"AAAAAAAAAAAAAAAOc2V0X2dhc19vcmFjbGUAAAAAAAEAAAAAAAAAC25ld19hZGRyZXNzAAAAABMAAAABAAAD6QAAA+0AAAAAAAAAAw==\",\n \"AAAAAAAAAAAAAAASc2V0X3N0b3BfYXV0aG9yaXR5AAAAAAABAAAAAAAAAA5zdG9wX2F1dGhvcml0eQAAAAAAEwAAAAEAAAPpAAAD7QAAAAAAAAAD\",\n \"AAAAAAAAAAAAAAAOc2V0X3JlYmFsYW5jZXIAAAAAAAEAAAAAAAAACnJlYmFsYW5jZXIAAAAAABMAAAABAAAD6QAAA+0AAAAAAAAAAw==\",\n \"AAAAAAAAAAAAAAANc2V0X21lc3NlbmdlcgAAAAAAAAEAAAAAAAAACW1lc3NlbmdlcgAAAAAAABMAAAABAAAD6QAAA+0AAAAAAAAAAw==\",\n \"AAAAAAAAAAAAAAANc2V0X2dhc191c2FnZQAAAAAAAAIAAAAAAAAACGNoYWluX2lkAAAABAAAAAAAAAAJZ2FzX3VzYWdlAAAAAAAACgAAAAEAAAPpAAAD7QAAAAAAAAAD\",\n \"AAAAAAAAAAAAAAAPcmVnaXN0ZXJfYnJpZGdlAAAAAAIAAAAAAAAACGNoYWluX2lkAAAABAAAAAAAAAAOYnJpZGdlX2FkZHJlc3MAAAAAA+4AAAAgAAAAAQAAA+kAAAPtAAAAAAAAAAM=\",\n \"AAAAAAAAAAAAAAAQYWRkX2JyaWRnZV90b2tlbgAAAAIAAAAAAAAACGNoYWluX2lkAAAABAAAAAAAAAANdG9rZW5fYWRkcmVzcwAAAAAAA+4AAAAgAAAAAQAAA+kAAAPtAAAAAAAAAAM=\",\n \"AAAAAAAAAAAAAAATcmVtb3ZlX2JyaWRnZV90b2tlbgAAAAACAAAAAAAAAAhjaGFpbl9pZAAAAAQAAAAAAAAADXRva2VuX2FkZHJlc3MAAAAAAAPuAAAAIAAAAAEAAAPpAAAD7QAAAAAAAAAD\",\n \"AAAAAAAAAAAAAAAIYWRkX3Bvb2wAAAACAAAAAAAAAARwb29sAAAAEwAAAAAAAAAFdG9rZW4AAAAAAAATAAAAAQAAA+kAAAPtAAAAAAAAAAM=\",\n \"AAAAAAAAAAAAAAATd2l0aGRyYXdfZ2FzX3Rva2VucwAAAAACAAAAAAAAAAZzZW5kZXIAAAAAABMAAAAAAAAABmFtb3VudAAAAAAACgAAAAEAAAPpAAAD7QAAAAAAAAAD\",\n \"AAAAAAAAAAAAAAAfd2l0aGRyYXdfYnJpZGdpbmdfZmVlX2luX3Rva2VucwAAAAACAAAAAAAAAAZzZW5kZXIAAAAAABMAAAAAAAAADXRva2VuX2FkZHJlc3MAAAAAAAATAAAAAQAAA+kAAAPtAAAAAAAAAAM=\",\n \"AAAAAAAAAAAAAAAVaGFzX3Byb2Nlc3NlZF9tZXNzYWdlAAAAAAAAAQAAAAAAAAAHbWVzc2FnZQAAAAPuAAAAIAAAAAEAAAPpAAAAAQAAAAM=\",\n \"AAAAAAAAAAAAAAAUaGFzX3JlY2VpdmVkX21lc3NhZ2UAAAABAAAAAAAAAAdtZXNzYWdlAAAAA+4AAAAgAAAAAQAAA+kAAAABAAAAAw==\",\n \"AAAAAAAAAAAAAAAQZ2V0X3Bvb2xfYWRkcmVzcwAAAAEAAAAAAAAADXRva2VuX2FkZHJlc3MAAAAAAAPuAAAAIAAAAAEAAAPpAAAAEwAAAAM=\",\n \"AAAAAAAAAAAAAAAKZ2V0X2NvbmZpZwAAAAAAAAAAAAEAAAPpAAAH0AAAAAZCcmlkZ2UAAAAAAAM=\",\n \"AAAAAAAAAAAAAAASZ2V0X3N0b3BfYXV0aG9yaXR5AAAAAAAAAAAAAQAAA+kAAAATAAAAAw==\",\n \"AAAAAAAAAAAAAAAUZ2V0X3RyYW5zYWN0aW9uX2Nvc3QAAAABAAAAAAAAAAhjaGFpbl9pZAAAAAQAAAABAAAD6QAAAAoAAAAD\",\n \"AAAAAAAAAAAAAAANZ2V0X2dhc191c2FnZQAAAAAAAAEAAAAAAAAACGNoYWluX2lkAAAABAAAAAEAAAPpAAAACgAAAAM=\",\n \"AAAAAAAAAAAAAAAJZ2V0X2FkbWluAAAAAAAAAAAAAAEAAAPpAAAAEwAAAAM=\",\n \"AAAAAAAAAAAAAAAOZ2V0X2dhc19vcmFjbGUAAAAAAAAAAAABAAAD6QAAABMAAAAD\",\n \"AAAAAAAAAAAAAAASZ2V0X2Fub3RoZXJfYnJpZGdlAAAAAAABAAAAAAAAAAhjaGFpbl9pZAAAAAQAAAABAAAD6QAAB9AAAAANQW5vdGhlckJyaWRnZQAAAAAAAAM=\",\n \"AAAAAAAAAAAAAAAJc2V0X2FkbWluAAAAAAAAAQAAAAAAAAAJbmV3X2FkbWluAAAAAAAAEwAAAAEAAAPpAAAD7QAAAAAAAAAD\",\n \"AAAAAAAAAAAAAAAHdXBncmFkZQAAAAABAAAAAAAAAA1uZXdfd2FzbV9oYXNoAAAAAAAD7gAAACAAAAABAAAD6QAAA+0AAAAAAAAAAw==\",\n \"AAAAAQAAAAAAAAAAAAAAB1N3YXBwZWQAAAAABgAAAAAAAAAOcmVjZWl2ZV9hbW91bnQAAAAAAAoAAAAAAAAADXJlY2VpdmVfdG9rZW4AAAAAAAPuAAAAIAAAAAAAAAAJcmVjaXBpZW50AAAAAAAAEwAAAAAAAAALc2VuZF9hbW91bnQAAAAACgAAAAAAAAAKc2VuZF90b2tlbgAAAAAD7gAAACAAAAAAAAAABnNlbmRlcgAAAAAAEw==\",\n \"AAAAAQAAAAAAAAAAAAAAClRva2Vuc1NlbnQAAAAAAAUAAAAAAAAABmFtb3VudAAAAAAACgAAAAAAAAAUZGVzdGluYXRpb25fY2hhaW5faWQAAAAEAAAAAAAAAAVub25jZQAAAAAAAAwAAAAAAAAADXJlY2VpdmVfdG9rZW4AAAAAAAPuAAAAIAAAAAAAAAAJcmVjaXBpZW50AAAAAAAD7gAAACA=\",\n \"AAAAAQAAAAAAAAAAAAAADlRva2Vuc1JlY2VpdmVkAAAAAAAEAAAAAAAAAAZhbW91bnQAAAAAAAoAAAAAAAAAB21lc3NhZ2UAAAAD7gAAACAAAAAAAAAABW5vbmNlAAAAAAAADAAAAAAAAAAJcmVjaXBpZW50AAAAAAAD7gAAACA=\",\n \"AAAAAQAAAAAAAAAAAAAAClJlY2VpdmVGZWUAAAAAAAMAAAAAAAAAF2JyaWRnZV90cmFuc2FjdGlvbl9jb3N0AAAAAAoAAAAAAAAACWV4dHJhX2dhcwAAAAAAAAoAAAAAAAAAGG1lc3NhZ2VfdHJhbnNhY3Rpb25fY29zdAAAAAo=\",\n \"AAAAAQAAAAAAAAAAAAAAFUJyaWRnaW5nRmVlRnJvbVRva2VucwAAAAAAAAIAAAAAAAAAEGZlZV90b2tlbl9hbW91bnQAAAAKAAAAAAAAAANnYXMAAAAACg==\",\n \"AAAAAQAAAAAAAAAAAAAADUFub3RoZXJCcmlkZ2UAAAAAAAACAAAAAAAAAAdhZGRyZXNzAAAAA+4AAAAgAAAAAAAAAAZ0b2tlbnMAAAAAA+wAAAPuAAAAIAAAAAE=\",\n \"AAAAAQAAAAAAAAAAAAAABkJyaWRnZQAAAAAABgAAAGBwcmVjb21wdXRlZCB2YWx1ZXMgb2YgdGhlIHNjYWxpbmcgZmFjdG9yIHJlcXVpcmVkIGZvciBwYXlpbmcgdGhlIGJyaWRnaW5nIGZlZSB3aXRoIHN0YWJsZSB0b2tlbnMAAAAeYnJpZGdpbmdfZmVlX2NvbnZlcnNpb25fZmFjdG9yAAAAAAPsAAAAEwAAAAoAAAAAAAAACGNhbl9zd2FwAAAAAQAAAGxwcmVjb21wdXRlZCB2YWx1ZXMgdG8gZGl2aWRlIGJ5IHRvIGNoYW5nZSB0aGUgcHJlY2lzaW9uIGZyb20gdGhlIEdhcyBPcmFjbGUgcHJlY2lzaW9uIHRvIHRoZSB0b2tlbiBwcmVjaXNpb24AAAAWZnJvbV9nYXNfb3JhY2xlX2ZhY3RvcgAAAAAD7AAAABMAAAAKAAAAAAAAAAltZXNzZW5nZXIAAAAAAAATAAAAAAAAAAVwb29scwAAAAAAA+wAAAPuAAAAIAAAABMAAAAAAAAACnJlYmFsYW5jZXIAAAAAABM=\",\n \"AAAAAgAAAAAAAAAAAAAAB0RhdGFLZXkAAAAAAwAAAAEAAAAAAAAAC090aGVyQnJpZGdlAAAAAAEAAAAEAAAAAQAAAAAAAAALU2VudE1lc3NhZ2UAAAAAAQAAA+4AAAAgAAAAAQAAAAAAAAAPUmVjZWl2ZWRNZXNzYWdlAAAAAAEAAAPuAAAAIA==\",\n \"AAAAAQAAAAAAAAAAAAAABUFkbWluAAAAAAAAAQAAAAAAAAABMAAAAAAAABM=\",\n \"AAAAAQAAAAAAAAAAAAAAEEdhc09yYWNsZUFkZHJlc3MAAAABAAAAAAAAAAEwAAAAAAAAEw==\",\n \"AAAAAQAAAAAAAAAAAAAACEdhc1VzYWdlAAAAAQAAAAAAAAABMAAAAAAAA+wAAAAEAAAACg==\",\n \"AAAAAQAAAAAAAAAAAAAAC05hdGl2ZVRva2VuAAAAAAEAAAAAAAAAATAAAAAAAAAT\",\n \"AAAAAQAAAAAAAAAAAAAADVN0b3BBdXRob3JpdHkAAAAAAAABAAAAAAAAAAEwAAAAAAAAEw==\",\n \"AAAABAAAAAAAAAAAAAAABUVycm9yAAAAAAAAKAAAAAAAAAANVW5pbXBsZW1lbnRlZAAAAAAAAAAAAAAAAAAAC0luaXRpYWxpemVkAAAAAAEAAAAAAAAADVVuaW5pdGlhbGl6ZWQAAAAAAAACAAAAAAAAAAxVbmF1dGhvcml6ZWQAAAADAAAAAAAAAApJbnZhbGlkQXJnAAAAAAAEAAAAAAAAAA5JbnZhbGlkQ2hhaW5JZAAAAAAABQAAAAAAAAATSW52YWxpZE90aGVyQ2hhaW5JZAAAAAAGAAAAAAAAAA5HYXNVc2FnZU5vdFNldAAAAAAABwAAAAAAAAANQnJva2VuQWRkcmVzcwAAAAAAAAgAAAAAAAAACE5vdEZvdW5kAAAACQAAAAAAAAAYVG9rZW5JbnN1ZmZpY2llbnRCYWxhbmNlAAAACgAAAAAAAAAKQ2FzdEZhaWxlZAAAAAAACwAAAAAAAAAMVTI1Nk92ZXJmbG93AAAADAAAAAAAAAAKWmVyb0Ftb3VudAAAAAAAZwAAAAAAAAAMUG9vbE92ZXJmbG93AAAAaAAAAAAAAAALWmVyb0NoYW5nZXMAAAAAaQAAAAAAAAARUmVzZXJ2ZXNFeGhhdXN0ZWQAAAAAAABqAAAAAAAAABpJbnN1ZmZpY2llbnRSZWNlaXZlZEFtb3VudAAAAAAAawAAAAAAAAAUQmFsYW5jZVJhdGlvRXhjZWVkZWQAAABsAAAAAAAAAAlGb3JiaWRkZW4AAAAAAABtAAAAAAAAABlVbmF1dGhvcml6ZWRTdG9wQXV0aG9yaXR5AAAAAAAAywAAAAAAAAAOU3dhcFByb2hpYml0ZWQAAAAAAMwAAAAAAAAAEkFtb3VudFRvb0xvd0ZvckZlZQAAAAAAzQAAAAAAAAAWQnJpZGdlVG9UaGVaZXJvQWRkcmVzcwAAAAAAzgAAAAAAAAAORW1wdHlSZWNpcGllbnQAAAAAAM8AAAAAAAAAE1NvdXJjZU5vdFJlZ2lzdGVyZWQAAAAA0AAAAAAAAAAVV3JvbmdEZXN0aW5hdGlvbkNoYWluAAAAAAAA0QAAAAAAAAATVW5rbm93bkFub3RoZXJDaGFpbgAAAADSAAAAAAAAABFUb2tlbnNBbHJlYWR5U2VudAAAAAAAANMAAAAAAAAAEE1lc3NhZ2VQcm9jZXNzZWQAAADUAAAAAAAAAAxOb3RFbm91Z2hGZWUAAADWAAAAAAAAAAlOb01lc3NhZ2UAAAAAAADXAAAAAAAAAA1Ob1JlY2VpdmVQb29sAAAAAAAA2AAAAAAAAAAGTm9Qb29sAAAAAADZAAAAAAAAABNVbmtub3duQW5vdGhlclRva2VuAAAAANoAAAAAAAAAD1dyb25nQnl0ZUxlbmd0aAAAAAEsAAAAAAAAAApIYXNNZXNzYWdlAAAAAAEtAAAAAAAAABdJbnZhbGlkUHJpbWFyeVNpZ25hdHVyZQAAAAEuAAAAAAAAABlJbnZhbGlkU2Vjb25kYXJ5U2lnbmF0dXJlAAAAAAABLwAAAAAAAAARTm9HYXNEYXRhRm9yQ2hhaW4AAAAAAAGQ\",\n ]),\n options\n );\n }\n\n public readonly fromJSON = {\n initialize: this.txFromJSON<Result<void>>,\n swap_and_bridge: this.txFromJSON<Result<void>>,\n receive_tokens: this.txFromJSON<Result<void>>,\n swap: this.txFromJSON<Result<void>>,\n stop_swap: this.txFromJSON<Result<void>>,\n start_swap: this.txFromJSON<Result<void>>,\n set_gas_oracle: this.txFromJSON<Result<void>>,\n set_stop_authority: this.txFromJSON<Result<void>>,\n set_rebalancer: this.txFromJSON<Result<void>>,\n set_messenger: this.txFromJSON<Result<void>>,\n set_gas_usage: this.txFromJSON<Result<void>>,\n register_bridge: this.txFromJSON<Result<void>>,\n add_bridge_token: this.txFromJSON<Result<void>>,\n remove_bridge_token: this.txFromJSON<Result<void>>,\n add_pool: this.txFromJSON<Result<void>>,\n withdraw_gas_tokens: this.txFromJSON<Result<void>>,\n withdraw_bridging_fee_in_tokens: this.txFromJSON<Result<void>>,\n has_processed_message: this.txFromJSON<Result<boolean>>,\n has_received_message: this.txFromJSON<Result<boolean>>,\n get_pool_address: this.txFromJSON<Result<string>>,\n get_config: this.txFromJSON<Result<Bridge>>,\n get_stop_authority: this.txFromJSON<Result<string>>,\n get_transaction_cost: this.txFromJSON<Result<u128>>,\n get_gas_usage: this.txFromJSON<Result<u128>>,\n get_admin: this.txFromJSON<Result<string>>,\n get_gas_oracle: this.txFromJSON<Result<string>>,\n get_another_bridge: this.txFromJSON<Result<AnotherBridge>>,\n set_admin: this.txFromJSON<Result<void>>,\n upgrade: this.txFromJSON<Result<void>>,\n };\n}\n", "import { SuiClient } from \"@mysten/sui/client\";\nimport { CoinStruct } from \"@mysten/sui/src/client/types/generated\";\nimport { coinWithBalance, Transaction, TransactionResult } from \"@mysten/sui/transactions\";\nimport { SUI_CLOCK_OBJECT_ID } from \"@mysten/sui/utils\";\nimport { Big } from \"big.js\";\nimport { AllbridgeCoreClient } from \"../../../client/core-api/core-client-base\";\nimport {\n ChainSymbol,\n ChainType,\n FeePaymentMethod,\n Messenger,\n OFTDoesNotSupportedError,\n RawSuiTransaction,\n SdkError,\n SwapParams,\n TransactionResponse,\n} from \"../../../models\";\nimport { SuiAddresses } from \"../../../tokens-info\";\nimport { NodeRpcUrlsConfig } from \"../../index\";\nimport { setAddress } from \"../../models/sui/bridge\";\nimport { swap, swapAndBridge, swapAndBridgeWormhole } from \"../../models/sui/bridge/bridge-interface/functions\";\nimport { setAddress as setCctpAddress } from \"../../models/sui/cctp-bridge\";\nimport { bridge } from \"../../models/sui/cctp-bridge/cctp-bridge-interface/functions\";\nimport { setAddress as setUtilsAddress } from \"../../models/sui/utils\";\nimport { fromHex } from \"../../models/sui/utils/bytes32/functions\";\nimport { fetchAllPagesRecursive } from \"../../utils/sui/paginated\";\nimport { getCctpSolTokenRecipientAddress } from \"../get-cctp-sol-token-recipient-address\";\nimport { ChainBridgeService, SendParams, TxSendParamsSui, TxSwapParamsSui } from \"../models\";\nimport { getNonceBigInt, normalizeSuiHex, prepareTxSendParams, prepareTxSwapParams } from \"../utils\";\n\nexport class SuiBridgeService extends ChainBridgeService {\n chainType: ChainType.SUI = ChainType.SUI;\n chainSymbol: ChainSymbol.SUI = ChainSymbol.SUI;\n\n private readonly client: SuiClient;\n\n constructor(\n private nodeRpcUrlsConfig: NodeRpcUrlsConfig,\n public api: AllbridgeCoreClient\n ) {\n super();\n this.client = new SuiClient({\n url: nodeRpcUrlsConfig.getNodeRpcUrl(this.chainSymbol),\n });\n }\n\n send(): Promise<TransactionResponse> {\n throw new SdkError(\"Method send not implemented.\");\n }\n\n async buildRawTransactionSwap(params: SwapParams): Promise<RawSuiTransaction> {\n const suiAddresses = params.sourceToken.suiAddresses;\n if (!suiAddresses) {\n throw new SdkError(\"SUI token must contain 'suiAddresses'\");\n }\n setAddress(suiAddresses.bridgeAddress, suiAddresses.bridgeAddressOrigin);\n\n const txSwapParams = prepareTxSwapParams(this.chainType, params);\n return await this.buildRawTransactionSwapFromParams(txSwapParams, suiAddresses);\n }\n\n private async buildRawTransactionSwapFromParams(\n params: TxSwapParamsSui,\n suiAddresses: SuiAddresses\n ): Promise<RawSuiTransaction> {\n const { amount, fromAccountAddress, fromTokenAddress, toTokenAddress, minimumReceiveAmount } = params;\n\n const tx = new Transaction();\n tx.setSender(fromAccountAddress);\n\n const args = {\n bridge: suiAddresses.bridgeObjectAddress,\n coin: coinWithBalance({ balance: BigInt(amount), type: fromTokenAddress }),\n receiveAmountMin: BigInt(minimumReceiveAmount),\n };\n const swapResult = swap(tx, [fromTokenAddress, toTokenAddress], args);\n\n const coins: CoinStruct[] = await fetchAllPagesRecursive((cursor: string | null | undefined) =>\n this.client.getCoins({\n owner: params.toAccountAddress,\n coinType: toTokenAddress,\n cursor,\n })\n );\n if (coins.length === 0 || !coins[0]) {\n tx.transferObjects([swapResult], params.toAccountAddress);\n } else {\n tx.mergeCoins(coins[0].coinObjectId, [swapResult]);\n }\n return await tx.toJSON({ client: this.client });\n }\n\n async buildRawTransactionSendFromCustomTx(\n baseTx: string | Uint8Array | Transaction,\n inputCoin: TransactionResult,\n params: SendParams\n ): Promise<RawSuiTransaction> {\n const transaction = Transaction.from(baseTx);\n return this.buildRawTransactionSendFromTx(params, transaction, inputCoin);\n }\n\n async buildRawTransactionSend(params: SendParams): Promise<RawSuiTransaction> {\n return this.buildRawTransactionSendFromTx(params, new Transaction());\n }\n\n private async buildRawTransactionSendFromTx(\n params: SendParams,\n tx: Transaction,\n inputCoin?: TransactionResult\n ): Promise<RawSuiTransaction> {\n const txSendParams = await prepareTxSendParams(this.chainType, params, this.api);\n const { messenger } = txSendParams;\n\n const suiAddresses = params.sourceToken.suiAddresses;\n if (!suiAddresses) {\n throw new SdkError(\"SUI token must contain 'suiAddresses'\");\n }\n setAddress(suiAddresses.bridgeAddress, suiAddresses.bridgeAddressOrigin);\n setUtilsAddress(suiAddresses.utilsAddress);\n\n switch (messenger) {\n case Messenger.ALLBRIDGE:\n return this.buildRawTransactionAllbridgeSend(txSendParams, suiAddresses, tx, inputCoin);\n case Messenger.WORMHOLE:\n return this.buildRawTransactionWormholeSend(txSendParams, suiAddresses, tx, inputCoin);\n case Messenger.CCTP:\n case Messenger.CCTP_V2:\n return this.buildRawTransactionCctpSend(params, txSendParams, suiAddresses, tx, inputCoin);\n case Messenger.OFT:\n throw new OFTDoesNotSupportedError(\"Messenger OFT is not supported yet.\");\n }\n }\n\n private async buildRawTransactionAllbridgeSend(\n txSendParams: TxSendParamsSui,\n suiAddresses: SuiAddresses,\n tx: Transaction,\n inputCoin?: TransactionResult\n ): Promise<RawSuiTransaction> {\n const {\n amount,\n fromAccountAddress,\n fromTokenAddress,\n toChainId,\n toAccountAddress,\n toTokenAddress,\n fee,\n gasFeePaymentMethod,\n extraGas,\n } = txSendParams;\n let totalFee = fee;\n if (extraGas) {\n totalFee = Big(totalFee).plus(extraGas).toFixed();\n }\n\n tx.setSender(fromAccountAddress);\n if (gasFeePaymentMethod === FeePaymentMethod.WITH_STABLECOIN) {\n const amountWithoutFee = BigInt(amount) - BigInt(totalFee);\n\n let amountCoin, feeTokenCoin;\n if (inputCoin) {\n const [feeTokenCoinS] = tx.splitCoins(inputCoin, [totalFee]);\n amountCoin = inputCoin;\n feeTokenCoin = feeTokenCoinS;\n } else {\n amountCoin = coinWithBalance({ balance: amountWithoutFee, type: fromTokenAddress });\n feeTokenCoin = coinWithBalance({ balance: BigInt(totalFee), type: fromTokenAddress });\n }\n\n const args = {\n bridge: suiAddresses.bridgeObjectAddress,\n messenger: suiAddresses.allbridgeMessengerObjectAddress,\n amount: amountCoin,\n destinationChainId: toChainId,\n nonce: getNonceBigInt(),\n recipient: fromHex(tx, normalizeSuiHex(toAccountAddress)),\n receiveToken: fromHex(tx, normalizeSuiHex(toTokenAddress)),\n gasOracle: suiAddresses.gasOracleObjectAddress,\n feeTokenCoin: feeTokenCoin,\n feeSuiCoin: coinWithBalance({ balance: BigInt(0), useGasCoin: false }),\n };\n swapAndBridge(tx, fromTokenAddress, args);\n } else {\n const totalFeeCoin =\n totalFee === \"0\"\n ? coinWithBalance({ balance: BigInt(totalFee), useGasCoin: false })\n : coinWithBalance({ balance: BigInt(totalFee) });\n const args = {\n bridge: suiAddresses.bridgeObjectAddress,\n messenger: suiAddresses.allbridgeMessengerObjectAddress,\n amount: inputCoin ?? coinWithBalance({ balance: BigInt(amount), type: fromTokenAddress }),\n destinationChainId: toChainId,\n nonce: getNonceBigInt(),\n recipient: fromHex(tx, normalizeSuiHex(toAccountAddress)),\n receiveToken: fromHex(tx, normalizeSuiHex(toTokenAddress)),\n gasOracle: suiAddresses.gasOracleObjectAddress,\n feeTokenCoin: coinWithBalance({ balance: BigInt(0), type: fromTokenAddress }),\n feeSuiCoin: totalFeeCoin,\n };\n swapAndBridge(tx, fromTokenAddress, args);\n }\n return await tx.toJSON({ client: this.client });\n }\n\n private async buildRawTransactionWormholeSend(\n txSendParams: TxSendParamsSui,\n suiAddresses: SuiAddresses,\n tx: Transaction,\n inputCoin?: TransactionResult\n ): Promise<RawSuiTransaction> {\n const {\n amount,\n fromAccountAddress,\n fromTokenAddress,\n toChainId,\n toAccountAddress,\n toTokenAddress,\n fee,\n gasFeePaymentMethod,\n extraGas,\n } = txSendParams;\n let totalFee = fee;\n if (extraGas) {\n totalFee = Big(totalFee).plus(extraGas).toFixed();\n }\n\n tx.setSender(fromAccountAddress);\n if (gasFeePaymentMethod === FeePaymentMethod.WITH_STABLECOIN) {\n const amountWithoutFee = BigInt(amount) - BigInt(totalFee);\n\n let amountCoin, feeTokenCoin;\n if (inputCoin) {\n const [feeTokenCoinS] = tx.splitCoins(inputCoin, [totalFee]);\n amountCoin = inputCoin;\n feeTokenCoin = feeTokenCoinS;\n } else {\n amountCoin = coinWithBalance({ balance: amountWithoutFee, type: fromTokenAddress });\n feeTokenCoin = coinWithBalance({ balance: BigInt(totalFee), type: fromTokenAddress });\n }\n\n const args = {\n bridge: suiAddresses.bridgeObjectAddress,\n messenger: suiAddresses.wormholeMessengerObjectAddress,\n wormholeState: suiAddresses.wormholeStateObjectAddress,\n theClock: SUI_CLOCK_OBJECT_ID,\n amount: amountCoin,\n destinationChainId: toChainId,\n nonce: getNonceBigInt(),\n recipient: fromHex(tx, normalizeSuiHex(toAccountAddress)),\n receiveToken: fromHex(tx, normalizeSuiHex(toTokenAddress)),\n gasOracle: suiAddresses.gasOracleObjectAddress,\n feeTokenCoin: feeTokenCoin,\n feeSuiCoin: coinWithBalance({ balance: BigInt(0), useGasCoin: false }),\n };\n swapAndBridgeWormhole(tx, fromTokenAddress, args);\n } else {\n const totalFeeCoin =\n totalFee === \"0\"\n ? coinWithBalance({ balance: BigInt(totalFee), useGasCoin: false })\n : coinWithBalance({ balance: BigInt(totalFee) });\n const args = {\n bridge: suiAddresses.bridgeObjectAddress,\n messenger: suiAddresses.wormholeMessengerObjectAddress,\n wormholeState: suiAddresses.wormholeStateObjectAddress,\n theClock: SUI_CLOCK_OBJECT_ID,\n amount: inputCoin ?? coinWithBalance({ balance: BigInt(amount), type: fromTokenAddress }),\n destinationChainId: toChainId,\n nonce: getNonceBigInt(),\n recipient: fromHex(tx, normalizeSuiHex(toAccountAddress)),\n receiveToken: fromHex(tx, normalizeSuiHex(toTokenAddress)),\n gasOracle: suiAddresses.gasOracleObjectAddress,\n feeTokenCoin: coinWithBalance({ balance: BigInt(0), type: fromTokenAddress }),\n feeSuiCoin: totalFeeCoin,\n };\n swapAndBridgeWormhole(tx, fromTokenAddress, args);\n }\n return await tx.toJSON({ client: this.client });\n }\n\n private async buildRawTransactionCctpSend(\n params: SendParams,\n txSendParams: TxSendParamsSui,\n suiAddresses: SuiAddresses,\n tx: Transaction,\n inputCoin?: TransactionResult\n ): Promise<RawSuiTransaction> {\n const {\n amount,\n fromAccountAddress,\n fromTokenAddress,\n toChainId,\n toAccountAddress,\n fee,\n gasFeePaymentMethod,\n extraGas,\n } = txSendParams;\n\n setCctpAddress(suiAddresses.cctpAddress, suiAddresses.cctpAddressOrigin);\n\n let totalFee = fee;\n if (extraGas) {\n totalFee = Big(totalFee).plus(extraGas).toFixed();\n }\n\n tx.setSender(fromAccountAddress);\n\n const recipientWalletAddress = fromHex(tx, normalizeSuiHex(toAccountAddress));\n let recipient: TransactionResult;\n if (params.destinationToken.chainType === ChainType.SOLANA) {\n const recipientStr = await getCctpSolTokenRecipientAddress(\n this.chainType,\n params.toAccountAddress,\n params.destinationToken.tokenAddress,\n this.nodeRpcUrlsConfig.getNodeRpcUrl(ChainSymbol.SOL)\n );\n recipient = fromHex(tx, normalizeSuiHex(recipientStr));\n } else {\n recipient = recipientWalletAddress;\n }\n\n if (gasFeePaymentMethod === FeePaymentMethod.WITH_STABLECOIN) {\n const amountWithoutFee = BigInt(amount) - BigInt(totalFee);\n\n let amountCoin, feeTokenCoin;\n if (inputCoin) {\n const [feeTokenCoinS] = tx.splitCoins(inputCoin, [totalFee]);\n amountCoin = inputCoin;\n feeTokenCoin = feeTokenCoinS;\n } else {\n amountCoin = coinWithBalance({ balance: amountWithoutFee, type: fromTokenAddress });\n feeTokenCoin = coinWithBalance({ balance: BigInt(totalFee), type: fromTokenAddress });\n }\n\n const args = {\n cctpBridge: suiAddresses.cctpObjectAddress,\n tokenMessengerMinterState: suiAddresses.cctpTokenMessengerMinterStateObjectAddress,\n messageTransmitterState: suiAddresses.cctpMessageTransmitterStateObjectAddress,\n treasury: suiAddresses.cctpTreasuryObjectAddress,\n denyList: suiAddresses.cctpDenyListObjectAddress,\n amount: amountCoin,\n destinationChainId: toChainId,\n recipient: recipient,\n recipientWalletAddress: recipientWalletAddress,\n gasOracle: suiAddresses.gasOracleObjectAddress,\n feeTokenCoin: feeTokenCoin,\n feeSuiCoin: coinWithBalance({ balance: BigInt(0), useGasCoin: false }),\n };\n bridge(tx, fromTokenAddress, args);\n } else {\n const totalFeeCoin =\n totalFee === \"0\"\n ? coinWithBalance({ balance: BigInt(totalFee), useGasCoin: false })\n : coinWithBalance({ balance: BigInt(totalFee) });\n const args = {\n cctpBridge: suiAddresses.cctpObjectAddress,\n tokenMessengerMinterState: suiAddresses.cctpTokenMessengerMinterStateObjectAddress,\n messageTransmitterState: suiAddresses.cctpMessageTransmitterStateObjectAddress,\n treasury: suiAddresses.cctpTreasuryObjectAddress,\n denyList: suiAddresses.cctpDenyListObjectAddress,\n amount: inputCoin ?? coinWithBalance({ balance: BigInt(amount), type: fromTokenAddress }),\n destinationChainId: toChainId,\n recipient: recipient,\n recipientWalletAddress: recipientWalletAddress,\n gasOracle: suiAddresses.gasOracleObjectAddress,\n feeTokenCoin: coinWithBalance({ balance: BigInt(0), type: fromTokenAddress }),\n feeSuiCoin: totalFeeCoin,\n };\n bridge(tx, fromTokenAddress, args);\n }\n return await tx.toJSON({ client: this.client });\n }\n}\n", "// @ts-nocheck\nimport { PUBLISHED_AT } from \"..\";\nimport { obj, pure } from \"../../_framework/util\";\nimport { Transaction, TransactionArgument, TransactionObjectInput } from \"@mysten/sui/transactions\";\n\nexport function destroyEmpty(tx: Transaction, typeArg: string, userDeposit: TransactionObjectInput) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::destroy_empty`,\n typeArguments: [typeArg],\n arguments: [obj(tx, userDeposit)],\n });\n}\n\nexport interface SwapArgs {\n bridge: TransactionObjectInput;\n coin: TransactionObjectInput;\n receiveAmountMin: bigint | TransactionArgument;\n}\n\nexport function swap(tx: Transaction, typeArgs: [string, string], args: SwapArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::swap`,\n typeArguments: typeArgs,\n arguments: [obj(tx, args.bridge), obj(tx, args.coin), pure(tx, args.receiveAmountMin, `u64`)],\n });\n}\n\nexport interface DepositArgs {\n bridge: TransactionObjectInput;\n userDeposit: TransactionObjectInput;\n coin: TransactionObjectInput;\n}\n\nexport function deposit(tx: Transaction, typeArg: string, args: DepositArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::deposit`,\n typeArguments: [typeArg],\n arguments: [obj(tx, args.bridge), obj(tx, args.userDeposit), obj(tx, args.coin)],\n });\n}\n\nexport interface WithdrawArgs {\n bridge: TransactionObjectInput;\n userDeposit: TransactionObjectInput;\n amountLp: bigint | TransactionArgument;\n}\n\nexport function withdraw(tx: Transaction, typeArg: string, args: WithdrawArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::withdraw`,\n typeArguments: [typeArg],\n arguments: [obj(tx, args.bridge), obj(tx, args.userDeposit), pure(tx, args.amountLp, `u64`)],\n });\n}\n\nexport interface DepositFeeArgs {\n adminCap: TransactionObjectInput;\n bridge: TransactionObjectInput;\n coin: TransactionObjectInput;\n}\n\nexport function depositFee(tx: Transaction, typeArg: string, args: DepositFeeArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::deposit_fee`,\n typeArguments: [typeArg],\n arguments: [obj(tx, args.adminCap), obj(tx, args.bridge), obj(tx, args.coin)],\n });\n}\n\nexport interface MigrateArgs {\n adminCap: TransactionObjectInput;\n bridge: TransactionObjectInput;\n}\n\nexport function migrate(tx: Transaction, args: MigrateArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::migrate`,\n arguments: [obj(tx, args.adminCap), obj(tx, args.bridge)],\n });\n}\n\nexport interface SetGasUsageArgs {\n adminCap: TransactionObjectInput;\n bridge: TransactionObjectInput;\n chainId: number | TransactionArgument;\n value: bigint | TransactionArgument;\n}\n\nexport function setGasUsage(tx: Transaction, args: SetGasUsageArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::set_gas_usage`,\n arguments: [\n obj(tx, args.adminCap),\n obj(tx, args.bridge),\n pure(tx, args.chainId, `u8`),\n pure(tx, args.value, `u64`),\n ],\n });\n}\n\nexport interface WithdrawFeeArgs {\n adminCap: TransactionObjectInput;\n bridge: TransactionObjectInput;\n amount: bigint | TransactionArgument;\n}\n\nexport function withdrawFee(tx: Transaction, typeArg: string, args: WithdrawFeeArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::withdraw_fee`,\n typeArguments: [typeArg],\n arguments: [obj(tx, args.adminCap), obj(tx, args.bridge), pure(tx, args.amount, `u64`)],\n });\n}\n\nexport interface GasUsageArgs {\n bridge: TransactionObjectInput;\n chainId: number | TransactionArgument;\n}\n\nexport function gasUsage(tx: Transaction, args: GasUsageArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::gas_usage`,\n arguments: [obj(tx, args.bridge), pure(tx, args.chainId, `u8`)],\n });\n}\n\nexport function lpAmount(tx: Transaction, typeArg: string, userDeposit: TransactionObjectInput) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::lp_amount`,\n typeArguments: [typeArg],\n arguments: [obj(tx, userDeposit)],\n });\n}\n\nexport function rewardDebt(tx: Transaction, typeArg: string, userDeposit: TransactionObjectInput) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::reward_debt`,\n typeArguments: [typeArg],\n arguments: [obj(tx, userDeposit)],\n });\n}\n\nexport interface ClaimAdminFeeArgs {\n adminCap: TransactionObjectInput;\n bridge: TransactionObjectInput;\n}\n\nexport function claimAdminFee(tx: Transaction, typeArg: string, args: ClaimAdminFeeArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::claim_admin_fee`,\n typeArguments: [typeArg],\n arguments: [obj(tx, args.adminCap), obj(tx, args.bridge)],\n });\n}\n\nexport interface ClaimRewardArgs {\n bridge: TransactionObjectInput;\n userDeposit: TransactionObjectInput;\n}\n\nexport function claimReward(tx: Transaction, typeArg: string, args: ClaimRewardArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::claim_reward`,\n typeArguments: [typeArg],\n arguments: [obj(tx, args.bridge), obj(tx, args.userDeposit)],\n });\n}\n\nexport interface SetAdminFeeShareBpArgs {\n adminCap: TransactionObjectInput;\n bridge: TransactionObjectInput;\n adminFeeShareBp: bigint | TransactionArgument;\n}\n\nexport function setAdminFeeShareBp(tx: Transaction, typeArg: string, args: SetAdminFeeShareBpArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::set_admin_fee_share_bp`,\n typeArguments: [typeArg],\n arguments: [obj(tx, args.adminCap), obj(tx, args.bridge), pure(tx, args.adminFeeShareBp, `u64`)],\n });\n}\n\nexport function adminFeeShareBp(tx: Transaction, typeArg: string, bridge: TransactionObjectInput) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::admin_fee_share_bp`,\n typeArguments: [typeArg],\n arguments: [obj(tx, bridge)],\n });\n}\n\nexport interface SetBalanceRatioMinBpArgs {\n adminCap: TransactionObjectInput;\n bridge: TransactionObjectInput;\n balanceRatioMinBp: bigint | TransactionArgument;\n}\n\nexport function setBalanceRatioMinBp(tx: Transaction, typeArg: string, args: SetBalanceRatioMinBpArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::set_balance_ratio_min_bp`,\n typeArguments: [typeArg],\n arguments: [obj(tx, args.adminCap), obj(tx, args.bridge), pure(tx, args.balanceRatioMinBp, `u64`)],\n });\n}\n\nexport function pool(tx: Transaction, typeArg: string, bridge: TransactionObjectInput) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::pool`,\n typeArguments: [typeArg],\n arguments: [obj(tx, bridge)],\n });\n}\n\nexport interface AdjustTotalLpAmountArgs {\n adminCap: TransactionObjectInput;\n bridge: TransactionObjectInput;\n userDeposit: TransactionObjectInput;\n}\n\nexport function adjustTotalLpAmount(tx: Transaction, typeArg: string, args: AdjustTotalLpAmountArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::adjust_total_lp_amount`,\n typeArguments: [typeArg],\n arguments: [obj(tx, args.adminCap), obj(tx, args.bridge), obj(tx, args.userDeposit)],\n });\n}\n\nexport function canDeposit(tx: Transaction, typeArg: string, bridge: TransactionObjectInput) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::can_deposit`,\n typeArguments: [typeArg],\n arguments: [obj(tx, bridge)],\n });\n}\n\nexport function canWithdraw(tx: Transaction, typeArg: string, bridge: TransactionObjectInput) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::can_withdraw`,\n typeArguments: [typeArg],\n arguments: [obj(tx, bridge)],\n });\n}\n\nexport function feeShare(tx: Transaction, typeArg: string, bridge: TransactionObjectInput) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::fee_share`,\n typeArguments: [typeArg],\n arguments: [obj(tx, bridge)],\n });\n}\n\nexport interface SetFeeShareArgs {\n adminCap: TransactionObjectInput;\n bridge: TransactionObjectInput;\n feeShareBp: bigint | TransactionArgument;\n}\n\nexport function setFeeShare(tx: Transaction, typeArg: string, args: SetFeeShareArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::set_fee_share`,\n typeArguments: [typeArg],\n arguments: [obj(tx, args.adminCap), obj(tx, args.bridge), pure(tx, args.feeShareBp, `u64`)],\n });\n}\n\nexport interface StartDepositArgs {\n adminCap: TransactionObjectInput;\n bridge: TransactionObjectInput;\n}\n\nexport function startDeposit(tx: Transaction, typeArg: string, args: StartDepositArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::start_deposit`,\n typeArguments: [typeArg],\n arguments: [obj(tx, args.adminCap), obj(tx, args.bridge)],\n });\n}\n\nexport interface StartWithdrawArgs {\n adminCap: TransactionObjectInput;\n bridge: TransactionObjectInput;\n}\n\nexport function startWithdraw(tx: Transaction, typeArg: string, args: StartWithdrawArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::start_withdraw`,\n typeArguments: [typeArg],\n arguments: [obj(tx, args.adminCap), obj(tx, args.bridge)],\n });\n}\n\nexport interface StopDepositArgs {\n stopCap: TransactionObjectInput;\n bridge: TransactionObjectInput;\n}\n\nexport function stopDeposit(tx: Transaction, typeArg: string, args: StopDepositArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::stop_deposit`,\n typeArguments: [typeArg],\n arguments: [obj(tx, args.stopCap), obj(tx, args.bridge)],\n });\n}\n\nexport interface StopWithdrawArgs {\n stopCap: TransactionObjectInput;\n bridge: TransactionObjectInput;\n}\n\nexport function stopWithdraw(tx: Transaction, typeArg: string, args: StopWithdrawArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::stop_withdraw`,\n typeArguments: [typeArg],\n arguments: [obj(tx, args.stopCap), obj(tx, args.bridge)],\n });\n}\n\nexport interface AddBridgeArgs {\n adminCap: TransactionObjectInput;\n bridge: TransactionObjectInput;\n chainId: number | TransactionArgument;\n bridgeAddress: TransactionObjectInput;\n}\n\nexport function addBridge(tx: Transaction, args: AddBridgeArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::add_bridge`,\n arguments: [\n obj(tx, args.adminCap),\n obj(tx, args.bridge),\n pure(tx, args.chainId, `u8`),\n obj(tx, args.bridgeAddress),\n ],\n });\n}\n\nexport interface AddBridgeTokenArgs {\n adminCap: TransactionObjectInput;\n bridge: TransactionObjectInput;\n chainId: number | TransactionArgument;\n tokenAddress: TransactionObjectInput;\n}\n\nexport function addBridgeToken(tx: Transaction, args: AddBridgeTokenArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::add_bridge_token`,\n arguments: [obj(tx, args.adminCap), obj(tx, args.bridge), pure(tx, args.chainId, `u8`), obj(tx, args.tokenAddress)],\n });\n}\n\nexport interface AddPoolArgs {\n adminCap: TransactionObjectInput;\n bridge: TransactionObjectInput;\n pool: TransactionObjectInput;\n}\n\nexport function addPool(tx: Transaction, typeArg: string, args: AddPoolArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::add_pool`,\n typeArguments: [typeArg],\n arguments: [obj(tx, args.adminCap), obj(tx, args.bridge), obj(tx, args.pool)],\n });\n}\n\nexport function canSwap(tx: Transaction, bridge: TransactionObjectInput) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::can_swap`,\n arguments: [obj(tx, bridge)],\n });\n}\n\nexport function feeValue(tx: Transaction, typeArg: string, bridge: TransactionObjectInput) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::fee_value`,\n typeArguments: [typeArg],\n arguments: [obj(tx, bridge)],\n });\n}\n\nexport interface GetBridgeAllbridgeCostArgs {\n bridge: TransactionObjectInput;\n messenger: TransactionObjectInput;\n gasOracle: TransactionObjectInput;\n chainId: number | TransactionArgument;\n}\n\nexport function getBridgeAllbridgeCost(tx: Transaction, args: GetBridgeAllbridgeCostArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::get_bridge_allbridge_cost`,\n arguments: [obj(tx, args.bridge), obj(tx, args.messenger), obj(tx, args.gasOracle), pure(tx, args.chainId, `u8`)],\n });\n}\n\nexport interface GetBridgeCostArgs {\n bridge: TransactionObjectInput;\n gasOracle: TransactionObjectInput;\n chainId: number | TransactionArgument;\n}\n\nexport function getBridgeCost(tx: Transaction, args: GetBridgeCostArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::get_bridge_cost`,\n arguments: [obj(tx, args.bridge), obj(tx, args.gasOracle), pure(tx, args.chainId, `u8`)],\n });\n}\n\nexport interface GetBridgeWormholeCostArgs {\n bridge: TransactionObjectInput;\n messenger: TransactionObjectInput;\n wormholeState: TransactionObjectInput;\n gasOracle: TransactionObjectInput;\n chainId: number | TransactionArgument;\n}\n\nexport function getBridgeWormholeCost(tx: Transaction, args: GetBridgeWormholeCostArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::get_bridge_wormhole_cost`,\n arguments: [\n obj(tx, args.bridge),\n obj(tx, args.messenger),\n obj(tx, args.wormholeState),\n obj(tx, args.gasOracle),\n pure(tx, args.chainId, `u8`),\n ],\n });\n}\n\nexport interface IsProcessedMessageArgs {\n bridge: TransactionObjectInput;\n message: TransactionObjectInput;\n}\n\nexport function isProcessedMessage(tx: Transaction, args: IsProcessedMessageArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::is_processed_message`,\n arguments: [obj(tx, args.bridge), obj(tx, args.message)],\n });\n}\n\nexport interface ReceiveTokensWormholeArgs {\n bridge: TransactionObjectInput;\n messenger: TransactionObjectInput;\n amount: bigint | TransactionArgument;\n recipient: TransactionObjectInput;\n sourceChainId: number | TransactionArgument;\n nonce: bigint | TransactionArgument;\n receiveAmountMin: bigint | TransactionArgument;\n extraGasCoin: TransactionObjectInput;\n}\n\nexport function receiveTokensWormhole(tx: Transaction, typeArg: string, args: ReceiveTokensWormholeArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::receive_tokens_wormhole`,\n typeArguments: [typeArg],\n arguments: [\n obj(tx, args.bridge),\n obj(tx, args.messenger),\n pure(tx, args.amount, `u64`),\n obj(tx, args.recipient),\n pure(tx, args.sourceChainId, `u8`),\n pure(tx, args.nonce, `u256`),\n pure(tx, args.receiveAmountMin, `u64`),\n obj(tx, args.extraGasCoin),\n ],\n });\n}\n\nexport interface RemoveBridgeArgs {\n adminCap: TransactionObjectInput;\n bridge: TransactionObjectInput;\n chainId: number | TransactionArgument;\n}\n\nexport function removeBridge(tx: Transaction, args: RemoveBridgeArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::remove_bridge`,\n arguments: [obj(tx, args.adminCap), obj(tx, args.bridge), pure(tx, args.chainId, `u8`)],\n });\n}\n\nexport interface RemoveBridgeTokenArgs {\n adminCap: TransactionObjectInput;\n bridge: TransactionObjectInput;\n chainId: number | TransactionArgument;\n tokenAddress: TransactionObjectInput;\n}\n\nexport function removeBridgeToken(tx: Transaction, args: RemoveBridgeTokenArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::remove_bridge_token`,\n arguments: [obj(tx, args.adminCap), obj(tx, args.bridge), pure(tx, args.chainId, `u8`), obj(tx, args.tokenAddress)],\n });\n}\n\nexport interface SetRebalancerArgs {\n adminCap: TransactionObjectInput;\n bridge: TransactionObjectInput;\n rebalancer: string | TransactionArgument;\n}\n\nexport function setRebalancer(tx: Transaction, args: SetRebalancerArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::set_rebalancer`,\n arguments: [obj(tx, args.adminCap), obj(tx, args.bridge), pure(tx, args.rebalancer, `address`)],\n });\n}\n\nexport interface StartSwapArgs {\n adminCap: TransactionObjectInput;\n bridge: TransactionObjectInput;\n}\n\nexport function startSwap(tx: Transaction, args: StartSwapArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::start_swap`,\n arguments: [obj(tx, args.adminCap), obj(tx, args.bridge)],\n });\n}\n\nexport interface StopSwapArgs {\n stopSwapCap: TransactionObjectInput;\n bridge: TransactionObjectInput;\n}\n\nexport function stopSwap(tx: Transaction, args: StopSwapArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::stop_swap`,\n arguments: [obj(tx, args.stopSwapCap), obj(tx, args.bridge)],\n });\n}\n\nexport interface SwapAndBridgeWormholeArgs {\n bridge: TransactionObjectInput;\n messenger: TransactionObjectInput;\n wormholeState: TransactionObjectInput;\n theClock: TransactionObjectInput;\n gasOracle: TransactionObjectInput;\n amount: TransactionObjectInput;\n recipient: TransactionObjectInput;\n destinationChainId: number | TransactionArgument;\n receiveToken: TransactionObjectInput;\n nonce: bigint | TransactionArgument;\n feeSuiCoin: TransactionObjectInput;\n feeTokenCoin: TransactionObjectInput;\n}\n\nexport function swapAndBridgeWormhole(tx: Transaction, typeArg: string, args: SwapAndBridgeWormholeArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::swap_and_bridge_wormhole`,\n typeArguments: [typeArg],\n arguments: [\n obj(tx, args.bridge),\n obj(tx, args.messenger),\n obj(tx, args.wormholeState),\n obj(tx, args.theClock),\n obj(tx, args.gasOracle),\n obj(tx, args.amount),\n obj(tx, args.recipient),\n pure(tx, args.destinationChainId, `u8`),\n obj(tx, args.receiveToken),\n pure(tx, args.nonce, `u256`),\n obj(tx, args.feeSuiCoin),\n obj(tx, args.feeTokenCoin),\n ],\n });\n}\n\nexport interface NewPoolArgs {\n adminCap: TransactionObjectInput;\n coinMetadata: TransactionObjectInput;\n a: bigint | TransactionArgument;\n feeShareBp: bigint | TransactionArgument;\n}\n\nexport function newPool(tx: Transaction, typeArg: string, args: NewPoolArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::new_pool`,\n typeArguments: [typeArg],\n arguments: [\n obj(tx, args.adminCap),\n obj(tx, args.coinMetadata),\n pure(tx, args.a, `u64`),\n pure(tx, args.feeShareBp, `u64`),\n ],\n });\n}\n\nexport function newUserDeposit(tx: Transaction, typeArg: string) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::new_user_deposit`,\n typeArguments: [typeArg],\n arguments: [],\n });\n}\n\nexport function poolA(tx: Transaction, typeArg: string, bridge: TransactionObjectInput) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::pool_a`,\n typeArguments: [typeArg],\n arguments: [obj(tx, bridge)],\n });\n}\n\nexport function poolBalance(tx: Transaction, typeArg: string, bridge: TransactionObjectInput) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::pool_balance`,\n typeArguments: [typeArg],\n arguments: [obj(tx, bridge)],\n });\n}\n\nexport function poolD(tx: Transaction, typeArg: string, bridge: TransactionObjectInput) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::pool_d`,\n typeArguments: [typeArg],\n arguments: [obj(tx, bridge)],\n });\n}\n\nexport function poolDecimals(tx: Transaction, typeArg: string, bridge: TransactionObjectInput) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::pool_decimals`,\n typeArguments: [typeArg],\n arguments: [obj(tx, bridge)],\n });\n}\n\nexport function poolLpSupply(tx: Transaction, typeArg: string, bridge: TransactionObjectInput) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::pool_lp_supply`,\n typeArguments: [typeArg],\n arguments: [obj(tx, bridge)],\n });\n}\n\nexport interface PoolPendingRewardsArgs {\n bridge: TransactionObjectInput;\n userDeposit: TransactionObjectInput;\n}\n\nexport function poolPendingRewards(tx: Transaction, typeArg: string, args: PoolPendingRewardsArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::pool_pending_rewards`,\n typeArguments: [typeArg],\n arguments: [obj(tx, args.bridge), obj(tx, args.userDeposit)],\n });\n}\n\nexport function poolTokenBalance(tx: Transaction, typeArg: string, bridge: TransactionObjectInput) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::pool_token_balance`,\n typeArguments: [typeArg],\n arguments: [obj(tx, bridge)],\n });\n}\n\nexport function poolVusdBalance(tx: Transaction, typeArg: string, bridge: TransactionObjectInput) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::pool_vusd_balance`,\n typeArguments: [typeArg],\n arguments: [obj(tx, bridge)],\n });\n}\n\nexport interface ReceiveTokensArgs {\n bridge: TransactionObjectInput;\n messenger: TransactionObjectInput;\n amount: bigint | TransactionArgument;\n recipient: TransactionObjectInput;\n sourceChainId: number | TransactionArgument;\n nonce: bigint | TransactionArgument;\n receiveAmountMin: bigint | TransactionArgument;\n extraGasCoin: TransactionObjectInput;\n}\n\nexport function receiveTokens(tx: Transaction, typeArg: string, args: ReceiveTokensArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::receive_tokens`,\n typeArguments: [typeArg],\n arguments: [\n obj(tx, args.bridge),\n obj(tx, args.messenger),\n pure(tx, args.amount, `u64`),\n obj(tx, args.recipient),\n pure(tx, args.sourceChainId, `u8`),\n pure(tx, args.nonce, `u256`),\n pure(tx, args.receiveAmountMin, `u64`),\n obj(tx, args.extraGasCoin),\n ],\n });\n}\n\nexport interface SwapAndBridgeArgs {\n bridge: TransactionObjectInput;\n messenger: TransactionObjectInput;\n gasOracle: TransactionObjectInput;\n amount: TransactionObjectInput;\n recipient: TransactionObjectInput;\n destinationChainId: number | TransactionArgument;\n receiveToken: TransactionObjectInput;\n nonce: bigint | TransactionArgument;\n feeSuiCoin: TransactionObjectInput;\n feeTokenCoin: TransactionObjectInput;\n}\n\nexport function swapAndBridge(tx: Transaction, typeArg: string, args: SwapAndBridgeArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::swap_and_bridge`,\n typeArguments: [typeArg],\n arguments: [\n obj(tx, args.bridge),\n obj(tx, args.messenger),\n obj(tx, args.gasOracle),\n obj(tx, args.amount),\n obj(tx, args.recipient),\n pure(tx, args.destinationChainId, `u8`),\n obj(tx, args.receiveToken),\n pure(tx, args.nonce, `u256`),\n obj(tx, args.feeSuiCoin),\n obj(tx, args.feeTokenCoin),\n ],\n });\n}\n", "// @ts-nocheck\nimport { PUBLISHED_AT } from \"..\";\nimport { obj, pure } from \"../../_framework/util\";\nimport { Transaction, TransactionArgument, TransactionObjectInput } from \"@mysten/sui/transactions\";\n\nexport interface BridgeArgs {\n cctpBridge: TransactionObjectInput;\n gasOracle: TransactionObjectInput;\n tokenMessengerMinterState: TransactionObjectInput;\n messageTransmitterState: TransactionObjectInput;\n treasury: TransactionObjectInput;\n denyList: TransactionObjectInput;\n amount: TransactionObjectInput;\n feeSuiCoin: TransactionObjectInput;\n feeTokenCoin: TransactionObjectInput;\n destinationChainId: number | TransactionArgument;\n recipient: TransactionObjectInput;\n recipientWalletAddress: TransactionObjectInput;\n}\n\nexport function bridge(tx: Transaction, typeArg: string, args: BridgeArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::cctp_bridge_interface::bridge`,\n typeArguments: [typeArg],\n arguments: [\n obj(tx, args.cctpBridge),\n obj(tx, args.gasOracle),\n obj(tx, args.tokenMessengerMinterState),\n obj(tx, args.messageTransmitterState),\n obj(tx, args.treasury),\n obj(tx, args.denyList),\n obj(tx, args.amount),\n obj(tx, args.feeSuiCoin),\n obj(tx, args.feeTokenCoin),\n pure(tx, args.destinationChainId, `u8`),\n obj(tx, args.recipient),\n obj(tx, args.recipientWalletAddress),\n ],\n });\n}\n\nexport interface MigrateArgs {\n admin: TransactionObjectInput;\n messenger: TransactionObjectInput;\n}\n\nexport function migrate(tx: Transaction, args: MigrateArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::cctp_bridge_interface::migrate`,\n arguments: [obj(tx, args.admin), obj(tx, args.messenger)],\n });\n}\n\nexport interface GetTransactionCostArgs {\n cctpBridge: TransactionObjectInput;\n gasOracle: TransactionObjectInput;\n chainId: number | TransactionArgument;\n}\n\nexport function getTransactionCost(tx: Transaction, args: GetTransactionCostArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::cctp_bridge_interface::get_transaction_cost`,\n arguments: [obj(tx, args.cctpBridge), obj(tx, args.gasOracle), pure(tx, args.chainId, `u8`)],\n });\n}\n\nexport interface SetGasUsageArgs {\n adminCap: TransactionObjectInput;\n cctpBridge: TransactionObjectInput;\n chainId: number | TransactionArgument;\n value: bigint | TransactionArgument;\n}\n\nexport function setGasUsage(tx: Transaction, args: SetGasUsageArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::cctp_bridge_interface::set_gas_usage`,\n arguments: [\n obj(tx, args.adminCap),\n obj(tx, args.cctpBridge),\n pure(tx, args.chainId, `u8`),\n pure(tx, args.value, `u64`),\n ],\n });\n}\n\nexport interface WithdrawFeeArgs {\n adminCap: TransactionObjectInput;\n cctpBridge: TransactionObjectInput;\n amount: bigint | TransactionArgument;\n}\n\nexport function withdrawFee(tx: Transaction, typeArg: string, args: WithdrawFeeArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::cctp_bridge_interface::withdraw_fee`,\n typeArguments: [typeArg],\n arguments: [obj(tx, args.adminCap), obj(tx, args.cctpBridge), pure(tx, args.amount, `u64`)],\n });\n}\n\nexport interface GasUsageArgs {\n cctpBridge: TransactionObjectInput;\n chainId: number | TransactionArgument;\n}\n\nexport function gasUsage(tx: Transaction, args: GasUsageArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::cctp_bridge_interface::gas_usage`,\n arguments: [obj(tx, args.cctpBridge), pure(tx, args.chainId, `u8`)],\n });\n}\n\nexport function feeValue(tx: Transaction, typeArg: string, cctpBridge: TransactionObjectInput) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::cctp_bridge_interface::fee_value`,\n typeArguments: [typeArg],\n arguments: [obj(tx, cctpBridge)],\n });\n}\n\nexport interface ReceiveTokensArgs {\n tokenMessengerMinterState: TransactionObjectInput;\n messageTransmitterState: TransactionObjectInput;\n denyList: TransactionObjectInput;\n treasury: TransactionObjectInput;\n recipient: string | TransactionArgument;\n message: Array<number | TransactionArgument> | TransactionArgument;\n signature: Array<number | TransactionArgument> | TransactionArgument;\n extraGasCoin: TransactionObjectInput;\n}\n\nexport function receiveTokens(tx: Transaction, typeArg: string, args: ReceiveTokensArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::cctp_bridge_interface::receive_tokens`,\n typeArguments: [typeArg],\n arguments: [\n obj(tx, args.tokenMessengerMinterState),\n obj(tx, args.messageTransmitterState),\n obj(tx, args.denyList),\n obj(tx, args.treasury),\n pure(tx, args.recipient, `address`),\n pure(tx, args.message, `vector<u8>`),\n pure(tx, args.signature, `vector<u8>`),\n obj(tx, args.extraGasCoin),\n ],\n });\n}\n\nexport interface ChangeRecipientArgs {\n cctpBridge: TransactionObjectInput;\n originalMessage: Array<number | TransactionArgument> | TransactionArgument;\n originalAttestation: Array<number | TransactionArgument> | TransactionArgument;\n newRecipient: TransactionObjectInput;\n tokenMessengerMinterState: TransactionObjectInput;\n messageTransmitterState: TransactionObjectInput;\n}\n\nexport function changeRecipient(tx: Transaction, typeArg: string, args: ChangeRecipientArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::cctp_bridge_interface::change_recipient`,\n typeArguments: [typeArg],\n arguments: [\n obj(tx, args.cctpBridge),\n pure(tx, args.originalMessage, `vector<u8>`),\n pure(tx, args.originalAttestation, `vector<u8>`),\n obj(tx, args.newRecipient),\n obj(tx, args.tokenMessengerMinterState),\n obj(tx, args.messageTransmitterState),\n ],\n });\n}\n\nexport interface GetBridgingCostInTokensArgs {\n cctpBridge: TransactionObjectInput;\n gasOracle: TransactionObjectInput;\n chainId: number | TransactionArgument;\n}\n\nexport function getBridgingCostInTokens(tx: Transaction, args: GetBridgingCostInTokensArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::cctp_bridge_interface::get_bridging_cost_in_tokens`,\n arguments: [obj(tx, args.cctpBridge), obj(tx, args.gasOracle), pure(tx, args.chainId, `u8`)],\n });\n}\n\nexport interface GetDomainByChainIdArgs {\n cctpBridge: TransactionObjectInput;\n chainId: number | TransactionArgument;\n}\n\nexport function getDomainByChainId(tx: Transaction, args: GetDomainByChainIdArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::cctp_bridge_interface::get_domain_by_chain_id`,\n arguments: [obj(tx, args.cctpBridge), pure(tx, args.chainId, `u8`)],\n });\n}\n\nexport interface IsMessageProcessedArgs {\n cctpBridge: TransactionObjectInput;\n messageTransmitterState: TransactionObjectInput;\n sourceChainId: number | TransactionArgument;\n nonce: bigint | TransactionArgument;\n}\n\nexport function isMessageProcessed(tx: Transaction, args: IsMessageProcessedArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::cctp_bridge_interface::is_message_processed`,\n arguments: [\n obj(tx, args.cctpBridge),\n obj(tx, args.messageTransmitterState),\n pure(tx, args.sourceChainId, `u8`),\n pure(tx, args.nonce, `u64`),\n ],\n });\n}\n\nexport interface RegisterBridgeDestinationArgs {\n adminCap: TransactionObjectInput;\n cctpBridge: TransactionObjectInput;\n chainId: number | TransactionArgument;\n domain: number | TransactionArgument;\n}\n\nexport function registerBridgeDestination(tx: Transaction, args: RegisterBridgeDestinationArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::cctp_bridge_interface::register_bridge_destination`,\n arguments: [\n obj(tx, args.adminCap),\n obj(tx, args.cctpBridge),\n pure(tx, args.chainId, `u8`),\n pure(tx, args.domain, `u32`),\n ],\n });\n}\n\nexport interface SetAdminFeeShareArgs {\n adminCap: TransactionObjectInput;\n cctpBridge: TransactionObjectInput;\n adminFeeShareBp: bigint | TransactionArgument;\n}\n\nexport function setAdminFeeShare(tx: Transaction, args: SetAdminFeeShareArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::cctp_bridge_interface::set_admin_fee_share`,\n arguments: [obj(tx, args.adminCap), obj(tx, args.cctpBridge), pure(tx, args.adminFeeShareBp, `u64`)],\n });\n}\n\nexport interface UnregisterBridgeDestinationArgs {\n adminCap: TransactionObjectInput;\n cctpBridge: TransactionObjectInput;\n chainId: number | TransactionArgument;\n}\n\nexport function unregisterBridgeDestination(tx: Transaction, args: UnregisterBridgeDestinationArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::cctp_bridge_interface::unregister_bridge_destination`,\n arguments: [obj(tx, args.adminCap), obj(tx, args.cctpBridge), pure(tx, args.chainId, `u8`)],\n });\n}\n", "// @ts-nocheck\nimport { PUBLISHED_AT } from \"..\";\nimport { String } from \"../../_dependencies/source/0x1/ascii/structs\";\nimport { String as String1 } from \"../../_dependencies/source/0x1/string/structs\";\nimport { obj, pure } from \"../../_framework/util\";\nimport { ID } from \"../../sui/object/structs\";\nimport { Transaction, TransactionArgument, TransactionObjectInput } from \"@mysten/sui/transactions\";\n\nexport function isZero(tx: Transaction, bytes: TransactionObjectInput) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bytes32::is_zero`,\n arguments: [obj(tx, bytes)],\n });\n}\n\nexport function data(tx: Transaction, bytes: TransactionObjectInput) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bytes32::data`,\n arguments: [obj(tx, bytes)],\n });\n}\n\nexport function empty(tx: Transaction) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bytes32::empty`,\n arguments: [],\n });\n}\n\nexport function new_(tx: Transaction, data: Array<number | TransactionArgument> | TransactionArgument) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bytes32::new`,\n arguments: [pure(tx, data, `vector<u8>`)],\n });\n}\n\nexport function fromAddress(tx: Transaction, a: string | TransactionArgument) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bytes32::from_address`,\n arguments: [pure(tx, a, `address`)],\n });\n}\n\nexport function fromAsciiHex(tx: Transaction, value: string | TransactionArgument) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bytes32::from_ascii_hex`,\n arguments: [pure(tx, value, `${String.$typeName}`)],\n });\n}\n\nexport function fromHex(tx: Transaction, value: string | TransactionArgument) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bytes32::from_hex`,\n arguments: [pure(tx, value, `${String1.$typeName}`)],\n });\n}\n\nexport function fromId(tx: Transaction, id: string | TransactionArgument) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bytes32::from_id`,\n arguments: [pure(tx, id, `${ID.$typeName}`)],\n });\n}\n\nexport function fromUid(tx: Transaction, id: TransactionObjectInput) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bytes32::from_uid`,\n arguments: [obj(tx, id)],\n });\n}\n\nexport function newFromPartial(\n tx: Transaction,\n partialData: Array<number | TransactionArgument> | TransactionArgument\n) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bytes32::new_from_partial`,\n arguments: [pure(tx, partialData, `vector<u8>`)],\n });\n}\n\nexport function toAddress(tx: Transaction, bytes: TransactionObjectInput) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bytes32::to_address`,\n arguments: [obj(tx, bytes)],\n });\n}\n\nexport function toAsciiHex(tx: Transaction, bytes: TransactionObjectInput) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bytes32::to_ascii_hex`,\n arguments: [obj(tx, bytes)],\n });\n}\n\nexport function toHex(tx: Transaction, bytes: TransactionObjectInput) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bytes32::to_hex`,\n arguments: [obj(tx, bytes)],\n });\n}\n\nexport function toId(tx: Transaction, bytes: TransactionObjectInput) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bytes32::to_id`,\n arguments: [obj(tx, bytes)],\n });\n}\n", "// @ts-nocheck\n\nimport { bcs, BcsType } from \"@mysten/sui/bcs\";\nimport { fromHEX, toHEX } from \"@mysten/sui/utils\";\nimport { FieldsWithTypes, compressSuiType, parseTypeName } from \"./util\";\nimport { SuiClient, SuiParsedData, SuiObjectData } from \"@mysten/sui/client\";\n\n// for backwards compatibility\nexport { vector } from \"./vector\";\n\nexport interface StructClass {\n readonly $typeName: string;\n readonly $fullTypeName: string;\n readonly $typeArgs: string[];\n readonly $isPhantom: readonly boolean[];\n toJSONField(): Record<string, any>;\n toJSON(): Record<string, any>;\n\n __StructClass: true;\n}\n\nexport interface VectorClass {\n readonly $typeName: \"vector\";\n readonly $fullTypeName: string;\n readonly $typeArgs: [string];\n readonly $isPhantom: readonly [false];\n toJSONField(): any[];\n toJSON(): Record<string, any>;\n\n readonly elements: any;\n\n __VectorClass: true;\n}\n\nexport type Primitive = \"bool\" | \"u8\" | \"u16\" | \"u32\" | \"u64\" | \"u128\" | \"u256\" | \"address\";\nexport type TypeArgument = StructClass | Primitive | VectorClass;\n\nexport interface StructClassReified<T extends StructClass, Fields> {\n typeName: T[\"$typeName\"]; // e.g., '0x2::balance::Balance', without type arguments\n fullTypeName: ToTypeStr<T>; // e.g., '0x2::balance::Balance<0x2::sui:SUI>'\n typeArgs: T[\"$typeArgs\"]; // e.g., ['0x2::sui:SUI']\n isPhantom: T[\"$isPhantom\"]; // e.g., [true, false]\n reifiedTypeArgs: Array<Reified<TypeArgument, any> | PhantomReified<PhantomTypeArgument>>;\n bcs: BcsType<any>;\n fromFields(fields: Record<string, any>): T;\n fromFieldsWithTypes(item: FieldsWithTypes): T;\n fromBcs(data: Uint8Array): T;\n fromJSONField: (field: any) => T;\n fromJSON: (json: Record<string, any>) => T;\n fromSuiParsedData: (content: SuiParsedData) => T;\n fromSuiObjectData: (data: SuiObjectData) => T;\n fetch: (client: SuiClient, id: string) => Promise<T>;\n new: (fields: Fields) => T;\n kind: \"StructClassReified\";\n}\n\nexport interface VectorClassReified<T extends VectorClass, Elements> {\n typeName: T[\"$typeName\"];\n fullTypeName: ToTypeStr<T>;\n typeArgs: T[\"$typeArgs\"];\n isPhantom: readonly [false];\n reifiedTypeArgs: Array<Reified<TypeArgument, any>>;\n bcs: BcsType<any>;\n fromFields(fields: any[]): T;\n fromFieldsWithTypes(item: FieldsWithTypes): T;\n fromBcs(data: Uint8Array): T;\n fromJSONField: (field: any) => T;\n fromJSON: (json: Record<string, any>) => T;\n new: (elements: Elements) => T;\n kind: \"VectorClassReified\";\n}\n\nexport type Reified<T extends TypeArgument, Fields> = T extends Primitive\n ? Primitive\n : T extends StructClass\n ? StructClassReified<T, Fields>\n : T extends VectorClass\n ? VectorClassReified<T, Fields>\n : never;\n\nexport type ToTypeArgument<\n T extends Primitive | StructClassReified<StructClass, any> | VectorClassReified<VectorClass, any>,\n> = T extends Primitive\n ? T\n : T extends StructClassReified<infer U, any>\n ? U\n : T extends VectorClassReified<infer U, any>\n ? U\n : never;\n\nexport type ToPhantomTypeArgument<T extends PhantomReified<PhantomTypeArgument>> =\n T extends PhantomReified<infer U> ? U : never;\n\nexport type PhantomTypeArgument = string;\n\nexport interface PhantomReified<P> {\n phantomType: P;\n kind: \"PhantomReified\";\n}\n\nexport function phantom<T extends Reified<TypeArgument, any>>(reified: T): PhantomReified<ToTypeStr<ToTypeArgument<T>>>;\nexport function phantom<P extends PhantomTypeArgument>(phantomType: P): PhantomReified<P>;\nexport function phantom(type: string | Reified<TypeArgument, any>): PhantomReified<string> {\n if (typeof type === \"string\") {\n return {\n phantomType: type,\n kind: \"PhantomReified\",\n };\n } else {\n return {\n phantomType: type.fullTypeName,\n kind: \"PhantomReified\",\n };\n }\n}\n\nexport type ToTypeStr<T extends TypeArgument> = T extends Primitive\n ? T\n : T extends StructClass\n ? T[\"$fullTypeName\"]\n : T extends VectorClass\n ? T[\"$fullTypeName\"]\n : never;\n\nexport type PhantomToTypeStr<T extends PhantomTypeArgument> = T extends PhantomTypeArgument ? T : never;\n\nexport type ToJSON<T extends TypeArgument> = T extends \"bool\"\n ? boolean\n : T extends \"u8\"\n ? number\n : T extends \"u16\"\n ? number\n : T extends \"u32\"\n ? number\n : T extends \"u64\"\n ? string\n : T extends \"u128\"\n ? string\n : T extends \"u256\"\n ? string\n : T extends \"address\"\n ? string\n : T extends { $typeName: \"0x1::string::String\" }\n ? string\n : T extends { $typeName: \"0x1::ascii::String\" }\n ? string\n : T extends { $typeName: \"0x2::object::UID\" }\n ? string\n : T extends { $typeName: \"0x2::object::ID\" }\n ? string\n : T extends { $typeName: \"0x2::url::Url\" }\n ? string\n : T extends {\n $typeName: \"0x1::option::Option\";\n __inner: infer U extends TypeArgument;\n }\n ? ToJSON<U> | null\n : T extends VectorClass\n ? ReturnType<T[\"toJSONField\"]>\n : T extends StructClass\n ? ReturnType<T[\"toJSONField\"]>\n : never;\n\nexport type ToField<T extends TypeArgument> = T extends \"bool\"\n ? boolean\n : T extends \"u8\"\n ? number\n : T extends \"u16\"\n ? number\n : T extends \"u32\"\n ? number\n : T extends \"u64\"\n ? bigint\n : T extends \"u128\"\n ? bigint\n : T extends \"u256\"\n ? bigint\n : T extends \"address\"\n ? string\n : T extends { $typeName: \"0x1::string::String\" }\n ? string\n : T extends { $typeName: \"0x1::ascii::String\" }\n ? string\n : T extends { $typeName: \"0x2::object::UID\" }\n ? string\n : T extends { $typeName: \"0x2::object::ID\" }\n ? string\n : T extends { $typeName: \"0x2::url::Url\" }\n ? string\n : T extends {\n $typeName: \"0x1::option::Option\";\n __inner: infer U extends TypeArgument;\n }\n ? ToField<U> | null\n : T extends VectorClass\n ? T[\"elements\"]\n : T extends StructClass\n ? T\n : never;\n\nconst Address = bcs.bytes(32).transform({\n input: (val: string) => fromHEX(val),\n output: (val) => toHEX(val),\n});\n\nexport function toBcs<T extends Reified<TypeArgument, any>>(arg: T): BcsType<any> {\n switch (arg) {\n case \"bool\":\n return bcs.bool();\n case \"u8\":\n return bcs.u8();\n case \"u16\":\n return bcs.u16();\n case \"u32\":\n return bcs.u32();\n case \"u64\":\n return bcs.u64();\n case \"u128\":\n return bcs.u128();\n case \"u256\":\n return bcs.u256();\n case \"address\":\n return Address;\n default:\n return arg.bcs;\n }\n}\n\nexport function extractType<T extends Reified<TypeArgument, any>>(reified: T): ToTypeStr<ToTypeArgument<T>>;\nexport function extractType<T extends PhantomReified<PhantomTypeArgument>>(\n reified: T\n): PhantomToTypeStr<ToPhantomTypeArgument<T>>;\nexport function extractType<T extends Reified<TypeArgument, any> | PhantomReified<PhantomTypeArgument>>(\n reified: T\n): string;\nexport function extractType(reified: Reified<TypeArgument, any> | PhantomReified<string>): string {\n switch (reified) {\n case \"u8\":\n case \"u16\":\n case \"u32\":\n case \"u64\":\n case \"u128\":\n case \"u256\":\n case \"bool\":\n case \"address\":\n return reified;\n }\n switch (reified.kind) {\n case \"PhantomReified\":\n return reified.phantomType;\n case \"StructClassReified\":\n return reified.fullTypeName;\n case \"VectorClassReified\":\n return reified.fullTypeName;\n }\n\n throw new Error(\"unreachable\");\n}\n\nexport function decodeFromFields(reified: Reified<TypeArgument, any>, field: any) {\n switch (reified) {\n case \"bool\":\n case \"u8\":\n case \"u16\":\n case \"u32\":\n return field;\n case \"u64\":\n case \"u128\":\n case \"u256\":\n return BigInt(field);\n case \"address\":\n return `0x${field}`;\n }\n if (reified.kind === \"VectorClassReified\") {\n return reified.fromFields(field).elements;\n }\n switch (reified.typeName) {\n case \"0x1::string::String\":\n case \"0x1::ascii::String\":\n return new TextDecoder().decode(Uint8Array.from(field.bytes)).toString();\n case \"0x2::url::Url\":\n return new TextDecoder().decode(Uint8Array.from(field.url.bytes)).toString();\n case \"0x2::object::ID\":\n return `0x${field.bytes}`;\n case \"0x2::object::UID\":\n return `0x${field.id.bytes}`;\n case \"0x1::option::Option\": {\n if (field.vec.length === 0) {\n return null;\n }\n return (reified.fromFields(field) as any).vec[0];\n }\n default:\n return reified.fromFields(field);\n }\n}\n\nexport function decodeFromFieldsWithTypes(reified: Reified<TypeArgument, any>, item: any) {\n switch (reified) {\n case \"bool\":\n case \"u8\":\n case \"u16\":\n case \"u32\":\n return item;\n case \"u64\":\n case \"u128\":\n case \"u256\":\n return BigInt(item);\n case \"address\":\n return item;\n }\n if (reified.kind === \"VectorClassReified\") {\n return reified.fromFieldsWithTypes(item).elements;\n }\n switch (reified.typeName) {\n case \"0x1::string::String\":\n case \"0x1::ascii::String\":\n case \"0x2::url::Url\":\n case \"0x2::object::ID\":\n return item;\n case \"0x2::object::UID\":\n return item.id;\n case \"0x2::balance::Balance\":\n return reified.fromFields({ value: BigInt(item) });\n case \"0x1::option::Option\": {\n if (item === null) {\n return null;\n }\n return decodeFromFieldsWithTypes((reified as any).reifiedTypeArgs[0], item);\n }\n default:\n return reified.fromFieldsWithTypes(item);\n }\n}\n\nexport function assertReifiedTypeArgsMatch(\n fullType: string,\n typeArgs: string[],\n reifiedTypeArgs: Array<Reified<TypeArgument, any> | PhantomReified<string>>\n) {\n if (reifiedTypeArgs.length !== typeArgs.length) {\n throw new Error(\n `provided item has mismatching number of type argments ${fullType} (expected ${reifiedTypeArgs.length}, got ${typeArgs.length}))`\n );\n }\n for (let i = 0; i < typeArgs.length; i++) {\n if (compressSuiType(typeArgs[i]) !== compressSuiType(extractType(reifiedTypeArgs[i]))) {\n throw new Error(\n `provided item has mismatching type argments ${fullType} (expected ${extractType(reifiedTypeArgs[i])}, got ${\n typeArgs[i]\n }))`\n );\n }\n }\n}\n\nexport function assertFieldsWithTypesArgsMatch(\n item: FieldsWithTypes,\n reifiedTypeArgs: Array<Reified<TypeArgument, any> | PhantomReified<string>>\n) {\n const { typeArgs: itemTypeArgs } = parseTypeName(item.type);\n assertReifiedTypeArgsMatch(item.type, itemTypeArgs, reifiedTypeArgs);\n}\n\nexport function fieldToJSON<T extends TypeArgument>(type: string, field: ToField<T>): ToJSON<T> {\n const { typeName, typeArgs } = parseTypeName(type);\n switch (typeName) {\n case \"bool\":\n return field as any;\n case \"u8\":\n case \"u16\":\n case \"u32\":\n return field as any;\n case \"u64\":\n case \"u128\":\n case \"u256\":\n return field.toString() as any;\n case \"address\":\n case \"signer\":\n return field as any;\n case \"vector\":\n return (field as any[]).map((item: any) => fieldToJSON(typeArgs[0], item)) as any;\n // handle special types\n case \"0x1::string::String\":\n case \"0x1::ascii::String\":\n case \"0x2::url::Url\":\n case \"0x2::object::ID\":\n case \"0x2::object::UID\":\n return field as any;\n case \"0x1::option::Option\": {\n if (field === null) {\n return null as any;\n }\n return fieldToJSON(typeArgs[0], field);\n }\n default:\n return (field as any).toJSONField();\n }\n}\n\nexport function decodeFromJSONField(typeArg: Reified<TypeArgument, any>, field: any) {\n switch (typeArg) {\n case \"bool\":\n case \"u8\":\n case \"u16\":\n case \"u32\":\n return field;\n case \"u64\":\n case \"u128\":\n case \"u256\":\n return BigInt(field);\n case \"address\":\n return field;\n }\n if (typeArg.kind === \"VectorClassReified\") {\n return typeArg.fromJSONField(field).elements;\n }\n switch (typeArg.typeName) {\n case \"0x1::string::String\":\n case \"0x1::ascii::String\":\n case \"0x2::url::Url\":\n case \"0x2::object::ID\":\n case \"0x2::object::UID\":\n return field;\n case \"0x1::option::Option\": {\n if (field === null) {\n return null;\n }\n return decodeFromJSONField(typeArg.reifiedTypeArgs[0] as any, field);\n }\n default:\n return typeArg.fromJSONField(field);\n }\n}\n", "// @ts-nocheck\n\nimport { bcs } from \"@mysten/sui/bcs\";\nimport {\n decodeFromFields,\n decodeFromFieldsWithTypes,\n decodeFromJSONField,\n extractType,\n Reified,\n toBcs,\n ToField,\n ToTypeArgument,\n ToTypeStr,\n TypeArgument,\n VectorClass,\n VectorClassReified,\n fieldToJSON,\n} from \"./reified\";\nimport { composeSuiType, FieldsWithTypes } from \"./util\";\n\nexport type VectorElements<T extends TypeArgument> = Array<ToField<T>>;\n\nexport type VectorReified<T extends TypeArgument> = VectorClassReified<Vector<T>, VectorElements<T>>;\n\nexport class Vector<T extends TypeArgument> implements VectorClass {\n __VectorClass = true as const;\n\n static readonly $typeName = \"vector\";\n static readonly $numTypeParams = 1;\n static readonly $isPhantom = [false] as const;\n\n readonly $typeName = \"vector\";\n readonly $fullTypeName: `vector<${ToTypeStr<T>}>`;\n readonly $typeArgs: [ToTypeStr<T>];\n readonly $isPhantom = [false] as const;\n\n readonly elements: Array<ToField<T>>;\n\n constructor(typeArgs: [ToTypeStr<T>], elements: VectorElements<T>) {\n this.$fullTypeName = composeSuiType(this.$typeName, ...typeArgs) as `vector<${ToTypeStr<T>}>`;\n this.$typeArgs = typeArgs;\n\n this.elements = elements;\n }\n\n static reified<T extends Reified<TypeArgument, any>>(T: T): VectorReified<ToTypeArgument<T>> {\n return {\n typeName: Vector.$typeName,\n fullTypeName: composeSuiType(Vector.$typeName, ...[extractType(T)]) as `vector<${ToTypeStr<ToTypeArgument<T>>}>`,\n typeArgs: [extractType(T)] as [ToTypeStr<ToTypeArgument<T>>],\n isPhantom: Vector.$isPhantom,\n reifiedTypeArgs: [T],\n fromFields: (elements: any[]) => Vector.fromFields(T, elements),\n fromFieldsWithTypes: (item: FieldsWithTypes) => Vector.fromFieldsWithTypes(T, item),\n fromBcs: (data: Uint8Array) => Vector.fromBcs(T, data),\n bcs: Vector.bcs(toBcs(T)),\n fromJSONField: (field: any) => Vector.fromJSONField(T, field),\n fromJSON: (json: any) => Vector.fromJSON(T, json),\n new: (elements: VectorElements<ToTypeArgument<T>>) => {\n return new Vector([extractType(T)], elements);\n },\n kind: \"VectorClassReified\",\n };\n }\n\n static get r() {\n return Vector.reified;\n }\n\n static get bcs() {\n return bcs.vector;\n }\n\n static fromFields<T extends Reified<TypeArgument, any>>(typeArg: T, elements: any[]): Vector<ToTypeArgument<T>> {\n return Vector.reified(typeArg).new(elements.map((element) => decodeFromFields(typeArg, element)));\n }\n\n static fromFieldsWithTypes<T extends Reified<TypeArgument, any>>(\n typeArg: T,\n item: FieldsWithTypes\n ): Vector<ToTypeArgument<T>> {\n return Vector.reified(typeArg).new(\n (item as unknown as any[]).map((field: any) => decodeFromFieldsWithTypes(typeArg, field))\n );\n }\n\n static fromBcs<T extends Reified<TypeArgument, any>>(typeArg: T, data: Uint8Array): Vector<ToTypeArgument<T>> {\n return Vector.fromFields(typeArg, Vector.bcs(toBcs(typeArg)).parse(data));\n }\n\n toJSONField() {\n return this.elements.map((element) => fieldToJSON(this.$typeArgs[0], element));\n }\n\n toJSON() {\n return {\n $typeName: this.$typeName,\n $typeArgs: this.$typeArgs,\n elements: this.toJSONField(),\n };\n }\n\n static fromJSONField<T extends Reified<TypeArgument, any>>(typeArg: T, field: any[]): Vector<ToTypeArgument<T>> {\n return Vector.reified(typeArg).new(field.map((field) => decodeFromJSONField(typeArg, field)));\n }\n\n static fromJSON<T extends Reified<TypeArgument, any>>(typeArg: T, json: any): Vector<ToTypeArgument<T>> {\n if (json.$typeName !== Vector.$typeName) {\n throw new Error(\"not a vector json object\");\n }\n\n return Vector.fromJSONField(typeArg, json.elements);\n }\n}\n\nexport function vector<T extends Reified<TypeArgument, any>>(\n T: T\n): VectorClassReified<Vector<ToTypeArgument<T>>, VectorElements<ToTypeArgument<T>>> {\n return Vector.r(T);\n}\n", "// @ts-nocheck\nimport * as reified from \"../../../../_framework/reified\";\nimport {\n PhantomReified,\n Reified,\n StructClass,\n ToField,\n ToTypeStr,\n decodeFromFields,\n decodeFromFieldsWithTypes,\n decodeFromJSONField,\n fieldToJSON,\n phantom,\n} from \"../../../../_framework/reified\";\nimport { FieldsWithTypes, composeSuiType, compressSuiType } from \"../../../../_framework/util\";\nimport { Vector } from \"../../../../_framework/vector\";\nimport { PKG_V13 } from \"../index\";\nimport { bcs } from \"@mysten/sui/bcs\";\nimport { SuiClient, SuiObjectData, SuiParsedData } from \"@mysten/sui/client\";\nimport { fromB64 } from \"@mysten/sui/utils\";\n\n/* ============================== Char =============================== */\n\nexport function isChar(type: string): boolean {\n type = compressSuiType(type);\n return type === `${PKG_V13}::ascii::Char`;\n}\n\nexport interface CharFields {\n byte: ToField<\"u8\">;\n}\n\nexport type CharReified = Reified<Char, CharFields>;\n\nexport class Char implements StructClass {\n __StructClass = true as const;\n\n static get $typeName() {\n return `${PKG_V13}::ascii::Char`;\n }\n static readonly $numTypeParams = 0;\n static readonly $isPhantom = [] as const;\n\n readonly $typeName = Char.$typeName;\n readonly $fullTypeName: string;\n readonly $typeArgs: [];\n readonly $isPhantom = Char.$isPhantom;\n\n readonly byte: ToField<\"u8\">;\n\n private constructor(typeArgs: [], fields: CharFields) {\n this.$fullTypeName = composeSuiType(Char.$typeName, ...typeArgs) as string;\n this.$typeArgs = typeArgs;\n\n this.byte = fields.byte;\n }\n\n static reified(): CharReified {\n return {\n typeName: Char.$typeName,\n fullTypeName: composeSuiType(Char.$typeName, ...[]) as string,\n typeArgs: [] as [],\n isPhantom: Char.$isPhantom,\n reifiedTypeArgs: [],\n fromFields: (fields: Record<string, any>) => Char.fromFields(fields),\n fromFieldsWithTypes: (item: FieldsWithTypes) => Char.fromFieldsWithTypes(item),\n fromBcs: (data: Uint8Array) => Char.fromBcs(data),\n bcs: Char.bcs,\n fromJSONField: (field: any) => Char.fromJSONField(field),\n fromJSON: (json: Record<string, any>) => Char.fromJSON(json),\n fromSuiParsedData: (content: SuiParsedData) => Char.fromSuiParsedData(content),\n fromSuiObjectData: (content: SuiObjectData) => Char.fromSuiObjectData(content),\n fetch: async (client: SuiClient, id: string) => Char.fetch(client, id),\n new: (fields: CharFields) => {\n return new Char([], fields);\n },\n kind: \"StructClassReified\",\n };\n }\n\n static get r() {\n return Char.reified();\n }\n\n static phantom(): PhantomReified<ToTypeStr<Char>> {\n return phantom(Char.reified());\n }\n static get p() {\n return Char.phantom();\n }\n\n static get bcs() {\n return bcs.struct(\"Char\", {\n byte: bcs.u8(),\n });\n }\n\n static fromFields(fields: Record<string, any>): Char {\n return Char.reified().new({ byte: decodeFromFields(\"u8\", fields.byte) });\n }\n\n static fromFieldsWithTypes(item: FieldsWithTypes): Char {\n if (!isChar(item.type)) {\n throw new Error(\"not a Char type\");\n }\n\n return Char.reified().new({\n byte: decodeFromFieldsWithTypes(\"u8\", item.fields.byte),\n });\n }\n\n static fromBcs(data: Uint8Array): Char {\n return Char.fromFields(Char.bcs.parse(data));\n }\n\n toJSONField() {\n return {\n byte: this.byte,\n };\n }\n\n toJSON() {\n return {\n $typeName: this.$typeName,\n $typeArgs: this.$typeArgs,\n ...this.toJSONField(),\n };\n }\n\n static fromJSONField(field: any): Char {\n return Char.reified().new({ byte: decodeFromJSONField(\"u8\", field.byte) });\n }\n\n static fromJSON(json: Record<string, any>): Char {\n if (json.$typeName !== Char.$typeName) {\n throw new Error(\"not a WithTwoGenerics json object\");\n }\n\n return Char.fromJSONField(json);\n }\n\n static fromSuiParsedData(content: SuiParsedData): Char {\n if (content.dataType !== \"moveObject\") {\n throw new Error(\"not an object\");\n }\n if (!isChar(content.type)) {\n throw new Error(`object at ${(content.fields as any).id} is not a Char object`);\n }\n return Char.fromFieldsWithTypes(content);\n }\n\n static fromSuiObjectData(data: SuiObjectData): Char {\n if (data.bcs) {\n if (data.bcs.dataType !== \"moveObject\" || !isChar(data.bcs.type)) {\n throw new Error(`object at is not a Char object`);\n }\n\n return Char.fromBcs(fromB64(data.bcs.bcsBytes));\n }\n if (data.content) {\n return Char.fromSuiParsedData(data.content);\n }\n throw new Error(\n \"Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.\"\n );\n }\n\n static async fetch(client: SuiClient, id: string): Promise<Char> {\n const res = await client.getObject({ id, options: { showBcs: true } });\n if (res.error) {\n throw new Error(`error fetching Char object at id ${id}: ${res.error.code}`);\n }\n if (res.data?.bcs?.dataType !== \"moveObject\" || !isChar(res.data.bcs.type)) {\n throw new Error(`object at id ${id} is not a Char object`);\n }\n\n return Char.fromSuiObjectData(res.data);\n }\n}\n\n/* ============================== String =============================== */\n\nexport function isString(type: string): boolean {\n type = compressSuiType(type);\n return type === `${PKG_V13}::ascii::String`;\n}\n\nexport interface StringFields {\n bytes: ToField<Vector<\"u8\">>;\n}\n\nexport type StringReified = Reified<String, StringFields>;\n\nexport class String implements StructClass {\n __StructClass = true as const;\n\n static get $typeName() {\n return `${PKG_V13}::ascii::String`;\n }\n static readonly $numTypeParams = 0;\n static readonly $isPhantom = [] as const;\n\n readonly $typeName = String.$typeName;\n readonly $fullTypeName: string;\n readonly $typeArgs: [];\n readonly $isPhantom = String.$isPhantom;\n\n readonly bytes: ToField<Vector<\"u8\">>;\n\n private constructor(typeArgs: [], fields: StringFields) {\n this.$fullTypeName = composeSuiType(String.$typeName, ...typeArgs) as string;\n this.$typeArgs = typeArgs;\n\n this.bytes = fields.bytes;\n }\n\n static reified(): StringReified {\n return {\n typeName: String.$typeName,\n fullTypeName: composeSuiType(String.$typeName, ...[]) as string,\n typeArgs: [] as [],\n isPhantom: String.$isPhantom,\n reifiedTypeArgs: [],\n fromFields: (fields: Record<string, any>) => String.fromFields(fields),\n fromFieldsWithTypes: (item: FieldsWithTypes) => String.fromFieldsWithTypes(item),\n fromBcs: (data: Uint8Array) => String.fromBcs(data),\n bcs: String.bcs,\n fromJSONField: (field: any) => String.fromJSONField(field),\n fromJSON: (json: Record<string, any>) => String.fromJSON(json),\n fromSuiParsedData: (content: SuiParsedData) => String.fromSuiParsedData(content),\n fromSuiObjectData: (content: SuiObjectData) => String.fromSuiObjectData(content),\n fetch: async (client: SuiClient, id: string) => String.fetch(client, id),\n new: (fields: StringFields) => {\n return new String([], fields);\n },\n kind: \"StructClassReified\",\n };\n }\n\n static get r() {\n return String.reified();\n }\n\n static phantom(): PhantomReified<ToTypeStr<String>> {\n return phantom(String.reified());\n }\n static get p() {\n return String.phantom();\n }\n\n static get bcs() {\n return bcs.struct(\"String\", {\n bytes: bcs.vector(bcs.u8()),\n });\n }\n\n static fromFields(fields: Record<string, any>): String {\n return String.reified().new({\n bytes: decodeFromFields(reified.vector(\"u8\"), fields.bytes),\n });\n }\n\n static fromFieldsWithTypes(item: FieldsWithTypes): String {\n if (!isString(item.type)) {\n throw new Error(\"not a String type\");\n }\n\n return String.reified().new({\n bytes: decodeFromFieldsWithTypes(reified.vector(\"u8\"), item.fields.bytes),\n });\n }\n\n static fromBcs(data: Uint8Array): String {\n return String.fromFields(String.bcs.parse(data));\n }\n\n toJSONField() {\n return {\n bytes: fieldToJSON<Vector<\"u8\">>(`vector<u8>`, this.bytes),\n };\n }\n\n toJSON() {\n return {\n $typeName: this.$typeName,\n $typeArgs: this.$typeArgs,\n ...this.toJSONField(),\n };\n }\n\n static fromJSONField(field: any): String {\n return String.reified().new({\n bytes: decodeFromJSONField(reified.vector(\"u8\"), field.bytes),\n });\n }\n\n static fromJSON(json: Record<string, any>): String {\n if (json.$typeName !== String.$typeName) {\n throw new Error(\"not a WithTwoGenerics json object\");\n }\n\n return String.fromJSONField(json);\n }\n\n static fromSuiParsedData(content: SuiParsedData): String {\n if (content.dataType !== \"moveObject\") {\n throw new Error(\"not an object\");\n }\n if (!isString(content.type)) {\n throw new Error(`object at ${(content.fields as any).id} is not a String object`);\n }\n return String.fromFieldsWithTypes(content);\n }\n\n static fromSuiObjectData(data: SuiObjectData): String {\n if (data.bcs) {\n if (data.bcs.dataType !== \"moveObject\" || !isString(data.bcs.type)) {\n throw new Error(`object at is not a String object`);\n }\n\n return String.fromBcs(fromB64(data.bcs.bcsBytes));\n }\n if (data.content) {\n return String.fromSuiParsedData(data.content);\n }\n throw new Error(\n \"Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.\"\n );\n }\n\n static async fetch(client: SuiClient, id: string): Promise<String> {\n const res = await client.getObject({ id, options: { showBcs: true } });\n if (res.error) {\n throw new Error(`error fetching String object at id ${id}: ${res.error.code}`);\n }\n if (res.data?.bcs?.dataType !== \"moveObject\" || !isString(res.data.bcs.type)) {\n throw new Error(`object at id ${id} is not a String object`);\n }\n\n return String.fromSuiObjectData(res.data);\n }\n}\n", "// @ts-nocheck\nexport const PACKAGE_ID = \"0x1\";\nexport const PUBLISHED_AT = \"0x1\";\nexport const PKG_V13 = \"0x1\";\n", "// @ts-nocheck\nimport * as reified from \"../../../../_framework/reified\";\nimport {\n PhantomReified,\n Reified,\n StructClass,\n ToField,\n ToTypeStr,\n decodeFromFields,\n decodeFromFieldsWithTypes,\n decodeFromJSONField,\n fieldToJSON,\n phantom,\n} from \"../../../../_framework/reified\";\nimport { FieldsWithTypes, composeSuiType, compressSuiType } from \"../../../../_framework/util\";\nimport { Vector } from \"../../../../_framework/vector\";\nimport { PKG_V13 } from \"../index\";\nimport { bcs } from \"@mysten/sui/bcs\";\nimport { SuiClient, SuiObjectData, SuiParsedData } from \"@mysten/sui/client\";\nimport { fromB64 } from \"@mysten/sui/utils\";\n\n/* ============================== String =============================== */\n\nexport function isString(type: string): boolean {\n type = compressSuiType(type);\n return type === `${PKG_V13}::string::String`;\n}\n\nexport interface StringFields {\n bytes: ToField<Vector<\"u8\">>;\n}\n\nexport type StringReified = Reified<String, StringFields>;\n\nexport class String implements StructClass {\n __StructClass = true as const;\n\n static get $typeName() {\n return `${PKG_V13}::string::String`;\n }\n static readonly $numTypeParams = 0;\n static readonly $isPhantom = [] as const;\n\n readonly $typeName = String.$typeName;\n readonly $fullTypeName: string;\n readonly $typeArgs: [];\n readonly $isPhantom = String.$isPhantom;\n\n readonly bytes: ToField<Vector<\"u8\">>;\n\n private constructor(typeArgs: [], fields: StringFields) {\n this.$fullTypeName = composeSuiType(String.$typeName, ...typeArgs) as string;\n this.$typeArgs = typeArgs;\n\n this.bytes = fields.bytes;\n }\n\n static reified(): StringReified {\n return {\n typeName: String.$typeName,\n fullTypeName: composeSuiType(String.$typeName, ...[]) as string,\n typeArgs: [] as [],\n isPhantom: String.$isPhantom,\n reifiedTypeArgs: [],\n fromFields: (fields: Record<string, any>) => String.fromFields(fields),\n fromFieldsWithTypes: (item: FieldsWithTypes) => String.fromFieldsWithTypes(item),\n fromBcs: (data: Uint8Array) => String.fromBcs(data),\n bcs: String.bcs,\n fromJSONField: (field: any) => String.fromJSONField(field),\n fromJSON: (json: Record<string, any>) => String.fromJSON(json),\n fromSuiParsedData: (content: SuiParsedData) => String.fromSuiParsedData(content),\n fromSuiObjectData: (content: SuiObjectData) => String.fromSuiObjectData(content),\n fetch: async (client: SuiClient, id: string) => String.fetch(client, id),\n new: (fields: StringFields) => {\n return new String([], fields);\n },\n kind: \"StructClassReified\",\n };\n }\n\n static get r() {\n return String.reified();\n }\n\n static phantom(): PhantomReified<ToTypeStr<String>> {\n return phantom(String.reified());\n }\n static get p() {\n return String.phantom();\n }\n\n static get bcs() {\n return bcs.struct(\"String\", {\n bytes: bcs.vector(bcs.u8()),\n });\n }\n\n static fromFields(fields: Record<string, any>): String {\n return String.reified().new({\n bytes: decodeFromFields(reified.vector(\"u8\"), fields.bytes),\n });\n }\n\n static fromFieldsWithTypes(item: FieldsWithTypes): String {\n if (!isString(item.type)) {\n throw new Error(\"not a String type\");\n }\n\n return String.reified().new({\n bytes: decodeFromFieldsWithTypes(reified.vector(\"u8\"), item.fields.bytes),\n });\n }\n\n static fromBcs(data: Uint8Array): String {\n return String.fromFields(String.bcs.parse(data));\n }\n\n toJSONField() {\n return {\n bytes: fieldToJSON<Vector<\"u8\">>(`vector<u8>`, this.bytes),\n };\n }\n\n toJSON() {\n return {\n $typeName: this.$typeName,\n $typeArgs: this.$typeArgs,\n ...this.toJSONField(),\n };\n }\n\n static fromJSONField(field: any): String {\n return String.reified().new({\n bytes: decodeFromJSONField(reified.vector(\"u8\"), field.bytes),\n });\n }\n\n static fromJSON(json: Record<string, any>): String {\n if (json.$typeName !== String.$typeName) {\n throw new Error(\"not a WithTwoGenerics json object\");\n }\n\n return String.fromJSONField(json);\n }\n\n static fromSuiParsedData(content: SuiParsedData): String {\n if (content.dataType !== \"moveObject\") {\n throw new Error(\"not an object\");\n }\n if (!isString(content.type)) {\n throw new Error(`object at ${(content.fields as any).id} is not a String object`);\n }\n return String.fromFieldsWithTypes(content);\n }\n\n static fromSuiObjectData(data: SuiObjectData): String {\n if (data.bcs) {\n if (data.bcs.dataType !== \"moveObject\" || !isString(data.bcs.type)) {\n throw new Error(`object at is not a String object`);\n }\n\n return String.fromBcs(fromB64(data.bcs.bcsBytes));\n }\n if (data.content) {\n return String.fromSuiParsedData(data.content);\n }\n throw new Error(\n \"Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.\"\n );\n }\n\n static async fetch(client: SuiClient, id: string): Promise<String> {\n const res = await client.getObject({ id, options: { showBcs: true } });\n if (res.error) {\n throw new Error(`error fetching String object at id ${id}: ${res.error.code}`);\n }\n if (res.data?.bcs?.dataType !== \"moveObject\" || !isString(res.data.bcs.type)) {\n throw new Error(`object at id ${id} is not a String object`);\n }\n\n return String.fromSuiObjectData(res.data);\n }\n}\n", "// @ts-nocheck\nimport {\n PhantomReified,\n Reified,\n StructClass,\n ToField,\n ToTypeStr,\n decodeFromFields,\n decodeFromFieldsWithTypes,\n decodeFromJSONField,\n phantom,\n} from \"../../_framework/reified\";\nimport { FieldsWithTypes, composeSuiType, compressSuiType } from \"../../_framework/util\";\nimport { PKG_V26 } from \"../index\";\nimport { bcs } from \"@mysten/sui/bcs\";\nimport { SuiClient, SuiObjectData, SuiParsedData } from \"@mysten/sui/client\";\nimport { fromB64, fromHEX, toHEX } from \"@mysten/sui/utils\";\n\n/* ============================== ID =============================== */\n\nexport function isID(type: string): boolean {\n type = compressSuiType(type);\n return type === `${PKG_V26}::object::ID`;\n}\n\nexport interface IDFields {\n bytes: ToField<\"address\">;\n}\n\nexport type IDReified = Reified<ID, IDFields>;\n\nexport class ID implements StructClass {\n __StructClass = true as const;\n\n static get $typeName() {\n return `${PKG_V26}::object::ID`;\n }\n static readonly $numTypeParams = 0;\n static readonly $isPhantom = [] as const;\n\n readonly $typeName = ID.$typeName;\n readonly $fullTypeName: string;\n readonly $typeArgs: [];\n readonly $isPhantom = ID.$isPhantom;\n\n readonly bytes: ToField<\"address\">;\n\n private constructor(typeArgs: [], fields: IDFields) {\n this.$fullTypeName = composeSuiType(ID.$typeName, ...typeArgs) as string;\n this.$typeArgs = typeArgs;\n\n this.bytes = fields.bytes;\n }\n\n static reified(): IDReified {\n return {\n typeName: ID.$typeName,\n fullTypeName: composeSuiType(ID.$typeName, ...[]) as string,\n typeArgs: [] as [],\n isPhantom: ID.$isPhantom,\n reifiedTypeArgs: [],\n fromFields: (fields: Record<string, any>) => ID.fromFields(fields),\n fromFieldsWithTypes: (item: FieldsWithTypes) => ID.fromFieldsWithTypes(item),\n fromBcs: (data: Uint8Array) => ID.fromBcs(data),\n bcs: ID.bcs,\n fromJSONField: (field: any) => ID.fromJSONField(field),\n fromJSON: (json: Record<string, any>) => ID.fromJSON(json),\n fromSuiParsedData: (content: SuiParsedData) => ID.fromSuiParsedData(content),\n fromSuiObjectData: (content: SuiObjectData) => ID.fromSuiObjectData(content),\n fetch: async (client: SuiClient, id: string) => ID.fetch(client, id),\n new: (fields: IDFields) => {\n return new ID([], fields);\n },\n kind: \"StructClassReified\",\n };\n }\n\n static get r() {\n return ID.reified();\n }\n\n static phantom(): PhantomReified<ToTypeStr<ID>> {\n return phantom(ID.reified());\n }\n static get p() {\n return ID.phantom();\n }\n\n static get bcs() {\n return bcs.struct(\"ID\", {\n bytes: bcs.bytes(32).transform({\n input: (val: string) => fromHEX(val),\n output: (val: Uint8Array) => toHEX(val),\n }),\n });\n }\n\n static fromFields(fields: Record<string, any>): ID {\n return ID.reified().new({\n bytes: decodeFromFields(\"address\", fields.bytes),\n });\n }\n\n static fromFieldsWithTypes(item: FieldsWithTypes): ID {\n if (!isID(item.type)) {\n throw new Error(\"not a ID type\");\n }\n\n return ID.reified().new({\n bytes: decodeFromFieldsWithTypes(\"address\", item.fields.bytes),\n });\n }\n\n static fromBcs(data: Uint8Array): ID {\n return ID.fromFields(ID.bcs.parse(data));\n }\n\n toJSONField() {\n return {\n bytes: this.bytes,\n };\n }\n\n toJSON() {\n return {\n $typeName: this.$typeName,\n $typeArgs: this.$typeArgs,\n ...this.toJSONField(),\n };\n }\n\n static fromJSONField(field: any): ID {\n return ID.reified().new({\n bytes: decodeFromJSONField(\"address\", field.bytes),\n });\n }\n\n static fromJSON(json: Record<string, any>): ID {\n if (json.$typeName !== ID.$typeName) {\n throw new Error(\"not a WithTwoGenerics json object\");\n }\n\n return ID.fromJSONField(json);\n }\n\n static fromSuiParsedData(content: SuiParsedData): ID {\n if (content.dataType !== \"moveObject\") {\n throw new Error(\"not an object\");\n }\n if (!isID(content.type)) {\n throw new Error(`object at ${(content.fields as any).id} is not a ID object`);\n }\n return ID.fromFieldsWithTypes(content);\n }\n\n static fromSuiObjectData(data: SuiObjectData): ID {\n if (data.bcs) {\n if (data.bcs.dataType !== \"moveObject\" || !isID(data.bcs.type)) {\n throw new Error(`object at is not a ID object`);\n }\n\n return ID.fromBcs(fromB64(data.bcs.bcsBytes));\n }\n if (data.content) {\n return ID.fromSuiParsedData(data.content);\n }\n throw new Error(\n \"Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.\"\n );\n }\n\n static async fetch(client: SuiClient, id: string): Promise<ID> {\n const res = await client.getObject({ id, options: { showBcs: true } });\n if (res.error) {\n throw new Error(`error fetching ID object at id ${id}: ${res.error.code}`);\n }\n if (res.data?.bcs?.dataType !== \"moveObject\" || !isID(res.data.bcs.type)) {\n throw new Error(`object at id ${id} is not a ID object`);\n }\n\n return ID.fromSuiObjectData(res.data);\n }\n}\n\n/* ============================== UID =============================== */\n\nexport function isUID(type: string): boolean {\n type = compressSuiType(type);\n return type === `${PKG_V26}::object::UID`;\n}\n\nexport interface UIDFields {\n id: ToField<ID>;\n}\n\nexport type UIDReified = Reified<UID, UIDFields>;\n\nexport class UID implements StructClass {\n __StructClass = true as const;\n\n static get $typeName() {\n return `${PKG_V26}::object::UID`;\n }\n static readonly $numTypeParams = 0;\n static readonly $isPhantom = [] as const;\n\n readonly $typeName = UID.$typeName;\n readonly $fullTypeName: string;\n readonly $typeArgs: [];\n readonly $isPhantom = UID.$isPhantom;\n\n readonly id: ToField<ID>;\n\n private constructor(typeArgs: [], fields: UIDFields) {\n this.$fullTypeName = composeSuiType(UID.$typeName, ...typeArgs) as string;\n this.$typeArgs = typeArgs;\n\n this.id = fields.id;\n }\n\n static reified(): UIDReified {\n return {\n typeName: UID.$typeName,\n fullTypeName: composeSuiType(UID.$typeName, ...[]) as string,\n typeArgs: [] as [],\n isPhantom: UID.$isPhantom,\n reifiedTypeArgs: [],\n fromFields: (fields: Record<string, any>) => UID.fromFields(fields),\n fromFieldsWithTypes: (item: FieldsWithTypes) => UID.fromFieldsWithTypes(item),\n fromBcs: (data: Uint8Array) => UID.fromBcs(data),\n bcs: UID.bcs,\n fromJSONField: (field: any) => UID.fromJSONField(field),\n fromJSON: (json: Record<string, any>) => UID.fromJSON(json),\n fromSuiParsedData: (content: SuiParsedData) => UID.fromSuiParsedData(content),\n fromSuiObjectData: (content: SuiObjectData) => UID.fromSuiObjectData(content),\n fetch: async (client: SuiClient, id: string) => UID.fetch(client, id),\n new: (fields: UIDFields) => {\n return new UID([], fields);\n },\n kind: \"StructClassReified\",\n };\n }\n\n static get r() {\n return UID.reified();\n }\n\n static phantom(): PhantomReified<ToTypeStr<UID>> {\n return phantom(UID.reified());\n }\n static get p() {\n return UID.phantom();\n }\n\n static get bcs() {\n return bcs.struct(\"UID\", {\n id: ID.bcs,\n });\n }\n\n static fromFields(fields: Record<string, any>): UID {\n return UID.reified().new({ id: decodeFromFields(ID.reified(), fields.id) });\n }\n\n static fromFieldsWithTypes(item: FieldsWithTypes): UID {\n if (!isUID(item.type)) {\n throw new Error(\"not a UID type\");\n }\n\n return UID.reified().new({\n id: decodeFromFieldsWithTypes(ID.reified(), item.fields.id),\n });\n }\n\n static fromBcs(data: Uint8Array): UID {\n return UID.fromFields(UID.bcs.parse(data));\n }\n\n toJSONField() {\n return {\n id: this.id,\n };\n }\n\n toJSON() {\n return {\n $typeName: this.$typeName,\n $typeArgs: this.$typeArgs,\n ...this.toJSONField(),\n };\n }\n\n static fromJSONField(field: any): UID {\n return UID.reified().new({\n id: decodeFromJSONField(ID.reified(), field.id),\n });\n }\n\n static fromJSON(json: Record<string, any>): UID {\n if (json.$typeName !== UID.$typeName) {\n throw new Error(\"not a WithTwoGenerics json object\");\n }\n\n return UID.fromJSONField(json);\n }\n\n static fromSuiParsedData(content: SuiParsedData): UID {\n if (content.dataType !== \"moveObject\") {\n throw new Error(\"not an object\");\n }\n if (!isUID(content.type)) {\n throw new Error(`object at ${(content.fields as any).id} is not a UID object`);\n }\n return UID.fromFieldsWithTypes(content);\n }\n\n static fromSuiObjectData(data: SuiObjectData): UID {\n if (data.bcs) {\n if (data.bcs.dataType !== \"moveObject\" || !isUID(data.bcs.type)) {\n throw new Error(`object at is not a UID object`);\n }\n\n return UID.fromBcs(fromB64(data.bcs.bcsBytes));\n }\n if (data.content) {\n return UID.fromSuiParsedData(data.content);\n }\n throw new Error(\n \"Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.\"\n );\n }\n\n static async fetch(client: SuiClient, id: string): Promise<UID> {\n const res = await client.getObject({ id, options: { showBcs: true } });\n if (res.error) {\n throw new Error(`error fetching UID object at id ${id}: ${res.error.code}`);\n }\n if (res.data?.bcs?.dataType !== \"moveObject\" || !isUID(res.data.bcs.type)) {\n throw new Error(`object at id ${id} is not a UID object`);\n }\n\n return UID.fromSuiObjectData(res.data);\n }\n}\n", "// @ts-nocheck\nexport const PACKAGE_ID = \"0x2\";\nexport const PUBLISHED_AT = \"0x2\";\nexport const PKG_V26 = \"0x2\";\n", "interface PaginatedResults<Data> {\n data: Data[];\n hasNextPage: boolean;\n nextCursor?: string | null;\n}\n\nexport async function fetchAllPagesRecursive<Data, Result extends PaginatedResults<Data>>(\n fetchFunction: (cursor?: string | null) => Promise<Result>,\n cursor?: string | null,\n accumulatedData: Data[] = []\n): Promise<Data[]> {\n const result = await fetchFunction(cursor);\n const newAccumulatedData = accumulatedData.concat(result.data);\n\n if (result.hasNextPage && result.nextCursor) {\n return fetchAllPagesRecursive(fetchFunction, result.nextCursor, newAccumulatedData);\n } else {\n return newAccumulatedData;\n }\n}\n", "import { Big } from \"big.js\";\nimport { TronWeb } from \"tronweb\";\nimport { ChainType } from \"../../../chains/chain.enums\";\nimport { AllbridgeCoreClient } from \"../../../client/core-api/core-client-base\";\nimport { SdkError } from \"../../../exceptions\";\nimport { FeePaymentMethod, Messenger, SwapParams, TransactionResponse } from \"../../../models\";\nimport { RawTransaction, SmartContractMethodParameter } from \"../../models\";\nimport { sendRawTransaction } from \"../../utils/trx\";\nimport { SendParams, TxSendParamsTrx, TxSwapParamsTrx } from \"../models\";\nimport { ChainBridgeService } from \"../models/bridge\";\nimport { getNonceBigInt, prepareTxSendParams, prepareTxSwapParams } from \"../utils\";\n\nexport class TronBridgeService extends ChainBridgeService {\n chainType: ChainType.TRX = ChainType.TRX;\n\n constructor(\n public tronWeb: TronWeb,\n public api: AllbridgeCoreClient\n ) {\n super();\n }\n\n async send(params: SendParams): Promise<TransactionResponse> {\n const txSendParams = await prepareTxSendParams(this.chainType, params, this.api);\n const rawTransaction = await this.buildRawTransactionSendFromParams(params, txSendParams);\n return await sendRawTransaction(this.tronWeb, rawTransaction);\n }\n\n async buildRawTransactionSwap(params: SwapParams): Promise<RawTransaction> {\n const txSwapParams = prepareTxSwapParams(this.chainType, params);\n return await this.buildRawTransactionSwapFromParams(txSwapParams);\n }\n\n async buildRawTransactionSwapFromParams(params: TxSwapParamsTrx): Promise<RawTransaction> {\n const {\n amount,\n contractAddress,\n fromAccountAddress,\n fromTokenAddress,\n toAccountAddress,\n toTokenAddress,\n minimumReceiveAmount,\n } = params;\n\n const parameters = [\n { type: \"uint256\", value: amount },\n { type: \"bytes32\", value: fromTokenAddress },\n { type: \"bytes32\", value: toTokenAddress },\n { type: \"address\", value: toAccountAddress },\n { type: \"uint256\", value: minimumReceiveAmount },\n ];\n const methodSignature = \"swap(uint256,bytes32,bytes32,address,uint256)\";\n return this.buildRawTransaction(contractAddress, methodSignature, parameters, \"0\", fromAccountAddress);\n }\n\n async buildRawTransactionSend(params: SendParams): Promise<RawTransaction> {\n const txSendParams = await prepareTxSendParams(this.chainType, params, this.api);\n return this.buildRawTransactionSendFromParams(params, txSendParams);\n }\n\n async buildRawTransactionSendFromParams(sendParams: SendParams, params: TxSendParamsTrx): Promise<RawTransaction> {\n const {\n amount,\n contractAddress,\n fromAccountAddress,\n fromTokenAddress,\n toChainId,\n toAccountAddress,\n toTokenAddress,\n messenger,\n fee,\n gasFeePaymentMethod,\n extraGas,\n extraGasDest,\n } = params;\n\n let totalFee = fee;\n if (extraGas) {\n totalFee = Big(totalFee).plus(extraGas).toFixed();\n }\n\n const nonce = getNonceBigInt().toString();\n let parameters;\n let value: string;\n let methodSignature: string;\n switch (messenger) {\n case Messenger.CCTP:\n case Messenger.CCTP_V2:\n if (gasFeePaymentMethod === FeePaymentMethod.WITH_STABLECOIN) {\n parameters = [\n { type: \"uint256\", value: amount },\n { type: \"bytes32\", value: toAccountAddress },\n { type: \"uint256\", value: toChainId },\n { type: \"uint256\", value: totalFee },\n ];\n value = \"0\";\n } else {\n parameters = [\n { type: \"uint256\", value: amount },\n { type: \"bytes32\", value: toAccountAddress },\n { type: \"uint256\", value: toChainId },\n { type: \"uint256\", value: 0 },\n ];\n value = totalFee;\n }\n methodSignature = \"bridge(uint256,bytes32,uint256,uint256)\";\n break;\n case Messenger.OFT:\n if (gasFeePaymentMethod === FeePaymentMethod.WITH_STABLECOIN) {\n parameters = [\n { type: \"address\", value: sendParams.sourceToken.tokenAddress },\n { type: \"uint256\", value: amount },\n { type: \"bytes32\", value: toAccountAddress },\n { type: \"uint256\", value: toChainId },\n { type: \"uint256\", value: totalFee },\n { type: \"uint256\", value: extraGasDest ?? \"0\" },\n { type: \"uint256\", value: \"10\" },\n ];\n value = \"0\";\n } else {\n parameters = [\n { type: \"address\", value: sendParams.sourceToken.tokenAddress },\n { type: \"uint256\", value: amount },\n { type: \"bytes32\", value: toAccountAddress },\n { type: \"uint256\", value: toChainId },\n { type: \"uint256\", value: 0 },\n { type: \"uint256\", value: extraGasDest ?? \"0\" },\n { type: \"uint256\", value: \"10\" },\n ];\n value = totalFee;\n }\n methodSignature = \"bridge(address,uint256,bytes32,uint256,uint256,uint256,uint256)\";\n break;\n case Messenger.ALLBRIDGE:\n case Messenger.WORMHOLE:\n if (gasFeePaymentMethod === FeePaymentMethod.WITH_STABLECOIN) {\n parameters = [\n { type: \"bytes32\", value: fromTokenAddress },\n { type: \"uint256\", value: amount },\n { type: \"bytes32\", value: toAccountAddress },\n { type: \"uint256\", value: toChainId },\n { type: \"bytes32\", value: toTokenAddress },\n { type: \"uint256\", value: nonce },\n { type: \"uint8\", value: messenger },\n { type: \"uint256\", value: totalFee },\n ];\n value = \"0\";\n } else {\n parameters = [\n { type: \"bytes32\", value: fromTokenAddress },\n { type: \"uint256\", value: amount },\n { type: \"bytes32\", value: toAccountAddress },\n { type: \"uint256\", value: toChainId },\n { type: \"bytes32\", value: toTokenAddress },\n { type: \"uint256\", value: nonce },\n { type: \"uint8\", value: messenger },\n { type: \"uint256\", value: 0 },\n ];\n value = totalFee;\n }\n methodSignature = \"swapAndBridge(bytes32,uint256,bytes32,uint256,bytes32,uint256,uint8,uint256)\";\n break;\n }\n return this.buildRawTransaction(contractAddress, methodSignature, parameters, value, fromAccountAddress);\n }\n\n private async buildRawTransaction(\n contractAddress: string,\n methodSignature: string,\n parameters: SmartContractMethodParameter[],\n value: string,\n fromAddress: string\n ): Promise<RawTransaction> {\n const transactionObject = await this.tronWeb.transactionBuilder.triggerSmartContract(\n contractAddress,\n methodSignature,\n {\n callValue: +value,\n },\n parameters,\n fromAddress\n );\n if (!transactionObject?.result?.result) {\n throw new SdkError(\"Unknown error: \" + JSON.stringify(transactionObject, null, 2));\n }\n return transactionObject.transaction;\n }\n}\n", "import BN from \"bn.js\";\n\nexport function amountToHex(amount: string): string {\n return \"0x\" + new BN(amount).toString(\"hex\");\n}\n\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(() => resolve(), ms));\n}\n\nexport const promisify =\n // prettier-ignore\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n (func: Function) =>\n (...args: any[]) =>\n new Promise<any>(\n (resolve, reject) =>\n func(...args, (err: Error, result: any) => (err ? reject(err) : resolve(result)))\n );\n", "import { TronWeb } from \"tronweb\";\nimport { SignedTransaction } from \"tronweb/src/types/Transaction\";\nimport { InvalidTxError, VerifyTxError } from \"../../../exceptions\";\nimport { RawTransaction } from \"../../models\";\nimport { sleep } from \"../index\";\n\nexport async function sendRawTransaction(tronWeb: TronWeb, rawTransaction: RawTransaction): Promise<{ txId: string }> {\n const signedTx = await tronWeb.trx.sign(rawTransaction as any);\n\n if (!(signedTx as SignedTransaction).signature) {\n throw new InvalidTxError(\"Transaction was not signed properly\");\n }\n\n const receipt = await tronWeb.trx.sendRawTransaction(signedTx);\n const transactionHash = receipt.transaction.txID;\n await verifyTx(tronWeb, transactionHash);\n return { txId: transactionHash };\n}\n\nexport async function verifyTx(tronWeb: TronWeb, txId: string, timeout = 10000): Promise<any> {\n const start = Date.now();\n\n while (true) {\n if (Date.now() - start > timeout) {\n throw new VerifyTxError(\"Transaction not found\");\n }\n const result = await tronWeb.trx.getUnconfirmedTransactionInfo(txId);\n if (!result?.receipt) {\n await sleep(2000);\n continue;\n }\n if (result.receipt.result === \"SUCCESS\") {\n return result;\n } else {\n throw new VerifyTxError(`Transaction status is ${result.receipt.result}`);\n }\n }\n}\n", "import { Big } from \"big.js\";\nimport Cache from \"timed-cache\";\nimport { TronWeb } from \"tronweb\";\nimport { FMT_BYTES, FMT_NUMBER, Web3 } from \"web3\";\nimport { NodeRpcUrlsConfig } from \"..\";\nimport { Chains } from \"../../chains\";\nimport { AllbridgeCoreClient } from \"../../client/core-api/core-client-base\";\nimport { AllbridgeCoreClientFiltered } from \"../../client/core-api/core-client-filtered\";\nimport { AllbridgeCoreSdkOptions, ChainType, EssentialWeb3 } from \"../../index\";\nimport { PoolInfo, PoolKeyObject, TokenWithChainDetails } from \"../../tokens-info\";\nimport { convertIntAmountToFloat, fromSystemPrecision } from \"../../utils/calculation\";\nimport { SYSTEM_PRECISION } from \"../../utils/calculation/constants\";\nimport { validateAmountDecimals, validateAmountGtZero } from \"../../utils/utils\";\nimport { Provider, TransactionResponse } from \"../models\";\nimport { TokenService } from \"../token\";\nimport { depositAmountToVUsd, vUsdToWithdrawalAmount } from \"../utils/calculation\";\nimport { EvmPoolService } from \"./evm\";\nimport { ApproveParams, ChainPoolService, CheckAllowanceParams, GetAllowanceParams, UserBalanceInfo } from \"./models\";\nimport { DefaultRawPoolTransactionBuilder, RawPoolTransactionBuilder } from \"./raw-pool-transaction-builder\";\nimport { SolanaPoolService } from \"./sol\";\nimport { SrbPoolService } from \"./srb\";\nimport { SuiPoolService } from \"./sui\";\nimport { TronPoolService } from \"./trx\";\n\nexport interface LiquidityPoolService {\n rawTxBuilder: RawPoolTransactionBuilder;\n\n /**\n * Get amount of tokens approved for poolInfo\n * @param provider - will be used to access the network\n * @param params See {@link GetAllowanceParams}\n * @returns the amount of approved tokens\n */\n getAllowance(provider: Provider, params: GetAllowanceParams): Promise<string>;\n\n /**\n * Get amount of tokens approved for poolInfo\n * @param params See {@link GetAllowanceParams}\n * @returns the amount of approved tokens\n */\n getAllowance(params: GetAllowanceParams): Promise<string>;\n\n /**\n * Check if the amount of approved tokens is enough\n * @param provider - will be used to access the network\n * @param params See {@link CheckAllowanceParams}\n * @returns true if the amount of approved tokens is enough to make a transfer\n */\n checkAllowance(provider: Provider, params: CheckAllowanceParams): Promise<boolean>;\n\n /**\n * Check if the amount of approved tokens is enough\n * @param params See {@link CheckAllowanceParams}\n * @returns true if the amount of approved tokens is enough to make a transfer\n */\n checkAllowance(params: CheckAllowanceParams): Promise<boolean>;\n\n /**\n * @deprecated Use {@link rawTxBuilder}.{@link RawPoolTransactionBuilder.approve}<p>\n * Approve tokens usage by another address on chains\n * <p>\n * For ETH/USDT: due to specificity of the USDT contract:<br/>\n * If the current allowance is not 0, this function will perform an additional transaction to set allowance to 0 before setting the new allowance value.\n * @param provider - will be used to access the network\n * @param approveData\n */\n approve(provider: Provider, approveData: ApproveParams): Promise<TransactionResponse>;\n\n /**\n * Calculates the amount of LP tokens that will be deposited\n * @param amount The float amount of tokens that will be sent\n * @param token\n * @param provider - will be used to access the network\n * @returns amount\n */\n getAmountToBeDeposited(amount: string, token: TokenWithChainDetails, provider?: Provider): Promise<string>;\n\n /**\n * Calculates the amount of tokens will be withdrawn\n * @param amount The float amount of tokens that will be sent\n * @param accountAddress\n * @param token\n * @param provider - will be used to access the network\n * @returns amount\n */\n getAmountToBeWithdrawn(\n amount: string,\n accountAddress: string,\n token: TokenWithChainDetails,\n provider?: Provider\n ): Promise<string>;\n\n /**\n * Get User Balance Info on Liquidity poolInfo\n * @param accountAddress\n * @param token\n * @param provider\n * @returns UserBalanceInfo\n */\n getUserBalanceInfo(\n accountAddress: string,\n token: TokenWithChainDetails,\n provider?: Provider\n ): Promise<UserBalanceInfo>;\n\n /**\n * Gets information about the poolInfo from chain\n * @param token\n * @param provider - will be used to access the network\n * @returns poolInfo\n */\n getPoolInfoFromChain(token: TokenWithChainDetails, provider?: Provider): Promise<Required<PoolInfo>>;\n}\n\nexport class DefaultLiquidityPoolService implements LiquidityPoolService {\n public rawTxBuilder: RawPoolTransactionBuilder;\n private cache: Cache<PoolInfo>;\n\n constructor(\n private api: AllbridgeCoreClientFiltered,\n private nodeRpcUrlsConfig: NodeRpcUrlsConfig,\n private params: AllbridgeCoreSdkOptions,\n private tokenService: TokenService\n ) {\n this.rawTxBuilder = new DefaultRawPoolTransactionBuilder(api, nodeRpcUrlsConfig, this.params, tokenService);\n const ttl = params.cachePoolInfoChainSec > 0 ? params.cachePoolInfoChainSec * 1000 : 20 * 1000;\n this.cache = new Cache<PoolInfo>({ defaultTtl: ttl });\n }\n\n async getAllowance(a: Provider | GetAllowanceParams, b?: GetAllowanceParams): Promise<string> {\n if (b) {\n const provider = a as Provider;\n const params = b;\n return await this.tokenService.getAllowance({ ...params, spender: params.token.poolAddress }, provider);\n } else {\n const params = a as GetAllowanceParams;\n return await this.tokenService.getAllowance({ ...params, spender: params.token.poolAddress });\n }\n }\n\n async checkAllowance(a: Provider | CheckAllowanceParams, b?: CheckAllowanceParams): Promise<boolean> {\n if (b) {\n const provider = a as Provider;\n const params = b;\n return this.tokenService.checkAllowance({ ...params, spender: params.token.poolAddress }, provider);\n } else {\n const params = a as CheckAllowanceParams;\n return this.tokenService.checkAllowance({ ...params, spender: params.token.poolAddress });\n }\n }\n\n async approve(provider: Provider, approveData: ApproveParams): Promise<TransactionResponse> {\n return this.tokenService.approve(provider, { ...approveData, spender: approveData.token.poolAddress });\n }\n\n async getAmountToBeDeposited(amount: string, token: TokenWithChainDetails, provider?: Provider): Promise<string> {\n validateAmountGtZero(amount);\n validateAmountDecimals(\"amount\", amount, token.decimals);\n const pool = await this.getPoolInfoFromChain(token, provider);\n const { vUsdBalance, tokenBalance, aValue, dValue } = pool;\n const vUsd = depositAmountToVUsd(amount, aValue, dValue, tokenBalance, vUsdBalance);\n return convertIntAmountToFloat(vUsd, SYSTEM_PRECISION).toFixed();\n }\n\n async getAmountToBeWithdrawn(\n amount: string,\n accountAddress: string,\n token: TokenWithChainDetails,\n provider?: Provider\n ): Promise<string> {\n validateAmountGtZero(amount);\n validateAmountDecimals(\"amount\", amount, token.decimals);\n const pool = await this.getPoolInfoFromChain(token, provider);\n const tokenAmountInSP = vUsdToWithdrawalAmount(amount);\n const tokenAmount = fromSystemPrecision(tokenAmountInSP, token.decimals);\n const userBalanceInfo = await this.getUserBalanceInfo(accountAddress, token, provider);\n const earned = userBalanceInfo.earned(pool) || \"0\";\n const commonAmount = Big(tokenAmount).plus(earned).toFixed();\n return convertIntAmountToFloat(commonAmount, token.decimals).toFixed();\n }\n\n async getUserBalanceInfo(\n accountAddress: string,\n token: TokenWithChainDetails,\n provider?: Provider\n ): Promise<UserBalanceInfo> {\n return getChainPoolService(\n token.chainSymbol,\n this.api,\n this.nodeRpcUrlsConfig,\n this.params,\n provider\n ).getUserBalanceInfo(accountAddress, token);\n }\n\n async getPoolInfoFromChain(token: TokenWithChainDetails, provider?: Provider): Promise<PoolInfo> {\n const poolKey: PoolKeyObject = { chainSymbol: token.chainSymbol, poolAddress: token.poolAddress };\n const fromCache = this.cache.get(poolKey);\n if (fromCache) {\n return fromCache;\n } else {\n const poolInfo = await getChainPoolService(\n token.chainSymbol,\n this.api,\n this.nodeRpcUrlsConfig,\n this.params,\n provider\n ).getPoolInfoFromChain(token);\n this.cache.put(poolKey, poolInfo);\n this.api.cachePut({ chainSymbol: token.chainSymbol, poolAddress: token.poolAddress }, poolInfo);\n return poolInfo;\n }\n }\n}\n\nexport function getChainPoolService(\n chainSymbol: string,\n api: AllbridgeCoreClient,\n nodeRpcUrlsConfig: NodeRpcUrlsConfig,\n params: AllbridgeCoreSdkOptions,\n provider?: Provider\n): ChainPoolService {\n switch (Chains.getChainProperty(chainSymbol).chainType) {\n case ChainType.EVM: {\n if (provider) {\n return new EvmPoolService(provider as EssentialWeb3, api);\n } else {\n const nodeRpcUrl = nodeRpcUrlsConfig.getNodeRpcUrl(chainSymbol);\n const web3 = new Web3(nodeRpcUrl);\n web3.defaultReturnFormat = { number: FMT_NUMBER.STR, bytes: FMT_BYTES.HEX };\n return new EvmPoolService(web3, api);\n }\n }\n case ChainType.TRX: {\n const nodeRpcUrl = nodeRpcUrlsConfig.getNodeRpcUrl(chainSymbol);\n const tronJsonRpc = params.tronJsonRpc;\n if (provider) {\n return new TronPoolService(provider as TronWeb, api, tronJsonRpc);\n } else {\n const tronWeb = new TronWeb({ fullHost: nodeRpcUrl });\n return new TronPoolService(tronWeb, api, tronJsonRpc);\n }\n }\n case ChainType.SOLANA: {\n const nodeRpcUrl = nodeRpcUrlsConfig.getNodeRpcUrl(chainSymbol);\n return new SolanaPoolService(nodeRpcUrl, api);\n }\n case ChainType.SRB: {\n return new SrbPoolService(nodeRpcUrlsConfig, params, api);\n }\n case ChainType.SUI: {\n return new SuiPoolService(nodeRpcUrlsConfig.getNodeRpcUrl(chainSymbol), api);\n }\n }\n}\n", "import { Big } from \"big.js\";\nimport { convertFloatAmountToInt, getD } from \"../../../utils/calculation\";\nimport { SYSTEM_PRECISION } from \"../../../utils/calculation/constants\";\n\nexport function depositAmountToVUsd(\n amount: string,\n aValue: string,\n dValue: string,\n tokenBalance: string,\n vUsdBalance: string\n): string {\n const amountSP = convertFloatAmountToInt(amount, SYSTEM_PRECISION);\n const amountSPBig = Big(amountSP);\n\n const oldD = Big(dValue);\n const oldBalance = Big(tokenBalance).plus(vUsdBalance);\n\n let newTokenBalance;\n let newVUsdBalance;\n\n if (oldD.eq(0) || oldBalance.eq(0)) {\n const halfAmount = amountSPBig.div(2);\n newTokenBalance = Big(tokenBalance).plus(halfAmount);\n newVUsdBalance = Big(vUsdBalance).plus(halfAmount);\n } else {\n newTokenBalance = Big(tokenBalance).plus(amountSPBig.mul(tokenBalance).div(oldBalance));\n newVUsdBalance = Big(vUsdBalance).plus(amountSPBig.mul(vUsdBalance).div(oldBalance));\n }\n const newD = Big(getD(aValue, newTokenBalance.toFixed(), newVUsdBalance.toFixed()));\n return newD.minus(oldD).toFixed();\n}\n\nexport function vUsdToWithdrawalAmount(lpAmount: string): string {\n const lpAmountSP = convertFloatAmountToInt(lpAmount, SYSTEM_PRECISION);\n return Big(lpAmountSP).round().toFixed();\n}\n", "import { Contract, Web3 } from \"web3\";\nimport { ChainType } from \"../../../chains/chain.enums\";\nimport { AllbridgeCoreClient } from \"../../../client/core-api/core-client-base\";\nimport { PoolInfo, TokenWithChainDetails } from \"../../../tokens-info\";\nimport { calculatePoolInfoImbalance } from \"../../../utils/calculation\";\nimport { promiseWithTimeout, promiseWithTimeoutAndRetries } from \"../../../utils/utils\";\nimport { EssentialWeb3, RawTransaction } from \"../../models\";\nimport Pool from \"../../models/abi/Pool\";\nimport {\n ChainPoolService,\n LiquidityPoolsParams,\n LiquidityPoolsParamsWithAmount,\n UserBalance,\n UserBalanceInfo,\n} from \"../models\";\n\nexport class EvmPoolService extends ChainPoolService {\n chainType: ChainType.EVM = ChainType.EVM;\n private P = 52;\n\n constructor(\n public web3: EssentialWeb3,\n public api: AllbridgeCoreClient\n ) {\n super();\n }\n\n async getUserBalanceInfo(accountAddress: string, token: TokenWithChainDetails): Promise<UserBalanceInfo> {\n let userBalanceInfo;\n try {\n userBalanceInfo = await promiseWithTimeout(\n this.getUserBalanceInfoByBatch(accountAddress, token),\n `Cannot get UserBalanceInfo for ${token.name} on ${token.chainSymbol}`,\n 5000\n );\n } catch (ignoreError) {\n userBalanceInfo = await promiseWithTimeoutAndRetries(\n () => this.getUserBalanceInfoPerProperty(accountAddress, token),\n `Cannot get UserBalanceInfo for ${token.name} on ${token.chainSymbol}`,\n 5,\n 2000\n );\n }\n return userBalanceInfo;\n }\n\n async getPoolInfoFromChain(token: TokenWithChainDetails): Promise<PoolInfo> {\n let poolInfo;\n try {\n poolInfo = await promiseWithTimeout(\n this.getPoolInfoByBatch(token),\n `Cannot get PoolInfo for ${token.name} on ${token.chainSymbol}`,\n 5000\n );\n } catch (ignoreError) {\n poolInfo = await promiseWithTimeoutAndRetries(\n () => this.getPoolInfoPerProperty(token),\n `Cannot get PoolInfo for ${token.name} on ${token.chainSymbol}`,\n 5,\n 2000\n );\n }\n return poolInfo;\n }\n\n private async getUserBalanceInfoByBatch(\n accountAddress: string,\n token: TokenWithChainDetails\n ): Promise<UserBalanceInfo> {\n const batch = new this.web3.eth.BatchRequest();\n const poolContract = this.getPoolContract(token.poolAddress);\n\n const userRewardDebtAbi = poolContract.methods.userRewardDebt(accountAddress).encodeABI();\n const balanceOfAbi = poolContract.methods.balanceOf(accountAddress).encodeABI();\n\n batch.add({\n method: \"eth_call\",\n params: [{ to: token.poolAddress, data: userRewardDebtAbi }, \"latest\"],\n });\n batch.add({\n method: \"eth_call\",\n params: [{ to: token.poolAddress, data: balanceOfAbi }, \"latest\"],\n });\n\n const [rewardDebtResult, lpAmountResult] = await batch.execute();\n\n if (rewardDebtResult && lpAmountResult && !rewardDebtResult.error && !lpAmountResult.error) {\n return new UserBalance({\n lpAmount: Web3.utils.toBigInt(lpAmountResult.result).toString(),\n rewardDebt: Web3.utils.toBigInt(rewardDebtResult.result).toString(),\n });\n }\n throw new Error(\"Batched failed\");\n }\n\n private async getUserBalanceInfoPerProperty(\n accountAddress: string,\n token: TokenWithChainDetails\n ): Promise<UserBalanceInfo> {\n const rewardDebt = (\n await this.getPoolContract(token.poolAddress).methods.userRewardDebt(accountAddress).call()\n ).toString();\n const lpAmount = (\n await this.getPoolContract(token.poolAddress).methods.balanceOf(accountAddress).call()\n ).toString();\n return new UserBalance({ lpAmount, rewardDebt });\n }\n\n private async getPoolInfoByBatch(token: TokenWithChainDetails): Promise<PoolInfo> {\n const batch = new this.web3.eth.BatchRequest();\n const poolContract = this.getPoolContract(token.poolAddress);\n\n const aAbi = poolContract.methods.a().encodeABI();\n const dAbi = poolContract.methods.d().encodeABI();\n const tokenBalanceAbi = poolContract.methods.tokenBalance().encodeABI();\n const vUsdBalanceAbi = poolContract.methods.vUsdBalance().encodeABI();\n const totalSupplyAbi = poolContract.methods.totalSupply().encodeABI();\n const accRewardPerSharePAbi = poolContract.methods.accRewardPerShareP().encodeABI();\n\n batch.add({\n method: \"eth_call\",\n params: [{ to: token.poolAddress, data: aAbi }, \"latest\"],\n });\n batch.add({\n method: \"eth_call\",\n params: [{ to: token.poolAddress, data: dAbi }, \"latest\"],\n });\n batch.add({\n method: \"eth_call\",\n params: [{ to: token.poolAddress, data: tokenBalanceAbi }, \"latest\"],\n });\n batch.add({\n method: \"eth_call\",\n params: [{ to: token.poolAddress, data: vUsdBalanceAbi }, \"latest\"],\n });\n batch.add({\n method: \"eth_call\",\n params: [{ to: token.poolAddress, data: totalSupplyAbi }, \"latest\"],\n });\n batch.add({\n method: \"eth_call\",\n params: [{ to: token.poolAddress, data: accRewardPerSharePAbi }, \"latest\"],\n });\n\n const [aResult, dResult, tokenBalanceResult, vUsdBalanceResult, totalSupplyResult, accRewardPerSharePResult] =\n await batch.execute();\n\n if (\n aResult &&\n dResult &&\n tokenBalanceResult &&\n vUsdBalanceResult &&\n totalSupplyResult &&\n accRewardPerSharePResult &&\n !aResult.error &&\n !dResult.error &&\n !tokenBalanceResult.error &&\n !vUsdBalanceResult.error &&\n !totalSupplyResult.error &&\n !accRewardPerSharePResult.error\n ) {\n const tokenBalanceStr = Web3.utils.toBigInt(tokenBalanceResult.result).toString();\n const vUsdBalanceStr = Web3.utils.toBigInt(vUsdBalanceResult.result).toString();\n const imbalance = calculatePoolInfoImbalance({ tokenBalance: tokenBalanceStr, vUsdBalance: vUsdBalanceStr });\n return {\n aValue: Web3.utils.toBigInt(aResult.result).toString(),\n dValue: Web3.utils.toBigInt(dResult.result).toString(),\n tokenBalance: tokenBalanceStr,\n vUsdBalance: vUsdBalanceStr,\n totalLpAmount: Web3.utils.toBigInt(totalSupplyResult.result).toString(),\n accRewardPerShareP: Web3.utils.toBigInt(accRewardPerSharePResult.result).toString(),\n p: this.P,\n imbalance,\n };\n }\n throw new Error(\"Batched failed\");\n }\n\n private async getPoolInfoPerProperty(token: TokenWithChainDetails): Promise<PoolInfo> {\n const poolContract = this.getPoolContract(token.poolAddress);\n\n const aValue = (await poolContract.methods.a().call()).toString();\n const dValue = (await poolContract.methods.d().call()).toString();\n const tokenBalance = (await poolContract.methods.tokenBalance().call()).toString();\n const vUsdBalance = (await poolContract.methods.vUsdBalance().call()).toString();\n const totalLpAmount = (await poolContract.methods.totalSupply().call()).toString();\n const accRewardPerShareP = (await poolContract.methods.accRewardPerShareP().call()).toString();\n\n const imbalance = calculatePoolInfoImbalance({ tokenBalance, vUsdBalance });\n\n return {\n aValue,\n dValue,\n tokenBalance,\n vUsdBalance,\n totalLpAmount,\n accRewardPerShareP,\n p: this.P,\n imbalance,\n };\n }\n\n async buildRawTransactionDeposit(params: LiquidityPoolsParamsWithAmount): Promise<RawTransaction> {\n return Promise.resolve({\n ...this.buildTxParams(params),\n data: this.getPoolContract(params.token.poolAddress).methods.deposit(params.amount).encodeABI(),\n });\n }\n\n async buildRawTransactionWithdraw(params: LiquidityPoolsParamsWithAmount): Promise<RawTransaction> {\n return Promise.resolve({\n ...this.buildTxParams(params),\n data: this.getPoolContract(params.token.poolAddress).methods.withdraw(params.amount).encodeABI(),\n });\n }\n\n async buildRawTransactionClaimRewards(params: LiquidityPoolsParams): Promise<RawTransaction> {\n return Promise.resolve({\n ...this.buildTxParams(params),\n data: this.getPoolContract(params.token.poolAddress).methods.claimRewards().encodeABI(),\n });\n }\n\n buildTxParams(params: LiquidityPoolsParams) {\n return {\n from: params.accountAddress,\n to: params.token.poolAddress,\n value: \"0\",\n };\n }\n\n private getPoolContract(contractAddress: string) {\n return new this.web3.eth.Contract(Pool.abi, contractAddress) as Contract<typeof Pool.abi>;\n }\n}\n", "const artifact = {\n abi: [\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"_router\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"_a\",\n type: \"uint256\",\n },\n {\n internalType: \"contract ERC20\",\n name: \"_token\",\n type: \"address\",\n },\n {\n internalType: \"uint16\",\n name: \"_feeShareBP\",\n type: \"uint16\",\n },\n {\n internalType: \"uint256\",\n name: \"_balanceRatioMinBP\",\n type: \"uint256\",\n },\n {\n internalType: \"string\",\n name: \"lpName\",\n type: \"string\",\n },\n {\n internalType: \"string\",\n name: \"lpSymbol\",\n type: \"string\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"constructor\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"owner\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"spender\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"value\",\n type: \"uint256\",\n },\n ],\n name: \"Approval\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"user\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n ],\n name: \"Deposit\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"previousOwner\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"newOwner\",\n type: \"address\",\n },\n ],\n name: \"OwnershipTransferred\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"user\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n ],\n name: \"RewardsClaimed\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"address\",\n name: \"recipient\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"address\",\n name: \"token\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"vUsdAmount\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"fee\",\n type: \"uint256\",\n },\n ],\n name: \"SwappedFromVUsd\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"address\",\n name: \"sender\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"address\",\n name: \"token\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"vUsdAmount\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"fee\",\n type: \"uint256\",\n },\n ],\n name: \"SwappedToVUsd\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"from\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"value\",\n type: \"uint256\",\n },\n ],\n name: \"Transfer\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"user\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n ],\n name: \"Withdraw\",\n type: \"event\",\n },\n {\n stateMutability: \"payable\",\n type: \"fallback\",\n },\n {\n inputs: [],\n name: \"a\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"accRewardPerShareP\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"adjustTotalLpAmount\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"adminFeeAmount\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"adminFeeShareBP\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"owner\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"spender\",\n type: \"address\",\n },\n ],\n name: \"allowance\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"spender\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n ],\n name: \"approve\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"account\",\n type: \"address\",\n },\n ],\n name: \"balanceOf\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"balanceRatioMinBP\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"canDeposit\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"canWithdraw\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"claimAdminFee\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"claimRewards\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"d\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"decimals\",\n outputs: [\n {\n internalType: \"uint8\",\n name: \"\",\n type: \"uint8\",\n },\n ],\n stateMutability: \"pure\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"spender\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"subtractedValue\",\n type: \"uint256\",\n },\n ],\n name: \"decreaseAllowance\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n ],\n name: \"deposit\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"feeShareBP\",\n outputs: [\n {\n internalType: \"uint16\",\n name: \"\",\n type: \"uint16\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"getPrice\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"x\",\n type: \"uint256\",\n },\n ],\n name: \"getY\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"spender\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"addedValue\",\n type: \"uint256\",\n },\n ],\n name: \"increaseAllowance\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"name\",\n outputs: [\n {\n internalType: \"string\",\n name: \"\",\n type: \"string\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"owner\",\n outputs: [\n {\n internalType: \"address\",\n name: \"\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"user\",\n type: \"address\",\n },\n ],\n name: \"pendingReward\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"renounceOwnership\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"reserves\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"router\",\n outputs: [\n {\n internalType: \"address\",\n name: \"\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"_adminFeeShareBP\",\n type: \"uint256\",\n },\n ],\n name: \"setAdminFeeShare\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"_balanceRatioMinBP\",\n type: \"uint256\",\n },\n ],\n name: \"setBalanceRatioMinBP\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint16\",\n name: \"_feeShareBP\",\n type: \"uint16\",\n },\n ],\n name: \"setFeeShare\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"_router\",\n type: \"address\",\n },\n ],\n name: \"setRouter\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"_stopAuthority\",\n type: \"address\",\n },\n ],\n name: \"setStopAuthority\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"startDeposit\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"startWithdraw\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"stopDeposit\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"stopWithdraw\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"user\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"receiveAmountMin\",\n type: \"uint256\",\n },\n {\n internalType: \"bool\",\n name: \"zeroFee\",\n type: \"bool\",\n },\n ],\n name: \"swapFromVUsd\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"user\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n {\n internalType: \"bool\",\n name: \"zeroFee\",\n type: \"bool\",\n },\n ],\n name: \"swapToVUsd\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"symbol\",\n outputs: [\n {\n internalType: \"string\",\n name: \"\",\n type: \"string\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"token\",\n outputs: [\n {\n internalType: \"contract ERC20\",\n name: \"\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"tokenBalance\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"totalSupply\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n ],\n name: \"transfer\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"from\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n ],\n name: \"transferFrom\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"newOwner\",\n type: \"address\",\n },\n ],\n name: \"transferOwnership\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"user\",\n type: \"address\",\n },\n ],\n name: \"userRewardDebt\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"vUsdBalance\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"amountLp\",\n type: \"uint256\",\n },\n ],\n name: \"withdraw\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n stateMutability: \"payable\",\n type: \"receive\",\n },\n ],\n} as const;\nexport default artifact;\n", "import { Big } from \"big.js\";\nimport { FeePaymentMethod, TxFeeParams } from \"../../../models\";\nimport { PoolInfo, TokenWithChainDetails } from \"../../../tokens-info\";\nimport { convertIntAmountToFloat, getEarned } from \"../../../utils/calculation\";\nimport { SYSTEM_PRECISION } from \"../../../utils/calculation/constants\";\n\nexport interface ApproveParams {\n /**\n * The token info\n */\n token: TokenWithChainDetails;\n\n /**\n * The address of the token owner who is granting permission to use tokens\n */\n owner: string;\n\n /**\n * The integer amount of tokens to approve.\n * Optional.\n * The maximum amount by default.\n */\n amount?: string | number | Big;\n}\n\nexport interface GetAllowanceParams {\n token: TokenWithChainDetails;\n owner: string;\n gasFeePaymentMethod?: FeePaymentMethod;\n}\n\nexport type GetAllowanceParamsDto = GetAllowanceParams;\n\nexport interface CheckAllowanceParams extends GetAllowanceParams {\n /**\n * The float amount of tokens to check the allowance.\n */\n amount: string | number | Big;\n}\n\nexport interface LiquidityPoolsParams {\n /**\n * The account address to operate tokens with.\n */\n accountAddress: string;\n /**\n * {@link TokenWithChainDetails |The token info object} of operation token.\n */\n token: TokenWithChainDetails;\n\n txFeeParams?: TxFeeParams;\n}\n\nexport interface LiquidityPoolsParamsWithAmount extends LiquidityPoolsParams {\n /**\n * The float amount of tokens.\n */\n amount: string;\n}\n\nexport interface UserBalanceInfoDTO {\n lpAmount: string;\n rewardDebt: string;\n}\n\nexport interface UserBalanceInfo extends UserBalanceInfoDTO {\n userLiquidity: string;\n\n earned(poolInfo: PoolInfo, decimals?: number): string;\n}\n\nexport class UserBalance implements UserBalanceInfo {\n lpAmount: string;\n rewardDebt: string;\n\n constructor(userInfo: UserBalanceInfoDTO) {\n this.lpAmount = userInfo.lpAmount;\n this.rewardDebt = userInfo.rewardDebt;\n }\n\n get userLiquidity(): string {\n return convertIntAmountToFloat(this.lpAmount, SYSTEM_PRECISION).toFixed();\n }\n\n earned(poolInfo: PoolInfo, decimals?: number): string {\n const earned = getEarned(this.lpAmount, this.rewardDebt, poolInfo.accRewardPerShareP, poolInfo.p);\n if (decimals) {\n return convertIntAmountToFloat(earned, decimals).toFixed();\n }\n return earned;\n }\n}\n", "import { ChainType } from \"../../../chains/chain.enums\";\nimport { AllbridgeCoreClient } from \"../../../client/core-api/core-client-base\";\nimport { PoolInfo, TokenWithChainDetails } from \"../../../tokens-info\";\nimport { RawTransaction } from \"../../models\";\nimport { LiquidityPoolsParams, LiquidityPoolsParamsWithAmount, UserBalanceInfo } from \"./pool.model\";\n\nexport abstract class ChainPoolService {\n abstract chainType: ChainType;\n abstract api: AllbridgeCoreClient;\n\n abstract getUserBalanceInfo(accountAddress: string, token: TokenWithChainDetails): Promise<UserBalanceInfo>;\n\n abstract getPoolInfoFromChain(token: TokenWithChainDetails): Promise<PoolInfo>;\n\n abstract buildRawTransactionDeposit(params: LiquidityPoolsParamsWithAmount): Promise<RawTransaction>;\n\n abstract buildRawTransactionWithdraw(params: LiquidityPoolsParamsWithAmount): Promise<RawTransaction>;\n\n abstract buildRawTransactionClaimRewards(params: LiquidityPoolsParams): Promise<RawTransaction>;\n}\n", "import { NodeRpcUrlsConfig } from \"..\";\nimport { AllbridgeCoreClient } from \"../../client/core-api/core-client-base\";\nimport { AllbridgeCoreSdkOptions } from \"../../index\";\nimport { convertFloatAmountToInt } from \"../../utils/calculation\";\nimport { SYSTEM_PRECISION } from \"../../utils/calculation/constants\";\nimport { validateAmountDecimals, validateAmountGtZero } from \"../../utils/utils\";\nimport { Provider, RawTransaction } from \"../models\";\nimport { TokenService } from \"../token\";\nimport { ApproveParams, LiquidityPoolsParams, LiquidityPoolsParamsWithAmount } from \"./models\";\nimport { getChainPoolService } from \"./index\";\n\nexport interface RawPoolTransactionBuilder {\n /**\n * Creates a Raw Transaction for approving tokens usage by the bridge\n * @param provider - will be used to access the network\n * @param approveData\n */\n approve(provider: Provider, approveData: ApproveParams): Promise<RawTransaction>;\n /**\n * Creates a Raw Transaction for approving tokens usage by the bridge\n * @param approveData\n */\n approve(approveData: ApproveParams): Promise<RawTransaction>;\n\n /**\n * Creates a Raw Transaction for depositing tokens to Liquidity pools\n * @param params\n * @param provider - will be used to access the network\n */\n deposit(params: LiquidityPoolsParamsWithAmount, provider?: Provider): Promise<RawTransaction>;\n\n /**\n * Creates a Raw Transaction for withdrawing tokens from Liquidity pools\n * @param params\n * @param provider - will be used to access the network\n */\n withdraw(params: LiquidityPoolsParamsWithAmount, provider?: Provider): Promise<RawTransaction>;\n\n /**\n * Creates a Raw Transaction for claiming rewards from Liquidity pools\n * @param params\n * @param provider - will be used to access the network\n */\n claimRewards(params: LiquidityPoolsParams, provider?: Provider): Promise<RawTransaction>;\n}\n\nexport class DefaultRawPoolTransactionBuilder implements RawPoolTransactionBuilder {\n constructor(\n private api: AllbridgeCoreClient,\n private nodeRpcUrlsConfig: NodeRpcUrlsConfig,\n private params: AllbridgeCoreSdkOptions,\n private tokenService: TokenService\n ) {}\n\n async approve(a: Provider | ApproveParams, b?: ApproveParams): Promise<RawTransaction> {\n if (b) {\n const provider = a as Provider;\n const approveData: ApproveParams = b;\n return this.tokenService.buildRawTransactionApprove(\n {\n ...approveData,\n spender: approveData.token.poolAddress,\n },\n provider\n );\n } else {\n const approveData: ApproveParams = a as ApproveParams;\n return this.tokenService.buildRawTransactionApprove({\n ...approveData,\n spender: approveData.token.poolAddress,\n });\n }\n }\n\n async deposit(params: LiquidityPoolsParamsWithAmount, provider?: Provider): Promise<RawTransaction> {\n validateAmountGtZero(params.amount);\n validateAmountDecimals(\"amount\", params.amount, params.token.decimals);\n params.amount = convertFloatAmountToInt(params.amount, params.token.decimals).toFixed();\n return getChainPoolService(\n params.token.chainSymbol,\n this.api,\n this.nodeRpcUrlsConfig,\n this.params,\n provider\n ).buildRawTransactionDeposit(params);\n }\n\n async withdraw(params: LiquidityPoolsParamsWithAmount, provider?: Provider): Promise<RawTransaction> {\n validateAmountGtZero(params.amount);\n validateAmountDecimals(\"amount\", params.amount, params.token.decimals);\n params.amount = convertFloatAmountToInt(params.amount, SYSTEM_PRECISION).toFixed();\n return getChainPoolService(\n params.token.chainSymbol,\n this.api,\n this.nodeRpcUrlsConfig,\n this.params,\n provider\n ).buildRawTransactionWithdraw(params);\n }\n\n async claimRewards(params: LiquidityPoolsParams, provider?: Provider): Promise<RawTransaction> {\n return getChainPoolService(\n params.token.chainSymbol,\n this.api,\n this.nodeRpcUrlsConfig,\n this.params,\n provider\n ).buildRawTransactionClaimRewards(params);\n }\n}\n", "import { AnchorProvider, BN, Program, Provider, Spl, web3 } from \"@project-serum/anchor\";\nimport { Connection, PublicKey, TransactionInstruction } from \"@solana/web3.js\";\nimport { ChainType } from \"../../../chains/chain.enums\";\nimport { AllbridgeCoreClient } from \"../../../client/core-api/core-client-base\";\nimport { PoolInfo, TokenWithChainDetails } from \"../../../tokens-info\";\nimport { calculatePoolInfoImbalance } from \"../../../utils/calculation\";\nimport { RawTransaction } from \"../../models\";\nimport { Bridge as BridgeType, IDL as bridgeIdl } from \"../../models/sol/types/bridge\";\nimport { getTokenAccountData } from \"../../utils/sol\";\nimport {\n getAssociatedAccount,\n getAuthorityAccount,\n getBridgeTokenAccount,\n getConfigAccount,\n getUserDepositAccount,\n} from \"../../utils/sol/accounts\";\nimport { addUnitLimitAndUnitPriceToTx } from \"../../utils/sol/compute-budget\";\nimport { LiquidityPoolsParams, LiquidityPoolsParamsWithAmount, UserBalance, UserBalanceInfo } from \"../models\";\nimport { ChainPoolService } from \"../models/pool\";\n\ninterface LPAccounts {\n mint: PublicKey;\n user: PublicKey;\n config: PublicKey;\n pool: PublicKey;\n bridgeAuthority: PublicKey;\n userDeposit: PublicKey;\n userToken: PublicKey;\n bridgeToken: PublicKey;\n}\n\ninterface LPTransactionData {\n accounts: LPAccounts;\n preInstructions: TransactionInstruction[];\n}\n\nexport class SolanaPoolService extends ChainPoolService {\n chainType: ChainType.SOLANA = ChainType.SOLANA;\n private P = 48;\n\n constructor(\n public solanaRpcUrl: string,\n public api: AllbridgeCoreClient\n ) {\n super();\n }\n\n async getUserBalanceInfo(accountAddress: string, token: TokenWithChainDetails): Promise<UserBalanceInfo> {\n const provider = this.buildAnchorProvider(accountAddress);\n const bridge = this.getBridge(token.bridgeAddress, provider);\n const poolAccount = new PublicKey(token.poolAddress);\n const poolAccountInfo = await bridge.account.pool.fetch(poolAccount);\n try {\n const userDepositAccount = await getUserDepositAccount(\n new PublicKey(accountAddress),\n poolAccountInfo.mint,\n bridge.programId\n );\n const { lpAmount, rewardDebt } = await bridge.account.userDeposit.fetch(userDepositAccount);\n return new UserBalance({\n lpAmount: lpAmount.toString(),\n rewardDebt: rewardDebt.toString(),\n });\n } catch (ignoreError) {\n return new UserBalance({ lpAmount: \"0\", rewardDebt: \"0\" });\n }\n }\n\n async getPoolInfoFromChain(token: TokenWithChainDetails): Promise<PoolInfo> {\n const provider = this.buildAnchorProvider(token.bridgeAddress);\n const pool = await this.getBridge(token.bridgeAddress, provider).account.pool.fetch(token.poolAddress);\n const vUsdBalance = pool.vUsdBalance.toString();\n const tokenBalance = pool.tokenBalance.toString();\n const imbalance = calculatePoolInfoImbalance({ tokenBalance, vUsdBalance });\n return {\n dValue: pool.d.toString(),\n aValue: pool.a.toString(),\n totalLpAmount: pool.totalLpAmount.toString(),\n vUsdBalance,\n tokenBalance,\n accRewardPerShareP: pool.accRewardPerShareP.toString(),\n p: this.P,\n imbalance,\n };\n }\n\n async buildRawTransactionDeposit(params: LiquidityPoolsParamsWithAmount): Promise<RawTransaction> {\n const { bridge, accounts, preInstructions } = await this.prepareDataForTransaction(params);\n\n const tx = await bridge.methods\n .deposit(new BN(params.amount))\n .accounts(accounts)\n .preInstructions(preInstructions)\n .transaction();\n tx.recentBlockhash = (\n await this.buildAnchorProvider(params.accountAddress).connection.getLatestBlockhash()\n ).blockhash;\n tx.feePayer = new PublicKey(params.accountAddress);\n await addUnitLimitAndUnitPriceToTx(tx, params.txFeeParams, this.solanaRpcUrl);\n return tx;\n }\n\n async buildRawTransactionWithdraw(params: LiquidityPoolsParamsWithAmount): Promise<RawTransaction> {\n const { bridge, accounts, preInstructions } = await this.prepareDataForTransaction(params);\n\n const tx = await bridge.methods\n .withdraw(new BN(params.amount))\n .accounts(accounts)\n .preInstructions(preInstructions)\n .transaction();\n tx.recentBlockhash = (\n await this.buildAnchorProvider(params.accountAddress).connection.getLatestBlockhash()\n ).blockhash;\n tx.feePayer = new PublicKey(params.accountAddress);\n await addUnitLimitAndUnitPriceToTx(tx, params.txFeeParams, this.solanaRpcUrl);\n return tx;\n }\n\n async buildRawTransactionClaimRewards(params: LiquidityPoolsParams): Promise<RawTransaction> {\n const { bridge, accounts, preInstructions } = await this.prepareDataForTransaction(params);\n\n const tx = await bridge.methods.claimRewards().accounts(accounts).preInstructions(preInstructions).transaction();\n tx.recentBlockhash = (\n await this.buildAnchorProvider(params.accountAddress).connection.getLatestBlockhash()\n ).blockhash;\n tx.feePayer = new PublicKey(params.accountAddress);\n await addUnitLimitAndUnitPriceToTx(tx, params.txFeeParams, this.solanaRpcUrl);\n return tx;\n }\n\n private async prepareDataForTransaction(params: LiquidityPoolsParams) {\n const provider = this.buildAnchorProvider(params.accountAddress);\n const bridge = this.getBridge(params.token.bridgeAddress, provider);\n\n const { accounts, preInstructions } = await this._getLPTransactionData(\n bridge,\n params.token.poolAddress,\n params.accountAddress,\n provider\n );\n return { bridge, accounts, preInstructions };\n }\n\n private getBridge(bridgeAddress: string, provider: Provider): Program<BridgeType> {\n return new Program<BridgeType>(bridgeIdl, bridgeAddress, provider);\n }\n\n private buildAnchorProvider(accountAddress: string): Provider {\n const connection = new Connection(this.solanaRpcUrl, \"confirmed\");\n\n const publicKey = new PublicKey(accountAddress);\n\n return new AnchorProvider(\n connection,\n // @ts-expect-error enough wallet for fetch actions\n { publicKey: publicKey },\n {\n preflightCommitment: \"confirmed\",\n commitment: \"confirmed\",\n }\n );\n }\n\n private async _getLPTransactionData(\n bridge: Program<BridgeType>,\n poolAddress: string,\n account: string,\n provider: Provider\n ): Promise<LPTransactionData> {\n const user = new PublicKey(account);\n const configAccount = await getConfigAccount(bridge.programId);\n const bridgeAuthority = await getAuthorityAccount(bridge.programId);\n const poolAccount = new PublicKey(poolAddress);\n const poolAccountInfo = await bridge.account.pool.fetch(poolAccount);\n const tokenMintAccount = poolAccountInfo.mint;\n const userToken = await getAssociatedAccount(user, tokenMintAccount);\n const bridgeTokenAccount = await getBridgeTokenAccount(tokenMintAccount, bridge.programId);\n const userDepositAccount = await getUserDepositAccount(user, tokenMintAccount, bridge.programId);\n\n const preInstructions: TransactionInstruction[] = [\n web3.ComputeBudgetProgram.setComputeUnitLimit({\n units: 1000000,\n }),\n ];\n\n try {\n await getTokenAccountData(userToken, provider);\n } catch (ignoreError) {\n const associatedProgram = Spl.associatedToken(provider);\n const createUserTokenInstruction: TransactionInstruction = await associatedProgram.methods\n .create()\n .accounts({\n mint: tokenMintAccount,\n owner: user,\n associatedAccount: userToken,\n })\n .instruction();\n preInstructions.push(createUserTokenInstruction);\n }\n\n try {\n await bridge.account.userDeposit.fetch(userDepositAccount);\n } catch (ignoreError) {\n const instruction: TransactionInstruction = await bridge.methods\n .initDepositAccount()\n .accounts({\n mint: tokenMintAccount,\n user,\n userDeposit: userDepositAccount,\n })\n .instruction();\n preInstructions.push(instruction);\n }\n\n const accounts: LPAccounts = {\n mint: tokenMintAccount,\n user,\n config: configAccount,\n pool: poolAccount,\n bridgeAuthority: bridgeAuthority,\n userDeposit: userDepositAccount,\n userToken,\n bridgeToken: bridgeTokenAccount,\n };\n\n return { accounts, preInstructions };\n }\n}\n", "import { contract } from \"@stellar/stellar-sdk\";\nimport { AllbridgeCoreClient } from \"../../../client/core-api/core-client-base\";\nimport { AllbridgeCoreSdkOptions, ChainSymbol, ChainType } from \"../../../index\";\nimport {\n LiquidityPoolsParams,\n LiquidityPoolsParamsWithAmount,\n PoolInfo,\n SdkError,\n TokenWithChainDetails,\n UserBalanceInfo,\n} from \"../../../models\";\nimport { calculatePoolInfoImbalance } from \"../../../utils/calculation\";\nimport { NodeRpcUrlsConfig } from \"../../index\";\nimport { RawTransaction } from \"../../models\";\nimport { PoolContract } from \"../../models/srb/pool-contract\";\nimport { getViewResultSoroban, isErrorSorobanResult } from \"../../models/srb/utils\";\nimport { ChainPoolService, UserBalance } from \"../models\";\nimport ContractClientOptions = contract.ClientOptions;\n\nexport class SrbPoolService extends ChainPoolService {\n chainType: ChainType.SRB = ChainType.SRB;\n private P = 48;\n\n constructor(\n readonly nodeRpcUrlsConfig: NodeRpcUrlsConfig,\n readonly params: AllbridgeCoreSdkOptions,\n readonly api: AllbridgeCoreClient\n ) {\n super();\n }\n\n async getUserBalanceInfo(accountAddress: string, token: TokenWithChainDetails): Promise<UserBalanceInfo> {\n const poolContract = this.getContract(token.poolAddress);\n const result = await poolContract.get_user_deposit({ user: accountAddress });\n if (isErrorSorobanResult(result)) {\n throw new SdkError();\n }\n const viewResultSoroban = getViewResultSoroban(result);\n if (!viewResultSoroban) {\n throw new SdkError();\n }\n\n const userDeposit = viewResultSoroban.unwrap();\n return new UserBalance({\n lpAmount: userDeposit.lp_amount.toString(),\n rewardDebt: userDeposit.reward_debt.toString(),\n });\n }\n\n async getPoolInfoFromChain(token: TokenWithChainDetails): Promise<PoolInfo> {\n const poolContract = this.getContract(token.poolAddress);\n const result = await poolContract.get_pool();\n if (isErrorSorobanResult(result)) {\n throw new SdkError();\n }\n const viewResultSoroban = getViewResultSoroban(result);\n if (!viewResultSoroban) {\n throw new SdkError();\n }\n\n const pool = viewResultSoroban.unwrap();\n return {\n aValue: pool.a.toString(),\n accRewardPerShareP: pool.acc_reward_per_share_p.toString(),\n dValue: pool.d.toString(),\n tokenBalance: pool.token_balance.toString(),\n p: this.P,\n totalLpAmount: pool.total_lp_amount.toString(),\n vUsdBalance: pool.v_usd_balance.toString(),\n imbalance: calculatePoolInfoImbalance({\n tokenBalance: pool.token_balance.toString(),\n vUsdBalance: pool.v_usd_balance.toString(),\n }),\n };\n }\n\n async buildRawTransactionDeposit(params: LiquidityPoolsParamsWithAmount): Promise<RawTransaction> {\n const poolContract = this.getContract(params.token.poolAddress, params.accountAddress);\n return (\n await poolContract.deposit({\n sender: params.accountAddress,\n amount: BigInt(params.amount),\n })\n ).toXDR();\n }\n\n async buildRawTransactionWithdraw(params: LiquidityPoolsParamsWithAmount): Promise<RawTransaction> {\n const poolContract = this.getContract(params.token.poolAddress, params.accountAddress);\n return (\n await poolContract.withdraw({\n sender: params.accountAddress,\n amount_lp: BigInt(params.amount),\n })\n ).toXDR();\n }\n\n async buildRawTransactionClaimRewards(params: LiquidityPoolsParams): Promise<RawTransaction> {\n const poolContract = this.getContract(params.token.poolAddress, params.accountAddress);\n return (\n await poolContract.claim_rewards({\n sender: params.accountAddress,\n })\n ).toXDR();\n }\n\n private getContract(address: string, sender?: string): PoolContract {\n const config: ContractClientOptions = {\n publicKey: sender,\n contractId: address,\n networkPassphrase: this.params.sorobanNetworkPassphrase,\n rpcUrl: this.nodeRpcUrlsConfig.getNodeRpcUrl(ChainSymbol.SRB),\n };\n return new PoolContract(config);\n }\n}\n", "import { contract } from \"@stellar/stellar-sdk\";\nimport u128 = contract.u128;\nimport u32 = contract.u32;\nimport AssembledTransaction = contract.AssembledTransaction;\nimport Result = contract.Result;\nimport ContractSpec = contract.Spec;\nimport ContractClient = contract.Client;\nimport ContractClientOptions = contract.ClientOptions;\n\nexport interface SwappedFromVUsd {\n amount: u128;\n fee: u128;\n recipient: string;\n token: string;\n vusd_amount: u128;\n}\n\nexport interface SwappedToVUsd {\n amount: u128;\n fee: u128;\n sender: string;\n token: string;\n vusd_amount: u128;\n}\n\nexport interface Deposit {\n amount: u128;\n user: string;\n}\n\nexport interface Withdraw {\n amount: u128;\n user: string;\n}\n\nexport interface RewardsClaimed {\n amount: u128;\n user: string;\n}\n\nexport type Bridge = readonly [string];\nexport interface DataKey {\n tag: \"UserDeposit\";\n values: readonly [string];\n}\n\nexport interface Pool {\n a: u128;\n acc_reward_per_share_p: u128;\n admin_fee_amount: u128;\n admin_fee_share_bp: u128;\n balance_ratio_min_bp: u128;\n can_deposit: boolean;\n can_withdraw: boolean;\n d: u128;\n decimals: u32;\n fee_share_bp: u128;\n reserves: u128;\n token: string;\n token_balance: u128;\n total_lp_amount: u128;\n v_usd_balance: u128;\n}\n\nexport interface UserDeposit {\n lp_amount: u128;\n reward_debt: u128;\n}\n\nexport type Admin = readonly [string];\nexport type GasOracleAddress = readonly [string];\nexport type GasUsage = readonly [Map<u32, u128>];\nexport type NativeToken = readonly [string];\nexport type StopAuthority = readonly [string];\nexport const Errors = {\n 0: { message: \"\" },\n 1: { message: \"\" },\n 2: { message: \"\" },\n 3: { message: \"\" },\n 4: { message: \"\" },\n 5: { message: \"\" },\n 6: { message: \"\" },\n 7: { message: \"\" },\n 8: { message: \"\" },\n 9: { message: \"\" },\n 10: { message: \"\" },\n 11: { message: \"\" },\n 12: { message: \"\" },\n 103: { message: \"\" },\n 104: { message: \"\" },\n 105: { message: \"\" },\n 106: { message: \"\" },\n 107: { message: \"\" },\n 108: { message: \"\" },\n 109: { message: \"\" },\n 203: { message: \"\" },\n 204: { message: \"\" },\n 205: { message: \"\" },\n 206: { message: \"\" },\n 207: { message: \"\" },\n 208: { message: \"\" },\n 209: { message: \"\" },\n 210: { message: \"\" },\n 211: { message: \"\" },\n 212: { message: \"\" },\n 214: { message: \"\" },\n 215: { message: \"\" },\n 216: { message: \"\" },\n 217: { message: \"\" },\n 218: { message: \"\" },\n 300: { message: \"\" },\n 301: { message: \"\" },\n 302: { message: \"\" },\n 303: { message: \"\" },\n 400: { message: \"\" },\n};\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging\nexport interface PoolContract {\n /**\n * Construct and simulate a initialize transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n initialize: (\n {\n admin,\n bridge,\n a,\n token,\n fee_share_bp,\n balance_ratio_min_bp,\n admin_fee_share_bp,\n }: {\n admin: string;\n bridge: string;\n a: u128;\n token: string;\n fee_share_bp: u128;\n balance_ratio_min_bp: u128;\n admin_fee_share_bp: u128;\n },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a deposit transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n deposit: (\n { sender, amount }: { sender: string; amount: u128 },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a withdraw transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n withdraw: (\n { sender, amount_lp }: { sender: string; amount_lp: u128 },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a swap_to_v_usd transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n swap_to_v_usd: (\n { user, amount, zero_fee }: { user: string; amount: u128; zero_fee: boolean },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<u128>>>;\n\n /**\n * Construct and simulate a swap_from_v_usd transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n swap_from_v_usd: (\n {\n user,\n vusd_amount,\n receive_amount_min,\n zero_fee,\n }: {\n user: string;\n vusd_amount: u128;\n receive_amount_min: u128;\n zero_fee: boolean;\n },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<u128>>>;\n\n /**\n * Construct and simulate a claim_rewards transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n claim_rewards: (\n { sender }: { sender: string },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a set_fee_share transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. *\n * `admin`\n */\n set_fee_share: (\n { fee_share_bp }: { fee_share_bp: u128 },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a adjust_total_lp_amount transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n adjust_total_lp_amount: (options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a set_balance_ratio_min_bp transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n set_balance_ratio_min_bp: (\n { balance_ratio_min_bp }: { balance_ratio_min_bp: u128 },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a stop_deposit transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n stop_deposit: (options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a start_deposit transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n start_deposit: (options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a stop_withdraw transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n stop_withdraw: (options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a start_withdraw transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n start_withdraw: (options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a set_stop_authority transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n set_stop_authority: (\n { stop_authority }: { stop_authority: string },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a set_bridge transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n set_bridge: (\n { bridge }: { bridge: string },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a set_admin transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n set_admin: (\n { new_admin }: { new_admin: string },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a set_admin_fee_share transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n set_admin_fee_share: (\n { admin_fee_share_bp }: { admin_fee_share_bp: u128 },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a claim_admin_fee transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n claim_admin_fee: (options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a pending_reward transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. *\n * `view`\n */\n pending_reward: (\n { user }: { user: string },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<u128>>>;\n\n /**\n * Construct and simulate a get_pool transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n get_pool: (options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }) => Promise<AssembledTransaction<Result<Pool>>>;\n\n /**\n * Construct and simulate a get_admin transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n get_admin: (options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }) => Promise<AssembledTransaction<Result<string>>>;\n\n /**\n * Construct and simulate a get_stop_authority transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n get_stop_authority: (options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }) => Promise<AssembledTransaction<Result<string>>>;\n\n /**\n * Construct and simulate a get_bridge transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n get_bridge: (options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }) => Promise<AssembledTransaction<Result<string>>>;\n\n /**\n * Construct and simulate a get_user_deposit transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n get_user_deposit: (\n { user }: { user: string },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<UserDeposit>>>;\n\n /**\n * Construct and simulate a upgrade transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n upgrade: (\n { new_wasm_hash }: { new_wasm_hash: Buffer },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n}\n// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging\nexport class PoolContract extends ContractClient {\n constructor(public readonly options: ContractClientOptions) {\n super(\n new ContractSpec([\n \"AAAAAAAAAAAAAAAKaW5pdGlhbGl6ZQAAAAAABwAAAAAAAAAFYWRtaW4AAAAAAAATAAAAAAAAAAZicmlkZ2UAAAAAABMAAAAAAAAAAWEAAAAAAAAKAAAAAAAAAAV0b2tlbgAAAAAAABMAAAAAAAAADGZlZV9zaGFyZV9icAAAAAoAAAAAAAAAFGJhbGFuY2VfcmF0aW9fbWluX2JwAAAACgAAAAAAAAASYWRtaW5fZmVlX3NoYXJlX2JwAAAAAAAKAAAAAQAAA+kAAAPtAAAAAAAAAAM=\",\n \"AAAAAAAAAAAAAAAHZGVwb3NpdAAAAAACAAAAAAAAAAZzZW5kZXIAAAAAABMAAAAAAAAABmFtb3VudAAAAAAACgAAAAEAAAPpAAAD7QAAAAAAAAAD\",\n \"AAAAAAAAAAAAAAAId2l0aGRyYXcAAAACAAAAAAAAAAZzZW5kZXIAAAAAABMAAAAAAAAACWFtb3VudF9scAAAAAAAAAoAAAABAAAD6QAAA+0AAAAAAAAAAw==\",\n \"AAAAAAAAAAAAAAANc3dhcF90b192X3VzZAAAAAAAAAMAAAAAAAAABHVzZXIAAAATAAAAAAAAAAZhbW91bnQAAAAAAAoAAAAAAAAACHplcm9fZmVlAAAAAQAAAAEAAAPpAAAACgAAAAM=\",\n \"AAAAAAAAAAAAAAAPc3dhcF9mcm9tX3ZfdXNkAAAAAAQAAAAAAAAABHVzZXIAAAATAAAAAAAAAAt2dXNkX2Ftb3VudAAAAAAKAAAAAAAAABJyZWNlaXZlX2Ftb3VudF9taW4AAAAAAAoAAAAAAAAACHplcm9fZmVlAAAAAQAAAAEAAAPpAAAACgAAAAM=\",\n \"AAAAAAAAAAAAAAANY2xhaW1fcmV3YXJkcwAAAAAAAAEAAAAAAAAABnNlbmRlcgAAAAAAEwAAAAEAAAPpAAAD7QAAAAAAAAAD\",\n \"AAAAAAAAAAdgYWRtaW5gAAAAAA1zZXRfZmVlX3NoYXJlAAAAAAAAAQAAAAAAAAAMZmVlX3NoYXJlX2JwAAAACgAAAAEAAAPpAAAD7QAAAAAAAAAD\",\n \"AAAAAAAAAAAAAAAWYWRqdXN0X3RvdGFsX2xwX2Ftb3VudAAAAAAAAAAAAAEAAAPpAAAD7QAAAAAAAAAD\",\n \"AAAAAAAAAAAAAAAYc2V0X2JhbGFuY2VfcmF0aW9fbWluX2JwAAAAAQAAAAAAAAAUYmFsYW5jZV9yYXRpb19taW5fYnAAAAAKAAAAAQAAA+kAAAPtAAAAAAAAAAM=\",\n \"AAAAAAAAAAAAAAAMc3RvcF9kZXBvc2l0AAAAAAAAAAEAAAPpAAAD7QAAAAAAAAAD\",\n \"AAAAAAAAAAAAAAANc3RhcnRfZGVwb3NpdAAAAAAAAAAAAAABAAAD6QAAA+0AAAAAAAAAAw==\",\n \"AAAAAAAAAAAAAAANc3RvcF93aXRoZHJhdwAAAAAAAAAAAAABAAAD6QAAA+0AAAAAAAAAAw==\",\n \"AAAAAAAAAAAAAAAOc3RhcnRfd2l0aGRyYXcAAAAAAAAAAAABAAAD6QAAA+0AAAAAAAAAAw==\",\n \"AAAAAAAAAAAAAAASc2V0X3N0b3BfYXV0aG9yaXR5AAAAAAABAAAAAAAAAA5zdG9wX2F1dGhvcml0eQAAAAAAEwAAAAEAAAPpAAAD7QAAAAAAAAAD\",\n \"AAAAAAAAAAAAAAAKc2V0X2JyaWRnZQAAAAAAAQAAAAAAAAAGYnJpZGdlAAAAAAATAAAAAQAAA+kAAAPtAAAAAAAAAAM=\",\n \"AAAAAAAAAAAAAAAJc2V0X2FkbWluAAAAAAAAAQAAAAAAAAAJbmV3X2FkbWluAAAAAAAAEwAAAAEAAAPpAAAD7QAAAAAAAAAD\",\n \"AAAAAAAAAAAAAAATc2V0X2FkbWluX2ZlZV9zaGFyZQAAAAABAAAAAAAAABJhZG1pbl9mZWVfc2hhcmVfYnAAAAAAAAoAAAABAAAD6QAAA+0AAAAAAAAAAw==\",\n \"AAAAAAAAAAAAAAAPY2xhaW1fYWRtaW5fZmVlAAAAAAAAAAABAAAD6QAAA+0AAAAAAAAAAw==\",\n \"AAAAAAAAAAZgdmlld2AAAAAAAA5wZW5kaW5nX3Jld2FyZAAAAAAAAQAAAAAAAAAEdXNlcgAAABMAAAABAAAD6QAAAAoAAAAD\",\n \"AAAAAAAAAAAAAAAIZ2V0X3Bvb2wAAAAAAAAAAQAAA+kAAAfQAAAABFBvb2wAAAAD\",\n \"AAAAAAAAAAAAAAAJZ2V0X2FkbWluAAAAAAAAAAAAAAEAAAPpAAAAEwAAAAM=\",\n \"AAAAAAAAAAAAAAASZ2V0X3N0b3BfYXV0aG9yaXR5AAAAAAAAAAAAAQAAA+kAAAATAAAAAw==\",\n \"AAAAAAAAAAAAAAAKZ2V0X2JyaWRnZQAAAAAAAAAAAAEAAAPpAAAAEwAAAAM=\",\n \"AAAAAAAAAAAAAAAQZ2V0X3VzZXJfZGVwb3NpdAAAAAEAAAAAAAAABHVzZXIAAAATAAAAAQAAA+kAAAfQAAAAC1VzZXJEZXBvc2l0AAAAAAM=\",\n \"AAAAAAAAAAAAAAAHdXBncmFkZQAAAAABAAAAAAAAAA1uZXdfd2FzbV9oYXNoAAAAAAAD7gAAACAAAAABAAAD6QAAA+0AAAAAAAAAAw==\",\n \"AAAAAQAAAAAAAAAAAAAAD1N3YXBwZWRGcm9tVlVzZAAAAAAFAAAAAAAAAAZhbW91bnQAAAAAAAoAAAAAAAAAA2ZlZQAAAAAKAAAAAAAAAAlyZWNpcGllbnQAAAAAAAATAAAAAAAAAAV0b2tlbgAAAAAAABMAAAAAAAAAC3Z1c2RfYW1vdW50AAAAAAo=\",\n \"AAAAAQAAAAAAAAAAAAAADVN3YXBwZWRUb1ZVc2QAAAAAAAAFAAAAAAAAAAZhbW91bnQAAAAAAAoAAAAAAAAAA2ZlZQAAAAAKAAAAAAAAAAZzZW5kZXIAAAAAABMAAAAAAAAABXRva2VuAAAAAAAAEwAAAAAAAAALdnVzZF9hbW91bnQAAAAACg==\",\n \"AAAAAQAAAAAAAAAAAAAAB0RlcG9zaXQAAAAAAgAAAAAAAAAGYW1vdW50AAAAAAAKAAAAAAAAAAR1c2VyAAAAEw==\",\n \"AAAAAQAAAAAAAAAAAAAACFdpdGhkcmF3AAAAAgAAAAAAAAAGYW1vdW50AAAAAAAKAAAAAAAAAAR1c2VyAAAAEw==\",\n \"AAAAAQAAAAAAAAAAAAAADlJld2FyZHNDbGFpbWVkAAAAAAACAAAAAAAAAAZhbW91bnQAAAAAAAoAAAAAAAAABHVzZXIAAAAT\",\n \"AAAAAQAAAAAAAAAAAAAABkJyaWRnZQAAAAAAAQAAAAAAAAABMAAAAAAAABM=\",\n \"AAAAAgAAAAAAAAAAAAAAB0RhdGFLZXkAAAAAAQAAAAEAAAAAAAAAC1VzZXJEZXBvc2l0AAAAAAEAAAAT\",\n \"AAAAAQAAAAAAAAAAAAAABFBvb2wAAAAPAAAAAAAAAAFhAAAAAAAACgAAAAAAAAAWYWNjX3Jld2FyZF9wZXJfc2hhcmVfcAAAAAAACgAAAAAAAAAQYWRtaW5fZmVlX2Ftb3VudAAAAAoAAAAAAAAAEmFkbWluX2ZlZV9zaGFyZV9icAAAAAAACgAAAAAAAAAUYmFsYW5jZV9yYXRpb19taW5fYnAAAAAKAAAAAAAAAAtjYW5fZGVwb3NpdAAAAAABAAAAAAAAAAxjYW5fd2l0aGRyYXcAAAABAAAAAAAAAAFkAAAAAAAACgAAAAAAAAAIZGVjaW1hbHMAAAAEAAAAAAAAAAxmZWVfc2hhcmVfYnAAAAAKAAAAAAAAAAhyZXNlcnZlcwAAAAoAAAAAAAAABXRva2VuAAAAAAAAEwAAAAAAAAANdG9rZW5fYmFsYW5jZQAAAAAAAAoAAAAAAAAAD3RvdGFsX2xwX2Ftb3VudAAAAAAKAAAAAAAAAA12X3VzZF9iYWxhbmNlAAAAAAAACg==\",\n \"AAAAAQAAAAAAAAAAAAAAC1VzZXJEZXBvc2l0AAAAAAIAAAAAAAAACWxwX2Ftb3VudAAAAAAAAAoAAAAAAAAAC3Jld2FyZF9kZWJ0AAAAAAo=\",\n \"AAAAAQAAAAAAAAAAAAAABUFkbWluAAAAAAAAAQAAAAAAAAABMAAAAAAAABM=\",\n \"AAAAAQAAAAAAAAAAAAAAEEdhc09yYWNsZUFkZHJlc3MAAAABAAAAAAAAAAEwAAAAAAAAEw==\",\n \"AAAAAQAAAAAAAAAAAAAACEdhc1VzYWdlAAAAAQAAAAAAAAABMAAAAAAAA+wAAAAEAAAACg==\",\n \"AAAAAQAAAAAAAAAAAAAAC05hdGl2ZVRva2VuAAAAAAEAAAAAAAAAATAAAAAAAAAT\",\n \"AAAAAQAAAAAAAAAAAAAADVN0b3BBdXRob3JpdHkAAAAAAAABAAAAAAAAAAEwAAAAAAAAEw==\",\n \"AAAABAAAAAAAAAAAAAAABUVycm9yAAAAAAAAKAAAAAAAAAANVW5pbXBsZW1lbnRlZAAAAAAAAAAAAAAAAAAAC0luaXRpYWxpemVkAAAAAAEAAAAAAAAADVVuaW5pdGlhbGl6ZWQAAAAAAAACAAAAAAAAAAxVbmF1dGhvcml6ZWQAAAADAAAAAAAAAApJbnZhbGlkQXJnAAAAAAAEAAAAAAAAAA5JbnZhbGlkQ2hhaW5JZAAAAAAABQAAAAAAAAATSW52YWxpZE90aGVyQ2hhaW5JZAAAAAAGAAAAAAAAAA5HYXNVc2FnZU5vdFNldAAAAAAABwAAAAAAAAANQnJva2VuQWRkcmVzcwAAAAAAAAgAAAAAAAAACE5vdEZvdW5kAAAACQAAAAAAAAAYVG9rZW5JbnN1ZmZpY2llbnRCYWxhbmNlAAAACgAAAAAAAAAKQ2FzdEZhaWxlZAAAAAAACwAAAAAAAAAMVTI1Nk92ZXJmbG93AAAADAAAAAAAAAAKWmVyb0Ftb3VudAAAAAAAZwAAAAAAAAAMUG9vbE92ZXJmbG93AAAAaAAAAAAAAAALWmVyb0NoYW5nZXMAAAAAaQAAAAAAAAARUmVzZXJ2ZXNFeGhhdXN0ZWQAAAAAAABqAAAAAAAAABpJbnN1ZmZpY2llbnRSZWNlaXZlZEFtb3VudAAAAAAAawAAAAAAAAAUQmFsYW5jZVJhdGlvRXhjZWVkZWQAAABsAAAAAAAAAAlGb3JiaWRkZW4AAAAAAABtAAAAAAAAABlVbmF1dGhvcml6ZWRTdG9wQXV0aG9yaXR5AAAAAAAAywAAAAAAAAAOU3dhcFByb2hpYml0ZWQAAAAAAMwAAAAAAAAAEkFtb3VudFRvb0xvd0ZvckZlZQAAAAAAzQAAAAAAAAAWQnJpZGdlVG9UaGVaZXJvQWRkcmVzcwAAAAAAzgAAAAAAAAAORW1wdHlSZWNpcGllbnQAAAAAAM8AAAAAAAAAE1NvdXJjZU5vdFJlZ2lzdGVyZWQAAAAA0AAAAAAAAAAVV3JvbmdEZXN0aW5hdGlvbkNoYWluAAAAAAAA0QAAAAAAAAATVW5rbm93bkFub3RoZXJDaGFpbgAAAADSAAAAAAAAABFUb2tlbnNBbHJlYWR5U2VudAAAAAAAANMAAAAAAAAAEE1lc3NhZ2VQcm9jZXNzZWQAAADUAAAAAAAAAAxOb3RFbm91Z2hGZWUAAADWAAAAAAAAAAlOb01lc3NhZ2UAAAAAAADXAAAAAAAAAA1Ob1JlY2VpdmVQb29sAAAAAAAA2AAAAAAAAAAGTm9Qb29sAAAAAADZAAAAAAAAABNVbmtub3duQW5vdGhlclRva2VuAAAAANoAAAAAAAAAD1dyb25nQnl0ZUxlbmd0aAAAAAEsAAAAAAAAAApIYXNNZXNzYWdlAAAAAAEtAAAAAAAAABdJbnZhbGlkUHJpbWFyeVNpZ25hdHVyZQAAAAEuAAAAAAAAABlJbnZhbGlkU2Vjb25kYXJ5U2lnbmF0dXJlAAAAAAABLwAAAAAAAAARTm9HYXNEYXRhRm9yQ2hhaW4AAAAAAAGQ\",\n ]),\n options\n );\n }\n public readonly fromJSON = {\n initialize: this.txFromJSON<Result<void>>,\n deposit: this.txFromJSON<Result<void>>,\n withdraw: this.txFromJSON<Result<void>>,\n swap_to_v_usd: this.txFromJSON<Result<u128>>,\n swap_from_v_usd: this.txFromJSON<Result<u128>>,\n claim_rewards: this.txFromJSON<Result<void>>,\n set_fee_share: this.txFromJSON<Result<void>>,\n adjust_total_lp_amount: this.txFromJSON<Result<void>>,\n set_balance_ratio_min_bp: this.txFromJSON<Result<void>>,\n stop_deposit: this.txFromJSON<Result<void>>,\n start_deposit: this.txFromJSON<Result<void>>,\n stop_withdraw: this.txFromJSON<Result<void>>,\n start_withdraw: this.txFromJSON<Result<void>>,\n set_stop_authority: this.txFromJSON<Result<void>>,\n set_bridge: this.txFromJSON<Result<void>>,\n set_admin: this.txFromJSON<Result<void>>,\n set_admin_fee_share: this.txFromJSON<Result<void>>,\n claim_admin_fee: this.txFromJSON<Result<void>>,\n pending_reward: this.txFromJSON<Result<u128>>,\n get_pool: this.txFromJSON<Result<Pool>>,\n get_admin: this.txFromJSON<Result<string>>,\n get_stop_authority: this.txFromJSON<Result<string>>,\n get_bridge: this.txFromJSON<Result<string>>,\n get_user_deposit: this.txFromJSON<Result<UserDeposit>>,\n upgrade: this.txFromJSON<Result<void>>,\n };\n}\n", "import { contract, rpc } from \"@stellar/stellar-sdk\";\nimport Api = rpc.Api;\nimport AssembledTransaction = contract.AssembledTransaction;\nimport SentTransaction = contract.SentTransaction;\n\nexport function getViewResultSoroban<T>(assembledTx: AssembledTransaction<T>): T | undefined {\n const { simulation, options } = assembledTx;\n if (!simulation) {\n throw new Error(\"Soroban assembled transaction does not have simulation\");\n }\n\n if (Api.isSimulationSuccess(simulation)) {\n if (simulation.result == null) {\n return;\n }\n return options.parseResultXdr(simulation.result.retval);\n } else {\n throw new Error(simulation.error);\n }\n}\n\nexport function isErrorSorobanResult<T>(assembledTx: AssembledTransaction<T>): boolean {\n const { simulation } = assembledTx;\n if (!simulation) {\n throw new Error(\"Soroban assembled transaction does not have simulation\");\n }\n return Api.isSimulationError(simulation);\n}\n\nexport async function signAndSendSoroban<T>(assembledTx: AssembledTransaction<T>): Promise<SentTransaction<T>> {\n await assembledTx.simulate({ restore: true });\n return assembledTx.signAndSend();\n}\n", "import { SuiClient } from \"@mysten/sui/client\";\nimport { CoinStruct, SuiObjectResponse } from \"@mysten/sui/src/client/types/generated\";\nimport { Transaction, TransactionResult } from \"@mysten/sui/transactions\";\nimport { ChainType } from \"../../../chains/chain.enums\";\nimport { AllbridgeCoreClient } from \"../../../client/core-api/core-client-base\";\nimport { InvalidAmountError, SdkError } from \"../../../exceptions\";\nimport { PoolInfo, TokenWithChainDetails } from \"../../../tokens-info\";\nimport { calculatePoolInfoImbalance } from \"../../../utils/calculation\";\nimport { RawSuiTransaction } from \"../../models\";\nimport { phantom } from \"../../models/sui/_framework/reified\";\nimport { setAddress } from \"../../models/sui/bridge\";\nimport {\n claimReward,\n deposit,\n newUserDeposit,\n pool,\n withdraw,\n} from \"../../models/sui/bridge/bridge-interface/functions\";\nimport { Pool } from \"../../models/sui/bridge/pool/structs\";\nimport { UserDeposit } from \"../../models/sui/bridge/user-deposit/structs\";\nimport { getCoinsWithAmounts } from \"../../utils/sui/coins\";\nimport { fetchAllPagesRecursive } from \"../../utils/sui/paginated\";\nimport { suiView } from \"../../utils/sui/view\";\nimport {\n ChainPoolService,\n LiquidityPoolsParams,\n LiquidityPoolsParamsWithAmount,\n UserBalance,\n UserBalanceInfo,\n} from \"../models\";\n\nexport class SuiPoolService extends ChainPoolService {\n chainType: ChainType.SUI = ChainType.SUI;\n\n private readonly client: SuiClient;\n\n constructor(\n public suiRpcUrl: string,\n public api: AllbridgeCoreClient\n ) {\n super();\n this.client = new SuiClient({\n url: suiRpcUrl,\n });\n }\n\n async getUserBalanceInfo(accountAddress: string, token: TokenWithChainDetails): Promise<UserBalanceInfo> {\n if (!token.originTokenAddress) {\n throw new SdkError(\"SUI token must contain 'originTokenAddress'\");\n }\n const suiAddresses = token.suiAddresses;\n if (!suiAddresses) {\n throw new SdkError(\"SUI token must contain 'suiAddresses'\");\n }\n setAddress(suiAddresses.bridgeAddress, suiAddresses.bridgeAddressOrigin);\n\n const deposits = await this.fetchDeposits(accountAddress, token.originTokenAddress);\n const total = deposits.reduce(\n (total, element) => {\n if (element.data) {\n total.lpAmount += BigInt((element.data.content as any).fields.lp_amount);\n total.rewardDebt += BigInt((element.data.content as any).fields.reward_debt);\n return total;\n } else {\n throw new SdkError(\"Deposits fetch failed\");\n }\n },\n { lpAmount: BigInt(0), rewardDebt: BigInt(0) }\n );\n return new UserBalance({ lpAmount: total.lpAmount.toString(), rewardDebt: total.rewardDebt.toString() });\n }\n\n private async fetchDeposits(accountAddress: string, tokenAddress: string): Promise<SuiObjectResponse[]> {\n return await fetchAllPagesRecursive((cursor: string | null | undefined) =>\n this.client.getOwnedObjects({\n owner: accountAddress,\n filter: { StructType: UserDeposit.phantom(phantom(tokenAddress)).phantomType },\n options: { showContent: true },\n cursor,\n })\n );\n }\n\n async getPoolInfoFromChain(token: TokenWithChainDetails): Promise<PoolInfo> {\n const suiAddresses = token.suiAddresses;\n if (!suiAddresses) {\n throw new SdkError(\"SUI token must contain 'suiAddresses'\");\n }\n setAddress(suiAddresses.bridgeAddress, suiAddresses.bridgeAddressOrigin);\n\n if (!token.originTokenAddress) {\n throw new SdkError(\"SUI token must contain 'originTokenAddress'\");\n }\n\n const P = 48;\n const tx = new Transaction();\n pool(tx, token.originTokenAddress, suiAddresses.bridgeObjectAddress);\n const res = await suiView(this.client, tx, Pool.reified(phantom(token.originTokenAddress)));\n\n const tokenBalance = res.state.tokenBalance;\n const vUsdBalance = res.state.vusdBalance;\n const imbalance = calculatePoolInfoImbalance({ tokenBalance, vUsdBalance });\n\n return {\n dValue: res.state.d,\n aValue: res.state.a,\n totalLpAmount: res.rewards.lpSupply,\n vUsdBalance: vUsdBalance,\n tokenBalance: tokenBalance,\n accRewardPerShareP: res.rewards.accRewardPerShareP,\n p: P,\n imbalance,\n };\n }\n\n async buildRawTransactionDeposit(params: LiquidityPoolsParamsWithAmount): Promise<RawSuiTransaction> {\n const suiAddresses = params.token.suiAddresses;\n if (!suiAddresses) {\n throw new SdkError(\"SUI token must contain 'suiAddresses'\");\n }\n setAddress(suiAddresses.bridgeAddress, suiAddresses.bridgeAddressOrigin);\n\n if (!params.token.originTokenAddress) {\n throw new SdkError(\"SUI token must contain 'originTokenAddress'\");\n }\n const coins: CoinStruct[] = await fetchAllPagesRecursive((cursor: string | null | undefined) =>\n this.client.getCoins({\n owner: params.accountAddress,\n coinType: params.token.originTokenAddress,\n cursor,\n })\n );\n if (coins.length === 0 || !coins[0]) {\n throw new InvalidAmountError(\"No coins to deposit\");\n }\n const firstCoin = coins[0];\n\n const tx = new Transaction();\n tx.setSender(params.accountAddress);\n const { depositObj, isNewDeposit } = await this.getDepositObject(\n params.accountAddress,\n params.token.originTokenAddress,\n tx\n );\n const [amountCoin] = getCoinsWithAmounts([params.amount], coins, tx);\n if (!amountCoin) {\n throw new InvalidAmountError(\"No coins to deposit\");\n }\n if (!params.token.originTokenAddress) {\n throw new SdkError(\"SUI token must contain 'originTokenAddress'\");\n }\n const rewards = deposit(tx, params.token.originTokenAddress, {\n bridge: suiAddresses.bridgeObjectAddress,\n userDeposit: depositObj,\n coin: amountCoin,\n });\n tx.mergeCoins(firstCoin.coinObjectId, [rewards]);\n if (isNewDeposit) {\n tx.transferObjects([depositObj], params.accountAddress);\n }\n return await tx.toJSON({ client: this.client });\n }\n\n private async getDepositObject(\n accountAddress: string,\n tokenAddress: string,\n tx: Transaction\n ): Promise<{\n depositObj: string | TransactionResult;\n isNewDeposit: boolean;\n }> {\n const deposits = await this.fetchDeposits(accountAddress, tokenAddress);\n if (deposits.length === 0 || !deposits[0]) {\n const tokenType = phantom(tokenAddress).phantomType;\n const depositObj = newUserDeposit(tx, tokenType);\n return { depositObj, isNewDeposit: true };\n } else {\n if (deposits[0].data?.objectId) {\n return { depositObj: deposits[0].data.objectId, isNewDeposit: false };\n } else {\n throw new SdkError(\"Something went wrong while deposit\");\n }\n }\n }\n\n async buildRawTransactionWithdraw(params: LiquidityPoolsParamsWithAmount): Promise<RawSuiTransaction> {\n const suiAddresses = params.token.suiAddresses;\n if (!suiAddresses) {\n throw new SdkError(\"SUI token must contain 'suiAddresses'\");\n }\n setAddress(suiAddresses.bridgeAddress, suiAddresses.bridgeAddressOrigin);\n\n if (!params.token.originTokenAddress) {\n throw new SdkError(\"SUI token must contain 'originTokenAddress'\");\n }\n const tokenType = phantom(params.token.originTokenAddress).phantomType;\n\n const tx = new Transaction();\n tx.setSender(params.accountAddress);\n\n const { depositObj, isNewDeposit } = await this.getDepositObject(\n params.accountAddress,\n params.token.originTokenAddress,\n tx\n );\n if (isNewDeposit) {\n throw new InvalidAmountError(\"No deposit found\");\n }\n\n const rewards = withdraw(tx, tokenType, {\n bridge: suiAddresses.bridgeObjectAddress,\n userDeposit: depositObj,\n amountLp: BigInt(params.amount),\n });\n\n const coins: CoinStruct[] = await fetchAllPagesRecursive((cursor: string | null | undefined) =>\n this.client.getCoins({\n owner: params.accountAddress,\n coinType: params.token.originTokenAddress,\n cursor,\n })\n );\n\n if (!rewards[0] || !rewards[1]) {\n throw new SdkError(\"No rewards found\");\n }\n\n if (coins[0]) {\n tx.mergeCoins(coins[0].coinObjectId, [rewards[0], rewards[1]]);\n } else {\n tx.mergeCoins(rewards[0], [rewards[1]]);\n tx.transferObjects([rewards[0]], params.accountAddress);\n }\n return await tx.toJSON({ client: this.client });\n }\n\n async buildRawTransactionClaimRewards(params: LiquidityPoolsParams): Promise<RawSuiTransaction> {\n const suiAddresses = params.token.suiAddresses;\n if (!suiAddresses) {\n throw new SdkError(\"SUI token must contain 'suiAddresses'\");\n }\n setAddress(suiAddresses.bridgeAddress, suiAddresses.bridgeAddressOrigin);\n\n if (!params.token.originTokenAddress) {\n throw new SdkError(\"SUI token must contain 'originTokenAddress'\");\n }\n const tokenType = phantom(params.token.originTokenAddress).phantomType;\n\n const tx = new Transaction();\n tx.setSender(params.accountAddress);\n\n const { depositObj, isNewDeposit } = await this.getDepositObject(\n params.accountAddress,\n params.token.originTokenAddress,\n tx\n );\n if (isNewDeposit) {\n throw new InvalidAmountError(\"No deposit found\");\n }\n\n const reward = claimReward(tx, tokenType, {\n bridge: suiAddresses.bridgeObjectAddress,\n userDeposit: depositObj,\n });\n\n const coins: CoinStruct[] = await fetchAllPagesRecursive((cursor: string | null | undefined) =>\n this.client.getCoins({\n owner: params.accountAddress,\n coinType: params.token.originTokenAddress,\n cursor,\n })\n );\n\n if (coins[0]) {\n tx.mergeCoins(coins[0].coinObjectId, [reward]);\n } else {\n tx.transferObjects([reward], params.accountAddress);\n }\n return await tx.toJSON({ client: this.client });\n }\n}\n", "// @ts-nocheck\nimport {\n PhantomReified,\n PhantomToTypeStr,\n PhantomTypeArgument,\n Reified,\n StructClass,\n ToField,\n ToPhantomTypeArgument,\n ToTypeStr,\n assertFieldsWithTypesArgsMatch,\n assertReifiedTypeArgsMatch,\n decodeFromFields,\n decodeFromFieldsWithTypes,\n decodeFromJSONField,\n extractType,\n phantom,\n} from \"../../_framework/reified\";\nimport { FieldsWithTypes, composeSuiType, compressSuiType, parseTypeName } from \"../../_framework/util\";\nimport { Balance } from \"../../sui/balance/structs\";\nimport { UID } from \"../../sui/object/structs\";\nimport { PKG_V1 } from \"../index\";\nimport { PoolRewards } from \"../pool-rewards/structs\";\nimport { PoolState } from \"../pool-state/structs\";\nimport { bcs } from \"@mysten/sui/bcs\";\nimport { SuiClient, SuiObjectData, SuiParsedData } from \"@mysten/sui/client\";\nimport { fromB64 } from \"@mysten/sui/utils\";\n\n/* ============================== AdminCap =============================== */\n\nexport function isAdminCap(type: string): boolean {\n type = compressSuiType(type);\n return type === `${PKG_V1}::pool::AdminCap`;\n}\n\nexport interface AdminCapFields {\n id: ToField<UID>;\n}\n\nexport type AdminCapReified = Reified<AdminCap, AdminCapFields>;\n\nexport class AdminCap implements StructClass {\n __StructClass = true as const;\n\n static get $typeName() {\n return `${PKG_V1}::pool::AdminCap`;\n }\n static readonly $numTypeParams = 0;\n static readonly $isPhantom = [] as const;\n\n readonly $typeName = AdminCap.$typeName;\n readonly $fullTypeName: string;\n readonly $typeArgs: [];\n readonly $isPhantom = AdminCap.$isPhantom;\n\n readonly id: ToField<UID>;\n\n private constructor(typeArgs: [], fields: AdminCapFields) {\n this.$fullTypeName = composeSuiType(AdminCap.$typeName, ...typeArgs) as string;\n this.$typeArgs = typeArgs;\n\n this.id = fields.id;\n }\n\n static reified(): AdminCapReified {\n return {\n typeName: AdminCap.$typeName,\n fullTypeName: composeSuiType(AdminCap.$typeName, ...[]) as string,\n typeArgs: [] as [],\n isPhantom: AdminCap.$isPhantom,\n reifiedTypeArgs: [],\n fromFields: (fields: Record<string, any>) => AdminCap.fromFields(fields),\n fromFieldsWithTypes: (item: FieldsWithTypes) => AdminCap.fromFieldsWithTypes(item),\n fromBcs: (data: Uint8Array) => AdminCap.fromBcs(data),\n bcs: AdminCap.bcs,\n fromJSONField: (field: any) => AdminCap.fromJSONField(field),\n fromJSON: (json: Record<string, any>) => AdminCap.fromJSON(json),\n fromSuiParsedData: (content: SuiParsedData) => AdminCap.fromSuiParsedData(content),\n fromSuiObjectData: (content: SuiObjectData) => AdminCap.fromSuiObjectData(content),\n fetch: async (client: SuiClient, id: string) => AdminCap.fetch(client, id),\n new: (fields: AdminCapFields) => {\n return new AdminCap([], fields);\n },\n kind: \"StructClassReified\",\n };\n }\n\n static get r() {\n return AdminCap.reified();\n }\n\n static phantom(): PhantomReified<ToTypeStr<AdminCap>> {\n return phantom(AdminCap.reified());\n }\n static get p() {\n return AdminCap.phantom();\n }\n\n static get bcs() {\n return bcs.struct(\"AdminCap\", {\n id: UID.bcs,\n });\n }\n\n static fromFields(fields: Record<string, any>): AdminCap {\n return AdminCap.reified().new({\n id: decodeFromFields(UID.reified(), fields.id),\n });\n }\n\n static fromFieldsWithTypes(item: FieldsWithTypes): AdminCap {\n if (!isAdminCap(item.type)) {\n throw new Error(\"not a AdminCap type\");\n }\n\n return AdminCap.reified().new({\n id: decodeFromFieldsWithTypes(UID.reified(), item.fields.id),\n });\n }\n\n static fromBcs(data: Uint8Array): AdminCap {\n return AdminCap.fromFields(AdminCap.bcs.parse(data));\n }\n\n toJSONField() {\n return {\n id: this.id,\n };\n }\n\n toJSON() {\n return {\n $typeName: this.$typeName,\n $typeArgs: this.$typeArgs,\n ...this.toJSONField(),\n };\n }\n\n static fromJSONField(field: any): AdminCap {\n return AdminCap.reified().new({\n id: decodeFromJSONField(UID.reified(), field.id),\n });\n }\n\n static fromJSON(json: Record<string, any>): AdminCap {\n if (json.$typeName !== AdminCap.$typeName) {\n throw new Error(\"not a WithTwoGenerics json object\");\n }\n\n return AdminCap.fromJSONField(json);\n }\n\n static fromSuiParsedData(content: SuiParsedData): AdminCap {\n if (content.dataType !== \"moveObject\") {\n throw new Error(\"not an object\");\n }\n if (!isAdminCap(content.type)) {\n throw new Error(`object at ${(content.fields as any).id} is not a AdminCap object`);\n }\n return AdminCap.fromFieldsWithTypes(content);\n }\n\n static fromSuiObjectData(data: SuiObjectData): AdminCap {\n if (data.bcs) {\n if (data.bcs.dataType !== \"moveObject\" || !isAdminCap(data.bcs.type)) {\n throw new Error(`object at is not a AdminCap object`);\n }\n\n return AdminCap.fromBcs(fromB64(data.bcs.bcsBytes));\n }\n if (data.content) {\n return AdminCap.fromSuiParsedData(data.content);\n }\n throw new Error(\n \"Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.\"\n );\n }\n\n static async fetch(client: SuiClient, id: string): Promise<AdminCap> {\n const res = await client.getObject({ id, options: { showBcs: true } });\n if (res.error) {\n throw new Error(`error fetching AdminCap object at id ${id}: ${res.error.code}`);\n }\n if (res.data?.bcs?.dataType !== \"moveObject\" || !isAdminCap(res.data.bcs.type)) {\n throw new Error(`object at id ${id} is not a AdminCap object`);\n }\n\n return AdminCap.fromSuiObjectData(res.data);\n }\n}\n\n/* ============================== Pool =============================== */\n\nexport function isPool(type: string): boolean {\n type = compressSuiType(type);\n return type.startsWith(`${PKG_V1}::pool::Pool` + \"<\");\n}\n\nexport interface PoolFields<T extends PhantomTypeArgument> {\n id: ToField<UID>;\n state: ToField<PoolState<T>>;\n rewards: ToField<PoolRewards<T>>;\n feeShareBp: ToField<\"u64\">;\n canDeposit: ToField<\"bool\">;\n canWithdraw: ToField<\"bool\">;\n decimals: ToField<\"u8\">;\n balance: ToField<Balance<T>>;\n}\n\nexport type PoolReified<T extends PhantomTypeArgument> = Reified<Pool<T>, PoolFields<T>>;\n\nexport class Pool<T extends PhantomTypeArgument> implements StructClass {\n __StructClass = true as const;\n\n static get $typeName() {\n return `${PKG_V1}::pool::Pool`;\n }\n static readonly $numTypeParams = 1;\n static readonly $isPhantom = [true] as const;\n\n readonly $typeName = Pool.$typeName;\n readonly $fullTypeName: string;\n readonly $typeArgs: [PhantomToTypeStr<T>];\n readonly $isPhantom = Pool.$isPhantom;\n\n readonly id: ToField<UID>;\n readonly state: ToField<PoolState<T>>;\n readonly rewards: ToField<PoolRewards<T>>;\n readonly feeShareBp: ToField<\"u64\">;\n readonly canDeposit: ToField<\"bool\">;\n readonly canWithdraw: ToField<\"bool\">;\n readonly decimals: ToField<\"u8\">;\n readonly balance: ToField<Balance<T>>;\n\n private constructor(typeArgs: [PhantomToTypeStr<T>], fields: PoolFields<T>) {\n this.$fullTypeName = composeSuiType(Pool.$typeName, ...typeArgs) as string;\n this.$typeArgs = typeArgs;\n\n this.id = fields.id;\n this.state = fields.state;\n this.rewards = fields.rewards;\n this.feeShareBp = fields.feeShareBp;\n this.canDeposit = fields.canDeposit;\n this.canWithdraw = fields.canWithdraw;\n this.decimals = fields.decimals;\n this.balance = fields.balance;\n }\n\n static reified<T extends PhantomReified<PhantomTypeArgument>>(T: T): PoolReified<ToPhantomTypeArgument<T>> {\n return {\n typeName: Pool.$typeName,\n fullTypeName: composeSuiType(Pool.$typeName, ...[extractType(T)]) as string,\n typeArgs: [extractType(T)] as [PhantomToTypeStr<ToPhantomTypeArgument<T>>],\n isPhantom: Pool.$isPhantom,\n reifiedTypeArgs: [T],\n fromFields: (fields: Record<string, any>) => Pool.fromFields(T, fields),\n fromFieldsWithTypes: (item: FieldsWithTypes) => Pool.fromFieldsWithTypes(T, item),\n fromBcs: (data: Uint8Array) => Pool.fromBcs(T, data),\n bcs: Pool.bcs,\n fromJSONField: (field: any) => Pool.fromJSONField(T, field),\n fromJSON: (json: Record<string, any>) => Pool.fromJSON(T, json),\n fromSuiParsedData: (content: SuiParsedData) => Pool.fromSuiParsedData(T, content),\n fromSuiObjectData: (content: SuiObjectData) => Pool.fromSuiObjectData(T, content),\n fetch: async (client: SuiClient, id: string) => Pool.fetch(client, T, id),\n new: (fields: PoolFields<ToPhantomTypeArgument<T>>) => {\n return new Pool([extractType(T)], fields);\n },\n kind: \"StructClassReified\",\n };\n }\n\n static get r() {\n return Pool.reified;\n }\n\n static phantom<T extends PhantomReified<PhantomTypeArgument>>(\n T: T\n ): PhantomReified<ToTypeStr<Pool<ToPhantomTypeArgument<T>>>> {\n return phantom(Pool.reified(T));\n }\n static get p() {\n return Pool.phantom;\n }\n\n static get bcs() {\n return bcs.struct(\"Pool\", {\n id: UID.bcs,\n state: PoolState.bcs,\n rewards: PoolRewards.bcs,\n fee_share_bp: bcs.u64(),\n can_deposit: bcs.bool(),\n can_withdraw: bcs.bool(),\n decimals: bcs.u8(),\n balance: Balance.bcs,\n });\n }\n\n static fromFields<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n fields: Record<string, any>\n ): Pool<ToPhantomTypeArgument<T>> {\n return Pool.reified(typeArg).new({\n id: decodeFromFields(UID.reified(), fields.id),\n state: decodeFromFields(PoolState.reified(typeArg), fields.state),\n rewards: decodeFromFields(PoolRewards.reified(typeArg), fields.rewards),\n feeShareBp: decodeFromFields(\"u64\", fields.fee_share_bp),\n canDeposit: decodeFromFields(\"bool\", fields.can_deposit),\n canWithdraw: decodeFromFields(\"bool\", fields.can_withdraw),\n decimals: decodeFromFields(\"u8\", fields.decimals),\n balance: decodeFromFields(Balance.reified(typeArg), fields.balance),\n });\n }\n\n static fromFieldsWithTypes<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n item: FieldsWithTypes\n ): Pool<ToPhantomTypeArgument<T>> {\n if (!isPool(item.type)) {\n throw new Error(\"not a Pool type\");\n }\n assertFieldsWithTypesArgsMatch(item, [typeArg]);\n\n return Pool.reified(typeArg).new({\n id: decodeFromFieldsWithTypes(UID.reified(), item.fields.id),\n state: decodeFromFieldsWithTypes(PoolState.reified(typeArg), item.fields.state),\n rewards: decodeFromFieldsWithTypes(PoolRewards.reified(typeArg), item.fields.rewards),\n feeShareBp: decodeFromFieldsWithTypes(\"u64\", item.fields.fee_share_bp),\n canDeposit: decodeFromFieldsWithTypes(\"bool\", item.fields.can_deposit),\n canWithdraw: decodeFromFieldsWithTypes(\"bool\", item.fields.can_withdraw),\n decimals: decodeFromFieldsWithTypes(\"u8\", item.fields.decimals),\n balance: decodeFromFieldsWithTypes(Balance.reified(typeArg), item.fields.balance),\n });\n }\n\n static fromBcs<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n data: Uint8Array\n ): Pool<ToPhantomTypeArgument<T>> {\n return Pool.fromFields(typeArg, Pool.bcs.parse(data));\n }\n\n toJSONField() {\n return {\n id: this.id,\n state: this.state.toJSONField(),\n rewards: this.rewards.toJSONField(),\n feeShareBp: this.feeShareBp.toString(),\n canDeposit: this.canDeposit,\n canWithdraw: this.canWithdraw,\n decimals: this.decimals,\n balance: this.balance.toJSONField(),\n };\n }\n\n toJSON() {\n return {\n $typeName: this.$typeName,\n $typeArgs: this.$typeArgs,\n ...this.toJSONField(),\n };\n }\n\n static fromJSONField<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n field: any\n ): Pool<ToPhantomTypeArgument<T>> {\n return Pool.reified(typeArg).new({\n id: decodeFromJSONField(UID.reified(), field.id),\n state: decodeFromJSONField(PoolState.reified(typeArg), field.state),\n rewards: decodeFromJSONField(PoolRewards.reified(typeArg), field.rewards),\n feeShareBp: decodeFromJSONField(\"u64\", field.feeShareBp),\n canDeposit: decodeFromJSONField(\"bool\", field.canDeposit),\n canWithdraw: decodeFromJSONField(\"bool\", field.canWithdraw),\n decimals: decodeFromJSONField(\"u8\", field.decimals),\n balance: decodeFromJSONField(Balance.reified(typeArg), field.balance),\n });\n }\n\n static fromJSON<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n json: Record<string, any>\n ): Pool<ToPhantomTypeArgument<T>> {\n if (json.$typeName !== Pool.$typeName) {\n throw new Error(\"not a WithTwoGenerics json object\");\n }\n assertReifiedTypeArgsMatch(composeSuiType(Pool.$typeName, extractType(typeArg)), json.$typeArgs, [typeArg]);\n\n return Pool.fromJSONField(typeArg, json);\n }\n\n static fromSuiParsedData<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n content: SuiParsedData\n ): Pool<ToPhantomTypeArgument<T>> {\n if (content.dataType !== \"moveObject\") {\n throw new Error(\"not an object\");\n }\n if (!isPool(content.type)) {\n throw new Error(`object at ${(content.fields as any).id} is not a Pool object`);\n }\n return Pool.fromFieldsWithTypes(typeArg, content);\n }\n\n static fromSuiObjectData<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n data: SuiObjectData\n ): Pool<ToPhantomTypeArgument<T>> {\n if (data.bcs) {\n if (data.bcs.dataType !== \"moveObject\" || !isPool(data.bcs.type)) {\n throw new Error(`object at is not a Pool object`);\n }\n\n const gotTypeArgs = parseTypeName(data.bcs.type).typeArgs;\n if (gotTypeArgs.length !== 1) {\n throw new Error(`type argument mismatch: expected 1 type argument but got '${gotTypeArgs.length}'`);\n }\n const gotTypeArg = compressSuiType(gotTypeArgs[0]);\n const expectedTypeArg = compressSuiType(extractType(typeArg));\n if (gotTypeArg !== compressSuiType(extractType(typeArg))) {\n throw new Error(`type argument mismatch: expected '${expectedTypeArg}' but got '${gotTypeArg}'`);\n }\n\n return Pool.fromBcs(typeArg, fromB64(data.bcs.bcsBytes));\n }\n if (data.content) {\n return Pool.fromSuiParsedData(typeArg, data.content);\n }\n throw new Error(\n \"Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.\"\n );\n }\n\n static async fetch<T extends PhantomReified<PhantomTypeArgument>>(\n client: SuiClient,\n typeArg: T,\n id: string\n ): Promise<Pool<ToPhantomTypeArgument<T>>> {\n const res = await client.getObject({ id, options: { showBcs: true } });\n if (res.error) {\n throw new Error(`error fetching Pool object at id ${id}: ${res.error.code}`);\n }\n if (res.data?.bcs?.dataType !== \"moveObject\" || !isPool(res.data.bcs.type)) {\n throw new Error(`object at id ${id} is not a Pool object`);\n }\n\n return Pool.fromSuiObjectData(typeArg, res.data);\n }\n}\n\n/* ============================== StopCap =============================== */\n\nexport function isStopCap(type: string): boolean {\n type = compressSuiType(type);\n return type === `${PKG_V1}::pool::StopCap`;\n}\n\nexport interface StopCapFields {\n id: ToField<UID>;\n}\n\nexport type StopCapReified = Reified<StopCap, StopCapFields>;\n\nexport class StopCap implements StructClass {\n __StructClass = true as const;\n\n static get $typeName() {\n return `${PKG_V1}::pool::StopCap`;\n }\n static readonly $numTypeParams = 0;\n static readonly $isPhantom = [] as const;\n\n readonly $typeName = StopCap.$typeName;\n readonly $fullTypeName: string;\n readonly $typeArgs: [];\n readonly $isPhantom = StopCap.$isPhantom;\n\n readonly id: ToField<UID>;\n\n private constructor(typeArgs: [], fields: StopCapFields) {\n this.$fullTypeName = composeSuiType(StopCap.$typeName, ...typeArgs) as string;\n this.$typeArgs = typeArgs;\n\n this.id = fields.id;\n }\n\n static reified(): StopCapReified {\n return {\n typeName: StopCap.$typeName,\n fullTypeName: composeSuiType(StopCap.$typeName, ...[]) as string,\n typeArgs: [] as [],\n isPhantom: StopCap.$isPhantom,\n reifiedTypeArgs: [],\n fromFields: (fields: Record<string, any>) => StopCap.fromFields(fields),\n fromFieldsWithTypes: (item: FieldsWithTypes) => StopCap.fromFieldsWithTypes(item),\n fromBcs: (data: Uint8Array) => StopCap.fromBcs(data),\n bcs: StopCap.bcs,\n fromJSONField: (field: any) => StopCap.fromJSONField(field),\n fromJSON: (json: Record<string, any>) => StopCap.fromJSON(json),\n fromSuiParsedData: (content: SuiParsedData) => StopCap.fromSuiParsedData(content),\n fromSuiObjectData: (content: SuiObjectData) => StopCap.fromSuiObjectData(content),\n fetch: async (client: SuiClient, id: string) => StopCap.fetch(client, id),\n new: (fields: StopCapFields) => {\n return new StopCap([], fields);\n },\n kind: \"StructClassReified\",\n };\n }\n\n static get r() {\n return StopCap.reified();\n }\n\n static phantom(): PhantomReified<ToTypeStr<StopCap>> {\n return phantom(StopCap.reified());\n }\n static get p() {\n return StopCap.phantom();\n }\n\n static get bcs() {\n return bcs.struct(\"StopCap\", {\n id: UID.bcs,\n });\n }\n\n static fromFields(fields: Record<string, any>): StopCap {\n return StopCap.reified().new({\n id: decodeFromFields(UID.reified(), fields.id),\n });\n }\n\n static fromFieldsWithTypes(item: FieldsWithTypes): StopCap {\n if (!isStopCap(item.type)) {\n throw new Error(\"not a StopCap type\");\n }\n\n return StopCap.reified().new({\n id: decodeFromFieldsWithTypes(UID.reified(), item.fields.id),\n });\n }\n\n static fromBcs(data: Uint8Array): StopCap {\n return StopCap.fromFields(StopCap.bcs.parse(data));\n }\n\n toJSONField() {\n return {\n id: this.id,\n };\n }\n\n toJSON() {\n return {\n $typeName: this.$typeName,\n $typeArgs: this.$typeArgs,\n ...this.toJSONField(),\n };\n }\n\n static fromJSONField(field: any): StopCap {\n return StopCap.reified().new({\n id: decodeFromJSONField(UID.reified(), field.id),\n });\n }\n\n static fromJSON(json: Record<string, any>): StopCap {\n if (json.$typeName !== StopCap.$typeName) {\n throw new Error(\"not a WithTwoGenerics json object\");\n }\n\n return StopCap.fromJSONField(json);\n }\n\n static fromSuiParsedData(content: SuiParsedData): StopCap {\n if (content.dataType !== \"moveObject\") {\n throw new Error(\"not an object\");\n }\n if (!isStopCap(content.type)) {\n throw new Error(`object at ${(content.fields as any).id} is not a StopCap object`);\n }\n return StopCap.fromFieldsWithTypes(content);\n }\n\n static fromSuiObjectData(data: SuiObjectData): StopCap {\n if (data.bcs) {\n if (data.bcs.dataType !== \"moveObject\" || !isStopCap(data.bcs.type)) {\n throw new Error(`object at is not a StopCap object`);\n }\n\n return StopCap.fromBcs(fromB64(data.bcs.bcsBytes));\n }\n if (data.content) {\n return StopCap.fromSuiParsedData(data.content);\n }\n throw new Error(\n \"Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.\"\n );\n }\n\n static async fetch(client: SuiClient, id: string): Promise<StopCap> {\n const res = await client.getObject({ id, options: { showBcs: true } });\n if (res.error) {\n throw new Error(`error fetching StopCap object at id ${id}: ${res.error.code}`);\n }\n if (res.data?.bcs?.dataType !== \"moveObject\" || !isStopCap(res.data.bcs.type)) {\n throw new Error(`object at id ${id} is not a StopCap object`);\n }\n\n return StopCap.fromSuiObjectData(res.data);\n }\n}\n", "// @ts-nocheck\nimport {\n PhantomReified,\n PhantomToTypeStr,\n PhantomTypeArgument,\n Reified,\n StructClass,\n ToField,\n ToPhantomTypeArgument,\n ToTypeStr,\n assertFieldsWithTypesArgsMatch,\n assertReifiedTypeArgsMatch,\n decodeFromFields,\n decodeFromFieldsWithTypes,\n decodeFromJSONField,\n extractType,\n phantom,\n} from \"../../_framework/reified\";\nimport { FieldsWithTypes, composeSuiType, compressSuiType, parseTypeName } from \"../../_framework/util\";\nimport { PKG_V26 } from \"../index\";\nimport { bcs } from \"@mysten/sui/bcs\";\nimport { SuiClient, SuiObjectData, SuiParsedData } from \"@mysten/sui/client\";\nimport { fromB64 } from \"@mysten/sui/utils\";\n\n/* ============================== Balance =============================== */\n\nexport function isBalance(type: string): boolean {\n type = compressSuiType(type);\n return type.startsWith(`${PKG_V26}::balance::Balance` + \"<\");\n}\n\nexport interface BalanceFields<T extends PhantomTypeArgument> {\n value: ToField<\"u64\">;\n}\n\nexport type BalanceReified<T extends PhantomTypeArgument> = Reified<Balance<T>, BalanceFields<T>>;\n\nexport class Balance<T extends PhantomTypeArgument> implements StructClass {\n __StructClass = true as const;\n\n static get $typeName() {\n return `${PKG_V26}::balance::Balance`;\n }\n static readonly $numTypeParams = 1;\n static readonly $isPhantom = [true] as const;\n\n readonly $typeName = Balance.$typeName;\n readonly $fullTypeName: string;\n readonly $typeArgs: [PhantomToTypeStr<T>];\n readonly $isPhantom = Balance.$isPhantom;\n\n readonly value: ToField<\"u64\">;\n\n private constructor(typeArgs: [PhantomToTypeStr<T>], fields: BalanceFields<T>) {\n this.$fullTypeName = composeSuiType(Balance.$typeName, ...typeArgs) as string;\n this.$typeArgs = typeArgs;\n\n this.value = fields.value;\n }\n\n static reified<T extends PhantomReified<PhantomTypeArgument>>(T: T): BalanceReified<ToPhantomTypeArgument<T>> {\n return {\n typeName: Balance.$typeName,\n fullTypeName: composeSuiType(Balance.$typeName, ...[extractType(T)]) as string,\n typeArgs: [extractType(T)] as [PhantomToTypeStr<ToPhantomTypeArgument<T>>],\n isPhantom: Balance.$isPhantom,\n reifiedTypeArgs: [T],\n fromFields: (fields: Record<string, any>) => Balance.fromFields(T, fields),\n fromFieldsWithTypes: (item: FieldsWithTypes) => Balance.fromFieldsWithTypes(T, item),\n fromBcs: (data: Uint8Array) => Balance.fromBcs(T, data),\n bcs: Balance.bcs,\n fromJSONField: (field: any) => Balance.fromJSONField(T, field),\n fromJSON: (json: Record<string, any>) => Balance.fromJSON(T, json),\n fromSuiParsedData: (content: SuiParsedData) => Balance.fromSuiParsedData(T, content),\n fromSuiObjectData: (content: SuiObjectData) => Balance.fromSuiObjectData(T, content),\n fetch: async (client: SuiClient, id: string) => Balance.fetch(client, T, id),\n new: (fields: BalanceFields<ToPhantomTypeArgument<T>>) => {\n return new Balance([extractType(T)], fields);\n },\n kind: \"StructClassReified\",\n };\n }\n\n static get r() {\n return Balance.reified;\n }\n\n static phantom<T extends PhantomReified<PhantomTypeArgument>>(\n T: T\n ): PhantomReified<ToTypeStr<Balance<ToPhantomTypeArgument<T>>>> {\n return phantom(Balance.reified(T));\n }\n static get p() {\n return Balance.phantom;\n }\n\n static get bcs() {\n return bcs.struct(\"Balance\", {\n value: bcs.u64(),\n });\n }\n\n static fromFields<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n fields: Record<string, any>\n ): Balance<ToPhantomTypeArgument<T>> {\n return Balance.reified(typeArg).new({\n value: decodeFromFields(\"u64\", fields.value),\n });\n }\n\n static fromFieldsWithTypes<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n item: FieldsWithTypes\n ): Balance<ToPhantomTypeArgument<T>> {\n if (!isBalance(item.type)) {\n throw new Error(\"not a Balance type\");\n }\n assertFieldsWithTypesArgsMatch(item, [typeArg]);\n\n return Balance.reified(typeArg).new({\n value: decodeFromFieldsWithTypes(\"u64\", item.fields.value),\n });\n }\n\n static fromBcs<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n data: Uint8Array\n ): Balance<ToPhantomTypeArgument<T>> {\n return Balance.fromFields(typeArg, Balance.bcs.parse(data));\n }\n\n toJSONField() {\n return {\n value: this.value.toString(),\n };\n }\n\n toJSON() {\n return {\n $typeName: this.$typeName,\n $typeArgs: this.$typeArgs,\n ...this.toJSONField(),\n };\n }\n\n static fromJSONField<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n field: any\n ): Balance<ToPhantomTypeArgument<T>> {\n return Balance.reified(typeArg).new({\n value: decodeFromJSONField(\"u64\", field.value),\n });\n }\n\n static fromJSON<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n json: Record<string, any>\n ): Balance<ToPhantomTypeArgument<T>> {\n if (json.$typeName !== Balance.$typeName) {\n throw new Error(\"not a WithTwoGenerics json object\");\n }\n assertReifiedTypeArgsMatch(composeSuiType(Balance.$typeName, extractType(typeArg)), json.$typeArgs, [typeArg]);\n\n return Balance.fromJSONField(typeArg, json);\n }\n\n static fromSuiParsedData<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n content: SuiParsedData\n ): Balance<ToPhantomTypeArgument<T>> {\n if (content.dataType !== \"moveObject\") {\n throw new Error(\"not an object\");\n }\n if (!isBalance(content.type)) {\n throw new Error(`object at ${(content.fields as any).id} is not a Balance object`);\n }\n return Balance.fromFieldsWithTypes(typeArg, content);\n }\n\n static fromSuiObjectData<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n data: SuiObjectData\n ): Balance<ToPhantomTypeArgument<T>> {\n if (data.bcs) {\n if (data.bcs.dataType !== \"moveObject\" || !isBalance(data.bcs.type)) {\n throw new Error(`object at is not a Balance object`);\n }\n\n const gotTypeArgs = parseTypeName(data.bcs.type).typeArgs;\n if (gotTypeArgs.length !== 1) {\n throw new Error(`type argument mismatch: expected 1 type argument but got '${gotTypeArgs.length}'`);\n }\n const gotTypeArg = compressSuiType(gotTypeArgs[0]);\n const expectedTypeArg = compressSuiType(extractType(typeArg));\n if (gotTypeArg !== compressSuiType(extractType(typeArg))) {\n throw new Error(`type argument mismatch: expected '${expectedTypeArg}' but got '${gotTypeArg}'`);\n }\n\n return Balance.fromBcs(typeArg, fromB64(data.bcs.bcsBytes));\n }\n if (data.content) {\n return Balance.fromSuiParsedData(typeArg, data.content);\n }\n throw new Error(\n \"Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.\"\n );\n }\n\n static async fetch<T extends PhantomReified<PhantomTypeArgument>>(\n client: SuiClient,\n typeArg: T,\n id: string\n ): Promise<Balance<ToPhantomTypeArgument<T>>> {\n const res = await client.getObject({ id, options: { showBcs: true } });\n if (res.error) {\n throw new Error(`error fetching Balance object at id ${id}: ${res.error.code}`);\n }\n if (res.data?.bcs?.dataType !== \"moveObject\" || !isBalance(res.data.bcs.type)) {\n throw new Error(`object at id ${id} is not a Balance object`);\n }\n\n return Balance.fromSuiObjectData(typeArg, res.data);\n }\n}\n\n/* ============================== Supply =============================== */\n\nexport function isSupply(type: string): boolean {\n type = compressSuiType(type);\n return type.startsWith(`${PKG_V26}::balance::Supply` + \"<\");\n}\n\nexport interface SupplyFields<T extends PhantomTypeArgument> {\n value: ToField<\"u64\">;\n}\n\nexport type SupplyReified<T extends PhantomTypeArgument> = Reified<Supply<T>, SupplyFields<T>>;\n\nexport class Supply<T extends PhantomTypeArgument> implements StructClass {\n __StructClass = true as const;\n\n static get $typeName() {\n return `${PKG_V26}::balance::Supply`;\n }\n static readonly $numTypeParams = 1;\n static readonly $isPhantom = [true] as const;\n\n readonly $typeName = Supply.$typeName;\n readonly $fullTypeName: string;\n readonly $typeArgs: [PhantomToTypeStr<T>];\n readonly $isPhantom = Supply.$isPhantom;\n\n readonly value: ToField<\"u64\">;\n\n private constructor(typeArgs: [PhantomToTypeStr<T>], fields: SupplyFields<T>) {\n this.$fullTypeName = composeSuiType(Supply.$typeName, ...typeArgs) as string;\n this.$typeArgs = typeArgs;\n\n this.value = fields.value;\n }\n\n static reified<T extends PhantomReified<PhantomTypeArgument>>(T: T): SupplyReified<ToPhantomTypeArgument<T>> {\n return {\n typeName: Supply.$typeName,\n fullTypeName: composeSuiType(Supply.$typeName, ...[extractType(T)]) as string,\n typeArgs: [extractType(T)] as [PhantomToTypeStr<ToPhantomTypeArgument<T>>],\n isPhantom: Supply.$isPhantom,\n reifiedTypeArgs: [T],\n fromFields: (fields: Record<string, any>) => Supply.fromFields(T, fields),\n fromFieldsWithTypes: (item: FieldsWithTypes) => Supply.fromFieldsWithTypes(T, item),\n fromBcs: (data: Uint8Array) => Supply.fromBcs(T, data),\n bcs: Supply.bcs,\n fromJSONField: (field: any) => Supply.fromJSONField(T, field),\n fromJSON: (json: Record<string, any>) => Supply.fromJSON(T, json),\n fromSuiParsedData: (content: SuiParsedData) => Supply.fromSuiParsedData(T, content),\n fromSuiObjectData: (content: SuiObjectData) => Supply.fromSuiObjectData(T, content),\n fetch: async (client: SuiClient, id: string) => Supply.fetch(client, T, id),\n new: (fields: SupplyFields<ToPhantomTypeArgument<T>>) => {\n return new Supply([extractType(T)], fields);\n },\n kind: \"StructClassReified\",\n };\n }\n\n static get r() {\n return Supply.reified;\n }\n\n static phantom<T extends PhantomReified<PhantomTypeArgument>>(\n T: T\n ): PhantomReified<ToTypeStr<Supply<ToPhantomTypeArgument<T>>>> {\n return phantom(Supply.reified(T));\n }\n static get p() {\n return Supply.phantom;\n }\n\n static get bcs() {\n return bcs.struct(\"Supply\", {\n value: bcs.u64(),\n });\n }\n\n static fromFields<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n fields: Record<string, any>\n ): Supply<ToPhantomTypeArgument<T>> {\n return Supply.reified(typeArg).new({\n value: decodeFromFields(\"u64\", fields.value),\n });\n }\n\n static fromFieldsWithTypes<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n item: FieldsWithTypes\n ): Supply<ToPhantomTypeArgument<T>> {\n if (!isSupply(item.type)) {\n throw new Error(\"not a Supply type\");\n }\n assertFieldsWithTypesArgsMatch(item, [typeArg]);\n\n return Supply.reified(typeArg).new({\n value: decodeFromFieldsWithTypes(\"u64\", item.fields.value),\n });\n }\n\n static fromBcs<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n data: Uint8Array\n ): Supply<ToPhantomTypeArgument<T>> {\n return Supply.fromFields(typeArg, Supply.bcs.parse(data));\n }\n\n toJSONField() {\n return {\n value: this.value.toString(),\n };\n }\n\n toJSON() {\n return {\n $typeName: this.$typeName,\n $typeArgs: this.$typeArgs,\n ...this.toJSONField(),\n };\n }\n\n static fromJSONField<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n field: any\n ): Supply<ToPhantomTypeArgument<T>> {\n return Supply.reified(typeArg).new({\n value: decodeFromJSONField(\"u64\", field.value),\n });\n }\n\n static fromJSON<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n json: Record<string, any>\n ): Supply<ToPhantomTypeArgument<T>> {\n if (json.$typeName !== Supply.$typeName) {\n throw new Error(\"not a WithTwoGenerics json object\");\n }\n assertReifiedTypeArgsMatch(composeSuiType(Supply.$typeName, extractType(typeArg)), json.$typeArgs, [typeArg]);\n\n return Supply.fromJSONField(typeArg, json);\n }\n\n static fromSuiParsedData<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n content: SuiParsedData\n ): Supply<ToPhantomTypeArgument<T>> {\n if (content.dataType !== \"moveObject\") {\n throw new Error(\"not an object\");\n }\n if (!isSupply(content.type)) {\n throw new Error(`object at ${(content.fields as any).id} is not a Supply object`);\n }\n return Supply.fromFieldsWithTypes(typeArg, content);\n }\n\n static fromSuiObjectData<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n data: SuiObjectData\n ): Supply<ToPhantomTypeArgument<T>> {\n if (data.bcs) {\n if (data.bcs.dataType !== \"moveObject\" || !isSupply(data.bcs.type)) {\n throw new Error(`object at is not a Supply object`);\n }\n\n const gotTypeArgs = parseTypeName(data.bcs.type).typeArgs;\n if (gotTypeArgs.length !== 1) {\n throw new Error(`type argument mismatch: expected 1 type argument but got '${gotTypeArgs.length}'`);\n }\n const gotTypeArg = compressSuiType(gotTypeArgs[0]);\n const expectedTypeArg = compressSuiType(extractType(typeArg));\n if (gotTypeArg !== compressSuiType(extractType(typeArg))) {\n throw new Error(`type argument mismatch: expected '${expectedTypeArg}' but got '${gotTypeArg}'`);\n }\n\n return Supply.fromBcs(typeArg, fromB64(data.bcs.bcsBytes));\n }\n if (data.content) {\n return Supply.fromSuiParsedData(typeArg, data.content);\n }\n throw new Error(\n \"Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.\"\n );\n }\n\n static async fetch<T extends PhantomReified<PhantomTypeArgument>>(\n client: SuiClient,\n typeArg: T,\n id: string\n ): Promise<Supply<ToPhantomTypeArgument<T>>> {\n const res = await client.getObject({ id, options: { showBcs: true } });\n if (res.error) {\n throw new Error(`error fetching Supply object at id ${id}: ${res.error.code}`);\n }\n if (res.data?.bcs?.dataType !== \"moveObject\" || !isSupply(res.data.bcs.type)) {\n throw new Error(`object at id ${id} is not a Supply object`);\n }\n\n return Supply.fromSuiObjectData(typeArg, res.data);\n }\n}\n", "// @ts-nocheck\nimport {\n PhantomReified,\n PhantomToTypeStr,\n PhantomTypeArgument,\n Reified,\n StructClass,\n ToField,\n ToPhantomTypeArgument,\n ToTypeStr,\n assertFieldsWithTypesArgsMatch,\n assertReifiedTypeArgsMatch,\n decodeFromFields,\n decodeFromFieldsWithTypes,\n decodeFromJSONField,\n extractType,\n phantom,\n} from \"../../_framework/reified\";\nimport { FieldsWithTypes, composeSuiType, compressSuiType, parseTypeName } from \"../../_framework/util\";\nimport { Balance } from \"../../sui/balance/structs\";\nimport { PKG_V1 } from \"../index\";\nimport { bcs } from \"@mysten/sui/bcs\";\nimport { SuiClient, SuiObjectData, SuiParsedData } from \"@mysten/sui/client\";\nimport { fromB64 } from \"@mysten/sui/utils\";\n\n/* ============================== PoolRewards =============================== */\n\nexport function isPoolRewards(type: string): boolean {\n type = compressSuiType(type);\n return type.startsWith(`${PKG_V1}::pool_rewards::PoolRewards` + \"<\");\n}\n\nexport interface PoolRewardsFields<T extends PhantomTypeArgument> {\n accRewardPerShareP: ToField<\"u128\">;\n adminFeeShareBp: ToField<\"u64\">;\n adminFee: ToField<Balance<T>>;\n rewards: ToField<Balance<T>>;\n lpSupply: ToField<\"u64\">;\n}\n\nexport type PoolRewardsReified<T extends PhantomTypeArgument> = Reified<PoolRewards<T>, PoolRewardsFields<T>>;\n\nexport class PoolRewards<T extends PhantomTypeArgument> implements StructClass {\n __StructClass = true as const;\n\n static get $typeName() {\n return `${PKG_V1}::pool_rewards::PoolRewards`;\n }\n static readonly $numTypeParams = 1;\n static readonly $isPhantom = [true] as const;\n\n readonly $typeName = PoolRewards.$typeName;\n readonly $fullTypeName: string;\n readonly $typeArgs: [PhantomToTypeStr<T>];\n readonly $isPhantom = PoolRewards.$isPhantom;\n\n readonly accRewardPerShareP: ToField<\"u128\">;\n readonly adminFeeShareBp: ToField<\"u64\">;\n readonly adminFee: ToField<Balance<T>>;\n readonly rewards: ToField<Balance<T>>;\n readonly lpSupply: ToField<\"u64\">;\n\n private constructor(typeArgs: [PhantomToTypeStr<T>], fields: PoolRewardsFields<T>) {\n this.$fullTypeName = composeSuiType(PoolRewards.$typeName, ...typeArgs) as string;\n this.$typeArgs = typeArgs;\n\n this.accRewardPerShareP = fields.accRewardPerShareP;\n this.adminFeeShareBp = fields.adminFeeShareBp;\n this.adminFee = fields.adminFee;\n this.rewards = fields.rewards;\n this.lpSupply = fields.lpSupply;\n }\n\n static reified<T extends PhantomReified<PhantomTypeArgument>>(T: T): PoolRewardsReified<ToPhantomTypeArgument<T>> {\n return {\n typeName: PoolRewards.$typeName,\n fullTypeName: composeSuiType(PoolRewards.$typeName, ...[extractType(T)]) as string,\n typeArgs: [extractType(T)] as [PhantomToTypeStr<ToPhantomTypeArgument<T>>],\n isPhantom: PoolRewards.$isPhantom,\n reifiedTypeArgs: [T],\n fromFields: (fields: Record<string, any>) => PoolRewards.fromFields(T, fields),\n fromFieldsWithTypes: (item: FieldsWithTypes) => PoolRewards.fromFieldsWithTypes(T, item),\n fromBcs: (data: Uint8Array) => PoolRewards.fromBcs(T, data),\n bcs: PoolRewards.bcs,\n fromJSONField: (field: any) => PoolRewards.fromJSONField(T, field),\n fromJSON: (json: Record<string, any>) => PoolRewards.fromJSON(T, json),\n fromSuiParsedData: (content: SuiParsedData) => PoolRewards.fromSuiParsedData(T, content),\n fromSuiObjectData: (content: SuiObjectData) => PoolRewards.fromSuiObjectData(T, content),\n fetch: async (client: SuiClient, id: string) => PoolRewards.fetch(client, T, id),\n new: (fields: PoolRewardsFields<ToPhantomTypeArgument<T>>) => {\n return new PoolRewards([extractType(T)], fields);\n },\n kind: \"StructClassReified\",\n };\n }\n\n static get r() {\n return PoolRewards.reified;\n }\n\n static phantom<T extends PhantomReified<PhantomTypeArgument>>(\n T: T\n ): PhantomReified<ToTypeStr<PoolRewards<ToPhantomTypeArgument<T>>>> {\n return phantom(PoolRewards.reified(T));\n }\n static get p() {\n return PoolRewards.phantom;\n }\n\n static get bcs() {\n return bcs.struct(\"PoolRewards\", {\n acc_reward_per_share_p: bcs.u128(),\n admin_fee_share_bp: bcs.u64(),\n admin_fee: Balance.bcs,\n rewards: Balance.bcs,\n lp_supply: bcs.u64(),\n });\n }\n\n static fromFields<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n fields: Record<string, any>\n ): PoolRewards<ToPhantomTypeArgument<T>> {\n return PoolRewards.reified(typeArg).new({\n accRewardPerShareP: decodeFromFields(\"u128\", fields.acc_reward_per_share_p),\n adminFeeShareBp: decodeFromFields(\"u64\", fields.admin_fee_share_bp),\n adminFee: decodeFromFields(Balance.reified(typeArg), fields.admin_fee),\n rewards: decodeFromFields(Balance.reified(typeArg), fields.rewards),\n lpSupply: decodeFromFields(\"u64\", fields.lp_supply),\n });\n }\n\n static fromFieldsWithTypes<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n item: FieldsWithTypes\n ): PoolRewards<ToPhantomTypeArgument<T>> {\n if (!isPoolRewards(item.type)) {\n throw new Error(\"not a PoolRewards type\");\n }\n assertFieldsWithTypesArgsMatch(item, [typeArg]);\n\n return PoolRewards.reified(typeArg).new({\n accRewardPerShareP: decodeFromFieldsWithTypes(\"u128\", item.fields.acc_reward_per_share_p),\n adminFeeShareBp: decodeFromFieldsWithTypes(\"u64\", item.fields.admin_fee_share_bp),\n adminFee: decodeFromFieldsWithTypes(Balance.reified(typeArg), item.fields.admin_fee),\n rewards: decodeFromFieldsWithTypes(Balance.reified(typeArg), item.fields.rewards),\n lpSupply: decodeFromFieldsWithTypes(\"u64\", item.fields.lp_supply),\n });\n }\n\n static fromBcs<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n data: Uint8Array\n ): PoolRewards<ToPhantomTypeArgument<T>> {\n return PoolRewards.fromFields(typeArg, PoolRewards.bcs.parse(data));\n }\n\n toJSONField() {\n return {\n accRewardPerShareP: this.accRewardPerShareP.toString(),\n adminFeeShareBp: this.adminFeeShareBp.toString(),\n adminFee: this.adminFee.toJSONField(),\n rewards: this.rewards.toJSONField(),\n lpSupply: this.lpSupply.toString(),\n };\n }\n\n toJSON() {\n return {\n $typeName: this.$typeName,\n $typeArgs: this.$typeArgs,\n ...this.toJSONField(),\n };\n }\n\n static fromJSONField<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n field: any\n ): PoolRewards<ToPhantomTypeArgument<T>> {\n return PoolRewards.reified(typeArg).new({\n accRewardPerShareP: decodeFromJSONField(\"u128\", field.accRewardPerShareP),\n adminFeeShareBp: decodeFromJSONField(\"u64\", field.adminFeeShareBp),\n adminFee: decodeFromJSONField(Balance.reified(typeArg), field.adminFee),\n rewards: decodeFromJSONField(Balance.reified(typeArg), field.rewards),\n lpSupply: decodeFromJSONField(\"u64\", field.lpSupply),\n });\n }\n\n static fromJSON<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n json: Record<string, any>\n ): PoolRewards<ToPhantomTypeArgument<T>> {\n if (json.$typeName !== PoolRewards.$typeName) {\n throw new Error(\"not a WithTwoGenerics json object\");\n }\n assertReifiedTypeArgsMatch(composeSuiType(PoolRewards.$typeName, extractType(typeArg)), json.$typeArgs, [typeArg]);\n\n return PoolRewards.fromJSONField(typeArg, json);\n }\n\n static fromSuiParsedData<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n content: SuiParsedData\n ): PoolRewards<ToPhantomTypeArgument<T>> {\n if (content.dataType !== \"moveObject\") {\n throw new Error(\"not an object\");\n }\n if (!isPoolRewards(content.type)) {\n throw new Error(`object at ${(content.fields as any).id} is not a PoolRewards object`);\n }\n return PoolRewards.fromFieldsWithTypes(typeArg, content);\n }\n\n static fromSuiObjectData<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n data: SuiObjectData\n ): PoolRewards<ToPhantomTypeArgument<T>> {\n if (data.bcs) {\n if (data.bcs.dataType !== \"moveObject\" || !isPoolRewards(data.bcs.type)) {\n throw new Error(`object at is not a PoolRewards object`);\n }\n\n const gotTypeArgs = parseTypeName(data.bcs.type).typeArgs;\n if (gotTypeArgs.length !== 1) {\n throw new Error(`type argument mismatch: expected 1 type argument but got '${gotTypeArgs.length}'`);\n }\n const gotTypeArg = compressSuiType(gotTypeArgs[0]);\n const expectedTypeArg = compressSuiType(extractType(typeArg));\n if (gotTypeArg !== compressSuiType(extractType(typeArg))) {\n throw new Error(`type argument mismatch: expected '${expectedTypeArg}' but got '${gotTypeArg}'`);\n }\n\n return PoolRewards.fromBcs(typeArg, fromB64(data.bcs.bcsBytes));\n }\n if (data.content) {\n return PoolRewards.fromSuiParsedData(typeArg, data.content);\n }\n throw new Error(\n \"Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.\"\n );\n }\n\n static async fetch<T extends PhantomReified<PhantomTypeArgument>>(\n client: SuiClient,\n typeArg: T,\n id: string\n ): Promise<PoolRewards<ToPhantomTypeArgument<T>>> {\n const res = await client.getObject({ id, options: { showBcs: true } });\n if (res.error) {\n throw new Error(`error fetching PoolRewards object at id ${id}: ${res.error.code}`);\n }\n if (res.data?.bcs?.dataType !== \"moveObject\" || !isPoolRewards(res.data.bcs.type)) {\n throw new Error(`object at id ${id} is not a PoolRewards object`);\n }\n\n return PoolRewards.fromSuiObjectData(typeArg, res.data);\n }\n}\n", "// @ts-nocheck\nimport {\n PhantomReified,\n PhantomToTypeStr,\n PhantomTypeArgument,\n Reified,\n StructClass,\n ToField,\n ToPhantomTypeArgument,\n ToTypeStr,\n assertFieldsWithTypesArgsMatch,\n assertReifiedTypeArgsMatch,\n decodeFromFields,\n decodeFromFieldsWithTypes,\n decodeFromJSONField,\n extractType,\n phantom,\n} from \"../../_framework/reified\";\nimport { FieldsWithTypes, composeSuiType, compressSuiType, parseTypeName } from \"../../_framework/util\";\nimport { PKG_V1 } from \"../index\";\nimport { bcs } from \"@mysten/sui/bcs\";\nimport { SuiClient, SuiObjectData, SuiParsedData } from \"@mysten/sui/client\";\nimport { fromB64 } from \"@mysten/sui/utils\";\n\n/* ============================== PoolState =============================== */\n\nexport function isPoolState(type: string): boolean {\n type = compressSuiType(type);\n return type.startsWith(`${PKG_V1}::pool_state::PoolState` + \"<\");\n}\n\nexport interface PoolStateFields<T extends PhantomTypeArgument> {\n tokenBalance: ToField<\"u64\">;\n vusdBalance: ToField<\"u64\">;\n d: ToField<\"u64\">;\n a: ToField<\"u64\">;\n balanceRatioMinBp: ToField<\"u64\">;\n}\n\nexport type PoolStateReified<T extends PhantomTypeArgument> = Reified<PoolState<T>, PoolStateFields<T>>;\n\nexport class PoolState<T extends PhantomTypeArgument> implements StructClass {\n __StructClass = true as const;\n\n static get $typeName() {\n return `${PKG_V1}::pool_state::PoolState`;\n }\n static readonly $numTypeParams = 1;\n static readonly $isPhantom = [true] as const;\n\n readonly $typeName = PoolState.$typeName;\n readonly $fullTypeName: string;\n readonly $typeArgs: [PhantomToTypeStr<T>];\n readonly $isPhantom = PoolState.$isPhantom;\n\n readonly tokenBalance: ToField<\"u64\">;\n readonly vusdBalance: ToField<\"u64\">;\n readonly d: ToField<\"u64\">;\n readonly a: ToField<\"u64\">;\n readonly balanceRatioMinBp: ToField<\"u64\">;\n\n private constructor(typeArgs: [PhantomToTypeStr<T>], fields: PoolStateFields<T>) {\n this.$fullTypeName = composeSuiType(PoolState.$typeName, ...typeArgs) as string;\n this.$typeArgs = typeArgs;\n\n this.tokenBalance = fields.tokenBalance;\n this.vusdBalance = fields.vusdBalance;\n this.d = fields.d;\n this.a = fields.a;\n this.balanceRatioMinBp = fields.balanceRatioMinBp;\n }\n\n static reified<T extends PhantomReified<PhantomTypeArgument>>(T: T): PoolStateReified<ToPhantomTypeArgument<T>> {\n return {\n typeName: PoolState.$typeName,\n fullTypeName: composeSuiType(PoolState.$typeName, ...[extractType(T)]) as string,\n typeArgs: [extractType(T)] as [PhantomToTypeStr<ToPhantomTypeArgument<T>>],\n isPhantom: PoolState.$isPhantom,\n reifiedTypeArgs: [T],\n fromFields: (fields: Record<string, any>) => PoolState.fromFields(T, fields),\n fromFieldsWithTypes: (item: FieldsWithTypes) => PoolState.fromFieldsWithTypes(T, item),\n fromBcs: (data: Uint8Array) => PoolState.fromBcs(T, data),\n bcs: PoolState.bcs,\n fromJSONField: (field: any) => PoolState.fromJSONField(T, field),\n fromJSON: (json: Record<string, any>) => PoolState.fromJSON(T, json),\n fromSuiParsedData: (content: SuiParsedData) => PoolState.fromSuiParsedData(T, content),\n fromSuiObjectData: (content: SuiObjectData) => PoolState.fromSuiObjectData(T, content),\n fetch: async (client: SuiClient, id: string) => PoolState.fetch(client, T, id),\n new: (fields: PoolStateFields<ToPhantomTypeArgument<T>>) => {\n return new PoolState([extractType(T)], fields);\n },\n kind: \"StructClassReified\",\n };\n }\n\n static get r() {\n return PoolState.reified;\n }\n\n static phantom<T extends PhantomReified<PhantomTypeArgument>>(\n T: T\n ): PhantomReified<ToTypeStr<PoolState<ToPhantomTypeArgument<T>>>> {\n return phantom(PoolState.reified(T));\n }\n static get p() {\n return PoolState.phantom;\n }\n\n static get bcs() {\n return bcs.struct(\"PoolState\", {\n token_balance: bcs.u64(),\n vusd_balance: bcs.u64(),\n d: bcs.u64(),\n a: bcs.u64(),\n balance_ratio_min_bp: bcs.u64(),\n });\n }\n\n static fromFields<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n fields: Record<string, any>\n ): PoolState<ToPhantomTypeArgument<T>> {\n return PoolState.reified(typeArg).new({\n tokenBalance: decodeFromFields(\"u64\", fields.token_balance),\n vusdBalance: decodeFromFields(\"u64\", fields.vusd_balance),\n d: decodeFromFields(\"u64\", fields.d),\n a: decodeFromFields(\"u64\", fields.a),\n balanceRatioMinBp: decodeFromFields(\"u64\", fields.balance_ratio_min_bp),\n });\n }\n\n static fromFieldsWithTypes<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n item: FieldsWithTypes\n ): PoolState<ToPhantomTypeArgument<T>> {\n if (!isPoolState(item.type)) {\n throw new Error(\"not a PoolState type\");\n }\n assertFieldsWithTypesArgsMatch(item, [typeArg]);\n\n return PoolState.reified(typeArg).new({\n tokenBalance: decodeFromFieldsWithTypes(\"u64\", item.fields.token_balance),\n vusdBalance: decodeFromFieldsWithTypes(\"u64\", item.fields.vusd_balance),\n d: decodeFromFieldsWithTypes(\"u64\", item.fields.d),\n a: decodeFromFieldsWithTypes(\"u64\", item.fields.a),\n balanceRatioMinBp: decodeFromFieldsWithTypes(\"u64\", item.fields.balance_ratio_min_bp),\n });\n }\n\n static fromBcs<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n data: Uint8Array\n ): PoolState<ToPhantomTypeArgument<T>> {\n return PoolState.fromFields(typeArg, PoolState.bcs.parse(data));\n }\n\n toJSONField() {\n return {\n tokenBalance: this.tokenBalance.toString(),\n vusdBalance: this.vusdBalance.toString(),\n d: this.d.toString(),\n a: this.a.toString(),\n balanceRatioMinBp: this.balanceRatioMinBp.toString(),\n };\n }\n\n toJSON() {\n return {\n $typeName: this.$typeName,\n $typeArgs: this.$typeArgs,\n ...this.toJSONField(),\n };\n }\n\n static fromJSONField<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n field: any\n ): PoolState<ToPhantomTypeArgument<T>> {\n return PoolState.reified(typeArg).new({\n tokenBalance: decodeFromJSONField(\"u64\", field.tokenBalance),\n vusdBalance: decodeFromJSONField(\"u64\", field.vusdBalance),\n d: decodeFromJSONField(\"u64\", field.d),\n a: decodeFromJSONField(\"u64\", field.a),\n balanceRatioMinBp: decodeFromJSONField(\"u64\", field.balanceRatioMinBp),\n });\n }\n\n static fromJSON<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n json: Record<string, any>\n ): PoolState<ToPhantomTypeArgument<T>> {\n if (json.$typeName !== PoolState.$typeName) {\n throw new Error(\"not a WithTwoGenerics json object\");\n }\n assertReifiedTypeArgsMatch(composeSuiType(PoolState.$typeName, extractType(typeArg)), json.$typeArgs, [typeArg]);\n\n return PoolState.fromJSONField(typeArg, json);\n }\n\n static fromSuiParsedData<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n content: SuiParsedData\n ): PoolState<ToPhantomTypeArgument<T>> {\n if (content.dataType !== \"moveObject\") {\n throw new Error(\"not an object\");\n }\n if (!isPoolState(content.type)) {\n throw new Error(`object at ${(content.fields as any).id} is not a PoolState object`);\n }\n return PoolState.fromFieldsWithTypes(typeArg, content);\n }\n\n static fromSuiObjectData<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n data: SuiObjectData\n ): PoolState<ToPhantomTypeArgument<T>> {\n if (data.bcs) {\n if (data.bcs.dataType !== \"moveObject\" || !isPoolState(data.bcs.type)) {\n throw new Error(`object at is not a PoolState object`);\n }\n\n const gotTypeArgs = parseTypeName(data.bcs.type).typeArgs;\n if (gotTypeArgs.length !== 1) {\n throw new Error(`type argument mismatch: expected 1 type argument but got '${gotTypeArgs.length}'`);\n }\n const gotTypeArg = compressSuiType(gotTypeArgs[0]);\n const expectedTypeArg = compressSuiType(extractType(typeArg));\n if (gotTypeArg !== compressSuiType(extractType(typeArg))) {\n throw new Error(`type argument mismatch: expected '${expectedTypeArg}' but got '${gotTypeArg}'`);\n }\n\n return PoolState.fromBcs(typeArg, fromB64(data.bcs.bcsBytes));\n }\n if (data.content) {\n return PoolState.fromSuiParsedData(typeArg, data.content);\n }\n throw new Error(\n \"Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.\"\n );\n }\n\n static async fetch<T extends PhantomReified<PhantomTypeArgument>>(\n client: SuiClient,\n typeArg: T,\n id: string\n ): Promise<PoolState<ToPhantomTypeArgument<T>>> {\n const res = await client.getObject({ id, options: { showBcs: true } });\n if (res.error) {\n throw new Error(`error fetching PoolState object at id ${id}: ${res.error.code}`);\n }\n if (res.data?.bcs?.dataType !== \"moveObject\" || !isPoolState(res.data.bcs.type)) {\n throw new Error(`object at id ${id} is not a PoolState object`);\n }\n\n return PoolState.fromSuiObjectData(typeArg, res.data);\n }\n}\n", "// @ts-nocheck\nimport {\n PhantomReified,\n PhantomToTypeStr,\n PhantomTypeArgument,\n Reified,\n StructClass,\n ToField,\n ToPhantomTypeArgument,\n ToTypeStr,\n assertFieldsWithTypesArgsMatch,\n assertReifiedTypeArgsMatch,\n decodeFromFields,\n decodeFromFieldsWithTypes,\n decodeFromJSONField,\n extractType,\n phantom,\n} from \"../../_framework/reified\";\nimport { FieldsWithTypes, composeSuiType, compressSuiType, parseTypeName } from \"../../_framework/util\";\nimport { UID } from \"../../sui/object/structs\";\nimport { PKG_V1 } from \"../index\";\nimport { bcs } from \"@mysten/sui/bcs\";\nimport { SuiClient, SuiObjectData, SuiParsedData } from \"@mysten/sui/client\";\nimport { fromB64 } from \"@mysten/sui/utils\";\n\n/* ============================== UserDeposit =============================== */\n\nexport function isUserDeposit(type: string): boolean {\n type = compressSuiType(type);\n return type.startsWith(`${PKG_V1}::user_deposit::UserDeposit` + \"<\");\n}\n\nexport interface UserDepositFields<T extends PhantomTypeArgument> {\n id: ToField<UID>;\n lpAmount: ToField<\"u64\">;\n rewardDebt: ToField<\"u64\">;\n}\n\nexport type UserDepositReified<T extends PhantomTypeArgument> = Reified<UserDeposit<T>, UserDepositFields<T>>;\n\nexport class UserDeposit<T extends PhantomTypeArgument> implements StructClass {\n __StructClass = true as const;\n\n static get $typeName() {\n return `${PKG_V1}::user_deposit::UserDeposit`;\n }\n static readonly $numTypeParams = 1;\n static readonly $isPhantom = [true] as const;\n\n readonly $typeName = UserDeposit.$typeName;\n readonly $fullTypeName: string;\n readonly $typeArgs: [PhantomToTypeStr<T>];\n readonly $isPhantom = UserDeposit.$isPhantom;\n\n readonly id: ToField<UID>;\n readonly lpAmount: ToField<\"u64\">;\n readonly rewardDebt: ToField<\"u64\">;\n\n private constructor(typeArgs: [PhantomToTypeStr<T>], fields: UserDepositFields<T>) {\n this.$fullTypeName = composeSuiType(UserDeposit.$typeName, ...typeArgs) as string;\n this.$typeArgs = typeArgs;\n\n this.id = fields.id;\n this.lpAmount = fields.lpAmount;\n this.rewardDebt = fields.rewardDebt;\n }\n\n static reified<T extends PhantomReified<PhantomTypeArgument>>(T: T): UserDepositReified<ToPhantomTypeArgument<T>> {\n return {\n typeName: UserDeposit.$typeName,\n fullTypeName: composeSuiType(UserDeposit.$typeName, ...[extractType(T)]) as string,\n typeArgs: [extractType(T)] as [PhantomToTypeStr<ToPhantomTypeArgument<T>>],\n isPhantom: UserDeposit.$isPhantom,\n reifiedTypeArgs: [T],\n fromFields: (fields: Record<string, any>) => UserDeposit.fromFields(T, fields),\n fromFieldsWithTypes: (item: FieldsWithTypes) => UserDeposit.fromFieldsWithTypes(T, item),\n fromBcs: (data: Uint8Array) => UserDeposit.fromBcs(T, data),\n bcs: UserDeposit.bcs,\n fromJSONField: (field: any) => UserDeposit.fromJSONField(T, field),\n fromJSON: (json: Record<string, any>) => UserDeposit.fromJSON(T, json),\n fromSuiParsedData: (content: SuiParsedData) => UserDeposit.fromSuiParsedData(T, content),\n fromSuiObjectData: (content: SuiObjectData) => UserDeposit.fromSuiObjectData(T, content),\n fetch: async (client: SuiClient, id: string) => UserDeposit.fetch(client, T, id),\n new: (fields: UserDepositFields<ToPhantomTypeArgument<T>>) => {\n return new UserDeposit([extractType(T)], fields);\n },\n kind: \"StructClassReified\",\n };\n }\n\n static get r() {\n return UserDeposit.reified;\n }\n\n static phantom<T extends PhantomReified<PhantomTypeArgument>>(\n T: T\n ): PhantomReified<ToTypeStr<UserDeposit<ToPhantomTypeArgument<T>>>> {\n return phantom(UserDeposit.reified(T));\n }\n static get p() {\n return UserDeposit.phantom;\n }\n\n static get bcs() {\n return bcs.struct(\"UserDeposit\", {\n id: UID.bcs,\n lp_amount: bcs.u64(),\n reward_debt: bcs.u64(),\n });\n }\n\n static fromFields<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n fields: Record<string, any>\n ): UserDeposit<ToPhantomTypeArgument<T>> {\n return UserDeposit.reified(typeArg).new({\n id: decodeFromFields(UID.reified(), fields.id),\n lpAmount: decodeFromFields(\"u64\", fields.lp_amount),\n rewardDebt: decodeFromFields(\"u64\", fields.reward_debt),\n });\n }\n\n static fromFieldsWithTypes<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n item: FieldsWithTypes\n ): UserDeposit<ToPhantomTypeArgument<T>> {\n if (!isUserDeposit(item.type)) {\n throw new Error(\"not a UserDeposit type\");\n }\n assertFieldsWithTypesArgsMatch(item, [typeArg]);\n\n return UserDeposit.reified(typeArg).new({\n id: decodeFromFieldsWithTypes(UID.reified(), item.fields.id),\n lpAmount: decodeFromFieldsWithTypes(\"u64\", item.fields.lp_amount),\n rewardDebt: decodeFromFieldsWithTypes(\"u64\", item.fields.reward_debt),\n });\n }\n\n static fromBcs<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n data: Uint8Array\n ): UserDeposit<ToPhantomTypeArgument<T>> {\n return UserDeposit.fromFields(typeArg, UserDeposit.bcs.parse(data));\n }\n\n toJSONField() {\n return {\n id: this.id,\n lpAmount: this.lpAmount.toString(),\n rewardDebt: this.rewardDebt.toString(),\n };\n }\n\n toJSON() {\n return {\n $typeName: this.$typeName,\n $typeArgs: this.$typeArgs,\n ...this.toJSONField(),\n };\n }\n\n static fromJSONField<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n field: any\n ): UserDeposit<ToPhantomTypeArgument<T>> {\n return UserDeposit.reified(typeArg).new({\n id: decodeFromJSONField(UID.reified(), field.id),\n lpAmount: decodeFromJSONField(\"u64\", field.lpAmount),\n rewardDebt: decodeFromJSONField(\"u64\", field.rewardDebt),\n });\n }\n\n static fromJSON<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n json: Record<string, any>\n ): UserDeposit<ToPhantomTypeArgument<T>> {\n if (json.$typeName !== UserDeposit.$typeName) {\n throw new Error(\"not a WithTwoGenerics json object\");\n }\n assertReifiedTypeArgsMatch(composeSuiType(UserDeposit.$typeName, extractType(typeArg)), json.$typeArgs, [typeArg]);\n\n return UserDeposit.fromJSONField(typeArg, json);\n }\n\n static fromSuiParsedData<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n content: SuiParsedData\n ): UserDeposit<ToPhantomTypeArgument<T>> {\n if (content.dataType !== \"moveObject\") {\n throw new Error(\"not an object\");\n }\n if (!isUserDeposit(content.type)) {\n throw new Error(`object at ${(content.fields as any).id} is not a UserDeposit object`);\n }\n return UserDeposit.fromFieldsWithTypes(typeArg, content);\n }\n\n static fromSuiObjectData<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n data: SuiObjectData\n ): UserDeposit<ToPhantomTypeArgument<T>> {\n if (data.bcs) {\n if (data.bcs.dataType !== \"moveObject\" || !isUserDeposit(data.bcs.type)) {\n throw new Error(`object at is not a UserDeposit object`);\n }\n\n const gotTypeArgs = parseTypeName(data.bcs.type).typeArgs;\n if (gotTypeArgs.length !== 1) {\n throw new Error(`type argument mismatch: expected 1 type argument but got '${gotTypeArgs.length}'`);\n }\n const gotTypeArg = compressSuiType(gotTypeArgs[0]);\n const expectedTypeArg = compressSuiType(extractType(typeArg));\n if (gotTypeArg !== compressSuiType(extractType(typeArg))) {\n throw new Error(`type argument mismatch: expected '${expectedTypeArg}' but got '${gotTypeArg}'`);\n }\n\n return UserDeposit.fromBcs(typeArg, fromB64(data.bcs.bcsBytes));\n }\n if (data.content) {\n return UserDeposit.fromSuiParsedData(typeArg, data.content);\n }\n throw new Error(\n \"Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.\"\n );\n }\n\n static async fetch<T extends PhantomReified<PhantomTypeArgument>>(\n client: SuiClient,\n typeArg: T,\n id: string\n ): Promise<UserDeposit<ToPhantomTypeArgument<T>>> {\n const res = await client.getObject({ id, options: { showBcs: true } });\n if (res.error) {\n throw new Error(`error fetching UserDeposit object at id ${id}: ${res.error.code}`);\n }\n if (res.data?.bcs?.dataType !== \"moveObject\" || !isUserDeposit(res.data.bcs.type)) {\n throw new Error(`object at id ${id} is not a UserDeposit object`);\n }\n\n return UserDeposit.fromSuiObjectData(typeArg, res.data);\n }\n}\n", "import { CoinStruct } from \"@mysten/sui/client\";\nimport { Transaction } from \"@mysten/sui/transactions\";\n\nexport function getCoinsWithAmounts(amounts: string[], coins: CoinStruct[], tx: Transaction) {\n if (coins.length === 0 || !coins[0]) {\n return [];\n }\n const firstCoin = coins[0];\n const requiredAmount = amounts.reduce((total, amount) => total + BigInt(amount), BigInt(0));\n\n let currentBalance = BigInt(firstCoin.balance);\n const accumulatedCoins: CoinStruct[] = [];\n\n for (const coin of coins.slice(1)) {\n if (currentBalance > requiredAmount) {\n return splitAndMergeCoins(tx, firstCoin, accumulatedCoins, amounts);\n } else {\n currentBalance += BigInt(coin.balance);\n accumulatedCoins.push(coin);\n }\n }\n\n if (currentBalance >= requiredAmount) {\n return splitAndMergeCoins(tx, firstCoin, accumulatedCoins, amounts);\n } else {\n return [];\n }\n}\n\nfunction splitAndMergeCoins(tx: Transaction, firstCoin: CoinStruct, accumulatedCoins: CoinStruct[], amounts: string[]) {\n const pureAmounts = amounts.map((amount) => {\n return tx.pure.u64(amount);\n });\n if (accumulatedCoins.length > 0) {\n tx.mergeCoins(\n firstCoin.coinObjectId,\n accumulatedCoins.map((c) => c.coinObjectId)\n );\n return tx.splitCoins(firstCoin.coinObjectId, pureAmounts);\n }\n\n return tx.splitCoins(firstCoin.coinObjectId, pureAmounts);\n}\n", "import { SuiClient } from \"@mysten/sui/client\";\nimport { Transaction } from \"@mysten/sui/transactions\";\nimport { Reified, toBcs, ToJSON, TypeArgument } from \"../../models/sui/_framework/reified\";\n\nconst mockSender = \"0x0000000000000000000000000000000000000000000000000000000000000000\";\n\nexport async function suiView<T extends TypeArgument>(\n client: SuiClient,\n tx: Transaction,\n reified: Reified<T, any>\n): Promise<ToJSON<T>> {\n const inspectionResult = await client.devInspectTransactionBlock({\n sender: mockSender,\n transactionBlock: tx,\n });\n if (inspectionResult.effects.status.status !== \"success\") {\n throw new Error(`inspectionResult failed. ${JSON.stringify(inspectionResult, null, 2)}`);\n }\n\n const returnValue = inspectionResult.results?.pop()?.returnValues?.pop();\n\n if (!returnValue) {\n throw new Error(`Something with inspectionResult went wrong. ${JSON.stringify(inspectionResult, null, 2)}`);\n }\n\n const [data, _type] = returnValue;\n\n if (typeof reified === \"object\") {\n return reified.fromBcs(Uint8Array.from(data)).toJSONField() as ToJSON<T>;\n } else {\n return toBcs(reified).parse(Uint8Array.from(data));\n }\n}\n", "import { TronWeb } from \"tronweb\";\nimport { AbiItem, Web3 } from \"web3\";\nimport { encodeFunctionCall } from \"web3-eth-abi\";\nimport { AbiFunctionFragment } from \"web3-types\";\nimport { ChainType } from \"../../../chains/chain.enums\";\nimport { AllbridgeCoreClient } from \"../../../client/core-api/core-client-base\";\nimport { SdkError } from \"../../../exceptions\";\nimport { PoolInfo, TokenWithChainDetails } from \"../../../tokens-info\";\nimport { calculatePoolInfoImbalance } from \"../../../utils/calculation\";\nimport { tronAddressToEthAddress } from \"../../bridge/utils\";\nimport { RawTransaction, SmartContractMethodParameter } from \"../../models\";\nimport Pool from \"../../models/abi/Pool\";\nimport {\n ChainPoolService,\n LiquidityPoolsParams,\n LiquidityPoolsParamsWithAmount,\n UserBalance,\n UserBalanceInfo,\n} from \"../models\";\n\nexport class TronPoolService extends ChainPoolService {\n chainType: ChainType.TRX = ChainType.TRX;\n private P = 52;\n\n constructor(\n public tronWeb: TronWeb,\n public api: AllbridgeCoreClient,\n private readonly tronJsonRpc: string | undefined\n ) {\n super();\n }\n\n async getUserBalanceInfo(accountAddress: string, token: TokenWithChainDetails): Promise<UserBalanceInfo> {\n let userBalanceInfo;\n if (this.tronJsonRpc) {\n try {\n userBalanceInfo = await this.getUserBalanceInfoByBatch(this.tronJsonRpc, accountAddress, token);\n } catch (ignoreError) {\n userBalanceInfo = await this.getUserBalanceInfoPerProperty(accountAddress, token);\n }\n } else {\n userBalanceInfo = await this.getUserBalanceInfoPerProperty(accountAddress, token);\n }\n return userBalanceInfo;\n }\n\n private async getUserBalanceInfoByBatch(\n tronJsonRpc: string,\n accountAddress: string,\n token: TokenWithChainDetails\n ): Promise<UserBalanceInfo> {\n const contractAddress = tronAddressToEthAddress(token.poolAddress);\n const userAddress = tronAddressToEthAddress(accountAddress);\n\n const payload = [\n {\n jsonrpc: \"2.0\",\n id: 1,\n method: \"eth_call\",\n params: [{ to: contractAddress, data: this.getFunctionAbi(\"userRewardDebt\", userAddress) }, \"latest\"],\n },\n {\n jsonrpc: \"2.0\",\n id: 2,\n method: \"eth_call\",\n params: [{ to: contractAddress, data: this.getFunctionAbi(\"balanceOf\", userAddress) }, \"latest\"],\n },\n ];\n\n const response = await fetch(tronJsonRpc, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n });\n\n const results = await response.json();\n\n if (Array.isArray(results) && results.length === 2) {\n const getResult = (id: number) => {\n const entry = results.find((r) => r.id === id);\n if (!entry || !entry.result) {\n throw new Error(`Missing or invalid result for id ${id}`);\n }\n return Web3.utils.toBigInt(entry.result).toString();\n };\n\n return new UserBalance({\n lpAmount: Web3.utils.toBigInt(getResult(2)).toString(),\n rewardDebt: Web3.utils.toBigInt(getResult(1)).toString(),\n });\n }\n\n throw new Error(\"Batched HTTP call failed\");\n }\n\n private async getUserBalanceInfoPerProperty(\n accountAddress: string,\n token: TokenWithChainDetails\n ): Promise<UserBalanceInfo> {\n if (!this.tronWeb.defaultAddress.base58) {\n this.tronWeb.setAddress(accountAddress);\n }\n const contract = this.getContract(token.poolAddress);\n const rewardDebt = (await contract.methods.userRewardDebt(accountAddress).call()).toString();\n const lpAmount = (await contract.methods.balanceOf(accountAddress).call()).toString();\n return new UserBalance({ lpAmount, rewardDebt });\n }\n\n async getPoolInfoFromChain(token: TokenWithChainDetails): Promise<PoolInfo> {\n let poolInfo;\n if (this.tronJsonRpc) {\n try {\n poolInfo = await this.getPoolInfoByBatch(this.tronJsonRpc, token);\n } catch (ignoreError) {\n poolInfo = await this.getPoolInfoPerProperty(token);\n }\n } else {\n poolInfo = await this.getPoolInfoPerProperty(token);\n }\n return poolInfo;\n }\n\n private async getPoolInfoByBatch(tronJsonRpc: string, token: TokenWithChainDetails): Promise<PoolInfo> {\n const contractAddress = tronAddressToEthAddress(token.poolAddress);\n\n const payload = [\n {\n jsonrpc: \"2.0\",\n id: 1,\n method: \"eth_call\",\n params: [{ to: contractAddress, data: this.getFunctionAbi(\"a\") }, \"latest\"],\n },\n {\n jsonrpc: \"2.0\",\n id: 2,\n method: \"eth_call\",\n params: [{ to: contractAddress, data: this.getFunctionAbi(\"d\") }, \"latest\"],\n },\n {\n jsonrpc: \"2.0\",\n id: 3,\n method: \"eth_call\",\n params: [{ to: contractAddress, data: this.getFunctionAbi(\"tokenBalance\") }, \"latest\"],\n },\n {\n jsonrpc: \"2.0\",\n id: 4,\n method: \"eth_call\",\n params: [{ to: contractAddress, data: this.getFunctionAbi(\"vUsdBalance\") }, \"latest\"],\n },\n {\n jsonrpc: \"2.0\",\n id: 5,\n method: \"eth_call\",\n params: [{ to: contractAddress, data: this.getFunctionAbi(\"totalSupply\") }, \"latest\"],\n },\n {\n jsonrpc: \"2.0\",\n id: 6,\n method: \"eth_call\",\n params: [{ to: contractAddress, data: this.getFunctionAbi(\"accRewardPerShareP\") }, \"latest\"],\n },\n ];\n\n const response = await fetch(tronJsonRpc, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n });\n\n const results = await response.json();\n\n if (Array.isArray(results) && results.length === 6) {\n const getResult = (id: number) => {\n const entry = results.find((r) => r.id === id);\n if (!entry || !entry.result) {\n throw new Error(`Missing or invalid result for id ${id}`);\n }\n return Web3.utils.toBigInt(entry.result).toString();\n };\n\n const tokenBalanceStr = getResult(3);\n const vUsdBalanceStr = getResult(4);\n const imbalance = calculatePoolInfoImbalance({ tokenBalance: tokenBalanceStr, vUsdBalance: vUsdBalanceStr });\n\n return {\n aValue: getResult(1),\n dValue: getResult(2),\n tokenBalance: tokenBalanceStr,\n vUsdBalance: vUsdBalanceStr,\n totalLpAmount: getResult(5),\n accRewardPerShareP: getResult(6),\n p: this.P,\n imbalance,\n };\n }\n\n throw new Error(\"Batched pool info call failed\");\n }\n\n private async getPoolInfoPerProperty(token: TokenWithChainDetails): Promise<PoolInfo> {\n if (!this.tronWeb.defaultAddress.base58) {\n this.tronWeb.setAddress(token.poolAddress);\n }\n const poolContract = this.getContract(token.poolAddress);\n const [aValue, dValue, tokenBalance, vUsdBalance, totalLpAmount, accRewardPerShareP] = await Promise.all([\n poolContract.methods.a().call(),\n poolContract.methods.d().call(),\n poolContract.methods.tokenBalance().call(),\n poolContract.methods.vUsdBalance().call(),\n poolContract.methods.totalSupply().call(),\n poolContract.methods.accRewardPerShareP().call(),\n ]);\n const tokenBalanceStr = tokenBalance.toString();\n const vUsdBalanceStr = vUsdBalance.toString();\n const imbalance = calculatePoolInfoImbalance({ tokenBalance: tokenBalanceStr, vUsdBalance: vUsdBalanceStr });\n return {\n aValue: aValue.toString(),\n dValue: dValue.toString(),\n tokenBalance: tokenBalanceStr,\n vUsdBalance: vUsdBalanceStr,\n totalLpAmount: totalLpAmount.toString(),\n accRewardPerShareP: accRewardPerShareP.toString(),\n p: this.P,\n imbalance,\n };\n }\n\n buildRawTransactionDeposit(params: LiquidityPoolsParamsWithAmount): Promise<RawTransaction> {\n const { amount, accountAddress } = params;\n\n const parameter = [{ type: \"uint256\", value: amount }];\n const methodSignature = \"deposit(uint256)\";\n\n return this.buildRawTransaction(params.token.poolAddress, methodSignature, parameter, \"0\", accountAddress);\n }\n\n buildRawTransactionWithdraw(params: LiquidityPoolsParamsWithAmount): Promise<RawTransaction> {\n const { amount, accountAddress } = params;\n\n const parameter = [{ type: \"uint256\", value: amount }];\n const methodSignature = \"withdraw(uint256)\";\n\n return this.buildRawTransaction(params.token.poolAddress, methodSignature, parameter, \"0\", accountAddress);\n }\n\n buildRawTransactionClaimRewards(params: LiquidityPoolsParams): Promise<RawTransaction> {\n const { accountAddress } = params;\n\n const parameter: SmartContractMethodParameter[] = [];\n const methodSignature = \"claimRewards()\";\n\n return this.buildRawTransaction(params.token.poolAddress, methodSignature, parameter, \"0\", accountAddress);\n }\n\n private async buildRawTransaction(\n contractAddress: string,\n methodSignature: string,\n parameter: SmartContractMethodParameter[],\n value: string,\n fromAddress: string\n ): Promise<RawTransaction> {\n const transactionObject = await this.tronWeb.transactionBuilder.triggerSmartContract(\n contractAddress,\n methodSignature,\n {\n callValue: +value,\n },\n parameter,\n fromAddress\n );\n if (!transactionObject?.result?.result) {\n throw new SdkError(\"Unknown error: \" + JSON.stringify(transactionObject, null, 2));\n }\n return transactionObject.transaction;\n }\n\n private getContract(contractAddress: string): any {\n return this.tronWeb.contract(Pool.abi, contractAddress);\n }\n\n private getFunctionAbi(name: string, ...params: string[]): string {\n const abiItem = (Pool.abi as ReadonlyArray<AbiItem>).find(\n (item) => item.type === \"function\" && \"name\" in item && item.name === name\n );\n\n if (!abiItem) {\n throw new Error(`${name} method not found in Pool ABI`);\n }\n\n return encodeFunctionCall(abiItem as AbiFunctionFragment, params);\n }\n}\n", "import { TronWeb } from \"tronweb\";\nimport { FMT_BYTES, FMT_NUMBER, Web3 } from \"web3\";\nimport { Chains } from \"../../chains\";\nimport { AllbridgeCoreClient } from \"../../client/core-api/core-client-base\";\nimport { AllbridgeCoreClientFiltered } from \"../../client/core-api/core-client-filtered\";\nimport { MethodNotSupportedError } from \"../../exceptions\";\nimport { AllbridgeCoreSdkOptions, ChainType, EssentialWeb3, TokenWithChainDetails } from \"../../index\";\nimport { convertIntAmountToFloat } from \"../../utils/calculation\";\nimport { SYSTEM_PRECISION } from \"../../utils/calculation/constants\";\nimport { validateAmountDecimals, validateAmountGtZero } from \"../../utils/utils\";\nimport { NodeRpcUrlsConfig } from \"../index\";\nimport { Provider } from \"../models\";\nimport { TokenService } from \"../token\";\nimport { EvmYieldService } from \"./evm\";\nimport {\n ChainYieldService,\n CYDToken,\n TokenWithChainDetailsYield,\n YieldBalanceParams,\n YieldCheckAllowanceParams,\n YieldGetAllowanceParams,\n YieldGetEstimatedAmountOnDepositParams,\n YieldGetWithdrawProportionAmountParams,\n YieldWithdrawAmount,\n} from \"./models\";\nimport { DefaultRawYieldTransactionBuilder, RawYieldTransactionBuilder } from \"./raw-yield-transaction-builder\";\nimport { TronYieldService } from \"./trx\";\nimport { isYieldSupported } from \"./validations\";\n\nexport interface YieldService {\n rawTxBuilder: RawYieldTransactionBuilder;\n\n /**\n * Returns a list of supported {@link CYDToken}.\n */\n getCYDTokens(): Promise<CYDToken[]>;\n\n /**\n * Get amount of tokens approved for Yield\n * @param provider - will be used to access the network\n * @param params See {@link YieldGetAllowanceParams}\n * @returns the amount of approved tokens\n */\n getAllowance(params: YieldGetAllowanceParams, provider?: Provider): Promise<string>;\n\n /**\n * Check if the amount of approved tokens is enough\n * @param params See {@link YieldCheckAllowanceParams}\n * @param provider - will be used to access the network\n * @returns true if the amount of approved tokens is enough to make a transfer\n */\n checkAllowance(params: YieldCheckAllowanceParams, provider?: Provider): Promise<boolean>;\n\n /**\n * Get token balance\n * @param params\n * @param provider\n * @returns Token balance\n */\n balanceOf(params: YieldBalanceParams, provider?: Provider): Promise<string>;\n\n /**\n * Calculates the amount of CYD tokens that will be deposited\n * @param params - will be used to access the network\n * @param provider - will be used to access the network\n * @returns amount\n */\n getEstimatedAmountOnDeposit(params: YieldGetEstimatedAmountOnDepositParams, provider?: Provider): Promise<string>;\n\n /**\n * Calculates the amounts of tokens ({@link YieldWithdrawAmount}) will be withdrawn\n * @param params\n * @param provider - will be used to access the network\n * @returns amounts\n */\n getWithdrawAmounts(\n params: YieldGetWithdrawProportionAmountParams,\n provider?: Provider\n ): Promise<YieldWithdrawAmount[]>;\n}\n\nexport class DefaultYieldService implements YieldService {\n public rawTxBuilder: RawYieldTransactionBuilder;\n\n constructor(\n private api: AllbridgeCoreClientFiltered,\n private nodeRpcUrlsConfig: NodeRpcUrlsConfig,\n private params: AllbridgeCoreSdkOptions,\n private tokenService: TokenService\n ) {\n this.rawTxBuilder = new DefaultRawYieldTransactionBuilder(api, nodeRpcUrlsConfig, params, tokenService);\n }\n\n async getCYDTokens(): Promise<CYDToken[]> {\n const result: CYDToken[] = [];\n const chainMap = await this.api.getChainDetailsMap(\"pool\");\n\n Object.values(chainMap).forEach((chainData) => {\n if (chainData.yieldAddress) {\n const cydToken = chainData.tokens.find((t) => t.tokenAddress === chainData.yieldAddress);\n const tokens: TokenWithChainDetailsYield[] = chainData.tokens.filter(isYieldSupported);\n if (tokens.length > 0) {\n const cydDefined: TokenWithChainDetails = cydToken ?? {\n allbridgeChainId: chainData.allbridgeChainId,\n apr: \"\",\n apr30d: \"\",\n apr7d: \"\",\n bridgeAddress: chainData.bridgeAddress,\n chainId: chainData.chainId,\n chainName: chainData.name,\n chainSymbol: chainData.chainSymbol,\n chainType: chainData.chainType,\n confirmations: chainData.confirmations,\n decimals: 3,\n feeShare: \"\",\n lpRate: \"\",\n name: \"Core Yield\",\n poolAddress: \"\",\n symbol: \"CYD\",\n tokenAddress: chainData.yieldAddress,\n transferTime: {},\n txCostAmount: { maxAmount: \"0\", swap: \"0\", transfer: \"0\" },\n yieldAddress: chainData.yieldAddress,\n };\n result.push({\n ...cydDefined,\n yieldAddress: chainData.yieldAddress,\n tokens: tokens,\n });\n }\n }\n });\n\n return result;\n }\n\n async getAllowance(params: YieldGetAllowanceParams, provider?: Provider): Promise<string> {\n return await this.tokenService.getAllowance({ ...params, spender: params.token.yieldAddress }, provider);\n }\n\n async checkAllowance(params: YieldCheckAllowanceParams, provider?: Provider): Promise<boolean> {\n return this.tokenService.checkAllowance({ ...params, spender: params.token.yieldAddress }, provider);\n }\n\n async balanceOf(params: YieldBalanceParams, provider?: Provider): Promise<string> {\n return getChainYieldService(\n params.token.chainSymbol,\n this.api,\n this.nodeRpcUrlsConfig,\n params.owner,\n provider\n ).balanceOf(params);\n }\n\n async getEstimatedAmountOnDeposit(\n params: YieldGetEstimatedAmountOnDepositParams,\n provider?: Provider\n ): Promise<string> {\n validateAmountGtZero(params.amount);\n validateAmountDecimals(\"amount\", params.amount, params.token.decimals);\n return getChainYieldService(\n params.token.chainSymbol,\n this.api,\n this.nodeRpcUrlsConfig,\n params.token.yieldAddress,\n provider\n ).getEstimatedAmountOnDeposit(params);\n }\n\n async getWithdrawAmounts(\n params: YieldGetWithdrawProportionAmountParams,\n provider?: Provider\n ): Promise<YieldWithdrawAmount[]> {\n validateAmountGtZero(params.amount);\n validateAmountDecimals(\"amount\", params.amount, SYSTEM_PRECISION);\n const proportionAmounts = await getChainYieldService(\n params.cydToken.chainSymbol,\n this.api,\n this.nodeRpcUrlsConfig,\n params.owner,\n provider\n ).getWithdrawProportionAmount(params);\n return params.cydToken.tokens\n .filter((token) => proportionAmounts[token.yieldId] !== undefined)\n .map((token) => ({\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n amount: convertIntAmountToFloat(proportionAmounts[token.yieldId]!, token.decimals).toFixed(),\n token: token,\n }));\n }\n}\n\nexport function getChainYieldService(\n chainSymbol: string,\n api: AllbridgeCoreClient,\n nodeRpcUrlsConfig: NodeRpcUrlsConfig,\n ownerAddress: string,\n provider?: Provider\n): ChainYieldService {\n switch (Chains.getChainProperty(chainSymbol).chainType) {\n case ChainType.EVM: {\n if (provider) {\n return new EvmYieldService(provider as EssentialWeb3, api);\n } else {\n const nodeRpcUrl = nodeRpcUrlsConfig.getNodeRpcUrl(chainSymbol);\n const web3 = new Web3(nodeRpcUrl);\n web3.defaultReturnFormat = { number: FMT_NUMBER.STR, bytes: FMT_BYTES.HEX };\n return new EvmYieldService(web3, api);\n }\n }\n case ChainType.TRX: {\n if (provider) {\n return new TronYieldService(provider as TronWeb, api);\n } else {\n const nodeRpcUrl = nodeRpcUrlsConfig.getNodeRpcUrl(chainSymbol);\n const tronWeb = new TronWeb({ fullHost: nodeRpcUrl });\n tronWeb.setAddress(ownerAddress);\n return new TronYieldService(tronWeb, api);\n }\n }\n case ChainType.SOLANA: {\n throw new MethodNotSupportedError();\n }\n case ChainType.SRB: {\n throw new MethodNotSupportedError();\n }\n case ChainType.SUI: {\n throw new MethodNotSupportedError();\n }\n }\n}\n", "const artifact = {\n abi: [\n {\n inputs: [\n {\n internalType: \"string\",\n name: \"tokenName_\",\n type: \"string\",\n },\n {\n internalType: \"string\",\n name: \"tokenSymbol_\",\n type: \"string\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"constructor\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"owner\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"spender\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"value\",\n type: \"uint256\",\n },\n ],\n name: \"Approval\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"address\",\n name: \"user\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"address\",\n name: \"token\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"lpAmount\",\n type: \"uint256\",\n },\n ],\n name: \"Deposited\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"address\",\n name: \"token\",\n type: \"address\",\n },\n ],\n name: \"DepositedRewards\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"from\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256[4]\",\n name: \"values\",\n type: \"uint256[4]\",\n },\n ],\n name: \"MultiTransfer\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"previousOwner\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"newOwner\",\n type: \"address\",\n },\n ],\n name: \"OwnershipTransferred\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"from\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"value\",\n type: \"uint256\",\n },\n ],\n name: \"Transfer\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"address\",\n name: \"user\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"address\",\n name: \"token\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n ],\n name: \"Withdrawn\",\n type: \"event\",\n },\n {\n stateMutability: \"payable\",\n type: \"fallback\",\n },\n {\n inputs: [],\n name: \"NUM_TOKENS\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"owner\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"spender\",\n type: \"address\",\n },\n ],\n name: \"allowance\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"spender\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n ],\n name: \"approve\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"account\",\n type: \"address\",\n },\n ],\n name: \"balanceOf\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"decimals\",\n outputs: [\n {\n internalType: \"uint8\",\n name: \"\",\n type: \"uint8\",\n },\n ],\n stateMutability: \"pure\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"spender\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"subtractedValue\",\n type: \"uint256\",\n },\n ],\n name: \"decreaseAllowance\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"index\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"minVirtualAmount\",\n type: \"uint256\",\n },\n ],\n name: \"deposit\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"depositRewards\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"index\",\n type: \"uint256\",\n },\n ],\n name: \"getEstimatedAmountOnDeposit\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"index\",\n type: \"uint256\",\n },\n ],\n name: \"getRewardsAmount\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"user\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"virtualAmount\",\n type: \"uint256\",\n },\n ],\n name: \"getWithdrawProportionAmount\",\n outputs: [\n {\n internalType: \"uint256[4]\",\n name: \"\",\n type: \"uint256[4]\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"spender\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"addedValue\",\n type: \"uint256\",\n },\n ],\n name: \"increaseAllowance\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"name\",\n outputs: [\n {\n internalType: \"string\",\n name: \"\",\n type: \"string\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"owner\",\n outputs: [\n {\n internalType: \"address\",\n name: \"\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n name: \"pools\",\n outputs: [\n {\n internalType: \"contract IPool\",\n name: \"\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"renounceOwnership\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"index\",\n type: \"uint256\",\n },\n {\n internalType: \"contract IPool\",\n name: \"pool\",\n type: \"address\",\n },\n ],\n name: \"setPool\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"account\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"index\",\n type: \"uint256\",\n },\n ],\n name: \"subBalanceOf\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"index\",\n type: \"uint256\",\n },\n ],\n name: \"subDepositRewards\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"index\",\n type: \"uint256\",\n },\n ],\n name: \"subTotalSupply\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"index\",\n type: \"uint256\",\n },\n ],\n name: \"subTransfer\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"from\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"index\",\n type: \"uint256\",\n },\n ],\n name: \"subTransferFrom\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"virtualAmount\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"index\",\n type: \"uint256\",\n },\n ],\n name: \"subWithdraw\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"symbol\",\n outputs: [\n {\n internalType: \"string\",\n name: \"\",\n type: \"string\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n name: \"tokens\",\n outputs: [\n {\n internalType: \"contract IERC20\",\n name: \"\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"totalSupply\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n ],\n name: \"transfer\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"from\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n ],\n name: \"transferFrom\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"newOwner\",\n type: \"address\",\n },\n ],\n name: \"transferOwnership\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"virtualAmount\",\n type: \"uint256\",\n },\n ],\n name: \"withdraw\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n stateMutability: \"payable\",\n type: \"receive\",\n },\n ],\n} as const;\nexport default artifact;\n", "import { ChainType } from \"../../../chains/chain.enums\";\nimport { AllbridgeCoreClient } from \"../../../client/core-api/core-client-base\";\nimport { RawTransaction } from \"../../models\";\nimport {\n YieldBalanceParams,\n YieldDepositParams,\n YieldGetEstimatedAmountOnDepositParams,\n YieldGetWithdrawProportionAmountParams,\n YieldWithdrawParams,\n} from \"./yield.model\";\n\nexport abstract class ChainYieldService {\n abstract chainType: ChainType;\n abstract api: AllbridgeCoreClient;\n\n abstract balanceOf(params: YieldBalanceParams): Promise<string>;\n\n abstract getEstimatedAmountOnDeposit(params: YieldGetEstimatedAmountOnDepositParams): Promise<string>;\n\n abstract getWithdrawProportionAmount(params: YieldGetWithdrawProportionAmountParams): Promise<string[]>;\n\n abstract buildRawTransactionDeposit(params: YieldDepositParams): Promise<RawTransaction>;\n\n abstract buildRawTransactionWithdraw(params: YieldWithdrawParams): Promise<RawTransaction>;\n}\n", "import { Contract } from \"web3\";\nimport { ChainType } from \"../../../chains/chain.enums\";\nimport { AllbridgeCoreClient } from \"../../../client/core-api/core-client-base\";\nimport { convertFloatAmountToInt, convertIntAmountToFloat } from \"../../../utils/calculation\";\nimport { SYSTEM_PRECISION } from \"../../../utils/calculation/constants\";\nimport { EssentialWeb3, RawTransaction } from \"../../models\";\nimport Yield from \"../../models/abi/PortfolioToken\";\nimport {\n ChainYieldService,\n YieldBalanceParams,\n YieldDepositParams,\n YieldGetEstimatedAmountOnDepositParams,\n YieldGetWithdrawProportionAmountParams,\n YieldWithdrawParams,\n} from \"../models\";\n\nexport class EvmYieldService extends ChainYieldService {\n chainType: ChainType.EVM = ChainType.EVM;\n\n constructor(\n public web3: EssentialWeb3,\n public api: AllbridgeCoreClient\n ) {\n super();\n }\n\n async balanceOf(params: YieldBalanceParams): Promise<string> {\n const vCYD = (\n await this.getYieldContract(params.token.yieldAddress).methods.balanceOf(params.owner).call()\n ).toString();\n return convertIntAmountToFloat(vCYD, SYSTEM_PRECISION).toFixed();\n }\n\n async getEstimatedAmountOnDeposit(params: YieldGetEstimatedAmountOnDepositParams): Promise<string> {\n const amountInt = convertFloatAmountToInt(params.amount, params.token.decimals).toFixed();\n const resultInt = (\n await this.getYieldContract(params.token.yieldAddress)\n .methods.getEstimatedAmountOnDeposit(amountInt, params.token.yieldId)\n .call()\n ).toString();\n return convertIntAmountToFloat(resultInt, SYSTEM_PRECISION).toFixed();\n }\n\n async getWithdrawProportionAmount(params: YieldGetWithdrawProportionAmountParams): Promise<string[]> {\n const amountInt = convertFloatAmountToInt(params.amount, SYSTEM_PRECISION).toFixed();\n return await this.getYieldContract(params.cydToken.yieldAddress)\n .methods.getWithdrawProportionAmount(params.owner, amountInt)\n .call();\n }\n\n async buildRawTransactionDeposit(params: YieldDepositParams): Promise<RawTransaction> {\n return Promise.resolve({\n ...this.buildTxParams({ owner: params.owner, yieldAddress: params.token.yieldAddress }),\n data: this.getYieldContract(params.token.yieldAddress)\n .methods.deposit(params.amount, params.token.yieldId, params.minVirtualAmount)\n .encodeABI(),\n });\n }\n\n async buildRawTransactionWithdraw(params: YieldWithdrawParams): Promise<RawTransaction> {\n return Promise.resolve({\n ...this.buildTxParams({ owner: params.owner, yieldAddress: params.token.yieldAddress }),\n data: this.getYieldContract(params.token.yieldAddress).methods.withdraw(params.amount).encodeABI(),\n });\n }\n\n buildTxParams(params: { owner: string; yieldAddress: string }) {\n return {\n from: params.owner,\n to: params.yieldAddress,\n value: \"0\",\n };\n }\n\n private getYieldContract(contractAddress: string) {\n return new this.web3.eth.Contract(Yield.abi, contractAddress) as Contract<typeof Yield.abi>;\n }\n}\n", "import { NodeRpcUrlsConfig } from \"..\";\nimport { AllbridgeCoreClient } from \"../../client/core-api/core-client-base\";\nimport { AllbridgeCoreSdkOptions } from \"../../index\";\nimport { convertFloatAmountToInt } from \"../../utils/calculation\";\nimport { SYSTEM_PRECISION } from \"../../utils/calculation/constants\";\nimport { validateAmountDecimals, validateAmountGtZero } from \"../../utils/utils\";\nimport { Provider, RawTransaction } from \"../models\";\nimport { TokenService } from \"../token\";\nimport { YieldApproveParams, YieldDepositParams, YieldWithdrawParams } from \"./models/yield.model\";\nimport { getChainYieldService } from \"./index\";\n\nexport interface RawYieldTransactionBuilder {\n /**\n * Creates a Raw Transaction for approving tokens usage by the Yield\n * @param approveData\n * @param provider - will be used to access the network\n */\n approve(approveData: YieldApproveParams, provider?: Provider): Promise<RawTransaction>;\n\n /**\n * Creates a Raw Transaction for depositing tokens to Yield\n * @param params\n * @param provider - will be used to access the network\n */\n deposit(params: YieldDepositParams, provider?: Provider): Promise<RawTransaction>;\n\n /**\n * Creates a Raw Transaction for withdrawing tokens from Yield\n * @param params\n * @param provider - will be used to access the network\n */\n withdraw(params: YieldWithdrawParams, provider?: Provider): Promise<RawTransaction>;\n}\n\nexport class DefaultRawYieldTransactionBuilder implements RawYieldTransactionBuilder {\n constructor(\n private api: AllbridgeCoreClient,\n private nodeRpcUrlsConfig: NodeRpcUrlsConfig,\n private params: AllbridgeCoreSdkOptions,\n private tokenService: TokenService\n ) {}\n\n async approve(approveData: YieldApproveParams, provider?: Provider): Promise<RawTransaction> {\n return this.tokenService.buildRawTransactionApprove(\n {\n ...approveData,\n spender: approveData.token.yieldAddress,\n },\n provider\n );\n }\n\n async deposit(params: YieldDepositParams, provider?: Provider): Promise<RawTransaction> {\n validateAmountGtZero(params.amount);\n validateAmountDecimals(\"amount\", params.amount, params.token.decimals);\n validateAmountGtZero(params.minVirtualAmount);\n validateAmountDecimals(\"minVirtualAmount\", params.minVirtualAmount, 3);\n params.amount = convertFloatAmountToInt(params.amount, params.token.decimals).toFixed();\n params.minVirtualAmount = convertFloatAmountToInt(params.minVirtualAmount, 3).toFixed();\n return getChainYieldService(\n params.token.chainSymbol,\n this.api,\n this.nodeRpcUrlsConfig,\n params.owner,\n provider\n ).buildRawTransactionDeposit(params);\n }\n\n async withdraw(params: YieldWithdrawParams, provider?: Provider): Promise<RawTransaction> {\n validateAmountGtZero(params.amount);\n validateAmountDecimals(\"amount\", params.amount, SYSTEM_PRECISION);\n params.amount = convertFloatAmountToInt(params.amount, SYSTEM_PRECISION).toFixed();\n return getChainYieldService(\n params.token.chainSymbol,\n this.api,\n this.nodeRpcUrlsConfig,\n params.owner,\n provider\n ).buildRawTransactionWithdraw(params);\n }\n}\n", "import { TronWeb } from \"tronweb\";\nimport { ChainType } from \"../../../chains/chain.enums\";\nimport { AllbridgeCoreClient } from \"../../../client/core-api/core-client-base\";\nimport { SdkError } from \"../../../exceptions\";\nimport { convertFloatAmountToInt, convertIntAmountToFloat } from \"../../../utils/calculation\";\nimport { SYSTEM_PRECISION } from \"../../../utils/calculation/constants\";\nimport { RawTransaction, SmartContractMethodParameter } from \"../../models\";\nimport Yield from \"../../models/abi/PortfolioToken\";\nimport {\n ChainYieldService,\n YieldBalanceParams,\n YieldDepositParams,\n YieldGetEstimatedAmountOnDepositParams,\n YieldGetWithdrawProportionAmountParams,\n YieldWithdrawParams,\n} from \"../models\";\n\nexport class TronYieldService extends ChainYieldService {\n chainType: ChainType.TRX = ChainType.TRX;\n\n constructor(\n public tronWeb: TronWeb,\n public api: AllbridgeCoreClient\n ) {\n super();\n }\n\n async balanceOf(params: YieldBalanceParams): Promise<string> {\n const vCYD = (\n await (await this.getContract(params.token.yieldAddress)).methods.balanceOf(params.owner).call()\n ).toString();\n return convertIntAmountToFloat(vCYD, SYSTEM_PRECISION).toFixed();\n }\n\n async getEstimatedAmountOnDeposit(params: YieldGetEstimatedAmountOnDepositParams): Promise<string> {\n const amountInt = convertFloatAmountToInt(params.amount, params.token.decimals).toFixed();\n const resultInt = (\n await (await this.getContract(params.token.yieldAddress)).methods\n .getEstimatedAmountOnDeposit(amountInt, params.token.yieldId)\n .call()\n ).toString();\n return convertIntAmountToFloat(resultInt, SYSTEM_PRECISION).toFixed();\n }\n\n async getWithdrawProportionAmount(params: YieldGetWithdrawProportionAmountParams): Promise<string[]> {\n const amountInt = convertFloatAmountToInt(params.amount, SYSTEM_PRECISION).toFixed();\n const result = await (await this.getContract(params.cydToken.yieldAddress)).methods\n .getWithdrawProportionAmount(params.owner, amountInt)\n .call();\n return result.toString().split(\",\");\n }\n\n async buildRawTransactionDeposit(params: YieldDepositParams): Promise<RawTransaction> {\n const { amount, owner, token, minVirtualAmount } = params;\n const parameter = [\n { type: \"uint256\", value: amount },\n { type: \"uint256\", value: token.yieldId },\n { type: \"uint256\", value: minVirtualAmount },\n ];\n const methodSignature = \"deposit(uint256,uint256,uint256)\";\n\n return this.buildRawTransaction(params.token.yieldAddress, methodSignature, parameter, \"0\", owner);\n }\n\n async buildRawTransactionWithdraw(params: YieldWithdrawParams): Promise<RawTransaction> {\n const { amount, owner } = params;\n\n const parameter = [{ type: \"uint256\", value: amount }];\n const methodSignature = \"withdraw(uint256)\";\n\n return this.buildRawTransaction(params.token.yieldAddress, methodSignature, parameter, \"0\", owner);\n }\n\n private async buildRawTransaction(\n contractAddress: string,\n methodSignature: string,\n parameter: SmartContractMethodParameter[],\n value: string,\n fromAddress: string\n ): Promise<RawTransaction> {\n const transactionObject = await this.tronWeb.transactionBuilder.triggerSmartContract(\n contractAddress,\n methodSignature,\n {\n callValue: +value,\n },\n parameter,\n fromAddress\n );\n if (!transactionObject?.result?.result) {\n throw new SdkError(\"Unknown error: \" + JSON.stringify(transactionObject, null, 2));\n }\n return transactionObject.transaction;\n }\n\n private getContract(contractAddress: string): any {\n return this.tronWeb.contract(Yield.abi, contractAddress);\n }\n}\n", "import { YieldDoesNotSupportedError } from \"../../exceptions\";\nimport { TokenWithChainDetails } from \"../../tokens-info\";\nimport { TokenWithChainDetailsYield } from \"./models\";\n\n/**\n * Assert that token is supported by Yield,</br>\n * asserts token is TokenWithChainDetailsYield</br>\n * throws {@link YieldDoesNotSupportedError} if not\n * @param token\n */\nexport function assertYieldIsSupported(token: TokenWithChainDetails): asserts token is TokenWithChainDetailsYield {\n if (!isYieldSupported(token)) {\n throw new YieldDoesNotSupportedError(\"Token does not support Yield\");\n }\n}\n\n/**\n * is Yield support\n * @param token\n * @return isYieldSupported\n */\nexport function isYieldSupported(token: TokenWithChainDetails): token is TokenWithChainDetailsYield {\n return !!token.yieldAddress && token.yieldId !== undefined;\n}\n", "import { Big, BigSource } from \"big.js\";\nimport { PoolInfo, Token } from \"../../tokens-info\";\nimport { fromSystemPrecision, getY, toSystemPrecision } from \"./index\";\n\nexport interface SwapPoolInfo {\n decimals: number;\n feeShare: string;\n poolInfo: PoolInfo;\n}\n\nexport interface SwapAndBridgeCalculationData {\n swapToVUsdCalcResult: SwapToVUsdCalcResult;\n swapFromVUsdCalcResult: SwapFromVUsdCalcResult;\n}\n\nexport interface SwapToVUsdCalcResult {\n bridgeFeeInTokenPrecision: string;\n amountIncludingCommissionInSystemPrecision: string;\n amountExcludingCommissionInSystemPrecision: string;\n}\nexport interface SwapFromVUsdCalcResult {\n bridgeFeeInTokenPrecision: string;\n amountIncludingCommissionInTokenPrecision: string;\n amountExcludingCommissionInTokenPrecision: string;\n}\n\nexport function swapAndBridgeFeeCalculation(\n amountInTokenPrecision: string,\n sourcePoolInfo: SwapPoolInfo,\n destinationPoolInfo: SwapPoolInfo\n): SwapAndBridgeCalculationData {\n const swapToVUsdCalcResult = swapToVUsd(\n amountInTokenPrecision,\n { decimals: sourcePoolInfo.decimals, feeShare: sourcePoolInfo.feeShare },\n sourcePoolInfo.poolInfo\n );\n const swapFromVUsdCalcResult = swapFromVUsd(\n swapToVUsdCalcResult.amountIncludingCommissionInSystemPrecision,\n { decimals: destinationPoolInfo.decimals, feeShare: destinationPoolInfo.feeShare },\n destinationPoolInfo.poolInfo\n );\n return { swapToVUsdCalcResult, swapFromVUsdCalcResult };\n}\n\nexport function swapAndBridgeFeeCalculationReverse(\n amountInTokenPrecision: string,\n sourcePoolInfo: SwapPoolInfo,\n destinationPoolInfo: SwapPoolInfo\n): SwapAndBridgeCalculationData {\n const swapToVUsdCalcResult = swapToVUsdReverse(\n amountInTokenPrecision,\n { decimals: destinationPoolInfo.decimals, feeShare: destinationPoolInfo.feeShare },\n destinationPoolInfo.poolInfo\n );\n const swapFromVUsdCalcResult = swapFromVUsdReverse(\n swapToVUsdCalcResult.amountIncludingCommissionInSystemPrecision,\n { decimals: sourcePoolInfo.decimals, feeShare: sourcePoolInfo.feeShare },\n sourcePoolInfo.poolInfo\n );\n return {\n swapToVUsdCalcResult,\n swapFromVUsdCalcResult,\n };\n}\n\nfunction swapToVUsd(\n amount: BigSource,\n { feeShare, decimals }: Pick<Token, \"feeShare\" | \"decimals\">,\n poolInfo: Omit<PoolInfo, \"p\" | \"imbalance\">\n): SwapToVUsdCalcResult {\n const amountValue = Big(amount);\n const fee = amountValue.times(feeShare);\n const amountWithoutFee = amountValue.minus(fee);\n return {\n bridgeFeeInTokenPrecision: fee.round().toFixed(),\n amountIncludingCommissionInSystemPrecision: calcSwapToVUsd(toSystemPrecision(amountWithoutFee, decimals), poolInfo),\n amountExcludingCommissionInSystemPrecision: calcSwapToVUsd(toSystemPrecision(amountValue, decimals), poolInfo),\n };\n}\n\nfunction calcSwapToVUsd(amountInSystemPrecision: Big, poolInfo: Omit<PoolInfo, \"p\" | \"imbalance\">): string {\n if (amountInSystemPrecision.eq(0)) {\n return \"0\";\n }\n const tokenBalance = Big(poolInfo.tokenBalance).plus(amountInSystemPrecision);\n const vUsdNewAmount = getY(tokenBalance.toFixed(), poolInfo.aValue, poolInfo.dValue);\n return Big(poolInfo.vUsdBalance).minus(vUsdNewAmount).round().toFixed();\n}\n\nfunction swapFromVUsd(\n amount: BigSource,\n { feeShare, decimals }: Pick<Token, \"feeShare\" | \"decimals\">,\n poolInfo: Omit<PoolInfo, \"imbalance\">\n): SwapFromVUsdCalcResult {\n if (Big(amount).eq(0)) {\n return {\n bridgeFeeInTokenPrecision: \"0\",\n amountIncludingCommissionInTokenPrecision: \"0\",\n amountExcludingCommissionInTokenPrecision: \"0\",\n };\n }\n const amountValue = Big(amount);\n const vUsdBalance = amountValue.plus(poolInfo.vUsdBalance);\n const newAmount = getY(vUsdBalance, poolInfo.aValue, poolInfo.dValue);\n const result = fromSystemPrecision(Big(poolInfo.tokenBalance).minus(newAmount), decimals);\n const fee = Big(result).times(feeShare);\n const resultWithoutFee = Big(result).minus(fee).round();\n return {\n bridgeFeeInTokenPrecision: fee.round().toFixed(),\n amountIncludingCommissionInTokenPrecision: resultWithoutFee.toFixed(),\n amountExcludingCommissionInTokenPrecision: result.toFixed(),\n };\n}\n\nfunction swapToVUsdReverse(\n amountInTokenPrecision: BigSource,\n { feeShare, decimals }: Pick<Token, \"feeShare\" | \"decimals\">,\n poolInfo: PoolInfo\n): SwapToVUsdCalcResult {\n const reversedFeeShare = Big(feeShare).div(Big(1).minus(feeShare));\n const fee = Big(amountInTokenPrecision).times(reversedFeeShare);\n const amountWithFee = Big(amountInTokenPrecision).plus(fee);\n return {\n bridgeFeeInTokenPrecision: fee.round().toFixed(),\n amountIncludingCommissionInSystemPrecision: calcSwapToVUsdReverse(\n toSystemPrecision(amountWithFee, decimals),\n poolInfo\n ),\n amountExcludingCommissionInSystemPrecision: calcSwapToVUsdReverse(\n toSystemPrecision(amountInTokenPrecision, decimals),\n poolInfo\n ),\n };\n}\n\nfunction calcSwapToVUsdReverse(amountInSystemPrecision: Big, poolInfo: PoolInfo): string {\n const tokenBalance = Big(poolInfo.tokenBalance).minus(amountInSystemPrecision);\n const vUsdNewAmount = getY(tokenBalance.toFixed(), poolInfo.aValue, poolInfo.dValue);\n return Big(vUsdNewAmount).minus(poolInfo.vUsdBalance).round().toFixed();\n}\n\nfunction swapFromVUsdReverse(\n amountInSystemPrecision: BigSource,\n { feeShare, decimals }: Pick<Token, \"feeShare\" | \"decimals\">,\n poolInfo: PoolInfo\n): SwapFromVUsdCalcResult {\n if (Big(amountInSystemPrecision).eq(0)) {\n return {\n bridgeFeeInTokenPrecision: \"0\",\n amountIncludingCommissionInTokenPrecision: \"0\",\n amountExcludingCommissionInTokenPrecision: \"0\",\n };\n }\n const vUsdNewAmount = Big(poolInfo.vUsdBalance).minus(amountInSystemPrecision);\n const tokenBalance = getY(vUsdNewAmount.toFixed(), poolInfo.aValue, poolInfo.dValue);\n const inSystemPrecision = Big(tokenBalance).minus(poolInfo.tokenBalance);\n const amountWithoutFee = fromSystemPrecision(inSystemPrecision.toFixed(), decimals);\n const reversedFeeShare = Big(feeShare).div(Big(1).minus(feeShare));\n const fee = Big(amountWithoutFee).times(reversedFeeShare);\n const amount = Big(amountWithoutFee).plus(fee);\n return {\n bridgeFeeInTokenPrecision: fee.round().toFixed(),\n amountIncludingCommissionInTokenPrecision: amount.round().toFixed(),\n amountExcludingCommissionInTokenPrecision: amountWithoutFee.toFixed(),\n };\n}\n", "import { Big } from \"big.js\";\nimport { PoolInfo, TokenWithChainDetails } from \"../../tokens-info\";\nimport { convertIntAmountToFloat, fromSystemPrecision, swapFromVUsd, swapToVUsd } from \"./index\";\n\nexport interface SendAmountDetails {\n sourceLPSwap: AmountImpact;\n destLPSwap: AmountImpact;\n}\n\nexport interface AmountImpact {\n fee: string;\n swap: string;\n}\n\nexport function getSendAmountDetails(\n amountInTokenPrecision: string,\n sourceToken: TokenWithChainDetails,\n sourcePool: PoolInfo,\n destToken: TokenWithChainDetails,\n destPool: PoolInfo\n): SendAmountDetails {\n const vUsd = swapToVUsd(amountInTokenPrecision, sourceToken, sourcePool);\n const vUsdInTokenPrecision = fromSystemPrecision(vUsd, sourceToken.decimals);\n const result = swapFromVUsd(vUsd, destToken, destPool);\n\n const swapToFeeInt = Big(amountInTokenPrecision).times(sourceToken.feeShare);\n const swapFromFeeInt = Big(result).div(Big(1).minus(destToken.feeShare)).minus(result);\n return {\n sourceLPSwap: {\n fee: convertIntAmountToFloat(swapToFeeInt, sourceToken.decimals)\n .neg()\n .round(sourceToken.decimals, Big.roundUp)\n .toFixed(),\n swap: convertIntAmountToFloat(\n Big(amountInTokenPrecision).minus(vUsdInTokenPrecision).minus(swapToFeeInt),\n sourceToken.decimals\n )\n .neg()\n .round(sourceToken.decimals, Big.roundUp)\n .toFixed(),\n },\n destLPSwap: {\n fee: convertIntAmountToFloat(swapFromFeeInt, destToken.decimals)\n .neg()\n .round(destToken.decimals, Big.roundUp)\n .toFixed(),\n swap: convertIntAmountToFloat(\n fromSystemPrecision(vUsd, destToken.decimals).minus(result).minus(swapFromFeeInt),\n destToken.decimals\n )\n .neg()\n .round(destToken.decimals, Big.roundUp)\n .toFixed(),\n },\n };\n}\n", "import axios, { Axios } from \"axios\";\nimport { InvalidMessengerOptionError } from \"../../exceptions\";\nimport { ChainDetailsMapWithFlags, PoolInfoMap, PoolKeyObject } from \"../../tokens-info\";\nimport { VERSION } from \"../../version\";\nimport {\n mapChainDetailsResponseToChainDetailsMap,\n mapChainDetailsResponseToPoolInfoMap,\n mapPoolInfoResponseToPoolInfoMap,\n} from \"./core-api-mapper\";\nimport {\n ChainDetailsResponse,\n GasBalanceResponse,\n Messenger,\n PendingInfoResponse,\n PoolInfoResponse,\n ReceiveTransactionCostRequest,\n ReceiveTransactionCostResponse,\n TransferStatusResponse,\n} from \"./core-api.model\";\nimport { AllbridgeCoreClientParams } from \"./core-client-base\";\n\nexport interface TokenInfo {\n chainDetailsMap: ChainDetailsMapWithFlags;\n poolInfoMap: PoolInfoMap;\n}\n\nexport interface ApiClient {\n getTokenInfo(): Promise<TokenInfo>;\n\n getPendingInfo(): Promise<PendingInfoResponse>;\n\n getGasBalance(chainSymbol: string, address: string): Promise<GasBalanceResponse>;\n\n getTransferStatus(chainSymbol: string, txId: string): Promise<TransferStatusResponse>;\n\n getReceiveTransactionCost(args: ReceiveTransactionCostRequest): Promise<ReceiveTransactionCostResponse>;\n\n getPoolInfoMap(pools: PoolKeyObject[] | PoolKeyObject): Promise<PoolInfoMap>;\n}\n\nexport class ApiClientImpl implements ApiClient {\n private api: Axios;\n\n constructor(params: AllbridgeCoreClientParams) {\n this.api = axios.create({\n baseURL: params.coreApiUrl,\n headers: {\n Accept: \"application/json\",\n ...params.coreApiHeaders,\n \"x-Sdk-Agent\": \"AllbridgeCoreSDK/\" + VERSION,\n },\n params: params.coreApiQueryParams,\n });\n }\n\n async getTokenInfo(): Promise<TokenInfo> {\n const { data } = await this.api.get<ChainDetailsResponse>(\"/token-info\", { params: { filter: \"all\" } });\n return {\n chainDetailsMap: mapChainDetailsResponseToChainDetailsMap(data),\n poolInfoMap: mapChainDetailsResponseToPoolInfoMap(data),\n };\n }\n\n async getPendingInfo(): Promise<PendingInfoResponse> {\n const { data } = await this.api.get<PendingInfoResponse>(\"/pending-info\");\n return data;\n }\n\n async getGasBalance(chainSymbol: string, address: string): Promise<GasBalanceResponse> {\n const { data } = await this.api.get<GasBalanceResponse>(`/check/${chainSymbol}/${address}`);\n return data;\n }\n\n async getTransferStatus(chainSymbol: string, txId: string): Promise<TransferStatusResponse> {\n const { data } = await this.api.get<TransferStatusResponse>(`/chain/${chainSymbol}/${txId}`);\n return data;\n }\n\n async getReceiveTransactionCost(args: ReceiveTransactionCostRequest): Promise<ReceiveTransactionCostResponse> {\n if (args.messenger === Messenger.OFT && !args.sourceToken) {\n throw new InvalidMessengerOptionError(\"For OFT sourceToken required\");\n }\n const { data } = await this.api.post<ReceiveTransactionCostResponse>(\"/receive-fee\", args, {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n return {\n exchangeRate: data.exchangeRate,\n fee: data.fee,\n sourceNativeTokenPrice: data.sourceNativeTokenPrice,\n adminFeeShareWithExtras: data.adminFeeShareWithExtras,\n };\n }\n\n async getPoolInfoMap(pools: PoolKeyObject[] | PoolKeyObject): Promise<PoolInfoMap> {\n const poolKeys = pools instanceof Array ? pools : [pools];\n const { data } = await this.api.post<PoolInfoResponse>(\n \"/pool-info\",\n { pools: poolKeys },\n {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n return mapPoolInfoResponseToPoolInfoMap(data);\n }\n}\n", "export const VERSION = \"3.27.0\";\n", "import { Chains } from \"../../chains\";\nimport { ChainSymbol } from \"../../chains/chain.enums\";\nimport {\n ChainDetails,\n ChainDetailsMap,\n ChainDetailsMapWithFlags,\n ChainDetailsWithTokensWithFlags,\n MessengerTransferTime,\n PoolInfoMap,\n PoolKeyObject,\n TokenWithChainDetailsWithFlags,\n TransferTime,\n} from \"../../tokens-info\";\nimport { calculatePoolInfoImbalance } from \"../../utils/calculation\";\nimport {\n ChainDetailsDTO,\n ChainDetailsResponse,\n Messenger,\n MessengerKeyDTO,\n MessengerTransferTimeDTO,\n PoolInfoResponse,\n TokenDTO,\n TransferTimeDTO,\n} from \"./core-api.model\";\n\nexport function mapChainDetailsResponseToChainDetailsMap(response: ChainDetailsResponse): ChainDetailsMapWithFlags {\n return Object.entries(response).reduce<ChainDetailsMapWithFlags>((map, entry) => {\n const chainSymbol = entry[0];\n const chainDetailsDTO = entry[1];\n const chainDetails = mapChainDetailsFromDto(chainSymbol, chainDetailsDTO);\n if (chainDetails) {\n map[chainSymbol] = chainDetails;\n }\n return map;\n }, {});\n}\n\nexport function mapChainDetailsResponseToPoolInfoMap(response: ChainDetailsResponse): PoolInfoMap {\n const poolInfoMap: PoolInfoMap = {};\n for (const [chainSymbolValue, chainDetailsDTO] of Object.entries(response)) {\n const chainSymbol = chainSymbolValue;\n for (const token of chainDetailsDTO.tokens) {\n const poolKey = mapPoolKeyObjectToPoolKey({\n chainSymbol,\n poolAddress: token.poolAddress,\n });\n const imbalance = calculatePoolInfoImbalance(token.poolInfo);\n poolInfoMap[poolKey] = { ...token.poolInfo, imbalance };\n }\n }\n return poolInfoMap;\n}\n\nfunction mapTokenWithChainDetailsFromDto(chainDetails: ChainDetails, dto: TokenDTO): TokenWithChainDetailsWithFlags {\n const { name: chainName, ...chainDetailsWithoutName } = chainDetails;\n const { poolInfo: _poolInfo, ...dtoWithoutPoolInfo } = dto;\n return {\n ...dtoWithoutPoolInfo,\n ...chainDetailsWithoutName,\n chainName,\n };\n}\n\nfunction mapMessengerKeyDtoToMessenger(dto: MessengerKeyDTO): Messenger | null {\n switch (dto) {\n case MessengerKeyDTO.ALLBRIDGE:\n return Messenger.ALLBRIDGE;\n case MessengerKeyDTO.WORMHOLE:\n return Messenger.WORMHOLE;\n case MessengerKeyDTO.CCTP:\n return Messenger.CCTP;\n case MessengerKeyDTO.CCTP_V2:\n return Messenger.CCTP_V2;\n case MessengerKeyDTO.OFT:\n return Messenger.OFT;\n }\n}\n\nfunction mapTransferTimeFromDto(dto: TransferTimeDTO): TransferTime {\n return Object.entries(dto).reduce<TransferTime>((result, [key, value]) => {\n result[key as ChainSymbol] = mapMessengerTransferTimeFromDto(value);\n return result;\n }, {});\n}\n\nfunction mapMessengerTransferTimeFromDto(dto: MessengerTransferTimeDTO): MessengerTransferTime {\n return Object.entries(dto).reduce<MessengerTransferTime>((messengerTransferTime, [key, value]) => {\n const messenger = mapMessengerKeyDtoToMessenger(key as MessengerKeyDTO);\n if (messenger && value != null) {\n messengerTransferTime[messenger] = value;\n }\n return messengerTransferTime;\n }, {});\n}\n\nfunction mapChainDetailsFromDto(chainSymbol: string, dto: ChainDetailsDTO): ChainDetailsWithTokensWithFlags | null {\n const basicChainProperties = Chains.getChainsProperties()[chainSymbol];\n if (!basicChainProperties) {\n return null;\n }\n const chainDetails: ChainDetails = {\n ...basicChainProperties,\n allbridgeChainId: dto.chainId,\n bridgeAddress: dto.bridgeAddress,\n oftBridgeAddress: dto.oftBridgeAddress,\n yieldAddress: dto.yieldAddress,\n transferTime: mapTransferTimeFromDto(dto.transferTime),\n txCostAmount: dto.txCostAmount,\n confirmations: dto.confirmations,\n suiAddresses: dto.suiAddresses,\n };\n return {\n ...chainDetails,\n tokens: dto.tokens.map((tokenDto) => mapTokenWithChainDetailsFromDto(chainDetails, tokenDto)),\n };\n}\n\nexport function mapPoolKeyToPoolKeyObject(poolKey: string): PoolKeyObject {\n const dividerPosition = poolKey.indexOf(\"_\");\n return {\n chainSymbol: poolKey.substring(0, dividerPosition),\n poolAddress: poolKey.substring(dividerPosition + 1),\n };\n}\n\nexport function mapPoolKeyObjectToPoolKey(poolKeyObject: PoolKeyObject): string {\n return poolKeyObject.chainSymbol + \"_\" + poolKeyObject.poolAddress;\n}\n\nexport function mapChainDetailsMapToPoolKeyObjects(chainDetailsMap: ChainDetailsMap): PoolKeyObject[] {\n const result = [];\n for (const [chainSymbolValue, chainDetails] of Object.entries(chainDetailsMap)) {\n const chainSymbol = chainSymbolValue;\n for (const token of chainDetails.tokens) {\n result.push({\n chainSymbol,\n poolAddress: token.poolAddress,\n });\n }\n }\n return result;\n}\n\nexport function mapPoolInfoResponseToPoolInfoMap(responseBody: PoolInfoResponse): PoolInfoMap {\n const poolInfoMap: PoolInfoMap = {};\n for (const [chainSymbolValue, poolInfoByAddress] of Object.entries(responseBody)) {\n const chainSymbol = chainSymbolValue;\n for (const [poolAddress, poolInfo] of Object.entries(poolInfoByAddress)) {\n poolInfo.imbalance = calculatePoolInfoImbalance(poolInfo);\n poolInfoMap[mapPoolKeyObjectToPoolKey({ chainSymbol, poolAddress })] = poolInfo;\n }\n }\n return poolInfoMap;\n}\n", "import Cache from \"timed-cache\";\nimport { PoolInfoMap, PoolKeyObject } from \"../../tokens-info\";\nimport { ApiClient, TokenInfo } from \"./api-client\";\nimport {\n GasBalanceResponse,\n PendingInfoResponse,\n ReceiveTransactionCostRequest,\n ReceiveTransactionCostResponse,\n TransferStatusResponse,\n} from \"./core-api.model\";\n\nconst _20_SECONDS_TTL = 20 * 1000;\nconst _55_SECONDS_TTL = 55 * 1000;\n\nexport class ApiClientCaching implements ApiClient {\n private tokenInfoCache: Cache<Promise<TokenInfo>>;\n private pendingInfoCache: Cache<Promise<PendingInfoResponse>>;\n private gasBalanceCache: Cache<Promise<GasBalanceResponse>>;\n private receivedTransactionCache: Cache<ReceiveTransactionCostResponse>;\n\n constructor(private apiClient: ApiClient) {\n this.tokenInfoCache = new Cache({ defaultTtl: _55_SECONDS_TTL });\n this.receivedTransactionCache = new Cache({ defaultTtl: _20_SECONDS_TTL });\n this.pendingInfoCache = new Cache({ defaultTtl: _20_SECONDS_TTL });\n this.gasBalanceCache = new Cache({ defaultTtl: _20_SECONDS_TTL });\n }\n\n getTokenInfo(): Promise<TokenInfo> {\n const TOKEN_INFO_CACHE_KEY = \"TOKEN_INFO_CACHE_KEY\";\n const tokenInfo = this.tokenInfoCache.get(TOKEN_INFO_CACHE_KEY);\n if (tokenInfo) {\n return tokenInfo;\n }\n const tokenInfoPromise = this.apiClient.getTokenInfo();\n this.tokenInfoCache.put(TOKEN_INFO_CACHE_KEY, tokenInfoPromise);\n return tokenInfoPromise;\n }\n\n async getGasBalance(chainSymbol: string, address: string): Promise<GasBalanceResponse> {\n const GAS_BALANCE_CACHE_KEY = `GAS_BALANCE_${chainSymbol}_${address}`;\n const gasBalance = this.gasBalanceCache.get(GAS_BALANCE_CACHE_KEY);\n if (gasBalance) {\n return gasBalance;\n }\n const gasBalancePromise = this.apiClient.getGasBalance(chainSymbol, address);\n this.gasBalanceCache.put(GAS_BALANCE_CACHE_KEY, gasBalancePromise);\n return gasBalancePromise;\n }\n\n async getPendingInfo(): Promise<PendingInfoResponse> {\n const PENDING_INFO_CACHE_KEY = \"PENDING_INFO_CACHE_KEY\";\n const pendingInfo = this.pendingInfoCache.get(PENDING_INFO_CACHE_KEY);\n if (pendingInfo) {\n return pendingInfo;\n }\n const pendingInfoPromise = this.apiClient.getPendingInfo();\n this.pendingInfoCache.put(PENDING_INFO_CACHE_KEY, pendingInfoPromise);\n return pendingInfoPromise;\n }\n\n async getReceiveTransactionCost(args: ReceiveTransactionCostRequest): Promise<ReceiveTransactionCostResponse> {\n const RECEIVE_TX_COST_KEY = `RECEIVE_TX_COST_${args.sourceChainId}_${args.destinationChainId}_${args.messenger}${args.sourceToken ? \"_\" + args.sourceToken : \"\"}`;\n const transactionCost = this.receivedTransactionCache.get(RECEIVE_TX_COST_KEY);\n if (transactionCost) {\n return transactionCost;\n }\n const fetchedTransactionCost = await this.apiClient.getReceiveTransactionCost(args);\n this.receivedTransactionCache.put(RECEIVE_TX_COST_KEY, fetchedTransactionCost);\n return fetchedTransactionCost;\n }\n\n async getTransferStatus(chainSymbol: string, txId: string): Promise<TransferStatusResponse> {\n return this.apiClient.getTransferStatus(chainSymbol, txId);\n }\n\n async getPoolInfoMap(pools: PoolKeyObject[] | PoolKeyObject): Promise<PoolInfoMap> {\n return this.apiClient.getPoolInfoMap(pools);\n }\n}\n", "import {\n ChainDetailsMapWithFlags,\n PoolInfoMap,\n PoolKeyObject,\n TokenWithChainDetailsWithFlags,\n} from \"../../tokens-info\";\nimport { ApiClient } from \"./api-client\";\nimport {\n GasBalanceResponse,\n PendingInfoResponse,\n ReceiveTransactionCostRequest,\n ReceiveTransactionCostResponse,\n TransferStatusResponse,\n} from \"./core-api.model\";\n\nexport interface AllbridgeCoreClientParams {\n coreApiUrl: string;\n coreApiHeaders?: Record<string, string>;\n coreApiQueryParams?: Record<string, string>;\n}\n\nexport interface AllbridgeCoreClient {\n getPendingInfo(): Promise<PendingInfoResponse>;\n\n getTransferStatus(chainSymbol: string, txId: string): Promise<TransferStatusResponse>;\n\n getReceiveTransactionCost(args: ReceiveTransactionCostRequest): Promise<ReceiveTransactionCostResponse>;\n\n getGasBalance(chainSymbol: string, address: string): Promise<GasBalanceResponse>;\n}\n\nexport interface AllbridgeCoreClientWithTokens extends AllbridgeCoreClient {\n getChainDetailsMap(): Promise<ChainDetailsMapWithFlags>;\n\n tokens(): Promise<TokenWithChainDetailsWithFlags[]>;\n}\n\nexport interface AllbridgeCoreClientWithPoolInfo extends AllbridgeCoreClientWithTokens {\n getChainDetailsMapAndPoolInfoMap(): Promise<{\n chainDetailsMap: ChainDetailsMapWithFlags;\n poolInfoMap: PoolInfoMap;\n }>;\n\n getPoolInfoMap(pools: PoolKeyObject[] | PoolKeyObject): Promise<PoolInfoMap>;\n}\n\nexport class AllbridgeCoreClientImpl implements AllbridgeCoreClientWithPoolInfo {\n constructor(private apiClient: ApiClient) {}\n\n async getChainDetailsMap(): Promise<ChainDetailsMapWithFlags> {\n return (await this.apiClient.getTokenInfo()).chainDetailsMap;\n }\n\n async tokens(): Promise<TokenWithChainDetailsWithFlags[]> {\n const map = await this.getChainDetailsMap();\n return Object.values(map).flatMap((chainDetails) => chainDetails.tokens);\n }\n\n async getPendingInfo(): Promise<PendingInfoResponse> {\n return this.apiClient.getPendingInfo();\n }\n\n async getGasBalance(chainSymbol: string, address: string): Promise<GasBalanceResponse> {\n return this.apiClient.getGasBalance(chainSymbol, address);\n }\n\n async getChainDetailsMapAndPoolInfoMap(): Promise<{\n chainDetailsMap: ChainDetailsMapWithFlags;\n poolInfoMap: PoolInfoMap;\n }> {\n return await this.apiClient.getTokenInfo();\n }\n\n async getTransferStatus(chainSymbol: string, txId: string): Promise<TransferStatusResponse> {\n return await this.apiClient.getTransferStatus(chainSymbol, txId);\n }\n\n async getReceiveTransactionCost(args: ReceiveTransactionCostRequest): Promise<ReceiveTransactionCostResponse> {\n return await this.apiClient.getReceiveTransactionCost(args);\n }\n\n async getPoolInfoMap(pools: PoolKeyObject[] | PoolKeyObject): Promise<PoolInfoMap> {\n return await this.apiClient.getPoolInfoMap(pools);\n }\n}\n", "import { AllbridgeCoreSdkOptions } from \"../../index\";\nimport {\n ChainDetailsMap,\n PoolInfo,\n PoolKeyObject,\n TokenWithChainDetails,\n TokenWithChainDetailsWithFlags,\n} from \"../../tokens-info\";\nimport {\n GasBalanceResponse,\n PendingInfoResponse,\n ReceiveTransactionCostRequest,\n ReceiveTransactionCostResponse,\n TransferStatusResponse,\n} from \"./core-api.model\";\nimport { AllbridgeCoreClient, AllbridgeCoreClientWithTokens } from \"./core-client-base\";\nimport { AllbridgeCoreClientPoolsExt } from \"./core-client-pool-info-caching\";\n\nexport interface AllbridgeCoreClientFiltered extends AllbridgeCoreClient, AllbridgeCoreClientPoolsExt {\n getChainDetailsMap(type: \"swap\" | \"pool\"): Promise<ChainDetailsMap>;\n\n tokens(type: \"swap\" | \"pool\"): Promise<TokenWithChainDetails[]>;\n}\n\nexport class AllbridgeCoreClientFilteredImpl implements AllbridgeCoreClientFiltered {\n private readonly isStaging: boolean;\n\n constructor(\n private client: AllbridgeCoreClientWithTokens & AllbridgeCoreClientPoolsExt,\n params: AllbridgeCoreSdkOptions\n ) {\n this.isStaging = params.coreApiQueryParams?.staging === \"true\";\n }\n\n async getChainDetailsMap(type: \"swap\" | \"pool\"): Promise<ChainDetailsMap> {\n const chainDetailsMapWithFlags = await this.client.getChainDetailsMap();\n const result: ChainDetailsMap = {};\n\n for (const key in chainDetailsMapWithFlags) {\n const chainDetailsWithTokensWithFlag = chainDetailsMapWithFlags[key];\n if (chainDetailsWithTokensWithFlag) {\n result[key] = {\n ...chainDetailsWithTokensWithFlag,\n tokens: filterAndConvertToTokenWithChainDetails(chainDetailsWithTokensWithFlag.tokens, type, this.isStaging),\n };\n }\n }\n return result;\n }\n\n async tokens(type: \"swap\" | \"pool\"): Promise<TokenWithChainDetails[]> {\n return filterAndConvertToTokenWithChainDetails(await this.client.tokens(), type, this.isStaging);\n }\n\n async getPendingInfo(): Promise<PendingInfoResponse> {\n return this.client.getPendingInfo();\n }\n\n async getGasBalance(chainSymbol: string, address: string): Promise<GasBalanceResponse> {\n return this.client.getGasBalance(chainSymbol, address);\n }\n\n async getTransferStatus(chainSymbol: string, txId: string): Promise<TransferStatusResponse> {\n return await this.client.getTransferStatus(chainSymbol, txId);\n }\n\n async getReceiveTransactionCost(args: ReceiveTransactionCostRequest): Promise<ReceiveTransactionCostResponse> {\n return await this.client.getReceiveTransactionCost(args);\n }\n\n cachePut(poolKeyObject: PoolKeyObject, poolInfo: PoolInfo): void {\n return this.client.cachePut(poolKeyObject, poolInfo);\n }\n\n getPoolInfoByKey(poolKeyObject: PoolKeyObject): Promise<PoolInfo> {\n return this.client.getPoolInfoByKey(poolKeyObject);\n }\n\n refreshPoolInfo(poolKeyObjects?: PoolKeyObject | PoolKeyObject[]): Promise<void> {\n return this.client.refreshPoolInfo(poolKeyObjects);\n }\n}\n\nfunction filterAndConvertToTokenWithChainDetails(\n tokens: TokenWithChainDetailsWithFlags[],\n type: \"swap\" | \"pool\",\n isStaging: boolean\n): TokenWithChainDetails[] {\n return tokens.filter((token) => (isStaging ? true : token.flags[type])).map(convertToTokenWithChainDetails);\n}\n\nfunction convertToTokenWithChainDetails(token: TokenWithChainDetailsWithFlags): TokenWithChainDetails {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { flags, ...rest } = token;\n return rest;\n}\n", "import Cache from \"timed-cache\";\nimport { SdkError } from \"../../exceptions\";\nimport {\n ChainDetailsMapWithFlags,\n PoolInfo,\n PoolInfoMap,\n PoolKeyObject,\n TokenWithChainDetailsWithFlags,\n} from \"../../tokens-info\";\nimport { mapChainDetailsMapToPoolKeyObjects, mapPoolKeyObjectToPoolKey } from \"./core-api-mapper\";\nimport {\n GasBalanceResponse,\n PendingInfoResponse,\n ReceiveTransactionCostRequest,\n ReceiveTransactionCostResponse,\n TransferStatusResponse,\n} from \"./core-api.model\";\nimport { AllbridgeCoreClientWithPoolInfo, AllbridgeCoreClientWithTokens } from \"./core-client-base\";\n\nconst _55_SECONDS_TTL = 55 * 1000;\n\nexport interface AllbridgeCoreClientPoolsExt {\n getPoolInfoByKey(poolKeyObject: PoolKeyObject): Promise<PoolInfo>;\n refreshPoolInfo(poolKeyObjects?: PoolKeyObject | PoolKeyObject[]): Promise<void>;\n cachePut(poolKeyObject: PoolKeyObject, poolInfo: PoolInfo): void;\n}\n\nexport class AllbridgeCoreClientPoolInfoCaching implements AllbridgeCoreClientWithTokens, AllbridgeCoreClientPoolsExt {\n private readonly poolInfoCache;\n\n constructor(private readonly client: AllbridgeCoreClientWithPoolInfo) {\n this.poolInfoCache = new PoolInfoCache();\n }\n\n async getChainDetailsMap(): Promise<ChainDetailsMapWithFlags> {\n const result = await this.client.getChainDetailsMapAndPoolInfoMap();\n return result.chainDetailsMap;\n }\n\n async tokens(): Promise<TokenWithChainDetailsWithFlags[]> {\n return await this.client.tokens();\n }\n\n getTransferStatus(chainSymbol: string, txId: string): Promise<TransferStatusResponse> {\n return this.client.getTransferStatus(chainSymbol, txId);\n }\n\n getReceiveTransactionCost(args: ReceiveTransactionCostRequest): Promise<ReceiveTransactionCostResponse> {\n return this.client.getReceiveTransactionCost(args);\n }\n\n getPendingInfo(): Promise<PendingInfoResponse> {\n return this.client.getPendingInfo();\n }\n\n getGasBalance(chainSymbol: string, address: string): Promise<GasBalanceResponse> {\n return this.client.getGasBalance(chainSymbol, address);\n }\n\n async getPoolInfoByKey(poolKeyObject: PoolKeyObject): Promise<PoolInfo> {\n this.poolInfoCache.putAllIfNotExists((await this.client.getChainDetailsMapAndPoolInfoMap()).poolInfoMap);\n const poolInfo = this.poolInfoCache.get(poolKeyObject);\n\n if (poolInfo) {\n return poolInfo;\n } else {\n const poolInfoMap = await this.client.getPoolInfoMap(poolKeyObject);\n this.poolInfoCache.putAll(poolInfoMap);\n const result = poolInfoMap[mapPoolKeyObjectToPoolKey(poolKeyObject)];\n if (result) {\n return result;\n }\n throw new SdkError(\n \"Cannot find pool info for \" + poolKeyObject.poolAddress + \" on chain \" + poolKeyObject.chainSymbol\n );\n }\n }\n\n async refreshPoolInfo(poolKeyObjects?: PoolKeyObject | PoolKeyObject[]): Promise<void> {\n let poolInfoMap;\n if (poolKeyObjects) {\n this.poolInfoCache.putAllIfNotExists((await this.client.getChainDetailsMapAndPoolInfoMap()).poolInfoMap);\n poolInfoMap = await this.client.getPoolInfoMap(poolKeyObjects);\n } else {\n const result = await this.client.getChainDetailsMapAndPoolInfoMap();\n poolInfoMap = await this.client.getPoolInfoMap(mapChainDetailsMapToPoolKeyObjects(result.chainDetailsMap));\n }\n this.poolInfoCache.putAll(poolInfoMap);\n }\n\n cachePut(poolKeyObject: PoolKeyObject, poolInfo: PoolInfo): void {\n this.poolInfoCache.put(mapPoolKeyObjectToPoolKey(poolKeyObject), poolInfo);\n }\n}\n\nclass PoolInfoCache {\n private cache;\n\n constructor() {\n this.cache = new Cache<PoolInfo>({ defaultTtl: _55_SECONDS_TTL });\n }\n\n putAll(poolInfoMap: PoolInfoMap) {\n for (const [key, value] of Object.entries(poolInfoMap)) {\n this.cache.put(key, value);\n }\n }\n\n putAllIfNotExists(poolInfoMap: PoolInfoMap) {\n for (const [key, value] of Object.entries(poolInfoMap)) {\n if (!this.cache.get(key)) {\n this.cache.put(key, value);\n }\n }\n }\n\n put(key: string, poolInfo: PoolInfo) {\n this.cache.put(key, poolInfo);\n }\n\n get(poolKeyObject: PoolKeyObject): PoolInfo | undefined {\n const key = mapPoolKeyObjectToPoolKey(poolKeyObject);\n return this.cache.get(key);\n }\n}\n", "import { Big } from \"big.js\";\nimport { TronWeb } from \"tronweb\";\nimport { Web3 } from \"web3\";\nimport { Chains } from \"../../chains\";\nimport { AllbridgeCoreClient } from \"../../client/core-api/core-client-base\";\nimport { AllbridgeCoreSdkOptions, ChainType, EssentialWeb3 } from \"../../index\";\nimport { AmountFormat, AmountFormatted } from \"../../models\";\nimport { convertFloatAmountToInt, convertIntAmountToFloat } from \"../../utils/calculation\";\nimport { validateAmountDecimals, validateAmountGtZero } from \"../../utils/utils\";\nimport { GetNativeTokenBalanceParams } from \"../bridge/models\";\nimport { NodeRpcUrlsConfig } from \"../index\";\nimport { Provider, RawTransaction, TransactionResponse } from \"../models\";\nimport { EvmTokenService } from \"./evm\";\nimport {\n ApproveParams,\n ApproveParamsDto,\n CheckAllowanceParams,\n CheckAllowanceParamsDto,\n GetAllowanceParams,\n GetTokenBalanceParams,\n ChainTokenService,\n} from \"./models\";\nimport { SolanaTokenService } from \"./sol\";\nimport { SrbTokenService } from \"./srb\";\nimport { SuiTokenService } from \"./sui\";\nimport { TronTokenService } from \"./trx\";\n\nexport interface TokenService {\n getAllowance(params: GetAllowanceParams, provider?: Provider): Promise<string>;\n\n checkAllowance(params: CheckAllowanceParams, provider?: Provider): Promise<boolean>;\n\n approve(provider: Provider, approveData: ApproveParams): Promise<TransactionResponse>;\n\n buildRawTransactionApprove(approveData: ApproveParams, provider?: Provider): Promise<RawTransaction>;\n\n getTokenBalance(params: GetTokenBalanceParams, provider?: Provider): Promise<string>;\n\n getNativeTokenBalance(params: GetNativeTokenBalanceParams, provider?: Provider): Promise<AmountFormatted>;\n}\n\nexport class DefaultTokenService implements TokenService {\n constructor(\n readonly api: AllbridgeCoreClient,\n readonly nodeRpcUrlsConfig: NodeRpcUrlsConfig,\n readonly params: AllbridgeCoreSdkOptions\n ) {}\n\n async getAllowance(params: GetAllowanceParams, provider?: Provider): Promise<string> {\n const allowanceInt = await this.getChainTokenService(params.token.chainSymbol, params.owner, provider).getAllowance(\n params\n );\n return convertIntAmountToFloat(allowanceInt, params.token.decimals).toFixed();\n }\n\n async checkAllowance(params: CheckAllowanceParams, provider?: Provider): Promise<boolean> {\n validateAmountGtZero(params.amount);\n validateAmountDecimals(\"amount\", params.amount, params.token.decimals);\n return this.getChainTokenService(params.token.chainSymbol, params.owner, provider).checkAllowance(\n this.prepareCheckAllowanceParams(params)\n );\n }\n\n async approve(provider: Provider, approveData: ApproveParams): Promise<TransactionResponse> {\n if (approveData.amount) {\n validateAmountGtZero(approveData.amount);\n validateAmountDecimals(\"amount\", approveData.amount, approveData.token.decimals);\n }\n return this.getChainTokenService(approveData.token.chainSymbol, approveData.owner, provider).approve(\n this.prepareApproveParams(approveData)\n );\n }\n\n async buildRawTransactionApprove(approveData: ApproveParams, provider?: Provider): Promise<RawTransaction> {\n if (approveData.amount) {\n validateAmountGtZero(approveData.amount);\n validateAmountDecimals(\"amount\", approveData.amount, approveData.token.decimals);\n }\n return this.getChainTokenService(\n approveData.token.chainSymbol,\n approveData.owner,\n provider\n ).buildRawTransactionApprove(this.prepareApproveParams(approveData));\n }\n\n async getTokenBalance(params: GetTokenBalanceParams, provider?: Provider): Promise<string> {\n const tokenBalance = await this.getChainTokenService(\n params.token.chainSymbol,\n params.account,\n provider\n ).getTokenBalance(params);\n if (params.token.decimals) {\n return convertIntAmountToFloat(tokenBalance, params.token.decimals).toFixed();\n }\n return tokenBalance;\n }\n\n async getNativeTokenBalance(params: GetNativeTokenBalanceParams, provider?: Provider): Promise<AmountFormatted> {\n const tokenBalance = await this.getChainTokenService(\n params.chainSymbol,\n params.account,\n provider\n ).getNativeTokenBalance(params);\n return {\n [AmountFormat.INT]: tokenBalance,\n [AmountFormat.FLOAT]: convertIntAmountToFloat(\n tokenBalance,\n Chains.getChainDecimalsByType(Chains.getChainProperty(params.chainSymbol).chainType)\n ).toFixed(),\n };\n }\n\n private getChainTokenService(chainSymbol: string, ownerAddress: string, provider?: Provider): ChainTokenService {\n switch (Chains.getChainProperty(chainSymbol).chainType) {\n case ChainType.EVM: {\n if (provider) {\n return new EvmTokenService(provider as EssentialWeb3, this.api);\n } else {\n const nodeRpcUrl = this.nodeRpcUrlsConfig.getNodeRpcUrl(chainSymbol);\n return new EvmTokenService(new Web3(nodeRpcUrl), this.api);\n }\n }\n case ChainType.TRX: {\n if (provider) {\n return new TronTokenService(provider as TronWeb, this.api);\n } else {\n const nodeRpcUrl = this.nodeRpcUrlsConfig.getNodeRpcUrl(chainSymbol);\n const tronWeb = new TronWeb({ fullHost: nodeRpcUrl });\n tronWeb.setAddress(ownerAddress);\n return new TronTokenService(tronWeb, this.api);\n }\n }\n case ChainType.SOLANA: {\n const nodeRpcUrl = this.nodeRpcUrlsConfig.getNodeRpcUrl(chainSymbol);\n return new SolanaTokenService(nodeRpcUrl, this.api);\n }\n case ChainType.SRB: {\n return new SrbTokenService(this.nodeRpcUrlsConfig, this.params, this.api);\n }\n case ChainType.SUI: {\n return new SuiTokenService(this.nodeRpcUrlsConfig.getNodeRpcUrl(chainSymbol), this.api);\n }\n }\n }\n\n prepareCheckAllowanceParams(params: CheckAllowanceParams): CheckAllowanceParamsDto {\n return {\n ...params,\n amount: convertFloatAmountToInt(params.amount, params.token.decimals),\n };\n }\n\n private prepareApproveParams(approveData: ApproveParams): ApproveParamsDto {\n return {\n tokenAddress: approveData.token.tokenAddress,\n owner: approveData.owner,\n spender: approveData.spender,\n chainSymbol: approveData.token.chainSymbol,\n amount: approveData.amount == undefined ? undefined : Big(approveData.amount).toFixed(),\n };\n }\n}\n", "const artifact = {\n abi: [\n {\n inputs: [\n {\n internalType: \"string\",\n name: \"name_\",\n type: \"string\",\n },\n {\n internalType: \"string\",\n name: \"symbol_\",\n type: \"string\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"constructor\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"owner\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"spender\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"value\",\n type: \"uint256\",\n },\n ],\n name: \"Approval\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"from\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"value\",\n type: \"uint256\",\n },\n ],\n name: \"Transfer\",\n type: \"event\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"owner\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"spender\",\n type: \"address\",\n },\n ],\n name: \"allowance\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"spender\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n ],\n name: \"approve\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"account\",\n type: \"address\",\n },\n ],\n name: \"balanceOf\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"decimals\",\n outputs: [\n {\n internalType: \"uint8\",\n name: \"\",\n type: \"uint8\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"spender\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"subtractedValue\",\n type: \"uint256\",\n },\n ],\n name: \"decreaseAllowance\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"spender\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"addedValue\",\n type: \"uint256\",\n },\n ],\n name: \"increaseAllowance\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"name\",\n outputs: [\n {\n internalType: \"string\",\n name: \"\",\n type: \"string\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"symbol\",\n outputs: [\n {\n internalType: \"string\",\n name: \"\",\n type: \"string\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"totalSupply\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n ],\n name: \"transfer\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"from\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n ],\n name: \"transferFrom\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n ],\n} as const;\nexport default artifact;\n", "import { Big } from \"big.js\";\nimport { ChainType } from \"../../../chains/chain.enums\";\nimport { AllbridgeCoreClient } from \"../../../client/core-api/core-client-base\";\nimport { GetNativeTokenBalanceParams } from \"../../bridge/models\";\nimport { RawTransaction, TransactionResponse } from \"../../models\";\nimport { ApproveParamsDto, CheckAllowanceParamsDto, GetAllowanceParamsDto, GetTokenBalanceParams } from \"./token.model\";\n\nexport abstract class ChainTokenService {\n abstract chainType: ChainType;\n abstract api: AllbridgeCoreClient;\n\n abstract getTokenBalance(params: GetTokenBalanceParams): Promise<string>;\n\n abstract getNativeTokenBalance(params: GetNativeTokenBalanceParams): Promise<string>;\n\n abstract getAllowance(params: GetAllowanceParamsDto): Promise<string>;\n\n async checkAllowance(params: CheckAllowanceParamsDto): Promise<boolean> {\n const allowance = await this.getAllowance(params);\n return Big(allowance).gte(Big(params.amount));\n }\n\n abstract approve(params: ApproveParamsDto): Promise<TransactionResponse>;\n\n abstract buildRawTransactionApprove(params: ApproveParamsDto): Promise<RawTransaction>;\n}\n", "import BN from \"bn.js\";\nimport { Contract, Transaction as Web3Transaction } from \"web3\";\nimport { ChainSymbol, ChainType } from \"../../../chains/chain.enums\";\nimport { AllbridgeCoreClient } from \"../../../client/core-api/core-client-base\";\nimport { GetTokenBalanceParams, EssentialWeb3, TransactionResponse } from \"../../../models\";\nimport { GetNativeTokenBalanceParams } from \"../../bridge/models\";\nimport { RawTransaction } from \"../../models\";\nimport ERC20 from \"../../models/abi/ERC20\";\nimport { amountToHex } from \"../../utils\";\nimport { ApproveParamsDto, GetAllowanceParamsDto, ChainTokenService } from \"../models\";\n\nexport const MAX_AMOUNT = \"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\";\n\nconst USDT_TOKEN_ADDRESS = \"0xdac17f958d2ee523a2206206994597c13d831ec7\";\nconst POLYGON_GAS_LIMIT = 100_000;\n\nexport class EvmTokenService extends ChainTokenService {\n chainType: ChainType.EVM = ChainType.EVM;\n\n constructor(\n public web3: EssentialWeb3,\n public api: AllbridgeCoreClient\n ) {\n super();\n }\n\n getAllowance(params: GetAllowanceParamsDto): Promise<string> {\n const tokenAddress = params.token.tokenAddress;\n const owner = params.owner;\n const spender = params.spender;\n return this.getAllowanceByTokenAddress(tokenAddress, owner, spender);\n }\n\n getAllowanceByTokenAddress(tokenAddress: string, owner: string, spender: string): Promise<string> {\n const tokenContract = this.getERC20Contract(tokenAddress);\n return tokenContract.methods.allowance(owner, spender).call();\n }\n\n async getTokenBalance(params: GetTokenBalanceParams): Promise<string> {\n return await this.getERC20Contract(params.token.tokenAddress).methods.balanceOf(params.account).call();\n }\n\n async getNativeTokenBalance(params: GetNativeTokenBalanceParams): Promise<string> {\n return (await this.web3.eth.getBalance(params.account)).toString();\n }\n\n async approve(params: ApproveParamsDto): Promise<TransactionResponse> {\n if (this.isUsdt(params.tokenAddress)) {\n const allowance = await this.getAllowanceByTokenAddress(params.tokenAddress, params.owner, params.spender);\n if (allowance !== \"0\") {\n const rawTransaction = await this.buildRawTransactionApprove({\n ...params,\n amount: \"0\",\n });\n await this.sendRawTransaction(rawTransaction, params.chainSymbol);\n }\n }\n const rawTransaction = await this.buildRawTransactionApprove(params);\n return await this.sendRawTransaction(rawTransaction, params.chainSymbol);\n }\n\n isUsdt(tokenAddress: string): boolean {\n return tokenAddress.toLowerCase() === USDT_TOKEN_ADDRESS;\n }\n\n buildRawTransactionApprove(params: ApproveParamsDto): Promise<RawTransaction> {\n const { tokenAddress, spender, owner, amount } = params;\n const tokenContract = this.getERC20Contract(tokenAddress);\n\n const approveMethod = tokenContract.methods.approve(\n spender,\n amount == undefined ? MAX_AMOUNT : amountToHex(amount)\n );\n\n return Promise.resolve({\n from: owner,\n to: tokenAddress,\n value: \"0\",\n data: approveMethod.encodeABI(),\n });\n }\n\n private async sendRawTransaction(rawTransaction: RawTransaction, chainSymbol: string) {\n const transactionConfig: Web3Transaction = rawTransaction as Web3Transaction;\n // prettier-ignore\n const feeOptions: {\n maxPriorityFeePerGas?: number | string | BN;\n maxFeePerGas?: number | string | BN\n } = {maxPriorityFeePerGas: undefined, maxFeePerGas: undefined};\n if ((chainSymbol as ChainSymbol) === ChainSymbol.POL) {\n transactionConfig.gas = POLYGON_GAS_LIMIT;\n } else {\n transactionConfig.gas = await this.web3.eth.estimateGas(rawTransaction as Web3Transaction);\n }\n const { transactionHash } = await this.web3.eth.sendTransaction({\n ...transactionConfig,\n ...feeOptions,\n } as Web3Transaction);\n return { txId: transactionHash.toString() };\n }\n\n private getERC20Contract(contractAddress: string) {\n return new this.web3.eth.Contract(ERC20.abi, contractAddress) as Contract<typeof ERC20.abi>;\n }\n}\n", "/* eslint-disable @typescript-eslint/no-unused-vars */\nimport { AnchorProvider, Provider } from \"@project-serum/anchor\";\nimport { Connection, PublicKey } from \"@solana/web3.js\";\nimport { ChainType } from \"../../../chains/chain.enums\";\nimport { AllbridgeCoreClient } from \"../../../client/core-api/core-client-base\";\nimport { MethodNotSupportedError } from \"../../../exceptions\";\nimport { GetNativeTokenBalanceParams } from \"../../bridge/models\";\nimport { RawTransaction, TransactionResponse } from \"../../models\";\nimport { getTokenAccountData } from \"../../utils/sol\";\nimport { getAssociatedAccount } from \"../../utils/sol/accounts\";\nimport { ApproveParamsDto, GetAllowanceParamsDto, GetTokenBalanceParams } from \"../models\";\nimport { ChainTokenService } from \"../models/token\";\n\nexport class SolanaTokenService extends ChainTokenService {\n chainType: ChainType.SOLANA = ChainType.SOLANA;\n\n constructor(\n public solanaRpcUrl: string,\n public api: AllbridgeCoreClient\n ) {\n super();\n }\n\n approve(params: ApproveParamsDto): Promise<TransactionResponse> {\n throw new MethodNotSupportedError();\n }\n\n buildRawTransactionApprove(params: ApproveParamsDto): Promise<RawTransaction> {\n throw new MethodNotSupportedError();\n }\n\n private buildAnchorProvider(accountAddress: string): Provider {\n const connection = new Connection(this.solanaRpcUrl, \"confirmed\");\n\n const publicKey = new PublicKey(accountAddress);\n\n return new AnchorProvider(\n connection,\n // @ts-expect-error enough wallet for fetch actions\n { publicKey: publicKey },\n {\n preflightCommitment: \"confirmed\",\n commitment: \"confirmed\",\n }\n );\n }\n\n getAllowance(params: GetAllowanceParamsDto): Promise<string> {\n throw new MethodNotSupportedError();\n }\n\n async getTokenBalance(params: GetTokenBalanceParams): Promise<string> {\n const { account, token } = params;\n try {\n const associatedAccount = await getAssociatedAccount(new PublicKey(account), new PublicKey(token.tokenAddress));\n const accountData = await getTokenAccountData(associatedAccount, this.buildAnchorProvider(account));\n return accountData.amount.toString();\n } catch (e) {\n if (e instanceof Error) {\n e.message.startsWith(\"Account does not exist\");\n return \"0\";\n }\n throw e;\n }\n }\n\n async getNativeTokenBalance(params: GetNativeTokenBalanceParams): Promise<string> {\n return (\n await this.buildAnchorProvider(params.account).connection.getBalance(new PublicKey(params.account))\n ).toString();\n }\n}\n", "import { Horizon, NotFoundError } from \"@stellar/stellar-sdk\";\nimport { Chains } from \"../../../chains\";\nimport { ChainSymbol } from \"../../../chains/chain.enums\";\nimport { AllbridgeCoreClient } from \"../../../client/core-api/core-client-base\";\nimport { AllbridgeCoreSdkOptions, ChainType, SdkError } from \"../../../index\";\nimport { GetTokenBalanceParams, MethodNotSupportedError, TransactionResponse } from \"../../../models\";\nimport { convertFloatAmountToInt } from \"../../../utils/calculation\";\nimport { GetNativeTokenBalanceParams } from \"../../bridge/models\";\nimport { NodeRpcUrlsConfig } from \"../../index\";\nimport { RawTransaction } from \"../../models\";\nimport { ChainTokenService } from \"../models\";\n\nimport BalanceLineAsset = Horizon.HorizonApi.BalanceLineAsset;\nimport BalanceLineNative = Horizon.HorizonApi.BalanceLineNative;\n\nexport class SrbTokenService extends ChainTokenService {\n chainType: ChainType.SRB = ChainType.SRB;\n\n constructor(\n readonly nodeRpcUrlsConfig: NodeRpcUrlsConfig,\n readonly params: AllbridgeCoreSdkOptions,\n readonly api: AllbridgeCoreClient\n ) {\n super();\n }\n\n getAllowance(): Promise<string> {\n throw new MethodNotSupportedError();\n }\n\n async getTokenBalance(params: GetTokenBalanceParams): Promise<string> {\n if (!params.token.originTokenAddress) {\n throw new SdkError(\"OriginTokenAddress missing\");\n }\n const [symbol, srbTokenAddress] = params.token.originTokenAddress.split(\":\");\n\n const stellar = new Horizon.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl(ChainSymbol.STLR));\n let stellarAccount;\n try {\n stellarAccount = await stellar.loadAccount(params.account);\n } catch (err) {\n if (err instanceof NotFoundError) {\n return \"0\";\n }\n throw err;\n }\n const balances = stellarAccount.balances;\n\n const balanceInfo = balances.find(\n (balance): balance is BalanceLineAsset =>\n (balance.asset_type === \"credit_alphanum4\" || balance.asset_type === \"credit_alphanum12\") &&\n balance.asset_code == symbol &&\n balance.asset_issuer == srbTokenAddress\n );\n if (balanceInfo?.balance) {\n return convertFloatAmountToInt(\n balanceInfo.balance,\n Chains.getChainDecimalsByType(Chains.getChainProperty(params.token.chainSymbol).chainType)\n ).toFixed();\n }\n return \"0\";\n }\n\n async getNativeTokenBalance(params: GetNativeTokenBalanceParams): Promise<string> {\n const stellar = new Horizon.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl(ChainSymbol.STLR));\n const stellarAccount = await stellar.loadAccount(params.account);\n const balances = stellarAccount.balances;\n\n const nativeBalance = balances.find((balance): balance is BalanceLineNative => balance.asset_type === \"native\");\n if (nativeBalance?.balance) {\n return convertFloatAmountToInt(\n nativeBalance.balance,\n Chains.getChainDecimalsByType(Chains.getChainProperty(params.chainSymbol).chainType)\n ).toFixed();\n }\n return \"0\";\n }\n\n approve(): Promise<TransactionResponse> {\n throw new MethodNotSupportedError();\n }\n\n buildRawTransactionApprove(): Promise<RawTransaction> {\n throw new MethodNotSupportedError();\n }\n}\n", "/* eslint-disable @typescript-eslint/no-unused-vars */\nimport { SuiClient } from \"@mysten/sui/client\";\nimport { CoinStruct } from \"@mysten/sui/src/client/types/generated\";\nimport { ChainType } from \"../../../chains/chain.enums\";\nimport { AllbridgeCoreClient } from \"../../../client/core-api/core-client-base\";\nimport { MethodNotSupportedError, SdkError } from \"../../../exceptions\";\nimport { GetNativeTokenBalanceParams } from \"../../bridge/models\";\nimport { RawTransaction, TransactionResponse } from \"../../models\";\nimport { fetchAllPagesRecursive } from \"../../utils/sui/paginated\";\nimport { ApproveParamsDto, ChainTokenService, GetAllowanceParamsDto, GetTokenBalanceParams } from \"../models\";\n\nexport class SuiTokenService extends ChainTokenService {\n chainType: ChainType.SUI = ChainType.SUI;\n private suiClient: SuiClient;\n\n constructor(\n public suiRpcUrl: string,\n public api: AllbridgeCoreClient\n ) {\n super();\n this.suiClient = new SuiClient({\n url: this.suiRpcUrl,\n });\n }\n\n approve(params: ApproveParamsDto): Promise<TransactionResponse> {\n throw new MethodNotSupportedError();\n }\n\n buildRawTransactionApprove(params: ApproveParamsDto): Promise<RawTransaction> {\n throw new MethodNotSupportedError();\n }\n\n getAllowance(params: GetAllowanceParamsDto): Promise<string> {\n throw new MethodNotSupportedError();\n }\n\n async getTokenBalance(params: GetTokenBalanceParams): Promise<string> {\n if (!params.token.originTokenAddress) {\n throw new SdkError(\"SUI token must contain 'originTokenAddress'\");\n }\n const balance = await this.suiClient.getBalance({\n owner: params.account,\n coinType: params.token.originTokenAddress,\n });\n return balance.totalBalance;\n }\n\n async getNativeTokenBalance(params: GetNativeTokenBalanceParams): Promise<string> {\n const coinsData: CoinStruct[] = await fetchAllPagesRecursive((cursor: string | null | undefined) =>\n this.suiClient.getCoins({\n owner: params.account,\n cursor,\n })\n );\n if (coinsData.length === 0) {\n return \"0\";\n }\n return coinsData.reduce((total, element) => total + BigInt(element.balance), BigInt(0)).toString();\n }\n}\n", "import { TronWeb } from \"tronweb\";\nimport { AllbridgeCoreClient } from \"../../../client/core-api/core-client-base\";\nimport { SdkError } from \"../../../exceptions\";\nimport { ChainType, GetTokenBalanceParams, TransactionResponse } from \"../../../models\";\nimport { GetNativeTokenBalanceParams } from \"../../bridge/models\";\nimport { RawTransaction, SmartContractMethodParameter } from \"../../models\";\nimport ERC20 from \"../../models/abi/ERC20\";\nimport { amountToHex } from \"../../utils\";\nimport { sendRawTransaction } from \"../../utils/trx\";\nimport { ApproveParamsDto, GetAllowanceParamsDto } from \"../models\";\nimport { ChainTokenService } from \"../models/token\";\n\nexport const MAX_AMOUNT = \"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\";\n\nexport class TronTokenService extends ChainTokenService {\n chainType: ChainType.TRX = ChainType.TRX;\n\n constructor(\n public tronWeb: TronWeb,\n public api: AllbridgeCoreClient\n ) {\n super();\n }\n\n async getAllowance(params: GetAllowanceParamsDto): Promise<string> {\n const {\n token: { tokenAddress },\n owner,\n } = params;\n const tokenContract = await this.getContract(tokenAddress);\n const allowance = await tokenContract.methods.allowance(owner, params.spender).call();\n return allowance.toString();\n }\n\n async getTokenBalance(params: GetTokenBalanceParams): Promise<string> {\n const contract = await this.getContract(params.token.tokenAddress);\n const balance = await contract.balanceOf(params.account).call();\n return balance.toString();\n }\n\n async getNativeTokenBalance(params: GetNativeTokenBalanceParams): Promise<string> {\n return (await this.tronWeb.trx.getBalance(params.account)).toString();\n }\n\n async approve(params: ApproveParamsDto): Promise<TransactionResponse> {\n const rawTransaction = await this.buildRawTransactionApprove(params);\n return await sendRawTransaction(this.tronWeb, rawTransaction);\n }\n\n async buildRawTransactionApprove(params: ApproveParamsDto): Promise<RawTransaction> {\n const { tokenAddress, spender, owner, amount } = params;\n const amountHex = amount == undefined ? MAX_AMOUNT : amountToHex(amount);\n\n const parameter = [\n { type: \"address\", value: spender },\n { type: \"uint256\", value: amountHex },\n ];\n const value = \"0\";\n const methodSignature = \"approve(address,uint256)\";\n return this.buildRawTransaction(tokenAddress, methodSignature, parameter, value, owner);\n }\n\n private getContract(contractAddress: string): any {\n return this.tronWeb.contract(ERC20.abi, contractAddress);\n }\n\n private async buildRawTransaction(\n contractAddress: string,\n methodSignature: string,\n parameters: SmartContractMethodParameter[],\n value: string,\n fromAddress: string\n ): Promise<RawTransaction> {\n const transactionObject = await this.tronWeb.transactionBuilder.triggerSmartContract(\n contractAddress,\n methodSignature,\n {\n callValue: +value,\n },\n parameters,\n fromAddress\n );\n if (!transactionObject?.result?.result) {\n throw new SdkError(\"Unknown error: \" + JSON.stringify(transactionObject, null, 2));\n }\n return transactionObject.transaction;\n }\n}\n", "import { ApiClientImpl } from \"../../client/core-api/api-client\";\nimport { ApiClientCaching } from \"../../client/core-api/api-client-caching\";\nimport { AllbridgeCoreClientImpl } from \"../../client/core-api/core-client-base\";\nimport {\n AllbridgeCoreClientFiltered,\n AllbridgeCoreClientFilteredImpl,\n} from \"../../client/core-api/core-client-filtered\";\nimport { AllbridgeCoreClientPoolInfoCaching } from \"../../client/core-api/core-client-pool-info-caching\";\nimport { AllbridgeCoreSdkOptions, Provider, RawTransaction } from \"../../index\";\nimport { NodeRpcUrlsConfig } from \"../../services\";\nimport { DefaultTokenService, TokenService } from \"../../services/token\";\nimport { ApproveParams, CheckAllowanceParams, GetAllowanceParams } from \"../../services/token/models\";\n\n/**\n * Contains usefully EVM methods\n */\nexport interface EvmUtils {\n /**\n * Get amount of tokens approved to be sent by the bridge\n * @param params - See {@link GetAllowanceParams}\n * @param provider - optional, will be used to access the network\n * @returns the amount of approved tokens\n */\n getAllowance(params: GetAllowanceParams, provider?: Provider): Promise<string>;\n\n /**\n * Check if the amount of approved tokens is enough to make a transfer\n * @param params - See {@link CheckAllowanceParams}\n * @param provider - optional, will be used to access the network\n * @return true if the amount of approved tokens is enough to make a transfer\n */\n checkAllowance(params: CheckAllowanceParams, provider?: Provider): Promise<boolean>;\n\n /**\n * builds a raw transaction for approving token usage by the specified spender\n * @param approveData - data for approval\n * @param provider - optional, will be used to access the network\n *\n * @return a raw transaction for approving token usage\n */\n buildRawTransactionApprove(approveData: ApproveParams, provider?: Provider): Promise<RawTransaction>;\n}\n\nexport class DefaultEvmUtils implements EvmUtils {\n private readonly api: AllbridgeCoreClientFiltered;\n private readonly tokenService: TokenService;\n\n constructor(\n readonly nodeRpcUrlsConfig: NodeRpcUrlsConfig,\n readonly params: AllbridgeCoreSdkOptions\n ) {\n const apiClient = new ApiClientImpl(params);\n const apiClientCaching = new ApiClientCaching(apiClient);\n const coreClient = new AllbridgeCoreClientImpl(apiClientCaching);\n const coreClientPoolInfoCaching = new AllbridgeCoreClientPoolInfoCaching(coreClient);\n this.api = new AllbridgeCoreClientFilteredImpl(coreClientPoolInfoCaching, params);\n this.tokenService = new DefaultTokenService(this.api, nodeRpcUrlsConfig, params);\n }\n\n buildRawTransactionApprove(approveData: ApproveParams, provider?: Provider): Promise<RawTransaction> {\n return this.tokenService.buildRawTransactionApprove(approveData, provider);\n }\n\n checkAllowance(params: CheckAllowanceParams, provider?: Provider): Promise<boolean> {\n return this.tokenService.checkAllowance(params, provider);\n }\n\n getAllowance(params: GetAllowanceParams, provider?: Provider): Promise<string> {\n return this.tokenService.getAllowance(params, provider);\n }\n}\n", "import { Connection, PublicKey, TransactionMessage, VersionedTransaction } from \"@solana/web3.js\";\nimport { ChainSymbol } from \"../../chains/chain.enums\";\nimport { AllbridgeCoreSdkOptions, SdkError } from \"../../index\";\nimport { NodeRpcUrlsConfig } from \"../../services\";\nimport { fetchAddressLookupTableAccountsFromTx } from \"./utils\";\n\n/**\n * Contains usefully Solana methods\n */\nexport interface SolUtils {\n /**\n * Add memo to solana's transaction\n * @param transaction transaction to add memo\n * @param memo memo to add (28 char max)\n */\n addMemoToTx(transaction: VersionedTransaction, memo: string): Promise<void>;\n}\n\nexport class DefaultSolUtils implements SolUtils {\n constructor(\n readonly nodeRpcUrlsConfig: NodeRpcUrlsConfig,\n readonly params: AllbridgeCoreSdkOptions\n ) {}\n\n async addMemoToTx(transaction: VersionedTransaction, memo: string): Promise<void> {\n if (memo.length > 28) {\n throw new SdkError(\"InvalidArgumentException memo cannot be more than 28 characters\");\n }\n const connection = new Connection(this.nodeRpcUrlsConfig.getNodeRpcUrl(ChainSymbol.SOL), \"confirmed\");\n const addressLookupTableAccounts = await fetchAddressLookupTableAccountsFromTx(transaction, connection);\n const message = TransactionMessage.decompile(transaction.message, {\n addressLookupTableAccounts: addressLookupTableAccounts,\n });\n const lastInstruction = message.instructions[message.instructions.length - 1];\n if (!lastInstruction?.keys) {\n throw new SdkError(\"Last instruction or its keys are invalid.\");\n }\n\n lastInstruction.keys.push({\n pubkey: new PublicKey(Buffer.from(memo)),\n isSigner: false,\n isWritable: false,\n });\n transaction.message = message.compileToV0Message(addressLookupTableAccounts);\n }\n}\n", "import {\n Asset as StellarAsset,\n BASE_FEE,\n contract,\n Horizon,\n Operation,\n Operation as StellarOperation,\n rpc as SorobanRpc,\n TimeoutInfinite,\n Transaction,\n TransactionBuilder,\n TransactionBuilder as StellarTransactionBuilder,\n} from \"@stellar/stellar-sdk\";\nimport { ChainSymbol } from \"../../chains/chain.enums\";\nimport { AllbridgeCoreSdkOptions, SdkError } from \"../../index\";\nimport { NodeRpcUrlsConfig } from \"../../services\";\nimport { TokenContract } from \"../../services/models/srb/token-contract\";\nimport { getViewResultSoroban, isErrorSorobanResult } from \"../../services/models/srb/utils\";\nimport { withExponentialBackoff } from \"../utils\";\nimport ContractClientOptions = contract.ClientOptions;\nimport BalanceLineAsset = Horizon.HorizonApi.BalanceLineAsset;\n\n/**\n * Contains usefully Soroban methods\n */\nexport interface SrbUtils {\n /**\n * Build change Trust line Tx\n * @param params see {@link TrustLineParams}\n * @returns xdr Tx\n */\n buildChangeTrustLineXdrTx(params: TrustLineParams): Promise<string>;\n\n /**\n * Get Balance Line information if exists\n * @param sender\n * @param tokenAddress\n */\n getBalanceLine(sender: string, tokenAddress: string): Promise<Horizon.HorizonApi.BalanceLineAsset | undefined>;\n\n /**\n * Submit tx\n * @param xdrTx\n */\n submitTransactionStellar(xdrTx: string): Promise<Horizon.HorizonApi.SubmitTransactionResponse>;\n\n /**\n * Simulate and check if Restore needed\n * @param xdrTx - restore\n * @param sourceAccount\n * @returns xdrTx restore transaction if it required after check\n */\n simulateAndCheckRestoreTxRequiredSoroban(xdrTx: string, sourceAccount: string): Promise<string | undefined>;\n\n /**\n * Submit tx\n * @param xdrTx\n */\n sendTransactionSoroban(xdrTx: string): Promise<SorobanRpc.Api.SendTransactionResponse>;\n\n /**\n * Confirm tx\n */\n confirmTx(hash: string, secondsToWait?: number): Promise<SorobanRpc.Api.GetTransactionResponse>;\n}\n\nexport interface TrustLineParams {\n /**\n * Float amount of tokens, default is Number.MAX_SAFE_INTEGER\n */\n limit?: string;\n sender: string;\n tokenAddress: string;\n}\n\nconst FEE = 100;\nconst SEND_TRANSACTION_TIMEOUT = 180;\n\nexport class DefaultSrbUtils implements SrbUtils {\n constructor(\n readonly nodeRpcUrlsConfig: NodeRpcUrlsConfig,\n readonly params: AllbridgeCoreSdkOptions\n ) {}\n\n async buildChangeTrustLineXdrTx(params: TrustLineParams): Promise<string> {\n const stellar = new Horizon.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl(ChainSymbol.STLR));\n const stellarAccount = await stellar.loadAccount(params.sender);\n const tokenContract = this.getContract(TokenContract, params.tokenAddress);\n const result = await tokenContract.name();\n if (isErrorSorobanResult(result)) {\n throw new SdkError();\n }\n const tokenName = getViewResultSoroban(result);\n if (!tokenName) {\n throw new SdkError();\n }\n\n const [symbol, srbTokenAddress] = tokenName.split(\":\");\n if (symbol === undefined || srbTokenAddress === undefined) {\n throw new SdkError(`Invalid token name format. Expected format 'symbol:srbTokenAddress'`);\n }\n const asset = new StellarAsset(symbol, srbTokenAddress);\n const changeTrust = StellarOperation.changeTrust({\n asset: asset,\n limit: params.limit,\n });\n\n return new StellarTransactionBuilder(stellarAccount, {\n fee: FEE.toString(10),\n networkPassphrase: this.params.sorobanNetworkPassphrase,\n })\n .addOperation(changeTrust)\n .setTimeout(SEND_TRANSACTION_TIMEOUT)\n .build()\n .toXDR();\n }\n\n async getBalanceLine(sender: string, tokenAddress: string): Promise<Horizon.HorizonApi.BalanceLineAsset | undefined> {\n const tokenContract = this.getContract(TokenContract, tokenAddress);\n const result = await tokenContract.name();\n if (isErrorSorobanResult(result)) {\n throw new SdkError();\n }\n const tokenName = getViewResultSoroban(result);\n if (!tokenName) {\n throw new SdkError();\n }\n\n const [symbol, srbTokenAddress] = tokenName.split(\":\");\n const nodeRpcUrl = this.nodeRpcUrlsConfig.getNodeRpcUrl(ChainSymbol.STLR);\n const stellar = new Horizon.Server(nodeRpcUrl);\n const stellarAccount = await stellar.loadAccount(sender);\n const balanceInfo = stellarAccount.balances;\n\n return balanceInfo.find(\n (balance): balance is BalanceLineAsset =>\n (balance.asset_type === \"credit_alphanum4\" || balance.asset_type === \"credit_alphanum12\") &&\n balance.asset_code == symbol &&\n balance.asset_issuer == srbTokenAddress\n );\n }\n\n async submitTransactionStellar(xdrTx: string): Promise<Horizon.HorizonApi.SubmitTransactionResponse> {\n const stellar = new Horizon.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl(ChainSymbol.STLR));\n const transaction = StellarTransactionBuilder.fromXDR(\n xdrTx,\n this.nodeRpcUrlsConfig.getNodeRpcUrl(ChainSymbol.STLR)\n );\n return await stellar.submitTransaction(transaction);\n }\n\n async simulateAndCheckRestoreTxRequiredSoroban(xdrTx: string, sourceAccount: string): Promise<string | undefined> {\n const server = new SorobanRpc.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl(ChainSymbol.SRB));\n const account = await server.getAccount(sourceAccount);\n const transaction = TransactionBuilder.fromXDR(xdrTx, this.params.sorobanNetworkPassphrase) as Transaction;\n const simulation = await server.simulateTransaction(transaction);\n if (SorobanRpc.Api.isSimulationRestore(simulation)) {\n return new TransactionBuilder(account, {\n fee: (+BASE_FEE + +simulation.restorePreamble.minResourceFee).toString(),\n networkPassphrase: this.params.sorobanNetworkPassphrase,\n })\n .setSorobanData(simulation.restorePreamble.transactionData.build())\n .addOperation(Operation.restoreFootprint({}))\n .setTimeout(TimeoutInfinite)\n .build()\n .toXDR();\n }\n return undefined;\n }\n\n async sendTransactionSoroban(xdrTx: string): Promise<SorobanRpc.Api.SendTransactionResponse> {\n const server = new SorobanRpc.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl(ChainSymbol.SRB));\n const transaction = TransactionBuilder.fromXDR(xdrTx, this.params.sorobanNetworkPassphrase) as Transaction;\n return server.sendTransaction(transaction);\n }\n\n async confirmTx(hash: string, secondsToWait = 15): Promise<SorobanRpc.Api.GetTransactionResponse> {\n const server = new SorobanRpc.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl(ChainSymbol.SRB));\n const getTransactionResponseAll = await withExponentialBackoff(\n () => server.getTransaction(hash),\n (resp) => resp.status === SorobanRpc.Api.GetTransactionStatus.NOT_FOUND,\n secondsToWait\n );\n\n if (getTransactionResponseAll.length === 0) {\n throw new SdkError(\"No transaction responses found.\");\n }\n\n const lastResponse = getTransactionResponseAll[getTransactionResponseAll.length - 1];\n if (!lastResponse) {\n throw new SdkError(\"Unexpected error: last response is undefined.\");\n }\n\n return lastResponse;\n }\n\n private getContract<T>(contract: new (args: ContractClientOptions) => T, address: string): T {\n const config: ContractClientOptions = {\n contractId: address,\n networkPassphrase: this.params.sorobanNetworkPassphrase,\n rpcUrl: this.nodeRpcUrlsConfig.getNodeRpcUrl(ChainSymbol.SRB),\n };\n return new contract(config);\n }\n}\n", "import { contract } from \"@stellar/stellar-sdk\";\nimport u32 = contract.u32;\nimport i128 = contract.i128;\nimport AssembledTransaction = contract.AssembledTransaction;\nimport ContractSpec = contract.Spec;\nimport ContractClient = contract.Client;\nimport ContractClientOptions = contract.ClientOptions;\nexport const Errors = {};\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging\nexport interface TokenContract {\n /**\n * Construct and simulate a allowance transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. *\n * Returns the allowance for `spender` to transfer from `from`.\n *\n * The amount returned is the amount that spender is allowed to transfer\n * out of from's balance. When the spender transfers amounts, the allowance\n * will be reduced by the amount transfered.\n *\n * # Arguments\n *\n * * `from` - The address holding the balance of tokens to be drawn from.\n * * `spender` - The address spending the tokens held by `from`.\n */\n allowance: (\n { from, spender }: { from: string; spender: string },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<i128>>;\n\n /**\n * Construct and simulate a authorized transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. *\n * Returns true if `id` is authorized to use its balance.\n *\n * # Arguments\n *\n * * `id` - The address for which token authorization is being checked.\n */\n authorized: (\n { id }: { id: string },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<boolean>>;\n\n /**\n * Construct and simulate a approve transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. *\n * Set the allowance by `amount` for `spender` to transfer/burn from\n * `from`.\n *\n * The amount set is the amount that spender is approved to transfer out of\n * from's balance. The spender will be allowed to transfer amounts, and\n * when an amount is transferred the allowance will be reduced by the\n * amount transfered.\n *\n * # Arguments\n *\n * * `from` - The address holding the balance of tokens to be drawn from.\n * * `spender` - The address being authorized to spend the tokens held by\n * `from`.\n * * `amount` - The tokens to be made available to `spender`.\n * * `expiration_ledger` - The ledger number where this allowance expires. Cannot\n * be less than the current ledger number unless the amount is being set to 0.\n * An expired entry (where expiration_ledger < the current ledger number)\n * should be treated as a 0 amount allowance.\n *\n * # Events\n *\n * Emits an event with topics `[\"approve\", from: Address,\n * spender: Address], data = [amount: i128, expiration_ledger: u32]`\n */\n approve: (\n {\n from,\n spender,\n amount,\n expiration_ledger,\n }: {\n from: string;\n spender: string;\n amount: i128;\n expiration_ledger: u32;\n },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<null>>;\n\n /**\n * Construct and simulate a balance transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. *\n * Returns the balance of `id`.\n *\n * # Arguments\n *\n * * `id` - The address for which a balance is being queried. If the\n * address has no existing balance, returns 0.\n */\n balance: (\n { id }: { id: string },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<i128>>;\n\n /**\n * Construct and simulate a burn transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. *\n * Burn `amount` from `from`.\n *\n * Reduces from's balance by the amount, without transferring the balance\n * to another holder's balance.\n *\n * # Arguments\n *\n * * `from` - The address holding the balance of tokens which will be\n * burned from.\n * * `amount` - The amount of tokens to be burned.\n *\n * # Events\n *\n * Emits an event with topics `[\"burn\", from: Address], data = [amount:\n * i128]`\n */\n burn: (\n { from, amount }: { from: string; amount: i128 },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<null>>;\n\n /**\n * Construct and simulate a burn_from transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. *\n * Burn `amount` from `from`, consuming the allowance of `spender`.\n *\n * Reduces from's balance by the amount, without transferring the balance\n * to another holder's balance.\n *\n * The spender will be allowed to burn the amount from from's balance, if\n * the amount is less than or equal to the allowance that the spender has\n * on the from's balance. The spender's allowance on from's balance will be\n * reduced by the amount.\n *\n * # Arguments\n *\n * * `spender` - The address authorizing the burn, and having its allowance\n * consumed during the burn.\n * * `from` - The address holding the balance of tokens which will be\n * burned from.\n * * `amount` - The amount of tokens to be burned.\n *\n * # Events\n *\n * Emits an event with topics `[\"burn\", from: Address], data = [amount:\n * i128]`\n */\n burn_from: (\n { spender, from, amount }: { spender: string; from: string; amount: i128 },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<null>>;\n\n /**\n * Construct and simulate a clawback transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. *\n * Clawback `amount` from `from` account. `amount` is burned in the\n * clawback process.\n *\n * # Arguments\n *\n * * `from` - The address holding the balance from which the clawback will\n * take tokens.\n * * `amount` - The amount of tokens to be clawed back.\n *\n * # Events\n *\n * Emits an event with topics `[\"clawback\", admin: Address, to: Address],\n * data = [amount: i128]`\n */\n clawback: (\n { from, amount }: { from: string; amount: i128 },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<null>>;\n\n /**\n * Construct and simulate a decimals transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. *\n * Returns the number of decimals used to represent amounts of this token.\n *\n * # Panics\n *\n * If the contract has not yet been initialized.\n */\n decimals: (options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }) => Promise<AssembledTransaction<u32>>;\n\n /**\n * Construct and simulate a mint transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. *\n * Mints `amount` to `to`.\n *\n * # Arguments\n *\n * * `to` - The address which will receive the minted tokens.\n * * `amount` - The amount of tokens to be minted.\n *\n * # Events\n *\n * Emits an event with topics `[\"mint\", admin: Address, to: Address], data\n * = [amount: i128]`\n */\n mint: (\n { to, amount }: { to: string; amount: i128 },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<null>>;\n\n /**\n * Construct and simulate a name transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. *\n * Returns the name for this token.\n *\n * # Panics\n *\n * If the contract has not yet been initialized.\n */\n name: (options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }) => Promise<AssembledTransaction<string>>;\n\n /**\n * Construct and simulate a set_admin transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. *\n * Sets the administrator to the specified address `new_admin`.\n *\n * # Arguments\n *\n * * `new_admin` - The address which will henceforth be the administrator\n * of this token contract.\n *\n * # Events\n *\n * Emits an event with topics `[\"set_admin\", admin: Address], data =\n * [new_admin: Address]`\n */\n set_admin: (\n { new_admin }: { new_admin: string },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<null>>;\n\n /**\n * Construct and simulate a admin transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. *\n * Returns the admin of the contract.\n *\n * # Panics\n *\n * If the admin is not set.\n */\n admin: (options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }) => Promise<AssembledTransaction<string>>;\n\n /**\n * Construct and simulate a set_authorized transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. *\n * Sets whether the account is authorized to use its balance. If\n * `authorized` is true, `id` should be able to use its balance.\n *\n * # Arguments\n *\n * * `id` - The address being (de-)authorized.\n * * `authorize` - Whether or not `id` can use its balance.\n *\n * # Events\n *\n * Emits an event with topics `[\"set_authorized\", id: Address], data =\n * [authorize: bool]`\n */\n set_authorized: (\n { id, authorize }: { id: string; authorize: boolean },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<null>>;\n\n /**\n * Construct and simulate a symbol transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. *\n * Returns the symbol for this token.\n *\n * # Panics\n *\n * If the contract has not yet been initialized.\n */\n symbol: (options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }) => Promise<AssembledTransaction<string>>;\n\n /**\n * Construct and simulate a transfer transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. *\n * Transfer `amount` from `from` to `to`.\n *\n * # Arguments\n *\n * * `from` - The address holding the balance of tokens which will be\n * withdrawn from.\n * * `to` - The address which will receive the transferred tokens.\n * * `amount` - The amount of tokens to be transferred.\n *\n * # Events\n *\n * Emits an event with topics `[\"transfer\", from: Address, to: Address],\n * data = [amount: i128]`\n */\n transfer: (\n { from, to, amount }: { from: string; to: string; amount: i128 },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<null>>;\n\n /**\n * Construct and simulate a transfer_from transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. *\n * Transfer `amount` from `from` to `to`, consuming the allowance that\n * `spender` has on `from`'s balance. Authorized by spender\n * (`spender.require_auth()`).\n *\n * The spender will be allowed to transfer the amount from from's balance\n * if the amount is less than or equal to the allowance that the spender\n * has on the from's balance. The spender's allowance on from's balance\n * will be reduced by the amount.\n *\n * # Arguments\n *\n * * `spender` - The address authorizing the transfer, and having its\n * allowance consumed during the transfer.\n * * `from` - The address holding the balance of tokens which will be\n * withdrawn from.\n * * `to` - The address which will receive the transferred tokens.\n * * `amount` - The amount of tokens to be transferred.\n *\n * # Events\n *\n * Emits an event with topics `[\"transfer\", from: Address, to: Address],\n * data = [amount: i128]`\n */\n transfer_from: (\n { spender, from, to, amount }: { spender: string; from: string; to: string; amount: i128 },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<null>>;\n}\n// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging\nexport class TokenContract extends ContractClient {\n constructor(public readonly options: ContractClientOptions) {\n super(\n new ContractSpec([\n \"AAAAAAAAAYlSZXR1cm5zIHRoZSBhbGxvd2FuY2UgZm9yIGBzcGVuZGVyYCB0byB0cmFuc2ZlciBmcm9tIGBmcm9tYC4KClRoZSBhbW91bnQgcmV0dXJuZWQgaXMgdGhlIGFtb3VudCB0aGF0IHNwZW5kZXIgaXMgYWxsb3dlZCB0byB0cmFuc2ZlcgpvdXQgb2YgZnJvbSdzIGJhbGFuY2UuIFdoZW4gdGhlIHNwZW5kZXIgdHJhbnNmZXJzIGFtb3VudHMsIHRoZSBhbGxvd2FuY2UKd2lsbCBiZSByZWR1Y2VkIGJ5IHRoZSBhbW91bnQgdHJhbnNmZXJlZC4KCiMgQXJndW1lbnRzCgoqIGBmcm9tYCAtIFRoZSBhZGRyZXNzIGhvbGRpbmcgdGhlIGJhbGFuY2Ugb2YgdG9rZW5zIHRvIGJlIGRyYXduIGZyb20uCiogYHNwZW5kZXJgIC0gVGhlIGFkZHJlc3Mgc3BlbmRpbmcgdGhlIHRva2VucyBoZWxkIGJ5IGBmcm9tYC4AAAAAAAAJYWxsb3dhbmNlAAAAAAAAAgAAAAAAAAAEZnJvbQAAABMAAAAAAAAAB3NwZW5kZXIAAAAAEwAAAAEAAAAL\",\n \"AAAAAAAAAIlSZXR1cm5zIHRydWUgaWYgYGlkYCBpcyBhdXRob3JpemVkIHRvIHVzZSBpdHMgYmFsYW5jZS4KCiMgQXJndW1lbnRzCgoqIGBpZGAgLSBUaGUgYWRkcmVzcyBmb3Igd2hpY2ggdG9rZW4gYXV0aG9yaXphdGlvbiBpcyBiZWluZyBjaGVja2VkLgAAAAAAAAphdXRob3JpemVkAAAAAAABAAAAAAAAAAJpZAAAAAAAEwAAAAEAAAAB\",\n \"AAAAAAAAA55TZXQgdGhlIGFsbG93YW5jZSBieSBgYW1vdW50YCBmb3IgYHNwZW5kZXJgIHRvIHRyYW5zZmVyL2J1cm4gZnJvbQpgZnJvbWAuCgpUaGUgYW1vdW50IHNldCBpcyB0aGUgYW1vdW50IHRoYXQgc3BlbmRlciBpcyBhcHByb3ZlZCB0byB0cmFuc2ZlciBvdXQgb2YKZnJvbSdzIGJhbGFuY2UuIFRoZSBzcGVuZGVyIHdpbGwgYmUgYWxsb3dlZCB0byB0cmFuc2ZlciBhbW91bnRzLCBhbmQKd2hlbiBhbiBhbW91bnQgaXMgdHJhbnNmZXJyZWQgdGhlIGFsbG93YW5jZSB3aWxsIGJlIHJlZHVjZWQgYnkgdGhlCmFtb3VudCB0cmFuc2ZlcmVkLgoKIyBBcmd1bWVudHMKCiogYGZyb21gIC0gVGhlIGFkZHJlc3MgaG9sZGluZyB0aGUgYmFsYW5jZSBvZiB0b2tlbnMgdG8gYmUgZHJhd24gZnJvbS4KKiBgc3BlbmRlcmAgLSBUaGUgYWRkcmVzcyBiZWluZyBhdXRob3JpemVkIHRvIHNwZW5kIHRoZSB0b2tlbnMgaGVsZCBieQpgZnJvbWAuCiogYGFtb3VudGAgLSBUaGUgdG9rZW5zIHRvIGJlIG1hZGUgYXZhaWxhYmxlIHRvIGBzcGVuZGVyYC4KKiBgZXhwaXJhdGlvbl9sZWRnZXJgIC0gVGhlIGxlZGdlciBudW1iZXIgd2hlcmUgdGhpcyBhbGxvd2FuY2UgZXhwaXJlcy4gQ2Fubm90CmJlIGxlc3MgdGhhbiB0aGUgY3VycmVudCBsZWRnZXIgbnVtYmVyIHVubGVzcyB0aGUgYW1vdW50IGlzIGJlaW5nIHNldCB0byAwLgpBbiBleHBpcmVkIGVudHJ5ICh3aGVyZSBleHBpcmF0aW9uX2xlZGdlciA8IHRoZSBjdXJyZW50IGxlZGdlciBudW1iZXIpCnNob3VsZCBiZSB0cmVhdGVkIGFzIGEgMCBhbW91bnQgYWxsb3dhbmNlLgoKIyBFdmVudHMKCkVtaXRzIGFuIGV2ZW50IHdpdGggdG9waWNzIGBbImFwcHJvdmUiLCBmcm9tOiBBZGRyZXNzLApzcGVuZGVyOiBBZGRyZXNzXSwgZGF0YSA9IFthbW91bnQ6IGkxMjgsIGV4cGlyYXRpb25fbGVkZ2VyOiB1MzJdYAAAAAAAB2FwcHJvdmUAAAAABAAAAAAAAAAEZnJvbQAAABMAAAAAAAAAB3NwZW5kZXIAAAAAEwAAAAAAAAAGYW1vdW50AAAAAAALAAAAAAAAABFleHBpcmF0aW9uX2xlZGdlcgAAAAAAAAQAAAAA\",\n \"AAAAAAAAAJhSZXR1cm5zIHRoZSBiYWxhbmNlIG9mIGBpZGAuCgojIEFyZ3VtZW50cwoKKiBgaWRgIC0gVGhlIGFkZHJlc3MgZm9yIHdoaWNoIGEgYmFsYW5jZSBpcyBiZWluZyBxdWVyaWVkLiBJZiB0aGUKYWRkcmVzcyBoYXMgbm8gZXhpc3RpbmcgYmFsYW5jZSwgcmV0dXJucyAwLgAAAAdiYWxhbmNlAAAAAAEAAAAAAAAAAmlkAAAAAAATAAAAAQAAAAs=\",\n \"AAAAAAAAAWRCdXJuIGBhbW91bnRgIGZyb20gYGZyb21gLgoKUmVkdWNlcyBmcm9tJ3MgYmFsYW5jZSBieSB0aGUgYW1vdW50LCB3aXRob3V0IHRyYW5zZmVycmluZyB0aGUgYmFsYW5jZQp0byBhbm90aGVyIGhvbGRlcidzIGJhbGFuY2UuCgojIEFyZ3VtZW50cwoKKiBgZnJvbWAgLSBUaGUgYWRkcmVzcyBob2xkaW5nIHRoZSBiYWxhbmNlIG9mIHRva2VucyB3aGljaCB3aWxsIGJlCmJ1cm5lZCBmcm9tLgoqIGBhbW91bnRgIC0gVGhlIGFtb3VudCBvZiB0b2tlbnMgdG8gYmUgYnVybmVkLgoKIyBFdmVudHMKCkVtaXRzIGFuIGV2ZW50IHdpdGggdG9waWNzIGBbImJ1cm4iLCBmcm9tOiBBZGRyZXNzXSwgZGF0YSA9IFthbW91bnQ6CmkxMjhdYAAAAARidXJuAAAAAgAAAAAAAAAEZnJvbQAAABMAAAAAAAAABmFtb3VudAAAAAAACwAAAAA=\",\n \"AAAAAAAAAtxCdXJuIGBhbW91bnRgIGZyb20gYGZyb21gLCBjb25zdW1pbmcgdGhlIGFsbG93YW5jZSBvZiBgc3BlbmRlcmAuCgpSZWR1Y2VzIGZyb20ncyBiYWxhbmNlIGJ5IHRoZSBhbW91bnQsIHdpdGhvdXQgdHJhbnNmZXJyaW5nIHRoZSBiYWxhbmNlCnRvIGFub3RoZXIgaG9sZGVyJ3MgYmFsYW5jZS4KClRoZSBzcGVuZGVyIHdpbGwgYmUgYWxsb3dlZCB0byBidXJuIHRoZSBhbW91bnQgZnJvbSBmcm9tJ3MgYmFsYW5jZSwgaWYKdGhlIGFtb3VudCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGFsbG93YW5jZSB0aGF0IHRoZSBzcGVuZGVyIGhhcwpvbiB0aGUgZnJvbSdzIGJhbGFuY2UuIFRoZSBzcGVuZGVyJ3MgYWxsb3dhbmNlIG9uIGZyb20ncyBiYWxhbmNlIHdpbGwgYmUKcmVkdWNlZCBieSB0aGUgYW1vdW50LgoKIyBBcmd1bWVudHMKCiogYHNwZW5kZXJgIC0gVGhlIGFkZHJlc3MgYXV0aG9yaXppbmcgdGhlIGJ1cm4sIGFuZCBoYXZpbmcgaXRzIGFsbG93YW5jZQpjb25zdW1lZCBkdXJpbmcgdGhlIGJ1cm4uCiogYGZyb21gIC0gVGhlIGFkZHJlc3MgaG9sZGluZyB0aGUgYmFsYW5jZSBvZiB0b2tlbnMgd2hpY2ggd2lsbCBiZQpidXJuZWQgZnJvbS4KKiBgYW1vdW50YCAtIFRoZSBhbW91bnQgb2YgdG9rZW5zIHRvIGJlIGJ1cm5lZC4KCiMgRXZlbnRzCgpFbWl0cyBhbiBldmVudCB3aXRoIHRvcGljcyBgWyJidXJuIiwgZnJvbTogQWRkcmVzc10sIGRhdGEgPSBbYW1vdW50OgppMTI4XWAAAAAJYnVybl9mcm9tAAAAAAAAAwAAAAAAAAAHc3BlbmRlcgAAAAATAAAAAAAAAARmcm9tAAAAEwAAAAAAAAAGYW1vdW50AAAAAAALAAAAAA==\",\n \"AAAAAAAAAVNDbGF3YmFjayBgYW1vdW50YCBmcm9tIGBmcm9tYCBhY2NvdW50LiBgYW1vdW50YCBpcyBidXJuZWQgaW4gdGhlCmNsYXdiYWNrIHByb2Nlc3MuCgojIEFyZ3VtZW50cwoKKiBgZnJvbWAgLSBUaGUgYWRkcmVzcyBob2xkaW5nIHRoZSBiYWxhbmNlIGZyb20gd2hpY2ggdGhlIGNsYXdiYWNrIHdpbGwKdGFrZSB0b2tlbnMuCiogYGFtb3VudGAgLSBUaGUgYW1vdW50IG9mIHRva2VucyB0byBiZSBjbGF3ZWQgYmFjay4KCiMgRXZlbnRzCgpFbWl0cyBhbiBldmVudCB3aXRoIHRvcGljcyBgWyJjbGF3YmFjayIsIGFkbWluOiBBZGRyZXNzLCB0bzogQWRkcmVzc10sCmRhdGEgPSBbYW1vdW50OiBpMTI4XWAAAAAACGNsYXdiYWNrAAAAAgAAAAAAAAAEZnJvbQAAABMAAAAAAAAABmFtb3VudAAAAAAACwAAAAA=\",\n \"AAAAAAAAAIBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGVjaW1hbHMgdXNlZCB0byByZXByZXNlbnQgYW1vdW50cyBvZiB0aGlzIHRva2VuLgoKIyBQYW5pY3MKCklmIHRoZSBjb250cmFjdCBoYXMgbm90IHlldCBiZWVuIGluaXRpYWxpemVkLgAAAAhkZWNpbWFscwAAAAAAAAABAAAABA==\",\n \"AAAAAAAAAPVNaW50cyBgYW1vdW50YCB0byBgdG9gLgoKIyBBcmd1bWVudHMKCiogYHRvYCAtIFRoZSBhZGRyZXNzIHdoaWNoIHdpbGwgcmVjZWl2ZSB0aGUgbWludGVkIHRva2Vucy4KKiBgYW1vdW50YCAtIFRoZSBhbW91bnQgb2YgdG9rZW5zIHRvIGJlIG1pbnRlZC4KCiMgRXZlbnRzCgpFbWl0cyBhbiBldmVudCB3aXRoIHRvcGljcyBgWyJtaW50IiwgYWRtaW46IEFkZHJlc3MsIHRvOiBBZGRyZXNzXSwgZGF0YQo9IFthbW91bnQ6IGkxMjhdYAAAAAAAAARtaW50AAAAAgAAAAAAAAACdG8AAAAAABMAAAAAAAAABmFtb3VudAAAAAAACwAAAAA=\",\n \"AAAAAAAAAFlSZXR1cm5zIHRoZSBuYW1lIGZvciB0aGlzIHRva2VuLgoKIyBQYW5pY3MKCklmIHRoZSBjb250cmFjdCBoYXMgbm90IHlldCBiZWVuIGluaXRpYWxpemVkLgAAAAAAAARuYW1lAAAAAAAAAAEAAAAQ\",\n \"AAAAAAAAAQxTZXRzIHRoZSBhZG1pbmlzdHJhdG9yIHRvIHRoZSBzcGVjaWZpZWQgYWRkcmVzcyBgbmV3X2FkbWluYC4KCiMgQXJndW1lbnRzCgoqIGBuZXdfYWRtaW5gIC0gVGhlIGFkZHJlc3Mgd2hpY2ggd2lsbCBoZW5jZWZvcnRoIGJlIHRoZSBhZG1pbmlzdHJhdG9yCm9mIHRoaXMgdG9rZW4gY29udHJhY3QuCgojIEV2ZW50cwoKRW1pdHMgYW4gZXZlbnQgd2l0aCB0b3BpY3MgYFsic2V0X2FkbWluIiwgYWRtaW46IEFkZHJlc3NdLCBkYXRhID0KW25ld19hZG1pbjogQWRkcmVzc11gAAAACXNldF9hZG1pbgAAAAAAAAEAAAAAAAAACW5ld19hZG1pbgAAAAAAABMAAAAA\",\n \"AAAAAAAAAEZSZXR1cm5zIHRoZSBhZG1pbiBvZiB0aGUgY29udHJhY3QuCgojIFBhbmljcwoKSWYgdGhlIGFkbWluIGlzIG5vdCBzZXQuAAAAAAAFYWRtaW4AAAAAAAAAAAAAAQAAABM=\",\n \"AAAAAAAAAVBTZXRzIHdoZXRoZXIgdGhlIGFjY291bnQgaXMgYXV0aG9yaXplZCB0byB1c2UgaXRzIGJhbGFuY2UuIElmCmBhdXRob3JpemVkYCBpcyB0cnVlLCBgaWRgIHNob3VsZCBiZSBhYmxlIHRvIHVzZSBpdHMgYmFsYW5jZS4KCiMgQXJndW1lbnRzCgoqIGBpZGAgLSBUaGUgYWRkcmVzcyBiZWluZyAoZGUtKWF1dGhvcml6ZWQuCiogYGF1dGhvcml6ZWAgLSBXaGV0aGVyIG9yIG5vdCBgaWRgIGNhbiB1c2UgaXRzIGJhbGFuY2UuCgojIEV2ZW50cwoKRW1pdHMgYW4gZXZlbnQgd2l0aCB0b3BpY3MgYFsic2V0X2F1dGhvcml6ZWQiLCBpZDogQWRkcmVzc10sIGRhdGEgPQpbYXV0aG9yaXplOiBib29sXWAAAAAOc2V0X2F1dGhvcml6ZWQAAAAAAAIAAAAAAAAAAmlkAAAAAAATAAAAAAAAAAlhdXRob3JpemUAAAAAAAABAAAAAA==\",\n \"AAAAAAAAAFtSZXR1cm5zIHRoZSBzeW1ib2wgZm9yIHRoaXMgdG9rZW4uCgojIFBhbmljcwoKSWYgdGhlIGNvbnRyYWN0IGhhcyBub3QgeWV0IGJlZW4gaW5pdGlhbGl6ZWQuAAAAAAZzeW1ib2wAAAAAAAAAAAABAAAAEA==\",\n \"AAAAAAAAAWRUcmFuc2ZlciBgYW1vdW50YCBmcm9tIGBmcm9tYCB0byBgdG9gLgoKIyBBcmd1bWVudHMKCiogYGZyb21gIC0gVGhlIGFkZHJlc3MgaG9sZGluZyB0aGUgYmFsYW5jZSBvZiB0b2tlbnMgd2hpY2ggd2lsbCBiZQp3aXRoZHJhd24gZnJvbS4KKiBgdG9gIC0gVGhlIGFkZHJlc3Mgd2hpY2ggd2lsbCByZWNlaXZlIHRoZSB0cmFuc2ZlcnJlZCB0b2tlbnMuCiogYGFtb3VudGAgLSBUaGUgYW1vdW50IG9mIHRva2VucyB0byBiZSB0cmFuc2ZlcnJlZC4KCiMgRXZlbnRzCgpFbWl0cyBhbiBldmVudCB3aXRoIHRvcGljcyBgWyJ0cmFuc2ZlciIsIGZyb206IEFkZHJlc3MsIHRvOiBBZGRyZXNzXSwKZGF0YSA9IFthbW91bnQ6IGkxMjhdYAAAAAh0cmFuc2ZlcgAAAAMAAAAAAAAABGZyb20AAAATAAAAAAAAAAJ0bwAAAAAAEwAAAAAAAAAGYW1vdW50AAAAAAALAAAAAA==\",\n \"AAAAAAAAAzNUcmFuc2ZlciBgYW1vdW50YCBmcm9tIGBmcm9tYCB0byBgdG9gLCBjb25zdW1pbmcgdGhlIGFsbG93YW5jZSB0aGF0CmBzcGVuZGVyYCBoYXMgb24gYGZyb21gJ3MgYmFsYW5jZS4gQXV0aG9yaXplZCBieSBzcGVuZGVyCihgc3BlbmRlci5yZXF1aXJlX2F1dGgoKWApLgoKVGhlIHNwZW5kZXIgd2lsbCBiZSBhbGxvd2VkIHRvIHRyYW5zZmVyIHRoZSBhbW91bnQgZnJvbSBmcm9tJ3MgYmFsYW5jZQppZiB0aGUgYW1vdW50IGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgYWxsb3dhbmNlIHRoYXQgdGhlIHNwZW5kZXIKaGFzIG9uIHRoZSBmcm9tJ3MgYmFsYW5jZS4gVGhlIHNwZW5kZXIncyBhbGxvd2FuY2Ugb24gZnJvbSdzIGJhbGFuY2UKd2lsbCBiZSByZWR1Y2VkIGJ5IHRoZSBhbW91bnQuCgojIEFyZ3VtZW50cwoKKiBgc3BlbmRlcmAgLSBUaGUgYWRkcmVzcyBhdXRob3JpemluZyB0aGUgdHJhbnNmZXIsIGFuZCBoYXZpbmcgaXRzCmFsbG93YW5jZSBjb25zdW1lZCBkdXJpbmcgdGhlIHRyYW5zZmVyLgoqIGBmcm9tYCAtIFRoZSBhZGRyZXNzIGhvbGRpbmcgdGhlIGJhbGFuY2Ugb2YgdG9rZW5zIHdoaWNoIHdpbGwgYmUKd2l0aGRyYXduIGZyb20uCiogYHRvYCAtIFRoZSBhZGRyZXNzIHdoaWNoIHdpbGwgcmVjZWl2ZSB0aGUgdHJhbnNmZXJyZWQgdG9rZW5zLgoqIGBhbW91bnRgIC0gVGhlIGFtb3VudCBvZiB0b2tlbnMgdG8gYmUgdHJhbnNmZXJyZWQuCgojIEV2ZW50cwoKRW1pdHMgYW4gZXZlbnQgd2l0aCB0b3BpY3MgYFsidHJhbnNmZXIiLCBmcm9tOiBBZGRyZXNzLCB0bzogQWRkcmVzc10sCmRhdGEgPSBbYW1vdW50OiBpMTI4XWAAAAAADXRyYW5zZmVyX2Zyb20AAAAAAAAEAAAAAAAAAAdzcGVuZGVyAAAAABMAAAAAAAAABGZyb20AAAATAAAAAAAAAAJ0bwAAAAAAEwAAAAAAAAAGYW1vdW50AAAAAAALAAAAAA==\",\n ]),\n options\n );\n }\n public readonly fromJSON = {\n allowance: this.txFromJSON<i128>,\n authorized: this.txFromJSON<boolean>,\n approve: this.txFromJSON<null>,\n balance: this.txFromJSON<i128>,\n burn: this.txFromJSON<null>,\n burn_from: this.txFromJSON<null>,\n clawback: this.txFromJSON<null>,\n decimals: this.txFromJSON<u32>,\n mint: this.txFromJSON<null>,\n name: this.txFromJSON<string>,\n set_admin: this.txFromJSON<null>,\n admin: this.txFromJSON<string>,\n set_authorized: this.txFromJSON<null>,\n symbol: this.txFromJSON<string>,\n transfer: this.txFromJSON<null>,\n transfer_from: this.txFromJSON<null>,\n };\n}\n", "import { Transaction, TransactionResult } from \"@mysten/sui/transactions\";\nimport { AllbridgeCoreClient } from \"../../client/core-api/core-client-base\";\nimport { RawSuiTransaction, SendParams } from \"../../index\";\nimport { NodeRpcUrlsConfig } from \"../../services\";\nimport { SuiBridgeService } from \"../../services/bridge/sui\";\n\n/**\n * Contains useful Sui methods\n */\nexport interface SuiUtils {\n buildSendTxFromCustomTx(\n baseTx: string | Uint8Array | Transaction,\n inputCoin: TransactionResult,\n params: SendParams\n ): Promise<RawSuiTransaction>;\n}\n\nexport class DefaultSuiUtils implements SuiUtils {\n private _suiBridgeService: SuiBridgeService | undefined;\n\n constructor(\n readonly nodeRpcUrlsConfig: NodeRpcUrlsConfig,\n readonly api: AllbridgeCoreClient\n ) {}\n\n async buildSendTxFromCustomTx(\n baseTx: string | Uint8Array | Transaction,\n inputCoin: TransactionResult,\n params: SendParams\n ): Promise<RawSuiTransaction> {\n return this.suiBridgeService.buildRawTransactionSendFromCustomTx(baseTx, inputCoin, params);\n }\n\n private get suiBridgeService() {\n if (!this._suiBridgeService) {\n this._suiBridgeService = new SuiBridgeService(this.nodeRpcUrlsConfig, this.api);\n }\n return this._suiBridgeService;\n }\n}\n", "import { AllbridgeCoreSdkService } from \"../services\";\nimport { DefaultEvmUtils, EvmUtils } from \"./evm\";\nimport { DefaultSolUtils, SolUtils } from \"./sol\";\nimport { DefaultSrbUtils, SrbUtils } from \"./srb\";\nimport { DefaultSuiUtils, SuiUtils } from \"./sui\";\n\n/**\n * Contains usefully methods\n */\nexport interface Utils {\n srb: SrbUtils;\n sol: SolUtils;\n sui: SuiUtils;\n evm: EvmUtils;\n}\n\nexport class DefaultUtils implements Utils {\n srb: SrbUtils;\n sol: SolUtils;\n sui: SuiUtils;\n evm: EvmUtils;\n\n constructor(readonly service: AllbridgeCoreSdkService) {\n this.srb = new DefaultSrbUtils(service.nodeRpcUrlsConfig, service.params);\n this.sol = new DefaultSolUtils(service.nodeRpcUrlsConfig, service.params);\n this.sui = new DefaultSuiUtils(service.nodeRpcUrlsConfig, service.api);\n this.evm = new DefaultEvmUtils(service.nodeRpcUrlsConfig, service.params);\n }\n}\n", "export {\n ApproveParams as BridgeApproveParams,\n BaseSendParams,\n CheckAllowanceParams,\n GetAllowanceParams,\n GetTokenBalanceParams,\n SendParams,\n SwapParams,\n GetNativeTokenBalanceParams,\n} from \"../services/bridge/models/bridge.model\";\nexport { BridgeService } from \"../services/bridge/index\";\nexport { CctpParams, CctpDomains } from \"../services/bridge/sol\";\nexport { LiquidityPoolService } from \"../services/liquidity-pool/index\";\nexport {\n Messenger,\n TransferStatusResponse,\n BridgeTransaction,\n GasBalanceResponse,\n CheckAddressResponse,\n AddressStatus,\n} from \"../client/core-api/core-api.model\";\nexport { RawBridgeTransactionBuilder } from \"../services/bridge/raw-bridge-transaction-builder\";\nexport { RawPoolTransactionBuilder } from \"../services/liquidity-pool/raw-pool-transaction-builder\";\nexport {\n PoolInfo,\n TokenWithChainDetails,\n TransferTime,\n TxCostAmount,\n SuiAddresses,\n MessengerTransferTime,\n} from \"../tokens-info/tokens-info.model\";\nexport {\n UserBalanceInfo,\n UserBalanceInfoDTO,\n LiquidityPoolsParams,\n LiquidityPoolsParamsWithAmount,\n ApproveParams as LiquidityPoolsApproveParams,\n CheckAllowanceParams as LiquidityPoolsCheckAllowanceParams,\n GetAllowanceParams as LiquidityPoolsGetAllowanceParams,\n} from \"../services/liquidity-pool/models/pool.model\";\nexport * from \"../services/models/index\";\nexport { YieldService } from \"../services/yield/index\";\nexport { assertYieldIsSupported, isYieldSupported } from \"../services/yield/validations\";\nexport {\n TokenWithChainDetailsYield,\n CYDToken,\n YieldGetAllowanceParams,\n YieldCheckAllowanceParams,\n YieldBalanceParams,\n YieldGetEstimatedAmountOnDepositParams,\n YieldGetWithdrawProportionAmountParams,\n YieldWithdrawAmount,\n YieldApproveParams,\n YieldDepositParams,\n YieldWithdrawParams,\n} from \"../services/yield//models/yield.model\";\nexport { RawYieldTransactionBuilder } from \"../services/yield/raw-yield-transaction-builder\";\nexport {\n SwapAndBridgeCalculationData,\n SwapFromVUsdCalcResult,\n SwapToVUsdCalcResult,\n} from \"../utils/calculation/swap-and-bridge-fee-calc\";\nexport { SendAmountDetails, AmountImpact } from \"../utils/calculation/swap-and-bridge-details\";\nexport { ChainDetailsMap, ChainDetailsWithTokens } from \"../tokens-info\";\nexport { Utils } from \"../utils\";\nexport { SrbUtils, TrustLineParams } from \"../utils/srb\";\nexport { SolUtils } from \"../utils/sol\";\nexport * from \"../exceptions\";\nexport { ChainSymbol, ChainType } from \"../chains/chain.enums\";\nexport { AdditionalBasicChainProperties, BasicChainProperties } from \"../chains/models\";\n\nexport enum FeePaymentMethod {\n /**\n * The fee is paid in the native currency of the source chain.\n */\n WITH_NATIVE_CURRENCY = \"native\",\n\n /**\n * The fee is paid with the stablecoin token.\n */\n WITH_STABLECOIN = \"stablecoin\",\n}\n\nexport interface AmountsAndGasFeeOptions {\n /**\n * The floating point amount of tokens to be sent (not including gas fee).\n */\n amountToSendFloat: string;\n\n /**\n * The floating point amount of tokens to be received.\n */\n amountToBeReceivedFloat: string;\n\n /**\n * Available ways to pay the transfer gas fee and gas fee amount.\n */\n gasFeeOptions: GasFeeOptions;\n}\n\ntype GasFeeOptionsType = {\n [key in FeePaymentMethod]?: AmountFormatted;\n};\n\n/**\n * Describes available options of paying the gas fee and the amount to pay when using the corresponding method.\n *\n * For {@link FeePaymentMethod.WITH_NATIVE_CURRENCY} value contains the amount in the smallest denomination of the source chain currency\n *\n * For {@link FeePaymentMethod.WITH_STABLECOIN} value contains the amount in the smallest denomination of the source token\n */\nexport interface GasFeeOptions extends GasFeeOptionsType {\n [FeePaymentMethod.WITH_NATIVE_CURRENCY]: AmountFormatted;\n [FeePaymentMethod.WITH_STABLECOIN]?: AmountFormatted;\n adminFeeShareWithExtras?: string;\n}\n\n/**\n * Define the type of amount data<p/>\n * Example:<p/>\n * \"1500000\" USDC {@link AmountFormat.INT} = \"1.5\" USDC {@link AmountFormat.FLOAT}, if USDC.decimals = 6\n */\nexport enum AmountFormat {\n /**\n * denominated in the smallest unit of the source token\n */\n INT = \"int\",\n /**\n * denominated in the unit of the source token\n */\n FLOAT = \"float\",\n}\n\n/**\n * Describes the same amount in two variation formats.\n *\n * For {@link AmountFormat.INT} value contains the amount in the smallest denomination\n *\n * For {@link AmountFormat.FLOAT} value contains the amount in tokens denomination\n */\nexport type AmountFormatted = {\n [key in AmountFormat]: string;\n};\n\n/**\n * Describes MAX extra gas value can to be passed when using the corresponding method.\n *\n * For {@link FeePaymentMethod.WITH_NATIVE_CURRENCY} value contains {@link ExtraGasMaxLimit} the amount of the source chain currency\n *\n * For {@link FeePaymentMethod.WITH_STABLECOIN} value contains {@link ExtraGasMaxLimit} the amount of the source token\n */\nexport type ExtraGasMaxLimits = {\n [key in FeePaymentMethod]?: ExtraGasMaxLimit;\n};\n\n/**\n * Describes the same MAX extra gas amount.\n */\nexport type ExtraGasMaxLimit = AmountFormatted;\n\n/**\n * Provide extra gas information\n */\nexport interface ExtraGasMaxLimitResponse {\n /**\n * See {@link ExtraGasMaxLimits}\n */\n extraGasMax: ExtraGasMaxLimits;\n /**\n * Information due to destination chain\n */\n destinationChain: {\n /**\n * gasAmountMax maximum amount you can receive as extra gas on dest chain\n */\n gasAmountMax: ExtraGasMaxLimit;\n /**\n * cost of swap tx on chain\n */\n swap: AmountFormatted;\n /**\n * cost of send tx on chain\n */\n transfer: AmountFormatted;\n };\n /**\n * Exchange rate\n */\n exchangeRate: string;\n /**\n * Source native token price\n */\n sourceNativeTokenPrice: string;\n}\n\n/**\n * Provide pending status information\n */\nexport interface PendingStatusInfoResponse {\n /**\n * Number of pending transactions\n */\n pendingTxs: number;\n /**\n * Total amount of pending transactions\n */\n pendingAmount: AmountFormatted;\n /**\n * The amount of tokens can be received as a result of transfer considering pending transactions\n */\n estimatedAmount: { min: AmountFormatted; max: AmountFormatted };\n}\n", "import { Big } from \"big.js\";\nimport { Chains } from \"../chains\";\nimport { ApiClientImpl } from \"../client/core-api/api-client\";\nimport { ApiClientCaching } from \"../client/core-api/api-client-caching\";\nimport {\n AddressStatus,\n CheckAddressResponse,\n GasBalanceResponse,\n Messenger,\n PendingInfoDTO,\n TransferStatusResponse,\n} from \"../client/core-api/core-api.model\";\nimport { AllbridgeCoreClientImpl } from \"../client/core-api/core-client-base\";\nimport { AllbridgeCoreClientFiltered, AllbridgeCoreClientFilteredImpl } from \"../client/core-api/core-client-filtered\";\nimport { AllbridgeCoreClientPoolInfoCaching } from \"../client/core-api/core-client-pool-info-caching\";\nimport { mainnet } from \"../configs\";\nimport {\n AllbridgeCoreSdkOptions,\n BasicChainProperties,\n NodeRpcUrls,\n OFTDoesNotSupportedError,\n SdkError,\n} from \"../index\";\nimport {\n AmountFormat,\n AmountFormatted,\n AmountsAndGasFeeOptions,\n CCTPDoesNotSupportedError,\n ExtraGasMaxLimitResponse,\n GasFeeOptions,\n GetTokenBalanceParams,\n InsufficientPoolLiquidityError,\n NodeRpcUrlNotInitializedError,\n PendingStatusInfoResponse,\n Provider,\n SendAmountDetails,\n SwapAndBridgeCalculationData,\n} from \"../models\";\nimport { ChainDetailsMap, PoolInfo, PoolKeyObject, TokenWithChainDetails } from \"../tokens-info\";\nimport {\n aprInPercents,\n convertAmountPrecision,\n convertFloatAmountToInt,\n convertIntAmountToFloat,\n fromSystemPrecision,\n getFeePercent,\n getSwapFromVUsdPoolInfo,\n swapFromVUsd,\n swapFromVUsdReverse,\n swapToVUsd,\n swapToVUsdReverse,\n} from \"../utils/calculation\";\nimport { SYSTEM_PRECISION } from \"../utils/calculation/constants\";\nimport { getSendAmountDetails } from \"../utils/calculation/swap-and-bridge-details\";\nimport {\n swapAndBridgeFeeCalculation,\n swapAndBridgeFeeCalculationReverse,\n} from \"../utils/calculation/swap-and-bridge-fee-calc\";\nimport { getPoolInfoByToken, validateAmountDecimals, validateAmountGtZero } from \"../utils/utils\";\nimport { BridgeService, DefaultBridgeService } from \"./bridge\";\nimport { GetNativeTokenBalanceParams } from \"./bridge/models\";\nimport { getExtraGasMaxLimits, getGasFeeOptions } from \"./bridge/utils\";\nimport { DefaultLiquidityPoolService, LiquidityPoolService } from \"./liquidity-pool\";\nimport { DefaultTokenService, TokenService } from \"./token\";\nimport { DefaultYieldService, YieldService } from \"./yield\";\n\nexport class NodeRpcUrlsConfig {\n constructor(private nodeRpcUrls: NodeRpcUrls) {}\n\n getNodeRpcUrl(chainSymbol: string): string {\n const nodeRpcUrl = this.nodeRpcUrls[chainSymbol];\n if (nodeRpcUrl !== undefined) {\n return nodeRpcUrl;\n } else {\n throw new NodeRpcUrlNotInitializedError(chainSymbol);\n }\n }\n}\n\nexport class AllbridgeCoreSdkService {\n readonly api: AllbridgeCoreClientFiltered;\n\n private readonly tokenService: TokenService;\n\n readonly params: AllbridgeCoreSdkOptions;\n\n bridge: BridgeService;\n pool: LiquidityPoolService;\n yield: YieldService;\n\n constructor(\n public readonly nodeRpcUrlsConfig: NodeRpcUrlsConfig,\n params: AllbridgeCoreSdkOptions = mainnet\n ) {\n Chains.addChainsProperties(params.additionalChainsProperties as Record<string, BasicChainProperties>);\n const apiClient = new ApiClientImpl(params);\n const apiClientCaching = new ApiClientCaching(apiClient);\n const coreClient = new AllbridgeCoreClientImpl(apiClientCaching);\n const coreClientPoolInfoCaching = new AllbridgeCoreClientPoolInfoCaching(coreClient);\n this.api = new AllbridgeCoreClientFilteredImpl(coreClientPoolInfoCaching, params);\n this.tokenService = new DefaultTokenService(this.api, nodeRpcUrlsConfig, params);\n this.bridge = new DefaultBridgeService(this.api, nodeRpcUrlsConfig, params, this.tokenService);\n this.pool = new DefaultLiquidityPoolService(this.api, nodeRpcUrlsConfig, params, this.tokenService);\n this.yield = new DefaultYieldService(this.api, nodeRpcUrlsConfig, params, this.tokenService);\n this.params = params;\n }\n\n async chainDetailsMap(type: \"swap\" | \"pool\"): Promise<ChainDetailsMap> {\n return this.api.getChainDetailsMap(type);\n }\n\n async tokens(type: \"swap\" | \"pool\"): Promise<TokenWithChainDetails[]> {\n return this.api.tokens(type);\n }\n\n async tokensByChain(chainSymbol: string, type: \"swap\" | \"pool\"): Promise<TokenWithChainDetails[]> {\n const map = await this.api.getChainDetailsMap(type);\n const chainDetails = map[chainSymbol];\n if (!chainDetails) {\n return [];\n }\n return chainDetails.tokens;\n }\n\n async getTransferStatus(chainSymbol: string, txId: string): Promise<TransferStatusResponse> {\n return this.api.getTransferStatus(chainSymbol, txId);\n }\n\n async getGasBalance(chainSymbol: string, address: string): Promise<GasBalanceResponse> {\n return this.api.getGasBalance(chainSymbol, address);\n }\n\n async checkAddress(): Promise<CheckAddressResponse> {\n return new Promise((resolve) => {\n resolve({\n status: AddressStatus.OK,\n gasBalance: null,\n });\n });\n }\n\n async getPendingStatusInfo(\n amount: string,\n amountFormat: AmountFormat,\n sourceToken: TokenWithChainDetails,\n destToken: TokenWithChainDetails\n ): Promise<PendingStatusInfoResponse> {\n validateAmountGtZero(amount);\n let amountInTokenPrecision;\n if (amountFormat == AmountFormat.FLOAT) {\n validateAmountDecimals(\"amount\", amount, sourceToken.decimals);\n amountInTokenPrecision = convertFloatAmountToInt(amount, sourceToken.decimals).toFixed();\n } else {\n amountInTokenPrecision = amount;\n }\n\n const vUsdAmountInt = swapToVUsd(\n amountInTokenPrecision,\n sourceToken,\n await getPoolInfoByToken(this.api, sourceToken)\n );\n const destPoolInfo = await getPoolInfoByToken(this.api, destToken);\n const amountResultIntFormatted: AmountFormatted = this.getAmountFromVUsdFormatted(\n vUsdAmountInt,\n destToken,\n destPoolInfo\n );\n\n let pendingInfoDTO: PendingInfoDTO | undefined;\n const pendingInfo = await this.api.getPendingInfo();\n for (const tokenAddress in pendingInfo[destToken.chainSymbol]) {\n const info = pendingInfo[destToken.chainSymbol];\n if (!info) {\n throw new SdkError(\"Cannot find pending info for \" + destToken.chainSymbol);\n }\n pendingInfoDTO = info[tokenAddress];\n }\n if (pendingInfoDTO) {\n const destPoolAfterPending = getSwapFromVUsdPoolInfo(pendingInfoDTO.totalSentAmount, destPoolInfo);\n const amountResultIntAfterPendingFormatted: AmountFormatted = this.getAmountFromVUsdFormatted(\n vUsdAmountInt,\n destToken,\n destPoolAfterPending\n );\n\n let estimatedAmount: { min: AmountFormatted; max: AmountFormatted };\n if (Big(amountResultIntAfterPendingFormatted.int).gt(amountResultIntFormatted.int)) {\n estimatedAmount = { min: amountResultIntFormatted, max: amountResultIntAfterPendingFormatted };\n } else {\n estimatedAmount = { min: amountResultIntAfterPendingFormatted, max: amountResultIntFormatted };\n }\n\n return {\n pendingTxs: pendingInfoDTO.pendingTxs,\n pendingAmount: {\n [AmountFormat.INT]: convertAmountPrecision(\n pendingInfoDTO.totalSentAmount,\n SYSTEM_PRECISION,\n destToken.decimals\n ).toFixed(0),\n [AmountFormat.FLOAT]: convertIntAmountToFloat(pendingInfoDTO.totalSentAmount, SYSTEM_PRECISION).toFixed(),\n },\n estimatedAmount,\n };\n }\n return {\n pendingTxs: 0,\n pendingAmount: {\n [AmountFormat.INT]: \"0\",\n [AmountFormat.FLOAT]: \"0\",\n },\n estimatedAmount: {\n min: amountResultIntFormatted,\n max: amountResultIntFormatted,\n },\n };\n }\n\n async getTokenBalance(params: GetTokenBalanceParams, provider?: Provider): Promise<string> {\n return this.tokenService.getTokenBalance(params, provider);\n }\n\n async getNativeTokenBalance(params: GetNativeTokenBalanceParams, provider?: Provider): Promise<AmountFormatted> {\n return this.tokenService.getNativeTokenBalance(params, provider);\n }\n\n async calculateFeePercentOnSourceChain(\n amountFloat: number | string | Big,\n sourceChainToken: TokenWithChainDetails\n ): Promise<number> {\n validateAmountGtZero(amountFloat);\n validateAmountDecimals(\"amountFloat\", amountFloat, sourceChainToken.decimals);\n const amountInt = convertFloatAmountToInt(amountFloat, sourceChainToken.decimals);\n if (amountInt.eq(0)) {\n return 0;\n }\n const vUsdInSystemPrecision = swapToVUsd(\n amountInt,\n sourceChainToken,\n await getPoolInfoByToken(this.api, sourceChainToken)\n );\n const vUsdInSourcePrecision = fromSystemPrecision(vUsdInSystemPrecision, sourceChainToken.decimals);\n return getFeePercent(amountInt, vUsdInSourcePrecision);\n }\n\n async calculateFeePercentOnDestinationChain(\n amountFloat: number | string | Big,\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails\n ): Promise<number> {\n validateAmountGtZero(amountFloat);\n validateAmountDecimals(\"amountFloat\", amountFloat, sourceChainToken.decimals);\n const amountInt = convertFloatAmountToInt(amountFloat, sourceChainToken.decimals);\n if (amountInt.eq(0)) {\n return 0;\n }\n const vUsdInSystemPrecision = swapToVUsd(\n amountInt,\n sourceChainToken,\n await getPoolInfoByToken(this.api, sourceChainToken)\n );\n const usd = swapFromVUsd(\n vUsdInSystemPrecision,\n destinationChainToken,\n await getPoolInfoByToken(this.api, destinationChainToken)\n );\n const vUsdInDestinationPrecision = fromSystemPrecision(vUsdInSystemPrecision, destinationChainToken.decimals);\n return getFeePercent(vUsdInDestinationPrecision, usd);\n }\n\n async getAmountToBeReceivedAndGasFeeOptions(\n amountToSendFloat: number | string | Big,\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n messenger: Messenger\n ): Promise<AmountsAndGasFeeOptions> {\n validateAmountGtZero(amountToSendFloat);\n validateAmountDecimals(\"amountToSendFloat\", amountToSendFloat, sourceChainToken.decimals);\n return {\n amountToSendFloat: Big(amountToSendFloat).toFixed(),\n amountToBeReceivedFloat: await this.getAmountToBeReceived(\n amountToSendFloat,\n sourceChainToken,\n destinationChainToken,\n messenger\n ),\n gasFeeOptions: await this.getGasFeeOptions(sourceChainToken, destinationChainToken, messenger),\n };\n }\n\n async getAmountToSendAndGasFeeOptions(\n amountToBeReceivedFloat: number | string | Big,\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n messenger: Messenger\n ): Promise<AmountsAndGasFeeOptions> {\n validateAmountGtZero(amountToBeReceivedFloat);\n validateAmountDecimals(\"amountToBeReceivedFloat\", amountToBeReceivedFloat, destinationChainToken.decimals);\n return {\n amountToSendFloat: await this.getAmountToSend(\n amountToBeReceivedFloat,\n sourceChainToken,\n destinationChainToken,\n messenger\n ),\n amountToBeReceivedFloat: Big(amountToBeReceivedFloat).toFixed(),\n gasFeeOptions: await this.getGasFeeOptions(sourceChainToken, destinationChainToken, messenger),\n };\n }\n\n async getAmountToBeReceived(\n amountToSendFloat: number | string | Big,\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n messenger: Messenger\n ): Promise<string> {\n return this.getAmountToBeReceivedCompute(\n amountToSendFloat,\n sourceChainToken,\n destinationChainToken,\n messenger,\n async () => await getPoolInfoByToken(this.api, sourceChainToken),\n async () => await getPoolInfoByToken(this.api, destinationChainToken)\n );\n }\n\n async getAmountToBeReceivedFromChain(\n amountToSendFloat: number | string | Big,\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n messenger: Messenger,\n sourceProvider?: Provider,\n destinationProvider?: Provider\n ): Promise<string> {\n return this.getAmountToBeReceivedCompute(\n amountToSendFloat,\n sourceChainToken,\n destinationChainToken,\n messenger,\n async () => await this.pool.getPoolInfoFromChain(sourceChainToken, sourceProvider),\n async () => await this.pool.getPoolInfoFromChain(destinationChainToken, destinationProvider)\n );\n }\n\n async getAmountToBeReceivedCompute(\n amountToSendFloat: number | string | Big,\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n messenger: Messenger = Messenger.ALLBRIDGE,\n sourcePool: () => Promise<PoolInfo>,\n destPool: () => Promise<PoolInfo>\n ): Promise<string> {\n switch (messenger) {\n case Messenger.ALLBRIDGE:\n case Messenger.WORMHOLE: {\n return this.getAmountToBeReceivedComputeWithPools(\n amountToSendFloat,\n sourceChainToken,\n destinationChainToken,\n await sourcePool(),\n await destPool()\n );\n }\n case Messenger.CCTP:\n case Messenger.CCTP_V2:\n return this.getAmountToBeReceivedComputeCctp(\n amountToSendFloat,\n sourceChainToken,\n destinationChainToken,\n messenger\n );\n case Messenger.OFT:\n return this.getAmountToBeReceivedComputeOft(amountToSendFloat, sourceChainToken, destinationChainToken);\n }\n }\n\n getAmountToBeReceivedComputeWithPools(\n amountToSendFloat: number | string | Big,\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n sourcePool: PoolInfo,\n destinationPool: PoolInfo\n ): string {\n validateAmountGtZero(amountToSendFloat);\n validateAmountDecimals(\"amountToSendFloat\", amountToSendFloat, sourceChainToken.decimals);\n const amountToSend = convertFloatAmountToInt(amountToSendFloat, sourceChainToken.decimals);\n\n const vUsd = swapToVUsd(amountToSend, sourceChainToken, sourcePool);\n return this.getAmountFromVUsdFormatted(vUsd, destinationChainToken, destinationPool).float;\n }\n\n getAmountToBeReceivedComputeCctp(\n amountToSendFloat: number | string | Big,\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n messenger: Messenger.CCTP | Messenger.CCTP_V2\n ): string {\n validateAmountGtZero(amountToSendFloat);\n validateAmountDecimals(\"amountToSendFloat\", amountToSendFloat, sourceChainToken.decimals);\n const amountToSend = convertFloatAmountToInt(amountToSendFloat, sourceChainToken.decimals);\n\n switch (messenger) {\n case Messenger.CCTP: {\n if (!sourceChainToken.cctpAddress || !destinationChainToken.cctpAddress || !sourceChainToken.cctpFeeShare) {\n throw new CCTPDoesNotSupportedError(\"Such route does not support CCTP protocol\");\n }\n const result = amountToSend.mul(Big(1).minus(sourceChainToken.cctpFeeShare)).round(0, Big.roundUp);\n const resultInDestPrecision = convertAmountPrecision(\n result,\n sourceChainToken.decimals,\n destinationChainToken.decimals\n ).round(0);\n return convertIntAmountToFloat(resultInDestPrecision, destinationChainToken.decimals).toFixed();\n }\n case Messenger.CCTP_V2: {\n if (\n !sourceChainToken.cctpV2Address ||\n !destinationChainToken.cctpV2Address ||\n !sourceChainToken.cctpV2FeeShare\n ) {\n throw new CCTPDoesNotSupportedError(\"Such route does not support CCTP V2 protocol\");\n }\n const result = amountToSend.mul(Big(1).minus(sourceChainToken.cctpV2FeeShare)).round(0, Big.roundUp);\n const resultInDestPrecision = convertAmountPrecision(\n result,\n sourceChainToken.decimals,\n destinationChainToken.decimals\n ).round(0);\n\n return convertIntAmountToFloat(resultInDestPrecision, destinationChainToken.decimals).toFixed();\n }\n }\n }\n\n async getAmountToBeReceivedComputeOft(\n amountToSendFloat: number | string | Big,\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails\n ): Promise<string> {\n validateAmountGtZero(amountToSendFloat);\n validateAmountDecimals(\"amountToSendFloat\", amountToSendFloat, sourceChainToken.decimals);\n const amountToSend = convertFloatAmountToInt(amountToSendFloat, sourceChainToken.decimals);\n\n if (\n !sourceChainToken.oftBridgeAddress ||\n !destinationChainToken.oftBridgeAddress ||\n sourceChainToken.oftId !== destinationChainToken.oftId\n ) {\n throw new OFTDoesNotSupportedError(\"Such route does not support OFT protocol\");\n }\n const { adminFeeShareWithExtras } = await this.api.getReceiveTransactionCost({\n sourceChainId: sourceChainToken.allbridgeChainId,\n destinationChainId: destinationChainToken.allbridgeChainId,\n messenger: Messenger.OFT,\n sourceToken: sourceChainToken.tokenAddress,\n });\n if (!adminFeeShareWithExtras) {\n throw new OFTDoesNotSupportedError(\"Such route does not support OFT protocol\");\n }\n const result = amountToSend.mul(Big(1).minus(adminFeeShareWithExtras)).round(0, Big.roundUp);\n const resultInDestPrecision = convertAmountPrecision(\n result,\n sourceChainToken.decimals,\n destinationChainToken.decimals\n ).round(0);\n\n return convertIntAmountToFloat(resultInDestPrecision, destinationChainToken.decimals).toFixed();\n }\n\n async getAmountToSend(\n amountToBeReceivedFloat: number | string | Big,\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n messenger: Messenger\n ): Promise<string> {\n return this.getAmountToSendCompute(\n amountToBeReceivedFloat,\n sourceChainToken,\n destinationChainToken,\n messenger,\n () => getPoolInfoByToken(this.api, sourceChainToken),\n () => getPoolInfoByToken(this.api, destinationChainToken)\n );\n }\n\n async getAmountToSendFromChain(\n amountToBeReceivedFloat: number | string | Big,\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n messenger: Messenger,\n sourceProvider?: Provider,\n destinationProvider?: Provider\n ): Promise<string> {\n return this.getAmountToSendCompute(\n amountToBeReceivedFloat,\n sourceChainToken,\n destinationChainToken,\n messenger,\n () => this.pool.getPoolInfoFromChain(sourceChainToken, sourceProvider),\n () => this.pool.getPoolInfoFromChain(destinationChainToken, destinationProvider)\n );\n }\n\n async getAmountToSendCompute(\n amountToBeReceivedFloat: number | string | Big,\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n messenger: Messenger = Messenger.ALLBRIDGE,\n sourcePool: () => Promise<PoolInfo>,\n destPool: () => Promise<PoolInfo>\n ): Promise<string> {\n switch (messenger) {\n case Messenger.ALLBRIDGE:\n case Messenger.WORMHOLE: {\n return this.getAmountToSendComputeWithPools(\n amountToBeReceivedFloat,\n sourceChainToken,\n destinationChainToken,\n await sourcePool(),\n await destPool()\n );\n }\n case Messenger.CCTP:\n case Messenger.CCTP_V2:\n return this.getAmountToSendComputeCctp(\n amountToBeReceivedFloat,\n sourceChainToken,\n destinationChainToken,\n messenger\n );\n case Messenger.OFT:\n return this.getAmountToSendComputeOft(amountToBeReceivedFloat, sourceChainToken, destinationChainToken);\n }\n }\n\n getAmountToSendComputeWithPools(\n amountToBeReceivedFloat: number | string | Big,\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n sourcePool: PoolInfo,\n destinationPool: PoolInfo\n ): string {\n validateAmountGtZero(amountToBeReceivedFloat);\n validateAmountDecimals(\"amountToBeReceivedFloat\", amountToBeReceivedFloat, destinationChainToken.decimals);\n const amountToBeReceived = convertFloatAmountToInt(amountToBeReceivedFloat, destinationChainToken.decimals);\n\n const vUsd = swapFromVUsdReverse(amountToBeReceived, destinationChainToken, destinationPool);\n const resultInt = swapToVUsdReverse(vUsd, sourceChainToken, sourcePool);\n if (Big(resultInt).lte(0)) {\n throw new InsufficientPoolLiquidityError();\n }\n return convertIntAmountToFloat(resultInt, sourceChainToken.decimals).toFixed();\n }\n\n getAmountToSendComputeCctp(\n amountToBeReceivedFloat: number | string | Big,\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n messenger: Messenger.CCTP | Messenger.CCTP_V2\n ): string {\n validateAmountGtZero(amountToBeReceivedFloat);\n validateAmountDecimals(\"amountToBeReceivedFloat\", amountToBeReceivedFloat, destinationChainToken.decimals);\n const amountToBeReceived = convertFloatAmountToInt(amountToBeReceivedFloat, destinationChainToken.decimals);\n\n switch (messenger) {\n case Messenger.CCTP: {\n if (!sourceChainToken.cctpAddress || !destinationChainToken.cctpAddress || !sourceChainToken.cctpFeeShare) {\n throw new CCTPDoesNotSupportedError(\"Such route does not support CCTP protocol\");\n }\n const result = amountToBeReceived.div(Big(1).minus(sourceChainToken.cctpFeeShare)).round(0, Big.roundDown);\n const resultInSourcePrecision = convertAmountPrecision(\n result,\n destinationChainToken.decimals,\n sourceChainToken.decimals\n ).round(0);\n return convertIntAmountToFloat(resultInSourcePrecision, sourceChainToken.decimals).toFixed();\n }\n case Messenger.CCTP_V2: {\n if (\n !sourceChainToken.cctpV2Address ||\n !destinationChainToken.cctpV2Address ||\n !sourceChainToken.cctpV2FeeShare\n ) {\n throw new CCTPDoesNotSupportedError(\"Such route does not support CCTP V2 protocol\");\n }\n const result = amountToBeReceived.div(Big(1).minus(sourceChainToken.cctpV2FeeShare)).round(0, Big.roundDown);\n const resultInSourcePrecision = convertAmountPrecision(\n result,\n destinationChainToken.decimals,\n sourceChainToken.decimals\n ).round(0);\n return convertIntAmountToFloat(resultInSourcePrecision, sourceChainToken.decimals).toFixed();\n }\n }\n }\n\n async getAmountToSendComputeOft(\n amountToBeReceivedFloat: number | string | Big,\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails\n ): Promise<string> {\n validateAmountGtZero(amountToBeReceivedFloat);\n validateAmountDecimals(\"amountToBeReceivedFloat\", amountToBeReceivedFloat, destinationChainToken.decimals);\n const amountToBeReceived = convertFloatAmountToInt(amountToBeReceivedFloat, destinationChainToken.decimals);\n\n if (\n !sourceChainToken.oftId ||\n !destinationChainToken.oftId ||\n !sourceChainToken.oftBridgeAddress ||\n sourceChainToken.oftId !== destinationChainToken.oftId\n ) {\n throw new OFTDoesNotSupportedError(\"Such route does not support OFT protocol\");\n }\n const { adminFeeShareWithExtras } = await this.api.getReceiveTransactionCost({\n sourceChainId: sourceChainToken.allbridgeChainId,\n destinationChainId: destinationChainToken.allbridgeChainId,\n messenger: Messenger.OFT,\n sourceToken: sourceChainToken.tokenAddress,\n });\n if (!adminFeeShareWithExtras) {\n throw new OFTDoesNotSupportedError(\"Such route does not support OFT protocol\");\n }\n const result = amountToBeReceived.div(Big(1).minus(adminFeeShareWithExtras)).round(0, Big.roundDown);\n const resultInSourcePrecision = convertAmountPrecision(\n result,\n destinationChainToken.decimals,\n sourceChainToken.decimals\n ).round(0);\n return convertIntAmountToFloat(resultInSourcePrecision, sourceChainToken.decimals).toFixed();\n }\n\n async getGasFeeOptions(\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n messenger: Messenger\n ): Promise<GasFeeOptions> {\n return getGasFeeOptions(sourceChainToken, destinationChainToken.allbridgeChainId, messenger, this.api);\n }\n\n getAverageTransferTime(\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n messenger: Messenger\n ): number | null {\n return sourceChainToken.transferTime?.[destinationChainToken.chainSymbol]?.[messenger] ?? null;\n }\n\n async getPoolInfoByToken(token: TokenWithChainDetails): Promise<PoolInfo> {\n return await this.api.getPoolInfoByKey({ chainSymbol: token.chainSymbol, poolAddress: token.poolAddress });\n }\n\n async refreshPoolInfo(tokens?: TokenWithChainDetails | TokenWithChainDetails[]): Promise<void> {\n if (tokens) {\n const tokensArray = tokens instanceof Array ? tokens : [tokens];\n const poolKeys: PoolKeyObject[] = tokensArray.map((t) => {\n return { chainSymbol: t.chainSymbol, poolAddress: t.poolAddress };\n });\n return this.api.refreshPoolInfo(poolKeys);\n }\n return this.api.refreshPoolInfo();\n }\n\n aprInPercents(apr: string): string {\n return aprInPercents(apr);\n }\n\n async getExtraGasMaxLimits(\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n messenger: Messenger\n ): Promise<ExtraGasMaxLimitResponse> {\n return await getExtraGasMaxLimits(sourceChainToken, destinationChainToken, messenger, this.api);\n }\n\n async getVUsdFromAmount(\n amount: string,\n amountFormat: AmountFormat,\n sourceToken: TokenWithChainDetails\n ): Promise<AmountFormatted> {\n validateAmountGtZero(amount);\n let amountInTokenPrecision;\n if (amountFormat == AmountFormat.FLOAT) {\n validateAmountDecimals(\"amount\", amount, sourceToken.decimals);\n amountInTokenPrecision = convertFloatAmountToInt(amount, sourceToken.decimals).toFixed();\n } else {\n amountInTokenPrecision = amount;\n }\n\n const vUsdAmount = swapToVUsd(amountInTokenPrecision, sourceToken, await getPoolInfoByToken(this.api, sourceToken));\n return {\n [AmountFormat.INT]: vUsdAmount,\n [AmountFormat.FLOAT]: convertIntAmountToFloat(vUsdAmount, SYSTEM_PRECISION).toFixed(),\n };\n }\n\n async getAmountFromVUsd(vUsdAmount: string, destToken: TokenWithChainDetails): Promise<AmountFormatted> {\n return this.getAmountFromVUsdFormatted(vUsdAmount, destToken, await getPoolInfoByToken(this.api, destToken));\n }\n\n private getAmountFromVUsdFormatted(\n vUsdAmountInt: string,\n destToken: TokenWithChainDetails,\n destPoolInfo: Pick<PoolInfo, \"vUsdBalance\" | \"aValue\" | \"dValue\" | \"tokenBalance\">\n ): AmountFormatted {\n validateAmountGtZero(vUsdAmountInt);\n const amountResultInt = swapFromVUsd(vUsdAmountInt, destToken, destPoolInfo);\n if (Big(amountResultInt).lt(0)) {\n throw new InsufficientPoolLiquidityError();\n }\n return {\n [AmountFormat.INT]: amountResultInt,\n [AmountFormat.FLOAT]: convertIntAmountToFloat(amountResultInt, destToken.decimals).toFixed(),\n };\n }\n\n async swapAndBridgeFeeCalculation(\n amountInTokenPrecision: string,\n sourceToken: TokenWithChainDetails,\n destToken: TokenWithChainDetails\n ): Promise<SwapAndBridgeCalculationData> {\n return swapAndBridgeFeeCalculation(\n amountInTokenPrecision,\n {\n decimals: sourceToken.decimals,\n feeShare: sourceToken.feeShare,\n poolInfo: await getPoolInfoByToken(this.api, sourceToken),\n },\n {\n decimals: destToken.decimals,\n feeShare: destToken.feeShare,\n poolInfo: await getPoolInfoByToken(this.api, destToken),\n }\n );\n }\n\n async swapAndBridgeFeeCalculationReverse(\n amountInTokenPrecision: string,\n sourceToken: TokenWithChainDetails,\n destToken: TokenWithChainDetails\n ): Promise<SwapAndBridgeCalculationData> {\n const result = swapAndBridgeFeeCalculationReverse(\n amountInTokenPrecision,\n {\n decimals: sourceToken.decimals,\n feeShare: sourceToken.feeShare,\n poolInfo: await getPoolInfoByToken(this.api, sourceToken),\n },\n {\n decimals: destToken.decimals,\n feeShare: destToken.feeShare,\n poolInfo: await getPoolInfoByToken(this.api, destToken),\n }\n );\n const newAmount = result.swapFromVUsdCalcResult.amountIncludingCommissionInTokenPrecision;\n if (Big(newAmount).lt(0)) {\n throw new InsufficientPoolLiquidityError();\n }\n return result;\n }\n\n async getSendAmountDetails(\n amount: string,\n amountFormat: AmountFormat,\n sourceToken: TokenWithChainDetails,\n destToken: TokenWithChainDetails\n ): Promise<SendAmountDetails> {\n validateAmountGtZero(amount);\n let amountInTokenPrecision;\n if (amountFormat == AmountFormat.FLOAT) {\n validateAmountDecimals(\"amount\", amount, sourceToken.decimals);\n amountInTokenPrecision = convertFloatAmountToInt(amount, sourceToken.decimals).toFixed();\n } else {\n amountInTokenPrecision = amount;\n }\n\n return getSendAmountDetails(\n amountInTokenPrecision,\n sourceToken,\n await getPoolInfoByToken(this.api, sourceToken),\n destToken,\n await getPoolInfoByToken(this.api, destToken)\n );\n }\n}\n", "import { BigSource } from \"big.js\";\nimport { AdditionalBasicChainProperties } from \"./chains/models\";\nimport { mainnet } from \"./configs\";\nimport {\n AmountFormat,\n AmountFormatted,\n AmountsAndGasFeeOptions,\n BridgeService,\n ChainDetailsMap,\n CheckAddressResponse,\n ExtraGasMaxLimitResponse,\n GasBalanceResponse,\n GasFeeOptions,\n GetNativeTokenBalanceParams,\n GetTokenBalanceParams,\n LiquidityPoolService,\n Messenger,\n PendingStatusInfoResponse,\n PoolInfo,\n Provider,\n SendAmountDetails,\n SwapAndBridgeCalculationData,\n TokenWithChainDetails,\n TransferStatusResponse,\n} from \"./models\";\nimport { AllbridgeCoreSdkService, NodeRpcUrlsConfig } from \"./services\";\nimport { CctpParams } from \"./services/bridge/sol\";\nimport { YieldService } from \"./services/yield\";\nimport { DefaultUtils, Utils } from \"./utils\";\n\nexport * from \"./configs\";\nexport * from \"./models\";\n\nexport interface AllbridgeCoreSdkOptions {\n coreApiUrl: string;\n /**\n * A set of query parameters to be added to all requests to the Core API.\n */\n coreApiQueryParams?: Record<string, string>;\n /**\n * A set of headers to be added to all requests to the Core API.\n */\n coreApiHeaders?: Record<string, string>;\n /**\n * Jupiter Swap Api</br>\n * Default: https://lite-api.jup.ag/swap/v1</br>\n * {@link https://dev.jup.ag/docs/swap-api/}\n */\n jupiterUrl: string;\n /**\n * Jupiter Api Key Header</br>\n * {@link https://dev.jup.ag/docs/api-setup}\n */\n jupiterApiKeyHeader?: string;\n /**\n * Jupiter v6 'maxAccounts' parameter</br>\n * Rough estimate of the max accounts to be used for the quote, so that you can compose with your own accounts</br>\n * {@link https://station.jup.ag/docs/apis/swap-api#using-maxaccounts}\n */\n jupiterMaxAccounts?: number;\n wormholeMessengerProgramId: string;\n solanaLookUpTable: string;\n sorobanNetworkPassphrase: string;\n /**\n * Optional. Will be used in methods</br>\n * {@link LiquidityPoolService.getPoolInfoFromChain} and {@link LiquidityPoolService.getAmountToBeWithdrawn}</br>\n * to fetch information from the blockchain with fewer HTTP requests using JSON-RPC API\n */\n tronJsonRpc?: string;\n cctpParams: CctpParams;\n /**\n * The number of seconds that pool information taken from the chain will be cached.\n *\n * @type {number}\n */\n cachePoolInfoChainSec: number;\n\n /**\n * @internal\n * Optional additional properties to merge with the default properties.\n */\n additionalChainsProperties?: Record<string, AdditionalBasicChainProperties>;\n}\n\n/**\n * Type representing RPC node URLs for different blockchain chains.</br>\n * Provide node RPC URL for chain connection you intend to communicate with</br>\n * - required for SOL, TRX chains</br>\n * - optional for EVM chains -- you can interact by passing a {@link Provider} that will be used to communicate with the chain</br>\n * @typedef {Record<string, string>} NodeRpcUrls\n * @property {string} chainSymbol - The symbol of the chain representing one of the supported blockchain networks (e.g., \"ETH\" for Ethereum). For more details, see: {@link ChainSymbol}.\n * @property {string} rpcUrl - The RPC node URL for the specified chain.\n */\nexport type NodeRpcUrls = Record<string, string>;\n\n/**\n * @deprecated Use {@link NodeRpcUrls}\n */\nexport interface NodeUrlsConfig {\n solanaRpcUrl: string;\n tronRpcUrl: string;\n}\n\n/**\n * @deprecated Use {@link NodeRpcUrls}\n */\nfunction isNodeUrlsConfig(nodeUrls: NodeUrlsConfig | NodeRpcUrls): nodeUrls is NodeUrlsConfig {\n return \"solanaRpcUrl\" in nodeUrls;\n}\n\nexport class AllbridgeCoreSdk {\n readonly params: AllbridgeCoreSdkOptions;\n\n bridge: BridgeService;\n pool: LiquidityPoolService;\n yield: YieldService;\n utils: Utils;\n\n private service: AllbridgeCoreSdkService;\n\n /**\n * Initializes the SDK object.\n * @param nodeUrls node rpc urls for full functionality\n * @param params\n * Optional.\n * If not defined, the default {@link mainnet} parameters are used.\n */\n constructor(nodeUrls: NodeUrlsConfig | NodeRpcUrls, params: AllbridgeCoreSdkOptions = mainnet) {\n let nodeRpcUrlsConfig: NodeRpcUrlsConfig;\n if (isNodeUrlsConfig(nodeUrls)) {\n nodeRpcUrlsConfig = new NodeRpcUrlsConfig({ SOL: nodeUrls.solanaRpcUrl, TRX: nodeUrls.tronRpcUrl });\n } else {\n nodeRpcUrlsConfig = new NodeRpcUrlsConfig(nodeUrls);\n }\n this.service = new AllbridgeCoreSdkService(nodeRpcUrlsConfig, params);\n this.bridge = this.service.bridge;\n this.pool = this.service.pool;\n this.yield = this.service.yield;\n this.utils = new DefaultUtils(this.service);\n this.params = params;\n }\n\n /**\n * Returns {@link ChainDetailsMap} containing a list of supported tokens groped by chain.\n *\n * @param type - A string value which specifies ChainDetailsMap to retrieve.\n * Can be either 'swap' for send or 'pool' for liquidity pools setup.\n * Defaults to 'swap'.\n */\n async chainDetailsMap(type: \"swap\" | \"pool\" = \"swap\"): Promise<ChainDetailsMap> {\n return this.service.chainDetailsMap(type);\n }\n\n /**\n * Returns a list of supported {@link TokenWithChainDetails | tokens}.\n *\n * @param type - A string value which specifies a set of tokens to retrieve.\n * Can be either 'swap' for tokens to send or 'pool' for liquidity pools operations.\n * Defaults to 'swap'.\n * @returns A promise that resolves to an array of {@link TokenWithChainDetails}.\n */\n async tokens(type: \"swap\" | \"pool\" = \"swap\"): Promise<TokenWithChainDetails[]> {\n return this.service.tokens(type);\n }\n\n /**\n * Returns a list of supported {@link TokenWithChainDetails | tokens} on the selected chain.\n * @param chainSymbol - The symbol of the chain representing one of the supported blockchain networks (e.g., \"ETH\" for Ethereum). For more details, see: {@link ChainSymbol}.\n * @param type - A string value which specifies a set of tokens to retrieve.\n * Can be either 'swap' for tokens to send or 'pool' for liquidity pools operations.\n * Defaults to 'swap'.\n */\n async tokensByChain(chainSymbol: string, type: \"swap\" | \"pool\" = \"swap\"): Promise<TokenWithChainDetails[]> {\n return this.service.tokensByChain(chainSymbol, type);\n }\n\n /**\n * Fetches information about tokens transfer by chosen chainSymbol and transaction Id from the Allbridge Core API.\n * @param chainSymbol - The symbol of the chain representing one of the supported blockchain networks (e.g., \"ETH\" for Ethereum). For more details, see: {@link ChainSymbol}.\n * @param txId\n */\n async getTransferStatus(chainSymbol: string, txId: string): Promise<TransferStatusResponse> {\n return this.service.getTransferStatus(chainSymbol, txId);\n }\n\n /**\n * Get gas balance\n * @param chainSymbol - The symbol of the chain representing one of the supported blockchain networks (e.g., \"ETH\" for Ethereum). For more details, see: {@link ChainSymbol}.\n * @param address\n */\n async getGasBalance(chainSymbol: string, address: string): Promise<GasBalanceResponse> {\n return this.service.getGasBalance(chainSymbol, address);\n }\n\n /**\n * Check address and show gas balance\n * @deprecated\n * @param chainSymbol - The symbol of the chain representing one of the supported blockchain networks (e.g., \"ETH\" for Ethereum). For more details, see: {@link ChainSymbol}.\n * @param recipientAddress\n * @param tokenAddress\n */\n async checkAddress(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n chainSymbol: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n recipientAddress: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n tokenAddress?: string\n ): Promise<CheckAddressResponse> {\n return await this.service.checkAddress();\n }\n\n /**\n * Returns information about pending transactions for the same destination chain and the amount of tokens can be received as a result of transfer considering pending transactions.\n * @param amount the amount of tokens that will be sent\n * @param amountFormat amount format\n * @param sourceToken selected token transfer from\n * @param destToken selected token transfer to\n * @returns range of possible amount based on already pending transactions\n */\n async getPendingStatusInfo(\n amount: string,\n amountFormat: AmountFormat,\n sourceToken: TokenWithChainDetails,\n destToken: TokenWithChainDetails\n ): Promise<PendingStatusInfoResponse> {\n return this.service.getPendingStatusInfo(amount, amountFormat, sourceToken, destToken);\n }\n\n /**\n * Get token balance\n * @param params\n * @param provider\n * @returns Token balance\n */\n async getTokenBalance(params: GetTokenBalanceParams, provider?: Provider): Promise<string> {\n return this.service.getTokenBalance(params, provider);\n }\n\n /**\n * Get native (gas) token balance\n * @param params\n * @param provider\n * @returns Token balance\n */\n async getNativeTokenBalance(params: GetNativeTokenBalanceParams, provider?: Provider): Promise<AmountFormatted> {\n return this.service.getNativeTokenBalance(params, provider);\n }\n\n /**\n * @deprecated\n * Calculates the percentage of fee from the initial amount that is charged when swapping from the selected source chain.\n * (Does not include fee related to the destination chain. Does not include gas fee)\n * @param amountFloat initial amount of tokens to swap\n * @param sourceChainToken selected token on the source chain\n * @returns fee percent\n */\n async calculateFeePercentOnSourceChain(\n amountFloat: BigSource,\n sourceChainToken: TokenWithChainDetails\n ): Promise<number> {\n return this.service.calculateFeePercentOnSourceChain(amountFloat, sourceChainToken);\n }\n\n /**\n * @deprecated\n * Calculates the percentage of fee that is charged when swapping to the selected destination chain. The destination chain fee percent applies to the amount after the source chain fee.\n * (Does not include fee related to the source chain. Does not include gas fee)\n * @see {@link calculateFeePercentOnSourceChain}\n * @param amountFloat initial amount of tokens to swap\n * @param sourceChainToken selected token on the source chain\n * @param destinationChainToken selected token on the destination chain\n * @returns fee percent\n */\n async calculateFeePercentOnDestinationChain(\n amountFloat: BigSource,\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails\n ): Promise<number> {\n return this.service.calculateFeePercentOnDestinationChain(amountFloat, sourceChainToken, destinationChainToken);\n }\n\n /**\n * Calculates the amount of tokens to be received as a result of transfer\n * and fetches {@link GasFeeOptions} which contains available ways to pay the gas fee.\n * @param amountToSendFloat the amount of tokens that will be sent\n * @param sourceChainToken selected token on the source chain\n * @param destinationChainToken selected token on the destination chain\n * @param messenger\n */\n async getAmountToBeReceivedAndGasFeeOptions(\n amountToSendFloat: BigSource,\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n messenger: Messenger\n ): Promise<AmountsAndGasFeeOptions> {\n return this.service.getAmountToBeReceivedAndGasFeeOptions(\n amountToSendFloat,\n sourceChainToken,\n destinationChainToken,\n messenger\n );\n }\n\n /**\n * Calculates the amount of tokens to send based on requested tokens amount be received as a result of transfer.\n * and fetches {@link GasFeeOptions} which contains available ways to pay the gas fee.\n * @param amountToBeReceivedFloat the amount of tokens that should be received\n * @param sourceChainToken selected token on the source chain\n * @param destinationChainToken selected token on the destination chain\n * @param messenger\n */\n async getAmountToSendAndGasFeeOptions(\n amountToBeReceivedFloat: BigSource,\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n messenger: Messenger\n ): Promise<AmountsAndGasFeeOptions> {\n return this.service.getAmountToSendAndGasFeeOptions(\n amountToBeReceivedFloat,\n sourceChainToken,\n destinationChainToken,\n messenger\n );\n }\n\n /**\n * Calculates the amount of tokens to be received as a result of transfer.\n * @param amountToSendFloat the amount of tokens that will be sent\n * @param sourceChainToken selected token on the source chain\n * @param destinationChainToken selected token on the destination chain\n * @param messenger selected messenger\n */\n async getAmountToBeReceived(\n amountToSendFloat: BigSource,\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n /**\n * The Messengers for different routes.\n */\n messenger: Messenger = Messenger.ALLBRIDGE\n ): Promise<string> {\n return this.service.getAmountToBeReceived(amountToSendFloat, sourceChainToken, destinationChainToken, messenger);\n }\n\n /**\n * Calculates the amount of tokens to be received as a result of transfer based on actual blockchain pool state.\n * @param amountToSendFloat the amount of tokens that will be sent\n * @param sourceChainToken selected token on the source chain\n * @param destinationChainToken selected token on the destination chain\n * @param messenger selected messenger\n * @param sourceProvider Optional. source chain Provider\n * @param destinationProvider Optional. destination chain Provider\n */\n async getAmountToBeReceivedFromChain(\n amountToSendFloat: BigSource,\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n /**\n * The Messengers for different routes.\n */\n messenger: Messenger = Messenger.ALLBRIDGE,\n sourceProvider?: Provider,\n destinationProvider?: Provider\n ): Promise<string> {\n return this.service.getAmountToBeReceivedFromChain(\n amountToSendFloat,\n sourceChainToken,\n destinationChainToken,\n messenger,\n sourceProvider,\n destinationProvider\n );\n }\n\n /**\n * Calculates the amount of tokens to be received as a result of transfer based on passed pool state.\n * @param amountToSendFloat the amount of tokens that will be sent\n * @param sourceChainToken selected token on the source chain\n * @param destinationChainToken selected token on the destination chain\n * @param sourcePool source token pool state\n * @param destinationPool destination token pool state\n * @param messenger selected messenger\n */\n getAmountToBeReceivedFromPools(\n amountToSendFloat: BigSource,\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n sourcePool: PoolInfo,\n destinationPool: PoolInfo,\n messenger: Exclude<Messenger, Messenger.OFT> = Messenger.ALLBRIDGE\n ): string {\n switch (messenger) {\n case Messenger.ALLBRIDGE:\n case Messenger.WORMHOLE:\n return this.service.getAmountToBeReceivedComputeWithPools(\n amountToSendFloat,\n sourceChainToken,\n destinationChainToken,\n sourcePool,\n destinationPool\n );\n case Messenger.CCTP:\n case Messenger.CCTP_V2:\n return this.service.getAmountToBeReceivedComputeCctp(\n amountToSendFloat,\n sourceChainToken,\n destinationChainToken,\n messenger\n );\n }\n }\n\n /**\n * Calculates the amount of tokens to send based on requested tokens amount be received as a result of transfer.\n * @param amountToBeReceivedFloat the amount of tokens that should be received\n * @param sourceChainToken selected token on the source chain\n * @param destinationChainToken selected token on the destination chain\n * @param messenger selected messenger\n */\n async getAmountToSend(\n amountToBeReceivedFloat: BigSource,\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n /**\n * The Messengers for different routes.\n */\n messenger: Messenger = Messenger.ALLBRIDGE\n ): Promise<string> {\n return this.service.getAmountToSend(amountToBeReceivedFloat, sourceChainToken, destinationChainToken, messenger);\n }\n\n /**\n * Calculates the amount of tokens to send based on requested tokens amount be received as a result of transfer based on actual blockchain pool state.\n * @param amountToBeReceivedFloat the amount of tokens that should be received\n * @param sourceChainToken selected token on the source chain\n * @param destinationChainToken selected token on the destination chain\n * @param messenger selected messenger\n * @param sourceProvider Optional. source chain Provider\n * @param destinationProvider Optional. destination chain Provider\n */\n async getAmountToSendFromChain(\n amountToBeReceivedFloat: BigSource,\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n /**\n * The Messengers for different routes.\n */\n messenger: Messenger = Messenger.ALLBRIDGE,\n sourceProvider?: Provider,\n destinationProvider?: Provider\n ): Promise<string> {\n return this.service.getAmountToSendFromChain(\n amountToBeReceivedFloat,\n sourceChainToken,\n destinationChainToken,\n messenger,\n sourceProvider,\n destinationProvider\n );\n }\n\n /**\n * Calculates the amount of tokens to send based on requested tokens amount be received as a result of transfer based on passed pool state.\n * @param amountToBeReceivedFloat the amount of tokens that should be received\n * @param sourceChainToken selected token on the source chain\n * @param destinationChainToken selected token on the destination chain\n * @param sourcePool source token pool state\n * @param destinationPool destination token pool state\n * @param messenger selected messenger\n */\n getAmountToSendFromPools(\n amountToBeReceivedFloat: BigSource,\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n sourcePool: PoolInfo,\n destinationPool: PoolInfo,\n messenger: Exclude<Messenger, Messenger.OFT> = Messenger.ALLBRIDGE\n ): string {\n switch (messenger) {\n case Messenger.ALLBRIDGE:\n case Messenger.WORMHOLE:\n return this.service.getAmountToSendComputeWithPools(\n amountToBeReceivedFloat,\n sourceChainToken,\n destinationChainToken,\n sourcePool,\n destinationPool\n );\n case Messenger.CCTP:\n case Messenger.CCTP_V2:\n return this.service.getAmountToSendComputeCctp(\n amountToBeReceivedFloat,\n sourceChainToken,\n destinationChainToken,\n messenger\n );\n }\n }\n\n /**\n * Fetches possible ways to pay the transfer gas fee.\n * @param sourceChainToken selected token on the source chain\n * @param destinationChainToken selected token on the destination chain\n * @param messenger\n * @returns {@link GasFeeOptions}\n */\n async getGasFeeOptions(\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n messenger: Messenger\n ): Promise<GasFeeOptions> {\n return this.service.getGasFeeOptions(sourceChainToken, destinationChainToken, messenger);\n }\n\n /**\n * Gets the average time in ms to complete a transfer for given tokens and messenger.\n * @param sourceChainToken selected token on the source chain.\n * @param destinationChainToken selected token on the destination chain.\n * @param messenger\n * @returns Average transfer time in milliseconds or null if a given combination of tokens and messenger is not supported.\n */\n getAverageTransferTime(\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n messenger: Messenger\n ): number | null {\n return this.service.getAverageTransferTime(sourceChainToken, destinationChainToken, messenger);\n }\n\n /**\n * Gets information about the poolInfo by token\n * @param token\n * @returns poolInfo\n */\n async getPoolInfoByToken(token: TokenWithChainDetails): Promise<PoolInfo> {\n return this.service.getPoolInfoByToken(token);\n }\n\n /**\n * Forces refresh of cached information about the state of liquidity pools.\n * Outdated cache leads to calculated amounts being less accurate.\n * The cache is invalidated at regular intervals, but it can be forced to be refreshed by calling this method.+\n *\n * @param tokens if present, the corresponding liquidity pools will be updated\n */\n async refreshPoolInfo(tokens?: TokenWithChainDetails | TokenWithChainDetails[]): Promise<void> {\n return this.service.refreshPoolInfo(tokens);\n }\n\n /**\n * Convert APR to percentage view\n * @param apr\n * @returns aprPercentageView\n */\n aprInPercents(apr: string): string {\n return this.service.aprInPercents(apr);\n }\n\n /**\n * Get possible limit of extra gas amount.\n * @param sourceChainToken selected token on the source chain\n * @param destinationChainToken selected token on the destination chain\n * @param messenger selected Messenger, Allbridge by default\n * @returns {@link ExtraGasMaxLimitResponse}\n */\n async getExtraGasMaxLimits(\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n messenger: Messenger = Messenger.ALLBRIDGE\n ): Promise<ExtraGasMaxLimitResponse> {\n return this.service.getExtraGasMaxLimits(sourceChainToken, destinationChainToken, messenger);\n }\n\n /**\n * @param amount - amount\n * @param amountFormat - AmountFormat\n * @param sourceToken - selected token on the source chain\n * @return virtual amount\n */\n async getVUsdFromAmount(\n amount: string,\n amountFormat: AmountFormat,\n sourceToken: TokenWithChainDetails\n ): Promise<AmountFormatted> {\n return this.service.getVUsdFromAmount(amount, amountFormat, sourceToken);\n }\n\n /**\n * @param vUsdAmount - amount of vUsd, int format\n * @param destToken selected token on the destination chain\n * @return amount of destToken\n */\n async getAmountFromVUsd(vUsdAmount: string, destToken: TokenWithChainDetails): Promise<AmountFormatted> {\n return this.service.getAmountFromVUsd(vUsdAmount, destToken);\n }\n\n /**\n * @deprecated Use {@link getSendAmountDetails}\n * @param amountInTokenPrecision\n * @param sourceToken\n * @param destToken\n */\n async swapAndBridgeFeeCalculation(\n amountInTokenPrecision: string,\n sourceToken: TokenWithChainDetails,\n destToken: TokenWithChainDetails\n ): Promise<SwapAndBridgeCalculationData> {\n return this.service.swapAndBridgeFeeCalculation(amountInTokenPrecision, sourceToken, destToken);\n }\n\n /**\n * @deprecated Use {@link getAmountToBeReceived} and then {@link getSendAmountDetails}\n * @param amountInTokenPrecision\n * @param sourceToken\n * @param destToken\n */\n async swapAndBridgeFeeCalculationReverse(\n amountInTokenPrecision: string,\n sourceToken: TokenWithChainDetails,\n destToken: TokenWithChainDetails\n ): Promise<SwapAndBridgeCalculationData> {\n return this.service.swapAndBridgeFeeCalculationReverse(amountInTokenPrecision, sourceToken, destToken);\n }\n\n /**\n * Show amount changes (fee and amount adjustment) during send through pools on source and destination chains\n */\n async getSendAmountDetails(\n amount: string,\n amountFormat: AmountFormat,\n sourceToken: TokenWithChainDetails,\n destToken: TokenWithChainDetails\n ): Promise<SendAmountDetails> {\n return this.service.getSendAmountDetails(amount, amountFormat, sourceToken, destToken);\n }\n}\n"],
4
+ "sourcesContent": ["// @ts-nocheck\n\nimport { bcs, BcsType } from \"@mysten/sui/bcs\";\nimport {\n Transaction,\n TransactionArgument,\n TransactionObjectArgument,\n TransactionObjectInput,\n} from \"@mysten/sui/transactions\";\n\nexport interface FieldsWithTypes {\n fields: Record<string, any>;\n type: string;\n}\n\nexport type ObjectId = string;\n\nexport type PureArg = bigint | string | number | boolean | null | TransactionArgument | Array<PureArg>;\nexport type GenericArg =\n | TransactionObjectInput\n | PureArg\n | Array<TransactionObjectInput>\n | Array<PureArg>\n | Array<GenericArg>;\n\nexport function splitGenericParameters(str: string, genericSeparators: [string, string] = [\"<\", \">\"]) {\n const [left, right] = genericSeparators;\n const tok: string[] = [];\n let word = \"\";\n let nestedAngleBrackets = 0;\n\n for (let i = 0; i < str.length; i++) {\n const char = str[i];\n if (char === left) {\n nestedAngleBrackets++;\n }\n if (char === right) {\n nestedAngleBrackets--;\n }\n if (nestedAngleBrackets === 0 && char === \",\") {\n tok.push(word.trim());\n word = \"\";\n continue;\n }\n word += char;\n }\n\n tok.push(word.trim());\n\n return tok;\n}\n\nexport function parseTypeName(name: string): {\n typeName: string;\n typeArgs: string[];\n} {\n if (typeof name !== \"string\") {\n throw new Error(`Illegal type passed as a name of the type: ${name}`);\n }\n\n const [left, right] = [\"<\", \">\"];\n\n const l_bound = name.indexOf(left);\n const r_bound = Array.from(name).reverse().indexOf(right);\n\n // if there are no generics - exit gracefully.\n if (l_bound === -1 && r_bound === -1) {\n return { typeName: name, typeArgs: [] };\n }\n\n // if one of the bounds is not defined - throw an Error.\n if (l_bound === -1 || r_bound === -1) {\n throw new Error(`Unclosed generic in name '${name}'`);\n }\n\n const typeName = name.slice(0, l_bound);\n const typeArgs = splitGenericParameters(name.slice(l_bound + 1, name.length - r_bound - 1), [left, right]);\n\n return { typeName, typeArgs };\n}\n\nexport function isTransactionArgument(arg: GenericArg): arg is TransactionArgument {\n if (!arg || typeof arg !== \"object\" || Array.isArray(arg)) {\n return false;\n }\n\n return \"GasCoin\" in arg || \"Input\" in arg || \"Result\" in arg || \"NestedResult\" in arg;\n}\n\nexport function obj(tx: Transaction, arg: TransactionObjectInput) {\n return isTransactionArgument(arg) ? arg : tx.object(arg);\n}\n\nexport function pure(tx: Transaction, arg: PureArg, type: string): TransactionArgument {\n if (isTransactionArgument(arg)) {\n return obj(tx, arg);\n }\n\n function getBcsForType(type: string): BcsType<any> {\n const { typeName, typeArgs } = parseTypeName(type);\n switch (typeName) {\n case \"bool\":\n return bcs.Bool;\n case \"u8\":\n return bcs.U8;\n case \"u16\":\n return bcs.U16;\n case \"u32\":\n return bcs.U32;\n case \"u64\":\n return bcs.U64;\n case \"u128\":\n return bcs.U128;\n case \"u256\":\n return bcs.U256;\n case \"address\":\n return bcs.Address;\n case \"0x1::string::String\":\n case \"0x1::ascii::String\":\n return bcs.String;\n case \"0x2::object::ID\":\n return bcs.Address;\n case \"0x1::option::Option\":\n return bcs.option(getBcsForType(typeArgs[0]));\n case \"vector\":\n return bcs.vector(getBcsForType(typeArgs[0]));\n default:\n throw new Error(`invalid primitive type ${type}`);\n }\n }\n\n function hasUndefinedOrNull(items: PureArg[]) {\n for (const item of items) {\n if (typeof item === \"undefined\" || item === null) {\n return true;\n }\n\n if (Array.isArray(item)) {\n return hasUndefinedOrNull(item);\n }\n }\n\n return false;\n }\n\n function consistsOnlyOfPrimitiveValues(items: PureArg[]) {\n for (const item of items) {\n if (!Array.isArray(item)) {\n if (item === null) {\n continue;\n }\n switch (typeof item) {\n case \"string\":\n case \"number\":\n case \"bigint\":\n case \"boolean\":\n continue;\n default:\n return false;\n }\n }\n\n return consistsOnlyOfPrimitiveValues(item);\n }\n\n return true;\n }\n\n function hasPrimitiveValues(items: PureArg[]) {\n for (const item of items) {\n if (!Array.isArray(item)) {\n switch (typeof item) {\n case \"string\":\n case \"number\":\n case \"bigint\":\n case \"boolean\":\n return true;\n default:\n continue;\n }\n }\n\n return hasPrimitiveValues(item);\n }\n\n return false;\n }\n\n // handle some cases when TransactionArgument is nested within a vector or option\n const { typeName, typeArgs } = parseTypeName(type);\n switch (typeName) {\n case \"0x1::option::Option\":\n if (arg === null) {\n return tx.pure.option(\"bool\", null); // 'bool' is arbitrary\n }\n if (consistsOnlyOfPrimitiveValues([arg])) {\n return tx.pure(getBcsForType(type).serialize(arg));\n }\n if (hasPrimitiveValues([arg])) {\n throw new Error(\"mixing primitive and TransactionArgument values is not supported\");\n }\n\n // wrap it with some\n return tx.moveCall({\n target: `0x1::option::some`,\n typeArguments: [typeArgs[0]],\n arguments: [pure(tx, arg, typeArgs[0])],\n });\n case \"vector\":\n if (!Array.isArray(arg)) {\n throw new Error(\"expected an array for vector type\");\n }\n if (arg.length === 0) {\n return tx.pure(bcs.vector(bcs.Bool).serialize([])); // bcs.Bool is arbitrary\n }\n if (hasUndefinedOrNull(arg)) {\n throw new Error(\"the provided array contains undefined or null values\");\n }\n if (consistsOnlyOfPrimitiveValues(arg)) {\n return tx.pure(getBcsForType(type).serialize(arg));\n }\n if (hasPrimitiveValues(arg)) {\n throw new Error(\"mixing primitive and TransactionArgument values is not supported\");\n }\n\n return tx.makeMoveVec({\n type: typeArgs[0],\n elements: arg as Array<TransactionObjectArgument>,\n });\n default:\n return tx.pure(getBcsForType(type).serialize(arg));\n }\n}\n\nexport function option(tx: Transaction, type: string, arg: GenericArg | null) {\n if (isTransactionArgument(arg)) {\n return arg;\n }\n\n if (typeArgIsPure(type)) {\n return pure(tx, arg as PureArg | TransactionArgument, `0x1::option::Option<${type}>`);\n }\n\n if (arg === null) {\n return tx.moveCall({\n target: `0x1::option::none`,\n typeArguments: [type],\n arguments: [],\n });\n }\n\n // wrap it with some\n const val = generic(tx, type, arg);\n return tx.moveCall({\n target: `0x1::option::some`,\n typeArguments: [type],\n arguments: [val],\n });\n}\n\nexport function generic(tx: Transaction, type: string, arg: GenericArg) {\n if (typeArgIsPure(type)) {\n return pure(tx, arg as PureArg | TransactionArgument, type);\n } else {\n const { typeName, typeArgs } = parseTypeName(type);\n if (typeName === \"vector\" && Array.isArray(arg)) {\n const itemType = typeArgs[0];\n\n return tx.makeMoveVec({\n type: itemType,\n elements: arg.map((item) => obj(tx, item as TransactionObjectInput)) as Array<TransactionObjectArgument>,\n });\n } else {\n return obj(tx, arg as TransactionObjectInput);\n }\n }\n}\n\nexport function vector(tx: Transaction, itemType: string, items: Array<GenericArg> | TransactionArgument) {\n if (typeof items === \"function\") {\n throw new Error(\"Transaction plugins are not supported\");\n }\n\n if (typeArgIsPure(itemType)) {\n return pure(tx, items as PureArg, `vector<${itemType}>`);\n } else if (isTransactionArgument(items)) {\n return items;\n } else {\n const { typeName: itemTypeName, typeArgs: itemTypeArgs } = parseTypeName(itemType);\n if (itemTypeName === \"0x1::option::Option\") {\n const elements = items.map((item) => option(tx, itemTypeArgs[0], item)) as Array<TransactionObjectArgument>;\n return tx.makeMoveVec({\n type: itemType,\n elements,\n });\n }\n\n return tx.makeMoveVec({\n type: itemType,\n elements: items as Array<TransactionObjectArgument>,\n });\n }\n}\n\nexport function typeArgIsPure(type: string): boolean {\n const { typeName, typeArgs } = parseTypeName(type);\n switch (typeName) {\n case \"bool\":\n case \"u8\":\n case \"u16\":\n case \"u32\":\n case \"u64\":\n case \"u128\":\n case \"u256\":\n case \"address\":\n case \"signer\":\n return true;\n case \"vector\":\n return typeArgIsPure(typeArgs[0]);\n case \"0x1::string::String\":\n case \"0x1::ascii::String\":\n case \"0x2::object::ID\":\n return true;\n case \"0x1::option::Option\":\n return typeArgIsPure(typeArgs[0]);\n default:\n return false;\n }\n}\n\nexport function compressSuiAddress(addr: string): string {\n // remove leading zeros\n const stripped = addr.split(\"0x\").join(\"\");\n for (let i = 0; i < stripped.length; i++) {\n if (stripped[i] !== \"0\") {\n return `0x${stripped.substring(i)}`;\n }\n }\n return \"0x0\";\n}\n\n// Recursively removes leading zeros from a type.\n// e.g. `0x00000002::module::Name<0x00001::a::C>` -> `0x2::module::Name<0x1::a::C>`\nexport function compressSuiType(type: string): string {\n const { typeName, typeArgs } = parseTypeName(type);\n switch (typeName) {\n case \"bool\":\n case \"u8\":\n case \"u16\":\n case \"u32\":\n case \"u64\":\n case \"u128\":\n case \"u256\":\n case \"address\":\n case \"signer\":\n return typeName;\n case \"vector\":\n return `vector<${compressSuiType(typeArgs[0])}>`;\n default: {\n const tok = typeName.split(\"::\");\n tok[0] = compressSuiAddress(tok[0]);\n const compressedName = tok.join(\"::\");\n if (typeArgs.length > 0) {\n return `${compressedName}<${typeArgs.map((typeArg) => compressSuiType(typeArg)).join(\",\")}>`;\n } else {\n return compressedName;\n }\n }\n }\n}\n\nexport function composeSuiType(typeName: string, ...typeArgs: string[]): string {\n if (typeArgs.length > 0) {\n return `${typeName}<${typeArgs.join(\", \")}>`;\n } else {\n return typeName;\n }\n}\n", "// @ts-nocheck\nimport { compressSuiType } from \"../_framework/util\";\n\nclass PackageAddress {\n private static $PACKAGE_ID = \"\";\n private static $PUBLISHED_AT = \"\";\n private static $PKG_V = [];\n\n get PACKAGE_ID() {\n return compressSuiType(PackageAddress.$PACKAGE_ID);\n }\n\n get PUBLISHED_AT() {\n return compressSuiType(PackageAddress.$PUBLISHED_AT);\n }\n\n get PKG_V1() {\n return compressSuiType(PackageAddress.$PKG_V[1]);\n }\n\n setPackageId(address: string): void {\n PackageAddress.$PACKAGE_ID = address;\n }\n\n setPublishedAt(address: string): void {\n PackageAddress.$PUBLISHED_AT = address;\n }\n\n setPkgV(v: number, address: string): void {\n PackageAddress.$PKG_V[v] = address;\n }\n\n setAddress(address: string, pkgV1?: string) {\n PackageAddress.$PACKAGE_ID = address;\n PackageAddress.$PUBLISHED_AT = address;\n PackageAddress.$PKG_V[1] = pkgV1 || address;\n }\n}\n\nconst packageAddress = new PackageAddress();\nexport = packageAddress;\n", "// @ts-nocheck\nimport { compressSuiType } from \"../_framework/util\";\n\nclass PackageAddress {\n private static $PACKAGE_ID = \"\";\n private static $PUBLISHED_AT = \"\";\n private static $PKG_V = [];\n get PACKAGE_ID() {\n return compressSuiType(PackageAddress.$PACKAGE_ID);\n }\n get PUBLISHED_AT() {\n return compressSuiType(PackageAddress.$PUBLISHED_AT);\n }\n get PKG_V1() {\n return compressSuiType(PackageAddress.$PKG_V[1]);\n }\n setPackageId(address: string): void {\n PackageAddress.$PACKAGE_ID = address;\n }\n setPublishedAt(address: string): void {\n PackageAddress.$PUBLISHED_AT = address;\n }\n setPkgV(v: number, address: string): void {\n PackageAddress.$PKG_V[v] = address;\n }\n setAddress(address: string, pkgV1?: string) {\n PackageAddress.$PACKAGE_ID = address;\n PackageAddress.$PUBLISHED_AT = address;\n PackageAddress.$PKG_V[1] = pkgV1 || address;\n }\n}\nconst packageAddress = new PackageAddress();\nexport = packageAddress;\n", "// @ts-nocheck\nimport { compressSuiType } from \"../_framework/util\";\n\nclass PackageAddress {\n private static $PACKAGE_ID = \"\";\n private static $PUBLISHED_AT = \"\";\n private static $PKG_V = [];\n get PACKAGE_ID() {\n return compressSuiType(PackageAddress.$PACKAGE_ID);\n }\n get PUBLISHED_AT() {\n return compressSuiType(PackageAddress.$PUBLISHED_AT);\n }\n get PKG_V1() {\n return compressSuiType(PackageAddress.$PKG_V[1]);\n }\n setPackageId(address: string): void {\n PackageAddress.$PACKAGE_ID = address;\n }\n setPublishedAt(address: string): void {\n PackageAddress.$PUBLISHED_AT = address;\n }\n setPkgV(v: number, address: string): void {\n PackageAddress.$PKG_V[v] = address;\n }\n setAddress(address: string, pkgV1?: string) {\n PackageAddress.$PACKAGE_ID = address;\n PackageAddress.$PUBLISHED_AT = address;\n PackageAddress.$PKG_V[1] = pkgV1 || address;\n }\n}\nconst packageAddress = new PackageAddress();\nexport = packageAddress;\n", "import { AllbridgeCoreSdkOptions, NodeRpcUrls, NodeUrlsConfig } from \"../index\";\n\nexport const mainnet: AllbridgeCoreSdkOptions = {\n coreApiUrl: \"https://core.api.allbridgecoreapi.net\",\n coreApiQueryParams: {},\n coreApiHeaders: {},\n jupiterUrl: \"https://lite-api.jup.ag/swap/v1\",\n wormholeMessengerProgramId: \"worm2ZoG2kUd4vFXhvjh93UUH596ayRfgQ2MgjNMTth\",\n solanaLookUpTable: \"2JcBAEVnAwVo4u8d61iqgHPrzZuugur7cVTjWubsVLHj\",\n sorobanNetworkPassphrase: \"Public Global Stellar Network ; September 2015\",\n tronJsonRpc: \"https://api.trongrid.io/jsonrpc\",\n cctpParams: {\n cctpTransmitterProgramId: \"CCTPmbSD7gX1bxKPAmg77w8oFzNFpaQiQUWD43TKaecd\",\n cctpTokenMessengerMinter: \"CCTPiPYPc6AsJuwueEnWgSgucamXDZwBd53dQ11YiKX3\",\n cctpDomains: { ETH: 0, AVA: 1, OPT: 2, ARB: 3, SOL: 5, BAS: 6, POL: 7, SUI: 8 },\n },\n cachePoolInfoChainSec: 20,\n};\n\n/**\n * This is default rpc urls for Solana and Tron,<p/> Override and use your own for proper and stable work\n * @deprecated use {@link nodeRpcUrlsDefault}\n */\nexport const nodeUrlsDefault: NodeUrlsConfig = {\n solanaRpcUrl: \"https://api.mainnet-beta.solana.com\",\n tronRpcUrl: \"https://api.trongrid.io\",\n};\n\n/**\n * This is default rpc urls for Solana and Tron,<p/> Override and use your own for proper and stable work\n */\nexport const nodeRpcUrlsDefault: NodeRpcUrls = {\n SOL: \"https://api.mainnet-beta.solana.com\",\n TRX: \"https://api.trongrid.io\",\n SRB: \"https://rpc.stellar.org:443\",\n STLR: \"https://horizon.stellar.org\",\n SUI: \"https://fullnode.mainnet.sui.io\",\n};\n", "import { TronWeb } from \"tronweb\";\nimport { Web3 } from \"web3\";\nimport { NodeRpcUrlsConfig } from \"..\";\nimport { Chains } from \"../../chains\";\nimport { Messenger } from \"../../client/core-api/core-api.model\";\nimport { AllbridgeCoreClient } from \"../../client/core-api/core-client-base\";\nimport { CCTPDoesNotSupportedError, OFTDoesNotSupportedError } from \"../../exceptions\";\nimport { AllbridgeCoreSdkOptions, ChainSymbol, ChainType, EssentialWeb3 } from \"../../index\";\nimport { TokenWithChainDetails } from \"../../tokens-info\";\nimport { validateAmountDecimals, validateAmountGtZero } from \"../../utils/utils\";\nimport { Provider, TransactionResponse } from \"../models\";\nimport { TokenService } from \"../token\";\nimport { EvmBridgeService } from \"./evm\";\nimport { ApproveParams, ChainBridgeService, CheckAllowanceParams, GetAllowanceParams, SendParams } from \"./models\";\nimport { DefaultRawBridgeTransactionBuilder, RawBridgeTransactionBuilder } from \"./raw-bridge-transaction-builder\";\nimport { SolanaBridgeService } from \"./sol\";\nimport { SrbBridgeService } from \"./srb\";\nimport { SuiBridgeService } from \"./sui\";\nimport { TronBridgeService } from \"./trx\";\n\nexport interface BridgeService {\n rawTxBuilder: RawBridgeTransactionBuilder;\n\n /**\n * Get amount of tokens approved to be sent by the bridge\n * @param provider - will be used to access the network\n * @param params See {@link GetAllowanceParams}\n * @returns the amount of approved tokens\n */\n getAllowance(provider: Provider, params: GetAllowanceParams): Promise<string>;\n\n /**\n * Get amount of tokens approved to be sent by the bridge\n * @param params See {@link GetAllowanceParams}\n * @returns the amount of approved tokens\n */\n getAllowance(params: GetAllowanceParams): Promise<string>;\n\n /**\n * Check if the amount of approved tokens is enough to make a transfer\n * @param provider - will be used to access the network\n * @param params See {@link CheckAllowanceParams}\n * @returns true if the amount of approved tokens is enough to make a transfer\n */\n checkAllowance(provider: Provider, params: CheckAllowanceParams): Promise<boolean>;\n\n /**\n * Check if the amount of approved tokens is enough to make a transfer\n * @param params See {@link CheckAllowanceParams}\n * @returns true if the amount of approved tokens is enough to make a transfer\n */\n checkAllowance(params: CheckAllowanceParams): Promise<boolean>;\n\n /**\n * @deprecated Use {@link rawTxBuilder}.{@link RawBridgeTransactionBuilder.approve}<p>\n * Approve tokens usage by another address on chains\n * <p>\n * For ETH/USDT: due to specificity of the USDT contract:<br/>\n * If the current allowance is not 0, this function will perform an additional transaction to set allowance to 0 before setting the new allowance value.\n * @param provider - will be used to access the network\n * @param approveData\n */\n approve(provider: Provider, approveData: ApproveParams): Promise<TransactionResponse>;\n\n /**\n * @deprecated Use {@link rawTxBuilder}.{@link RawBridgeTransactionBuilder.send}<p>\n * Send tokens through the ChainBridgeService\n * @param provider - will be used to access the network\n * @param params\n */\n send(provider: Provider, params: SendParams): Promise<TransactionResponse>;\n}\n\nexport class DefaultBridgeService implements BridgeService {\n public rawTxBuilder: RawBridgeTransactionBuilder;\n\n constructor(\n private api: AllbridgeCoreClient,\n private nodeRpcUrlsConfig: NodeRpcUrlsConfig,\n private params: AllbridgeCoreSdkOptions,\n private tokenService: TokenService\n ) {\n this.rawTxBuilder = new DefaultRawBridgeTransactionBuilder(api, nodeRpcUrlsConfig, params, tokenService);\n }\n\n async getAllowance(a: Provider | GetAllowanceParams, b?: GetAllowanceParams): Promise<string> {\n let provider: Provider | undefined;\n let params: GetAllowanceParams;\n if (b) {\n provider = a as Provider;\n params = b;\n } else {\n params = a as GetAllowanceParams;\n }\n const spender = getSpender(params.token, params.messenger);\n return await this.tokenService.getAllowance({ ...params, spender }, provider);\n }\n\n async checkAllowance(a: Provider | CheckAllowanceParams, b?: CheckAllowanceParams): Promise<boolean> {\n let provider: Provider | undefined;\n let params: CheckAllowanceParams;\n if (b) {\n provider = a as Provider;\n params = b;\n } else {\n params = a as CheckAllowanceParams;\n }\n const spender = getSpender(params.token, params.messenger);\n return this.tokenService.checkAllowance({ ...params, spender }, provider);\n }\n\n async approve(provider: Provider, approveData: ApproveParams): Promise<TransactionResponse> {\n const spender = getSpender(approveData.token, approveData.messenger);\n return this.tokenService.approve(provider, { ...approveData, spender });\n }\n\n async send(provider: Provider, params: SendParams): Promise<TransactionResponse> {\n validateAmountGtZero(params.amount);\n validateAmountDecimals(\"amount\", params.amount, params.sourceToken.decimals);\n return getChainBridgeService(\n params.sourceToken.chainSymbol,\n this.api,\n this.nodeRpcUrlsConfig,\n this.params,\n provider\n ).send(params);\n }\n}\n\nexport function getSpender(token: TokenWithChainDetails, messenger: Messenger = Messenger.ALLBRIDGE): string {\n switch (messenger) {\n case Messenger.CCTP:\n if (token.cctpAddress) {\n return token.cctpAddress;\n } else {\n throw new CCTPDoesNotSupportedError(\"Such route does not support CCTP protocol\");\n }\n case Messenger.CCTP_V2:\n if (token.cctpV2Address) {\n return token.cctpV2Address;\n } else {\n throw new CCTPDoesNotSupportedError(\"Such route does not support CCTP V2 protocol\");\n }\n case Messenger.OFT:\n if (token.oftBridgeAddress) {\n return token.oftBridgeAddress;\n } else {\n throw new OFTDoesNotSupportedError(\"Such route does not support OFT protocol\");\n }\n case Messenger.ALLBRIDGE:\n case Messenger.WORMHOLE:\n return token.bridgeAddress;\n }\n}\n\nexport function getChainBridgeService(\n chainSymbol: string,\n api: AllbridgeCoreClient,\n nodeRpcUrlsConfig: NodeRpcUrlsConfig,\n params: AllbridgeCoreSdkOptions,\n provider?: Provider\n): ChainBridgeService {\n switch (Chains.getChainProperty(chainSymbol).chainType) {\n case ChainType.EVM: {\n if (provider) {\n return new EvmBridgeService(provider as EssentialWeb3, api, nodeRpcUrlsConfig);\n } else {\n const nodeRpcUrl = nodeRpcUrlsConfig.getNodeRpcUrl(chainSymbol);\n return new EvmBridgeService(new Web3(nodeRpcUrl), api, nodeRpcUrlsConfig);\n }\n }\n case ChainType.TRX: {\n if (provider) {\n return new TronBridgeService(provider as TronWeb, api);\n } else {\n const nodeRpcUrl = nodeRpcUrlsConfig.getNodeRpcUrl(chainSymbol);\n return new TronBridgeService(\n new TronWeb({\n fullHost: nodeRpcUrl,\n solidityNode: nodeRpcUrl,\n eventServer: nodeRpcUrl,\n }),\n api\n );\n }\n }\n case ChainType.SOLANA: {\n return new SolanaBridgeService(\n nodeRpcUrlsConfig.getNodeRpcUrl(ChainSymbol.SOL),\n {\n wormholeMessengerProgramId: params.wormholeMessengerProgramId,\n solanaLookUpTable: params.solanaLookUpTable,\n cctpParams: params.cctpParams,\n jupiterParams: {\n jupiterUrl: params.jupiterUrl,\n jupiterApiKeyHeader: params.jupiterApiKeyHeader,\n jupiterMaxAccounts: params.jupiterMaxAccounts,\n },\n },\n api\n );\n }\n case ChainType.SRB: {\n return new SrbBridgeService(nodeRpcUrlsConfig, params, api);\n }\n case ChainType.SUI: {\n return new SuiBridgeService(nodeRpcUrlsConfig, api);\n }\n }\n}\n", "export abstract class SdkRootError extends Error {\n public errorCode: ErrorCode;\n\n protected constructor(code: ErrorCode, message?: string) {\n super(message);\n this.errorCode = code;\n }\n}\n\nexport class SdkError extends SdkRootError {\n constructor(message?: string) {\n super(ErrorCode.SDK_ERROR, message);\n }\n}\n\nexport class InvalidAmountError extends SdkRootError {\n constructor(message?: string) {\n super(ErrorCode.INVALID_AMOUNT_ERROR, message);\n }\n}\n\nexport class AmountNotEnoughError extends SdkRootError {\n constructor(message?: string) {\n super(ErrorCode.AMOUNT_NOT_ENOUGH_ERROR, message);\n }\n}\n\nexport class InsufficientPoolLiquidityError extends SdkRootError {\n constructor(message?: string) {\n super(ErrorCode.INSUFFICIENT_POOL_LIQUIDITY_ERROR, message);\n }\n}\n\nexport class JupiterError extends SdkRootError {\n constructor(message?: string) {\n super(ErrorCode.JUPITER_ERROR, message);\n }\n}\n\nexport class InvalidGasFeePaymentOptionError extends SdkRootError {\n constructor(message?: string) {\n super(ErrorCode.INVALID_GAS_FEE_PAYMENT_OPTION_ERROR, message);\n }\n}\n\nexport class InvalidMessengerOptionError extends SdkRootError {\n constructor(message?: string) {\n super(ErrorCode.INVALID_MESSENGER_OPTION_ERROR, message);\n }\n}\n\nexport class MethodNotSupportedError extends SdkRootError {\n constructor(message?: string) {\n super(ErrorCode.METHOD_NOT_SUPPORTED_ERROR, message);\n }\n}\n\nexport class VerifyTxError extends SdkRootError {\n constructor(message?: string) {\n super(ErrorCode.VERIFY_TX_ERROR, message);\n }\n}\n\nexport class InvalidTxError extends SdkRootError {\n constructor(message?: string) {\n super(ErrorCode.INVALID_TX_ERROR, message);\n }\n}\n\nexport class ExtraGasMaxLimitExceededError extends SdkRootError {\n constructor(message?: string) {\n super(ErrorCode.EXTRA_GAS_MAX_LIMIT_EXCEEDED_ERROR, message);\n }\n}\n\nexport class ArgumentInvalidDecimalsError extends SdkRootError {\n constructor(argName: string, decimalsIs: number, decimalsRequired: number) {\n super(\n ErrorCode.ARGUMENT_INVALID_DECIMALS_ERROR,\n `Argument '${argName}' decimals '${decimalsIs}' cannot be greater than '${decimalsRequired}'`\n );\n }\n}\n\nexport class TimeoutError extends SdkRootError {\n constructor(message?: string) {\n super(ErrorCode.TIMEOUT_ERROR, message);\n }\n}\n\nexport class NodeRpcUrlNotInitializedError extends SdkRootError {\n constructor(chainSymbol: string) {\n super(ErrorCode.NODE_RPC_URL_NOT_INITIALIZED_ERROR, `For chain '${chainSymbol}' Node RPC URL not initialized`);\n }\n}\n\nexport class CCTPDoesNotSupportedError extends SdkRootError {\n constructor(message?: string) {\n super(ErrorCode.CCTP_DOES_NOT_SUPPORTED_ERROR, message);\n }\n}\n\nexport class OFTDoesNotSupportedError extends SdkRootError {\n constructor(message?: string) {\n super(ErrorCode.OFT_DOES_NOT_SUPPORTED_ERROR, message);\n }\n}\n\nexport class YieldDoesNotSupportedError extends SdkRootError {\n constructor(message?: string) {\n super(ErrorCode.YIELD_DOES_NOT_SUPPORTED_ERROR, message);\n }\n}\n\nexport class TxTooLargeError extends SdkRootError {\n constructor() {\n super(\n ErrorCode.TX_TOO_LARGE,\n \"Transaction too large: try again later or switch to another messenger or pay relayer fee in native gas currency\"\n );\n }\n}\n\nexport enum ErrorCode {\n SDK_ERROR = \"SdkError\",\n INVALID_AMOUNT_ERROR = \"InvalidAmountError\",\n AMOUNT_NOT_ENOUGH_ERROR = \"AmountNotEnoughError\",\n INSUFFICIENT_POOL_LIQUIDITY_ERROR = \"InsufficientPoolLiquidityError\",\n JUPITER_ERROR = \"JupiterError\",\n INVALID_GAS_FEE_PAYMENT_OPTION_ERROR = \"InvalidGasFeePaymentOptionError\",\n INVALID_MESSENGER_OPTION_ERROR = \"InvalidMessengerOptionError\",\n METHOD_NOT_SUPPORTED_ERROR = \"MethodNotSupportedError\",\n VERIFY_TX_ERROR = \"VerifyTxError\",\n INVALID_TX_ERROR = \"InvalidTxError\",\n EXTRA_GAS_MAX_LIMIT_EXCEEDED_ERROR = \"ExtraGasMaxLimitExceededError\",\n ARGUMENT_INVALID_DECIMALS_ERROR = \"ArgumentInvalidDecimalsError\",\n TIMEOUT_ERROR = \"TimeoutError\",\n NODE_RPC_URL_NOT_INITIALIZED_ERROR = \"NodeRpcUrlNotInitializedError\",\n CCTP_DOES_NOT_SUPPORTED_ERROR = \"CCTPDoesNotSupportedError\",\n OFT_DOES_NOT_SUPPORTED_ERROR = \"OFTDoesNotSupportedError\",\n YIELD_DOES_NOT_SUPPORTED_ERROR = \"YieldDoesNotSupportedError\",\n TX_TOO_LARGE = \"TxTooLargeError\",\n}\n", "export enum ChainSymbol {\n /**\n * The BNB Smart Chain main network.\n */\n BSC = \"BSC\",\n\n /**\n * The Ethereum main network.\n */\n ETH = \"ETH\",\n\n /**\n * The Base main network.\n */\n BAS = \"BAS\",\n\n /**\n * The Solana network.\n */\n SOL = \"SOL\",\n\n /**\n * The TRON network.\n */\n TRX = \"TRX\",\n\n /**\n * The Polygon network.\n */\n POL = \"POL\",\n\n /**\n * The Arbitrum network.\n */\n ARB = \"ARB\",\n\n /**\n * The Celo network.\n */\n CEL = \"CEL\",\n\n /**\n * The Avalanche main network.\n */\n AVA = \"AVA\",\n\n /**\n * The Soroban network.\n */\n SRB = \"SRB\",\n\n /**\n * The Stellar network.\n */\n STLR = \"STLR\",\n\n /**\n * The OP Mainnet network.\n */\n OPT = \"OPT\",\n\n /**\n * The SUI network.\n */\n SUI = \"SUI\",\n\n /**\n * The Sonic network.\n */\n SNC = \"SNC\",\n\n /**\n * The Unichain network.\n */\n UNI = \"UNI\",\n\n /**\n * The Linea network.\n */\n LIN = \"LIN\",\n}\n\nexport enum ChainType {\n EVM = \"EVM\",\n SOLANA = \"SOLANA\",\n TRX = \"TRX\",\n SRB = \"SRB\",\n SUI = \"SUI\",\n}\n", "import { SdkError } from \"../exceptions\";\nimport { ChainSymbol, ChainType } from \"./chain.enums\";\nimport { BasicChainProperties } from \"./models\";\n\n/**\n * Native gas tokens decimals by ChainType\n */\nconst chainDecimalsByType: Record<ChainType, number> = {\n EVM: 18,\n SOLANA: 9,\n TRX: 6,\n SRB: 7,\n SUI: 9,\n};\n\nconst defaultProperties: Record<string, BasicChainProperties> = {\n [ChainSymbol.BSC]: {\n chainSymbol: ChainSymbol.BSC,\n chainId: \"0x38\",\n name: \"BNB Chain\",\n chainType: ChainType.EVM,\n },\n [ChainSymbol.ETH]: {\n chainSymbol: ChainSymbol.ETH,\n chainId: \"0x1\",\n name: \"Ethereum\",\n chainType: ChainType.EVM,\n },\n [ChainSymbol.BAS]: {\n chainSymbol: ChainSymbol.BAS,\n chainId: \"0x2105\",\n name: \"Base\",\n chainType: ChainType.EVM,\n },\n [ChainSymbol.ARB]: {\n chainSymbol: ChainSymbol.ARB,\n chainId: \"0xa4b1\",\n name: \"Arbitrum\",\n chainType: ChainType.EVM,\n },\n [ChainSymbol.AVA]: {\n chainSymbol: ChainSymbol.AVA,\n chainId: \"0xa86a\",\n name: \"Avalanche\",\n chainType: ChainType.EVM,\n },\n [ChainSymbol.CEL]: {\n chainSymbol: ChainSymbol.CEL,\n chainId: \"0xa4ec\",\n name: \"Celo\",\n chainType: ChainType.EVM,\n },\n [ChainSymbol.POL]: {\n chainSymbol: ChainSymbol.POL,\n chainId: \"0x89\",\n name: \"Polygon\",\n chainType: ChainType.EVM,\n },\n [ChainSymbol.OPT]: {\n chainSymbol: ChainSymbol.OPT,\n chainId: \"0xa\",\n name: \"OP Mainnet\",\n chainType: ChainType.EVM,\n },\n [ChainSymbol.SNC]: {\n chainSymbol: ChainSymbol.SNC,\n chainId: \"0x92\",\n name: \"Sonic\",\n chainType: ChainType.EVM,\n },\n [ChainSymbol.UNI]: {\n chainSymbol: ChainSymbol.UNI,\n chainId: \"0x82\",\n name: \"Unichain\",\n chainType: ChainType.EVM,\n },\n [ChainSymbol.LIN]: {\n chainSymbol: ChainSymbol.LIN,\n chainId: \"0xe708\",\n name: \"Linea\",\n chainType: ChainType.EVM,\n },\n [ChainSymbol.SOL]: {\n chainSymbol: ChainSymbol.SOL,\n name: \"Solana\",\n chainType: ChainType.SOLANA,\n },\n [ChainSymbol.TRX]: {\n chainSymbol: ChainSymbol.TRX,\n name: \"Tron\",\n chainType: ChainType.TRX,\n },\n [ChainSymbol.SRB]: {\n chainSymbol: ChainSymbol.SRB,\n name: \"Stellar\",\n chainType: ChainType.SRB,\n },\n [ChainSymbol.STLR]: {\n chainSymbol: ChainSymbol.STLR,\n name: \"Stellar\",\n chainType: ChainType.SRB,\n },\n [ChainSymbol.SUI]: {\n chainSymbol: ChainSymbol.SUI,\n name: \"Sui\",\n chainType: ChainType.SUI,\n },\n};\n\nexport const Chains = (() => {\n let chainProperties: Record<string, BasicChainProperties> = { ...defaultProperties };\n\n return {\n addChainsProperties(additionalProperties?: Record<string, BasicChainProperties>) {\n chainProperties = { ...chainProperties, ...additionalProperties };\n },\n\n getChainProperty(chainSymbol: string): BasicChainProperties {\n const property = chainProperties[chainSymbol];\n if (!property) {\n throw new SdkError(`Cannot find chain properties for ${chainSymbol}`);\n }\n return property;\n },\n\n getChainsProperties(): Record<string, BasicChainProperties> {\n return chainProperties;\n },\n\n getChainDecimalsByType(chainType: ChainType): number {\n return chainDecimalsByType[chainType];\n },\n };\n})();\n", "import { ChainSymbol } from \"../../chains/chain.enums\";\nimport { PoolInfo, SuiAddresses } from \"../../tokens-info\";\n\nexport type ChainDetailsResponse = Record<string, ChainDetailsDTO>;\n\nexport interface ChainDetailsDTO {\n tokens: TokenDTO[];\n chainId: number;\n bridgeAddress: string;\n oftBridgeAddress?: string;\n swapAddress: string;\n yieldAddress?: string;\n transferTime: TransferTimeDTO;\n txCostAmount: TxCostAmountDTO;\n confirmations: number;\n suiAddresses?: SuiAddresses;\n}\n\nexport enum AddressStatus {\n OK = \"OK\",\n INVALID = \"INVALID\",\n FORBIDDEN = \"FORBIDDEN\",\n UNINITIALIZED = \"UNINITIALIZED\",\n CONTRACT_ADDRESS = \"CONTRACT_ADDRESS\",\n WRONG_ASSOCIATED_ACCOUNT_OWNER = \"WRONG_ASSOCIATED_ACCOUNT_OWNER\",\n}\n\nexport interface TokenDTO {\n symbol: string;\n name: string;\n decimals: number;\n poolAddress: string;\n tokenAddress: string;\n poolInfo: PoolInfoDTO;\n oftId?: string;\n feeShare: string;\n apr: string;\n apr7d: string;\n apr30d: string;\n lpRate: string;\n cctpAddress?: string;\n cctpFeeShare?: string;\n yieldId?: number;\n flags: {\n swap: boolean;\n pool: boolean;\n };\n}\n\nexport interface PoolInfoDTO {\n aValue: string;\n dValue: string;\n tokenBalance: string;\n vUsdBalance: string;\n totalLpAmount: string;\n accRewardPerShareP: string;\n p: number;\n}\n\nexport enum MessengerKeyDTO {\n ALLBRIDGE = \"allbridge\",\n WORMHOLE = \"wormhole\",\n CCTP = \"cctp\",\n CCTP_V2 = \"cctpV2\",\n OFT = \"oft\",\n}\n\nexport type TransferTimeDTO = Record<string, MessengerTransferTimeDTO>;\n\nexport interface TxCostAmountDTO {\n maxAmount: string;\n swap: string;\n transfer: string;\n}\n\nexport type MessengerTransferTimeDTO = {\n [messenger in MessengerKeyDTO]: number | null;\n};\n\nexport enum Messenger {\n ALLBRIDGE = 1,\n WORMHOLE = 2,\n CCTP = 3,\n CCTP_V2 = 4,\n OFT = 5,\n}\n\nexport interface ReceiveTransactionCostRequest {\n sourceChainId: number;\n destinationChainId: number;\n messenger: Messenger;\n sourceToken?: string;\n}\n\nexport interface ReceiveTransactionCostResponse {\n exchangeRate: string;\n fee: string;\n sourceNativeTokenPrice: string;\n adminFeeShareWithExtras?: string;\n}\n\nexport interface GasBalanceResponse {\n gasBalance: string | null;\n status: AddressStatus;\n}\n\nexport interface CheckAddressResponse {\n gasBalance: string | null;\n status: AddressStatus;\n}\n\nexport interface TransferStatusResponse {\n txId: string;\n\n sourceChainSymbol: ChainSymbol;\n destinationChainSymbol: ChainSymbol;\n\n sendAmount: string;\n sendAmountFormatted: number;\n\n stableFee: string;\n stableFeeFormatted: number;\n\n sourceTokenAddress: string;\n destinationTokenAddress: string;\n\n originSourceTokenAddress?: string;\n originDestinationTokenAddress?: string;\n\n senderAddress: string;\n recipientAddress: string;\n\n signaturesCount: number;\n signaturesNeeded: number;\n\n send: BridgeTransaction;\n receive?: BridgeTransaction;\n\n responseTime?: number;\n}\n\nexport interface BridgeTransaction {\n txId: string;\n\n sourceChainId: number;\n destinationChainId: number;\n\n fee: string;\n feeFormatted: number;\n\n stableFee: string;\n stableFeeFormatted: number;\n\n amount: string;\n amountFormatted: number;\n virtualAmount: string;\n\n bridgeContract: string;\n sender: string;\n recipient: string;\n\n sourceTokenAddress: string;\n destinationTokenAddress: string;\n\n originSourceTokenAddress?: string;\n originDestinationTokenAddress?: string;\n\n hash: string;\n\n messenger: Messenger;\n\n blockTime: number;\n blockId: string;\n\n confirmations: number;\n confirmationsNeeded: number;\n\n isClaimable?: boolean;\n}\n\nexport type PoolInfoResponse = Record<ChainSymbol, PoolInfo>;\nexport type PendingInfoResponse = Partial<Record<ChainSymbol, TokenPendingInfoDTO>>;\nexport type TokenPendingInfoDTO = Record<string, PendingInfoDTO>;\n\nexport interface PendingInfoDTO {\n pendingTxs: number;\n totalSentAmount: string;\n}\n", "import { Big, BigSource } from \"big.js\";\nimport { AllbridgeCoreClientPoolsExt } from \"../client/core-api/core-client-pool-info-caching\";\nimport { ArgumentInvalidDecimalsError, InvalidAmountError, TimeoutError } from \"../exceptions\";\nimport { PoolInfo, TokenWithChainDetails } from \"../tokens-info\";\n\nexport async function getPoolInfoByToken(\n api: AllbridgeCoreClientPoolsExt,\n sourceChainToken: TokenWithChainDetails\n): Promise<PoolInfo> {\n return await api.getPoolInfoByKey({\n chainSymbol: sourceChainToken.chainSymbol,\n poolAddress: sourceChainToken.poolAddress,\n });\n}\n\nexport function validateAmountGtZero(amount: BigSource) {\n if (Big(amount).lte(0)) {\n throw new InvalidAmountError(\"Amount must be greater than zero\");\n }\n}\n\nexport function validateAmountDecimals(argName: string, amountFloat: number | string | Big, decimalRequired: number) {\n const amount = Big(amountFloat).toFixed();\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [integerPart, fractionalPart] = amount.split(\".\");\n\n if (fractionalPart && fractionalPart.length > decimalRequired) {\n throw new ArgumentInvalidDecimalsError(argName, fractionalPart.length, decimalRequired);\n }\n}\n\nexport async function promiseWithTimeout<T>(promise: Promise<T>, msg: string, timeoutMs: number): Promise<T> {\n return (await Promise.race([\n promise,\n new Promise((resolve, reject) => {\n setTimeout(() => reject(new TimeoutError(msg)), timeoutMs);\n }),\n ])) as any as T;\n}\n\nexport async function promiseWithTimeoutAndRetries<T>(\n toTry: () => Promise<T>,\n msg: string,\n maxRetries: number,\n timeoutMs: number\n): Promise<T> {\n if (maxRetries < 1)\n throw new Error(`Bad argument: 'maxRetries' must be greater than 0, but ${maxRetries} was received.`);\n let attemptCount = 0;\n while (true) {\n try {\n return await promiseWithTimeout(toTry(), msg, timeoutMs);\n } catch (ignoreError) {\n if (++attemptCount >= maxRetries) throw new TimeoutError(msg);\n }\n }\n}\n\n/**\n * Keep calling a `fn` for `secondsToWait` seconds, if `keepWaitingIf` is true.\n * Returns an array of all attempts to call the function.\n */\nexport async function withExponentialBackoff<T>(\n fn: (previousFailure?: T) => Promise<T>,\n keepWaitingIf: (result: T) => boolean,\n secondsToWait: number,\n exponentialFactor = 1.5,\n verbose = false\n): Promise<T[]> {\n const attempts: T[] = [];\n\n let count = 0;\n const initialAttempt = await fn();\n attempts.push(initialAttempt);\n if (!keepWaitingIf(initialAttempt)) return attempts;\n\n const waitUntil = new Date(Date.now() + secondsToWait * 1000).valueOf();\n let waitTime = 1000;\n let totalWaitTime = waitTime;\n\n while (Date.now() < waitUntil) {\n const lastAttempt = attempts[attempts.length - 1];\n if (lastAttempt === undefined || !keepWaitingIf(lastAttempt)) break;\n\n count++;\n // Wait a beat\n if (verbose) {\n console.info(\n `Waiting ${waitTime}ms before trying again (bringing the total wait time to ${totalWaitTime}ms so far, of total ${\n secondsToWait * 1000\n }ms)`\n );\n }\n await new Promise((res) => setTimeout(res, waitTime));\n // Exponential backoff\n waitTime = waitTime * exponentialFactor;\n if (new Date(Date.now() + waitTime).valueOf() > waitUntil) {\n waitTime = waitUntil - Date.now();\n if (verbose) {\n console.info(`was gonna wait too long; new waitTime: ${waitTime}ms`);\n }\n }\n totalWaitTime = waitTime + totalWaitTime;\n // Try again\n const nextAttempt = await fn(lastAttempt);\n attempts.push(nextAttempt);\n if (verbose && keepWaitingIf(nextAttempt)) {\n console.info(\n `${count}. Called ${fn.name}; ${attempts.length} prev attempts. Most recent: ${JSON.stringify(\n attempts[attempts.length - 1],\n null,\n 2\n )}`\n );\n }\n }\n\n return attempts;\n}\n", "import { Big } from \"big.js\";\nimport BN from \"bn.js\";\nimport { Contract, Transaction as Web3Transaction } from \"web3\";\nimport { PayableMethodObject } from \"web3-eth-contract\";\nimport { AllbridgeCoreClient } from \"../../../client/core-api/core-client-base\";\nimport {\n ChainSymbol,\n ChainType,\n EssentialWeb3,\n FeePaymentMethod,\n Messenger,\n SwapParams,\n TransactionResponse,\n} from \"../../../models\";\nimport { NodeRpcUrlsConfig } from \"../../index\";\nimport { RawTransaction } from \"../../models\";\nimport Bridge from \"../../models/abi/Bridge\";\nimport CctpBridge from \"../../models/abi/CctpBridge\";\nimport OftBridge from \"../../models/abi/OftBridge\";\nimport { getCctpSolTokenRecipientAddress } from \"../get-cctp-sol-token-recipient-address\";\nimport { ChainBridgeService, SendParams, TxSendParamsEvm, TxSwapParamsEvm } from \"../models\";\nimport { getNonce, prepareTxSendParams, prepareTxSwapParams } from \"../utils\";\n\nexport class EvmBridgeService extends ChainBridgeService {\n chainType: ChainType.EVM = ChainType.EVM;\n\n constructor(\n public web3: EssentialWeb3,\n public api: AllbridgeCoreClient,\n private nodeRpcUrlsConfig: NodeRpcUrlsConfig\n ) {\n super();\n }\n\n async send(params: SendParams): Promise<TransactionResponse> {\n const rawTransaction = await this.buildRawTransactionSend(params);\n return this.sendRawTransaction(rawTransaction);\n }\n\n async buildRawTransactionSwap(params: SwapParams): Promise<RawTransaction> {\n const txSwapParams = prepareTxSwapParams(this.chainType, params);\n return await this.buildRawTransactionSwapFromParams(txSwapParams);\n }\n\n async buildRawTransactionSwapFromParams(params: TxSwapParamsEvm): Promise<RawTransaction> {\n const {\n amount,\n contractAddress,\n fromAccountAddress,\n fromTokenAddress,\n toAccountAddress,\n toTokenAddress,\n minimumReceiveAmount,\n } = params;\n\n const bridgeContract = this.getBridgeContract(contractAddress);\n\n const swapMethod = bridgeContract.methods.swap(\n amount,\n fromTokenAddress,\n toTokenAddress,\n toAccountAddress,\n minimumReceiveAmount\n );\n\n return Promise.resolve({\n from: fromAccountAddress,\n to: contractAddress,\n data: swapMethod.encodeABI(),\n });\n }\n\n async buildRawTransactionSend(params: SendParams): Promise<RawTransaction> {\n const txSendParams = await prepareTxSendParams(this.chainType, params, this.api);\n const {\n amount,\n contractAddress,\n fromAccountAddress,\n fromTokenAddress,\n toChainId,\n toAccountAddress,\n toTokenAddress,\n messenger,\n fee,\n gasFeePaymentMethod,\n extraGas,\n extraGasDest,\n } = txSendParams;\n\n const nonce = \"0x\" + getNonce().toString(\"hex\");\n let sendMethod: PayableMethodObject;\n let value: string;\n\n let totalFee = fee;\n if (extraGas) {\n totalFee = Big(totalFee).plus(extraGas).toFixed();\n }\n\n switch (messenger) {\n case Messenger.CCTP:\n case Messenger.CCTP_V2: {\n const cctp = await this.buildRawTransactionCctpSend(params, txSendParams, totalFee);\n sendMethod = cctp.sendMethod;\n value = cctp.value;\n break;\n }\n case Messenger.OFT: {\n const oft = this.buildRawTransactionOftSend(params, txSendParams, totalFee, extraGasDest);\n sendMethod = oft.sendMethod;\n value = oft.value;\n break;\n }\n case Messenger.ALLBRIDGE:\n case Messenger.WORMHOLE:\n {\n const bridgeContract = this.getBridgeContract(contractAddress);\n if (gasFeePaymentMethod === FeePaymentMethod.WITH_STABLECOIN) {\n sendMethod = bridgeContract.methods.swapAndBridge(\n fromTokenAddress,\n amount,\n toAccountAddress,\n toChainId,\n toTokenAddress,\n nonce,\n messenger,\n totalFee\n );\n value = \"0\";\n } else {\n sendMethod = bridgeContract.methods.swapAndBridge(\n fromTokenAddress,\n amount,\n toAccountAddress,\n toChainId,\n toTokenAddress,\n nonce,\n messenger,\n 0\n );\n value = totalFee;\n }\n }\n break;\n }\n\n return Promise.resolve({\n from: fromAccountAddress,\n to: contractAddress,\n value: value,\n data: sendMethod.encodeABI(),\n });\n }\n\n private async buildRawTransactionCctpSend(\n params: SendParams,\n txSendParams: TxSendParamsEvm,\n totalFee: string\n ): Promise<{\n sendMethod: PayableMethodObject;\n value: string;\n }> {\n const { amount, contractAddress, toChainId, toAccountAddress, gasFeePaymentMethod } = txSendParams;\n\n const cctpBridgeContract = this.getCctpBridgeContract(contractAddress);\n let sendMethod: PayableMethodObject;\n let value: string;\n\n if (params.destinationToken.chainType === ChainType.SOLANA) {\n const recipient = await getCctpSolTokenRecipientAddress(\n this.chainType,\n params.toAccountAddress,\n params.destinationToken.tokenAddress,\n this.nodeRpcUrlsConfig.getNodeRpcUrl(ChainSymbol.SOL)\n );\n\n if (gasFeePaymentMethod === FeePaymentMethod.WITH_STABLECOIN) {\n sendMethod = cctpBridgeContract.methods.bridgeWithWalletAddress(\n amount,\n recipient,\n toAccountAddress,\n toChainId,\n totalFee\n );\n value = \"0\";\n } else {\n sendMethod = cctpBridgeContract.methods.bridgeWithWalletAddress(\n amount,\n recipient,\n toAccountAddress,\n toChainId,\n 0\n );\n value = totalFee;\n }\n } else {\n if (gasFeePaymentMethod === FeePaymentMethod.WITH_STABLECOIN) {\n sendMethod = cctpBridgeContract.methods.bridge(amount, toAccountAddress, toChainId, totalFee);\n value = \"0\";\n } else {\n sendMethod = cctpBridgeContract.methods.bridge(amount, toAccountAddress, toChainId, 0);\n value = totalFee;\n }\n }\n return { sendMethod, value };\n }\n\n private buildRawTransactionOftSend(\n params: SendParams,\n txSendParams: TxSendParamsEvm,\n totalFee: string,\n extraGasDest?: string\n ): {\n sendMethod: PayableMethodObject;\n value: string;\n } {\n const { amount, contractAddress, toChainId, toAccountAddress, gasFeePaymentMethod } = txSendParams;\n\n const oftBridgeContract = this.getOftBridgeContract(contractAddress);\n let sendMethod: PayableMethodObject;\n let value: string;\n\n if (gasFeePaymentMethod === FeePaymentMethod.WITH_STABLECOIN) {\n sendMethod = oftBridgeContract.methods.bridge(\n params.sourceToken.tokenAddress,\n amount,\n toAccountAddress,\n toChainId,\n totalFee,\n extraGasDest ?? \"0\",\n \"10\"\n );\n value = \"0\";\n } else {\n sendMethod = oftBridgeContract.methods.bridge(\n params.sourceToken.tokenAddress,\n amount,\n toAccountAddress,\n toChainId,\n 0,\n extraGasDest ?? \"0\",\n \"10\"\n );\n value = totalFee;\n }\n\n return { sendMethod, value };\n }\n\n private async sendRawTransaction(rawTransaction: RawTransaction) {\n const estimateGas = await this.web3.eth.estimateGas(rawTransaction as Web3Transaction);\n\n // @ts-expect-error DISABLE SITE SUGGESTED GAS FEE IN METAMASK\n // prettier-ignore\n const feeOptions: { maxPriorityFeePerGas?: number | string | BN; maxFeePerGas?: number | string | BN } = { maxPriorityFeePerGas: null, maxFeePerGas: null };\n const { transactionHash } = await this.web3.eth.sendTransaction({\n ...(rawTransaction as object),\n gas: estimateGas,\n ...feeOptions,\n } as Web3Transaction);\n return { txId: transactionHash.toString() };\n }\n\n private getBridgeContract(contractAddress: string) {\n return new this.web3.eth.Contract(Bridge.abi, contractAddress) as Contract<typeof Bridge.abi>;\n }\n\n private getCctpBridgeContract(contractAddress: string) {\n return new this.web3.eth.Contract(CctpBridge.abi, contractAddress) as Contract<typeof CctpBridge.abi>;\n }\n\n private getOftBridgeContract(contractAddress: string) {\n return new this.web3.eth.Contract(OftBridge.abi, contractAddress) as Contract<typeof OftBridge.abi>;\n }\n}\n", "const artifact = {\n abi: [\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"_chainId\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"_chainPrecision\",\n type: \"uint256\",\n },\n {\n internalType: \"contract Messenger\",\n name: \"_allbridgeMessenger\",\n type: \"address\",\n },\n {\n internalType: \"contract WormholeMessenger\",\n name: \"_wormholeMessenger\",\n type: \"address\",\n },\n {\n internalType: \"contract IGasOracle\",\n name: \"_gasOracle\",\n type: \"address\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"constructor\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"gas\",\n type: \"uint256\",\n },\n ],\n name: \"BridgingFeeFromTokens\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"previousOwner\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"newOwner\",\n type: \"address\",\n },\n ],\n name: \"OwnershipTransferred\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"bridgeTransactionCost\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"messageTransactionCost\",\n type: \"uint256\",\n },\n ],\n name: \"ReceiveFee\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"address\",\n name: \"sender\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n ],\n name: \"Received\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"address\",\n name: \"sender\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"address\",\n name: \"recipient\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"bytes32\",\n name: \"sendToken\",\n type: \"bytes32\",\n },\n {\n indexed: false,\n internalType: \"bytes32\",\n name: \"receiveToken\",\n type: \"bytes32\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"sendAmount\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"receiveAmount\",\n type: \"uint256\",\n },\n ],\n name: \"Swapped\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"bytes32\",\n name: \"recipient\",\n type: \"bytes32\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"nonce\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"enum MessengerProtocol\",\n name: \"messenger\",\n type: \"uint8\",\n },\n {\n indexed: false,\n internalType: \"bytes32\",\n name: \"message\",\n type: \"bytes32\",\n },\n ],\n name: \"TokensReceived\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"bytes32\",\n name: \"recipient\",\n type: \"bytes32\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"destinationChainId\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"bytes32\",\n name: \"receiveToken\",\n type: \"bytes32\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"nonce\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"enum MessengerProtocol\",\n name: \"messenger\",\n type: \"uint8\",\n },\n ],\n name: \"TokensSent\",\n type: \"event\",\n },\n {\n stateMutability: \"payable\",\n type: \"fallback\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"_chainId\",\n type: \"uint256\",\n },\n {\n internalType: \"bytes32\",\n name: \"tokenAddress\",\n type: \"bytes32\",\n },\n ],\n name: \"addBridgeToken\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"contract Pool\",\n name: \"pool\",\n type: \"address\",\n },\n {\n internalType: \"bytes32\",\n name: \"token\",\n type: \"bytes32\",\n },\n ],\n name: \"addPool\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"canSwap\",\n outputs: [\n {\n internalType: \"uint8\",\n name: \"\",\n type: \"uint8\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"chainId\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"chainId\",\n type: \"uint256\",\n },\n ],\n name: \"gasUsage\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"destinationChainId\",\n type: \"uint256\",\n },\n {\n internalType: \"enum MessengerProtocol\",\n name: \"messenger\",\n type: \"uint8\",\n },\n {\n internalType: \"address\",\n name: \"tokenAddress\",\n type: \"address\",\n },\n ],\n name: \"getBridgingCostInTokens\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"chainId\",\n type: \"uint256\",\n },\n {\n internalType: \"enum MessengerProtocol\",\n name: \"protocol\",\n type: \"uint8\",\n },\n ],\n name: \"getMessageCost\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"chainId\",\n type: \"uint256\",\n },\n {\n internalType: \"enum MessengerProtocol\",\n name: \"protocol\",\n type: \"uint8\",\n },\n ],\n name: \"getMessageGasUsage\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"chainId\",\n type: \"uint256\",\n },\n ],\n name: \"getTransactionCost\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"bytes32\",\n name: \"message\",\n type: \"bytes32\",\n },\n {\n internalType: \"enum MessengerProtocol\",\n name: \"protocol\",\n type: \"uint8\",\n },\n ],\n name: \"hasReceivedMessage\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"bytes32\",\n name: \"message\",\n type: \"bytes32\",\n },\n ],\n name: \"hasSentMessage\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n {\n internalType: \"bytes32\",\n name: \"recipient\",\n type: \"bytes32\",\n },\n {\n internalType: \"uint256\",\n name: \"sourceChainId\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"destinationChainId\",\n type: \"uint256\",\n },\n {\n internalType: \"bytes32\",\n name: \"receiveToken\",\n type: \"bytes32\",\n },\n {\n internalType: \"uint256\",\n name: \"nonce\",\n type: \"uint256\",\n },\n {\n internalType: \"enum MessengerProtocol\",\n name: \"messenger\",\n type: \"uint8\",\n },\n ],\n name: \"hashMessage\",\n outputs: [\n {\n internalType: \"bytes32\",\n name: \"\",\n type: \"bytes32\",\n },\n ],\n stateMutability: \"pure\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"chainId\",\n type: \"uint256\",\n },\n {\n internalType: \"bytes32\",\n name: \"tokenAddress\",\n type: \"bytes32\",\n },\n ],\n name: \"otherBridgeTokens\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"isSupported\",\n type: \"bool\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"chainId\",\n type: \"uint256\",\n },\n ],\n name: \"otherBridges\",\n outputs: [\n {\n internalType: \"bytes32\",\n name: \"bridgeAddress\",\n type: \"bytes32\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"owner\",\n outputs: [\n {\n internalType: \"address\",\n name: \"\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"bytes32\",\n name: \"tokenId\",\n type: \"bytes32\",\n },\n ],\n name: \"pools\",\n outputs: [\n {\n internalType: \"contract Pool\",\n name: \"\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"bytes32\",\n name: \"messageHash\",\n type: \"bytes32\",\n },\n ],\n name: \"processedMessages\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"isProcessed\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n {\n internalType: \"bytes32\",\n name: \"recipient\",\n type: \"bytes32\",\n },\n {\n internalType: \"uint256\",\n name: \"sourceChainId\",\n type: \"uint256\",\n },\n {\n internalType: \"bytes32\",\n name: \"receiveToken\",\n type: \"bytes32\",\n },\n {\n internalType: \"uint256\",\n name: \"nonce\",\n type: \"uint256\",\n },\n {\n internalType: \"enum MessengerProtocol\",\n name: \"messenger\",\n type: \"uint8\",\n },\n {\n internalType: \"uint256\",\n name: \"receiveAmountMin\",\n type: \"uint256\",\n },\n ],\n name: \"receiveTokens\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"_chainId\",\n type: \"uint256\",\n },\n {\n internalType: \"bytes32\",\n name: \"bridgeAddress\",\n type: \"bytes32\",\n },\n ],\n name: \"registerBridge\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"_chainId\",\n type: \"uint256\",\n },\n {\n internalType: \"bytes32\",\n name: \"tokenAddress\",\n type: \"bytes32\",\n },\n ],\n name: \"removeBridgeToken\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"renounceOwnership\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"bytes32\",\n name: \"messageHash\",\n type: \"bytes32\",\n },\n ],\n name: \"sentMessages\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"isSent\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"contract Messenger\",\n name: \"_allbridgeMessenger\",\n type: \"address\",\n },\n ],\n name: \"setAllbridgeMessenger\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"contract IGasOracle\",\n name: \"_gasOracle\",\n type: \"address\",\n },\n ],\n name: \"setGasOracle\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"chainId\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"gasAmount\",\n type: \"uint256\",\n },\n ],\n name: \"setGasUsage\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"_rebalancer\",\n type: \"address\",\n },\n ],\n name: \"setRebalancer\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"_stopAuthority\",\n type: \"address\",\n },\n ],\n name: \"setStopAuthority\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"contract WormholeMessenger\",\n name: \"_wormholeMessenger\",\n type: \"address\",\n },\n ],\n name: \"setWormholeMessenger\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"startSwap\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"stopSwap\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n {\n internalType: \"bytes32\",\n name: \"token\",\n type: \"bytes32\",\n },\n {\n internalType: \"bytes32\",\n name: \"receiveToken\",\n type: \"bytes32\",\n },\n {\n internalType: \"address\",\n name: \"recipient\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"receiveAmountMin\",\n type: \"uint256\",\n },\n ],\n name: \"swap\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"bytes32\",\n name: \"token\",\n type: \"bytes32\",\n },\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n {\n internalType: \"bytes32\",\n name: \"recipient\",\n type: \"bytes32\",\n },\n {\n internalType: \"uint256\",\n name: \"destinationChainId\",\n type: \"uint256\",\n },\n {\n internalType: \"bytes32\",\n name: \"receiveToken\",\n type: \"bytes32\",\n },\n {\n internalType: \"uint256\",\n name: \"nonce\",\n type: \"uint256\",\n },\n {\n internalType: \"enum MessengerProtocol\",\n name: \"messenger\",\n type: \"uint8\",\n },\n {\n internalType: \"uint256\",\n name: \"feeTokenAmount\",\n type: \"uint256\",\n },\n ],\n name: \"swapAndBridge\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"newOwner\",\n type: \"address\",\n },\n ],\n name: \"transferOwnership\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"contract IERC20\",\n name: \"token\",\n type: \"address\",\n },\n ],\n name: \"withdrawBridgingFeeInTokens\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n ],\n name: \"withdrawGasTokens\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n stateMutability: \"payable\",\n type: \"receive\",\n },\n ],\n} as const;\nexport default artifact;\n", "const artifact = {\n abi: [\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"chainId_\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"chainPrecision_\",\n type: \"uint256\",\n },\n {\n internalType: \"address\",\n name: \"tokenAddress\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"cctpMessenger_\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"cctpTransmitter_\",\n type: \"address\",\n },\n {\n internalType: \"contract IGasOracle\",\n name: \"gasOracle_\",\n type: \"address\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"constructor\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"previousOwner\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"newOwner\",\n type: \"address\",\n },\n ],\n name: \"OwnershipTransferred\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"address\",\n name: \"recipient\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n ],\n name: \"ReceivedExtraGas\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"address\",\n name: \"sender\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n ],\n name: \"ReceivedGas\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"address\",\n name: \"sender\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"nonce\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"bytes32\",\n name: \"newRecipient\",\n type: \"bytes32\",\n },\n ],\n name: \"RecipientReplaced\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"bytes32\",\n name: \"recipientWalletAddress\",\n type: \"bytes32\",\n },\n ],\n name: \"TokensSentExtras\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"address\",\n name: \"sender\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"bytes32\",\n name: \"recipient\",\n type: \"bytes32\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"destinationChainId\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"nonce\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"receivedRelayerFeeFromGas\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"receivedRelayerFeeFromTokens\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"relayerFee\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"receivedRelayerFeeTokenAmount\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"adminFeeTokenAmount\",\n type: \"uint256\",\n },\n ],\n name: \"TokensSent\",\n type: \"event\",\n },\n {\n stateMutability: \"payable\",\n type: \"fallback\",\n },\n {\n inputs: [],\n name: \"adminFeeShareBP\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n {\n internalType: \"bytes32\",\n name: \"recipient\",\n type: \"bytes32\",\n },\n {\n internalType: \"uint256\",\n name: \"destinationChainId\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"relayerFeeTokenAmount\",\n type: \"uint256\",\n },\n ],\n name: \"bridge\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n {\n internalType: \"bytes32\",\n name: \"recipient\",\n type: \"bytes32\",\n },\n {\n internalType: \"bytes32\",\n name: \"recipientWalletAddress\",\n type: \"bytes32\",\n },\n {\n internalType: \"uint256\",\n name: \"destinationChainId\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"relayerFeeTokenAmount\",\n type: \"uint256\",\n },\n ],\n name: \"bridgeWithWalletAddress\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"chainId\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"bytes\",\n name: \"originalMessage\",\n type: \"bytes\",\n },\n {\n internalType: \"bytes\",\n name: \"originalAttestation\",\n type: \"bytes\",\n },\n {\n internalType: \"bytes32\",\n name: \"newRecipient\",\n type: \"bytes32\",\n },\n ],\n name: \"changeRecipient\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"chainId\",\n type: \"uint256\",\n },\n ],\n name: \"gasUsage\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"destinationChainId\",\n type: \"uint256\",\n },\n ],\n name: \"getBridgingCostInTokens\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"chainId_\",\n type: \"uint256\",\n },\n ],\n name: \"getDomainByChainId\",\n outputs: [\n {\n internalType: \"uint32\",\n name: \"\",\n type: \"uint32\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"chainId\",\n type: \"uint256\",\n },\n ],\n name: \"getTransactionCost\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"sourceChainId\",\n type: \"uint256\",\n },\n {\n internalType: \"uint64\",\n name: \"nonce\",\n type: \"uint64\",\n },\n ],\n name: \"isMessageProcessed\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"owner\",\n outputs: [\n {\n internalType: \"address\",\n name: \"\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"recipient\",\n type: \"address\",\n },\n {\n internalType: \"bytes\",\n name: \"message\",\n type: \"bytes\",\n },\n {\n internalType: \"bytes\",\n name: \"signature\",\n type: \"bytes\",\n },\n ],\n name: \"receiveTokens\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"chainId_\",\n type: \"uint256\",\n },\n {\n internalType: \"uint32\",\n name: \"domain\",\n type: \"uint32\",\n },\n ],\n name: \"registerBridgeDestination\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"renounceOwnership\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"adminFeeShareBP_\",\n type: \"uint256\",\n },\n ],\n name: \"setAdminFeeShare\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"contract IGasOracle\",\n name: \"gasOracle_\",\n type: \"address\",\n },\n ],\n name: \"setGasOracle\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"chainId\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"gasAmount\",\n type: \"uint256\",\n },\n ],\n name: \"setGasUsage\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"newOwner\",\n type: \"address\",\n },\n ],\n name: \"transferOwnership\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"chainId_\",\n type: \"uint256\",\n },\n ],\n name: \"unregisterBridgeDestination\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"withdrawFeeInTokens\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n ],\n name: \"withdrawGas\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n stateMutability: \"payable\",\n type: \"receive\",\n },\n ],\n} as const;\nexport default artifact;\n", "const artifact = {\n abi: [\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"chainId_\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"chainPrecision_\",\n type: \"uint256\",\n },\n {\n internalType: \"contract IGasOracle\",\n name: \"gasOracle_\",\n type: \"address\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"constructor\",\n },\n {\n inputs: [\n {\n internalType: \"uint16\",\n name: \"optionType\",\n type: \"uint16\",\n },\n ],\n name: \"InvalidOptionType\",\n type: \"error\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"address\",\n name: \"sender\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"bytes32\",\n name: \"recipient\",\n type: \"bytes32\",\n },\n {\n indexed: false,\n internalType: \"address\",\n name: \"tokenAddress\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"destinationChainId\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"receivedRelayerFeeFromGas\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"receivedRelayerFeeFromTokens\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"relayerFeeWithExtraGas\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"receivedRelayerFeeTokenAmount\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"adminFeeTokenAmount\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"extraGasDestinationToken\",\n type: \"uint256\",\n },\n ],\n name: \"OftTokensSent\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"previousOwner\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"newOwner\",\n type: \"address\",\n },\n ],\n name: \"OwnershipTransferred\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"address\",\n name: \"sender\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n ],\n name: \"ReceivedGas\",\n type: \"event\",\n },\n {\n stateMutability: \"payable\",\n type: \"fallback\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"oft_\",\n type: \"address\",\n },\n ],\n name: \"addToken\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"tokenAddress\",\n type: \"address\",\n },\n ],\n name: \"adminFeeShareBP\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"feeShare\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"tokenAddress\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n {\n internalType: \"bytes32\",\n name: \"recipient\",\n type: \"bytes32\",\n },\n {\n internalType: \"uint256\",\n name: \"destinationChainId\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"relayerFeeTokenAmount\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"extraGasInDestinationToken\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"slippageBP\",\n type: \"uint256\",\n },\n ],\n name: \"bridge\",\n outputs: [],\n stateMutability: \"payable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"chainId\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"tokenAddress_\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"destinationChainId_\",\n type: \"uint256\",\n },\n {\n internalType: \"uint128\",\n name: \"extraGasAmount_\",\n type: \"uint128\",\n },\n ],\n name: \"extraGasPrice\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"chainId_\",\n type: \"uint256\",\n },\n ],\n name: \"getEidByChainId\",\n outputs: [\n {\n internalType: \"uint32\",\n name: \"\",\n type: \"uint32\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"tokenAddress\",\n type: \"address\",\n },\n ],\n name: \"oftAddress\",\n outputs: [\n {\n internalType: \"address\",\n name: \"oftAddress\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"owner\",\n outputs: [\n {\n internalType: \"address\",\n name: \"\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"chainId_\",\n type: \"uint256\",\n },\n {\n internalType: \"uint32\",\n name: \"eid_\",\n type: \"uint32\",\n },\n {\n internalType: \"uint128\",\n name: \"lzGasLimit_\",\n type: \"uint128\",\n },\n ],\n name: \"registerBridgeDestination\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"tokenAddress_\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"destinationChainId_\",\n type: \"uint256\",\n },\n ],\n name: \"relayerFee\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"oft_\",\n type: \"address\",\n },\n ],\n name: \"removeToken\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"renounceOwnership\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"tokenAddress_\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"adminFeeShareBP_\",\n type: \"uint256\",\n },\n ],\n name: \"setAdminFeeShare\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"chainId_\",\n type: \"uint256\",\n },\n {\n internalType: \"uint128\",\n name: \"lzGasLimit_\",\n type: \"uint128\",\n },\n ],\n name: \"setLzGasLimit\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"chainId_\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"maxExtraGas_\",\n type: \"uint256\",\n },\n ],\n name: \"setMaxExtraGas\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"newOwner\",\n type: \"address\",\n },\n ],\n name: \"transferOwnership\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"chainId_\",\n type: \"uint256\",\n },\n ],\n name: \"unregisterBridgeDestination\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"contract IERC20\",\n name: \"token_\",\n type: \"address\",\n },\n ],\n name: \"withdrawFeeInTokens\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"amount_\",\n type: \"uint256\",\n },\n ],\n name: \"withdrawGas\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n stateMutability: \"payable\",\n type: \"receive\",\n },\n ],\n} as const;\nexport default artifact;\n", "import * as anchor from \"@project-serum/anchor\";\nimport { PublicKey } from \"@solana/web3.js\";\nimport { ChainType } from \"../../chains/chain.enums\";\nimport { SdkError } from \"../../exceptions\";\nimport { getAssociatedAccount } from \"../utils/sol/accounts\";\nimport { buildAnchorProvider } from \"../utils/sol/anchor-provider\";\nimport { formatAddress } from \"./utils\";\n\n// 1. OVERLOADS\nexport function getCctpSolTokenRecipientAddress(\n chainType: ChainType.EVM | ChainType.SUI,\n toAccountAddress: string,\n destinationTokenAddress: string,\n solRpcUrl: string\n): Promise<string>;\nexport function getCctpSolTokenRecipientAddress(\n chainType: ChainType.TRX,\n toAccountAddress: string,\n destinationTokenAddress: string,\n solRpcUrl: string\n): Promise<Buffer>;\nexport function getCctpSolTokenRecipientAddress(\n chainType: ChainType.SOLANA | ChainType.SRB,\n toAccountAddress: string,\n destinationTokenAddress: string,\n solRpcUrl: string\n): Promise<number[]>;\nexport function getCctpSolTokenRecipientAddress(\n chainType: ChainType,\n toAccountAddress: string,\n destinationTokenAddress: string,\n solRpcUrl: string\n): Promise<string | number[] | Buffer>;\n\n// 2. COMMON Realization\nexport async function getCctpSolTokenRecipientAddress(\n chainType: ChainType,\n toAccountAddress: string,\n destinationTokenAddress: string,\n solRpcUrl: string\n): Promise<string | number[] | Buffer> {\n let recipientWalletAddress: string | number[] | Buffer;\n const receiverAccount = new PublicKey(toAccountAddress);\n const receiveMint = new PublicKey(destinationTokenAddress);\n const receiveUserToken = await getAssociatedAccount(receiverAccount, receiveMint);\n const provider = buildAnchorProvider(solRpcUrl, toAccountAddress);\n anchor.setProvider(provider);\n const accountData = await anchor.Spl.token(provider).account.token.fetchNullable(receiveUserToken);\n if (accountData?.authority.equals(receiverAccount)) {\n recipientWalletAddress = formatAddress(receiveUserToken.toBase58(), ChainType.SOLANA, chainType);\n } else {\n const tokenAccounts = await provider.connection.getTokenAccountsByOwner(receiverAccount, {\n mint: receiveMint,\n });\n if (tokenAccounts.value.length === 0 && !accountData) {\n recipientWalletAddress = formatAddress(receiveUserToken.toBase58(), ChainType.SOLANA, chainType);\n } else if (tokenAccounts.value.length > 0) {\n const firstTokenAccount = tokenAccounts.value[0];\n\n if (!firstTokenAccount?.pubkey) {\n throw new SdkError(\"First token account or its public key is undefined\");\n }\n recipientWalletAddress = formatAddress(firstTokenAccount.pubkey.toBase58(), ChainType.SOLANA, chainType);\n } else {\n throw new SdkError(\"Associated account has wrong owner\");\n }\n }\n return recipientWalletAddress;\n}\n", "import * as anchor from \"@project-serum/anchor\";\nimport { PublicKey } from \"@solana/web3.js\";\n\nexport async function getAssociatedAccount(publicKey: PublicKey, mintAccount: PublicKey): Promise<PublicKey> {\n return anchor.utils.token.associatedAddress({\n mint: mintAccount,\n owner: publicKey,\n });\n}\n\nexport async function getConfigAccount(programId: PublicKey): Promise<PublicKey> {\n const [configPda] = await PublicKey.findProgramAddress([anchor.utils.bytes.utf8.encode(\"config\")], programId);\n return configPda;\n}\n\nexport async function getLockAccount(nonce: number[], bridgeProgramId: PublicKey): Promise<PublicKey> {\n const [lockPda] = await PublicKey.findProgramAddress(\n [anchor.utils.bytes.utf8.encode(\"lock\"), Uint8Array.from(nonce)],\n bridgeProgramId\n );\n return lockPda;\n}\n\nexport async function getPriceAccount(chainId: number, gasOracleProgramId: PublicKey): Promise<PublicKey> {\n const [pricePda] = await PublicKey.findProgramAddress(\n [anchor.utils.bytes.utf8.encode(\"price_v2\"), Uint8Array.from([chainId])],\n gasOracleProgramId\n );\n return pricePda;\n}\n\nexport async function getAuthorityAccount(bridgeProgramId: PublicKey): Promise<PublicKey> {\n const configAccount = await getConfigAccount(bridgeProgramId);\n const [poolAuthority] = await PublicKey.findProgramAddress([configAccount.toBuffer()], bridgeProgramId);\n return poolAuthority;\n}\n\nexport async function getCctpAuthorityAccount(\n cctpBridgeAccount: PublicKey,\n cctpBridgeProgramId: PublicKey\n): Promise<PublicKey> {\n const [poolAuthority] = await PublicKey.findProgramAddress([cctpBridgeAccount.toBuffer()], cctpBridgeProgramId);\n return poolAuthority;\n}\n\nexport async function getBridgeTokenAccount(mintAccount: PublicKey, bridgeProgramId: PublicKey): Promise<PublicKey> {\n const [poolPda] = await PublicKey.findProgramAddress(\n [anchor.utils.bytes.utf8.encode(\"token\"), mintAccount.toBytes()],\n bridgeProgramId\n );\n return poolPda;\n}\n\nexport async function getOtherChainTokenAccount(\n chainId: number,\n token: Buffer,\n bridgeProgramId: PublicKey\n): Promise<PublicKey> {\n const [otherChainTokenPda] = await PublicKey.findProgramAddress(\n [anchor.utils.bytes.utf8.encode(\"other_bridge_token\"), Buffer.from([chainId]), token],\n bridgeProgramId\n );\n return otherChainTokenPda;\n}\n\nexport async function getChainBridgeAccount(chainId: number, bridgeProgramId: PublicKey): Promise<PublicKey> {\n const [chainBridgePda] = await PublicKey.findProgramAddress(\n [anchor.utils.bytes.utf8.encode(\"chain_bridge\"), Uint8Array.from([chainId])],\n bridgeProgramId\n );\n return chainBridgePda;\n}\n\nexport async function getGasUsageAccount(chainId: number, messengerProgramId: PublicKey): Promise<PublicKey> {\n const [chainBridgePda] = await PublicKey.findProgramAddress(\n [anchor.utils.bytes.utf8.encode(\"gas_usage\"), Uint8Array.from([chainId])],\n messengerProgramId\n );\n return chainBridgePda;\n}\n\nexport async function getSendMessageAccount(\n messageWithSigner: Uint8Array,\n messengerProgramId: PublicKey\n): Promise<PublicKey> {\n const [sentMessagePda] = await PublicKey.findProgramAddress(\n [anchor.utils.bytes.utf8.encode(\"sent_message\"), messageWithSigner],\n messengerProgramId\n );\n return sentMessagePda;\n}\n\nexport async function getUserDepositAccount(\n userPublicKey: PublicKey,\n tokenMintAccount: PublicKey,\n bridgeProgramId: PublicKey\n): Promise<PublicKey> {\n const [userDepositPda] = await PublicKey.findProgramAddress(\n [anchor.utils.bytes.utf8.encode(\"user_deposit\"), tokenMintAccount.toBytes(), userPublicKey.toBytes()],\n bridgeProgramId\n );\n return userDepositPda;\n}\n\nexport async function getCctpBridgeAccount(mintAccount: PublicKey, cctpBridgeProgramId: PublicKey): Promise<PublicKey> {\n const [configPda] = await PublicKey.findProgramAddress(\n [anchor.utils.bytes.utf8.encode(\"cctp_bridge\"), mintAccount.toBytes()],\n cctpBridgeProgramId\n );\n return configPda;\n}\n\nexport async function getCctpBridgeTokenAccount(token: PublicKey, cctpBridgeProgramId: PublicKey): Promise<PublicKey> {\n const [poolPda] = await PublicKey.findProgramAddress(\n [anchor.utils.bytes.utf8.encode(\"token\"), token.toBytes()],\n cctpBridgeProgramId\n );\n return poolPda;\n}\n\nexport function getCctpLockAccount(cctpBridgeProgramId: PublicKey, messageSentEventDataAccount: PublicKey): PublicKey {\n const [tokenMessengerEventAuthority] = PublicKey.findProgramAddressSync(\n [anchor.utils.bytes.utf8.encode(\"lock\"), messageSentEventDataAccount.toBuffer()],\n cctpBridgeProgramId\n );\n return tokenMessengerEventAuthority;\n}\n\nexport function getCctpAccounts(\n domain: number,\n mintAccount: PublicKey,\n cctpTransmitterProgramId: PublicKey,\n cctpTokenMessengerMinter: PublicKey\n) {\n const messageTransmitterAccount = findProgramAddress(\"message_transmitter\", cctpTransmitterProgramId);\n const tokenMessenger = findProgramAddress(\"token_messenger\", cctpTokenMessengerMinter);\n const tokenMessengerEventAuthority = findProgramAddress(\"__event_authority\", cctpTokenMessengerMinter);\n const tokenMinter = findProgramAddress(\"token_minter\", cctpTokenMessengerMinter);\n const localToken = findProgramAddress(\"local_token\", cctpTokenMessengerMinter, [mintAccount]);\n const remoteTokenMessengerKey = findProgramAddress(\"remote_token_messenger\", cctpTokenMessengerMinter, [\n domain.toString(),\n ]);\n const authorityPda = findProgramAddress(\"sender_authority\", cctpTokenMessengerMinter);\n return {\n messageTransmitterAccount,\n tokenMessenger,\n tokenMessengerEventAuthority,\n tokenMinter,\n localToken,\n remoteTokenMessengerKey,\n authorityPda,\n };\n}\n\nfunction findProgramAddress(\n label: string,\n programId: PublicKey,\n extraSeeds: (string | number[] | Buffer | PublicKey)[] = []\n): PublicKey {\n const seeds = [Buffer.from(anchor.utils.bytes.utf8.encode(label))];\n for (const extraSeed of extraSeeds) {\n if (typeof extraSeed === \"string\") {\n seeds.push(Buffer.from(anchor.utils.bytes.utf8.encode(extraSeed)));\n } else if (Array.isArray(extraSeed)) {\n seeds.push(Buffer.from(Uint8Array.from(extraSeed)));\n } else if (Buffer.isBuffer(extraSeed)) {\n seeds.push(Buffer.from(Uint8Array.from(extraSeed)));\n } else {\n seeds.push(Buffer.from(Uint8Array.from(extraSeed.toBuffer())));\n }\n }\n const res = PublicKey.findProgramAddressSync(seeds, programId);\n return res[0];\n}\n", "import { AnchorProvider, Provider } from \"@project-serum/anchor\";\nimport { Connection, PublicKey } from \"@solana/web3.js\";\n\nexport function buildAnchorProvider(solanaRpcUrl: string, accountAddress: string): Provider {\n const connection = new Connection(solanaRpcUrl, \"confirmed\");\n\n const publicKey = new PublicKey(accountAddress);\n\n return new AnchorProvider(\n connection,\n // @ts-expect-error enough wallet for fetch actions\n { publicKey: publicKey },\n {\n preflightCommitment: \"confirmed\",\n commitment: \"confirmed\",\n }\n );\n}\n", "import { PublicKey } from \"@solana/web3.js\";\nimport { Address } from \"@stellar/stellar-sdk\";\nimport { Big, BigSource } from \"big.js\";\nimport randomBytes from \"randombytes\";\nimport { utils as TronWebUtils } from \"tronweb\";\nimport { Chains } from \"../../chains\";\nimport { Messenger } from \"../../client/core-api/core-api.model\";\nimport { AllbridgeCoreClient } from \"../../client/core-api/core-client-base\";\nimport {\n AmountNotEnoughError,\n CCTPDoesNotSupportedError,\n ExtraGasMaxLimitExceededError,\n InvalidGasFeePaymentOptionError,\n OFTDoesNotSupportedError,\n SdkError,\n} from \"../../exceptions\";\nimport {\n AmountFormat,\n ChainType,\n ExtraGasMaxLimitResponse,\n ExtraGasMaxLimits,\n FeePaymentMethod,\n GasFeeOptions,\n SwapParams,\n} from \"../../models\";\nimport { ChainDetailsMap, TokenWithChainDetails } from \"../../tokens-info\";\nimport { convertAmountPrecision, convertFloatAmountToInt, convertIntAmountToFloat } from \"../../utils/calculation\";\nimport {\n SendParams,\n TxSendParams,\n TxSendParamsEvm,\n TxSendParamsSol,\n TxSendParamsSrb,\n TxSendParamsSui,\n TxSendParamsTrx,\n TxSwapParams,\n TxSwapParamsEvm,\n TxSwapParamsSol,\n TxSwapParamsSrb,\n TxSwapParamsSui,\n TxSwapParamsTrx,\n} from \"./models\"; // 1. OVERLOADS\n\n// 1. OVERLOADS\nexport function formatAddress(address: string, from: ChainType, to: ChainType.EVM | ChainType.SUI): string;\nexport function formatAddress(address: string, from: ChainType, to: ChainType.TRX): Buffer;\nexport function formatAddress(address: string, from: ChainType, to: ChainType.SOLANA | ChainType.SRB): number[];\nexport function formatAddress(address: string, from: ChainType, to: ChainType): string | number[] | Buffer;\n\n// 2. COMMON Realization\nexport function formatAddress(address: string, from: ChainType, to: ChainType): string | number[] | Buffer {\n let buffer: Buffer;\n switch (from) {\n case ChainType.EVM: {\n buffer = evmAddressToBuffer32(address);\n break;\n }\n case ChainType.SOLANA: {\n buffer = new PublicKey(address).toBuffer();\n break;\n }\n case ChainType.TRX: {\n buffer = tronAddressToBuffer32(address);\n break;\n }\n case ChainType.SRB: {\n buffer = new Address(address).toBuffer();\n break;\n }\n case ChainType.SUI: {\n buffer = evmAddressToBuffer32(address);\n break;\n }\n }\n\n switch (to) {\n case ChainType.EVM: {\n return \"0x\" + buffer.toString(\"hex\");\n }\n case ChainType.SOLANA: {\n return Array.from(buffer);\n }\n case ChainType.TRX: {\n return buffer;\n }\n case ChainType.SRB: {\n return buffer.toJSON().data;\n }\n case ChainType.SUI: {\n return \"0x\" + buffer.toString(\"hex\");\n }\n }\n}\n\nexport function normalizeSuiHex(hex: string): string {\n return hex.replace(/^0x/i, \"\");\n}\n\nexport function hexToBuffer(hex: string): Buffer {\n return Buffer.from(hex.replace(/^0x/i, \"\"), \"hex\");\n}\n\nexport function evmAddressToBuffer32(address: string): Buffer {\n const length = 32;\n const buff = hexToBuffer(address);\n return Buffer.concat([Buffer.alloc(length - buff.length, 0), buff], length);\n}\n\nexport function tronAddressToBuffer32(address: string): Buffer {\n const ethAddress = tronAddressToEthAddress(address);\n const buffer = hexToBuffer(ethAddress);\n return bufferToSize(buffer, 32);\n}\n\nexport function tronAddressToEthAddress(address: string): string {\n const bytes = TronWebUtils.crypto.decodeBase58Address(address);\n if (!bytes) return \"\";\n return TronWebUtils.bytes.byteArray2hexStr(bytes).replace(/^41/, \"0x\");\n}\n\nfunction bufferToSize(buffer: Buffer, size: number): Buffer {\n if (buffer.length >= size) {\n return buffer;\n }\n const result = Buffer.alloc(size, 0);\n buffer.copy(result, size - buffer.length);\n return result;\n}\n\nexport function getTokenByTokenAddress(\n chainDetailsMap: ChainDetailsMap,\n chainSymbol: string,\n tokenAddress: string\n): TokenWithChainDetails {\n const chainDetail = chainDetailsMap[chainSymbol];\n if (!chainDetail) {\n throw new SdkError(\"Cannot find chain detail for \" + chainSymbol);\n }\n const token = chainDetail.tokens.find((value) => value.tokenAddress.toUpperCase() === tokenAddress.toUpperCase());\n if (!token) {\n throw new SdkError(\"Cannot find token info about token \" + tokenAddress + \" on chain \" + chainSymbol);\n }\n return token;\n}\n\nexport function getNonce(): Buffer {\n return randomBytes(32);\n}\n\nexport function getNonceBigInt(): bigint {\n const bigint = randomBytes(32).readBigInt64BE();\n if (bigint < 0) {\n return bigint * -1n;\n }\n return bigint;\n}\n\n// 1. OVERLOADS\nexport function prepareTxSwapParams(\n bridgeChainType: ChainType.EVM | ChainType.SUI,\n params: SwapParams\n): TxSwapParamsEvm | TxSwapParamsSui;\nexport function prepareTxSwapParams(bridgeChainType: ChainType.TRX, params: SwapParams): TxSwapParamsTrx;\nexport function prepareTxSwapParams(\n bridgeChainType: ChainType.SOLANA | ChainType.SRB,\n params: SwapParams\n): TxSwapParamsSol | TxSwapParamsSrb;\nexport function prepareTxSwapParams(bridgeChainType: ChainType, params: SwapParams): TxSwapParams;\n\n// 2. COMMON Realization\nexport function prepareTxSwapParams(bridgeChainType: ChainType, params: SwapParams): TxSwapParams {\n const txSwapParams = {} as TxSwapParams;\n const sourceToken = params.sourceToken;\n txSwapParams.amount = convertFloatAmountToInt(params.amount, sourceToken.decimals).toFixed();\n txSwapParams.contractAddress = sourceToken.bridgeAddress;\n txSwapParams.fromAccountAddress = params.fromAccountAddress;\n if (bridgeChainType === ChainType.SUI) {\n if (!sourceToken.originTokenAddress) {\n throw new SdkError(\"SUI sourceToken must contain 'originTokenAddress'\");\n }\n txSwapParams.fromTokenAddress = sourceToken.originTokenAddress;\n } else {\n txSwapParams.fromTokenAddress = formatAddress(sourceToken.tokenAddress, bridgeChainType, bridgeChainType);\n }\n txSwapParams.toAccountAddress = params.toAccountAddress;\n if (bridgeChainType === ChainType.SUI) {\n if (!params.destinationToken.originTokenAddress) {\n throw new SdkError(\"SUI destinationToken must contain 'originTokenAddress'\");\n }\n txSwapParams.toTokenAddress = params.destinationToken.originTokenAddress;\n } else {\n txSwapParams.toTokenAddress = formatAddress(params.destinationToken.tokenAddress, bridgeChainType, bridgeChainType);\n }\n txSwapParams.minimumReceiveAmount = params.minimumReceiveAmount\n ? convertFloatAmountToInt(params.minimumReceiveAmount, params.destinationToken.decimals).toFixed()\n : \"0\";\n return txSwapParams;\n}\n\n// 1. OVERLOADS\nexport function prepareTxSendParams(\n bridgeChainType: ChainType.EVM | ChainType.SUI,\n params: SendParams,\n api: AllbridgeCoreClient\n): Promise<TxSendParamsEvm | TxSendParamsSui>;\nexport function prepareTxSendParams(\n bridgeChainType: ChainType.TRX,\n params: SendParams,\n api: AllbridgeCoreClient\n): Promise<TxSendParamsTrx>;\nexport function prepareTxSendParams(\n bridgeChainType: ChainType.SOLANA | ChainType.SRB,\n params: SendParams,\n api: AllbridgeCoreClient\n): Promise<TxSendParamsSol | TxSendParamsSrb>;\nexport function prepareTxSendParams(\n bridgeChainType: ChainType,\n params: SendParams,\n api: AllbridgeCoreClient\n): Promise<TxSendParams>;\n\n// 2. COMMON Realization\nexport async function prepareTxSendParams(\n bridgeChainType: ChainType,\n params: SendParams,\n api: AllbridgeCoreClient\n): Promise<TxSendParams> {\n const txSendParams = {} as TxSendParams;\n\n txSendParams.fromChainId = params.sourceToken.allbridgeChainId;\n txSendParams.fromChainSymbol = params.sourceToken.chainSymbol;\n const toChainType = Chains.getChainProperty(params.destinationToken.chainSymbol).chainType;\n if (bridgeChainType === ChainType.SUI) {\n if (!params.sourceToken.originTokenAddress) {\n throw new SdkError(\"SUI token must contain 'originTokenAddress'\");\n }\n txSendParams.fromTokenAddress = params.sourceToken.originTokenAddress;\n } else {\n txSendParams.fromTokenAddress = params.sourceToken.tokenAddress;\n }\n\n txSendParams.toChainId = params.destinationToken.allbridgeChainId;\n txSendParams.toTokenAddress = params.destinationToken.tokenAddress;\n\n if (params.gasFeePaymentMethod === FeePaymentMethod.WITH_STABLECOIN) {\n txSendParams.gasFeePaymentMethod = FeePaymentMethod.WITH_STABLECOIN;\n } else {\n // default FeePaymentMethod.WITH_NATIVE_CURRENCY\n txSendParams.gasFeePaymentMethod = FeePaymentMethod.WITH_NATIVE_CURRENCY;\n }\n const sourceToken = params.sourceToken;\n\n switch (params.messenger) {\n case Messenger.CCTP:\n if (!sourceToken.cctpAddress || !params.destinationToken.cctpAddress) {\n throw new CCTPDoesNotSupportedError(\"Such route does not support CCTP protocol\");\n }\n txSendParams.contractAddress = sourceToken.cctpAddress;\n break;\n case Messenger.CCTP_V2:\n if (!sourceToken.cctpV2Address || !params.destinationToken.cctpV2Address) {\n throw new CCTPDoesNotSupportedError(\"Such route does not support CCTP V2 protocol\");\n }\n txSendParams.contractAddress = sourceToken.cctpV2Address;\n\n break;\n case Messenger.OFT:\n if (\n !sourceToken.oftBridgeAddress ||\n !params.destinationToken.oftBridgeAddress ||\n sourceToken.oftId !== params.destinationToken.oftId\n ) {\n throw new OFTDoesNotSupportedError(\"Such route does not support OFT protocol\");\n }\n txSendParams.contractAddress = sourceToken.oftBridgeAddress;\n break;\n case Messenger.ALLBRIDGE:\n case Messenger.WORMHOLE:\n txSendParams.contractAddress = sourceToken.bridgeAddress;\n break;\n }\n\n txSendParams.messenger = params.messenger;\n txSendParams.fromAccountAddress = params.fromAccountAddress;\n txSendParams.amount = convertFloatAmountToInt(params.amount, sourceToken.decimals).toFixed();\n\n //Fee\n let { fee, feeFormat } = params;\n if (!fee) {\n const gasFeeOptions = await getGasFeeOptions(\n params.sourceToken,\n txSendParams.toChainId,\n txSendParams.messenger,\n api\n );\n\n const gasFeeOption = gasFeeOptions[txSendParams.gasFeePaymentMethod];\n if (!gasFeeOption) {\n throw new InvalidGasFeePaymentOptionError();\n }\n fee = gasFeeOption[AmountFormat.INT];\n feeFormat = AmountFormat.INT;\n }\n if (feeFormat == AmountFormat.FLOAT) {\n switch (txSendParams.gasFeePaymentMethod) {\n case FeePaymentMethod.WITH_NATIVE_CURRENCY:\n txSendParams.fee = convertFloatAmountToInt(fee, Chains.getChainDecimalsByType(sourceToken.chainType)).toFixed(\n 0\n );\n break;\n case FeePaymentMethod.WITH_STABLECOIN:\n txSendParams.fee = convertFloatAmountToInt(fee, sourceToken.decimals).toFixed(0);\n break;\n }\n } else {\n txSendParams.fee = fee;\n }\n\n //ExtraGas\n const { extraGas, extraGasFormat } = params;\n if (extraGas && +extraGas > 0) {\n const extraGasLimits = await getExtraGasMaxLimits(\n sourceToken,\n params.destinationToken,\n txSendParams.messenger,\n api\n );\n\n let extraGasDecimals: number;\n let extraGasDestRate: Big;\n switch (txSendParams.gasFeePaymentMethod) {\n case FeePaymentMethod.WITH_NATIVE_CURRENCY:\n extraGasDecimals = Chains.getChainDecimalsByType(sourceToken.chainType);\n extraGasDestRate = Big(extraGasLimits.exchangeRate);\n break;\n case FeePaymentMethod.WITH_STABLECOIN:\n extraGasDecimals = sourceToken.decimals;\n extraGasDestRate = Big(extraGasLimits.exchangeRate).div(extraGasLimits.sourceNativeTokenPrice);\n break;\n }\n\n switch (extraGasFormat ?? AmountFormat.INT) {\n case AmountFormat.FLOAT: {\n txSendParams.extraGas = convertFloatAmountToInt(extraGas, extraGasDecimals).toFixed(0);\n\n const extraGasDestFloat = extraGasDestRate.mul(extraGas);\n txSendParams.extraGasDest = convertFloatAmountToInt(\n extraGasDestFloat,\n Chains.getChainDecimalsByType(params.destinationToken.chainType)\n ).toFixed(0, Big.roundDown);\n break;\n }\n case AmountFormat.INT: {\n txSendParams.extraGas = extraGas;\n\n const extraGasFloat = convertIntAmountToFloat(\n txSendParams.extraGas,\n Chains.getChainDecimalsByType(sourceToken.chainType)\n );\n const extraGasDestFloat = extraGasDestRate.mul(extraGasFloat);\n txSendParams.extraGasDest = convertFloatAmountToInt(\n extraGasDestFloat,\n Chains.getChainDecimalsByType(params.destinationToken.chainType)\n ).toFixed(0, Big.roundDown);\n break;\n }\n }\n\n validateExtraGasNotExceeded(txSendParams.extraGas, txSendParams.gasFeePaymentMethod, extraGasLimits);\n }\n\n if (bridgeChainType !== ChainType.SUI) {\n txSendParams.fromTokenAddress = formatAddress(txSendParams.fromTokenAddress, bridgeChainType, bridgeChainType);\n }\n txSendParams.toAccountAddress = formatAddress(params.toAccountAddress, toChainType, bridgeChainType);\n txSendParams.toTokenAddress = formatAddress(txSendParams.toTokenAddress, toChainType, bridgeChainType);\n if (txSendParams.gasFeePaymentMethod == FeePaymentMethod.WITH_STABLECOIN) {\n validateAmountEnough(txSendParams.amount, sourceToken.decimals, txSendParams.fee, txSendParams.extraGas);\n }\n return txSendParams;\n}\n\nfunction validateAmountEnough(\n amountInt: BigSource,\n decimals: number,\n feeInt: BigSource,\n extraGasInt: BigSource | undefined\n) {\n const amountTotal = Big(amountInt)\n .minus(feeInt)\n .minus(extraGasInt ?? 0);\n if (amountTotal.lte(0)) {\n throw new AmountNotEnoughError(\n `Amount not enough to pay fee, ${convertIntAmountToFloat(\n Big(amountTotal).minus(1).neg(),\n decimals\n ).toFixed()} stables is missing`\n );\n }\n}\n\nexport async function getGasFeeOptions(\n sourceChainToken: TokenWithChainDetails,\n destinationAllbridgeChainId: number,\n messenger: Messenger,\n api: AllbridgeCoreClient\n): Promise<GasFeeOptions> {\n const transactionCostResponse = await api.getReceiveTransactionCost({\n sourceChainId: sourceChainToken.allbridgeChainId,\n destinationChainId: destinationAllbridgeChainId,\n messenger,\n sourceToken: sourceChainToken.tokenAddress,\n });\n\n const gasFeeOptions: GasFeeOptions = {\n [FeePaymentMethod.WITH_NATIVE_CURRENCY]: {\n [AmountFormat.INT]: transactionCostResponse.fee,\n [AmountFormat.FLOAT]: convertIntAmountToFloat(\n transactionCostResponse.fee,\n Chains.getChainDecimalsByType(sourceChainToken.chainType)\n ).toFixed(),\n },\n adminFeeShareWithExtras: transactionCostResponse.adminFeeShareWithExtras,\n };\n if (transactionCostResponse.sourceNativeTokenPrice) {\n const gasFeeIntWithStables = convertAmountPrecision(\n new Big(transactionCostResponse.fee).mul(transactionCostResponse.sourceNativeTokenPrice),\n Chains.getChainDecimalsByType(sourceChainToken.chainType),\n sourceChainToken.decimals\n ).toFixed(0, Big.roundUp);\n gasFeeOptions[FeePaymentMethod.WITH_STABLECOIN] = {\n [AmountFormat.INT]: gasFeeIntWithStables,\n [AmountFormat.FLOAT]: convertIntAmountToFloat(gasFeeIntWithStables, sourceChainToken.decimals).toFixed(),\n };\n }\n\n return gasFeeOptions;\n}\n\nfunction validateExtraGasNotExceeded(\n extraGasInt: string,\n gasFeePaymentMethod: FeePaymentMethod,\n extraGasLimits: ExtraGasMaxLimitResponse\n) {\n const extraGasMaxLimit = extraGasLimits.extraGasMax[gasFeePaymentMethod];\n if (!extraGasMaxLimit) {\n throw new InvalidGasFeePaymentOptionError(`Impossible to pay extra gas by '${gasFeePaymentMethod}' payment method`);\n }\n const extraGasMaxIntLimit = extraGasMaxLimit[AmountFormat.INT];\n if (Big(extraGasInt).gt(extraGasMaxIntLimit)) {\n throw new ExtraGasMaxLimitExceededError(\n `Extra gas ${extraGasInt} in int format, exceeded limit ${extraGasMaxIntLimit} for '${gasFeePaymentMethod}' payment method`\n );\n }\n}\n\nexport async function getExtraGasMaxLimits(\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n messenger: Messenger,\n api: AllbridgeCoreClient\n): Promise<ExtraGasMaxLimitResponse> {\n const extraGasMaxLimits: ExtraGasMaxLimits = {};\n const transactionCostResponse = await api.getReceiveTransactionCost({\n sourceChainId: sourceChainToken.allbridgeChainId,\n destinationChainId: destinationChainToken.allbridgeChainId,\n messenger,\n sourceToken: sourceChainToken.tokenAddress,\n });\n const maxAmount = destinationChainToken.txCostAmount.maxAmount;\n const maxAmountFloat = convertIntAmountToFloat(\n maxAmount,\n Chains.getChainDecimalsByType(destinationChainToken.chainType)\n ).toFixed();\n const maxAmountFloatInSourceNative = Big(maxAmountFloat)\n .div(transactionCostResponse.exchangeRate)\n .toFixed(Chains.getChainDecimalsByType(sourceChainToken.chainType), Big.roundDown);\n const maxAmountInSourceNative = convertFloatAmountToInt(\n maxAmountFloatInSourceNative,\n Chains.getChainDecimalsByType(sourceChainToken.chainType)\n ).toFixed(0);\n extraGasMaxLimits[FeePaymentMethod.WITH_NATIVE_CURRENCY] = {\n [AmountFormat.INT]: maxAmountInSourceNative,\n [AmountFormat.FLOAT]: maxAmountFloatInSourceNative,\n };\n if (transactionCostResponse.sourceNativeTokenPrice) {\n const maxAmountFloatInStable = Big(maxAmountFloatInSourceNative)\n .mul(transactionCostResponse.sourceNativeTokenPrice)\n .toFixed(sourceChainToken.decimals, Big.roundDown);\n extraGasMaxLimits[FeePaymentMethod.WITH_STABLECOIN] = {\n [AmountFormat.INT]: convertFloatAmountToInt(maxAmountFloatInStable, sourceChainToken.decimals).toFixed(0),\n [AmountFormat.FLOAT]: maxAmountFloatInStable,\n };\n }\n return {\n extraGasMax: extraGasMaxLimits,\n destinationChain: {\n gasAmountMax: {\n [AmountFormat.INT]: maxAmount,\n [AmountFormat.FLOAT]: maxAmountFloat,\n },\n swap: {\n [AmountFormat.INT]: destinationChainToken.txCostAmount.swap,\n [AmountFormat.FLOAT]: convertIntAmountToFloat(\n destinationChainToken.txCostAmount.swap,\n Chains.getChainDecimalsByType(destinationChainToken.chainType)\n ).toFixed(),\n },\n transfer: {\n [AmountFormat.INT]: destinationChainToken.txCostAmount.transfer,\n [AmountFormat.FLOAT]: convertIntAmountToFloat(\n destinationChainToken.txCostAmount.transfer,\n Chains.getChainDecimalsByType(destinationChainToken.chainType)\n ).toFixed(),\n },\n },\n exchangeRate: transactionCostResponse.exchangeRate,\n sourceNativeTokenPrice: transactionCostResponse.sourceNativeTokenPrice,\n };\n}\n\nexport function isSendParams(params: SwapParams | SendParams): params is SendParams {\n return params.sourceToken.chainSymbol !== params.destinationToken.chainSymbol;\n}\n", "import { Big, BigSource } from \"big.js\";\nimport BN from \"bn.js\";\nimport { InsufficientPoolLiquidityError } from \"../../exceptions\";\nimport { PoolInfo, Token } from \"../../tokens-info\";\nimport { SYSTEM_PRECISION } from \"./constants\";\n\nexport function getFeePercent(input: BigSource, output: BigSource): number {\n return Big(100).minus(Big(100).times(output).div(input)).toNumber();\n}\n\nexport function toSystemPrecision(amount: BigSource, decimals: number): Big {\n return convertAmountPrecision(amount, decimals, SYSTEM_PRECISION).round(0, Big.roundDown);\n}\n\nexport function fromSystemPrecision(amount: BigSource, decimals: number): Big {\n return convertAmountPrecision(amount, SYSTEM_PRECISION, decimals);\n}\n\nexport function convertAmountPrecision(amount: BigSource, decimalsFrom: number, decimalsTo: number): Big {\n const dif = Big(decimalsTo).minus(decimalsFrom).toNumber();\n return Big(amount).times(toPowBase10(dif));\n}\n\nexport function toPowBase10(decimals: number): Big {\n return Big(10).pow(decimals);\n}\n\nexport function convertFloatAmountToInt(amountFloat: BigSource, decimals: number): Big {\n return Big(amountFloat).times(toPowBase10(decimals));\n}\n\nexport function convertIntAmountToFloat(amountInt: BigSource, decimals: number): Big {\n const amountValue = Big(amountInt);\n if (amountValue.eq(0)) {\n return Big(0);\n }\n return Big(amountValue).div(toPowBase10(decimals));\n}\n\nexport function calculatePoolInfoImbalance(poolInfo: Pick<PoolInfo, \"tokenBalance\" | \"vUsdBalance\">): string {\n return convertIntAmountToFloat(Big(poolInfo.tokenBalance).minus(poolInfo.vUsdBalance).toFixed(), SYSTEM_PRECISION)\n .div(2)\n .toFixed();\n}\n\nexport function swapToVUsd(\n amount: BigSource,\n { feeShare, decimals }: Pick<Token, \"feeShare\" | \"decimals\">,\n poolInfo: Omit<PoolInfo, \"p\" | \"imbalance\">\n): string {\n const amountValue = Big(amount);\n if (amountValue.lte(0)) {\n return \"0\";\n }\n const fee = amountValue.times(feeShare);\n const amountWithoutFee = amountValue.minus(fee);\n const inSystemPrecision = toSystemPrecision(amountWithoutFee, decimals);\n const tokenBalance = Big(poolInfo.tokenBalance).plus(inSystemPrecision);\n const vUsdNewAmount = getY(tokenBalance, poolInfo.aValue, poolInfo.dValue);\n return Big(poolInfo.vUsdBalance).minus(vUsdNewAmount).round(0, Big.roundDown).toFixed();\n}\n\nexport function swapFromVUsd(\n amount: BigSource,\n { feeShare, decimals }: Pick<Token, \"feeShare\" | \"decimals\">,\n poolInfo: Pick<PoolInfo, \"vUsdBalance\" | \"aValue\" | \"dValue\" | \"tokenBalance\">\n): string {\n const amountValue = Big(amount);\n if (amountValue.lte(0)) {\n return Big(0).toFixed();\n }\n const vUsdBalance = amountValue.plus(poolInfo.vUsdBalance);\n const newAmount = getY(vUsdBalance, poolInfo.aValue, poolInfo.dValue);\n const result = fromSystemPrecision(Big(poolInfo.tokenBalance).minus(newAmount), decimals);\n const fee = Big(result).times(feeShare);\n return Big(result).minus(fee).round(0, Big.roundDown).toFixed();\n}\n\nexport function getSwapFromVUsdPoolInfo(\n vUsdAmount: BigSource,\n poolInfo: Omit<PoolInfo, \"imbalance\">\n): Pick<PoolInfo, \"vUsdBalance\" | \"aValue\" | \"dValue\" | \"tokenBalance\"> {\n const amountValue = Big(vUsdAmount);\n if (amountValue.lte(0)) {\n return poolInfo;\n }\n const vUsdBalance = amountValue.plus(poolInfo.vUsdBalance);\n const newAmount = getY(vUsdBalance, poolInfo.aValue, poolInfo.dValue);\n return {\n aValue: poolInfo.aValue,\n dValue: poolInfo.dValue,\n tokenBalance: newAmount.toFixed(0),\n vUsdBalance: vUsdBalance.toFixed(0),\n };\n}\n\n/**\n * @param amount - vUsd amount should be received\n * @param feeShare\n * @param decimals\n * @param poolInfo\n */\nexport function swapToVUsdReverse(\n amount: BigSource,\n { feeShare, decimals }: Pick<Token, \"feeShare\" | \"decimals\">,\n poolInfo: Omit<PoolInfo, \"imbalance\">\n): Big {\n if (Big(amount).lte(0)) {\n return Big(0);\n }\n const vUsdNewAmount = Big(poolInfo.vUsdBalance).minus(amount);\n if (vUsdNewAmount.lte(0)) {\n throw new InsufficientPoolLiquidityError();\n }\n const tokenBalance = getY(vUsdNewAmount, poolInfo.aValue, poolInfo.dValue);\n const inSystemPrecision = Big(tokenBalance).minus(poolInfo.tokenBalance);\n const amountWithoutFee = fromSystemPrecision(inSystemPrecision, decimals);\n const reversedFeeShare = Big(feeShare).div(Big(1).minus(feeShare));\n const fee = Big(amountWithoutFee).times(reversedFeeShare).round(0, Big.roundUp);\n return Big(amountWithoutFee).plus(fee).round(0, Big.roundDown);\n}\n\n/**\n * @param amount - amount should be received\n * @param feeShare\n * @param decimals\n * @param poolInfo\n */\nexport function swapFromVUsdReverse(\n amount: BigSource,\n { feeShare, decimals }: Pick<Token, \"feeShare\" | \"decimals\">,\n poolInfo: Omit<PoolInfo, \"imbalance\">\n): Big {\n if (Big(amount).lte(0)) {\n return Big(0);\n }\n const reversedFeeShare = Big(feeShare).div(Big(1).minus(feeShare));\n const fee = Big(amount).times(reversedFeeShare).round(0, Big.roundUp);\n const amountWithFee = Big(amount).plus(fee);\n const inSystemPrecision = toSystemPrecision(amountWithFee, decimals);\n const tokenBalance = Big(poolInfo.tokenBalance).minus(inSystemPrecision);\n if (tokenBalance.lte(0)) {\n throw new InsufficientPoolLiquidityError();\n }\n const vUsdNewAmount = getY(tokenBalance, poolInfo.aValue, poolInfo.dValue);\n return Big(vUsdNewAmount).minus(poolInfo.vUsdBalance).round(0, Big.roundDown);\n}\n\n// y = (sqrt(x(4ad\u00B3 + x (4a(d - x) - d )\u00B2)) + x (4a(d - x) - d ))/8ax\n// commonPart = 4a(d - x) - d\n// sqrt = sqrt(x * (4ad\u00B3 + x * commonPart\u00B2)\n// y = (sqrt + x * commonPart) / divider\nexport function getY(x: BigSource, a: BigSource, d: BigSource): Big {\n const commonPartBig = Big(4).times(a).times(Big(d).minus(x)).minus(d);\n const dCubed = Big(d).pow(3);\n const commonPartSquared = commonPartBig.pow(2);\n const sqrtBig = Big(x)\n .times(Big(x).times(commonPartSquared).plus(Big(4).times(a).times(dCubed)))\n .sqrt()\n .round(0, Big.roundDown);\n const dividerBig = Big(8).times(a).times(x);\n const result = commonPartBig.times(x).plus(sqrtBig).div(dividerBig).round(0, Big.roundDown);\n if (result.eq(0)) {\n return Big(0);\n }\n return result.plus(1); // +1 to offset rounding errors\n}\n\nexport function getEarned(userLpAmount: string, userRewardDebt: string, accRewardPerShareP: string, p: number): string {\n const userLpAmountBN = new BN(userLpAmount);\n const accRewardPerSharePBN = new BN(accRewardPerShareP);\n const userRewardDebtBN = new BN(userRewardDebt);\n const rewards = userLpAmountBN.mul(accRewardPerSharePBN).shrn(p);\n return rewards.sub(userRewardDebtBN).toString();\n}\n\nexport function aprInPercents(apr: string): string {\n return Big(apr).gt(0) ? `${Number(Big(apr).times(100).toFixed(2)).toLocaleString()}%` : \"N/A\";\n}\n\n// a = 8Axy(x+y)\n// b = xy(16A - 4) / 3\n// c = sqrt(a\u00B2 + b\u00B3)\n// D = cbrt(a + c) + cbrt(a - c)\nexport function getD(aValue: string, x: string, y: string): string {\n const xy = Big(x).times(y);\n const xPlusY = Big(x).plus(y);\n const a = Big(8).times(aValue).times(xy).times(xPlusY);\n const b = xy.times(Big(16).times(aValue).minus(4)).div(3);\n const aSquared = a.times(a);\n const bCubed = b.times(b).times(b);\n const a2b3 = aSquared.plus(bCubed);\n const c = Big(a2b3).sqrt();\n const cbrtAPlusC = Big(Math.cbrt(+a.plus(c).toFixed()));\n const cbrtAMinusC = Big(Math.cbrt(+a.minus(c).toFixed()));\n return cbrtAPlusC.plus(cbrtAMinusC).toFixed();\n}\n", "import { ChainType } from \"../../../chains/chain.enums\";\nimport { AllbridgeCoreClient } from \"../../../client/core-api/core-client-base\";\nimport { RawTransaction, TransactionResponse } from \"../../models\";\nimport { SendParams, SwapParams } from \"./bridge.model\";\n\nexport abstract class ChainBridgeService {\n abstract chainType: ChainType;\n abstract api: AllbridgeCoreClient;\n\n /**\n * @deprecated Use {@link buildRawTransactionSend} or {@link buildRawTransactionSwap} instead<p>\n * Send tokens through the ChainBridgeService\n * @param params\n */\n abstract send(params: SendParams): Promise<TransactionResponse>;\n abstract buildRawTransactionSend(params: SendParams): Promise<RawTransaction>;\n abstract buildRawTransactionSwap(params: SwapParams): Promise<RawTransaction>;\n}\n", "import { NodeRpcUrlsConfig } from \"..\";\nimport { AllbridgeCoreClient } from \"../../client/core-api/core-client-base\";\nimport { AllbridgeCoreSdkOptions } from \"../../index\";\nimport { validateAmountDecimals, validateAmountGtZero } from \"../../utils/utils\";\nimport { Provider, RawTransaction } from \"../models\";\nimport { TokenService } from \"../token\";\nimport { ApproveParams, SendParams, SwapParams } from \"./models\";\nimport { isSendParams } from \"./utils\";\nimport { getChainBridgeService, getSpender } from \"./index\";\n\nexport interface RawBridgeTransactionBuilder {\n /**\n * Creates a Raw Transaction for approving tokens usage by the bridge\n * @param provider - will be used to access the network\n * @param approveData\n */\n approve(provider: Provider, approveData: ApproveParams): Promise<RawTransaction>;\n /**\n * Creates a Raw Transaction for approving tokens usage by the bridge\n * @param approveData\n */\n approve(approveData: ApproveParams): Promise<RawTransaction>;\n /**\n * Creates a Raw Transaction for initiating the transfer of tokens\n * @param params\n * @param provider - will be used to access the network\n */\n send(params: SwapParams | SendParams, provider?: Provider): Promise<RawTransaction>;\n}\n\nexport class DefaultRawBridgeTransactionBuilder implements RawBridgeTransactionBuilder {\n constructor(\n private api: AllbridgeCoreClient,\n private nodeRpcUrlsConfig: NodeRpcUrlsConfig,\n private params: AllbridgeCoreSdkOptions,\n private tokenService: TokenService\n ) {}\n\n async approve(a: Provider | ApproveParams, b?: ApproveParams): Promise<RawTransaction> {\n let provider: Provider | undefined;\n let approveData: ApproveParams;\n if (b) {\n provider = a as Provider;\n approveData = b;\n } else {\n approveData = a as ApproveParams;\n }\n const spender = getSpender(approveData.token, approveData.messenger);\n return this.tokenService.buildRawTransactionApprove(\n {\n ...approveData,\n spender,\n },\n provider\n );\n }\n\n async send(params: SwapParams | SendParams, provider?: Provider): Promise<RawTransaction> {\n validateAmountGtZero(params.amount);\n validateAmountDecimals(\"amount\", params.amount, params.sourceToken.decimals);\n if (isSendParams(params)) {\n return getChainBridgeService(\n params.sourceToken.chainSymbol,\n this.api,\n this.nodeRpcUrlsConfig,\n this.params,\n provider\n ).buildRawTransactionSend(params);\n }\n return getChainBridgeService(\n params.sourceToken.chainSymbol,\n this.api,\n this.nodeRpcUrlsConfig,\n this.params,\n provider\n ).buildRawTransactionSwap(params);\n }\n}\n", "/* eslint-disable @typescript-eslint/ban-ts-comment */\n/* eslint-disable @typescript-eslint/no-unused-vars */\nimport { BN, Program, Spl, web3 } from \"@project-serum/anchor\";\nimport {\n Connection,\n Keypair,\n PublicKey,\n SystemProgram,\n Transaction,\n TransactionInstruction,\n TransactionMessageArgs,\n VersionedTransaction,\n} from \"@solana/web3.js\";\nimport { Big } from \"big.js\";\nimport { Chains } from \"../../../chains\";\nimport { Messenger } from \"../../../client/core-api/core-api.model\";\nimport { AllbridgeCoreClient } from \"../../../client/core-api/core-client-base\";\nimport {\n AmountNotEnoughError,\n CCTPDoesNotSupportedError,\n JupiterError,\n MethodNotSupportedError,\n OFTDoesNotSupportedError,\n SdkError,\n SdkRootError,\n} from \"../../../exceptions\";\nimport { ChainType, FeePaymentMethod, SwapParams, TokenWithChainDetails, TxFeeParams } from \"../../../models\";\nimport { convertIntAmountToFloat } from \"../../../utils/calculation\";\nimport { RawTransaction, TransactionResponse } from \"../../models\";\nimport { SwapAndBridgeSolData, SwapAndBridgeSolDataCctpData } from \"../../models/sol\";\nimport { Bridge as BridgeType, IDL as bridgeIdl } from \"../../models/sol/types/bridge\";\nimport { CctpBridge as CctpBridgeType, IDL as cctpBridgeIdl } from \"../../models/sol/types/cctp_bridge\";\nimport { getMessage, getTokenAccountData, getVUsdAmount } from \"../../utils/sol\";\nimport {\n getAssociatedAccount,\n getAuthorityAccount,\n getBridgeTokenAccount,\n getCctpAccounts,\n getCctpAuthorityAccount,\n getCctpBridgeAccount,\n getCctpBridgeTokenAccount,\n getCctpLockAccount,\n getChainBridgeAccount,\n getConfigAccount,\n getGasUsageAccount,\n getLockAccount,\n getOtherChainTokenAccount,\n getPriceAccount,\n getSendMessageAccount,\n} from \"../../utils/sol/accounts\";\nimport { buildAnchorProvider } from \"../../utils/sol/anchor-provider\";\nimport { addUnitLimitAndUnitPriceToTx, addUnitLimitAndUnitPriceToVersionedTx } from \"../../utils/sol/compute-budget\";\nimport { SendParams, TxSendParamsSol, TxSwapParamsSol } from \"../models\";\nimport { ChainBridgeService } from \"../models/bridge\";\nimport { getNonce, prepareTxSendParams, prepareTxSwapParams } from \"../utils\";\nimport { JupiterService } from \"./jupiter\";\n\nexport interface SolanaBridgeParams {\n wormholeMessengerProgramId: string;\n solanaLookUpTable: string;\n cctpParams: CctpParams;\n jupiterParams: JupiterParams;\n}\n\nexport interface JupiterParams {\n jupiterUrl: string;\n jupiterApiKeyHeader?: string;\n jupiterMaxAccounts?: number;\n}\n\nexport interface CctpParams {\n cctpTransmitterProgramId: string;\n cctpTokenMessengerMinter: string;\n cctpDomains: CctpDomains;\n}\n\n/**\n * Type representing a map of CCTP domains to their corresponding numeric values.\n *\n * @typedef {Record<string, number>} CctpDomains\n * @property {string} chainSymbol - The symbol of the chain representing one of the supported blockchain networks (e.g., \"ETH\" for Ethereum). For more details, see: {@link ChainSymbol}.\n * @property {number} value - The numeric value associated with the specified chain.\n */\nexport type CctpDomains = Record<string, number>;\n\nconst COMPUTE_UNIT_LIMIT = 1000000;\n\nconst JUP_ADD_INDEX = 1.1;\n\nexport class SolanaBridgeService extends ChainBridgeService {\n chainType: ChainType.SOLANA = ChainType.SOLANA;\n jupiterService: JupiterService;\n\n constructor(\n public solanaRpcUrl: string,\n public params: SolanaBridgeParams,\n public api: AllbridgeCoreClient\n ) {\n super();\n this.jupiterService = new JupiterService(solanaRpcUrl, params.jupiterParams);\n }\n\n async buildRawTransactionSwap(params: SwapParams): Promise<RawTransaction> {\n const txSwapParams = prepareTxSwapParams(this.chainType, params);\n return await this.buildSwapTransaction(\n txSwapParams,\n params.sourceToken.poolAddress,\n params.destinationToken.poolAddress,\n params.txFeeParams\n );\n }\n\n private async buildSwapTransaction(\n params: TxSwapParamsSol,\n poolAddress: string,\n toPoolAddress: string,\n txFeeParams?: TxFeeParams\n ): Promise<VersionedTransaction> {\n const {\n fromAccountAddress,\n amount,\n contractAddress,\n fromTokenAddress,\n toTokenAddress,\n toAccountAddress,\n minimumReceiveAmount,\n } = params;\n const account = fromAccountAddress;\n const bridgeAddress = contractAddress;\n const tokenAddress = fromTokenAddress;\n const receiveTokenAddress = toTokenAddress;\n const receivePoolAddress = toPoolAddress;\n const receiverOriginal = toAccountAddress;\n\n const userAccount = new PublicKey(account);\n const provider = buildAnchorProvider(this.solanaRpcUrl, userAccount.toString());\n const bridge = new Program<BridgeType>(bridgeIdl, bridgeAddress, provider);\n\n const bridgeAuthority = await getAuthorityAccount(bridge.programId);\n const configAccount = await getConfigAccount(bridge.programId);\n\n const sendMint = new PublicKey(tokenAddress);\n const sendBridgeToken = await getBridgeTokenAccount(sendMint, bridge.programId);\n const sendPool = new PublicKey(poolAddress);\n const sendUserToken = await getAssociatedAccount(userAccount, sendMint);\n\n const receiverAccount = new PublicKey(receiverOriginal);\n const receiveMint = new PublicKey(receiveTokenAddress);\n const receiveBridgeToken = await getBridgeTokenAccount(receiveMint, bridge.programId);\n const receivePool = new PublicKey(receivePoolAddress);\n const receiveUserToken = await getAssociatedAccount(receiverAccount, receiveMint);\n\n const preInstructions: TransactionInstruction[] = [\n web3.ComputeBudgetProgram.setComputeUnitLimit({\n units: COMPUTE_UNIT_LIMIT,\n }),\n ];\n\n try {\n await getTokenAccountData(receiveUserToken, provider);\n } catch (e) {\n const associatedProgram = Spl.associatedToken(provider);\n const createReceiveUserTokenInstruction: TransactionInstruction = await associatedProgram.methods\n .create()\n .accounts({\n mint: receiveMint,\n owner: receiverAccount,\n associatedAccount: receiveUserToken,\n })\n .instruction();\n preInstructions.push(createReceiveUserTokenInstruction);\n }\n const transaction = await bridge.methods\n .swap(new BN(amount), new BN(minimumReceiveAmount || 0))\n .accounts({\n payer: userAccount,\n config: configAccount,\n bridgeAuthority,\n user: userAccount,\n sendBridgeToken,\n sendMint,\n sendPool,\n sendUserToken,\n receiveBridgeToken,\n receiveMint,\n receivePool,\n receiveUserToken,\n })\n .preInstructions(preInstructions)\n .transaction();\n\n const connection = provider.connection;\n transaction.recentBlockhash = (await connection.getLatestBlockhash()).blockhash;\n transaction.feePayer = userAccount;\n await addUnitLimitAndUnitPriceToTx(transaction, txFeeParams, this.solanaRpcUrl);\n return await this.convertToVersionedTransaction(transaction, connection);\n }\n\n async buildRawTransactionSend(params: SendParams): Promise<RawTransaction> {\n const txSendParams = await prepareTxSendParams(this.chainType, params, this.api);\n let solTxSendParams = this.addPoolAddress(params, txSendParams);\n\n const isJupiterForStableCoin = solTxSendParams.gasFeePaymentMethod == FeePaymentMethod.WITH_STABLECOIN;\n\n let jupTx;\n if (isJupiterForStableCoin) {\n try {\n const { tx, solTxSendUpdatedParams } = await this.processJup(solTxSendParams, params, true);\n jupTx = tx;\n solTxSendParams = { ...solTxSendParams, ...solTxSendUpdatedParams };\n } catch (e) {\n try {\n const { tx, solTxSendUpdatedParams } = await this.processJup(solTxSendParams, params, false);\n jupTx = tx;\n solTxSendParams = { ...solTxSendParams, ...solTxSendUpdatedParams };\n } catch (e) {\n if (e instanceof SdkRootError) {\n throw e;\n }\n if (e instanceof Error && e.message) {\n throw new JupiterError(`Some error occurred during creation Jupiter swap transaction. ${e.message}`);\n }\n throw new JupiterError(\"Some error occurred during creation Jupiter swap transaction\");\n }\n }\n }\n\n let swapAndBridgeTx: VersionedTransaction;\n let requiredMessageSigner: Keypair | undefined = undefined;\n switch (txSendParams.messenger) {\n case Messenger.ALLBRIDGE: {\n const swapAndBridgeSolData = await this.prepareSwapAndBridgeData(solTxSendParams);\n swapAndBridgeTx = await this.buildSwapAndBridgeAllbridgeTransaction(swapAndBridgeSolData);\n break;\n }\n case Messenger.WORMHOLE: {\n const swapAndBridgeSolData = await this.prepareSwapAndBridgeData(solTxSendParams);\n const { transaction, messageAccount } = await this.buildSwapAndBridgeWormholeTransaction(swapAndBridgeSolData);\n swapAndBridgeTx = transaction;\n requiredMessageSigner = messageAccount;\n break;\n }\n case Messenger.CCTP:\n case Messenger.CCTP_V2: {\n const swapAndBridgeSolData = await this.prepareSwapAndBridgeCctpData(solTxSendParams);\n const { transaction, messageSentEventDataKeypair } = await this.buildSwapAndBridgeCctpTransaction(\n params.destinationToken.chainSymbol,\n swapAndBridgeSolData\n );\n swapAndBridgeTx = transaction;\n requiredMessageSigner = messageSentEventDataKeypair;\n break;\n }\n case Messenger.OFT:\n throw new OFTDoesNotSupportedError(\"Messenger OFT is not supported yet.\");\n }\n\n if (isJupiterForStableCoin) {\n if (!jupTx) {\n throw new JupiterError(\"Swap tx is absent\");\n }\n swapAndBridgeTx = await this.jupiterService.amendJupiterWithSdkTx(jupTx, swapAndBridgeTx);\n }\n\n await addUnitLimitAndUnitPriceToVersionedTx(swapAndBridgeTx, params.txFeeParams, this.solanaRpcUrl);\n\n if (requiredMessageSigner) {\n swapAndBridgeTx.sign([requiredMessageSigner]);\n }\n return swapAndBridgeTx;\n }\n\n private async processJup(\n solTxSendParams: SolTxSendParams,\n params: SendParams,\n exactOut: boolean\n ): Promise<{\n tx: VersionedTransaction;\n solTxSendUpdatedParams: {\n amount: string;\n fee: string;\n extraGas?: string;\n gasFeePaymentMethod: FeePaymentMethod;\n };\n }> {\n const { fee, extraGas, gasFeePaymentMethod } = await this.convertStableCoinFeeAndExtraGasToNativeCurrency(\n params.sourceToken,\n solTxSendParams\n );\n\n let amountToProcess = exactOut ? Big(fee) : Big(solTxSendParams.fee);\n if (extraGas) {\n amountToProcess = amountToProcess.plus(extraGas);\n }\n if (!exactOut) {\n amountToProcess = amountToProcess.mul(JUP_ADD_INDEX);\n }\n\n const { tx, amountIn } = await this.jupiterService.getJupiterSwapTx(\n params.fromAccountAddress,\n params.sourceToken.tokenAddress,\n amountToProcess.toFixed(0),\n exactOut\n );\n\n let newAmount: string;\n if (exactOut) {\n if (!amountIn) {\n throw new JupiterError(\"Cannot get inAmount\");\n }\n newAmount = Big(solTxSendParams.amount).minus(Big(amountIn).mul(JUP_ADD_INDEX)).toFixed(0);\n } else {\n newAmount = Big(solTxSendParams.amount).minus(amountToProcess).toFixed(0);\n }\n if (Big(newAmount).lte(0)) {\n throw new AmountNotEnoughError(\n `Amount not enough to pay fee, ${convertIntAmountToFloat(\n Big(newAmount).minus(1).neg(),\n params.sourceToken.decimals\n ).toFixed()} stables is missing`\n );\n }\n return {\n tx: tx,\n solTxSendUpdatedParams: {\n amount: newAmount,\n fee: fee,\n extraGas: extraGas,\n gasFeePaymentMethod: gasFeePaymentMethod,\n },\n };\n }\n\n private addPoolAddress(params: SendParams, txSendParams: TxSendParamsSol): SolTxSendParams {\n return {\n ...txSendParams,\n poolAddress: params.sourceToken.poolAddress,\n };\n }\n\n async convertStableCoinFeeAndExtraGasToNativeCurrency(\n sourceToken: TokenWithChainDetails,\n solTxSendParams: SolTxSendParams\n ): Promise<{ fee: string; extraGas?: string; gasFeePaymentMethod: FeePaymentMethod }> {\n if (solTxSendParams.gasFeePaymentMethod == FeePaymentMethod.WITH_STABLECOIN) {\n const sourceNativeTokenPrice = (\n await this.api.getReceiveTransactionCost({\n sourceChainId: solTxSendParams.fromChainId,\n destinationChainId: solTxSendParams.toChainId,\n messenger: solTxSendParams.messenger,\n sourceToken: sourceToken.tokenAddress,\n })\n ).sourceNativeTokenPrice;\n const fee = Big(solTxSendParams.fee)\n .div(sourceNativeTokenPrice)\n .mul(Big(10).pow(Chains.getChainDecimalsByType(ChainType.SOLANA) - sourceToken.decimals))\n .toFixed(0);\n let extraGas;\n if (solTxSendParams.extraGas) {\n extraGas = Big(solTxSendParams.extraGas)\n .div(sourceNativeTokenPrice)\n .mul(Big(10).pow(Chains.getChainDecimalsByType(ChainType.SOLANA) - sourceToken.decimals))\n .toFixed(0);\n }\n return { fee, extraGas, gasFeePaymentMethod: FeePaymentMethod.WITH_NATIVE_CURRENCY };\n }\n return {\n fee: solTxSendParams.fee,\n extraGas: solTxSendParams.extraGas,\n gasFeePaymentMethod: FeePaymentMethod.WITH_NATIVE_CURRENCY,\n };\n }\n\n private getExtraGasInstruction(\n extraGas: string,\n userAccount: PublicKey,\n configAccount: PublicKey\n ): TransactionInstruction | undefined {\n return web3.SystemProgram.transfer({\n fromPubkey: userAccount,\n toPubkey: configAccount,\n lamports: +extraGas,\n });\n }\n\n private async prepareSwapAndBridgeData(txSendParams: SolTxSendParams): Promise<SwapAndBridgeSolData> {\n const {\n amount,\n contractAddress,\n fromChainId,\n fromAccountAddress,\n fromTokenAddress,\n toChainId,\n toAccountAddress,\n toTokenAddress,\n poolAddress,\n extraGas,\n } = txSendParams;\n const tokenAddress = fromTokenAddress;\n const account = fromAccountAddress;\n const destinationChainId = toChainId;\n const receiveTokenAddress = toTokenAddress;\n const receiverInBuffer32 = toAccountAddress;\n const bridgeAddress = contractAddress;\n const sourceChainId = fromChainId;\n\n const provider = buildAnchorProvider(this.solanaRpcUrl, account);\n const bridge = new Program<BridgeType>(bridgeIdl, bridgeAddress, provider);\n const nonce = Array.from(getNonce());\n const poolAccount = new PublicKey(poolAddress);\n const vUsdAmount = await getVUsdAmount(amount, bridge, poolAccount);\n\n const lockAccount = await getLockAccount(nonce, bridge.programId);\n const bridgeAuthority = await getAuthorityAccount(bridge.programId);\n const userToken = await getAssociatedAccount(new PublicKey(account), new PublicKey(tokenAddress));\n const bridgeTokenAccount = await getBridgeTokenAccount(new PublicKey(tokenAddress), bridge.programId);\n const chainBridgeAccount = await getChainBridgeAccount(destinationChainId, bridge.programId);\n const otherBridgeTokenAccount = await getOtherChainTokenAccount(\n destinationChainId,\n Buffer.from(receiveTokenAddress),\n bridge.programId\n );\n\n const configAccount = await getConfigAccount(bridge.programId);\n const configAccountInfo = await bridge.account.config.fetch(configAccount);\n const priceAccount = await getPriceAccount(destinationChainId, configAccountInfo.gasOracleProgramId);\n const thisGasPriceAccount = await getPriceAccount(sourceChainId, configAccountInfo.gasOracleProgramId);\n\n const message = getMessage({\n amount: vUsdAmount,\n recipient: Buffer.from(receiverInBuffer32),\n nonce: Buffer.from(nonce),\n receiveToken: Buffer.from(receiveTokenAddress),\n destinationChainId,\n sourceChainId,\n chainBridge: (await getAuthorityAccount(bridge.programId)).toBuffer(),\n });\n\n const swapAndBridgeData = {} as SwapAndBridgeSolData;\n\n swapAndBridgeData.bridge = bridge;\n swapAndBridgeData.amount = new BN(amount);\n swapAndBridgeData.vusdAmount = new BN(vUsdAmount);\n swapAndBridgeData.nonce = nonce;\n swapAndBridgeData.recipient = Array.from(receiverInBuffer32);\n swapAndBridgeData.receiveToken = Array.from(receiveTokenAddress);\n swapAndBridgeData.poolAccount = poolAccount;\n swapAndBridgeData.lockAccount = lockAccount;\n swapAndBridgeData.bridgeAuthority = bridgeAuthority;\n swapAndBridgeData.userToken = userToken;\n swapAndBridgeData.bridgeTokenAccount = bridgeTokenAccount;\n swapAndBridgeData.chainBridgeAccount = chainBridgeAccount;\n swapAndBridgeData.otherBridgeTokenAccount = otherBridgeTokenAccount;\n swapAndBridgeData.userAccount = new PublicKey(account);\n swapAndBridgeData.destinationChainId = destinationChainId;\n // @ts-expect-error\n swapAndBridgeData.mint = new PublicKey(tokenAddress);\n swapAndBridgeData.config = configAccount;\n swapAndBridgeData.configAccountInfo = configAccountInfo;\n swapAndBridgeData.gasPrice = priceAccount;\n swapAndBridgeData.thisGasPrice = thisGasPriceAccount;\n swapAndBridgeData.message = message;\n\n if (extraGas) {\n swapAndBridgeData.extraGasInstruction = this.getExtraGasInstruction(\n extraGas,\n swapAndBridgeData.userAccount,\n configAccount\n );\n }\n return swapAndBridgeData;\n }\n\n private async buildSwapAndBridgeAllbridgeTransaction(\n swapAndBridgeData: SwapAndBridgeSolData\n ): Promise<VersionedTransaction> {\n const {\n bridge,\n vusdAmount,\n nonce,\n recipient,\n receiveToken,\n poolAccount,\n lockAccount,\n bridgeAuthority,\n userToken,\n bridgeTokenAccount,\n chainBridgeAccount,\n otherBridgeTokenAccount,\n userAccount,\n destinationChainId,\n mint,\n config,\n configAccountInfo,\n gasPrice,\n thisGasPrice,\n message,\n extraGasInstruction,\n } = swapAndBridgeData;\n const allbridgeMessengerProgramId = configAccountInfo.allbridgeMessengerProgramId;\n const messengerGasUsageAccount = await getGasUsageAccount(destinationChainId, allbridgeMessengerProgramId);\n const messengerConfig = await getConfigAccount(allbridgeMessengerProgramId);\n\n const sentMessageAccount = await getSendMessageAccount(message, allbridgeMessengerProgramId);\n\n const instructions: TransactionInstruction[] = [];\n if (extraGasInstruction) {\n instructions.push(extraGasInstruction);\n }\n\n const transaction = await bridge.methods\n .swapAndBridge({\n vusdAmount,\n nonce,\n destinationChainId,\n recipient,\n receiveToken,\n })\n .accounts({\n mint,\n user: userAccount,\n config,\n lock: lockAccount,\n pool: poolAccount,\n gasPrice,\n thisGasPrice,\n bridgeAuthority,\n userToken,\n bridgeToken: bridgeTokenAccount,\n chainBridge: chainBridgeAccount,\n messenger: allbridgeMessengerProgramId,\n messengerGasUsage: messengerGasUsageAccount,\n messengerConfig,\n sentMessageAccount,\n otherBridgeToken: otherBridgeTokenAccount,\n })\n .preInstructions([\n web3.ComputeBudgetProgram.setComputeUnitLimit({\n units: COMPUTE_UNIT_LIMIT,\n }),\n ])\n .postInstructions(instructions)\n .transaction();\n const connection = buildAnchorProvider(this.solanaRpcUrl, userAccount.toString()).connection;\n transaction.recentBlockhash = (await connection.getLatestBlockhash()).blockhash;\n transaction.feePayer = userAccount;\n return await this.convertToVersionedTransaction(transaction, connection);\n }\n\n private async convertToVersionedTransaction(tx: Transaction, connection: Connection): Promise<VersionedTransaction> {\n const allbridgeTableAccount = await connection\n .getAddressLookupTable(new PublicKey(this.params.solanaLookUpTable))\n .then((res) => res.value);\n if (!allbridgeTableAccount) {\n throw new SdkError(\"Cannot find allbridgeLookupTableAccount\");\n }\n const messageV0 = new web3.TransactionMessage({\n payerKey: tx.feePayer,\n recentBlockhash: tx.recentBlockhash,\n instructions: tx.instructions,\n } as TransactionMessageArgs).compileToV0Message([allbridgeTableAccount]);\n return new web3.VersionedTransaction(messageV0);\n }\n\n private async buildSwapAndBridgeWormholeTransaction(\n swapAndBridgeData: SwapAndBridgeSolData\n ): Promise<{ transaction: VersionedTransaction; messageAccount: Keypair }> {\n const {\n bridge,\n vusdAmount,\n nonce,\n recipient,\n receiveToken,\n poolAccount,\n lockAccount,\n bridgeAuthority,\n userToken,\n bridgeTokenAccount,\n chainBridgeAccount,\n otherBridgeTokenAccount,\n userAccount,\n destinationChainId,\n mint,\n config,\n configAccountInfo,\n gasPrice,\n thisGasPrice,\n message,\n extraGasInstruction,\n } = swapAndBridgeData;\n const wormholeProgramId = this.params.wormholeMessengerProgramId;\n\n const [whBridgeAccount] = PublicKey.findProgramAddressSync(\n [Buffer.from(\"Bridge\")],\n new PublicKey(wormholeProgramId)\n );\n const [whFeeCollectorAccount] = PublicKey.findProgramAddressSync(\n [Buffer.from(\"fee_collector\")],\n new PublicKey(wormholeProgramId)\n );\n const [whSequenceAccount] = PublicKey.findProgramAddressSync(\n [Buffer.from(\"Sequence\"), bridgeAuthority.toBuffer()],\n new PublicKey(wormholeProgramId)\n );\n\n const messengerGasUsageAccount = await getGasUsageAccount(\n destinationChainId,\n configAccountInfo.wormholeMessengerProgramId\n );\n const wormholeMessengerConfigAccount = await getConfigAccount(configAccountInfo.wormholeMessengerProgramId);\n const messageAccount = Keypair.generate();\n\n const provider = buildAnchorProvider(this.solanaRpcUrl, userAccount.toString());\n\n const bridgeAccountInfo = await provider.connection.getAccountInfo(whBridgeAccount);\n if (bridgeAccountInfo == null) {\n throw new SdkError(\"Cannot fetch wormhole bridge account info\");\n }\n const feeLamports = new BN(bridgeAccountInfo.data.slice(16, 24), \"le\").toString();\n\n const feeInstruction = SystemProgram.transfer({\n fromPubkey: userAccount,\n toPubkey: whFeeCollectorAccount,\n lamports: +feeLamports,\n });\n\n const instructions: TransactionInstruction[] = [];\n if (extraGasInstruction) {\n instructions.push(extraGasInstruction);\n }\n\n const accounts = {\n mint,\n user: userAccount,\n config,\n lock: lockAccount,\n pool: poolAccount,\n gasPrice,\n thisGasPrice,\n bridgeAuthority,\n userToken,\n bridgeToken: bridgeTokenAccount,\n chainBridge: chainBridgeAccount,\n otherBridgeToken: otherBridgeTokenAccount,\n messengerGasUsage: messengerGasUsageAccount,\n wormholeProgram: wormholeProgramId,\n bridge: whBridgeAccount,\n message: messageAccount.publicKey,\n wormholeMessenger: configAccountInfo.wormholeMessengerProgramId,\n sequence: whSequenceAccount,\n feeCollector: whFeeCollectorAccount,\n wormholeMessengerConfig: wormholeMessengerConfigAccount,\n clock: web3.SYSVAR_CLOCK_PUBKEY,\n };\n\n const transaction = await bridge.methods\n .swapAndBridgeWormhole({\n vusdAmount,\n nonce: nonce,\n destinationChainId,\n recipient,\n receiveToken,\n })\n .accounts(accounts)\n .preInstructions([\n web3.ComputeBudgetProgram.setComputeUnitLimit({\n units: COMPUTE_UNIT_LIMIT,\n }),\n feeInstruction,\n ])\n .postInstructions(instructions)\n .signers([messageAccount])\n .transaction();\n transaction.recentBlockhash = (await provider.connection.getLatestBlockhash()).blockhash;\n transaction.feePayer = userAccount;\n return { transaction: await this.convertToVersionedTransaction(transaction, provider.connection), messageAccount };\n }\n\n private async prepareSwapAndBridgeCctpData(txSendParams: SolTxSendParams): Promise<SwapAndBridgeSolDataCctpData> {\n const {\n contractAddress,\n amount,\n fromAccountAddress,\n fromTokenAddress,\n toChainId,\n toAccountAddress,\n toTokenAddress,\n extraGas,\n } = txSendParams;\n const cctpAddress = contractAddress;\n if (!cctpAddress) {\n throw new CCTPDoesNotSupportedError(\"Such route does not support CCTP protocol\");\n }\n const CHAIN_ID = 4;\n\n const account = fromAccountAddress;\n const receiveTokenAddress = toTokenAddress;\n const receiverInBuffer32 = toAccountAddress;\n\n const provider = buildAnchorProvider(this.solanaRpcUrl, account);\n const cctpBridge: Program<CctpBridgeType> = new Program<CctpBridgeType>(cctpBridgeIdl, cctpAddress, provider);\n const mint = new PublicKey(fromTokenAddress);\n const cctpBridgeAccount = await getCctpBridgeAccount(mint, cctpBridge.programId);\n const userAccount = new PublicKey(account);\n\n const configAccountInfo = await cctpBridge.account.cctpBridge.fetch(cctpBridgeAccount);\n\n const swapAndBridgeData = {} as SwapAndBridgeSolDataCctpData;\n\n swapAndBridgeData.cctpBridge = cctpBridge;\n swapAndBridgeData.cctpBridgeAccount = cctpBridgeAccount;\n swapAndBridgeData.cctpAddressAccount = new PublicKey(cctpAddress);\n swapAndBridgeData.amount = new BN(amount);\n swapAndBridgeData.recipient = Array.from(receiverInBuffer32);\n swapAndBridgeData.receiveToken = Array.from(receiveTokenAddress);\n swapAndBridgeData.userToken = await getAssociatedAccount(userAccount, mint);\n swapAndBridgeData.bridgeAuthority = await getCctpAuthorityAccount(cctpBridgeAccount, cctpBridge.programId);\n swapAndBridgeData.bridgeTokenAccount = await getCctpBridgeTokenAccount(mint, cctpBridge.programId);\n swapAndBridgeData.chainBridgeAccount = await getChainBridgeAccount(toChainId, cctpBridge.programId);\n swapAndBridgeData.userAccount = userAccount;\n swapAndBridgeData.destinationChainId = toChainId;\n swapAndBridgeData.mint = mint;\n swapAndBridgeData.gasPrice = await getPriceAccount(toChainId, configAccountInfo.gasOracleProgramId);\n swapAndBridgeData.thisGasPrice = await getPriceAccount(CHAIN_ID, configAccountInfo.gasOracleProgramId);\n swapAndBridgeData.provider = provider;\n\n if (extraGas) {\n swapAndBridgeData.extraGasInstruction = this.getExtraGasInstruction(\n extraGas,\n swapAndBridgeData.userAccount,\n cctpBridgeAccount\n );\n }\n return swapAndBridgeData;\n }\n\n async buildSwapAndBridgeCctpTransaction(\n destinationChainSymbol: string,\n swapAndBridgeData: SwapAndBridgeSolDataCctpData\n ): Promise<{ transaction: VersionedTransaction; messageSentEventDataKeypair: Keypair }> {\n const {\n cctpBridge,\n cctpBridgeAccount,\n amount,\n recipient,\n receiveToken,\n bridgeAuthority,\n userToken,\n bridgeTokenAccount,\n chainBridgeAccount,\n userAccount,\n destinationChainId,\n mint,\n gasPrice,\n thisGasPrice,\n extraGasInstruction,\n provider,\n } = swapAndBridgeData;\n const domain = this.params.cctpParams.cctpDomains[destinationChainSymbol];\n const cctpTransmitterProgramIdAddress = this.params.cctpParams.cctpTransmitterProgramId;\n const cctpTokenMessengerMinterAddress = this.params.cctpParams.cctpTokenMessengerMinter;\n if (domain == undefined || !cctpTransmitterProgramIdAddress || !cctpTokenMessengerMinterAddress) {\n throw new SdkError(\"CCTP is not configured\");\n }\n const cctpTransmitterProgramId = new PublicKey(cctpTransmitterProgramIdAddress);\n const cctpTokenMessengerMinter = new PublicKey(cctpTokenMessengerMinterAddress);\n const {\n messageTransmitterAccount,\n tokenMessenger,\n tokenMessengerEventAuthority,\n tokenMinter,\n localToken,\n remoteTokenMessengerKey,\n authorityPda,\n } = getCctpAccounts(domain, mint, cctpTransmitterProgramId, cctpTokenMessengerMinter);\n\n const instructions: TransactionInstruction[] = [];\n if (extraGasInstruction) {\n instructions.push(extraGasInstruction);\n }\n\n const messageSentEventDataKeypair = Keypair.generate();\n const lockAccount = getCctpLockAccount(cctpBridge.programId, messageSentEventDataKeypair.publicKey);\n\n const tx = await cctpBridge.methods\n .bridge({\n amount,\n destinationChainId,\n recipient,\n receiveToken,\n })\n .accounts({\n mint: mint,\n user: userAccount,\n cctpBridge: cctpBridgeAccount,\n\n messageSentEventData: messageSentEventDataKeypair.publicKey,\n lock: lockAccount,\n\n cctpMessenger: cctpTokenMessengerMinter,\n messageTransmitterProgram: cctpTransmitterProgramId,\n messageTransmitterAccount: messageTransmitterAccount,\n tokenMessenger: tokenMessenger,\n tokenMinter: tokenMinter,\n localToken: localToken,\n remoteTokenMessengerKey: remoteTokenMessengerKey,\n authorityPda: authorityPda,\n eventAuthority: tokenMessengerEventAuthority,\n\n bridgeToken: bridgeTokenAccount,\n gasPrice: gasPrice,\n thisGasPrice: thisGasPrice,\n chainBridge: chainBridgeAccount,\n userToken,\n bridgeAuthority: bridgeAuthority,\n })\n .preInstructions([\n web3.ComputeBudgetProgram.setComputeUnitLimit({\n units: 2000000,\n }),\n ])\n .postInstructions(instructions)\n .transaction();\n const connection = provider.connection;\n tx.recentBlockhash = (await connection.getLatestBlockhash()).blockhash;\n tx.feePayer = userAccount;\n return { transaction: await this.convertToVersionedTransaction(tx, connection), messageSentEventDataKeypair };\n }\n\n send(params: SendParams): Promise<TransactionResponse> {\n throw new MethodNotSupportedError();\n }\n}\n\ninterface SolTxSendParams extends TxSendParamsSol {\n poolAddress: string;\n}\n", "export interface Bridge {\n version: \"0.1.0\";\n name: \"bridge\";\n instructions: [\n {\n name: \"initialize\";\n accounts: [\n {\n name: \"admin\";\n isMut: true;\n isSigner: true;\n },\n {\n name: \"config\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"systemProgram\";\n isMut: false;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"args\";\n type: {\n defined: \"InitializeArgs\";\n };\n },\n ];\n },\n {\n name: \"initializePool\";\n accounts: [\n {\n name: \"payer\";\n isMut: true;\n isSigner: true;\n },\n {\n name: \"admin\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"config\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"pool\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"bridgeAuthority\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"mint\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"token\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"tokenProgram\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"systemProgram\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"rent\";\n isMut: false;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"args\";\n type: {\n defined: \"InitializePoolArgs\";\n };\n },\n ];\n },\n {\n name: \"initDepositAccount\";\n accounts: [\n {\n name: \"user\";\n isMut: true;\n isSigner: true;\n },\n {\n name: \"payer\";\n isMut: true;\n isSigner: true;\n },\n {\n name: \"mint\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"userDeposit\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"systemProgram\";\n isMut: false;\n isSigner: false;\n },\n ];\n args: [];\n },\n {\n name: \"deposit\";\n accounts: [\n {\n name: \"user\";\n isMut: true;\n isSigner: true;\n },\n {\n name: \"mint\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"config\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"pool\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"bridgeToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"userToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"userDeposit\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"bridgeAuthority\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"tokenProgram\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"systemProgram\";\n isMut: false;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"amount\";\n type: \"u64\";\n },\n ];\n },\n {\n name: \"withdraw\";\n accounts: [\n {\n name: \"user\";\n isMut: true;\n isSigner: true;\n },\n {\n name: \"mint\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"config\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"pool\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"bridgeToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"userToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"userDeposit\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"bridgeAuthority\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"tokenProgram\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"systemProgram\";\n isMut: false;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"amountLp\";\n type: \"u64\";\n },\n ];\n },\n {\n name: \"swapAndBridge\";\n accounts: [\n {\n name: \"user\";\n isMut: true;\n isSigner: true;\n },\n {\n name: \"payer\";\n isMut: true;\n isSigner: true;\n },\n {\n name: \"lock\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"mint\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"config\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"otherBridgeToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"messenger\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"messengerConfig\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"sentMessageAccount\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"messengerGasUsage\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"pool\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"bridgeToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"gasPrice\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"thisGasPrice\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"chainBridge\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"userToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"bridgeAuthority\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"tokenProgram\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"systemProgram\";\n isMut: false;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"args\";\n type: {\n defined: \"BridgeArgs\";\n };\n },\n ];\n },\n {\n name: \"swapAndBridgeWormhole\";\n accounts: [\n {\n name: \"user\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"payer\";\n isMut: true;\n isSigner: true;\n },\n {\n name: \"lock\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"mint\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"config\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"otherBridgeToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"pool\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"bridgeToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"gasPrice\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"thisGasPrice\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"chainBridge\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"userToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"bridgeAuthority\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"wormholeMessenger\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"wormholeMessengerConfig\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"wormholeProgram\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"bridge\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"message\";\n isMut: true;\n isSigner: true;\n },\n {\n name: \"sequence\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"feeCollector\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"messengerGasUsage\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"clock\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"rent\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"tokenProgram\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"systemProgram\";\n isMut: false;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"args\";\n type: {\n defined: \"BridgeArgs\";\n };\n },\n ];\n },\n {\n name: \"swap\";\n accounts: [\n {\n name: \"user\";\n isMut: true;\n isSigner: true;\n },\n {\n name: \"payer\";\n isMut: true;\n isSigner: true;\n },\n {\n name: \"sendMint\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"receiveMint\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"config\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"sendPool\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"receivePool\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"sendBridgeToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"receiveBridgeToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"sendUserToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"receiveUserToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"bridgeAuthority\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"tokenProgram\";\n isMut: false;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"amount\";\n type: \"u64\";\n },\n {\n name: \"receiveAmountMin\";\n type: \"u64\";\n },\n ];\n },\n {\n name: \"registerChainBridge\";\n accounts: [\n {\n name: \"admin\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"payer\";\n isMut: true;\n isSigner: true;\n },\n {\n name: \"config\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"chainBridge\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"systemProgram\";\n isMut: false;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"args\";\n type: {\n defined: \"RegisterChainBridgeArgs\";\n };\n },\n ];\n },\n {\n name: \"updateChainBridge\";\n accounts: [\n {\n name: \"admin\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"config\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"chainBridge\";\n isMut: true;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"args\";\n type: {\n defined: \"UpdateChainBridgeArgs\";\n };\n },\n ];\n },\n {\n name: \"receiveAndSwap\";\n accounts: [\n {\n name: \"user\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"payer\";\n isMut: true;\n isSigner: true;\n },\n {\n name: \"mint\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"config\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"pool\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"bridgeToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"receivedMessageAccount\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"unlock\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"chainBridge\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"userToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"bridgeAuthority\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"tokenProgram\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"systemProgram\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"messengerProgram\";\n isMut: false;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"args\";\n type: {\n defined: \"UnlockArgs\";\n };\n },\n ];\n },\n {\n name: \"receiveAndSwapWormhole\";\n accounts: [\n {\n name: \"user\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"payer\";\n isMut: true;\n isSigner: true;\n },\n {\n name: \"mint\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"config\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"pool\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"bridgeToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"receivedMessageAccount\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"unlock\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"chainBridge\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"userToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"bridgeAuthority\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"tokenProgram\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"systemProgram\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"messengerProgram\";\n isMut: false;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"args\";\n type: {\n defined: \"UnlockArgs\";\n };\n },\n ];\n },\n {\n name: \"withdrawGasToken\";\n accounts: [\n {\n name: \"admin\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"recipient\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"config\";\n isMut: true;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"amount\";\n type: \"u64\";\n },\n ];\n },\n {\n name: \"claimRewards\";\n accounts: [\n {\n name: \"user\";\n isMut: true;\n isSigner: true;\n },\n {\n name: \"mint\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"config\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"pool\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"bridgeToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"userToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"userDeposit\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"bridgeAuthority\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"tokenProgram\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"systemProgram\";\n isMut: false;\n isSigner: false;\n },\n ];\n args: [];\n },\n {\n name: \"setAdmin\";\n accounts: [\n {\n name: \"admin\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"newAdmin\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"config\";\n isMut: true;\n isSigner: false;\n },\n ];\n args: [];\n },\n {\n name: \"startBridge\";\n accounts: [\n {\n name: \"admin\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"config\";\n isMut: true;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"actionType\";\n type: {\n defined: \"ActionType\";\n };\n },\n ];\n },\n {\n name: \"stopBridge\";\n accounts: [\n {\n name: \"stopAuthority\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"config\";\n isMut: true;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"actionType\";\n type: {\n defined: \"ActionType\";\n };\n },\n ];\n },\n {\n name: \"setRebalancer\";\n accounts: [\n {\n name: \"admin\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"config\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"rebalancer\";\n isMut: false;\n isSigner: false;\n },\n ];\n args: [];\n },\n {\n name: \"setStopAuthority\";\n accounts: [\n {\n name: \"admin\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"newAuthority\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"config\";\n isMut: true;\n isSigner: false;\n },\n ];\n args: [];\n },\n {\n name: \"setAllbridgeMessengerProgramId\";\n accounts: [\n {\n name: \"admin\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"config\";\n isMut: true;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"newProgramId\";\n type: \"publicKey\";\n },\n ];\n },\n {\n name: \"setWormholeMessengerProgramId\";\n accounts: [\n {\n name: \"admin\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"config\";\n isMut: true;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"newProgramId\";\n type: \"publicKey\";\n },\n ];\n },\n {\n name: \"setGasOracleProgramId\";\n accounts: [\n {\n name: \"admin\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"config\";\n isMut: true;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"newProgramId\";\n type: \"publicKey\";\n },\n ];\n },\n {\n name: \"setPoolFeeShare\";\n accounts: [\n {\n name: \"admin\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"config\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"pool\";\n isMut: true;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"feeShareBp\";\n type: \"u64\";\n },\n ];\n },\n {\n name: \"setBalanceRatioMin\";\n accounts: [\n {\n name: \"admin\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"config\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"pool\";\n isMut: true;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"balanceRatioMinBp\";\n type: \"u16\";\n },\n ];\n },\n {\n name: \"setPoolAdminFeeShare\";\n accounts: [\n {\n name: \"admin\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"config\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"pool\";\n isMut: true;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"feeShareBp\";\n type: \"u64\";\n },\n ];\n },\n {\n name: \"addOtherBridgeToken\";\n accounts: [\n {\n name: \"admin\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"payer\";\n isMut: true;\n isSigner: true;\n },\n {\n name: \"config\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"otherBridgeToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"systemProgram\";\n isMut: false;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"chainId\";\n type: \"u8\";\n },\n {\n name: \"tokenAddress\";\n type: {\n array: [\"u8\", 32];\n };\n },\n ];\n },\n {\n name: \"removeOtherBridgeToken\";\n accounts: [\n {\n name: \"admin\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"payer\";\n isMut: true;\n isSigner: true;\n },\n {\n name: \"config\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"otherBridgeToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"systemProgram\";\n isMut: false;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"chainId\";\n type: \"u8\";\n },\n {\n name: \"tokenAddress\";\n type: {\n array: [\"u8\", 32];\n };\n },\n ];\n },\n {\n name: \"withdrawAdminFee\";\n accounts: [\n {\n name: \"admin\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"mint\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"config\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"pool\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"bridgeToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"adminToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"bridgeAuthority\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"tokenProgram\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"systemProgram\";\n isMut: false;\n isSigner: false;\n },\n ];\n args: [];\n },\n {\n name: \"adjustTotalLpAmount\";\n accounts: [\n {\n name: \"admin\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"mint\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"config\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"pool\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"bridgeToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"userToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"userDeposit\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"bridgeAuthority\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"tokenProgram\";\n isMut: false;\n isSigner: false;\n },\n ];\n args: [];\n },\n ];\n accounts: [\n {\n name: \"chainBridge\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"address\";\n type: {\n array: [\"u8\", 32];\n };\n },\n {\n name: \"chainId\";\n type: \"u8\";\n },\n {\n name: \"gasUsage\";\n type: \"u64\";\n },\n ];\n };\n },\n {\n name: \"config\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"admin\";\n type: \"publicKey\";\n },\n {\n name: \"allbridgeMessengerProgramId\";\n type: \"publicKey\";\n },\n {\n name: \"wormholeMessengerProgramId\";\n type: \"publicKey\";\n },\n {\n name: \"gasOracleProgramId\";\n type: \"publicKey\";\n },\n {\n name: \"rebalancer\";\n type: \"publicKey\";\n },\n {\n name: \"stopAuthority\";\n type: \"publicKey\";\n },\n {\n name: \"authorityBumpSeed\";\n type: \"u8\";\n },\n {\n name: \"canSwap\";\n type: \"bool\";\n },\n {\n name: \"canDeposit\";\n type: \"bool\";\n },\n {\n name: \"canWithdraw\";\n type: \"bool\";\n },\n ];\n };\n },\n {\n name: \"lock\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"sender\";\n type: \"publicKey\";\n },\n {\n name: \"sentTokenAddress\";\n type: \"publicKey\";\n },\n {\n name: \"amount\";\n type: \"u64\";\n },\n {\n name: \"vusdAmount\";\n type: \"u64\";\n },\n {\n name: \"recipient\";\n type: {\n array: [\"u8\", 32];\n };\n },\n {\n name: \"destinationChainId\";\n type: \"u8\";\n },\n {\n name: \"receiveToken\";\n type: {\n array: [\"u8\", 32];\n };\n },\n {\n name: \"nonce\";\n type: {\n array: [\"u8\", 32];\n };\n },\n {\n name: \"messenger\";\n type: {\n defined: \"Messenger\";\n };\n },\n {\n name: \"slot\";\n type: \"u64\";\n },\n {\n name: \"fee\";\n type: \"u64\";\n },\n ];\n };\n },\n {\n name: \"otherBridgeToken\";\n type: {\n kind: \"struct\";\n fields: [];\n };\n },\n {\n name: \"pool\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"mint\";\n type: \"publicKey\";\n },\n {\n name: \"a\";\n type: \"u64\";\n },\n {\n name: \"d\";\n type: \"u64\";\n },\n {\n name: \"tokenBalance\";\n type: \"u64\";\n },\n {\n name: \"vUsdBalance\";\n type: \"u64\";\n },\n {\n name: \"reserves\";\n type: \"u64\";\n },\n {\n name: \"decimals\";\n type: \"u8\";\n },\n {\n name: \"totalLpAmount\";\n type: \"u64\";\n },\n {\n name: \"feeShareBp\";\n type: \"u64\";\n },\n {\n name: \"adminFeeShareBp\";\n type: \"u64\";\n },\n {\n name: \"accRewardPerShareP\";\n type: \"u128\";\n },\n {\n name: \"adminFeeAmount\";\n type: \"u64\";\n },\n {\n name: \"balanceRatioMinBp\";\n type: \"u16\";\n },\n ];\n };\n },\n {\n name: \"unlock\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"hash\";\n type: {\n array: [\"u8\", 32];\n };\n },\n {\n name: \"amount\";\n type: \"u64\";\n },\n {\n name: \"fee\";\n type: \"u64\";\n },\n {\n name: \"vUsdAmount\";\n type: \"u64\";\n },\n {\n name: \"slot\";\n type: \"u64\";\n },\n ];\n };\n },\n {\n name: \"userDeposit\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"userAddress\";\n type: \"publicKey\";\n },\n {\n name: \"mint\";\n type: \"publicKey\";\n },\n {\n name: \"lpAmount\";\n type: \"u64\";\n },\n {\n name: \"rewardDebt\";\n type: \"u64\";\n },\n ];\n };\n },\n ];\n types: [\n {\n name: \"RegisterChainBridgeArgs\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"chainBridgeAddress\";\n type: {\n array: [\"u8\", 32];\n };\n },\n {\n name: \"chainId\";\n type: \"u8\";\n },\n {\n name: \"gasUsage\";\n type: \"u64\";\n },\n ];\n };\n },\n {\n name: \"UpdateChainBridgeArgs\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"chainBridgeAddress\";\n type: {\n array: [\"u8\", 32];\n };\n },\n {\n name: \"chainId\";\n type: \"u8\";\n },\n {\n name: \"gasUsage\";\n type: \"u64\";\n },\n ];\n };\n },\n {\n name: \"InitializeArgs\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"allbridgeMessengerProgramId\";\n type: \"publicKey\";\n },\n {\n name: \"wormholeMessengerProgramId\";\n type: \"publicKey\";\n },\n {\n name: \"gasOracleProgramId\";\n type: \"publicKey\";\n },\n ];\n };\n },\n {\n name: \"InitializePoolArgs\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"a\";\n type: \"u64\";\n },\n {\n name: \"feeShareBp\";\n type: \"u64\";\n },\n {\n name: \"adminFeeShareBp\";\n type: \"u64\";\n },\n {\n name: \"balanceRatioMinBp\";\n type: \"u16\";\n },\n ];\n };\n },\n {\n name: \"BridgeArgs\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"nonce\";\n type: {\n array: [\"u8\", 32];\n };\n },\n {\n name: \"recipient\";\n type: {\n array: [\"u8\", 32];\n };\n },\n {\n name: \"destinationChainId\";\n type: \"u8\";\n },\n {\n name: \"receiveToken\";\n type: {\n array: [\"u8\", 32];\n };\n },\n {\n name: \"vusdAmount\";\n type: \"u64\";\n },\n ];\n };\n },\n {\n name: \"UnlockArgs\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"nonce\";\n type: {\n array: [\"u8\", 32];\n };\n },\n {\n name: \"amount\";\n type: \"u64\";\n },\n {\n name: \"recipient\";\n type: \"publicKey\";\n },\n {\n name: \"sourceChainId\";\n type: \"u8\";\n },\n {\n name: \"receiveToken\";\n type: \"publicKey\";\n },\n {\n name: \"messenger\";\n type: {\n defined: \"Messenger\";\n };\n },\n {\n name: \"hash\";\n type: {\n array: [\"u8\", 32];\n };\n },\n {\n name: \"receiveAmountMin\";\n type: \"u64\";\n },\n ];\n };\n },\n {\n name: \"RewardError\";\n type: {\n kind: \"enum\";\n variants: [\n {\n name: \"FeeTooHigh\";\n },\n ];\n };\n },\n {\n name: \"Messenger\";\n type: {\n kind: \"enum\";\n variants: [\n {\n name: \"None\";\n },\n {\n name: \"Allbridge\";\n },\n {\n name: \"Wormhole\";\n },\n ];\n };\n },\n {\n name: \"ActionType\";\n type: {\n kind: \"enum\";\n variants: [\n {\n name: \"Deposit\";\n },\n {\n name: \"Withdraw\";\n },\n {\n name: \"Swap\";\n },\n ];\n };\n },\n ];\n errors: [\n {\n code: 6000;\n name: \"AccountAlreadyInitialized\";\n msg: \"This account has already been initialized\";\n },\n {\n code: 6001;\n name: \"AdminAuthorityInvalid\";\n msg: \"This instruction requires admin authority\";\n },\n {\n code: 6002;\n name: \"InvalidSignature\";\n msg: \"Provided signature has wrong signer or message\";\n },\n {\n code: 6003;\n name: \"InvalidHash\";\n msg: \"Wrong unlock message hash\";\n },\n {\n code: 6004;\n name: \"PoolOverflow\";\n msg: \"PoolInfo overflow\";\n },\n {\n code: 6005;\n name: \"ReservesExhausted\";\n msg: \"Reserves exhausted\";\n },\n {\n code: 6006;\n name: \"ZeroAmount\";\n msg: \"Zero amount\";\n },\n {\n code: 6007;\n name: \"ZeroChanges\";\n msg: \"Zero changes\";\n },\n {\n code: 6008;\n name: \"HighVusdAmount\";\n msg: \"vUSD amount is too high\";\n },\n {\n code: 6009;\n name: \"BalanceRatioExceeded\";\n msg: \"Balance ratio exceeded\";\n },\n {\n code: 6010;\n name: \"InsufficientReceivedAmount\";\n msg: \"Received insufficient amount\";\n },\n {\n code: 6011;\n name: \"ForbiddenAction\";\n msg: \"ForbiddenAction\";\n },\n {\n code: 6012;\n name: \"ValueTooHigh\";\n msg: \"Value is too high\";\n },\n ];\n}\n\nexport const IDL: Bridge = {\n version: \"0.1.0\",\n name: \"bridge\",\n instructions: [\n {\n name: \"initialize\",\n accounts: [\n {\n name: \"admin\",\n isMut: true,\n isSigner: true,\n },\n {\n name: \"config\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"systemProgram\",\n isMut: false,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"args\",\n type: {\n defined: \"InitializeArgs\",\n },\n },\n ],\n },\n {\n name: \"initializePool\",\n accounts: [\n {\n name: \"payer\",\n isMut: true,\n isSigner: true,\n },\n {\n name: \"admin\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"config\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"pool\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"bridgeAuthority\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"mint\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"token\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"tokenProgram\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"systemProgram\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"rent\",\n isMut: false,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"args\",\n type: {\n defined: \"InitializePoolArgs\",\n },\n },\n ],\n },\n {\n name: \"initDepositAccount\",\n accounts: [\n {\n name: \"user\",\n isMut: true,\n isSigner: true,\n },\n {\n name: \"payer\",\n isMut: true,\n isSigner: true,\n },\n {\n name: \"mint\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"userDeposit\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"systemProgram\",\n isMut: false,\n isSigner: false,\n },\n ],\n args: [],\n },\n {\n name: \"deposit\",\n accounts: [\n {\n name: \"user\",\n isMut: true,\n isSigner: true,\n },\n {\n name: \"mint\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"config\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"pool\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"bridgeToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"userToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"userDeposit\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"bridgeAuthority\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"tokenProgram\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"systemProgram\",\n isMut: false,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"amount\",\n type: \"u64\",\n },\n ],\n },\n {\n name: \"withdraw\",\n accounts: [\n {\n name: \"user\",\n isMut: true,\n isSigner: true,\n },\n {\n name: \"mint\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"config\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"pool\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"bridgeToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"userToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"userDeposit\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"bridgeAuthority\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"tokenProgram\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"systemProgram\",\n isMut: false,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"amountLp\",\n type: \"u64\",\n },\n ],\n },\n {\n name: \"swapAndBridge\",\n accounts: [\n {\n name: \"user\",\n isMut: true,\n isSigner: true,\n },\n {\n name: \"payer\",\n isMut: true,\n isSigner: true,\n },\n {\n name: \"lock\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"mint\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"config\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"otherBridgeToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"messenger\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"messengerConfig\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"sentMessageAccount\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"messengerGasUsage\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"pool\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"bridgeToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"gasPrice\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"thisGasPrice\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"chainBridge\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"userToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"bridgeAuthority\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"tokenProgram\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"systemProgram\",\n isMut: false,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"args\",\n type: {\n defined: \"BridgeArgs\",\n },\n },\n ],\n },\n {\n name: \"swapAndBridgeWormhole\",\n accounts: [\n {\n name: \"user\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"payer\",\n isMut: true,\n isSigner: true,\n },\n {\n name: \"lock\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"mint\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"config\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"otherBridgeToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"pool\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"bridgeToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"gasPrice\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"thisGasPrice\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"chainBridge\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"userToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"bridgeAuthority\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"wormholeMessenger\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"wormholeMessengerConfig\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"wormholeProgram\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"bridge\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"message\",\n isMut: true,\n isSigner: true,\n },\n {\n name: \"sequence\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"feeCollector\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"messengerGasUsage\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"clock\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"rent\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"tokenProgram\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"systemProgram\",\n isMut: false,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"args\",\n type: {\n defined: \"BridgeArgs\",\n },\n },\n ],\n },\n {\n name: \"swap\",\n accounts: [\n {\n name: \"user\",\n isMut: true,\n isSigner: true,\n },\n {\n name: \"payer\",\n isMut: true,\n isSigner: true,\n },\n {\n name: \"sendMint\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"receiveMint\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"config\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"sendPool\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"receivePool\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"sendBridgeToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"receiveBridgeToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"sendUserToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"receiveUserToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"bridgeAuthority\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"tokenProgram\",\n isMut: false,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"amount\",\n type: \"u64\",\n },\n {\n name: \"receiveAmountMin\",\n type: \"u64\",\n },\n ],\n },\n {\n name: \"registerChainBridge\",\n accounts: [\n {\n name: \"admin\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"payer\",\n isMut: true,\n isSigner: true,\n },\n {\n name: \"config\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"chainBridge\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"systemProgram\",\n isMut: false,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"args\",\n type: {\n defined: \"RegisterChainBridgeArgs\",\n },\n },\n ],\n },\n {\n name: \"updateChainBridge\",\n accounts: [\n {\n name: \"admin\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"config\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"chainBridge\",\n isMut: true,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"args\",\n type: {\n defined: \"UpdateChainBridgeArgs\",\n },\n },\n ],\n },\n {\n name: \"receiveAndSwap\",\n accounts: [\n {\n name: \"user\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"payer\",\n isMut: true,\n isSigner: true,\n },\n {\n name: \"mint\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"config\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"pool\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"bridgeToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"receivedMessageAccount\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"unlock\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"chainBridge\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"userToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"bridgeAuthority\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"tokenProgram\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"systemProgram\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"messengerProgram\",\n isMut: false,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"args\",\n type: {\n defined: \"UnlockArgs\",\n },\n },\n ],\n },\n {\n name: \"receiveAndSwapWormhole\",\n accounts: [\n {\n name: \"user\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"payer\",\n isMut: true,\n isSigner: true,\n },\n {\n name: \"mint\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"config\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"pool\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"bridgeToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"receivedMessageAccount\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"unlock\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"chainBridge\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"userToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"bridgeAuthority\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"tokenProgram\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"systemProgram\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"messengerProgram\",\n isMut: false,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"args\",\n type: {\n defined: \"UnlockArgs\",\n },\n },\n ],\n },\n {\n name: \"withdrawGasToken\",\n accounts: [\n {\n name: \"admin\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"recipient\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"config\",\n isMut: true,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"amount\",\n type: \"u64\",\n },\n ],\n },\n {\n name: \"claimRewards\",\n accounts: [\n {\n name: \"user\",\n isMut: true,\n isSigner: true,\n },\n {\n name: \"mint\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"config\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"pool\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"bridgeToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"userToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"userDeposit\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"bridgeAuthority\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"tokenProgram\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"systemProgram\",\n isMut: false,\n isSigner: false,\n },\n ],\n args: [],\n },\n {\n name: \"setAdmin\",\n accounts: [\n {\n name: \"admin\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"newAdmin\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"config\",\n isMut: true,\n isSigner: false,\n },\n ],\n args: [],\n },\n {\n name: \"startBridge\",\n accounts: [\n {\n name: \"admin\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"config\",\n isMut: true,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"actionType\",\n type: {\n defined: \"ActionType\",\n },\n },\n ],\n },\n {\n name: \"stopBridge\",\n accounts: [\n {\n name: \"stopAuthority\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"config\",\n isMut: true,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"actionType\",\n type: {\n defined: \"ActionType\",\n },\n },\n ],\n },\n {\n name: \"setRebalancer\",\n accounts: [\n {\n name: \"admin\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"config\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"rebalancer\",\n isMut: false,\n isSigner: false,\n },\n ],\n args: [],\n },\n {\n name: \"setStopAuthority\",\n accounts: [\n {\n name: \"admin\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"newAuthority\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"config\",\n isMut: true,\n isSigner: false,\n },\n ],\n args: [],\n },\n {\n name: \"setAllbridgeMessengerProgramId\",\n accounts: [\n {\n name: \"admin\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"config\",\n isMut: true,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"newProgramId\",\n type: \"publicKey\",\n },\n ],\n },\n {\n name: \"setWormholeMessengerProgramId\",\n accounts: [\n {\n name: \"admin\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"config\",\n isMut: true,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"newProgramId\",\n type: \"publicKey\",\n },\n ],\n },\n {\n name: \"setGasOracleProgramId\",\n accounts: [\n {\n name: \"admin\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"config\",\n isMut: true,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"newProgramId\",\n type: \"publicKey\",\n },\n ],\n },\n {\n name: \"setPoolFeeShare\",\n accounts: [\n {\n name: \"admin\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"config\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"pool\",\n isMut: true,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"feeShareBp\",\n type: \"u64\",\n },\n ],\n },\n {\n name: \"setBalanceRatioMin\",\n accounts: [\n {\n name: \"admin\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"config\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"pool\",\n isMut: true,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"balanceRatioMinBp\",\n type: \"u16\",\n },\n ],\n },\n {\n name: \"setPoolAdminFeeShare\",\n accounts: [\n {\n name: \"admin\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"config\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"pool\",\n isMut: true,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"feeShareBp\",\n type: \"u64\",\n },\n ],\n },\n {\n name: \"addOtherBridgeToken\",\n accounts: [\n {\n name: \"admin\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"payer\",\n isMut: true,\n isSigner: true,\n },\n {\n name: \"config\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"otherBridgeToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"systemProgram\",\n isMut: false,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"chainId\",\n type: \"u8\",\n },\n {\n name: \"tokenAddress\",\n type: {\n array: [\"u8\", 32],\n },\n },\n ],\n },\n {\n name: \"removeOtherBridgeToken\",\n accounts: [\n {\n name: \"admin\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"payer\",\n isMut: true,\n isSigner: true,\n },\n {\n name: \"config\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"otherBridgeToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"systemProgram\",\n isMut: false,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"chainId\",\n type: \"u8\",\n },\n {\n name: \"tokenAddress\",\n type: {\n array: [\"u8\", 32],\n },\n },\n ],\n },\n {\n name: \"withdrawAdminFee\",\n accounts: [\n {\n name: \"admin\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"mint\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"config\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"pool\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"bridgeToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"adminToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"bridgeAuthority\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"tokenProgram\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"systemProgram\",\n isMut: false,\n isSigner: false,\n },\n ],\n args: [],\n },\n {\n name: \"adjustTotalLpAmount\",\n accounts: [\n {\n name: \"admin\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"mint\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"config\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"pool\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"bridgeToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"userToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"userDeposit\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"bridgeAuthority\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"tokenProgram\",\n isMut: false,\n isSigner: false,\n },\n ],\n args: [],\n },\n ],\n accounts: [\n {\n name: \"chainBridge\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"address\",\n type: {\n array: [\"u8\", 32],\n },\n },\n {\n name: \"chainId\",\n type: \"u8\",\n },\n {\n name: \"gasUsage\",\n type: \"u64\",\n },\n ],\n },\n },\n {\n name: \"config\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"admin\",\n type: \"publicKey\",\n },\n {\n name: \"allbridgeMessengerProgramId\",\n type: \"publicKey\",\n },\n {\n name: \"wormholeMessengerProgramId\",\n type: \"publicKey\",\n },\n {\n name: \"gasOracleProgramId\",\n type: \"publicKey\",\n },\n {\n name: \"rebalancer\",\n type: \"publicKey\",\n },\n {\n name: \"stopAuthority\",\n type: \"publicKey\",\n },\n {\n name: \"authorityBumpSeed\",\n type: \"u8\",\n },\n {\n name: \"canSwap\",\n type: \"bool\",\n },\n {\n name: \"canDeposit\",\n type: \"bool\",\n },\n {\n name: \"canWithdraw\",\n type: \"bool\",\n },\n ],\n },\n },\n {\n name: \"lock\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"sender\",\n type: \"publicKey\",\n },\n {\n name: \"sentTokenAddress\",\n type: \"publicKey\",\n },\n {\n name: \"amount\",\n type: \"u64\",\n },\n {\n name: \"vusdAmount\",\n type: \"u64\",\n },\n {\n name: \"recipient\",\n type: {\n array: [\"u8\", 32],\n },\n },\n {\n name: \"destinationChainId\",\n type: \"u8\",\n },\n {\n name: \"receiveToken\",\n type: {\n array: [\"u8\", 32],\n },\n },\n {\n name: \"nonce\",\n type: {\n array: [\"u8\", 32],\n },\n },\n {\n name: \"messenger\",\n type: {\n defined: \"Messenger\",\n },\n },\n {\n name: \"slot\",\n type: \"u64\",\n },\n {\n name: \"fee\",\n type: \"u64\",\n },\n ],\n },\n },\n {\n name: \"otherBridgeToken\",\n type: {\n kind: \"struct\",\n fields: [],\n },\n },\n {\n name: \"pool\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"mint\",\n type: \"publicKey\",\n },\n {\n name: \"a\",\n type: \"u64\",\n },\n {\n name: \"d\",\n type: \"u64\",\n },\n {\n name: \"tokenBalance\",\n type: \"u64\",\n },\n {\n name: \"vUsdBalance\",\n type: \"u64\",\n },\n {\n name: \"reserves\",\n type: \"u64\",\n },\n {\n name: \"decimals\",\n type: \"u8\",\n },\n {\n name: \"totalLpAmount\",\n type: \"u64\",\n },\n {\n name: \"feeShareBp\",\n type: \"u64\",\n },\n {\n name: \"adminFeeShareBp\",\n type: \"u64\",\n },\n {\n name: \"accRewardPerShareP\",\n type: \"u128\",\n },\n {\n name: \"adminFeeAmount\",\n type: \"u64\",\n },\n {\n name: \"balanceRatioMinBp\",\n type: \"u16\",\n },\n ],\n },\n },\n {\n name: \"unlock\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"hash\",\n type: {\n array: [\"u8\", 32],\n },\n },\n {\n name: \"amount\",\n type: \"u64\",\n },\n {\n name: \"fee\",\n type: \"u64\",\n },\n {\n name: \"vUsdAmount\",\n type: \"u64\",\n },\n {\n name: \"slot\",\n type: \"u64\",\n },\n ],\n },\n },\n {\n name: \"userDeposit\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"userAddress\",\n type: \"publicKey\",\n },\n {\n name: \"mint\",\n type: \"publicKey\",\n },\n {\n name: \"lpAmount\",\n type: \"u64\",\n },\n {\n name: \"rewardDebt\",\n type: \"u64\",\n },\n ],\n },\n },\n ],\n types: [\n {\n name: \"RegisterChainBridgeArgs\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"chainBridgeAddress\",\n type: {\n array: [\"u8\", 32],\n },\n },\n {\n name: \"chainId\",\n type: \"u8\",\n },\n {\n name: \"gasUsage\",\n type: \"u64\",\n },\n ],\n },\n },\n {\n name: \"UpdateChainBridgeArgs\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"chainBridgeAddress\",\n type: {\n array: [\"u8\", 32],\n },\n },\n {\n name: \"chainId\",\n type: \"u8\",\n },\n {\n name: \"gasUsage\",\n type: \"u64\",\n },\n ],\n },\n },\n {\n name: \"InitializeArgs\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"allbridgeMessengerProgramId\",\n type: \"publicKey\",\n },\n {\n name: \"wormholeMessengerProgramId\",\n type: \"publicKey\",\n },\n {\n name: \"gasOracleProgramId\",\n type: \"publicKey\",\n },\n ],\n },\n },\n {\n name: \"InitializePoolArgs\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"a\",\n type: \"u64\",\n },\n {\n name: \"feeShareBp\",\n type: \"u64\",\n },\n {\n name: \"adminFeeShareBp\",\n type: \"u64\",\n },\n {\n name: \"balanceRatioMinBp\",\n type: \"u16\",\n },\n ],\n },\n },\n {\n name: \"BridgeArgs\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"nonce\",\n type: {\n array: [\"u8\", 32],\n },\n },\n {\n name: \"recipient\",\n type: {\n array: [\"u8\", 32],\n },\n },\n {\n name: \"destinationChainId\",\n type: \"u8\",\n },\n {\n name: \"receiveToken\",\n type: {\n array: [\"u8\", 32],\n },\n },\n {\n name: \"vusdAmount\",\n type: \"u64\",\n },\n ],\n },\n },\n {\n name: \"UnlockArgs\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"nonce\",\n type: {\n array: [\"u8\", 32],\n },\n },\n {\n name: \"amount\",\n type: \"u64\",\n },\n {\n name: \"recipient\",\n type: \"publicKey\",\n },\n {\n name: \"sourceChainId\",\n type: \"u8\",\n },\n {\n name: \"receiveToken\",\n type: \"publicKey\",\n },\n {\n name: \"messenger\",\n type: {\n defined: \"Messenger\",\n },\n },\n {\n name: \"hash\",\n type: {\n array: [\"u8\", 32],\n },\n },\n {\n name: \"receiveAmountMin\",\n type: \"u64\",\n },\n ],\n },\n },\n {\n name: \"RewardError\",\n type: {\n kind: \"enum\",\n variants: [\n {\n name: \"FeeTooHigh\",\n },\n ],\n },\n },\n {\n name: \"Messenger\",\n type: {\n kind: \"enum\",\n variants: [\n {\n name: \"None\",\n },\n {\n name: \"Allbridge\",\n },\n {\n name: \"Wormhole\",\n },\n ],\n },\n },\n {\n name: \"ActionType\",\n type: {\n kind: \"enum\",\n variants: [\n {\n name: \"Deposit\",\n },\n {\n name: \"Withdraw\",\n },\n {\n name: \"Swap\",\n },\n ],\n },\n },\n ],\n errors: [\n {\n code: 6000,\n name: \"AccountAlreadyInitialized\",\n msg: \"This account has already been initialized\",\n },\n {\n code: 6001,\n name: \"AdminAuthorityInvalid\",\n msg: \"This instruction requires admin authority\",\n },\n {\n code: 6002,\n name: \"InvalidSignature\",\n msg: \"Provided signature has wrong signer or message\",\n },\n {\n code: 6003,\n name: \"InvalidHash\",\n msg: \"Wrong unlock message hash\",\n },\n {\n code: 6004,\n name: \"PoolOverflow\",\n msg: \"PoolInfo overflow\",\n },\n {\n code: 6005,\n name: \"ReservesExhausted\",\n msg: \"Reserves exhausted\",\n },\n {\n code: 6006,\n name: \"ZeroAmount\",\n msg: \"Zero amount\",\n },\n {\n code: 6007,\n name: \"ZeroChanges\",\n msg: \"Zero changes\",\n },\n {\n code: 6008,\n name: \"HighVusdAmount\",\n msg: \"vUSD amount is too high\",\n },\n {\n code: 6009,\n name: \"BalanceRatioExceeded\",\n msg: \"Balance ratio exceeded\",\n },\n {\n code: 6010,\n name: \"InsufficientReceivedAmount\",\n msg: \"Received insufficient amount\",\n },\n {\n code: 6011,\n name: \"ForbiddenAction\",\n msg: \"ForbiddenAction\",\n },\n {\n code: 6012,\n name: \"ValueTooHigh\",\n msg: \"Value is too high\",\n },\n ],\n};\n", "export interface CctpBridge {\n version: \"0.1.0\";\n name: \"cctp_bridge\";\n instructions: [\n {\n name: \"initialize\";\n accounts: [\n {\n name: \"payer\";\n isMut: true;\n isSigner: true;\n },\n {\n name: \"admin\";\n isMut: true;\n isSigner: true;\n },\n {\n name: \"mint\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"cctpBridge\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"bridgeAuthority\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"bridgeToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"systemProgram\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"tokenProgram\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"rent\";\n isMut: false;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"args\";\n type: {\n defined: \"InitializeArgs\";\n };\n },\n ];\n },\n {\n name: \"bridge\";\n accounts: [\n {\n name: \"user\";\n isMut: true;\n isSigner: true;\n },\n {\n name: \"payer\";\n isMut: true;\n isSigner: true;\n },\n {\n name: \"messageSentEventData\";\n isMut: true;\n isSigner: true;\n },\n {\n name: \"lock\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"mint\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"cctpBridge\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"cctpMessenger\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"messageTransmitterProgram\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"messageTransmitterAccount\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"tokenMessenger\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"tokenMinter\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"localToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"remoteTokenMessengerKey\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"authorityPda\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"eventAuthority\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"bridgeToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"gasPrice\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"thisGasPrice\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"chainBridge\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"userToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"bridgeAuthority\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"tokenProgram\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"systemProgram\";\n isMut: false;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"args\";\n type: {\n defined: \"BridgeArgs\";\n };\n },\n ];\n },\n {\n name: \"registerChainBridge\";\n accounts: [\n {\n name: \"admin\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"payer\";\n isMut: true;\n isSigner: true;\n },\n {\n name: \"cctpBridge\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"chainBridge\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"systemProgram\";\n isMut: false;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"args\";\n type: {\n defined: \"RegisterChainBridgeArgs\";\n };\n },\n ];\n },\n {\n name: \"updateChainBridge\";\n accounts: [\n {\n name: \"admin\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"cctpBridge\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"chainBridge\";\n isMut: true;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"args\";\n type: {\n defined: \"UpdateChainBridgeArgs\";\n };\n },\n ];\n },\n {\n name: \"setAdminFeeShare\";\n accounts: [\n {\n name: \"admin\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"mint\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"cctpBridge\";\n isMut: true;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"feeShareBp\";\n type: \"u64\";\n },\n ];\n },\n {\n name: \"setGasOracleProgramId\";\n accounts: [\n {\n name: \"admin\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"mint\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"cctpBridge\";\n isMut: true;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"newProgramId\";\n type: \"publicKey\";\n },\n ];\n },\n {\n name: \"withdrawGasToken\";\n accounts: [\n {\n name: \"admin\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"recipient\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"mint\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"cctpBridge\";\n isMut: true;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"amount\";\n type: \"u64\";\n },\n ];\n },\n {\n name: \"withdrawAdminFee\";\n accounts: [\n {\n name: \"admin\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"mint\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"cctpBridge\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"bridgeToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"adminToken\";\n isMut: true;\n isSigner: false;\n },\n {\n name: \"bridgeAuthority\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"tokenProgram\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"systemProgram\";\n isMut: false;\n isSigner: false;\n },\n ];\n args: [];\n },\n {\n name: \"setCctpTokenMessengerMinter\";\n accounts: [\n {\n name: \"admin\";\n isMut: false;\n isSigner: true;\n },\n {\n name: \"mint\";\n isMut: false;\n isSigner: false;\n },\n {\n name: \"cctpBridge\";\n isMut: true;\n isSigner: false;\n },\n ];\n args: [\n {\n name: \"newProgramId\";\n type: \"publicKey\";\n },\n ];\n },\n ];\n accounts: [\n {\n name: \"cctpBridge\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"mint\";\n type: \"publicKey\";\n },\n {\n name: \"admin\";\n type: \"publicKey\";\n },\n {\n name: \"cctpTokenMessengerMinter\";\n type: \"publicKey\";\n },\n {\n name: \"gasOracleProgramId\";\n type: \"publicKey\";\n },\n {\n name: \"authorityBumpSeed\";\n type: \"u8\";\n },\n {\n name: \"adminFeeShareBp\";\n type: \"u64\";\n },\n {\n name: \"adminFeeAmount\";\n type: \"u64\";\n },\n ];\n };\n },\n {\n name: \"chainBridge\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"chainId\";\n type: \"u8\";\n },\n {\n name: \"gasUsage\";\n type: \"u64\";\n },\n {\n name: \"domain\";\n type: \"u32\";\n },\n ];\n };\n },\n {\n name: \"lock\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"sender\";\n type: \"publicKey\";\n },\n {\n name: \"amount\";\n type: \"u64\";\n },\n {\n name: \"adminFee\";\n type: \"u64\";\n },\n {\n name: \"relayerFee\";\n type: \"u64\";\n },\n {\n name: \"recipient\";\n type: {\n array: [\"u8\", 32];\n };\n },\n {\n name: \"destinationChainId\";\n type: \"u8\";\n },\n {\n name: \"slot\";\n type: \"u64\";\n },\n ];\n };\n },\n ];\n types: [\n {\n name: \"RegisterChainBridgeArgs\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"chainId\";\n type: \"u8\";\n },\n {\n name: \"gasUsage\";\n type: \"u64\";\n },\n {\n name: \"domain\";\n type: \"u32\";\n },\n {\n name: \"mint\";\n type: \"publicKey\";\n },\n ];\n };\n },\n {\n name: \"UpdateChainBridgeArgs\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"chainId\";\n type: \"u8\";\n },\n {\n name: \"gasUsage\";\n type: \"u64\";\n },\n {\n name: \"domain\";\n type: \"u32\";\n },\n {\n name: \"mint\";\n type: \"publicKey\";\n },\n ];\n };\n },\n {\n name: \"BridgeArgs\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"recipient\";\n type: {\n array: [\"u8\", 32];\n };\n },\n {\n name: \"destinationChainId\";\n type: \"u8\";\n },\n {\n name: \"receiveToken\";\n type: {\n array: [\"u8\", 32];\n };\n },\n {\n name: \"amount\";\n type: \"u64\";\n },\n ];\n };\n },\n {\n name: \"InitializeArgs\";\n type: {\n kind: \"struct\";\n fields: [\n {\n name: \"gasOracleProgramId\";\n type: \"publicKey\";\n },\n {\n name: \"cctpTokenMessengerMinter\";\n type: \"publicKey\";\n },\n ];\n };\n },\n ];\n errors: [\n {\n code: 6000;\n name: \"ValueTooHigh\";\n msg: \"Value is too high\";\n },\n ];\n}\n\nexport const IDL: CctpBridge = {\n version: \"0.1.0\",\n name: \"cctp_bridge\",\n instructions: [\n {\n name: \"initialize\",\n accounts: [\n {\n name: \"payer\",\n isMut: true,\n isSigner: true,\n },\n {\n name: \"admin\",\n isMut: true,\n isSigner: true,\n },\n {\n name: \"mint\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"cctpBridge\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"bridgeAuthority\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"bridgeToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"systemProgram\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"tokenProgram\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"rent\",\n isMut: false,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"args\",\n type: {\n defined: \"InitializeArgs\",\n },\n },\n ],\n },\n {\n name: \"bridge\",\n accounts: [\n {\n name: \"user\",\n isMut: true,\n isSigner: true,\n },\n {\n name: \"payer\",\n isMut: true,\n isSigner: true,\n },\n {\n name: \"messageSentEventData\",\n isMut: true,\n isSigner: true,\n },\n {\n name: \"lock\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"mint\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"cctpBridge\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"cctpMessenger\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"messageTransmitterProgram\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"messageTransmitterAccount\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"tokenMessenger\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"tokenMinter\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"localToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"remoteTokenMessengerKey\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"authorityPda\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"eventAuthority\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"bridgeToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"gasPrice\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"thisGasPrice\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"chainBridge\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"userToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"bridgeAuthority\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"tokenProgram\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"systemProgram\",\n isMut: false,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"args\",\n type: {\n defined: \"BridgeArgs\",\n },\n },\n ],\n },\n {\n name: \"registerChainBridge\",\n accounts: [\n {\n name: \"admin\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"payer\",\n isMut: true,\n isSigner: true,\n },\n {\n name: \"cctpBridge\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"chainBridge\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"systemProgram\",\n isMut: false,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"args\",\n type: {\n defined: \"RegisterChainBridgeArgs\",\n },\n },\n ],\n },\n {\n name: \"updateChainBridge\",\n accounts: [\n {\n name: \"admin\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"cctpBridge\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"chainBridge\",\n isMut: true,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"args\",\n type: {\n defined: \"UpdateChainBridgeArgs\",\n },\n },\n ],\n },\n {\n name: \"setAdminFeeShare\",\n accounts: [\n {\n name: \"admin\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"mint\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"cctpBridge\",\n isMut: true,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"feeShareBp\",\n type: \"u64\",\n },\n ],\n },\n {\n name: \"setGasOracleProgramId\",\n accounts: [\n {\n name: \"admin\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"mint\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"cctpBridge\",\n isMut: true,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"newProgramId\",\n type: \"publicKey\",\n },\n ],\n },\n {\n name: \"withdrawGasToken\",\n accounts: [\n {\n name: \"admin\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"recipient\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"mint\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"cctpBridge\",\n isMut: true,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"amount\",\n type: \"u64\",\n },\n ],\n },\n {\n name: \"withdrawAdminFee\",\n accounts: [\n {\n name: \"admin\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"mint\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"cctpBridge\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"bridgeToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"adminToken\",\n isMut: true,\n isSigner: false,\n },\n {\n name: \"bridgeAuthority\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"tokenProgram\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"systemProgram\",\n isMut: false,\n isSigner: false,\n },\n ],\n args: [],\n },\n {\n name: \"setCctpTokenMessengerMinter\",\n accounts: [\n {\n name: \"admin\",\n isMut: false,\n isSigner: true,\n },\n {\n name: \"mint\",\n isMut: false,\n isSigner: false,\n },\n {\n name: \"cctpBridge\",\n isMut: true,\n isSigner: false,\n },\n ],\n args: [\n {\n name: \"newProgramId\",\n type: \"publicKey\",\n },\n ],\n },\n ],\n accounts: [\n {\n name: \"cctpBridge\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"mint\",\n type: \"publicKey\",\n },\n {\n name: \"admin\",\n type: \"publicKey\",\n },\n {\n name: \"cctpTokenMessengerMinter\",\n type: \"publicKey\",\n },\n {\n name: \"gasOracleProgramId\",\n type: \"publicKey\",\n },\n {\n name: \"authorityBumpSeed\",\n type: \"u8\",\n },\n {\n name: \"adminFeeShareBp\",\n type: \"u64\",\n },\n {\n name: \"adminFeeAmount\",\n type: \"u64\",\n },\n ],\n },\n },\n {\n name: \"chainBridge\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"chainId\",\n type: \"u8\",\n },\n {\n name: \"gasUsage\",\n type: \"u64\",\n },\n {\n name: \"domain\",\n type: \"u32\",\n },\n ],\n },\n },\n {\n name: \"lock\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"sender\",\n type: \"publicKey\",\n },\n {\n name: \"amount\",\n type: \"u64\",\n },\n {\n name: \"adminFee\",\n type: \"u64\",\n },\n {\n name: \"relayerFee\",\n type: \"u64\",\n },\n {\n name: \"recipient\",\n type: {\n array: [\"u8\", 32],\n },\n },\n {\n name: \"destinationChainId\",\n type: \"u8\",\n },\n {\n name: \"slot\",\n type: \"u64\",\n },\n ],\n },\n },\n ],\n types: [\n {\n name: \"RegisterChainBridgeArgs\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"chainId\",\n type: \"u8\",\n },\n {\n name: \"gasUsage\",\n type: \"u64\",\n },\n {\n name: \"domain\",\n type: \"u32\",\n },\n {\n name: \"mint\",\n type: \"publicKey\",\n },\n ],\n },\n },\n {\n name: \"UpdateChainBridgeArgs\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"chainId\",\n type: \"u8\",\n },\n {\n name: \"gasUsage\",\n type: \"u64\",\n },\n {\n name: \"domain\",\n type: \"u32\",\n },\n {\n name: \"mint\",\n type: \"publicKey\",\n },\n ],\n },\n },\n {\n name: \"BridgeArgs\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"recipient\",\n type: {\n array: [\"u8\", 32],\n },\n },\n {\n name: \"destinationChainId\",\n type: \"u8\",\n },\n {\n name: \"receiveToken\",\n type: {\n array: [\"u8\", 32],\n },\n },\n {\n name: \"amount\",\n type: \"u64\",\n },\n ],\n },\n },\n {\n name: \"InitializeArgs\",\n type: {\n kind: \"struct\",\n fields: [\n {\n name: \"gasOracleProgramId\",\n type: \"publicKey\",\n },\n {\n name: \"cctpTokenMessengerMinter\",\n type: \"publicKey\",\n },\n ],\n },\n },\n ],\n errors: [\n {\n code: 6000,\n name: \"ValueTooHigh\",\n msg: \"Value is too high\",\n },\n ],\n};\n", "import { Program, Provider, Spl } from \"@project-serum/anchor\";\nimport { PublicKey } from \"@solana/web3.js\";\n/* eslint-disable-next-line import/no-named-as-default */\nimport Big from \"big.js\";\nimport { Web3 } from \"web3\";\nimport { InvalidTxError, SdkError } from \"../../../exceptions\";\nimport { PoolInfo } from \"../../../tokens-info\";\nimport { swapToVUsd } from \"../../../utils/calculation\";\nimport { TokenAccountData } from \"../../models/sol\";\nimport { Bridge as BridgeType } from \"../../models/sol/types/bridge\";\n\nexport async function getTokenAccountData(account: PublicKey, provider: Provider): Promise<TokenAccountData> {\n return await Spl.token(provider).account.token.fetch(account);\n}\n\nexport async function getVUsdAmount(\n amount: string,\n bridge: Program<BridgeType>,\n poolAccount: PublicKey\n): Promise<string> {\n const poolAccountInfo = await bridge.account.pool.fetch(poolAccount);\n const decimals = poolAccountInfo.decimals;\n const feeShare = Big(poolAccountInfo.feeShareBp.toString()).div(10000).toFixed();\n const poolInfo: Omit<PoolInfo, \"p\" | \"imbalance\"> = {\n aValue: poolAccountInfo.a.toString(),\n dValue: poolAccountInfo.d.toString(),\n totalLpAmount: poolAccountInfo.totalLpAmount.toString(),\n tokenBalance: poolAccountInfo.tokenBalance.toString(),\n vUsdBalance: poolAccountInfo.vUsdBalance.toString(),\n accRewardPerShareP: poolAccountInfo.accRewardPerShareP.toString(),\n };\n return swapToVUsd(amount, { decimals, feeShare }, poolInfo);\n}\n\nexport function getMessage(args: {\n amount: string;\n recipient: Buffer;\n sourceChainId: number;\n destinationChainId: number;\n receiveToken: Buffer;\n nonce: Buffer;\n chainBridge: Buffer;\n}): Buffer {\n const amount = args.amount;\n const recipient = \"0x\" + args.recipient.toString(\"hex\");\n const sourceChainId = args.sourceChainId;\n const destinationsChainId = args.destinationChainId;\n const receiveToken = \"0x\" + args.receiveToken.toString(\"hex\");\n const nonce = \"0x\" + args.nonce.toString(\"hex\");\n const messenger = 1;\n const chainBridge = \"0x\" + args.chainBridge.toString(\"hex\");\n\n const message = Web3.utils.encodePacked(\n { t: \"uint256\", v: amount },\n { t: \"bytes32\", v: recipient },\n { t: \"uint256\", v: sourceChainId },\n { t: \"bytes32\", v: receiveToken },\n { t: \"uint256\", v: nonce },\n { t: \"uint8\", v: messenger }\n );\n\n if (!message) {\n throw new SdkError(\"message cannot be undefined\");\n }\n const hash = Web3.utils.keccak256(Buffer.from(message.replace(\"0x\", \"\"), \"hex\") as any);\n\n const hashBuffer = Buffer.from(hash.replace(\"0x\", \"\"), \"hex\");\n hashBuffer[0] = sourceChainId;\n hashBuffer[1] = destinationsChainId;\n\n const messageWithSigner = Web3.utils.encodePacked(\n { t: \"bytes32\", v: \"0x\" + hashBuffer.toString(\"hex\") },\n { t: \"bytes32\", v: chainBridge }\n );\n\n if (!messageWithSigner) {\n throw new InvalidTxError(\"messageWithSigner cannot be undefined\");\n }\n\n const hashWithSigner = Web3.utils.keccak256(Buffer.from(messageWithSigner.replace(\"0x\", \"\"), \"hex\") as any);\n\n const hashWithSignerBuffer = Buffer.from(hashWithSigner.replace(\"0x\", \"\"), \"hex\");\n\n hashWithSignerBuffer[0] = hashBuffer[0];\n hashWithSignerBuffer[1] = hashBuffer[1];\n return hashWithSignerBuffer;\n}\n", "import {\n ComputeBudgetInstruction,\n ComputeBudgetProgram,\n Connection,\n Transaction,\n TransactionInstruction,\n TransactionMessage,\n VersionedTransaction,\n} from \"@solana/web3.js\";\nimport { Big } from \"big.js\";\nimport { TxTooLargeError } from \"../../../exceptions\";\nimport { toPowBase10 } from \"../../../utils/calculation\";\nimport { fetchAddressLookupTableAccountsFromTx } from \"../../../utils/sol/utils\";\nimport { SolanaAutoTxFee, TxFeeParams } from \"../../models\";\n\nexport async function addUnitLimitAndUnitPriceToTx(\n transaction: Transaction,\n txFeeParams: TxFeeParams | undefined,\n solanaRpcUrl: string\n) {\n const connection = new Connection(solanaRpcUrl, \"confirmed\");\n /* eslint-disable-next-line @typescript-eslint/no-non-null-assertion */\n const simUnitsConsumed = (await connection.simulateTransaction(transaction)).value.unitsConsumed!;\n await addUnitLimitAndUnitPriceToInstructions(transaction.instructions, simUnitsConsumed, txFeeParams, connection);\n}\n\nexport async function addUnitLimitAndUnitPriceToVersionedTx(\n transaction: VersionedTransaction,\n txFeeParams: TxFeeParams | undefined,\n solanaRpcUrl: string\n) {\n const connection = new Connection(solanaRpcUrl, \"confirmed\");\n const addressLookupTableAccounts = await fetchAddressLookupTableAccountsFromTx(transaction, connection);\n const message = TransactionMessage.decompile(transaction.message, {\n addressLookupTableAccounts: addressLookupTableAccounts,\n });\n\n if (transaction.serialize().length > 1232) {\n throw new TxTooLargeError();\n }\n\n // const simUnitsConsumed = (await connection.simulateTransaction(transaction, { replaceRecentBlockhash: true })).value\n // .unitsConsumed!;\n const simUnitsConsumed = 769230; // 1000000/1.3\n\n await addUnitLimitAndUnitPriceToInstructions(message.instructions, simUnitsConsumed, txFeeParams, connection);\n\n transaction.message = message.compileToV0Message(addressLookupTableAccounts);\n}\n\nasync function addUnitLimitAndUnitPriceToInstructions(\n instructions: TransactionInstruction[],\n simUnitsConsumed: number,\n txFeeParams: TxFeeParams | undefined,\n connection: Connection\n) {\n if (simUnitsConsumed > 0) {\n const units = updateUnitLimit(simUnitsConsumed, instructions);\n if (txFeeParams?.solana) {\n const solanaTxFee = txFeeParams.solana;\n if (solanaTxFee === SolanaAutoTxFee) {\n await updateUnitPrice(instructions, connection);\n } else if (\"pricePerUnitInMicroLamports\" in solanaTxFee) {\n await updateUnitPrice(instructions, connection, solanaTxFee.pricePerUnitInMicroLamports);\n } else {\n const pricePerUnitInMicroLamports = Big(solanaTxFee.extraFeeInLamports)\n .div(units)\n .mul(toPowBase10(6))\n .toFixed(0);\n await updateUnitPrice(instructions, connection, pricePerUnitInMicroLamports);\n }\n }\n }\n}\n\nfunction updateUnitLimit(simUnitsConsumed: number, instructions: TransactionInstruction[]): string {\n const computeUnitLimitIndex = instructions.findIndex(\n (instruction) =>\n instruction.programId.equals(ComputeBudgetProgram.programId) &&\n ComputeBudgetInstruction.decodeInstructionType(instruction) === \"SetComputeUnitLimit\"\n );\n const units = Number((simUnitsConsumed * 1.3).toFixed(0));\n const computeUnitLimitInstruction = ComputeBudgetProgram.setComputeUnitLimit({\n units: units,\n });\n if (computeUnitLimitIndex >= 0) {\n instructions[computeUnitLimitIndex] = computeUnitLimitInstruction;\n } else {\n instructions.push(computeUnitLimitInstruction);\n }\n return units.toString();\n}\n\nasync function updateUnitPrice(\n instructions: TransactionInstruction[],\n connection: Connection,\n pricePerUnitInMicroLamports?: string\n): Promise<string> {\n const computeUnitPriceIndex = instructions.findIndex(\n (instruction) =>\n instruction.programId.equals(ComputeBudgetProgram.programId) &&\n ComputeBudgetInstruction.decodeInstructionType(instruction) === \"SetComputeUnitPrice\"\n );\n const unitPrice = pricePerUnitInMicroLamports\n ? BigInt(pricePerUnitInMicroLamports)\n : BigInt(await getAveragePrioritizationFee(connection));\n const computeUnitPriceInstruction = ComputeBudgetProgram.setComputeUnitPrice({\n microLamports: unitPrice,\n });\n if (computeUnitPriceIndex >= 0) {\n instructions[computeUnitPriceIndex] = computeUnitPriceInstruction;\n } else {\n instructions.push(computeUnitPriceInstruction);\n }\n return unitPrice.toString();\n}\n\nasync function getAveragePrioritizationFee(connection: Connection) {\n const prioritizationFees = await connection.getRecentPrioritizationFees();\n let sum = 0;\n for (const prioritizationFee of prioritizationFees) {\n sum += prioritizationFee.prioritizationFee;\n }\n return (sum / prioritizationFees.length).toFixed(0);\n}\n", "import { AddressLookupTableAccount, Connection, VersionedTransaction } from \"@solana/web3.js\";\nimport { SdkError } from \"../../exceptions\";\n\nexport async function fetchAddressLookupTableAccountsFromTx(\n transaction: VersionedTransaction,\n connection: Connection\n): Promise<AddressLookupTableAccount[]> {\n return await Promise.all(\n transaction.message.addressTableLookups.map(async (lookup) => {\n return new AddressLookupTableAccount({\n key: lookup.accountKey,\n state: AddressLookupTableAccount.deserialize(\n await connection.getAccountInfo(lookup.accountKey).then((res) => {\n if (!res) {\n throw new SdkError(\"Cannot get AccountInfo\");\n }\n return res.data;\n })\n ),\n });\n })\n );\n}\n", "import { BN, Program, Provider } from \"@project-serum/anchor\";\nimport { PublicKey, TransactionInstruction } from \"@solana/web3.js\";\nimport { Bridge as BridgeType } from \"./types/bridge\";\nimport { CctpBridge as CctpBridgeType } from \"./types/cctp_bridge\";\n\nexport type SolanaTxFee = PricePerUnitInMicroLamports | ExtraFeeInLamports | typeof SolanaAutoTxFee;\n/**\n * Priority Fee will be calculated based on {@link https://solana-labs.github.io/solana-web3.js/classes/Connection.html#getRecentPrioritizationFees}\n */\nexport const SolanaAutoTxFee = \"AUTO\";\n\n/**\n * Add Priority Fee as price per unit in micro-lamports\n */\nexport interface PricePerUnitInMicroLamports {\n pricePerUnitInMicroLamports: string;\n}\n\n/**\n * Total Priority Fee impact will be as extraFeeInLamports param\n */\nexport interface ExtraFeeInLamports {\n extraFeeInLamports: string;\n}\n\nexport interface SwapAndBridgeSolData {\n bridge: Program<BridgeType>;\n amount: BN;\n vusdAmount: BN;\n nonce: number[];\n recipient: number[];\n receiveToken: number[];\n poolAccount: PublicKey;\n lockAccount: PublicKey;\n bridgeAuthority: PublicKey;\n userToken: PublicKey;\n bridgeTokenAccount: PublicKey;\n chainBridgeAccount: PublicKey;\n otherBridgeTokenAccount: PublicKey;\n userAccount: PublicKey;\n destinationChainId: number;\n mint: string;\n config: PublicKey;\n configAccountInfo: ConfigAccountInfo;\n gasPrice: PublicKey;\n thisGasPrice: PublicKey;\n message: Buffer;\n extraGasInstruction?: TransactionInstruction;\n provider: Provider;\n}\n\nexport interface SwapAndBridgeSolDataCctpData {\n cctpBridge: Program<CctpBridgeType>;\n cctpBridgeAccount: PublicKey;\n cctpAddressAccount: PublicKey;\n amount: BN;\n recipient: number[];\n receiveToken: number[];\n userToken: PublicKey;\n bridgeAuthority: PublicKey;\n bridgeTokenAccount: PublicKey;\n chainBridgeAccount: PublicKey;\n userAccount: PublicKey;\n destinationChainId: number;\n mint: PublicKey;\n gasPrice: PublicKey;\n thisGasPrice: PublicKey;\n extraGasInstruction?: TransactionInstruction;\n provider: Provider;\n}\n\ninterface ConfigAccountInfo {\n allbridgeMessengerProgramId: PublicKey;\n wormholeMessengerProgramId: PublicKey;\n gasOracleProgramId: PublicKey;\n}\n\nexport interface TokenAccountData {\n amount: BN;\n authority: PublicKey;\n closeAuthority: unknown;\n delegate: unknown;\n delegatedAmount: BN;\n isNative: unknown;\n mint: PublicKey;\n state: unknown;\n}\n", "import { NATIVE_MINT } from \"@solana/spl-token\";\nimport { Connection, TransactionMessage, VersionedTransaction } from \"@solana/web3.js\";\nimport axios, { AxiosError } from \"axios\";\nimport { JupiterError, SdkError } from \"../../../exceptions\";\nimport { fetchAddressLookupTableAccountsFromTx } from \"../../../utils/sol/utils\";\nimport { JupiterParams } from \"./index\";\n\nexport class JupiterService {\n connection: Connection;\n jupiterUrl: string;\n apiKeyHeader?: string;\n maxAccounts?: number;\n\n constructor(solanaRpcUrl: string, jupiterParams: JupiterParams) {\n this.connection = new Connection(solanaRpcUrl);\n this.jupiterUrl = jupiterParams.jupiterUrl.replace(/\\/$/, \"\"); // trim last \"/\" if exist\n this.apiKeyHeader = jupiterParams.jupiterApiKeyHeader;\n this.maxAccounts = jupiterParams.jupiterMaxAccounts;\n }\n\n async getJupiterSwapTx(\n userAddress: string,\n stableTokenAddress: string,\n amount: string,\n exactOut: boolean\n ): Promise<{ tx: VersionedTransaction; amountIn?: string }> {\n let quoteResponse: any;\n try {\n const swapMode = exactOut ? \"ExactOut\" : \"ExactIn\";\n let url = `${this.jupiterUrl}/quote?inputMint=${stableTokenAddress}&outputMint=${NATIVE_MINT.toString()}&amount=${amount}&swapMode=${swapMode}&slippageBps=100&onlyDirectRoutes=true`;\n\n if (this.maxAccounts) {\n url += `&maxAccounts=${this.maxAccounts}`;\n }\n quoteResponse = await axios.get(url, {\n headers: this.apiKeyHeader ? { \"x-api-key\": this.apiKeyHeader } : undefined,\n });\n } catch (err) {\n if (err instanceof AxiosError && err.response && err.response.data && err.response.data.error) {\n throw new JupiterError(err.response.data.error);\n }\n throw new JupiterError(\"Cannot get route\");\n }\n\n let inAmount;\n if (exactOut && quoteResponse?.data?.inAmount) {\n inAmount = quoteResponse.data.inAmount;\n } else if (exactOut) {\n throw new JupiterError(\"Cannot get inAmount\");\n }\n\n let transactionResponse: any;\n try {\n transactionResponse = await axios.post(\n `${this.jupiterUrl}/swap`,\n {\n quoteResponse: quoteResponse.data,\n userPublicKey: userAddress,\n wrapAndUnwrapSol: true,\n },\n {\n headers: this.apiKeyHeader ? { \"x-api-key\": this.apiKeyHeader } : undefined,\n }\n );\n } catch (err) {\n if (err instanceof AxiosError && err.response && err.response.data && err.response.data.error) {\n throw new JupiterError(err.response.data.error);\n }\n throw new JupiterError(\"Cannot get swap transaction\");\n }\n\n let swapTransaction;\n if (transactionResponse?.data?.swapTransaction) {\n swapTransaction = transactionResponse.data.swapTransaction;\n } else {\n throw new JupiterError(\"Cannot get swap transaction\");\n }\n\n const swapTransactionBuf = Buffer.from(swapTransaction, \"base64\");\n const tx = VersionedTransaction.deserialize(swapTransactionBuf);\n\n return exactOut ? { tx, amountIn: inAmount } : { tx };\n }\n\n async amendJupiterWithSdkTx(\n transaction: VersionedTransaction,\n sdkTx: VersionedTransaction\n ): Promise<VersionedTransaction> {\n try {\n const addressLookupTableAccounts = await fetchAddressLookupTableAccountsFromTx(transaction, this.connection);\n const sdkAddressLookupTableAccounts = await fetchAddressLookupTableAccountsFromTx(sdkTx, this.connection);\n\n const message = TransactionMessage.decompile(transaction.message, {\n addressLookupTableAccounts: addressLookupTableAccounts,\n });\n const sdkMessage = TransactionMessage.decompile(sdkTx.message, {\n addressLookupTableAccounts: sdkAddressLookupTableAccounts,\n });\n sdkMessage.instructions.shift();\n message.instructions.push(...sdkMessage.instructions);\n\n addressLookupTableAccounts.push(...sdkAddressLookupTableAccounts);\n\n transaction.message = message.compileToV0Message(addressLookupTableAccounts);\n\n if (sdkTx.message.header.numRequiredSignatures === 2 && transaction.signatures.length === 1) {\n const signature = sdkTx.signatures[0];\n if (!signature) {\n throw new SdkError(\"Signature is undefined\");\n }\n transaction.signatures.push(signature);\n }\n return transaction;\n } catch (e) {\n if (e instanceof Error && e.message) {\n throw new JupiterError(`Some error occurred during creation final swap and bridge transaction. ${e.message}`);\n }\n throw new JupiterError(\"Some error occurred during creation final swap and bridge transaction\");\n }\n }\n}\n", "import { Address, contract } from \"@stellar/stellar-sdk\";\nimport { Big } from \"big.js\";\nimport { ChainSymbol } from \"../../../chains/chain.enums\";\nimport { AllbridgeCoreClient } from \"../../../client/core-api/core-client-base\";\nimport { MethodNotSupportedError } from \"../../../exceptions\";\nimport { AllbridgeCoreSdkOptions, ChainType } from \"../../../index\";\nimport { FeePaymentMethod } from \"../../../models\";\nimport { NodeRpcUrlsConfig } from \"../../index\";\nimport { RawTransaction, TransactionResponse } from \"../../models\";\nimport { BridgeContract } from \"../../models/srb/bridge-contract\";\nimport { ChainBridgeService, SendParams, SwapParams, TxSendParamsSrb, TxSwapParamsSol } from \"../models\";\nimport { getNonceBigInt, prepareTxSendParams, prepareTxSwapParams } from \"../utils\";\nimport ContractClientOptions = contract.ClientOptions;\n\nexport class SrbBridgeService extends ChainBridgeService {\n chainType: ChainType.SRB = ChainType.SRB;\n\n constructor(\n readonly nodeRpcUrlsConfig: NodeRpcUrlsConfig,\n readonly params: AllbridgeCoreSdkOptions,\n readonly api: AllbridgeCoreClient\n ) {\n super();\n }\n\n async buildRawTransactionSend(params: SendParams): Promise<RawTransaction> {\n const txSendParams = await prepareTxSendParams(this.chainType, params, this.api);\n return await this.buildRawTransactionSendFromParams(txSendParams);\n }\n\n async buildRawTransactionSendFromParams(params: TxSendParamsSrb): Promise<RawTransaction> {\n const {\n amount,\n contractAddress,\n fromAccountAddress,\n fromTokenAddress,\n toChainId,\n toAccountAddress,\n toTokenAddress,\n fee,\n gasFeePaymentMethod,\n extraGas,\n } = params;\n\n let totalFee = fee;\n if (extraGas) {\n totalFee = Big(totalFee).plus(extraGas).toFixed();\n }\n const contract = this.getContract(BridgeContract, contractAddress, fromAccountAddress);\n let tx;\n if (gasFeePaymentMethod === FeePaymentMethod.WITH_STABLECOIN) {\n tx = await contract.swap_and_bridge({\n sender: fromAccountAddress,\n token: Address.contract(Buffer.from(fromTokenAddress)).toString(),\n amount: BigInt(amount),\n recipient: Buffer.from(toAccountAddress),\n destination_chain_id: +toChainId,\n receive_token: Buffer.from(toTokenAddress),\n nonce: getNonceBigInt(),\n gas_amount: BigInt(0),\n fee_token_amount: BigInt(totalFee),\n });\n } else {\n tx = await contract.swap_and_bridge({\n sender: fromAccountAddress,\n token: Address.contract(Buffer.from(fromTokenAddress)).toString(),\n amount: BigInt(amount),\n recipient: Buffer.from(toAccountAddress),\n destination_chain_id: +toChainId,\n receive_token: Buffer.from(toTokenAddress),\n nonce: getNonceBigInt(),\n gas_amount: BigInt(totalFee),\n fee_token_amount: BigInt(0),\n });\n }\n return tx.toXDR();\n }\n\n async buildRawTransactionSwap(params: SwapParams): Promise<RawTransaction> {\n const txSwapParams = prepareTxSwapParams(this.chainType, params);\n return await this.buildRawTransactionSwapFromParams(txSwapParams);\n }\n\n async buildRawTransactionSwapFromParams(params: TxSwapParamsSol): Promise<RawTransaction> {\n const {\n amount,\n contractAddress,\n fromAccountAddress,\n fromTokenAddress,\n toAccountAddress,\n toTokenAddress,\n minimumReceiveAmount,\n } = params;\n const contract = this.getContract(BridgeContract, contractAddress, fromAccountAddress);\n return (\n await contract.swap({\n sender: fromAccountAddress,\n amount: BigInt(amount),\n token: Address.contract(Buffer.from(fromTokenAddress)).toBuffer(),\n receive_token: Buffer.from(toTokenAddress),\n recipient: toAccountAddress,\n receive_amount_min: BigInt(minimumReceiveAmount),\n })\n ).toXDR();\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n send(params: SendParams): Promise<TransactionResponse> {\n throw new MethodNotSupportedError();\n }\n\n private getContract<T>(contract: new (args: ContractClientOptions) => T, address: string, sender?: string): T {\n const config: ContractClientOptions = {\n publicKey: sender,\n contractId: address,\n networkPassphrase: this.params.sorobanNetworkPassphrase,\n rpcUrl: this.nodeRpcUrlsConfig.getNodeRpcUrl(ChainSymbol.SRB),\n };\n return new contract(config);\n }\n}\n", "import { contract } from \"@stellar/stellar-sdk\";\nimport u128 = contract.u128;\nimport u32 = contract.u32;\nimport u256 = contract.u256;\nimport AssembledTransaction = contract.AssembledTransaction;\nimport Result = contract.Result;\nimport Option = contract.Option;\nimport ContractSpec = contract.Spec;\nimport ContractClient = contract.Client;\nimport ContractClientOptions = contract.ClientOptions;\n\nexport interface Swapped {\n receive_amount: u128;\n receive_token: Buffer;\n recipient: string;\n send_amount: u128;\n send_token: Buffer;\n sender: string;\n}\n\nexport interface TokensSent {\n amount: u128;\n destination_chain_id: u32;\n nonce: u256;\n receive_token: Buffer;\n recipient: Buffer;\n}\n\nexport interface TokensReceived {\n amount: u128;\n message: Buffer;\n nonce: u256;\n recipient: Buffer;\n}\n\nexport interface ReceiveFee {\n bridge_transaction_cost: u128;\n extra_gas: u128;\n message_transaction_cost: u128;\n}\n\nexport interface BridgingFeeFromTokens {\n fee_token_amount: u128;\n gas: u128;\n}\n\nexport interface AnotherBridge {\n address: Buffer;\n tokens: Map<Buffer, boolean>;\n}\n\nexport interface Bridge {\n /**\n * precomputed values of the scaling factor required for paying the bridging fee with stable tokens\n */\n bridging_fee_conversion_factor: Map<string, u128>;\n can_swap: boolean;\n /**\n * precomputed values to divide by to change the precision from the Gas Oracle precision to the token precision\n */\n from_gas_oracle_factor: Map<string, u128>;\n messenger: string;\n pools: Map<Buffer, string>;\n rebalancer: string;\n}\n\nexport type DataKey =\n | { tag: \"OtherBridge\"; values: readonly [u32] }\n | { tag: \"SentMessage\"; values: readonly [Buffer] }\n | { tag: \"ReceivedMessage\"; values: readonly [Buffer] };\n\nexport type Admin = readonly [string];\nexport type GasOracleAddress = readonly [string];\nexport type GasUsage = readonly [Map<u32, u128>];\nexport type NativeToken = readonly [string];\nexport type StopAuthority = readonly [string];\nexport const Errors = {\n 0: { message: \"\" },\n 1: { message: \"\" },\n 2: { message: \"\" },\n 3: { message: \"\" },\n 4: { message: \"\" },\n 5: { message: \"\" },\n 6: { message: \"\" },\n 7: { message: \"\" },\n 8: { message: \"\" },\n 9: { message: \"\" },\n 10: { message: \"\" },\n 11: { message: \"\" },\n 12: { message: \"\" },\n 103: { message: \"\" },\n 104: { message: \"\" },\n 105: { message: \"\" },\n 106: { message: \"\" },\n 107: { message: \"\" },\n 108: { message: \"\" },\n 109: { message: \"\" },\n 203: { message: \"\" },\n 204: { message: \"\" },\n 205: { message: \"\" },\n 206: { message: \"\" },\n 207: { message: \"\" },\n 208: { message: \"\" },\n 209: { message: \"\" },\n 210: { message: \"\" },\n 211: { message: \"\" },\n 212: { message: \"\" },\n 214: { message: \"\" },\n 215: { message: \"\" },\n 216: { message: \"\" },\n 217: { message: \"\" },\n 218: { message: \"\" },\n 300: { message: \"\" },\n 301: { message: \"\" },\n 302: { message: \"\" },\n 303: { message: \"\" },\n 400: { message: \"\" },\n};\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging\nexport interface BridgeContract {\n /**\n * Construct and simulate a initialize transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n initialize: (\n {\n admin,\n messenger,\n gas_oracle,\n native_token,\n }: {\n admin: string;\n messenger: string;\n gas_oracle: string;\n native_token: string;\n },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a swap_and_bridge transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n swap_and_bridge: (\n {\n sender,\n token,\n amount,\n recipient,\n destination_chain_id,\n receive_token,\n nonce,\n gas_amount,\n fee_token_amount,\n }: {\n sender: string;\n token: string;\n amount: u128;\n recipient: Buffer;\n destination_chain_id: u32;\n receive_token: Buffer;\n nonce: u256;\n gas_amount: u128;\n fee_token_amount: u128;\n },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a receive_tokens transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n receive_tokens: (\n {\n sender,\n amount,\n recipient,\n source_chain_id,\n receive_token,\n nonce,\n receive_amount_min,\n extra_gas,\n }: {\n sender: string;\n amount: u128;\n recipient: string;\n source_chain_id: u32;\n receive_token: Buffer;\n nonce: u256;\n receive_amount_min: u128;\n extra_gas: Option<u128>;\n },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a swap transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n swap: (\n {\n sender,\n amount,\n token,\n receive_token,\n recipient,\n receive_amount_min,\n }: {\n sender: string;\n amount: u128;\n token: Buffer;\n receive_token: Buffer;\n recipient: string;\n receive_amount_min: u128;\n },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a stop_swap transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n stop_swap: (options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a start_swap transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n start_swap: (options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a set_gas_oracle transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n set_gas_oracle: (\n { new_address }: { new_address: string },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a set_stop_authority transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n set_stop_authority: (\n { stop_authority }: { stop_authority: string },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a set_rebalancer transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n set_rebalancer: (\n { rebalancer }: { rebalancer: string },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a set_messenger transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n set_messenger: (\n { messenger }: { messenger: string },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a set_gas_usage transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n set_gas_usage: (\n { chain_id, gas_usage }: { chain_id: u32; gas_usage: u128 },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a register_bridge transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n register_bridge: (\n { chain_id, bridge_address }: { chain_id: u32; bridge_address: Buffer },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a add_bridge_token transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n add_bridge_token: (\n { chain_id, token_address }: { chain_id: u32; token_address: Buffer },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a remove_bridge_token transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n remove_bridge_token: (\n { chain_id, token_address }: { chain_id: u32; token_address: Buffer },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a add_pool transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n add_pool: (\n { pool, token }: { pool: string; token: string },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a withdraw_gas_tokens transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n withdraw_gas_tokens: (\n { sender, amount }: { sender: string; amount: u128 },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a withdraw_bridging_fee_in_tokens transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n withdraw_bridging_fee_in_tokens: (\n { sender, token_address }: { sender: string; token_address: string },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a has_processed_message transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n has_processed_message: (\n { message }: { message: Buffer },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<boolean>>>;\n\n /**\n * Construct and simulate a has_received_message transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n has_received_message: (\n { message }: { message: Buffer },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<boolean>>>;\n\n /**\n * Construct and simulate a get_pool_address transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n get_pool_address: (\n { token_address }: { token_address: Buffer },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<string>>>;\n\n /**\n * Construct and simulate a get_config transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n get_config: (options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }) => Promise<AssembledTransaction<Result<Bridge>>>;\n\n /**\n * Construct and simulate a get_stop_authority transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n get_stop_authority: (options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }) => Promise<AssembledTransaction<Result<string>>>;\n\n /**\n * Construct and simulate a get_transaction_cost transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n get_transaction_cost: (\n { chain_id }: { chain_id: u32 },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<u128>>>;\n\n /**\n * Construct and simulate a get_gas_usage transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n get_gas_usage: (\n { chain_id }: { chain_id: u32 },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<u128>>>;\n\n /**\n * Construct and simulate a get_admin transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n get_admin: (options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }) => Promise<AssembledTransaction<Result<string>>>;\n\n /**\n * Construct and simulate a get_gas_oracle transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n get_gas_oracle: (options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }) => Promise<AssembledTransaction<Result<string>>>;\n\n /**\n * Construct and simulate a get_another_bridge transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n get_another_bridge: (\n { chain_id }: { chain_id: u32 },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<AnotherBridge>>>;\n\n /**\n * Construct and simulate a set_admin transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n set_admin: (\n { new_admin }: { new_admin: string },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a upgrade transaction. Returns an `AssembledTransaction` object which will have a `Result` field containing the Result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n upgrade: (\n { new_wasm_hash }: { new_wasm_hash: Buffer },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging\nexport class BridgeContract extends ContractClient {\n constructor(public readonly options: ContractClientOptions) {\n super(\n new ContractSpec([\n \"AAAAAAAAAAAAAAAKaW5pdGlhbGl6ZQAAAAAABAAAAAAAAAAFYWRtaW4AAAAAAAATAAAAAAAAAAltZXNzZW5nZXIAAAAAAAATAAAAAAAAAApnYXNfb3JhY2xlAAAAAAATAAAAAAAAAAxuYXRpdmVfdG9rZW4AAAATAAAAAQAAA+kAAAPtAAAAAAAAAAM=\",\n \"AAAAAAAAAAAAAAAPc3dhcF9hbmRfYnJpZGdlAAAAAAkAAAAAAAAABnNlbmRlcgAAAAAAEwAAAAAAAAAFdG9rZW4AAAAAAAATAAAAAAAAAAZhbW91bnQAAAAAAAoAAAAAAAAACXJlY2lwaWVudAAAAAAAA+4AAAAgAAAAAAAAABRkZXN0aW5hdGlvbl9jaGFpbl9pZAAAAAQAAAAAAAAADXJlY2VpdmVfdG9rZW4AAAAAAAPuAAAAIAAAAAAAAAAFbm9uY2UAAAAAAAAMAAAAAAAAAApnYXNfYW1vdW50AAAAAAAKAAAAAAAAABBmZWVfdG9rZW5fYW1vdW50AAAACgAAAAEAAAPpAAAD7QAAAAAAAAAD\",\n \"AAAAAAAAAAAAAAAOcmVjZWl2ZV90b2tlbnMAAAAAAAgAAAAAAAAABnNlbmRlcgAAAAAAEwAAAAAAAAAGYW1vdW50AAAAAAAKAAAAAAAAAAlyZWNpcGllbnQAAAAAAAATAAAAAAAAAA9zb3VyY2VfY2hhaW5faWQAAAAABAAAAAAAAAANcmVjZWl2ZV90b2tlbgAAAAAAA+4AAAAgAAAAAAAAAAVub25jZQAAAAAAAAwAAAAAAAAAEnJlY2VpdmVfYW1vdW50X21pbgAAAAAACgAAAAAAAAAJZXh0cmFfZ2FzAAAAAAAD6AAAAAoAAAABAAAD6QAAA+0AAAAAAAAAAw==\",\n \"AAAAAAAAAAAAAAAEc3dhcAAAAAYAAAAAAAAABnNlbmRlcgAAAAAAEwAAAAAAAAAGYW1vdW50AAAAAAAKAAAAAAAAAAV0b2tlbgAAAAAAA+4AAAAgAAAAAAAAAA1yZWNlaXZlX3Rva2VuAAAAAAAD7gAAACAAAAAAAAAACXJlY2lwaWVudAAAAAAAABMAAAAAAAAAEnJlY2VpdmVfYW1vdW50X21pbgAAAAAACgAAAAEAAAPpAAAD7QAAAAAAAAAD\",\n \"AAAAAAAAAAAAAAAJc3RvcF9zd2FwAAAAAAAAAAAAAAEAAAPpAAAD7QAAAAAAAAAD\",\n \"AAAAAAAAAAAAAAAKc3RhcnRfc3dhcAAAAAAAAAAAAAEAAAPpAAAD7QAAAAAAAAAD\",\n \"AAAAAAAAAAAAAAAOc2V0X2dhc19vcmFjbGUAAAAAAAEAAAAAAAAAC25ld19hZGRyZXNzAAAAABMAAAABAAAD6QAAA+0AAAAAAAAAAw==\",\n \"AAAAAAAAAAAAAAASc2V0X3N0b3BfYXV0aG9yaXR5AAAAAAABAAAAAAAAAA5zdG9wX2F1dGhvcml0eQAAAAAAEwAAAAEAAAPpAAAD7QAAAAAAAAAD\",\n \"AAAAAAAAAAAAAAAOc2V0X3JlYmFsYW5jZXIAAAAAAAEAAAAAAAAACnJlYmFsYW5jZXIAAAAAABMAAAABAAAD6QAAA+0AAAAAAAAAAw==\",\n \"AAAAAAAAAAAAAAANc2V0X21lc3NlbmdlcgAAAAAAAAEAAAAAAAAACW1lc3NlbmdlcgAAAAAAABMAAAABAAAD6QAAA+0AAAAAAAAAAw==\",\n \"AAAAAAAAAAAAAAANc2V0X2dhc191c2FnZQAAAAAAAAIAAAAAAAAACGNoYWluX2lkAAAABAAAAAAAAAAJZ2FzX3VzYWdlAAAAAAAACgAAAAEAAAPpAAAD7QAAAAAAAAAD\",\n \"AAAAAAAAAAAAAAAPcmVnaXN0ZXJfYnJpZGdlAAAAAAIAAAAAAAAACGNoYWluX2lkAAAABAAAAAAAAAAOYnJpZGdlX2FkZHJlc3MAAAAAA+4AAAAgAAAAAQAAA+kAAAPtAAAAAAAAAAM=\",\n \"AAAAAAAAAAAAAAAQYWRkX2JyaWRnZV90b2tlbgAAAAIAAAAAAAAACGNoYWluX2lkAAAABAAAAAAAAAANdG9rZW5fYWRkcmVzcwAAAAAAA+4AAAAgAAAAAQAAA+kAAAPtAAAAAAAAAAM=\",\n \"AAAAAAAAAAAAAAATcmVtb3ZlX2JyaWRnZV90b2tlbgAAAAACAAAAAAAAAAhjaGFpbl9pZAAAAAQAAAAAAAAADXRva2VuX2FkZHJlc3MAAAAAAAPuAAAAIAAAAAEAAAPpAAAD7QAAAAAAAAAD\",\n \"AAAAAAAAAAAAAAAIYWRkX3Bvb2wAAAACAAAAAAAAAARwb29sAAAAEwAAAAAAAAAFdG9rZW4AAAAAAAATAAAAAQAAA+kAAAPtAAAAAAAAAAM=\",\n \"AAAAAAAAAAAAAAATd2l0aGRyYXdfZ2FzX3Rva2VucwAAAAACAAAAAAAAAAZzZW5kZXIAAAAAABMAAAAAAAAABmFtb3VudAAAAAAACgAAAAEAAAPpAAAD7QAAAAAAAAAD\",\n \"AAAAAAAAAAAAAAAfd2l0aGRyYXdfYnJpZGdpbmdfZmVlX2luX3Rva2VucwAAAAACAAAAAAAAAAZzZW5kZXIAAAAAABMAAAAAAAAADXRva2VuX2FkZHJlc3MAAAAAAAATAAAAAQAAA+kAAAPtAAAAAAAAAAM=\",\n \"AAAAAAAAAAAAAAAVaGFzX3Byb2Nlc3NlZF9tZXNzYWdlAAAAAAAAAQAAAAAAAAAHbWVzc2FnZQAAAAPuAAAAIAAAAAEAAAPpAAAAAQAAAAM=\",\n \"AAAAAAAAAAAAAAAUaGFzX3JlY2VpdmVkX21lc3NhZ2UAAAABAAAAAAAAAAdtZXNzYWdlAAAAA+4AAAAgAAAAAQAAA+kAAAABAAAAAw==\",\n \"AAAAAAAAAAAAAAAQZ2V0X3Bvb2xfYWRkcmVzcwAAAAEAAAAAAAAADXRva2VuX2FkZHJlc3MAAAAAAAPuAAAAIAAAAAEAAAPpAAAAEwAAAAM=\",\n \"AAAAAAAAAAAAAAAKZ2V0X2NvbmZpZwAAAAAAAAAAAAEAAAPpAAAH0AAAAAZCcmlkZ2UAAAAAAAM=\",\n \"AAAAAAAAAAAAAAASZ2V0X3N0b3BfYXV0aG9yaXR5AAAAAAAAAAAAAQAAA+kAAAATAAAAAw==\",\n \"AAAAAAAAAAAAAAAUZ2V0X3RyYW5zYWN0aW9uX2Nvc3QAAAABAAAAAAAAAAhjaGFpbl9pZAAAAAQAAAABAAAD6QAAAAoAAAAD\",\n \"AAAAAAAAAAAAAAANZ2V0X2dhc191c2FnZQAAAAAAAAEAAAAAAAAACGNoYWluX2lkAAAABAAAAAEAAAPpAAAACgAAAAM=\",\n \"AAAAAAAAAAAAAAAJZ2V0X2FkbWluAAAAAAAAAAAAAAEAAAPpAAAAEwAAAAM=\",\n \"AAAAAAAAAAAAAAAOZ2V0X2dhc19vcmFjbGUAAAAAAAAAAAABAAAD6QAAABMAAAAD\",\n \"AAAAAAAAAAAAAAASZ2V0X2Fub3RoZXJfYnJpZGdlAAAAAAABAAAAAAAAAAhjaGFpbl9pZAAAAAQAAAABAAAD6QAAB9AAAAANQW5vdGhlckJyaWRnZQAAAAAAAAM=\",\n \"AAAAAAAAAAAAAAAJc2V0X2FkbWluAAAAAAAAAQAAAAAAAAAJbmV3X2FkbWluAAAAAAAAEwAAAAEAAAPpAAAD7QAAAAAAAAAD\",\n \"AAAAAAAAAAAAAAAHdXBncmFkZQAAAAABAAAAAAAAAA1uZXdfd2FzbV9oYXNoAAAAAAAD7gAAACAAAAABAAAD6QAAA+0AAAAAAAAAAw==\",\n \"AAAAAQAAAAAAAAAAAAAAB1N3YXBwZWQAAAAABgAAAAAAAAAOcmVjZWl2ZV9hbW91bnQAAAAAAAoAAAAAAAAADXJlY2VpdmVfdG9rZW4AAAAAAAPuAAAAIAAAAAAAAAAJcmVjaXBpZW50AAAAAAAAEwAAAAAAAAALc2VuZF9hbW91bnQAAAAACgAAAAAAAAAKc2VuZF90b2tlbgAAAAAD7gAAACAAAAAAAAAABnNlbmRlcgAAAAAAEw==\",\n \"AAAAAQAAAAAAAAAAAAAAClRva2Vuc1NlbnQAAAAAAAUAAAAAAAAABmFtb3VudAAAAAAACgAAAAAAAAAUZGVzdGluYXRpb25fY2hhaW5faWQAAAAEAAAAAAAAAAVub25jZQAAAAAAAAwAAAAAAAAADXJlY2VpdmVfdG9rZW4AAAAAAAPuAAAAIAAAAAAAAAAJcmVjaXBpZW50AAAAAAAD7gAAACA=\",\n \"AAAAAQAAAAAAAAAAAAAADlRva2Vuc1JlY2VpdmVkAAAAAAAEAAAAAAAAAAZhbW91bnQAAAAAAAoAAAAAAAAAB21lc3NhZ2UAAAAD7gAAACAAAAAAAAAABW5vbmNlAAAAAAAADAAAAAAAAAAJcmVjaXBpZW50AAAAAAAD7gAAACA=\",\n \"AAAAAQAAAAAAAAAAAAAAClJlY2VpdmVGZWUAAAAAAAMAAAAAAAAAF2JyaWRnZV90cmFuc2FjdGlvbl9jb3N0AAAAAAoAAAAAAAAACWV4dHJhX2dhcwAAAAAAAAoAAAAAAAAAGG1lc3NhZ2VfdHJhbnNhY3Rpb25fY29zdAAAAAo=\",\n \"AAAAAQAAAAAAAAAAAAAAFUJyaWRnaW5nRmVlRnJvbVRva2VucwAAAAAAAAIAAAAAAAAAEGZlZV90b2tlbl9hbW91bnQAAAAKAAAAAAAAAANnYXMAAAAACg==\",\n \"AAAAAQAAAAAAAAAAAAAADUFub3RoZXJCcmlkZ2UAAAAAAAACAAAAAAAAAAdhZGRyZXNzAAAAA+4AAAAgAAAAAAAAAAZ0b2tlbnMAAAAAA+wAAAPuAAAAIAAAAAE=\",\n \"AAAAAQAAAAAAAAAAAAAABkJyaWRnZQAAAAAABgAAAGBwcmVjb21wdXRlZCB2YWx1ZXMgb2YgdGhlIHNjYWxpbmcgZmFjdG9yIHJlcXVpcmVkIGZvciBwYXlpbmcgdGhlIGJyaWRnaW5nIGZlZSB3aXRoIHN0YWJsZSB0b2tlbnMAAAAeYnJpZGdpbmdfZmVlX2NvbnZlcnNpb25fZmFjdG9yAAAAAAPsAAAAEwAAAAoAAAAAAAAACGNhbl9zd2FwAAAAAQAAAGxwcmVjb21wdXRlZCB2YWx1ZXMgdG8gZGl2aWRlIGJ5IHRvIGNoYW5nZSB0aGUgcHJlY2lzaW9uIGZyb20gdGhlIEdhcyBPcmFjbGUgcHJlY2lzaW9uIHRvIHRoZSB0b2tlbiBwcmVjaXNpb24AAAAWZnJvbV9nYXNfb3JhY2xlX2ZhY3RvcgAAAAAD7AAAABMAAAAKAAAAAAAAAAltZXNzZW5nZXIAAAAAAAATAAAAAAAAAAVwb29scwAAAAAAA+wAAAPuAAAAIAAAABMAAAAAAAAACnJlYmFsYW5jZXIAAAAAABM=\",\n \"AAAAAgAAAAAAAAAAAAAAB0RhdGFLZXkAAAAAAwAAAAEAAAAAAAAAC090aGVyQnJpZGdlAAAAAAEAAAAEAAAAAQAAAAAAAAALU2VudE1lc3NhZ2UAAAAAAQAAA+4AAAAgAAAAAQAAAAAAAAAPUmVjZWl2ZWRNZXNzYWdlAAAAAAEAAAPuAAAAIA==\",\n \"AAAAAQAAAAAAAAAAAAAABUFkbWluAAAAAAAAAQAAAAAAAAABMAAAAAAAABM=\",\n \"AAAAAQAAAAAAAAAAAAAAEEdhc09yYWNsZUFkZHJlc3MAAAABAAAAAAAAAAEwAAAAAAAAEw==\",\n \"AAAAAQAAAAAAAAAAAAAACEdhc1VzYWdlAAAAAQAAAAAAAAABMAAAAAAAA+wAAAAEAAAACg==\",\n \"AAAAAQAAAAAAAAAAAAAAC05hdGl2ZVRva2VuAAAAAAEAAAAAAAAAATAAAAAAAAAT\",\n \"AAAAAQAAAAAAAAAAAAAADVN0b3BBdXRob3JpdHkAAAAAAAABAAAAAAAAAAEwAAAAAAAAEw==\",\n \"AAAABAAAAAAAAAAAAAAABUVycm9yAAAAAAAAKAAAAAAAAAANVW5pbXBsZW1lbnRlZAAAAAAAAAAAAAAAAAAAC0luaXRpYWxpemVkAAAAAAEAAAAAAAAADVVuaW5pdGlhbGl6ZWQAAAAAAAACAAAAAAAAAAxVbmF1dGhvcml6ZWQAAAADAAAAAAAAAApJbnZhbGlkQXJnAAAAAAAEAAAAAAAAAA5JbnZhbGlkQ2hhaW5JZAAAAAAABQAAAAAAAAATSW52YWxpZE90aGVyQ2hhaW5JZAAAAAAGAAAAAAAAAA5HYXNVc2FnZU5vdFNldAAAAAAABwAAAAAAAAANQnJva2VuQWRkcmVzcwAAAAAAAAgAAAAAAAAACE5vdEZvdW5kAAAACQAAAAAAAAAYVG9rZW5JbnN1ZmZpY2llbnRCYWxhbmNlAAAACgAAAAAAAAAKQ2FzdEZhaWxlZAAAAAAACwAAAAAAAAAMVTI1Nk92ZXJmbG93AAAADAAAAAAAAAAKWmVyb0Ftb3VudAAAAAAAZwAAAAAAAAAMUG9vbE92ZXJmbG93AAAAaAAAAAAAAAALWmVyb0NoYW5nZXMAAAAAaQAAAAAAAAARUmVzZXJ2ZXNFeGhhdXN0ZWQAAAAAAABqAAAAAAAAABpJbnN1ZmZpY2llbnRSZWNlaXZlZEFtb3VudAAAAAAAawAAAAAAAAAUQmFsYW5jZVJhdGlvRXhjZWVkZWQAAABsAAAAAAAAAAlGb3JiaWRkZW4AAAAAAABtAAAAAAAAABlVbmF1dGhvcml6ZWRTdG9wQXV0aG9yaXR5AAAAAAAAywAAAAAAAAAOU3dhcFByb2hpYml0ZWQAAAAAAMwAAAAAAAAAEkFtb3VudFRvb0xvd0ZvckZlZQAAAAAAzQAAAAAAAAAWQnJpZGdlVG9UaGVaZXJvQWRkcmVzcwAAAAAAzgAAAAAAAAAORW1wdHlSZWNpcGllbnQAAAAAAM8AAAAAAAAAE1NvdXJjZU5vdFJlZ2lzdGVyZWQAAAAA0AAAAAAAAAAVV3JvbmdEZXN0aW5hdGlvbkNoYWluAAAAAAAA0QAAAAAAAAATVW5rbm93bkFub3RoZXJDaGFpbgAAAADSAAAAAAAAABFUb2tlbnNBbHJlYWR5U2VudAAAAAAAANMAAAAAAAAAEE1lc3NhZ2VQcm9jZXNzZWQAAADUAAAAAAAAAAxOb3RFbm91Z2hGZWUAAADWAAAAAAAAAAlOb01lc3NhZ2UAAAAAAADXAAAAAAAAAA1Ob1JlY2VpdmVQb29sAAAAAAAA2AAAAAAAAAAGTm9Qb29sAAAAAADZAAAAAAAAABNVbmtub3duQW5vdGhlclRva2VuAAAAANoAAAAAAAAAD1dyb25nQnl0ZUxlbmd0aAAAAAEsAAAAAAAAAApIYXNNZXNzYWdlAAAAAAEtAAAAAAAAABdJbnZhbGlkUHJpbWFyeVNpZ25hdHVyZQAAAAEuAAAAAAAAABlJbnZhbGlkU2Vjb25kYXJ5U2lnbmF0dXJlAAAAAAABLwAAAAAAAAARTm9HYXNEYXRhRm9yQ2hhaW4AAAAAAAGQ\",\n ]),\n options\n );\n }\n\n public readonly fromJSON = {\n initialize: this.txFromJSON<Result<void>>,\n swap_and_bridge: this.txFromJSON<Result<void>>,\n receive_tokens: this.txFromJSON<Result<void>>,\n swap: this.txFromJSON<Result<void>>,\n stop_swap: this.txFromJSON<Result<void>>,\n start_swap: this.txFromJSON<Result<void>>,\n set_gas_oracle: this.txFromJSON<Result<void>>,\n set_stop_authority: this.txFromJSON<Result<void>>,\n set_rebalancer: this.txFromJSON<Result<void>>,\n set_messenger: this.txFromJSON<Result<void>>,\n set_gas_usage: this.txFromJSON<Result<void>>,\n register_bridge: this.txFromJSON<Result<void>>,\n add_bridge_token: this.txFromJSON<Result<void>>,\n remove_bridge_token: this.txFromJSON<Result<void>>,\n add_pool: this.txFromJSON<Result<void>>,\n withdraw_gas_tokens: this.txFromJSON<Result<void>>,\n withdraw_bridging_fee_in_tokens: this.txFromJSON<Result<void>>,\n has_processed_message: this.txFromJSON<Result<boolean>>,\n has_received_message: this.txFromJSON<Result<boolean>>,\n get_pool_address: this.txFromJSON<Result<string>>,\n get_config: this.txFromJSON<Result<Bridge>>,\n get_stop_authority: this.txFromJSON<Result<string>>,\n get_transaction_cost: this.txFromJSON<Result<u128>>,\n get_gas_usage: this.txFromJSON<Result<u128>>,\n get_admin: this.txFromJSON<Result<string>>,\n get_gas_oracle: this.txFromJSON<Result<string>>,\n get_another_bridge: this.txFromJSON<Result<AnotherBridge>>,\n set_admin: this.txFromJSON<Result<void>>,\n upgrade: this.txFromJSON<Result<void>>,\n };\n}\n", "import { SuiClient } from \"@mysten/sui/client\";\nimport { CoinStruct } from \"@mysten/sui/src/client/types/generated\";\nimport { coinWithBalance, Transaction, TransactionResult } from \"@mysten/sui/transactions\";\nimport { SUI_CLOCK_OBJECT_ID } from \"@mysten/sui/utils\";\nimport { Big } from \"big.js\";\nimport { AllbridgeCoreClient } from \"../../../client/core-api/core-client-base\";\nimport {\n ChainSymbol,\n ChainType,\n FeePaymentMethod,\n Messenger,\n OFTDoesNotSupportedError,\n RawSuiTransaction,\n SdkError,\n SwapParams,\n TransactionResponse,\n} from \"../../../models\";\nimport { SuiAddresses } from \"../../../tokens-info\";\nimport { NodeRpcUrlsConfig } from \"../../index\";\nimport { setAddress } from \"../../models/sui/bridge\";\nimport { swap, swapAndBridge, swapAndBridgeWormhole } from \"../../models/sui/bridge/bridge-interface/functions\";\nimport { setAddress as setCctpAddress } from \"../../models/sui/cctp-bridge\";\nimport { bridge } from \"../../models/sui/cctp-bridge/cctp-bridge-interface/functions\";\nimport { setAddress as setUtilsAddress } from \"../../models/sui/utils\";\nimport { fromHex } from \"../../models/sui/utils/bytes32/functions\";\nimport { fetchAllPagesRecursive } from \"../../utils/sui/paginated\";\nimport { getCctpSolTokenRecipientAddress } from \"../get-cctp-sol-token-recipient-address\";\nimport { ChainBridgeService, SendParams, TxSendParamsSui, TxSwapParamsSui } from \"../models\";\nimport { getNonceBigInt, normalizeSuiHex, prepareTxSendParams, prepareTxSwapParams } from \"../utils\";\n\nexport class SuiBridgeService extends ChainBridgeService {\n chainType: ChainType.SUI = ChainType.SUI;\n chainSymbol: ChainSymbol.SUI = ChainSymbol.SUI;\n\n private readonly client: SuiClient;\n\n constructor(\n private nodeRpcUrlsConfig: NodeRpcUrlsConfig,\n public api: AllbridgeCoreClient\n ) {\n super();\n this.client = new SuiClient({\n url: nodeRpcUrlsConfig.getNodeRpcUrl(this.chainSymbol),\n });\n }\n\n send(): Promise<TransactionResponse> {\n throw new SdkError(\"Method send not implemented.\");\n }\n\n async buildRawTransactionSwap(params: SwapParams): Promise<RawSuiTransaction> {\n const suiAddresses = params.sourceToken.suiAddresses;\n if (!suiAddresses) {\n throw new SdkError(\"SUI token must contain 'suiAddresses'\");\n }\n setAddress(suiAddresses.bridgeAddress, suiAddresses.bridgeAddressOrigin);\n\n const txSwapParams = prepareTxSwapParams(this.chainType, params);\n return await this.buildRawTransactionSwapFromParams(txSwapParams, suiAddresses);\n }\n\n private async buildRawTransactionSwapFromParams(\n params: TxSwapParamsSui,\n suiAddresses: SuiAddresses\n ): Promise<RawSuiTransaction> {\n const { amount, fromAccountAddress, fromTokenAddress, toTokenAddress, minimumReceiveAmount } = params;\n\n const tx = new Transaction();\n tx.setSender(fromAccountAddress);\n\n const args = {\n bridge: suiAddresses.bridgeObjectAddress,\n coin: coinWithBalance({ balance: BigInt(amount), type: fromTokenAddress }),\n receiveAmountMin: BigInt(minimumReceiveAmount),\n };\n const swapResult = swap(tx, [fromTokenAddress, toTokenAddress], args);\n\n const coins: CoinStruct[] = await fetchAllPagesRecursive((cursor: string | null | undefined) =>\n this.client.getCoins({\n owner: params.toAccountAddress,\n coinType: toTokenAddress,\n cursor,\n })\n );\n if (coins.length === 0 || !coins[0]) {\n tx.transferObjects([swapResult], params.toAccountAddress);\n } else {\n tx.mergeCoins(coins[0].coinObjectId, [swapResult]);\n }\n return await tx.toJSON({ client: this.client });\n }\n\n async buildRawTransactionSendFromCustomTx(\n baseTx: string | Uint8Array | Transaction,\n inputCoin: TransactionResult,\n params: SendParams\n ): Promise<RawSuiTransaction> {\n const transaction = Transaction.from(baseTx);\n return this.buildRawTransactionSendFromTx(params, transaction, inputCoin);\n }\n\n async buildRawTransactionSend(params: SendParams): Promise<RawSuiTransaction> {\n return this.buildRawTransactionSendFromTx(params, new Transaction());\n }\n\n private async buildRawTransactionSendFromTx(\n params: SendParams,\n tx: Transaction,\n inputCoin?: TransactionResult\n ): Promise<RawSuiTransaction> {\n const txSendParams = await prepareTxSendParams(this.chainType, params, this.api);\n const { messenger } = txSendParams;\n\n const suiAddresses = params.sourceToken.suiAddresses;\n if (!suiAddresses) {\n throw new SdkError(\"SUI token must contain 'suiAddresses'\");\n }\n setAddress(suiAddresses.bridgeAddress, suiAddresses.bridgeAddressOrigin);\n setUtilsAddress(suiAddresses.utilsAddress);\n\n switch (messenger) {\n case Messenger.ALLBRIDGE:\n return this.buildRawTransactionAllbridgeSend(txSendParams, suiAddresses, tx, inputCoin);\n case Messenger.WORMHOLE:\n return this.buildRawTransactionWormholeSend(txSendParams, suiAddresses, tx, inputCoin);\n case Messenger.CCTP:\n case Messenger.CCTP_V2:\n return this.buildRawTransactionCctpSend(params, txSendParams, suiAddresses, tx, inputCoin);\n case Messenger.OFT:\n throw new OFTDoesNotSupportedError(\"Messenger OFT is not supported yet.\");\n }\n }\n\n private async buildRawTransactionAllbridgeSend(\n txSendParams: TxSendParamsSui,\n suiAddresses: SuiAddresses,\n tx: Transaction,\n inputCoin?: TransactionResult\n ): Promise<RawSuiTransaction> {\n const {\n amount,\n fromAccountAddress,\n fromTokenAddress,\n toChainId,\n toAccountAddress,\n toTokenAddress,\n fee,\n gasFeePaymentMethod,\n extraGas,\n } = txSendParams;\n let totalFee = fee;\n if (extraGas) {\n totalFee = Big(totalFee).plus(extraGas).toFixed();\n }\n\n tx.setSender(fromAccountAddress);\n if (gasFeePaymentMethod === FeePaymentMethod.WITH_STABLECOIN) {\n const amountWithoutFee = BigInt(amount) - BigInt(totalFee);\n\n let amountCoin, feeTokenCoin;\n if (inputCoin) {\n const [feeTokenCoinS] = tx.splitCoins(inputCoin, [totalFee]);\n amountCoin = inputCoin;\n feeTokenCoin = feeTokenCoinS;\n } else {\n amountCoin = coinWithBalance({ balance: amountWithoutFee, type: fromTokenAddress });\n feeTokenCoin = coinWithBalance({ balance: BigInt(totalFee), type: fromTokenAddress });\n }\n\n const args = {\n bridge: suiAddresses.bridgeObjectAddress,\n messenger: suiAddresses.allbridgeMessengerObjectAddress,\n amount: amountCoin,\n destinationChainId: toChainId,\n nonce: getNonceBigInt(),\n recipient: fromHex(tx, normalizeSuiHex(toAccountAddress)),\n receiveToken: fromHex(tx, normalizeSuiHex(toTokenAddress)),\n gasOracle: suiAddresses.gasOracleObjectAddress,\n feeTokenCoin: feeTokenCoin,\n feeSuiCoin: coinWithBalance({ balance: BigInt(0), useGasCoin: false }),\n };\n swapAndBridge(tx, fromTokenAddress, args);\n } else {\n const totalFeeCoin =\n totalFee === \"0\"\n ? coinWithBalance({ balance: BigInt(totalFee), useGasCoin: false })\n : coinWithBalance({ balance: BigInt(totalFee) });\n const args = {\n bridge: suiAddresses.bridgeObjectAddress,\n messenger: suiAddresses.allbridgeMessengerObjectAddress,\n amount: inputCoin ?? coinWithBalance({ balance: BigInt(amount), type: fromTokenAddress }),\n destinationChainId: toChainId,\n nonce: getNonceBigInt(),\n recipient: fromHex(tx, normalizeSuiHex(toAccountAddress)),\n receiveToken: fromHex(tx, normalizeSuiHex(toTokenAddress)),\n gasOracle: suiAddresses.gasOracleObjectAddress,\n feeTokenCoin: coinWithBalance({ balance: BigInt(0), type: fromTokenAddress }),\n feeSuiCoin: totalFeeCoin,\n };\n swapAndBridge(tx, fromTokenAddress, args);\n }\n return await tx.toJSON({ client: this.client });\n }\n\n private async buildRawTransactionWormholeSend(\n txSendParams: TxSendParamsSui,\n suiAddresses: SuiAddresses,\n tx: Transaction,\n inputCoin?: TransactionResult\n ): Promise<RawSuiTransaction> {\n const {\n amount,\n fromAccountAddress,\n fromTokenAddress,\n toChainId,\n toAccountAddress,\n toTokenAddress,\n fee,\n gasFeePaymentMethod,\n extraGas,\n } = txSendParams;\n let totalFee = fee;\n if (extraGas) {\n totalFee = Big(totalFee).plus(extraGas).toFixed();\n }\n\n tx.setSender(fromAccountAddress);\n if (gasFeePaymentMethod === FeePaymentMethod.WITH_STABLECOIN) {\n const amountWithoutFee = BigInt(amount) - BigInt(totalFee);\n\n let amountCoin, feeTokenCoin;\n if (inputCoin) {\n const [feeTokenCoinS] = tx.splitCoins(inputCoin, [totalFee]);\n amountCoin = inputCoin;\n feeTokenCoin = feeTokenCoinS;\n } else {\n amountCoin = coinWithBalance({ balance: amountWithoutFee, type: fromTokenAddress });\n feeTokenCoin = coinWithBalance({ balance: BigInt(totalFee), type: fromTokenAddress });\n }\n\n const args = {\n bridge: suiAddresses.bridgeObjectAddress,\n messenger: suiAddresses.wormholeMessengerObjectAddress,\n wormholeState: suiAddresses.wormholeStateObjectAddress,\n theClock: SUI_CLOCK_OBJECT_ID,\n amount: amountCoin,\n destinationChainId: toChainId,\n nonce: getNonceBigInt(),\n recipient: fromHex(tx, normalizeSuiHex(toAccountAddress)),\n receiveToken: fromHex(tx, normalizeSuiHex(toTokenAddress)),\n gasOracle: suiAddresses.gasOracleObjectAddress,\n feeTokenCoin: feeTokenCoin,\n feeSuiCoin: coinWithBalance({ balance: BigInt(0), useGasCoin: false }),\n };\n swapAndBridgeWormhole(tx, fromTokenAddress, args);\n } else {\n const totalFeeCoin =\n totalFee === \"0\"\n ? coinWithBalance({ balance: BigInt(totalFee), useGasCoin: false })\n : coinWithBalance({ balance: BigInt(totalFee) });\n const args = {\n bridge: suiAddresses.bridgeObjectAddress,\n messenger: suiAddresses.wormholeMessengerObjectAddress,\n wormholeState: suiAddresses.wormholeStateObjectAddress,\n theClock: SUI_CLOCK_OBJECT_ID,\n amount: inputCoin ?? coinWithBalance({ balance: BigInt(amount), type: fromTokenAddress }),\n destinationChainId: toChainId,\n nonce: getNonceBigInt(),\n recipient: fromHex(tx, normalizeSuiHex(toAccountAddress)),\n receiveToken: fromHex(tx, normalizeSuiHex(toTokenAddress)),\n gasOracle: suiAddresses.gasOracleObjectAddress,\n feeTokenCoin: coinWithBalance({ balance: BigInt(0), type: fromTokenAddress }),\n feeSuiCoin: totalFeeCoin,\n };\n swapAndBridgeWormhole(tx, fromTokenAddress, args);\n }\n return await tx.toJSON({ client: this.client });\n }\n\n private async buildRawTransactionCctpSend(\n params: SendParams,\n txSendParams: TxSendParamsSui,\n suiAddresses: SuiAddresses,\n tx: Transaction,\n inputCoin?: TransactionResult\n ): Promise<RawSuiTransaction> {\n const {\n amount,\n fromAccountAddress,\n fromTokenAddress,\n toChainId,\n toAccountAddress,\n fee,\n gasFeePaymentMethod,\n extraGas,\n } = txSendParams;\n\n setCctpAddress(suiAddresses.cctpAddress, suiAddresses.cctpAddressOrigin);\n\n let totalFee = fee;\n if (extraGas) {\n totalFee = Big(totalFee).plus(extraGas).toFixed();\n }\n\n tx.setSender(fromAccountAddress);\n\n const recipientWalletAddress = fromHex(tx, normalizeSuiHex(toAccountAddress));\n let recipient: TransactionResult;\n if (params.destinationToken.chainType === ChainType.SOLANA) {\n const recipientStr = await getCctpSolTokenRecipientAddress(\n this.chainType,\n params.toAccountAddress,\n params.destinationToken.tokenAddress,\n this.nodeRpcUrlsConfig.getNodeRpcUrl(ChainSymbol.SOL)\n );\n recipient = fromHex(tx, normalizeSuiHex(recipientStr));\n } else {\n recipient = recipientWalletAddress;\n }\n\n if (gasFeePaymentMethod === FeePaymentMethod.WITH_STABLECOIN) {\n const amountWithoutFee = BigInt(amount) - BigInt(totalFee);\n\n let amountCoin, feeTokenCoin;\n if (inputCoin) {\n const [feeTokenCoinS] = tx.splitCoins(inputCoin, [totalFee]);\n amountCoin = inputCoin;\n feeTokenCoin = feeTokenCoinS;\n } else {\n amountCoin = coinWithBalance({ balance: amountWithoutFee, type: fromTokenAddress });\n feeTokenCoin = coinWithBalance({ balance: BigInt(totalFee), type: fromTokenAddress });\n }\n\n const args = {\n cctpBridge: suiAddresses.cctpObjectAddress,\n tokenMessengerMinterState: suiAddresses.cctpTokenMessengerMinterStateObjectAddress,\n messageTransmitterState: suiAddresses.cctpMessageTransmitterStateObjectAddress,\n treasury: suiAddresses.cctpTreasuryObjectAddress,\n denyList: suiAddresses.cctpDenyListObjectAddress,\n amount: amountCoin,\n destinationChainId: toChainId,\n recipient: recipient,\n recipientWalletAddress: recipientWalletAddress,\n gasOracle: suiAddresses.gasOracleObjectAddress,\n feeTokenCoin: feeTokenCoin,\n feeSuiCoin: coinWithBalance({ balance: BigInt(0), useGasCoin: false }),\n };\n bridge(tx, fromTokenAddress, args);\n } else {\n const totalFeeCoin =\n totalFee === \"0\"\n ? coinWithBalance({ balance: BigInt(totalFee), useGasCoin: false })\n : coinWithBalance({ balance: BigInt(totalFee) });\n const args = {\n cctpBridge: suiAddresses.cctpObjectAddress,\n tokenMessengerMinterState: suiAddresses.cctpTokenMessengerMinterStateObjectAddress,\n messageTransmitterState: suiAddresses.cctpMessageTransmitterStateObjectAddress,\n treasury: suiAddresses.cctpTreasuryObjectAddress,\n denyList: suiAddresses.cctpDenyListObjectAddress,\n amount: inputCoin ?? coinWithBalance({ balance: BigInt(amount), type: fromTokenAddress }),\n destinationChainId: toChainId,\n recipient: recipient,\n recipientWalletAddress: recipientWalletAddress,\n gasOracle: suiAddresses.gasOracleObjectAddress,\n feeTokenCoin: coinWithBalance({ balance: BigInt(0), type: fromTokenAddress }),\n feeSuiCoin: totalFeeCoin,\n };\n bridge(tx, fromTokenAddress, args);\n }\n return await tx.toJSON({ client: this.client });\n }\n}\n", "// @ts-nocheck\nimport { PUBLISHED_AT } from \"..\";\nimport { obj, pure } from \"../../_framework/util\";\nimport { Transaction, TransactionArgument, TransactionObjectInput } from \"@mysten/sui/transactions\";\n\nexport function destroyEmpty(tx: Transaction, typeArg: string, userDeposit: TransactionObjectInput) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::destroy_empty`,\n typeArguments: [typeArg],\n arguments: [obj(tx, userDeposit)],\n });\n}\n\nexport interface SwapArgs {\n bridge: TransactionObjectInput;\n coin: TransactionObjectInput;\n receiveAmountMin: bigint | TransactionArgument;\n}\n\nexport function swap(tx: Transaction, typeArgs: [string, string], args: SwapArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::swap`,\n typeArguments: typeArgs,\n arguments: [obj(tx, args.bridge), obj(tx, args.coin), pure(tx, args.receiveAmountMin, `u64`)],\n });\n}\n\nexport interface DepositArgs {\n bridge: TransactionObjectInput;\n userDeposit: TransactionObjectInput;\n coin: TransactionObjectInput;\n}\n\nexport function deposit(tx: Transaction, typeArg: string, args: DepositArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::deposit`,\n typeArguments: [typeArg],\n arguments: [obj(tx, args.bridge), obj(tx, args.userDeposit), obj(tx, args.coin)],\n });\n}\n\nexport interface WithdrawArgs {\n bridge: TransactionObjectInput;\n userDeposit: TransactionObjectInput;\n amountLp: bigint | TransactionArgument;\n}\n\nexport function withdraw(tx: Transaction, typeArg: string, args: WithdrawArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::withdraw`,\n typeArguments: [typeArg],\n arguments: [obj(tx, args.bridge), obj(tx, args.userDeposit), pure(tx, args.amountLp, `u64`)],\n });\n}\n\nexport interface DepositFeeArgs {\n adminCap: TransactionObjectInput;\n bridge: TransactionObjectInput;\n coin: TransactionObjectInput;\n}\n\nexport function depositFee(tx: Transaction, typeArg: string, args: DepositFeeArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::deposit_fee`,\n typeArguments: [typeArg],\n arguments: [obj(tx, args.adminCap), obj(tx, args.bridge), obj(tx, args.coin)],\n });\n}\n\nexport interface MigrateArgs {\n adminCap: TransactionObjectInput;\n bridge: TransactionObjectInput;\n}\n\nexport function migrate(tx: Transaction, args: MigrateArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::migrate`,\n arguments: [obj(tx, args.adminCap), obj(tx, args.bridge)],\n });\n}\n\nexport interface SetGasUsageArgs {\n adminCap: TransactionObjectInput;\n bridge: TransactionObjectInput;\n chainId: number | TransactionArgument;\n value: bigint | TransactionArgument;\n}\n\nexport function setGasUsage(tx: Transaction, args: SetGasUsageArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::set_gas_usage`,\n arguments: [\n obj(tx, args.adminCap),\n obj(tx, args.bridge),\n pure(tx, args.chainId, `u8`),\n pure(tx, args.value, `u64`),\n ],\n });\n}\n\nexport interface WithdrawFeeArgs {\n adminCap: TransactionObjectInput;\n bridge: TransactionObjectInput;\n amount: bigint | TransactionArgument;\n}\n\nexport function withdrawFee(tx: Transaction, typeArg: string, args: WithdrawFeeArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::withdraw_fee`,\n typeArguments: [typeArg],\n arguments: [obj(tx, args.adminCap), obj(tx, args.bridge), pure(tx, args.amount, `u64`)],\n });\n}\n\nexport interface GasUsageArgs {\n bridge: TransactionObjectInput;\n chainId: number | TransactionArgument;\n}\n\nexport function gasUsage(tx: Transaction, args: GasUsageArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::gas_usage`,\n arguments: [obj(tx, args.bridge), pure(tx, args.chainId, `u8`)],\n });\n}\n\nexport function lpAmount(tx: Transaction, typeArg: string, userDeposit: TransactionObjectInput) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::lp_amount`,\n typeArguments: [typeArg],\n arguments: [obj(tx, userDeposit)],\n });\n}\n\nexport function rewardDebt(tx: Transaction, typeArg: string, userDeposit: TransactionObjectInput) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::reward_debt`,\n typeArguments: [typeArg],\n arguments: [obj(tx, userDeposit)],\n });\n}\n\nexport interface ClaimAdminFeeArgs {\n adminCap: TransactionObjectInput;\n bridge: TransactionObjectInput;\n}\n\nexport function claimAdminFee(tx: Transaction, typeArg: string, args: ClaimAdminFeeArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::claim_admin_fee`,\n typeArguments: [typeArg],\n arguments: [obj(tx, args.adminCap), obj(tx, args.bridge)],\n });\n}\n\nexport interface ClaimRewardArgs {\n bridge: TransactionObjectInput;\n userDeposit: TransactionObjectInput;\n}\n\nexport function claimReward(tx: Transaction, typeArg: string, args: ClaimRewardArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::claim_reward`,\n typeArguments: [typeArg],\n arguments: [obj(tx, args.bridge), obj(tx, args.userDeposit)],\n });\n}\n\nexport interface SetAdminFeeShareBpArgs {\n adminCap: TransactionObjectInput;\n bridge: TransactionObjectInput;\n adminFeeShareBp: bigint | TransactionArgument;\n}\n\nexport function setAdminFeeShareBp(tx: Transaction, typeArg: string, args: SetAdminFeeShareBpArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::set_admin_fee_share_bp`,\n typeArguments: [typeArg],\n arguments: [obj(tx, args.adminCap), obj(tx, args.bridge), pure(tx, args.adminFeeShareBp, `u64`)],\n });\n}\n\nexport function adminFeeShareBp(tx: Transaction, typeArg: string, bridge: TransactionObjectInput) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::admin_fee_share_bp`,\n typeArguments: [typeArg],\n arguments: [obj(tx, bridge)],\n });\n}\n\nexport interface SetBalanceRatioMinBpArgs {\n adminCap: TransactionObjectInput;\n bridge: TransactionObjectInput;\n balanceRatioMinBp: bigint | TransactionArgument;\n}\n\nexport function setBalanceRatioMinBp(tx: Transaction, typeArg: string, args: SetBalanceRatioMinBpArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::set_balance_ratio_min_bp`,\n typeArguments: [typeArg],\n arguments: [obj(tx, args.adminCap), obj(tx, args.bridge), pure(tx, args.balanceRatioMinBp, `u64`)],\n });\n}\n\nexport function pool(tx: Transaction, typeArg: string, bridge: TransactionObjectInput) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::pool`,\n typeArguments: [typeArg],\n arguments: [obj(tx, bridge)],\n });\n}\n\nexport interface AdjustTotalLpAmountArgs {\n adminCap: TransactionObjectInput;\n bridge: TransactionObjectInput;\n userDeposit: TransactionObjectInput;\n}\n\nexport function adjustTotalLpAmount(tx: Transaction, typeArg: string, args: AdjustTotalLpAmountArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::adjust_total_lp_amount`,\n typeArguments: [typeArg],\n arguments: [obj(tx, args.adminCap), obj(tx, args.bridge), obj(tx, args.userDeposit)],\n });\n}\n\nexport function canDeposit(tx: Transaction, typeArg: string, bridge: TransactionObjectInput) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::can_deposit`,\n typeArguments: [typeArg],\n arguments: [obj(tx, bridge)],\n });\n}\n\nexport function canWithdraw(tx: Transaction, typeArg: string, bridge: TransactionObjectInput) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::can_withdraw`,\n typeArguments: [typeArg],\n arguments: [obj(tx, bridge)],\n });\n}\n\nexport function feeShare(tx: Transaction, typeArg: string, bridge: TransactionObjectInput) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::fee_share`,\n typeArguments: [typeArg],\n arguments: [obj(tx, bridge)],\n });\n}\n\nexport interface SetFeeShareArgs {\n adminCap: TransactionObjectInput;\n bridge: TransactionObjectInput;\n feeShareBp: bigint | TransactionArgument;\n}\n\nexport function setFeeShare(tx: Transaction, typeArg: string, args: SetFeeShareArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::set_fee_share`,\n typeArguments: [typeArg],\n arguments: [obj(tx, args.adminCap), obj(tx, args.bridge), pure(tx, args.feeShareBp, `u64`)],\n });\n}\n\nexport interface StartDepositArgs {\n adminCap: TransactionObjectInput;\n bridge: TransactionObjectInput;\n}\n\nexport function startDeposit(tx: Transaction, typeArg: string, args: StartDepositArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::start_deposit`,\n typeArguments: [typeArg],\n arguments: [obj(tx, args.adminCap), obj(tx, args.bridge)],\n });\n}\n\nexport interface StartWithdrawArgs {\n adminCap: TransactionObjectInput;\n bridge: TransactionObjectInput;\n}\n\nexport function startWithdraw(tx: Transaction, typeArg: string, args: StartWithdrawArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::start_withdraw`,\n typeArguments: [typeArg],\n arguments: [obj(tx, args.adminCap), obj(tx, args.bridge)],\n });\n}\n\nexport interface StopDepositArgs {\n stopCap: TransactionObjectInput;\n bridge: TransactionObjectInput;\n}\n\nexport function stopDeposit(tx: Transaction, typeArg: string, args: StopDepositArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::stop_deposit`,\n typeArguments: [typeArg],\n arguments: [obj(tx, args.stopCap), obj(tx, args.bridge)],\n });\n}\n\nexport interface StopWithdrawArgs {\n stopCap: TransactionObjectInput;\n bridge: TransactionObjectInput;\n}\n\nexport function stopWithdraw(tx: Transaction, typeArg: string, args: StopWithdrawArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::stop_withdraw`,\n typeArguments: [typeArg],\n arguments: [obj(tx, args.stopCap), obj(tx, args.bridge)],\n });\n}\n\nexport interface AddBridgeArgs {\n adminCap: TransactionObjectInput;\n bridge: TransactionObjectInput;\n chainId: number | TransactionArgument;\n bridgeAddress: TransactionObjectInput;\n}\n\nexport function addBridge(tx: Transaction, args: AddBridgeArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::add_bridge`,\n arguments: [\n obj(tx, args.adminCap),\n obj(tx, args.bridge),\n pure(tx, args.chainId, `u8`),\n obj(tx, args.bridgeAddress),\n ],\n });\n}\n\nexport interface AddBridgeTokenArgs {\n adminCap: TransactionObjectInput;\n bridge: TransactionObjectInput;\n chainId: number | TransactionArgument;\n tokenAddress: TransactionObjectInput;\n}\n\nexport function addBridgeToken(tx: Transaction, args: AddBridgeTokenArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::add_bridge_token`,\n arguments: [obj(tx, args.adminCap), obj(tx, args.bridge), pure(tx, args.chainId, `u8`), obj(tx, args.tokenAddress)],\n });\n}\n\nexport interface AddPoolArgs {\n adminCap: TransactionObjectInput;\n bridge: TransactionObjectInput;\n pool: TransactionObjectInput;\n}\n\nexport function addPool(tx: Transaction, typeArg: string, args: AddPoolArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::add_pool`,\n typeArguments: [typeArg],\n arguments: [obj(tx, args.adminCap), obj(tx, args.bridge), obj(tx, args.pool)],\n });\n}\n\nexport function canSwap(tx: Transaction, bridge: TransactionObjectInput) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::can_swap`,\n arguments: [obj(tx, bridge)],\n });\n}\n\nexport function feeValue(tx: Transaction, typeArg: string, bridge: TransactionObjectInput) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::fee_value`,\n typeArguments: [typeArg],\n arguments: [obj(tx, bridge)],\n });\n}\n\nexport interface GetBridgeAllbridgeCostArgs {\n bridge: TransactionObjectInput;\n messenger: TransactionObjectInput;\n gasOracle: TransactionObjectInput;\n chainId: number | TransactionArgument;\n}\n\nexport function getBridgeAllbridgeCost(tx: Transaction, args: GetBridgeAllbridgeCostArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::get_bridge_allbridge_cost`,\n arguments: [obj(tx, args.bridge), obj(tx, args.messenger), obj(tx, args.gasOracle), pure(tx, args.chainId, `u8`)],\n });\n}\n\nexport interface GetBridgeCostArgs {\n bridge: TransactionObjectInput;\n gasOracle: TransactionObjectInput;\n chainId: number | TransactionArgument;\n}\n\nexport function getBridgeCost(tx: Transaction, args: GetBridgeCostArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::get_bridge_cost`,\n arguments: [obj(tx, args.bridge), obj(tx, args.gasOracle), pure(tx, args.chainId, `u8`)],\n });\n}\n\nexport interface GetBridgeWormholeCostArgs {\n bridge: TransactionObjectInput;\n messenger: TransactionObjectInput;\n wormholeState: TransactionObjectInput;\n gasOracle: TransactionObjectInput;\n chainId: number | TransactionArgument;\n}\n\nexport function getBridgeWormholeCost(tx: Transaction, args: GetBridgeWormholeCostArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::get_bridge_wormhole_cost`,\n arguments: [\n obj(tx, args.bridge),\n obj(tx, args.messenger),\n obj(tx, args.wormholeState),\n obj(tx, args.gasOracle),\n pure(tx, args.chainId, `u8`),\n ],\n });\n}\n\nexport interface IsProcessedMessageArgs {\n bridge: TransactionObjectInput;\n message: TransactionObjectInput;\n}\n\nexport function isProcessedMessage(tx: Transaction, args: IsProcessedMessageArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::is_processed_message`,\n arguments: [obj(tx, args.bridge), obj(tx, args.message)],\n });\n}\n\nexport interface ReceiveTokensWormholeArgs {\n bridge: TransactionObjectInput;\n messenger: TransactionObjectInput;\n amount: bigint | TransactionArgument;\n recipient: TransactionObjectInput;\n sourceChainId: number | TransactionArgument;\n nonce: bigint | TransactionArgument;\n receiveAmountMin: bigint | TransactionArgument;\n extraGasCoin: TransactionObjectInput;\n}\n\nexport function receiveTokensWormhole(tx: Transaction, typeArg: string, args: ReceiveTokensWormholeArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::receive_tokens_wormhole`,\n typeArguments: [typeArg],\n arguments: [\n obj(tx, args.bridge),\n obj(tx, args.messenger),\n pure(tx, args.amount, `u64`),\n obj(tx, args.recipient),\n pure(tx, args.sourceChainId, `u8`),\n pure(tx, args.nonce, `u256`),\n pure(tx, args.receiveAmountMin, `u64`),\n obj(tx, args.extraGasCoin),\n ],\n });\n}\n\nexport interface RemoveBridgeArgs {\n adminCap: TransactionObjectInput;\n bridge: TransactionObjectInput;\n chainId: number | TransactionArgument;\n}\n\nexport function removeBridge(tx: Transaction, args: RemoveBridgeArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::remove_bridge`,\n arguments: [obj(tx, args.adminCap), obj(tx, args.bridge), pure(tx, args.chainId, `u8`)],\n });\n}\n\nexport interface RemoveBridgeTokenArgs {\n adminCap: TransactionObjectInput;\n bridge: TransactionObjectInput;\n chainId: number | TransactionArgument;\n tokenAddress: TransactionObjectInput;\n}\n\nexport function removeBridgeToken(tx: Transaction, args: RemoveBridgeTokenArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::remove_bridge_token`,\n arguments: [obj(tx, args.adminCap), obj(tx, args.bridge), pure(tx, args.chainId, `u8`), obj(tx, args.tokenAddress)],\n });\n}\n\nexport interface SetRebalancerArgs {\n adminCap: TransactionObjectInput;\n bridge: TransactionObjectInput;\n rebalancer: string | TransactionArgument;\n}\n\nexport function setRebalancer(tx: Transaction, args: SetRebalancerArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::set_rebalancer`,\n arguments: [obj(tx, args.adminCap), obj(tx, args.bridge), pure(tx, args.rebalancer, `address`)],\n });\n}\n\nexport interface StartSwapArgs {\n adminCap: TransactionObjectInput;\n bridge: TransactionObjectInput;\n}\n\nexport function startSwap(tx: Transaction, args: StartSwapArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::start_swap`,\n arguments: [obj(tx, args.adminCap), obj(tx, args.bridge)],\n });\n}\n\nexport interface StopSwapArgs {\n stopSwapCap: TransactionObjectInput;\n bridge: TransactionObjectInput;\n}\n\nexport function stopSwap(tx: Transaction, args: StopSwapArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::stop_swap`,\n arguments: [obj(tx, args.stopSwapCap), obj(tx, args.bridge)],\n });\n}\n\nexport interface SwapAndBridgeWormholeArgs {\n bridge: TransactionObjectInput;\n messenger: TransactionObjectInput;\n wormholeState: TransactionObjectInput;\n theClock: TransactionObjectInput;\n gasOracle: TransactionObjectInput;\n amount: TransactionObjectInput;\n recipient: TransactionObjectInput;\n destinationChainId: number | TransactionArgument;\n receiveToken: TransactionObjectInput;\n nonce: bigint | TransactionArgument;\n feeSuiCoin: TransactionObjectInput;\n feeTokenCoin: TransactionObjectInput;\n}\n\nexport function swapAndBridgeWormhole(tx: Transaction, typeArg: string, args: SwapAndBridgeWormholeArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::swap_and_bridge_wormhole`,\n typeArguments: [typeArg],\n arguments: [\n obj(tx, args.bridge),\n obj(tx, args.messenger),\n obj(tx, args.wormholeState),\n obj(tx, args.theClock),\n obj(tx, args.gasOracle),\n obj(tx, args.amount),\n obj(tx, args.recipient),\n pure(tx, args.destinationChainId, `u8`),\n obj(tx, args.receiveToken),\n pure(tx, args.nonce, `u256`),\n obj(tx, args.feeSuiCoin),\n obj(tx, args.feeTokenCoin),\n ],\n });\n}\n\nexport interface NewPoolArgs {\n adminCap: TransactionObjectInput;\n coinMetadata: TransactionObjectInput;\n a: bigint | TransactionArgument;\n feeShareBp: bigint | TransactionArgument;\n}\n\nexport function newPool(tx: Transaction, typeArg: string, args: NewPoolArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::new_pool`,\n typeArguments: [typeArg],\n arguments: [\n obj(tx, args.adminCap),\n obj(tx, args.coinMetadata),\n pure(tx, args.a, `u64`),\n pure(tx, args.feeShareBp, `u64`),\n ],\n });\n}\n\nexport function newUserDeposit(tx: Transaction, typeArg: string) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::new_user_deposit`,\n typeArguments: [typeArg],\n arguments: [],\n });\n}\n\nexport function poolA(tx: Transaction, typeArg: string, bridge: TransactionObjectInput) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::pool_a`,\n typeArguments: [typeArg],\n arguments: [obj(tx, bridge)],\n });\n}\n\nexport function poolBalance(tx: Transaction, typeArg: string, bridge: TransactionObjectInput) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::pool_balance`,\n typeArguments: [typeArg],\n arguments: [obj(tx, bridge)],\n });\n}\n\nexport function poolD(tx: Transaction, typeArg: string, bridge: TransactionObjectInput) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::pool_d`,\n typeArguments: [typeArg],\n arguments: [obj(tx, bridge)],\n });\n}\n\nexport function poolDecimals(tx: Transaction, typeArg: string, bridge: TransactionObjectInput) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::pool_decimals`,\n typeArguments: [typeArg],\n arguments: [obj(tx, bridge)],\n });\n}\n\nexport function poolLpSupply(tx: Transaction, typeArg: string, bridge: TransactionObjectInput) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::pool_lp_supply`,\n typeArguments: [typeArg],\n arguments: [obj(tx, bridge)],\n });\n}\n\nexport interface PoolPendingRewardsArgs {\n bridge: TransactionObjectInput;\n userDeposit: TransactionObjectInput;\n}\n\nexport function poolPendingRewards(tx: Transaction, typeArg: string, args: PoolPendingRewardsArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::pool_pending_rewards`,\n typeArguments: [typeArg],\n arguments: [obj(tx, args.bridge), obj(tx, args.userDeposit)],\n });\n}\n\nexport function poolTokenBalance(tx: Transaction, typeArg: string, bridge: TransactionObjectInput) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::pool_token_balance`,\n typeArguments: [typeArg],\n arguments: [obj(tx, bridge)],\n });\n}\n\nexport function poolVusdBalance(tx: Transaction, typeArg: string, bridge: TransactionObjectInput) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::pool_vusd_balance`,\n typeArguments: [typeArg],\n arguments: [obj(tx, bridge)],\n });\n}\n\nexport interface ReceiveTokensArgs {\n bridge: TransactionObjectInput;\n messenger: TransactionObjectInput;\n amount: bigint | TransactionArgument;\n recipient: TransactionObjectInput;\n sourceChainId: number | TransactionArgument;\n nonce: bigint | TransactionArgument;\n receiveAmountMin: bigint | TransactionArgument;\n extraGasCoin: TransactionObjectInput;\n}\n\nexport function receiveTokens(tx: Transaction, typeArg: string, args: ReceiveTokensArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::receive_tokens`,\n typeArguments: [typeArg],\n arguments: [\n obj(tx, args.bridge),\n obj(tx, args.messenger),\n pure(tx, args.amount, `u64`),\n obj(tx, args.recipient),\n pure(tx, args.sourceChainId, `u8`),\n pure(tx, args.nonce, `u256`),\n pure(tx, args.receiveAmountMin, `u64`),\n obj(tx, args.extraGasCoin),\n ],\n });\n}\n\nexport interface SwapAndBridgeArgs {\n bridge: TransactionObjectInput;\n messenger: TransactionObjectInput;\n gasOracle: TransactionObjectInput;\n amount: TransactionObjectInput;\n recipient: TransactionObjectInput;\n destinationChainId: number | TransactionArgument;\n receiveToken: TransactionObjectInput;\n nonce: bigint | TransactionArgument;\n feeSuiCoin: TransactionObjectInput;\n feeTokenCoin: TransactionObjectInput;\n}\n\nexport function swapAndBridge(tx: Transaction, typeArg: string, args: SwapAndBridgeArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bridge_interface::swap_and_bridge`,\n typeArguments: [typeArg],\n arguments: [\n obj(tx, args.bridge),\n obj(tx, args.messenger),\n obj(tx, args.gasOracle),\n obj(tx, args.amount),\n obj(tx, args.recipient),\n pure(tx, args.destinationChainId, `u8`),\n obj(tx, args.receiveToken),\n pure(tx, args.nonce, `u256`),\n obj(tx, args.feeSuiCoin),\n obj(tx, args.feeTokenCoin),\n ],\n });\n}\n", "// @ts-nocheck\nimport { PUBLISHED_AT } from \"..\";\nimport { obj, pure } from \"../../_framework/util\";\nimport { Transaction, TransactionArgument, TransactionObjectInput } from \"@mysten/sui/transactions\";\n\nexport interface BridgeArgs {\n cctpBridge: TransactionObjectInput;\n gasOracle: TransactionObjectInput;\n tokenMessengerMinterState: TransactionObjectInput;\n messageTransmitterState: TransactionObjectInput;\n treasury: TransactionObjectInput;\n denyList: TransactionObjectInput;\n amount: TransactionObjectInput;\n feeSuiCoin: TransactionObjectInput;\n feeTokenCoin: TransactionObjectInput;\n destinationChainId: number | TransactionArgument;\n recipient: TransactionObjectInput;\n recipientWalletAddress: TransactionObjectInput;\n}\n\nexport function bridge(tx: Transaction, typeArg: string, args: BridgeArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::cctp_bridge_interface::bridge`,\n typeArguments: [typeArg],\n arguments: [\n obj(tx, args.cctpBridge),\n obj(tx, args.gasOracle),\n obj(tx, args.tokenMessengerMinterState),\n obj(tx, args.messageTransmitterState),\n obj(tx, args.treasury),\n obj(tx, args.denyList),\n obj(tx, args.amount),\n obj(tx, args.feeSuiCoin),\n obj(tx, args.feeTokenCoin),\n pure(tx, args.destinationChainId, `u8`),\n obj(tx, args.recipient),\n obj(tx, args.recipientWalletAddress),\n ],\n });\n}\n\nexport interface MigrateArgs {\n admin: TransactionObjectInput;\n messenger: TransactionObjectInput;\n}\n\nexport function migrate(tx: Transaction, args: MigrateArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::cctp_bridge_interface::migrate`,\n arguments: [obj(tx, args.admin), obj(tx, args.messenger)],\n });\n}\n\nexport interface GetTransactionCostArgs {\n cctpBridge: TransactionObjectInput;\n gasOracle: TransactionObjectInput;\n chainId: number | TransactionArgument;\n}\n\nexport function getTransactionCost(tx: Transaction, args: GetTransactionCostArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::cctp_bridge_interface::get_transaction_cost`,\n arguments: [obj(tx, args.cctpBridge), obj(tx, args.gasOracle), pure(tx, args.chainId, `u8`)],\n });\n}\n\nexport interface SetGasUsageArgs {\n adminCap: TransactionObjectInput;\n cctpBridge: TransactionObjectInput;\n chainId: number | TransactionArgument;\n value: bigint | TransactionArgument;\n}\n\nexport function setGasUsage(tx: Transaction, args: SetGasUsageArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::cctp_bridge_interface::set_gas_usage`,\n arguments: [\n obj(tx, args.adminCap),\n obj(tx, args.cctpBridge),\n pure(tx, args.chainId, `u8`),\n pure(tx, args.value, `u64`),\n ],\n });\n}\n\nexport interface WithdrawFeeArgs {\n adminCap: TransactionObjectInput;\n cctpBridge: TransactionObjectInput;\n amount: bigint | TransactionArgument;\n}\n\nexport function withdrawFee(tx: Transaction, typeArg: string, args: WithdrawFeeArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::cctp_bridge_interface::withdraw_fee`,\n typeArguments: [typeArg],\n arguments: [obj(tx, args.adminCap), obj(tx, args.cctpBridge), pure(tx, args.amount, `u64`)],\n });\n}\n\nexport interface GasUsageArgs {\n cctpBridge: TransactionObjectInput;\n chainId: number | TransactionArgument;\n}\n\nexport function gasUsage(tx: Transaction, args: GasUsageArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::cctp_bridge_interface::gas_usage`,\n arguments: [obj(tx, args.cctpBridge), pure(tx, args.chainId, `u8`)],\n });\n}\n\nexport function feeValue(tx: Transaction, typeArg: string, cctpBridge: TransactionObjectInput) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::cctp_bridge_interface::fee_value`,\n typeArguments: [typeArg],\n arguments: [obj(tx, cctpBridge)],\n });\n}\n\nexport interface ReceiveTokensArgs {\n tokenMessengerMinterState: TransactionObjectInput;\n messageTransmitterState: TransactionObjectInput;\n denyList: TransactionObjectInput;\n treasury: TransactionObjectInput;\n recipient: string | TransactionArgument;\n message: Array<number | TransactionArgument> | TransactionArgument;\n signature: Array<number | TransactionArgument> | TransactionArgument;\n extraGasCoin: TransactionObjectInput;\n}\n\nexport function receiveTokens(tx: Transaction, typeArg: string, args: ReceiveTokensArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::cctp_bridge_interface::receive_tokens`,\n typeArguments: [typeArg],\n arguments: [\n obj(tx, args.tokenMessengerMinterState),\n obj(tx, args.messageTransmitterState),\n obj(tx, args.denyList),\n obj(tx, args.treasury),\n pure(tx, args.recipient, `address`),\n pure(tx, args.message, `vector<u8>`),\n pure(tx, args.signature, `vector<u8>`),\n obj(tx, args.extraGasCoin),\n ],\n });\n}\n\nexport interface ChangeRecipientArgs {\n cctpBridge: TransactionObjectInput;\n originalMessage: Array<number | TransactionArgument> | TransactionArgument;\n originalAttestation: Array<number | TransactionArgument> | TransactionArgument;\n newRecipient: TransactionObjectInput;\n tokenMessengerMinterState: TransactionObjectInput;\n messageTransmitterState: TransactionObjectInput;\n}\n\nexport function changeRecipient(tx: Transaction, typeArg: string, args: ChangeRecipientArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::cctp_bridge_interface::change_recipient`,\n typeArguments: [typeArg],\n arguments: [\n obj(tx, args.cctpBridge),\n pure(tx, args.originalMessage, `vector<u8>`),\n pure(tx, args.originalAttestation, `vector<u8>`),\n obj(tx, args.newRecipient),\n obj(tx, args.tokenMessengerMinterState),\n obj(tx, args.messageTransmitterState),\n ],\n });\n}\n\nexport interface GetBridgingCostInTokensArgs {\n cctpBridge: TransactionObjectInput;\n gasOracle: TransactionObjectInput;\n chainId: number | TransactionArgument;\n}\n\nexport function getBridgingCostInTokens(tx: Transaction, args: GetBridgingCostInTokensArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::cctp_bridge_interface::get_bridging_cost_in_tokens`,\n arguments: [obj(tx, args.cctpBridge), obj(tx, args.gasOracle), pure(tx, args.chainId, `u8`)],\n });\n}\n\nexport interface GetDomainByChainIdArgs {\n cctpBridge: TransactionObjectInput;\n chainId: number | TransactionArgument;\n}\n\nexport function getDomainByChainId(tx: Transaction, args: GetDomainByChainIdArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::cctp_bridge_interface::get_domain_by_chain_id`,\n arguments: [obj(tx, args.cctpBridge), pure(tx, args.chainId, `u8`)],\n });\n}\n\nexport interface IsMessageProcessedArgs {\n cctpBridge: TransactionObjectInput;\n messageTransmitterState: TransactionObjectInput;\n sourceChainId: number | TransactionArgument;\n nonce: bigint | TransactionArgument;\n}\n\nexport function isMessageProcessed(tx: Transaction, args: IsMessageProcessedArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::cctp_bridge_interface::is_message_processed`,\n arguments: [\n obj(tx, args.cctpBridge),\n obj(tx, args.messageTransmitterState),\n pure(tx, args.sourceChainId, `u8`),\n pure(tx, args.nonce, `u64`),\n ],\n });\n}\n\nexport interface RegisterBridgeDestinationArgs {\n adminCap: TransactionObjectInput;\n cctpBridge: TransactionObjectInput;\n chainId: number | TransactionArgument;\n domain: number | TransactionArgument;\n}\n\nexport function registerBridgeDestination(tx: Transaction, args: RegisterBridgeDestinationArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::cctp_bridge_interface::register_bridge_destination`,\n arguments: [\n obj(tx, args.adminCap),\n obj(tx, args.cctpBridge),\n pure(tx, args.chainId, `u8`),\n pure(tx, args.domain, `u32`),\n ],\n });\n}\n\nexport interface SetAdminFeeShareArgs {\n adminCap: TransactionObjectInput;\n cctpBridge: TransactionObjectInput;\n adminFeeShareBp: bigint | TransactionArgument;\n}\n\nexport function setAdminFeeShare(tx: Transaction, args: SetAdminFeeShareArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::cctp_bridge_interface::set_admin_fee_share`,\n arguments: [obj(tx, args.adminCap), obj(tx, args.cctpBridge), pure(tx, args.adminFeeShareBp, `u64`)],\n });\n}\n\nexport interface UnregisterBridgeDestinationArgs {\n adminCap: TransactionObjectInput;\n cctpBridge: TransactionObjectInput;\n chainId: number | TransactionArgument;\n}\n\nexport function unregisterBridgeDestination(tx: Transaction, args: UnregisterBridgeDestinationArgs) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::cctp_bridge_interface::unregister_bridge_destination`,\n arguments: [obj(tx, args.adminCap), obj(tx, args.cctpBridge), pure(tx, args.chainId, `u8`)],\n });\n}\n", "// @ts-nocheck\nimport { PUBLISHED_AT } from \"..\";\nimport { String } from \"../../_dependencies/source/0x1/ascii/structs\";\nimport { String as String1 } from \"../../_dependencies/source/0x1/string/structs\";\nimport { obj, pure } from \"../../_framework/util\";\nimport { ID } from \"../../sui/object/structs\";\nimport { Transaction, TransactionArgument, TransactionObjectInput } from \"@mysten/sui/transactions\";\n\nexport function isZero(tx: Transaction, bytes: TransactionObjectInput) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bytes32::is_zero`,\n arguments: [obj(tx, bytes)],\n });\n}\n\nexport function data(tx: Transaction, bytes: TransactionObjectInput) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bytes32::data`,\n arguments: [obj(tx, bytes)],\n });\n}\n\nexport function empty(tx: Transaction) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bytes32::empty`,\n arguments: [],\n });\n}\n\nexport function new_(tx: Transaction, data: Array<number | TransactionArgument> | TransactionArgument) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bytes32::new`,\n arguments: [pure(tx, data, `vector<u8>`)],\n });\n}\n\nexport function fromAddress(tx: Transaction, a: string | TransactionArgument) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bytes32::from_address`,\n arguments: [pure(tx, a, `address`)],\n });\n}\n\nexport function fromAsciiHex(tx: Transaction, value: string | TransactionArgument) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bytes32::from_ascii_hex`,\n arguments: [pure(tx, value, `${String.$typeName}`)],\n });\n}\n\nexport function fromHex(tx: Transaction, value: string | TransactionArgument) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bytes32::from_hex`,\n arguments: [pure(tx, value, `${String1.$typeName}`)],\n });\n}\n\nexport function fromId(tx: Transaction, id: string | TransactionArgument) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bytes32::from_id`,\n arguments: [pure(tx, id, `${ID.$typeName}`)],\n });\n}\n\nexport function fromUid(tx: Transaction, id: TransactionObjectInput) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bytes32::from_uid`,\n arguments: [obj(tx, id)],\n });\n}\n\nexport function newFromPartial(\n tx: Transaction,\n partialData: Array<number | TransactionArgument> | TransactionArgument\n) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bytes32::new_from_partial`,\n arguments: [pure(tx, partialData, `vector<u8>`)],\n });\n}\n\nexport function toAddress(tx: Transaction, bytes: TransactionObjectInput) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bytes32::to_address`,\n arguments: [obj(tx, bytes)],\n });\n}\n\nexport function toAsciiHex(tx: Transaction, bytes: TransactionObjectInput) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bytes32::to_ascii_hex`,\n arguments: [obj(tx, bytes)],\n });\n}\n\nexport function toHex(tx: Transaction, bytes: TransactionObjectInput) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bytes32::to_hex`,\n arguments: [obj(tx, bytes)],\n });\n}\n\nexport function toId(tx: Transaction, bytes: TransactionObjectInput) {\n return tx.moveCall({\n target: `${PUBLISHED_AT}::bytes32::to_id`,\n arguments: [obj(tx, bytes)],\n });\n}\n", "// @ts-nocheck\n\nimport { bcs, BcsType } from \"@mysten/sui/bcs\";\nimport { fromHEX, toHEX } from \"@mysten/sui/utils\";\nimport { FieldsWithTypes, compressSuiType, parseTypeName } from \"./util\";\nimport { SuiClient, SuiParsedData, SuiObjectData } from \"@mysten/sui/client\";\n\n// for backwards compatibility\nexport { vector } from \"./vector\";\n\nexport interface StructClass {\n readonly $typeName: string;\n readonly $fullTypeName: string;\n readonly $typeArgs: string[];\n readonly $isPhantom: readonly boolean[];\n toJSONField(): Record<string, any>;\n toJSON(): Record<string, any>;\n\n __StructClass: true;\n}\n\nexport interface VectorClass {\n readonly $typeName: \"vector\";\n readonly $fullTypeName: string;\n readonly $typeArgs: [string];\n readonly $isPhantom: readonly [false];\n toJSONField(): any[];\n toJSON(): Record<string, any>;\n\n readonly elements: any;\n\n __VectorClass: true;\n}\n\nexport type Primitive = \"bool\" | \"u8\" | \"u16\" | \"u32\" | \"u64\" | \"u128\" | \"u256\" | \"address\";\nexport type TypeArgument = StructClass | Primitive | VectorClass;\n\nexport interface StructClassReified<T extends StructClass, Fields> {\n typeName: T[\"$typeName\"]; // e.g., '0x2::balance::Balance', without type arguments\n fullTypeName: ToTypeStr<T>; // e.g., '0x2::balance::Balance<0x2::sui:SUI>'\n typeArgs: T[\"$typeArgs\"]; // e.g., ['0x2::sui:SUI']\n isPhantom: T[\"$isPhantom\"]; // e.g., [true, false]\n reifiedTypeArgs: Array<Reified<TypeArgument, any> | PhantomReified<PhantomTypeArgument>>;\n bcs: BcsType<any>;\n fromFields(fields: Record<string, any>): T;\n fromFieldsWithTypes(item: FieldsWithTypes): T;\n fromBcs(data: Uint8Array): T;\n fromJSONField: (field: any) => T;\n fromJSON: (json: Record<string, any>) => T;\n fromSuiParsedData: (content: SuiParsedData) => T;\n fromSuiObjectData: (data: SuiObjectData) => T;\n fetch: (client: SuiClient, id: string) => Promise<T>;\n new: (fields: Fields) => T;\n kind: \"StructClassReified\";\n}\n\nexport interface VectorClassReified<T extends VectorClass, Elements> {\n typeName: T[\"$typeName\"];\n fullTypeName: ToTypeStr<T>;\n typeArgs: T[\"$typeArgs\"];\n isPhantom: readonly [false];\n reifiedTypeArgs: Array<Reified<TypeArgument, any>>;\n bcs: BcsType<any>;\n fromFields(fields: any[]): T;\n fromFieldsWithTypes(item: FieldsWithTypes): T;\n fromBcs(data: Uint8Array): T;\n fromJSONField: (field: any) => T;\n fromJSON: (json: Record<string, any>) => T;\n new: (elements: Elements) => T;\n kind: \"VectorClassReified\";\n}\n\nexport type Reified<T extends TypeArgument, Fields> = T extends Primitive\n ? Primitive\n : T extends StructClass\n ? StructClassReified<T, Fields>\n : T extends VectorClass\n ? VectorClassReified<T, Fields>\n : never;\n\nexport type ToTypeArgument<\n T extends Primitive | StructClassReified<StructClass, any> | VectorClassReified<VectorClass, any>,\n> = T extends Primitive\n ? T\n : T extends StructClassReified<infer U, any>\n ? U\n : T extends VectorClassReified<infer U, any>\n ? U\n : never;\n\nexport type ToPhantomTypeArgument<T extends PhantomReified<PhantomTypeArgument>> =\n T extends PhantomReified<infer U> ? U : never;\n\nexport type PhantomTypeArgument = string;\n\nexport interface PhantomReified<P> {\n phantomType: P;\n kind: \"PhantomReified\";\n}\n\nexport function phantom<T extends Reified<TypeArgument, any>>(reified: T): PhantomReified<ToTypeStr<ToTypeArgument<T>>>;\nexport function phantom<P extends PhantomTypeArgument>(phantomType: P): PhantomReified<P>;\nexport function phantom(type: string | Reified<TypeArgument, any>): PhantomReified<string> {\n if (typeof type === \"string\") {\n return {\n phantomType: type,\n kind: \"PhantomReified\",\n };\n } else {\n return {\n phantomType: type.fullTypeName,\n kind: \"PhantomReified\",\n };\n }\n}\n\nexport type ToTypeStr<T extends TypeArgument> = T extends Primitive\n ? T\n : T extends StructClass\n ? T[\"$fullTypeName\"]\n : T extends VectorClass\n ? T[\"$fullTypeName\"]\n : never;\n\nexport type PhantomToTypeStr<T extends PhantomTypeArgument> = T extends PhantomTypeArgument ? T : never;\n\nexport type ToJSON<T extends TypeArgument> = T extends \"bool\"\n ? boolean\n : T extends \"u8\"\n ? number\n : T extends \"u16\"\n ? number\n : T extends \"u32\"\n ? number\n : T extends \"u64\"\n ? string\n : T extends \"u128\"\n ? string\n : T extends \"u256\"\n ? string\n : T extends \"address\"\n ? string\n : T extends { $typeName: \"0x1::string::String\" }\n ? string\n : T extends { $typeName: \"0x1::ascii::String\" }\n ? string\n : T extends { $typeName: \"0x2::object::UID\" }\n ? string\n : T extends { $typeName: \"0x2::object::ID\" }\n ? string\n : T extends { $typeName: \"0x2::url::Url\" }\n ? string\n : T extends {\n $typeName: \"0x1::option::Option\";\n __inner: infer U extends TypeArgument;\n }\n ? ToJSON<U> | null\n : T extends VectorClass\n ? ReturnType<T[\"toJSONField\"]>\n : T extends StructClass\n ? ReturnType<T[\"toJSONField\"]>\n : never;\n\nexport type ToField<T extends TypeArgument> = T extends \"bool\"\n ? boolean\n : T extends \"u8\"\n ? number\n : T extends \"u16\"\n ? number\n : T extends \"u32\"\n ? number\n : T extends \"u64\"\n ? bigint\n : T extends \"u128\"\n ? bigint\n : T extends \"u256\"\n ? bigint\n : T extends \"address\"\n ? string\n : T extends { $typeName: \"0x1::string::String\" }\n ? string\n : T extends { $typeName: \"0x1::ascii::String\" }\n ? string\n : T extends { $typeName: \"0x2::object::UID\" }\n ? string\n : T extends { $typeName: \"0x2::object::ID\" }\n ? string\n : T extends { $typeName: \"0x2::url::Url\" }\n ? string\n : T extends {\n $typeName: \"0x1::option::Option\";\n __inner: infer U extends TypeArgument;\n }\n ? ToField<U> | null\n : T extends VectorClass\n ? T[\"elements\"]\n : T extends StructClass\n ? T\n : never;\n\nconst Address = bcs.bytes(32).transform({\n input: (val: string) => fromHEX(val),\n output: (val) => toHEX(val),\n});\n\nexport function toBcs<T extends Reified<TypeArgument, any>>(arg: T): BcsType<any> {\n switch (arg) {\n case \"bool\":\n return bcs.bool();\n case \"u8\":\n return bcs.u8();\n case \"u16\":\n return bcs.u16();\n case \"u32\":\n return bcs.u32();\n case \"u64\":\n return bcs.u64();\n case \"u128\":\n return bcs.u128();\n case \"u256\":\n return bcs.u256();\n case \"address\":\n return Address;\n default:\n return arg.bcs;\n }\n}\n\nexport function extractType<T extends Reified<TypeArgument, any>>(reified: T): ToTypeStr<ToTypeArgument<T>>;\nexport function extractType<T extends PhantomReified<PhantomTypeArgument>>(\n reified: T\n): PhantomToTypeStr<ToPhantomTypeArgument<T>>;\nexport function extractType<T extends Reified<TypeArgument, any> | PhantomReified<PhantomTypeArgument>>(\n reified: T\n): string;\nexport function extractType(reified: Reified<TypeArgument, any> | PhantomReified<string>): string {\n switch (reified) {\n case \"u8\":\n case \"u16\":\n case \"u32\":\n case \"u64\":\n case \"u128\":\n case \"u256\":\n case \"bool\":\n case \"address\":\n return reified;\n }\n switch (reified.kind) {\n case \"PhantomReified\":\n return reified.phantomType;\n case \"StructClassReified\":\n return reified.fullTypeName;\n case \"VectorClassReified\":\n return reified.fullTypeName;\n }\n\n throw new Error(\"unreachable\");\n}\n\nexport function decodeFromFields(reified: Reified<TypeArgument, any>, field: any) {\n switch (reified) {\n case \"bool\":\n case \"u8\":\n case \"u16\":\n case \"u32\":\n return field;\n case \"u64\":\n case \"u128\":\n case \"u256\":\n return BigInt(field);\n case \"address\":\n return `0x${field}`;\n }\n if (reified.kind === \"VectorClassReified\") {\n return reified.fromFields(field).elements;\n }\n switch (reified.typeName) {\n case \"0x1::string::String\":\n case \"0x1::ascii::String\":\n return new TextDecoder().decode(Uint8Array.from(field.bytes)).toString();\n case \"0x2::url::Url\":\n return new TextDecoder().decode(Uint8Array.from(field.url.bytes)).toString();\n case \"0x2::object::ID\":\n return `0x${field.bytes}`;\n case \"0x2::object::UID\":\n return `0x${field.id.bytes}`;\n case \"0x1::option::Option\": {\n if (field.vec.length === 0) {\n return null;\n }\n return (reified.fromFields(field) as any).vec[0];\n }\n default:\n return reified.fromFields(field);\n }\n}\n\nexport function decodeFromFieldsWithTypes(reified: Reified<TypeArgument, any>, item: any) {\n switch (reified) {\n case \"bool\":\n case \"u8\":\n case \"u16\":\n case \"u32\":\n return item;\n case \"u64\":\n case \"u128\":\n case \"u256\":\n return BigInt(item);\n case \"address\":\n return item;\n }\n if (reified.kind === \"VectorClassReified\") {\n return reified.fromFieldsWithTypes(item).elements;\n }\n switch (reified.typeName) {\n case \"0x1::string::String\":\n case \"0x1::ascii::String\":\n case \"0x2::url::Url\":\n case \"0x2::object::ID\":\n return item;\n case \"0x2::object::UID\":\n return item.id;\n case \"0x2::balance::Balance\":\n return reified.fromFields({ value: BigInt(item) });\n case \"0x1::option::Option\": {\n if (item === null) {\n return null;\n }\n return decodeFromFieldsWithTypes((reified as any).reifiedTypeArgs[0], item);\n }\n default:\n return reified.fromFieldsWithTypes(item);\n }\n}\n\nexport function assertReifiedTypeArgsMatch(\n fullType: string,\n typeArgs: string[],\n reifiedTypeArgs: Array<Reified<TypeArgument, any> | PhantomReified<string>>\n) {\n if (reifiedTypeArgs.length !== typeArgs.length) {\n throw new Error(\n `provided item has mismatching number of type argments ${fullType} (expected ${reifiedTypeArgs.length}, got ${typeArgs.length}))`\n );\n }\n for (let i = 0; i < typeArgs.length; i++) {\n if (compressSuiType(typeArgs[i]) !== compressSuiType(extractType(reifiedTypeArgs[i]))) {\n throw new Error(\n `provided item has mismatching type argments ${fullType} (expected ${extractType(reifiedTypeArgs[i])}, got ${\n typeArgs[i]\n }))`\n );\n }\n }\n}\n\nexport function assertFieldsWithTypesArgsMatch(\n item: FieldsWithTypes,\n reifiedTypeArgs: Array<Reified<TypeArgument, any> | PhantomReified<string>>\n) {\n const { typeArgs: itemTypeArgs } = parseTypeName(item.type);\n assertReifiedTypeArgsMatch(item.type, itemTypeArgs, reifiedTypeArgs);\n}\n\nexport function fieldToJSON<T extends TypeArgument>(type: string, field: ToField<T>): ToJSON<T> {\n const { typeName, typeArgs } = parseTypeName(type);\n switch (typeName) {\n case \"bool\":\n return field as any;\n case \"u8\":\n case \"u16\":\n case \"u32\":\n return field as any;\n case \"u64\":\n case \"u128\":\n case \"u256\":\n return field.toString() as any;\n case \"address\":\n case \"signer\":\n return field as any;\n case \"vector\":\n return (field as any[]).map((item: any) => fieldToJSON(typeArgs[0], item)) as any;\n // handle special types\n case \"0x1::string::String\":\n case \"0x1::ascii::String\":\n case \"0x2::url::Url\":\n case \"0x2::object::ID\":\n case \"0x2::object::UID\":\n return field as any;\n case \"0x1::option::Option\": {\n if (field === null) {\n return null as any;\n }\n return fieldToJSON(typeArgs[0], field);\n }\n default:\n return (field as any).toJSONField();\n }\n}\n\nexport function decodeFromJSONField(typeArg: Reified<TypeArgument, any>, field: any) {\n switch (typeArg) {\n case \"bool\":\n case \"u8\":\n case \"u16\":\n case \"u32\":\n return field;\n case \"u64\":\n case \"u128\":\n case \"u256\":\n return BigInt(field);\n case \"address\":\n return field;\n }\n if (typeArg.kind === \"VectorClassReified\") {\n return typeArg.fromJSONField(field).elements;\n }\n switch (typeArg.typeName) {\n case \"0x1::string::String\":\n case \"0x1::ascii::String\":\n case \"0x2::url::Url\":\n case \"0x2::object::ID\":\n case \"0x2::object::UID\":\n return field;\n case \"0x1::option::Option\": {\n if (field === null) {\n return null;\n }\n return decodeFromJSONField(typeArg.reifiedTypeArgs[0] as any, field);\n }\n default:\n return typeArg.fromJSONField(field);\n }\n}\n", "// @ts-nocheck\n\nimport { bcs } from \"@mysten/sui/bcs\";\nimport {\n decodeFromFields,\n decodeFromFieldsWithTypes,\n decodeFromJSONField,\n extractType,\n Reified,\n toBcs,\n ToField,\n ToTypeArgument,\n ToTypeStr,\n TypeArgument,\n VectorClass,\n VectorClassReified,\n fieldToJSON,\n} from \"./reified\";\nimport { composeSuiType, FieldsWithTypes } from \"./util\";\n\nexport type VectorElements<T extends TypeArgument> = Array<ToField<T>>;\n\nexport type VectorReified<T extends TypeArgument> = VectorClassReified<Vector<T>, VectorElements<T>>;\n\nexport class Vector<T extends TypeArgument> implements VectorClass {\n __VectorClass = true as const;\n\n static readonly $typeName = \"vector\";\n static readonly $numTypeParams = 1;\n static readonly $isPhantom = [false] as const;\n\n readonly $typeName = \"vector\";\n readonly $fullTypeName: `vector<${ToTypeStr<T>}>`;\n readonly $typeArgs: [ToTypeStr<T>];\n readonly $isPhantom = [false] as const;\n\n readonly elements: Array<ToField<T>>;\n\n constructor(typeArgs: [ToTypeStr<T>], elements: VectorElements<T>) {\n this.$fullTypeName = composeSuiType(this.$typeName, ...typeArgs) as `vector<${ToTypeStr<T>}>`;\n this.$typeArgs = typeArgs;\n\n this.elements = elements;\n }\n\n static reified<T extends Reified<TypeArgument, any>>(T: T): VectorReified<ToTypeArgument<T>> {\n return {\n typeName: Vector.$typeName,\n fullTypeName: composeSuiType(Vector.$typeName, ...[extractType(T)]) as `vector<${ToTypeStr<ToTypeArgument<T>>}>`,\n typeArgs: [extractType(T)] as [ToTypeStr<ToTypeArgument<T>>],\n isPhantom: Vector.$isPhantom,\n reifiedTypeArgs: [T],\n fromFields: (elements: any[]) => Vector.fromFields(T, elements),\n fromFieldsWithTypes: (item: FieldsWithTypes) => Vector.fromFieldsWithTypes(T, item),\n fromBcs: (data: Uint8Array) => Vector.fromBcs(T, data),\n bcs: Vector.bcs(toBcs(T)),\n fromJSONField: (field: any) => Vector.fromJSONField(T, field),\n fromJSON: (json: any) => Vector.fromJSON(T, json),\n new: (elements: VectorElements<ToTypeArgument<T>>) => {\n return new Vector([extractType(T)], elements);\n },\n kind: \"VectorClassReified\",\n };\n }\n\n static get r() {\n return Vector.reified;\n }\n\n static get bcs() {\n return bcs.vector;\n }\n\n static fromFields<T extends Reified<TypeArgument, any>>(typeArg: T, elements: any[]): Vector<ToTypeArgument<T>> {\n return Vector.reified(typeArg).new(elements.map((element) => decodeFromFields(typeArg, element)));\n }\n\n static fromFieldsWithTypes<T extends Reified<TypeArgument, any>>(\n typeArg: T,\n item: FieldsWithTypes\n ): Vector<ToTypeArgument<T>> {\n return Vector.reified(typeArg).new(\n (item as unknown as any[]).map((field: any) => decodeFromFieldsWithTypes(typeArg, field))\n );\n }\n\n static fromBcs<T extends Reified<TypeArgument, any>>(typeArg: T, data: Uint8Array): Vector<ToTypeArgument<T>> {\n return Vector.fromFields(typeArg, Vector.bcs(toBcs(typeArg)).parse(data));\n }\n\n toJSONField() {\n return this.elements.map((element) => fieldToJSON(this.$typeArgs[0], element));\n }\n\n toJSON() {\n return {\n $typeName: this.$typeName,\n $typeArgs: this.$typeArgs,\n elements: this.toJSONField(),\n };\n }\n\n static fromJSONField<T extends Reified<TypeArgument, any>>(typeArg: T, field: any[]): Vector<ToTypeArgument<T>> {\n return Vector.reified(typeArg).new(field.map((field) => decodeFromJSONField(typeArg, field)));\n }\n\n static fromJSON<T extends Reified<TypeArgument, any>>(typeArg: T, json: any): Vector<ToTypeArgument<T>> {\n if (json.$typeName !== Vector.$typeName) {\n throw new Error(\"not a vector json object\");\n }\n\n return Vector.fromJSONField(typeArg, json.elements);\n }\n}\n\nexport function vector<T extends Reified<TypeArgument, any>>(\n T: T\n): VectorClassReified<Vector<ToTypeArgument<T>>, VectorElements<ToTypeArgument<T>>> {\n return Vector.r(T);\n}\n", "// @ts-nocheck\nimport * as reified from \"../../../../_framework/reified\";\nimport {\n PhantomReified,\n Reified,\n StructClass,\n ToField,\n ToTypeStr,\n decodeFromFields,\n decodeFromFieldsWithTypes,\n decodeFromJSONField,\n fieldToJSON,\n phantom,\n} from \"../../../../_framework/reified\";\nimport { FieldsWithTypes, composeSuiType, compressSuiType } from \"../../../../_framework/util\";\nimport { Vector } from \"../../../../_framework/vector\";\nimport { PKG_V13 } from \"../index\";\nimport { bcs } from \"@mysten/sui/bcs\";\nimport { SuiClient, SuiObjectData, SuiParsedData } from \"@mysten/sui/client\";\nimport { fromB64 } from \"@mysten/sui/utils\";\n\n/* ============================== Char =============================== */\n\nexport function isChar(type: string): boolean {\n type = compressSuiType(type);\n return type === `${PKG_V13}::ascii::Char`;\n}\n\nexport interface CharFields {\n byte: ToField<\"u8\">;\n}\n\nexport type CharReified = Reified<Char, CharFields>;\n\nexport class Char implements StructClass {\n __StructClass = true as const;\n\n static get $typeName() {\n return `${PKG_V13}::ascii::Char`;\n }\n static readonly $numTypeParams = 0;\n static readonly $isPhantom = [] as const;\n\n readonly $typeName = Char.$typeName;\n readonly $fullTypeName: string;\n readonly $typeArgs: [];\n readonly $isPhantom = Char.$isPhantom;\n\n readonly byte: ToField<\"u8\">;\n\n private constructor(typeArgs: [], fields: CharFields) {\n this.$fullTypeName = composeSuiType(Char.$typeName, ...typeArgs) as string;\n this.$typeArgs = typeArgs;\n\n this.byte = fields.byte;\n }\n\n static reified(): CharReified {\n return {\n typeName: Char.$typeName,\n fullTypeName: composeSuiType(Char.$typeName, ...[]) as string,\n typeArgs: [] as [],\n isPhantom: Char.$isPhantom,\n reifiedTypeArgs: [],\n fromFields: (fields: Record<string, any>) => Char.fromFields(fields),\n fromFieldsWithTypes: (item: FieldsWithTypes) => Char.fromFieldsWithTypes(item),\n fromBcs: (data: Uint8Array) => Char.fromBcs(data),\n bcs: Char.bcs,\n fromJSONField: (field: any) => Char.fromJSONField(field),\n fromJSON: (json: Record<string, any>) => Char.fromJSON(json),\n fromSuiParsedData: (content: SuiParsedData) => Char.fromSuiParsedData(content),\n fromSuiObjectData: (content: SuiObjectData) => Char.fromSuiObjectData(content),\n fetch: async (client: SuiClient, id: string) => Char.fetch(client, id),\n new: (fields: CharFields) => {\n return new Char([], fields);\n },\n kind: \"StructClassReified\",\n };\n }\n\n static get r() {\n return Char.reified();\n }\n\n static phantom(): PhantomReified<ToTypeStr<Char>> {\n return phantom(Char.reified());\n }\n static get p() {\n return Char.phantom();\n }\n\n static get bcs() {\n return bcs.struct(\"Char\", {\n byte: bcs.u8(),\n });\n }\n\n static fromFields(fields: Record<string, any>): Char {\n return Char.reified().new({ byte: decodeFromFields(\"u8\", fields.byte) });\n }\n\n static fromFieldsWithTypes(item: FieldsWithTypes): Char {\n if (!isChar(item.type)) {\n throw new Error(\"not a Char type\");\n }\n\n return Char.reified().new({\n byte: decodeFromFieldsWithTypes(\"u8\", item.fields.byte),\n });\n }\n\n static fromBcs(data: Uint8Array): Char {\n return Char.fromFields(Char.bcs.parse(data));\n }\n\n toJSONField() {\n return {\n byte: this.byte,\n };\n }\n\n toJSON() {\n return {\n $typeName: this.$typeName,\n $typeArgs: this.$typeArgs,\n ...this.toJSONField(),\n };\n }\n\n static fromJSONField(field: any): Char {\n return Char.reified().new({ byte: decodeFromJSONField(\"u8\", field.byte) });\n }\n\n static fromJSON(json: Record<string, any>): Char {\n if (json.$typeName !== Char.$typeName) {\n throw new Error(\"not a WithTwoGenerics json object\");\n }\n\n return Char.fromJSONField(json);\n }\n\n static fromSuiParsedData(content: SuiParsedData): Char {\n if (content.dataType !== \"moveObject\") {\n throw new Error(\"not an object\");\n }\n if (!isChar(content.type)) {\n throw new Error(`object at ${(content.fields as any).id} is not a Char object`);\n }\n return Char.fromFieldsWithTypes(content);\n }\n\n static fromSuiObjectData(data: SuiObjectData): Char {\n if (data.bcs) {\n if (data.bcs.dataType !== \"moveObject\" || !isChar(data.bcs.type)) {\n throw new Error(`object at is not a Char object`);\n }\n\n return Char.fromBcs(fromB64(data.bcs.bcsBytes));\n }\n if (data.content) {\n return Char.fromSuiParsedData(data.content);\n }\n throw new Error(\n \"Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.\"\n );\n }\n\n static async fetch(client: SuiClient, id: string): Promise<Char> {\n const res = await client.getObject({ id, options: { showBcs: true } });\n if (res.error) {\n throw new Error(`error fetching Char object at id ${id}: ${res.error.code}`);\n }\n if (res.data?.bcs?.dataType !== \"moveObject\" || !isChar(res.data.bcs.type)) {\n throw new Error(`object at id ${id} is not a Char object`);\n }\n\n return Char.fromSuiObjectData(res.data);\n }\n}\n\n/* ============================== String =============================== */\n\nexport function isString(type: string): boolean {\n type = compressSuiType(type);\n return type === `${PKG_V13}::ascii::String`;\n}\n\nexport interface StringFields {\n bytes: ToField<Vector<\"u8\">>;\n}\n\nexport type StringReified = Reified<String, StringFields>;\n\nexport class String implements StructClass {\n __StructClass = true as const;\n\n static get $typeName() {\n return `${PKG_V13}::ascii::String`;\n }\n static readonly $numTypeParams = 0;\n static readonly $isPhantom = [] as const;\n\n readonly $typeName = String.$typeName;\n readonly $fullTypeName: string;\n readonly $typeArgs: [];\n readonly $isPhantom = String.$isPhantom;\n\n readonly bytes: ToField<Vector<\"u8\">>;\n\n private constructor(typeArgs: [], fields: StringFields) {\n this.$fullTypeName = composeSuiType(String.$typeName, ...typeArgs) as string;\n this.$typeArgs = typeArgs;\n\n this.bytes = fields.bytes;\n }\n\n static reified(): StringReified {\n return {\n typeName: String.$typeName,\n fullTypeName: composeSuiType(String.$typeName, ...[]) as string,\n typeArgs: [] as [],\n isPhantom: String.$isPhantom,\n reifiedTypeArgs: [],\n fromFields: (fields: Record<string, any>) => String.fromFields(fields),\n fromFieldsWithTypes: (item: FieldsWithTypes) => String.fromFieldsWithTypes(item),\n fromBcs: (data: Uint8Array) => String.fromBcs(data),\n bcs: String.bcs,\n fromJSONField: (field: any) => String.fromJSONField(field),\n fromJSON: (json: Record<string, any>) => String.fromJSON(json),\n fromSuiParsedData: (content: SuiParsedData) => String.fromSuiParsedData(content),\n fromSuiObjectData: (content: SuiObjectData) => String.fromSuiObjectData(content),\n fetch: async (client: SuiClient, id: string) => String.fetch(client, id),\n new: (fields: StringFields) => {\n return new String([], fields);\n },\n kind: \"StructClassReified\",\n };\n }\n\n static get r() {\n return String.reified();\n }\n\n static phantom(): PhantomReified<ToTypeStr<String>> {\n return phantom(String.reified());\n }\n static get p() {\n return String.phantom();\n }\n\n static get bcs() {\n return bcs.struct(\"String\", {\n bytes: bcs.vector(bcs.u8()),\n });\n }\n\n static fromFields(fields: Record<string, any>): String {\n return String.reified().new({\n bytes: decodeFromFields(reified.vector(\"u8\"), fields.bytes),\n });\n }\n\n static fromFieldsWithTypes(item: FieldsWithTypes): String {\n if (!isString(item.type)) {\n throw new Error(\"not a String type\");\n }\n\n return String.reified().new({\n bytes: decodeFromFieldsWithTypes(reified.vector(\"u8\"), item.fields.bytes),\n });\n }\n\n static fromBcs(data: Uint8Array): String {\n return String.fromFields(String.bcs.parse(data));\n }\n\n toJSONField() {\n return {\n bytes: fieldToJSON<Vector<\"u8\">>(`vector<u8>`, this.bytes),\n };\n }\n\n toJSON() {\n return {\n $typeName: this.$typeName,\n $typeArgs: this.$typeArgs,\n ...this.toJSONField(),\n };\n }\n\n static fromJSONField(field: any): String {\n return String.reified().new({\n bytes: decodeFromJSONField(reified.vector(\"u8\"), field.bytes),\n });\n }\n\n static fromJSON(json: Record<string, any>): String {\n if (json.$typeName !== String.$typeName) {\n throw new Error(\"not a WithTwoGenerics json object\");\n }\n\n return String.fromJSONField(json);\n }\n\n static fromSuiParsedData(content: SuiParsedData): String {\n if (content.dataType !== \"moveObject\") {\n throw new Error(\"not an object\");\n }\n if (!isString(content.type)) {\n throw new Error(`object at ${(content.fields as any).id} is not a String object`);\n }\n return String.fromFieldsWithTypes(content);\n }\n\n static fromSuiObjectData(data: SuiObjectData): String {\n if (data.bcs) {\n if (data.bcs.dataType !== \"moveObject\" || !isString(data.bcs.type)) {\n throw new Error(`object at is not a String object`);\n }\n\n return String.fromBcs(fromB64(data.bcs.bcsBytes));\n }\n if (data.content) {\n return String.fromSuiParsedData(data.content);\n }\n throw new Error(\n \"Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.\"\n );\n }\n\n static async fetch(client: SuiClient, id: string): Promise<String> {\n const res = await client.getObject({ id, options: { showBcs: true } });\n if (res.error) {\n throw new Error(`error fetching String object at id ${id}: ${res.error.code}`);\n }\n if (res.data?.bcs?.dataType !== \"moveObject\" || !isString(res.data.bcs.type)) {\n throw new Error(`object at id ${id} is not a String object`);\n }\n\n return String.fromSuiObjectData(res.data);\n }\n}\n", "// @ts-nocheck\nexport const PACKAGE_ID = \"0x1\";\nexport const PUBLISHED_AT = \"0x1\";\nexport const PKG_V13 = \"0x1\";\n", "// @ts-nocheck\nimport * as reified from \"../../../../_framework/reified\";\nimport {\n PhantomReified,\n Reified,\n StructClass,\n ToField,\n ToTypeStr,\n decodeFromFields,\n decodeFromFieldsWithTypes,\n decodeFromJSONField,\n fieldToJSON,\n phantom,\n} from \"../../../../_framework/reified\";\nimport { FieldsWithTypes, composeSuiType, compressSuiType } from \"../../../../_framework/util\";\nimport { Vector } from \"../../../../_framework/vector\";\nimport { PKG_V13 } from \"../index\";\nimport { bcs } from \"@mysten/sui/bcs\";\nimport { SuiClient, SuiObjectData, SuiParsedData } from \"@mysten/sui/client\";\nimport { fromB64 } from \"@mysten/sui/utils\";\n\n/* ============================== String =============================== */\n\nexport function isString(type: string): boolean {\n type = compressSuiType(type);\n return type === `${PKG_V13}::string::String`;\n}\n\nexport interface StringFields {\n bytes: ToField<Vector<\"u8\">>;\n}\n\nexport type StringReified = Reified<String, StringFields>;\n\nexport class String implements StructClass {\n __StructClass = true as const;\n\n static get $typeName() {\n return `${PKG_V13}::string::String`;\n }\n static readonly $numTypeParams = 0;\n static readonly $isPhantom = [] as const;\n\n readonly $typeName = String.$typeName;\n readonly $fullTypeName: string;\n readonly $typeArgs: [];\n readonly $isPhantom = String.$isPhantom;\n\n readonly bytes: ToField<Vector<\"u8\">>;\n\n private constructor(typeArgs: [], fields: StringFields) {\n this.$fullTypeName = composeSuiType(String.$typeName, ...typeArgs) as string;\n this.$typeArgs = typeArgs;\n\n this.bytes = fields.bytes;\n }\n\n static reified(): StringReified {\n return {\n typeName: String.$typeName,\n fullTypeName: composeSuiType(String.$typeName, ...[]) as string,\n typeArgs: [] as [],\n isPhantom: String.$isPhantom,\n reifiedTypeArgs: [],\n fromFields: (fields: Record<string, any>) => String.fromFields(fields),\n fromFieldsWithTypes: (item: FieldsWithTypes) => String.fromFieldsWithTypes(item),\n fromBcs: (data: Uint8Array) => String.fromBcs(data),\n bcs: String.bcs,\n fromJSONField: (field: any) => String.fromJSONField(field),\n fromJSON: (json: Record<string, any>) => String.fromJSON(json),\n fromSuiParsedData: (content: SuiParsedData) => String.fromSuiParsedData(content),\n fromSuiObjectData: (content: SuiObjectData) => String.fromSuiObjectData(content),\n fetch: async (client: SuiClient, id: string) => String.fetch(client, id),\n new: (fields: StringFields) => {\n return new String([], fields);\n },\n kind: \"StructClassReified\",\n };\n }\n\n static get r() {\n return String.reified();\n }\n\n static phantom(): PhantomReified<ToTypeStr<String>> {\n return phantom(String.reified());\n }\n static get p() {\n return String.phantom();\n }\n\n static get bcs() {\n return bcs.struct(\"String\", {\n bytes: bcs.vector(bcs.u8()),\n });\n }\n\n static fromFields(fields: Record<string, any>): String {\n return String.reified().new({\n bytes: decodeFromFields(reified.vector(\"u8\"), fields.bytes),\n });\n }\n\n static fromFieldsWithTypes(item: FieldsWithTypes): String {\n if (!isString(item.type)) {\n throw new Error(\"not a String type\");\n }\n\n return String.reified().new({\n bytes: decodeFromFieldsWithTypes(reified.vector(\"u8\"), item.fields.bytes),\n });\n }\n\n static fromBcs(data: Uint8Array): String {\n return String.fromFields(String.bcs.parse(data));\n }\n\n toJSONField() {\n return {\n bytes: fieldToJSON<Vector<\"u8\">>(`vector<u8>`, this.bytes),\n };\n }\n\n toJSON() {\n return {\n $typeName: this.$typeName,\n $typeArgs: this.$typeArgs,\n ...this.toJSONField(),\n };\n }\n\n static fromJSONField(field: any): String {\n return String.reified().new({\n bytes: decodeFromJSONField(reified.vector(\"u8\"), field.bytes),\n });\n }\n\n static fromJSON(json: Record<string, any>): String {\n if (json.$typeName !== String.$typeName) {\n throw new Error(\"not a WithTwoGenerics json object\");\n }\n\n return String.fromJSONField(json);\n }\n\n static fromSuiParsedData(content: SuiParsedData): String {\n if (content.dataType !== \"moveObject\") {\n throw new Error(\"not an object\");\n }\n if (!isString(content.type)) {\n throw new Error(`object at ${(content.fields as any).id} is not a String object`);\n }\n return String.fromFieldsWithTypes(content);\n }\n\n static fromSuiObjectData(data: SuiObjectData): String {\n if (data.bcs) {\n if (data.bcs.dataType !== \"moveObject\" || !isString(data.bcs.type)) {\n throw new Error(`object at is not a String object`);\n }\n\n return String.fromBcs(fromB64(data.bcs.bcsBytes));\n }\n if (data.content) {\n return String.fromSuiParsedData(data.content);\n }\n throw new Error(\n \"Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.\"\n );\n }\n\n static async fetch(client: SuiClient, id: string): Promise<String> {\n const res = await client.getObject({ id, options: { showBcs: true } });\n if (res.error) {\n throw new Error(`error fetching String object at id ${id}: ${res.error.code}`);\n }\n if (res.data?.bcs?.dataType !== \"moveObject\" || !isString(res.data.bcs.type)) {\n throw new Error(`object at id ${id} is not a String object`);\n }\n\n return String.fromSuiObjectData(res.data);\n }\n}\n", "// @ts-nocheck\nimport {\n PhantomReified,\n Reified,\n StructClass,\n ToField,\n ToTypeStr,\n decodeFromFields,\n decodeFromFieldsWithTypes,\n decodeFromJSONField,\n phantom,\n} from \"../../_framework/reified\";\nimport { FieldsWithTypes, composeSuiType, compressSuiType } from \"../../_framework/util\";\nimport { PKG_V26 } from \"../index\";\nimport { bcs } from \"@mysten/sui/bcs\";\nimport { SuiClient, SuiObjectData, SuiParsedData } from \"@mysten/sui/client\";\nimport { fromB64, fromHEX, toHEX } from \"@mysten/sui/utils\";\n\n/* ============================== ID =============================== */\n\nexport function isID(type: string): boolean {\n type = compressSuiType(type);\n return type === `${PKG_V26}::object::ID`;\n}\n\nexport interface IDFields {\n bytes: ToField<\"address\">;\n}\n\nexport type IDReified = Reified<ID, IDFields>;\n\nexport class ID implements StructClass {\n __StructClass = true as const;\n\n static get $typeName() {\n return `${PKG_V26}::object::ID`;\n }\n static readonly $numTypeParams = 0;\n static readonly $isPhantom = [] as const;\n\n readonly $typeName = ID.$typeName;\n readonly $fullTypeName: string;\n readonly $typeArgs: [];\n readonly $isPhantom = ID.$isPhantom;\n\n readonly bytes: ToField<\"address\">;\n\n private constructor(typeArgs: [], fields: IDFields) {\n this.$fullTypeName = composeSuiType(ID.$typeName, ...typeArgs) as string;\n this.$typeArgs = typeArgs;\n\n this.bytes = fields.bytes;\n }\n\n static reified(): IDReified {\n return {\n typeName: ID.$typeName,\n fullTypeName: composeSuiType(ID.$typeName, ...[]) as string,\n typeArgs: [] as [],\n isPhantom: ID.$isPhantom,\n reifiedTypeArgs: [],\n fromFields: (fields: Record<string, any>) => ID.fromFields(fields),\n fromFieldsWithTypes: (item: FieldsWithTypes) => ID.fromFieldsWithTypes(item),\n fromBcs: (data: Uint8Array) => ID.fromBcs(data),\n bcs: ID.bcs,\n fromJSONField: (field: any) => ID.fromJSONField(field),\n fromJSON: (json: Record<string, any>) => ID.fromJSON(json),\n fromSuiParsedData: (content: SuiParsedData) => ID.fromSuiParsedData(content),\n fromSuiObjectData: (content: SuiObjectData) => ID.fromSuiObjectData(content),\n fetch: async (client: SuiClient, id: string) => ID.fetch(client, id),\n new: (fields: IDFields) => {\n return new ID([], fields);\n },\n kind: \"StructClassReified\",\n };\n }\n\n static get r() {\n return ID.reified();\n }\n\n static phantom(): PhantomReified<ToTypeStr<ID>> {\n return phantom(ID.reified());\n }\n static get p() {\n return ID.phantom();\n }\n\n static get bcs() {\n return bcs.struct(\"ID\", {\n bytes: bcs.bytes(32).transform({\n input: (val: string) => fromHEX(val),\n output: (val: Uint8Array) => toHEX(val),\n }),\n });\n }\n\n static fromFields(fields: Record<string, any>): ID {\n return ID.reified().new({\n bytes: decodeFromFields(\"address\", fields.bytes),\n });\n }\n\n static fromFieldsWithTypes(item: FieldsWithTypes): ID {\n if (!isID(item.type)) {\n throw new Error(\"not a ID type\");\n }\n\n return ID.reified().new({\n bytes: decodeFromFieldsWithTypes(\"address\", item.fields.bytes),\n });\n }\n\n static fromBcs(data: Uint8Array): ID {\n return ID.fromFields(ID.bcs.parse(data));\n }\n\n toJSONField() {\n return {\n bytes: this.bytes,\n };\n }\n\n toJSON() {\n return {\n $typeName: this.$typeName,\n $typeArgs: this.$typeArgs,\n ...this.toJSONField(),\n };\n }\n\n static fromJSONField(field: any): ID {\n return ID.reified().new({\n bytes: decodeFromJSONField(\"address\", field.bytes),\n });\n }\n\n static fromJSON(json: Record<string, any>): ID {\n if (json.$typeName !== ID.$typeName) {\n throw new Error(\"not a WithTwoGenerics json object\");\n }\n\n return ID.fromJSONField(json);\n }\n\n static fromSuiParsedData(content: SuiParsedData): ID {\n if (content.dataType !== \"moveObject\") {\n throw new Error(\"not an object\");\n }\n if (!isID(content.type)) {\n throw new Error(`object at ${(content.fields as any).id} is not a ID object`);\n }\n return ID.fromFieldsWithTypes(content);\n }\n\n static fromSuiObjectData(data: SuiObjectData): ID {\n if (data.bcs) {\n if (data.bcs.dataType !== \"moveObject\" || !isID(data.bcs.type)) {\n throw new Error(`object at is not a ID object`);\n }\n\n return ID.fromBcs(fromB64(data.bcs.bcsBytes));\n }\n if (data.content) {\n return ID.fromSuiParsedData(data.content);\n }\n throw new Error(\n \"Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.\"\n );\n }\n\n static async fetch(client: SuiClient, id: string): Promise<ID> {\n const res = await client.getObject({ id, options: { showBcs: true } });\n if (res.error) {\n throw new Error(`error fetching ID object at id ${id}: ${res.error.code}`);\n }\n if (res.data?.bcs?.dataType !== \"moveObject\" || !isID(res.data.bcs.type)) {\n throw new Error(`object at id ${id} is not a ID object`);\n }\n\n return ID.fromSuiObjectData(res.data);\n }\n}\n\n/* ============================== UID =============================== */\n\nexport function isUID(type: string): boolean {\n type = compressSuiType(type);\n return type === `${PKG_V26}::object::UID`;\n}\n\nexport interface UIDFields {\n id: ToField<ID>;\n}\n\nexport type UIDReified = Reified<UID, UIDFields>;\n\nexport class UID implements StructClass {\n __StructClass = true as const;\n\n static get $typeName() {\n return `${PKG_V26}::object::UID`;\n }\n static readonly $numTypeParams = 0;\n static readonly $isPhantom = [] as const;\n\n readonly $typeName = UID.$typeName;\n readonly $fullTypeName: string;\n readonly $typeArgs: [];\n readonly $isPhantom = UID.$isPhantom;\n\n readonly id: ToField<ID>;\n\n private constructor(typeArgs: [], fields: UIDFields) {\n this.$fullTypeName = composeSuiType(UID.$typeName, ...typeArgs) as string;\n this.$typeArgs = typeArgs;\n\n this.id = fields.id;\n }\n\n static reified(): UIDReified {\n return {\n typeName: UID.$typeName,\n fullTypeName: composeSuiType(UID.$typeName, ...[]) as string,\n typeArgs: [] as [],\n isPhantom: UID.$isPhantom,\n reifiedTypeArgs: [],\n fromFields: (fields: Record<string, any>) => UID.fromFields(fields),\n fromFieldsWithTypes: (item: FieldsWithTypes) => UID.fromFieldsWithTypes(item),\n fromBcs: (data: Uint8Array) => UID.fromBcs(data),\n bcs: UID.bcs,\n fromJSONField: (field: any) => UID.fromJSONField(field),\n fromJSON: (json: Record<string, any>) => UID.fromJSON(json),\n fromSuiParsedData: (content: SuiParsedData) => UID.fromSuiParsedData(content),\n fromSuiObjectData: (content: SuiObjectData) => UID.fromSuiObjectData(content),\n fetch: async (client: SuiClient, id: string) => UID.fetch(client, id),\n new: (fields: UIDFields) => {\n return new UID([], fields);\n },\n kind: \"StructClassReified\",\n };\n }\n\n static get r() {\n return UID.reified();\n }\n\n static phantom(): PhantomReified<ToTypeStr<UID>> {\n return phantom(UID.reified());\n }\n static get p() {\n return UID.phantom();\n }\n\n static get bcs() {\n return bcs.struct(\"UID\", {\n id: ID.bcs,\n });\n }\n\n static fromFields(fields: Record<string, any>): UID {\n return UID.reified().new({ id: decodeFromFields(ID.reified(), fields.id) });\n }\n\n static fromFieldsWithTypes(item: FieldsWithTypes): UID {\n if (!isUID(item.type)) {\n throw new Error(\"not a UID type\");\n }\n\n return UID.reified().new({\n id: decodeFromFieldsWithTypes(ID.reified(), item.fields.id),\n });\n }\n\n static fromBcs(data: Uint8Array): UID {\n return UID.fromFields(UID.bcs.parse(data));\n }\n\n toJSONField() {\n return {\n id: this.id,\n };\n }\n\n toJSON() {\n return {\n $typeName: this.$typeName,\n $typeArgs: this.$typeArgs,\n ...this.toJSONField(),\n };\n }\n\n static fromJSONField(field: any): UID {\n return UID.reified().new({\n id: decodeFromJSONField(ID.reified(), field.id),\n });\n }\n\n static fromJSON(json: Record<string, any>): UID {\n if (json.$typeName !== UID.$typeName) {\n throw new Error(\"not a WithTwoGenerics json object\");\n }\n\n return UID.fromJSONField(json);\n }\n\n static fromSuiParsedData(content: SuiParsedData): UID {\n if (content.dataType !== \"moveObject\") {\n throw new Error(\"not an object\");\n }\n if (!isUID(content.type)) {\n throw new Error(`object at ${(content.fields as any).id} is not a UID object`);\n }\n return UID.fromFieldsWithTypes(content);\n }\n\n static fromSuiObjectData(data: SuiObjectData): UID {\n if (data.bcs) {\n if (data.bcs.dataType !== \"moveObject\" || !isUID(data.bcs.type)) {\n throw new Error(`object at is not a UID object`);\n }\n\n return UID.fromBcs(fromB64(data.bcs.bcsBytes));\n }\n if (data.content) {\n return UID.fromSuiParsedData(data.content);\n }\n throw new Error(\n \"Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.\"\n );\n }\n\n static async fetch(client: SuiClient, id: string): Promise<UID> {\n const res = await client.getObject({ id, options: { showBcs: true } });\n if (res.error) {\n throw new Error(`error fetching UID object at id ${id}: ${res.error.code}`);\n }\n if (res.data?.bcs?.dataType !== \"moveObject\" || !isUID(res.data.bcs.type)) {\n throw new Error(`object at id ${id} is not a UID object`);\n }\n\n return UID.fromSuiObjectData(res.data);\n }\n}\n", "// @ts-nocheck\nexport const PACKAGE_ID = \"0x2\";\nexport const PUBLISHED_AT = \"0x2\";\nexport const PKG_V26 = \"0x2\";\n", "interface PaginatedResults<Data> {\n data: Data[];\n hasNextPage: boolean;\n nextCursor?: string | null;\n}\n\nexport async function fetchAllPagesRecursive<Data, Result extends PaginatedResults<Data>>(\n fetchFunction: (cursor?: string | null) => Promise<Result>,\n cursor?: string | null,\n accumulatedData: Data[] = []\n): Promise<Data[]> {\n const result = await fetchFunction(cursor);\n const newAccumulatedData = accumulatedData.concat(result.data);\n\n if (result.hasNextPage && result.nextCursor) {\n return fetchAllPagesRecursive(fetchFunction, result.nextCursor, newAccumulatedData);\n } else {\n return newAccumulatedData;\n }\n}\n", "import { Big } from \"big.js\";\nimport { TronWeb } from \"tronweb\";\nimport { ChainType } from \"../../../chains/chain.enums\";\nimport { AllbridgeCoreClient } from \"../../../client/core-api/core-client-base\";\nimport { SdkError } from \"../../../exceptions\";\nimport { FeePaymentMethod, Messenger, SwapParams, TransactionResponse } from \"../../../models\";\nimport { RawTransaction, SmartContractMethodParameter } from \"../../models\";\nimport { sendRawTransaction } from \"../../utils/trx\";\nimport { SendParams, TxSendParamsTrx, TxSwapParamsTrx } from \"../models\";\nimport { ChainBridgeService } from \"../models/bridge\";\nimport { getNonceBigInt, prepareTxSendParams, prepareTxSwapParams } from \"../utils\";\n\nexport class TronBridgeService extends ChainBridgeService {\n chainType: ChainType.TRX = ChainType.TRX;\n\n constructor(\n public tronWeb: TronWeb,\n public api: AllbridgeCoreClient\n ) {\n super();\n }\n\n async send(params: SendParams): Promise<TransactionResponse> {\n const txSendParams = await prepareTxSendParams(this.chainType, params, this.api);\n const rawTransaction = await this.buildRawTransactionSendFromParams(params, txSendParams);\n return await sendRawTransaction(this.tronWeb, rawTransaction);\n }\n\n async buildRawTransactionSwap(params: SwapParams): Promise<RawTransaction> {\n const txSwapParams = prepareTxSwapParams(this.chainType, params);\n return await this.buildRawTransactionSwapFromParams(txSwapParams);\n }\n\n async buildRawTransactionSwapFromParams(params: TxSwapParamsTrx): Promise<RawTransaction> {\n const {\n amount,\n contractAddress,\n fromAccountAddress,\n fromTokenAddress,\n toAccountAddress,\n toTokenAddress,\n minimumReceiveAmount,\n } = params;\n\n const parameters = [\n { type: \"uint256\", value: amount },\n { type: \"bytes32\", value: fromTokenAddress },\n { type: \"bytes32\", value: toTokenAddress },\n { type: \"address\", value: toAccountAddress },\n { type: \"uint256\", value: minimumReceiveAmount },\n ];\n const methodSignature = \"swap(uint256,bytes32,bytes32,address,uint256)\";\n return this.buildRawTransaction(contractAddress, methodSignature, parameters, \"0\", fromAccountAddress);\n }\n\n async buildRawTransactionSend(params: SendParams): Promise<RawTransaction> {\n const txSendParams = await prepareTxSendParams(this.chainType, params, this.api);\n return this.buildRawTransactionSendFromParams(params, txSendParams);\n }\n\n async buildRawTransactionSendFromParams(sendParams: SendParams, params: TxSendParamsTrx): Promise<RawTransaction> {\n const {\n amount,\n contractAddress,\n fromAccountAddress,\n fromTokenAddress,\n toChainId,\n toAccountAddress,\n toTokenAddress,\n messenger,\n fee,\n gasFeePaymentMethod,\n extraGas,\n extraGasDest,\n } = params;\n\n let totalFee = fee;\n if (extraGas) {\n totalFee = Big(totalFee).plus(extraGas).toFixed();\n }\n\n const nonce = getNonceBigInt().toString();\n let parameters;\n let value: string;\n let methodSignature: string;\n switch (messenger) {\n case Messenger.CCTP:\n case Messenger.CCTP_V2:\n if (gasFeePaymentMethod === FeePaymentMethod.WITH_STABLECOIN) {\n parameters = [\n { type: \"uint256\", value: amount },\n { type: \"bytes32\", value: toAccountAddress },\n { type: \"uint256\", value: toChainId },\n { type: \"uint256\", value: totalFee },\n ];\n value = \"0\";\n } else {\n parameters = [\n { type: \"uint256\", value: amount },\n { type: \"bytes32\", value: toAccountAddress },\n { type: \"uint256\", value: toChainId },\n { type: \"uint256\", value: 0 },\n ];\n value = totalFee;\n }\n methodSignature = \"bridge(uint256,bytes32,uint256,uint256)\";\n break;\n case Messenger.OFT:\n if (gasFeePaymentMethod === FeePaymentMethod.WITH_STABLECOIN) {\n parameters = [\n { type: \"address\", value: sendParams.sourceToken.tokenAddress },\n { type: \"uint256\", value: amount },\n { type: \"bytes32\", value: toAccountAddress },\n { type: \"uint256\", value: toChainId },\n { type: \"uint256\", value: totalFee },\n { type: \"uint256\", value: extraGasDest ?? \"0\" },\n { type: \"uint256\", value: \"10\" },\n ];\n value = \"0\";\n } else {\n parameters = [\n { type: \"address\", value: sendParams.sourceToken.tokenAddress },\n { type: \"uint256\", value: amount },\n { type: \"bytes32\", value: toAccountAddress },\n { type: \"uint256\", value: toChainId },\n { type: \"uint256\", value: 0 },\n { type: \"uint256\", value: extraGasDest ?? \"0\" },\n { type: \"uint256\", value: \"10\" },\n ];\n value = totalFee;\n }\n methodSignature = \"bridge(address,uint256,bytes32,uint256,uint256,uint256,uint256)\";\n break;\n case Messenger.ALLBRIDGE:\n case Messenger.WORMHOLE:\n if (gasFeePaymentMethod === FeePaymentMethod.WITH_STABLECOIN) {\n parameters = [\n { type: \"bytes32\", value: fromTokenAddress },\n { type: \"uint256\", value: amount },\n { type: \"bytes32\", value: toAccountAddress },\n { type: \"uint256\", value: toChainId },\n { type: \"bytes32\", value: toTokenAddress },\n { type: \"uint256\", value: nonce },\n { type: \"uint8\", value: messenger },\n { type: \"uint256\", value: totalFee },\n ];\n value = \"0\";\n } else {\n parameters = [\n { type: \"bytes32\", value: fromTokenAddress },\n { type: \"uint256\", value: amount },\n { type: \"bytes32\", value: toAccountAddress },\n { type: \"uint256\", value: toChainId },\n { type: \"bytes32\", value: toTokenAddress },\n { type: \"uint256\", value: nonce },\n { type: \"uint8\", value: messenger },\n { type: \"uint256\", value: 0 },\n ];\n value = totalFee;\n }\n methodSignature = \"swapAndBridge(bytes32,uint256,bytes32,uint256,bytes32,uint256,uint8,uint256)\";\n break;\n }\n return this.buildRawTransaction(contractAddress, methodSignature, parameters, value, fromAccountAddress);\n }\n\n private async buildRawTransaction(\n contractAddress: string,\n methodSignature: string,\n parameters: SmartContractMethodParameter[],\n value: string,\n fromAddress: string\n ): Promise<RawTransaction> {\n const transactionObject = await this.tronWeb.transactionBuilder.triggerSmartContract(\n contractAddress,\n methodSignature,\n {\n callValue: +value,\n },\n parameters,\n fromAddress\n );\n if (!transactionObject?.result?.result) {\n throw new SdkError(\"Unknown error: \" + JSON.stringify(transactionObject, null, 2));\n }\n return transactionObject.transaction;\n }\n}\n", "import BN from \"bn.js\";\n\nexport function amountToHex(amount: string): string {\n return \"0x\" + new BN(amount).toString(\"hex\");\n}\n\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(() => resolve(), ms));\n}\n\nexport const promisify =\n // prettier-ignore\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n (func: Function) =>\n (...args: any[]) =>\n new Promise<any>(\n (resolve, reject) =>\n func(...args, (err: Error, result: any) => (err ? reject(err) : resolve(result)))\n );\n", "import { TronWeb } from \"tronweb\";\nimport { SignedTransaction } from \"tronweb/src/types/Transaction\";\nimport { InvalidTxError, VerifyTxError } from \"../../../exceptions\";\nimport { RawTransaction } from \"../../models\";\nimport { sleep } from \"../index\";\n\nexport async function sendRawTransaction(tronWeb: TronWeb, rawTransaction: RawTransaction): Promise<{ txId: string }> {\n const signedTx = await tronWeb.trx.sign(rawTransaction as any);\n\n if (!(signedTx as SignedTransaction).signature) {\n throw new InvalidTxError(\"Transaction was not signed properly\");\n }\n\n const receipt = await tronWeb.trx.sendRawTransaction(signedTx);\n const transactionHash = receipt.transaction.txID;\n await verifyTx(tronWeb, transactionHash);\n return { txId: transactionHash };\n}\n\nexport async function verifyTx(tronWeb: TronWeb, txId: string, timeout = 10000): Promise<any> {\n const start = Date.now();\n\n while (true) {\n if (Date.now() - start > timeout) {\n throw new VerifyTxError(\"Transaction not found\");\n }\n const result = await tronWeb.trx.getUnconfirmedTransactionInfo(txId);\n if (!result?.receipt) {\n await sleep(2000);\n continue;\n }\n if (result.receipt.result === \"SUCCESS\") {\n return result;\n } else {\n throw new VerifyTxError(`Transaction status is ${result.receipt.result}`);\n }\n }\n}\n", "import { Big } from \"big.js\";\nimport Cache from \"timed-cache\";\nimport { TronWeb } from \"tronweb\";\nimport { FMT_BYTES, FMT_NUMBER, Web3 } from \"web3\";\nimport { NodeRpcUrlsConfig } from \"..\";\nimport { Chains } from \"../../chains\";\nimport { AllbridgeCoreClient } from \"../../client/core-api/core-client-base\";\nimport { AllbridgeCoreClientFiltered } from \"../../client/core-api/core-client-filtered\";\nimport { AllbridgeCoreSdkOptions, ChainType, EssentialWeb3 } from \"../../index\";\nimport { PoolInfo, PoolKeyObject, TokenWithChainDetails } from \"../../tokens-info\";\nimport { convertIntAmountToFloat, fromSystemPrecision } from \"../../utils/calculation\";\nimport { SYSTEM_PRECISION } from \"../../utils/calculation/constants\";\nimport { validateAmountDecimals, validateAmountGtZero } from \"../../utils/utils\";\nimport { Provider, TransactionResponse } from \"../models\";\nimport { TokenService } from \"../token\";\nimport { depositAmountToVUsd, vUsdToWithdrawalAmount } from \"../utils/calculation\";\nimport { EvmPoolService } from \"./evm\";\nimport { ApproveParams, ChainPoolService, CheckAllowanceParams, GetAllowanceParams, UserBalanceInfo } from \"./models\";\nimport { DefaultRawPoolTransactionBuilder, RawPoolTransactionBuilder } from \"./raw-pool-transaction-builder\";\nimport { SolanaPoolService } from \"./sol\";\nimport { SrbPoolService } from \"./srb\";\nimport { SuiPoolService } from \"./sui\";\nimport { TronPoolService } from \"./trx\";\n\nexport interface LiquidityPoolService {\n rawTxBuilder: RawPoolTransactionBuilder;\n\n /**\n * Get amount of tokens approved for poolInfo\n * @param provider - will be used to access the network\n * @param params See {@link GetAllowanceParams}\n * @returns the amount of approved tokens\n */\n getAllowance(provider: Provider, params: GetAllowanceParams): Promise<string>;\n\n /**\n * Get amount of tokens approved for poolInfo\n * @param params See {@link GetAllowanceParams}\n * @returns the amount of approved tokens\n */\n getAllowance(params: GetAllowanceParams): Promise<string>;\n\n /**\n * Check if the amount of approved tokens is enough\n * @param provider - will be used to access the network\n * @param params See {@link CheckAllowanceParams}\n * @returns true if the amount of approved tokens is enough to make a transfer\n */\n checkAllowance(provider: Provider, params: CheckAllowanceParams): Promise<boolean>;\n\n /**\n * Check if the amount of approved tokens is enough\n * @param params See {@link CheckAllowanceParams}\n * @returns true if the amount of approved tokens is enough to make a transfer\n */\n checkAllowance(params: CheckAllowanceParams): Promise<boolean>;\n\n /**\n * @deprecated Use {@link rawTxBuilder}.{@link RawPoolTransactionBuilder.approve}<p>\n * Approve tokens usage by another address on chains\n * <p>\n * For ETH/USDT: due to specificity of the USDT contract:<br/>\n * If the current allowance is not 0, this function will perform an additional transaction to set allowance to 0 before setting the new allowance value.\n * @param provider - will be used to access the network\n * @param approveData\n */\n approve(provider: Provider, approveData: ApproveParams): Promise<TransactionResponse>;\n\n /**\n * Calculates the amount of LP tokens that will be deposited\n * @param amount The float amount of tokens that will be sent\n * @param token\n * @param provider - will be used to access the network\n * @returns amount\n */\n getAmountToBeDeposited(amount: string, token: TokenWithChainDetails, provider?: Provider): Promise<string>;\n\n /**\n * Calculates the amount of tokens will be withdrawn\n * @param amount The float amount of tokens that will be sent\n * @param accountAddress\n * @param token\n * @param provider - will be used to access the network\n * @returns amount\n */\n getAmountToBeWithdrawn(\n amount: string,\n accountAddress: string,\n token: TokenWithChainDetails,\n provider?: Provider\n ): Promise<string>;\n\n /**\n * Get User Balance Info on Liquidity poolInfo\n * @param accountAddress\n * @param token\n * @param provider\n * @returns UserBalanceInfo\n */\n getUserBalanceInfo(\n accountAddress: string,\n token: TokenWithChainDetails,\n provider?: Provider\n ): Promise<UserBalanceInfo>;\n\n /**\n * Gets information about the poolInfo from chain\n * @param token\n * @param provider - will be used to access the network\n * @returns poolInfo\n */\n getPoolInfoFromChain(token: TokenWithChainDetails, provider?: Provider): Promise<Required<PoolInfo>>;\n}\n\nexport class DefaultLiquidityPoolService implements LiquidityPoolService {\n public rawTxBuilder: RawPoolTransactionBuilder;\n private cache: Cache<PoolInfo>;\n\n constructor(\n private api: AllbridgeCoreClientFiltered,\n private nodeRpcUrlsConfig: NodeRpcUrlsConfig,\n private params: AllbridgeCoreSdkOptions,\n private tokenService: TokenService\n ) {\n this.rawTxBuilder = new DefaultRawPoolTransactionBuilder(api, nodeRpcUrlsConfig, this.params, tokenService);\n const ttl = params.cachePoolInfoChainSec > 0 ? params.cachePoolInfoChainSec * 1000 : 20 * 1000;\n this.cache = new Cache<PoolInfo>({ defaultTtl: ttl });\n }\n\n async getAllowance(a: Provider | GetAllowanceParams, b?: GetAllowanceParams): Promise<string> {\n if (b) {\n const provider = a as Provider;\n const params = b;\n return await this.tokenService.getAllowance({ ...params, spender: params.token.poolAddress }, provider);\n } else {\n const params = a as GetAllowanceParams;\n return await this.tokenService.getAllowance({ ...params, spender: params.token.poolAddress });\n }\n }\n\n async checkAllowance(a: Provider | CheckAllowanceParams, b?: CheckAllowanceParams): Promise<boolean> {\n if (b) {\n const provider = a as Provider;\n const params = b;\n return this.tokenService.checkAllowance({ ...params, spender: params.token.poolAddress }, provider);\n } else {\n const params = a as CheckAllowanceParams;\n return this.tokenService.checkAllowance({ ...params, spender: params.token.poolAddress });\n }\n }\n\n async approve(provider: Provider, approveData: ApproveParams): Promise<TransactionResponse> {\n return this.tokenService.approve(provider, { ...approveData, spender: approveData.token.poolAddress });\n }\n\n async getAmountToBeDeposited(amount: string, token: TokenWithChainDetails, provider?: Provider): Promise<string> {\n validateAmountGtZero(amount);\n validateAmountDecimals(\"amount\", amount, token.decimals);\n const pool = await this.getPoolInfoFromChain(token, provider);\n const { vUsdBalance, tokenBalance, aValue, dValue } = pool;\n const vUsd = depositAmountToVUsd(amount, aValue, dValue, tokenBalance, vUsdBalance);\n return convertIntAmountToFloat(vUsd, SYSTEM_PRECISION).toFixed();\n }\n\n async getAmountToBeWithdrawn(\n amount: string,\n accountAddress: string,\n token: TokenWithChainDetails,\n provider?: Provider\n ): Promise<string> {\n validateAmountGtZero(amount);\n validateAmountDecimals(\"amount\", amount, token.decimals);\n const pool = await this.getPoolInfoFromChain(token, provider);\n const tokenAmountInSP = vUsdToWithdrawalAmount(amount);\n const tokenAmount = fromSystemPrecision(tokenAmountInSP, token.decimals);\n const userBalanceInfo = await this.getUserBalanceInfo(accountAddress, token, provider);\n const earned = userBalanceInfo.earned(pool) || \"0\";\n const commonAmount = Big(tokenAmount).plus(earned).toFixed();\n return convertIntAmountToFloat(commonAmount, token.decimals).toFixed();\n }\n\n async getUserBalanceInfo(\n accountAddress: string,\n token: TokenWithChainDetails,\n provider?: Provider\n ): Promise<UserBalanceInfo> {\n return getChainPoolService(\n token.chainSymbol,\n this.api,\n this.nodeRpcUrlsConfig,\n this.params,\n provider\n ).getUserBalanceInfo(accountAddress, token);\n }\n\n async getPoolInfoFromChain(token: TokenWithChainDetails, provider?: Provider): Promise<PoolInfo> {\n const poolKey: PoolKeyObject = { chainSymbol: token.chainSymbol, poolAddress: token.poolAddress };\n const fromCache = this.cache.get(poolKey);\n if (fromCache) {\n return fromCache;\n } else {\n const poolInfo = await getChainPoolService(\n token.chainSymbol,\n this.api,\n this.nodeRpcUrlsConfig,\n this.params,\n provider\n ).getPoolInfoFromChain(token);\n this.cache.put(poolKey, poolInfo);\n this.api.cachePut({ chainSymbol: token.chainSymbol, poolAddress: token.poolAddress }, poolInfo);\n return poolInfo;\n }\n }\n}\n\nexport function getChainPoolService(\n chainSymbol: string,\n api: AllbridgeCoreClient,\n nodeRpcUrlsConfig: NodeRpcUrlsConfig,\n params: AllbridgeCoreSdkOptions,\n provider?: Provider\n): ChainPoolService {\n switch (Chains.getChainProperty(chainSymbol).chainType) {\n case ChainType.EVM: {\n if (provider) {\n return new EvmPoolService(provider as EssentialWeb3, api);\n } else {\n const nodeRpcUrl = nodeRpcUrlsConfig.getNodeRpcUrl(chainSymbol);\n const web3 = new Web3(nodeRpcUrl);\n web3.defaultReturnFormat = { number: FMT_NUMBER.STR, bytes: FMT_BYTES.HEX };\n return new EvmPoolService(web3, api);\n }\n }\n case ChainType.TRX: {\n const nodeRpcUrl = nodeRpcUrlsConfig.getNodeRpcUrl(chainSymbol);\n const tronJsonRpc = params.tronJsonRpc;\n if (provider) {\n return new TronPoolService(provider as TronWeb, api, tronJsonRpc);\n } else {\n const tronWeb = new TronWeb({ fullHost: nodeRpcUrl });\n return new TronPoolService(tronWeb, api, tronJsonRpc);\n }\n }\n case ChainType.SOLANA: {\n const nodeRpcUrl = nodeRpcUrlsConfig.getNodeRpcUrl(chainSymbol);\n return new SolanaPoolService(nodeRpcUrl, api);\n }\n case ChainType.SRB: {\n return new SrbPoolService(nodeRpcUrlsConfig, params, api);\n }\n case ChainType.SUI: {\n return new SuiPoolService(nodeRpcUrlsConfig.getNodeRpcUrl(chainSymbol), api);\n }\n }\n}\n", "import { Big } from \"big.js\";\nimport { convertFloatAmountToInt, getD } from \"../../../utils/calculation\";\nimport { SYSTEM_PRECISION } from \"../../../utils/calculation/constants\";\n\nexport function depositAmountToVUsd(\n amount: string,\n aValue: string,\n dValue: string,\n tokenBalance: string,\n vUsdBalance: string\n): string {\n const amountSP = convertFloatAmountToInt(amount, SYSTEM_PRECISION);\n const amountSPBig = Big(amountSP);\n\n const oldD = Big(dValue);\n const oldBalance = Big(tokenBalance).plus(vUsdBalance);\n\n let newTokenBalance;\n let newVUsdBalance;\n\n if (oldD.eq(0) || oldBalance.eq(0)) {\n const halfAmount = amountSPBig.div(2);\n newTokenBalance = Big(tokenBalance).plus(halfAmount);\n newVUsdBalance = Big(vUsdBalance).plus(halfAmount);\n } else {\n newTokenBalance = Big(tokenBalance).plus(amountSPBig.mul(tokenBalance).div(oldBalance));\n newVUsdBalance = Big(vUsdBalance).plus(amountSPBig.mul(vUsdBalance).div(oldBalance));\n }\n const newD = Big(getD(aValue, newTokenBalance.toFixed(), newVUsdBalance.toFixed()));\n return newD.minus(oldD).toFixed();\n}\n\nexport function vUsdToWithdrawalAmount(lpAmount: string): string {\n const lpAmountSP = convertFloatAmountToInt(lpAmount, SYSTEM_PRECISION);\n return Big(lpAmountSP).round().toFixed();\n}\n", "import { Contract, Web3 } from \"web3\";\nimport { ChainType } from \"../../../chains/chain.enums\";\nimport { AllbridgeCoreClient } from \"../../../client/core-api/core-client-base\";\nimport { PoolInfo, TokenWithChainDetails } from \"../../../tokens-info\";\nimport { calculatePoolInfoImbalance } from \"../../../utils/calculation\";\nimport { promiseWithTimeout, promiseWithTimeoutAndRetries } from \"../../../utils/utils\";\nimport { EssentialWeb3, RawTransaction } from \"../../models\";\nimport Pool from \"../../models/abi/Pool\";\nimport {\n ChainPoolService,\n LiquidityPoolsParams,\n LiquidityPoolsParamsWithAmount,\n UserBalance,\n UserBalanceInfo,\n} from \"../models\";\n\nexport class EvmPoolService extends ChainPoolService {\n chainType: ChainType.EVM = ChainType.EVM;\n private P = 52;\n\n constructor(\n public web3: EssentialWeb3,\n public api: AllbridgeCoreClient\n ) {\n super();\n }\n\n async getUserBalanceInfo(accountAddress: string, token: TokenWithChainDetails): Promise<UserBalanceInfo> {\n let userBalanceInfo;\n try {\n userBalanceInfo = await promiseWithTimeout(\n this.getUserBalanceInfoByBatch(accountAddress, token),\n `Cannot get UserBalanceInfo for ${token.name} on ${token.chainSymbol}`,\n 5000\n );\n } catch (ignoreError) {\n userBalanceInfo = await promiseWithTimeoutAndRetries(\n () => this.getUserBalanceInfoPerProperty(accountAddress, token),\n `Cannot get UserBalanceInfo for ${token.name} on ${token.chainSymbol}`,\n 5,\n 2000\n );\n }\n return userBalanceInfo;\n }\n\n async getPoolInfoFromChain(token: TokenWithChainDetails): Promise<PoolInfo> {\n let poolInfo;\n try {\n poolInfo = await promiseWithTimeout(\n this.getPoolInfoByBatch(token),\n `Cannot get PoolInfo for ${token.name} on ${token.chainSymbol}`,\n 5000\n );\n } catch (ignoreError) {\n poolInfo = await promiseWithTimeoutAndRetries(\n () => this.getPoolInfoPerProperty(token),\n `Cannot get PoolInfo for ${token.name} on ${token.chainSymbol}`,\n 5,\n 2000\n );\n }\n return poolInfo;\n }\n\n private async getUserBalanceInfoByBatch(\n accountAddress: string,\n token: TokenWithChainDetails\n ): Promise<UserBalanceInfo> {\n const batch = new this.web3.eth.BatchRequest();\n const poolContract = this.getPoolContract(token.poolAddress);\n\n const userRewardDebtAbi = poolContract.methods.userRewardDebt(accountAddress).encodeABI();\n const balanceOfAbi = poolContract.methods.balanceOf(accountAddress).encodeABI();\n\n batch.add({\n method: \"eth_call\",\n params: [{ to: token.poolAddress, data: userRewardDebtAbi }, \"latest\"],\n });\n batch.add({\n method: \"eth_call\",\n params: [{ to: token.poolAddress, data: balanceOfAbi }, \"latest\"],\n });\n\n const [rewardDebtResult, lpAmountResult] = await batch.execute();\n\n if (rewardDebtResult && lpAmountResult && !rewardDebtResult.error && !lpAmountResult.error) {\n return new UserBalance({\n lpAmount: Web3.utils.toBigInt(lpAmountResult.result).toString(),\n rewardDebt: Web3.utils.toBigInt(rewardDebtResult.result).toString(),\n });\n }\n throw new Error(\"Batched failed\");\n }\n\n private async getUserBalanceInfoPerProperty(\n accountAddress: string,\n token: TokenWithChainDetails\n ): Promise<UserBalanceInfo> {\n const rewardDebt = (\n await this.getPoolContract(token.poolAddress).methods.userRewardDebt(accountAddress).call()\n ).toString();\n const lpAmount = (\n await this.getPoolContract(token.poolAddress).methods.balanceOf(accountAddress).call()\n ).toString();\n return new UserBalance({ lpAmount, rewardDebt });\n }\n\n private async getPoolInfoByBatch(token: TokenWithChainDetails): Promise<PoolInfo> {\n const batch = new this.web3.eth.BatchRequest();\n const poolContract = this.getPoolContract(token.poolAddress);\n\n const aAbi = poolContract.methods.a().encodeABI();\n const dAbi = poolContract.methods.d().encodeABI();\n const tokenBalanceAbi = poolContract.methods.tokenBalance().encodeABI();\n const vUsdBalanceAbi = poolContract.methods.vUsdBalance().encodeABI();\n const totalSupplyAbi = poolContract.methods.totalSupply().encodeABI();\n const accRewardPerSharePAbi = poolContract.methods.accRewardPerShareP().encodeABI();\n\n batch.add({\n method: \"eth_call\",\n params: [{ to: token.poolAddress, data: aAbi }, \"latest\"],\n });\n batch.add({\n method: \"eth_call\",\n params: [{ to: token.poolAddress, data: dAbi }, \"latest\"],\n });\n batch.add({\n method: \"eth_call\",\n params: [{ to: token.poolAddress, data: tokenBalanceAbi }, \"latest\"],\n });\n batch.add({\n method: \"eth_call\",\n params: [{ to: token.poolAddress, data: vUsdBalanceAbi }, \"latest\"],\n });\n batch.add({\n method: \"eth_call\",\n params: [{ to: token.poolAddress, data: totalSupplyAbi }, \"latest\"],\n });\n batch.add({\n method: \"eth_call\",\n params: [{ to: token.poolAddress, data: accRewardPerSharePAbi }, \"latest\"],\n });\n\n const [aResult, dResult, tokenBalanceResult, vUsdBalanceResult, totalSupplyResult, accRewardPerSharePResult] =\n await batch.execute();\n\n if (\n aResult &&\n dResult &&\n tokenBalanceResult &&\n vUsdBalanceResult &&\n totalSupplyResult &&\n accRewardPerSharePResult &&\n !aResult.error &&\n !dResult.error &&\n !tokenBalanceResult.error &&\n !vUsdBalanceResult.error &&\n !totalSupplyResult.error &&\n !accRewardPerSharePResult.error\n ) {\n const tokenBalanceStr = Web3.utils.toBigInt(tokenBalanceResult.result).toString();\n const vUsdBalanceStr = Web3.utils.toBigInt(vUsdBalanceResult.result).toString();\n const imbalance = calculatePoolInfoImbalance({ tokenBalance: tokenBalanceStr, vUsdBalance: vUsdBalanceStr });\n return {\n aValue: Web3.utils.toBigInt(aResult.result).toString(),\n dValue: Web3.utils.toBigInt(dResult.result).toString(),\n tokenBalance: tokenBalanceStr,\n vUsdBalance: vUsdBalanceStr,\n totalLpAmount: Web3.utils.toBigInt(totalSupplyResult.result).toString(),\n accRewardPerShareP: Web3.utils.toBigInt(accRewardPerSharePResult.result).toString(),\n p: this.P,\n imbalance,\n };\n }\n throw new Error(\"Batched failed\");\n }\n\n private async getPoolInfoPerProperty(token: TokenWithChainDetails): Promise<PoolInfo> {\n const poolContract = this.getPoolContract(token.poolAddress);\n\n const aValue = (await poolContract.methods.a().call()).toString();\n const dValue = (await poolContract.methods.d().call()).toString();\n const tokenBalance = (await poolContract.methods.tokenBalance().call()).toString();\n const vUsdBalance = (await poolContract.methods.vUsdBalance().call()).toString();\n const totalLpAmount = (await poolContract.methods.totalSupply().call()).toString();\n const accRewardPerShareP = (await poolContract.methods.accRewardPerShareP().call()).toString();\n\n const imbalance = calculatePoolInfoImbalance({ tokenBalance, vUsdBalance });\n\n return {\n aValue,\n dValue,\n tokenBalance,\n vUsdBalance,\n totalLpAmount,\n accRewardPerShareP,\n p: this.P,\n imbalance,\n };\n }\n\n async buildRawTransactionDeposit(params: LiquidityPoolsParamsWithAmount): Promise<RawTransaction> {\n return Promise.resolve({\n ...this.buildTxParams(params),\n data: this.getPoolContract(params.token.poolAddress).methods.deposit(params.amount).encodeABI(),\n });\n }\n\n async buildRawTransactionWithdraw(params: LiquidityPoolsParamsWithAmount): Promise<RawTransaction> {\n return Promise.resolve({\n ...this.buildTxParams(params),\n data: this.getPoolContract(params.token.poolAddress).methods.withdraw(params.amount).encodeABI(),\n });\n }\n\n async buildRawTransactionClaimRewards(params: LiquidityPoolsParams): Promise<RawTransaction> {\n return Promise.resolve({\n ...this.buildTxParams(params),\n data: this.getPoolContract(params.token.poolAddress).methods.claimRewards().encodeABI(),\n });\n }\n\n buildTxParams(params: LiquidityPoolsParams) {\n return {\n from: params.accountAddress,\n to: params.token.poolAddress,\n value: \"0\",\n };\n }\n\n private getPoolContract(contractAddress: string) {\n return new this.web3.eth.Contract(Pool.abi, contractAddress) as Contract<typeof Pool.abi>;\n }\n}\n", "const artifact = {\n abi: [\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"_router\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"_a\",\n type: \"uint256\",\n },\n {\n internalType: \"contract ERC20\",\n name: \"_token\",\n type: \"address\",\n },\n {\n internalType: \"uint16\",\n name: \"_feeShareBP\",\n type: \"uint16\",\n },\n {\n internalType: \"uint256\",\n name: \"_balanceRatioMinBP\",\n type: \"uint256\",\n },\n {\n internalType: \"string\",\n name: \"lpName\",\n type: \"string\",\n },\n {\n internalType: \"string\",\n name: \"lpSymbol\",\n type: \"string\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"constructor\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"owner\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"spender\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"value\",\n type: \"uint256\",\n },\n ],\n name: \"Approval\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"user\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n ],\n name: \"Deposit\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"previousOwner\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"newOwner\",\n type: \"address\",\n },\n ],\n name: \"OwnershipTransferred\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"user\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n ],\n name: \"RewardsClaimed\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"address\",\n name: \"recipient\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"address\",\n name: \"token\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"vUsdAmount\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"fee\",\n type: \"uint256\",\n },\n ],\n name: \"SwappedFromVUsd\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"address\",\n name: \"sender\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"address\",\n name: \"token\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"vUsdAmount\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"fee\",\n type: \"uint256\",\n },\n ],\n name: \"SwappedToVUsd\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"from\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"value\",\n type: \"uint256\",\n },\n ],\n name: \"Transfer\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"user\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n ],\n name: \"Withdraw\",\n type: \"event\",\n },\n {\n stateMutability: \"payable\",\n type: \"fallback\",\n },\n {\n inputs: [],\n name: \"a\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"accRewardPerShareP\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"adjustTotalLpAmount\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"adminFeeAmount\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"adminFeeShareBP\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"owner\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"spender\",\n type: \"address\",\n },\n ],\n name: \"allowance\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"spender\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n ],\n name: \"approve\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"account\",\n type: \"address\",\n },\n ],\n name: \"balanceOf\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"balanceRatioMinBP\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"canDeposit\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"canWithdraw\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"claimAdminFee\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"claimRewards\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"d\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"decimals\",\n outputs: [\n {\n internalType: \"uint8\",\n name: \"\",\n type: \"uint8\",\n },\n ],\n stateMutability: \"pure\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"spender\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"subtractedValue\",\n type: \"uint256\",\n },\n ],\n name: \"decreaseAllowance\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n ],\n name: \"deposit\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"feeShareBP\",\n outputs: [\n {\n internalType: \"uint16\",\n name: \"\",\n type: \"uint16\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"getPrice\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"x\",\n type: \"uint256\",\n },\n ],\n name: \"getY\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"spender\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"addedValue\",\n type: \"uint256\",\n },\n ],\n name: \"increaseAllowance\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"name\",\n outputs: [\n {\n internalType: \"string\",\n name: \"\",\n type: \"string\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"owner\",\n outputs: [\n {\n internalType: \"address\",\n name: \"\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"user\",\n type: \"address\",\n },\n ],\n name: \"pendingReward\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"renounceOwnership\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"reserves\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"router\",\n outputs: [\n {\n internalType: \"address\",\n name: \"\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"_adminFeeShareBP\",\n type: \"uint256\",\n },\n ],\n name: \"setAdminFeeShare\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"_balanceRatioMinBP\",\n type: \"uint256\",\n },\n ],\n name: \"setBalanceRatioMinBP\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint16\",\n name: \"_feeShareBP\",\n type: \"uint16\",\n },\n ],\n name: \"setFeeShare\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"_router\",\n type: \"address\",\n },\n ],\n name: \"setRouter\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"_stopAuthority\",\n type: \"address\",\n },\n ],\n name: \"setStopAuthority\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"startDeposit\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"startWithdraw\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"stopDeposit\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"stopWithdraw\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"user\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"receiveAmountMin\",\n type: \"uint256\",\n },\n {\n internalType: \"bool\",\n name: \"zeroFee\",\n type: \"bool\",\n },\n ],\n name: \"swapFromVUsd\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"user\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n {\n internalType: \"bool\",\n name: \"zeroFee\",\n type: \"bool\",\n },\n ],\n name: \"swapToVUsd\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"symbol\",\n outputs: [\n {\n internalType: \"string\",\n name: \"\",\n type: \"string\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"token\",\n outputs: [\n {\n internalType: \"contract ERC20\",\n name: \"\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"tokenBalance\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"totalSupply\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n ],\n name: \"transfer\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"from\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n ],\n name: \"transferFrom\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"newOwner\",\n type: \"address\",\n },\n ],\n name: \"transferOwnership\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"user\",\n type: \"address\",\n },\n ],\n name: \"userRewardDebt\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"vUsdBalance\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"amountLp\",\n type: \"uint256\",\n },\n ],\n name: \"withdraw\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n stateMutability: \"payable\",\n type: \"receive\",\n },\n ],\n} as const;\nexport default artifact;\n", "import { Big } from \"big.js\";\nimport { FeePaymentMethod, TxFeeParams } from \"../../../models\";\nimport { PoolInfo, TokenWithChainDetails } from \"../../../tokens-info\";\nimport { convertIntAmountToFloat, getEarned } from \"../../../utils/calculation\";\nimport { SYSTEM_PRECISION } from \"../../../utils/calculation/constants\";\n\nexport interface ApproveParams {\n /**\n * The token info\n */\n token: TokenWithChainDetails;\n\n /**\n * The address of the token owner who is granting permission to use tokens\n */\n owner: string;\n\n /**\n * The integer amount of tokens to approve.\n * Optional.\n * The maximum amount by default.\n */\n amount?: string | number | Big;\n}\n\nexport interface GetAllowanceParams {\n token: TokenWithChainDetails;\n owner: string;\n gasFeePaymentMethod?: FeePaymentMethod;\n}\n\nexport type GetAllowanceParamsDto = GetAllowanceParams;\n\nexport interface CheckAllowanceParams extends GetAllowanceParams {\n /**\n * The float amount of tokens to check the allowance.\n */\n amount: string | number | Big;\n}\n\nexport interface LiquidityPoolsParams {\n /**\n * The account address to operate tokens with.\n */\n accountAddress: string;\n /**\n * {@link TokenWithChainDetails |The token info object} of operation token.\n */\n token: TokenWithChainDetails;\n\n txFeeParams?: TxFeeParams;\n}\n\nexport interface LiquidityPoolsParamsWithAmount extends LiquidityPoolsParams {\n /**\n * The float amount of tokens.\n */\n amount: string;\n}\n\nexport interface UserBalanceInfoDTO {\n lpAmount: string;\n rewardDebt: string;\n}\n\nexport interface UserBalanceInfo extends UserBalanceInfoDTO {\n userLiquidity: string;\n\n earned(poolInfo: PoolInfo, decimals?: number): string;\n}\n\nexport class UserBalance implements UserBalanceInfo {\n lpAmount: string;\n rewardDebt: string;\n\n constructor(userInfo: UserBalanceInfoDTO) {\n this.lpAmount = userInfo.lpAmount;\n this.rewardDebt = userInfo.rewardDebt;\n }\n\n get userLiquidity(): string {\n return convertIntAmountToFloat(this.lpAmount, SYSTEM_PRECISION).toFixed();\n }\n\n earned(poolInfo: PoolInfo, decimals?: number): string {\n const earned = getEarned(this.lpAmount, this.rewardDebt, poolInfo.accRewardPerShareP, poolInfo.p);\n if (decimals) {\n return convertIntAmountToFloat(earned, decimals).toFixed();\n }\n return earned;\n }\n}\n", "import { ChainType } from \"../../../chains/chain.enums\";\nimport { AllbridgeCoreClient } from \"../../../client/core-api/core-client-base\";\nimport { PoolInfo, TokenWithChainDetails } from \"../../../tokens-info\";\nimport { RawTransaction } from \"../../models\";\nimport { LiquidityPoolsParams, LiquidityPoolsParamsWithAmount, UserBalanceInfo } from \"./pool.model\";\n\nexport abstract class ChainPoolService {\n abstract chainType: ChainType;\n abstract api: AllbridgeCoreClient;\n\n abstract getUserBalanceInfo(accountAddress: string, token: TokenWithChainDetails): Promise<UserBalanceInfo>;\n\n abstract getPoolInfoFromChain(token: TokenWithChainDetails): Promise<PoolInfo>;\n\n abstract buildRawTransactionDeposit(params: LiquidityPoolsParamsWithAmount): Promise<RawTransaction>;\n\n abstract buildRawTransactionWithdraw(params: LiquidityPoolsParamsWithAmount): Promise<RawTransaction>;\n\n abstract buildRawTransactionClaimRewards(params: LiquidityPoolsParams): Promise<RawTransaction>;\n}\n", "import { NodeRpcUrlsConfig } from \"..\";\nimport { AllbridgeCoreClient } from \"../../client/core-api/core-client-base\";\nimport { AllbridgeCoreSdkOptions } from \"../../index\";\nimport { convertFloatAmountToInt } from \"../../utils/calculation\";\nimport { SYSTEM_PRECISION } from \"../../utils/calculation/constants\";\nimport { validateAmountDecimals, validateAmountGtZero } from \"../../utils/utils\";\nimport { Provider, RawTransaction } from \"../models\";\nimport { TokenService } from \"../token\";\nimport { ApproveParams, LiquidityPoolsParams, LiquidityPoolsParamsWithAmount } from \"./models\";\nimport { getChainPoolService } from \"./index\";\n\nexport interface RawPoolTransactionBuilder {\n /**\n * Creates a Raw Transaction for approving tokens usage by the bridge\n * @param provider - will be used to access the network\n * @param approveData\n */\n approve(provider: Provider, approveData: ApproveParams): Promise<RawTransaction>;\n /**\n * Creates a Raw Transaction for approving tokens usage by the bridge\n * @param approveData\n */\n approve(approveData: ApproveParams): Promise<RawTransaction>;\n\n /**\n * Creates a Raw Transaction for depositing tokens to Liquidity pools\n * @param params\n * @param provider - will be used to access the network\n */\n deposit(params: LiquidityPoolsParamsWithAmount, provider?: Provider): Promise<RawTransaction>;\n\n /**\n * Creates a Raw Transaction for withdrawing tokens from Liquidity pools\n * @param params\n * @param provider - will be used to access the network\n */\n withdraw(params: LiquidityPoolsParamsWithAmount, provider?: Provider): Promise<RawTransaction>;\n\n /**\n * Creates a Raw Transaction for claiming rewards from Liquidity pools\n * @param params\n * @param provider - will be used to access the network\n */\n claimRewards(params: LiquidityPoolsParams, provider?: Provider): Promise<RawTransaction>;\n}\n\nexport class DefaultRawPoolTransactionBuilder implements RawPoolTransactionBuilder {\n constructor(\n private api: AllbridgeCoreClient,\n private nodeRpcUrlsConfig: NodeRpcUrlsConfig,\n private params: AllbridgeCoreSdkOptions,\n private tokenService: TokenService\n ) {}\n\n async approve(a: Provider | ApproveParams, b?: ApproveParams): Promise<RawTransaction> {\n if (b) {\n const provider = a as Provider;\n const approveData: ApproveParams = b;\n return this.tokenService.buildRawTransactionApprove(\n {\n ...approveData,\n spender: approveData.token.poolAddress,\n },\n provider\n );\n } else {\n const approveData: ApproveParams = a as ApproveParams;\n return this.tokenService.buildRawTransactionApprove({\n ...approveData,\n spender: approveData.token.poolAddress,\n });\n }\n }\n\n async deposit(params: LiquidityPoolsParamsWithAmount, provider?: Provider): Promise<RawTransaction> {\n validateAmountGtZero(params.amount);\n validateAmountDecimals(\"amount\", params.amount, params.token.decimals);\n params.amount = convertFloatAmountToInt(params.amount, params.token.decimals).toFixed();\n return getChainPoolService(\n params.token.chainSymbol,\n this.api,\n this.nodeRpcUrlsConfig,\n this.params,\n provider\n ).buildRawTransactionDeposit(params);\n }\n\n async withdraw(params: LiquidityPoolsParamsWithAmount, provider?: Provider): Promise<RawTransaction> {\n validateAmountGtZero(params.amount);\n validateAmountDecimals(\"amount\", params.amount, params.token.decimals);\n params.amount = convertFloatAmountToInt(params.amount, SYSTEM_PRECISION).toFixed();\n return getChainPoolService(\n params.token.chainSymbol,\n this.api,\n this.nodeRpcUrlsConfig,\n this.params,\n provider\n ).buildRawTransactionWithdraw(params);\n }\n\n async claimRewards(params: LiquidityPoolsParams, provider?: Provider): Promise<RawTransaction> {\n return getChainPoolService(\n params.token.chainSymbol,\n this.api,\n this.nodeRpcUrlsConfig,\n this.params,\n provider\n ).buildRawTransactionClaimRewards(params);\n }\n}\n", "import { AnchorProvider, BN, Program, Provider, Spl, web3 } from \"@project-serum/anchor\";\nimport { Connection, PublicKey, TransactionInstruction } from \"@solana/web3.js\";\nimport { ChainType } from \"../../../chains/chain.enums\";\nimport { AllbridgeCoreClient } from \"../../../client/core-api/core-client-base\";\nimport { PoolInfo, TokenWithChainDetails } from \"../../../tokens-info\";\nimport { calculatePoolInfoImbalance } from \"../../../utils/calculation\";\nimport { RawTransaction } from \"../../models\";\nimport { Bridge as BridgeType, IDL as bridgeIdl } from \"../../models/sol/types/bridge\";\nimport { getTokenAccountData } from \"../../utils/sol\";\nimport {\n getAssociatedAccount,\n getAuthorityAccount,\n getBridgeTokenAccount,\n getConfigAccount,\n getUserDepositAccount,\n} from \"../../utils/sol/accounts\";\nimport { addUnitLimitAndUnitPriceToTx } from \"../../utils/sol/compute-budget\";\nimport { LiquidityPoolsParams, LiquidityPoolsParamsWithAmount, UserBalance, UserBalanceInfo } from \"../models\";\nimport { ChainPoolService } from \"../models/pool\";\n\ninterface LPAccounts {\n mint: PublicKey;\n user: PublicKey;\n config: PublicKey;\n pool: PublicKey;\n bridgeAuthority: PublicKey;\n userDeposit: PublicKey;\n userToken: PublicKey;\n bridgeToken: PublicKey;\n}\n\ninterface LPTransactionData {\n accounts: LPAccounts;\n preInstructions: TransactionInstruction[];\n}\n\nexport class SolanaPoolService extends ChainPoolService {\n chainType: ChainType.SOLANA = ChainType.SOLANA;\n private P = 48;\n\n constructor(\n public solanaRpcUrl: string,\n public api: AllbridgeCoreClient\n ) {\n super();\n }\n\n async getUserBalanceInfo(accountAddress: string, token: TokenWithChainDetails): Promise<UserBalanceInfo> {\n const provider = this.buildAnchorProvider(accountAddress);\n const bridge = this.getBridge(token.bridgeAddress, provider);\n const poolAccount = new PublicKey(token.poolAddress);\n const poolAccountInfo = await bridge.account.pool.fetch(poolAccount);\n try {\n const userDepositAccount = await getUserDepositAccount(\n new PublicKey(accountAddress),\n poolAccountInfo.mint,\n bridge.programId\n );\n const { lpAmount, rewardDebt } = await bridge.account.userDeposit.fetch(userDepositAccount);\n return new UserBalance({\n lpAmount: lpAmount.toString(),\n rewardDebt: rewardDebt.toString(),\n });\n } catch (ignoreError) {\n return new UserBalance({ lpAmount: \"0\", rewardDebt: \"0\" });\n }\n }\n\n async getPoolInfoFromChain(token: TokenWithChainDetails): Promise<PoolInfo> {\n const provider = this.buildAnchorProvider(token.bridgeAddress);\n const pool = await this.getBridge(token.bridgeAddress, provider).account.pool.fetch(token.poolAddress);\n const vUsdBalance = pool.vUsdBalance.toString();\n const tokenBalance = pool.tokenBalance.toString();\n const imbalance = calculatePoolInfoImbalance({ tokenBalance, vUsdBalance });\n return {\n dValue: pool.d.toString(),\n aValue: pool.a.toString(),\n totalLpAmount: pool.totalLpAmount.toString(),\n vUsdBalance,\n tokenBalance,\n accRewardPerShareP: pool.accRewardPerShareP.toString(),\n p: this.P,\n imbalance,\n };\n }\n\n async buildRawTransactionDeposit(params: LiquidityPoolsParamsWithAmount): Promise<RawTransaction> {\n const { bridge, accounts, preInstructions } = await this.prepareDataForTransaction(params);\n\n const tx = await bridge.methods\n .deposit(new BN(params.amount))\n .accounts(accounts)\n .preInstructions(preInstructions)\n .transaction();\n tx.recentBlockhash = (\n await this.buildAnchorProvider(params.accountAddress).connection.getLatestBlockhash()\n ).blockhash;\n tx.feePayer = new PublicKey(params.accountAddress);\n await addUnitLimitAndUnitPriceToTx(tx, params.txFeeParams, this.solanaRpcUrl);\n return tx;\n }\n\n async buildRawTransactionWithdraw(params: LiquidityPoolsParamsWithAmount): Promise<RawTransaction> {\n const { bridge, accounts, preInstructions } = await this.prepareDataForTransaction(params);\n\n const tx = await bridge.methods\n .withdraw(new BN(params.amount))\n .accounts(accounts)\n .preInstructions(preInstructions)\n .transaction();\n tx.recentBlockhash = (\n await this.buildAnchorProvider(params.accountAddress).connection.getLatestBlockhash()\n ).blockhash;\n tx.feePayer = new PublicKey(params.accountAddress);\n await addUnitLimitAndUnitPriceToTx(tx, params.txFeeParams, this.solanaRpcUrl);\n return tx;\n }\n\n async buildRawTransactionClaimRewards(params: LiquidityPoolsParams): Promise<RawTransaction> {\n const { bridge, accounts, preInstructions } = await this.prepareDataForTransaction(params);\n\n const tx = await bridge.methods.claimRewards().accounts(accounts).preInstructions(preInstructions).transaction();\n tx.recentBlockhash = (\n await this.buildAnchorProvider(params.accountAddress).connection.getLatestBlockhash()\n ).blockhash;\n tx.feePayer = new PublicKey(params.accountAddress);\n await addUnitLimitAndUnitPriceToTx(tx, params.txFeeParams, this.solanaRpcUrl);\n return tx;\n }\n\n private async prepareDataForTransaction(params: LiquidityPoolsParams) {\n const provider = this.buildAnchorProvider(params.accountAddress);\n const bridge = this.getBridge(params.token.bridgeAddress, provider);\n\n const { accounts, preInstructions } = await this._getLPTransactionData(\n bridge,\n params.token.poolAddress,\n params.accountAddress,\n provider\n );\n return { bridge, accounts, preInstructions };\n }\n\n private getBridge(bridgeAddress: string, provider: Provider): Program<BridgeType> {\n return new Program<BridgeType>(bridgeIdl, bridgeAddress, provider);\n }\n\n private buildAnchorProvider(accountAddress: string): Provider {\n const connection = new Connection(this.solanaRpcUrl, \"confirmed\");\n\n const publicKey = new PublicKey(accountAddress);\n\n return new AnchorProvider(\n connection,\n // @ts-expect-error enough wallet for fetch actions\n { publicKey: publicKey },\n {\n preflightCommitment: \"confirmed\",\n commitment: \"confirmed\",\n }\n );\n }\n\n private async _getLPTransactionData(\n bridge: Program<BridgeType>,\n poolAddress: string,\n account: string,\n provider: Provider\n ): Promise<LPTransactionData> {\n const user = new PublicKey(account);\n const configAccount = await getConfigAccount(bridge.programId);\n const bridgeAuthority = await getAuthorityAccount(bridge.programId);\n const poolAccount = new PublicKey(poolAddress);\n const poolAccountInfo = await bridge.account.pool.fetch(poolAccount);\n const tokenMintAccount = poolAccountInfo.mint;\n const userToken = await getAssociatedAccount(user, tokenMintAccount);\n const bridgeTokenAccount = await getBridgeTokenAccount(tokenMintAccount, bridge.programId);\n const userDepositAccount = await getUserDepositAccount(user, tokenMintAccount, bridge.programId);\n\n const preInstructions: TransactionInstruction[] = [\n web3.ComputeBudgetProgram.setComputeUnitLimit({\n units: 1000000,\n }),\n ];\n\n try {\n await getTokenAccountData(userToken, provider);\n } catch (ignoreError) {\n const associatedProgram = Spl.associatedToken(provider);\n const createUserTokenInstruction: TransactionInstruction = await associatedProgram.methods\n .create()\n .accounts({\n mint: tokenMintAccount,\n owner: user,\n associatedAccount: userToken,\n })\n .instruction();\n preInstructions.push(createUserTokenInstruction);\n }\n\n try {\n await bridge.account.userDeposit.fetch(userDepositAccount);\n } catch (ignoreError) {\n const instruction: TransactionInstruction = await bridge.methods\n .initDepositAccount()\n .accounts({\n mint: tokenMintAccount,\n user,\n userDeposit: userDepositAccount,\n })\n .instruction();\n preInstructions.push(instruction);\n }\n\n const accounts: LPAccounts = {\n mint: tokenMintAccount,\n user,\n config: configAccount,\n pool: poolAccount,\n bridgeAuthority: bridgeAuthority,\n userDeposit: userDepositAccount,\n userToken,\n bridgeToken: bridgeTokenAccount,\n };\n\n return { accounts, preInstructions };\n }\n}\n", "import { contract } from \"@stellar/stellar-sdk\";\nimport { AllbridgeCoreClient } from \"../../../client/core-api/core-client-base\";\nimport { AllbridgeCoreSdkOptions, ChainSymbol, ChainType } from \"../../../index\";\nimport {\n LiquidityPoolsParams,\n LiquidityPoolsParamsWithAmount,\n PoolInfo,\n SdkError,\n TokenWithChainDetails,\n UserBalanceInfo,\n} from \"../../../models\";\nimport { calculatePoolInfoImbalance } from \"../../../utils/calculation\";\nimport { NodeRpcUrlsConfig } from \"../../index\";\nimport { RawTransaction } from \"../../models\";\nimport { PoolContract } from \"../../models/srb/pool-contract\";\nimport { getViewResultSoroban, isErrorSorobanResult } from \"../../models/srb/utils\";\nimport { ChainPoolService, UserBalance } from \"../models\";\nimport ContractClientOptions = contract.ClientOptions;\n\nexport class SrbPoolService extends ChainPoolService {\n chainType: ChainType.SRB = ChainType.SRB;\n private P = 48;\n\n constructor(\n readonly nodeRpcUrlsConfig: NodeRpcUrlsConfig,\n readonly params: AllbridgeCoreSdkOptions,\n readonly api: AllbridgeCoreClient\n ) {\n super();\n }\n\n async getUserBalanceInfo(accountAddress: string, token: TokenWithChainDetails): Promise<UserBalanceInfo> {\n const poolContract = this.getContract(token.poolAddress);\n const result = await poolContract.get_user_deposit({ user: accountAddress });\n if (isErrorSorobanResult(result)) {\n throw new SdkError();\n }\n const viewResultSoroban = getViewResultSoroban(result);\n if (!viewResultSoroban) {\n throw new SdkError();\n }\n\n const userDeposit = viewResultSoroban.unwrap();\n return new UserBalance({\n lpAmount: userDeposit.lp_amount.toString(),\n rewardDebt: userDeposit.reward_debt.toString(),\n });\n }\n\n async getPoolInfoFromChain(token: TokenWithChainDetails): Promise<PoolInfo> {\n const poolContract = this.getContract(token.poolAddress);\n const result = await poolContract.get_pool();\n if (isErrorSorobanResult(result)) {\n throw new SdkError();\n }\n const viewResultSoroban = getViewResultSoroban(result);\n if (!viewResultSoroban) {\n throw new SdkError();\n }\n\n const pool = viewResultSoroban.unwrap();\n return {\n aValue: pool.a.toString(),\n accRewardPerShareP: pool.acc_reward_per_share_p.toString(),\n dValue: pool.d.toString(),\n tokenBalance: pool.token_balance.toString(),\n p: this.P,\n totalLpAmount: pool.total_lp_amount.toString(),\n vUsdBalance: pool.v_usd_balance.toString(),\n imbalance: calculatePoolInfoImbalance({\n tokenBalance: pool.token_balance.toString(),\n vUsdBalance: pool.v_usd_balance.toString(),\n }),\n };\n }\n\n async buildRawTransactionDeposit(params: LiquidityPoolsParamsWithAmount): Promise<RawTransaction> {\n const poolContract = this.getContract(params.token.poolAddress, params.accountAddress);\n return (\n await poolContract.deposit({\n sender: params.accountAddress,\n amount: BigInt(params.amount),\n })\n ).toXDR();\n }\n\n async buildRawTransactionWithdraw(params: LiquidityPoolsParamsWithAmount): Promise<RawTransaction> {\n const poolContract = this.getContract(params.token.poolAddress, params.accountAddress);\n return (\n await poolContract.withdraw({\n sender: params.accountAddress,\n amount_lp: BigInt(params.amount),\n })\n ).toXDR();\n }\n\n async buildRawTransactionClaimRewards(params: LiquidityPoolsParams): Promise<RawTransaction> {\n const poolContract = this.getContract(params.token.poolAddress, params.accountAddress);\n return (\n await poolContract.claim_rewards({\n sender: params.accountAddress,\n })\n ).toXDR();\n }\n\n private getContract(address: string, sender?: string): PoolContract {\n const config: ContractClientOptions = {\n publicKey: sender,\n contractId: address,\n networkPassphrase: this.params.sorobanNetworkPassphrase,\n rpcUrl: this.nodeRpcUrlsConfig.getNodeRpcUrl(ChainSymbol.SRB),\n };\n return new PoolContract(config);\n }\n}\n", "import { contract } from \"@stellar/stellar-sdk\";\nimport u128 = contract.u128;\nimport u32 = contract.u32;\nimport AssembledTransaction = contract.AssembledTransaction;\nimport Result = contract.Result;\nimport ContractSpec = contract.Spec;\nimport ContractClient = contract.Client;\nimport ContractClientOptions = contract.ClientOptions;\n\nexport interface SwappedFromVUsd {\n amount: u128;\n fee: u128;\n recipient: string;\n token: string;\n vusd_amount: u128;\n}\n\nexport interface SwappedToVUsd {\n amount: u128;\n fee: u128;\n sender: string;\n token: string;\n vusd_amount: u128;\n}\n\nexport interface Deposit {\n amount: u128;\n user: string;\n}\n\nexport interface Withdraw {\n amount: u128;\n user: string;\n}\n\nexport interface RewardsClaimed {\n amount: u128;\n user: string;\n}\n\nexport type Bridge = readonly [string];\nexport interface DataKey {\n tag: \"UserDeposit\";\n values: readonly [string];\n}\n\nexport interface Pool {\n a: u128;\n acc_reward_per_share_p: u128;\n admin_fee_amount: u128;\n admin_fee_share_bp: u128;\n balance_ratio_min_bp: u128;\n can_deposit: boolean;\n can_withdraw: boolean;\n d: u128;\n decimals: u32;\n fee_share_bp: u128;\n reserves: u128;\n token: string;\n token_balance: u128;\n total_lp_amount: u128;\n v_usd_balance: u128;\n}\n\nexport interface UserDeposit {\n lp_amount: u128;\n reward_debt: u128;\n}\n\nexport type Admin = readonly [string];\nexport type GasOracleAddress = readonly [string];\nexport type GasUsage = readonly [Map<u32, u128>];\nexport type NativeToken = readonly [string];\nexport type StopAuthority = readonly [string];\nexport const Errors = {\n 0: { message: \"\" },\n 1: { message: \"\" },\n 2: { message: \"\" },\n 3: { message: \"\" },\n 4: { message: \"\" },\n 5: { message: \"\" },\n 6: { message: \"\" },\n 7: { message: \"\" },\n 8: { message: \"\" },\n 9: { message: \"\" },\n 10: { message: \"\" },\n 11: { message: \"\" },\n 12: { message: \"\" },\n 103: { message: \"\" },\n 104: { message: \"\" },\n 105: { message: \"\" },\n 106: { message: \"\" },\n 107: { message: \"\" },\n 108: { message: \"\" },\n 109: { message: \"\" },\n 203: { message: \"\" },\n 204: { message: \"\" },\n 205: { message: \"\" },\n 206: { message: \"\" },\n 207: { message: \"\" },\n 208: { message: \"\" },\n 209: { message: \"\" },\n 210: { message: \"\" },\n 211: { message: \"\" },\n 212: { message: \"\" },\n 214: { message: \"\" },\n 215: { message: \"\" },\n 216: { message: \"\" },\n 217: { message: \"\" },\n 218: { message: \"\" },\n 300: { message: \"\" },\n 301: { message: \"\" },\n 302: { message: \"\" },\n 303: { message: \"\" },\n 400: { message: \"\" },\n};\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging\nexport interface PoolContract {\n /**\n * Construct and simulate a initialize transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n initialize: (\n {\n admin,\n bridge,\n a,\n token,\n fee_share_bp,\n balance_ratio_min_bp,\n admin_fee_share_bp,\n }: {\n admin: string;\n bridge: string;\n a: u128;\n token: string;\n fee_share_bp: u128;\n balance_ratio_min_bp: u128;\n admin_fee_share_bp: u128;\n },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a deposit transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n deposit: (\n { sender, amount }: { sender: string; amount: u128 },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a withdraw transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n withdraw: (\n { sender, amount_lp }: { sender: string; amount_lp: u128 },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a swap_to_v_usd transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n swap_to_v_usd: (\n { user, amount, zero_fee }: { user: string; amount: u128; zero_fee: boolean },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<u128>>>;\n\n /**\n * Construct and simulate a swap_from_v_usd transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n swap_from_v_usd: (\n {\n user,\n vusd_amount,\n receive_amount_min,\n zero_fee,\n }: {\n user: string;\n vusd_amount: u128;\n receive_amount_min: u128;\n zero_fee: boolean;\n },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<u128>>>;\n\n /**\n * Construct and simulate a claim_rewards transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n claim_rewards: (\n { sender }: { sender: string },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a set_fee_share transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. *\n * `admin`\n */\n set_fee_share: (\n { fee_share_bp }: { fee_share_bp: u128 },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a adjust_total_lp_amount transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n adjust_total_lp_amount: (options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a set_balance_ratio_min_bp transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n set_balance_ratio_min_bp: (\n { balance_ratio_min_bp }: { balance_ratio_min_bp: u128 },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a stop_deposit transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n stop_deposit: (options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a start_deposit transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n start_deposit: (options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a stop_withdraw transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n stop_withdraw: (options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a start_withdraw transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n start_withdraw: (options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a set_stop_authority transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n set_stop_authority: (\n { stop_authority }: { stop_authority: string },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a set_bridge transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n set_bridge: (\n { bridge }: { bridge: string },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a set_admin transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n set_admin: (\n { new_admin }: { new_admin: string },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a set_admin_fee_share transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n set_admin_fee_share: (\n { admin_fee_share_bp }: { admin_fee_share_bp: u128 },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a claim_admin_fee transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n claim_admin_fee: (options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }) => Promise<AssembledTransaction<Result<void>>>;\n\n /**\n * Construct and simulate a pending_reward transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. *\n * `view`\n */\n pending_reward: (\n { user }: { user: string },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<u128>>>;\n\n /**\n * Construct and simulate a get_pool transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n get_pool: (options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }) => Promise<AssembledTransaction<Result<Pool>>>;\n\n /**\n * Construct and simulate a get_admin transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n get_admin: (options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }) => Promise<AssembledTransaction<Result<string>>>;\n\n /**\n * Construct and simulate a get_stop_authority transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n get_stop_authority: (options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }) => Promise<AssembledTransaction<Result<string>>>;\n\n /**\n * Construct and simulate a get_bridge transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n get_bridge: (options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }) => Promise<AssembledTransaction<Result<string>>>;\n\n /**\n * Construct and simulate a get_user_deposit transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n get_user_deposit: (\n { user }: { user: string },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<UserDeposit>>>;\n\n /**\n * Construct and simulate a upgrade transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object.\n */\n upgrade: (\n { new_wasm_hash }: { new_wasm_hash: Buffer },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<Result<void>>>;\n}\n// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging\nexport class PoolContract extends ContractClient {\n constructor(public readonly options: ContractClientOptions) {\n super(\n new ContractSpec([\n \"AAAAAAAAAAAAAAAKaW5pdGlhbGl6ZQAAAAAABwAAAAAAAAAFYWRtaW4AAAAAAAATAAAAAAAAAAZicmlkZ2UAAAAAABMAAAAAAAAAAWEAAAAAAAAKAAAAAAAAAAV0b2tlbgAAAAAAABMAAAAAAAAADGZlZV9zaGFyZV9icAAAAAoAAAAAAAAAFGJhbGFuY2VfcmF0aW9fbWluX2JwAAAACgAAAAAAAAASYWRtaW5fZmVlX3NoYXJlX2JwAAAAAAAKAAAAAQAAA+kAAAPtAAAAAAAAAAM=\",\n \"AAAAAAAAAAAAAAAHZGVwb3NpdAAAAAACAAAAAAAAAAZzZW5kZXIAAAAAABMAAAAAAAAABmFtb3VudAAAAAAACgAAAAEAAAPpAAAD7QAAAAAAAAAD\",\n \"AAAAAAAAAAAAAAAId2l0aGRyYXcAAAACAAAAAAAAAAZzZW5kZXIAAAAAABMAAAAAAAAACWFtb3VudF9scAAAAAAAAAoAAAABAAAD6QAAA+0AAAAAAAAAAw==\",\n \"AAAAAAAAAAAAAAANc3dhcF90b192X3VzZAAAAAAAAAMAAAAAAAAABHVzZXIAAAATAAAAAAAAAAZhbW91bnQAAAAAAAoAAAAAAAAACHplcm9fZmVlAAAAAQAAAAEAAAPpAAAACgAAAAM=\",\n \"AAAAAAAAAAAAAAAPc3dhcF9mcm9tX3ZfdXNkAAAAAAQAAAAAAAAABHVzZXIAAAATAAAAAAAAAAt2dXNkX2Ftb3VudAAAAAAKAAAAAAAAABJyZWNlaXZlX2Ftb3VudF9taW4AAAAAAAoAAAAAAAAACHplcm9fZmVlAAAAAQAAAAEAAAPpAAAACgAAAAM=\",\n \"AAAAAAAAAAAAAAANY2xhaW1fcmV3YXJkcwAAAAAAAAEAAAAAAAAABnNlbmRlcgAAAAAAEwAAAAEAAAPpAAAD7QAAAAAAAAAD\",\n \"AAAAAAAAAAdgYWRtaW5gAAAAAA1zZXRfZmVlX3NoYXJlAAAAAAAAAQAAAAAAAAAMZmVlX3NoYXJlX2JwAAAACgAAAAEAAAPpAAAD7QAAAAAAAAAD\",\n \"AAAAAAAAAAAAAAAWYWRqdXN0X3RvdGFsX2xwX2Ftb3VudAAAAAAAAAAAAAEAAAPpAAAD7QAAAAAAAAAD\",\n \"AAAAAAAAAAAAAAAYc2V0X2JhbGFuY2VfcmF0aW9fbWluX2JwAAAAAQAAAAAAAAAUYmFsYW5jZV9yYXRpb19taW5fYnAAAAAKAAAAAQAAA+kAAAPtAAAAAAAAAAM=\",\n \"AAAAAAAAAAAAAAAMc3RvcF9kZXBvc2l0AAAAAAAAAAEAAAPpAAAD7QAAAAAAAAAD\",\n \"AAAAAAAAAAAAAAANc3RhcnRfZGVwb3NpdAAAAAAAAAAAAAABAAAD6QAAA+0AAAAAAAAAAw==\",\n \"AAAAAAAAAAAAAAANc3RvcF93aXRoZHJhdwAAAAAAAAAAAAABAAAD6QAAA+0AAAAAAAAAAw==\",\n \"AAAAAAAAAAAAAAAOc3RhcnRfd2l0aGRyYXcAAAAAAAAAAAABAAAD6QAAA+0AAAAAAAAAAw==\",\n \"AAAAAAAAAAAAAAASc2V0X3N0b3BfYXV0aG9yaXR5AAAAAAABAAAAAAAAAA5zdG9wX2F1dGhvcml0eQAAAAAAEwAAAAEAAAPpAAAD7QAAAAAAAAAD\",\n \"AAAAAAAAAAAAAAAKc2V0X2JyaWRnZQAAAAAAAQAAAAAAAAAGYnJpZGdlAAAAAAATAAAAAQAAA+kAAAPtAAAAAAAAAAM=\",\n \"AAAAAAAAAAAAAAAJc2V0X2FkbWluAAAAAAAAAQAAAAAAAAAJbmV3X2FkbWluAAAAAAAAEwAAAAEAAAPpAAAD7QAAAAAAAAAD\",\n \"AAAAAAAAAAAAAAATc2V0X2FkbWluX2ZlZV9zaGFyZQAAAAABAAAAAAAAABJhZG1pbl9mZWVfc2hhcmVfYnAAAAAAAAoAAAABAAAD6QAAA+0AAAAAAAAAAw==\",\n \"AAAAAAAAAAAAAAAPY2xhaW1fYWRtaW5fZmVlAAAAAAAAAAABAAAD6QAAA+0AAAAAAAAAAw==\",\n \"AAAAAAAAAAZgdmlld2AAAAAAAA5wZW5kaW5nX3Jld2FyZAAAAAAAAQAAAAAAAAAEdXNlcgAAABMAAAABAAAD6QAAAAoAAAAD\",\n \"AAAAAAAAAAAAAAAIZ2V0X3Bvb2wAAAAAAAAAAQAAA+kAAAfQAAAABFBvb2wAAAAD\",\n \"AAAAAAAAAAAAAAAJZ2V0X2FkbWluAAAAAAAAAAAAAAEAAAPpAAAAEwAAAAM=\",\n \"AAAAAAAAAAAAAAASZ2V0X3N0b3BfYXV0aG9yaXR5AAAAAAAAAAAAAQAAA+kAAAATAAAAAw==\",\n \"AAAAAAAAAAAAAAAKZ2V0X2JyaWRnZQAAAAAAAAAAAAEAAAPpAAAAEwAAAAM=\",\n \"AAAAAAAAAAAAAAAQZ2V0X3VzZXJfZGVwb3NpdAAAAAEAAAAAAAAABHVzZXIAAAATAAAAAQAAA+kAAAfQAAAAC1VzZXJEZXBvc2l0AAAAAAM=\",\n \"AAAAAAAAAAAAAAAHdXBncmFkZQAAAAABAAAAAAAAAA1uZXdfd2FzbV9oYXNoAAAAAAAD7gAAACAAAAABAAAD6QAAA+0AAAAAAAAAAw==\",\n \"AAAAAQAAAAAAAAAAAAAAD1N3YXBwZWRGcm9tVlVzZAAAAAAFAAAAAAAAAAZhbW91bnQAAAAAAAoAAAAAAAAAA2ZlZQAAAAAKAAAAAAAAAAlyZWNpcGllbnQAAAAAAAATAAAAAAAAAAV0b2tlbgAAAAAAABMAAAAAAAAAC3Z1c2RfYW1vdW50AAAAAAo=\",\n \"AAAAAQAAAAAAAAAAAAAADVN3YXBwZWRUb1ZVc2QAAAAAAAAFAAAAAAAAAAZhbW91bnQAAAAAAAoAAAAAAAAAA2ZlZQAAAAAKAAAAAAAAAAZzZW5kZXIAAAAAABMAAAAAAAAABXRva2VuAAAAAAAAEwAAAAAAAAALdnVzZF9hbW91bnQAAAAACg==\",\n \"AAAAAQAAAAAAAAAAAAAAB0RlcG9zaXQAAAAAAgAAAAAAAAAGYW1vdW50AAAAAAAKAAAAAAAAAAR1c2VyAAAAEw==\",\n \"AAAAAQAAAAAAAAAAAAAACFdpdGhkcmF3AAAAAgAAAAAAAAAGYW1vdW50AAAAAAAKAAAAAAAAAAR1c2VyAAAAEw==\",\n \"AAAAAQAAAAAAAAAAAAAADlJld2FyZHNDbGFpbWVkAAAAAAACAAAAAAAAAAZhbW91bnQAAAAAAAoAAAAAAAAABHVzZXIAAAAT\",\n \"AAAAAQAAAAAAAAAAAAAABkJyaWRnZQAAAAAAAQAAAAAAAAABMAAAAAAAABM=\",\n \"AAAAAgAAAAAAAAAAAAAAB0RhdGFLZXkAAAAAAQAAAAEAAAAAAAAAC1VzZXJEZXBvc2l0AAAAAAEAAAAT\",\n \"AAAAAQAAAAAAAAAAAAAABFBvb2wAAAAPAAAAAAAAAAFhAAAAAAAACgAAAAAAAAAWYWNjX3Jld2FyZF9wZXJfc2hhcmVfcAAAAAAACgAAAAAAAAAQYWRtaW5fZmVlX2Ftb3VudAAAAAoAAAAAAAAAEmFkbWluX2ZlZV9zaGFyZV9icAAAAAAACgAAAAAAAAAUYmFsYW5jZV9yYXRpb19taW5fYnAAAAAKAAAAAAAAAAtjYW5fZGVwb3NpdAAAAAABAAAAAAAAAAxjYW5fd2l0aGRyYXcAAAABAAAAAAAAAAFkAAAAAAAACgAAAAAAAAAIZGVjaW1hbHMAAAAEAAAAAAAAAAxmZWVfc2hhcmVfYnAAAAAKAAAAAAAAAAhyZXNlcnZlcwAAAAoAAAAAAAAABXRva2VuAAAAAAAAEwAAAAAAAAANdG9rZW5fYmFsYW5jZQAAAAAAAAoAAAAAAAAAD3RvdGFsX2xwX2Ftb3VudAAAAAAKAAAAAAAAAA12X3VzZF9iYWxhbmNlAAAAAAAACg==\",\n \"AAAAAQAAAAAAAAAAAAAAC1VzZXJEZXBvc2l0AAAAAAIAAAAAAAAACWxwX2Ftb3VudAAAAAAAAAoAAAAAAAAAC3Jld2FyZF9kZWJ0AAAAAAo=\",\n \"AAAAAQAAAAAAAAAAAAAABUFkbWluAAAAAAAAAQAAAAAAAAABMAAAAAAAABM=\",\n \"AAAAAQAAAAAAAAAAAAAAEEdhc09yYWNsZUFkZHJlc3MAAAABAAAAAAAAAAEwAAAAAAAAEw==\",\n \"AAAAAQAAAAAAAAAAAAAACEdhc1VzYWdlAAAAAQAAAAAAAAABMAAAAAAAA+wAAAAEAAAACg==\",\n \"AAAAAQAAAAAAAAAAAAAAC05hdGl2ZVRva2VuAAAAAAEAAAAAAAAAATAAAAAAAAAT\",\n \"AAAAAQAAAAAAAAAAAAAADVN0b3BBdXRob3JpdHkAAAAAAAABAAAAAAAAAAEwAAAAAAAAEw==\",\n \"AAAABAAAAAAAAAAAAAAABUVycm9yAAAAAAAAKAAAAAAAAAANVW5pbXBsZW1lbnRlZAAAAAAAAAAAAAAAAAAAC0luaXRpYWxpemVkAAAAAAEAAAAAAAAADVVuaW5pdGlhbGl6ZWQAAAAAAAACAAAAAAAAAAxVbmF1dGhvcml6ZWQAAAADAAAAAAAAAApJbnZhbGlkQXJnAAAAAAAEAAAAAAAAAA5JbnZhbGlkQ2hhaW5JZAAAAAAABQAAAAAAAAATSW52YWxpZE90aGVyQ2hhaW5JZAAAAAAGAAAAAAAAAA5HYXNVc2FnZU5vdFNldAAAAAAABwAAAAAAAAANQnJva2VuQWRkcmVzcwAAAAAAAAgAAAAAAAAACE5vdEZvdW5kAAAACQAAAAAAAAAYVG9rZW5JbnN1ZmZpY2llbnRCYWxhbmNlAAAACgAAAAAAAAAKQ2FzdEZhaWxlZAAAAAAACwAAAAAAAAAMVTI1Nk92ZXJmbG93AAAADAAAAAAAAAAKWmVyb0Ftb3VudAAAAAAAZwAAAAAAAAAMUG9vbE92ZXJmbG93AAAAaAAAAAAAAAALWmVyb0NoYW5nZXMAAAAAaQAAAAAAAAARUmVzZXJ2ZXNFeGhhdXN0ZWQAAAAAAABqAAAAAAAAABpJbnN1ZmZpY2llbnRSZWNlaXZlZEFtb3VudAAAAAAAawAAAAAAAAAUQmFsYW5jZVJhdGlvRXhjZWVkZWQAAABsAAAAAAAAAAlGb3JiaWRkZW4AAAAAAABtAAAAAAAAABlVbmF1dGhvcml6ZWRTdG9wQXV0aG9yaXR5AAAAAAAAywAAAAAAAAAOU3dhcFByb2hpYml0ZWQAAAAAAMwAAAAAAAAAEkFtb3VudFRvb0xvd0ZvckZlZQAAAAAAzQAAAAAAAAAWQnJpZGdlVG9UaGVaZXJvQWRkcmVzcwAAAAAAzgAAAAAAAAAORW1wdHlSZWNpcGllbnQAAAAAAM8AAAAAAAAAE1NvdXJjZU5vdFJlZ2lzdGVyZWQAAAAA0AAAAAAAAAAVV3JvbmdEZXN0aW5hdGlvbkNoYWluAAAAAAAA0QAAAAAAAAATVW5rbm93bkFub3RoZXJDaGFpbgAAAADSAAAAAAAAABFUb2tlbnNBbHJlYWR5U2VudAAAAAAAANMAAAAAAAAAEE1lc3NhZ2VQcm9jZXNzZWQAAADUAAAAAAAAAAxOb3RFbm91Z2hGZWUAAADWAAAAAAAAAAlOb01lc3NhZ2UAAAAAAADXAAAAAAAAAA1Ob1JlY2VpdmVQb29sAAAAAAAA2AAAAAAAAAAGTm9Qb29sAAAAAADZAAAAAAAAABNVbmtub3duQW5vdGhlclRva2VuAAAAANoAAAAAAAAAD1dyb25nQnl0ZUxlbmd0aAAAAAEsAAAAAAAAAApIYXNNZXNzYWdlAAAAAAEtAAAAAAAAABdJbnZhbGlkUHJpbWFyeVNpZ25hdHVyZQAAAAEuAAAAAAAAABlJbnZhbGlkU2Vjb25kYXJ5U2lnbmF0dXJlAAAAAAABLwAAAAAAAAARTm9HYXNEYXRhRm9yQ2hhaW4AAAAAAAGQ\",\n ]),\n options\n );\n }\n public readonly fromJSON = {\n initialize: this.txFromJSON<Result<void>>,\n deposit: this.txFromJSON<Result<void>>,\n withdraw: this.txFromJSON<Result<void>>,\n swap_to_v_usd: this.txFromJSON<Result<u128>>,\n swap_from_v_usd: this.txFromJSON<Result<u128>>,\n claim_rewards: this.txFromJSON<Result<void>>,\n set_fee_share: this.txFromJSON<Result<void>>,\n adjust_total_lp_amount: this.txFromJSON<Result<void>>,\n set_balance_ratio_min_bp: this.txFromJSON<Result<void>>,\n stop_deposit: this.txFromJSON<Result<void>>,\n start_deposit: this.txFromJSON<Result<void>>,\n stop_withdraw: this.txFromJSON<Result<void>>,\n start_withdraw: this.txFromJSON<Result<void>>,\n set_stop_authority: this.txFromJSON<Result<void>>,\n set_bridge: this.txFromJSON<Result<void>>,\n set_admin: this.txFromJSON<Result<void>>,\n set_admin_fee_share: this.txFromJSON<Result<void>>,\n claim_admin_fee: this.txFromJSON<Result<void>>,\n pending_reward: this.txFromJSON<Result<u128>>,\n get_pool: this.txFromJSON<Result<Pool>>,\n get_admin: this.txFromJSON<Result<string>>,\n get_stop_authority: this.txFromJSON<Result<string>>,\n get_bridge: this.txFromJSON<Result<string>>,\n get_user_deposit: this.txFromJSON<Result<UserDeposit>>,\n upgrade: this.txFromJSON<Result<void>>,\n };\n}\n", "import { contract, rpc } from \"@stellar/stellar-sdk\";\nimport Api = rpc.Api;\nimport AssembledTransaction = contract.AssembledTransaction;\nimport SentTransaction = contract.SentTransaction;\n\nexport function getViewResultSoroban<T>(assembledTx: AssembledTransaction<T>): T | undefined {\n const { simulation, options } = assembledTx;\n if (!simulation) {\n throw new Error(\"Soroban assembled transaction does not have simulation\");\n }\n\n if (Api.isSimulationSuccess(simulation)) {\n if (simulation.result == null) {\n return;\n }\n return options.parseResultXdr(simulation.result.retval);\n } else {\n throw new Error(simulation.error);\n }\n}\n\nexport function isErrorSorobanResult<T>(assembledTx: AssembledTransaction<T>): boolean {\n const { simulation } = assembledTx;\n if (!simulation) {\n throw new Error(\"Soroban assembled transaction does not have simulation\");\n }\n return Api.isSimulationError(simulation);\n}\n\nexport async function signAndSendSoroban<T>(assembledTx: AssembledTransaction<T>): Promise<SentTransaction<T>> {\n await assembledTx.simulate({ restore: true });\n return assembledTx.signAndSend();\n}\n", "import { SuiClient } from \"@mysten/sui/client\";\nimport { CoinStruct, SuiObjectResponse } from \"@mysten/sui/src/client/types/generated\";\nimport { Transaction, TransactionResult } from \"@mysten/sui/transactions\";\nimport { ChainType } from \"../../../chains/chain.enums\";\nimport { AllbridgeCoreClient } from \"../../../client/core-api/core-client-base\";\nimport { InvalidAmountError, SdkError } from \"../../../exceptions\";\nimport { PoolInfo, TokenWithChainDetails } from \"../../../tokens-info\";\nimport { calculatePoolInfoImbalance } from \"../../../utils/calculation\";\nimport { RawSuiTransaction } from \"../../models\";\nimport { phantom } from \"../../models/sui/_framework/reified\";\nimport { setAddress } from \"../../models/sui/bridge\";\nimport {\n claimReward,\n deposit,\n newUserDeposit,\n pool,\n withdraw,\n} from \"../../models/sui/bridge/bridge-interface/functions\";\nimport { Pool } from \"../../models/sui/bridge/pool/structs\";\nimport { UserDeposit } from \"../../models/sui/bridge/user-deposit/structs\";\nimport { getCoinsWithAmounts } from \"../../utils/sui/coins\";\nimport { fetchAllPagesRecursive } from \"../../utils/sui/paginated\";\nimport { suiView } from \"../../utils/sui/view\";\nimport {\n ChainPoolService,\n LiquidityPoolsParams,\n LiquidityPoolsParamsWithAmount,\n UserBalance,\n UserBalanceInfo,\n} from \"../models\";\n\nexport class SuiPoolService extends ChainPoolService {\n chainType: ChainType.SUI = ChainType.SUI;\n\n private readonly client: SuiClient;\n\n constructor(\n public suiRpcUrl: string,\n public api: AllbridgeCoreClient\n ) {\n super();\n this.client = new SuiClient({\n url: suiRpcUrl,\n });\n }\n\n async getUserBalanceInfo(accountAddress: string, token: TokenWithChainDetails): Promise<UserBalanceInfo> {\n if (!token.originTokenAddress) {\n throw new SdkError(\"SUI token must contain 'originTokenAddress'\");\n }\n const suiAddresses = token.suiAddresses;\n if (!suiAddresses) {\n throw new SdkError(\"SUI token must contain 'suiAddresses'\");\n }\n setAddress(suiAddresses.bridgeAddress, suiAddresses.bridgeAddressOrigin);\n\n const deposits = await this.fetchDeposits(accountAddress, token.originTokenAddress);\n const total = deposits.reduce(\n (total, element) => {\n if (element.data) {\n total.lpAmount += BigInt((element.data.content as any).fields.lp_amount);\n total.rewardDebt += BigInt((element.data.content as any).fields.reward_debt);\n return total;\n } else {\n throw new SdkError(\"Deposits fetch failed\");\n }\n },\n { lpAmount: BigInt(0), rewardDebt: BigInt(0) }\n );\n return new UserBalance({ lpAmount: total.lpAmount.toString(), rewardDebt: total.rewardDebt.toString() });\n }\n\n private async fetchDeposits(accountAddress: string, tokenAddress: string): Promise<SuiObjectResponse[]> {\n return await fetchAllPagesRecursive((cursor: string | null | undefined) =>\n this.client.getOwnedObjects({\n owner: accountAddress,\n filter: { StructType: UserDeposit.phantom(phantom(tokenAddress)).phantomType },\n options: { showContent: true },\n cursor,\n })\n );\n }\n\n async getPoolInfoFromChain(token: TokenWithChainDetails): Promise<PoolInfo> {\n const suiAddresses = token.suiAddresses;\n if (!suiAddresses) {\n throw new SdkError(\"SUI token must contain 'suiAddresses'\");\n }\n setAddress(suiAddresses.bridgeAddress, suiAddresses.bridgeAddressOrigin);\n\n if (!token.originTokenAddress) {\n throw new SdkError(\"SUI token must contain 'originTokenAddress'\");\n }\n\n const P = 48;\n const tx = new Transaction();\n pool(tx, token.originTokenAddress, suiAddresses.bridgeObjectAddress);\n const res = await suiView(this.client, tx, Pool.reified(phantom(token.originTokenAddress)));\n\n const tokenBalance = res.state.tokenBalance;\n const vUsdBalance = res.state.vusdBalance;\n const imbalance = calculatePoolInfoImbalance({ tokenBalance, vUsdBalance });\n\n return {\n dValue: res.state.d,\n aValue: res.state.a,\n totalLpAmount: res.rewards.lpSupply,\n vUsdBalance: vUsdBalance,\n tokenBalance: tokenBalance,\n accRewardPerShareP: res.rewards.accRewardPerShareP,\n p: P,\n imbalance,\n };\n }\n\n async buildRawTransactionDeposit(params: LiquidityPoolsParamsWithAmount): Promise<RawSuiTransaction> {\n const suiAddresses = params.token.suiAddresses;\n if (!suiAddresses) {\n throw new SdkError(\"SUI token must contain 'suiAddresses'\");\n }\n setAddress(suiAddresses.bridgeAddress, suiAddresses.bridgeAddressOrigin);\n\n if (!params.token.originTokenAddress) {\n throw new SdkError(\"SUI token must contain 'originTokenAddress'\");\n }\n const coins: CoinStruct[] = await fetchAllPagesRecursive((cursor: string | null | undefined) =>\n this.client.getCoins({\n owner: params.accountAddress,\n coinType: params.token.originTokenAddress,\n cursor,\n })\n );\n if (coins.length === 0 || !coins[0]) {\n throw new InvalidAmountError(\"No coins to deposit\");\n }\n const firstCoin = coins[0];\n\n const tx = new Transaction();\n tx.setSender(params.accountAddress);\n const { depositObj, isNewDeposit } = await this.getDepositObject(\n params.accountAddress,\n params.token.originTokenAddress,\n tx\n );\n const [amountCoin] = getCoinsWithAmounts([params.amount], coins, tx);\n if (!amountCoin) {\n throw new InvalidAmountError(\"No coins to deposit\");\n }\n if (!params.token.originTokenAddress) {\n throw new SdkError(\"SUI token must contain 'originTokenAddress'\");\n }\n const rewards = deposit(tx, params.token.originTokenAddress, {\n bridge: suiAddresses.bridgeObjectAddress,\n userDeposit: depositObj,\n coin: amountCoin,\n });\n tx.mergeCoins(firstCoin.coinObjectId, [rewards]);\n if (isNewDeposit) {\n tx.transferObjects([depositObj], params.accountAddress);\n }\n return await tx.toJSON({ client: this.client });\n }\n\n private async getDepositObject(\n accountAddress: string,\n tokenAddress: string,\n tx: Transaction\n ): Promise<{\n depositObj: string | TransactionResult;\n isNewDeposit: boolean;\n }> {\n const deposits = await this.fetchDeposits(accountAddress, tokenAddress);\n if (deposits.length === 0 || !deposits[0]) {\n const tokenType = phantom(tokenAddress).phantomType;\n const depositObj = newUserDeposit(tx, tokenType);\n return { depositObj, isNewDeposit: true };\n } else {\n if (deposits[0].data?.objectId) {\n return { depositObj: deposits[0].data.objectId, isNewDeposit: false };\n } else {\n throw new SdkError(\"Something went wrong while deposit\");\n }\n }\n }\n\n async buildRawTransactionWithdraw(params: LiquidityPoolsParamsWithAmount): Promise<RawSuiTransaction> {\n const suiAddresses = params.token.suiAddresses;\n if (!suiAddresses) {\n throw new SdkError(\"SUI token must contain 'suiAddresses'\");\n }\n setAddress(suiAddresses.bridgeAddress, suiAddresses.bridgeAddressOrigin);\n\n if (!params.token.originTokenAddress) {\n throw new SdkError(\"SUI token must contain 'originTokenAddress'\");\n }\n const tokenType = phantom(params.token.originTokenAddress).phantomType;\n\n const tx = new Transaction();\n tx.setSender(params.accountAddress);\n\n const { depositObj, isNewDeposit } = await this.getDepositObject(\n params.accountAddress,\n params.token.originTokenAddress,\n tx\n );\n if (isNewDeposit) {\n throw new InvalidAmountError(\"No deposit found\");\n }\n\n const rewards = withdraw(tx, tokenType, {\n bridge: suiAddresses.bridgeObjectAddress,\n userDeposit: depositObj,\n amountLp: BigInt(params.amount),\n });\n\n const coins: CoinStruct[] = await fetchAllPagesRecursive((cursor: string | null | undefined) =>\n this.client.getCoins({\n owner: params.accountAddress,\n coinType: params.token.originTokenAddress,\n cursor,\n })\n );\n\n if (!rewards[0] || !rewards[1]) {\n throw new SdkError(\"No rewards found\");\n }\n\n if (coins[0]) {\n tx.mergeCoins(coins[0].coinObjectId, [rewards[0], rewards[1]]);\n } else {\n tx.mergeCoins(rewards[0], [rewards[1]]);\n tx.transferObjects([rewards[0]], params.accountAddress);\n }\n return await tx.toJSON({ client: this.client });\n }\n\n async buildRawTransactionClaimRewards(params: LiquidityPoolsParams): Promise<RawSuiTransaction> {\n const suiAddresses = params.token.suiAddresses;\n if (!suiAddresses) {\n throw new SdkError(\"SUI token must contain 'suiAddresses'\");\n }\n setAddress(suiAddresses.bridgeAddress, suiAddresses.bridgeAddressOrigin);\n\n if (!params.token.originTokenAddress) {\n throw new SdkError(\"SUI token must contain 'originTokenAddress'\");\n }\n const tokenType = phantom(params.token.originTokenAddress).phantomType;\n\n const tx = new Transaction();\n tx.setSender(params.accountAddress);\n\n const { depositObj, isNewDeposit } = await this.getDepositObject(\n params.accountAddress,\n params.token.originTokenAddress,\n tx\n );\n if (isNewDeposit) {\n throw new InvalidAmountError(\"No deposit found\");\n }\n\n const reward = claimReward(tx, tokenType, {\n bridge: suiAddresses.bridgeObjectAddress,\n userDeposit: depositObj,\n });\n\n const coins: CoinStruct[] = await fetchAllPagesRecursive((cursor: string | null | undefined) =>\n this.client.getCoins({\n owner: params.accountAddress,\n coinType: params.token.originTokenAddress,\n cursor,\n })\n );\n\n if (coins[0]) {\n tx.mergeCoins(coins[0].coinObjectId, [reward]);\n } else {\n tx.transferObjects([reward], params.accountAddress);\n }\n return await tx.toJSON({ client: this.client });\n }\n}\n", "// @ts-nocheck\nimport {\n PhantomReified,\n PhantomToTypeStr,\n PhantomTypeArgument,\n Reified,\n StructClass,\n ToField,\n ToPhantomTypeArgument,\n ToTypeStr,\n assertFieldsWithTypesArgsMatch,\n assertReifiedTypeArgsMatch,\n decodeFromFields,\n decodeFromFieldsWithTypes,\n decodeFromJSONField,\n extractType,\n phantom,\n} from \"../../_framework/reified\";\nimport { FieldsWithTypes, composeSuiType, compressSuiType, parseTypeName } from \"../../_framework/util\";\nimport { Balance } from \"../../sui/balance/structs\";\nimport { UID } from \"../../sui/object/structs\";\nimport { PKG_V1 } from \"../index\";\nimport { PoolRewards } from \"../pool-rewards/structs\";\nimport { PoolState } from \"../pool-state/structs\";\nimport { bcs } from \"@mysten/sui/bcs\";\nimport { SuiClient, SuiObjectData, SuiParsedData } from \"@mysten/sui/client\";\nimport { fromB64 } from \"@mysten/sui/utils\";\n\n/* ============================== AdminCap =============================== */\n\nexport function isAdminCap(type: string): boolean {\n type = compressSuiType(type);\n return type === `${PKG_V1}::pool::AdminCap`;\n}\n\nexport interface AdminCapFields {\n id: ToField<UID>;\n}\n\nexport type AdminCapReified = Reified<AdminCap, AdminCapFields>;\n\nexport class AdminCap implements StructClass {\n __StructClass = true as const;\n\n static get $typeName() {\n return `${PKG_V1}::pool::AdminCap`;\n }\n static readonly $numTypeParams = 0;\n static readonly $isPhantom = [] as const;\n\n readonly $typeName = AdminCap.$typeName;\n readonly $fullTypeName: string;\n readonly $typeArgs: [];\n readonly $isPhantom = AdminCap.$isPhantom;\n\n readonly id: ToField<UID>;\n\n private constructor(typeArgs: [], fields: AdminCapFields) {\n this.$fullTypeName = composeSuiType(AdminCap.$typeName, ...typeArgs) as string;\n this.$typeArgs = typeArgs;\n\n this.id = fields.id;\n }\n\n static reified(): AdminCapReified {\n return {\n typeName: AdminCap.$typeName,\n fullTypeName: composeSuiType(AdminCap.$typeName, ...[]) as string,\n typeArgs: [] as [],\n isPhantom: AdminCap.$isPhantom,\n reifiedTypeArgs: [],\n fromFields: (fields: Record<string, any>) => AdminCap.fromFields(fields),\n fromFieldsWithTypes: (item: FieldsWithTypes) => AdminCap.fromFieldsWithTypes(item),\n fromBcs: (data: Uint8Array) => AdminCap.fromBcs(data),\n bcs: AdminCap.bcs,\n fromJSONField: (field: any) => AdminCap.fromJSONField(field),\n fromJSON: (json: Record<string, any>) => AdminCap.fromJSON(json),\n fromSuiParsedData: (content: SuiParsedData) => AdminCap.fromSuiParsedData(content),\n fromSuiObjectData: (content: SuiObjectData) => AdminCap.fromSuiObjectData(content),\n fetch: async (client: SuiClient, id: string) => AdminCap.fetch(client, id),\n new: (fields: AdminCapFields) => {\n return new AdminCap([], fields);\n },\n kind: \"StructClassReified\",\n };\n }\n\n static get r() {\n return AdminCap.reified();\n }\n\n static phantom(): PhantomReified<ToTypeStr<AdminCap>> {\n return phantom(AdminCap.reified());\n }\n static get p() {\n return AdminCap.phantom();\n }\n\n static get bcs() {\n return bcs.struct(\"AdminCap\", {\n id: UID.bcs,\n });\n }\n\n static fromFields(fields: Record<string, any>): AdminCap {\n return AdminCap.reified().new({\n id: decodeFromFields(UID.reified(), fields.id),\n });\n }\n\n static fromFieldsWithTypes(item: FieldsWithTypes): AdminCap {\n if (!isAdminCap(item.type)) {\n throw new Error(\"not a AdminCap type\");\n }\n\n return AdminCap.reified().new({\n id: decodeFromFieldsWithTypes(UID.reified(), item.fields.id),\n });\n }\n\n static fromBcs(data: Uint8Array): AdminCap {\n return AdminCap.fromFields(AdminCap.bcs.parse(data));\n }\n\n toJSONField() {\n return {\n id: this.id,\n };\n }\n\n toJSON() {\n return {\n $typeName: this.$typeName,\n $typeArgs: this.$typeArgs,\n ...this.toJSONField(),\n };\n }\n\n static fromJSONField(field: any): AdminCap {\n return AdminCap.reified().new({\n id: decodeFromJSONField(UID.reified(), field.id),\n });\n }\n\n static fromJSON(json: Record<string, any>): AdminCap {\n if (json.$typeName !== AdminCap.$typeName) {\n throw new Error(\"not a WithTwoGenerics json object\");\n }\n\n return AdminCap.fromJSONField(json);\n }\n\n static fromSuiParsedData(content: SuiParsedData): AdminCap {\n if (content.dataType !== \"moveObject\") {\n throw new Error(\"not an object\");\n }\n if (!isAdminCap(content.type)) {\n throw new Error(`object at ${(content.fields as any).id} is not a AdminCap object`);\n }\n return AdminCap.fromFieldsWithTypes(content);\n }\n\n static fromSuiObjectData(data: SuiObjectData): AdminCap {\n if (data.bcs) {\n if (data.bcs.dataType !== \"moveObject\" || !isAdminCap(data.bcs.type)) {\n throw new Error(`object at is not a AdminCap object`);\n }\n\n return AdminCap.fromBcs(fromB64(data.bcs.bcsBytes));\n }\n if (data.content) {\n return AdminCap.fromSuiParsedData(data.content);\n }\n throw new Error(\n \"Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.\"\n );\n }\n\n static async fetch(client: SuiClient, id: string): Promise<AdminCap> {\n const res = await client.getObject({ id, options: { showBcs: true } });\n if (res.error) {\n throw new Error(`error fetching AdminCap object at id ${id}: ${res.error.code}`);\n }\n if (res.data?.bcs?.dataType !== \"moveObject\" || !isAdminCap(res.data.bcs.type)) {\n throw new Error(`object at id ${id} is not a AdminCap object`);\n }\n\n return AdminCap.fromSuiObjectData(res.data);\n }\n}\n\n/* ============================== Pool =============================== */\n\nexport function isPool(type: string): boolean {\n type = compressSuiType(type);\n return type.startsWith(`${PKG_V1}::pool::Pool` + \"<\");\n}\n\nexport interface PoolFields<T extends PhantomTypeArgument> {\n id: ToField<UID>;\n state: ToField<PoolState<T>>;\n rewards: ToField<PoolRewards<T>>;\n feeShareBp: ToField<\"u64\">;\n canDeposit: ToField<\"bool\">;\n canWithdraw: ToField<\"bool\">;\n decimals: ToField<\"u8\">;\n balance: ToField<Balance<T>>;\n}\n\nexport type PoolReified<T extends PhantomTypeArgument> = Reified<Pool<T>, PoolFields<T>>;\n\nexport class Pool<T extends PhantomTypeArgument> implements StructClass {\n __StructClass = true as const;\n\n static get $typeName() {\n return `${PKG_V1}::pool::Pool`;\n }\n static readonly $numTypeParams = 1;\n static readonly $isPhantom = [true] as const;\n\n readonly $typeName = Pool.$typeName;\n readonly $fullTypeName: string;\n readonly $typeArgs: [PhantomToTypeStr<T>];\n readonly $isPhantom = Pool.$isPhantom;\n\n readonly id: ToField<UID>;\n readonly state: ToField<PoolState<T>>;\n readonly rewards: ToField<PoolRewards<T>>;\n readonly feeShareBp: ToField<\"u64\">;\n readonly canDeposit: ToField<\"bool\">;\n readonly canWithdraw: ToField<\"bool\">;\n readonly decimals: ToField<\"u8\">;\n readonly balance: ToField<Balance<T>>;\n\n private constructor(typeArgs: [PhantomToTypeStr<T>], fields: PoolFields<T>) {\n this.$fullTypeName = composeSuiType(Pool.$typeName, ...typeArgs) as string;\n this.$typeArgs = typeArgs;\n\n this.id = fields.id;\n this.state = fields.state;\n this.rewards = fields.rewards;\n this.feeShareBp = fields.feeShareBp;\n this.canDeposit = fields.canDeposit;\n this.canWithdraw = fields.canWithdraw;\n this.decimals = fields.decimals;\n this.balance = fields.balance;\n }\n\n static reified<T extends PhantomReified<PhantomTypeArgument>>(T: T): PoolReified<ToPhantomTypeArgument<T>> {\n return {\n typeName: Pool.$typeName,\n fullTypeName: composeSuiType(Pool.$typeName, ...[extractType(T)]) as string,\n typeArgs: [extractType(T)] as [PhantomToTypeStr<ToPhantomTypeArgument<T>>],\n isPhantom: Pool.$isPhantom,\n reifiedTypeArgs: [T],\n fromFields: (fields: Record<string, any>) => Pool.fromFields(T, fields),\n fromFieldsWithTypes: (item: FieldsWithTypes) => Pool.fromFieldsWithTypes(T, item),\n fromBcs: (data: Uint8Array) => Pool.fromBcs(T, data),\n bcs: Pool.bcs,\n fromJSONField: (field: any) => Pool.fromJSONField(T, field),\n fromJSON: (json: Record<string, any>) => Pool.fromJSON(T, json),\n fromSuiParsedData: (content: SuiParsedData) => Pool.fromSuiParsedData(T, content),\n fromSuiObjectData: (content: SuiObjectData) => Pool.fromSuiObjectData(T, content),\n fetch: async (client: SuiClient, id: string) => Pool.fetch(client, T, id),\n new: (fields: PoolFields<ToPhantomTypeArgument<T>>) => {\n return new Pool([extractType(T)], fields);\n },\n kind: \"StructClassReified\",\n };\n }\n\n static get r() {\n return Pool.reified;\n }\n\n static phantom<T extends PhantomReified<PhantomTypeArgument>>(\n T: T\n ): PhantomReified<ToTypeStr<Pool<ToPhantomTypeArgument<T>>>> {\n return phantom(Pool.reified(T));\n }\n static get p() {\n return Pool.phantom;\n }\n\n static get bcs() {\n return bcs.struct(\"Pool\", {\n id: UID.bcs,\n state: PoolState.bcs,\n rewards: PoolRewards.bcs,\n fee_share_bp: bcs.u64(),\n can_deposit: bcs.bool(),\n can_withdraw: bcs.bool(),\n decimals: bcs.u8(),\n balance: Balance.bcs,\n });\n }\n\n static fromFields<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n fields: Record<string, any>\n ): Pool<ToPhantomTypeArgument<T>> {\n return Pool.reified(typeArg).new({\n id: decodeFromFields(UID.reified(), fields.id),\n state: decodeFromFields(PoolState.reified(typeArg), fields.state),\n rewards: decodeFromFields(PoolRewards.reified(typeArg), fields.rewards),\n feeShareBp: decodeFromFields(\"u64\", fields.fee_share_bp),\n canDeposit: decodeFromFields(\"bool\", fields.can_deposit),\n canWithdraw: decodeFromFields(\"bool\", fields.can_withdraw),\n decimals: decodeFromFields(\"u8\", fields.decimals),\n balance: decodeFromFields(Balance.reified(typeArg), fields.balance),\n });\n }\n\n static fromFieldsWithTypes<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n item: FieldsWithTypes\n ): Pool<ToPhantomTypeArgument<T>> {\n if (!isPool(item.type)) {\n throw new Error(\"not a Pool type\");\n }\n assertFieldsWithTypesArgsMatch(item, [typeArg]);\n\n return Pool.reified(typeArg).new({\n id: decodeFromFieldsWithTypes(UID.reified(), item.fields.id),\n state: decodeFromFieldsWithTypes(PoolState.reified(typeArg), item.fields.state),\n rewards: decodeFromFieldsWithTypes(PoolRewards.reified(typeArg), item.fields.rewards),\n feeShareBp: decodeFromFieldsWithTypes(\"u64\", item.fields.fee_share_bp),\n canDeposit: decodeFromFieldsWithTypes(\"bool\", item.fields.can_deposit),\n canWithdraw: decodeFromFieldsWithTypes(\"bool\", item.fields.can_withdraw),\n decimals: decodeFromFieldsWithTypes(\"u8\", item.fields.decimals),\n balance: decodeFromFieldsWithTypes(Balance.reified(typeArg), item.fields.balance),\n });\n }\n\n static fromBcs<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n data: Uint8Array\n ): Pool<ToPhantomTypeArgument<T>> {\n return Pool.fromFields(typeArg, Pool.bcs.parse(data));\n }\n\n toJSONField() {\n return {\n id: this.id,\n state: this.state.toJSONField(),\n rewards: this.rewards.toJSONField(),\n feeShareBp: this.feeShareBp.toString(),\n canDeposit: this.canDeposit,\n canWithdraw: this.canWithdraw,\n decimals: this.decimals,\n balance: this.balance.toJSONField(),\n };\n }\n\n toJSON() {\n return {\n $typeName: this.$typeName,\n $typeArgs: this.$typeArgs,\n ...this.toJSONField(),\n };\n }\n\n static fromJSONField<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n field: any\n ): Pool<ToPhantomTypeArgument<T>> {\n return Pool.reified(typeArg).new({\n id: decodeFromJSONField(UID.reified(), field.id),\n state: decodeFromJSONField(PoolState.reified(typeArg), field.state),\n rewards: decodeFromJSONField(PoolRewards.reified(typeArg), field.rewards),\n feeShareBp: decodeFromJSONField(\"u64\", field.feeShareBp),\n canDeposit: decodeFromJSONField(\"bool\", field.canDeposit),\n canWithdraw: decodeFromJSONField(\"bool\", field.canWithdraw),\n decimals: decodeFromJSONField(\"u8\", field.decimals),\n balance: decodeFromJSONField(Balance.reified(typeArg), field.balance),\n });\n }\n\n static fromJSON<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n json: Record<string, any>\n ): Pool<ToPhantomTypeArgument<T>> {\n if (json.$typeName !== Pool.$typeName) {\n throw new Error(\"not a WithTwoGenerics json object\");\n }\n assertReifiedTypeArgsMatch(composeSuiType(Pool.$typeName, extractType(typeArg)), json.$typeArgs, [typeArg]);\n\n return Pool.fromJSONField(typeArg, json);\n }\n\n static fromSuiParsedData<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n content: SuiParsedData\n ): Pool<ToPhantomTypeArgument<T>> {\n if (content.dataType !== \"moveObject\") {\n throw new Error(\"not an object\");\n }\n if (!isPool(content.type)) {\n throw new Error(`object at ${(content.fields as any).id} is not a Pool object`);\n }\n return Pool.fromFieldsWithTypes(typeArg, content);\n }\n\n static fromSuiObjectData<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n data: SuiObjectData\n ): Pool<ToPhantomTypeArgument<T>> {\n if (data.bcs) {\n if (data.bcs.dataType !== \"moveObject\" || !isPool(data.bcs.type)) {\n throw new Error(`object at is not a Pool object`);\n }\n\n const gotTypeArgs = parseTypeName(data.bcs.type).typeArgs;\n if (gotTypeArgs.length !== 1) {\n throw new Error(`type argument mismatch: expected 1 type argument but got '${gotTypeArgs.length}'`);\n }\n const gotTypeArg = compressSuiType(gotTypeArgs[0]);\n const expectedTypeArg = compressSuiType(extractType(typeArg));\n if (gotTypeArg !== compressSuiType(extractType(typeArg))) {\n throw new Error(`type argument mismatch: expected '${expectedTypeArg}' but got '${gotTypeArg}'`);\n }\n\n return Pool.fromBcs(typeArg, fromB64(data.bcs.bcsBytes));\n }\n if (data.content) {\n return Pool.fromSuiParsedData(typeArg, data.content);\n }\n throw new Error(\n \"Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.\"\n );\n }\n\n static async fetch<T extends PhantomReified<PhantomTypeArgument>>(\n client: SuiClient,\n typeArg: T,\n id: string\n ): Promise<Pool<ToPhantomTypeArgument<T>>> {\n const res = await client.getObject({ id, options: { showBcs: true } });\n if (res.error) {\n throw new Error(`error fetching Pool object at id ${id}: ${res.error.code}`);\n }\n if (res.data?.bcs?.dataType !== \"moveObject\" || !isPool(res.data.bcs.type)) {\n throw new Error(`object at id ${id} is not a Pool object`);\n }\n\n return Pool.fromSuiObjectData(typeArg, res.data);\n }\n}\n\n/* ============================== StopCap =============================== */\n\nexport function isStopCap(type: string): boolean {\n type = compressSuiType(type);\n return type === `${PKG_V1}::pool::StopCap`;\n}\n\nexport interface StopCapFields {\n id: ToField<UID>;\n}\n\nexport type StopCapReified = Reified<StopCap, StopCapFields>;\n\nexport class StopCap implements StructClass {\n __StructClass = true as const;\n\n static get $typeName() {\n return `${PKG_V1}::pool::StopCap`;\n }\n static readonly $numTypeParams = 0;\n static readonly $isPhantom = [] as const;\n\n readonly $typeName = StopCap.$typeName;\n readonly $fullTypeName: string;\n readonly $typeArgs: [];\n readonly $isPhantom = StopCap.$isPhantom;\n\n readonly id: ToField<UID>;\n\n private constructor(typeArgs: [], fields: StopCapFields) {\n this.$fullTypeName = composeSuiType(StopCap.$typeName, ...typeArgs) as string;\n this.$typeArgs = typeArgs;\n\n this.id = fields.id;\n }\n\n static reified(): StopCapReified {\n return {\n typeName: StopCap.$typeName,\n fullTypeName: composeSuiType(StopCap.$typeName, ...[]) as string,\n typeArgs: [] as [],\n isPhantom: StopCap.$isPhantom,\n reifiedTypeArgs: [],\n fromFields: (fields: Record<string, any>) => StopCap.fromFields(fields),\n fromFieldsWithTypes: (item: FieldsWithTypes) => StopCap.fromFieldsWithTypes(item),\n fromBcs: (data: Uint8Array) => StopCap.fromBcs(data),\n bcs: StopCap.bcs,\n fromJSONField: (field: any) => StopCap.fromJSONField(field),\n fromJSON: (json: Record<string, any>) => StopCap.fromJSON(json),\n fromSuiParsedData: (content: SuiParsedData) => StopCap.fromSuiParsedData(content),\n fromSuiObjectData: (content: SuiObjectData) => StopCap.fromSuiObjectData(content),\n fetch: async (client: SuiClient, id: string) => StopCap.fetch(client, id),\n new: (fields: StopCapFields) => {\n return new StopCap([], fields);\n },\n kind: \"StructClassReified\",\n };\n }\n\n static get r() {\n return StopCap.reified();\n }\n\n static phantom(): PhantomReified<ToTypeStr<StopCap>> {\n return phantom(StopCap.reified());\n }\n static get p() {\n return StopCap.phantom();\n }\n\n static get bcs() {\n return bcs.struct(\"StopCap\", {\n id: UID.bcs,\n });\n }\n\n static fromFields(fields: Record<string, any>): StopCap {\n return StopCap.reified().new({\n id: decodeFromFields(UID.reified(), fields.id),\n });\n }\n\n static fromFieldsWithTypes(item: FieldsWithTypes): StopCap {\n if (!isStopCap(item.type)) {\n throw new Error(\"not a StopCap type\");\n }\n\n return StopCap.reified().new({\n id: decodeFromFieldsWithTypes(UID.reified(), item.fields.id),\n });\n }\n\n static fromBcs(data: Uint8Array): StopCap {\n return StopCap.fromFields(StopCap.bcs.parse(data));\n }\n\n toJSONField() {\n return {\n id: this.id,\n };\n }\n\n toJSON() {\n return {\n $typeName: this.$typeName,\n $typeArgs: this.$typeArgs,\n ...this.toJSONField(),\n };\n }\n\n static fromJSONField(field: any): StopCap {\n return StopCap.reified().new({\n id: decodeFromJSONField(UID.reified(), field.id),\n });\n }\n\n static fromJSON(json: Record<string, any>): StopCap {\n if (json.$typeName !== StopCap.$typeName) {\n throw new Error(\"not a WithTwoGenerics json object\");\n }\n\n return StopCap.fromJSONField(json);\n }\n\n static fromSuiParsedData(content: SuiParsedData): StopCap {\n if (content.dataType !== \"moveObject\") {\n throw new Error(\"not an object\");\n }\n if (!isStopCap(content.type)) {\n throw new Error(`object at ${(content.fields as any).id} is not a StopCap object`);\n }\n return StopCap.fromFieldsWithTypes(content);\n }\n\n static fromSuiObjectData(data: SuiObjectData): StopCap {\n if (data.bcs) {\n if (data.bcs.dataType !== \"moveObject\" || !isStopCap(data.bcs.type)) {\n throw new Error(`object at is not a StopCap object`);\n }\n\n return StopCap.fromBcs(fromB64(data.bcs.bcsBytes));\n }\n if (data.content) {\n return StopCap.fromSuiParsedData(data.content);\n }\n throw new Error(\n \"Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.\"\n );\n }\n\n static async fetch(client: SuiClient, id: string): Promise<StopCap> {\n const res = await client.getObject({ id, options: { showBcs: true } });\n if (res.error) {\n throw new Error(`error fetching StopCap object at id ${id}: ${res.error.code}`);\n }\n if (res.data?.bcs?.dataType !== \"moveObject\" || !isStopCap(res.data.bcs.type)) {\n throw new Error(`object at id ${id} is not a StopCap object`);\n }\n\n return StopCap.fromSuiObjectData(res.data);\n }\n}\n", "// @ts-nocheck\nimport {\n PhantomReified,\n PhantomToTypeStr,\n PhantomTypeArgument,\n Reified,\n StructClass,\n ToField,\n ToPhantomTypeArgument,\n ToTypeStr,\n assertFieldsWithTypesArgsMatch,\n assertReifiedTypeArgsMatch,\n decodeFromFields,\n decodeFromFieldsWithTypes,\n decodeFromJSONField,\n extractType,\n phantom,\n} from \"../../_framework/reified\";\nimport { FieldsWithTypes, composeSuiType, compressSuiType, parseTypeName } from \"../../_framework/util\";\nimport { PKG_V26 } from \"../index\";\nimport { bcs } from \"@mysten/sui/bcs\";\nimport { SuiClient, SuiObjectData, SuiParsedData } from \"@mysten/sui/client\";\nimport { fromB64 } from \"@mysten/sui/utils\";\n\n/* ============================== Balance =============================== */\n\nexport function isBalance(type: string): boolean {\n type = compressSuiType(type);\n return type.startsWith(`${PKG_V26}::balance::Balance` + \"<\");\n}\n\nexport interface BalanceFields<T extends PhantomTypeArgument> {\n value: ToField<\"u64\">;\n}\n\nexport type BalanceReified<T extends PhantomTypeArgument> = Reified<Balance<T>, BalanceFields<T>>;\n\nexport class Balance<T extends PhantomTypeArgument> implements StructClass {\n __StructClass = true as const;\n\n static get $typeName() {\n return `${PKG_V26}::balance::Balance`;\n }\n static readonly $numTypeParams = 1;\n static readonly $isPhantom = [true] as const;\n\n readonly $typeName = Balance.$typeName;\n readonly $fullTypeName: string;\n readonly $typeArgs: [PhantomToTypeStr<T>];\n readonly $isPhantom = Balance.$isPhantom;\n\n readonly value: ToField<\"u64\">;\n\n private constructor(typeArgs: [PhantomToTypeStr<T>], fields: BalanceFields<T>) {\n this.$fullTypeName = composeSuiType(Balance.$typeName, ...typeArgs) as string;\n this.$typeArgs = typeArgs;\n\n this.value = fields.value;\n }\n\n static reified<T extends PhantomReified<PhantomTypeArgument>>(T: T): BalanceReified<ToPhantomTypeArgument<T>> {\n return {\n typeName: Balance.$typeName,\n fullTypeName: composeSuiType(Balance.$typeName, ...[extractType(T)]) as string,\n typeArgs: [extractType(T)] as [PhantomToTypeStr<ToPhantomTypeArgument<T>>],\n isPhantom: Balance.$isPhantom,\n reifiedTypeArgs: [T],\n fromFields: (fields: Record<string, any>) => Balance.fromFields(T, fields),\n fromFieldsWithTypes: (item: FieldsWithTypes) => Balance.fromFieldsWithTypes(T, item),\n fromBcs: (data: Uint8Array) => Balance.fromBcs(T, data),\n bcs: Balance.bcs,\n fromJSONField: (field: any) => Balance.fromJSONField(T, field),\n fromJSON: (json: Record<string, any>) => Balance.fromJSON(T, json),\n fromSuiParsedData: (content: SuiParsedData) => Balance.fromSuiParsedData(T, content),\n fromSuiObjectData: (content: SuiObjectData) => Balance.fromSuiObjectData(T, content),\n fetch: async (client: SuiClient, id: string) => Balance.fetch(client, T, id),\n new: (fields: BalanceFields<ToPhantomTypeArgument<T>>) => {\n return new Balance([extractType(T)], fields);\n },\n kind: \"StructClassReified\",\n };\n }\n\n static get r() {\n return Balance.reified;\n }\n\n static phantom<T extends PhantomReified<PhantomTypeArgument>>(\n T: T\n ): PhantomReified<ToTypeStr<Balance<ToPhantomTypeArgument<T>>>> {\n return phantom(Balance.reified(T));\n }\n static get p() {\n return Balance.phantom;\n }\n\n static get bcs() {\n return bcs.struct(\"Balance\", {\n value: bcs.u64(),\n });\n }\n\n static fromFields<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n fields: Record<string, any>\n ): Balance<ToPhantomTypeArgument<T>> {\n return Balance.reified(typeArg).new({\n value: decodeFromFields(\"u64\", fields.value),\n });\n }\n\n static fromFieldsWithTypes<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n item: FieldsWithTypes\n ): Balance<ToPhantomTypeArgument<T>> {\n if (!isBalance(item.type)) {\n throw new Error(\"not a Balance type\");\n }\n assertFieldsWithTypesArgsMatch(item, [typeArg]);\n\n return Balance.reified(typeArg).new({\n value: decodeFromFieldsWithTypes(\"u64\", item.fields.value),\n });\n }\n\n static fromBcs<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n data: Uint8Array\n ): Balance<ToPhantomTypeArgument<T>> {\n return Balance.fromFields(typeArg, Balance.bcs.parse(data));\n }\n\n toJSONField() {\n return {\n value: this.value.toString(),\n };\n }\n\n toJSON() {\n return {\n $typeName: this.$typeName,\n $typeArgs: this.$typeArgs,\n ...this.toJSONField(),\n };\n }\n\n static fromJSONField<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n field: any\n ): Balance<ToPhantomTypeArgument<T>> {\n return Balance.reified(typeArg).new({\n value: decodeFromJSONField(\"u64\", field.value),\n });\n }\n\n static fromJSON<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n json: Record<string, any>\n ): Balance<ToPhantomTypeArgument<T>> {\n if (json.$typeName !== Balance.$typeName) {\n throw new Error(\"not a WithTwoGenerics json object\");\n }\n assertReifiedTypeArgsMatch(composeSuiType(Balance.$typeName, extractType(typeArg)), json.$typeArgs, [typeArg]);\n\n return Balance.fromJSONField(typeArg, json);\n }\n\n static fromSuiParsedData<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n content: SuiParsedData\n ): Balance<ToPhantomTypeArgument<T>> {\n if (content.dataType !== \"moveObject\") {\n throw new Error(\"not an object\");\n }\n if (!isBalance(content.type)) {\n throw new Error(`object at ${(content.fields as any).id} is not a Balance object`);\n }\n return Balance.fromFieldsWithTypes(typeArg, content);\n }\n\n static fromSuiObjectData<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n data: SuiObjectData\n ): Balance<ToPhantomTypeArgument<T>> {\n if (data.bcs) {\n if (data.bcs.dataType !== \"moveObject\" || !isBalance(data.bcs.type)) {\n throw new Error(`object at is not a Balance object`);\n }\n\n const gotTypeArgs = parseTypeName(data.bcs.type).typeArgs;\n if (gotTypeArgs.length !== 1) {\n throw new Error(`type argument mismatch: expected 1 type argument but got '${gotTypeArgs.length}'`);\n }\n const gotTypeArg = compressSuiType(gotTypeArgs[0]);\n const expectedTypeArg = compressSuiType(extractType(typeArg));\n if (gotTypeArg !== compressSuiType(extractType(typeArg))) {\n throw new Error(`type argument mismatch: expected '${expectedTypeArg}' but got '${gotTypeArg}'`);\n }\n\n return Balance.fromBcs(typeArg, fromB64(data.bcs.bcsBytes));\n }\n if (data.content) {\n return Balance.fromSuiParsedData(typeArg, data.content);\n }\n throw new Error(\n \"Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.\"\n );\n }\n\n static async fetch<T extends PhantomReified<PhantomTypeArgument>>(\n client: SuiClient,\n typeArg: T,\n id: string\n ): Promise<Balance<ToPhantomTypeArgument<T>>> {\n const res = await client.getObject({ id, options: { showBcs: true } });\n if (res.error) {\n throw new Error(`error fetching Balance object at id ${id}: ${res.error.code}`);\n }\n if (res.data?.bcs?.dataType !== \"moveObject\" || !isBalance(res.data.bcs.type)) {\n throw new Error(`object at id ${id} is not a Balance object`);\n }\n\n return Balance.fromSuiObjectData(typeArg, res.data);\n }\n}\n\n/* ============================== Supply =============================== */\n\nexport function isSupply(type: string): boolean {\n type = compressSuiType(type);\n return type.startsWith(`${PKG_V26}::balance::Supply` + \"<\");\n}\n\nexport interface SupplyFields<T extends PhantomTypeArgument> {\n value: ToField<\"u64\">;\n}\n\nexport type SupplyReified<T extends PhantomTypeArgument> = Reified<Supply<T>, SupplyFields<T>>;\n\nexport class Supply<T extends PhantomTypeArgument> implements StructClass {\n __StructClass = true as const;\n\n static get $typeName() {\n return `${PKG_V26}::balance::Supply`;\n }\n static readonly $numTypeParams = 1;\n static readonly $isPhantom = [true] as const;\n\n readonly $typeName = Supply.$typeName;\n readonly $fullTypeName: string;\n readonly $typeArgs: [PhantomToTypeStr<T>];\n readonly $isPhantom = Supply.$isPhantom;\n\n readonly value: ToField<\"u64\">;\n\n private constructor(typeArgs: [PhantomToTypeStr<T>], fields: SupplyFields<T>) {\n this.$fullTypeName = composeSuiType(Supply.$typeName, ...typeArgs) as string;\n this.$typeArgs = typeArgs;\n\n this.value = fields.value;\n }\n\n static reified<T extends PhantomReified<PhantomTypeArgument>>(T: T): SupplyReified<ToPhantomTypeArgument<T>> {\n return {\n typeName: Supply.$typeName,\n fullTypeName: composeSuiType(Supply.$typeName, ...[extractType(T)]) as string,\n typeArgs: [extractType(T)] as [PhantomToTypeStr<ToPhantomTypeArgument<T>>],\n isPhantom: Supply.$isPhantom,\n reifiedTypeArgs: [T],\n fromFields: (fields: Record<string, any>) => Supply.fromFields(T, fields),\n fromFieldsWithTypes: (item: FieldsWithTypes) => Supply.fromFieldsWithTypes(T, item),\n fromBcs: (data: Uint8Array) => Supply.fromBcs(T, data),\n bcs: Supply.bcs,\n fromJSONField: (field: any) => Supply.fromJSONField(T, field),\n fromJSON: (json: Record<string, any>) => Supply.fromJSON(T, json),\n fromSuiParsedData: (content: SuiParsedData) => Supply.fromSuiParsedData(T, content),\n fromSuiObjectData: (content: SuiObjectData) => Supply.fromSuiObjectData(T, content),\n fetch: async (client: SuiClient, id: string) => Supply.fetch(client, T, id),\n new: (fields: SupplyFields<ToPhantomTypeArgument<T>>) => {\n return new Supply([extractType(T)], fields);\n },\n kind: \"StructClassReified\",\n };\n }\n\n static get r() {\n return Supply.reified;\n }\n\n static phantom<T extends PhantomReified<PhantomTypeArgument>>(\n T: T\n ): PhantomReified<ToTypeStr<Supply<ToPhantomTypeArgument<T>>>> {\n return phantom(Supply.reified(T));\n }\n static get p() {\n return Supply.phantom;\n }\n\n static get bcs() {\n return bcs.struct(\"Supply\", {\n value: bcs.u64(),\n });\n }\n\n static fromFields<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n fields: Record<string, any>\n ): Supply<ToPhantomTypeArgument<T>> {\n return Supply.reified(typeArg).new({\n value: decodeFromFields(\"u64\", fields.value),\n });\n }\n\n static fromFieldsWithTypes<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n item: FieldsWithTypes\n ): Supply<ToPhantomTypeArgument<T>> {\n if (!isSupply(item.type)) {\n throw new Error(\"not a Supply type\");\n }\n assertFieldsWithTypesArgsMatch(item, [typeArg]);\n\n return Supply.reified(typeArg).new({\n value: decodeFromFieldsWithTypes(\"u64\", item.fields.value),\n });\n }\n\n static fromBcs<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n data: Uint8Array\n ): Supply<ToPhantomTypeArgument<T>> {\n return Supply.fromFields(typeArg, Supply.bcs.parse(data));\n }\n\n toJSONField() {\n return {\n value: this.value.toString(),\n };\n }\n\n toJSON() {\n return {\n $typeName: this.$typeName,\n $typeArgs: this.$typeArgs,\n ...this.toJSONField(),\n };\n }\n\n static fromJSONField<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n field: any\n ): Supply<ToPhantomTypeArgument<T>> {\n return Supply.reified(typeArg).new({\n value: decodeFromJSONField(\"u64\", field.value),\n });\n }\n\n static fromJSON<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n json: Record<string, any>\n ): Supply<ToPhantomTypeArgument<T>> {\n if (json.$typeName !== Supply.$typeName) {\n throw new Error(\"not a WithTwoGenerics json object\");\n }\n assertReifiedTypeArgsMatch(composeSuiType(Supply.$typeName, extractType(typeArg)), json.$typeArgs, [typeArg]);\n\n return Supply.fromJSONField(typeArg, json);\n }\n\n static fromSuiParsedData<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n content: SuiParsedData\n ): Supply<ToPhantomTypeArgument<T>> {\n if (content.dataType !== \"moveObject\") {\n throw new Error(\"not an object\");\n }\n if (!isSupply(content.type)) {\n throw new Error(`object at ${(content.fields as any).id} is not a Supply object`);\n }\n return Supply.fromFieldsWithTypes(typeArg, content);\n }\n\n static fromSuiObjectData<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n data: SuiObjectData\n ): Supply<ToPhantomTypeArgument<T>> {\n if (data.bcs) {\n if (data.bcs.dataType !== \"moveObject\" || !isSupply(data.bcs.type)) {\n throw new Error(`object at is not a Supply object`);\n }\n\n const gotTypeArgs = parseTypeName(data.bcs.type).typeArgs;\n if (gotTypeArgs.length !== 1) {\n throw new Error(`type argument mismatch: expected 1 type argument but got '${gotTypeArgs.length}'`);\n }\n const gotTypeArg = compressSuiType(gotTypeArgs[0]);\n const expectedTypeArg = compressSuiType(extractType(typeArg));\n if (gotTypeArg !== compressSuiType(extractType(typeArg))) {\n throw new Error(`type argument mismatch: expected '${expectedTypeArg}' but got '${gotTypeArg}'`);\n }\n\n return Supply.fromBcs(typeArg, fromB64(data.bcs.bcsBytes));\n }\n if (data.content) {\n return Supply.fromSuiParsedData(typeArg, data.content);\n }\n throw new Error(\n \"Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.\"\n );\n }\n\n static async fetch<T extends PhantomReified<PhantomTypeArgument>>(\n client: SuiClient,\n typeArg: T,\n id: string\n ): Promise<Supply<ToPhantomTypeArgument<T>>> {\n const res = await client.getObject({ id, options: { showBcs: true } });\n if (res.error) {\n throw new Error(`error fetching Supply object at id ${id}: ${res.error.code}`);\n }\n if (res.data?.bcs?.dataType !== \"moveObject\" || !isSupply(res.data.bcs.type)) {\n throw new Error(`object at id ${id} is not a Supply object`);\n }\n\n return Supply.fromSuiObjectData(typeArg, res.data);\n }\n}\n", "// @ts-nocheck\nimport {\n PhantomReified,\n PhantomToTypeStr,\n PhantomTypeArgument,\n Reified,\n StructClass,\n ToField,\n ToPhantomTypeArgument,\n ToTypeStr,\n assertFieldsWithTypesArgsMatch,\n assertReifiedTypeArgsMatch,\n decodeFromFields,\n decodeFromFieldsWithTypes,\n decodeFromJSONField,\n extractType,\n phantom,\n} from \"../../_framework/reified\";\nimport { FieldsWithTypes, composeSuiType, compressSuiType, parseTypeName } from \"../../_framework/util\";\nimport { Balance } from \"../../sui/balance/structs\";\nimport { PKG_V1 } from \"../index\";\nimport { bcs } from \"@mysten/sui/bcs\";\nimport { SuiClient, SuiObjectData, SuiParsedData } from \"@mysten/sui/client\";\nimport { fromB64 } from \"@mysten/sui/utils\";\n\n/* ============================== PoolRewards =============================== */\n\nexport function isPoolRewards(type: string): boolean {\n type = compressSuiType(type);\n return type.startsWith(`${PKG_V1}::pool_rewards::PoolRewards` + \"<\");\n}\n\nexport interface PoolRewardsFields<T extends PhantomTypeArgument> {\n accRewardPerShareP: ToField<\"u128\">;\n adminFeeShareBp: ToField<\"u64\">;\n adminFee: ToField<Balance<T>>;\n rewards: ToField<Balance<T>>;\n lpSupply: ToField<\"u64\">;\n}\n\nexport type PoolRewardsReified<T extends PhantomTypeArgument> = Reified<PoolRewards<T>, PoolRewardsFields<T>>;\n\nexport class PoolRewards<T extends PhantomTypeArgument> implements StructClass {\n __StructClass = true as const;\n\n static get $typeName() {\n return `${PKG_V1}::pool_rewards::PoolRewards`;\n }\n static readonly $numTypeParams = 1;\n static readonly $isPhantom = [true] as const;\n\n readonly $typeName = PoolRewards.$typeName;\n readonly $fullTypeName: string;\n readonly $typeArgs: [PhantomToTypeStr<T>];\n readonly $isPhantom = PoolRewards.$isPhantom;\n\n readonly accRewardPerShareP: ToField<\"u128\">;\n readonly adminFeeShareBp: ToField<\"u64\">;\n readonly adminFee: ToField<Balance<T>>;\n readonly rewards: ToField<Balance<T>>;\n readonly lpSupply: ToField<\"u64\">;\n\n private constructor(typeArgs: [PhantomToTypeStr<T>], fields: PoolRewardsFields<T>) {\n this.$fullTypeName = composeSuiType(PoolRewards.$typeName, ...typeArgs) as string;\n this.$typeArgs = typeArgs;\n\n this.accRewardPerShareP = fields.accRewardPerShareP;\n this.adminFeeShareBp = fields.adminFeeShareBp;\n this.adminFee = fields.adminFee;\n this.rewards = fields.rewards;\n this.lpSupply = fields.lpSupply;\n }\n\n static reified<T extends PhantomReified<PhantomTypeArgument>>(T: T): PoolRewardsReified<ToPhantomTypeArgument<T>> {\n return {\n typeName: PoolRewards.$typeName,\n fullTypeName: composeSuiType(PoolRewards.$typeName, ...[extractType(T)]) as string,\n typeArgs: [extractType(T)] as [PhantomToTypeStr<ToPhantomTypeArgument<T>>],\n isPhantom: PoolRewards.$isPhantom,\n reifiedTypeArgs: [T],\n fromFields: (fields: Record<string, any>) => PoolRewards.fromFields(T, fields),\n fromFieldsWithTypes: (item: FieldsWithTypes) => PoolRewards.fromFieldsWithTypes(T, item),\n fromBcs: (data: Uint8Array) => PoolRewards.fromBcs(T, data),\n bcs: PoolRewards.bcs,\n fromJSONField: (field: any) => PoolRewards.fromJSONField(T, field),\n fromJSON: (json: Record<string, any>) => PoolRewards.fromJSON(T, json),\n fromSuiParsedData: (content: SuiParsedData) => PoolRewards.fromSuiParsedData(T, content),\n fromSuiObjectData: (content: SuiObjectData) => PoolRewards.fromSuiObjectData(T, content),\n fetch: async (client: SuiClient, id: string) => PoolRewards.fetch(client, T, id),\n new: (fields: PoolRewardsFields<ToPhantomTypeArgument<T>>) => {\n return new PoolRewards([extractType(T)], fields);\n },\n kind: \"StructClassReified\",\n };\n }\n\n static get r() {\n return PoolRewards.reified;\n }\n\n static phantom<T extends PhantomReified<PhantomTypeArgument>>(\n T: T\n ): PhantomReified<ToTypeStr<PoolRewards<ToPhantomTypeArgument<T>>>> {\n return phantom(PoolRewards.reified(T));\n }\n static get p() {\n return PoolRewards.phantom;\n }\n\n static get bcs() {\n return bcs.struct(\"PoolRewards\", {\n acc_reward_per_share_p: bcs.u128(),\n admin_fee_share_bp: bcs.u64(),\n admin_fee: Balance.bcs,\n rewards: Balance.bcs,\n lp_supply: bcs.u64(),\n });\n }\n\n static fromFields<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n fields: Record<string, any>\n ): PoolRewards<ToPhantomTypeArgument<T>> {\n return PoolRewards.reified(typeArg).new({\n accRewardPerShareP: decodeFromFields(\"u128\", fields.acc_reward_per_share_p),\n adminFeeShareBp: decodeFromFields(\"u64\", fields.admin_fee_share_bp),\n adminFee: decodeFromFields(Balance.reified(typeArg), fields.admin_fee),\n rewards: decodeFromFields(Balance.reified(typeArg), fields.rewards),\n lpSupply: decodeFromFields(\"u64\", fields.lp_supply),\n });\n }\n\n static fromFieldsWithTypes<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n item: FieldsWithTypes\n ): PoolRewards<ToPhantomTypeArgument<T>> {\n if (!isPoolRewards(item.type)) {\n throw new Error(\"not a PoolRewards type\");\n }\n assertFieldsWithTypesArgsMatch(item, [typeArg]);\n\n return PoolRewards.reified(typeArg).new({\n accRewardPerShareP: decodeFromFieldsWithTypes(\"u128\", item.fields.acc_reward_per_share_p),\n adminFeeShareBp: decodeFromFieldsWithTypes(\"u64\", item.fields.admin_fee_share_bp),\n adminFee: decodeFromFieldsWithTypes(Balance.reified(typeArg), item.fields.admin_fee),\n rewards: decodeFromFieldsWithTypes(Balance.reified(typeArg), item.fields.rewards),\n lpSupply: decodeFromFieldsWithTypes(\"u64\", item.fields.lp_supply),\n });\n }\n\n static fromBcs<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n data: Uint8Array\n ): PoolRewards<ToPhantomTypeArgument<T>> {\n return PoolRewards.fromFields(typeArg, PoolRewards.bcs.parse(data));\n }\n\n toJSONField() {\n return {\n accRewardPerShareP: this.accRewardPerShareP.toString(),\n adminFeeShareBp: this.adminFeeShareBp.toString(),\n adminFee: this.adminFee.toJSONField(),\n rewards: this.rewards.toJSONField(),\n lpSupply: this.lpSupply.toString(),\n };\n }\n\n toJSON() {\n return {\n $typeName: this.$typeName,\n $typeArgs: this.$typeArgs,\n ...this.toJSONField(),\n };\n }\n\n static fromJSONField<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n field: any\n ): PoolRewards<ToPhantomTypeArgument<T>> {\n return PoolRewards.reified(typeArg).new({\n accRewardPerShareP: decodeFromJSONField(\"u128\", field.accRewardPerShareP),\n adminFeeShareBp: decodeFromJSONField(\"u64\", field.adminFeeShareBp),\n adminFee: decodeFromJSONField(Balance.reified(typeArg), field.adminFee),\n rewards: decodeFromJSONField(Balance.reified(typeArg), field.rewards),\n lpSupply: decodeFromJSONField(\"u64\", field.lpSupply),\n });\n }\n\n static fromJSON<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n json: Record<string, any>\n ): PoolRewards<ToPhantomTypeArgument<T>> {\n if (json.$typeName !== PoolRewards.$typeName) {\n throw new Error(\"not a WithTwoGenerics json object\");\n }\n assertReifiedTypeArgsMatch(composeSuiType(PoolRewards.$typeName, extractType(typeArg)), json.$typeArgs, [typeArg]);\n\n return PoolRewards.fromJSONField(typeArg, json);\n }\n\n static fromSuiParsedData<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n content: SuiParsedData\n ): PoolRewards<ToPhantomTypeArgument<T>> {\n if (content.dataType !== \"moveObject\") {\n throw new Error(\"not an object\");\n }\n if (!isPoolRewards(content.type)) {\n throw new Error(`object at ${(content.fields as any).id} is not a PoolRewards object`);\n }\n return PoolRewards.fromFieldsWithTypes(typeArg, content);\n }\n\n static fromSuiObjectData<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n data: SuiObjectData\n ): PoolRewards<ToPhantomTypeArgument<T>> {\n if (data.bcs) {\n if (data.bcs.dataType !== \"moveObject\" || !isPoolRewards(data.bcs.type)) {\n throw new Error(`object at is not a PoolRewards object`);\n }\n\n const gotTypeArgs = parseTypeName(data.bcs.type).typeArgs;\n if (gotTypeArgs.length !== 1) {\n throw new Error(`type argument mismatch: expected 1 type argument but got '${gotTypeArgs.length}'`);\n }\n const gotTypeArg = compressSuiType(gotTypeArgs[0]);\n const expectedTypeArg = compressSuiType(extractType(typeArg));\n if (gotTypeArg !== compressSuiType(extractType(typeArg))) {\n throw new Error(`type argument mismatch: expected '${expectedTypeArg}' but got '${gotTypeArg}'`);\n }\n\n return PoolRewards.fromBcs(typeArg, fromB64(data.bcs.bcsBytes));\n }\n if (data.content) {\n return PoolRewards.fromSuiParsedData(typeArg, data.content);\n }\n throw new Error(\n \"Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.\"\n );\n }\n\n static async fetch<T extends PhantomReified<PhantomTypeArgument>>(\n client: SuiClient,\n typeArg: T,\n id: string\n ): Promise<PoolRewards<ToPhantomTypeArgument<T>>> {\n const res = await client.getObject({ id, options: { showBcs: true } });\n if (res.error) {\n throw new Error(`error fetching PoolRewards object at id ${id}: ${res.error.code}`);\n }\n if (res.data?.bcs?.dataType !== \"moveObject\" || !isPoolRewards(res.data.bcs.type)) {\n throw new Error(`object at id ${id} is not a PoolRewards object`);\n }\n\n return PoolRewards.fromSuiObjectData(typeArg, res.data);\n }\n}\n", "// @ts-nocheck\nimport {\n PhantomReified,\n PhantomToTypeStr,\n PhantomTypeArgument,\n Reified,\n StructClass,\n ToField,\n ToPhantomTypeArgument,\n ToTypeStr,\n assertFieldsWithTypesArgsMatch,\n assertReifiedTypeArgsMatch,\n decodeFromFields,\n decodeFromFieldsWithTypes,\n decodeFromJSONField,\n extractType,\n phantom,\n} from \"../../_framework/reified\";\nimport { FieldsWithTypes, composeSuiType, compressSuiType, parseTypeName } from \"../../_framework/util\";\nimport { PKG_V1 } from \"../index\";\nimport { bcs } from \"@mysten/sui/bcs\";\nimport { SuiClient, SuiObjectData, SuiParsedData } from \"@mysten/sui/client\";\nimport { fromB64 } from \"@mysten/sui/utils\";\n\n/* ============================== PoolState =============================== */\n\nexport function isPoolState(type: string): boolean {\n type = compressSuiType(type);\n return type.startsWith(`${PKG_V1}::pool_state::PoolState` + \"<\");\n}\n\nexport interface PoolStateFields<T extends PhantomTypeArgument> {\n tokenBalance: ToField<\"u64\">;\n vusdBalance: ToField<\"u64\">;\n d: ToField<\"u64\">;\n a: ToField<\"u64\">;\n balanceRatioMinBp: ToField<\"u64\">;\n}\n\nexport type PoolStateReified<T extends PhantomTypeArgument> = Reified<PoolState<T>, PoolStateFields<T>>;\n\nexport class PoolState<T extends PhantomTypeArgument> implements StructClass {\n __StructClass = true as const;\n\n static get $typeName() {\n return `${PKG_V1}::pool_state::PoolState`;\n }\n static readonly $numTypeParams = 1;\n static readonly $isPhantom = [true] as const;\n\n readonly $typeName = PoolState.$typeName;\n readonly $fullTypeName: string;\n readonly $typeArgs: [PhantomToTypeStr<T>];\n readonly $isPhantom = PoolState.$isPhantom;\n\n readonly tokenBalance: ToField<\"u64\">;\n readonly vusdBalance: ToField<\"u64\">;\n readonly d: ToField<\"u64\">;\n readonly a: ToField<\"u64\">;\n readonly balanceRatioMinBp: ToField<\"u64\">;\n\n private constructor(typeArgs: [PhantomToTypeStr<T>], fields: PoolStateFields<T>) {\n this.$fullTypeName = composeSuiType(PoolState.$typeName, ...typeArgs) as string;\n this.$typeArgs = typeArgs;\n\n this.tokenBalance = fields.tokenBalance;\n this.vusdBalance = fields.vusdBalance;\n this.d = fields.d;\n this.a = fields.a;\n this.balanceRatioMinBp = fields.balanceRatioMinBp;\n }\n\n static reified<T extends PhantomReified<PhantomTypeArgument>>(T: T): PoolStateReified<ToPhantomTypeArgument<T>> {\n return {\n typeName: PoolState.$typeName,\n fullTypeName: composeSuiType(PoolState.$typeName, ...[extractType(T)]) as string,\n typeArgs: [extractType(T)] as [PhantomToTypeStr<ToPhantomTypeArgument<T>>],\n isPhantom: PoolState.$isPhantom,\n reifiedTypeArgs: [T],\n fromFields: (fields: Record<string, any>) => PoolState.fromFields(T, fields),\n fromFieldsWithTypes: (item: FieldsWithTypes) => PoolState.fromFieldsWithTypes(T, item),\n fromBcs: (data: Uint8Array) => PoolState.fromBcs(T, data),\n bcs: PoolState.bcs,\n fromJSONField: (field: any) => PoolState.fromJSONField(T, field),\n fromJSON: (json: Record<string, any>) => PoolState.fromJSON(T, json),\n fromSuiParsedData: (content: SuiParsedData) => PoolState.fromSuiParsedData(T, content),\n fromSuiObjectData: (content: SuiObjectData) => PoolState.fromSuiObjectData(T, content),\n fetch: async (client: SuiClient, id: string) => PoolState.fetch(client, T, id),\n new: (fields: PoolStateFields<ToPhantomTypeArgument<T>>) => {\n return new PoolState([extractType(T)], fields);\n },\n kind: \"StructClassReified\",\n };\n }\n\n static get r() {\n return PoolState.reified;\n }\n\n static phantom<T extends PhantomReified<PhantomTypeArgument>>(\n T: T\n ): PhantomReified<ToTypeStr<PoolState<ToPhantomTypeArgument<T>>>> {\n return phantom(PoolState.reified(T));\n }\n static get p() {\n return PoolState.phantom;\n }\n\n static get bcs() {\n return bcs.struct(\"PoolState\", {\n token_balance: bcs.u64(),\n vusd_balance: bcs.u64(),\n d: bcs.u64(),\n a: bcs.u64(),\n balance_ratio_min_bp: bcs.u64(),\n });\n }\n\n static fromFields<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n fields: Record<string, any>\n ): PoolState<ToPhantomTypeArgument<T>> {\n return PoolState.reified(typeArg).new({\n tokenBalance: decodeFromFields(\"u64\", fields.token_balance),\n vusdBalance: decodeFromFields(\"u64\", fields.vusd_balance),\n d: decodeFromFields(\"u64\", fields.d),\n a: decodeFromFields(\"u64\", fields.a),\n balanceRatioMinBp: decodeFromFields(\"u64\", fields.balance_ratio_min_bp),\n });\n }\n\n static fromFieldsWithTypes<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n item: FieldsWithTypes\n ): PoolState<ToPhantomTypeArgument<T>> {\n if (!isPoolState(item.type)) {\n throw new Error(\"not a PoolState type\");\n }\n assertFieldsWithTypesArgsMatch(item, [typeArg]);\n\n return PoolState.reified(typeArg).new({\n tokenBalance: decodeFromFieldsWithTypes(\"u64\", item.fields.token_balance),\n vusdBalance: decodeFromFieldsWithTypes(\"u64\", item.fields.vusd_balance),\n d: decodeFromFieldsWithTypes(\"u64\", item.fields.d),\n a: decodeFromFieldsWithTypes(\"u64\", item.fields.a),\n balanceRatioMinBp: decodeFromFieldsWithTypes(\"u64\", item.fields.balance_ratio_min_bp),\n });\n }\n\n static fromBcs<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n data: Uint8Array\n ): PoolState<ToPhantomTypeArgument<T>> {\n return PoolState.fromFields(typeArg, PoolState.bcs.parse(data));\n }\n\n toJSONField() {\n return {\n tokenBalance: this.tokenBalance.toString(),\n vusdBalance: this.vusdBalance.toString(),\n d: this.d.toString(),\n a: this.a.toString(),\n balanceRatioMinBp: this.balanceRatioMinBp.toString(),\n };\n }\n\n toJSON() {\n return {\n $typeName: this.$typeName,\n $typeArgs: this.$typeArgs,\n ...this.toJSONField(),\n };\n }\n\n static fromJSONField<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n field: any\n ): PoolState<ToPhantomTypeArgument<T>> {\n return PoolState.reified(typeArg).new({\n tokenBalance: decodeFromJSONField(\"u64\", field.tokenBalance),\n vusdBalance: decodeFromJSONField(\"u64\", field.vusdBalance),\n d: decodeFromJSONField(\"u64\", field.d),\n a: decodeFromJSONField(\"u64\", field.a),\n balanceRatioMinBp: decodeFromJSONField(\"u64\", field.balanceRatioMinBp),\n });\n }\n\n static fromJSON<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n json: Record<string, any>\n ): PoolState<ToPhantomTypeArgument<T>> {\n if (json.$typeName !== PoolState.$typeName) {\n throw new Error(\"not a WithTwoGenerics json object\");\n }\n assertReifiedTypeArgsMatch(composeSuiType(PoolState.$typeName, extractType(typeArg)), json.$typeArgs, [typeArg]);\n\n return PoolState.fromJSONField(typeArg, json);\n }\n\n static fromSuiParsedData<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n content: SuiParsedData\n ): PoolState<ToPhantomTypeArgument<T>> {\n if (content.dataType !== \"moveObject\") {\n throw new Error(\"not an object\");\n }\n if (!isPoolState(content.type)) {\n throw new Error(`object at ${(content.fields as any).id} is not a PoolState object`);\n }\n return PoolState.fromFieldsWithTypes(typeArg, content);\n }\n\n static fromSuiObjectData<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n data: SuiObjectData\n ): PoolState<ToPhantomTypeArgument<T>> {\n if (data.bcs) {\n if (data.bcs.dataType !== \"moveObject\" || !isPoolState(data.bcs.type)) {\n throw new Error(`object at is not a PoolState object`);\n }\n\n const gotTypeArgs = parseTypeName(data.bcs.type).typeArgs;\n if (gotTypeArgs.length !== 1) {\n throw new Error(`type argument mismatch: expected 1 type argument but got '${gotTypeArgs.length}'`);\n }\n const gotTypeArg = compressSuiType(gotTypeArgs[0]);\n const expectedTypeArg = compressSuiType(extractType(typeArg));\n if (gotTypeArg !== compressSuiType(extractType(typeArg))) {\n throw new Error(`type argument mismatch: expected '${expectedTypeArg}' but got '${gotTypeArg}'`);\n }\n\n return PoolState.fromBcs(typeArg, fromB64(data.bcs.bcsBytes));\n }\n if (data.content) {\n return PoolState.fromSuiParsedData(typeArg, data.content);\n }\n throw new Error(\n \"Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.\"\n );\n }\n\n static async fetch<T extends PhantomReified<PhantomTypeArgument>>(\n client: SuiClient,\n typeArg: T,\n id: string\n ): Promise<PoolState<ToPhantomTypeArgument<T>>> {\n const res = await client.getObject({ id, options: { showBcs: true } });\n if (res.error) {\n throw new Error(`error fetching PoolState object at id ${id}: ${res.error.code}`);\n }\n if (res.data?.bcs?.dataType !== \"moveObject\" || !isPoolState(res.data.bcs.type)) {\n throw new Error(`object at id ${id} is not a PoolState object`);\n }\n\n return PoolState.fromSuiObjectData(typeArg, res.data);\n }\n}\n", "// @ts-nocheck\nimport {\n PhantomReified,\n PhantomToTypeStr,\n PhantomTypeArgument,\n Reified,\n StructClass,\n ToField,\n ToPhantomTypeArgument,\n ToTypeStr,\n assertFieldsWithTypesArgsMatch,\n assertReifiedTypeArgsMatch,\n decodeFromFields,\n decodeFromFieldsWithTypes,\n decodeFromJSONField,\n extractType,\n phantom,\n} from \"../../_framework/reified\";\nimport { FieldsWithTypes, composeSuiType, compressSuiType, parseTypeName } from \"../../_framework/util\";\nimport { UID } from \"../../sui/object/structs\";\nimport { PKG_V1 } from \"../index\";\nimport { bcs } from \"@mysten/sui/bcs\";\nimport { SuiClient, SuiObjectData, SuiParsedData } from \"@mysten/sui/client\";\nimport { fromB64 } from \"@mysten/sui/utils\";\n\n/* ============================== UserDeposit =============================== */\n\nexport function isUserDeposit(type: string): boolean {\n type = compressSuiType(type);\n return type.startsWith(`${PKG_V1}::user_deposit::UserDeposit` + \"<\");\n}\n\nexport interface UserDepositFields<T extends PhantomTypeArgument> {\n id: ToField<UID>;\n lpAmount: ToField<\"u64\">;\n rewardDebt: ToField<\"u64\">;\n}\n\nexport type UserDepositReified<T extends PhantomTypeArgument> = Reified<UserDeposit<T>, UserDepositFields<T>>;\n\nexport class UserDeposit<T extends PhantomTypeArgument> implements StructClass {\n __StructClass = true as const;\n\n static get $typeName() {\n return `${PKG_V1}::user_deposit::UserDeposit`;\n }\n static readonly $numTypeParams = 1;\n static readonly $isPhantom = [true] as const;\n\n readonly $typeName = UserDeposit.$typeName;\n readonly $fullTypeName: string;\n readonly $typeArgs: [PhantomToTypeStr<T>];\n readonly $isPhantom = UserDeposit.$isPhantom;\n\n readonly id: ToField<UID>;\n readonly lpAmount: ToField<\"u64\">;\n readonly rewardDebt: ToField<\"u64\">;\n\n private constructor(typeArgs: [PhantomToTypeStr<T>], fields: UserDepositFields<T>) {\n this.$fullTypeName = composeSuiType(UserDeposit.$typeName, ...typeArgs) as string;\n this.$typeArgs = typeArgs;\n\n this.id = fields.id;\n this.lpAmount = fields.lpAmount;\n this.rewardDebt = fields.rewardDebt;\n }\n\n static reified<T extends PhantomReified<PhantomTypeArgument>>(T: T): UserDepositReified<ToPhantomTypeArgument<T>> {\n return {\n typeName: UserDeposit.$typeName,\n fullTypeName: composeSuiType(UserDeposit.$typeName, ...[extractType(T)]) as string,\n typeArgs: [extractType(T)] as [PhantomToTypeStr<ToPhantomTypeArgument<T>>],\n isPhantom: UserDeposit.$isPhantom,\n reifiedTypeArgs: [T],\n fromFields: (fields: Record<string, any>) => UserDeposit.fromFields(T, fields),\n fromFieldsWithTypes: (item: FieldsWithTypes) => UserDeposit.fromFieldsWithTypes(T, item),\n fromBcs: (data: Uint8Array) => UserDeposit.fromBcs(T, data),\n bcs: UserDeposit.bcs,\n fromJSONField: (field: any) => UserDeposit.fromJSONField(T, field),\n fromJSON: (json: Record<string, any>) => UserDeposit.fromJSON(T, json),\n fromSuiParsedData: (content: SuiParsedData) => UserDeposit.fromSuiParsedData(T, content),\n fromSuiObjectData: (content: SuiObjectData) => UserDeposit.fromSuiObjectData(T, content),\n fetch: async (client: SuiClient, id: string) => UserDeposit.fetch(client, T, id),\n new: (fields: UserDepositFields<ToPhantomTypeArgument<T>>) => {\n return new UserDeposit([extractType(T)], fields);\n },\n kind: \"StructClassReified\",\n };\n }\n\n static get r() {\n return UserDeposit.reified;\n }\n\n static phantom<T extends PhantomReified<PhantomTypeArgument>>(\n T: T\n ): PhantomReified<ToTypeStr<UserDeposit<ToPhantomTypeArgument<T>>>> {\n return phantom(UserDeposit.reified(T));\n }\n static get p() {\n return UserDeposit.phantom;\n }\n\n static get bcs() {\n return bcs.struct(\"UserDeposit\", {\n id: UID.bcs,\n lp_amount: bcs.u64(),\n reward_debt: bcs.u64(),\n });\n }\n\n static fromFields<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n fields: Record<string, any>\n ): UserDeposit<ToPhantomTypeArgument<T>> {\n return UserDeposit.reified(typeArg).new({\n id: decodeFromFields(UID.reified(), fields.id),\n lpAmount: decodeFromFields(\"u64\", fields.lp_amount),\n rewardDebt: decodeFromFields(\"u64\", fields.reward_debt),\n });\n }\n\n static fromFieldsWithTypes<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n item: FieldsWithTypes\n ): UserDeposit<ToPhantomTypeArgument<T>> {\n if (!isUserDeposit(item.type)) {\n throw new Error(\"not a UserDeposit type\");\n }\n assertFieldsWithTypesArgsMatch(item, [typeArg]);\n\n return UserDeposit.reified(typeArg).new({\n id: decodeFromFieldsWithTypes(UID.reified(), item.fields.id),\n lpAmount: decodeFromFieldsWithTypes(\"u64\", item.fields.lp_amount),\n rewardDebt: decodeFromFieldsWithTypes(\"u64\", item.fields.reward_debt),\n });\n }\n\n static fromBcs<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n data: Uint8Array\n ): UserDeposit<ToPhantomTypeArgument<T>> {\n return UserDeposit.fromFields(typeArg, UserDeposit.bcs.parse(data));\n }\n\n toJSONField() {\n return {\n id: this.id,\n lpAmount: this.lpAmount.toString(),\n rewardDebt: this.rewardDebt.toString(),\n };\n }\n\n toJSON() {\n return {\n $typeName: this.$typeName,\n $typeArgs: this.$typeArgs,\n ...this.toJSONField(),\n };\n }\n\n static fromJSONField<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n field: any\n ): UserDeposit<ToPhantomTypeArgument<T>> {\n return UserDeposit.reified(typeArg).new({\n id: decodeFromJSONField(UID.reified(), field.id),\n lpAmount: decodeFromJSONField(\"u64\", field.lpAmount),\n rewardDebt: decodeFromJSONField(\"u64\", field.rewardDebt),\n });\n }\n\n static fromJSON<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n json: Record<string, any>\n ): UserDeposit<ToPhantomTypeArgument<T>> {\n if (json.$typeName !== UserDeposit.$typeName) {\n throw new Error(\"not a WithTwoGenerics json object\");\n }\n assertReifiedTypeArgsMatch(composeSuiType(UserDeposit.$typeName, extractType(typeArg)), json.$typeArgs, [typeArg]);\n\n return UserDeposit.fromJSONField(typeArg, json);\n }\n\n static fromSuiParsedData<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n content: SuiParsedData\n ): UserDeposit<ToPhantomTypeArgument<T>> {\n if (content.dataType !== \"moveObject\") {\n throw new Error(\"not an object\");\n }\n if (!isUserDeposit(content.type)) {\n throw new Error(`object at ${(content.fields as any).id} is not a UserDeposit object`);\n }\n return UserDeposit.fromFieldsWithTypes(typeArg, content);\n }\n\n static fromSuiObjectData<T extends PhantomReified<PhantomTypeArgument>>(\n typeArg: T,\n data: SuiObjectData\n ): UserDeposit<ToPhantomTypeArgument<T>> {\n if (data.bcs) {\n if (data.bcs.dataType !== \"moveObject\" || !isUserDeposit(data.bcs.type)) {\n throw new Error(`object at is not a UserDeposit object`);\n }\n\n const gotTypeArgs = parseTypeName(data.bcs.type).typeArgs;\n if (gotTypeArgs.length !== 1) {\n throw new Error(`type argument mismatch: expected 1 type argument but got '${gotTypeArgs.length}'`);\n }\n const gotTypeArg = compressSuiType(gotTypeArgs[0]);\n const expectedTypeArg = compressSuiType(extractType(typeArg));\n if (gotTypeArg !== compressSuiType(extractType(typeArg))) {\n throw new Error(`type argument mismatch: expected '${expectedTypeArg}' but got '${gotTypeArg}'`);\n }\n\n return UserDeposit.fromBcs(typeArg, fromB64(data.bcs.bcsBytes));\n }\n if (data.content) {\n return UserDeposit.fromSuiParsedData(typeArg, data.content);\n }\n throw new Error(\n \"Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.\"\n );\n }\n\n static async fetch<T extends PhantomReified<PhantomTypeArgument>>(\n client: SuiClient,\n typeArg: T,\n id: string\n ): Promise<UserDeposit<ToPhantomTypeArgument<T>>> {\n const res = await client.getObject({ id, options: { showBcs: true } });\n if (res.error) {\n throw new Error(`error fetching UserDeposit object at id ${id}: ${res.error.code}`);\n }\n if (res.data?.bcs?.dataType !== \"moveObject\" || !isUserDeposit(res.data.bcs.type)) {\n throw new Error(`object at id ${id} is not a UserDeposit object`);\n }\n\n return UserDeposit.fromSuiObjectData(typeArg, res.data);\n }\n}\n", "import { CoinStruct } from \"@mysten/sui/client\";\nimport { Transaction } from \"@mysten/sui/transactions\";\n\nexport function getCoinsWithAmounts(amounts: string[], coins: CoinStruct[], tx: Transaction) {\n if (coins.length === 0 || !coins[0]) {\n return [];\n }\n const firstCoin = coins[0];\n const requiredAmount = amounts.reduce((total, amount) => total + BigInt(amount), BigInt(0));\n\n let currentBalance = BigInt(firstCoin.balance);\n const accumulatedCoins: CoinStruct[] = [];\n\n for (const coin of coins.slice(1)) {\n if (currentBalance > requiredAmount) {\n return splitAndMergeCoins(tx, firstCoin, accumulatedCoins, amounts);\n } else {\n currentBalance += BigInt(coin.balance);\n accumulatedCoins.push(coin);\n }\n }\n\n if (currentBalance >= requiredAmount) {\n return splitAndMergeCoins(tx, firstCoin, accumulatedCoins, amounts);\n } else {\n return [];\n }\n}\n\nfunction splitAndMergeCoins(tx: Transaction, firstCoin: CoinStruct, accumulatedCoins: CoinStruct[], amounts: string[]) {\n const pureAmounts = amounts.map((amount) => {\n return tx.pure.u64(amount);\n });\n if (accumulatedCoins.length > 0) {\n tx.mergeCoins(\n firstCoin.coinObjectId,\n accumulatedCoins.map((c) => c.coinObjectId)\n );\n return tx.splitCoins(firstCoin.coinObjectId, pureAmounts);\n }\n\n return tx.splitCoins(firstCoin.coinObjectId, pureAmounts);\n}\n", "import { SuiClient } from \"@mysten/sui/client\";\nimport { Transaction } from \"@mysten/sui/transactions\";\nimport { Reified, toBcs, ToJSON, TypeArgument } from \"../../models/sui/_framework/reified\";\n\nconst mockSender = \"0x0000000000000000000000000000000000000000000000000000000000000000\";\n\nexport async function suiView<T extends TypeArgument>(\n client: SuiClient,\n tx: Transaction,\n reified: Reified<T, any>\n): Promise<ToJSON<T>> {\n const inspectionResult = await client.devInspectTransactionBlock({\n sender: mockSender,\n transactionBlock: tx,\n });\n if (inspectionResult.effects.status.status !== \"success\") {\n throw new Error(`inspectionResult failed. ${JSON.stringify(inspectionResult, null, 2)}`);\n }\n\n const returnValue = inspectionResult.results?.pop()?.returnValues?.pop();\n\n if (!returnValue) {\n throw new Error(`Something with inspectionResult went wrong. ${JSON.stringify(inspectionResult, null, 2)}`);\n }\n\n const [data, _type] = returnValue;\n\n if (typeof reified === \"object\") {\n return reified.fromBcs(Uint8Array.from(data)).toJSONField() as ToJSON<T>;\n } else {\n return toBcs(reified).parse(Uint8Array.from(data));\n }\n}\n", "import { TronWeb } from \"tronweb\";\nimport { AbiItem, Web3 } from \"web3\";\nimport { encodeFunctionCall } from \"web3-eth-abi\";\nimport { AbiFunctionFragment } from \"web3-types\";\nimport { ChainType } from \"../../../chains/chain.enums\";\nimport { AllbridgeCoreClient } from \"../../../client/core-api/core-client-base\";\nimport { SdkError } from \"../../../exceptions\";\nimport { PoolInfo, TokenWithChainDetails } from \"../../../tokens-info\";\nimport { calculatePoolInfoImbalance } from \"../../../utils/calculation\";\nimport { tronAddressToEthAddress } from \"../../bridge/utils\";\nimport { RawTransaction, SmartContractMethodParameter } from \"../../models\";\nimport Pool from \"../../models/abi/Pool\";\nimport {\n ChainPoolService,\n LiquidityPoolsParams,\n LiquidityPoolsParamsWithAmount,\n UserBalance,\n UserBalanceInfo,\n} from \"../models\";\n\nexport class TronPoolService extends ChainPoolService {\n chainType: ChainType.TRX = ChainType.TRX;\n private P = 52;\n\n constructor(\n public tronWeb: TronWeb,\n public api: AllbridgeCoreClient,\n private readonly tronJsonRpc: string | undefined\n ) {\n super();\n }\n\n async getUserBalanceInfo(accountAddress: string, token: TokenWithChainDetails): Promise<UserBalanceInfo> {\n let userBalanceInfo;\n if (this.tronJsonRpc) {\n try {\n userBalanceInfo = await this.getUserBalanceInfoByBatch(this.tronJsonRpc, accountAddress, token);\n } catch (ignoreError) {\n userBalanceInfo = await this.getUserBalanceInfoPerProperty(accountAddress, token);\n }\n } else {\n userBalanceInfo = await this.getUserBalanceInfoPerProperty(accountAddress, token);\n }\n return userBalanceInfo;\n }\n\n private async getUserBalanceInfoByBatch(\n tronJsonRpc: string,\n accountAddress: string,\n token: TokenWithChainDetails\n ): Promise<UserBalanceInfo> {\n const contractAddress = tronAddressToEthAddress(token.poolAddress);\n const userAddress = tronAddressToEthAddress(accountAddress);\n\n const payload = [\n {\n jsonrpc: \"2.0\",\n id: 1,\n method: \"eth_call\",\n params: [{ to: contractAddress, data: this.getFunctionAbi(\"userRewardDebt\", userAddress) }, \"latest\"],\n },\n {\n jsonrpc: \"2.0\",\n id: 2,\n method: \"eth_call\",\n params: [{ to: contractAddress, data: this.getFunctionAbi(\"balanceOf\", userAddress) }, \"latest\"],\n },\n ];\n\n const response = await fetch(tronJsonRpc, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n });\n\n const results = await response.json();\n\n if (Array.isArray(results) && results.length === 2) {\n const getResult = (id: number) => {\n const entry = results.find((r) => r.id === id);\n if (!entry || !entry.result) {\n throw new Error(`Missing or invalid result for id ${id}`);\n }\n return Web3.utils.toBigInt(entry.result).toString();\n };\n\n return new UserBalance({\n lpAmount: Web3.utils.toBigInt(getResult(2)).toString(),\n rewardDebt: Web3.utils.toBigInt(getResult(1)).toString(),\n });\n }\n\n throw new Error(\"Batched HTTP call failed\");\n }\n\n private async getUserBalanceInfoPerProperty(\n accountAddress: string,\n token: TokenWithChainDetails\n ): Promise<UserBalanceInfo> {\n if (!this.tronWeb.defaultAddress.base58) {\n this.tronWeb.setAddress(accountAddress);\n }\n const contract = this.getContract(token.poolAddress);\n const rewardDebt = (await contract.methods.userRewardDebt(accountAddress).call()).toString();\n const lpAmount = (await contract.methods.balanceOf(accountAddress).call()).toString();\n return new UserBalance({ lpAmount, rewardDebt });\n }\n\n async getPoolInfoFromChain(token: TokenWithChainDetails): Promise<PoolInfo> {\n let poolInfo;\n if (this.tronJsonRpc) {\n try {\n poolInfo = await this.getPoolInfoByBatch(this.tronJsonRpc, token);\n } catch (ignoreError) {\n poolInfo = await this.getPoolInfoPerProperty(token);\n }\n } else {\n poolInfo = await this.getPoolInfoPerProperty(token);\n }\n return poolInfo;\n }\n\n private async getPoolInfoByBatch(tronJsonRpc: string, token: TokenWithChainDetails): Promise<PoolInfo> {\n const contractAddress = tronAddressToEthAddress(token.poolAddress);\n\n const payload = [\n {\n jsonrpc: \"2.0\",\n id: 1,\n method: \"eth_call\",\n params: [{ to: contractAddress, data: this.getFunctionAbi(\"a\") }, \"latest\"],\n },\n {\n jsonrpc: \"2.0\",\n id: 2,\n method: \"eth_call\",\n params: [{ to: contractAddress, data: this.getFunctionAbi(\"d\") }, \"latest\"],\n },\n {\n jsonrpc: \"2.0\",\n id: 3,\n method: \"eth_call\",\n params: [{ to: contractAddress, data: this.getFunctionAbi(\"tokenBalance\") }, \"latest\"],\n },\n {\n jsonrpc: \"2.0\",\n id: 4,\n method: \"eth_call\",\n params: [{ to: contractAddress, data: this.getFunctionAbi(\"vUsdBalance\") }, \"latest\"],\n },\n {\n jsonrpc: \"2.0\",\n id: 5,\n method: \"eth_call\",\n params: [{ to: contractAddress, data: this.getFunctionAbi(\"totalSupply\") }, \"latest\"],\n },\n {\n jsonrpc: \"2.0\",\n id: 6,\n method: \"eth_call\",\n params: [{ to: contractAddress, data: this.getFunctionAbi(\"accRewardPerShareP\") }, \"latest\"],\n },\n ];\n\n const response = await fetch(tronJsonRpc, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n });\n\n const results = await response.json();\n\n if (Array.isArray(results) && results.length === 6) {\n const getResult = (id: number) => {\n const entry = results.find((r) => r.id === id);\n if (!entry || !entry.result) {\n throw new Error(`Missing or invalid result for id ${id}`);\n }\n return Web3.utils.toBigInt(entry.result).toString();\n };\n\n const tokenBalanceStr = getResult(3);\n const vUsdBalanceStr = getResult(4);\n const imbalance = calculatePoolInfoImbalance({ tokenBalance: tokenBalanceStr, vUsdBalance: vUsdBalanceStr });\n\n return {\n aValue: getResult(1),\n dValue: getResult(2),\n tokenBalance: tokenBalanceStr,\n vUsdBalance: vUsdBalanceStr,\n totalLpAmount: getResult(5),\n accRewardPerShareP: getResult(6),\n p: this.P,\n imbalance,\n };\n }\n\n throw new Error(\"Batched pool info call failed\");\n }\n\n private async getPoolInfoPerProperty(token: TokenWithChainDetails): Promise<PoolInfo> {\n if (!this.tronWeb.defaultAddress.base58) {\n this.tronWeb.setAddress(token.poolAddress);\n }\n const poolContract = this.getContract(token.poolAddress);\n const [aValue, dValue, tokenBalance, vUsdBalance, totalLpAmount, accRewardPerShareP] = await Promise.all([\n poolContract.methods.a().call(),\n poolContract.methods.d().call(),\n poolContract.methods.tokenBalance().call(),\n poolContract.methods.vUsdBalance().call(),\n poolContract.methods.totalSupply().call(),\n poolContract.methods.accRewardPerShareP().call(),\n ]);\n const tokenBalanceStr = tokenBalance.toString();\n const vUsdBalanceStr = vUsdBalance.toString();\n const imbalance = calculatePoolInfoImbalance({ tokenBalance: tokenBalanceStr, vUsdBalance: vUsdBalanceStr });\n return {\n aValue: aValue.toString(),\n dValue: dValue.toString(),\n tokenBalance: tokenBalanceStr,\n vUsdBalance: vUsdBalanceStr,\n totalLpAmount: totalLpAmount.toString(),\n accRewardPerShareP: accRewardPerShareP.toString(),\n p: this.P,\n imbalance,\n };\n }\n\n buildRawTransactionDeposit(params: LiquidityPoolsParamsWithAmount): Promise<RawTransaction> {\n const { amount, accountAddress } = params;\n\n const parameter = [{ type: \"uint256\", value: amount }];\n const methodSignature = \"deposit(uint256)\";\n\n return this.buildRawTransaction(params.token.poolAddress, methodSignature, parameter, \"0\", accountAddress);\n }\n\n buildRawTransactionWithdraw(params: LiquidityPoolsParamsWithAmount): Promise<RawTransaction> {\n const { amount, accountAddress } = params;\n\n const parameter = [{ type: \"uint256\", value: amount }];\n const methodSignature = \"withdraw(uint256)\";\n\n return this.buildRawTransaction(params.token.poolAddress, methodSignature, parameter, \"0\", accountAddress);\n }\n\n buildRawTransactionClaimRewards(params: LiquidityPoolsParams): Promise<RawTransaction> {\n const { accountAddress } = params;\n\n const parameter: SmartContractMethodParameter[] = [];\n const methodSignature = \"claimRewards()\";\n\n return this.buildRawTransaction(params.token.poolAddress, methodSignature, parameter, \"0\", accountAddress);\n }\n\n private async buildRawTransaction(\n contractAddress: string,\n methodSignature: string,\n parameter: SmartContractMethodParameter[],\n value: string,\n fromAddress: string\n ): Promise<RawTransaction> {\n const transactionObject = await this.tronWeb.transactionBuilder.triggerSmartContract(\n contractAddress,\n methodSignature,\n {\n callValue: +value,\n },\n parameter,\n fromAddress\n );\n if (!transactionObject?.result?.result) {\n throw new SdkError(\"Unknown error: \" + JSON.stringify(transactionObject, null, 2));\n }\n return transactionObject.transaction;\n }\n\n private getContract(contractAddress: string): any {\n return this.tronWeb.contract(Pool.abi, contractAddress);\n }\n\n private getFunctionAbi(name: string, ...params: string[]): string {\n const abiItem = (Pool.abi as ReadonlyArray<AbiItem>).find(\n (item) => item.type === \"function\" && \"name\" in item && item.name === name\n );\n\n if (!abiItem) {\n throw new Error(`${name} method not found in Pool ABI`);\n }\n\n return encodeFunctionCall(abiItem as AbiFunctionFragment, params);\n }\n}\n", "import { TronWeb } from \"tronweb\";\nimport { FMT_BYTES, FMT_NUMBER, Web3 } from \"web3\";\nimport { Chains } from \"../../chains\";\nimport { AllbridgeCoreClient } from \"../../client/core-api/core-client-base\";\nimport { AllbridgeCoreClientFiltered } from \"../../client/core-api/core-client-filtered\";\nimport { MethodNotSupportedError } from \"../../exceptions\";\nimport { AllbridgeCoreSdkOptions, ChainType, EssentialWeb3, TokenWithChainDetails } from \"../../index\";\nimport { convertIntAmountToFloat } from \"../../utils/calculation\";\nimport { SYSTEM_PRECISION } from \"../../utils/calculation/constants\";\nimport { validateAmountDecimals, validateAmountGtZero } from \"../../utils/utils\";\nimport { NodeRpcUrlsConfig } from \"../index\";\nimport { Provider } from \"../models\";\nimport { TokenService } from \"../token\";\nimport { EvmYieldService } from \"./evm\";\nimport {\n ChainYieldService,\n CYDToken,\n TokenWithChainDetailsYield,\n YieldBalanceParams,\n YieldCheckAllowanceParams,\n YieldGetAllowanceParams,\n YieldGetEstimatedAmountOnDepositParams,\n YieldGetWithdrawProportionAmountParams,\n YieldWithdrawAmount,\n} from \"./models\";\nimport { DefaultRawYieldTransactionBuilder, RawYieldTransactionBuilder } from \"./raw-yield-transaction-builder\";\nimport { TronYieldService } from \"./trx\";\nimport { isYieldSupported } from \"./validations\";\n\nexport interface YieldService {\n rawTxBuilder: RawYieldTransactionBuilder;\n\n /**\n * Returns a list of supported {@link CYDToken}.\n */\n getCYDTokens(): Promise<CYDToken[]>;\n\n /**\n * Get amount of tokens approved for Yield\n * @param provider - will be used to access the network\n * @param params See {@link YieldGetAllowanceParams}\n * @returns the amount of approved tokens\n */\n getAllowance(params: YieldGetAllowanceParams, provider?: Provider): Promise<string>;\n\n /**\n * Check if the amount of approved tokens is enough\n * @param params See {@link YieldCheckAllowanceParams}\n * @param provider - will be used to access the network\n * @returns true if the amount of approved tokens is enough to make a transfer\n */\n checkAllowance(params: YieldCheckAllowanceParams, provider?: Provider): Promise<boolean>;\n\n /**\n * Get token balance\n * @param params\n * @param provider\n * @returns Token balance\n */\n balanceOf(params: YieldBalanceParams, provider?: Provider): Promise<string>;\n\n /**\n * Calculates the amount of CYD tokens that will be deposited\n * @param params - will be used to access the network\n * @param provider - will be used to access the network\n * @returns amount\n */\n getEstimatedAmountOnDeposit(params: YieldGetEstimatedAmountOnDepositParams, provider?: Provider): Promise<string>;\n\n /**\n * Calculates the amounts of tokens ({@link YieldWithdrawAmount}) will be withdrawn\n * @param params\n * @param provider - will be used to access the network\n * @returns amounts\n */\n getWithdrawAmounts(\n params: YieldGetWithdrawProportionAmountParams,\n provider?: Provider\n ): Promise<YieldWithdrawAmount[]>;\n}\n\nexport class DefaultYieldService implements YieldService {\n public rawTxBuilder: RawYieldTransactionBuilder;\n\n constructor(\n private api: AllbridgeCoreClientFiltered,\n private nodeRpcUrlsConfig: NodeRpcUrlsConfig,\n private params: AllbridgeCoreSdkOptions,\n private tokenService: TokenService\n ) {\n this.rawTxBuilder = new DefaultRawYieldTransactionBuilder(api, nodeRpcUrlsConfig, params, tokenService);\n }\n\n async getCYDTokens(): Promise<CYDToken[]> {\n const result: CYDToken[] = [];\n const chainMap = await this.api.getChainDetailsMap(\"pool\");\n\n Object.values(chainMap).forEach((chainData) => {\n if (chainData.yieldAddress) {\n const cydToken = chainData.tokens.find((t) => t.tokenAddress === chainData.yieldAddress);\n const tokens: TokenWithChainDetailsYield[] = chainData.tokens.filter(isYieldSupported);\n if (tokens.length > 0) {\n const cydDefined: TokenWithChainDetails = cydToken ?? {\n allbridgeChainId: chainData.allbridgeChainId,\n apr: \"\",\n apr30d: \"\",\n apr7d: \"\",\n bridgeAddress: chainData.bridgeAddress,\n chainId: chainData.chainId,\n chainName: chainData.name,\n chainSymbol: chainData.chainSymbol,\n chainType: chainData.chainType,\n confirmations: chainData.confirmations,\n decimals: 3,\n feeShare: \"\",\n lpRate: \"\",\n name: \"Core Yield\",\n poolAddress: \"\",\n symbol: \"CYD\",\n tokenAddress: chainData.yieldAddress,\n transferTime: {},\n txCostAmount: { maxAmount: \"0\", swap: \"0\", transfer: \"0\" },\n yieldAddress: chainData.yieldAddress,\n };\n result.push({\n ...cydDefined,\n yieldAddress: chainData.yieldAddress,\n tokens: tokens,\n });\n }\n }\n });\n\n return result;\n }\n\n async getAllowance(params: YieldGetAllowanceParams, provider?: Provider): Promise<string> {\n return await this.tokenService.getAllowance({ ...params, spender: params.token.yieldAddress }, provider);\n }\n\n async checkAllowance(params: YieldCheckAllowanceParams, provider?: Provider): Promise<boolean> {\n return this.tokenService.checkAllowance({ ...params, spender: params.token.yieldAddress }, provider);\n }\n\n async balanceOf(params: YieldBalanceParams, provider?: Provider): Promise<string> {\n return getChainYieldService(\n params.token.chainSymbol,\n this.api,\n this.nodeRpcUrlsConfig,\n params.owner,\n provider\n ).balanceOf(params);\n }\n\n async getEstimatedAmountOnDeposit(\n params: YieldGetEstimatedAmountOnDepositParams,\n provider?: Provider\n ): Promise<string> {\n validateAmountGtZero(params.amount);\n validateAmountDecimals(\"amount\", params.amount, params.token.decimals);\n return getChainYieldService(\n params.token.chainSymbol,\n this.api,\n this.nodeRpcUrlsConfig,\n params.token.yieldAddress,\n provider\n ).getEstimatedAmountOnDeposit(params);\n }\n\n async getWithdrawAmounts(\n params: YieldGetWithdrawProportionAmountParams,\n provider?: Provider\n ): Promise<YieldWithdrawAmount[]> {\n validateAmountGtZero(params.amount);\n validateAmountDecimals(\"amount\", params.amount, SYSTEM_PRECISION);\n const proportionAmounts = await getChainYieldService(\n params.cydToken.chainSymbol,\n this.api,\n this.nodeRpcUrlsConfig,\n params.owner,\n provider\n ).getWithdrawProportionAmount(params);\n return params.cydToken.tokens\n .filter((token) => proportionAmounts[token.yieldId] !== undefined)\n .map((token) => ({\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n amount: convertIntAmountToFloat(proportionAmounts[token.yieldId]!, token.decimals).toFixed(),\n token: token,\n }));\n }\n}\n\nexport function getChainYieldService(\n chainSymbol: string,\n api: AllbridgeCoreClient,\n nodeRpcUrlsConfig: NodeRpcUrlsConfig,\n ownerAddress: string,\n provider?: Provider\n): ChainYieldService {\n switch (Chains.getChainProperty(chainSymbol).chainType) {\n case ChainType.EVM: {\n if (provider) {\n return new EvmYieldService(provider as EssentialWeb3, api);\n } else {\n const nodeRpcUrl = nodeRpcUrlsConfig.getNodeRpcUrl(chainSymbol);\n const web3 = new Web3(nodeRpcUrl);\n web3.defaultReturnFormat = { number: FMT_NUMBER.STR, bytes: FMT_BYTES.HEX };\n return new EvmYieldService(web3, api);\n }\n }\n case ChainType.TRX: {\n if (provider) {\n return new TronYieldService(provider as TronWeb, api);\n } else {\n const nodeRpcUrl = nodeRpcUrlsConfig.getNodeRpcUrl(chainSymbol);\n const tronWeb = new TronWeb({ fullHost: nodeRpcUrl });\n tronWeb.setAddress(ownerAddress);\n return new TronYieldService(tronWeb, api);\n }\n }\n case ChainType.SOLANA: {\n throw new MethodNotSupportedError();\n }\n case ChainType.SRB: {\n throw new MethodNotSupportedError();\n }\n case ChainType.SUI: {\n throw new MethodNotSupportedError();\n }\n }\n}\n", "const artifact = {\n abi: [\n {\n inputs: [\n {\n internalType: \"string\",\n name: \"tokenName_\",\n type: \"string\",\n },\n {\n internalType: \"string\",\n name: \"tokenSymbol_\",\n type: \"string\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"constructor\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"owner\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"spender\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"value\",\n type: \"uint256\",\n },\n ],\n name: \"Approval\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"address\",\n name: \"user\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"address\",\n name: \"token\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"lpAmount\",\n type: \"uint256\",\n },\n ],\n name: \"Deposited\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"address\",\n name: \"token\",\n type: \"address\",\n },\n ],\n name: \"DepositedRewards\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"from\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256[4]\",\n name: \"values\",\n type: \"uint256[4]\",\n },\n ],\n name: \"MultiTransfer\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"previousOwner\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"newOwner\",\n type: \"address\",\n },\n ],\n name: \"OwnershipTransferred\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"from\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"value\",\n type: \"uint256\",\n },\n ],\n name: \"Transfer\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"address\",\n name: \"user\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"address\",\n name: \"token\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n ],\n name: \"Withdrawn\",\n type: \"event\",\n },\n {\n stateMutability: \"payable\",\n type: \"fallback\",\n },\n {\n inputs: [],\n name: \"NUM_TOKENS\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"owner\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"spender\",\n type: \"address\",\n },\n ],\n name: \"allowance\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"spender\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n ],\n name: \"approve\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"account\",\n type: \"address\",\n },\n ],\n name: \"balanceOf\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"decimals\",\n outputs: [\n {\n internalType: \"uint8\",\n name: \"\",\n type: \"uint8\",\n },\n ],\n stateMutability: \"pure\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"spender\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"subtractedValue\",\n type: \"uint256\",\n },\n ],\n name: \"decreaseAllowance\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"index\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"minVirtualAmount\",\n type: \"uint256\",\n },\n ],\n name: \"deposit\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"depositRewards\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"index\",\n type: \"uint256\",\n },\n ],\n name: \"getEstimatedAmountOnDeposit\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"index\",\n type: \"uint256\",\n },\n ],\n name: \"getRewardsAmount\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"user\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"virtualAmount\",\n type: \"uint256\",\n },\n ],\n name: \"getWithdrawProportionAmount\",\n outputs: [\n {\n internalType: \"uint256[4]\",\n name: \"\",\n type: \"uint256[4]\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"spender\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"addedValue\",\n type: \"uint256\",\n },\n ],\n name: \"increaseAllowance\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"name\",\n outputs: [\n {\n internalType: \"string\",\n name: \"\",\n type: \"string\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"owner\",\n outputs: [\n {\n internalType: \"address\",\n name: \"\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n name: \"pools\",\n outputs: [\n {\n internalType: \"contract IPool\",\n name: \"\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"renounceOwnership\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"index\",\n type: \"uint256\",\n },\n {\n internalType: \"contract IPool\",\n name: \"pool\",\n type: \"address\",\n },\n ],\n name: \"setPool\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"account\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"index\",\n type: \"uint256\",\n },\n ],\n name: \"subBalanceOf\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"index\",\n type: \"uint256\",\n },\n ],\n name: \"subDepositRewards\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"index\",\n type: \"uint256\",\n },\n ],\n name: \"subTotalSupply\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"index\",\n type: \"uint256\",\n },\n ],\n name: \"subTransfer\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"from\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"index\",\n type: \"uint256\",\n },\n ],\n name: \"subTransferFrom\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"virtualAmount\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"index\",\n type: \"uint256\",\n },\n ],\n name: \"subWithdraw\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"symbol\",\n outputs: [\n {\n internalType: \"string\",\n name: \"\",\n type: \"string\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n name: \"tokens\",\n outputs: [\n {\n internalType: \"contract IERC20\",\n name: \"\",\n type: \"address\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"totalSupply\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n ],\n name: \"transfer\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"from\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n ],\n name: \"transferFrom\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"newOwner\",\n type: \"address\",\n },\n ],\n name: \"transferOwnership\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"uint256\",\n name: \"virtualAmount\",\n type: \"uint256\",\n },\n ],\n name: \"withdraw\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n stateMutability: \"payable\",\n type: \"receive\",\n },\n ],\n} as const;\nexport default artifact;\n", "import { ChainType } from \"../../../chains/chain.enums\";\nimport { AllbridgeCoreClient } from \"../../../client/core-api/core-client-base\";\nimport { RawTransaction } from \"../../models\";\nimport {\n YieldBalanceParams,\n YieldDepositParams,\n YieldGetEstimatedAmountOnDepositParams,\n YieldGetWithdrawProportionAmountParams,\n YieldWithdrawParams,\n} from \"./yield.model\";\n\nexport abstract class ChainYieldService {\n abstract chainType: ChainType;\n abstract api: AllbridgeCoreClient;\n\n abstract balanceOf(params: YieldBalanceParams): Promise<string>;\n\n abstract getEstimatedAmountOnDeposit(params: YieldGetEstimatedAmountOnDepositParams): Promise<string>;\n\n abstract getWithdrawProportionAmount(params: YieldGetWithdrawProportionAmountParams): Promise<string[]>;\n\n abstract buildRawTransactionDeposit(params: YieldDepositParams): Promise<RawTransaction>;\n\n abstract buildRawTransactionWithdraw(params: YieldWithdrawParams): Promise<RawTransaction>;\n}\n", "import { Contract } from \"web3\";\nimport { ChainType } from \"../../../chains/chain.enums\";\nimport { AllbridgeCoreClient } from \"../../../client/core-api/core-client-base\";\nimport { convertFloatAmountToInt, convertIntAmountToFloat } from \"../../../utils/calculation\";\nimport { SYSTEM_PRECISION } from \"../../../utils/calculation/constants\";\nimport { EssentialWeb3, RawTransaction } from \"../../models\";\nimport Yield from \"../../models/abi/PortfolioToken\";\nimport {\n ChainYieldService,\n YieldBalanceParams,\n YieldDepositParams,\n YieldGetEstimatedAmountOnDepositParams,\n YieldGetWithdrawProportionAmountParams,\n YieldWithdrawParams,\n} from \"../models\";\n\nexport class EvmYieldService extends ChainYieldService {\n chainType: ChainType.EVM = ChainType.EVM;\n\n constructor(\n public web3: EssentialWeb3,\n public api: AllbridgeCoreClient\n ) {\n super();\n }\n\n async balanceOf(params: YieldBalanceParams): Promise<string> {\n const vCYD = (\n await this.getYieldContract(params.token.yieldAddress).methods.balanceOf(params.owner).call()\n ).toString();\n return convertIntAmountToFloat(vCYD, SYSTEM_PRECISION).toFixed();\n }\n\n async getEstimatedAmountOnDeposit(params: YieldGetEstimatedAmountOnDepositParams): Promise<string> {\n const amountInt = convertFloatAmountToInt(params.amount, params.token.decimals).toFixed();\n const resultInt = (\n await this.getYieldContract(params.token.yieldAddress)\n .methods.getEstimatedAmountOnDeposit(amountInt, params.token.yieldId)\n .call()\n ).toString();\n return convertIntAmountToFloat(resultInt, SYSTEM_PRECISION).toFixed();\n }\n\n async getWithdrawProportionAmount(params: YieldGetWithdrawProportionAmountParams): Promise<string[]> {\n const amountInt = convertFloatAmountToInt(params.amount, SYSTEM_PRECISION).toFixed();\n return await this.getYieldContract(params.cydToken.yieldAddress)\n .methods.getWithdrawProportionAmount(params.owner, amountInt)\n .call();\n }\n\n async buildRawTransactionDeposit(params: YieldDepositParams): Promise<RawTransaction> {\n return Promise.resolve({\n ...this.buildTxParams({ owner: params.owner, yieldAddress: params.token.yieldAddress }),\n data: this.getYieldContract(params.token.yieldAddress)\n .methods.deposit(params.amount, params.token.yieldId, params.minVirtualAmount)\n .encodeABI(),\n });\n }\n\n async buildRawTransactionWithdraw(params: YieldWithdrawParams): Promise<RawTransaction> {\n return Promise.resolve({\n ...this.buildTxParams({ owner: params.owner, yieldAddress: params.token.yieldAddress }),\n data: this.getYieldContract(params.token.yieldAddress).methods.withdraw(params.amount).encodeABI(),\n });\n }\n\n buildTxParams(params: { owner: string; yieldAddress: string }) {\n return {\n from: params.owner,\n to: params.yieldAddress,\n value: \"0\",\n };\n }\n\n private getYieldContract(contractAddress: string) {\n return new this.web3.eth.Contract(Yield.abi, contractAddress) as Contract<typeof Yield.abi>;\n }\n}\n", "import { NodeRpcUrlsConfig } from \"..\";\nimport { AllbridgeCoreClient } from \"../../client/core-api/core-client-base\";\nimport { AllbridgeCoreSdkOptions } from \"../../index\";\nimport { convertFloatAmountToInt } from \"../../utils/calculation\";\nimport { SYSTEM_PRECISION } from \"../../utils/calculation/constants\";\nimport { validateAmountDecimals, validateAmountGtZero } from \"../../utils/utils\";\nimport { Provider, RawTransaction } from \"../models\";\nimport { TokenService } from \"../token\";\nimport { YieldApproveParams, YieldDepositParams, YieldWithdrawParams } from \"./models/yield.model\";\nimport { getChainYieldService } from \"./index\";\n\nexport interface RawYieldTransactionBuilder {\n /**\n * Creates a Raw Transaction for approving tokens usage by the Yield\n * @param approveData\n * @param provider - will be used to access the network\n */\n approve(approveData: YieldApproveParams, provider?: Provider): Promise<RawTransaction>;\n\n /**\n * Creates a Raw Transaction for depositing tokens to Yield\n * @param params\n * @param provider - will be used to access the network\n */\n deposit(params: YieldDepositParams, provider?: Provider): Promise<RawTransaction>;\n\n /**\n * Creates a Raw Transaction for withdrawing tokens from Yield\n * @param params\n * @param provider - will be used to access the network\n */\n withdraw(params: YieldWithdrawParams, provider?: Provider): Promise<RawTransaction>;\n}\n\nexport class DefaultRawYieldTransactionBuilder implements RawYieldTransactionBuilder {\n constructor(\n private api: AllbridgeCoreClient,\n private nodeRpcUrlsConfig: NodeRpcUrlsConfig,\n private params: AllbridgeCoreSdkOptions,\n private tokenService: TokenService\n ) {}\n\n async approve(approveData: YieldApproveParams, provider?: Provider): Promise<RawTransaction> {\n return this.tokenService.buildRawTransactionApprove(\n {\n ...approveData,\n spender: approveData.token.yieldAddress,\n },\n provider\n );\n }\n\n async deposit(params: YieldDepositParams, provider?: Provider): Promise<RawTransaction> {\n validateAmountGtZero(params.amount);\n validateAmountDecimals(\"amount\", params.amount, params.token.decimals);\n validateAmountGtZero(params.minVirtualAmount);\n validateAmountDecimals(\"minVirtualAmount\", params.minVirtualAmount, 3);\n params.amount = convertFloatAmountToInt(params.amount, params.token.decimals).toFixed();\n params.minVirtualAmount = convertFloatAmountToInt(params.minVirtualAmount, 3).toFixed();\n return getChainYieldService(\n params.token.chainSymbol,\n this.api,\n this.nodeRpcUrlsConfig,\n params.owner,\n provider\n ).buildRawTransactionDeposit(params);\n }\n\n async withdraw(params: YieldWithdrawParams, provider?: Provider): Promise<RawTransaction> {\n validateAmountGtZero(params.amount);\n validateAmountDecimals(\"amount\", params.amount, SYSTEM_PRECISION);\n params.amount = convertFloatAmountToInt(params.amount, SYSTEM_PRECISION).toFixed();\n return getChainYieldService(\n params.token.chainSymbol,\n this.api,\n this.nodeRpcUrlsConfig,\n params.owner,\n provider\n ).buildRawTransactionWithdraw(params);\n }\n}\n", "import { TronWeb } from \"tronweb\";\nimport { ChainType } from \"../../../chains/chain.enums\";\nimport { AllbridgeCoreClient } from \"../../../client/core-api/core-client-base\";\nimport { SdkError } from \"../../../exceptions\";\nimport { convertFloatAmountToInt, convertIntAmountToFloat } from \"../../../utils/calculation\";\nimport { SYSTEM_PRECISION } from \"../../../utils/calculation/constants\";\nimport { RawTransaction, SmartContractMethodParameter } from \"../../models\";\nimport Yield from \"../../models/abi/PortfolioToken\";\nimport {\n ChainYieldService,\n YieldBalanceParams,\n YieldDepositParams,\n YieldGetEstimatedAmountOnDepositParams,\n YieldGetWithdrawProportionAmountParams,\n YieldWithdrawParams,\n} from \"../models\";\n\nexport class TronYieldService extends ChainYieldService {\n chainType: ChainType.TRX = ChainType.TRX;\n\n constructor(\n public tronWeb: TronWeb,\n public api: AllbridgeCoreClient\n ) {\n super();\n }\n\n async balanceOf(params: YieldBalanceParams): Promise<string> {\n const vCYD = (\n await (await this.getContract(params.token.yieldAddress)).methods.balanceOf(params.owner).call()\n ).toString();\n return convertIntAmountToFloat(vCYD, SYSTEM_PRECISION).toFixed();\n }\n\n async getEstimatedAmountOnDeposit(params: YieldGetEstimatedAmountOnDepositParams): Promise<string> {\n const amountInt = convertFloatAmountToInt(params.amount, params.token.decimals).toFixed();\n const resultInt = (\n await (await this.getContract(params.token.yieldAddress)).methods\n .getEstimatedAmountOnDeposit(amountInt, params.token.yieldId)\n .call()\n ).toString();\n return convertIntAmountToFloat(resultInt, SYSTEM_PRECISION).toFixed();\n }\n\n async getWithdrawProportionAmount(params: YieldGetWithdrawProportionAmountParams): Promise<string[]> {\n const amountInt = convertFloatAmountToInt(params.amount, SYSTEM_PRECISION).toFixed();\n const result = await (await this.getContract(params.cydToken.yieldAddress)).methods\n .getWithdrawProportionAmount(params.owner, amountInt)\n .call();\n return result.toString().split(\",\");\n }\n\n async buildRawTransactionDeposit(params: YieldDepositParams): Promise<RawTransaction> {\n const { amount, owner, token, minVirtualAmount } = params;\n const parameter = [\n { type: \"uint256\", value: amount },\n { type: \"uint256\", value: token.yieldId },\n { type: \"uint256\", value: minVirtualAmount },\n ];\n const methodSignature = \"deposit(uint256,uint256,uint256)\";\n\n return this.buildRawTransaction(params.token.yieldAddress, methodSignature, parameter, \"0\", owner);\n }\n\n async buildRawTransactionWithdraw(params: YieldWithdrawParams): Promise<RawTransaction> {\n const { amount, owner } = params;\n\n const parameter = [{ type: \"uint256\", value: amount }];\n const methodSignature = \"withdraw(uint256)\";\n\n return this.buildRawTransaction(params.token.yieldAddress, methodSignature, parameter, \"0\", owner);\n }\n\n private async buildRawTransaction(\n contractAddress: string,\n methodSignature: string,\n parameter: SmartContractMethodParameter[],\n value: string,\n fromAddress: string\n ): Promise<RawTransaction> {\n const transactionObject = await this.tronWeb.transactionBuilder.triggerSmartContract(\n contractAddress,\n methodSignature,\n {\n callValue: +value,\n },\n parameter,\n fromAddress\n );\n if (!transactionObject?.result?.result) {\n throw new SdkError(\"Unknown error: \" + JSON.stringify(transactionObject, null, 2));\n }\n return transactionObject.transaction;\n }\n\n private getContract(contractAddress: string): any {\n return this.tronWeb.contract(Yield.abi, contractAddress);\n }\n}\n", "import { YieldDoesNotSupportedError } from \"../../exceptions\";\nimport { TokenWithChainDetails } from \"../../tokens-info\";\nimport { TokenWithChainDetailsYield } from \"./models\";\n\n/**\n * Assert that token is supported by Yield,</br>\n * asserts token is TokenWithChainDetailsYield</br>\n * throws {@link YieldDoesNotSupportedError} if not\n * @param token\n */\nexport function assertYieldIsSupported(token: TokenWithChainDetails): asserts token is TokenWithChainDetailsYield {\n if (!isYieldSupported(token)) {\n throw new YieldDoesNotSupportedError(\"Token does not support Yield\");\n }\n}\n\n/**\n * is Yield support\n * @param token\n * @return isYieldSupported\n */\nexport function isYieldSupported(token: TokenWithChainDetails): token is TokenWithChainDetailsYield {\n return !!token.yieldAddress && token.yieldId !== undefined;\n}\n", "import { Big, BigSource } from \"big.js\";\nimport { PoolInfo, Token } from \"../../tokens-info\";\nimport { fromSystemPrecision, getY, toSystemPrecision } from \"./index\";\n\nexport interface SwapPoolInfo {\n decimals: number;\n feeShare: string;\n poolInfo: PoolInfo;\n}\n\nexport interface SwapAndBridgeCalculationData {\n swapToVUsdCalcResult: SwapToVUsdCalcResult;\n swapFromVUsdCalcResult: SwapFromVUsdCalcResult;\n}\n\nexport interface SwapToVUsdCalcResult {\n bridgeFeeInTokenPrecision: string;\n amountIncludingCommissionInSystemPrecision: string;\n amountExcludingCommissionInSystemPrecision: string;\n}\nexport interface SwapFromVUsdCalcResult {\n bridgeFeeInTokenPrecision: string;\n amountIncludingCommissionInTokenPrecision: string;\n amountExcludingCommissionInTokenPrecision: string;\n}\n\nexport function swapAndBridgeFeeCalculation(\n amountInTokenPrecision: string,\n sourcePoolInfo: SwapPoolInfo,\n destinationPoolInfo: SwapPoolInfo\n): SwapAndBridgeCalculationData {\n const swapToVUsdCalcResult = swapToVUsd(\n amountInTokenPrecision,\n { decimals: sourcePoolInfo.decimals, feeShare: sourcePoolInfo.feeShare },\n sourcePoolInfo.poolInfo\n );\n const swapFromVUsdCalcResult = swapFromVUsd(\n swapToVUsdCalcResult.amountIncludingCommissionInSystemPrecision,\n { decimals: destinationPoolInfo.decimals, feeShare: destinationPoolInfo.feeShare },\n destinationPoolInfo.poolInfo\n );\n return { swapToVUsdCalcResult, swapFromVUsdCalcResult };\n}\n\nexport function swapAndBridgeFeeCalculationReverse(\n amountInTokenPrecision: string,\n sourcePoolInfo: SwapPoolInfo,\n destinationPoolInfo: SwapPoolInfo\n): SwapAndBridgeCalculationData {\n const swapToVUsdCalcResult = swapToVUsdReverse(\n amountInTokenPrecision,\n { decimals: destinationPoolInfo.decimals, feeShare: destinationPoolInfo.feeShare },\n destinationPoolInfo.poolInfo\n );\n const swapFromVUsdCalcResult = swapFromVUsdReverse(\n swapToVUsdCalcResult.amountIncludingCommissionInSystemPrecision,\n { decimals: sourcePoolInfo.decimals, feeShare: sourcePoolInfo.feeShare },\n sourcePoolInfo.poolInfo\n );\n return {\n swapToVUsdCalcResult,\n swapFromVUsdCalcResult,\n };\n}\n\nfunction swapToVUsd(\n amount: BigSource,\n { feeShare, decimals }: Pick<Token, \"feeShare\" | \"decimals\">,\n poolInfo: Omit<PoolInfo, \"p\" | \"imbalance\">\n): SwapToVUsdCalcResult {\n const amountValue = Big(amount);\n const fee = amountValue.times(feeShare);\n const amountWithoutFee = amountValue.minus(fee);\n return {\n bridgeFeeInTokenPrecision: fee.round().toFixed(),\n amountIncludingCommissionInSystemPrecision: calcSwapToVUsd(toSystemPrecision(amountWithoutFee, decimals), poolInfo),\n amountExcludingCommissionInSystemPrecision: calcSwapToVUsd(toSystemPrecision(amountValue, decimals), poolInfo),\n };\n}\n\nfunction calcSwapToVUsd(amountInSystemPrecision: Big, poolInfo: Omit<PoolInfo, \"p\" | \"imbalance\">): string {\n if (amountInSystemPrecision.eq(0)) {\n return \"0\";\n }\n const tokenBalance = Big(poolInfo.tokenBalance).plus(amountInSystemPrecision);\n const vUsdNewAmount = getY(tokenBalance.toFixed(), poolInfo.aValue, poolInfo.dValue);\n return Big(poolInfo.vUsdBalance).minus(vUsdNewAmount).round().toFixed();\n}\n\nfunction swapFromVUsd(\n amount: BigSource,\n { feeShare, decimals }: Pick<Token, \"feeShare\" | \"decimals\">,\n poolInfo: Omit<PoolInfo, \"imbalance\">\n): SwapFromVUsdCalcResult {\n if (Big(amount).eq(0)) {\n return {\n bridgeFeeInTokenPrecision: \"0\",\n amountIncludingCommissionInTokenPrecision: \"0\",\n amountExcludingCommissionInTokenPrecision: \"0\",\n };\n }\n const amountValue = Big(amount);\n const vUsdBalance = amountValue.plus(poolInfo.vUsdBalance);\n const newAmount = getY(vUsdBalance, poolInfo.aValue, poolInfo.dValue);\n const result = fromSystemPrecision(Big(poolInfo.tokenBalance).minus(newAmount), decimals);\n const fee = Big(result).times(feeShare);\n const resultWithoutFee = Big(result).minus(fee).round();\n return {\n bridgeFeeInTokenPrecision: fee.round().toFixed(),\n amountIncludingCommissionInTokenPrecision: resultWithoutFee.toFixed(),\n amountExcludingCommissionInTokenPrecision: result.toFixed(),\n };\n}\n\nfunction swapToVUsdReverse(\n amountInTokenPrecision: BigSource,\n { feeShare, decimals }: Pick<Token, \"feeShare\" | \"decimals\">,\n poolInfo: PoolInfo\n): SwapToVUsdCalcResult {\n const reversedFeeShare = Big(feeShare).div(Big(1).minus(feeShare));\n const fee = Big(amountInTokenPrecision).times(reversedFeeShare);\n const amountWithFee = Big(amountInTokenPrecision).plus(fee);\n return {\n bridgeFeeInTokenPrecision: fee.round().toFixed(),\n amountIncludingCommissionInSystemPrecision: calcSwapToVUsdReverse(\n toSystemPrecision(amountWithFee, decimals),\n poolInfo\n ),\n amountExcludingCommissionInSystemPrecision: calcSwapToVUsdReverse(\n toSystemPrecision(amountInTokenPrecision, decimals),\n poolInfo\n ),\n };\n}\n\nfunction calcSwapToVUsdReverse(amountInSystemPrecision: Big, poolInfo: PoolInfo): string {\n const tokenBalance = Big(poolInfo.tokenBalance).minus(amountInSystemPrecision);\n const vUsdNewAmount = getY(tokenBalance.toFixed(), poolInfo.aValue, poolInfo.dValue);\n return Big(vUsdNewAmount).minus(poolInfo.vUsdBalance).round().toFixed();\n}\n\nfunction swapFromVUsdReverse(\n amountInSystemPrecision: BigSource,\n { feeShare, decimals }: Pick<Token, \"feeShare\" | \"decimals\">,\n poolInfo: PoolInfo\n): SwapFromVUsdCalcResult {\n if (Big(amountInSystemPrecision).eq(0)) {\n return {\n bridgeFeeInTokenPrecision: \"0\",\n amountIncludingCommissionInTokenPrecision: \"0\",\n amountExcludingCommissionInTokenPrecision: \"0\",\n };\n }\n const vUsdNewAmount = Big(poolInfo.vUsdBalance).minus(amountInSystemPrecision);\n const tokenBalance = getY(vUsdNewAmount.toFixed(), poolInfo.aValue, poolInfo.dValue);\n const inSystemPrecision = Big(tokenBalance).minus(poolInfo.tokenBalance);\n const amountWithoutFee = fromSystemPrecision(inSystemPrecision.toFixed(), decimals);\n const reversedFeeShare = Big(feeShare).div(Big(1).minus(feeShare));\n const fee = Big(amountWithoutFee).times(reversedFeeShare);\n const amount = Big(amountWithoutFee).plus(fee);\n return {\n bridgeFeeInTokenPrecision: fee.round().toFixed(),\n amountIncludingCommissionInTokenPrecision: amount.round().toFixed(),\n amountExcludingCommissionInTokenPrecision: amountWithoutFee.toFixed(),\n };\n}\n", "import { Big } from \"big.js\";\nimport { PoolInfo, TokenWithChainDetails } from \"../../tokens-info\";\nimport { convertIntAmountToFloat, fromSystemPrecision, swapFromVUsd, swapToVUsd } from \"./index\";\n\nexport interface SendAmountDetails {\n sourceLPSwap: AmountImpact;\n destLPSwap: AmountImpact;\n}\n\nexport interface AmountImpact {\n fee: string;\n swap: string;\n}\n\nexport function getSendAmountDetails(\n amountInTokenPrecision: string,\n sourceToken: TokenWithChainDetails,\n sourcePool: PoolInfo,\n destToken: TokenWithChainDetails,\n destPool: PoolInfo\n): SendAmountDetails {\n const vUsd = swapToVUsd(amountInTokenPrecision, sourceToken, sourcePool);\n const vUsdInTokenPrecision = fromSystemPrecision(vUsd, sourceToken.decimals);\n const result = swapFromVUsd(vUsd, destToken, destPool);\n\n const swapToFeeInt = Big(amountInTokenPrecision).times(sourceToken.feeShare);\n const swapFromFeeInt = Big(result).div(Big(1).minus(destToken.feeShare)).minus(result);\n return {\n sourceLPSwap: {\n fee: convertIntAmountToFloat(swapToFeeInt, sourceToken.decimals)\n .neg()\n .round(sourceToken.decimals, Big.roundUp)\n .toFixed(),\n swap: convertIntAmountToFloat(\n Big(amountInTokenPrecision).minus(vUsdInTokenPrecision).minus(swapToFeeInt),\n sourceToken.decimals\n )\n .neg()\n .round(sourceToken.decimals, Big.roundUp)\n .toFixed(),\n },\n destLPSwap: {\n fee: convertIntAmountToFloat(swapFromFeeInt, destToken.decimals)\n .neg()\n .round(destToken.decimals, Big.roundUp)\n .toFixed(),\n swap: convertIntAmountToFloat(\n fromSystemPrecision(vUsd, destToken.decimals).minus(result).minus(swapFromFeeInt),\n destToken.decimals\n )\n .neg()\n .round(destToken.decimals, Big.roundUp)\n .toFixed(),\n },\n };\n}\n", "import axios, { Axios } from \"axios\";\nimport { InvalidMessengerOptionError } from \"../../exceptions\";\nimport { ChainDetailsMapWithFlags, PoolInfoMap, PoolKeyObject } from \"../../tokens-info\";\nimport { VERSION } from \"../../version\";\nimport {\n mapChainDetailsResponseToChainDetailsMap,\n mapChainDetailsResponseToPoolInfoMap,\n mapPoolInfoResponseToPoolInfoMap,\n} from \"./core-api-mapper\";\nimport {\n ChainDetailsResponse,\n GasBalanceResponse,\n Messenger,\n PendingInfoResponse,\n PoolInfoResponse,\n ReceiveTransactionCostRequest,\n ReceiveTransactionCostResponse,\n TransferStatusResponse,\n} from \"./core-api.model\";\nimport { AllbridgeCoreClientParams } from \"./core-client-base\";\n\nexport interface TokenInfo {\n chainDetailsMap: ChainDetailsMapWithFlags;\n poolInfoMap: PoolInfoMap;\n}\n\nexport interface ApiClient {\n getTokenInfo(): Promise<TokenInfo>;\n\n getPendingInfo(): Promise<PendingInfoResponse>;\n\n getGasBalance(chainSymbol: string, address: string): Promise<GasBalanceResponse>;\n\n getTransferStatus(chainSymbol: string, txId: string): Promise<TransferStatusResponse>;\n\n getReceiveTransactionCost(args: ReceiveTransactionCostRequest): Promise<ReceiveTransactionCostResponse>;\n\n getPoolInfoMap(pools: PoolKeyObject[] | PoolKeyObject): Promise<PoolInfoMap>;\n}\n\nexport class ApiClientImpl implements ApiClient {\n private api: Axios;\n\n constructor(params: AllbridgeCoreClientParams) {\n this.api = axios.create({\n baseURL: params.coreApiUrl,\n headers: {\n Accept: \"application/json\",\n ...params.coreApiHeaders,\n \"x-Sdk-Agent\": \"AllbridgeCoreSDK/\" + VERSION,\n },\n params: params.coreApiQueryParams,\n });\n }\n\n async getTokenInfo(): Promise<TokenInfo> {\n const { data } = await this.api.get<ChainDetailsResponse>(\"/token-info\", { params: { filter: \"all\" } });\n return {\n chainDetailsMap: mapChainDetailsResponseToChainDetailsMap(data),\n poolInfoMap: mapChainDetailsResponseToPoolInfoMap(data),\n };\n }\n\n async getPendingInfo(): Promise<PendingInfoResponse> {\n const { data } = await this.api.get<PendingInfoResponse>(\"/pending-info\");\n return data;\n }\n\n async getGasBalance(chainSymbol: string, address: string): Promise<GasBalanceResponse> {\n const { data } = await this.api.get<GasBalanceResponse>(`/check/${chainSymbol}/${address}`);\n return data;\n }\n\n async getTransferStatus(chainSymbol: string, txId: string): Promise<TransferStatusResponse> {\n const { data } = await this.api.get<TransferStatusResponse>(`/chain/${chainSymbol}/${txId}`);\n return data;\n }\n\n async getReceiveTransactionCost(args: ReceiveTransactionCostRequest): Promise<ReceiveTransactionCostResponse> {\n if (args.messenger === Messenger.OFT && !args.sourceToken) {\n throw new InvalidMessengerOptionError(\"For OFT sourceToken required\");\n }\n const { data } = await this.api.post<ReceiveTransactionCostResponse>(\"/receive-fee\", args, {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n return {\n exchangeRate: data.exchangeRate,\n fee: data.fee,\n sourceNativeTokenPrice: data.sourceNativeTokenPrice,\n adminFeeShareWithExtras: data.adminFeeShareWithExtras,\n };\n }\n\n async getPoolInfoMap(pools: PoolKeyObject[] | PoolKeyObject): Promise<PoolInfoMap> {\n const poolKeys = pools instanceof Array ? pools : [pools];\n const { data } = await this.api.post<PoolInfoResponse>(\n \"/pool-info\",\n { pools: poolKeys },\n {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n return mapPoolInfoResponseToPoolInfoMap(data);\n }\n}\n", "export const VERSION = \"3.27.2\";\n", "import { Chains } from \"../../chains\";\nimport { ChainSymbol } from \"../../chains/chain.enums\";\nimport {\n ChainDetails,\n ChainDetailsMap,\n ChainDetailsMapWithFlags,\n ChainDetailsWithTokensWithFlags,\n MessengerTransferTime,\n PoolInfoMap,\n PoolKeyObject,\n TokenWithChainDetailsWithFlags,\n TransferTime,\n} from \"../../tokens-info\";\nimport { calculatePoolInfoImbalance } from \"../../utils/calculation\";\nimport {\n ChainDetailsDTO,\n ChainDetailsResponse,\n Messenger,\n MessengerKeyDTO,\n MessengerTransferTimeDTO,\n PoolInfoResponse,\n TokenDTO,\n TransferTimeDTO,\n} from \"./core-api.model\";\n\nexport function mapChainDetailsResponseToChainDetailsMap(response: ChainDetailsResponse): ChainDetailsMapWithFlags {\n return Object.entries(response).reduce<ChainDetailsMapWithFlags>((map, entry) => {\n const chainSymbol = entry[0];\n const chainDetailsDTO = entry[1];\n const chainDetails = mapChainDetailsFromDto(chainSymbol, chainDetailsDTO);\n if (chainDetails) {\n map[chainSymbol] = chainDetails;\n }\n return map;\n }, {});\n}\n\nexport function mapChainDetailsResponseToPoolInfoMap(response: ChainDetailsResponse): PoolInfoMap {\n const poolInfoMap: PoolInfoMap = {};\n for (const [chainSymbolValue, chainDetailsDTO] of Object.entries(response)) {\n const chainSymbol = chainSymbolValue;\n for (const token of chainDetailsDTO.tokens) {\n const poolKey = mapPoolKeyObjectToPoolKey({\n chainSymbol,\n poolAddress: token.poolAddress,\n });\n const imbalance = calculatePoolInfoImbalance(token.poolInfo);\n poolInfoMap[poolKey] = { ...token.poolInfo, imbalance };\n }\n }\n return poolInfoMap;\n}\n\nfunction mapTokenWithChainDetailsFromDto(chainDetails: ChainDetails, dto: TokenDTO): TokenWithChainDetailsWithFlags {\n const { name: chainName, ...chainDetailsWithoutName } = chainDetails;\n const { poolInfo: _poolInfo, ...dtoWithoutPoolInfo } = dto;\n return {\n ...dtoWithoutPoolInfo,\n ...chainDetailsWithoutName,\n chainName,\n };\n}\n\nfunction mapMessengerKeyDtoToMessenger(dto: MessengerKeyDTO): Messenger | null {\n switch (dto) {\n case MessengerKeyDTO.ALLBRIDGE:\n return Messenger.ALLBRIDGE;\n case MessengerKeyDTO.WORMHOLE:\n return Messenger.WORMHOLE;\n case MessengerKeyDTO.CCTP:\n return Messenger.CCTP;\n case MessengerKeyDTO.CCTP_V2:\n return Messenger.CCTP_V2;\n case MessengerKeyDTO.OFT:\n return Messenger.OFT;\n }\n}\n\nfunction mapTransferTimeFromDto(dto: TransferTimeDTO): TransferTime {\n return Object.entries(dto).reduce<TransferTime>((result, [key, value]) => {\n result[key as ChainSymbol] = mapMessengerTransferTimeFromDto(value);\n return result;\n }, {});\n}\n\nfunction mapMessengerTransferTimeFromDto(dto: MessengerTransferTimeDTO): MessengerTransferTime {\n return Object.entries(dto).reduce<MessengerTransferTime>((messengerTransferTime, [key, value]) => {\n const messenger = mapMessengerKeyDtoToMessenger(key as MessengerKeyDTO);\n if (messenger && value != null) {\n messengerTransferTime[messenger] = value;\n }\n return messengerTransferTime;\n }, {});\n}\n\nfunction mapChainDetailsFromDto(chainSymbol: string, dto: ChainDetailsDTO): ChainDetailsWithTokensWithFlags | null {\n const basicChainProperties = Chains.getChainsProperties()[chainSymbol];\n if (!basicChainProperties) {\n return null;\n }\n const chainDetails: ChainDetails = {\n ...basicChainProperties,\n allbridgeChainId: dto.chainId,\n bridgeAddress: dto.bridgeAddress,\n oftBridgeAddress: dto.oftBridgeAddress,\n yieldAddress: dto.yieldAddress,\n transferTime: mapTransferTimeFromDto(dto.transferTime),\n txCostAmount: dto.txCostAmount,\n confirmations: dto.confirmations,\n suiAddresses: dto.suiAddresses,\n };\n return {\n ...chainDetails,\n tokens: dto.tokens.map((tokenDto) => mapTokenWithChainDetailsFromDto(chainDetails, tokenDto)),\n };\n}\n\nexport function mapPoolKeyToPoolKeyObject(poolKey: string): PoolKeyObject {\n const dividerPosition = poolKey.indexOf(\"_\");\n return {\n chainSymbol: poolKey.substring(0, dividerPosition),\n poolAddress: poolKey.substring(dividerPosition + 1),\n };\n}\n\nexport function mapPoolKeyObjectToPoolKey(poolKeyObject: PoolKeyObject): string {\n return poolKeyObject.chainSymbol + \"_\" + poolKeyObject.poolAddress;\n}\n\nexport function mapChainDetailsMapToPoolKeyObjects(chainDetailsMap: ChainDetailsMap): PoolKeyObject[] {\n const result = [];\n for (const [chainSymbolValue, chainDetails] of Object.entries(chainDetailsMap)) {\n const chainSymbol = chainSymbolValue;\n for (const token of chainDetails.tokens) {\n result.push({\n chainSymbol,\n poolAddress: token.poolAddress,\n });\n }\n }\n return result;\n}\n\nexport function mapPoolInfoResponseToPoolInfoMap(responseBody: PoolInfoResponse): PoolInfoMap {\n const poolInfoMap: PoolInfoMap = {};\n for (const [chainSymbolValue, poolInfoByAddress] of Object.entries(responseBody)) {\n const chainSymbol = chainSymbolValue;\n for (const [poolAddress, poolInfo] of Object.entries(poolInfoByAddress)) {\n poolInfo.imbalance = calculatePoolInfoImbalance(poolInfo);\n poolInfoMap[mapPoolKeyObjectToPoolKey({ chainSymbol, poolAddress })] = poolInfo;\n }\n }\n return poolInfoMap;\n}\n", "import Cache from \"timed-cache\";\nimport { PoolInfoMap, PoolKeyObject } from \"../../tokens-info\";\nimport { ApiClient, TokenInfo } from \"./api-client\";\nimport {\n GasBalanceResponse,\n PendingInfoResponse,\n ReceiveTransactionCostRequest,\n ReceiveTransactionCostResponse,\n TransferStatusResponse,\n} from \"./core-api.model\";\n\nconst _20_SECONDS_TTL = 20 * 1000;\nconst _55_SECONDS_TTL = 55 * 1000;\n\nexport class ApiClientCaching implements ApiClient {\n private tokenInfoCache: Cache<Promise<TokenInfo>>;\n private pendingInfoCache: Cache<Promise<PendingInfoResponse>>;\n private gasBalanceCache: Cache<Promise<GasBalanceResponse>>;\n private receivedTransactionCache: Cache<ReceiveTransactionCostResponse>;\n\n constructor(private apiClient: ApiClient) {\n this.tokenInfoCache = new Cache({ defaultTtl: _55_SECONDS_TTL });\n this.receivedTransactionCache = new Cache({ defaultTtl: _20_SECONDS_TTL });\n this.pendingInfoCache = new Cache({ defaultTtl: _20_SECONDS_TTL });\n this.gasBalanceCache = new Cache({ defaultTtl: _20_SECONDS_TTL });\n }\n\n getTokenInfo(): Promise<TokenInfo> {\n const TOKEN_INFO_CACHE_KEY = \"TOKEN_INFO_CACHE_KEY\";\n const tokenInfo = this.tokenInfoCache.get(TOKEN_INFO_CACHE_KEY);\n if (tokenInfo) {\n return tokenInfo;\n }\n const tokenInfoPromise = this.apiClient.getTokenInfo();\n this.tokenInfoCache.put(TOKEN_INFO_CACHE_KEY, tokenInfoPromise);\n return tokenInfoPromise;\n }\n\n async getGasBalance(chainSymbol: string, address: string): Promise<GasBalanceResponse> {\n const GAS_BALANCE_CACHE_KEY = `GAS_BALANCE_${chainSymbol}_${address}`;\n const gasBalance = this.gasBalanceCache.get(GAS_BALANCE_CACHE_KEY);\n if (gasBalance) {\n return gasBalance;\n }\n const gasBalancePromise = this.apiClient.getGasBalance(chainSymbol, address);\n this.gasBalanceCache.put(GAS_BALANCE_CACHE_KEY, gasBalancePromise);\n return gasBalancePromise;\n }\n\n async getPendingInfo(): Promise<PendingInfoResponse> {\n const PENDING_INFO_CACHE_KEY = \"PENDING_INFO_CACHE_KEY\";\n const pendingInfo = this.pendingInfoCache.get(PENDING_INFO_CACHE_KEY);\n if (pendingInfo) {\n return pendingInfo;\n }\n const pendingInfoPromise = this.apiClient.getPendingInfo();\n this.pendingInfoCache.put(PENDING_INFO_CACHE_KEY, pendingInfoPromise);\n return pendingInfoPromise;\n }\n\n async getReceiveTransactionCost(args: ReceiveTransactionCostRequest): Promise<ReceiveTransactionCostResponse> {\n const RECEIVE_TX_COST_KEY = `RECEIVE_TX_COST_${args.sourceChainId}_${args.destinationChainId}_${args.messenger}${args.sourceToken ? \"_\" + args.sourceToken : \"\"}`;\n const transactionCost = this.receivedTransactionCache.get(RECEIVE_TX_COST_KEY);\n if (transactionCost) {\n return transactionCost;\n }\n const fetchedTransactionCost = await this.apiClient.getReceiveTransactionCost(args);\n this.receivedTransactionCache.put(RECEIVE_TX_COST_KEY, fetchedTransactionCost);\n return fetchedTransactionCost;\n }\n\n async getTransferStatus(chainSymbol: string, txId: string): Promise<TransferStatusResponse> {\n return this.apiClient.getTransferStatus(chainSymbol, txId);\n }\n\n async getPoolInfoMap(pools: PoolKeyObject[] | PoolKeyObject): Promise<PoolInfoMap> {\n return this.apiClient.getPoolInfoMap(pools);\n }\n}\n", "import {\n ChainDetailsMapWithFlags,\n PoolInfoMap,\n PoolKeyObject,\n TokenWithChainDetailsWithFlags,\n} from \"../../tokens-info\";\nimport { ApiClient } from \"./api-client\";\nimport {\n GasBalanceResponse,\n PendingInfoResponse,\n ReceiveTransactionCostRequest,\n ReceiveTransactionCostResponse,\n TransferStatusResponse,\n} from \"./core-api.model\";\n\nexport interface AllbridgeCoreClientParams {\n coreApiUrl: string;\n coreApiHeaders?: Record<string, string>;\n coreApiQueryParams?: Record<string, string>;\n}\n\nexport interface AllbridgeCoreClient {\n getPendingInfo(): Promise<PendingInfoResponse>;\n\n getTransferStatus(chainSymbol: string, txId: string): Promise<TransferStatusResponse>;\n\n getReceiveTransactionCost(args: ReceiveTransactionCostRequest): Promise<ReceiveTransactionCostResponse>;\n\n getGasBalance(chainSymbol: string, address: string): Promise<GasBalanceResponse>;\n}\n\nexport interface AllbridgeCoreClientWithTokens extends AllbridgeCoreClient {\n getChainDetailsMap(): Promise<ChainDetailsMapWithFlags>;\n\n tokens(): Promise<TokenWithChainDetailsWithFlags[]>;\n}\n\nexport interface AllbridgeCoreClientWithPoolInfo extends AllbridgeCoreClientWithTokens {\n getChainDetailsMapAndPoolInfoMap(): Promise<{\n chainDetailsMap: ChainDetailsMapWithFlags;\n poolInfoMap: PoolInfoMap;\n }>;\n\n getPoolInfoMap(pools: PoolKeyObject[] | PoolKeyObject): Promise<PoolInfoMap>;\n}\n\nexport class AllbridgeCoreClientImpl implements AllbridgeCoreClientWithPoolInfo {\n constructor(private apiClient: ApiClient) {}\n\n async getChainDetailsMap(): Promise<ChainDetailsMapWithFlags> {\n return (await this.apiClient.getTokenInfo()).chainDetailsMap;\n }\n\n async tokens(): Promise<TokenWithChainDetailsWithFlags[]> {\n const map = await this.getChainDetailsMap();\n return Object.values(map).flatMap((chainDetails) => chainDetails.tokens);\n }\n\n async getPendingInfo(): Promise<PendingInfoResponse> {\n return this.apiClient.getPendingInfo();\n }\n\n async getGasBalance(chainSymbol: string, address: string): Promise<GasBalanceResponse> {\n return this.apiClient.getGasBalance(chainSymbol, address);\n }\n\n async getChainDetailsMapAndPoolInfoMap(): Promise<{\n chainDetailsMap: ChainDetailsMapWithFlags;\n poolInfoMap: PoolInfoMap;\n }> {\n return await this.apiClient.getTokenInfo();\n }\n\n async getTransferStatus(chainSymbol: string, txId: string): Promise<TransferStatusResponse> {\n return await this.apiClient.getTransferStatus(chainSymbol, txId);\n }\n\n async getReceiveTransactionCost(args: ReceiveTransactionCostRequest): Promise<ReceiveTransactionCostResponse> {\n return await this.apiClient.getReceiveTransactionCost(args);\n }\n\n async getPoolInfoMap(pools: PoolKeyObject[] | PoolKeyObject): Promise<PoolInfoMap> {\n return await this.apiClient.getPoolInfoMap(pools);\n }\n}\n", "import { AllbridgeCoreSdkOptions } from \"../../index\";\nimport {\n ChainDetailsMap,\n PoolInfo,\n PoolKeyObject,\n TokenWithChainDetails,\n TokenWithChainDetailsWithFlags,\n} from \"../../tokens-info\";\nimport {\n GasBalanceResponse,\n PendingInfoResponse,\n ReceiveTransactionCostRequest,\n ReceiveTransactionCostResponse,\n TransferStatusResponse,\n} from \"./core-api.model\";\nimport { AllbridgeCoreClient, AllbridgeCoreClientWithTokens } from \"./core-client-base\";\nimport { AllbridgeCoreClientPoolsExt } from \"./core-client-pool-info-caching\";\n\nexport interface AllbridgeCoreClientFiltered extends AllbridgeCoreClient, AllbridgeCoreClientPoolsExt {\n getChainDetailsMap(type: \"swap\" | \"pool\"): Promise<ChainDetailsMap>;\n\n tokens(type: \"swap\" | \"pool\"): Promise<TokenWithChainDetails[]>;\n}\n\nexport class AllbridgeCoreClientFilteredImpl implements AllbridgeCoreClientFiltered {\n private readonly isStaging: boolean;\n\n constructor(\n private client: AllbridgeCoreClientWithTokens & AllbridgeCoreClientPoolsExt,\n params: AllbridgeCoreSdkOptions\n ) {\n this.isStaging = params.coreApiQueryParams?.staging === \"true\";\n }\n\n async getChainDetailsMap(type: \"swap\" | \"pool\"): Promise<ChainDetailsMap> {\n const chainDetailsMapWithFlags = await this.client.getChainDetailsMap();\n const result: ChainDetailsMap = {};\n\n for (const key in chainDetailsMapWithFlags) {\n const chainDetailsWithTokensWithFlag = chainDetailsMapWithFlags[key];\n if (chainDetailsWithTokensWithFlag) {\n result[key] = {\n ...chainDetailsWithTokensWithFlag,\n tokens: filterAndConvertToTokenWithChainDetails(chainDetailsWithTokensWithFlag.tokens, type, this.isStaging),\n };\n }\n }\n return result;\n }\n\n async tokens(type: \"swap\" | \"pool\"): Promise<TokenWithChainDetails[]> {\n return filterAndConvertToTokenWithChainDetails(await this.client.tokens(), type, this.isStaging);\n }\n\n async getPendingInfo(): Promise<PendingInfoResponse> {\n return this.client.getPendingInfo();\n }\n\n async getGasBalance(chainSymbol: string, address: string): Promise<GasBalanceResponse> {\n return this.client.getGasBalance(chainSymbol, address);\n }\n\n async getTransferStatus(chainSymbol: string, txId: string): Promise<TransferStatusResponse> {\n return await this.client.getTransferStatus(chainSymbol, txId);\n }\n\n async getReceiveTransactionCost(args: ReceiveTransactionCostRequest): Promise<ReceiveTransactionCostResponse> {\n return await this.client.getReceiveTransactionCost(args);\n }\n\n cachePut(poolKeyObject: PoolKeyObject, poolInfo: PoolInfo): void {\n return this.client.cachePut(poolKeyObject, poolInfo);\n }\n\n getPoolInfoByKey(poolKeyObject: PoolKeyObject): Promise<PoolInfo> {\n return this.client.getPoolInfoByKey(poolKeyObject);\n }\n\n refreshPoolInfo(poolKeyObjects?: PoolKeyObject | PoolKeyObject[]): Promise<void> {\n return this.client.refreshPoolInfo(poolKeyObjects);\n }\n}\n\nfunction filterAndConvertToTokenWithChainDetails(\n tokens: TokenWithChainDetailsWithFlags[],\n type: \"swap\" | \"pool\",\n isStaging: boolean\n): TokenWithChainDetails[] {\n return tokens.filter((token) => (isStaging ? true : token.flags[type])).map(convertToTokenWithChainDetails);\n}\n\nfunction convertToTokenWithChainDetails(token: TokenWithChainDetailsWithFlags): TokenWithChainDetails {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { flags, ...rest } = token;\n return rest;\n}\n", "import Cache from \"timed-cache\";\nimport { SdkError } from \"../../exceptions\";\nimport {\n ChainDetailsMapWithFlags,\n PoolInfo,\n PoolInfoMap,\n PoolKeyObject,\n TokenWithChainDetailsWithFlags,\n} from \"../../tokens-info\";\nimport { mapChainDetailsMapToPoolKeyObjects, mapPoolKeyObjectToPoolKey } from \"./core-api-mapper\";\nimport {\n GasBalanceResponse,\n PendingInfoResponse,\n ReceiveTransactionCostRequest,\n ReceiveTransactionCostResponse,\n TransferStatusResponse,\n} from \"./core-api.model\";\nimport { AllbridgeCoreClientWithPoolInfo, AllbridgeCoreClientWithTokens } from \"./core-client-base\";\n\nconst _55_SECONDS_TTL = 55 * 1000;\n\nexport interface AllbridgeCoreClientPoolsExt {\n getPoolInfoByKey(poolKeyObject: PoolKeyObject): Promise<PoolInfo>;\n refreshPoolInfo(poolKeyObjects?: PoolKeyObject | PoolKeyObject[]): Promise<void>;\n cachePut(poolKeyObject: PoolKeyObject, poolInfo: PoolInfo): void;\n}\n\nexport class AllbridgeCoreClientPoolInfoCaching implements AllbridgeCoreClientWithTokens, AllbridgeCoreClientPoolsExt {\n private readonly poolInfoCache;\n\n constructor(private readonly client: AllbridgeCoreClientWithPoolInfo) {\n this.poolInfoCache = new PoolInfoCache();\n }\n\n async getChainDetailsMap(): Promise<ChainDetailsMapWithFlags> {\n const result = await this.client.getChainDetailsMapAndPoolInfoMap();\n return result.chainDetailsMap;\n }\n\n async tokens(): Promise<TokenWithChainDetailsWithFlags[]> {\n return await this.client.tokens();\n }\n\n getTransferStatus(chainSymbol: string, txId: string): Promise<TransferStatusResponse> {\n return this.client.getTransferStatus(chainSymbol, txId);\n }\n\n getReceiveTransactionCost(args: ReceiveTransactionCostRequest): Promise<ReceiveTransactionCostResponse> {\n return this.client.getReceiveTransactionCost(args);\n }\n\n getPendingInfo(): Promise<PendingInfoResponse> {\n return this.client.getPendingInfo();\n }\n\n getGasBalance(chainSymbol: string, address: string): Promise<GasBalanceResponse> {\n return this.client.getGasBalance(chainSymbol, address);\n }\n\n async getPoolInfoByKey(poolKeyObject: PoolKeyObject): Promise<PoolInfo> {\n this.poolInfoCache.putAllIfNotExists((await this.client.getChainDetailsMapAndPoolInfoMap()).poolInfoMap);\n const poolInfo = this.poolInfoCache.get(poolKeyObject);\n\n if (poolInfo) {\n return poolInfo;\n } else {\n const poolInfoMap = await this.client.getPoolInfoMap(poolKeyObject);\n this.poolInfoCache.putAll(poolInfoMap);\n const result = poolInfoMap[mapPoolKeyObjectToPoolKey(poolKeyObject)];\n if (result) {\n return result;\n }\n throw new SdkError(\n \"Cannot find pool info for \" + poolKeyObject.poolAddress + \" on chain \" + poolKeyObject.chainSymbol\n );\n }\n }\n\n async refreshPoolInfo(poolKeyObjects?: PoolKeyObject | PoolKeyObject[]): Promise<void> {\n let poolInfoMap;\n if (poolKeyObjects) {\n this.poolInfoCache.putAllIfNotExists((await this.client.getChainDetailsMapAndPoolInfoMap()).poolInfoMap);\n poolInfoMap = await this.client.getPoolInfoMap(poolKeyObjects);\n } else {\n const result = await this.client.getChainDetailsMapAndPoolInfoMap();\n poolInfoMap = await this.client.getPoolInfoMap(mapChainDetailsMapToPoolKeyObjects(result.chainDetailsMap));\n }\n this.poolInfoCache.putAll(poolInfoMap);\n }\n\n cachePut(poolKeyObject: PoolKeyObject, poolInfo: PoolInfo): void {\n this.poolInfoCache.put(mapPoolKeyObjectToPoolKey(poolKeyObject), poolInfo);\n }\n}\n\nclass PoolInfoCache {\n private cache;\n\n constructor() {\n this.cache = new Cache<PoolInfo>({ defaultTtl: _55_SECONDS_TTL });\n }\n\n putAll(poolInfoMap: PoolInfoMap) {\n for (const [key, value] of Object.entries(poolInfoMap)) {\n this.cache.put(key, value);\n }\n }\n\n putAllIfNotExists(poolInfoMap: PoolInfoMap) {\n for (const [key, value] of Object.entries(poolInfoMap)) {\n if (!this.cache.get(key)) {\n this.cache.put(key, value);\n }\n }\n }\n\n put(key: string, poolInfo: PoolInfo) {\n this.cache.put(key, poolInfo);\n }\n\n get(poolKeyObject: PoolKeyObject): PoolInfo | undefined {\n const key = mapPoolKeyObjectToPoolKey(poolKeyObject);\n return this.cache.get(key);\n }\n}\n", "import { Big } from \"big.js\";\nimport { TronWeb } from \"tronweb\";\nimport { Web3 } from \"web3\";\nimport { Chains } from \"../../chains\";\nimport { AllbridgeCoreClient } from \"../../client/core-api/core-client-base\";\nimport { AllbridgeCoreSdkOptions, ChainType, EssentialWeb3 } from \"../../index\";\nimport { AmountFormat, AmountFormatted } from \"../../models\";\nimport { convertFloatAmountToInt, convertIntAmountToFloat } from \"../../utils/calculation\";\nimport { validateAmountDecimals, validateAmountGtZero } from \"../../utils/utils\";\nimport { GetNativeTokenBalanceParams } from \"../bridge/models\";\nimport { NodeRpcUrlsConfig } from \"../index\";\nimport { Provider, RawTransaction, TransactionResponse } from \"../models\";\nimport { EvmTokenService } from \"./evm\";\nimport {\n ApproveParams,\n ApproveParamsDto,\n CheckAllowanceParams,\n CheckAllowanceParamsDto,\n GetAllowanceParams,\n GetTokenBalanceParams,\n ChainTokenService,\n} from \"./models\";\nimport { SolanaTokenService } from \"./sol\";\nimport { SrbTokenService } from \"./srb\";\nimport { SuiTokenService } from \"./sui\";\nimport { TronTokenService } from \"./trx\";\n\nexport interface TokenService {\n getAllowance(params: GetAllowanceParams, provider?: Provider): Promise<string>;\n\n checkAllowance(params: CheckAllowanceParams, provider?: Provider): Promise<boolean>;\n\n approve(provider: Provider, approveData: ApproveParams): Promise<TransactionResponse>;\n\n buildRawTransactionApprove(approveData: ApproveParams, provider?: Provider): Promise<RawTransaction>;\n\n getTokenBalance(params: GetTokenBalanceParams, provider?: Provider): Promise<string>;\n\n getNativeTokenBalance(params: GetNativeTokenBalanceParams, provider?: Provider): Promise<AmountFormatted>;\n}\n\nexport class DefaultTokenService implements TokenService {\n constructor(\n readonly api: AllbridgeCoreClient,\n readonly nodeRpcUrlsConfig: NodeRpcUrlsConfig,\n readonly params: AllbridgeCoreSdkOptions\n ) {}\n\n async getAllowance(params: GetAllowanceParams, provider?: Provider): Promise<string> {\n const allowanceInt = await this.getChainTokenService(params.token.chainSymbol, params.owner, provider).getAllowance(\n params\n );\n return convertIntAmountToFloat(allowanceInt, params.token.decimals).toFixed();\n }\n\n async checkAllowance(params: CheckAllowanceParams, provider?: Provider): Promise<boolean> {\n validateAmountGtZero(params.amount);\n validateAmountDecimals(\"amount\", params.amount, params.token.decimals);\n return this.getChainTokenService(params.token.chainSymbol, params.owner, provider).checkAllowance(\n this.prepareCheckAllowanceParams(params)\n );\n }\n\n async approve(provider: Provider, approveData: ApproveParams): Promise<TransactionResponse> {\n if (approveData.amount) {\n validateAmountGtZero(approveData.amount);\n validateAmountDecimals(\"amount\", approveData.amount, approveData.token.decimals);\n }\n return this.getChainTokenService(approveData.token.chainSymbol, approveData.owner, provider).approve(\n this.prepareApproveParams(approveData)\n );\n }\n\n async buildRawTransactionApprove(approveData: ApproveParams, provider?: Provider): Promise<RawTransaction> {\n if (approveData.amount) {\n validateAmountGtZero(approveData.amount);\n validateAmountDecimals(\"amount\", approveData.amount, approveData.token.decimals);\n }\n return this.getChainTokenService(\n approveData.token.chainSymbol,\n approveData.owner,\n provider\n ).buildRawTransactionApprove(this.prepareApproveParams(approveData));\n }\n\n async getTokenBalance(params: GetTokenBalanceParams, provider?: Provider): Promise<string> {\n const tokenBalance = await this.getChainTokenService(\n params.token.chainSymbol,\n params.account,\n provider\n ).getTokenBalance(params);\n if (params.token.decimals) {\n return convertIntAmountToFloat(tokenBalance, params.token.decimals).toFixed();\n }\n return tokenBalance;\n }\n\n async getNativeTokenBalance(params: GetNativeTokenBalanceParams, provider?: Provider): Promise<AmountFormatted> {\n const tokenBalance = await this.getChainTokenService(\n params.chainSymbol,\n params.account,\n provider\n ).getNativeTokenBalance(params);\n return {\n [AmountFormat.INT]: tokenBalance,\n [AmountFormat.FLOAT]: convertIntAmountToFloat(\n tokenBalance,\n Chains.getChainDecimalsByType(Chains.getChainProperty(params.chainSymbol).chainType)\n ).toFixed(),\n };\n }\n\n private getChainTokenService(chainSymbol: string, ownerAddress: string, provider?: Provider): ChainTokenService {\n switch (Chains.getChainProperty(chainSymbol).chainType) {\n case ChainType.EVM: {\n if (provider) {\n return new EvmTokenService(provider as EssentialWeb3, this.api);\n } else {\n const nodeRpcUrl = this.nodeRpcUrlsConfig.getNodeRpcUrl(chainSymbol);\n return new EvmTokenService(new Web3(nodeRpcUrl), this.api);\n }\n }\n case ChainType.TRX: {\n if (provider) {\n return new TronTokenService(provider as TronWeb, this.api);\n } else {\n const nodeRpcUrl = this.nodeRpcUrlsConfig.getNodeRpcUrl(chainSymbol);\n const tronWeb = new TronWeb({ fullHost: nodeRpcUrl });\n tronWeb.setAddress(ownerAddress);\n return new TronTokenService(tronWeb, this.api);\n }\n }\n case ChainType.SOLANA: {\n const nodeRpcUrl = this.nodeRpcUrlsConfig.getNodeRpcUrl(chainSymbol);\n return new SolanaTokenService(nodeRpcUrl, this.api);\n }\n case ChainType.SRB: {\n return new SrbTokenService(this.nodeRpcUrlsConfig, this.params, this.api);\n }\n case ChainType.SUI: {\n return new SuiTokenService(this.nodeRpcUrlsConfig.getNodeRpcUrl(chainSymbol), this.api);\n }\n }\n }\n\n prepareCheckAllowanceParams(params: CheckAllowanceParams): CheckAllowanceParamsDto {\n return {\n ...params,\n amount: convertFloatAmountToInt(params.amount, params.token.decimals),\n };\n }\n\n private prepareApproveParams(approveData: ApproveParams): ApproveParamsDto {\n return {\n tokenAddress: approveData.token.tokenAddress,\n owner: approveData.owner,\n spender: approveData.spender,\n chainSymbol: approveData.token.chainSymbol,\n amount: approveData.amount == undefined ? undefined : Big(approveData.amount).toFixed(),\n };\n }\n}\n", "const artifact = {\n abi: [\n {\n inputs: [\n {\n internalType: \"string\",\n name: \"name_\",\n type: \"string\",\n },\n {\n internalType: \"string\",\n name: \"symbol_\",\n type: \"string\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"constructor\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"owner\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"spender\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"value\",\n type: \"uint256\",\n },\n ],\n name: \"Approval\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"from\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"value\",\n type: \"uint256\",\n },\n ],\n name: \"Transfer\",\n type: \"event\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"owner\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"spender\",\n type: \"address\",\n },\n ],\n name: \"allowance\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"spender\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n ],\n name: \"approve\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"account\",\n type: \"address\",\n },\n ],\n name: \"balanceOf\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"decimals\",\n outputs: [\n {\n internalType: \"uint8\",\n name: \"\",\n type: \"uint8\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"spender\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"subtractedValue\",\n type: \"uint256\",\n },\n ],\n name: \"decreaseAllowance\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"spender\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"addedValue\",\n type: \"uint256\",\n },\n ],\n name: \"increaseAllowance\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"name\",\n outputs: [\n {\n internalType: \"string\",\n name: \"\",\n type: \"string\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"symbol\",\n outputs: [\n {\n internalType: \"string\",\n name: \"\",\n type: \"string\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"totalSupply\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n ],\n name: \"transfer\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n internalType: \"address\",\n name: \"from\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"amount\",\n type: \"uint256\",\n },\n ],\n name: \"transferFrom\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n ],\n} as const;\nexport default artifact;\n", "import { Big } from \"big.js\";\nimport { ChainType } from \"../../../chains/chain.enums\";\nimport { AllbridgeCoreClient } from \"../../../client/core-api/core-client-base\";\nimport { GetNativeTokenBalanceParams } from \"../../bridge/models\";\nimport { RawTransaction, TransactionResponse } from \"../../models\";\nimport { ApproveParamsDto, CheckAllowanceParamsDto, GetAllowanceParamsDto, GetTokenBalanceParams } from \"./token.model\";\n\nexport abstract class ChainTokenService {\n abstract chainType: ChainType;\n abstract api: AllbridgeCoreClient;\n\n abstract getTokenBalance(params: GetTokenBalanceParams): Promise<string>;\n\n abstract getNativeTokenBalance(params: GetNativeTokenBalanceParams): Promise<string>;\n\n abstract getAllowance(params: GetAllowanceParamsDto): Promise<string>;\n\n async checkAllowance(params: CheckAllowanceParamsDto): Promise<boolean> {\n const allowance = await this.getAllowance(params);\n return Big(allowance).gte(Big(params.amount));\n }\n\n abstract approve(params: ApproveParamsDto): Promise<TransactionResponse>;\n\n abstract buildRawTransactionApprove(params: ApproveParamsDto): Promise<RawTransaction>;\n}\n", "import BN from \"bn.js\";\nimport { Contract, Transaction as Web3Transaction } from \"web3\";\nimport { ChainSymbol, ChainType } from \"../../../chains/chain.enums\";\nimport { AllbridgeCoreClient } from \"../../../client/core-api/core-client-base\";\nimport { GetTokenBalanceParams, EssentialWeb3, TransactionResponse } from \"../../../models\";\nimport { GetNativeTokenBalanceParams } from \"../../bridge/models\";\nimport { RawTransaction } from \"../../models\";\nimport ERC20 from \"../../models/abi/ERC20\";\nimport { amountToHex } from \"../../utils\";\nimport { ApproveParamsDto, GetAllowanceParamsDto, ChainTokenService } from \"../models\";\n\nexport const MAX_AMOUNT = \"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\";\n\nconst USDT_TOKEN_ADDRESS = \"0xdac17f958d2ee523a2206206994597c13d831ec7\";\nconst POLYGON_GAS_LIMIT = 100_000;\n\nexport class EvmTokenService extends ChainTokenService {\n chainType: ChainType.EVM = ChainType.EVM;\n\n constructor(\n public web3: EssentialWeb3,\n public api: AllbridgeCoreClient\n ) {\n super();\n }\n\n getAllowance(params: GetAllowanceParamsDto): Promise<string> {\n const tokenAddress = params.token.tokenAddress;\n const owner = params.owner;\n const spender = params.spender;\n return this.getAllowanceByTokenAddress(tokenAddress, owner, spender);\n }\n\n getAllowanceByTokenAddress(tokenAddress: string, owner: string, spender: string): Promise<string> {\n const tokenContract = this.getERC20Contract(tokenAddress);\n return tokenContract.methods.allowance(owner, spender).call();\n }\n\n async getTokenBalance(params: GetTokenBalanceParams): Promise<string> {\n return await this.getERC20Contract(params.token.tokenAddress).methods.balanceOf(params.account).call();\n }\n\n async getNativeTokenBalance(params: GetNativeTokenBalanceParams): Promise<string> {\n return (await this.web3.eth.getBalance(params.account)).toString();\n }\n\n async approve(params: ApproveParamsDto): Promise<TransactionResponse> {\n if (this.isUsdt(params.tokenAddress)) {\n const allowance = await this.getAllowanceByTokenAddress(params.tokenAddress, params.owner, params.spender);\n if (allowance !== \"0\") {\n const rawTransaction = await this.buildRawTransactionApprove({\n ...params,\n amount: \"0\",\n });\n await this.sendRawTransaction(rawTransaction, params.chainSymbol);\n }\n }\n const rawTransaction = await this.buildRawTransactionApprove(params);\n return await this.sendRawTransaction(rawTransaction, params.chainSymbol);\n }\n\n isUsdt(tokenAddress: string): boolean {\n return tokenAddress.toLowerCase() === USDT_TOKEN_ADDRESS;\n }\n\n buildRawTransactionApprove(params: ApproveParamsDto): Promise<RawTransaction> {\n const { tokenAddress, spender, owner, amount } = params;\n const tokenContract = this.getERC20Contract(tokenAddress);\n\n const approveMethod = tokenContract.methods.approve(\n spender,\n amount == undefined ? MAX_AMOUNT : amountToHex(amount)\n );\n\n return Promise.resolve({\n from: owner,\n to: tokenAddress,\n value: \"0\",\n data: approveMethod.encodeABI(),\n });\n }\n\n private async sendRawTransaction(rawTransaction: RawTransaction, chainSymbol: string) {\n const transactionConfig: Web3Transaction = rawTransaction as Web3Transaction;\n // prettier-ignore\n const feeOptions: {\n maxPriorityFeePerGas?: number | string | BN;\n maxFeePerGas?: number | string | BN\n } = {maxPriorityFeePerGas: undefined, maxFeePerGas: undefined};\n if ((chainSymbol as ChainSymbol) === ChainSymbol.POL) {\n transactionConfig.gas = POLYGON_GAS_LIMIT;\n } else {\n transactionConfig.gas = await this.web3.eth.estimateGas(rawTransaction as Web3Transaction);\n }\n const { transactionHash } = await this.web3.eth.sendTransaction({\n ...transactionConfig,\n ...feeOptions,\n } as Web3Transaction);\n return { txId: transactionHash.toString() };\n }\n\n private getERC20Contract(contractAddress: string) {\n return new this.web3.eth.Contract(ERC20.abi, contractAddress) as Contract<typeof ERC20.abi>;\n }\n}\n", "/* eslint-disable @typescript-eslint/no-unused-vars */\nimport { AnchorProvider, Provider } from \"@project-serum/anchor\";\nimport { Connection, PublicKey } from \"@solana/web3.js\";\nimport { ChainType } from \"../../../chains/chain.enums\";\nimport { AllbridgeCoreClient } from \"../../../client/core-api/core-client-base\";\nimport { MethodNotSupportedError } from \"../../../exceptions\";\nimport { GetNativeTokenBalanceParams } from \"../../bridge/models\";\nimport { RawTransaction, TransactionResponse } from \"../../models\";\nimport { getTokenAccountData } from \"../../utils/sol\";\nimport { getAssociatedAccount } from \"../../utils/sol/accounts\";\nimport { ApproveParamsDto, GetAllowanceParamsDto, GetTokenBalanceParams } from \"../models\";\nimport { ChainTokenService } from \"../models/token\";\n\nexport class SolanaTokenService extends ChainTokenService {\n chainType: ChainType.SOLANA = ChainType.SOLANA;\n\n constructor(\n public solanaRpcUrl: string,\n public api: AllbridgeCoreClient\n ) {\n super();\n }\n\n approve(params: ApproveParamsDto): Promise<TransactionResponse> {\n throw new MethodNotSupportedError();\n }\n\n buildRawTransactionApprove(params: ApproveParamsDto): Promise<RawTransaction> {\n throw new MethodNotSupportedError();\n }\n\n private buildAnchorProvider(accountAddress: string): Provider {\n const connection = new Connection(this.solanaRpcUrl, \"confirmed\");\n\n const publicKey = new PublicKey(accountAddress);\n\n return new AnchorProvider(\n connection,\n // @ts-expect-error enough wallet for fetch actions\n { publicKey: publicKey },\n {\n preflightCommitment: \"confirmed\",\n commitment: \"confirmed\",\n }\n );\n }\n\n getAllowance(params: GetAllowanceParamsDto): Promise<string> {\n throw new MethodNotSupportedError();\n }\n\n async getTokenBalance(params: GetTokenBalanceParams): Promise<string> {\n const { account, token } = params;\n try {\n const associatedAccount = await getAssociatedAccount(new PublicKey(account), new PublicKey(token.tokenAddress));\n const accountData = await getTokenAccountData(associatedAccount, this.buildAnchorProvider(account));\n return accountData.amount.toString();\n } catch (e) {\n if (e instanceof Error) {\n e.message.startsWith(\"Account does not exist\");\n return \"0\";\n }\n throw e;\n }\n }\n\n async getNativeTokenBalance(params: GetNativeTokenBalanceParams): Promise<string> {\n return (\n await this.buildAnchorProvider(params.account).connection.getBalance(new PublicKey(params.account))\n ).toString();\n }\n}\n", "import { Horizon, NotFoundError } from \"@stellar/stellar-sdk\";\nimport { Chains } from \"../../../chains\";\nimport { ChainSymbol } from \"../../../chains/chain.enums\";\nimport { AllbridgeCoreClient } from \"../../../client/core-api/core-client-base\";\nimport { AllbridgeCoreSdkOptions, ChainType, SdkError } from \"../../../index\";\nimport { GetTokenBalanceParams, MethodNotSupportedError, TransactionResponse } from \"../../../models\";\nimport { convertFloatAmountToInt } from \"../../../utils/calculation\";\nimport { GetNativeTokenBalanceParams } from \"../../bridge/models\";\nimport { NodeRpcUrlsConfig } from \"../../index\";\nimport { RawTransaction } from \"../../models\";\nimport { ChainTokenService } from \"../models\";\n\nimport BalanceLineAsset = Horizon.HorizonApi.BalanceLineAsset;\nimport BalanceLineNative = Horizon.HorizonApi.BalanceLineNative;\n\nexport class SrbTokenService extends ChainTokenService {\n chainType: ChainType.SRB = ChainType.SRB;\n\n constructor(\n readonly nodeRpcUrlsConfig: NodeRpcUrlsConfig,\n readonly params: AllbridgeCoreSdkOptions,\n readonly api: AllbridgeCoreClient\n ) {\n super();\n }\n\n getAllowance(): Promise<string> {\n throw new MethodNotSupportedError();\n }\n\n async getTokenBalance(params: GetTokenBalanceParams): Promise<string> {\n if (!params.token.originTokenAddress) {\n throw new SdkError(\"OriginTokenAddress missing\");\n }\n const [symbol, srbTokenAddress] = params.token.originTokenAddress.split(\":\");\n\n const stellar = new Horizon.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl(ChainSymbol.STLR));\n let stellarAccount;\n try {\n stellarAccount = await stellar.loadAccount(params.account);\n } catch (err) {\n if (err instanceof NotFoundError) {\n return \"0\";\n }\n throw err;\n }\n const balances = stellarAccount.balances;\n\n const balanceInfo = balances.find(\n (balance): balance is BalanceLineAsset =>\n (balance.asset_type === \"credit_alphanum4\" || balance.asset_type === \"credit_alphanum12\") &&\n balance.asset_code == symbol &&\n balance.asset_issuer == srbTokenAddress\n );\n if (balanceInfo?.balance) {\n return convertFloatAmountToInt(\n balanceInfo.balance,\n Chains.getChainDecimalsByType(Chains.getChainProperty(params.token.chainSymbol).chainType)\n ).toFixed();\n }\n return \"0\";\n }\n\n async getNativeTokenBalance(params: GetNativeTokenBalanceParams): Promise<string> {\n const stellar = new Horizon.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl(ChainSymbol.STLR));\n const stellarAccount = await stellar.loadAccount(params.account);\n const balances = stellarAccount.balances;\n\n const nativeBalance = balances.find((balance): balance is BalanceLineNative => balance.asset_type === \"native\");\n if (nativeBalance?.balance) {\n return convertFloatAmountToInt(\n nativeBalance.balance,\n Chains.getChainDecimalsByType(Chains.getChainProperty(params.chainSymbol).chainType)\n ).toFixed();\n }\n return \"0\";\n }\n\n approve(): Promise<TransactionResponse> {\n throw new MethodNotSupportedError();\n }\n\n buildRawTransactionApprove(): Promise<RawTransaction> {\n throw new MethodNotSupportedError();\n }\n}\n", "/* eslint-disable @typescript-eslint/no-unused-vars */\nimport { SuiClient } from \"@mysten/sui/client\";\nimport { CoinStruct } from \"@mysten/sui/src/client/types/generated\";\nimport { ChainType } from \"../../../chains/chain.enums\";\nimport { AllbridgeCoreClient } from \"../../../client/core-api/core-client-base\";\nimport { MethodNotSupportedError, SdkError } from \"../../../exceptions\";\nimport { GetNativeTokenBalanceParams } from \"../../bridge/models\";\nimport { RawTransaction, TransactionResponse } from \"../../models\";\nimport { fetchAllPagesRecursive } from \"../../utils/sui/paginated\";\nimport { ApproveParamsDto, ChainTokenService, GetAllowanceParamsDto, GetTokenBalanceParams } from \"../models\";\n\nexport class SuiTokenService extends ChainTokenService {\n chainType: ChainType.SUI = ChainType.SUI;\n private suiClient: SuiClient;\n\n constructor(\n public suiRpcUrl: string,\n public api: AllbridgeCoreClient\n ) {\n super();\n this.suiClient = new SuiClient({\n url: this.suiRpcUrl,\n });\n }\n\n approve(params: ApproveParamsDto): Promise<TransactionResponse> {\n throw new MethodNotSupportedError();\n }\n\n buildRawTransactionApprove(params: ApproveParamsDto): Promise<RawTransaction> {\n throw new MethodNotSupportedError();\n }\n\n getAllowance(params: GetAllowanceParamsDto): Promise<string> {\n throw new MethodNotSupportedError();\n }\n\n async getTokenBalance(params: GetTokenBalanceParams): Promise<string> {\n if (!params.token.originTokenAddress) {\n throw new SdkError(\"SUI token must contain 'originTokenAddress'\");\n }\n const balance = await this.suiClient.getBalance({\n owner: params.account,\n coinType: params.token.originTokenAddress,\n });\n return balance.totalBalance;\n }\n\n async getNativeTokenBalance(params: GetNativeTokenBalanceParams): Promise<string> {\n const coinsData: CoinStruct[] = await fetchAllPagesRecursive((cursor: string | null | undefined) =>\n this.suiClient.getCoins({\n owner: params.account,\n cursor,\n })\n );\n if (coinsData.length === 0) {\n return \"0\";\n }\n return coinsData.reduce((total, element) => total + BigInt(element.balance), BigInt(0)).toString();\n }\n}\n", "import { TronWeb } from \"tronweb\";\nimport { AllbridgeCoreClient } from \"../../../client/core-api/core-client-base\";\nimport { SdkError } from \"../../../exceptions\";\nimport { ChainType, GetTokenBalanceParams, TransactionResponse } from \"../../../models\";\nimport { GetNativeTokenBalanceParams } from \"../../bridge/models\";\nimport { RawTransaction, SmartContractMethodParameter } from \"../../models\";\nimport ERC20 from \"../../models/abi/ERC20\";\nimport { amountToHex } from \"../../utils\";\nimport { sendRawTransaction } from \"../../utils/trx\";\nimport { ApproveParamsDto, GetAllowanceParamsDto } from \"../models\";\nimport { ChainTokenService } from \"../models/token\";\n\nexport const MAX_AMOUNT = \"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\";\n\nexport class TronTokenService extends ChainTokenService {\n chainType: ChainType.TRX = ChainType.TRX;\n\n constructor(\n public tronWeb: TronWeb,\n public api: AllbridgeCoreClient\n ) {\n super();\n }\n\n async getAllowance(params: GetAllowanceParamsDto): Promise<string> {\n const {\n token: { tokenAddress },\n owner,\n } = params;\n const tokenContract = await this.getContract(tokenAddress);\n const allowance = await tokenContract.methods.allowance(owner, params.spender).call();\n return allowance.toString();\n }\n\n async getTokenBalance(params: GetTokenBalanceParams): Promise<string> {\n const contract = await this.getContract(params.token.tokenAddress);\n const balance = await contract.balanceOf(params.account).call();\n return balance.toString();\n }\n\n async getNativeTokenBalance(params: GetNativeTokenBalanceParams): Promise<string> {\n return (await this.tronWeb.trx.getBalance(params.account)).toString();\n }\n\n async approve(params: ApproveParamsDto): Promise<TransactionResponse> {\n const rawTransaction = await this.buildRawTransactionApprove(params);\n return await sendRawTransaction(this.tronWeb, rawTransaction);\n }\n\n async buildRawTransactionApprove(params: ApproveParamsDto): Promise<RawTransaction> {\n const { tokenAddress, spender, owner, amount } = params;\n const amountHex = amount == undefined ? MAX_AMOUNT : amountToHex(amount);\n\n const parameter = [\n { type: \"address\", value: spender },\n { type: \"uint256\", value: amountHex },\n ];\n const value = \"0\";\n const methodSignature = \"approve(address,uint256)\";\n return this.buildRawTransaction(tokenAddress, methodSignature, parameter, value, owner);\n }\n\n private getContract(contractAddress: string): any {\n return this.tronWeb.contract(ERC20.abi, contractAddress);\n }\n\n private async buildRawTransaction(\n contractAddress: string,\n methodSignature: string,\n parameters: SmartContractMethodParameter[],\n value: string,\n fromAddress: string\n ): Promise<RawTransaction> {\n const transactionObject = await this.tronWeb.transactionBuilder.triggerSmartContract(\n contractAddress,\n methodSignature,\n {\n callValue: +value,\n },\n parameters,\n fromAddress\n );\n if (!transactionObject?.result?.result) {\n throw new SdkError(\"Unknown error: \" + JSON.stringify(transactionObject, null, 2));\n }\n return transactionObject.transaction;\n }\n}\n", "import { ApiClientImpl } from \"../../client/core-api/api-client\";\nimport { ApiClientCaching } from \"../../client/core-api/api-client-caching\";\nimport { AllbridgeCoreClientImpl } from \"../../client/core-api/core-client-base\";\nimport {\n AllbridgeCoreClientFiltered,\n AllbridgeCoreClientFilteredImpl,\n} from \"../../client/core-api/core-client-filtered\";\nimport { AllbridgeCoreClientPoolInfoCaching } from \"../../client/core-api/core-client-pool-info-caching\";\nimport { AllbridgeCoreSdkOptions, Provider, RawTransaction } from \"../../index\";\nimport { NodeRpcUrlsConfig } from \"../../services\";\nimport { DefaultTokenService, TokenService } from \"../../services/token\";\nimport { ApproveParams, CheckAllowanceParams, GetAllowanceParams } from \"../../services/token/models\";\n\n/**\n * Contains usefully EVM methods\n */\nexport interface EvmUtils {\n /**\n * Get amount of tokens approved to be sent by the bridge\n * @param params - See {@link GetAllowanceParams}\n * @param provider - optional, will be used to access the network\n * @returns the amount of approved tokens\n */\n getAllowance(params: GetAllowanceParams, provider?: Provider): Promise<string>;\n\n /**\n * Check if the amount of approved tokens is enough to make a transfer\n * @param params - See {@link CheckAllowanceParams}\n * @param provider - optional, will be used to access the network\n * @return true if the amount of approved tokens is enough to make a transfer\n */\n checkAllowance(params: CheckAllowanceParams, provider?: Provider): Promise<boolean>;\n\n /**\n * builds a raw transaction for approving token usage by the specified spender\n * @param approveData - data for approval\n * @param provider - optional, will be used to access the network\n *\n * @return a raw transaction for approving token usage\n */\n buildRawTransactionApprove(approveData: ApproveParams, provider?: Provider): Promise<RawTransaction>;\n}\n\nexport class DefaultEvmUtils implements EvmUtils {\n private readonly api: AllbridgeCoreClientFiltered;\n private readonly tokenService: TokenService;\n\n constructor(\n readonly nodeRpcUrlsConfig: NodeRpcUrlsConfig,\n readonly params: AllbridgeCoreSdkOptions\n ) {\n const apiClient = new ApiClientImpl(params);\n const apiClientCaching = new ApiClientCaching(apiClient);\n const coreClient = new AllbridgeCoreClientImpl(apiClientCaching);\n const coreClientPoolInfoCaching = new AllbridgeCoreClientPoolInfoCaching(coreClient);\n this.api = new AllbridgeCoreClientFilteredImpl(coreClientPoolInfoCaching, params);\n this.tokenService = new DefaultTokenService(this.api, nodeRpcUrlsConfig, params);\n }\n\n buildRawTransactionApprove(approveData: ApproveParams, provider?: Provider): Promise<RawTransaction> {\n return this.tokenService.buildRawTransactionApprove(approveData, provider);\n }\n\n checkAllowance(params: CheckAllowanceParams, provider?: Provider): Promise<boolean> {\n return this.tokenService.checkAllowance(params, provider);\n }\n\n getAllowance(params: GetAllowanceParams, provider?: Provider): Promise<string> {\n return this.tokenService.getAllowance(params, provider);\n }\n}\n", "import { Connection, PublicKey, TransactionMessage, VersionedTransaction } from \"@solana/web3.js\";\nimport { ChainSymbol } from \"../../chains/chain.enums\";\nimport { AllbridgeCoreSdkOptions, SdkError } from \"../../index\";\nimport { NodeRpcUrlsConfig } from \"../../services\";\nimport { fetchAddressLookupTableAccountsFromTx } from \"./utils\";\n\n/**\n * Contains usefully Solana methods\n */\nexport interface SolUtils {\n /**\n * Add memo to solana's transaction\n * @param transaction transaction to add memo\n * @param memo memo to add (28 char max)\n */\n addMemoToTx(transaction: VersionedTransaction, memo: string): Promise<void>;\n}\n\nexport class DefaultSolUtils implements SolUtils {\n constructor(\n readonly nodeRpcUrlsConfig: NodeRpcUrlsConfig,\n readonly params: AllbridgeCoreSdkOptions\n ) {}\n\n async addMemoToTx(transaction: VersionedTransaction, memo: string): Promise<void> {\n if (memo.length > 28) {\n throw new SdkError(\"InvalidArgumentException memo cannot be more than 28 characters\");\n }\n const connection = new Connection(this.nodeRpcUrlsConfig.getNodeRpcUrl(ChainSymbol.SOL), \"confirmed\");\n const addressLookupTableAccounts = await fetchAddressLookupTableAccountsFromTx(transaction, connection);\n const message = TransactionMessage.decompile(transaction.message, {\n addressLookupTableAccounts: addressLookupTableAccounts,\n });\n const lastInstruction = message.instructions[message.instructions.length - 1];\n if (!lastInstruction?.keys) {\n throw new SdkError(\"Last instruction or its keys are invalid.\");\n }\n\n lastInstruction.keys.push({\n pubkey: new PublicKey(Buffer.from(memo)),\n isSigner: false,\n isWritable: false,\n });\n transaction.message = message.compileToV0Message(addressLookupTableAccounts);\n }\n}\n", "import {\n Asset as StellarAsset,\n BASE_FEE,\n contract,\n Horizon,\n Operation,\n Operation as StellarOperation,\n rpc as SorobanRpc,\n TimeoutInfinite,\n Transaction,\n TransactionBuilder,\n TransactionBuilder as StellarTransactionBuilder,\n} from \"@stellar/stellar-sdk\";\nimport { ChainSymbol } from \"../../chains/chain.enums\";\nimport { AllbridgeCoreSdkOptions, SdkError } from \"../../index\";\nimport { NodeRpcUrlsConfig } from \"../../services\";\nimport { TokenContract } from \"../../services/models/srb/token-contract\";\nimport { getViewResultSoroban, isErrorSorobanResult } from \"../../services/models/srb/utils\";\nimport { withExponentialBackoff } from \"../utils\";\nimport ContractClientOptions = contract.ClientOptions;\nimport BalanceLineAsset = Horizon.HorizonApi.BalanceLineAsset;\n\n/**\n * Contains usefully Soroban methods\n */\nexport interface SrbUtils {\n /**\n * Build change Trust line Tx\n * @param params see {@link TrustLineParams}\n * @returns xdr Tx\n */\n buildChangeTrustLineXdrTx(params: TrustLineParams): Promise<string>;\n\n /**\n * Get Balance Line information if exists\n * @param sender\n * @param tokenAddress\n */\n getBalanceLine(sender: string, tokenAddress: string): Promise<Horizon.HorizonApi.BalanceLineAsset | undefined>;\n\n /**\n * Submit tx\n * @param xdrTx\n */\n submitTransactionStellar(xdrTx: string): Promise<Horizon.HorizonApi.SubmitTransactionResponse>;\n\n /**\n * Simulate and check if Restore needed\n * @param xdrTx - restore\n * @param sourceAccount\n * @returns xdrTx restore transaction if it required after check\n */\n simulateAndCheckRestoreTxRequiredSoroban(xdrTx: string, sourceAccount: string): Promise<string | undefined>;\n\n /**\n * Submit tx\n * @param xdrTx\n */\n sendTransactionSoroban(xdrTx: string): Promise<SorobanRpc.Api.SendTransactionResponse>;\n\n /**\n * Confirm tx\n */\n confirmTx(hash: string, secondsToWait?: number): Promise<SorobanRpc.Api.GetTransactionResponse>;\n}\n\nexport interface TrustLineParams {\n /**\n * Float amount of tokens, default is Number.MAX_SAFE_INTEGER\n */\n limit?: string;\n sender: string;\n tokenAddress: string;\n}\n\nconst FEE = 100;\nconst SEND_TRANSACTION_TIMEOUT = 180;\n\nexport class DefaultSrbUtils implements SrbUtils {\n constructor(\n readonly nodeRpcUrlsConfig: NodeRpcUrlsConfig,\n readonly params: AllbridgeCoreSdkOptions\n ) {}\n\n async buildChangeTrustLineXdrTx(params: TrustLineParams): Promise<string> {\n const stellar = new Horizon.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl(ChainSymbol.STLR));\n const stellarAccount = await stellar.loadAccount(params.sender);\n const tokenContract = this.getContract(TokenContract, params.tokenAddress);\n const result = await tokenContract.name();\n if (isErrorSorobanResult(result)) {\n throw new SdkError();\n }\n const tokenName = getViewResultSoroban(result);\n if (!tokenName) {\n throw new SdkError();\n }\n\n const [symbol, srbTokenAddress] = tokenName.split(\":\");\n if (symbol === undefined || srbTokenAddress === undefined) {\n throw new SdkError(`Invalid token name format. Expected format 'symbol:srbTokenAddress'`);\n }\n const asset = new StellarAsset(symbol, srbTokenAddress);\n const changeTrust = StellarOperation.changeTrust({\n asset: asset,\n limit: params.limit,\n });\n\n return new StellarTransactionBuilder(stellarAccount, {\n fee: FEE.toString(10),\n networkPassphrase: this.params.sorobanNetworkPassphrase,\n })\n .addOperation(changeTrust)\n .setTimeout(SEND_TRANSACTION_TIMEOUT)\n .build()\n .toXDR();\n }\n\n async getBalanceLine(sender: string, tokenAddress: string): Promise<Horizon.HorizonApi.BalanceLineAsset | undefined> {\n const tokenContract = this.getContract(TokenContract, tokenAddress);\n const result = await tokenContract.name();\n if (isErrorSorobanResult(result)) {\n throw new SdkError();\n }\n const tokenName = getViewResultSoroban(result);\n if (!tokenName) {\n throw new SdkError();\n }\n\n const [symbol, srbTokenAddress] = tokenName.split(\":\");\n const nodeRpcUrl = this.nodeRpcUrlsConfig.getNodeRpcUrl(ChainSymbol.STLR);\n const stellar = new Horizon.Server(nodeRpcUrl);\n const stellarAccount = await stellar.loadAccount(sender);\n const balanceInfo = stellarAccount.balances;\n\n return balanceInfo.find(\n (balance): balance is BalanceLineAsset =>\n (balance.asset_type === \"credit_alphanum4\" || balance.asset_type === \"credit_alphanum12\") &&\n balance.asset_code == symbol &&\n balance.asset_issuer == srbTokenAddress\n );\n }\n\n async submitTransactionStellar(xdrTx: string): Promise<Horizon.HorizonApi.SubmitTransactionResponse> {\n const stellar = new Horizon.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl(ChainSymbol.STLR));\n const transaction = StellarTransactionBuilder.fromXDR(\n xdrTx,\n this.nodeRpcUrlsConfig.getNodeRpcUrl(ChainSymbol.STLR)\n );\n return await stellar.submitTransaction(transaction);\n }\n\n async simulateAndCheckRestoreTxRequiredSoroban(xdrTx: string, sourceAccount: string): Promise<string | undefined> {\n const server = new SorobanRpc.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl(ChainSymbol.SRB));\n const account = await server.getAccount(sourceAccount);\n const transaction = TransactionBuilder.fromXDR(xdrTx, this.params.sorobanNetworkPassphrase) as Transaction;\n const simulation = await server.simulateTransaction(transaction);\n if (SorobanRpc.Api.isSimulationRestore(simulation)) {\n return new TransactionBuilder(account, {\n fee: (+BASE_FEE + +simulation.restorePreamble.minResourceFee).toString(),\n networkPassphrase: this.params.sorobanNetworkPassphrase,\n })\n .setSorobanData(simulation.restorePreamble.transactionData.build())\n .addOperation(Operation.restoreFootprint({}))\n .setTimeout(TimeoutInfinite)\n .build()\n .toXDR();\n }\n return undefined;\n }\n\n async sendTransactionSoroban(xdrTx: string): Promise<SorobanRpc.Api.SendTransactionResponse> {\n const server = new SorobanRpc.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl(ChainSymbol.SRB));\n const transaction = TransactionBuilder.fromXDR(xdrTx, this.params.sorobanNetworkPassphrase) as Transaction;\n return server.sendTransaction(transaction);\n }\n\n async confirmTx(hash: string, secondsToWait = 15): Promise<SorobanRpc.Api.GetTransactionResponse> {\n const server = new SorobanRpc.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl(ChainSymbol.SRB));\n const getTransactionResponseAll = await withExponentialBackoff(\n () => server.getTransaction(hash),\n (resp) => resp.status === SorobanRpc.Api.GetTransactionStatus.NOT_FOUND,\n secondsToWait\n );\n\n if (getTransactionResponseAll.length === 0) {\n throw new SdkError(\"No transaction responses found.\");\n }\n\n const lastResponse = getTransactionResponseAll[getTransactionResponseAll.length - 1];\n if (!lastResponse) {\n throw new SdkError(\"Unexpected error: last response is undefined.\");\n }\n\n return lastResponse;\n }\n\n private getContract<T>(contract: new (args: ContractClientOptions) => T, address: string): T {\n const config: ContractClientOptions = {\n contractId: address,\n networkPassphrase: this.params.sorobanNetworkPassphrase,\n rpcUrl: this.nodeRpcUrlsConfig.getNodeRpcUrl(ChainSymbol.SRB),\n };\n return new contract(config);\n }\n}\n", "import { contract } from \"@stellar/stellar-sdk\";\nimport u32 = contract.u32;\nimport i128 = contract.i128;\nimport AssembledTransaction = contract.AssembledTransaction;\nimport ContractSpec = contract.Spec;\nimport ContractClient = contract.Client;\nimport ContractClientOptions = contract.ClientOptions;\nexport const Errors = {};\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging\nexport interface TokenContract {\n /**\n * Construct and simulate a allowance transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. *\n * Returns the allowance for `spender` to transfer from `from`.\n *\n * The amount returned is the amount that spender is allowed to transfer\n * out of from's balance. When the spender transfers amounts, the allowance\n * will be reduced by the amount transfered.\n *\n * # Arguments\n *\n * * `from` - The address holding the balance of tokens to be drawn from.\n * * `spender` - The address spending the tokens held by `from`.\n */\n allowance: (\n { from, spender }: { from: string; spender: string },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<i128>>;\n\n /**\n * Construct and simulate a authorized transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. *\n * Returns true if `id` is authorized to use its balance.\n *\n * # Arguments\n *\n * * `id` - The address for which token authorization is being checked.\n */\n authorized: (\n { id }: { id: string },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<boolean>>;\n\n /**\n * Construct and simulate a approve transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. *\n * Set the allowance by `amount` for `spender` to transfer/burn from\n * `from`.\n *\n * The amount set is the amount that spender is approved to transfer out of\n * from's balance. The spender will be allowed to transfer amounts, and\n * when an amount is transferred the allowance will be reduced by the\n * amount transfered.\n *\n * # Arguments\n *\n * * `from` - The address holding the balance of tokens to be drawn from.\n * * `spender` - The address being authorized to spend the tokens held by\n * `from`.\n * * `amount` - The tokens to be made available to `spender`.\n * * `expiration_ledger` - The ledger number where this allowance expires. Cannot\n * be less than the current ledger number unless the amount is being set to 0.\n * An expired entry (where expiration_ledger < the current ledger number)\n * should be treated as a 0 amount allowance.\n *\n * # Events\n *\n * Emits an event with topics `[\"approve\", from: Address,\n * spender: Address], data = [amount: i128, expiration_ledger: u32]`\n */\n approve: (\n {\n from,\n spender,\n amount,\n expiration_ledger,\n }: {\n from: string;\n spender: string;\n amount: i128;\n expiration_ledger: u32;\n },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<null>>;\n\n /**\n * Construct and simulate a balance transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. *\n * Returns the balance of `id`.\n *\n * # Arguments\n *\n * * `id` - The address for which a balance is being queried. If the\n * address has no existing balance, returns 0.\n */\n balance: (\n { id }: { id: string },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<i128>>;\n\n /**\n * Construct and simulate a burn transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. *\n * Burn `amount` from `from`.\n *\n * Reduces from's balance by the amount, without transferring the balance\n * to another holder's balance.\n *\n * # Arguments\n *\n * * `from` - The address holding the balance of tokens which will be\n * burned from.\n * * `amount` - The amount of tokens to be burned.\n *\n * # Events\n *\n * Emits an event with topics `[\"burn\", from: Address], data = [amount:\n * i128]`\n */\n burn: (\n { from, amount }: { from: string; amount: i128 },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<null>>;\n\n /**\n * Construct and simulate a burn_from transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. *\n * Burn `amount` from `from`, consuming the allowance of `spender`.\n *\n * Reduces from's balance by the amount, without transferring the balance\n * to another holder's balance.\n *\n * The spender will be allowed to burn the amount from from's balance, if\n * the amount is less than or equal to the allowance that the spender has\n * on the from's balance. The spender's allowance on from's balance will be\n * reduced by the amount.\n *\n * # Arguments\n *\n * * `spender` - The address authorizing the burn, and having its allowance\n * consumed during the burn.\n * * `from` - The address holding the balance of tokens which will be\n * burned from.\n * * `amount` - The amount of tokens to be burned.\n *\n * # Events\n *\n * Emits an event with topics `[\"burn\", from: Address], data = [amount:\n * i128]`\n */\n burn_from: (\n { spender, from, amount }: { spender: string; from: string; amount: i128 },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<null>>;\n\n /**\n * Construct and simulate a clawback transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. *\n * Clawback `amount` from `from` account. `amount` is burned in the\n * clawback process.\n *\n * # Arguments\n *\n * * `from` - The address holding the balance from which the clawback will\n * take tokens.\n * * `amount` - The amount of tokens to be clawed back.\n *\n * # Events\n *\n * Emits an event with topics `[\"clawback\", admin: Address, to: Address],\n * data = [amount: i128]`\n */\n clawback: (\n { from, amount }: { from: string; amount: i128 },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<null>>;\n\n /**\n * Construct and simulate a decimals transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. *\n * Returns the number of decimals used to represent amounts of this token.\n *\n * # Panics\n *\n * If the contract has not yet been initialized.\n */\n decimals: (options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }) => Promise<AssembledTransaction<u32>>;\n\n /**\n * Construct and simulate a mint transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. *\n * Mints `amount` to `to`.\n *\n * # Arguments\n *\n * * `to` - The address which will receive the minted tokens.\n * * `amount` - The amount of tokens to be minted.\n *\n * # Events\n *\n * Emits an event with topics `[\"mint\", admin: Address, to: Address], data\n * = [amount: i128]`\n */\n mint: (\n { to, amount }: { to: string; amount: i128 },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<null>>;\n\n /**\n * Construct and simulate a name transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. *\n * Returns the name for this token.\n *\n * # Panics\n *\n * If the contract has not yet been initialized.\n */\n name: (options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }) => Promise<AssembledTransaction<string>>;\n\n /**\n * Construct and simulate a set_admin transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. *\n * Sets the administrator to the specified address `new_admin`.\n *\n * # Arguments\n *\n * * `new_admin` - The address which will henceforth be the administrator\n * of this token contract.\n *\n * # Events\n *\n * Emits an event with topics `[\"set_admin\", admin: Address], data =\n * [new_admin: Address]`\n */\n set_admin: (\n { new_admin }: { new_admin: string },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<null>>;\n\n /**\n * Construct and simulate a admin transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. *\n * Returns the admin of the contract.\n *\n * # Panics\n *\n * If the admin is not set.\n */\n admin: (options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }) => Promise<AssembledTransaction<string>>;\n\n /**\n * Construct and simulate a set_authorized transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. *\n * Sets whether the account is authorized to use its balance. If\n * `authorized` is true, `id` should be able to use its balance.\n *\n * # Arguments\n *\n * * `id` - The address being (de-)authorized.\n * * `authorize` - Whether or not `id` can use its balance.\n *\n * # Events\n *\n * Emits an event with topics `[\"set_authorized\", id: Address], data =\n * [authorize: bool]`\n */\n set_authorized: (\n { id, authorize }: { id: string; authorize: boolean },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<null>>;\n\n /**\n * Construct and simulate a symbol transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. *\n * Returns the symbol for this token.\n *\n * # Panics\n *\n * If the contract has not yet been initialized.\n */\n symbol: (options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }) => Promise<AssembledTransaction<string>>;\n\n /**\n * Construct and simulate a transfer transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. *\n * Transfer `amount` from `from` to `to`.\n *\n * # Arguments\n *\n * * `from` - The address holding the balance of tokens which will be\n * withdrawn from.\n * * `to` - The address which will receive the transferred tokens.\n * * `amount` - The amount of tokens to be transferred.\n *\n * # Events\n *\n * Emits an event with topics `[\"transfer\", from: Address, to: Address],\n * data = [amount: i128]`\n */\n transfer: (\n { from, to, amount }: { from: string; to: string; amount: i128 },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<null>>;\n\n /**\n * Construct and simulate a transfer_from transaction. Returns an `AssembledTransaction` object which will have a `result` field containing the result of the simulation. If this transaction changes contract state, you will need to call `signAndSend()` on the returned object. *\n * Transfer `amount` from `from` to `to`, consuming the allowance that\n * `spender` has on `from`'s balance. Authorized by spender\n * (`spender.require_auth()`).\n *\n * The spender will be allowed to transfer the amount from from's balance\n * if the amount is less than or equal to the allowance that the spender\n * has on the from's balance. The spender's allowance on from's balance\n * will be reduced by the amount.\n *\n * # Arguments\n *\n * * `spender` - The address authorizing the transfer, and having its\n * allowance consumed during the transfer.\n * * `from` - The address holding the balance of tokens which will be\n * withdrawn from.\n * * `to` - The address which will receive the transferred tokens.\n * * `amount` - The amount of tokens to be transferred.\n *\n * # Events\n *\n * Emits an event with topics `[\"transfer\", from: Address, to: Address],\n * data = [amount: i128]`\n */\n transfer_from: (\n { spender, from, to, amount }: { spender: string; from: string; to: string; amount: i128 },\n options?: {\n /**\n * The fee to pay for the transaction. Default: BASE_FEE\n */\n fee?: number;\n\n /**\n * The maximum amount of time to wait for the transaction to complete. Default: DEFAULT_TIMEOUT\n */\n timeoutInSeconds?: number;\n\n /**\n * Whether to automatically simulate the transaction when constructing the AssembledTransaction. Default: true\n */\n simulate?: boolean;\n }\n ) => Promise<AssembledTransaction<null>>;\n}\n// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging\nexport class TokenContract extends ContractClient {\n constructor(public readonly options: ContractClientOptions) {\n super(\n new ContractSpec([\n \"AAAAAAAAAYlSZXR1cm5zIHRoZSBhbGxvd2FuY2UgZm9yIGBzcGVuZGVyYCB0byB0cmFuc2ZlciBmcm9tIGBmcm9tYC4KClRoZSBhbW91bnQgcmV0dXJuZWQgaXMgdGhlIGFtb3VudCB0aGF0IHNwZW5kZXIgaXMgYWxsb3dlZCB0byB0cmFuc2ZlcgpvdXQgb2YgZnJvbSdzIGJhbGFuY2UuIFdoZW4gdGhlIHNwZW5kZXIgdHJhbnNmZXJzIGFtb3VudHMsIHRoZSBhbGxvd2FuY2UKd2lsbCBiZSByZWR1Y2VkIGJ5IHRoZSBhbW91bnQgdHJhbnNmZXJlZC4KCiMgQXJndW1lbnRzCgoqIGBmcm9tYCAtIFRoZSBhZGRyZXNzIGhvbGRpbmcgdGhlIGJhbGFuY2Ugb2YgdG9rZW5zIHRvIGJlIGRyYXduIGZyb20uCiogYHNwZW5kZXJgIC0gVGhlIGFkZHJlc3Mgc3BlbmRpbmcgdGhlIHRva2VucyBoZWxkIGJ5IGBmcm9tYC4AAAAAAAAJYWxsb3dhbmNlAAAAAAAAAgAAAAAAAAAEZnJvbQAAABMAAAAAAAAAB3NwZW5kZXIAAAAAEwAAAAEAAAAL\",\n \"AAAAAAAAAIlSZXR1cm5zIHRydWUgaWYgYGlkYCBpcyBhdXRob3JpemVkIHRvIHVzZSBpdHMgYmFsYW5jZS4KCiMgQXJndW1lbnRzCgoqIGBpZGAgLSBUaGUgYWRkcmVzcyBmb3Igd2hpY2ggdG9rZW4gYXV0aG9yaXphdGlvbiBpcyBiZWluZyBjaGVja2VkLgAAAAAAAAphdXRob3JpemVkAAAAAAABAAAAAAAAAAJpZAAAAAAAEwAAAAEAAAAB\",\n \"AAAAAAAAA55TZXQgdGhlIGFsbG93YW5jZSBieSBgYW1vdW50YCBmb3IgYHNwZW5kZXJgIHRvIHRyYW5zZmVyL2J1cm4gZnJvbQpgZnJvbWAuCgpUaGUgYW1vdW50IHNldCBpcyB0aGUgYW1vdW50IHRoYXQgc3BlbmRlciBpcyBhcHByb3ZlZCB0byB0cmFuc2ZlciBvdXQgb2YKZnJvbSdzIGJhbGFuY2UuIFRoZSBzcGVuZGVyIHdpbGwgYmUgYWxsb3dlZCB0byB0cmFuc2ZlciBhbW91bnRzLCBhbmQKd2hlbiBhbiBhbW91bnQgaXMgdHJhbnNmZXJyZWQgdGhlIGFsbG93YW5jZSB3aWxsIGJlIHJlZHVjZWQgYnkgdGhlCmFtb3VudCB0cmFuc2ZlcmVkLgoKIyBBcmd1bWVudHMKCiogYGZyb21gIC0gVGhlIGFkZHJlc3MgaG9sZGluZyB0aGUgYmFsYW5jZSBvZiB0b2tlbnMgdG8gYmUgZHJhd24gZnJvbS4KKiBgc3BlbmRlcmAgLSBUaGUgYWRkcmVzcyBiZWluZyBhdXRob3JpemVkIHRvIHNwZW5kIHRoZSB0b2tlbnMgaGVsZCBieQpgZnJvbWAuCiogYGFtb3VudGAgLSBUaGUgdG9rZW5zIHRvIGJlIG1hZGUgYXZhaWxhYmxlIHRvIGBzcGVuZGVyYC4KKiBgZXhwaXJhdGlvbl9sZWRnZXJgIC0gVGhlIGxlZGdlciBudW1iZXIgd2hlcmUgdGhpcyBhbGxvd2FuY2UgZXhwaXJlcy4gQ2Fubm90CmJlIGxlc3MgdGhhbiB0aGUgY3VycmVudCBsZWRnZXIgbnVtYmVyIHVubGVzcyB0aGUgYW1vdW50IGlzIGJlaW5nIHNldCB0byAwLgpBbiBleHBpcmVkIGVudHJ5ICh3aGVyZSBleHBpcmF0aW9uX2xlZGdlciA8IHRoZSBjdXJyZW50IGxlZGdlciBudW1iZXIpCnNob3VsZCBiZSB0cmVhdGVkIGFzIGEgMCBhbW91bnQgYWxsb3dhbmNlLgoKIyBFdmVudHMKCkVtaXRzIGFuIGV2ZW50IHdpdGggdG9waWNzIGBbImFwcHJvdmUiLCBmcm9tOiBBZGRyZXNzLApzcGVuZGVyOiBBZGRyZXNzXSwgZGF0YSA9IFthbW91bnQ6IGkxMjgsIGV4cGlyYXRpb25fbGVkZ2VyOiB1MzJdYAAAAAAAB2FwcHJvdmUAAAAABAAAAAAAAAAEZnJvbQAAABMAAAAAAAAAB3NwZW5kZXIAAAAAEwAAAAAAAAAGYW1vdW50AAAAAAALAAAAAAAAABFleHBpcmF0aW9uX2xlZGdlcgAAAAAAAAQAAAAA\",\n \"AAAAAAAAAJhSZXR1cm5zIHRoZSBiYWxhbmNlIG9mIGBpZGAuCgojIEFyZ3VtZW50cwoKKiBgaWRgIC0gVGhlIGFkZHJlc3MgZm9yIHdoaWNoIGEgYmFsYW5jZSBpcyBiZWluZyBxdWVyaWVkLiBJZiB0aGUKYWRkcmVzcyBoYXMgbm8gZXhpc3RpbmcgYmFsYW5jZSwgcmV0dXJucyAwLgAAAAdiYWxhbmNlAAAAAAEAAAAAAAAAAmlkAAAAAAATAAAAAQAAAAs=\",\n \"AAAAAAAAAWRCdXJuIGBhbW91bnRgIGZyb20gYGZyb21gLgoKUmVkdWNlcyBmcm9tJ3MgYmFsYW5jZSBieSB0aGUgYW1vdW50LCB3aXRob3V0IHRyYW5zZmVycmluZyB0aGUgYmFsYW5jZQp0byBhbm90aGVyIGhvbGRlcidzIGJhbGFuY2UuCgojIEFyZ3VtZW50cwoKKiBgZnJvbWAgLSBUaGUgYWRkcmVzcyBob2xkaW5nIHRoZSBiYWxhbmNlIG9mIHRva2VucyB3aGljaCB3aWxsIGJlCmJ1cm5lZCBmcm9tLgoqIGBhbW91bnRgIC0gVGhlIGFtb3VudCBvZiB0b2tlbnMgdG8gYmUgYnVybmVkLgoKIyBFdmVudHMKCkVtaXRzIGFuIGV2ZW50IHdpdGggdG9waWNzIGBbImJ1cm4iLCBmcm9tOiBBZGRyZXNzXSwgZGF0YSA9IFthbW91bnQ6CmkxMjhdYAAAAARidXJuAAAAAgAAAAAAAAAEZnJvbQAAABMAAAAAAAAABmFtb3VudAAAAAAACwAAAAA=\",\n \"AAAAAAAAAtxCdXJuIGBhbW91bnRgIGZyb20gYGZyb21gLCBjb25zdW1pbmcgdGhlIGFsbG93YW5jZSBvZiBgc3BlbmRlcmAuCgpSZWR1Y2VzIGZyb20ncyBiYWxhbmNlIGJ5IHRoZSBhbW91bnQsIHdpdGhvdXQgdHJhbnNmZXJyaW5nIHRoZSBiYWxhbmNlCnRvIGFub3RoZXIgaG9sZGVyJ3MgYmFsYW5jZS4KClRoZSBzcGVuZGVyIHdpbGwgYmUgYWxsb3dlZCB0byBidXJuIHRoZSBhbW91bnQgZnJvbSBmcm9tJ3MgYmFsYW5jZSwgaWYKdGhlIGFtb3VudCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGFsbG93YW5jZSB0aGF0IHRoZSBzcGVuZGVyIGhhcwpvbiB0aGUgZnJvbSdzIGJhbGFuY2UuIFRoZSBzcGVuZGVyJ3MgYWxsb3dhbmNlIG9uIGZyb20ncyBiYWxhbmNlIHdpbGwgYmUKcmVkdWNlZCBieSB0aGUgYW1vdW50LgoKIyBBcmd1bWVudHMKCiogYHNwZW5kZXJgIC0gVGhlIGFkZHJlc3MgYXV0aG9yaXppbmcgdGhlIGJ1cm4sIGFuZCBoYXZpbmcgaXRzIGFsbG93YW5jZQpjb25zdW1lZCBkdXJpbmcgdGhlIGJ1cm4uCiogYGZyb21gIC0gVGhlIGFkZHJlc3MgaG9sZGluZyB0aGUgYmFsYW5jZSBvZiB0b2tlbnMgd2hpY2ggd2lsbCBiZQpidXJuZWQgZnJvbS4KKiBgYW1vdW50YCAtIFRoZSBhbW91bnQgb2YgdG9rZW5zIHRvIGJlIGJ1cm5lZC4KCiMgRXZlbnRzCgpFbWl0cyBhbiBldmVudCB3aXRoIHRvcGljcyBgWyJidXJuIiwgZnJvbTogQWRkcmVzc10sIGRhdGEgPSBbYW1vdW50OgppMTI4XWAAAAAJYnVybl9mcm9tAAAAAAAAAwAAAAAAAAAHc3BlbmRlcgAAAAATAAAAAAAAAARmcm9tAAAAEwAAAAAAAAAGYW1vdW50AAAAAAALAAAAAA==\",\n \"AAAAAAAAAVNDbGF3YmFjayBgYW1vdW50YCBmcm9tIGBmcm9tYCBhY2NvdW50LiBgYW1vdW50YCBpcyBidXJuZWQgaW4gdGhlCmNsYXdiYWNrIHByb2Nlc3MuCgojIEFyZ3VtZW50cwoKKiBgZnJvbWAgLSBUaGUgYWRkcmVzcyBob2xkaW5nIHRoZSBiYWxhbmNlIGZyb20gd2hpY2ggdGhlIGNsYXdiYWNrIHdpbGwKdGFrZSB0b2tlbnMuCiogYGFtb3VudGAgLSBUaGUgYW1vdW50IG9mIHRva2VucyB0byBiZSBjbGF3ZWQgYmFjay4KCiMgRXZlbnRzCgpFbWl0cyBhbiBldmVudCB3aXRoIHRvcGljcyBgWyJjbGF3YmFjayIsIGFkbWluOiBBZGRyZXNzLCB0bzogQWRkcmVzc10sCmRhdGEgPSBbYW1vdW50OiBpMTI4XWAAAAAACGNsYXdiYWNrAAAAAgAAAAAAAAAEZnJvbQAAABMAAAAAAAAABmFtb3VudAAAAAAACwAAAAA=\",\n \"AAAAAAAAAIBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGVjaW1hbHMgdXNlZCB0byByZXByZXNlbnQgYW1vdW50cyBvZiB0aGlzIHRva2VuLgoKIyBQYW5pY3MKCklmIHRoZSBjb250cmFjdCBoYXMgbm90IHlldCBiZWVuIGluaXRpYWxpemVkLgAAAAhkZWNpbWFscwAAAAAAAAABAAAABA==\",\n \"AAAAAAAAAPVNaW50cyBgYW1vdW50YCB0byBgdG9gLgoKIyBBcmd1bWVudHMKCiogYHRvYCAtIFRoZSBhZGRyZXNzIHdoaWNoIHdpbGwgcmVjZWl2ZSB0aGUgbWludGVkIHRva2Vucy4KKiBgYW1vdW50YCAtIFRoZSBhbW91bnQgb2YgdG9rZW5zIHRvIGJlIG1pbnRlZC4KCiMgRXZlbnRzCgpFbWl0cyBhbiBldmVudCB3aXRoIHRvcGljcyBgWyJtaW50IiwgYWRtaW46IEFkZHJlc3MsIHRvOiBBZGRyZXNzXSwgZGF0YQo9IFthbW91bnQ6IGkxMjhdYAAAAAAAAARtaW50AAAAAgAAAAAAAAACdG8AAAAAABMAAAAAAAAABmFtb3VudAAAAAAACwAAAAA=\",\n \"AAAAAAAAAFlSZXR1cm5zIHRoZSBuYW1lIGZvciB0aGlzIHRva2VuLgoKIyBQYW5pY3MKCklmIHRoZSBjb250cmFjdCBoYXMgbm90IHlldCBiZWVuIGluaXRpYWxpemVkLgAAAAAAAARuYW1lAAAAAAAAAAEAAAAQ\",\n \"AAAAAAAAAQxTZXRzIHRoZSBhZG1pbmlzdHJhdG9yIHRvIHRoZSBzcGVjaWZpZWQgYWRkcmVzcyBgbmV3X2FkbWluYC4KCiMgQXJndW1lbnRzCgoqIGBuZXdfYWRtaW5gIC0gVGhlIGFkZHJlc3Mgd2hpY2ggd2lsbCBoZW5jZWZvcnRoIGJlIHRoZSBhZG1pbmlzdHJhdG9yCm9mIHRoaXMgdG9rZW4gY29udHJhY3QuCgojIEV2ZW50cwoKRW1pdHMgYW4gZXZlbnQgd2l0aCB0b3BpY3MgYFsic2V0X2FkbWluIiwgYWRtaW46IEFkZHJlc3NdLCBkYXRhID0KW25ld19hZG1pbjogQWRkcmVzc11gAAAACXNldF9hZG1pbgAAAAAAAAEAAAAAAAAACW5ld19hZG1pbgAAAAAAABMAAAAA\",\n \"AAAAAAAAAEZSZXR1cm5zIHRoZSBhZG1pbiBvZiB0aGUgY29udHJhY3QuCgojIFBhbmljcwoKSWYgdGhlIGFkbWluIGlzIG5vdCBzZXQuAAAAAAAFYWRtaW4AAAAAAAAAAAAAAQAAABM=\",\n \"AAAAAAAAAVBTZXRzIHdoZXRoZXIgdGhlIGFjY291bnQgaXMgYXV0aG9yaXplZCB0byB1c2UgaXRzIGJhbGFuY2UuIElmCmBhdXRob3JpemVkYCBpcyB0cnVlLCBgaWRgIHNob3VsZCBiZSBhYmxlIHRvIHVzZSBpdHMgYmFsYW5jZS4KCiMgQXJndW1lbnRzCgoqIGBpZGAgLSBUaGUgYWRkcmVzcyBiZWluZyAoZGUtKWF1dGhvcml6ZWQuCiogYGF1dGhvcml6ZWAgLSBXaGV0aGVyIG9yIG5vdCBgaWRgIGNhbiB1c2UgaXRzIGJhbGFuY2UuCgojIEV2ZW50cwoKRW1pdHMgYW4gZXZlbnQgd2l0aCB0b3BpY3MgYFsic2V0X2F1dGhvcml6ZWQiLCBpZDogQWRkcmVzc10sIGRhdGEgPQpbYXV0aG9yaXplOiBib29sXWAAAAAOc2V0X2F1dGhvcml6ZWQAAAAAAAIAAAAAAAAAAmlkAAAAAAATAAAAAAAAAAlhdXRob3JpemUAAAAAAAABAAAAAA==\",\n \"AAAAAAAAAFtSZXR1cm5zIHRoZSBzeW1ib2wgZm9yIHRoaXMgdG9rZW4uCgojIFBhbmljcwoKSWYgdGhlIGNvbnRyYWN0IGhhcyBub3QgeWV0IGJlZW4gaW5pdGlhbGl6ZWQuAAAAAAZzeW1ib2wAAAAAAAAAAAABAAAAEA==\",\n \"AAAAAAAAAWRUcmFuc2ZlciBgYW1vdW50YCBmcm9tIGBmcm9tYCB0byBgdG9gLgoKIyBBcmd1bWVudHMKCiogYGZyb21gIC0gVGhlIGFkZHJlc3MgaG9sZGluZyB0aGUgYmFsYW5jZSBvZiB0b2tlbnMgd2hpY2ggd2lsbCBiZQp3aXRoZHJhd24gZnJvbS4KKiBgdG9gIC0gVGhlIGFkZHJlc3Mgd2hpY2ggd2lsbCByZWNlaXZlIHRoZSB0cmFuc2ZlcnJlZCB0b2tlbnMuCiogYGFtb3VudGAgLSBUaGUgYW1vdW50IG9mIHRva2VucyB0byBiZSB0cmFuc2ZlcnJlZC4KCiMgRXZlbnRzCgpFbWl0cyBhbiBldmVudCB3aXRoIHRvcGljcyBgWyJ0cmFuc2ZlciIsIGZyb206IEFkZHJlc3MsIHRvOiBBZGRyZXNzXSwKZGF0YSA9IFthbW91bnQ6IGkxMjhdYAAAAAh0cmFuc2ZlcgAAAAMAAAAAAAAABGZyb20AAAATAAAAAAAAAAJ0bwAAAAAAEwAAAAAAAAAGYW1vdW50AAAAAAALAAAAAA==\",\n \"AAAAAAAAAzNUcmFuc2ZlciBgYW1vdW50YCBmcm9tIGBmcm9tYCB0byBgdG9gLCBjb25zdW1pbmcgdGhlIGFsbG93YW5jZSB0aGF0CmBzcGVuZGVyYCBoYXMgb24gYGZyb21gJ3MgYmFsYW5jZS4gQXV0aG9yaXplZCBieSBzcGVuZGVyCihgc3BlbmRlci5yZXF1aXJlX2F1dGgoKWApLgoKVGhlIHNwZW5kZXIgd2lsbCBiZSBhbGxvd2VkIHRvIHRyYW5zZmVyIHRoZSBhbW91bnQgZnJvbSBmcm9tJ3MgYmFsYW5jZQppZiB0aGUgYW1vdW50IGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgYWxsb3dhbmNlIHRoYXQgdGhlIHNwZW5kZXIKaGFzIG9uIHRoZSBmcm9tJ3MgYmFsYW5jZS4gVGhlIHNwZW5kZXIncyBhbGxvd2FuY2Ugb24gZnJvbSdzIGJhbGFuY2UKd2lsbCBiZSByZWR1Y2VkIGJ5IHRoZSBhbW91bnQuCgojIEFyZ3VtZW50cwoKKiBgc3BlbmRlcmAgLSBUaGUgYWRkcmVzcyBhdXRob3JpemluZyB0aGUgdHJhbnNmZXIsIGFuZCBoYXZpbmcgaXRzCmFsbG93YW5jZSBjb25zdW1lZCBkdXJpbmcgdGhlIHRyYW5zZmVyLgoqIGBmcm9tYCAtIFRoZSBhZGRyZXNzIGhvbGRpbmcgdGhlIGJhbGFuY2Ugb2YgdG9rZW5zIHdoaWNoIHdpbGwgYmUKd2l0aGRyYXduIGZyb20uCiogYHRvYCAtIFRoZSBhZGRyZXNzIHdoaWNoIHdpbGwgcmVjZWl2ZSB0aGUgdHJhbnNmZXJyZWQgdG9rZW5zLgoqIGBhbW91bnRgIC0gVGhlIGFtb3VudCBvZiB0b2tlbnMgdG8gYmUgdHJhbnNmZXJyZWQuCgojIEV2ZW50cwoKRW1pdHMgYW4gZXZlbnQgd2l0aCB0b3BpY3MgYFsidHJhbnNmZXIiLCBmcm9tOiBBZGRyZXNzLCB0bzogQWRkcmVzc10sCmRhdGEgPSBbYW1vdW50OiBpMTI4XWAAAAAADXRyYW5zZmVyX2Zyb20AAAAAAAAEAAAAAAAAAAdzcGVuZGVyAAAAABMAAAAAAAAABGZyb20AAAATAAAAAAAAAAJ0bwAAAAAAEwAAAAAAAAAGYW1vdW50AAAAAAALAAAAAA==\",\n ]),\n options\n );\n }\n public readonly fromJSON = {\n allowance: this.txFromJSON<i128>,\n authorized: this.txFromJSON<boolean>,\n approve: this.txFromJSON<null>,\n balance: this.txFromJSON<i128>,\n burn: this.txFromJSON<null>,\n burn_from: this.txFromJSON<null>,\n clawback: this.txFromJSON<null>,\n decimals: this.txFromJSON<u32>,\n mint: this.txFromJSON<null>,\n name: this.txFromJSON<string>,\n set_admin: this.txFromJSON<null>,\n admin: this.txFromJSON<string>,\n set_authorized: this.txFromJSON<null>,\n symbol: this.txFromJSON<string>,\n transfer: this.txFromJSON<null>,\n transfer_from: this.txFromJSON<null>,\n };\n}\n", "import { Transaction, TransactionResult } from \"@mysten/sui/transactions\";\nimport { AllbridgeCoreClient } from \"../../client/core-api/core-client-base\";\nimport { RawSuiTransaction, SendParams } from \"../../index\";\nimport { NodeRpcUrlsConfig } from \"../../services\";\nimport { SuiBridgeService } from \"../../services/bridge/sui\";\n\n/**\n * Contains useful Sui methods\n */\nexport interface SuiUtils {\n buildSendTxFromCustomTx(\n baseTx: string | Uint8Array | Transaction,\n inputCoin: TransactionResult,\n params: SendParams\n ): Promise<RawSuiTransaction>;\n}\n\nexport class DefaultSuiUtils implements SuiUtils {\n private _suiBridgeService: SuiBridgeService | undefined;\n\n constructor(\n readonly nodeRpcUrlsConfig: NodeRpcUrlsConfig,\n readonly api: AllbridgeCoreClient\n ) {}\n\n async buildSendTxFromCustomTx(\n baseTx: string | Uint8Array | Transaction,\n inputCoin: TransactionResult,\n params: SendParams\n ): Promise<RawSuiTransaction> {\n return this.suiBridgeService.buildRawTransactionSendFromCustomTx(baseTx, inputCoin, params);\n }\n\n private get suiBridgeService() {\n if (!this._suiBridgeService) {\n this._suiBridgeService = new SuiBridgeService(this.nodeRpcUrlsConfig, this.api);\n }\n return this._suiBridgeService;\n }\n}\n", "import { AllbridgeCoreSdkService } from \"../services\";\nimport { DefaultEvmUtils, EvmUtils } from \"./evm\";\nimport { DefaultSolUtils, SolUtils } from \"./sol\";\nimport { DefaultSrbUtils, SrbUtils } from \"./srb\";\nimport { DefaultSuiUtils, SuiUtils } from \"./sui\";\n\n/**\n * Contains usefully methods\n */\nexport interface Utils {\n srb: SrbUtils;\n sol: SolUtils;\n sui: SuiUtils;\n evm: EvmUtils;\n}\n\nexport class DefaultUtils implements Utils {\n srb: SrbUtils;\n sol: SolUtils;\n sui: SuiUtils;\n evm: EvmUtils;\n\n constructor(readonly service: AllbridgeCoreSdkService) {\n this.srb = new DefaultSrbUtils(service.nodeRpcUrlsConfig, service.params);\n this.sol = new DefaultSolUtils(service.nodeRpcUrlsConfig, service.params);\n this.sui = new DefaultSuiUtils(service.nodeRpcUrlsConfig, service.api);\n this.evm = new DefaultEvmUtils(service.nodeRpcUrlsConfig, service.params);\n }\n}\n", "export {\n ApproveParams as BridgeApproveParams,\n BaseSendParams,\n CheckAllowanceParams,\n GetAllowanceParams,\n GetTokenBalanceParams,\n SendParams,\n SwapParams,\n GetNativeTokenBalanceParams,\n} from \"../services/bridge/models/bridge.model\";\nexport { BridgeService } from \"../services/bridge/index\";\nexport { CctpParams, CctpDomains } from \"../services/bridge/sol\";\nexport { LiquidityPoolService } from \"../services/liquidity-pool/index\";\nexport {\n Messenger,\n TransferStatusResponse,\n BridgeTransaction,\n GasBalanceResponse,\n CheckAddressResponse,\n AddressStatus,\n} from \"../client/core-api/core-api.model\";\nexport { RawBridgeTransactionBuilder } from \"../services/bridge/raw-bridge-transaction-builder\";\nexport { RawPoolTransactionBuilder } from \"../services/liquidity-pool/raw-pool-transaction-builder\";\nexport {\n PoolInfo,\n TokenWithChainDetails,\n TransferTime,\n TxCostAmount,\n SuiAddresses,\n MessengerTransferTime,\n} from \"../tokens-info/tokens-info.model\";\nexport {\n UserBalanceInfo,\n UserBalanceInfoDTO,\n LiquidityPoolsParams,\n LiquidityPoolsParamsWithAmount,\n ApproveParams as LiquidityPoolsApproveParams,\n CheckAllowanceParams as LiquidityPoolsCheckAllowanceParams,\n GetAllowanceParams as LiquidityPoolsGetAllowanceParams,\n} from \"../services/liquidity-pool/models/pool.model\";\nexport * from \"../services/models/index\";\nexport { YieldService } from \"../services/yield/index\";\nexport { assertYieldIsSupported, isYieldSupported } from \"../services/yield/validations\";\nexport {\n TokenWithChainDetailsYield,\n CYDToken,\n YieldGetAllowanceParams,\n YieldCheckAllowanceParams,\n YieldBalanceParams,\n YieldGetEstimatedAmountOnDepositParams,\n YieldGetWithdrawProportionAmountParams,\n YieldWithdrawAmount,\n YieldApproveParams,\n YieldDepositParams,\n YieldWithdrawParams,\n} from \"../services/yield//models/yield.model\";\nexport { RawYieldTransactionBuilder } from \"../services/yield/raw-yield-transaction-builder\";\nexport {\n SwapAndBridgeCalculationData,\n SwapFromVUsdCalcResult,\n SwapToVUsdCalcResult,\n} from \"../utils/calculation/swap-and-bridge-fee-calc\";\nexport { SendAmountDetails, AmountImpact } from \"../utils/calculation/swap-and-bridge-details\";\nexport { ChainDetailsMap, ChainDetailsWithTokens } from \"../tokens-info\";\nexport { Utils } from \"../utils\";\nexport { SrbUtils, TrustLineParams } from \"../utils/srb\";\nexport { SolUtils } from \"../utils/sol\";\nexport * from \"../exceptions\";\nexport { ChainSymbol, ChainType } from \"../chains/chain.enums\";\nexport { AdditionalBasicChainProperties, BasicChainProperties } from \"../chains/models\";\n\nexport enum FeePaymentMethod {\n /**\n * The fee is paid in the native currency of the source chain.\n */\n WITH_NATIVE_CURRENCY = \"native\",\n\n /**\n * The fee is paid with the stablecoin token.\n */\n WITH_STABLECOIN = \"stablecoin\",\n}\n\nexport interface AmountsAndGasFeeOptions {\n /**\n * The floating point amount of tokens to be sent (not including gas fee).\n */\n amountToSendFloat: string;\n\n /**\n * The floating point amount of tokens to be received.\n */\n amountToBeReceivedFloat: string;\n\n /**\n * Available ways to pay the transfer gas fee and gas fee amount.\n */\n gasFeeOptions: GasFeeOptions;\n}\n\ntype GasFeeOptionsType = {\n [key in FeePaymentMethod]?: AmountFormatted;\n};\n\n/**\n * Describes available options of paying the gas fee and the amount to pay when using the corresponding method.\n *\n * For {@link FeePaymentMethod.WITH_NATIVE_CURRENCY} value contains the amount in the smallest denomination of the source chain currency\n *\n * For {@link FeePaymentMethod.WITH_STABLECOIN} value contains the amount in the smallest denomination of the source token\n */\nexport interface GasFeeOptions extends GasFeeOptionsType {\n [FeePaymentMethod.WITH_NATIVE_CURRENCY]: AmountFormatted;\n [FeePaymentMethod.WITH_STABLECOIN]?: AmountFormatted;\n adminFeeShareWithExtras?: string;\n}\n\n/**\n * Define the type of amount data<p/>\n * Example:<p/>\n * \"1500000\" USDC {@link AmountFormat.INT} = \"1.5\" USDC {@link AmountFormat.FLOAT}, if USDC.decimals = 6\n */\nexport enum AmountFormat {\n /**\n * denominated in the smallest unit of the source token\n */\n INT = \"int\",\n /**\n * denominated in the unit of the source token\n */\n FLOAT = \"float\",\n}\n\n/**\n * Describes the same amount in two variation formats.\n *\n * For {@link AmountFormat.INT} value contains the amount in the smallest denomination\n *\n * For {@link AmountFormat.FLOAT} value contains the amount in tokens denomination\n */\nexport type AmountFormatted = {\n [key in AmountFormat]: string;\n};\n\n/**\n * Describes MAX extra gas value can to be passed when using the corresponding method.\n *\n * For {@link FeePaymentMethod.WITH_NATIVE_CURRENCY} value contains {@link ExtraGasMaxLimit} the amount of the source chain currency\n *\n * For {@link FeePaymentMethod.WITH_STABLECOIN} value contains {@link ExtraGasMaxLimit} the amount of the source token\n */\nexport type ExtraGasMaxLimits = {\n [key in FeePaymentMethod]?: ExtraGasMaxLimit;\n};\n\n/**\n * Describes the same MAX extra gas amount.\n */\nexport type ExtraGasMaxLimit = AmountFormatted;\n\n/**\n * Provide extra gas information\n */\nexport interface ExtraGasMaxLimitResponse {\n /**\n * See {@link ExtraGasMaxLimits}\n */\n extraGasMax: ExtraGasMaxLimits;\n /**\n * Information due to destination chain\n */\n destinationChain: {\n /**\n * gasAmountMax maximum amount you can receive as extra gas on dest chain\n */\n gasAmountMax: ExtraGasMaxLimit;\n /**\n * cost of swap tx on chain\n */\n swap: AmountFormatted;\n /**\n * cost of send tx on chain\n */\n transfer: AmountFormatted;\n };\n /**\n * Exchange rate\n */\n exchangeRate: string;\n /**\n * Source native token price\n */\n sourceNativeTokenPrice: string;\n}\n\n/**\n * Provide pending status information\n */\nexport interface PendingStatusInfoResponse {\n /**\n * Number of pending transactions\n */\n pendingTxs: number;\n /**\n * Total amount of pending transactions\n */\n pendingAmount: AmountFormatted;\n /**\n * The amount of tokens can be received as a result of transfer considering pending transactions\n */\n estimatedAmount: { min: AmountFormatted; max: AmountFormatted };\n}\n", "import { Big } from \"big.js\";\nimport { Chains } from \"../chains\";\nimport { ApiClientImpl } from \"../client/core-api/api-client\";\nimport { ApiClientCaching } from \"../client/core-api/api-client-caching\";\nimport {\n AddressStatus,\n CheckAddressResponse,\n GasBalanceResponse,\n Messenger,\n PendingInfoDTO,\n TransferStatusResponse,\n} from \"../client/core-api/core-api.model\";\nimport { AllbridgeCoreClientImpl } from \"../client/core-api/core-client-base\";\nimport { AllbridgeCoreClientFiltered, AllbridgeCoreClientFilteredImpl } from \"../client/core-api/core-client-filtered\";\nimport { AllbridgeCoreClientPoolInfoCaching } from \"../client/core-api/core-client-pool-info-caching\";\nimport { mainnet } from \"../configs\";\nimport {\n AllbridgeCoreSdkOptions,\n BasicChainProperties,\n NodeRpcUrls,\n OFTDoesNotSupportedError,\n SdkError,\n} from \"../index\";\nimport {\n AmountFormat,\n AmountFormatted,\n AmountsAndGasFeeOptions,\n CCTPDoesNotSupportedError,\n ExtraGasMaxLimitResponse,\n GasFeeOptions,\n GetTokenBalanceParams,\n InsufficientPoolLiquidityError,\n NodeRpcUrlNotInitializedError,\n PendingStatusInfoResponse,\n Provider,\n SendAmountDetails,\n SwapAndBridgeCalculationData,\n} from \"../models\";\nimport { ChainDetailsMap, PoolInfo, PoolKeyObject, TokenWithChainDetails } from \"../tokens-info\";\nimport {\n aprInPercents,\n convertAmountPrecision,\n convertFloatAmountToInt,\n convertIntAmountToFloat,\n fromSystemPrecision,\n getFeePercent,\n getSwapFromVUsdPoolInfo,\n swapFromVUsd,\n swapFromVUsdReverse,\n swapToVUsd,\n swapToVUsdReverse,\n} from \"../utils/calculation\";\nimport { SYSTEM_PRECISION } from \"../utils/calculation/constants\";\nimport { getSendAmountDetails } from \"../utils/calculation/swap-and-bridge-details\";\nimport {\n swapAndBridgeFeeCalculation,\n swapAndBridgeFeeCalculationReverse,\n} from \"../utils/calculation/swap-and-bridge-fee-calc\";\nimport { getPoolInfoByToken, validateAmountDecimals, validateAmountGtZero } from \"../utils/utils\";\nimport { BridgeService, DefaultBridgeService } from \"./bridge\";\nimport { GetNativeTokenBalanceParams } from \"./bridge/models\";\nimport { getExtraGasMaxLimits, getGasFeeOptions } from \"./bridge/utils\";\nimport { DefaultLiquidityPoolService, LiquidityPoolService } from \"./liquidity-pool\";\nimport { DefaultTokenService, TokenService } from \"./token\";\nimport { DefaultYieldService, YieldService } from \"./yield\";\n\nexport class NodeRpcUrlsConfig {\n constructor(private nodeRpcUrls: NodeRpcUrls) {}\n\n getNodeRpcUrl(chainSymbol: string): string {\n const nodeRpcUrl = this.nodeRpcUrls[chainSymbol];\n if (nodeRpcUrl !== undefined) {\n return nodeRpcUrl;\n } else {\n throw new NodeRpcUrlNotInitializedError(chainSymbol);\n }\n }\n}\n\nexport class AllbridgeCoreSdkService {\n readonly api: AllbridgeCoreClientFiltered;\n\n private readonly tokenService: TokenService;\n\n readonly params: AllbridgeCoreSdkOptions;\n\n bridge: BridgeService;\n pool: LiquidityPoolService;\n yield: YieldService;\n\n constructor(\n public readonly nodeRpcUrlsConfig: NodeRpcUrlsConfig,\n params: AllbridgeCoreSdkOptions = mainnet\n ) {\n Chains.addChainsProperties(params.additionalChainsProperties as Record<string, BasicChainProperties>);\n const apiClient = new ApiClientImpl(params);\n const apiClientCaching = new ApiClientCaching(apiClient);\n const coreClient = new AllbridgeCoreClientImpl(apiClientCaching);\n const coreClientPoolInfoCaching = new AllbridgeCoreClientPoolInfoCaching(coreClient);\n this.api = new AllbridgeCoreClientFilteredImpl(coreClientPoolInfoCaching, params);\n this.tokenService = new DefaultTokenService(this.api, nodeRpcUrlsConfig, params);\n this.bridge = new DefaultBridgeService(this.api, nodeRpcUrlsConfig, params, this.tokenService);\n this.pool = new DefaultLiquidityPoolService(this.api, nodeRpcUrlsConfig, params, this.tokenService);\n this.yield = new DefaultYieldService(this.api, nodeRpcUrlsConfig, params, this.tokenService);\n this.params = params;\n }\n\n async chainDetailsMap(type: \"swap\" | \"pool\"): Promise<ChainDetailsMap> {\n return this.api.getChainDetailsMap(type);\n }\n\n async tokens(type: \"swap\" | \"pool\"): Promise<TokenWithChainDetails[]> {\n return this.api.tokens(type);\n }\n\n async tokensByChain(chainSymbol: string, type: \"swap\" | \"pool\"): Promise<TokenWithChainDetails[]> {\n const map = await this.api.getChainDetailsMap(type);\n const chainDetails = map[chainSymbol];\n if (!chainDetails) {\n return [];\n }\n return chainDetails.tokens;\n }\n\n async getTransferStatus(chainSymbol: string, txId: string): Promise<TransferStatusResponse> {\n return this.api.getTransferStatus(chainSymbol, txId);\n }\n\n async getGasBalance(chainSymbol: string, address: string): Promise<GasBalanceResponse> {\n return this.api.getGasBalance(chainSymbol, address);\n }\n\n async checkAddress(): Promise<CheckAddressResponse> {\n return new Promise((resolve) => {\n resolve({\n status: AddressStatus.OK,\n gasBalance: null,\n });\n });\n }\n\n async getPendingStatusInfo(\n amount: string,\n amountFormat: AmountFormat,\n sourceToken: TokenWithChainDetails,\n destToken: TokenWithChainDetails\n ): Promise<PendingStatusInfoResponse> {\n validateAmountGtZero(amount);\n let amountInTokenPrecision;\n if (amountFormat == AmountFormat.FLOAT) {\n validateAmountDecimals(\"amount\", amount, sourceToken.decimals);\n amountInTokenPrecision = convertFloatAmountToInt(amount, sourceToken.decimals).toFixed();\n } else {\n amountInTokenPrecision = amount;\n }\n\n const vUsdAmountInt = swapToVUsd(\n amountInTokenPrecision,\n sourceToken,\n await getPoolInfoByToken(this.api, sourceToken)\n );\n const destPoolInfo = await getPoolInfoByToken(this.api, destToken);\n const amountResultIntFormatted: AmountFormatted = this.getAmountFromVUsdFormatted(\n vUsdAmountInt,\n destToken,\n destPoolInfo\n );\n\n let pendingInfoDTO: PendingInfoDTO | undefined;\n const pendingInfo = await this.api.getPendingInfo();\n for (const tokenAddress in pendingInfo[destToken.chainSymbol]) {\n const info = pendingInfo[destToken.chainSymbol];\n if (!info) {\n throw new SdkError(\"Cannot find pending info for \" + destToken.chainSymbol);\n }\n pendingInfoDTO = info[tokenAddress];\n }\n if (pendingInfoDTO) {\n const destPoolAfterPending = getSwapFromVUsdPoolInfo(pendingInfoDTO.totalSentAmount, destPoolInfo);\n const amountResultIntAfterPendingFormatted: AmountFormatted = this.getAmountFromVUsdFormatted(\n vUsdAmountInt,\n destToken,\n destPoolAfterPending\n );\n\n let estimatedAmount: { min: AmountFormatted; max: AmountFormatted };\n if (Big(amountResultIntAfterPendingFormatted.int).gt(amountResultIntFormatted.int)) {\n estimatedAmount = { min: amountResultIntFormatted, max: amountResultIntAfterPendingFormatted };\n } else {\n estimatedAmount = { min: amountResultIntAfterPendingFormatted, max: amountResultIntFormatted };\n }\n\n return {\n pendingTxs: pendingInfoDTO.pendingTxs,\n pendingAmount: {\n [AmountFormat.INT]: convertAmountPrecision(\n pendingInfoDTO.totalSentAmount,\n SYSTEM_PRECISION,\n destToken.decimals\n ).toFixed(0),\n [AmountFormat.FLOAT]: convertIntAmountToFloat(pendingInfoDTO.totalSentAmount, SYSTEM_PRECISION).toFixed(),\n },\n estimatedAmount,\n };\n }\n return {\n pendingTxs: 0,\n pendingAmount: {\n [AmountFormat.INT]: \"0\",\n [AmountFormat.FLOAT]: \"0\",\n },\n estimatedAmount: {\n min: amountResultIntFormatted,\n max: amountResultIntFormatted,\n },\n };\n }\n\n async getTokenBalance(params: GetTokenBalanceParams, provider?: Provider): Promise<string> {\n return this.tokenService.getTokenBalance(params, provider);\n }\n\n async getNativeTokenBalance(params: GetNativeTokenBalanceParams, provider?: Provider): Promise<AmountFormatted> {\n return this.tokenService.getNativeTokenBalance(params, provider);\n }\n\n async calculateFeePercentOnSourceChain(\n amountFloat: number | string | Big,\n sourceChainToken: TokenWithChainDetails\n ): Promise<number> {\n validateAmountGtZero(amountFloat);\n validateAmountDecimals(\"amountFloat\", amountFloat, sourceChainToken.decimals);\n const amountInt = convertFloatAmountToInt(amountFloat, sourceChainToken.decimals);\n if (amountInt.eq(0)) {\n return 0;\n }\n const vUsdInSystemPrecision = swapToVUsd(\n amountInt,\n sourceChainToken,\n await getPoolInfoByToken(this.api, sourceChainToken)\n );\n const vUsdInSourcePrecision = fromSystemPrecision(vUsdInSystemPrecision, sourceChainToken.decimals);\n return getFeePercent(amountInt, vUsdInSourcePrecision);\n }\n\n async calculateFeePercentOnDestinationChain(\n amountFloat: number | string | Big,\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails\n ): Promise<number> {\n validateAmountGtZero(amountFloat);\n validateAmountDecimals(\"amountFloat\", amountFloat, sourceChainToken.decimals);\n const amountInt = convertFloatAmountToInt(amountFloat, sourceChainToken.decimals);\n if (amountInt.eq(0)) {\n return 0;\n }\n const vUsdInSystemPrecision = swapToVUsd(\n amountInt,\n sourceChainToken,\n await getPoolInfoByToken(this.api, sourceChainToken)\n );\n const usd = swapFromVUsd(\n vUsdInSystemPrecision,\n destinationChainToken,\n await getPoolInfoByToken(this.api, destinationChainToken)\n );\n const vUsdInDestinationPrecision = fromSystemPrecision(vUsdInSystemPrecision, destinationChainToken.decimals);\n return getFeePercent(vUsdInDestinationPrecision, usd);\n }\n\n async getAmountToBeReceivedAndGasFeeOptions(\n amountToSendFloat: number | string | Big,\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n messenger: Messenger\n ): Promise<AmountsAndGasFeeOptions> {\n validateAmountGtZero(amountToSendFloat);\n validateAmountDecimals(\"amountToSendFloat\", amountToSendFloat, sourceChainToken.decimals);\n return {\n amountToSendFloat: Big(amountToSendFloat).toFixed(),\n amountToBeReceivedFloat: await this.getAmountToBeReceived(\n amountToSendFloat,\n sourceChainToken,\n destinationChainToken,\n messenger\n ),\n gasFeeOptions: await this.getGasFeeOptions(sourceChainToken, destinationChainToken, messenger),\n };\n }\n\n async getAmountToSendAndGasFeeOptions(\n amountToBeReceivedFloat: number | string | Big,\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n messenger: Messenger\n ): Promise<AmountsAndGasFeeOptions> {\n validateAmountGtZero(amountToBeReceivedFloat);\n validateAmountDecimals(\"amountToBeReceivedFloat\", amountToBeReceivedFloat, destinationChainToken.decimals);\n return {\n amountToSendFloat: await this.getAmountToSend(\n amountToBeReceivedFloat,\n sourceChainToken,\n destinationChainToken,\n messenger\n ),\n amountToBeReceivedFloat: Big(amountToBeReceivedFloat).toFixed(),\n gasFeeOptions: await this.getGasFeeOptions(sourceChainToken, destinationChainToken, messenger),\n };\n }\n\n async getAmountToBeReceived(\n amountToSendFloat: number | string | Big,\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n messenger: Messenger\n ): Promise<string> {\n return this.getAmountToBeReceivedCompute(\n amountToSendFloat,\n sourceChainToken,\n destinationChainToken,\n messenger,\n async () => await getPoolInfoByToken(this.api, sourceChainToken),\n async () => await getPoolInfoByToken(this.api, destinationChainToken)\n );\n }\n\n async getAmountToBeReceivedFromChain(\n amountToSendFloat: number | string | Big,\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n messenger: Messenger,\n sourceProvider?: Provider,\n destinationProvider?: Provider\n ): Promise<string> {\n return this.getAmountToBeReceivedCompute(\n amountToSendFloat,\n sourceChainToken,\n destinationChainToken,\n messenger,\n async () => await this.pool.getPoolInfoFromChain(sourceChainToken, sourceProvider),\n async () => await this.pool.getPoolInfoFromChain(destinationChainToken, destinationProvider)\n );\n }\n\n async getAmountToBeReceivedCompute(\n amountToSendFloat: number | string | Big,\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n messenger: Messenger = Messenger.ALLBRIDGE,\n sourcePool: () => Promise<PoolInfo>,\n destPool: () => Promise<PoolInfo>\n ): Promise<string> {\n switch (messenger) {\n case Messenger.ALLBRIDGE:\n case Messenger.WORMHOLE: {\n return this.getAmountToBeReceivedComputeWithPools(\n amountToSendFloat,\n sourceChainToken,\n destinationChainToken,\n await sourcePool(),\n await destPool()\n );\n }\n case Messenger.CCTP:\n case Messenger.CCTP_V2:\n return this.getAmountToBeReceivedComputeCctp(\n amountToSendFloat,\n sourceChainToken,\n destinationChainToken,\n messenger\n );\n case Messenger.OFT:\n return this.getAmountToBeReceivedComputeOft(amountToSendFloat, sourceChainToken, destinationChainToken);\n }\n }\n\n getAmountToBeReceivedComputeWithPools(\n amountToSendFloat: number | string | Big,\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n sourcePool: PoolInfo,\n destinationPool: PoolInfo\n ): string {\n validateAmountGtZero(amountToSendFloat);\n validateAmountDecimals(\"amountToSendFloat\", amountToSendFloat, sourceChainToken.decimals);\n const amountToSend = convertFloatAmountToInt(amountToSendFloat, sourceChainToken.decimals);\n\n const vUsd = swapToVUsd(amountToSend, sourceChainToken, sourcePool);\n return this.getAmountFromVUsdFormatted(vUsd, destinationChainToken, destinationPool).float;\n }\n\n getAmountToBeReceivedComputeCctp(\n amountToSendFloat: number | string | Big,\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n messenger: Messenger.CCTP | Messenger.CCTP_V2\n ): string {\n validateAmountGtZero(amountToSendFloat);\n validateAmountDecimals(\"amountToSendFloat\", amountToSendFloat, sourceChainToken.decimals);\n const amountToSend = convertFloatAmountToInt(amountToSendFloat, sourceChainToken.decimals);\n\n switch (messenger) {\n case Messenger.CCTP: {\n if (!sourceChainToken.cctpAddress || !destinationChainToken.cctpAddress || !sourceChainToken.cctpFeeShare) {\n throw new CCTPDoesNotSupportedError(\"Such route does not support CCTP protocol\");\n }\n const result = amountToSend.mul(Big(1).minus(sourceChainToken.cctpFeeShare)).round(0, Big.roundUp);\n const resultInDestPrecision = convertAmountPrecision(\n result,\n sourceChainToken.decimals,\n destinationChainToken.decimals\n ).round(0);\n return convertIntAmountToFloat(resultInDestPrecision, destinationChainToken.decimals).toFixed();\n }\n case Messenger.CCTP_V2: {\n if (\n !sourceChainToken.cctpV2Address ||\n !destinationChainToken.cctpV2Address ||\n !sourceChainToken.cctpV2FeeShare\n ) {\n throw new CCTPDoesNotSupportedError(\"Such route does not support CCTP V2 protocol\");\n }\n const result = amountToSend.mul(Big(1).minus(sourceChainToken.cctpV2FeeShare)).round(0, Big.roundUp);\n const resultInDestPrecision = convertAmountPrecision(\n result,\n sourceChainToken.decimals,\n destinationChainToken.decimals\n ).round(0);\n\n return convertIntAmountToFloat(resultInDestPrecision, destinationChainToken.decimals).toFixed();\n }\n }\n }\n\n async getAmountToBeReceivedComputeOft(\n amountToSendFloat: number | string | Big,\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails\n ): Promise<string> {\n validateAmountGtZero(amountToSendFloat);\n validateAmountDecimals(\"amountToSendFloat\", amountToSendFloat, sourceChainToken.decimals);\n const amountToSend = convertFloatAmountToInt(amountToSendFloat, sourceChainToken.decimals);\n\n if (\n !sourceChainToken.oftBridgeAddress ||\n !destinationChainToken.oftBridgeAddress ||\n sourceChainToken.oftId !== destinationChainToken.oftId\n ) {\n throw new OFTDoesNotSupportedError(\"Such route does not support OFT protocol\");\n }\n const { adminFeeShareWithExtras } = await this.api.getReceiveTransactionCost({\n sourceChainId: sourceChainToken.allbridgeChainId,\n destinationChainId: destinationChainToken.allbridgeChainId,\n messenger: Messenger.OFT,\n sourceToken: sourceChainToken.tokenAddress,\n });\n if (!adminFeeShareWithExtras) {\n throw new OFTDoesNotSupportedError(\"Such route does not support OFT protocol\");\n }\n const result = amountToSend.mul(Big(1).minus(adminFeeShareWithExtras)).round(0, Big.roundUp);\n const resultInDestPrecision = convertAmountPrecision(\n result,\n sourceChainToken.decimals,\n destinationChainToken.decimals\n ).round(0);\n\n return convertIntAmountToFloat(resultInDestPrecision, destinationChainToken.decimals).toFixed();\n }\n\n async getAmountToSend(\n amountToBeReceivedFloat: number | string | Big,\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n messenger: Messenger\n ): Promise<string> {\n return this.getAmountToSendCompute(\n amountToBeReceivedFloat,\n sourceChainToken,\n destinationChainToken,\n messenger,\n () => getPoolInfoByToken(this.api, sourceChainToken),\n () => getPoolInfoByToken(this.api, destinationChainToken)\n );\n }\n\n async getAmountToSendFromChain(\n amountToBeReceivedFloat: number | string | Big,\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n messenger: Messenger,\n sourceProvider?: Provider,\n destinationProvider?: Provider\n ): Promise<string> {\n return this.getAmountToSendCompute(\n amountToBeReceivedFloat,\n sourceChainToken,\n destinationChainToken,\n messenger,\n () => this.pool.getPoolInfoFromChain(sourceChainToken, sourceProvider),\n () => this.pool.getPoolInfoFromChain(destinationChainToken, destinationProvider)\n );\n }\n\n async getAmountToSendCompute(\n amountToBeReceivedFloat: number | string | Big,\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n messenger: Messenger = Messenger.ALLBRIDGE,\n sourcePool: () => Promise<PoolInfo>,\n destPool: () => Promise<PoolInfo>\n ): Promise<string> {\n switch (messenger) {\n case Messenger.ALLBRIDGE:\n case Messenger.WORMHOLE: {\n return this.getAmountToSendComputeWithPools(\n amountToBeReceivedFloat,\n sourceChainToken,\n destinationChainToken,\n await sourcePool(),\n await destPool()\n );\n }\n case Messenger.CCTP:\n case Messenger.CCTP_V2:\n return this.getAmountToSendComputeCctp(\n amountToBeReceivedFloat,\n sourceChainToken,\n destinationChainToken,\n messenger\n );\n case Messenger.OFT:\n return this.getAmountToSendComputeOft(amountToBeReceivedFloat, sourceChainToken, destinationChainToken);\n }\n }\n\n getAmountToSendComputeWithPools(\n amountToBeReceivedFloat: number | string | Big,\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n sourcePool: PoolInfo,\n destinationPool: PoolInfo\n ): string {\n validateAmountGtZero(amountToBeReceivedFloat);\n validateAmountDecimals(\"amountToBeReceivedFloat\", amountToBeReceivedFloat, destinationChainToken.decimals);\n const amountToBeReceived = convertFloatAmountToInt(amountToBeReceivedFloat, destinationChainToken.decimals);\n\n const vUsd = swapFromVUsdReverse(amountToBeReceived, destinationChainToken, destinationPool);\n const resultInt = swapToVUsdReverse(vUsd, sourceChainToken, sourcePool);\n if (Big(resultInt).lte(0)) {\n throw new InsufficientPoolLiquidityError();\n }\n return convertIntAmountToFloat(resultInt, sourceChainToken.decimals).toFixed();\n }\n\n getAmountToSendComputeCctp(\n amountToBeReceivedFloat: number | string | Big,\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n messenger: Messenger.CCTP | Messenger.CCTP_V2\n ): string {\n validateAmountGtZero(amountToBeReceivedFloat);\n validateAmountDecimals(\"amountToBeReceivedFloat\", amountToBeReceivedFloat, destinationChainToken.decimals);\n const amountToBeReceived = convertFloatAmountToInt(amountToBeReceivedFloat, destinationChainToken.decimals);\n\n switch (messenger) {\n case Messenger.CCTP: {\n if (!sourceChainToken.cctpAddress || !destinationChainToken.cctpAddress || !sourceChainToken.cctpFeeShare) {\n throw new CCTPDoesNotSupportedError(\"Such route does not support CCTP protocol\");\n }\n const result = amountToBeReceived.div(Big(1).minus(sourceChainToken.cctpFeeShare)).round(0, Big.roundDown);\n const resultInSourcePrecision = convertAmountPrecision(\n result,\n destinationChainToken.decimals,\n sourceChainToken.decimals\n ).round(0);\n return convertIntAmountToFloat(resultInSourcePrecision, sourceChainToken.decimals).toFixed();\n }\n case Messenger.CCTP_V2: {\n if (\n !sourceChainToken.cctpV2Address ||\n !destinationChainToken.cctpV2Address ||\n !sourceChainToken.cctpV2FeeShare\n ) {\n throw new CCTPDoesNotSupportedError(\"Such route does not support CCTP V2 protocol\");\n }\n const result = amountToBeReceived.div(Big(1).minus(sourceChainToken.cctpV2FeeShare)).round(0, Big.roundDown);\n const resultInSourcePrecision = convertAmountPrecision(\n result,\n destinationChainToken.decimals,\n sourceChainToken.decimals\n ).round(0);\n return convertIntAmountToFloat(resultInSourcePrecision, sourceChainToken.decimals).toFixed();\n }\n }\n }\n\n async getAmountToSendComputeOft(\n amountToBeReceivedFloat: number | string | Big,\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails\n ): Promise<string> {\n validateAmountGtZero(amountToBeReceivedFloat);\n validateAmountDecimals(\"amountToBeReceivedFloat\", amountToBeReceivedFloat, destinationChainToken.decimals);\n const amountToBeReceived = convertFloatAmountToInt(amountToBeReceivedFloat, destinationChainToken.decimals);\n\n if (\n !sourceChainToken.oftId ||\n !destinationChainToken.oftId ||\n !sourceChainToken.oftBridgeAddress ||\n sourceChainToken.oftId !== destinationChainToken.oftId\n ) {\n throw new OFTDoesNotSupportedError(\"Such route does not support OFT protocol\");\n }\n const { adminFeeShareWithExtras } = await this.api.getReceiveTransactionCost({\n sourceChainId: sourceChainToken.allbridgeChainId,\n destinationChainId: destinationChainToken.allbridgeChainId,\n messenger: Messenger.OFT,\n sourceToken: sourceChainToken.tokenAddress,\n });\n if (!adminFeeShareWithExtras) {\n throw new OFTDoesNotSupportedError(\"Such route does not support OFT protocol\");\n }\n const result = amountToBeReceived.div(Big(1).minus(adminFeeShareWithExtras)).round(0, Big.roundDown);\n const resultInSourcePrecision = convertAmountPrecision(\n result,\n destinationChainToken.decimals,\n sourceChainToken.decimals\n ).round(0);\n return convertIntAmountToFloat(resultInSourcePrecision, sourceChainToken.decimals).toFixed();\n }\n\n async getGasFeeOptions(\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n messenger: Messenger\n ): Promise<GasFeeOptions> {\n return getGasFeeOptions(sourceChainToken, destinationChainToken.allbridgeChainId, messenger, this.api);\n }\n\n getAverageTransferTime(\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n messenger: Messenger\n ): number | null {\n return sourceChainToken.transferTime?.[destinationChainToken.chainSymbol]?.[messenger] ?? null;\n }\n\n async getPoolInfoByToken(token: TokenWithChainDetails): Promise<PoolInfo> {\n return await this.api.getPoolInfoByKey({ chainSymbol: token.chainSymbol, poolAddress: token.poolAddress });\n }\n\n async refreshPoolInfo(tokens?: TokenWithChainDetails | TokenWithChainDetails[]): Promise<void> {\n if (tokens) {\n const tokensArray = tokens instanceof Array ? tokens : [tokens];\n const poolKeys: PoolKeyObject[] = tokensArray.map((t) => {\n return { chainSymbol: t.chainSymbol, poolAddress: t.poolAddress };\n });\n return this.api.refreshPoolInfo(poolKeys);\n }\n return this.api.refreshPoolInfo();\n }\n\n aprInPercents(apr: string): string {\n return aprInPercents(apr);\n }\n\n async getExtraGasMaxLimits(\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n messenger: Messenger\n ): Promise<ExtraGasMaxLimitResponse> {\n return await getExtraGasMaxLimits(sourceChainToken, destinationChainToken, messenger, this.api);\n }\n\n async getVUsdFromAmount(\n amount: string,\n amountFormat: AmountFormat,\n sourceToken: TokenWithChainDetails\n ): Promise<AmountFormatted> {\n validateAmountGtZero(amount);\n let amountInTokenPrecision;\n if (amountFormat == AmountFormat.FLOAT) {\n validateAmountDecimals(\"amount\", amount, sourceToken.decimals);\n amountInTokenPrecision = convertFloatAmountToInt(amount, sourceToken.decimals).toFixed();\n } else {\n amountInTokenPrecision = amount;\n }\n\n const vUsdAmount = swapToVUsd(amountInTokenPrecision, sourceToken, await getPoolInfoByToken(this.api, sourceToken));\n return {\n [AmountFormat.INT]: vUsdAmount,\n [AmountFormat.FLOAT]: convertIntAmountToFloat(vUsdAmount, SYSTEM_PRECISION).toFixed(),\n };\n }\n\n async getAmountFromVUsd(vUsdAmount: string, destToken: TokenWithChainDetails): Promise<AmountFormatted> {\n return this.getAmountFromVUsdFormatted(vUsdAmount, destToken, await getPoolInfoByToken(this.api, destToken));\n }\n\n private getAmountFromVUsdFormatted(\n vUsdAmountInt: string,\n destToken: TokenWithChainDetails,\n destPoolInfo: Pick<PoolInfo, \"vUsdBalance\" | \"aValue\" | \"dValue\" | \"tokenBalance\">\n ): AmountFormatted {\n validateAmountGtZero(vUsdAmountInt);\n const amountResultInt = swapFromVUsd(vUsdAmountInt, destToken, destPoolInfo);\n if (Big(amountResultInt).lt(0)) {\n throw new InsufficientPoolLiquidityError();\n }\n return {\n [AmountFormat.INT]: amountResultInt,\n [AmountFormat.FLOAT]: convertIntAmountToFloat(amountResultInt, destToken.decimals).toFixed(),\n };\n }\n\n async swapAndBridgeFeeCalculation(\n amountInTokenPrecision: string,\n sourceToken: TokenWithChainDetails,\n destToken: TokenWithChainDetails\n ): Promise<SwapAndBridgeCalculationData> {\n return swapAndBridgeFeeCalculation(\n amountInTokenPrecision,\n {\n decimals: sourceToken.decimals,\n feeShare: sourceToken.feeShare,\n poolInfo: await getPoolInfoByToken(this.api, sourceToken),\n },\n {\n decimals: destToken.decimals,\n feeShare: destToken.feeShare,\n poolInfo: await getPoolInfoByToken(this.api, destToken),\n }\n );\n }\n\n async swapAndBridgeFeeCalculationReverse(\n amountInTokenPrecision: string,\n sourceToken: TokenWithChainDetails,\n destToken: TokenWithChainDetails\n ): Promise<SwapAndBridgeCalculationData> {\n const result = swapAndBridgeFeeCalculationReverse(\n amountInTokenPrecision,\n {\n decimals: sourceToken.decimals,\n feeShare: sourceToken.feeShare,\n poolInfo: await getPoolInfoByToken(this.api, sourceToken),\n },\n {\n decimals: destToken.decimals,\n feeShare: destToken.feeShare,\n poolInfo: await getPoolInfoByToken(this.api, destToken),\n }\n );\n const newAmount = result.swapFromVUsdCalcResult.amountIncludingCommissionInTokenPrecision;\n if (Big(newAmount).lt(0)) {\n throw new InsufficientPoolLiquidityError();\n }\n return result;\n }\n\n async getSendAmountDetails(\n amount: string,\n amountFormat: AmountFormat,\n sourceToken: TokenWithChainDetails,\n destToken: TokenWithChainDetails\n ): Promise<SendAmountDetails> {\n validateAmountGtZero(amount);\n let amountInTokenPrecision;\n if (amountFormat == AmountFormat.FLOAT) {\n validateAmountDecimals(\"amount\", amount, sourceToken.decimals);\n amountInTokenPrecision = convertFloatAmountToInt(amount, sourceToken.decimals).toFixed();\n } else {\n amountInTokenPrecision = amount;\n }\n\n return getSendAmountDetails(\n amountInTokenPrecision,\n sourceToken,\n await getPoolInfoByToken(this.api, sourceToken),\n destToken,\n await getPoolInfoByToken(this.api, destToken)\n );\n }\n}\n", "import { BigSource } from \"big.js\";\nimport { AdditionalBasicChainProperties } from \"./chains/models\";\nimport { mainnet } from \"./configs\";\nimport {\n AmountFormat,\n AmountFormatted,\n AmountsAndGasFeeOptions,\n BridgeService,\n ChainDetailsMap,\n CheckAddressResponse,\n ExtraGasMaxLimitResponse,\n GasBalanceResponse,\n GasFeeOptions,\n GetNativeTokenBalanceParams,\n GetTokenBalanceParams,\n LiquidityPoolService,\n Messenger,\n PendingStatusInfoResponse,\n PoolInfo,\n Provider,\n SendAmountDetails,\n SwapAndBridgeCalculationData,\n TokenWithChainDetails,\n TransferStatusResponse,\n} from \"./models\";\nimport { AllbridgeCoreSdkService, NodeRpcUrlsConfig } from \"./services\";\nimport { CctpParams } from \"./services/bridge/sol\";\nimport { YieldService } from \"./services/yield\";\nimport { DefaultUtils, Utils } from \"./utils\";\n\nexport * from \"./configs\";\nexport * from \"./models\";\n\nexport interface AllbridgeCoreSdkOptions {\n coreApiUrl: string;\n /**\n * A set of query parameters to be added to all requests to the Core API.\n */\n coreApiQueryParams?: Record<string, string>;\n /**\n * A set of headers to be added to all requests to the Core API.\n */\n coreApiHeaders?: Record<string, string>;\n /**\n * Jupiter Swap Api</br>\n * Default: https://lite-api.jup.ag/swap/v1</br>\n * {@link https://dev.jup.ag/docs/swap-api/}\n */\n jupiterUrl: string;\n /**\n * Jupiter Api Key Header</br>\n * {@link https://dev.jup.ag/docs/api-setup}\n */\n jupiterApiKeyHeader?: string;\n /**\n * Jupiter v6 'maxAccounts' parameter</br>\n * Rough estimate of the max accounts to be used for the quote, so that you can compose with your own accounts</br>\n * {@link https://station.jup.ag/docs/apis/swap-api#using-maxaccounts}\n */\n jupiterMaxAccounts?: number;\n wormholeMessengerProgramId: string;\n solanaLookUpTable: string;\n sorobanNetworkPassphrase: string;\n /**\n * Optional. Will be used in methods</br>\n * {@link LiquidityPoolService.getPoolInfoFromChain} and {@link LiquidityPoolService.getAmountToBeWithdrawn}</br>\n * to fetch information from the blockchain with fewer HTTP requests using JSON-RPC API\n */\n tronJsonRpc?: string;\n cctpParams: CctpParams;\n /**\n * The number of seconds that pool information taken from the chain will be cached.\n *\n * @type {number}\n */\n cachePoolInfoChainSec: number;\n\n /**\n * @internal\n * Optional additional properties to merge with the default properties.\n */\n additionalChainsProperties?: Record<string, AdditionalBasicChainProperties>;\n}\n\n/**\n * Type representing RPC node URLs for different blockchain chains.</br>\n * Provide node RPC URL for chain connection you intend to communicate with</br>\n * - required for SOL, TRX chains</br>\n * - optional for EVM chains -- you can interact by passing a {@link Provider} that will be used to communicate with the chain</br>\n * @typedef {Record<string, string>} NodeRpcUrls\n * @property {string} chainSymbol - The symbol of the chain representing one of the supported blockchain networks (e.g., \"ETH\" for Ethereum). For more details, see: {@link ChainSymbol}.\n * @property {string} rpcUrl - The RPC node URL for the specified chain.\n */\nexport type NodeRpcUrls = Record<string, string>;\n\n/**\n * @deprecated Use {@link NodeRpcUrls}\n */\nexport interface NodeUrlsConfig {\n solanaRpcUrl: string;\n tronRpcUrl: string;\n}\n\n/**\n * @deprecated Use {@link NodeRpcUrls}\n */\nfunction isNodeUrlsConfig(nodeUrls: NodeUrlsConfig | NodeRpcUrls): nodeUrls is NodeUrlsConfig {\n return \"solanaRpcUrl\" in nodeUrls;\n}\n\nexport class AllbridgeCoreSdk {\n readonly params: AllbridgeCoreSdkOptions;\n\n bridge: BridgeService;\n pool: LiquidityPoolService;\n yield: YieldService;\n utils: Utils;\n\n private service: AllbridgeCoreSdkService;\n\n /**\n * Initializes the SDK object.\n * @param nodeUrls node rpc urls for full functionality\n * @param params\n * Optional.\n * If not defined, the default {@link mainnet} parameters are used.\n */\n constructor(nodeUrls: NodeUrlsConfig | NodeRpcUrls, params: AllbridgeCoreSdkOptions = mainnet) {\n let nodeRpcUrlsConfig: NodeRpcUrlsConfig;\n if (isNodeUrlsConfig(nodeUrls)) {\n nodeRpcUrlsConfig = new NodeRpcUrlsConfig({ SOL: nodeUrls.solanaRpcUrl, TRX: nodeUrls.tronRpcUrl });\n } else {\n nodeRpcUrlsConfig = new NodeRpcUrlsConfig(nodeUrls);\n }\n this.service = new AllbridgeCoreSdkService(nodeRpcUrlsConfig, params);\n this.bridge = this.service.bridge;\n this.pool = this.service.pool;\n this.yield = this.service.yield;\n this.utils = new DefaultUtils(this.service);\n this.params = params;\n }\n\n /**\n * Returns {@link ChainDetailsMap} containing a list of supported tokens groped by chain.\n *\n * @param type - A string value which specifies ChainDetailsMap to retrieve.\n * Can be either 'swap' for send or 'pool' for liquidity pools setup.\n * Defaults to 'swap'.\n */\n async chainDetailsMap(type: \"swap\" | \"pool\" = \"swap\"): Promise<ChainDetailsMap> {\n return this.service.chainDetailsMap(type);\n }\n\n /**\n * Returns a list of supported {@link TokenWithChainDetails | tokens}.\n *\n * @param type - A string value which specifies a set of tokens to retrieve.\n * Can be either 'swap' for tokens to send or 'pool' for liquidity pools operations.\n * Defaults to 'swap'.\n * @returns A promise that resolves to an array of {@link TokenWithChainDetails}.\n */\n async tokens(type: \"swap\" | \"pool\" = \"swap\"): Promise<TokenWithChainDetails[]> {\n return this.service.tokens(type);\n }\n\n /**\n * Returns a list of supported {@link TokenWithChainDetails | tokens} on the selected chain.\n * @param chainSymbol - The symbol of the chain representing one of the supported blockchain networks (e.g., \"ETH\" for Ethereum). For more details, see: {@link ChainSymbol}.\n * @param type - A string value which specifies a set of tokens to retrieve.\n * Can be either 'swap' for tokens to send or 'pool' for liquidity pools operations.\n * Defaults to 'swap'.\n */\n async tokensByChain(chainSymbol: string, type: \"swap\" | \"pool\" = \"swap\"): Promise<TokenWithChainDetails[]> {\n return this.service.tokensByChain(chainSymbol, type);\n }\n\n /**\n * Fetches information about tokens transfer by chosen chainSymbol and transaction Id from the Allbridge Core API.\n * @param chainSymbol - The symbol of the chain representing one of the supported blockchain networks (e.g., \"ETH\" for Ethereum). For more details, see: {@link ChainSymbol}.\n * @param txId\n */\n async getTransferStatus(chainSymbol: string, txId: string): Promise<TransferStatusResponse> {\n return this.service.getTransferStatus(chainSymbol, txId);\n }\n\n /**\n * Get gas balance\n * @param chainSymbol - The symbol of the chain representing one of the supported blockchain networks (e.g., \"ETH\" for Ethereum). For more details, see: {@link ChainSymbol}.\n * @param address\n */\n async getGasBalance(chainSymbol: string, address: string): Promise<GasBalanceResponse> {\n return this.service.getGasBalance(chainSymbol, address);\n }\n\n /**\n * Check address and show gas balance\n * @deprecated\n * @param chainSymbol - The symbol of the chain representing one of the supported blockchain networks (e.g., \"ETH\" for Ethereum). For more details, see: {@link ChainSymbol}.\n * @param recipientAddress\n * @param tokenAddress\n */\n async checkAddress(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n chainSymbol: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n recipientAddress: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n tokenAddress?: string\n ): Promise<CheckAddressResponse> {\n return await this.service.checkAddress();\n }\n\n /**\n * Returns information about pending transactions for the same destination chain and the amount of tokens can be received as a result of transfer considering pending transactions.\n * @param amount the amount of tokens that will be sent\n * @param amountFormat amount format\n * @param sourceToken selected token transfer from\n * @param destToken selected token transfer to\n * @returns range of possible amount based on already pending transactions\n */\n async getPendingStatusInfo(\n amount: string,\n amountFormat: AmountFormat,\n sourceToken: TokenWithChainDetails,\n destToken: TokenWithChainDetails\n ): Promise<PendingStatusInfoResponse> {\n return this.service.getPendingStatusInfo(amount, amountFormat, sourceToken, destToken);\n }\n\n /**\n * Get token balance\n * @param params\n * @param provider\n * @returns Token balance\n */\n async getTokenBalance(params: GetTokenBalanceParams, provider?: Provider): Promise<string> {\n return this.service.getTokenBalance(params, provider);\n }\n\n /**\n * Get native (gas) token balance\n * @param params\n * @param provider\n * @returns Token balance\n */\n async getNativeTokenBalance(params: GetNativeTokenBalanceParams, provider?: Provider): Promise<AmountFormatted> {\n return this.service.getNativeTokenBalance(params, provider);\n }\n\n /**\n * @deprecated\n * Calculates the percentage of fee from the initial amount that is charged when swapping from the selected source chain.\n * (Does not include fee related to the destination chain. Does not include gas fee)\n * @param amountFloat initial amount of tokens to swap\n * @param sourceChainToken selected token on the source chain\n * @returns fee percent\n */\n async calculateFeePercentOnSourceChain(\n amountFloat: BigSource,\n sourceChainToken: TokenWithChainDetails\n ): Promise<number> {\n return this.service.calculateFeePercentOnSourceChain(amountFloat, sourceChainToken);\n }\n\n /**\n * @deprecated\n * Calculates the percentage of fee that is charged when swapping to the selected destination chain. The destination chain fee percent applies to the amount after the source chain fee.\n * (Does not include fee related to the source chain. Does not include gas fee)\n * @see {@link calculateFeePercentOnSourceChain}\n * @param amountFloat initial amount of tokens to swap\n * @param sourceChainToken selected token on the source chain\n * @param destinationChainToken selected token on the destination chain\n * @returns fee percent\n */\n async calculateFeePercentOnDestinationChain(\n amountFloat: BigSource,\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails\n ): Promise<number> {\n return this.service.calculateFeePercentOnDestinationChain(amountFloat, sourceChainToken, destinationChainToken);\n }\n\n /**\n * Calculates the amount of tokens to be received as a result of transfer\n * and fetches {@link GasFeeOptions} which contains available ways to pay the gas fee.\n * @param amountToSendFloat the amount of tokens that will be sent\n * @param sourceChainToken selected token on the source chain\n * @param destinationChainToken selected token on the destination chain\n * @param messenger\n */\n async getAmountToBeReceivedAndGasFeeOptions(\n amountToSendFloat: BigSource,\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n messenger: Messenger\n ): Promise<AmountsAndGasFeeOptions> {\n return this.service.getAmountToBeReceivedAndGasFeeOptions(\n amountToSendFloat,\n sourceChainToken,\n destinationChainToken,\n messenger\n );\n }\n\n /**\n * Calculates the amount of tokens to send based on requested tokens amount be received as a result of transfer.\n * and fetches {@link GasFeeOptions} which contains available ways to pay the gas fee.\n * @param amountToBeReceivedFloat the amount of tokens that should be received\n * @param sourceChainToken selected token on the source chain\n * @param destinationChainToken selected token on the destination chain\n * @param messenger\n */\n async getAmountToSendAndGasFeeOptions(\n amountToBeReceivedFloat: BigSource,\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n messenger: Messenger\n ): Promise<AmountsAndGasFeeOptions> {\n return this.service.getAmountToSendAndGasFeeOptions(\n amountToBeReceivedFloat,\n sourceChainToken,\n destinationChainToken,\n messenger\n );\n }\n\n /**\n * Calculates the amount of tokens to be received as a result of transfer.\n * @param amountToSendFloat the amount of tokens that will be sent\n * @param sourceChainToken selected token on the source chain\n * @param destinationChainToken selected token on the destination chain\n * @param messenger selected messenger\n */\n async getAmountToBeReceived(\n amountToSendFloat: BigSource,\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n /**\n * The Messengers for different routes.\n */\n messenger: Messenger = Messenger.ALLBRIDGE\n ): Promise<string> {\n return this.service.getAmountToBeReceived(amountToSendFloat, sourceChainToken, destinationChainToken, messenger);\n }\n\n /**\n * Calculates the amount of tokens to be received as a result of transfer based on actual blockchain pool state.\n * @param amountToSendFloat the amount of tokens that will be sent\n * @param sourceChainToken selected token on the source chain\n * @param destinationChainToken selected token on the destination chain\n * @param messenger selected messenger\n * @param sourceProvider Optional. source chain Provider\n * @param destinationProvider Optional. destination chain Provider\n */\n async getAmountToBeReceivedFromChain(\n amountToSendFloat: BigSource,\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n /**\n * The Messengers for different routes.\n */\n messenger: Messenger = Messenger.ALLBRIDGE,\n sourceProvider?: Provider,\n destinationProvider?: Provider\n ): Promise<string> {\n return this.service.getAmountToBeReceivedFromChain(\n amountToSendFloat,\n sourceChainToken,\n destinationChainToken,\n messenger,\n sourceProvider,\n destinationProvider\n );\n }\n\n /**\n * Calculates the amount of tokens to be received as a result of transfer based on passed pool state.\n * @param amountToSendFloat the amount of tokens that will be sent\n * @param sourceChainToken selected token on the source chain\n * @param destinationChainToken selected token on the destination chain\n * @param sourcePool source token pool state\n * @param destinationPool destination token pool state\n * @param messenger selected messenger\n */\n getAmountToBeReceivedFromPools(\n amountToSendFloat: BigSource,\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n sourcePool: PoolInfo,\n destinationPool: PoolInfo,\n messenger: Exclude<Messenger, Messenger.OFT> = Messenger.ALLBRIDGE\n ): string {\n switch (messenger) {\n case Messenger.ALLBRIDGE:\n case Messenger.WORMHOLE:\n return this.service.getAmountToBeReceivedComputeWithPools(\n amountToSendFloat,\n sourceChainToken,\n destinationChainToken,\n sourcePool,\n destinationPool\n );\n case Messenger.CCTP:\n case Messenger.CCTP_V2:\n return this.service.getAmountToBeReceivedComputeCctp(\n amountToSendFloat,\n sourceChainToken,\n destinationChainToken,\n messenger\n );\n }\n }\n\n /**\n * Calculates the amount of tokens to send based on requested tokens amount be received as a result of transfer.\n * @param amountToBeReceivedFloat the amount of tokens that should be received\n * @param sourceChainToken selected token on the source chain\n * @param destinationChainToken selected token on the destination chain\n * @param messenger selected messenger\n */\n async getAmountToSend(\n amountToBeReceivedFloat: BigSource,\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n /**\n * The Messengers for different routes.\n */\n messenger: Messenger = Messenger.ALLBRIDGE\n ): Promise<string> {\n return this.service.getAmountToSend(amountToBeReceivedFloat, sourceChainToken, destinationChainToken, messenger);\n }\n\n /**\n * Calculates the amount of tokens to send based on requested tokens amount be received as a result of transfer based on actual blockchain pool state.\n * @param amountToBeReceivedFloat the amount of tokens that should be received\n * @param sourceChainToken selected token on the source chain\n * @param destinationChainToken selected token on the destination chain\n * @param messenger selected messenger\n * @param sourceProvider Optional. source chain Provider\n * @param destinationProvider Optional. destination chain Provider\n */\n async getAmountToSendFromChain(\n amountToBeReceivedFloat: BigSource,\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n /**\n * The Messengers for different routes.\n */\n messenger: Messenger = Messenger.ALLBRIDGE,\n sourceProvider?: Provider,\n destinationProvider?: Provider\n ): Promise<string> {\n return this.service.getAmountToSendFromChain(\n amountToBeReceivedFloat,\n sourceChainToken,\n destinationChainToken,\n messenger,\n sourceProvider,\n destinationProvider\n );\n }\n\n /**\n * Calculates the amount of tokens to send based on requested tokens amount be received as a result of transfer based on passed pool state.\n * @param amountToBeReceivedFloat the amount of tokens that should be received\n * @param sourceChainToken selected token on the source chain\n * @param destinationChainToken selected token on the destination chain\n * @param sourcePool source token pool state\n * @param destinationPool destination token pool state\n * @param messenger selected messenger\n */\n getAmountToSendFromPools(\n amountToBeReceivedFloat: BigSource,\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n sourcePool: PoolInfo,\n destinationPool: PoolInfo,\n messenger: Exclude<Messenger, Messenger.OFT> = Messenger.ALLBRIDGE\n ): string {\n switch (messenger) {\n case Messenger.ALLBRIDGE:\n case Messenger.WORMHOLE:\n return this.service.getAmountToSendComputeWithPools(\n amountToBeReceivedFloat,\n sourceChainToken,\n destinationChainToken,\n sourcePool,\n destinationPool\n );\n case Messenger.CCTP:\n case Messenger.CCTP_V2:\n return this.service.getAmountToSendComputeCctp(\n amountToBeReceivedFloat,\n sourceChainToken,\n destinationChainToken,\n messenger\n );\n }\n }\n\n /**\n * Fetches possible ways to pay the transfer gas fee.\n * @param sourceChainToken selected token on the source chain\n * @param destinationChainToken selected token on the destination chain\n * @param messenger\n * @returns {@link GasFeeOptions}\n */\n async getGasFeeOptions(\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n messenger: Messenger\n ): Promise<GasFeeOptions> {\n return this.service.getGasFeeOptions(sourceChainToken, destinationChainToken, messenger);\n }\n\n /**\n * Gets the average time in ms to complete a transfer for given tokens and messenger.\n * @param sourceChainToken selected token on the source chain.\n * @param destinationChainToken selected token on the destination chain.\n * @param messenger\n * @returns Average transfer time in milliseconds or null if a given combination of tokens and messenger is not supported.\n */\n getAverageTransferTime(\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n messenger: Messenger\n ): number | null {\n return this.service.getAverageTransferTime(sourceChainToken, destinationChainToken, messenger);\n }\n\n /**\n * Gets information about the poolInfo by token\n * @param token\n * @returns poolInfo\n */\n async getPoolInfoByToken(token: TokenWithChainDetails): Promise<PoolInfo> {\n return this.service.getPoolInfoByToken(token);\n }\n\n /**\n * Forces refresh of cached information about the state of liquidity pools.\n * Outdated cache leads to calculated amounts being less accurate.\n * The cache is invalidated at regular intervals, but it can be forced to be refreshed by calling this method.+\n *\n * @param tokens if present, the corresponding liquidity pools will be updated\n */\n async refreshPoolInfo(tokens?: TokenWithChainDetails | TokenWithChainDetails[]): Promise<void> {\n return this.service.refreshPoolInfo(tokens);\n }\n\n /**\n * Convert APR to percentage view\n * @param apr\n * @returns aprPercentageView\n */\n aprInPercents(apr: string): string {\n return this.service.aprInPercents(apr);\n }\n\n /**\n * Get possible limit of extra gas amount.\n * @param sourceChainToken selected token on the source chain\n * @param destinationChainToken selected token on the destination chain\n * @param messenger selected Messenger, Allbridge by default\n * @returns {@link ExtraGasMaxLimitResponse}\n */\n async getExtraGasMaxLimits(\n sourceChainToken: TokenWithChainDetails,\n destinationChainToken: TokenWithChainDetails,\n messenger: Messenger = Messenger.ALLBRIDGE\n ): Promise<ExtraGasMaxLimitResponse> {\n return this.service.getExtraGasMaxLimits(sourceChainToken, destinationChainToken, messenger);\n }\n\n /**\n * @param amount - amount\n * @param amountFormat - AmountFormat\n * @param sourceToken - selected token on the source chain\n * @return virtual amount\n */\n async getVUsdFromAmount(\n amount: string,\n amountFormat: AmountFormat,\n sourceToken: TokenWithChainDetails\n ): Promise<AmountFormatted> {\n return this.service.getVUsdFromAmount(amount, amountFormat, sourceToken);\n }\n\n /**\n * @param vUsdAmount - amount of vUsd, int format\n * @param destToken selected token on the destination chain\n * @return amount of destToken\n */\n async getAmountFromVUsd(vUsdAmount: string, destToken: TokenWithChainDetails): Promise<AmountFormatted> {\n return this.service.getAmountFromVUsd(vUsdAmount, destToken);\n }\n\n /**\n * @deprecated Use {@link getSendAmountDetails}\n * @param amountInTokenPrecision\n * @param sourceToken\n * @param destToken\n */\n async swapAndBridgeFeeCalculation(\n amountInTokenPrecision: string,\n sourceToken: TokenWithChainDetails,\n destToken: TokenWithChainDetails\n ): Promise<SwapAndBridgeCalculationData> {\n return this.service.swapAndBridgeFeeCalculation(amountInTokenPrecision, sourceToken, destToken);\n }\n\n /**\n * @deprecated Use {@link getAmountToBeReceived} and then {@link getSendAmountDetails}\n * @param amountInTokenPrecision\n * @param sourceToken\n * @param destToken\n */\n async swapAndBridgeFeeCalculationReverse(\n amountInTokenPrecision: string,\n sourceToken: TokenWithChainDetails,\n destToken: TokenWithChainDetails\n ): Promise<SwapAndBridgeCalculationData> {\n return this.service.swapAndBridgeFeeCalculationReverse(amountInTokenPrecision, sourceToken, destToken);\n }\n\n /**\n * Show amount changes (fee and amount adjustment) during send through pools on source and destination chains\n */\n async getSendAmountDetails(\n amount: string,\n amountFormat: AmountFormat,\n sourceToken: TokenWithChainDetails,\n destToken: TokenWithChainDetails\n ): Promise<SendAmountDetails> {\n return this.service.getSendAmountDetails(amount, amountFormat, sourceToken, destToken);\n }\n}\n"],
5
5
  "mappings": "8jBAEA,OAAS,OAAAA,OAAoB,kBAuBtB,SAASC,GAAuBC,EAAaC,EAAsC,CAAC,IAAK,GAAG,EAAG,CACpG,GAAM,CAACC,EAAMC,CAAK,EAAIF,EAChBG,EAAgB,CAAC,EACnBC,EAAO,GACPC,EAAsB,EAE1B,QAASC,EAAI,EAAGA,EAAIP,EAAI,OAAQO,IAAK,CACnC,IAAMC,EAAOR,EAAIO,CAAC,EAOlB,GANIC,IAASN,GACXI,IAEEE,IAASL,GACXG,IAEEA,IAAwB,GAAKE,IAAS,IAAK,CAC7CJ,EAAI,KAAKC,EAAK,KAAK,CAAC,EACpBA,EAAO,GACP,QACF,CACAA,GAAQG,CACV,CAEA,OAAAJ,EAAI,KAAKC,EAAK,KAAK,CAAC,EAEbD,CACT,CAEO,SAASK,GAAcC,EAG5B,CACA,GAAI,OAAOA,GAAS,SAClB,MAAM,IAAI,MAAM,8CAA8CA,CAAI,EAAE,EAGtE,GAAM,CAACR,EAAMC,CAAK,EAAI,CAAC,IAAK,GAAG,EAEzBQ,EAAUD,EAAK,QAAQR,CAAI,EAC3BU,EAAU,MAAM,KAAKF,CAAI,EAAE,QAAQ,EAAE,QAAQP,CAAK,EAGxD,GAAIQ,IAAY,IAAMC,IAAY,GAChC,MAAO,CAAE,SAAUF,EAAM,SAAU,CAAC,CAAE,EAIxC,GAAIC,IAAY,IAAMC,IAAY,GAChC,MAAM,IAAI,MAAM,6BAA6BF,CAAI,GAAG,EAGtD,IAAMG,EAAWH,EAAK,MAAM,EAAGC,CAAO,EAChCG,EAAWf,GAAuBW,EAAK,MAAMC,EAAU,EAAGD,EAAK,OAASE,EAAU,CAAC,EAAG,CAACV,EAAMC,CAAK,CAAC,EAEzG,MAAO,CAAE,SAAAU,EAAU,SAAAC,CAAS,CAC9B,CAEO,SAASC,GAAsBC,EAA6C,CACjF,MAAI,CAACA,GAAO,OAAOA,GAAQ,UAAY,MAAM,QAAQA,CAAG,EAC/C,GAGF,YAAaA,GAAO,UAAWA,GAAO,WAAYA,GAAO,iBAAkBA,CACpF,CAEO,SAASC,EAAIC,EAAiBF,EAA6B,CAChE,OAAOD,GAAsBC,CAAG,EAAIA,EAAME,EAAG,OAAOF,CAAG,CACzD,CAEO,SAASG,GAAKD,EAAiBF,EAAcI,EAAmC,CACrF,GAAIL,GAAsBC,CAAG,EAC3B,OAAOC,EAAIC,EAAIF,CAAG,EAGpB,SAASK,EAAcD,EAA4B,CACjD,GAAM,CAAE,SAAAP,EAAU,SAAAC,CAAS,EAAIL,GAAcW,CAAI,EACjD,OAAQP,EAAU,CAChB,IAAK,OACH,OAAOf,GAAI,KACb,IAAK,KACH,OAAOA,GAAI,GACb,IAAK,MACH,OAAOA,GAAI,IACb,IAAK,MACH,OAAOA,GAAI,IACb,IAAK,MACH,OAAOA,GAAI,IACb,IAAK,OACH,OAAOA,GAAI,KACb,IAAK,OACH,OAAOA,GAAI,KACb,IAAK,UACH,OAAOA,GAAI,QACb,IAAK,sBACL,IAAK,qBACH,OAAOA,GAAI,OACb,IAAK,kBACH,OAAOA,GAAI,QACb,IAAK,sBACH,OAAOA,GAAI,OAAOuB,EAAcP,EAAS,CAAC,CAAC,CAAC,EAC9C,IAAK,SACH,OAAOhB,GAAI,OAAOuB,EAAcP,EAAS,CAAC,CAAC,CAAC,EAC9C,QACE,MAAM,IAAI,MAAM,0BAA0BM,CAAI,EAAE,CACpD,CACF,CAEA,SAASE,EAAmBC,EAAkB,CAC5C,QAAWC,KAAQD,EAAO,CACxB,GAAI,OAAOC,EAAS,KAAeA,IAAS,KAC1C,MAAO,GAGT,GAAI,MAAM,QAAQA,CAAI,EACpB,OAAOF,EAAmBE,CAAI,CAElC,CAEA,MAAO,EACT,CAEA,SAASC,EAA8BF,EAAkB,CACvD,QAAWC,KAAQD,EAAO,CACxB,GAAI,CAAC,MAAM,QAAQC,CAAI,EAAG,CACxB,GAAIA,IAAS,KACX,SAEF,OAAQ,OAAOA,EAAM,CACnB,IAAK,SACL,IAAK,SACL,IAAK,SACL,IAAK,UACH,SACF,QACE,MAAO,EACX,CACF,CAEA,OAAOC,EAA8BD,CAAI,CAC3C,CAEA,MAAO,EACT,CAEA,SAASE,EAAmBH,EAAkB,CAC5C,QAAWC,KAAQD,EAAO,CACxB,GAAI,CAAC,MAAM,QAAQC,CAAI,EACrB,OAAQ,OAAOA,EAAM,CACnB,IAAK,SACL,IAAK,SACL,IAAK,SACL,IAAK,UACH,MAAO,GACT,QACE,QACJ,CAGF,OAAOE,EAAmBF,CAAI,CAChC,CAEA,MAAO,EACT,CAGA,GAAM,CAAE,SAAAX,EAAU,SAAAC,CAAS,EAAIL,GAAcW,CAAI,EACjD,OAAQP,EAAU,CAChB,IAAK,sBACH,GAAIG,IAAQ,KACV,OAAOE,EAAG,KAAK,OAAO,OAAQ,IAAI,EAEpC,GAAIO,EAA8B,CAACT,CAAG,CAAC,EACrC,OAAOE,EAAG,KAAKG,EAAcD,CAAI,EAAE,UAAUJ,CAAG,CAAC,EAEnD,GAAIU,EAAmB,CAACV,CAAG,CAAC,EAC1B,MAAM,IAAI,MAAM,kEAAkE,EAIpF,OAAOE,EAAG,SAAS,CACjB,OAAQ,oBACR,cAAe,CAACJ,EAAS,CAAC,CAAC,EAC3B,UAAW,CAACK,GAAKD,EAAIF,EAAKF,EAAS,CAAC,CAAC,CAAC,CACxC,CAAC,EACH,IAAK,SACH,GAAI,CAAC,MAAM,QAAQE,CAAG,EACpB,MAAM,IAAI,MAAM,mCAAmC,EAErD,GAAIA,EAAI,SAAW,EACjB,OAAOE,EAAG,KAAKpB,GAAI,OAAOA,GAAI,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,EAEnD,GAAIwB,EAAmBN,CAAG,EACxB,MAAM,IAAI,MAAM,sDAAsD,EAExE,GAAIS,EAA8BT,CAAG,EACnC,OAAOE,EAAG,KAAKG,EAAcD,CAAI,EAAE,UAAUJ,CAAG,CAAC,EAEnD,GAAIU,EAAmBV,CAAG,EACxB,MAAM,IAAI,MAAM,kEAAkE,EAGpF,OAAOE,EAAG,YAAY,CACpB,KAAMJ,EAAS,CAAC,EAChB,SAAUE,CACZ,CAAC,EACH,QACE,OAAOE,EAAG,KAAKG,EAAcD,CAAI,EAAE,UAAUJ,CAAG,CAAC,CACrD,CACF,CAkGO,SAASW,GAAmBC,EAAsB,CAEvD,IAAMC,EAAWD,EAAK,MAAM,IAAI,EAAE,KAAK,EAAE,EACzC,QAASrB,EAAI,EAAGA,EAAIsB,EAAS,OAAQtB,IACnC,GAAIsB,EAAStB,CAAC,IAAM,IAClB,MAAO,KAAKsB,EAAS,UAAUtB,CAAC,CAAC,GAGrC,MAAO,KACT,CAIO,SAASuB,EAAgBV,EAAsB,CACpD,GAAM,CAAE,SAAAP,EAAU,SAAAC,CAAS,EAAIL,GAAcW,CAAI,EACjD,OAAQP,EAAU,CAChB,IAAK,OACL,IAAK,KACL,IAAK,MACL,IAAK,MACL,IAAK,MACL,IAAK,OACL,IAAK,OACL,IAAK,UACL,IAAK,SACH,OAAOA,EACT,IAAK,SACH,MAAO,UAAUiB,EAAgBhB,EAAS,CAAC,CAAC,CAAC,IAC/C,QAAS,CACP,IAAMV,EAAMS,EAAS,MAAM,IAAI,EAC/BT,EAAI,CAAC,EAAIuB,GAAmBvB,EAAI,CAAC,CAAC,EAClC,IAAM2B,EAAiB3B,EAAI,KAAK,IAAI,EACpC,OAAIU,EAAS,OAAS,EACb,GAAGiB,CAAc,IAAIjB,EAAS,IAAKkB,GAAYF,EAAgBE,CAAO,CAAC,EAAE,KAAK,GAAG,CAAC,IAElFD,CAEX,CACF,CACF,CAEO,SAASE,EAAepB,KAAqBC,EAA4B,CAC9E,OAAIA,EAAS,OAAS,EACb,GAAGD,CAAQ,IAAIC,EAAS,KAAK,IAAI,CAAC,IAElCD,CAEX,CAzXA,IAAAqB,EAAAC,GAAA,oBCAA,IAAAC,GAAAC,GAAA,CAAAC,GAAAC,KAAA,cACAC,IAEA,IAAMC,GAAN,MAAMC,CAAe,CACnB,OAAe,YAAc,GAC7B,OAAe,cAAgB,GAC/B,OAAe,OAAS,CAAC,EAEzB,IAAI,YAAa,CACf,OAAOC,EAAgBD,EAAe,WAAW,CACnD,CAEA,IAAI,cAAe,CACjB,OAAOC,EAAgBD,EAAe,aAAa,CACrD,CAEA,IAAI,QAAS,CACX,OAAOC,EAAgBD,EAAe,OAAO,CAAC,CAAC,CACjD,CAEA,aAAaE,EAAuB,CAClCF,EAAe,YAAcE,CAC/B,CAEA,eAAeA,EAAuB,CACpCF,EAAe,cAAgBE,CACjC,CAEA,QAAQC,EAAWD,EAAuB,CACxCF,EAAe,OAAOG,CAAC,EAAID,CAC7B,CAEA,WAAWA,EAAiBE,EAAgB,CAC1CJ,EAAe,YAAcE,EAC7BF,EAAe,cAAgBE,EAC/BF,EAAe,OAAO,CAAC,EAAII,GAASF,CACtC,CACF,EAEMG,GAAiB,IAAIN,GAC3BF,GAAA,QAASQ,KCxCT,IAAAC,GAAAC,GAAA,CAAAC,GAAAC,KAAA,cACAC,IAEA,IAAMC,GAAN,MAAMC,CAAe,CACnB,OAAe,YAAc,GAC7B,OAAe,cAAgB,GAC/B,OAAe,OAAS,CAAC,EACzB,IAAI,YAAa,CACf,OAAOC,EAAgBD,EAAe,WAAW,CACnD,CACA,IAAI,cAAe,CACjB,OAAOC,EAAgBD,EAAe,aAAa,CACrD,CACA,IAAI,QAAS,CACX,OAAOC,EAAgBD,EAAe,OAAO,CAAC,CAAC,CACjD,CACA,aAAaE,EAAuB,CAClCF,EAAe,YAAcE,CAC/B,CACA,eAAeA,EAAuB,CACpCF,EAAe,cAAgBE,CACjC,CACA,QAAQC,EAAWD,EAAuB,CACxCF,EAAe,OAAOG,CAAC,EAAID,CAC7B,CACA,WAAWA,EAAiBE,EAAgB,CAC1CJ,EAAe,YAAcE,EAC7BF,EAAe,cAAgBE,EAC/BF,EAAe,OAAO,CAAC,EAAII,GAASF,CACtC,CACF,EACMG,GAAiB,IAAIN,GAC3BF,GAAA,QAASQ,KChCT,IAAAC,GAAAC,GAAA,CAAAC,GAAAC,KAAA,cACAC,IAEA,IAAMC,GAAN,MAAMC,CAAe,CACnB,OAAe,YAAc,GAC7B,OAAe,cAAgB,GAC/B,OAAe,OAAS,CAAC,EACzB,IAAI,YAAa,CACf,OAAOC,EAAgBD,EAAe,WAAW,CACnD,CACA,IAAI,cAAe,CACjB,OAAOC,EAAgBD,EAAe,aAAa,CACrD,CACA,IAAI,QAAS,CACX,OAAOC,EAAgBD,EAAe,OAAO,CAAC,CAAC,CACjD,CACA,aAAaE,EAAuB,CAClCF,EAAe,YAAcE,CAC/B,CACA,eAAeA,EAAuB,CACpCF,EAAe,cAAgBE,CACjC,CACA,QAAQC,EAAWD,EAAuB,CACxCF,EAAe,OAAOG,CAAC,EAAID,CAC7B,CACA,WAAWA,EAAiBE,EAAgB,CAC1CJ,EAAe,YAAcE,EAC7BF,EAAe,cAAgBE,EAC/BF,EAAe,OAAO,CAAC,EAAII,GAASF,CACtC,CACF,EACMG,GAAiB,IAAIN,GAC3BF,GAAA,QAASQ,KC9BF,IAAMC,GAAmC,CAC9C,WAAY,wCACZ,mBAAoB,CAAC,EACrB,eAAgB,CAAC,EACjB,WAAY,kCACZ,2BAA4B,8CAC5B,kBAAmB,+CACnB,yBAA0B,iDAC1B,YAAa,kCACb,WAAY,CACV,yBAA0B,+CAC1B,yBAA0B,+CAC1B,YAAa,CAAE,IAAK,EAAG,IAAK,EAAG,IAAK,EAAG,IAAK,EAAG,IAAK,EAAG,IAAK,EAAG,IAAK,EAAG,IAAK,CAAE,CAChF,EACA,sBAAuB,EACzB,EAMaC,GAAkC,CAC7C,aAAc,sCACd,WAAY,yBACd,EAKaC,GAAkC,CAC7C,IAAK,sCACL,IAAK,0BACL,IAAK,8BACL,KAAM,8BACN,IAAK,iCACP,ECrCA,OAAS,WAAAC,OAAe,UACxB,OAAS,QAAAC,OAAY,OCDd,IAAeC,EAAf,cAAoC,KAAM,CACxC,UAEG,YAAYC,EAAiBC,EAAkB,CACvD,MAAMA,CAAO,EACb,KAAK,UAAYD,CACnB,CACF,EAEaE,EAAN,cAAuBH,CAAa,CACzC,YAAYE,EAAkB,CAC5B,MAAM,WAAqBA,CAAO,CACpC,CACF,EAEaE,GAAN,cAAiCJ,CAAa,CACnD,YAAYE,EAAkB,CAC5B,MAAM,qBAAgCA,CAAO,CAC/C,CACF,EAEaG,GAAN,cAAmCL,CAAa,CACrD,YAAYE,EAAkB,CAC5B,MAAM,uBAAmCA,CAAO,CAClD,CACF,EAEaI,GAAN,cAA6CN,CAAa,CAC/D,YAAYE,EAAkB,CAC5B,MAAM,iCAA6CA,CAAO,CAC5D,CACF,EAEaK,EAAN,cAA2BP,CAAa,CAC7C,YAAYE,EAAkB,CAC5B,MAAM,eAAyBA,CAAO,CACxC,CACF,EAEaM,GAAN,cAA8CR,CAAa,CAChE,YAAYE,EAAkB,CAC5B,MAAM,kCAAgDA,CAAO,CAC/D,CACF,EAEaO,GAAN,cAA0CT,CAAa,CAC5D,YAAYE,EAAkB,CAC5B,MAAM,8BAA0CA,CAAO,CACzD,CACF,EAEaQ,EAAN,cAAsCV,CAAa,CACxD,YAAYE,EAAkB,CAC5B,MAAM,0BAAsCA,CAAO,CACrD,CACF,EAEaS,GAAN,cAA4BX,CAAa,CAC9C,YAAYE,EAAkB,CAC5B,MAAM,gBAA2BA,CAAO,CAC1C,CACF,EAEaU,GAAN,cAA6BZ,CAAa,CAC/C,YAAYE,EAAkB,CAC5B,MAAM,iBAA4BA,CAAO,CAC3C,CACF,EAEaW,GAAN,cAA4Cb,CAAa,CAC9D,YAAYE,EAAkB,CAC5B,MAAM,gCAA8CA,CAAO,CAC7D,CACF,EAEaY,GAAN,cAA2Cd,CAAa,CAC7D,YAAYe,EAAiBC,EAAoBC,EAA0B,CACzE,MACE,+BACA,aAAaF,CAAO,eAAeC,CAAU,6BAA6BC,CAAgB,GAC5F,CACF,CACF,EAEaC,GAAN,cAA2BlB,CAAa,CAC7C,YAAYE,EAAkB,CAC5B,MAAM,eAAyBA,CAAO,CACxC,CACF,EAEaiB,GAAN,cAA4CnB,CAAa,CAC9D,YAAYoB,EAAqB,CAC/B,MAAM,gCAA8C,cAAcA,CAAW,gCAAgC,CAC/G,CACF,EAEaC,GAAN,cAAwCrB,CAAa,CAC1D,YAAYE,EAAkB,CAC5B,MAAM,4BAAyCA,CAAO,CACxD,CACF,EAEaoB,GAAN,cAAuCtB,CAAa,CACzD,YAAYE,EAAkB,CAC5B,MAAM,2BAAwCA,CAAO,CACvD,CACF,EAEaqB,GAAN,cAAyCvB,CAAa,CAC3D,YAAYE,EAAkB,CAC5B,MAAM,6BAA0CA,CAAO,CACzD,CACF,EAEasB,GAAN,cAA8BxB,CAAa,CAChD,aAAc,CACZ,MACE,kBACA,iHACF,CACF,CACF,EAEYyB,QACVA,EAAA,UAAY,WACZA,EAAA,qBAAuB,qBACvBA,EAAA,wBAA0B,uBAC1BA,EAAA,kCAAoC,iCACpCA,EAAA,cAAgB,eAChBA,EAAA,qCAAuC,kCACvCA,EAAA,+BAAiC,8BACjCA,EAAA,2BAA6B,0BAC7BA,EAAA,gBAAkB,gBAClBA,EAAA,iBAAmB,iBACnBA,EAAA,mCAAqC,gCACrCA,EAAA,gCAAkC,+BAClCA,EAAA,cAAgB,eAChBA,EAAA,mCAAqC,gCACrCA,EAAA,8BAAgC,4BAChCA,EAAA,6BAA+B,2BAC/BA,EAAA,+BAAiC,6BACjCA,EAAA,aAAe,kBAlBLA,QAAA,IC3HL,IAAKC,QAIVA,EAAA,IAAM,MAKNA,EAAA,IAAM,MAKNA,EAAA,IAAM,MAKNA,EAAA,IAAM,MAKNA,EAAA,IAAM,MAKNA,EAAA,IAAM,MAKNA,EAAA,IAAM,MAKNA,EAAA,IAAM,MAKNA,EAAA,IAAM,MAKNA,EAAA,IAAM,MAKNA,EAAA,KAAO,OAKPA,EAAA,IAAM,MAKNA,EAAA,IAAM,MAKNA,EAAA,IAAM,MAKNA,EAAA,IAAM,MAKNA,EAAA,IAAM,MA/EIA,QAAA,IAkFAC,OACVA,EAAA,IAAM,MACNA,EAAA,OAAS,SACTA,EAAA,IAAM,MACNA,EAAA,IAAM,MACNA,EAAA,IAAM,MALIA,OAAA,IC3EZ,IAAMC,GAAiD,CACrD,IAAK,GACL,OAAQ,EACR,IAAK,EACL,IAAK,EACL,IAAK,CACP,EAEMC,GAA0D,CAC7D,IAAkB,CACjB,kBACA,QAAS,OACT,KAAM,YACN,eACF,EACC,IAAkB,CACjB,kBACA,QAAS,MACT,KAAM,WACN,eACF,EACC,IAAkB,CACjB,kBACA,QAAS,SACT,KAAM,OACN,eACF,EACC,IAAkB,CACjB,kBACA,QAAS,SACT,KAAM,WACN,eACF,EACC,IAAkB,CACjB,kBACA,QAAS,SACT,KAAM,YACN,eACF,EACC,IAAkB,CACjB,kBACA,QAAS,SACT,KAAM,OACN,eACF,EACC,IAAkB,CACjB,kBACA,QAAS,OACT,KAAM,UACN,eACF,EACC,IAAkB,CACjB,kBACA,QAAS,MACT,KAAM,aACN,eACF,EACC,IAAkB,CACjB,kBACA,QAAS,OACT,KAAM,QACN,eACF,EACC,IAAkB,CACjB,kBACA,QAAS,OACT,KAAM,WACN,eACF,EACC,IAAkB,CACjB,kBACA,QAAS,SACT,KAAM,QACN,eACF,EACC,IAAkB,CACjB,kBACA,KAAM,SACN,kBACF,EACC,IAAkB,CACjB,kBACA,KAAM,OACN,eACF,EACC,IAAkB,CACjB,kBACA,KAAM,UACN,eACF,EACC,KAAmB,CAClB,mBACA,KAAM,UACN,eACF,EACC,IAAkB,CACjB,kBACA,KAAM,MACN,eACF,CACF,EAEaC,GAAU,IAAM,CAC3B,IAAIC,EAAwD,CAAE,GAAGF,EAAkB,EAEnF,MAAO,CACL,oBAAoBG,EAA6D,CAC/ED,EAAkB,CAAE,GAAGA,EAAiB,GAAGC,CAAqB,CAClE,EAEA,iBAAiBC,EAA2C,CAC1D,IAAMC,EAAWH,EAAgBE,CAAW,EAC5C,GAAI,CAACC,EACH,MAAM,IAAIC,EAAS,oCAAoCF,CAAW,EAAE,EAEtE,OAAOC,CACT,EAEA,qBAA4D,CAC1D,OAAOH,CACT,EAEA,uBAAuBK,EAA8B,CACnD,OAAOR,GAAoBQ,CAAS,CACtC,CACF,CACF,GAAG,ECnHI,IAAKC,QACVA,EAAA,GAAK,KACLA,EAAA,QAAU,UACVA,EAAA,UAAY,YACZA,EAAA,cAAgB,gBAChBA,EAAA,iBAAmB,mBACnBA,EAAA,+BAAiC,iCANvBA,QAAA,IA6DL,IAAKC,QACVA,IAAA,UAAY,GAAZ,YACAA,IAAA,SAAW,GAAX,WACAA,IAAA,KAAO,GAAP,OACAA,IAAA,QAAU,GAAV,UACAA,IAAA,IAAM,GAAN,MALUA,QAAA,IC/EZ,OAAS,OAAAC,OAAsB,SAK/B,eAAsBC,EACpBC,EACAC,EACmB,CACnB,OAAO,MAAMD,EAAI,iBAAiB,CAChC,YAAaC,EAAiB,YAC9B,YAAaA,EAAiB,WAChC,CAAC,CACH,CAEO,SAASC,EAAqBC,EAAmB,CACtD,GAAIC,GAAID,CAAM,EAAE,IAAI,CAAC,EACnB,MAAM,IAAIE,GAAmB,kCAAkC,CAEnE,CAEO,SAASC,EAAuBC,EAAiBC,EAAoCC,EAAyB,CACnH,IAAMN,EAASC,GAAII,CAAW,EAAE,QAAQ,EAElC,CAACE,EAAaC,CAAc,EAAIR,EAAO,MAAM,GAAG,EAEtD,GAAIQ,GAAkBA,EAAe,OAASF,EAC5C,MAAM,IAAIG,GAA6BL,EAASI,EAAe,OAAQF,CAAe,CAE1F,CAEA,eAAsBI,GAAsBC,EAAqBC,EAAaC,EAA+B,CAC3G,OAAQ,MAAM,QAAQ,KAAK,CACzBF,EACA,IAAI,QAAQ,CAACG,EAASC,IAAW,CAC/B,WAAW,IAAMA,EAAO,IAAIC,GAAaJ,CAAG,CAAC,EAAGC,CAAS,CAC3D,CAAC,CACH,CAAC,CACH,CAEA,eAAsBI,GACpBC,EACAN,EACAO,EACAN,EACY,CACZ,GAAIM,EAAa,EACf,MAAM,IAAI,MAAM,0DAA0DA,CAAU,gBAAgB,EACtG,IAAIC,EAAe,EACnB,OACE,GAAI,CACF,OAAO,MAAMV,GAAmBQ,EAAM,EAAGN,EAAKC,CAAS,CACzD,MAAsB,CACpB,GAAI,EAAEO,GAAgBD,EAAY,MAAM,IAAIH,GAAaJ,CAAG,CAC9D,CAEJ,CAMA,eAAsBS,GACpBC,EACAC,EACAC,EACAC,EAAoB,IACpBC,EAAU,GACI,CACd,IAAMC,EAAgB,CAAC,EAEnBC,EAAQ,EACNC,EAAiB,MAAMP,EAAG,EAEhC,GADAK,EAAS,KAAKE,CAAc,EACxB,CAACN,EAAcM,CAAc,EAAG,OAAOF,EAE3C,IAAMG,EAAY,IAAI,KAAK,KAAK,IAAI,EAAIN,EAAgB,GAAI,EAAE,QAAQ,EAClEO,EAAW,IACXC,EAAgBD,EAEpB,KAAO,KAAK,IAAI,EAAID,GAAW,CAC7B,IAAMG,EAAcN,EAASA,EAAS,OAAS,CAAC,EAChD,GAAIM,IAAgB,QAAa,CAACV,EAAcU,CAAW,EAAG,MAE9DL,IAEIF,GACF,QAAQ,KACN,WAAWK,CAAQ,2DAA2DC,CAAa,uBACzFR,EAAgB,GAClB,KACF,EAEF,MAAM,IAAI,QAASU,GAAQ,WAAWA,EAAKH,CAAQ,CAAC,EAEpDA,EAAWA,EAAWN,EAClB,IAAI,KAAK,KAAK,IAAI,EAAIM,CAAQ,EAAE,QAAQ,EAAID,IAC9CC,EAAWD,EAAY,KAAK,IAAI,EAC5BJ,GACF,QAAQ,KAAK,0CAA0CK,CAAQ,IAAI,GAGvEC,EAAgBD,EAAWC,EAE3B,IAAMG,EAAc,MAAMb,EAAGW,CAAW,EACxCN,EAAS,KAAKQ,CAAW,EACrBT,GAAWH,EAAcY,CAAW,GACtC,QAAQ,KACN,GAAGP,CAAK,YAAYN,EAAG,IAAI,KAAKK,EAAS,MAAM,gCAAgC,KAAK,UAClFA,EAASA,EAAS,OAAS,CAAC,EAC5B,KACA,CACF,CAAC,EACH,CAEJ,CAEA,OAAOA,CACT,CCtHA,OAAS,OAAAS,OAAW,SCApB,IAAMC,GAAW,CACf,IAAK,CACH,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,WACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,kBACN,KAAM,SACR,EACA,CACE,aAAc,qBACd,KAAM,sBACN,KAAM,SACR,EACA,CACE,aAAc,6BACd,KAAM,qBACN,KAAM,SACR,EACA,CACE,aAAc,sBACd,KAAM,aACN,KAAM,SACR,CACF,EACA,gBAAiB,aACjB,KAAM,aACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,MACN,KAAM,SACR,CACF,EACA,KAAM,wBACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,gBACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,WACN,KAAM,SACR,CACF,EACA,KAAM,uBACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,wBACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,yBACN,KAAM,SACR,CACF,EACA,KAAM,aACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,SACN,KAAM,SACR,CACF,EACA,KAAM,WACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,YACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,YACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,eACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,aACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,gBACN,KAAM,SACR,CACF,EACA,KAAM,UACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,YACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,QACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,yBACd,KAAM,YACN,KAAM,OACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,UACN,KAAM,SACR,CACF,EACA,KAAM,iBACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,YACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,qBACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,eACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,QACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,yBACd,KAAM,YACN,KAAM,OACR,CACF,EACA,KAAM,aACN,KAAM,OACR,EACA,CACE,gBAAiB,UACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,WACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,eACN,KAAM,SACR,CACF,EACA,KAAM,iBACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,gBACd,KAAM,OACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,QACN,KAAM,SACR,CACF,EACA,KAAM,UACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,UACN,QAAS,CACP,CACE,aAAc,QACd,KAAM,GACN,KAAM,OACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,UACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,UACN,KAAM,SACR,CACF,EACA,KAAM,WACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,SACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,qBACN,KAAM,SACR,EACA,CACE,aAAc,yBACd,KAAM,YACN,KAAM,OACR,EACA,CACE,aAAc,UACd,KAAM,eACN,KAAM,SACR,CACF,EACA,KAAM,0BACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,UACN,KAAM,SACR,EACA,CACE,aAAc,yBACd,KAAM,WACN,KAAM,OACR,CACF,EACA,KAAM,iBACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,UACN,KAAM,SACR,EACA,CACE,aAAc,yBACd,KAAM,WACN,KAAM,OACR,CACF,EACA,KAAM,qBACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,UACN,KAAM,SACR,CACF,EACA,KAAM,qBACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,UACN,KAAM,SACR,EACA,CACE,aAAc,yBACd,KAAM,WACN,KAAM,OACR,CACF,EACA,KAAM,qBACN,QAAS,CACP,CACE,aAAc,OACd,KAAM,GACN,KAAM,MACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,UACN,KAAM,SACR,CACF,EACA,KAAM,iBACN,QAAS,CACP,CACE,aAAc,OACd,KAAM,GACN,KAAM,MACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,YACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,gBACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,qBACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,eACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,QACN,KAAM,SACR,EACA,CACE,aAAc,yBACd,KAAM,YACN,KAAM,OACR,CACF,EACA,KAAM,cACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,UACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,eACN,KAAM,SACR,CACF,EACA,KAAM,oBACN,QAAS,CACP,CACE,aAAc,OACd,KAAM,cACN,KAAM,MACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,UACN,KAAM,SACR,CACF,EACA,KAAM,eACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,gBACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,QACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,UACN,KAAM,SACR,CACF,EACA,KAAM,QACN,QAAS,CACP,CACE,aAAc,gBACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,cACN,KAAM,SACR,CACF,EACA,KAAM,oBACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,cACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,YACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,gBACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,eACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,QACN,KAAM,SACR,EACA,CACE,aAAc,yBACd,KAAM,YACN,KAAM,OACR,EACA,CACE,aAAc,UACd,KAAM,mBACN,KAAM,SACR,CACF,EACA,KAAM,gBACN,QAAS,CAAC,EACV,gBAAiB,UACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,WACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,gBACN,KAAM,SACR,CACF,EACA,KAAM,iBACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,WACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,eACN,KAAM,SACR,CACF,EACA,KAAM,oBACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,oBACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,cACN,KAAM,SACR,CACF,EACA,KAAM,eACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,SACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,qBACd,KAAM,sBACN,KAAM,SACR,CACF,EACA,KAAM,wBACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,sBACd,KAAM,aACN,KAAM,SACR,CACF,EACA,KAAM,eACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,UACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,YACN,KAAM,SACR,CACF,EACA,KAAM,cACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,cACN,KAAM,SACR,CACF,EACA,KAAM,gBACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,iBACN,KAAM,SACR,CACF,EACA,KAAM,mBACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,6BACd,KAAM,qBACN,KAAM,SACR,CACF,EACA,KAAM,uBACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,YACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,WACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,QACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,eACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,YACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,mBACN,KAAM,SACR,CACF,EACA,KAAM,OACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,QACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,YACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,qBACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,eACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,QACN,KAAM,SACR,EACA,CACE,aAAc,yBACd,KAAM,YACN,KAAM,OACR,EACA,CACE,aAAc,UACd,KAAM,iBACN,KAAM,SACR,CACF,EACA,KAAM,gBACN,QAAS,CAAC,EACV,gBAAiB,UACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,WACN,KAAM,SACR,CACF,EACA,KAAM,oBACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,kBACd,KAAM,QACN,KAAM,SACR,CACF,EACA,KAAM,8BACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,SACN,KAAM,SACR,CACF,EACA,KAAM,oBACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,gBAAiB,UACjB,KAAM,SACR,CACF,CACF,EACOC,GAAQD,GCz5Bf,IAAME,GAAW,CACf,IAAK,CACH,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,WACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,kBACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,eACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,iBACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,mBACN,KAAM,SACR,EACA,CACE,aAAc,sBACd,KAAM,aACN,KAAM,SACR,CACF,EACA,gBAAiB,aACjB,KAAM,aACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,gBACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,WACN,KAAM,SACR,CACF,EACA,KAAM,uBACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,YACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,SACN,KAAM,SACR,CACF,EACA,KAAM,mBACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,SACN,KAAM,SACR,CACF,EACA,KAAM,cACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,QACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,eACN,KAAM,SACR,CACF,EACA,KAAM,oBACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,yBACN,KAAM,SACR,CACF,EACA,KAAM,mBACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,YACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,qBACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,QACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,4BACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,+BACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,aACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,gCACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,sBACN,KAAM,SACR,CACF,EACA,KAAM,aACN,KAAM,OACR,EACA,CACE,gBAAiB,UACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,kBACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,YACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,qBACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,wBACN,KAAM,SACR,CACF,EACA,KAAM,SACN,QAAS,CAAC,EACV,gBAAiB,UACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,YACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,yBACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,qBACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,wBACN,KAAM,SACR,CACF,EACA,KAAM,0BACN,QAAS,CAAC,EACV,gBAAiB,UACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,UACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,QACd,KAAM,kBACN,KAAM,OACR,EACA,CACE,aAAc,QACd,KAAM,sBACN,KAAM,OACR,EACA,CACE,aAAc,UACd,KAAM,eACN,KAAM,SACR,CACF,EACA,KAAM,kBACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,UACN,KAAM,SACR,CACF,EACA,KAAM,WACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,SACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,qBACN,KAAM,SACR,CACF,EACA,KAAM,0BACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,WACN,KAAM,SACR,CACF,EACA,KAAM,qBACN,QAAS,CACP,CACE,aAAc,SACd,KAAM,GACN,KAAM,QACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,UACN,KAAM,SACR,CACF,EACA,KAAM,qBACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,gBACN,KAAM,SACR,EACA,CACE,aAAc,SACd,KAAM,QACN,KAAM,QACR,CACF,EACA,KAAM,qBACN,QAAS,CACP,CACE,aAAc,OACd,KAAM,GACN,KAAM,MACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,QACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,YACN,KAAM,SACR,EACA,CACE,aAAc,QACd,KAAM,UACN,KAAM,OACR,EACA,CACE,aAAc,QACd,KAAM,YACN,KAAM,OACR,CACF,EACA,KAAM,gBACN,QAAS,CAAC,EACV,gBAAiB,UACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,WACN,KAAM,SACR,EACA,CACE,aAAc,SACd,KAAM,SACN,KAAM,QACR,CACF,EACA,KAAM,4BACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,oBACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,mBACN,KAAM,SACR,CACF,EACA,KAAM,mBACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,sBACd,KAAM,aACN,KAAM,SACR,CACF,EACA,KAAM,eACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,UACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,YACN,KAAM,SACR,CACF,EACA,KAAM,cACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,WACN,KAAM,SACR,CACF,EACA,KAAM,oBACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,WACN,KAAM,SACR,CACF,EACA,KAAM,8BACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,sBACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,SACN,KAAM,SACR,CACF,EACA,KAAM,cACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,gBAAiB,UACjB,KAAM,SACR,CACF,CACF,EACOC,GAAQD,GC3jBf,IAAME,GAAW,CACf,IAAK,CACH,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,WACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,kBACN,KAAM,SACR,EACA,CACE,aAAc,sBACd,KAAM,aACN,KAAM,SACR,CACF,EACA,gBAAiB,aACjB,KAAM,aACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,SACd,KAAM,aACN,KAAM,QACR,CACF,EACA,KAAM,oBACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,YACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,eACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,qBACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,4BACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,+BACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,yBACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,gCACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,sBACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,2BACN,KAAM,SACR,CACF,EACA,KAAM,gBACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,gBACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,WACN,KAAM,SACR,CACF,EACA,KAAM,uBACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,SACN,KAAM,SACR,CACF,EACA,KAAM,cACN,KAAM,OACR,EACA,CACE,gBAAiB,UACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,OACN,KAAM,SACR,CACF,EACA,KAAM,WACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,eACN,KAAM,SACR,CACF,EACA,KAAM,kBACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,WACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,eACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,YACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,qBACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,wBACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,6BACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,aACN,KAAM,SACR,CACF,EACA,KAAM,SACN,QAAS,CAAC,EACV,gBAAiB,UACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,UACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,gBACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,sBACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,kBACN,KAAM,SACR,CACF,EACA,KAAM,gBACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,WACN,KAAM,SACR,CACF,EACA,KAAM,kBACN,QAAS,CACP,CACE,aAAc,SACd,KAAM,GACN,KAAM,QACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,eACN,KAAM,SACR,CACF,EACA,KAAM,aACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,aACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,QACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,WACN,KAAM,SACR,EACA,CACE,aAAc,SACd,KAAM,OACN,KAAM,QACR,EACA,CACE,aAAc,UACd,KAAM,cACN,KAAM,SACR,CACF,EACA,KAAM,4BACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,gBACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,sBACN,KAAM,SACR,CACF,EACA,KAAM,aACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,OACN,KAAM,SACR,CACF,EACA,KAAM,cACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,oBACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,gBACN,KAAM,SACR,EACA,C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E,KAAM,QACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,OACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,cACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,gBACN,MAAO,GACP,SAAU,EACZ,CACF,EACA,KAAM,CAAC,CACT,EACA,CACE,KAAM,UACN,SAAU,CACR,CACE,KAAM,OACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,OACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,SACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,OACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,cACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,YACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,cACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,kBACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,eACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,gBACN,MAAO,GACP,SAAU,EACZ,CACF,EACA,KAAM,CACJ,CACE,KAAM,SACN,KAAM,KACR,CACF,CACF,EACA,CACE,KAAM,WACN,SAAU,CACR,CACE,KAAM,OACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,OACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,SACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,OACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,cACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,YACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,cACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,kBACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,eACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,gBACN,MAAO,GACP,SAAU,EACZ,CACF,EACA,KAAM,CACJ,CACE,KAAM,WACN,KAAM,KACR,CACF,CACF,EACA,CACE,KAAM,gBACN,SAAU,CACR,CACE,KAAM,OACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,QACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,OACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,OACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,SACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,mBACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,YACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,kBACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,qBACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,oBACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,OACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,cACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,WACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,eACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,cACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,YACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,kBACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,eACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,gBACN,MAAO,GACP,SAAU,EACZ,CACF,EACA,KAAM,CACJ,CACE,KAAM,OACN,KAAM,CACJ,QAAS,YACX,CACF,CACF,CACF,EACA,CACE,KAAM,wBACN,SAAU,CACR,CACE,KAAM,OACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,QACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,OACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,OACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,SACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,mBACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,OACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,cACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,WACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,eACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,cACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,YACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,kBACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,oBACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,0BACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,kBACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,SACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,UACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,WACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,eACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,oBACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,QACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,OACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,eACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,gBACN,MAAO,GACP,SAAU,EACZ,CACF,EACA,KAAM,CACJ,CACE,KAAM,OACN,KAAM,CACJ,QAAS,YACX,CACF,CACF,CACF,EACA,CACE,KAAM,OACN,SAAU,CACR,CACE,KAAM,OACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,QACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,WACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,cACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,SACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,WACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,cACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,kBACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,qBACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,gBACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,mBACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,kBACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,eACN,MAAO,GACP,SAAU,EACZ,CACF,EACA,KAAM,CACJ,CACE,KAAM,SACN,KAAM,KACR,EACA,CACE,KAAM,mBACN,KAAM,KACR,CACF,CACF,EACA,CACE,KAAM,sBACN,SAAU,CACR,CACE,KAAM,QACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,QACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,SACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,cACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,gBACN,MAAO,GACP,SAAU,EACZ,CACF,EACA,KAAM,CACJ,CACE,KAAM,OACN,KAAM,CACJ,QAAS,yBACX,CACF,CACF,CACF,EACA,CACE,KAAM,oBACN,SAAU,CACR,CACE,KAAM,QACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,SACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,cACN,MAAO,GACP,SAAU,EACZ,CACF,EACA,KAAM,CACJ,CACE,KAAM,OACN,KAAM,CACJ,QAAS,uBACX,CACF,CACF,CACF,EACA,CACE,KAAM,iBACN,SAAU,CACR,CACE,KAAM,OACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,QACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,OACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,SACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,OACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,cACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,yBACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,SACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,cACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,YACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,kBACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,eACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,gBACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,mBACN,MAAO,GACP,SAAU,EACZ,CACF,EACA,KAAM,CACJ,CACE,KAAM,OACN,KAAM,CACJ,QAAS,YACX,CACF,CACF,CACF,EACA,CACE,KAAM,yBACN,SAAU,CACR,CACE,KAAM,OACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,QACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,OACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,SACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,OACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,cACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,yBACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,SACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,cACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,YACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,kBACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,eACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,gBACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,mBACN,MAAO,GACP,SAAU,EACZ,CACF,EACA,KAAM,CACJ,CACE,KAAM,OACN,KAAM,CACJ,QAAS,YACX,CACF,CACF,CACF,EACA,CACE,KAAM,mBACN,SAAU,CACR,CACE,KAAM,QACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,YACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,SACN,MAAO,GACP,SAAU,EACZ,CACF,EACA,KAAM,CACJ,CACE,KAAM,SACN,KAAM,KACR,CACF,CACF,EACA,CACE,KAAM,eACN,SAAU,CACR,CACE,KAAM,OACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,OACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,SACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,OACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,cACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,YACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,cACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,kBACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,eACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,gBACN,MAAO,GACP,SAAU,EACZ,CACF,EACA,KAAM,CAAC,CACT,EACA,CACE,KAAM,WACN,SAAU,CACR,CACE,KAAM,QACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,WACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,SACN,MAAO,GACP,SAAU,EACZ,CACF,EACA,KAAM,CAAC,CACT,EACA,CACE,KAAM,cACN,SAAU,CACR,CACE,KAAM,QACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,SACN,MAAO,GACP,SAAU,EACZ,CACF,EACA,KAAM,CACJ,CACE,KAAM,aACN,KAAM,CACJ,QAAS,YACX,CACF,CACF,CACF,EACA,CACE,KAAM,aACN,SAAU,CACR,CACE,KAAM,gBACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,SACN,MAAO,GACP,SAAU,EACZ,CACF,EACA,KAAM,CACJ,CACE,KAAM,aACN,KAAM,CACJ,QAAS,YACX,CACF,CACF,CACF,EACA,CACE,KAAM,gBACN,SAAU,CACR,CACE,KAAM,QACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,SACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,aACN,MAAO,GACP,SAAU,EACZ,CACF,EACA,KAAM,CAAC,CACT,EACA,CACE,KAAM,mBACN,SAAU,CACR,CACE,KAAM,QACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,eACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,SACN,MAAO,GACP,SAAU,EACZ,CACF,EACA,KAAM,CAAC,CACT,EACA,CACE,KAAM,iCACN,SAAU,CACR,CACE,KAAM,QACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,SACN,MAAO,GACP,SAAU,EACZ,CACF,EACA,KAAM,CACJ,CACE,KAAM,eACN,KAAM,WACR,CACF,CACF,EACA,CACE,KAAM,gCACN,SAAU,CACR,CACE,KAAM,QACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,SACN,MAAO,GACP,SAAU,EACZ,CACF,EACA,KAAM,CACJ,CACE,KAAM,eACN,KAAM,WACR,CACF,CACF,EACA,CACE,KAAM,wBACN,SAAU,CACR,CACE,KAAM,QACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,SACN,MAAO,GACP,SAAU,EACZ,CACF,EACA,KAAM,CACJ,CACE,KAAM,eACN,KAAM,WACR,CACF,CACF,EACA,CACE,KAAM,kBACN,SAAU,CACR,CACE,KAAM,QACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,SACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,OACN,MAAO,GACP,SAAU,EACZ,CACF,EACA,KAAM,CACJ,CACE,KAAM,aACN,KAAM,KACR,CACF,CACF,EACA,CACE,KAAM,qBACN,SAAU,CACR,CACE,KAAM,QACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,SACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,OACN,MAAO,GACP,SAAU,EACZ,CACF,EACA,KAAM,CACJ,CACE,KAAM,oBACN,KAAM,KACR,CACF,CACF,EACA,CACE,KAAM,uBACN,SAAU,CACR,CACE,KAAM,QACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,SACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,OACN,MAAO,GACP,SAAU,EACZ,CACF,EACA,KAAM,CACJ,CACE,KAAM,aACN,KAAM,KACR,CACF,CACF,EACA,CACE,KAAM,sBACN,SAAU,CACR,CACE,KAAM,QACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,QACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,SACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,mBACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,gBACN,MAAO,GACP,SAAU,EACZ,CACF,EACA,KAAM,CACJ,CACE,KAAM,UACN,KAAM,IACR,EACA,CACE,KAAM,eACN,KAAM,CACJ,MAAO,CAAC,KAAM,EAAE,CAClB,CACF,CACF,CACF,EACA,CACE,KAAM,yBACN,SAAU,CACR,CACE,KAAM,QACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,QACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,SACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,mBACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,gBACN,MAAO,GACP,SAAU,EACZ,CACF,EACA,KAAM,CACJ,CACE,KAAM,UACN,KAAM,IACR,EACA,CACE,KAAM,eACN,KAAM,CACJ,MAAO,CAAC,KAAM,EAAE,CAClB,CACF,CACF,CACF,EACA,CACE,KAAM,mBACN,SAAU,CACR,CACE,KAAM,QACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,OACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,SACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,OACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,cACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,aACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,kBACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,eACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,gBACN,MAAO,GACP,SAAU,EACZ,CACF,EACA,KAAM,CAAC,CACT,EACA,CACE,KAAM,sBACN,SAAU,CACR,CACE,KAAM,QACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,OACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,SACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,OACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,cACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,YACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,cACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,kBACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,eACN,MAAO,GACP,SAAU,EACZ,CACF,EACA,KAAM,CAAC,CACT,CACF,EACA,SAAU,CACR,CACE,KAAM,cACN,KAAM,CACJ,KAAM,SACN,OAAQ,CACN,CACE,KAAM,UACN,KAAM,CACJ,MAAO,CAAC,KAAM,EAAE,CAClB,CACF,EACA,CACE,KAAM,UACN,KAAM,IACR,EACA,CACE,KAAM,WACN,KAAM,KACR,CACF,CACF,CACF,EACA,CACE,KAAM,SACN,KAAM,CACJ,KAAM,SACN,OAAQ,CACN,CACE,KAAM,QACN,KAAM,WACR,EACA,CACE,KAAM,8BACN,KAAM,WACR,EACA,CACE,KAAM,6BACN,KAAM,WACR,EACA,CACE,KAAM,qBACN,KAAM,WACR,EACA,CACE,KAAM,aACN,KAAM,WACR,EACA,CACE,KAAM,gBACN,KAAM,WACR,EACA,CACE,KAAM,oBACN,KAAM,IACR,EACA,CACE,KAAM,UACN,KAAM,MACR,EACA,CACE,KAAM,aACN,KAAM,MACR,EACA,CACE,KAAM,cACN,KAAM,MACR,CACF,CACF,CACF,EACA,CACE,KAAM,OACN,KAAM,CACJ,KAAM,SACN,OAAQ,CACN,CACE,KAAM,SACN,KAAM,WACR,EACA,CACE,KAAM,mBACN,KAAM,WACR,EACA,CACE,KAAM,SACN,KAAM,KACR,EACA,CACE,KAAM,aACN,KAAM,KACR,EACA,CACE,KAAM,YACN,KAAM,CACJ,MAAO,CAAC,KAAM,EAAE,CAClB,CACF,EACA,CACE,KAAM,qBACN,KAAM,IACR,EACA,CACE,KAAM,eACN,KAAM,CACJ,MAAO,CAAC,KAAM,EAAE,CAClB,CACF,EACA,CACE,KAAM,QACN,KAAM,CACJ,MAAO,CAAC,KAAM,EAAE,CAClB,CACF,EACA,CACE,KAAM,YACN,KAAM,CACJ,QAAS,WACX,CACF,EACA,CACE,KAAM,OACN,KAAM,KACR,EACA,CACE,KAAM,MACN,KAAM,KACR,CACF,CACF,CACF,EACA,CACE,KAAM,mBACN,KAAM,CACJ,KAAM,SACN,OAAQ,CAAC,CACX,CACF,EACA,CACE,KAAM,OACN,KAAM,CACJ,KAAM,SACN,OAAQ,CACN,CACE,KAAM,OACN,KAAM,WACR,EACA,CACE,KAAM,IACN,KAAM,KACR,EACA,CACE,KAAM,IACN,KAAM,KACR,EACA,CACE,KAAM,eACN,KAAM,KACR,EACA,CACE,KAAM,cACN,KAAM,KACR,EACA,CACE,KAAM,WACN,KAAM,KACR,EACA,CACE,KAAM,WACN,KAAM,IACR,EACA,CACE,KAAM,gBACN,KAAM,KACR,EACA,CACE,KAAM,aACN,KAAM,KACR,EACA,CACE,KAAM,kBACN,KAAM,KACR,EACA,CACE,KAAM,qBACN,KAAM,MACR,EACA,CACE,KAAM,iBACN,KAAM,KACR,EACA,CACE,KAAM,oBACN,KAAM,KACR,CACF,CACF,CACF,EACA,CACE,KAAM,SACN,KAAM,CACJ,KAAM,SACN,OAAQ,CACN,CACE,KAAM,OACN,KAAM,CACJ,MAAO,CAAC,KAAM,EAAE,CAClB,CACF,EACA,CACE,KAAM,SACN,KAAM,KACR,EACA,CACE,KAAM,MACN,KAAM,KACR,EACA,CACE,KAAM,aACN,KAAM,KACR,EACA,CACE,KAAM,OACN,KAAM,KACR,CACF,CACF,CACF,EACA,CACE,KAAM,cACN,KAAM,CACJ,KAAM,SACN,OAAQ,CACN,CACE,KAAM,cACN,KAAM,WACR,EACA,CACE,KAAM,OACN,KAAM,WACR,EACA,CACE,KAAM,WACN,KAAM,KACR,EACA,CACE,KAAM,aACN,KAAM,KACR,CACF,CACF,CACF,CACF,EACA,MAAO,CACL,CACE,KAAM,0BACN,KAAM,CACJ,KAAM,SACN,OAAQ,CACN,CACE,KAAM,qBACN,KAAM,CACJ,MAAO,CAAC,KAAM,EAAE,CAClB,CACF,EACA,CACE,KAAM,UACN,KAAM,IACR,EACA,CACE,KAAM,WACN,KAAM,KACR,CACF,CACF,CACF,EACA,CACE,KAAM,wBACN,KAAM,CACJ,KAAM,SACN,OAAQ,CACN,CACE,KAAM,qBACN,KAAM,CACJ,MAAO,CAAC,KAAM,EAAE,CAClB,CACF,EACA,CACE,KAAM,UACN,KAAM,IACR,EACA,CACE,KAAM,WACN,KAAM,KACR,CACF,CACF,CACF,EACA,CACE,KAAM,iBACN,KAAM,CACJ,KAAM,SACN,OAAQ,CACN,CACE,KAAM,8BACN,KAAM,WACR,EACA,CACE,KAAM,6BACN,KAAM,WACR,EACA,CACE,KAAM,qBACN,KAAM,WACR,CACF,CACF,CACF,EACA,CACE,KAAM,qBACN,KAAM,CACJ,KAAM,SACN,OAAQ,CACN,CACE,KAAM,IACN,KAAM,KACR,EACA,CACE,KAAM,aACN,KAAM,KACR,EACA,CACE,KAAM,kBACN,KAAM,KACR,EACA,CACE,KAAM,oBACN,KAAM,KACR,CACF,CACF,CACF,EACA,CACE,KAAM,aACN,KAAM,CACJ,KAAM,SACN,OAAQ,CACN,CACE,KAAM,QACN,KAAM,CACJ,MAAO,CAAC,KAAM,EAAE,CAClB,CACF,EACA,CACE,KAAM,YACN,KAAM,CACJ,MAAO,CAAC,KAAM,EAAE,CAClB,CACF,EACA,CACE,KAAM,qBACN,KAAM,IACR,EACA,CACE,KAAM,eACN,KAAM,CACJ,MAAO,CAAC,KAAM,EAAE,CAClB,CACF,EACA,CACE,KAAM,aACN,KAAM,KACR,CACF,CACF,CACF,EACA,CACE,KAAM,aACN,KAAM,CACJ,KAAM,SACN,OAAQ,CACN,CACE,KAAM,QACN,KAAM,CACJ,MAAO,CAAC,KAAM,EAAE,CAClB,CACF,EACA,CACE,KAAM,SACN,KAAM,KACR,EACA,CACE,KAAM,YACN,KAAM,WACR,EACA,CACE,KAAM,gBACN,KAAM,IACR,EACA,CACE,KAAM,eACN,KAAM,WACR,EACA,CACE,KAAM,YACN,KAAM,CACJ,QAAS,WACX,CACF,EACA,CACE,KAAM,OACN,KAAM,CACJ,MAAO,CAAC,KAAM,EAAE,CAClB,CACF,EACA,CACE,KAAM,mBACN,KAAM,KACR,CACF,CACF,CACF,EACA,CACE,KAAM,cACN,KAAM,CACJ,KAAM,OACN,SAAU,CACR,CACE,KAAM,YACR,CACF,CACF,CACF,EACA,CACE,KAAM,YACN,KAAM,CACJ,KAAM,OACN,SAAU,CACR,CACE,KAAM,MACR,EACA,CACE,KAAM,WACR,EACA,CACE,KAAM,UACR,CACF,CACF,CACF,EACA,CACE,KAAM,aACN,KAAM,CACJ,KAAM,OACN,SAAU,CACR,CACE,KAAM,SACR,EACA,CACE,KAAM,UACR,EACA,CACE,KAAM,MACR,CACF,CACF,CACF,CACF,EACA,OAAQ,CACN,CACE,KAAM,IACN,KAAM,4BACN,IAAK,2CACP,EACA,CACE,KAAM,KACN,KAAM,wBACN,IAAK,2CACP,EACA,CACE,KAAM,KACN,KAAM,mBACN,IAAK,gDACP,EACA,CACE,KAAM,KACN,KAAM,cACN,IAAK,2BACP,EACA,CACE,KAAM,KACN,KAAM,eACN,IAAK,mBACP,EACA,CACE,KAAM,KACN,KAAM,oBACN,IAAK,oBACP,EACA,CACE,KAAM,KACN,KAAM,aACN,IAAK,aACP,EACA,CACE,KAAM,KACN,KAAM,cACN,IAAK,cACP,EACA,CACE,KAAM,KACN,KAAM,iBACN,IAAK,yBACP,EACA,CACE,KAAM,KACN,KAAM,uBACN,IAAK,wBACP,EACA,CACE,KAAM,KACN,KAAM,6BACN,IAAK,8BACP,EACA,CACE,KAAM,KACN,KAAM,kBACN,IAAK,iBACP,EACA,CACE,KAAM,KACN,KAAM,eACN,IAAK,mBACP,CACF,CACF,ECviGO,IAAMC,GAAkB,CAC7B,QAAS,QACT,KAAM,cACN,aAAc,CACZ,CACE,KAAM,aACN,SAAU,CACR,CACE,KAAM,QACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,QACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,OACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,aACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,kBACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,cACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,gBACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,eACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,OACN,MAAO,GACP,SAAU,EACZ,CACF,EACA,KAAM,CACJ,CACE,KAAM,OACN,KAAM,CACJ,QAAS,gBACX,CACF,CACF,CACF,EACA,CACE,KAAM,SACN,SAAU,CACR,CACE,KAAM,OACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,QACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,uBACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,OACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,OACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,aACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,gBACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,4BACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,4BACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,iBACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,cACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,aACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,0BACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,eACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,iBACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,cACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,WACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,eACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,cACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,YACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,kBACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,eACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,gBACN,MAAO,GACP,SAAU,EACZ,CACF,EACA,KAAM,CACJ,CACE,KAAM,OACN,KAAM,CACJ,QAAS,YACX,CACF,CACF,CACF,EACA,CACE,KAAM,sBACN,SAAU,CACR,CACE,KAAM,QACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,QACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,aACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,cACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,gBACN,MAAO,GACP,SAAU,EACZ,CACF,EACA,KAAM,CACJ,CACE,KAAM,OACN,KAAM,CACJ,QAAS,yBACX,CACF,CACF,CACF,EACA,CACE,KAAM,oBACN,SAAU,CACR,CACE,KAAM,QACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,aACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,cACN,MAAO,GACP,SAAU,EACZ,CACF,EACA,KAAM,CACJ,CACE,KAAM,OACN,KAAM,CACJ,QAAS,uBACX,CACF,CACF,CACF,EACA,CACE,KAAM,mBACN,SAAU,CACR,CACE,KAAM,QACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,OACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,aACN,MAAO,GACP,SAAU,EACZ,CACF,EACA,KAAM,CACJ,CACE,KAAM,aACN,KAAM,KACR,CACF,CACF,EACA,CACE,KAAM,wBACN,SAAU,CACR,CACE,KAAM,QACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,OACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,aACN,MAAO,GACP,SAAU,EACZ,CACF,EACA,KAAM,CACJ,CACE,KAAM,eACN,KAAM,WACR,CACF,CACF,EACA,CACE,KAAM,mBACN,SAAU,CACR,CACE,KAAM,QACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,YACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,OACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,aACN,MAAO,GACP,SAAU,EACZ,CACF,EACA,KAAM,CACJ,CACE,KAAM,SACN,KAAM,KACR,CACF,CACF,EACA,CACE,KAAM,mBACN,SAAU,CACR,CACE,KAAM,QACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,OACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,aACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,cACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,aACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,kBACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,eACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,gBACN,MAAO,GACP,SAAU,EACZ,CACF,EACA,KAAM,CAAC,CACT,EACA,CACE,KAAM,8BACN,SAAU,CACR,CACE,KAAM,QACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,OACN,MAAO,GACP,SAAU,EACZ,EACA,CACE,KAAM,aACN,MAAO,GACP,SAAU,EACZ,CACF,EACA,KAAM,CACJ,CACE,KAAM,eACN,KAAM,WACR,CACF,CACF,CACF,EACA,SAAU,CACR,CACE,KAAM,aACN,KAAM,CACJ,KAAM,SACN,OAAQ,CACN,CACE,KAAM,OACN,KAAM,WACR,EACA,CACE,KAAM,QACN,KAAM,WACR,EACA,CACE,KAAM,2BACN,KAAM,WACR,EACA,CACE,KAAM,qBACN,KAAM,WACR,EACA,CACE,KAAM,oBACN,KAAM,IACR,EACA,CACE,KAAM,kBACN,KAAM,KACR,EACA,CACE,KAAM,iBACN,KAAM,KACR,CACF,CACF,CACF,EACA,CACE,KAAM,cACN,KAAM,CACJ,KAAM,SACN,OAAQ,CACN,CACE,KAAM,UACN,KAAM,IACR,EACA,CACE,KAAM,WACN,KAAM,KACR,EACA,CACE,KAAM,SACN,KAAM,KACR,CACF,CACF,CACF,EACA,CACE,KAAM,OACN,KAAM,CACJ,KAAM,SACN,OAAQ,CACN,CACE,KAAM,SACN,KAAM,WACR,EACA,CACE,KAAM,SACN,KAAM,KACR,EACA,CACE,KAAM,WACN,KAAM,KACR,EACA,CACE,KAAM,aACN,KAAM,KACR,EACA,CACE,KAAM,YACN,KAAM,CACJ,MAAO,CAAC,KAAM,EAAE,CAClB,CACF,EACA,CACE,KAAM,qBACN,KAAM,IACR,EACA,CACE,KAAM,OACN,KAAM,KACR,CACF,CACF,CACF,CACF,EACA,MAAO,CA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A,CACE,aAAc,SACd,KAAM,SACN,KAAM,QACR,EACA,CACE,aAAc,SACd,KAAM,WACN,KAAM,QACR,CACF,EACA,gBAAiB,aACjB,KAAM,aACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,QACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,UACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,QACN,KAAM,SACR,CACF,EACA,KAAM,WACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,OACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,SACN,KAAM,SACR,CACF,EACA,KAAM,UACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,gBACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,WACN,KAAM,SACR,CACF,EACA,KAAM,uBACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,OACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,SACN,KAAM,SACR,CACF,EACA,KAAM,iBACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,YACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,QACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,aACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,MACN,KAAM,SACR,CACF,EACA,KAAM,kBACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,QACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,aACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,MACN,KAAM,SACR,CACF,EACA,KAAM,gBACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,OACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,KACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,QACN,KAAM,SACR,CACF,EACA,KAAM,WACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,OACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,SACN,KAAM,SACR,CACF,EACA,KAAM,WACN,KAAM,OACR,EACA,CACE,gBAAiB,UACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,IACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,qBACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,sBACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,iBACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,kBACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,QACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,UACN,KAAM,SACR,CACF,EACA,KAAM,YACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,UACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,SACN,KAAM,SACR,CACF,EACA,KAAM,UACN,QAAS,CACP,CACE,aAAc,OACd,KAAM,GACN,KAAM,MACR,CACF,EACA,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,UACN,KAAM,SACR,CACF,EACA,KAAM,YACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,oBACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,aACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,cACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,gBACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,eACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,IACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,WACN,QAAS,CACP,CACE,aAAc,QACd,KAAM,GACN,KAAM,OACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,UACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,kBACN,KAAM,SACR,CACF,EACA,KAAM,oBACN,QAAS,CACP,CACE,aAAc,OACd,KAAM,GACN,KAAM,MACR,CACF,EACA,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,SACN,KAAM,SACR,CACF,EACA,KAAM,UACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,aACN,QAAS,CACP,CACE,aAAc,SACd,KAAM,GACN,KAAM,QACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,WACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,IACN,KAAM,SACR,CACF,EACA,KAAM,OACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,UACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,aACN,KAAM,SACR,CACF,EACA,KAAM,oBACN,QAAS,CACP,CACE,aAAc,OACd,KAAM,GACN,KAAM,MACR,CACF,EACA,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,OACN,QAAS,CACP,CACE,aAAc,SACd,KAAM,GACN,KAAM,QACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,QACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,OACN,KAAM,SACR,CACF,EACA,KAAM,gBACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,oBACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,WACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,SACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,mBACN,KAAM,SACR,CACF,EACA,KAAM,mBACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,qBACN,KAAM,SACR,CACF,EACA,KAAM,uBACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,SACd,KAAM,cACN,KAAM,QACR,CACF,EACA,KAAM,cACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,UACN,KAAM,SACR,CACF,EACA,KAAM,YACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,iBACN,KAAM,SACR,CACF,EACA,KAAM,mBACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,eACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,gBACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,cACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,eACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,OACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,mBACN,KAAM,SACR,EACA,CACE,aAAc,OACd,KAAM,UACN,KAAM,MACR,CACF,EACA,KAAM,eACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,OACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,aAAc,OACd,KAAM,UACN,KAAM,MACR,CACF,EACA,KAAM,aACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,SACN,QAAS,CACP,CACE,aAAc,SACd,KAAM,GACN,KAAM,QACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,QACN,QAAS,CACP,CACE,aAAc,iBACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,eACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,cACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,KACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,SACN,KAAM,SACR,CACF,EACA,KAAM,WACN,QAAS,CACP,CACE,aAAc,OACd,KAAM,GACN,KAAM,MACR,CACF,EACA,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,OACN,KAAM,SAC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AAAC,GAAY,QAAAC,OAAY,OCD5C,IAAMC,GAAW,CACf,IAAK,CACH,CACE,OAAQ,CACN,CACE,aAAc,SACd,KAAM,aACN,KAAM,QACR,EACA,CACE,aAAc,SACd,KAAM,eACN,KAAM,QACR,CACF,EACA,gBAAiB,aACjB,KAAM,aACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,QACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,UACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,QACN,KAAM,SACR,CACF,EACA,KAAM,WACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,OACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,QACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,WACN,KAAM,SACR,CACF,EACA,KAAM,YACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,QACN,KAAM,SACR,CACF,EACA,KAAM,mBACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,OACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,KACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,aACd,KAAM,SACN,KAAM,YACR,CACF,EACA,KAAM,gBACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,gBACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,WACN,KAAM,SACR,CACF,EACA,KAAM,uBACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,OACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,KACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,QACN,KAAM,SACR,CACF,EACA,KAAM,WACN,KAAM,OACR,EACA,CACE,UAAW,GACX,OAAQ,CACN,CACE,QAAS,GACT,aAAc,UACd,KAAM,OACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,QACN,KAAM,SACR,EACA,CACE,QAAS,GACT,aAAc,UACd,KAAM,SACN,KAAM,SACR,CACF,EACA,KAAM,YACN,KAAM,OACR,EACA,CACE,gBAAiB,UACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,aACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,QACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,UACN,KAAM,SACR,CACF,EACA,KAAM,YACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,UACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,SACN,KAAM,SACR,CACF,EACA,KAAM,UACN,QAAS,CACP,CACE,aAAc,OACd,KAAM,GACN,KAAM,MACR,CACF,EACA,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,UACN,KAAM,SACR,CACF,EACA,KAAM,YACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,WACN,QAAS,CACP,CACE,aAAc,QACd,KAAM,GACN,KAAM,OACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,UACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,kBACN,KAAM,SACR,CACF,EACA,KAAM,oBACN,QAAS,CACP,CACE,aAAc,OACd,KAAM,GACN,KAAM,MACR,CACF,EACA,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,QACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,mBACN,KAAM,SACR,CACF,EACA,KAAM,UACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,iBACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,QACN,KAAM,SACR,CACF,EACA,KAAM,8BACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,QACN,KAAM,SACR,CACF,EACA,KAAM,mBACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,OACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,gBACN,KAAM,SACR,CACF,EACA,KAAM,8BACN,QAAS,CACP,CACE,aAAc,aACd,KAAM,GACN,KAAM,YACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,UACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,aACN,KAAM,SACR,CACF,EACA,KAAM,oBACN,QAAS,CACP,CACE,aAAc,OACd,KAAM,GACN,KAAM,MACR,CACF,EACA,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,OACN,QAAS,CACP,CACE,aAAc,SACd,KAAM,GACN,KAAM,QACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,QACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,KAAM,QACN,QAAS,CACP,CACE,aAAc,iBACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,oBACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,QACN,KAAM,SACR,EACA,CACE,aAAc,iBACd,KAAM,OACN,KAAM,SACR,CACF,EACA,KAAM,UACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,UACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,QACN,KAAM,SACR,CACF,EACA,KAAM,eACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,QACN,KAAM,SACR,CACF,EACA,KAAM,oBACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,QACN,KAAM,SACR,CACF,EACA,KAAM,iBACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,KACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,QACN,KAAM,SACR,CACF,EACA,KAAM,cACN,QAAS,CACP,CACE,aAAc,OACd,KAAM,GACN,KAAM,MACR,CACF,EACA,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,OACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,KACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,SACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,QACN,KAAM,SACR,CACF,EACA,KAAM,kBACN,QAAS,CACP,CACE,aAAc,OACd,KAAM,GACN,KAAM,MACR,CACF,EACA,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,gBACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,QACN,KAAM,SACR,CACF,EACA,KAAM,cACN,QAAS,CAAC,EACV,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,SACN,QAAS,CACP,CACE,aAAc,SACd,KAAM,GACN,KAAM,QACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,KAAM,SACN,QAAS,CACP,CACE,aAAc,kBACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,cACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,KACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,SACN,KAAM,SACR,CACF,EACA,KAAM,WACN,QAAS,CACP,CACE,aAAc,OACd,KAAM,GACN,KAAM,MACR,CACF,EACA,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,OACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,KACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,SACN,KAAM,SACR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KAAM,SACN,KAAM,SACR,CACF,EACA,KAAM,UACN,QAAS,CACP,CACE,aAAc,OACd,KAAM,GACN,KAAM,MACR,CACF,EACA,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,UACN,KAAM,SACR,CACF,EACA,KAAM,YACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,WACN,QAAS,CACP,CACE,aAAc,QACd,KAAM,GACN,KAAM,OACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,UACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,kBACN,KAAM,SACR,CACF,EACA,KAAM,oBACN,QAAS,CACP,CACE,aAAc,OACd,KAAM,GACN,KAAM,MACR,CACF,EACA,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,UACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,aACN,KAAM,SACR,CACF,EACA,KAAM,oBACN,QAAS,CACP,CACE,aAAc,OACd,KAAM,GACN,KAAM,MACR,CACF,EACA,gBAAiB,aACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,OACN,QAAS,CACP,CACE,aAAc,SACd,KAAM,GACN,KAAM,QACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,SACN,QAAS,CACP,CACE,aAAc,SACd,KAAM,GACN,KAAM,QACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CAAC,EACT,KAAM,cACN,QAAS,CACP,CACE,aAAc,UACd,KAAM,GACN,KAAM,SACR,CACF,EACA,gBAAiB,OACjB,KAAM,UACR,EACA,CACE,OAAQ,CACN,CACE,aAAc,UACd,KAAM,KACN,KAAM,SACR,EACA,CACE,aAAc,UACd,KAAM,SACN,KAA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",
6
6
  "names": ["bcs", "splitGenericParameters", "str", "genericSeparators", "left", "right", "tok", "word", "nestedAngleBrackets", "i", "char", "parseTypeName", "name", "l_bound", "r_bound", "typeName", "typeArgs", "isTransactionArgument", "arg", "obj", "tx", "pure", "type", "getBcsForType", "hasUndefinedOrNull", "items", "item", "consistsOnlyOfPrimitiveValues", "hasPrimitiveValues", "compressSuiAddress", "addr", "stripped", "compressSuiType", "compressedName", "typeArg", "composeSuiType", "init_util", "__esmMin", "require_bridge", "__commonJSMin", "exports", "module", "init_util", "PackageAddress", "_PackageAddress", "compressSuiType", "address", "v", "pkgV1", "packageAddress", "require_cctp_bridge", "__commonJSMin", "exports", "module", "init_util", "PackageAddress", "_PackageAddress", "compressSuiType", "address", "v", "pkgV1", "packageAddress", "require_utils", "__commonJSMin", "exports", "module", "init_util", "PackageAddress", "_PackageAddress", "compressSuiType", "address", "v", "pkgV1", "packageAddress", "mainnet", "nodeUrlsDefault", "nodeRpcUrlsDefault", "TronWeb", "Web3", "SdkRootError", "code", "message", "SdkError", "InvalidAmountError", "AmountNotEnoughError", "InsufficientPoolLiquidityError", "JupiterError", "InvalidGasFeePaymentOptionError", "InvalidMessengerOptionError", "MethodNotSupportedError", "VerifyTxError", "InvalidTxError", "ExtraGasMaxLimitExceededError", "ArgumentInvalidDecimalsError", "argName", "decimalsIs", "decimalsRequired", "TimeoutError", "NodeRpcUrlNotInitializedError", "chainSymbol", "CCTPDoesNotSupportedError", "OFTDoesNotSupportedError", "YieldDoesNotSupportedError", "TxTooLargeError", "ErrorCode", "ChainSymbol", "ChainType", "chainDecimalsByType", "defaultProperties", "Chains", "chainProperties", "additionalProperties", "chainSymbol", "property", "SdkError", "chainType", "AddressStatus", "Messenger", "Big", "getPoolInfoByToken", "api", "sourceChainToken", "validateAmountGtZero", "amount", "Big", "InvalidAmountError", "validateAmountDecimals", "argName", "amountFloat", "decimalRequired", "integerPart", "fractionalPart", "ArgumentInvalidDecimalsError", "promiseWithTimeout", "promise", "msg", "timeoutMs", "resolve", "reject", "TimeoutError", "promiseWithTimeoutAndRetries", "toTry", "maxRetries", "attemptCount", "withExponentialBackoff", "fn", "keepWaitingIf", "secondsToWait", "exponentialFactor", "verbose", "attempts", "count", "initialAttempt", "waitUntil", "waitTime", "totalWaitTime", "lastAttempt", "res", "nextAttempt", "Big", "artifact", "Bridge_default", "artifact", "CctpBridge_default", "artifact", "OftBridge_default", "anchor", "PublicKey", "anchor", "PublicKey", "getAssociatedAccount", "publicKey", "mintAccount", "getConfigAccount", "programId", "configPda", "getLockAccount", "nonce", "bridgeProgramId", "lockPda", "getPriceAccount", "chainId", "gasOracleProgramId", "pricePda", "getAuthorityAccount", "configAccount", "poolAuthority", "getCctpAuthorityAccount", "cctpBridgeAccount", "cctpBridgeProgramId", "getBridgeTokenAccount", "poolPda", "getOtherChainTokenAccount", "token", "otherChainTokenPda", "getChainBridgeAccount", "chainBridgePda", "getGasUsageAccount", "messengerProgramId", "getSendMessageAccount", "messageWithSigner", "sentMessagePda", "getUserDepositAccount", "userPublicKey", "tokenMintAccount", "userDepositPda", "getCctpBridgeAccount", "getCctpBridgeTokenAccount", "getCctpLockAccount", "messageSentEventDataAccount", "tokenMessengerEventAuthority", "getCctpAccounts", "domain", "cctpTransmitterProgramId", "cctpTokenMessengerMinter", "messageTransmitterAccount", "findProgramAddress", "tokenMessenger", "tokenMinter", "localToken", "remoteTokenMessengerKey", "authorityPda", "label", "extraSeeds", "seeds", "extraSeed", "AnchorProvider", "Connection", "PublicKey", "buildAnchorProvider", "solanaRpcUrl", "accountAddress", "connection", "publicKey", "PublicKey", "Address", "Big", "randomBytes", "TronWebUtils", "Big", "BN", "getFeePercent", "input", "output", "Big", "toSystemPrecision", "amount", "decimals", "convertAmountPrecision", "fromSystemPrecision", "decimalsFrom", "decimalsTo", "dif", "toPowBase10", "convertFloatAmountToInt", "amountFloat", "convertIntAmountToFloat", "amountInt", "amountValue", "calculatePoolInfoImbalance", "poolInfo", "swapToVUsd", "feeShare", "fee", "amountWithoutFee", "inSystemPrecision", "tokenBalance", "vUsdNewAmount", "getY", "swapFromVUsd", "vUsdBalance", "newAmount", "result", "getSwapFromVUsdPoolInfo", "vUsdAmount", "swapToVUsdReverse", "InsufficientPoolLiquidityError", "reversedFeeShare", "swapFromVUsdReverse", "amountWithFee", "x", "d", "commonPartBig", "dCubed", "commonPartSquared", "sqrtBig", "dividerBig", "getEarned", "userLpAmount", "userRewardDebt", "accRewardPerShareP", "p", "userLpAmountBN", "BN", "accRewardPerSharePBN", "userRewardDebtBN", "aprInPercents", "apr", "getD", "aValue", "y", "xy", "xPlusY", "a", "b", "aSquared", "bCubed", "a2b3", "c", "cbrtAPlusC", "cbrtAMinusC", "formatAddress", "address", "from", "to", "buffer", "evmAddressToBuffer32", "PublicKey", "tronAddressToBuffer32", "Address", "normalizeSuiHex", "hex", "hexToBuffer", "buff", "ethAddress", "tronAddressToEthAddress", "bufferToSize", "bytes", "TronWebUtils", "size", "result", "getNonce", "randomBytes", "getNonceBigInt", "bigint", "prepareTxSwapParams", "bridgeChainType", "params", "txSwapParams", "sourceToken", "convertFloatAmountToInt", "SdkError", "formatAddress", "prepareTxSendParams", "api", "txSendParams", "toChainType", "Chains", "CCTPDoesNotSupportedError", "OFTDoesNotSupportedError", "fee", "feeFormat", "gasFeeOption", "getGasFeeOptions", "InvalidGasFeePaymentOptionError", "extraGas", "extraGasFormat", "extraGasLimits", "getExtraGasMaxLimits", "extraGasDecimals", "extraGasDestRate", "Big", "extraGasDestFloat", "extraGasFloat", "convertIntAmountToFloat", "validateExtraGasNotExceeded", "validateAmountEnough", "amountInt", "decimals", "feeInt", "extraGasInt", "amountTotal", "AmountNotEnoughError", "sourceChainToken", "destinationAllbridgeChainId", "messenger", "transactionCostResponse", "gasFeeOptions", "gasFeeIntWithStables", "convertAmountPrecision", "gasFeePaymentMethod", "extraGasMaxLimit", "extraGasMaxIntLimit", "ExtraGasMaxLimitExceededError", "destinationChainToken", "extraGasMaxLimits", "maxAmount", "maxAmountFloat", "maxAmountFloatInSourceNative", "maxAmountInSourceNative", "maxAmountFloatInStable", "isSendParams", "getCctpSolTokenRecipientAddress", "chainType", "toAccountAddress", "destinationTokenAddress", "solRpcUrl", "recipientWalletAddress", "receiverAccount", "PublicKey", "receiveMint", "receiveUserToken", "getAssociatedAccount", "provider", "buildAnchorProvider", "accountData", "formatAddress", "tokenAccounts", "firstTokenAccount", "SdkError", "ChainBridgeService", "EvmBridgeService", "ChainBridgeService", "web3", "api", "nodeRpcUrlsConfig", "params", "rawTransaction", "txSwapParams", "prepareTxSwapParams", "amount", "contractAddress", "fromAccountAddress", "fromTokenAddress", "toAccountAddress", "toTokenAddress", "minimumReceiveAmount", "swapMethod", "txSendParams", "prepareTxSendParams", "toChainId", "messenger", "fee", "gasFeePaymentMethod", "extraGas", "extraGasDest", "nonce", "getNonce", "sendMethod", "value", "totalFee", "Big", "cctp", "oft", "bridgeContract", "cctpBridgeContract", "recipient", "getCctpSolTokenRecipientAddress", "oftBridgeContract", "estimateGas", "feeOptions", "transactionHash", "Bridge_default", "CctpBridge_default", "OftBridge_default", "DefaultRawBridgeTransactionBuilder", "api", "nodeRpcUrlsConfig", "params", "tokenService", "b", "provider", "approveData", "spender", "getSpender", "validateAmountGtZero", "validateAmountDecimals", "isSendParams", "getChainBridgeService", "BN", "Program", "Spl", "web3", "Keypair", "PublicKey", "SystemProgram", "Big", "IDL", "IDL", "Spl", "Big", "Web3", "getTokenAccountData", "account", "provider", "Spl", "getVUsdAmount", "amount", "bridge", "poolAccount", "poolAccountInfo", "decimals", "feeShare", "Big", "poolInfo", "swapToVUsd", "getMessage", "args", "recipient", "sourceChainId", "destinationsChainId", "receiveToken", "nonce", "messenger", "chainBridge", "message", "Web3", "SdkError", "hash", "hashBuffer", "messageWithSigner", "InvalidTxError", "hashWithSigner", "hashWithSignerBuffer", "ComputeBudgetInstruction", "ComputeBudgetProgram", "Connection", "TransactionMessage", "Big", "AddressLookupTableAccount", "fetchAddressLookupTableAccountsFromTx", "transaction", "connection", "lookup", "AddressLookupTableAccount", "res", "SdkError", "SolanaAutoTxFee", "addUnitLimitAndUnitPriceToTx", "transaction", "txFeeParams", "solanaRpcUrl", "connection", "Connection", "simUnitsConsumed", "addUnitLimitAndUnitPriceToInstructions", "addUnitLimitAndUnitPriceToVersionedTx", "addressLookupTableAccounts", "fetchAddressLookupTableAccountsFromTx", "message", "TransactionMessage", "TxTooLargeError", "instructions", "units", "updateUnitLimit", "solanaTxFee", "SolanaAutoTxFee", "updateUnitPrice", "pricePerUnitInMicroLamports", "Big", "toPowBase10", "computeUnitLimitIndex", "instruction", "ComputeBudgetProgram", "ComputeBudgetInstruction", "computeUnitLimitInstruction", "computeUnitPriceIndex", "unitPrice", "getAveragePrioritizationFee", "computeUnitPriceInstruction", "prioritizationFees", "sum", "prioritizationFee", "NATIVE_MINT", "Connection", "TransactionMessage", "VersionedTransaction", "axios", "AxiosError", "JupiterService", "solanaRpcUrl", "jupiterParams", "Connection", "userAddress", "stableTokenAddress", "amount", "exactOut", "quoteResponse", "swapMode", "url", "NATIVE_MINT", "axios", "err", "AxiosError", "JupiterError", "inAmount", "transactionResponse", "swapTransaction", "swapTransactionBuf", "tx", "VersionedTransaction", "transaction", "sdkTx", "addressLookupTableAccounts", "fetchAddressLookupTableAccountsFromTx", "sdkAddressLookupTableAccounts", "message", "TransactionMessage", "sdkMessage", "signature", "SdkError", "e", "COMPUTE_UNIT_LIMIT", "JUP_ADD_INDEX", "SolanaBridgeService", "ChainBridgeService", "solanaRpcUrl", "params", "api", "JupiterService", "txSwapParams", "prepareTxSwapParams", "poolAddress", "toPoolAddress", "txFeeParams", "fromAccountAddress", "amount", "contractAddress", "fromTokenAddress", "toTokenAddress", "toAccountAddress", "minimumReceiveAmount", "account", "bridgeAddress", "tokenAddress", "receiveTokenAddress", "receivePoolAddress", "receiverOriginal", "userAccount", "PublicKey", "provider", "buildAnchorProvider", "bridge", "Program", "IDL", "bridgeAuthority", "getAuthorityAccount", "configAccount", "getConfigAccount", "sendMint", "sendBridgeToken", "getBridgeTokenAccount", "sendPool", "sendUserToken", "getAssociatedAccount", "receiverAccount", "receiveMint", "receiveBridgeToken", "receivePool", "receiveUserToken", "preInstructions", "web3", "getTokenAccountData", "createReceiveUserTokenInstruction", "Spl", "transaction", "BN", "connection", "addUnitLimitAndUnitPriceToTx", "txSendParams", "prepareTxSendParams", "solTxSendParams", "isJupiterForStableCoin", "jupTx", "tx", "solTxSendUpdatedParams", "e", "SdkRootError", "JupiterError", "swapAndBridgeTx", "requiredMessageSigner", "swapAndBridgeSolData", "messageAccount", "messageSentEventDataKeypair", "OFTDoesNotSupportedError", "addUnitLimitAndUnitPriceToVersionedTx", "exactOut", "fee", "extraGas", "gasFeePaymentMethod", "amountToProcess", "Big", "amountIn", "newAmount", "AmountNotEnoughError", "convertIntAmountToFloat", "sourceToken", "sourceNativeTokenPrice", "Chains", "fromChainId", "toChainId", "destinationChainId", "receiverInBuffer32", "sourceChainId", "nonce", "getNonce", "poolAccount", "vUsdAmount", "getVUsdAmount", "lockAccount", "getLockAccount", "userToken", "bridgeTokenAccount", "chainBridgeAccount", "getChainBridgeAccount", "otherBridgeTokenAccount", "getOtherChainTokenAccount", "configAccountInfo", "priceAccount", "getPriceAccount", "thisGasPriceAccount", "message", "getMessage", "swapAndBridgeData", "vusdAmount", "recipient", "receiveToken", "mint", "config", "gasPrice", "thisGasPrice", "extraGasInstruction", "allbridgeMessengerProgramId", "messengerGasUsageAccount", "getGasUsageAccount", "messengerConfig", "sentMessageAccount", "getSendMessageAccount", "instructions", "allbridgeTableAccount", "res", "SdkError", "messageV0", "wormholeProgramId", "whBridgeAccount", "whFeeCollectorAccount", "whSequenceAccount", "wormholeMessengerConfigAccount", "Keypair", "bridgeAccountInfo", "feeLamports", "feeInstruction", "SystemProgram", "accounts", "cctpAddress", "CCTPDoesNotSupportedError", "CHAIN_ID", "cctpBridge", "cctpBridgeAccount", "getCctpBridgeAccount", "getCctpAuthorityAccount", "getCctpBridgeTokenAccount", "destinationChainSymbol", "domain", "cctpTransmitterProgramIdAddress", "cctpTokenMessengerMinterAddress", "cctpTransmitterProgramId", "cctpTokenMessengerMinter", "messageTransmitterAccount", "tokenMessenger", "tokenMessengerEventAuthority", "tokenMinter", "localToken", "remoteTokenMessengerKey", "authorityPda", "getCctpAccounts", "getCctpLockAccount", "MethodNotSupportedError", "Address", "contract", "Big", "contract", "ContractSpec", "ContractClient", "BridgeContract", "ContractClient", "options", "ContractSpec", "SrbBridgeService", "ChainBridgeService", "nodeRpcUrlsConfig", "params", "api", "txSendParams", "prepareTxSendParams", "amount", "contractAddress", "fromAccountAddress", "fromTokenAddress", "toChainId", "toAccountAddress", "toTokenAddress", "fee", "gasFeePaymentMethod", "extraGas", "totalFee", "Big", "contract", "BridgeContract", "tx", "Address", "getNonceBigInt", "txSwapParams", "prepareTxSwapParams", "minimumReceiveAmount", "MethodNotSupportedError", "address", "sender", "config", "SuiClient", "coinWithBalance", "Transaction", "SUI_CLOCK_OBJECT_ID", "Big", "import_bridge", "import__", "init_util", "swap", "tx", "typeArgs", "args", "obj", "pure", "deposit", "typeArg", "withdraw", "claimReward", "tx", "typeArg", "args", "obj", "pool", "tx", "typeArg", "bridge", "obj", "swapAndBridgeWormhole", "tx", "typeArg", "args", "obj", "pure", "newUserDeposit", "tx", "typeArg", "swapAndBridge", "tx", "typeArg", "args", "obj", "pure", "import_cctp_bridge", "import__", "init_util", "bridge", "tx", "typeArg", "args", "obj", "pure", "import_utils", "import__", "init_util", "bcs", "fromHEX", "toHEX", "bcs", "init_util", "Vector", "_Vector", "typeArgs", "elements", "composeSuiType", "T", "extractType", "item", "data", "toBcs", "field", "json", "bcs", "typeArg", "element", "decodeFromFields", "decodeFromFieldsWithTypes", "fieldToJSON", "decodeFromJSONField", "vector", "phantom", "type", "Address", "bcs", "val", "fromHEX", "toHEX", "toBcs", "arg", "extractType", "reified", "decodeFromFields", "field", "decodeFromFieldsWithTypes", "item", "assertReifiedTypeArgsMatch", "fullType", "typeArgs", "reifiedTypeArgs", "compressSuiType", "assertFieldsWithTypesArgsMatch", "itemTypeArgs", "parseTypeName", "fieldToJSON", "typeName", "decodeFromJSONField", "typeArg", "init_util", "PKG_V13", "bcs", "fromB64", "init_util", "bcs", "fromB64", "isString", "type", "compressSuiType", "PKG_V13", "String", "_String", "typeArgs", "fields", "composeSuiType", "item", "data", "field", "json", "content", "client", "id", "phantom", "decodeFromFields", "vector", "decodeFromFieldsWithTypes", "fieldToJSON", "decodeFromJSONField", "res", "init_util", "init_util", "PKG_V26", "bcs", "fromB64", "fromHEX", "toHEX", "isID", "type", "compressSuiType", "PKG_V26", "ID", "_ID", "typeArgs", "fields", "composeSuiType", "item", "data", "field", "json", "content", "client", "id", "phantom", "val", "decodeFromFields", "decodeFromFieldsWithTypes", "decodeFromJSONField", "res", "isUID", "UID", "_UID", "fromHex", "tx", "value", "pure", "String", "fetchAllPagesRecursive", "fetchFunction", "cursor", "accumulatedData", "result", "newAccumulatedData", "SuiBridgeService", "ChainBridgeService", "nodeRpcUrlsConfig", "api", "SuiClient", "SdkError", "params", "suiAddresses", "txSwapParams", "prepareTxSwapParams", "amount", "fromAccountAddress", "fromTokenAddress", "toTokenAddress", "minimumReceiveAmount", "tx", "Transaction", "args", "coinWithBalance", "swapResult", "swap", "coins", "fetchAllPagesRecursive", "cursor", "baseTx", "inputCoin", "transaction", "txSendParams", "prepareTxSendParams", "messenger", "setUtilsAddress", "OFTDoesNotSupportedError", "toChainId", "toAccountAddress", "fee", "gasFeePaymentMethod", "extraGas", "totalFee", "Big", "amountWithoutFee", "amountCoin", "feeTokenCoin", "feeTokenCoinS", "getNonceBigInt", "fromHex", "normalizeSuiHex", "swapAndBridge", "totalFeeCoin", "SUI_CLOCK_OBJECT_ID", "swapAndBridgeWormhole", "setCctpAddress", "recipientWalletAddress", "recipient", "recipientStr", "getCctpSolTokenRecipientAddress", "bridge", "Big", "BN", "amountToHex", "amount", "sleep", "ms", "resolve", "sendRawTransaction", "tronWeb", "rawTransaction", "signedTx", "InvalidTxError", "transactionHash", "verifyTx", "txId", "timeout", "start", "VerifyTxError", "result", "sleep", "TronBridgeService", "ChainBridgeService", "tronWeb", "api", "params", "txSendParams", "prepareTxSendParams", "rawTransaction", "sendRawTransaction", "txSwapParams", "prepareTxSwapParams", "amount", "contractAddress", "fromAccountAddress", "fromTokenAddress", "toAccountAddress", "toTokenAddress", "minimumReceiveAmount", "parameters", "sendParams", "toChainId", "messenger", "fee", "gasFeePaymentMethod", "extraGas", "extraGasDest", "totalFee", "Big", "nonce", "getNonceBigInt", "value", "methodSignature", "fromAddress", "transactionObject", "SdkError", "DefaultBridgeService", "api", "nodeRpcUrlsConfig", "params", "tokenService", "DefaultRawBridgeTransactionBuilder", "b", "provider", "spender", "getSpender", "approveData", "validateAmountGtZero", "validateAmountDecimals", "getChainBridgeService", "token", "messenger", "CCTPDoesNotSupportedError", "OFTDoesNotSupportedError", "chainSymbol", "Chains", "EvmBridgeService", "nodeRpcUrl", "Web3", "TronBridgeService", "TronWeb", "SolanaBridgeService", "SrbBridgeService", "SuiBridgeService", "Big", "Cache", "TronWeb", "FMT_BYTES", "FMT_NUMBER", "Web3", "Big", "depositAmountToVUsd", "amount", "aValue", "dValue", "tokenBalance", "vUsdBalance", "amountSP", "convertFloatAmountToInt", "amountSPBig", "Big", "oldD", "oldBalance", "newTokenBalance", "newVUsdBalance", "halfAmount", "getD", "vUsdToWithdrawalAmount", "lpAmount", "lpAmountSP", "Web3", "artifact", "Pool_default", "UserBalance", "userInfo", "convertIntAmountToFloat", "poolInfo", "decimals", "earned", "getEarned", "ChainPoolService", "EvmPoolService", "ChainPoolService", "web3", "api", "accountAddress", "token", "userBalanceInfo", "promiseWithTimeout", "promiseWithTimeoutAndRetries", "poolInfo", "batch", "poolContract", "userRewardDebtAbi", "balanceOfAbi", "rewardDebtResult", "lpAmountResult", "UserBalance", "Web3", "rewardDebt", "lpAmount", "aAbi", "dAbi", "tokenBalanceAbi", "vUsdBalanceAbi", "totalSupplyAbi", "accRewardPerSharePAbi", "aResult", "dResult", "tokenBalanceResult", "vUsdBalanceResult", "totalSupplyResult", "accRewardPerSharePResult", "tokenBalanceStr", "vUsdBalanceStr", "imbalance", "calculatePoolInfoImbalance", "aValue", "dValue", "tokenBalance", "vUsdBalance", "totalLpAmount", "accRewardPerShareP", "params", "contractAddress", "Pool_default", "DefaultRawPoolTransactionBuilder", "api", "nodeRpcUrlsConfig", "params", "tokenService", "b", "provider", "approveData", "validateAmountGtZero", "validateAmountDecimals", "convertFloatAmountToInt", "getChainPoolService", "AnchorProvider", "BN", "Program", "Spl", "web3", "Connection", "PublicKey", "SolanaPoolService", "ChainPoolService", "solanaRpcUrl", "api", "accountAddress", "token", "provider", "bridge", "poolAccount", "PublicKey", "poolAccountInfo", "userDepositAccount", "getUserDepositAccount", "lpAmount", "rewardDebt", "UserBalance", "pool", "vUsdBalance", "tokenBalance", "imbalance", "calculatePoolInfoImbalance", "params", "accounts", "preInstructions", "tx", "BN", "addUnitLimitAndUnitPriceToTx", "bridgeAddress", "Program", "IDL", "connection", "Connection", "publicKey", "AnchorProvider", "poolAddress", "account", "user", "configAccount", "getConfigAccount", "bridgeAuthority", "getAuthorityAccount", "tokenMintAccount", "userToken", "getAssociatedAccount", "bridgeTokenAccount", "getBridgeTokenAccount", "web3", "getTokenAccountData", "createUserTokenInstruction", "Spl", "instruction", "contract", "contract", "ContractSpec", "ContractClient", "PoolContract", "ContractClient", "options", "ContractSpec", "contract", "rpc", "Api", "getViewResultSoroban", "assembledTx", "simulation", "options", "isErrorSorobanResult", "SrbPoolService", "ChainPoolService", "nodeRpcUrlsConfig", "params", "api", "accountAddress", "token", "result", "isErrorSorobanResult", "SdkError", "viewResultSoroban", "getViewResultSoroban", "userDeposit", "UserBalance", "pool", "calculatePoolInfoImbalance", "address", "sender", "config", "PoolContract", "SuiClient", "Transaction", "import_bridge", "init_util", "init_util", "bcs", "fromB64", "isBalance", "type", "compressSuiType", "PKG_V26", "Balance", "_Balance", "typeArgs", "fields", "composeSuiType", "T", "extractType", "item", "data", "field", "json", "content", "client", "id", "phantom", "typeArg", "decodeFromFields", "assertFieldsWithTypesArgsMatch", "decodeFromFieldsWithTypes", "decodeFromJSONField", "assertReifiedTypeArgsMatch", "gotTypeArgs", "parseTypeName", "gotTypeArg", "expectedTypeArg", "res", "import__", "init_util", "import__", "bcs", "fromB64", "isPoolRewards", "type", "compressSuiType", "PoolRewards", "_PoolRewards", "typeArgs", "fields", "composeSuiType", "T", "extractType", "item", "data", "field", "json", "content", "client", "id", "phantom", "Balance", "typeArg", "decodeFromFields", "assertFieldsWithTypesArgsMatch", "decodeFromFieldsWithTypes", "decodeFromJSONField", "assertReifiedTypeArgsMatch", "gotTypeArgs", "parseTypeName", "gotTypeArg", "expectedTypeArg", "res", "init_util", "import__", "bcs", "fromB64", "isPoolState", "type", "compressSuiType", "PoolState", "_PoolState", "typeArgs", "fields", "composeSuiType", "T", "extractType", "item", "data", "field", "json", "content", "client", "id", "phantom", "typeArg", "decodeFromFields", "assertFieldsWithTypesArgsMatch", "decodeFromFieldsWithTypes", "decodeFromJSONField", "assertReifiedTypeArgsMatch", "gotTypeArgs", "parseTypeName", "gotTypeArg", "expectedTypeArg", "res", "bcs", "fromB64", "isPool", "type", "compressSuiType", "Pool", "_Pool", "typeArgs", "fields", "composeSuiType", "T", "extractType", "item", "data", "field", "json", "content", "client", "id", "phantom", "bcs", "UID", "PoolState", "PoolRewards", "Balance", "typeArg", "decodeFromFields", "assertFieldsWithTypesArgsMatch", "decodeFromFieldsWithTypes", "decodeFromJSONField", "assertReifiedTypeArgsMatch", "gotTypeArgs", "parseTypeName", "gotTypeArg", "expectedTypeArg", "fromB64", "res", "init_util", "import__", "bcs", "fromB64", "isUserDeposit", "type", "compressSuiType", "UserDeposit", "_UserDeposit", "typeArgs", "fields", "composeSuiType", "T", "extractType", "item", "data", "field", "json", "content", "client", "id", "phantom", "UID", "typeArg", "decodeFromFields", "assertFieldsWithTypesArgsMatch", "decodeFromFieldsWithTypes", "decodeFromJSONField", "assertReifiedTypeArgsMatch", "gotTypeArgs", "parseTypeName", "gotTypeArg", "expectedTypeArg", "res", "getCoinsWithAmounts", "amounts", "coins", "tx", "firstCoin", "requiredAmount", "total", "amount", "currentBalance", "accumulatedCoins", "coin", "splitAndMergeCoins", "pureAmounts", "mockSender", "suiView", "client", "tx", "reified", "inspectionResult", "returnValue", "data", "_type", "toBcs", "SuiPoolService", "ChainPoolService", "suiRpcUrl", "api", "SuiClient", "accountAddress", "token", "SdkError", "suiAddresses", "total", "element", "UserBalance", "tokenAddress", "fetchAllPagesRecursive", "cursor", "UserDeposit", "phantom", "P", "tx", "Transaction", "pool", "res", "suiView", "Pool", "tokenBalance", "vUsdBalance", "imbalance", "calculatePoolInfoImbalance", "params", "coins", "InvalidAmountError", "firstCoin", "depositObj", "isNewDeposit", "amountCoin", "getCoinsWithAmounts", "rewards", "deposit", "deposits", "tokenType", "newUserDeposit", "withdraw", "reward", "claimReward", "Web3", "encodeFunctionCall", "TronPoolService", "ChainPoolService", "tronWeb", "api", "tronJsonRpc", "accountAddress", "token", "userBalanceInfo", "contractAddress", "tronAddressToEthAddress", "userAddress", "payload", "results", "getResult", "id", "entry", "r", "Web3", "UserBalance", "contract", "rewardDebt", "lpAmount", "poolInfo", "tokenBalanceStr", "vUsdBalanceStr", "imbalance", "calculatePoolInfoImbalance", "poolContract", "aValue", "dValue", "tokenBalance", "vUsdBalance", "totalLpAmount", "accRewardPerShareP", "params", "amount", "parameter", "methodSignature", "value", "fromAddress", "transactionObject", "SdkError", "Pool_default", "name", "abiItem", "item", "encodeFunctionCall", "DefaultLiquidityPoolService", "api", "nodeRpcUrlsConfig", "params", "tokenService", "DefaultRawPoolTransactionBuilder", "ttl", "Cache", "b", "provider", "approveData", "amount", "token", "validateAmountGtZero", "validateAmountDecimals", "pool", "vUsdBalance", "tokenBalance", "aValue", "dValue", "vUsd", "depositAmountToVUsd", "convertIntAmountToFloat", "accountAddress", "tokenAmountInSP", "vUsdToWithdrawalAmount", "tokenAmount", "fromSystemPrecision", "earned", "commonAmount", "Big", "getChainPoolService", "poolKey", "fromCache", "poolInfo", "chainSymbol", "Chains", "EvmPoolService", "nodeRpcUrl", "web3", "Web3", "FMT_NUMBER", "FMT_BYTES", "tronJsonRpc", "TronPoolService", "tronWeb", "TronWeb", "SolanaPoolService", "SrbPoolService", "SuiPoolService", "TronWeb", "FMT_BYTES", "FMT_NUMBER", "Web3", "artifact", "PortfolioToken_default", "ChainYieldService", "EvmYieldService", "ChainYieldService", "web3", "api", "params", "vCYD", "convertIntAmountToFloat", "amountInt", "convertFloatAmountToInt", "resultInt", "contractAddress", "PortfolioToken_default", "DefaultRawYieldTransactionBuilder", "api", "nodeRpcUrlsConfig", "params", "tokenService", "approveData", "provider", "validateAmountGtZero", "validateAmountDecimals", "convertFloatAmountToInt", "getChainYieldService", "TronYieldService", "ChainYieldService", "tronWeb", "api", "params", "vCYD", "convertIntAmountToFloat", "amountInt", "convertFloatAmountToInt", "resultInt", "amount", "owner", "token", "minVirtualAmount", "parameter", "contractAddress", "methodSignature", "value", "fromAddress", "transactionObject", "SdkError", "PortfolioToken_default", "assertYieldIsSupported", "token", "isYieldSupported", "YieldDoesNotSupportedError", "DefaultYieldService", "api", "nodeRpcUrlsConfig", "params", "tokenService", "DefaultRawYieldTransactionBuilder", "result", "chainMap", "chainData", "cydToken", "t", "tokens", "isYieldSupported", "cydDefined", "provider", "getChainYieldService", "validateAmountGtZero", "validateAmountDecimals", "proportionAmounts", "token", "convertIntAmountToFloat", "chainSymbol", "ownerAddress", "Chains", "EvmYieldService", "nodeRpcUrl", "web3", "Web3", "FMT_NUMBER", "FMT_BYTES", "TronYieldService", "tronWeb", "TronWeb", "MethodNotSupportedError", "Big", "swapAndBridgeFeeCalculation", "amountInTokenPrecision", "sourcePoolInfo", "destinationPoolInfo", "swapToVUsdCalcResult", "swapToVUsd", "swapFromVUsdCalcResult", "swapFromVUsd", "swapAndBridgeFeeCalculationReverse", "swapToVUsdReverse", "swapFromVUsdReverse", "amount", "feeShare", "decimals", "poolInfo", "amountValue", "Big", "fee", "amountWithoutFee", "calcSwapToVUsd", "toSystemPrecision", "amountInSystemPrecision", "tokenBalance", "vUsdNewAmount", "getY", "vUsdBalance", "newAmount", "result", "fromSystemPrecision", "resultWithoutFee", "reversedFeeShare", "amountWithFee", "calcSwapToVUsdReverse", "inSystemPrecision", "Big", "getSendAmountDetails", "amountInTokenPrecision", "sourceToken", "sourcePool", "destToken", "destPool", "vUsd", "swapToVUsd", "vUsdInTokenPrecision", "fromSystemPrecision", "result", "swapFromVUsd", "swapToFeeInt", "Big", "swapFromFeeInt", "convertIntAmountToFloat", "axios", "VERSION", "mapChainDetailsResponseToChainDetailsMap", "response", "map", "entry", "chainSymbol", "chainDetailsDTO", "chainDetails", "mapChainDetailsFromDto", "mapChainDetailsResponseToPoolInfoMap", "poolInfoMap", "chainSymbolValue", "token", "poolKey", "mapPoolKeyObjectToPoolKey", "imbalance", "calculatePoolInfoImbalance", "mapTokenWithChainDetailsFromDto", "dto", "chainName", "chainDetailsWithoutName", "_poolInfo", "dtoWithoutPoolInfo", "mapMessengerKeyDtoToMessenger", "mapTransferTimeFromDto", "result", "key", "value", "mapMessengerTransferTimeFromDto", "messengerTransferTime", "messenger", "basicChainProperties", "Chains", "tokenDto", "mapPoolKeyObjectToPoolKey", "poolKeyObject", "mapChainDetailsMapToPoolKeyObjects", "chainDetailsMap", "result", "chainSymbolValue", "chainDetails", "chainSymbol", "token", "mapPoolInfoResponseToPoolInfoMap", "responseBody", "poolInfoMap", "poolInfoByAddress", "poolAddress", "poolInfo", "calculatePoolInfoImbalance", "ApiClientImpl", "params", "axios", "VERSION", "data", "mapChainDetailsResponseToChainDetailsMap", "mapChainDetailsResponseToPoolInfoMap", "chainSymbol", "address", "txId", "args", "InvalidMessengerOptionError", "pools", "poolKeys", "mapPoolInfoResponseToPoolInfoMap", "Cache", "_20_SECONDS_TTL", "_55_SECONDS_TTL", "ApiClientCaching", "apiClient", "TOKEN_INFO_CACHE_KEY", "tokenInfo", "tokenInfoPromise", "chainSymbol", "address", "GAS_BALANCE_CACHE_KEY", "gasBalance", "gasBalancePromise", "PENDING_INFO_CACHE_KEY", "pendingInfo", "pendingInfoPromise", "args", "RECEIVE_TX_COST_KEY", "transactionCost", "fetchedTransactionCost", "txId", "pools", "AllbridgeCoreClientImpl", "apiClient", "map", "chainDetails", "chainSymbol", "address", "txId", "args", "pools", "AllbridgeCoreClientFilteredImpl", "client", "params", "type", "chainDetailsMapWithFlags", "result", "key", "chainDetailsWithTokensWithFlag", "filterAndConvertToTokenWithChainDetails", "chainSymbol", "address", "txId", "args", "poolKeyObject", "poolInfo", "poolKeyObjects", "tokens", "isStaging", "token", "convertToTokenWithChainDetails", "flags", "rest", "Cache", "_55_SECONDS_TTL", "AllbridgeCoreClientPoolInfoCaching", "client", "PoolInfoCache", "chainSymbol", "txId", "args", "address", "poolKeyObject", "poolInfo", "poolInfoMap", "result", "mapPoolKeyObjectToPoolKey", "SdkError", "poolKeyObjects", "mapChainDetailsMapToPoolKeyObjects", "Cache", "key", "value", "Big", "TronWeb", "Web3", "artifact", "ERC20_default", "Big", "ChainTokenService", "params", "allowance", "MAX_AMOUNT", "USDT_TOKEN_ADDRESS", "POLYGON_GAS_LIMIT", "EvmTokenService", "ChainTokenService", "web3", "api", "params", "tokenAddress", "owner", "spender", "rawTransaction", "amount", "approveMethod", "amountToHex", "chainSymbol", "transactionConfig", "feeOptions", "transactionHash", "contractAddress", "ERC20_default", "AnchorProvider", "Connection", "PublicKey", "SolanaTokenService", "ChainTokenService", "solanaRpcUrl", "api", "params", "MethodNotSupportedError", "accountAddress", "connection", "Connection", "publicKey", "PublicKey", "AnchorProvider", "account", "token", "associatedAccount", "getAssociatedAccount", "getTokenAccountData", "e", "Horizon", "NotFoundError", "SrbTokenService", "ChainTokenService", "nodeRpcUrlsConfig", "params", "api", "MethodNotSupportedError", "SdkError", "symbol", "srbTokenAddress", "stellar", "Horizon", "stellarAccount", "err", "NotFoundError", "balanceInfo", "balance", "convertFloatAmountToInt", "Chains", "nativeBalance", "SuiClient", "SuiTokenService", "ChainTokenService", "suiRpcUrl", "api", "SuiClient", "params", "MethodNotSupportedError", "SdkError", "coinsData", "fetchAllPagesRecursive", "cursor", "total", "element", "MAX_AMOUNT", "TronTokenService", "ChainTokenService", "tronWeb", "api", "params", "tokenAddress", "owner", "rawTransaction", "sendRawTransaction", "spender", "amount", "amountHex", "amountToHex", "parameter", "contractAddress", "ERC20_default", "methodSignature", "parameters", "value", "fromAddress", "transactionObject", "SdkError", "DefaultTokenService", "api", "nodeRpcUrlsConfig", "params", "provider", "allowanceInt", "convertIntAmountToFloat", "validateAmountGtZero", "validateAmountDecimals", "approveData", "tokenBalance", "Chains", "chainSymbol", "ownerAddress", "EvmTokenService", "nodeRpcUrl", "Web3", "TronTokenService", "tronWeb", "TronWeb", "SolanaTokenService", "SrbTokenService", "SuiTokenService", "convertFloatAmountToInt", "Big", "DefaultEvmUtils", "nodeRpcUrlsConfig", "params", "apiClient", "ApiClientImpl", "apiClientCaching", "ApiClientCaching", "coreClient", "AllbridgeCoreClientImpl", "coreClientPoolInfoCaching", "AllbridgeCoreClientPoolInfoCaching", "AllbridgeCoreClientFilteredImpl", "DefaultTokenService", "approveData", "provider", "Connection", "PublicKey", "TransactionMessage", "DefaultSolUtils", "nodeRpcUrlsConfig", "params", "transaction", "memo", "SdkError", "connection", "Connection", "addressLookupTableAccounts", "fetchAddressLookupTableAccountsFromTx", "message", "TransactionMessage", "lastInstruction", "PublicKey", "StellarAsset", "BASE_FEE", "contract", "Horizon", "Operation", "StellarOperation", "SorobanRpc", "TimeoutInfinite", "TransactionBuilder", "StellarTransactionBuilder", "contract", "ContractSpec", "ContractClient", "TokenContract", "ContractClient", "options", "ContractSpec", "FEE", "SEND_TRANSACTION_TIMEOUT", "DefaultSrbUtils", "nodeRpcUrlsConfig", "params", "stellarAccount", "Horizon", "result", "TokenContract", "isErrorSorobanResult", "SdkError", "tokenName", "getViewResultSoroban", "symbol", "srbTokenAddress", "asset", "StellarAsset", "changeTrust", "StellarOperation", "StellarTransactionBuilder", "sender", "tokenAddress", "nodeRpcUrl", "balance", "xdrTx", "stellar", "transaction", "sourceAccount", "server", "SorobanRpc", "account", "TransactionBuilder", "simulation", "BASE_FEE", "Operation", "TimeoutInfinite", "hash", "secondsToWait", "getTransactionResponseAll", "withExponentialBackoff", "resp", "lastResponse", "contract", "address", "config", "DefaultSuiUtils", "nodeRpcUrlsConfig", "api", "baseTx", "inputCoin", "params", "SuiBridgeService", "DefaultUtils", "service", "DefaultSrbUtils", "DefaultSolUtils", "DefaultSuiUtils", "DefaultEvmUtils", "FeePaymentMethod", "AmountFormat", "Big", "NodeRpcUrlsConfig", "nodeRpcUrls", "chainSymbol", "nodeRpcUrl", "NodeRpcUrlNotInitializedError", "AllbridgeCoreSdkService", "nodeRpcUrlsConfig", "params", "mainnet", "Chains", "apiClient", "ApiClientImpl", "apiClientCaching", "ApiClientCaching", "coreClient", "AllbridgeCoreClientImpl", "coreClientPoolInfoCaching", "AllbridgeCoreClientPoolInfoCaching", "AllbridgeCoreClientFilteredImpl", "DefaultTokenService", "DefaultBridgeService", "DefaultLiquidityPoolService", "DefaultYieldService", "type", "chainDetails", "txId", "address", "resolve", "amount", "amountFormat", "sourceToken", "destToken", "validateAmountGtZero", "amountInTokenPrecision", "validateAmountDecimals", "convertFloatAmountToInt", "vUsdAmountInt", "swapToVUsd", "getPoolInfoByToken", "destPoolInfo", "amountResultIntFormatted", "pendingInfoDTO", "pendingInfo", "tokenAddress", "info", "SdkError", "destPoolAfterPending", "getSwapFromVUsdPoolInfo", "amountResultIntAfterPendingFormatted", "estimatedAmount", "Big", "convertAmountPrecision", "convertIntAmountToFloat", "provider", "amountFloat", "sourceChainToken", "amountInt", "vUsdInSystemPrecision", "vUsdInSourcePrecision", "fromSystemPrecision", "getFeePercent", "destinationChainToken", "usd", "swapFromVUsd", "vUsdInDestinationPrecision", "amountToSendFloat", "messenger", "amountToBeReceivedFloat", "sourceProvider", "destinationProvider", "sourcePool", "destPool", "destinationPool", "amountToSend", "vUsd", "CCTPDoesNotSupportedError", "result", "resultInDestPrecision", "OFTDoesNotSupportedError", "adminFeeShareWithExtras", "amountToBeReceived", "swapFromVUsdReverse", "resultInt", "swapToVUsdReverse", "InsufficientPoolLiquidityError", "resultInSourcePrecision", "getGasFeeOptions", "token", "tokens", "poolKeys", "t", "apr", "aprInPercents", "getExtraGasMaxLimits", "vUsdAmount", "amountResultInt", "swapAndBridgeFeeCalculation", "swapAndBridgeFeeCalculationReverse", "newAmount", "getSendAmountDetails", "isNodeUrlsConfig", "nodeUrls", "AllbridgeCoreSdk", "params", "mainnet", "nodeRpcUrlsConfig", "NodeRpcUrlsConfig", "AllbridgeCoreSdkService", "DefaultUtils", "type", "chainSymbol", "txId", "address", "recipientAddress", "tokenAddress", "amount", "amountFormat", "sourceToken", "destToken", "provider", "amountFloat", "sourceChainToken", "destinationChainToken", "amountToSendFloat", "messenger", "amountToBeReceivedFloat", "sourceProvider", "destinationProvider", "sourcePool", "destinationPool", "token", "tokens", "apr", "vUsdAmount", "amountInTokenPrecision"]
7
7
  }