@oceanprotocol/lib 5.0.0 → 5.0.1

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 +1 @@
1
- {"version":3,"file":"lib.umd.js","sources":["../src/@types/Compute.ts","../src/utils/Logger.ts","../src/config/ConfigHelper.ts","../src/utils/minAbi.ts","../src/utils/ContractUtils.ts","../src/contracts/SmartContract.ts","../src/contracts/SmartContractWithAddress.ts","../src/contracts/Dispenser.ts","../src/utils/Constants.ts","../src/contracts/FixedRateExchange.ts","../src/contracts/Router.ts","../src/utils/DatatokenName.ts","../src/contracts/NFTFactory.ts","../src/utils/Addresses.ts","../src/contracts/NFT.ts","../src/contracts/Datatoken.ts","../src/contracts/Datatoken4.ts","../src/contracts/AccessList.ts","../src/contracts/AccessListFactory.ts","../src/contracts/ve/VeOcean.ts","../src/contracts/ve/VeFeeDistributor.ts","../src/contracts/ve/VeFeeEstimate.ts","../src/contracts/ve/VeAllocate.ts","../src/contracts/df/DfRewards.ts","../src/contracts/df/DfStrategyV1.ts","../src/contracts/Escrow.ts","../src/utils/General.ts","../src/utils/SignatureUtils.ts","../src/services/Aquarius.ts","../src/services/Provider.ts","../src/utils/Jwt.ts","../src/utils/TokenUtils.ts","../src/utils/ProviderErrors.ts","../src/utils/OrderUtils.ts","../src/config/Config.ts","../src/utils/Assets.ts","../src/utils/FetchHelper.ts","../src/utils/DdoHelpers.ts"],"sourcesContent":["import { Metadata, MetadataAlgorithm } from '@oceanprotocol/ddo-js'\n\nexport type ComputeResultType =\n | 'algorithmLog'\n | 'output'\n | 'configrationLog'\n | 'publishLog'\n\n// OLD V1 ComputeEnvironment specs\n// export interface ComputeEnvironment {\n// id: string\n// cpuNumber: number\n// cpuType: string\n// gpuNumber: number\n// gpuType: string\n// ramGB: number\n// diskGB: number\n// priceMin: number\n// desc: string\n// currentJobs: number\n// maxJobs: number\n// consumerAddress: string\n// storageExpiry: number\n// maxJobDuration: number\n// lastSeen: number\n// free: boolean\n// }\n\n// new V2 C2D Compute Environment specs\nexport interface RunningPlatform {\n architecture: string\n os: string\n}\n\nexport type ComputeResourceType = 'cpu' | 'memory' | 'storage'\n\nexport interface ComputeResourcesPricingInfo {\n type: ComputeResourceType\n price: number\n}\nexport interface ComputeEnvFees {\n feeToken: string\n prices: ComputeResourcesPricingInfo[]\n}\nexport interface ComputeEnvFeesStructure {\n [chainId: string]: ComputeEnvFees\n}\n\nexport interface ComputeResourceRequest {\n id: string\n amount: number\n}\n\nexport interface ComputeResource {\n id: ComputeResourceType\n type?: string\n kind?: string\n total: number // total number of specific resource\n min: number // min number of resource needed for a job\n max: number // max number of resource for a job\n inUse?: number // for display purposes\n}\n\nexport interface ComputeEnvironmentFreeOptions {\n // only if a compute env exposes free jobs\n storageExpiry?: number\n maxJobDuration?: number\n maxJobs?: number // maximum number of simultaneous free jobs\n resources?: ComputeResource[]\n}\nexport interface ComputeEnvironment {\n // legacy\n // cpuNumber: number\n // cpuType: string\n // gpuNumber: number\n // gpuType: string\n // ramGB: number\n // diskGB: number\n // priceMin: number\n // totalCpu: number // total cpu available for jobs\n // maxCpu: number // max cpu for a single job. Imagine a K8 cluster with two nodes, each node with 10 cpus. Total=20, but at most you can allocate 10 cpu for a job\n // totalRam: number // total gb of RAM\n // maxRam: number // max allocatable GB RAM for a single job.\n // maxDisk: number // max GB of disck allocatable for a single job\n // currentJobs: number\n // lastSeen: number\n // legacy\n id: string\n description: string\n consumerAddress: string\n storageExpiry?: number // amount of seconds for storage\n minJobDuration?: number // min billable seconds for a paid job\n maxJobDuration?: number // max duration in seconds for a paid job\n maxJobs?: number // maximum number of simultaneous paid jobs\n runningJobs: number // amount of running jobs (paid jobs)\n runningfreeJobs?: number // amount of running jobs (free jobs)\n fees: ComputeEnvFeesStructure\n resources?: ComputeResource[]\n free?: ComputeEnvironmentFreeOptions\n platform?: RunningPlatform\n}\n\nexport interface ComputeResult {\n filename: string\n filesize: number\n type: ComputeResultType\n index?: number\n}\n\nexport type ComputeJobMetadata = {\n [key: string]: string | number | boolean\n}\n\nexport interface ComputeJob {\n owner: string\n did?: string\n jobId: string\n dateCreated: string\n dateFinished: string\n status: number\n statusText: string\n results: ComputeResult[]\n inputDID?: string[]\n algoDID?: string\n agreementId?: string\n expireTimestamp: number\n metadata?: ComputeJobMetadata\n}\n\nexport interface ComputeOutput {\n publishAlgorithmLog?: boolean\n publishOutput?: boolean\n providerAddress?: string\n providerUri?: string\n metadata?: Metadata\n metadataUri?: string\n nodeUri?: string\n owner?: string\n secretStoreUri?: string\n whitelist?: string[]\n}\n\nexport enum FileObjectType {\n URL = 'url',\n IPFS = 'ipfs',\n ARWEAVE = 'arweave'\n}\n\nexport enum EncryptMethod {\n AES = 'AES',\n ECIES = 'ECIES'\n}\n\nexport interface HeadersObject {\n [key: string]: string\n}\n\nexport interface BaseFileObject {\n type: string\n encryptedBy?: string\n encryptMethod?: EncryptMethod\n}\n\nexport interface UrlFileObject extends BaseFileObject {\n url: string\n method: string\n headers?: [HeadersObject]\n}\n\nexport interface IpfsFileObject extends BaseFileObject {\n hash: string\n}\n\nexport interface ArweaveFileObject extends BaseFileObject {\n transactionId: string\n}\nexport interface ComputeAsset {\n fileObject?: BaseFileObject // C2D v2\n documentId: string\n serviceId: string\n transferTxId?: string\n userdata?: { [key: string]: any }\n}\n\nexport interface ComputeAlgorithm {\n fileObject?: BaseFileObject // C2D v2\n documentId?: string\n serviceId?: string\n meta?: MetadataAlgorithm\n transferTxId?: string\n algocustomdata?: { [key: string]: any }\n userdata?: { [key: string]: any }\n}\n\nexport interface ComputePayment {\n chainId: number\n token: string\n maxJobDuration: number\n}\n\nexport interface ValidationResponse {\n isValid: boolean\n message: string\n}\n","/* eslint-disable no-unused-vars */\nexport enum LogLevel {\n None = -1,\n Error = 0,\n Warn = 1,\n Log = 2,\n Verbose = 3\n}\n/* eslint-enable no-unused-vars */\n\nexport class Logger {\n constructor(private logLevel?: LogLevel) {\n this.logLevel = logLevel || LogLevel.Error\n }\n\n public setLevel(logLevel: LogLevel): void {\n this.logLevel = logLevel\n }\n\n public bypass(...args: any[]): void {\n this.dispatch('log', -Infinity as any, ...args)\n }\n\n public debug(...args: any[]): void {\n this.dispatch('debug', LogLevel.Verbose, ...args)\n }\n\n public log(...args: any[]): void {\n this.dispatch('log', LogLevel.Log, ...args)\n }\n\n public warn(...args: any[]): void {\n this.dispatch('warn', LogLevel.Warn, ...args)\n }\n\n public error(...args: any[]): void {\n this.dispatch('error', LogLevel.Error, ...args)\n }\n\n private dispatch(verb: string, level: LogLevel, ...args: any[]) {\n if (this.logLevel >= level) {\n ;(console as Record<string, any>)[verb](...args)\n }\n }\n}\n\nexport const LoggerInstance = new Logger()\n","// eslint-disable-next-line import/no-named-default\nimport { default as DefaultContractsAddresses } from '@oceanprotocol/contracts/addresses/address.json'\nimport fs from 'fs'\nimport { Config } from '.'\nimport { LoggerInstance } from '../utils/Logger.js'\n\nconst configHelperNetworksBase: Config = {\n chainId: null,\n network: 'unknown',\n nodeUri: 'http://127.0.0.1:8545',\n oceanNodeUri: 'http://127.0.0.1:8001',\n explorerUri: null,\n oceanTokenAddress: null,\n oceanTokenSymbol: 'OCEAN',\n fixedRateExchangeAddress: null,\n dispenserAddress: null,\n startBlock: 0,\n transactionBlockTimeout: 50,\n transactionConfirmationBlocks: 1,\n transactionPollingTimeout: 750,\n gasFeeMultiplier: 1\n}\n\nexport const configHelperNetworks: Config[] = [\n {\n ...configHelperNetworksBase\n },\n {\n // barge\n ...configHelperNetworksBase,\n chainId: 8996,\n network: 'development',\n oceanNodeUri: 'http://127.0.0.1:8001',\n sdk: 'evm'\n },\n {\n ...configHelperNetworksBase,\n chainId: 11155111,\n network: 'sepolia',\n nodeUri: 'https://sepolia.infura.io/v3',\n explorerUri: 'https://sepolia.etherscan.io',\n gasFeeMultiplier: 1.1,\n sdk: 'evm'\n },\n {\n ...configHelperNetworksBase,\n chainId: 1,\n network: 'mainnet',\n nodeUri: 'https://mainnet.infura.io/v3',\n explorerUri: 'https://etherscan.io',\n startBlock: 11105459,\n transactionBlockTimeout: 150,\n transactionConfirmationBlocks: 5,\n transactionPollingTimeout: 1750,\n gasFeeMultiplier: 1.05,\n sdk: 'evm'\n },\n {\n ...configHelperNetworksBase,\n chainId: 137,\n network: 'polygon',\n nodeUri: 'https://polygon-mainnet.infura.io/v3',\n explorerUri: 'https://polygonscan.com',\n oceanTokenSymbol: 'mOCEAN',\n gasFeeMultiplier: 1.6,\n sdk: 'evm'\n },\n {\n ...configHelperNetworksBase,\n chainId: 2021000,\n network: 'gaiaxtestnet',\n nodeUri: 'https://rpc.gaiaxtestnet.oceanprotocol.com',\n explorerUri: 'https://blockscout.gaiaxtestnet.oceanprotocol.com',\n sdk: 'evm'\n },\n {\n ...configHelperNetworksBase,\n chainId: 80001,\n network: 'mumbai',\n nodeUri: 'https://polygon-mumbai.infura.io/v3',\n explorerUri: 'https://mumbai.polygonscan.com',\n gasFeeMultiplier: 1.1,\n sdk: 'evm'\n },\n {\n ...configHelperNetworksBase,\n chainId: 56,\n network: 'bsc',\n nodeUri: 'https://bsc-dataseed.binance.org',\n explorerUri: 'https://bscscan.com/',\n gasFeeMultiplier: 1.05,\n sdk: 'evm'\n },\n {\n ...configHelperNetworksBase,\n chainId: 246,\n network: 'energyweb',\n nodeUri: 'https://rpc.energyweb.org',\n explorerUri: 'https://explorer.energyweb.org',\n gasFeeMultiplier: 1.05,\n sdk: 'evm'\n },\n {\n ...configHelperNetworksBase,\n chainId: 1285,\n network: 'moonriver',\n nodeUri: 'https://moonriver.api.onfinality.io/public',\n explorerUri: 'https://moonriver.moonscan.io/',\n gasFeeMultiplier: 1.05,\n sdk: 'evm'\n },\n {\n ...configHelperNetworksBase,\n chainId: 100,\n network: 'gen-x-testnet',\n nodeUri: 'https://rpc.genx.minimal-gaia-x.eu',\n explorerUri: 'https://explorer.genx.minimal-gaia-x.eu/',\n gasFeeMultiplier: 1,\n sdk: 'evm'\n },\n {\n ...configHelperNetworksBase,\n chainId: 10,\n network: 'optimism',\n nodeUri: 'https://mainnet.optimism.io',\n explorerUri: 'https://optimistic.etherscan.io/',\n gasFeeMultiplier: 1.1,\n sdk: 'evm'\n },\n {\n ...configHelperNetworksBase,\n chainId: 11155420,\n network: 'optimism_sepolia',\n nodeUri: 'https://sepolia.optimism.io',\n explorerUri: 'https://sepolia-optimism.etherscan.io/',\n gasFeeMultiplier: 1.1,\n sdk: 'evm'\n },\n {\n ...configHelperNetworksBase,\n chainId: 23294,\n network: 'oasis_sapphire',\n nodeUri: 'https://sapphire.oasis.io',\n explorerUri: 'https://explorer.oasis.io/mainnet/sapphire/',\n gasFeeMultiplier: 1,\n sdk: 'oasis'\n },\n {\n ...configHelperNetworksBase,\n chainId: 23295,\n network: 'oasis_sapphire_testnet',\n nodeUri: 'https://testnet.sapphire.oasis.dev',\n explorerUri: 'https://explorer.oasis.io/testnet/sapphire/',\n gasFeeMultiplier: 1,\n sdk: 'oasis'\n },\n {\n ...configHelperNetworksBase,\n chainId: 32456,\n network: 'pontus-x-devnet',\n nodeUri: 'https://rpc.dev.pontus-x.eu',\n explorerUri: 'https://explorer.dev.pontus-x.eu/testnet/pontusx',\n sdk: 'evm'\n }\n]\n\nexport const KNOWN_CONFIDENTIAL_EVMS = [\n 23294, // oasis_sapphire\n 23295 // oasis_sapphire_testnet\n]\n\nexport class ConfigHelper {\n /* Load contract addresses from env ADDRESS_FILE (generated by ocean-contracts) */\n public getAddressesFromEnv(network: string, customAddresses?: any): Partial<Config> {\n let configAddresses: Partial<Config>\n\n const getUris = () => {\n if (process.env.NODE_URL) {\n return {\n oceanNodeUri: process.env.NODE_URL\n }\n }\n\n return {}\n }\n\n if (customAddresses && customAddresses[network]) {\n const {\n FixedPrice,\n Dispenser,\n ERC721Factory,\n OPFCommunityFeeCollector,\n Ocean,\n chainId,\n startBlock,\n veAllocate,\n veOCEAN,\n veDelegation,\n veFeeDistributor,\n veDelegationProxy,\n DFRewards,\n DFStrategyV1,\n veFeeEstimate,\n Router,\n AccessListFactory\n } = customAddresses[network]\n configAddresses = {\n nftFactoryAddress: ERC721Factory,\n opfCommunityFeeCollector: OPFCommunityFeeCollector,\n fixedRateExchangeAddress: FixedPrice,\n dispenserAddress: Dispenser,\n oceanTokenAddress: Ocean,\n routerFactoryAddress: Router,\n chainId,\n startBlock,\n veAllocate,\n veOCEAN,\n veDelegation,\n veFeeDistributor,\n veDelegationProxy,\n DFRewards,\n DFStrategyV1,\n veFeeEstimate,\n accessListFactory: AccessListFactory,\n ...getUris()\n }\n } else if ((DefaultContractsAddresses as { [key: string]: any })[network]) {\n const {\n FixedPrice,\n Dispenser,\n OPFCommunityFeeCollector,\n ERC721Factory,\n Ocean,\n chainId,\n startBlock,\n veAllocate,\n veOCEAN,\n veDelegation,\n veFeeDistributor,\n veDelegationProxy,\n DFRewards,\n DFStrategyV1,\n veFeeEstimate,\n Router,\n AccessListFactory\n } = (DefaultContractsAddresses as { [key: string]: any })[network]\n configAddresses = {\n nftFactoryAddress: ERC721Factory,\n opfCommunityFeeCollector: OPFCommunityFeeCollector,\n fixedRateExchangeAddress: FixedPrice,\n dispenserAddress: Dispenser,\n oceanTokenAddress: Ocean,\n routerFactoryAddress: Router,\n chainId,\n startBlock,\n veAllocate,\n veOCEAN,\n veDelegation,\n veFeeDistributor,\n veDelegationProxy,\n DFRewards,\n DFStrategyV1,\n veFeeEstimate,\n accessListFactory: AccessListFactory,\n ...getUris()\n }\n }\n return configAddresses\n }\n\n /**\n * Returns the config object for a specific network supported by the oceanprotocol stack\n * @param {string | number} network the network's chainId or name\n * @param {string} infuraProjectId optional infura project id that will replace the configs node URI\n * @return {Config} Config obhjedct\n */\n public getConfig(network: string | number, infuraProjectId?: string): Config {\n const filterBy = typeof network === 'string' ? 'network' : 'chainId'\n\n let config = configHelperNetworks.find((c) => c[filterBy] === network)\n\n if (!config) {\n LoggerInstance.error(`No config found for given network '${network}'`)\n return null\n }\n\n let addresses\n try {\n addresses = process.env.ADDRESS_FILE\n ? JSON.parse(\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n fs.readFileSync(process.env.ADDRESS_FILE, 'utf8')\n )\n : null\n } catch (e) {\n console.log(e)\n addresses = null\n }\n\n let contractAddressesConfig = this.getAddressesFromEnv(config.network, addresses)\n // check oasis network name typos on addresses.json\n if (!contractAddressesConfig && KNOWN_CONFIDENTIAL_EVMS.includes(config.chainId)) {\n contractAddressesConfig = this.getAddressesFromEnv(\n config.network.replace('sapph', 'saph'),\n addresses\n )\n }\n\n if (!('sdk' in config) || config.sdk === null) {\n if (KNOWN_CONFIDENTIAL_EVMS.includes(config.chainId)) {\n config.sdk = 'oasis'\n } else {\n config.sdk = 'evm'\n }\n }\n if (contractAddressesConfig && 'accessListFactory' in contractAddressesConfig) {\n config.accessListFactory = contractAddressesConfig.accessListFactory\n }\n\n config = { ...config, ...contractAddressesConfig }\n\n const nodeUri = infuraProjectId\n ? `${config.nodeUri}/${infuraProjectId}`\n : config.nodeUri\n\n return { ...config, nodeUri }\n }\n}\n","export const minAbi = [\n {\n constant: true,\n inputs: [],\n name: 'name',\n outputs: [\n {\n name: '',\n type: 'string'\n }\n ],\n payable: false,\n stateMutability: 'view',\n type: 'function'\n },\n {\n constant: false,\n inputs: [\n {\n name: '_spender',\n type: 'address'\n },\n {\n name: '_value',\n type: 'uint256'\n }\n ],\n name: 'approve',\n outputs: [\n {\n name: '',\n type: 'bool'\n }\n ],\n payable: false,\n stateMutability: 'nonpayable',\n type: 'function'\n },\n {\n constant: true,\n inputs: [],\n name: 'totalSupply',\n outputs: [\n {\n name: '',\n type: 'uint256'\n }\n ],\n payable: false,\n stateMutability: 'view',\n type: 'function'\n },\n {\n constant: false,\n inputs: [\n {\n name: '_from',\n type: 'address'\n },\n {\n name: '_to',\n type: 'address'\n },\n {\n name: '_value',\n type: 'uint256'\n }\n ],\n name: 'transferFrom',\n outputs: [\n {\n name: '',\n type: 'bool'\n }\n ],\n payable: false,\n stateMutability: 'nonpayable',\n type: 'function'\n },\n {\n constant: true,\n inputs: [],\n name: 'decimals',\n outputs: [\n {\n name: '',\n type: 'uint8'\n }\n ],\n payable: false,\n stateMutability: 'view',\n type: 'function'\n },\n {\n constant: true,\n inputs: [\n {\n name: '_owner',\n type: 'address'\n }\n ],\n name: 'balanceOf',\n outputs: [\n {\n name: 'balance',\n type: 'uint256'\n }\n ],\n payable: false,\n stateMutability: 'view',\n type: 'function'\n },\n {\n constant: true,\n inputs: [],\n name: 'symbol',\n outputs: [\n {\n name: '',\n type: 'string'\n }\n ],\n payable: false,\n stateMutability: 'view',\n type: 'function'\n },\n {\n constant: false,\n inputs: [\n {\n name: '_to',\n type: 'address'\n },\n {\n name: '_value',\n type: 'uint256'\n }\n ],\n name: 'transfer',\n outputs: [\n {\n name: '',\n type: 'bool'\n }\n ],\n payable: false,\n stateMutability: 'nonpayable',\n type: 'function'\n },\n {\n constant: true,\n inputs: [\n {\n name: '_owner',\n type: 'address'\n },\n {\n name: '_spender',\n type: 'address'\n }\n ],\n name: 'allowance',\n outputs: [\n {\n name: '',\n type: 'uint256'\n }\n ],\n payable: false,\n stateMutability: 'view',\n type: 'function'\n },\n {\n payable: true,\n stateMutability: 'payable',\n type: 'fallback'\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n name: 'owner',\n type: 'address'\n },\n {\n indexed: true,\n name: 'spender',\n type: 'address'\n },\n {\n indexed: false,\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 name: 'from',\n type: 'address'\n },\n {\n indexed: true,\n name: 'to',\n type: 'address'\n },\n {\n indexed: false,\n name: 'value',\n type: 'uint256'\n }\n ],\n name: 'Transfer',\n type: 'event'\n }\n]\n","import {\n ethers,\n Signer,\n Contract,\n TransactionResponse,\n BaseContractMethod,\n formatUnits,\n parseUnits,\n EventLog,\n TransactionReceipt\n} from 'ethers'\n\nimport { Config, KNOWN_CONFIDENTIAL_EVMS } from '../config/index.js'\nimport { LoggerInstance } from './Logger.js'\nimport { minAbi } from './minAbi.js'\nimport BigNumber from 'bignumber.js'\n\nconst MIN_GAS_FEE_POLYGON = 30000000000 // minimum recommended 30 gwei polygon main and mumbai fees\nconst MIN_GAS_FEE_SEPOLIA = 4000000000 // minimum 4 gwei for eth sepolia testnet\nconst MIN_GAS_FEE_SAPPHIRE = 10000000000 // recommended for mainnet and testnet 10 gwei\nconst POLYGON_NETWORK_ID = 137\nconst MUMBAI_NETWORK_ID = 80001\nconst SEPOLIA_NETWORK_ID = 11155111\n\nexport function setContractDefaults(contract: Contract, config: Config): Contract {\n // TO DO - since ethers does not provide this\n /* if (config) {\n if (config.transactionBlockTimeout)\n contract.transactionBlockTimeout = config.transactionBlockTimeout\n if (config.transactionConfirmationBlocks)\n contract.transactionConfirmationBlocks = config.transactionConfirmationBlocks\n if (config.transactionPollingTimeout)\n contract.transactionPollingTimeout = config.transactionPollingTimeout\n }\n */\n return contract\n}\n\n/**\n * Asynchronous function that returns a fair gas price based on the current gas price and a multiplier.\n * @param {Signer} signer - The signer object to use for fetching the current gas price.\n * @param {number} gasFeeMultiplier - The multiplier to apply to the current gas price. If not provided, the current gas price is returned as a string.\n * @returns A Promise that resolves to a string representation of the fair gas price.\n */\nexport async function getFairGasPrice(\n signer: Signer,\n gasFeeMultiplier: number\n): Promise<string> {\n const price = await (await signer.provider.getFeeData()).gasPrice\n const x = BigInt(price.toString())\n if (gasFeeMultiplier) return (x * BigInt(gasFeeMultiplier)).toString(10)\n else return x.toString()\n}\n\n/**\n * Asynchronous function that returns the number of decimal places for a given token.\n * @param {Signer} signer - The signer object to use for fetching the token decimals.\n * @param {string} token - The address of the token contract.\n * @returns A Promise that resolves to the number of decimal places for the token.\n */\nexport async function getTokenDecimals(signer: Signer, token: string) {\n const tokenContract = new ethers.Contract(token, minAbi, signer)\n return tokenContract.decimals()\n}\n\n/**\n * Converts an amount of units to tokens\n * @param {Signer} signer - The signer object to use.\n * @param {string} token - The token to convert\n * @param {string} amount - The amount of units to convert\n * @param {number} [tokenDecimals] - The number of decimals in the token\n * @returns {Promise<string>} - The converted amount in tokens\n */\nexport async function unitsToAmount(\n signer: Signer,\n token: string,\n amount: string,\n tokenDecimals?: number\n): Promise<string> {\n let decimals = tokenDecimals || (await getTokenDecimals(signer, token))\n if (decimals === '0') {\n decimals = 18\n }\n\n const amountFormatted = formatUnits(amount, decimals)\n return amountFormatted.toString()\n}\n\n/**\n * Converts an amount of tokens to units\n * @param {Signer} signer - The signer object to use.\n * @param {string} token - The token to convert\n * @param {string} amount - The amount of tokens to convert\n * @param {number} [tokenDecimals] - The number of decimals of the token\n * @returns {Promise<string>} - The converted amount in units\n */\nexport async function amountToUnits(\n signer: Signer,\n token: string,\n amount: string,\n tokenDecimals?: number\n): Promise<string> {\n let decimals = tokenDecimals || (await getTokenDecimals(signer, token))\n if (decimals === '0') {\n decimals = 18\n }\n const amountFormatted = parseUnits(amount, decimals)\n return amountFormatted.toString()\n}\n\nexport function getEventFromTx(\n txReceipt: TransactionReceipt,\n eventName: string\n): EventLog | undefined {\n if (!txReceipt || !txReceipt.logs) {\n return undefined\n }\n\n const foundLog = txReceipt.logs.filter((log): log is EventLog => {\n return log instanceof EventLog && log.eventName === eventName\n })[0]\n\n return foundLog\n}\n\n/**\n * Send the transation on chain\n * @param {BigNumber} estGas estimated gas for the transaction\n * @param {Signer} signer signer object\n * @param {number} gasFeeMultiplier number represinting the multiplier we apply to gas fees\n * @param {Function} functionToSend function that we need to send\n * @param {...any[]} args arguments of the function\n * @return {Promise<any>} transaction receipt\n */\nexport async function sendTx(\n estGas: bigint,\n signer: Signer,\n gasFeeMultiplier: number,\n functionToSend: BaseContractMethod,\n ...args: any[]\n): Promise<TransactionResponse> {\n const { chainId } = await signer.provider.getNetwork()\n const feeHistory = await signer.provider.getFeeData()\n let overrides: Record<string, any> = {}\n if (feeHistory.maxPriorityFeePerGas) {\n let aggressiveFeePriorityFeePerGas = feeHistory.maxPriorityFeePerGas.toString()\n let aggressiveFeePerGas = feeHistory.maxFeePerGas.toString()\n if (gasFeeMultiplier > 1) {\n aggressiveFeePriorityFeePerGas = Math.round(\n Number(feeHistory.maxPriorityFeePerGas) * gasFeeMultiplier\n ).toString()\n aggressiveFeePerGas = Math.round(\n Number(feeHistory.maxFeePerGas) * gasFeeMultiplier\n ).toString()\n }\n overrides = {\n maxPriorityFeePerGas:\n (Number(chainId) === MUMBAI_NETWORK_ID ||\n Number(chainId) === POLYGON_NETWORK_ID) &&\n Number(aggressiveFeePriorityFeePerGas) < MIN_GAS_FEE_POLYGON\n ? MIN_GAS_FEE_POLYGON\n : Number(chainId) === SEPOLIA_NETWORK_ID &&\n Number(aggressiveFeePriorityFeePerGas) < MIN_GAS_FEE_SEPOLIA\n ? MIN_GAS_FEE_SEPOLIA\n : KNOWN_CONFIDENTIAL_EVMS.includes(Number(chainId)) &&\n Number(aggressiveFeePriorityFeePerGas) < MIN_GAS_FEE_SAPPHIRE\n ? MIN_GAS_FEE_SAPPHIRE\n : Number(aggressiveFeePriorityFeePerGas),\n\n maxFeePerGas:\n (Number(chainId) === MUMBAI_NETWORK_ID ||\n Number(chainId) === POLYGON_NETWORK_ID) &&\n Number(aggressiveFeePerGas) < MIN_GAS_FEE_POLYGON\n ? MIN_GAS_FEE_POLYGON\n : Number(chainId) === SEPOLIA_NETWORK_ID &&\n Number(aggressiveFeePerGas) < MIN_GAS_FEE_SEPOLIA\n ? MIN_GAS_FEE_SEPOLIA\n : KNOWN_CONFIDENTIAL_EVMS.includes(Number(chainId)) &&\n Number(aggressiveFeePerGas) < MIN_GAS_FEE_SAPPHIRE\n ? MIN_GAS_FEE_SAPPHIRE\n : Number(aggressiveFeePerGas)\n }\n } else {\n overrides = {\n gasPrice: feeHistory.gasPrice\n }\n }\n overrides.gasLimit = BigInt(new BigNumber(estGas).plus(20000n).toString())\n try {\n const trxReceipt = await functionToSend(...args, overrides)\n await trxReceipt.wait()\n return trxReceipt\n } catch (e) {\n LoggerInstance.error('Send tx error: ', e)\n return null\n }\n}\n","import { ethers, Signer, Contract } from 'ethers'\nimport { AbiItem } from '../@types/index.js'\nimport { Config, ConfigHelper } from '../config/index.js'\nimport * as sapphire from '@oasisprotocol/sapphire-paratime'\nimport {\n amountToUnits,\n getFairGasPrice,\n setContractDefaults,\n unitsToAmount\n} from '../utils/ContractUtils.js'\n\nexport abstract class SmartContract {\n public signer: Signer\n public config: Config\n public abi: AbiItem[]\n\n abstract getDefaultAbi(): any[]\n\n /**\n * Instantiate the smart contract.\n * @param {Signer} signer The signer object.\n * @param {string | number} [network] Network id or name\n * @param {Config} [config] The configuration object.\n * @param {AbiItem[]} [abi] ABI array of the smart contract\n */\n constructor(\n signer: Signer,\n network?: string | number,\n config?: Config,\n abi?: AbiItem[]\n ) {\n this.signer = signer\n this.config = config || new ConfigHelper().getConfig(network)\n this.abi = abi || this.getDefaultAbi()\n }\n\n protected getSignerAccordingSdk() {\n return this.config && 'sdk' in this.config && this.config.sdk === 'oasis'\n ? sapphire.wrap(this.signer)\n : this.signer\n }\n\n /**\n * Converts an amount of tokens to units\n * @param {string} token - The token to convert\n * @param {string} amount - The amount of tokens to convert\n * @param {number} [tokenDecimals] - The number of decimals of the token\n * @returns {Promise<string>} - The converted amount in units\n */\n protected async amountToUnits(\n token: string,\n amount: string,\n tokenDecimals?: number\n ): Promise<string> {\n return amountToUnits(this.signer, token, amount, tokenDecimals)\n }\n\n /**\n * Converts an amount of units to tokens\n * @param {string} token - The token to convert\n * @param {string} amount - The amount of units to convert\n * @param {number} [tokenDecimals] - The number of decimals in the token\n * @returns {Promise<string>} - The converted amount in tokens\n */\n protected async unitsToAmount(\n token: string,\n amount: string,\n tokenDecimals?: number\n ): Promise<string> {\n return unitsToAmount(this.signer, token, amount, tokenDecimals)\n }\n\n /**\n * Retruns the gas price\n * @returns {Promise<string>} - The fair gas price\n */\n protected async getFairGasPrice(): Promise<string> {\n return getFairGasPrice(this.signer, this.config?.gasFeeMultiplier)\n }\n\n /**\n * Returns a contract instance for the given address\n * @param {string} address - The address of the contract\n * @param {AbiItem[]} [abi] - The ABI of the contract\n * @returns {Contract} - The contract instance\n */\n protected getContract(address: string, abi?: AbiItem[]): Contract {\n if (!address) {\n throw new Error('Contract address is required but not provided')\n }\n const abiToUse = abi || this.abi\n const contract = new ethers.Contract(\n address,\n new ethers.Interface(JSON.stringify(abiToUse)),\n this.signer\n )\n return setContractDefaults(contract, this.config)\n }\n}\n","import { Signer, Contract } from 'ethers'\nimport { AbiItem } from '../@types/index.js'\nimport { Config } from '../config/index.js'\nimport { SmartContract } from './SmartContract.js'\nexport abstract class SmartContractWithAddress extends SmartContract {\n public address: string\n public contract: Contract\n\n /**\n * Instantiate the smart contract.\n * @param {string} address The address of the contract.\n * @param {Signer} signer The signer object.\n * @param {string | number} network Network id or name\n * @param {Config} config The configuration object.\n * @param {AbiItem[]} abi ABI array of the smart contract\n */\n constructor(\n address: string,\n signer: Signer,\n network?: string | number,\n config?: Config,\n abi?: AbiItem[]\n ) {\n super(signer, network, config, abi)\n this.address = address\n this.contract = this.getContract(this.address)\n }\n}\n","import Decimal from 'decimal.js'\nimport DispenserAbi from '@oceanprotocol/contracts/artifacts/contracts/pools/dispenser/Dispenser.sol/Dispenser.json'\nimport { Datatoken } from './Datatoken.js'\nimport { SmartContractWithAddress } from './SmartContractWithAddress.js'\nimport { DispenserToken, ReceiptOrEstimate, AbiItem } from '../@types/index.js'\nimport { sendTx } from '../utils/ContractUtils.js'\n\nexport class Dispenser extends SmartContractWithAddress {\n getDefaultAbi() {\n return DispenserAbi.abi as AbiItem[]\n }\n\n /**\n * Get information about a datatoken dispenser\n * @param {String} dtAddress\n * @return {Promise<DispenserToken>}\n */\n public async status(dtAdress: string): Promise<DispenserToken> {\n const status2: DispenserToken = await this.contract.status(dtAdress)\n if (!status2) {\n throw new Error(`Np dispenser found for the given datatoken address`)\n }\n const status = {\n active: status2.active,\n owner: status2.owner,\n isMinter: status2.isMinter,\n maxTokens: await this.unitsToAmount(null, status2.maxTokens, 18),\n maxBalance: await this.unitsToAmount(null, status2.maxBalance, 18),\n balance: await this.unitsToAmount(null, status2.balance, 18),\n allowedSwapper: status2.allowedSwapper\n }\n return status\n }\n\n /**\n * Creates a new Dispenser\n * @param {String} dtAddress Datatoken address\n * @param {String} address Owner address\n * @param {String} maxTokens max tokens to dispense\n * @param {String} maxBalance max balance of requester\n * @param {String} allowedSwapper only account that can ask tokens. set address(0) if not required\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transactionId\n */\n public async create<G extends boolean = false>(\n dtAddress: string,\n address: string,\n maxTokens: string,\n maxBalance: string,\n allowedSwapper: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const estGas = await this.contract.create.estimateGas(\n dtAddress,\n this.amountToUnits(null, maxTokens, 18),\n this.amountToUnits(null, maxBalance, 18),\n address,\n allowedSwapper\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n // Call createFixedRate contract method\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.create,\n dtAddress,\n this.amountToUnits(null, maxTokens, 18),\n this.amountToUnits(null, maxBalance, 18),\n address,\n allowedSwapper\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Activates a dispener.\n * @param {String} dtAddress refers to datatoken address.\n * @param {Number} maxTokens max amount of tokens to dispense\n * @param {Number} maxBalance max balance of user. If user balance is >, then dispense will be rejected\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} TransactionReceipt\n */\n public async activate<G extends boolean = false>(\n dtAddress: string,\n maxTokens: string,\n maxBalance: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const estGas = await this.contract.activate.estimateGas(\n dtAddress,\n this.amountToUnits(null, maxTokens, 18),\n this.amountToUnits(null, maxBalance, 18)\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.activate,\n dtAddress,\n this.amountToUnits(null, maxTokens, 18),\n this.amountToUnits(null, maxBalance, 18)\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Deactivate an existing dispenser.\n * @param {String} dtAddress refers to datatoken address.\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} TransactionReceipt\n */\n public async deactivate<G extends boolean = false>(\n dtAddress: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const estGas = await this.contract.deactivate.estimateGas(dtAddress)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.deactivate,\n dtAddress\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Sets a new allowed swapper.\n * @param {String} dtAddress Datatoken address.\n * @param {String} newAllowedSwapper The address of the new allowed swapper.\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async setAllowedSwapper<G extends boolean = false>(\n dtAddress: string,\n newAllowedSwapper: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const estGas = await this.contract.setAllowedSwapper.estimateGas(\n dtAddress,\n newAllowedSwapper\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.setAllowedSwapper,\n dtAddress,\n newAllowedSwapper\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Dispense datatokens to caller.\n * The dispenser must be active, hold enough datatokens (or be able to mint more)\n * and respect maxTokens/maxBalance requirements\n * @param {String} dtAddress Datatoken address.\n * @param {String} amount Amount of datatokens required.\n * @param {String} destination address of tokens receiver\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async dispense<G extends boolean = false>(\n dtAddress: string,\n amount: string = '1',\n destination: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const estGas = await this.contract.dispense.estimateGas(\n dtAddress,\n this.amountToUnits(null, amount, 18),\n destination\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.dispense,\n dtAddress,\n this.amountToUnits(null, amount, 18),\n destination\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Withdraw all tokens from the dispenser\n * @param {String} dtAddress Datatoken address.\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async ownerWithdraw<G extends boolean = false>(\n dtAddress: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const estGas = await this.contract.ownerWithdraw.estimateGas(dtAddress)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.ownerWithdraw,\n dtAddress\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Check if tokens can be dispensed\n * @param {String} dtAddress Datatoken address\n * @param {String} address User address that will receive datatokens\n * @param {String} amount amount of datatokens required.\n * @return {Promise<Boolean>}\n */\n public async isDispensable(\n dtAddress: string,\n datatoken: Datatoken,\n address: string,\n amount: string = '1'\n ): Promise<Boolean> {\n const status = await this.status(dtAddress)\n if (!status) return false\n // check active\n if (status.active === false) return false\n // check maxBalance\n const userBalance = new Decimal(await datatoken.balance(dtAddress, address))\n if (userBalance.greaterThanOrEqualTo(status.maxBalance)) return false\n // check maxAmount\n if (new Decimal(String(amount)).greaterThan(status.maxTokens)) return false\n // check dispenser balance\n const contractBalance = new Decimal(status.balance)\n if (contractBalance.greaterThanOrEqualTo(amount) || status.isMinter === true)\n return true\n return false\n }\n}\n","export const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000'\nexport const GASLIMIT_DEFAULT = 1000000\nexport const MAX_UINT_256 =\n '115792089237316195423570985008687907853269984665640564039457584007913129639934'\nexport const FEE_HISTORY_NOT_SUPPORTED =\n 'Returned error: Method eth_feeHistory not supported.'\n","import FixedRateExchangeAbi from '@oceanprotocol/contracts/artifacts/contracts/pools/fixedRate/FixedRateExchange.sol/FixedRateExchange.json'\nimport { sendTx } from '../utils/ContractUtils.js'\nimport {\n PriceAndFees,\n FeesInfo,\n FixedPriceExchange,\n ReceiptOrEstimate,\n AbiItem\n} from '../@types/index.js'\nimport { SmartContractWithAddress } from './SmartContractWithAddress.js'\nimport { ZERO_ADDRESS } from '../utils/Constants.js'\n\nexport class FixedRateExchange extends SmartContractWithAddress {\n getDefaultAbi() {\n return FixedRateExchangeAbi.abi as AbiItem[]\n }\n\n /**\n * Creates unique exchange identifier.\n * @param {String} baseToken baseToken contract address\n * @param {String} datatoken Datatoken contract address\n * @return {Promise<string>} exchangeId\n */\n public async generateExchangeId(baseToken: string, datatoken: string): Promise<string> {\n const exchangeId = await this.contract.generateExchangeId(baseToken, datatoken)\n return exchangeId\n }\n\n /**\n * Atomic swap\n * @param {String} exchangeId ExchangeId\n * @param {String} datatokenAmount Amount of datatokens\n * @param {String} maxBaseTokenAmount max amount of baseToken we want to pay for datatokenAmount\n * @param {String} consumeMarketAddress consumeMarketAddress\n * @param {String} consumeMarketFee consumeMarketFee in fraction\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transaction receipt\n */\n public async buyDatatokens<G extends boolean = false>(\n exchangeId: string,\n datatokenAmount: string,\n maxBaseTokenAmount: string,\n consumeMarketAddress: string = ZERO_ADDRESS,\n consumeMarketFee: string = '0',\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const exchange = await this.getExchange(exchangeId)\n const consumeMarketFeeFormatted = await this.amountToUnits(null, consumeMarketFee, 18)\n const dtAmountFormatted = await this.amountToUnits(\n exchange.datatoken,\n datatokenAmount,\n Number(exchange.dtDecimals)\n )\n const maxBtFormatted = await this.amountToUnits(\n exchange.baseToken,\n maxBaseTokenAmount,\n Number(exchange.btDecimals)\n )\n\n const estGas = await this.contract.buyDT.estimateGas(\n exchangeId,\n dtAmountFormatted,\n maxBtFormatted,\n consumeMarketAddress,\n consumeMarketFeeFormatted\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.buyDT,\n exchangeId,\n dtAmountFormatted,\n maxBtFormatted,\n consumeMarketAddress,\n consumeMarketFeeFormatted\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Sell datatokenAmount while expecting at least minBaseTokenAmount\n * @param {String} exchangeId ExchangeId\n * @param {String} datatokenAmount Amount of datatokens\n * @param {String} minBaseTokenAmount min amount of baseToken we want to receive back\n * @param {String} consumeMarketAddress consumeMarketAddress\n * @param {String} consumeMarketFee consumeMarketFee in fraction\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transaction receipt\n */\n public async sellDatatokens<G extends boolean = false>(\n exchangeId: string,\n datatokenAmount: string,\n minBaseTokenAmount: string,\n consumeMarketAddress: string = ZERO_ADDRESS,\n consumeMarketFee: string = '0',\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const exchange = await this.getExchange(exchangeId)\n const consumeMarketFeeFormatted = await this.amountToUnits(null, consumeMarketFee, 18)\n const dtAmountFormatted = await this.amountToUnits(\n exchange.datatoken,\n datatokenAmount,\n Number(exchange.dtDecimals)\n )\n const minBtFormatted = await this.amountToUnits(\n exchange.baseToken,\n minBaseTokenAmount,\n Number(exchange.btDecimals)\n )\n const estGas = await this.contract.sellDT.estimateGas(\n exchangeId,\n dtAmountFormatted,\n minBtFormatted,\n consumeMarketAddress,\n consumeMarketFeeFormatted\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.sellDT,\n exchangeId,\n dtAmountFormatted,\n minBtFormatted,\n consumeMarketAddress,\n consumeMarketFeeFormatted\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Gets total number of exchanges\n * @return {Promise<Number>} no of available exchanges\n */\n public async getNumberOfExchanges(): Promise<number> {\n const numExchanges = await this.contract.getNumberOfExchanges()\n return Number(numExchanges)\n }\n\n /**\n * Set new rate\n * @param {String} exchangeId Exchange ID\n * @param {String} newRate New rate\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transaction receipt\n */\n public async setRate<G extends boolean = false>(\n exchangeId: string,\n newRate: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const estGas = await this.contract.setRate.estimateGas(\n exchangeId,\n await this.amountToUnits(null, newRate, 18)\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.setRate,\n exchangeId,\n await this.amountToUnits(null, newRate, 18)\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Sets a new allowedSwapper\n * @param {String} exchangeId Exchange ID\n * @param {String} newAllowedSwapper The address of the new allowed swapper (set address zero if we want to remove allowed swapper)\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transaction receipt\n */\n public async setAllowedSwapper<G extends boolean = false>(\n exchangeId: string,\n newAllowedSwapper: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const estGas = await this.contract.setAllowedSwapper.estimateGas(\n exchangeId,\n newAllowedSwapper\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.setAllowedSwapper,\n exchangeId,\n newAllowedSwapper\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Activate an exchange\n * @param {String} exchangeId ExchangeId\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transaction receipt\n */\n public async activate<G extends boolean = false>(\n exchangeId: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const exchange = await this.getExchange(exchangeId)\n if (!exchange) return null\n if (exchange.active === true) return null\n const estGas = await this.contract.toggleExchangeState.estimateGas(exchangeId)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.toggleExchangeState,\n exchangeId\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Deactivate an exchange\n * @param {String} exchangeId ExchangeId\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transaction receipt\n */\n public async deactivate<G extends boolean = false>(\n exchangeId: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const exchange = await this.getExchange(exchangeId)\n if (!exchange) return null\n if (exchange.active === false) return null\n\n const estGas = await this.contract.toggleExchangeState.estimateGas(exchangeId)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.toggleExchangeState,\n exchangeId\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Get Exchange Rate\n * @param {String} exchangeId Exchange ID\n * @return {Promise<string>} Rate (converted from wei)\n */\n public async getRate(exchangeId: string): Promise<string> {\n const weiRate = await this.contract.getRate(exchangeId)\n return await this.unitsToAmount(null, weiRate, 18)\n }\n\n /**\n * Get Datatoken Supply in the exchange\n * @param {String} exchangeId Exchange Id\n * @return {Promise<string>} dt supply formatted\n */\n public async getDatatokenSupply(exchangeId: string): Promise<string> {\n const dtSupply = await this.contract.getDTSupply(exchangeId)\n const exchange = await this.getExchange(exchangeId)\n return await this.unitsToAmount(\n exchange.datatoken,\n dtSupply,\n Number(exchange.dtDecimals)\n )\n }\n\n /**\n * Returns basetoken supply in the exchange\n * @param {String} exchangeId Exchange Id\n * @return {Promise<string>} dt supply formatted\n */\n public async getBasetokenSupply(exchangeId: string): Promise<string> {\n const btSupply = await this.contract.getBTSupply(exchangeId)\n const exchange = await this.getExchange(exchangeId)\n return await this.unitsToAmount(\n exchange.baseToken,\n btSupply,\n Number(exchange.btDecimals)\n )\n }\n\n /**\n * Get Allower Swapper (if set this is the only account which can use this exchange, else is set at address(0))\n * @param {String} exchangeId Exchange Id\n * @return {Promise<string>} address of allowed swapper\n */\n public async getAllowedSwapper(exchangeId: string): Promise<string> {\n return await this.contract.getAllowedSwapper(exchangeId)\n }\n\n /**\n * calcBaseInGivenDatatokensOut - Calculates how many base tokens are needed to get specified amount of datatokens\n * @param {String} exchangeId Exchange Id\n * @param {string} datatokenAmount Amount of datatokens user wants to buy\n * @param {String} consumeMarketFee consumeMarketFee in fraction\n * @return {Promise<PriceAndFees>} how many base tokens are needed and fees\n */\n public async calcBaseInGivenDatatokensOut(\n exchangeId: string,\n datatokenAmount: string,\n consumeMarketFee: string = '0'\n ): Promise<PriceAndFees> {\n const fixedRateExchange = await this.getExchange(exchangeId)\n const outDT = await this.contract.calcBaseInGivenOutDT(\n exchangeId,\n await this.amountToUnits(\n fixedRateExchange.datatoken,\n datatokenAmount,\n Number(fixedRateExchange.dtDecimals)\n ),\n await this.amountToUnits(null, consumeMarketFee, 18)\n )\n const priceAndFees = {\n baseTokenAmount: await this.unitsToAmount(\n fixedRateExchange.baseToken,\n outDT.baseTokenAmount,\n Number(fixedRateExchange.btDecimals)\n ),\n marketFeeAmount: await this.unitsToAmount(\n fixedRateExchange.baseToken,\n outDT.publishMarketFeeAmount,\n Number(fixedRateExchange.btDecimals)\n ),\n oceanFeeAmount: await this.unitsToAmount(\n fixedRateExchange.baseToken,\n outDT.oceanFeeAmount,\n Number(fixedRateExchange.btDecimals)\n ),\n consumeMarketFeeAmount: await this.unitsToAmount(\n fixedRateExchange.baseToken,\n outDT.consumeMarketFeeAmount,\n Number(fixedRateExchange.btDecimals)\n )\n } as PriceAndFees\n return priceAndFees\n }\n\n /**\n * Returns amount in baseToken that user will receive for datatokenAmount sold\n * @param {String} exchangeId Exchange Id\n * @param {Number} datatokenAmount Amount of datatokens\n * @param {String} consumeMarketFee consumeMarketFee in fraction\n * @return {Promise<string>} Amount of baseTokens user will receive\n */\n public async getAmountBasetokensOut(\n exchangeId: string,\n datatokenAmount: string,\n consumeMarketFee: string = '0'\n ): Promise<string> {\n const exchange = await this.getExchange(exchangeId)\n const amount = await this.contract.calcBaseOutGivenInDT(\n exchangeId,\n await this.amountToUnits(\n exchange.datatoken,\n datatokenAmount,\n Number(exchange.dtDecimals)\n ),\n await this.amountToUnits(null, consumeMarketFee, 18)\n )\n\n return await this.unitsToAmount(\n exchange.baseToken,\n amount[0],\n Number(exchange.btDecimals)\n )\n }\n\n /**\n * Get exchange details\n * @param {String} exchangeId Exchange Id\n * @return {Promise<FixedPricedExchange>} Exchange details\n */\n public async getExchange(exchangeId: string): Promise<FixedPriceExchange> {\n const result: FixedPriceExchange = await this.contract.getExchange(exchangeId)\n const exchange: FixedPriceExchange = {\n active: result.active,\n datatoken: result.datatoken,\n baseToken: result.baseToken,\n withMint: result.withMint,\n exchangeOwner: result.exchangeOwner,\n allowedSwapper: result.allowedSwapper,\n dtDecimals: result.dtDecimals.toString(),\n btDecimals: result.btDecimals.toString(),\n dtBalance: await this.unitsToAmount(\n result.datatoken,\n result.dtBalance,\n Number(result.dtDecimals)\n ),\n btBalance: await this.unitsToAmount(\n result.baseToken,\n result.btBalance,\n Number(result.btDecimals)\n ),\n dtSupply: await this.unitsToAmount(\n result.datatoken,\n result.dtSupply,\n Number(result.dtDecimals)\n ),\n btSupply: await this.unitsToAmount(\n result.baseToken,\n result.btSupply,\n Number(result.btDecimals)\n ),\n fixedRate: await this.unitsToAmount(null, result.fixedRate, 18),\n exchangeId\n }\n return exchange\n }\n\n /**\n * Get fee details for an exchange\n * @param {String} exchangeId Exchange Id\n * @return {Promise<FeesInfo>} Exchange details\n */\n public async getFeesInfo(exchangeId: string): Promise<FeesInfo> {\n const result: FeesInfo = await this.contract.getFeesInfo(exchangeId)\n const exchange = await this.getExchange(exchangeId)\n const feesInfo: FeesInfo = {\n opcFee: await this.unitsToAmount(null, result.opcFee.toString(), 18),\n marketFee: await this.unitsToAmount(null, result.marketFee.toString(), 18),\n marketFeeCollector: result.marketFeeCollector,\n marketFeeAvailable: await this.unitsToAmount(\n exchange.baseToken,\n result.marketFeeAvailable,\n Number(exchange.btDecimals)\n ),\n oceanFeeAvailable: await this.unitsToAmount(\n exchange.baseToken,\n result.oceanFeeAvailable,\n Number(exchange.btDecimals)\n ),\n\n exchangeId\n }\n return feesInfo\n }\n\n /**\n * Returns all exchanges\n * @param {String} exchangeId Exchang eId\n * @return {Promise<String[]>} Exchanges list\n */\n public async getExchanges(): Promise<string[]> {\n return await this.contract.getExchanges()\n }\n\n /**\n * Check if an exchange is active\n * @param {String} exchangeId ExchangeId\n * @return {Promise<Boolean>}\n */\n public async isActive(exchangeId: string): Promise<boolean> {\n const active = await this.contract.isActive(exchangeId)\n return active\n }\n\n /**\n * Activate minting option for fixed rate contract\n * @param {String} exchangeId Exchang eId\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transaction receipt\n */\n public async activateMint<G extends boolean = false>(\n exchangeId: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const exchange = await this.getExchange(exchangeId)\n if (!exchange) return null\n if (exchange.withMint === true) return null\n\n const estGas = await this.contract.toggleMintState.estimateGas(exchangeId, true)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.toggleMintState,\n exchangeId,\n true\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Deactivate minting for fixed rate\n * @param {String} exchangeId ExchangeId\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transaction receipt\n */\n public async deactivateMint<G extends boolean = false>(\n exchangeId: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const exchange = await this.getExchange(exchangeId)\n if (!exchange) return null\n if (exchange.withMint === false) return null\n\n const estGas = await this.contract.toggleMintState.estimateGas(exchangeId, false)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.toggleMintState,\n exchangeId,\n false\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Collect BaseTokens in the contract (anyone can call this, funds are sent to Datatoken.paymentCollector)\n * @param {String} exchangeId Exchange Id\n * @param {String} amount amount to be collected\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transaction receipt\n */\n public async collectBasetokens<G extends boolean = false>(\n exchangeId: string,\n amount: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const exchange = await this.getExchange(exchangeId)\n if (!exchange) return null\n\n const fixedrate: FixedPriceExchange = await this.contract.getExchange(exchangeId)\n const amountWei = await this.amountToUnits(\n fixedrate.baseToken,\n amount,\n Number(fixedrate.btDecimals)\n )\n\n const estGas = await this.contract.collectBT.estimateGas(exchangeId, amountWei)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.collectBT,\n exchangeId,\n amountWei\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Collect datatokens in the contract (anyone can call this, funds are sent to Datatoken.paymentCollector)\n * @param {String} exchangeId Exchange Id\n * @param {String} amount amount to be collected\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transaction receipt\n */\n public async collectDatatokens<G extends boolean = false>(\n exchangeId: string,\n amount: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const exchange = await this.getExchange(exchangeId)\n if (!exchange) return null\n\n const fixedrate: FixedPriceExchange = await this.contract.getExchange(exchangeId)\n const amountWei = await this.amountToUnits(\n fixedrate.datatoken,\n amount,\n Number(fixedrate.dtDecimals)\n )\n\n const estGas = await this.contract.collectDT.estimateGas(exchangeId, amountWei)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.collectDT,\n exchangeId,\n amountWei\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Collect market fee and send it to marketFeeCollector (anyone can call it)\n * @param {String} exchangeId Exchange Id\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transaction receipt\n */\n public async collectMarketFee<G extends boolean = false>(\n exchangeId: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const exchange = await this.getExchange(exchangeId)\n if (!exchange) return null\n\n const estGas = await this.contract.collectMarketFee.estimateGas(exchangeId)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.collectMarketFee,\n exchangeId\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Collect ocean fee and send it to OPF collector (anyone can call it)\n * @param {String} exchangeId Exchange Id\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transaction receipt\n */\n public async collectOceanFee<G extends boolean = false>(\n exchangeId: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const exchange = await this.getExchange(exchangeId)\n if (!exchange) return null\n\n const estGas = await this.contract.collectOceanFee.estimateGas(exchangeId)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.collectOceanFee,\n exchangeId\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Get OPF Collector of fixed rate contract\n * @return {String}\n */\n async getOPCCollector(): Promise<string> {\n const address = await this.contract.opcCollector()\n return address\n }\n\n /**\n * Get Router address set in fixed rate contract\n * @return {String}\n */\n public async getRouter(): Promise<string> {\n const address = await this.contract.router()\n return address\n }\n\n /**\n * Get Exchange Owner given an exchangeId\n * @param {String} exchangeId Exchange Id\n * @return {String} return exchange owner\n */\n async getExchangeOwner(exchangeId: string): Promise<string> {\n const address = await (await this.getExchange(exchangeId)).exchangeOwner\n return address\n }\n\n /**\n * Set new market fee, only market fee collector can update it\n * @param {String} exchangeId Exchange Id\n * @param {String} newMarketFee New market fee\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transaction receipt\n */\n public async updateMarketFee<G extends boolean = false>(\n exchangeId: string,\n newMarketFee: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const estGas = await this.contract.updateMarketFee.estimateGas(\n exchangeId,\n await this.amountToUnits(null, newMarketFee, 18)\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.updateMarketFee,\n exchangeId,\n await this.amountToUnits(null, newMarketFee, 18)\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Set new market fee collector, only market fee collector can update it\n * @param {String} exchangeId Exchange Id\n * @param {String} newMarketFeeCollector New market fee collector\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transaction receipt\n */\n public async updateMarketFeeCollector<G extends boolean = false>(\n exchangeId: string,\n newMarketFeeCollector: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const estGas = await this.contract.updateMarketFeeCollector.estimateGas(\n exchangeId,\n newMarketFeeCollector\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.updateMarketFeeCollector,\n exchangeId,\n newMarketFeeCollector\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n}\n","import FactoryRouter from '@oceanprotocol/contracts/artifacts/contracts/pools/FactoryRouter.sol/FactoryRouter.json'\nimport { sendTx } from '../utils/ContractUtils.js'\nimport { Operation, ReceiptOrEstimate, AbiItem } from '../@types/index.js'\nimport { SmartContractWithAddress } from './SmartContractWithAddress.js'\n\n/**\n * Provides an interface for FactoryRouter contract\n */\nexport class Router extends SmartContractWithAddress {\n getDefaultAbi() {\n return FactoryRouter.abi as AbiItem[]\n }\n\n /**\n * * Buys a batch of datatokens.\n * one single call to buy multiple DT for multiple assets.\n * require tokenIn approvals for router from user. (except for dispenser operations)\n * @param {Operation[]} operations - The operations to execute.\n * @param {boolean} [estimateGas=false] - Whether to return only the estimate gas or not.\n * @return {Promise<ReceiptOrEstimate>} Transaction receipt\n */\n public async buyDatatokenBatch<G extends boolean = false>(\n operations: Operation[],\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const estGas = await this.contract.buyDTBatch.estimateGas(operations)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.buyDTBatch,\n operations\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Checks if a token is on approved tokens list,\n * if true opfFee is lower in pools with that token/DT\n * @param {string} address - The address of the token to check.\n * @return {Promise<boolean>} true if is on the list.\n */\n public async isApprovedToken(address: string): Promise<boolean> {\n return await this.contract.isApprovedToken(address)\n }\n\n /**\n * Check if an address is a Fixed Rate contract.\n * @param {string} address - The address of the fixed rate exchange to check.\n * @return {Promise<boolean>} true if is a Fixed Rate contract\n */\n public async isFixedPrice(address: string): Promise<boolean> {\n return await this.contract.isFixedRateContract(address)\n }\n\n /**\n * Get Router Owner\n * @return {Promise<string>} Router Owner address\n */\n public async getOwner(): Promise<string> {\n return await this.contract.routerOwner()\n }\n\n /**\n * Get NFT Factory address\n * @return {Promise<string>} NFT Factory address\n */\n public async getNFTFactory(): Promise<string> {\n return await this.contract.factory()\n }\n\n /**\n * Adds a token to the list of tokens with reduced fees\n * @param {String} address caller address\n * @param {String} tokenAddress token address to add\n * @param {Boolean} [estimateGas] if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async addApprovedToken<G extends boolean = false>(\n address: string,\n tokenAddress: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n if ((await this.getOwner()) !== address) {\n throw new Error(`Caller is not Router Owner`)\n }\n\n const estGas = await this.contract.addApprovedToken.estimateGas(tokenAddress)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.addApprovedToken,\n tokenAddress\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Removes a token if exists from the list of tokens with reduced fees\n * @param {String} address caller address\n * @param {String} tokenAddress token address to remove\n * @param {Boolean} [estimateGas] if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async removeApprovedToken<G extends boolean = false>(\n address: string,\n tokenAddress: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n if ((await this.getOwner()) !== address) {\n throw new Error(`Caller is not Router Owner`)\n }\n\n const estGas = await this.contract.removeApprovedToken.estimateGas(tokenAddress)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.removeApprovedToken,\n tokenAddress\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Adds an address to the list of fixed rate contracts\n * @param {String} address caller address\n * @param {String} tokenAddress contract address to add\n * @param {Boolean} [estimateGas] if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async addFixedRateContract<G extends boolean = false>(\n address: string,\n tokenAddress: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n if ((await this.getOwner()) !== address) {\n throw new Error(`Caller is not Router Owner`)\n }\n\n const estGas = await this.contract.addFixedRateContract.estimateGas(tokenAddress)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.addFixedRateContract,\n tokenAddress\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Removes an address from the list of fixed rate contracts\n * @param {String} address caller address\n * @param {String} tokenAddress contract address to add\n * @param {Boolean} [estimateGas] if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async removeFixedRateContract<G extends boolean = false>(\n address: string,\n tokenAddress: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n if ((await this.getOwner()) !== address) {\n throw new Error(`Caller is not Router Owner`)\n }\n\n const estGas = await this.contract.removeFixedRateContract.estimateGas(tokenAddress)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.removeFixedRateContract,\n tokenAddress\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Adds an address to the list of dispensers\n * @param {String} address caller address\n * @param {String} tokenAddress contract address to add\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async addDispenserContract<G extends boolean = false>(\n address: string,\n tokenAddress: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n if ((await this.getOwner()) !== address) {\n throw new Error(`Caller is not Router Owner`)\n }\n\n const estGas = await this.contract.addDispenserContract.estimateGas(tokenAddress)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.addDispenserContract,\n tokenAddress\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Removes an address from the list of dispensers\n * @param {String} address caller address\n * @param {String} tokenAddress address Contract to be removed\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async removeDispenserContract<G extends boolean = false>(\n address: string,\n tokenAddress: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n if ((await this.getOwner()) !== address) {\n throw new Error(`Caller is not Router Owner`)\n }\n\n const estGas = await this.contract.removeDispenserContract.estimateGas(tokenAddress)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.removeDispenserContract,\n tokenAddress\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /** Get OPF Fee per token\n * @return {Promise<number>} OPC fee for a specific baseToken\n */\n public async getOPCFee(baseToken: string): Promise<number> {\n const fee = await this.contract.getOPCFee(baseToken)\n return Number(fee)\n }\n\n /** Get Current OPF Fee\n * @return {Promise<number>} OPF fee\n */\n public async getCurrentOPCFee(): Promise<number> {\n const fee = await this.contract.swapOceanFee()\n return Number(fee)\n }\n\n /**\n * Updates OP Community Fees\n * @param {String} address caller address\n * @param {number} newSwapOceanFee Amount charged for swapping with ocean approved tokens\n * @param {number} newSwapNonOceanFee Amount charged for swapping with non ocean approved tokens\n * @param {number} newConsumeFee Amount charged from consumeFees\n * @param {number} newProviderFee Amount charged for providerFees\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async updateOPCFee<G extends boolean = false>(\n address: string,\n newSwapOceanFee: number,\n newSwapNonOceanFee: number,\n newConsumeFee: number,\n newProviderFee: number,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n if ((await this.getOwner()) !== address) {\n throw new Error(`Caller is not Router Owner`)\n }\n\n const estGas = await this.contract.updateOPCFee.estimateGas(\n newSwapOceanFee,\n newSwapNonOceanFee,\n newConsumeFee,\n newProviderFee\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.updateOPCFee,\n newSwapOceanFee,\n newSwapNonOceanFee,\n newConsumeFee,\n newProviderFee\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n}\n","import wordListDefault from './data/words.json'\n\n/**\n * This function generates a datatoken name and symbol from a given word list.\n * @param {Object} [wordList] - An object containing an array of nouns and adjectives.\n * @param {string[]} [wordList.nouns] - An array of nouns.\n * @param {string[]} [wordList.adjectives] - An array of adjectives.\n * @returns {Object} Returns an object containing the generated name and symbol. Produces e.g. \"Endemic Jellyfish Token\" & \"ENDJEL-45\"\n */\nexport function generateDtName(wordList?: { nouns: string[]; adjectives: string[] }): {\n name: string\n symbol: string\n} {\n const list = wordList || wordListDefault\n const random1 = Math.floor(Math.random() * list.adjectives.length)\n const random2 = Math.floor(Math.random() * list.nouns.length)\n const indexNumber = Math.floor(Math.random() * 100)\n\n // Capitalized adjective & noun\n const adjective = list.adjectives[random1].replace(/^\\w/, (c) => c.toUpperCase())\n const noun = list.nouns[random2].replace(/^\\w/, (c) => c.toUpperCase())\n\n const name = `${adjective} ${noun} Token`\n // use first 3 letters of name, uppercase it, and add random number\n const symbol = `${(\n adjective.substring(0, 3) + noun.substring(0, 3)\n ).toUpperCase()}-${indexNumber}`\n\n return { name, symbol }\n}\n","import { toUtf8Bytes } from 'ethers'\nimport ERC721Factory from '@oceanprotocol/contracts/artifacts/contracts/ERC721Factory.sol/ERC721Factory.json'\nimport {\n AbiItem,\n FreCreationParams,\n DatatokenCreateParams,\n DispenserCreationParams,\n NftCreateData,\n Template,\n TokenOrder,\n ReceiptOrEstimate\n} from '../@types/index.js'\nimport { SmartContractWithAddress } from './SmartContractWithAddress.js'\nimport { generateDtName } from '../utils/DatatokenName.js'\nimport { ZERO_ADDRESS } from '../utils/Constants.js'\nimport { getEventFromTx, getTokenDecimals, sendTx } from '../utils/ContractUtils.js'\nimport { LoggerInstance } from '../utils/Logger.js'\n\n/**\n * Provides an interface for NFT Factory contract\n */\nexport class NftFactory extends SmartContractWithAddress {\n getDefaultAbi() {\n return ERC721Factory.abi as AbiItem[]\n }\n\n /**\n * Create new data NFT\n * @param {NFTCreateData} nftData The data needed to create an NFT.\n * @param {Boolean} [estimateGas] if True, return gas estimate\n * @return {Promise<string|BigNumber>} The transaction hash or the gas estimate.\n */\n public async createNFT<G extends boolean = false>(\n nftData: NftCreateData,\n estimateGas?: G\n ): Promise<G extends false ? string : bigint> {\n if (!nftData.templateIndex) nftData.templateIndex = 1\n\n if (!nftData.name || !nftData.symbol) {\n const { name, symbol } = generateDtName()\n nftData.name = name\n nftData.symbol = symbol\n }\n if (nftData.templateIndex > (await this.getCurrentNFTTemplateCount())) {\n throw new Error(`Template index doesnt exist`)\n }\n\n if (nftData.templateIndex === 0) {\n throw new Error(`Template index cannot be ZERO`)\n }\n if ((await this.getNFTTemplate(nftData.templateIndex)).isActive === false) {\n throw new Error(`Template is not active`)\n }\n\n const estGas = await this.contract.deployERC721Contract.estimateGas(\n nftData.name,\n nftData.symbol,\n nftData.templateIndex,\n ZERO_ADDRESS,\n ZERO_ADDRESS,\n nftData.tokenURI,\n nftData.transferable,\n nftData.owner\n )\n if (estimateGas) return <G extends false ? string : bigint>estGas\n // Invoke createToken function of the contract\n try {\n const tx = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.deployERC721Contract,\n nftData.name,\n nftData.symbol,\n nftData.templateIndex,\n ZERO_ADDRESS,\n ZERO_ADDRESS,\n nftData.tokenURI,\n nftData.transferable,\n nftData.owner\n )\n if (!tx) {\n const e =\n 'Tx for deploying new NFT contract does not exist or status is not successful.'\n console.error(e)\n throw e\n }\n const trxReceipt = await tx.wait()\n const events = getEventFromTx(trxReceipt, 'NFTCreated')\n return events.args[0]\n } catch (e) {\n console.error(`Creation of NFT failed: ${e}`)\n }\n }\n\n /**\n * Get Current NFT Count (NFT created)\n * @return {Promise<number>} Number of NFT created from this factory\n */\n public async getCurrentNFTCount(): Promise<number> {\n const nftCount = await this.contract.getCurrentNFTCount()\n return Number(nftCount)\n }\n\n /**\n * Get Current Datatoken Count\n * @return {Promise<number>} Number of DTs created from this factory\n */\n public async getCurrentTokenCount(): Promise<number> {\n const tokenCount = await this.contract.getCurrentTokenCount()\n return Number(tokenCount)\n }\n\n /**\n * Get Factory Owner\n * @return {Promise<string>} Factory Owner address\n */\n public async getOwner(): Promise<string> {\n const owner = await this.contract.owner()\n return owner\n }\n\n /**\n * Get Current NFT Template Count\n * @return {Promise<number>} Number of NFT Template added to this factory\n */\n public async getCurrentNFTTemplateCount(): Promise<number> {\n const count = await this.contract.getCurrentNFTTemplateCount()\n return Number(count)\n }\n\n /**\n * Get Current Template Datatoken (ERC20) Count\n * @return {Promise<number>} Number of Datatoken Template added to this factory\n */\n public async getCurrentTokenTemplateCount(): Promise<number> {\n const count = await this.contract.getCurrentTemplateCount()\n return Number(count)\n }\n\n /**\n * Get NFT Template\n * @param {number} index Template index\n * @return {Promise<Template>} Number of Template added to this factory\n */\n public async getNFTTemplate(index: number): Promise<Template> {\n if (index > (await this.getCurrentNFTTemplateCount())) {\n throw new Error(`Template index doesnt exist`)\n }\n\n if (index === 0) {\n throw new Error(`Template index cannot be ZERO`)\n }\n const template = await this.contract.getNFTTemplate(index)\n return template\n }\n\n /**\n * Get Datatoken (ERC20) Template\n * @param {number} index Template index\n * @return {Promise<Template>} DT Template info\n */\n public async getTokenTemplate(index: number): Promise<Template> {\n const template = await this.contract.getTokenTemplate(index)\n return template\n }\n\n /**\n * Check if Datatoken is deployed from the factory\n * @param {String} datatoken Datatoken address to check\n * @return {Promise<Boolean>} return true if deployed from this factory\n */\n public async checkDatatoken(datatoken: string): Promise<Boolean> {\n const isDeployed = await this.contract.erc20List(datatoken)\n return isDeployed\n }\n\n /**\n * Check if NFT is deployed from the factory\n * @param {String} nftAddress nftAddress address to check\n * @return {Promise<String>} return address(0) if it's not, or the nftAddress if true\n */\n public async checkNFT(nftAddress: string): Promise<String> {\n const confirmAddress = await this.contract.erc721List(nftAddress)\n return confirmAddress\n }\n\n /**\n * Add a new NFT token template - only factory Owner\n * @param {String} address caller address\n * @param {String} templateAddress template address to add\n * @param {Boolean} [estimateGas] if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async addNFTTemplate<G extends boolean = false>(\n address: string,\n templateAddress: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n if ((await this.getOwner()) !== address) {\n throw new Error(`Caller is not Factory Owner`)\n }\n if (templateAddress === ZERO_ADDRESS) {\n throw new Error(`Template cannot be ZERO address`)\n }\n\n const estGas = await this.contract.add721TokenTemplate.estimateGas(templateAddress)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.add721TokenTemplate,\n templateAddress\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Disable token template - only factory Owner\n * @param {String} address\n * @param {Number} templateIndex index of the template we want to disable\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} current token template count\n */\n public async disableNFTTemplate<G extends boolean = false>(\n address: string,\n templateIndex: number,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n if ((await this.getOwner()) !== address) {\n throw new Error(`Caller is not Factory Owner`)\n }\n if (templateIndex > (await this.getCurrentNFTTemplateCount())) {\n throw new Error(`Template index doesnt exist`)\n }\n\n if (templateIndex === 0) {\n throw new Error(`Template index cannot be ZERO`)\n }\n\n const estGas = await this.contract.disable721TokenTemplate.estimateGas(templateIndex)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.disable721TokenTemplate,\n templateIndex\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Reactivate a previously disabled token template - only factory Owner\n * @param {String} address\n * @param {Number} templateIndex index of the template we want to reactivate\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} current token template count\n */\n public async reactivateNFTTemplate<G extends boolean = false>(\n address: string,\n templateIndex: number,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n if ((await this.getOwner()) !== address) {\n throw new Error(`Caller is not Factory Owner`)\n }\n if (templateIndex > (await this.getCurrentNFTTemplateCount())) {\n throw new Error(`Template index doesnt exist`)\n }\n\n if (templateIndex === 0) {\n throw new Error(`Template index cannot be ZERO`)\n }\n\n const estGas = await this.contract.reactivate721TokenTemplate.estimateGas(\n templateIndex\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.reactivate721TokenTemplate,\n templateIndex\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Add a new NFT token template - only factory Owner\n * @param {String} address caller address\n * @param {String} templateAddress template address to add\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async addTokenTemplate<G extends boolean = false>(\n address: string,\n templateAddress: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n if ((await this.getOwner()) !== address) {\n throw new Error(`Caller is not Factory Owner`)\n }\n if (templateAddress === ZERO_ADDRESS) {\n throw new Error(`Template cannot be address ZERO`)\n }\n\n const estGas = await this.contract.addTokenTemplate.estimateGas(templateAddress)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.addTokenTemplate,\n templateAddress\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Disable token template - only factory Owner\n * @param {String} address caller address\n * @param {Number} templateIndex index of the template we want to disable\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} current token template count\n */\n public async disableTokenTemplate<G extends boolean = false>(\n address: string,\n templateIndex: number,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n if ((await this.getOwner()) !== address) {\n throw new Error(`Caller is not Factory Owner`)\n }\n if (templateIndex > (await this.getCurrentTokenTemplateCount())) {\n throw new Error(`Template index doesnt exist`)\n }\n\n if (templateIndex === 0) {\n throw new Error(`Template index cannot be ZERO`)\n }\n if ((await this.getTokenTemplate(templateIndex)).isActive === false) {\n throw new Error(`Template is already disabled`)\n }\n\n const estGas = await this.contract.disableTokenTemplate.estimateGas(templateIndex)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.disableTokenTemplate,\n templateIndex\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Reactivate a previously disabled token template - only factory Owner\n * @param {String} address caller address\n * @param {Number} templateIndex index of the template we want to reactivate\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} current token template count\n */\n public async reactivateTokenTemplate<G extends boolean = false>(\n address: string,\n templateIndex: number,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n if ((await this.getOwner()) !== address) {\n throw new Error(`Caller is not Factory Owner`)\n }\n if (templateIndex > (await this.getCurrentTokenTemplateCount())) {\n throw new Error(`Template index doesnt exist`)\n }\n\n if (templateIndex === 0) {\n throw new Error(`Template index cannot be ZERO`)\n }\n if ((await this.getTokenTemplate(templateIndex)).isActive === true) {\n throw new Error(`Template is already active`)\n }\n\n const estGas = await this.contract.reactivateTokenTemplate.estimateGas(templateIndex)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.reactivateTokenTemplate,\n templateIndex\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Used as a proxy to order multiple services\n * Users can have inifinite approvals for fees for factory instead of having one approval/ Datatoken contract\n * Requires previous approval of all :\n * - consumeFeeTokens\n * - publishMarketFeeTokens\n * - ERC20 Datatokens\n * @param {TokenOrder[]} orders array of orders\n * @param {Boolean} [estimateGas] if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transaction receipt\n */\n public async startMultipleTokenOrder<G extends boolean = false>(\n orders: TokenOrder[],\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n if (orders.length > 50) {\n throw new Error(`Too many orders`)\n }\n\n const estGas = await this.contract.startMultipleTokenOrder.estimateGas(orders)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.startMultipleTokenOrder,\n orders\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Creates a new NFT, then a datatoken,all in one call\n * @param {NftCreateData} nftCreateData - The data required to create an NFT.\n * @param {DatatokenCreateParams} dtParams - The parameters required to create a datatoken.\n * @param {boolean} [estimateGas] - Whether to return only estimate gas or not.\n * @return {Promise<ReceiptOrEstimate>} transaction receipt\n */\n\n public async createNftWithDatatoken<G extends boolean = false>(\n nftCreateData: NftCreateData,\n dtParams: DatatokenCreateParams,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const ercCreateData = await this.getErcCreationParams(dtParams)\n\n const estGas = await this.contract.createNftWithErc20.estimateGas(\n nftCreateData,\n ercCreateData\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.createNftWithErc20,\n nftCreateData,\n ercCreateData\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Creates an NFT with a datatoken with a fixed rate all in one call.\n * be aware if Fixed Rate creation fails, you are still going to pay a lot of gas\n * @param {NftCreateData} nftCreateData - The data required to create an NFT.\n * @param {DatatokenCreateParams} dtParams - The parameters required to create a datatoken.\n * @param {FreCreationParams} freParams - The parameters required to create a fixed-rate exchange contract.\n * @param {boolean} [estimateGas] - Whether to return only estimate gas or not.\n * @returns {Promis<ReceiptOrEstimate<G>>}\n */\n public async createNftWithDatatokenWithFixedRate<G extends boolean = false>(\n nftCreateData: NftCreateData,\n dtParams: DatatokenCreateParams,\n freParams: FreCreationParams,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const ercCreateData = await this.getErcCreationParams(dtParams)\n const fixedData = await this.getFreCreationParams(freParams)\n\n const estGas = await this.contract.createNftWithErc20WithFixedRate.estimateGas(\n nftCreateData,\n ercCreateData,\n fixedData\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.createNftWithErc20WithFixedRate,\n nftCreateData,\n ercCreateData,\n fixedData\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Creates an NFT with a datatoken with a dispenser in one call.\n * Be aware if Fixed Rate creation fails, you are still going to pay a lot of gas\n * @param {NftCreateData} nftCreateData - The data required to create an NFT.\n * @param {DatatokenCreateParams} dtParams - The parameters required to create a datatoken.\n * @param {DispenserCreationParams} dispenserParams - The parameters required to create a dispenser contract.\n * @param {boolean} [estimateGas] - Whether to estimate gas or not.\n * @returns {Promis<ReceiptOrEstimate<G>>}\n */\n public async createNftWithDatatokenWithDispenser<G extends boolean = false>(\n nftCreateData: NftCreateData,\n dtParams: DatatokenCreateParams,\n dispenserParams: DispenserCreationParams,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const ercCreateData = await this.getErcCreationParams(dtParams)\n\n dispenserParams.maxBalance = await this.amountToUnits(\n null,\n dispenserParams.maxBalance,\n 18\n )\n\n dispenserParams.maxTokens = await this.amountToUnits(\n null,\n dispenserParams.maxTokens,\n 18\n )\n\n const estGas = await this.contract.createNftWithErc20WithDispenser.estimateGas(\n nftCreateData,\n ercCreateData,\n dispenserParams\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.createNftWithErc20WithDispenser,\n nftCreateData,\n ercCreateData,\n dispenserParams\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Gets the parameters required to create an ERC20 token.\n * @param {DatatokenCreateParams} dtParams - The parameters required to create a datatoken.\n * @returns {Promise<any>}\n */\n private async getErcCreationParams(dtParams: DatatokenCreateParams): Promise<any> {\n let name: string, symbol: string\n // Generate name & symbol if not present\n if (!dtParams.name || !dtParams.symbol) {\n ;({ name, symbol } = generateDtName())\n }\n\n let feeTokenDecimals = 18\n if (dtParams.feeToken !== ZERO_ADDRESS) {\n try {\n feeTokenDecimals = await getTokenDecimals(this.signer, dtParams.feeToken)\n } catch (error) {\n LoggerInstance.error('getTokenDecimals error', error)\n }\n }\n\n // common stuff for other templates\n const addresses = [\n dtParams.minter,\n dtParams.paymentCollector,\n dtParams.mpFeeAddress,\n dtParams.feeToken\n ]\n\n if (dtParams.filesObject) {\n // template 4 only, ignored for others\n if (dtParams.accessListFactory) {\n addresses.push(dtParams.accessListFactory)\n }\n if (dtParams.allowAccessList) {\n addresses.push(dtParams.allowAccessList)\n }\n\n if (dtParams.denyAccessList) {\n addresses.push(dtParams.denyAccessList)\n }\n }\n\n return {\n templateIndex: dtParams.templateIndex,\n strings: [dtParams.name || name, dtParams.symbol || symbol],\n addresses,\n uints: [\n await this.amountToUnits(null, dtParams.cap, 18),\n await this.amountToUnits(null, dtParams.feeAmount, feeTokenDecimals)\n ],\n bytess: dtParams.filesObject\n ? [toUtf8Bytes(JSON.stringify(dtParams.filesObject))]\n : []\n }\n }\n\n /**\n * Gets the parameters required to create a fixed-rate exchange contract.\n * @param {FreCreationParams} freParams - The parameters required to create a fixed-rate exchange contract.\n * @returns {Promise<any> }\n */\n private async getFreCreationParams(freParams: FreCreationParams): Promise<any> {\n if (!freParams.allowedConsumer) freParams.allowedConsumer = ZERO_ADDRESS\n const withMint = freParams.withMint === false ? 0 : 1\n\n return {\n fixedPriceAddress: freParams.fixedRateAddress,\n addresses: [\n freParams.baseTokenAddress,\n freParams.owner,\n freParams.marketFeeCollector,\n freParams.allowedConsumer\n ],\n uints: [\n freParams.baseTokenDecimals,\n freParams.datatokenDecimals,\n await this.amountToUnits(null, freParams.fixedRate, 18),\n await this.amountToUnits(null, freParams.marketFee, 18),\n withMint\n ]\n }\n }\n}\n","import { ethers, Signer } from 'ethers'\nimport { NftFactory } from '../contracts/NFTFactory.js'\nimport fs from 'fs'\n// eslint-disable-next-line import/no-named-default\nimport ERC20Template from '@oceanprotocol/contracts/artifacts/contracts/interfaces/IERC20Template.sol/IERC20Template.json'\n// eslint-disable-next-line import/no-named-default, prettier/prettier\nimport { default as Addresses } from '@oceanprotocol/contracts/addresses/address.json'\n/**\n * Get the artifacts address from the address.json file\n * either from the env or from the ocean-contracts dir\n * @returns data or null\n */\nexport function getOceanArtifactsAddresses(): any {\n try {\n if (process.env.ADDRESS_FILE) {\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n const data = fs.readFileSync(process.env.ADDRESS_FILE, 'utf8')\n return JSON.parse(data)\n }\n return Addresses\n } catch (error) {\n return Addresses\n }\n}\n\n/**\n * Get the artifacts address from the address.json file, for the given chain\n * either from the env or from the ocean-contracts dir, safer than above, because sometimes the network name\n * is mispeled, best example \"optimism_sepolia\" vs \"optimism-sepolia\"\n * @returns data or null\n */\nexport function getOceanArtifactsAddressesByChainId(chain: number): any {\n try {\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n const data = getOceanArtifactsAddresses()\n if (data) {\n const networks = Object.keys(data)\n for (const network of networks) {\n if (data[network].chainId === chain) {\n return data[network]\n }\n }\n }\n } catch (error) {\n console.error(error)\n }\n return null\n}\n/**\n * Use this function to accurately calculate the template index, and also checking if the template is active\n * @param owner the signer account\n * @param nftContractAddress the nft contract address, usually artifactsAddresses.ERC721Factory\n * @param template the template ID or template address (from smart contract getId() function)\n * @returns index of the template on the list\n */\nexport async function calculateActiveTemplateIndex(\n owner: Signer,\n nftContractAddress: string, // addresses.ERC721Factory,\n template: string | number,\n chainID?: number\n): Promise<number> {\n // is an ID number?\n const isTemplateID = typeof template === 'number'\n\n const factoryERC721 = new NftFactory(nftContractAddress, owner, chainID)\n const currentTokenCount = await factoryERC721.getCurrentTokenTemplateCount()\n for (let i = 1; i <= currentTokenCount; i++) {\n const tokenTemplate = await factoryERC721.getTokenTemplate(i)\n\n const erc20Template = new ethers.Contract(\n tokenTemplate.templateAddress,\n ERC20Template.abi,\n owner\n )\n\n // check for ID\n if (isTemplateID) {\n const id = await erc20Template.getId()\n if (tokenTemplate.isActive && id.toString() === template.toString()) {\n return i\n }\n } else if (\n tokenTemplate.isActive &&\n tokenTemplate.templateAddress === template.toString()\n ) {\n return i\n }\n }\n // if nothing is found it returns -1\n return -1\n}\n","import { hexlify, keccak256, toUtf8Bytes, toUtf8String } from 'ethers'\nimport ERC721Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC721Template.sol/ERC721Template.json'\nimport {\n MetadataAndTokenURI,\n NftRoles,\n ReceiptOrEstimate,\n AbiItem\n} from '../@types/index.js'\nimport { SmartContract } from './SmartContract.js'\n\nimport { generateDtName } from '../utils/DatatokenName.js'\nimport { ZERO_ADDRESS } from '../utils/Constants.js'\nimport { getEventFromTx, sendTx } from '../utils/ContractUtils.js'\nimport {\n calculateActiveTemplateIndex,\n getOceanArtifactsAddressesByChainId\n} from '../utils/Addresses.js'\nimport { MetadataProof } from '@oceanprotocol/ddo-js'\nexport class Nft extends SmartContract {\n getDefaultAbi() {\n return ERC721Template.abi as AbiItem[]\n }\n\n /**\n * Create new ERC20 Datatoken - only user with DatatokenDeployer permission can succeed\n * @param {String} nftAddress NFT address\n * @param {String} address User address\n * @param {String} minter User set as initial minter for the Datatoken\n * @param {String} paymentCollector initial paymentCollector for this DT\n * @param {String} mpFeeAddress Consume marketplace fee address\n * @param {String} feeToken address of the token marketplace wants to add fee on top\n * @param {String} feeAmount amount of feeToken to be transferred to mpFeeAddress on top, will be converted to WEI\n * @param {String} cap Maximum cap (Number) - will be converted to wei\n * @param {String} name Token name\n * @param {String} symbol Token symbol\n * @param {Number} templateIndex NFT template index\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<string>} ERC20 Datatoken address\n */\n public async createDatatoken<G extends boolean = false>(\n nftAddress: string,\n address: string,\n minter: string,\n paymentCollector: string,\n mpFeeAddress: string,\n feeToken: string,\n feeAmount: string,\n cap: string,\n name?: string,\n symbol?: string,\n templateIndex?: number,\n filesObject?: string,\n accessListContract?: string,\n allowAccessList?: string,\n denyAccessList?: string,\n estimateGas?: G\n ): Promise<G extends false ? string : BigInt> {\n if ((await this.getNftPermissions(nftAddress, address)).deployERC20 !== true) {\n throw new Error(`Caller is not DatatokenDeployer`)\n }\n if (!templateIndex) templateIndex = 1\n\n // Generate name & symbol if not present\n if (!name || !symbol) {\n ;({ name, symbol } = generateDtName())\n }\n\n // Create 721contract object\n const nftContract = this.getContract(nftAddress)\n\n if (!this.signer.provider) {\n throw new Error('Provider is required but not available')\n }\n const { chainId } = await this.signer.provider.getNetwork()\n const artifacts = getOceanArtifactsAddressesByChainId(Number(chainId))\n if (filesObject) {\n templateIndex = await calculateActiveTemplateIndex(\n this.signer,\n artifacts.ERC721Factory,\n 4,\n Number(chainId)\n )\n }\n const estGas = await nftContract.createERC20.estimateGas(\n templateIndex,\n [name, symbol],\n [minter, paymentCollector, mpFeeAddress, feeToken],\n [\n await this.amountToUnits(null, cap, 18),\n await this.amountToUnits(null, feeAmount, 18)\n ],\n []\n )\n if (estimateGas) return <G extends false ? string : bigint>estGas\n\n const addresses = [minter, paymentCollector, mpFeeAddress, feeToken]\n if (accessListContract) {\n addresses.push(accessListContract.toLowerCase())\n if (allowAccessList) {\n addresses.push(allowAccessList.toLowerCase())\n } else {\n addresses.push(ZERO_ADDRESS)\n }\n if (denyAccessList) {\n addresses.push(denyAccessList)\n } else {\n addresses.push(ZERO_ADDRESS)\n }\n }\n\n const tx = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n nftContract.createERC20,\n templateIndex,\n [name, symbol],\n addresses,\n [\n await this.amountToUnits(null, cap, 18),\n await this.amountToUnits(null, feeAmount, 18)\n ],\n filesObject ? [toUtf8Bytes(filesObject)] : []\n )\n const trxReceipt = await tx.wait()\n const event = getEventFromTx(trxReceipt, 'TokenCreated')\n return event?.args[0]\n }\n\n /**\n * Add Manager for NFT Contract (only NFT Owner can succeed)\n * @param {String} nftAddress NFT contract address\n * @param {String} address NFT Owner adress\n * @param {String} manager User adress which is going to be assing manager\n * @param {Boolean} [estimateGas] if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} trxReceipt\n */\n public async addManager<G extends boolean = false>(\n nftAddress: string,\n address: string,\n manager: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const nftContract = this.getContract(nftAddress)\n\n if ((await this.getNftOwner(nftAddress)) !== address) {\n throw new Error(`Caller is not NFT Owner`)\n }\n\n const estGas = await nftContract.addManager.estimateGas(manager)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n nftContract.addManager,\n manager\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Removes a specific manager for NFT Contract (only NFT Owner can succeed)\n * @param {String} nftAddress NFT contract address\n * @param {String} address NFT Owner adress\n * @param {String} manager User adress which is going to be removed as manager\n * @param {Boolean} [estimateGas] if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} trxReceipt\n */\n public async removeManager<G extends boolean = false>(\n nftAddress: string,\n address: string,\n manager: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const nftContract = this.getContract(nftAddress)\n\n if ((await this.getNftOwner(nftAddress)) !== address) {\n throw new Error(`Caller is not NFT Owner`)\n }\n\n const estGas = await nftContract.removeManager.estimateGas(manager)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n nftContract.removeManager,\n manager\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Add DatatokenDeployer permission - only Manager can succeed\n * @param {String} nftAddress NFT contract address\n * @param {String} address NFT Manager adress\n * @param {String} datatokenDeployer User adress which is going to have DatatokenDeployer permission\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} trxReceipt\n */\n public async addDatatokenDeployer<G extends boolean = false>(\n nftAddress: string,\n address: string,\n datatokenDeployer: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const nftContract = this.getContract(nftAddress)\n\n if ((await this.getNftPermissions(nftAddress, address)).manager !== true) {\n throw new Error(`Caller is not Manager`)\n }\n\n // Estimate gas for addToCreateERC20List method\n const estGas = await nftContract.addToCreateERC20List.estimateGas(datatokenDeployer)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n nftContract.addToCreateERC20List,\n datatokenDeployer\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Remove DatatokenDeployer permission - only Manager can succeed\n * @param {String} nftAddress NFT contract address\n * @param {String} address NFT Manager adress\n * @param {String} datatokenDeployer Address of the user to be revoked DatatokenDeployer Permission\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} trxReceipt\n */\n public async removeDatatokenDeployer<G extends boolean = false>(\n nftAddress: string,\n address: string,\n datatokenDeployer: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const nftContract = this.getContract(nftAddress)\n\n if (\n (await this.getNftPermissions(nftAddress, address)).manager !== true ||\n (address === datatokenDeployer &&\n (await this.getNftPermissions(nftAddress, address)).deployERC20 !== true)\n ) {\n throw new Error(`Caller is not Manager nor DatatokenDeployer`)\n }\n const estGas = await nftContract.removeFromCreateERC20List.estimateGas(\n datatokenDeployer\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n nftContract.removeFromCreateERC20List,\n datatokenDeployer\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Add Metadata Updater permission - only Manager can succeed\n * @param {String} nftAddress NFT contract address\n * @param {String} address NFT Manager adress\n * @param {String} metadataUpdater User adress which is going to have Metadata Updater permission\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} trxReceipt\n */\n public async addMetadataUpdater<G extends boolean = false>(\n nftAddress: string,\n address: string,\n metadataUpdater: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const nftContract = this.getContract(nftAddress)\n\n if ((await this.getNftPermissions(nftAddress, address)).manager !== true) {\n throw new Error(`Caller is not Manager`)\n }\n\n const estGas = await nftContract.addToMetadataList.estimateGas(metadataUpdater)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n nftContract.addToMetadataList,\n metadataUpdater\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Remove Metadata Updater permission - only Manager can succeed\n * @param {String} nftAddress NFT contract address\n * @param {String} address NFT Manager adress\n * @param {String} metadataUpdater Address of the user to be revoked Metadata updater Permission\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} trxReceipt\n */\n public async removeMetadataUpdater<G extends boolean = false>(\n nftAddress: string,\n address: string,\n metadataUpdater: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const nftContract = this.getContract(nftAddress)\n if (\n (await this.getNftPermissions(nftAddress, address)).manager !== true ||\n (address !== metadataUpdater &&\n (await this.getNftPermissions(nftAddress, address)).updateMetadata !== true)\n ) {\n throw new Error(`Caller is not Manager nor Metadata Updater`)\n }\n\n const estGas = await nftContract.removeFromMetadataList.estimateGas(metadataUpdater)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n nftContract.removeFromMetadataList,\n metadataUpdater\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Add Store Updater permission - only Manager can succeed\n * @param {String} nftAddress NFT contract address\n * @param {String} address NFT Manager adress\n * @param {String} storeUpdater User adress which is going to have Store Updater permission\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} trxReceipt\n */\n public async addStoreUpdater<G extends boolean = false>(\n nftAddress: string,\n address: string,\n storeUpdater: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const nftContract = this.getContract(nftAddress)\n\n if ((await this.getNftPermissions(nftAddress, address)).manager !== true) {\n throw new Error(`Caller is not Manager`)\n }\n\n const estGas = await nftContract.addTo725StoreList.estimateGas(storeUpdater)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n nftContract.addTo725StoreList,\n storeUpdater\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Remove Store Updater permission - only Manager can succeed\n * @param {String} nftAddress NFT contract address\n * @param {String} address NFT Manager adress\n * @param {String} storeUpdater Address of the user to be revoked Store Updater Permission\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} trxReceipt\n */\n public async removeStoreUpdater<G extends boolean = false>(\n nftAddress: string,\n address: string,\n storeUpdater: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const nftContract = this.getContract(nftAddress)\n if (\n (await this.getNftPermissions(nftAddress, address)).manager !== true ||\n (address !== storeUpdater &&\n (await this.getNftPermissions(nftAddress, address)).store !== true)\n ) {\n throw new Error(`Caller is not Manager nor storeUpdater`)\n }\n\n const estGas = await nftContract.removeFrom725StoreList.estimateGas(storeUpdater)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n nftContract.removeFrom725StoreList,\n storeUpdater\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * This function allows to remove all ROLES at NFT level: Managers, DatatokenDeployer, MetadataUpdater, StoreUpdater\n * Even NFT Owner has to readd himself as Manager\n * Permissions at Datatoken level stay.\n * Only NFT Owner can call it.\n * @param {String} nftAddress NFT contract address\n * @param {String} address NFT Owner adress\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} trxReceipt\n */\n public async cleanPermissions<G extends boolean = false>(\n nftAddress: string,\n address: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const nftContract = this.getContract(nftAddress)\n if ((await this.getNftOwner(nftAddress)) !== address) {\n throw new Error(`Caller is not NFT Owner`)\n }\n\n const estGas = await nftContract.cleanPermissions.estimateGas()\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n nftContract.cleanPermissions\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Transfers the NFT\n * will clean all permissions both on NFT and Datatoken level.\n * @param {String} nftAddress NFT contract address\n * @param {String} nftOwner Current NFT Owner adress\n * @param {String} nftReceiver User which will receive the NFT, will also be set as Manager\n * @param {Number} tokenId The id of the token to be transfered\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} trxReceipt\n */\n public async transferNft<G extends boolean = false>(\n nftAddress: string,\n nftOwner: string,\n nftReceiver: string,\n tokenId?: number,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const nftContract = this.getContract(nftAddress)\n if ((await this.getNftOwner(nftAddress)) !== nftOwner) {\n throw new Error(`Caller is not NFT Owner`)\n }\n\n const tokenIdentifier = tokenId || 1\n\n const estGas = await nftContract.transferFrom.estimateGas(\n nftOwner,\n nftReceiver,\n tokenIdentifier\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n nftContract.transferFrom,\n nftOwner,\n nftReceiver,\n tokenIdentifier\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * safeTransferNFT Used for transferring the NFT, can be used by an approved relayer\n * will clean all permissions both on NFT and Datatoken level.\n * @param {String} nftAddress NFT contract address\n * @param {String} nftOwner Current NFT Owner adress\n * @param {String} nftReceiver User which will receive the NFT, will also be set as Manager\n * @param {Number} tokenId The id of the token to be transfered\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} trxReceipt\n */\n public async safeTransferNft<G extends boolean = false>(\n nftAddress: string,\n nftOwner: string,\n nftReceiver: string,\n tokenId?: number,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const nftContract = this.getContract(nftAddress)\n if ((await this.getNftOwner(nftAddress)) !== nftOwner) {\n throw new Error(`Caller is not NFT Owner`)\n }\n\n const tokenIdentifier = tokenId || 1\n\n const estGas = await nftContract.safeTransferFrom.estimateGas(\n nftOwner,\n nftReceiver,\n tokenIdentifier\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n nftContract.safeTransferFrom,\n nftOwner,\n nftReceiver,\n tokenIdentifier\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Creates or update Metadata cached by Aquarius. Also, updates the METADATA_DECRYPTOR key\n * @param {String} nftAddress NFT contract address\n * @param {String} address Caller address NFT Owner adress\n * @param {Number} metadataState\n * @param {String} metadataDecryptorUrl\n * @param {String} metadataDecryptorAddress\n * @param {String} flags\n * @param {String} data\n * @param {String} metadataHash\n * @param {MetadataProof[]} metadataProofs\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} trxReceipt\n */\n public async setMetadata<G extends boolean = false>(\n nftAddress: string,\n address: string,\n metadataState: number,\n metadataDecryptorUrl: string,\n metadataDecryptorAddress: string,\n flags: string,\n data: string,\n metadataHash: string,\n metadataProofs?: MetadataProof[],\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const nftContract = this.getContract(nftAddress)\n if (!metadataProofs) metadataProofs = []\n if (!(await this.getNftPermissions(nftAddress, address)).updateMetadata) {\n throw new Error(`Caller is not Metadata updater`)\n }\n const estGas = await nftContract.setMetaData.estimateGas(\n metadataState,\n metadataDecryptorUrl,\n metadataDecryptorAddress,\n flags,\n data,\n metadataHash,\n metadataProofs\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.signer,\n this.config?.gasFeeMultiplier,\n nftContract.setMetaData,\n metadataState,\n metadataDecryptorUrl,\n metadataDecryptorAddress,\n flags,\n data,\n metadataHash,\n metadataProofs\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Helper function to improve UX sets both MetaData & TokenURI in one tx\n * @param {String} nftAddress NFT contract address\n * @param {String} address Caller address\n * @param {MetadataAndTokenURI} metadataAndTokenURI metaDataAndTokenURI object\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} trxReceipt\n */\n public async setMetadataAndTokenURI<G extends boolean = false>(\n nftAddress: string,\n metadataUpdater: string,\n metadataAndTokenURI: MetadataAndTokenURI,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const nftContract = this.getContract(nftAddress)\n if (!(await this.getNftPermissions(nftAddress, metadataUpdater)).updateMetadata) {\n throw new Error(`Caller is not Metadata updater`)\n }\n const sanitizedMetadataAndTokenURI = {\n ...metadataAndTokenURI,\n metadataProofs: metadataAndTokenURI.metadataProofs || []\n }\n const estGas = await nftContract.setMetaDataAndTokenURI.estimateGas(\n sanitizedMetadataAndTokenURI\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.signer,\n this.config?.gasFeeMultiplier,\n nftContract.setMetaDataAndTokenURI,\n sanitizedMetadataAndTokenURI\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * setMetadataState Used for updating the metadata State\n * @param {String} nftAddress NFT contract address\n * @param {String} address Caller address => metadata updater\n * @param {Number} metadataState new metadata state\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} trxReceipt\n */\n public async setMetadataState<G extends boolean = false>(\n nftAddress: string,\n address: string,\n metadataState: number,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const nftContract = this.getContract(nftAddress)\n if (!(await this.getNftPermissions(nftAddress, address)).updateMetadata) {\n throw new Error(`Caller is not Metadata updater`)\n }\n\n const estGas = await nftContract.setMetaDataState.estimateGas(metadataState)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n nftContract.setMetaDataState,\n metadataState\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * set TokenURI on an nft\n * @param {String} nftAddress NFT contract address\n * @param {String} data input data for TokenURI\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transaction receipt\n */\n public async setTokenURI<G extends boolean = false>(\n nftAddress: string,\n data: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const nftContract = this.getContract(nftAddress)\n const estGas = await nftContract.setTokenURI.estimateGas('1', data)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n nftContract.setTokenURI,\n '1',\n data\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Get NFT Owner\n * @param {String} nftAddress NFT contract address\n * @return {Promise<string>} string\n */\n public async getNftOwner(nftAddress: string): Promise<string> {\n const nftContract = this.getContract(nftAddress)\n const trxReceipt = await nftContract.ownerOf(1)\n return trxReceipt\n }\n\n /**\n * Gets NFT Permissions for a specified user\n * @param {String} nftAddress NFT contract address\n * @param {String} address user adress\n * @return {Promise<NftRoles>}\n */\n public async getNftPermissions(nftAddress: string, address: string): Promise<NftRoles> {\n const nftContract = this.getContract(nftAddress)\n const roles = await nftContract.getPermissions(address)\n return roles\n }\n\n /**\n * Returns Metadata details for an NFT\n * @param {String} nftAddress NFT contract address\n * @return {Promise<Objecta>}\n */\n public async getMetadata(nftAddress: string): Promise<Object> {\n const nftContract = this.getContract(nftAddress)\n return await nftContract.getMetaData()\n }\n\n /**\n * Checks if user has DatatokenDeployer role\n * @param {String} nftAddress NFT contract address\n * @param {String} address user adress\n * @return {Promise<boolean>}\n */\n public async isDatatokenDeployer(\n nftAddress: string,\n address: string\n ): Promise<boolean> {\n const nftContract = this.getContract(nftAddress)\n const isDatatokenDeployer = await nftContract.isERC20Deployer(address)\n return isDatatokenDeployer\n }\n\n /**\n * Allows users to store data with a preset key (keccak256(ERC20Address)) into NFT 725 Store\n * only ERC20Deployer can succeed\n * @param {string} nftAddress Nft datatoken adress\n * @param {string} address User adress\n * @param {string} key Key of the data to be stored into 725Y standard\n * @param {string} value Data to be stored into 725Y standard\n * @param {boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transactionId\n */\n public async setData<G extends boolean = false>(\n nftAddress: string,\n address: string,\n key: string,\n value: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n if ((await this.getNftPermissions(nftAddress, address)).store !== true) {\n throw new Error(`User is not ERC20 store updater`)\n }\n\n const nftContract = this.getContract(nftAddress)\n const keyHash = keccak256(key)\n const valueHex = hexlify(toUtf8Bytes(value))\n\n const estGas = await nftContract.setNewData.estimateGas(keyHash, valueHex)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n nftContract.setNewData,\n keyHash,\n valueHex\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Gets stored data at a given `key` in an NFT\n * @param {string} nftAddress - The address of the NFT.\n * @param {string} key - The key of the data to get.\n * @return {Promise<string>} The data stored at the key\n */\n public async getData(nftAddress: string, key: string): Promise<string> {\n const nftContract = this.getContract(nftAddress)\n const keyHash = keccak256(key)\n const data = await nftContract.getData(keyHash)\n return data ? toUtf8String(data) : null\n }\n\n /**\n * Gets the token URI of an NFT.\n * @param {string} nftAddress - The address of the NFT.\n * @param {number} id - The ID of the token.\n * @returns {Promise&lt;string&gt;}\n */\n public async getTokenURI(nftAddress: string, id: number): Promise<string> {\n const nftContract = this.getContract(nftAddress)\n const data = await nftContract.tokenURI(id)\n return data\n }\n\n /**\n * Is datatoken deployed?\n * @param {string} nftAddress - The address of the NFT.\n * @param {string} datatokenAddress - The datatoken address.\n * @returns {Promise<boolean>}\n */\n public async isDatatokenDeployed(\n nftAddress: string,\n datatokenAddress: string\n ): Promise<boolean> {\n const nftContract = this.getContract(nftAddress)\n const data = await nftContract.isDeployed(datatokenAddress)\n return data\n }\n}\n","import { hexlify, Signer, toUtf8Bytes } from 'ethers'\nimport Decimal from 'decimal.js'\nimport ERC20Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC20Template.sol/ERC20Template.json'\nimport ERC20TemplateEnterprise from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC20TemplateEnterprise.sol/ERC20TemplateEnterprise.json'\nimport { amountToUnits, sendTx } from '../utils/ContractUtils.js'\nimport { ZERO_ADDRESS } from '../utils/Constants.js'\nimport {\n AbiItem,\n ConsumeMarketFee,\n FreOrderParams,\n FreCreationParams,\n ProviderFees,\n PublishingMarketFee,\n DispenserParams,\n OrderParams,\n DatatokenRoles,\n ReceiptOrEstimate\n} from '../@types/index.js'\nimport { Nft } from './NFT.js'\nimport { Config } from '../config/index.js'\nimport { SmartContract } from './SmartContract.js'\n\nexport class Datatoken extends SmartContract {\n public abiEnterprise: AbiItem[]\n public nft: Nft\n\n getDefaultAbi() {\n return ERC20Template.abi as AbiItem[]\n }\n\n /**\n * Instantiate Datatoken class\n * @param {Signer} signer The signer object.\n * @param {string | number} [network] Network id or name\n * @param {Config} [config] The configuration object.\n * @param {AbiItem[]} [abi] ABI array of the smart contract\n * @param {AbiItem[]} abiEnterprise Enterprise ABI array of the smart contract\n */\n constructor(\n signer: Signer,\n network?: string | number,\n config?: Config,\n abi?: AbiItem[],\n abiEnterprise?: AbiItem[]\n ) {\n super(signer, network, config, abi)\n this.abiEnterprise = abiEnterprise || (ERC20TemplateEnterprise.abi as AbiItem[])\n this.nft = new Nft(this.signer, network)\n }\n\n /**\n * Approves a spender to spend a certain amount of datatokens.\n * @param {String} dtAddress Datatoken address\n * @param {String} spender Spender address\n * @param {string} amount Number of datatokens, as number. Will be converted to wei\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async approve<G extends boolean = false>(\n dtAddress: string,\n spender: string,\n amount: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const dtContract = this.getContract(dtAddress)\n const estGas = await dtContract.approve.estimateGas(\n spender,\n amountToUnits(null, null, amount, 18)\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n dtContract.approve,\n spender,\n amountToUnits(null, null, amount, 18)\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Creates a new FixedRateExchange setup.\n * @param {String} dtAddress Datatoken address\n * @param {String} address Caller address\n * @param {FixedRateParams} fixedRateParams The parameters required to create a fixed-rate exchange contract.\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async createFixedRate<G extends boolean = false>(\n dtAddress: string,\n address: string,\n fixedRateParams: FreCreationParams,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const dtContract = this.getContract(dtAddress)\n if (!(await this.isDatatokenDeployer(dtAddress, address))) {\n throw new Error(`User is not Datatoken Deployer`)\n }\n if (!fixedRateParams.allowedConsumer) fixedRateParams.allowedConsumer = ZERO_ADDRESS\n\n const withMint = fixedRateParams.withMint === false ? 0 : 1\n\n // should check DatatokenDeployer role using NFT level ..\n\n const estGas = await dtContract.createFixedRate.estimateGas(\n fixedRateParams.fixedRateAddress,\n [\n fixedRateParams.baseTokenAddress,\n fixedRateParams.owner,\n fixedRateParams.marketFeeCollector,\n fixedRateParams.allowedConsumer\n ],\n [\n fixedRateParams.baseTokenDecimals,\n fixedRateParams.datatokenDecimals,\n fixedRateParams.fixedRate,\n fixedRateParams.marketFee,\n withMint\n ]\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n dtContract.createFixedRate,\n fixedRateParams.fixedRateAddress,\n [\n fixedRateParams.baseTokenAddress,\n fixedRateParams.owner,\n fixedRateParams.marketFeeCollector,\n fixedRateParams.allowedConsumer\n ],\n [\n fixedRateParams.baseTokenDecimals,\n fixedRateParams.datatokenDecimals,\n fixedRateParams.fixedRate,\n fixedRateParams.marketFee,\n withMint\n ]\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Creates a new Dispenser\n * @param {String} dtAddress Datatoken address\n * @param {String} address Caller address\n * @param {String} dispenserAddress Dispenser contract address\n * @param {DispenserParams} dispenserParams The parameters required to create a dispenser contract.\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transactionId\n */\n public async createDispenser<G extends boolean = false>(\n dtAddress: string,\n address: string,\n dispenserAddress: string,\n dispenserParams: DispenserParams,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n if (!(await this.isDatatokenDeployer(dtAddress, address))) {\n throw new Error(`User is not Datatoken Deployer`)\n }\n\n const dtContract = this.getContract(dtAddress)\n if (!dispenserParams.allowedSwapper) dispenserParams.allowedSwapper = ZERO_ADDRESS\n\n dispenserParams.withMint = dispenserParams.withMint !== false\n\n // should check DatatokenDeployer role using NFT level ..\n\n const estGas = await dtContract.createDispenser.estimateGas(\n dispenserAddress,\n dispenserParams.maxTokens,\n dispenserParams.maxBalance,\n dispenserParams.withMint,\n dispenserParams.allowedSwapper\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n dtContract.createDispenser,\n dispenserAddress,\n dispenserParams.maxTokens,\n dispenserParams.maxBalance,\n dispenserParams.withMint,\n dispenserParams.allowedSwapper\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Mints datatokens\n * @param {String} dtAddress Datatoken address\n * @param {String} address Minter address\n * @param {String} amount Number of datatokens, as number. Will be converted to wei\n * @param {String} toAddress only if toAddress is different from the minter\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transactionId\n */\n public async mint<G extends boolean = false>(\n dtAddress: string,\n address: string,\n amount: string,\n toAddress?: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const dtContract = this.getContract(dtAddress)\n if ((await this.getPermissions(dtAddress, address)).minter !== true) {\n throw new Error(`Caller is not Minter`)\n }\n\n const capAvailble = await this.getCap(dtAddress)\n if (new Decimal(capAvailble).gte(amount)) {\n const estGas = await dtContract.mint.estimateGas(\n toAddress || address,\n amountToUnits(null, null, amount, 18)\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n dtContract.mint,\n toAddress || address,\n amountToUnits(null, null, amount, 18)\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n } else {\n throw new Error(`Mint amount exceeds cap available`)\n }\n }\n\n /**\n * Add Minter for an ERC20 Datatoken\n * only DatatokenDeployer can succeed\n * @param {String} dtAddress Datatoken address\n * @param {String} address caller address\n * @param {String} minter address which is going to be a Minter\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transactionId\n */\n public async addMinter<G extends boolean = false>(\n dtAddress: string,\n address: string,\n minter: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const dtContract = this.getContract(dtAddress)\n if ((await this.isDatatokenDeployer(dtAddress, address)) !== true) {\n throw new Error(`Caller is not DatatokenDeployer`)\n }\n // Estimate gas cost for addMinter method\n const estGas = await dtContract.addMinter.estimateGas(minter)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n dtContract.addMinter,\n minter\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Revoke Minter permission for an ERC20 Datatoken\n * only DatatokenDeployer can succeed\n * @param {String} dtAddress Datatoken address\n * @param {String} address caller address\n * @param {String} minter address which will have removed the Minter permission\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async removeMinter<G extends boolean = false>(\n dtAddress: string,\n address: string,\n minter: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const dtContract = this.getContract(dtAddress)\n if ((await this.isDatatokenDeployer(dtAddress, address)) !== true) {\n throw new Error(`Caller is not DatatokenDeployer`)\n }\n\n const estGas = await dtContract.removeMinter.estimateGas(minter)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n dtContract.removeMinter,\n minter\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Adds a payment manager on a datatoken to a desired address.(can set who's going to collect fee when consuming orders)\n * only DatatokenDeployer can succeed\n * @param {String} dtAddress Datatoken address\n * @param {String} address Caller address\n * @param {String} paymentManager The address of the payment manager\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transactionId\n */\n public async addPaymentManager<G extends boolean = false>(\n dtAddress: string,\n address: string,\n paymentManager: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const dtContract = this.getContract(dtAddress)\n if ((await this.isDatatokenDeployer(dtAddress, address)) !== true) {\n throw new Error(`Caller is not DatatokenDeployer`)\n }\n\n const estGas = await dtContract.addPaymentManager.estimateGas(paymentManager)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n dtContract.addPaymentManager,\n paymentManager\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Revoke paymentManager permission for an ERC20 Datatoken\n * only DatatokenDeployer can succeed\n * @param {String} dtAddress Datatoken address\n * @param {String} address User address\n * @param {String} paymentManager User which will be removed from paymentManager permission\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} trxReceipt\n */\n public async removePaymentManager<G extends boolean = false>(\n dtAddress: string,\n address: string,\n paymentManager: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const dtContract = this.getContract(dtAddress)\n if ((await this.isDatatokenDeployer(dtAddress, address)) !== true) {\n throw new Error(`Caller is not DatatokenDeployer`)\n }\n\n const estGas = await dtContract.removePaymentManager.estimateGas(paymentManager)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n dtContract.removePaymentManager,\n paymentManager\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * This function allows to set a new PaymentCollector (receives DT when consuming)\n * If not set the paymentCollector is the NFT Owner\n * only NFT owner can call\n * @param dtAddress Datatoken address\n * @param address Caller address\n * @param paymentCollector User to be set as new payment collector\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} trxReceipt\n */\n public async setPaymentCollector<G extends boolean = false>(\n dtAddress: string,\n address: string,\n paymentCollector: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const dtContract = this.getContract(dtAddress)\n const isPaymentManager = (await this.getPermissions(dtAddress, address))\n .paymentManager\n const nftAddress = !isPaymentManager && (await this.getNFTAddress(dtAddress))\n const isNftOwner = nftAddress && (await this.nft.getNftOwner(nftAddress)) === address\n const nftPermissions =\n nftAddress && !isNftOwner && (await this.nft.getNftPermissions(nftAddress, address))\n const isDatatokenDeployer = nftPermissions?.deployERC20\n if (!isPaymentManager && !isNftOwner && !isDatatokenDeployer) {\n throw new Error(`Caller is not Fee Manager, owner or Datatoken Deployer`)\n }\n\n const estGas = await dtContract.setPaymentCollector.estimateGas(paymentCollector)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n dtContract.setPaymentCollector,\n paymentCollector\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * getPaymentCollector - It returns the current paymentCollector\n * @param dtAddress datatoken address\n * @return {Promise<string>}\n */\n public async getPaymentCollector(dtAddress: string): Promise<string> {\n const dtContract = this.getContract(dtAddress)\n const paymentCollector = await dtContract.getPaymentCollector()\n return paymentCollector\n }\n\n /**\n * Transfer tokens(as number) from address to toAddress\n * @param {String} dtAddress Datatoken address\n * @param {String} toAddress Receiver address\n * @param {String} amount Number of datatokens, as number. Will be converted to wei.\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transactionId\n */\n public async transfer<G extends boolean = false>(\n dtAddress: string,\n toAddress: string,\n amount: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n return this.transferWei(\n dtAddress,\n toAddress,\n await amountToUnits(null, null, amount, 18),\n estimateGas\n )\n }\n\n /**\n * Transfer in wei from address to toAddress\n * @param {String} dtAddress Datatoken address\n * @param {String} toAddress Receiver address\n * @param {String} amount Number of datatokens (number) expressed as wei\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transactionId\n */\n public async transferWei<G extends boolean = false>(\n dtAddress: string,\n toAddress: string,\n amount: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const dtContract = this.getContract(dtAddress)\n const estGas = await dtContract.transfer.estimateGas(toAddress, amount)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n dtContract.transfer,\n toAddress,\n amount\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Start Order: called by payer or consumer prior ordering a service consume on a marketplace.\n * @param {String} dtAddress Datatoken address\n * @param {String} consumer Consumer Address\n * @param {Number} serviceIndex Service index in the metadata\n * @param {providerFees} providerFees provider fees\n * @param {consumeMarketFee} ConsumeMarketFee consume market fees\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} string\n */\n public async startOrder<G extends boolean = false>(\n dtAddress: string,\n consumer: string,\n serviceIndex: number,\n providerFees: ProviderFees,\n consumeMarketFee?: ConsumeMarketFee,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const dtContract = this.getContract(dtAddress, this.abi)\n if (!consumeMarketFee) {\n consumeMarketFee = {\n consumeMarketFeeAddress: ZERO_ADDRESS,\n consumeMarketFeeToken: ZERO_ADDRESS,\n consumeMarketFeeAmount: '0'\n }\n }\n\n const estGas = await dtContract.startOrder.estimateGas(\n consumer,\n serviceIndex,\n providerFees,\n consumeMarketFee\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n dtContract.startOrder,\n consumer,\n serviceIndex,\n providerFees,\n consumeMarketFee\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Reuse Order: called by payer or consumer having a valid order, but with expired provider access.\n * Pays the provider fee again, but it will not require a new datatoken payment\n * Requires previous approval of provider fee.\n * @param {String} dtAddress Datatoken address\n * @param {String} orderTxId previous valid order\n * @param {providerFees} providerFees provider fees\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} string\n */\n public async reuseOrder<G extends boolean = false>(\n dtAddress: string,\n orderTxId: string,\n providerFees: ProviderFees,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const dtContract = this.getContract(dtAddress)\n\n const estGas = await dtContract.reuseOrder.estimateGas(orderTxId, providerFees)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n dtContract.reuseOrder,\n orderTxId,\n providerFees\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Buys 1 DT from the FRE and then startsOrder, while burning that DT\n * @param {String} dtAddress Datatoken address\n * @param {OrderParams} orderParams The parameters required to place an order.\n * @param {FreParams} freParams The parameters required to buy from a fixed-rate exchange.\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async buyFromFreAndOrder<G extends boolean = false>(\n dtAddress: string,\n orderParams: OrderParams,\n freParams: FreOrderParams,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const dtContract = this.getContract(dtAddress, this.abiEnterprise)\n\n const freContractParams = await this.getFreOrderParams(freParams)\n\n const estGas = await dtContract.buyFromFreAndOrder.estimateGas(\n orderParams,\n freContractParams\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n dtContract.buyFromFreAndOrder,\n orderParams,\n freContractParams\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Gets 1 DT from dispenser and then startsOrder, while burning that DT\n * @param {String} dtAddress Datatoken address\n * @param {OrderParams} orderParams - The parameters required to place an order.\n * @param {String} dispenserContract dispenser address\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async buyFromDispenserAndOrder<G extends boolean = false>(\n dtAddress: string,\n orderParams: OrderParams,\n dispenserContract: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const dtContract = this.getContract(dtAddress, this.abiEnterprise)\n\n const estGas = await dtContract.buyFromDispenserAndOrder.estimateGas(\n orderParams,\n dispenserContract\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n dtContract.buyFromDispenserAndOrder,\n orderParams,\n dispenserContract\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /** setData\n * This function allows to store data with a preset key (keccak256(dtAddress)) into NFT 725 Store\n * only DatatokenDeployer can succeed\n * @param {String} dtAddress Datatoken address\n * @param {String} address User address\n * @param {String} value Data to be stored into 725Y standard\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transactionId\n */\n public async setData<G extends boolean = false>(\n dtAddress: string,\n address: string,\n value: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n if (!(await this.isDatatokenDeployer(dtAddress, address))) {\n throw new Error(`User is not Datatoken Deployer`)\n }\n\n const dtContract = this.getContract(dtAddress)\n const valueHex = hexlify(toUtf8Bytes(value))\n\n const estGas = await dtContract.setData.estimateGas(valueHex)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n dtContract.setData,\n valueHex\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Clean Datatoken level Permissions (minters, paymentManager and reset the paymentCollector) for an ERC20 Datatoken\n * Only NFT Owner (at 721 level) can call it.\n * @param {string} dtAddress Datatoken address where we want to clean permissions\n * @param {string} address User adress\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transactionId\n */\n public async cleanPermissions<G extends boolean = false>(\n dtAddress: string,\n address: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n if ((await this.nft.getNftOwner(await this.getNFTAddress(dtAddress))) !== address) {\n throw new Error('Caller is NOT Nft Owner')\n }\n const dtContract = this.getContract(dtAddress)\n const estGas = await dtContract.cleanPermissions.estimateGas()\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n dtContract.cleanPermissions\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Returns ERC20 Datatoken user's permissions for a datatoken\n * @param {String} dtAddress Datatoken adress\n * @param {String} address user adress\n * @return {Promise<DatatokenRoles>}\n */\n public async getPermissions(\n dtAddress: string,\n address: string\n ): Promise<DatatokenRoles> {\n const dtContract = this.getContract(dtAddress)\n const roles = await dtContract.permissions(address)\n return roles\n }\n\n /**\n * Returns the Datatoken cap\n * @param {String} dtAddress Datatoken adress\n * @return {Promise<string>}\n */\n public async getCap(dtAddress: string): Promise<string> {\n const dtContract = this.getContract(dtAddress)\n const cap = await dtContract.cap()\n return await this.unitsToAmount(null, cap, 18)\n }\n\n /**\n * It returns the token decimals, how many supported decimal points\n * @param {String} dtAddress Datatoken adress\n * @return {Promise<number>}\n */\n public async getDecimals(dtAddress: string): Promise<number> {\n const dtContract = this.getContract(dtAddress)\n const decimals = await dtContract.decimals()\n return Number(decimals)\n }\n\n /**\n * It returns the token template index.\n * @param {String} dtAddress Datatoken adress\n * @return {Promise<number>}\n */\n public async getId(dtAddress: string): Promise<number> {\n const dtContract = this.getContract(dtAddress)\n const id = await dtContract.getId()\n return Number(id)\n }\n\n /**\n * It returns the token symbol\n * @param {String} dtAddress Datatoken adress\n * @return {Promise<number>}\n */\n public async getSymbol(dtAddress: string): Promise<string> {\n const dtContract = this.getContract(dtAddress)\n const symbol = await dtContract.symbol()\n return symbol\n }\n\n /**\n * It returns the name of the token\n * @param {String} dtAddress Datatoken adress\n * @return {Promise<number>}\n */\n public async getName(dtAddress: string): Promise<string> {\n const dtContract = this.getContract(dtAddress)\n const name = await dtContract.name()\n return name\n }\n\n /**\n * It returns the token decimals, how many supported decimal points\n * @param {String} dtAddress Datatoken adress\n * @return {Promise<number>}\n */\n public async getNFTAddress(dtAddress: string): Promise<string> {\n const dtContract = this.getContract(dtAddress)\n const nftAddress = await dtContract.getERC721Address()\n return nftAddress\n }\n\n /**\n * It returns the list of fixedRateExchanges created for this datatoken.\n * @param {String} dtAddress Datatoken adress\n * @return {Promise<number>}\n */\n public async getFixedRates(dtAddress: string): Promise<any[]> {\n const dtContract = this.getContract(dtAddress)\n const fixedRates = await dtContract.getFixedRates()\n return fixedRates\n }\n\n /**\n * It returns the list of dispensers created for this datatoken.\n * @param {String} dtAddress Datatoken adress\n * @return {Promise<number>}\n */\n public async getDispensers(dtAddress: string): Promise<any[]> {\n const dtContract = this.getContract(dtAddress)\n const dispensers = await dtContract.getDispensers()\n return dispensers\n }\n\n /**\n * Returns true if address has deployERC20 role\n * @param {String} dtAddress Datatoken adress\n * @param {String} dtAddress Datatoken adress\n * @return {Promise<boolean>}\n */\n public async isDatatokenDeployer(dtAddress: string, address: string): Promise<boolean> {\n const dtContract = this.getContract(dtAddress)\n const isDatatokenDeployer = await dtContract.isERC20Deployer(address)\n return isDatatokenDeployer\n }\n\n /**\n * Get Address Balance for datatoken\n * @param {String} dtAddress Datatoken adress\n * @param {String} address user adress\n * @return {Promise<String>} balance Number of datatokens. Will be converted from wei\n */\n public async balance(datatokenAddress: string, address: string): Promise<string> {\n const dtContract = this.getContract(datatokenAddress)\n const balance = await dtContract.balanceOf(address)\n return await this.unitsToAmount(null, balance, 18)\n }\n\n /**\n * Get Address Allowance for datatoken\n * @param {String} dtAddress Datatoken adress\n * @param {String} owner owner adress\n * @param {String} spender spender adress\n * @param {Number} decimals numer of token decimals, default 18\n * @return {Promise<String>} allowance Number of datatokens. Will be converted from wei\n */\n public async allowance(\n datatokenAddress: string,\n owner: string,\n spender: string,\n decimals: number = 18\n ): Promise<string> {\n const dtContract = this.getContract(datatokenAddress)\n const allowance = await dtContract.allowance(owner, spender)\n return await this.unitsToAmount(null, allowance, decimals)\n }\n\n /**\n * Allows to set the fee required by the publisherMarket\n * only publishMarketFeeAddress can call it\n * @param {string} datatokenAddress Datatoken adress\n * @param {string} publishMarketFeeAddress new publish Market Fee Address\n * @param {string} publishMarketFeeToken new publish Market Fee Token\n * @param {string} publishMarketFeeAmount new fee amount\n * @param {String} address user adress\n * @param {Boolean} estimateGas if True, return gas estimate\n */\n public async setPublishingMarketFee<G extends boolean = false>(\n datatokenAddress: string,\n publishMarketFeeAddress: string,\n publishMarketFeeToken: string,\n publishMarketFeeAmount: string,\n address: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const dtContract = this.getContract(datatokenAddress)\n const mktFeeAddress = (await dtContract.getPublishingMarketFee())[0]\n if (mktFeeAddress !== address) {\n throw new Error(`Caller is not the Publishing Market Fee Address`)\n }\n const estGas = await dtContract.setPublishingMarketFee.estimateGas(\n publishMarketFeeAddress,\n publishMarketFeeToken,\n publishMarketFeeAmount\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n dtContract.setPublishingMarketFee,\n publishMarketFeeAddress,\n publishMarketFeeToken,\n publishMarketFeeAmount\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Returns the current fee set by the publishing market\n * @param {String} datatokenAddress Datatoken adress\n * @return {Promise<PublishingMarketFee>} Current fee set by the publishing market\n */\n public async getPublishingMarketFee(\n datatokenAddress: string\n ): Promise<PublishingMarketFee> {\n const dtContract = this.getContract(datatokenAddress)\n\n const publishingMarketFee = await dtContract.getPublishingMarketFee()\n const returnValues = {\n publishMarketFeeAddress: publishingMarketFee[0],\n publishMarketFeeToken: publishingMarketFee[1],\n publishMarketFeeAmount: publishingMarketFee[2].toString()\n }\n return returnValues\n }\n\n private async getFreOrderParams(freParams: FreOrderParams): Promise<any> {\n return {\n exchangeContract: freParams.exchangeContract,\n exchangeId: freParams.exchangeId,\n maxBaseTokenAmount: await amountToUnits(\n this.signer,\n freParams.baseTokenAddress,\n freParams.maxBaseTokenAmount,\n freParams.baseTokenDecimals\n ),\n swapMarketFee: await amountToUnits(\n this.signer,\n freParams.baseTokenAddress,\n freParams.swapMarketFee,\n freParams.baseTokenDecimals\n ),\n\n marketFeeAddress: freParams.marketFeeAddress\n }\n }\n}\n","/* eslint-disable lines-between-class-members */\nimport { Datatoken } from './Datatoken.js'\nimport { Signer } from 'ethers'\nimport ERC20Template4 from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC20Template4.sol/ERC20Template4.json'\nimport { AbiItem, ReceiptOrEstimate } from '../@types/index.js'\nimport { AccessListContract } from './AccessList.js'\nimport { Config } from '../config/index.js'\nimport { sendTx } from '../utils/ContractUtils.js'\n\nexport class Datatoken4 extends Datatoken {\n public accessList: AccessListContract\n public fileObject: Uint8Array\n getDefaultAbi() {\n return ERC20Template4.abi as AbiItem[]\n }\n\n /**\n * Instantiate Datatoken class\n * @param {Signer} signer The signer object.\n * @param {string | number} [network] Network id or name\n * @param {Config} [config] The configuration object.\n * @param {AbiItem[]} [abi] ABI array of the smart contract\n */\n constructor(\n signer: Signer,\n fileObject: Uint8Array,\n network?: string | number,\n config?: Config,\n abi?: AbiItem[]\n ) {\n super(signer, network, config, abi)\n this.abi = this.getDefaultAbi()\n this.fileObject = fileObject\n }\n\n public setFileObj(fileObj: Uint8Array): void {\n this.fileObject = fileObj\n }\n\n /**\n * getAllowListContract - It returns the current allowList contract address\n * @param dtAddress datatoken address\n * @return {Promise<string>}\n */\n public async getAllowlistContract(dtAddress: string): Promise<string> {\n const dtContract = this.getContract(dtAddress, this.getDefaultAbi())\n const allowList = await dtContract.getAllowListContract()\n return allowList\n }\n\n /**\n * getDenyListContract - It returns the current denyList contract address\n * @param dtAddress datatoken address\n * @return {Promise<string>}\n */\n public async getDenylistContract(dtAddress: string): Promise<string> {\n const dtContract = this.getContract(dtAddress, this.getDefaultAbi())\n const denyList = await dtContract.getDenyListContract()\n return denyList\n }\n\n /** setAllowListContract\n * This function allows to set another address for allowListContract, only by datatoken deployer\n * only DatatokenDeployer can succeed\n * @param {String} dtAddress Datatoken address\n * @param {String} address Contract address\n * @param {String} consumer User address\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} returns the transaction receipt or the estimateGas value\n */\n public async setAllowListContract<G extends boolean = false>(\n dtAddress: string,\n address: string,\n consumer: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n if (!(await this.isDatatokenDeployer(dtAddress, consumer))) {\n throw new Error(`User is not Datatoken Deployer`)\n }\n\n const dtContract = this.getContract(dtAddress)\n const estGas = await dtContract.setAllowListContract.estimateGas(address)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n dtContract.setAllowListContract,\n address\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /** setDenyListContract\n * This function allows to set another address for allowListContract, only by datatoken deployer\n * only DatatokenDeployer can succeed\n * @param {String} dtAddress Datatoken address\n * @param {String} address Contract address\n * @param {String} consumer User address\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} returns the transaction receipt or the estimateGas value\n */\n public async setDenyListContract<G extends boolean = false>(\n dtAddress: string,\n address: string,\n consumer: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n if (!(await this.isDatatokenDeployer(dtAddress, consumer))) {\n throw new Error(`User is not Datatoken Deployer`)\n }\n\n const dtContract = this.getContract(dtAddress)\n const estGas = await dtContract.setDenyListContract.estimateGas(address)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n dtContract.setDenyListContract,\n address\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n /** setFileObject\n * This function allows to set file object in ecnrypted format, only by datatoken deployer\n * only DatatokenDeployer can succeed\n * @param {String} dtAddress Datatoken address\n * @param {String} address User address\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} returns the transaction receipt or the estimateGas value\n */\n public async setFileObject<G extends boolean = false>(\n dtAddress: string,\n address: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n if (!(await this.isDatatokenDeployer(dtAddress, address))) {\n throw new Error(`User is not Datatoken Deployer`)\n }\n\n const dtContract = this.getContract(dtAddress)\n const estGas = await dtContract.setFilesObject.estimateGas(this.fileObject)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n dtContract.setFilesObject,\n this.fileObject\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * getFileObject - It returns the consumer's file object encrypted format.\n * @param {String} dtAddress datatoken address\n * @param {Number} serviceIndex - service index\n * @param {String} providerAddress\n * @param {Bytes} providerSignature\n * @param {Bytes} consumerData\n * @param {Bytes} consumerSignature\n * @param {String} consumerAddress\n * @return {Promise<Bytes>} returns file object\n */\n public async getFileObject(\n dtAddress: string,\n serviceIndex: number,\n providerAddress: string,\n providerSignature: Uint8Array,\n consumerData: Uint8Array,\n consumerSignature: Uint8Array,\n consumerAddress: string\n ): Promise<Uint8Array> {\n const dtContract = this.getContract(dtAddress, this.getDefaultAbi())\n const fileObject = await dtContract.getFileObject(\n serviceIndex,\n providerAddress,\n providerSignature,\n consumerData,\n consumerSignature,\n consumerAddress\n )\n return fileObject\n }\n}\n","import { Signer } from 'ethers'\nimport AccessList from '@oceanprotocol/contracts/artifacts/contracts/accesslists/AccessList.sol/AccessList.json'\nimport { sendTx } from '../utils/ContractUtils.js'\nimport { AbiItem, ReceiptOrEstimate } from '../@types/index.js'\nimport { Config } from '../config/index.js'\nimport { SmartContractWithAddress } from './SmartContractWithAddress.js'\n\nexport class AccessListContract extends SmartContractWithAddress {\n public abiEnterprise: AbiItem[]\n\n getDefaultAbi() {\n return AccessList.abi as AbiItem[]\n }\n\n /**\n * Instantiate AccessList class\n * @param {string} address The contract address.\n * @param {Signer} signer The signer object.\n * @param {string | number} [network] Network id or name\n * @param {Config} [config] The configuration object.\n * @param {AbiItem[]} [abi] ABI array of the smart contract\n * @param {AbiItem[]} abiEnterprise Enterprise ABI array of the smart contract\n */\n constructor(\n address: string,\n signer: Signer,\n network?: string | number,\n config?: Config,\n abi?: AbiItem[]\n ) {\n super(address, signer, network, config, abi)\n this.abi = abi || this.getDefaultAbi()\n }\n\n /**\n * Get Token Uri\n * @return {Promise<string>} Token URI\n */\n public async getTokenUri(tokenId: number): Promise<string> {\n return await this.contract.tokenURI(tokenId)\n }\n\n /**\n * Get Owner\n * @return {Promise<string>} Owner\n */\n public async getOwner(): Promise<string> {\n return await this.contract.owner()\n }\n\n /**\n * Get Id\n * @return {Promise<string>} Id\n */\n public async getId(): Promise<number> {\n const id = await this.contract.getId()\n return Number(id)\n }\n\n /**\n * Get Name of Access list\n * @return {Promise<string>} Name\n */\n public async getName(): Promise<string> {\n return await this.contract.name()\n }\n\n /**\n * Get Symbol of Access list\n * @return {Promise<string>} Symbol\n */\n public async getSymbol(): Promise<string> {\n return await this.contract.symbol()\n }\n\n /**\n * Get Address Balance for access list token\n * @param {String} address user adress\n * @return {Promise<String>} balance Number of datatokens. Will be converted from wei\n */\n public async balance(address: string): Promise<string> {\n const balance = await this.contract.balanceOf(address)\n return await this.unitsToAmount(null, balance, 18)\n }\n\n /**\n * Add address to access list\n * @param {String} user Minter address\n * @param {String} tokenUri tokenURI\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} returns the transaction receipt or the estimateGas value\n */\n public async mint<G extends boolean = false>(\n user: string,\n tokenUri: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const estGas = await this.contract.mint.estimateGas(user, tokenUri)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.mint,\n user,\n tokenUri\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Batch add addresses to the access list\n * @param {String} users Minter addresses\n * @param {String} tokenUris tokenURI\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} returns the transaction receipt or the estimateGas value\n */\n public async batchMint<G extends boolean = false>(\n users: Array<string>,\n tokenUris: Array<string>,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const estGas = await this.contract.batchMint.estimateGas(users, tokenUris)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.batchMint,\n users,\n tokenUris\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Delete address from access list\n * @param {Number} tokenId token ID\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} returns the transaction receipt or the estimateGas value\n */\n public async burn<G extends boolean = false>(\n tokenId: number,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const estGas = await this.contract.burn.estimateGas(tokenId)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.burn,\n tokenId\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Transfer Ownership of an access list, called by owner of access list\n * @param {Number} newOwner new owner of the access list\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} returns the transaction receipt or the estimateGas value\n */\n public async transferOwnership<G extends boolean = false>(\n newOwner: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const estGas = await this.contract.transferOwnership.estimateGas(newOwner)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.transferOwnership,\n newOwner\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Renounce Ownership of an access list, called by owner of access list\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} returns the transaction receipt or the estimateGas value\n */\n public async renounceOwnership<G extends boolean = false>(\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const estGas = await this.contract.renounceOwnership.estimateGas()\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.renounceOwnership\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n}\n","import { BigNumberish, Signer } from 'ethers'\nimport { Config } from '../config/index.js'\nimport AccessListFactory from '@oceanprotocol/contracts/artifacts/contracts/accesslists/AccessListFactory.sol/AccessListFactory.json'\nimport { sendTx, getEventFromTx } from '../utils/ContractUtils.js'\nimport { ZERO_ADDRESS } from '../utils/Constants.js'\nimport { AbiItem, ReceiptOrEstimate } from '../@types/index.js'\nimport { SmartContractWithAddress } from './SmartContractWithAddress.js'\nimport { generateDtName } from '../utils/DatatokenName.js'\n\n/**\n * Provides an interface for Access List Factory contract\n */\nexport class AccesslistFactory extends SmartContractWithAddress {\n getDefaultAbi() {\n return AccessListFactory.abi as AbiItem[]\n }\n\n /**\n * Instantiate AccessListFactory class\n * @param {string} address The factory contract address.\n * @param {Signer} signer The signer object.\n * @param {string | number} [network] Network id or name\n * @param {Config} [config] The configuration object.\n * @param {AbiItem[]} [abi] ABI array of the smart contract\n */\n constructor(\n address: string,\n signer: Signer,\n network?: string | number,\n config?: Config,\n abi?: AbiItem[]\n ) {\n super(address, signer, network, config, abi)\n this.abi = abi || this.getDefaultAbi()\n }\n\n /**\n * Create new Access List Contract\n * @param {string} nameAccessList The name for access list.\n * @param {string} symbolAccessList The symbol for access list.\n * @param {string[]} tokenURI Token URIs list.\n * @param {boolean} transferable Default false, to be soulbound.\n * @param {string} owner Owner of the access list.\n * @param {string[]} user Users of the access lists as addresses.\n * @param {Boolean} [estimateGas] if True, return gas estimate\n * @return {Promise<string|BigNumber>} The transaction hash or the gas estimate.\n */\n public async deployAccessListContract<G extends boolean = false>(\n nameAccessList: string,\n symbolAccessList: string,\n tokenURI: string[],\n transferable: boolean = false,\n owner: string,\n user: string[],\n estimateGas?: G\n ): Promise<G extends false ? string : BigNumberish> {\n if (!nameAccessList || !symbolAccessList) {\n const { name, symbol } = generateDtName()\n nameAccessList = name\n symbolAccessList = symbol\n }\n const estGas = await this.contract.deployAccessListContract.estimateGas(\n nameAccessList,\n symbolAccessList,\n transferable,\n owner,\n user,\n tokenURI\n )\n if (estimateGas) return <G extends false ? string : BigNumberish>estGas\n // Invoke createToken function of the contract\n try {\n const tx = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.deployAccessListContract,\n nameAccessList,\n symbolAccessList,\n transferable,\n owner,\n user,\n tokenURI\n )\n if (!tx) {\n const e = 'Tx for deploying new access list was not processed on chain.'\n console.error(e)\n throw e\n }\n const trxReceipt = await tx.wait()\n const events = getEventFromTx(trxReceipt, 'NewAccessList')\n return events.args[0]\n } catch (e) {\n console.error(`Creation of AccessList failed: ${e}`)\n }\n }\n\n /**\n * Get Factory Owner\n * @return {Promise<string>} Factory Owner address\n */\n public async getOwner(): Promise<string> {\n const owner = await this.contract.owner()\n return owner\n }\n\n /**\n * Is a list contract soul bound?\n * @param {String} contractAddress list contract address\n * @return {Promise<boolean>} is soulbound?\n */\n public async isSoulbound(contractAddress: string): Promise<boolean> {\n const isSoulbound = await this.contract.isSoulBound(contractAddress)\n return isSoulbound\n }\n\n /**\n * Is a list contract deployed?\n * @param {String} contractAddress list contract address\n * @return {Promise<boolean>} is deployed?\n */\n public async isDeployed(contractAddress: string): Promise<boolean> {\n const isDeployed = await this.contract.isDeployed(contractAddress)\n return isDeployed\n }\n\n /**\n * changeTemplateAddress - only factory Owner\n * @param {String} owner caller address\n * @param {Number} templateAddress address of the template we want to change\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} returns the transaction receipt or the estimateGas value, current token template count\n */\n public async changeTemplateAddress<G extends boolean = false>(\n owner: string,\n templateAddress: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n if ((await this.getOwner()) !== owner) {\n throw new Error(`Caller is not Factory Owner`)\n }\n\n if (templateAddress === ZERO_ADDRESS) {\n throw new Error(`Template address cannot be ZERO address`)\n }\n\n const estGas = await this.contract.changeTemplateAddress.estimateGas(templateAddress)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.changeTemplateAddress,\n templateAddress\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n}\n","import veOceanABI from '@oceanprotocol/contracts/artifacts/contracts/ve/veOCEAN.vy/veOCEAN.json'\nimport { sendTx } from '../../utils/ContractUtils.js'\nimport { SmartContractWithAddress } from '../SmartContractWithAddress.js'\nimport { ReceiptOrEstimate, AbiItem } from '../../@types/index.js'\nimport BigNumber from 'bignumber.js'\n/**\n * Provides an interface for veOcean contract\n */\nexport class VeOcean extends SmartContractWithAddress {\n getDefaultAbi() {\n return veOceanABI.abi as AbiItem[]\n }\n\n /**\n * Deposit `amount` tokens for `userAddress` and lock until `unlockTime`\n * @param {String} amount Amount of tokens to be locked\n * @param {Number} unlockTime Timestamp for unlock\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async lockTokens<G extends boolean = false>(\n amount: string,\n unlockTime: number,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const amountFormatted = await this.amountToUnits(await this.getToken(), amount)\n const estGas = await this.contract.create_lock.estimateGas(\n amountFormatted,\n unlockTime\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n // Invoke function of the contract\n const trxReceipt = await sendTx(\n BigInt(new BigNumber(estGas).plus(20000n).toString()),\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.create_lock,\n amountFormatted,\n unlockTime\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Deposit `amount` tokens for `toAddress` and add to the existing lock\n * Anyone (even a smart contract) can deposit for someone else, but cannot extend their locktime and deposit for a brand new user\n * @param {String} toAddress user address to deposit for\n * @param {String} amount Amount of tokens to be locked\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async depositFor<G extends boolean = false>(\n toAddress: string,\n amount: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const amountFormatted = await this.amountToUnits(await this.getToken(), amount)\n const estGas = await this.contract.deposit_for.estimateGas(toAddress, amountFormatted)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n // Invoke function of the contract\n const trxReceipt = await sendTx(\n BigInt(new BigNumber(estGas).plus(20000n).toString()),\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.deposit_for,\n toAddress,\n amountFormatted\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Deposit `amount` additional tokens for `userAddress` without modifying the unlock time\n * @param {String} amount Amount of tokens to be locked\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async increaseAmount<G extends boolean = false>(\n amount: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const amountFormatted = await this.amountToUnits(await this.getToken(), amount)\n const estGas = await this.contract.increase_amount.estimateGas(amountFormatted)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n // Invoke function of the contract\n const trxReceipt = await sendTx(\n BigInt(new BigNumber(estGas).plus(20000n).toString()),\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.increase_amount,\n amountFormatted\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Extend the unlock time for `userAddress` to `unlockTime`\n * @param {Number} unlockTime Timestamp for new unlock time\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async increaseUnlockTime<G extends boolean = false>(\n unlockTime: number,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const estGas = await this.contract.increase_unlock_time.estimateGas(unlockTime)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n // Invoke function of the contract\n const trxReceipt = await sendTx(\n BigInt(new BigNumber(estGas).plus(20000n).toString()),\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.increase_unlock_time,\n unlockTime\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Withdraw all tokens for `userAddress`\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async withdraw<G extends boolean = false>(\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const estGas = await this.contract.withdraw.estimateGas()\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n // Invoke function of the contract\n const trxReceipt = await sendTx(\n BigInt(new BigNumber(estGas).plus(20000n).toString()),\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.withdraw\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /** Get voting power for address\n * @param {String} userAddress user address\n * @return {Promise<number>}\n */\n public async getVotingPower(userAddress: string): Promise<number> {\n const balance = await this.contract.balanceOf(userAddress)\n return Number(balance)\n }\n\n /** Get locked balance\n * @param {String} userAddress user address\n * @return {Promise<string>}\n */\n public async getLockedAmount(userAddress: string): Promise<string> {\n const balance = await this.contract.locked(userAddress)\n const balanceFormated = await this.unitsToAmount(\n await this.getToken(),\n balance.amount.toString()\n )\n\n return balanceFormated\n }\n\n /** Get untilLock for address\n * @param {String} userAddress user address\n * @return {Promise<number>}\n */\n public async lockEnd(userAddress: string): Promise<number> {\n const untilLock = await this.contract.locked__end(userAddress)\n return parseInt(untilLock.toString())\n }\n\n /** Get total supply\n * @return {Promise<number>}\n */\n public async totalSupply(): Promise<string> {\n const supplyFormated = await this.unitsToAmount(\n await this.getToken(),\n await this.contract.totalSupply()\n )\n return supplyFormated\n }\n\n /** Get token\n * @return {Promise<string>}\n */\n public async getToken(): Promise<string> {\n const tokenAddress = await this.contract.token()\n return tokenAddress\n }\n}\n","import veFeeABI from '@oceanprotocol/contracts/artifacts/contracts/ve/veFeeDistributor.vy/veFeeDistributor.json'\nimport { sendTx } from '../../utils/ContractUtils.js'\nimport { SmartContractWithAddress } from '../SmartContractWithAddress.js'\nimport { ReceiptOrEstimate, AbiItem } from '../../@types/index.js'\nimport BigNumber from 'bignumber.js'\n/**\n * Provides an interface for veOcean contract\n */\nexport class VeFeeDistributor extends SmartContractWithAddress {\n getDefaultAbi() {\n return veFeeABI.abi as AbiItem[]\n }\n\n /**\n * Claim fees for `userAddress`\n * Each call to claim look at a maximum of 50 user veOCEAN points.\n For accounts with many veOCEAN related actions, this function\n may need to be called more than once to claim all available\n fees. In the `Claimed` event that fires, if `claim_epoch` is\n less than `max_epoch`, the account may claim again\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async claim<G extends boolean = false>(\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const estGas = await this.contract.claim.estimateGas()\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n // Invoke function of the contract\n const trxReceipt = await sendTx(\n BigInt(new BigNumber(estGas).plus(20000n).toString()),\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.claim\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Make multiple fee claims in a single call\n Used to claim for many accounts at once, or to make\n multiple claims for the same address when that address\n has significant veOCEAN history\n * @param {String} addresses array of addresses to claim\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async claimMany<G extends boolean = false>(\n addresses: string[],\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const estGas = await this.contract.claim_many.estimateGas(addresses)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n // Invoke function of the contract\n const trxReceipt = await sendTx(\n BigInt(new BigNumber(estGas).plus(20000n).toString()),\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.claim_many,\n addresses\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n}\n","import veFeeEstimate from '@oceanprotocol/contracts/artifacts/contracts/ve/veFeeEstimate.vy/veFeeEstimate.json'\nimport { SmartContractWithAddress } from '../SmartContractWithAddress.js'\nimport { VeOcean } from './VeOcean.js'\nimport { AbiItem } from '../../@types/index.js'\n/**\n * Provides an interface for veOcean contract\n */\nexport class VeFeeEstimate extends SmartContractWithAddress {\n getDefaultAbi() {\n return veFeeEstimate.abi as AbiItem[]\n }\n\n /**\n * estimateClaim\n * @param {String} userAddress user address\n * @return {Promise<string>}\n */\n public async estimateClaim(userAddress: string): Promise<string> {\n const amount = await this.contract.estimateClaim(userAddress)\n const veOcean = new VeOcean(await this.contract.voting_escrow(), this.signer)\n const amountFormated = await this.unitsToAmount(await veOcean.getToken(), amount)\n return amountFormated\n }\n}\n","import veAllocateABI from '@oceanprotocol/contracts/artifacts/contracts/ve/veAllocate.sol/veAllocate.json'\nimport { sendTx } from '../../utils/ContractUtils.js'\nimport { SmartContractWithAddress } from '../SmartContractWithAddress.js'\nimport { ReceiptOrEstimate, AbiItem } from '../../@types/index.js'\nimport BigNumber from 'bignumber.js'\n\n/**\n * Provides an interface for veOcean contract\n */\nexport class VeAllocate extends SmartContractWithAddress {\n getDefaultAbi() {\n return veAllocateABI.abi as AbiItem[]\n }\n\n /**\n * set a specific percentage of veOcean to a specific nft\n * Maximum allocated percentage is 10000, so 1% is specified as 100\n * @param {String} amount Percentage used\n * @param {String} nft NFT address to allocate to\n * @param {String} chainId chainId of NFT\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async setAllocation<G extends boolean = false>(\n amount: string,\n nft: string,\n chainId: number,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const estGas = await this.contract.setAllocation.estimateGas(amount, nft, chainId)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n // Invoke function of the contract\n const trxReceipt = await sendTx(\n BigInt(new BigNumber(estGas).plus(20000n).toString()),\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.setAllocation,\n amount,\n nft,\n chainId\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * set specific percentage of veOcean to multiple nfts\n * Maximum allocated percentage is 10000, so 1% is specified as 100\n * @param {String[]} amount Array of percentages used\n * @param {String[]} nft Array of NFT addresses\n * @param {String[]} chainId Array of chainIds\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async setBatchAllocation<G extends boolean = false>(\n amount: string[],\n nft: string[],\n chainId: number[],\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const estGas = await this.contract.setBatchAllocation.estimateGas(\n amount,\n nft,\n chainId\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n // Invoke function of the contract\n const trxReceipt = await sendTx(\n BigInt(new BigNumber(estGas).plus(20000n).toString()),\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.setBatchAllocation,\n amount,\n nft,\n chainId\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /** Get totalAllocation for address\n * @param {String} userAddress user address\n * @return {Promise<number>}\n */\n public async getTotalAllocation(userAddress: string): Promise<number> {\n const allocation = await this.contract.getTotalAllocation(userAddress)\n return Number(allocation)\n }\n\n /** Get getveAllocation for address, nft, chainId\n * @param {String} userAddress user address\n * @param {String} nft NFT address to allocate to\n * @param {String} chainId chainId of NFT\n * @return {Promise<number>}\n */\n public async getVeAllocation(\n userAddress: string,\n nft: string,\n chainId: string\n ): Promise<number> {\n const allocation = await this.contract.getveAllocation(userAddress, nft, chainId)\n return Number(allocation)\n }\n}\n","import dfRewardsABI from '@oceanprotocol/contracts/artifacts/contracts/df/DFRewards.sol/DFRewards.json'\nimport { sendTx } from '../../utils/ContractUtils.js'\nimport { SmartContractWithAddress } from '../SmartContractWithAddress.js'\nimport { AbiItem, ReceiptOrEstimate } from '../../@types'\n\n/**\n * Provides an interface for DFRewards contract\n */\nexport class DfRewards extends SmartContractWithAddress {\n getDefaultAbi() {\n return dfRewardsABI.abi as AbiItem[]\n }\n\n /** Get available DF Rewards for a token\n * @param {String} userAddress user address\n * @param {String} tokenAddress token address\n * @return {Promise<string>}\n */\n public async getAvailableRewards(\n userAddress: string,\n tokenAddress: string\n ): Promise<string> {\n const rewards = await this.contract.claimable(userAddress, tokenAddress)\n const rewardsFormated = await this.unitsToAmount(tokenAddress, rewards)\n\n return rewardsFormated\n }\n\n /**\n * claim rewards for any address\n * @param {String} userAddress user address to claim\n * @param {String} tokenAddress token address\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async claimRewards<G extends boolean = false>(\n userAddress: string,\n tokenAddress: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const estGas = await this.contract.claimFor.estimateGas(userAddress, tokenAddress)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n // Invoke function of the contract\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.claimFor,\n userAddress,\n tokenAddress\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * allocate rewards to address. An approve must exist before calling this function.\n * @param {String[]} userAddresses array of users that will receive rewards\n * @param {String[]} amounts array of amounts\n * @param {String} tokenAddress token address\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async allocateRewards<G extends boolean = false>(\n userAddresses: string[],\n amounts: string[],\n tokenAddress: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n for (let i = 0; i < amounts.length; i++) {\n amounts[i] = await this.amountToUnits(tokenAddress, amounts[i])\n }\n const estGas = await this.contract.allocate.estimateGas(\n userAddresses,\n amounts,\n tokenAddress\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n // Invoke function of the contract\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.allocate,\n userAddresses,\n amounts,\n tokenAddress\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n}\n","import dfStrategyV1ABI from '@oceanprotocol/contracts/artifacts/contracts/df/DFStrategyV1.sol/DFStrategyV1.json'\nimport { sendTx } from '../../utils/ContractUtils.js'\nimport { SmartContractWithAddress } from '../SmartContractWithAddress.js'\nimport { ReceiptOrEstimate, AbiItem } from '../../@types'\n/**\n * Provides an interface for dfStrategyV1 contract\n */\nexport class DfStrategyV1 extends SmartContractWithAddress {\n getDefaultAbi() {\n return dfStrategyV1ABI.abi as AbiItem[]\n }\n\n /** Get available DF Rewards for multiple tokens\n * @param {String} userAddress user address\n * @param {String} tokenAddresses array of tokens\n * @return {Promise<string[]>}\n */\n public async getMultipleAvailableRewards(\n userAddress: string,\n tokenAddresses: string[]\n ): Promise<string[]> {\n const rewards = await this.contract.claimables(userAddress, tokenAddresses)\n const rewardsFormated: string[] = []\n for (let i = 0; i < rewards.length; i++) {\n rewardsFormated.push(await this.unitsToAmount(tokenAddresses[i], rewards[i]))\n }\n return rewardsFormated\n }\n\n /**\n * claim multiple token rewards for any address\n * @param {String} userAddress user address to claim\n * @param {String} tokenAddresses array of tokens\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async claimMultipleRewards<G extends boolean = false>(\n userAddress: string,\n tokenAddresses: string[],\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const estGas = await this.contract.claimMultiple.estimateGas(\n userAddress,\n tokenAddresses\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n // Invoke function of the contract\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.claimMultiple,\n userAddress,\n tokenAddresses\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n}\n","import { Signer, getAddress, parseEther } from 'ethers'\nimport Escrow from '@oceanprotocol/contracts/artifacts/contracts/escrow/Escrow.sol/Escrow.json'\nimport { amountToUnits, sendTx } from '../utils/ContractUtils'\nimport { AbiItem, ReceiptOrEstimate, ValidationResponse } from '../@types'\nimport { Config } from '../config'\nimport { SmartContractWithAddress } from './SmartContractWithAddress'\nimport { Datatoken } from './Datatoken'\nimport BigNumber from 'bignumber.js'\n\nexport class EscrowContract extends SmartContractWithAddress {\n public abiEnterprise: AbiItem[]\n\n getDefaultAbi() {\n return Escrow.abi as AbiItem[]\n }\n\n /**\n * Instantiate AccessList class\n * @param {string} address The contract address.\n * @param {Signer} signer The signer object.\n * @param {string | number} [network] Network id or name\n * @param {Config} [config] The configuration object.\n * @param {AbiItem[]} [abi] ABI array of the smart contract\n * @param {AbiItem[]} abiEnterprise Enterprise ABI array of the smart contract\n */\n constructor(\n address: string,\n signer: Signer,\n network?: string | number,\n config?: Config,\n abi?: AbiItem[]\n ) {\n super(address, signer, network, config, abi)\n this.abi = abi || this.getDefaultAbi()\n }\n\n /**\n * Get Funds\n * @return {Promise<any>} Funds\n */\n public async getFunds(token: string): Promise<any> {\n return await this.contract.getFunds(token)\n }\n\n /**\n * Get User Funds\n * @return {Promise<any>} User funds\n */\n public async getUserFunds(payer: string, token: string): Promise<any> {\n return await this.contract.getUserFunds(payer, token)\n }\n\n /**\n * Get User Tokens\n * @return {Promise<any>} Array of tokens\n */\n public async getUserTokens(payer: string): Promise<any> {\n return await this.contract.getUserTokens(payer)\n }\n\n /**\n * Get Locks\n * @return {Promise<[]>} Locks\n */\n public async getLocks(token: string, payer: string, payee: string): Promise<any[]> {\n return await this.contract.getLocks(token, payer, payee)\n }\n\n /**\n * Get Authorizations\n * @return {Promise<[]>} Authorizations\n */\n public async getAuthorizations(\n token: string,\n payer: string,\n payee: string\n ): Promise<any[]> {\n return await this.contract.getAuthorizations(token, payer, payee)\n }\n\n /**\n * Checks funds for escrow payment.\n * Does authorization when needed.\n * Does deposit when needed.\n * @param {String} token as payment token for escrow\n * @param {String} consumerAddress as consumerAddress for that environment\n * @param {String} amountToDeposit wanted amount for escrow lock deposit. If this is\n * not provided and funds for escrow are 0 -> fallback to maxLockedAmount, else\n * use balance of payment token.\n * @param {String} maxLockedAmount amount necessary to be paid for starting compute job,\n * returned from initialize compute payment and used for authorize if needed.\n * @param {String} maxLockSeconds max seconds to lock the payment,\n * returned from initialize compute payment and used for authorize if needed.\n * @param {String} maxLockCounts max lock counts,\n * returned from initialize compute payment and used for authorize if needed.\n * @return {Promise<ValidationResponse>} validation response\n */\n public async verifyFundsForEscrowPayment(\n token: string,\n consumerAddress: string,\n amountToDeposit?: string,\n maxLockedAmount?: string,\n maxLockSeconds?: string,\n maxLockCounts?: string\n ): Promise<ValidationResponse> {\n const balanceNativeToken = await this.signer.provider?.getBalance(\n getAddress(consumerAddress)\n )\n if (new BigNumber(balanceNativeToken).isZero()) {\n return {\n isValid: false,\n message: 'Native token balance is 0. Please add funds'\n }\n }\n const tokenContract = new Datatoken(this.signer)\n const allowance = await tokenContract.allowance(\n token,\n await this.signer.getAddress(),\n this.contract.target.toString()\n )\n if (\n new BigNumber(await this.amountToUnits(token, allowance, 18)).isLessThan(\n new BigNumber(maxLockedAmount)\n )\n ) {\n await tokenContract.approve(\n getAddress(token),\n getAddress(this.contract.target.toString()),\n maxLockedAmount\n )\n }\n const balancePaymentToken = await tokenContract.balance(\n token,\n await this.signer.getAddress()\n )\n if (new BigNumber(balancePaymentToken).isZero()) {\n return {\n isValid: false,\n message: 'Payment token balance is 0. Please add funds'\n }\n }\n const auths = await this.getAuthorizations(\n token,\n await this.signer.getAddress(),\n consumerAddress\n )\n const funds = await this.getUserFunds(await this.signer.getAddress(), token)\n if (new BigNumber(funds[0]).isZero()) {\n if (\n amountToDeposit &&\n new BigNumber(parseEther(balancePaymentToken)).isLessThanOrEqualTo(\n new BigNumber(parseEther(amountToDeposit))\n ) &&\n new BigNumber(parseEther(amountToDeposit)).isGreaterThan(\n new BigNumber(maxLockedAmount)\n )\n ) {\n await this.deposit(token, amountToDeposit)\n } else if (\n new BigNumber(parseEther(balancePaymentToken)).isLessThanOrEqualTo(\n new BigNumber(parseEther(maxLockedAmount))\n )\n ) {\n await this.deposit(token, await this.unitsToAmount(token, maxLockedAmount))\n } else {\n await this.deposit(token, balancePaymentToken)\n }\n }\n if (auths.length === 0) {\n await this.authorize(\n getAddress(token),\n getAddress(consumerAddress),\n (Number(maxLockedAmount) / 2).toString(),\n maxLockSeconds,\n maxLockCounts\n )\n }\n return {\n isValid: true,\n message: ''\n }\n }\n\n /**\n * Deposit funds\n * @param {String} token Token address\n * @param {String} amount amount\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} returns the transaction receipt or the estimateGas value\n */\n public async deposit<G extends boolean = false>(\n token: string,\n amount: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const amountParsed = amountToUnits(null, null, amount, 18)\n const estGas = await this.contract.deposit.estimateGas(token, amountParsed)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.deposit,\n token,\n amountParsed\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Withdraw funds\n * @param {String[]} tokens Array of token addresses\n * @param {String[]} amounts Array of token amounts\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} returns the transaction receipt or the estimateGas value\n */\n public async withdraw<G extends boolean = false>(\n tokens: string[],\n amounts: string[],\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n // check if funds exist in escrow in order to be withdrawed\n const tokensWithSufficientFunds = []\n const amountsWithSufficientFunds = []\n\n if (tokens.length !== amounts.length) {\n throw new Error('Tokens and amounts arrays must have the same length')\n }\n\n const userAddress = await this.signer.getAddress()\n\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i]\n const amount = new BigNumber(amounts[i])\n\n const funds = await this.getUserFunds(userAddress, token)\n const available = new BigNumber(funds[0])\n\n if (amount.isGreaterThan(0) && amount.isLessThanOrEqualTo(available)) {\n tokensWithSufficientFunds.push(token)\n amountsWithSufficientFunds.push(amounts[i])\n } else {\n console.log(`Insufficient funds for token ${token}`)\n }\n }\n const amountsParsed = amountsWithSufficientFunds.map((amount) =>\n amountToUnits(null, null, amount, 18)\n )\n\n const estGas = await this.contract.withdraw.estimateGas(tokens, amountsParsed)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.withdraw,\n tokensWithSufficientFunds,\n amountsParsed\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Authorize locks\n * @param {String} token Token address\n * @param {String} payee,\n * @param {String} maxLockedAmount,\n * @param {String} maxLockSeconds,\n * @param {String} maxLockCounts,\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} returns the transaction receipt or the estimateGas value\n */\n public async authorize<G extends boolean = false>(\n token: string,\n payee: string,\n maxLockedAmount: string,\n maxLockSeconds: string,\n maxLockCounts: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const auths = await this.getAuthorizations(\n token,\n await this.signer.getAddress(),\n payee\n )\n if (auths.length !== 0) {\n console.log(`Payee ${payee} already authorized`)\n return null\n }\n const maxLockedAmountParsed = amountToUnits(null, null, maxLockedAmount, 18)\n const maxLockSecondsParsed = amountToUnits(null, null, maxLockSeconds, 18)\n const maxLockCountsParsed = amountToUnits(null, null, maxLockCounts, 18)\n const estGas = await this.contract.authorize.estimateGas(\n token,\n payee,\n maxLockedAmountParsed,\n maxLockSecondsParsed,\n maxLockCountsParsed\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.authorize,\n token,\n payee,\n maxLockedAmountParsed,\n maxLockSecondsParsed,\n maxLockCountsParsed\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Cancel expired locks\n * @param {String} jobId Job ID with hash\n * @param {String} token Token address\n * @param {String} payee, Payee address for the compute job,\n * @param {String} payer, Payer address for the compute job\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} returns the transaction receipt or the estimateGas value\n */\n public async cancelExpiredLocks<G extends boolean = false>(\n jobIds: string[],\n tokens: string[],\n payers: string[],\n payees: string[],\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const estGas = await this.contract.cancelExpiredLocks.estimateGas(\n jobIds,\n tokens,\n payers,\n payees\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.cancelExpiredLocks,\n jobIds,\n tokens,\n payers,\n payees\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n}\n","/**\n * Simple blocking sleep function\n * @param {number} ms - Number of milliseconds to wait\n */\nexport async function sleep(ms: number) {\n return new Promise((resolve) => {\n setTimeout(resolve, ms)\n })\n}\n\nexport function isDefined(something: any): boolean {\n return something !== undefined && something !== null\n}\n","import { JsonRpcSigner, Signer, getBytes, keccak256, toUtf8Bytes } from 'ethers'\nimport { LoggerInstance } from './Logger'\n\n/**\n * Signs the hash of a message using the provided signer.\n * @param {Signer} signer - The signer to use for signing the hash.\n * @param {string} message - The message to sign.\n * @returns {Promise<string>} - A Promise that resolves to the signature of the hash of the message.\n */\nexport async function signHash(signer: Signer, message: string) {\n // Since ganache has no support yet for personal_sign, we must use the legacy implementation\n // const signedMessage = await user2.signMessage(message)\n\n const messageHashBytes = getBytes(message)\n let signedMessage = await (signer as JsonRpcSigner)._legacySignMessage(messageHashBytes)\n signedMessage = signedMessage.substr(2) // remove 0x\n const r = '0x' + signedMessage.slice(0, 64)\n const s = '0x' + signedMessage.slice(64, 128)\n let v = '0x' + signedMessage.slice(128, 130)\n if (v === '0x00') v = '0x1b'\n if (v === '0x01') v = '0x1c'\n\n return { v, r, s }\n}\n\nexport async function signRequest(signer: Signer, message: string): Promise<string> {\n const consumerMessage = keccak256(toUtf8Bytes(message))\n const messageHashBytes = getBytes(consumerMessage)\n if (!signer.provider) {\n throw new Error('Provider is required but not available')\n }\n const { chainId } = await signer.provider.getNetwork()\n try {\n return await signer.signMessage(messageHashBytes)\n } catch (error) {\n LoggerInstance.error('Sign message error: ', error)\n if (Number(chainId) === 8996) {\n console.log('Signing message with _legacySignMessage')\n return await (signer as JsonRpcSigner)._legacySignMessage(messageHashBytes)\n }\n }\n}\n","import fetch from 'cross-fetch'\nimport { LoggerInstance } from '../utils/Logger'\nimport { sleep } from '../utils/General.js'\nimport { Signer } from 'ethers'\nimport { signRequest } from '../utils/SignatureUtils.js'\nimport { Asset, DDO, DDOManager, ValidateMetadata } from '@oceanprotocol/ddo-js'\n\nexport interface SearchQuery {\n from?: number\n size?: number\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n query: any\n sort?: { [jsonPath: string]: string }\n aggs?: any\n}\n\nexport class Aquarius {\n public aquariusURL: string\n\n /**\n * Instantiate Aquarius\n * @param {String} aquariusURL\n */\n constructor(aquariusURL: string) {\n this.aquariusURL = aquariusURL\n }\n\n /** Resolves a DID\n * @param {string} did DID of the asset.\n * @param {AbortSignal} signal abort signal\n * @return {Promise<Asset>} Asset\n */\n public async resolve(\n did: string,\n signal?: AbortSignal,\n authorization?: string\n ): Promise<Asset> {\n const path = this.aquariusURL + '/api/aquarius/assets/ddo/' + did\n try {\n const response = await fetch(path, {\n method: 'GET',\n headers: { 'Content-Type': 'application/json', Authorization: authorization },\n signal\n })\n\n if (response.ok) {\n const raw = await response.json()\n return raw as Asset\n } else {\n throw new Error('HTTP request failed with status ' + response.status)\n }\n } catch (e) {\n LoggerInstance.error(e)\n throw new Error('HTTP request failed')\n }\n }\n\n /**\n * Blocks until Indexer will cache the did (or the update for that did) or timeouts\n * @param {string} did DID of the asset.\n * @param {string} txid used when the did exists and we expect an update with that txid.\n * @param {AbortSignal} signal abort signal\n * @return {Promise<Asset>} DDO of the asset.\n */\n public async waitForIndexer(\n did: string,\n txid?: string,\n signal?: AbortSignal,\n interval: number = 30000,\n maxRetries: number = 100,\n authorization?: string\n ): Promise<Asset> {\n let tries = 0\n // lets have a cap to prevent possible abuse as well\n if (maxRetries > 500) {\n LoggerInstance.warn('Max Limit exceeded, defaulting to 500 retries.')\n maxRetries = 500\n }\n do {\n try {\n const path = this.aquariusURL + '/api/aquarius/assets/ddo/' + did\n const response = await fetch(path, {\n method: 'GET',\n headers: { 'Content-Type': 'application/json', Authorization: authorization },\n signal\n })\n if (response.ok) {\n const ddo = await response.json()\n const ddoInstance = DDOManager.getDDOClass(ddo)\n const { indexedMetadata } = ddoInstance.getAssetFields()\n if (txid) {\n // check tx\n if (indexedMetadata.event && indexedMetadata.event.txid === txid)\n return ddo as Asset\n } else return ddo as Asset\n }\n } catch (e) {\n // do nothing\n }\n await sleep(interval)\n tries++\n } while (tries < maxRetries)\n return null\n }\n\n /**\n * Validate DDO content\n * @param {DDO} ddo DID Descriptor Object content.\n * @param {signer} ddo publisher account.\n * @param {providerUrl} provider url used to get the nonce.\n * @param {AbortSignal} signal abort signal\n * @return {Promise<ValidateMetadata>}.\n */\n public async validate(\n ddo: DDO,\n signer: Signer,\n providerUrl: string,\n signal?: AbortSignal,\n authorization?: string\n ): Promise<ValidateMetadata> {\n const ddoValidateRoute = providerUrl + '/api/aquarius/assets/ddo/validate'\n const pathNonce = providerUrl + '/api/services/nonce'\n\n try {\n const publisherAddress = await signer.getAddress()\n // aquarius is always same url of other components with ocean nodes\n const responseNonce = await fetch(pathNonce + `?userAddress=${publisherAddress}`, {\n method: 'GET',\n headers: { 'Content-Type': 'application/json', Authorization: authorization },\n signal\n })\n let { nonce } = await responseNonce.json()\n console.log(`[getNonce] Consumer: ${publisherAddress} nonce: ${nonce}`)\n if (!nonce || nonce === null) {\n nonce = '0'\n }\n const nextNonce = (Number(nonce) + 1).toString() // have to increase the previous\n // same signed message as usual (did + nonce)\n // the node will only validate (add his signature if there fields are present and are valid)\n // let signatureMessage = publisherAddress\n const signatureMessage = publisherAddress + nextNonce\n const signature = await signRequest(signer, signatureMessage)\n const data = { ddo, publisherAddress, nonce: nextNonce, signature }\n const response = await fetch(ddoValidateRoute, {\n method: 'POST',\n body: JSON.stringify(data),\n headers: {\n 'Content-Type': 'application/octet-stream',\n Authorization: authorization\n },\n signal\n })\n const jsonResponse = await response.json()\n if (response.status !== 200) {\n throw new Error('Metadata validation failed')\n }\n console.log('Ddo successfully validated')\n\n return {\n valid: true,\n hash: jsonResponse.hash,\n proof: {\n validatorAddress: jsonResponse.publicKey,\n r: jsonResponse.r[0],\n s: jsonResponse.s[0],\n v: jsonResponse.v\n }\n }\n } catch (e) {\n LoggerInstance.error('Metadata validation failed', e.message)\n }\n }\n\n /**\n * Search over the DDOs using a query.\n * @param {string} did DID of the asset\n * @param {AbortSignal} signal abort signal\n * @return {Promise<QueryResult>}\n */\n public async getAssetMetadata(\n did: string,\n signal?: AbortSignal,\n authorization?: string\n ): Promise<any> {\n const path = this.aquariusURL + '/api/aquarius/assets/metadata/' + did\n\n try {\n const response = await fetch(path, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: authorization\n },\n signal\n })\n\n if (response.ok) {\n return response.json()\n } else {\n throw new Error(\n 'getAssetMetadata failed: ' + response.status + response.statusText\n )\n }\n } catch (error) {\n LoggerInstance.error('Error getting metadata: ', error)\n throw new Error('Error getting metadata: ' + error)\n }\n }\n\n /**\n * Search over the DDOs using a query.\n * @param {SearchQuery} query Query to filter the DDOs.\n * @param {AbortSignal} signal abort signal\n * @return {Promise<QueryResult>}\n */\n public async querySearch(\n query: SearchQuery,\n signal?: AbortSignal,\n authorization?: string\n ): Promise<any> {\n const path = this.aquariusURL + '/api/aquarius/assets/query'\n\n try {\n const response = await fetch(path, {\n method: 'POST',\n body: JSON.stringify(query),\n headers: {\n 'Content-Type': 'application/json',\n Authorization: authorization\n },\n signal\n })\n\n if (response.ok) {\n return response.json()\n } else {\n throw new Error('querySearch failed: ' + response.status + response.statusText)\n }\n } catch (error) {\n LoggerInstance.error('Error querying metadata: ', error)\n throw new Error('Error querying metadata: ' + error)\n }\n }\n}\n","import fetch from 'cross-fetch'\nimport { ethers, JsonRpcSigner, Signer, toUtf8Bytes } from 'ethers'\nimport { LoggerInstance } from '../utils/Logger.js'\nimport {\n Arweave,\n FileInfo,\n ComputeJob,\n ComputeOutput,\n ComputeAlgorithm,\n ComputeAsset,\n ComputeEnvironment,\n ProviderInitialize,\n ProviderComputeInitializeResults,\n ServiceEndpoint,\n UrlFile,\n UserCustomParameters,\n Ipfs,\n ComputeResourceRequest,\n ComputePayment,\n ComputeJobMetadata,\n PolicyServerInitializeCommand,\n PolicyServerPassthroughCommand\n} from '../@types'\nimport { decodeJwt } from '../utils/Jwt.js'\n\nexport class Provider {\n private async getConsumerAddress(signerOrAuthToken: Signer | string): Promise<string> {\n const isAuthToken = typeof signerOrAuthToken === 'string'\n return isAuthToken\n ? decodeJwt(signerOrAuthToken).address\n : await signerOrAuthToken.getAddress()\n }\n\n private async getSignature(\n signerOrAuthToken: Signer | string,\n message: string\n ): Promise<string | null> {\n const isAuthToken = typeof signerOrAuthToken === 'string'\n return isAuthToken ? null : await this.signProviderRequest(signerOrAuthToken, message)\n }\n\n private getAuthorization(signerOrAuthToken: Signer | string): string | undefined {\n const isAuthToken = typeof signerOrAuthToken === 'string'\n return isAuthToken ? signerOrAuthToken : undefined\n }\n\n /**\n * Returns the provider endpoints\n * @param {string} providerUri - the provider url\n * @return {Promise<any>}\n */\n async getEndpoints(providerUri: string, authorization?: string): Promise<any> {\n try {\n const endpoints = await this.getData(providerUri, authorization)\n return await endpoints.json()\n } catch (e) {\n LoggerInstance.error('Finding the service endpoints failed:', e)\n throw new Error('HTTP request failed calling Provider')\n }\n }\n\n /**\n * This function returns the endpoint URL for a given service name.\n * @param {ServiceEndpoint[]} servicesEndpoints - The array of service endpoints\n * @param {string} serviceName - The name of the service\n * @returns {ServiceEndpoint} The endpoint URL for the given service name\n */\n getEndpointURL(\n servicesEndpoints: ServiceEndpoint[],\n serviceName: string\n ): ServiceEndpoint {\n if (!servicesEndpoints) return null\n return servicesEndpoints.find(\n (s) => s.serviceName.toLowerCase() === serviceName.toLowerCase()\n ) as ServiceEndpoint\n }\n\n /**\n * This function returns an array of service endpoints for a given provider endpoint.\n * @param {string} providerEndpoint - The provider endpoint\n * @param {any} endpoints - The endpoints object\n * @returns {ServiceEndpoint[]} An array of service endpoints\n */\n public async getServiceEndpoints(providerEndpoint: string, endpoints: any) {\n const serviceEndpoints: ServiceEndpoint[] = []\n for (const i in endpoints.serviceEndpoints) {\n const endpoint: ServiceEndpoint = {\n serviceName: i,\n method: endpoints.serviceEndpoints[i][0],\n urlPath:\n providerEndpoint.replace(/\\/+$/, '') +\n '/' +\n endpoints.serviceEndpoints[i][1].replace(/^\\/+/, '')\n }\n serviceEndpoints.push(endpoint)\n }\n return serviceEndpoints\n }\n\n /**\n * Get current nonce from the provider.\n * @param {string} providerUri provider uri address\n * @param {string} consumerAddress Publisher address\n * @param {AbortSignal} signal abort signal\n * @param {string} providerEndpoints Identifier of the asset to be registered in ocean\n * @param {string} serviceEndpoints document description object (DDO)=\n * @return {Promise<string>} urlDetails\n */\n public async getNonce(\n providerUri: string,\n consumerAddress: string,\n signal?: AbortSignal,\n providerEndpoints?: any,\n serviceEndpoints?: ServiceEndpoint[]\n ): Promise<number> {\n if (!providerEndpoints) {\n providerEndpoints = await this.getEndpoints(providerUri)\n }\n if (!serviceEndpoints) {\n serviceEndpoints = await this.getServiceEndpoints(providerUri, providerEndpoints)\n }\n const path = this.getEndpointURL(serviceEndpoints, 'nonce')\n ? this.getEndpointURL(serviceEndpoints, 'nonce').urlPath\n : null\n if (!path) return null\n try {\n const response = await fetch(path + `?userAddress=${consumerAddress}`, {\n method: 'GET',\n headers: { 'Content-Type': 'application/json' },\n signal\n })\n const { nonce } = await response.json()\n console.log(`[getNonce] Consumer: ${consumerAddress} nonce: ${nonce}`)\n const sanitizedNonce = !nonce || nonce === null ? 0 : Number(nonce)\n return sanitizedNonce\n } catch (e) {\n LoggerInstance.error(e)\n throw new Error(e.message)\n }\n }\n\n /**\n * Sign a provider request with a signer.\n * @param {Signer} signer - The signer to use.\n * @param {string} message - The message to sign.\n * @returns {Promise<string>} A promise that resolves with the signature.\n */\n public async signProviderRequest(signer: Signer, message: string): Promise<string> {\n // const isMetaMask = web3 && web3.currentProvider && (web3.currentProvider as any).isMetaMask\n // if (isMetaMask) return await web3.eth.personal.sign(consumerMessage, accountId, password)\n // await web3.eth.sign(consumerMessage, await signer.getAddress())\n const consumerMessage = ethers.keccak256(toUtf8Bytes(message))\n const messageHashBytes = ethers.getBytes(consumerMessage)\n try {\n return await signer.signMessage(messageHashBytes)\n } catch (error) {\n // LoggerInstance.error('Sign provider message error: ', error)\n // Check if the user is using barge chain\n const network = await signer.provider.getNetwork()\n const chainId = Number(network.chainId)\n if (chainId === 8996) {\n return await (signer as JsonRpcSigner)._legacySignMessage(messageHashBytes)\n }\n }\n }\n\n /**\n * Encrypt data using the Provider's own symmetric key\n * @param {string} data data in json format that needs to be sent , it can either be a DDO or a File array\n * @param {number} chainId network's id so provider can choose the corresponding Signer object\n * @param {string} providerUri provider uri address\n * @param {AbortSignal} signal abort signal\n * @return {Promise<string>} urlDetails\n */\n public async encrypt(\n data: any,\n chainId: number,\n providerUri: string,\n signal?: AbortSignal\n ): Promise<string> {\n const providerEndpoints = await this.getEndpoints(providerUri)\n const serviceEndpoints = await this.getServiceEndpoints(\n providerUri,\n providerEndpoints\n )\n const path =\n (this.getEndpointURL(serviceEndpoints, 'encrypt')\n ? this.getEndpointURL(serviceEndpoints, 'encrypt').urlPath\n : null) + `?chainId=${chainId}`\n if (!path) return null\n try {\n const response = await fetch(path, {\n method: 'POST',\n body: JSON.stringify(data),\n headers: { 'Content-Type': 'application/octet-stream' },\n signal\n })\n return await response.text()\n } catch (e) {\n LoggerInstance.error(e)\n throw new Error('HTTP request failed calling Provider')\n }\n }\n\n /**\n * Get file details for a given DID and service ID.\n * @param {string} did - The DID to check.\n * @param {string} serviceId - The service ID to check.\n * @param {string} providerUri - The URI of the provider.\n * @param {boolean} [withChecksum=false] - Whether or not to include a checksum.\n * @param {AbortSignal} [signal] - An optional abort signal.\n * @returns {Promise<FileInfo[]>} A promise that resolves with an array of file info objects.\n */\n public async checkDidFiles(\n did: string,\n serviceId: string,\n providerUri: string,\n withChecksum: boolean = false,\n signal?: AbortSignal\n ): Promise<FileInfo[]> {\n const providerEndpoints = await this.getEndpoints(providerUri)\n const serviceEndpoints = await this.getServiceEndpoints(\n providerUri,\n providerEndpoints\n )\n const args = { did, serviceId, checksum: withChecksum }\n const files: FileInfo[] = []\n const path = this.getEndpointURL(serviceEndpoints, 'fileinfo')\n ? this.getEndpointURL(serviceEndpoints, 'fileinfo').urlPath\n : null\n if (!path) return null\n let response\n try {\n response = await fetch(path, {\n method: 'POST',\n body: JSON.stringify(args),\n headers: { 'Content-Type': 'application/json' },\n signal\n })\n } catch (e) {\n LoggerInstance.error('File info call failed: ')\n LoggerInstance.error(e)\n throw new Error(e)\n }\n if (response?.ok) {\n const results: FileInfo[] = await response.json()\n for (const result of results) {\n files.push(result)\n }\n return files\n }\n const resolvedResponse = await response.json()\n LoggerInstance.error(\n 'File info call failed: ',\n response.status,\n response.statusText,\n resolvedResponse\n )\n throw new Error(JSON.stringify(resolvedResponse))\n }\n\n /**\n * Get File details (if possible)\n * @param {UrlFile | Arweave | Ipfs | GraphqlQuery | Smartcontract} file one of the supported file structures\n * @param {string} providerUri uri of the provider that will be used to check the file\n * @param {boolean} [withChecksum=false] - Whether or not to include a checksum.\n * @param {AbortSignal} [signal] - An optional abort signal.\n * @returns {Promise<FileInfo[]>} A promise that resolves with an array of file info objects.\n */\n public async getFileInfo(\n file: UrlFile | Arweave | Ipfs,\n providerUri: string,\n withChecksum: boolean = false,\n signal?: AbortSignal\n ): Promise<FileInfo[]> {\n const providerEndpoints = await this.getEndpoints(providerUri)\n const serviceEndpoints = await this.getServiceEndpoints(\n providerUri,\n providerEndpoints\n )\n const args = { ...file, checksum: withChecksum }\n const files: FileInfo[] = []\n const path = this.getEndpointURL(serviceEndpoints, 'fileinfo')\n ? this.getEndpointURL(serviceEndpoints, 'fileinfo').urlPath\n : null\n if (!path) return null\n let response\n try {\n response = await fetch(path, {\n method: 'POST',\n body: JSON.stringify(args),\n headers: { 'Content-Type': 'application/json' },\n signal\n })\n } catch (e) {\n LoggerInstance.error('File info call failed: ')\n LoggerInstance.error(e)\n throw new Error(e)\n }\n if (response?.ok) {\n const results: FileInfo[] = await response.json()\n for (const result of results) {\n files.push(result)\n }\n return files\n }\n const resolvedResponse = await response.json()\n LoggerInstance.error(\n 'File info call failed: ',\n response.status,\n response.statusText,\n resolvedResponse\n )\n throw new Error(JSON.stringify(resolvedResponse))\n }\n\n /**\n * Returns compute environments from a provider.\n * @param {string} providerUri - The URI of the provider.\n * @param {AbortSignal} [signal] - An optional abort signal.\n * @returns {Promise<{[chainId: number]: ComputeEnvironment[]}>} A promise that resolves with an object containing compute environments for each chain ID.\n */\n public async getComputeEnvironments(\n providerUri: string,\n signal?: AbortSignal\n ): Promise<ComputeEnvironment[]> {\n const providerEndpoints = await this.getEndpoints(providerUri)\n const serviceEndpoints = await this.getServiceEndpoints(\n providerUri,\n providerEndpoints\n )\n const path = this.getEndpointURL(serviceEndpoints, 'computeEnvironments')?.urlPath\n if (!path) return null\n let response\n try {\n response = await fetch(path, {\n method: 'GET',\n headers: { 'Content-Type': 'application/json' },\n signal\n })\n } catch (e) {\n LoggerInstance.error('Fetch compute env failed: ')\n LoggerInstance.error(e)\n throw new Error(e)\n }\n if (response?.ok) {\n const result = response.json()\n // chain is not part of response\n // if (Array.isArray(result)) {\n // const providerChain: number = providerEndpoints.chainId\n // return { [providerChain]: result }\n // }\n return result\n }\n const resolvedResponse = await response.json()\n LoggerInstance.error(\n 'Fetch compute env failed: ',\n response.status,\n response.statusText,\n resolvedResponse\n )\n throw new Error(JSON.stringify(resolvedResponse))\n }\n\n /**\n * Initializes the provider for a service request.\n * @param {string} did - The asset DID .\n * @param {string} serviceId - The asset service ID.\n * @param {number} fileIndex - The file index.\n * @param {string} consumerAddress - The consumer address.\n * @param {string} providerUri - The URI of the provider.\n * @param {AbortSignal} [signal] - The abort signal if any.\n * @param {UserCustomParameters} [userCustomParameters] - The custom parameters if any.\n * @param {string} [computeEnv] - The compute environment if any.\n * @param {number} [validUntil] - The validity time if any.\n * @returns {Promise<ProviderInitialize>} A promise that resolves with ProviderInitialize response.\n */\n public async initialize(\n did: string,\n serviceId: string,\n fileIndex: number,\n consumerAddress: string,\n providerUri: string,\n signal?: AbortSignal,\n userCustomParameters?: UserCustomParameters,\n computeEnv?: string,\n validUntil?: number\n ): Promise<ProviderInitialize> {\n const providerEndpoints = await this.getEndpoints(providerUri)\n const serviceEndpoints = await this.getServiceEndpoints(\n providerUri,\n providerEndpoints\n )\n let initializeUrl = this.getEndpointURL(serviceEndpoints, 'initialize')\n ? this.getEndpointURL(serviceEndpoints, 'initialize').urlPath\n : null\n\n if (!initializeUrl) return null\n initializeUrl += `?documentId=${did}`\n initializeUrl += `&serviceId=${serviceId}`\n initializeUrl += `&fileIndex=${fileIndex}`\n initializeUrl += `&consumerAddress=${consumerAddress}`\n if (userCustomParameters)\n initializeUrl += '&userdata=' + encodeURI(JSON.stringify(userCustomParameters))\n if (computeEnv) initializeUrl += '&environment=' + encodeURI(computeEnv)\n if (validUntil) initializeUrl += '&validUntil=' + validUntil\n let response\n try {\n response = await fetch(initializeUrl, {\n method: 'GET',\n headers: { 'Content-Type': 'application/json' },\n signal\n })\n } catch (e) {\n LoggerInstance.error('Provider initialized failed: ')\n LoggerInstance.error(e)\n throw new Error(`Provider initialize failed url: ${initializeUrl} `)\n }\n if (response?.status === 200) {\n const results: ProviderInitialize = await response.json()\n return results\n }\n const resolvedResponse = await response.json()\n LoggerInstance.error(\n 'Provider initialized failed: ',\n response.status,\n response.statusText,\n resolvedResponse\n )\n throw new Error(JSON.stringify(resolvedResponse))\n }\n\n /** Initializes the provider for a compute request.\n * @param {ComputeAsset[]} assets The datasets array to initialize compute request.\n * @param {ComputeAlgorithmber} algorithm The algorithm to use.\n * @param {string} computeEnv The compute environment.\n * @param {number} validUntil The job expiration date.\n * @param {string} providerUri The provider URI.\n * @param {string} accountId caller address\n * @param {AbortSignal} signal abort signal\n * @return {Promise<ProviderComputeInitialize>} ProviderComputeInitialize data\n */\n public async initializeComputeV1(\n assets: ComputeAsset[],\n algorithm: ComputeAlgorithm,\n computeEnv: string,\n providerUri: string,\n accountId: string,\n chainId: number,\n token: string,\n maxJobDuration: number,\n signal?: AbortSignal\n ): Promise<ProviderComputeInitializeResults> {\n const providerEndpoints = await this.getEndpoints(providerUri)\n const serviceEndpoints = await this.getServiceEndpoints(\n providerUri,\n providerEndpoints\n )\n const payment: ComputePayment = {\n chainId,\n token,\n maxJobDuration\n }\n const payload: Object = {\n datasets: assets,\n algorithm,\n payment,\n consumerAddress: accountId,\n environment: computeEnv\n }\n const initializeUrl = this.getEndpointURL(serviceEndpoints, 'initializeCompute')\n ? this.getEndpointURL(serviceEndpoints, 'initializeCompute').urlPath\n : null\n if (!initializeUrl) return null\n let response\n try {\n response = await fetch(initializeUrl, {\n method: 'POST',\n body: JSON.stringify(payload),\n headers: { 'Content-Type': 'application/json' },\n signal\n })\n } catch (e) {\n LoggerInstance.error('Initialize compute failed: ')\n LoggerInstance.error(e)\n throw new Error('ComputeJob cannot be initialized')\n }\n if (response?.ok) {\n const params = await response.json()\n return params\n }\n const resolvedResponse = await response.json()\n LoggerInstance.error(\n 'Initialize compute failed: ',\n response.status,\n response.statusText,\n resolvedResponse\n )\n LoggerInstance.error('Payload was:', JSON.stringify(payload))\n throw new Error(JSON.stringify(resolvedResponse))\n }\n\n /** Initializes the provider for a compute request.\n * @param {ComputeAsset[]} assets The datasets array to initialize compute request.\n * @param {ComputeAlgorithmber} algorithm The algorithm to use.\n * @param {string} computeEnv The compute environment.\n * @param {string} token The payment token address.\n * @param {number} validUntil The job expiration date.\n * @param {string} providerUri The provider URI.\n * @param {SignerOrAuthToken} signerOrAuthToken Signer or auth token\n * @param {ComputeResourceRequest[]} resources The resources to start compute job with.\n * @param {number} chainId The chain used to do payments\n * @param {any} policyServer Policy server data.\n * @param {AbortSignal} signal abort signal\n * @return {Promise<ProviderComputeInitialize>} ProviderComputeInitialize data\n */\n public async initializeCompute(\n assets: ComputeAsset[],\n algorithm: ComputeAlgorithm,\n computeEnv: string,\n token: string,\n validUntil: number,\n providerUri: string,\n signerOrAuthToken: Signer | string,\n resources: ComputeResourceRequest[],\n chainId: number,\n policyServer?: any,\n signal?: AbortSignal\n ): Promise<ProviderComputeInitializeResults> {\n const providerEndpoints = await this.getEndpoints(providerUri)\n const serviceEndpoints = await this.getServiceEndpoints(\n providerUri,\n providerEndpoints\n )\n const initializeUrl = this.getEndpointURL(serviceEndpoints, 'initializeCompute')\n ? this.getEndpointURL(serviceEndpoints, 'initializeCompute').urlPath\n : null\n if (!initializeUrl) return null\n\n // Diff from V1. We might need a signature to get the files object, specially if dealing with confidential evm and template 4\n // otherwise it can be ignored\n const consumerAddress = await this.getConsumerAddress(signerOrAuthToken)\n const nonce = (\n (await this.getNonce(\n providerUri,\n consumerAddress,\n signal,\n providerEndpoints,\n serviceEndpoints\n )) + 1\n ).toString()\n\n // same signed message as for start compute (consumer address + did[0] + nonce)\n let signatureMessage = consumerAddress\n signatureMessage += assets[0]?.documentId\n signatureMessage += nonce\n const signature = await this.getSignature(signerOrAuthToken, signatureMessage)\n\n const providerData: Record<string, any> = {\n datasets: assets,\n algorithm,\n environment: computeEnv,\n payment: {\n chainId,\n token,\n resources\n },\n maxJobDuration: validUntil,\n consumerAddress,\n signature\n }\n\n if (policyServer) providerData.policyServer = policyServer\n\n let response\n try {\n console.log('Initialize compute url:', initializeUrl)\n response = await fetch(initializeUrl, {\n method: 'POST',\n body: JSON.stringify(providerData),\n headers: {\n 'Content-Type': 'application/json',\n Authorization: this.getAuthorization(signerOrAuthToken)\n },\n signal\n })\n console.log('Raw response:', response)\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`${errorText}`)\n }\n } catch (e) {\n LoggerInstance.error('Initialize compute failed: ')\n LoggerInstance.error(e)\n throw new Error(`ComputeJob cannot be initialized: ${e.message}.`)\n }\n if (response?.ok) {\n const params = await response.json()\n return params\n }\n const resolvedResponse = await response.json()\n LoggerInstance.error(\n 'Initialize compute failed: ',\n response.status,\n response.statusText,\n resolvedResponse\n )\n LoggerInstance.error('Payload was:', JSON.stringify(providerData))\n throw new Error(JSON.stringify(resolvedResponse))\n }\n\n /**\n * Gets the download URL.\n * @param {string} did - The DID.\n * @param {string} serviceId - The service ID.\n * @param {number} fileIndex - The file index.\n * @param {string} transferTxId - The transfer transaction ID.\n * @param {string} providerUri - The provider URI.\n * @param {SignerOrAuthToken} signerOrAuthToken - The signer or auth token.\n * @param {any} policyServer Policy server data.\n * @param {UserCustomParameters} userCustomParameters - The user custom parameters.\n * @returns {Promise<any>} The download URL.\n */\n public async getDownloadUrl(\n did: string,\n serviceId: string,\n fileIndex: number,\n transferTxId: string,\n providerUri: string,\n signerOrAuthToken: Signer | string,\n policyServer?: any,\n userCustomParameters?: UserCustomParameters\n ): Promise<any> {\n const providerEndpoints = await this.getEndpoints(providerUri)\n const serviceEndpoints = await this.getServiceEndpoints(\n providerUri,\n providerEndpoints\n )\n const downloadUrl = this.getEndpointURL(serviceEndpoints, 'download')\n ? this.getEndpointURL(serviceEndpoints, 'download').urlPath\n : null\n if (!downloadUrl) return null\n const consumerAddress = await this.getConsumerAddress(signerOrAuthToken)\n const nonce = (\n (await this.getNonce(\n providerUri,\n consumerAddress,\n null,\n providerEndpoints,\n serviceEndpoints\n )) + 1\n ).toString()\n\n const signature = await this.getSignature(signerOrAuthToken, did + nonce)\n let consumeUrl = downloadUrl\n consumeUrl += `?fileIndex=${fileIndex}`\n consumeUrl += `&documentId=${did}`\n consumeUrl += `&transferTxId=${transferTxId}`\n consumeUrl += `&serviceId=${serviceId}`\n consumeUrl += `&consumerAddress=${consumerAddress}`\n consumeUrl += `&nonce=${nonce}`\n if (policyServer) {\n consumeUrl += '&policyServer=' + encodeURI(JSON.stringify(policyServer))\n }\n\n consumeUrl += `&signature=${signature}`\n if (userCustomParameters)\n consumeUrl += '&userdata=' + encodeURI(JSON.stringify(userCustomParameters))\n return consumeUrl\n }\n\n /** Instruct the provider to start a compute job (Old C2D V1) Kept for now, for backwards compatibility\n * @param {string} providerUri The provider URI.\n * @param {Signer} signer The consumer signer object.\n * @param {string} computeEnv The compute environment.\n * @param {ComputeAsset} dataset The dataset to start compute on\n * @param {ComputeAlgorithm} algorithm The algorithm to start compute with.\n * @param {AbortSignal} signal abort signal\n * @param {ComputeAsset[]} additionalDatasets The additional datasets if that is the case.\n * @param {ComputeOutput} output The compute job output settings.\n * @return {Promise<ComputeJob | ComputeJob[]>} The compute job or jobs.\n * @deprecated Use {@link computeStart} instead.\n */\n public async computeStartV1(\n providerUri: string,\n consumer: Signer,\n computeEnv: string,\n dataset: ComputeAsset,\n algorithm: ComputeAlgorithm,\n signal?: AbortSignal,\n additionalDatasets?: ComputeAsset[],\n output?: ComputeOutput\n ): Promise<ComputeJob | ComputeJob[]> {\n const providerEndpoints = await this.getEndpoints(providerUri)\n const serviceEndpoints = await this.getServiceEndpoints(\n providerUri,\n providerEndpoints\n )\n const computeStartUrl = this.getEndpointURL(serviceEndpoints, 'computeStart')\n ? this.getEndpointURL(serviceEndpoints, 'computeStart').urlPath\n : null\n\n const consumerAddress = await consumer.getAddress()\n const nonce = (\n (await this.getNonce(\n providerUri,\n consumerAddress,\n signal,\n providerEndpoints,\n serviceEndpoints\n )) + 1\n ).toString()\n\n let signatureMessage = consumerAddress\n signatureMessage += dataset.documentId\n signatureMessage += nonce\n const signature = await this.signProviderRequest(consumer, signatureMessage)\n const payload = Object()\n payload.consumerAddress = consumerAddress\n payload.signature = signature\n payload.nonce = nonce\n payload.environment = computeEnv\n payload.dataset = dataset\n payload.algorithm = algorithm\n if (additionalDatasets) payload.additionalDatasets = additionalDatasets\n if (output) payload.output = output\n if (!computeStartUrl) return null\n let response\n try {\n response = await fetch(computeStartUrl, {\n method: 'POST',\n body: JSON.stringify(payload),\n headers: { 'Content-Type': 'application/json' },\n signal\n })\n } catch (e) {\n LoggerInstance.error('Compute start failed:')\n LoggerInstance.error(e)\n LoggerInstance.error('Payload was:', payload)\n throw new Error('HTTP request failed calling Provider')\n }\n if (response?.ok) {\n const params = await response.json()\n return params\n }\n LoggerInstance.error(\n 'Compute start failed: ',\n response.status,\n response.statusText,\n await response.json()\n )\n LoggerInstance.error('Payload was:', payload)\n return null\n }\n\n /** Instruct the provider to start a PAYED compute job (new C2D V2)\n * @param {string} providerUri The provider URI.\n * @param {SignerOrAuthToken} signerOrAuthToken The consumer signer object or auth token.\n * @param {string} computeEnv The compute environment.\n * @param {ComputeAsset} datasets The dataset to start compute on + additionalDatasets (the additional datasets if that is the case)\n * @param {ComputeAlgorithm} algorithm The algorithm to start compute with.\n * @param {number} maxJobDuration The compute job max execution time.\n * @param {string} token The token address for compute payment.\n * @param {ComputeResourceRequest} resources The resources to start compute job with.\n * @param {chainId} chainId The chain used to do payments\n * @param {ComputeJobMetadata} metadata The compute job metadata. Additional metadata to be stored in the database.\n * @param {ComputeOutput} output The compute job output settings.\n * @param {any} policyServer Policy server data.\n * @param {AbortSignal} signal abort signal\n * @return {Promise<ComputeJob | ComputeJob[]>} The compute job or jobs.\n */\n public async computeStart(\n providerUri: string,\n signerOrAuthToken: Signer | string,\n computeEnv: string,\n datasets: ComputeAsset[],\n algorithm: ComputeAlgorithm,\n maxJobDuration: number,\n token: string,\n resources: ComputeResourceRequest[],\n chainId: number, // network used by payment (only for payed compute jobs)\n metadata?: ComputeJobMetadata,\n additionalViewers?: string[],\n output?: ComputeOutput,\n policyServer?: any,\n signal?: AbortSignal\n ): Promise<ComputeJob | ComputeJob[]> {\n console.log('called new compute start method...')\n console.log('datasets: ', datasets)\n console.log('algorithm: ', algorithm)\n const providerEndpoints = await this.getEndpoints(providerUri)\n const serviceEndpoints = await this.getServiceEndpoints(\n providerUri,\n providerEndpoints\n )\n\n const computeStartUrl = this.getEndpointURL(serviceEndpoints, 'computeStart')\n ? this.getEndpointURL(serviceEndpoints, 'computeStart').urlPath\n : null\n\n if (!computeStartUrl) {\n LoggerInstance.error(\n 'Compute start failed: Cannot get proper computeStart route (perhaps not implemented on provider?)'\n )\n return null\n }\n\n const consumerAddress = await this.getConsumerAddress(signerOrAuthToken)\n const nonce = (\n (await this.getNonce(\n providerUri,\n consumerAddress,\n signal,\n providerEndpoints,\n serviceEndpoints\n )) + 1\n ).toString()\n\n let signatureMessage = consumerAddress\n signatureMessage += datasets[0]?.documentId\n signatureMessage += nonce\n const signature = await this.getSignature(signerOrAuthToken, signatureMessage)\n const payload = Object()\n payload.consumerAddress = consumerAddress\n payload.signature = signature\n payload.nonce = nonce\n payload.environment = computeEnv\n payload.maxJobDuration = maxJobDuration\n payload.resources = resources\n // kept for backwards compatibility (tests running against existing provider)\n payload.dataset = datasets[0]\n // new field for C2D v2\n payload.datasets = datasets\n payload.algorithm = algorithm\n payload.chainId = chainId\n payload.payment = {\n chainId,\n token,\n maxJobDuration\n }\n if (resources) payload.payment.resources = resources\n if (metadata) payload.metadata = metadata\n if (additionalViewers) payload.additionalViewers = additionalViewers\n // if (additionalDatasets) payload.additionalDatasets = additionalDatasets\n if (output) payload.output = output\n if (policyServer) payload.policyServer = policyServer\n let response\n try {\n response = await fetch(computeStartUrl, {\n method: 'POST',\n body: JSON.stringify(payload),\n headers: {\n 'Content-Type': 'application/json',\n Authorization: this.getAuthorization(signerOrAuthToken)\n },\n signal\n })\n } catch (e) {\n LoggerInstance.error('Compute start failed:')\n LoggerInstance.error(e)\n LoggerInstance.error('Payload was:', payload)\n throw new Error('HTTP request failed calling Provider')\n }\n if (response?.ok) {\n const params = await response.json()\n return params\n }\n LoggerInstance.error(\n 'Compute start failed: ',\n response.status,\n response.statusText,\n await response.json()\n )\n LoggerInstance.error('Payload was:', payload)\n return null\n }\n\n /** Instruct the provider to start a FREE compute job (new C2D V2)\n * @param {string} providerUri The provider URI.\n * @param {SignerOrAuthToken} signerOrAuthToken The consumer signer object or auth token.\n * @param {string} computeEnv The compute environment.\n * @param {ComputeAsset} datasets The dataset to start compute on + additionalDatasets (the additional datasets if that is the case)\n * @param {ComputeAlgorithm} algorithm The algorithm to start compute with.\n * @param {ComputeResourceRequest} resources The resources to start compute job with.\n * @param {ComputeJobMetadata} metadata The compute job metadata. Additional metadata to be stored in the database.\n * @param {ComputeOutput} output The compute job output settings.\n * @param {any} policyServer Policy server data.\n * @param {AbortSignal} signal abort signal\n * @return {Promise<ComputeJob | ComputeJob[]>} The compute job or jobs.\n */\n public async freeComputeStart(\n providerUri: string,\n signerOrAuthToken: Signer | string,\n computeEnv: string,\n datasets: ComputeAsset[],\n algorithm: ComputeAlgorithm,\n resources?: ComputeResourceRequest[],\n metadata?: ComputeJobMetadata,\n additionalViewers?: string[],\n output?: ComputeOutput,\n policyServer?: any,\n signal?: AbortSignal\n ): Promise<ComputeJob | ComputeJob[]> {\n console.log('called new free compute start method...')\n console.log('datasets: ', datasets)\n console.log('algorithm: ', algorithm)\n const providerEndpoints = await this.getEndpoints(providerUri)\n const serviceEndpoints = await this.getServiceEndpoints(\n providerUri,\n providerEndpoints\n )\n\n const computeStartUrl = this.getEndpointURL(serviceEndpoints, 'freeCompute')\n ? this.getEndpointURL(serviceEndpoints, 'freeCompute').urlPath\n : null\n\n if (!computeStartUrl) {\n LoggerInstance.error(\n 'Compute start failed: Cannot get proper computeStart route (perhaps not implemented on provider?)'\n )\n return null\n }\n\n const consumerAddress = await this.getConsumerAddress(signerOrAuthToken)\n const nonce = (\n (await this.getNonce(\n providerUri,\n consumerAddress,\n signal,\n providerEndpoints,\n serviceEndpoints\n )) + 1\n ).toString()\n\n const signatureMessage = nonce // datasets[0].documentId\n console.log('signatureMessage: ', signatureMessage)\n const signature = await this.getSignature(signerOrAuthToken, signatureMessage)\n const payload = Object()\n payload.consumerAddress = consumerAddress\n payload.signature = signature\n payload.nonce = nonce\n payload.environment = computeEnv\n payload.resources = resources\n // kept for backwards compatibility (tests running against existing provider)\n payload.dataset = datasets[0]\n // new field for C2D v2\n payload.datasets = datasets\n payload.algorithm = algorithm\n if (metadata) payload.metadata = metadata\n if (additionalViewers) payload.additionalViewers = additionalViewers\n // if (additionalDatasets) payload.additionalDatasets = additionalDatasets\n payload.output = output\n if (policyServer) payload.policyServer = policyServer\n let response\n try {\n response = await fetch(computeStartUrl, {\n method: 'POST',\n body: JSON.stringify(payload),\n headers: {\n 'Content-Type': 'application/json',\n Authorization: this.getAuthorization(signerOrAuthToken)\n },\n signal\n })\n } catch (e) {\n LoggerInstance.error('Compute start failed:')\n LoggerInstance.error(e)\n LoggerInstance.error('Payload was:', payload)\n throw new Error('HTTP request failed calling Provider')\n }\n if (response?.ok) {\n const params = await response.json()\n return params\n }\n LoggerInstance.error(\n 'Compute start failed: ',\n response.status,\n response.statusText,\n await response.json()\n )\n LoggerInstance.error('Payload was:', payload)\n return null\n }\n\n /**\n *\n * @param providerUri provider URL\n * @param signerOrAuthToken signer or auth token\n * @param jobId jobId\n * @param signal abort signal\n * @returns logs response\n */\n public async computeStreamableLogs(\n providerUri: string,\n signerOrAuthToken: Signer | string,\n jobId: string,\n signal?: AbortSignal\n ): Promise<any> {\n const isAuthToken = typeof signerOrAuthToken === 'string'\n const providerEndpoints = await this.getEndpoints(providerUri)\n const serviceEndpoints = await this.getServiceEndpoints(\n providerUri,\n providerEndpoints\n )\n\n const computeStreamableLogs = this.getEndpointURL(\n serviceEndpoints,\n 'computeStreamableLogs'\n )\n ? this.getEndpointURL(serviceEndpoints, 'computeStreamableLogs').urlPath\n : null\n\n if (!computeStreamableLogs) {\n LoggerInstance.error(\n 'Compute start failed: Cannot get proper computeStreamableLogs route (perhaps not implemented on provider?)'\n )\n return null\n }\n const consumerAddress = await this.getConsumerAddress(signerOrAuthToken)\n const nonce = (\n (await this.getNonce(\n providerUri,\n consumerAddress,\n signal,\n providerEndpoints,\n serviceEndpoints\n )) + 1\n ).toString()\n\n let url = `?consumerAddress=${consumerAddress}&jobId=${jobId}`\n // Is signer, add signature and nonce\n if (!isAuthToken) {\n const signatureMessage = `${consumerAddress}${jobId}${nonce}`\n const signature = await this.getSignature(signerOrAuthToken, signatureMessage)\n url += `&signature=${signature}`\n url += `&nonce=${nonce}`\n }\n\n let response\n try {\n response = await fetch(computeStreamableLogs + url, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: this.getAuthorization(signerOrAuthToken)\n },\n signal\n })\n console.log('Raw response:', response)\n } catch (e) {\n LoggerInstance.error('computeStreamableLogs failed:')\n LoggerInstance.error(e)\n throw new Error('HTTP request failed calling Provider')\n }\n if (response?.ok || response?.status === 200) {\n // do not handle the response here\n console.log('Response body:', response.body)\n return response.body\n }\n LoggerInstance.error(\n 'computeStreamableLogs failed: ',\n response.status,\n response.statusText,\n await response.json()\n )\n return null\n }\n\n public async getComputeStartRoutes(\n providerUri: string,\n isFreeCompute: boolean = false\n ): Promise<string | null> {\n const providerEndpoints = await this.getEndpoints(providerUri)\n const serviceEndpoints = await this.getServiceEndpoints(\n providerUri,\n providerEndpoints\n )\n let computeStartUrl = null\n if (isFreeCompute) {\n computeStartUrl = this.getEndpointURL(serviceEndpoints, 'freeCompute')\n ? this.getEndpointURL(serviceEndpoints, 'freeCompute').urlPath\n : null\n } else {\n computeStartUrl = this.getEndpointURL(serviceEndpoints, 'computeStart')\n ? this.getEndpointURL(serviceEndpoints, 'computeStart').urlPath\n : null\n }\n return computeStartUrl\n }\n\n /** Instruct the provider to Stop the execution of a to stop a compute job.\n * @param {string} jobId the compute job id\n * @param {string} providerUri The provider URI.\n * @param {SignerOrAuthToken} signerOrAuthToken The consumer signer or auth token.\n * @param {string} agreementId The agreement id.\n * @param {AbortSignal} signal abort signal\n * @return {Promise<ComputeJob | ComputeJob[]>}\n */\n public async computeStop(\n jobId: string,\n providerUri: string,\n signerOrAuthToken: Signer | string,\n agreementId?: string,\n signal?: AbortSignal\n ): Promise<ComputeJob | ComputeJob[]> {\n const providerEndpoints = await this.getEndpoints(providerUri)\n const serviceEndpoints = await this.getServiceEndpoints(\n providerUri,\n providerEndpoints\n )\n const computeStopUrl = this.getEndpointURL(serviceEndpoints, 'computeStop')\n ? this.getEndpointURL(serviceEndpoints, 'computeStop').urlPath\n : null\n\n const consumerAddress = await this.getConsumerAddress(signerOrAuthToken)\n\n const nonce = (\n (await this.getNonce(\n providerUri,\n consumerAddress,\n signal,\n providerEndpoints,\n serviceEndpoints\n )) + 1\n ).toString()\n\n const signatureMessage = consumerAddress + (jobId || '')\n // On current provider impl (and nodes) we DO NOT check this signature\n // On nodes we are signing again just the Nonce to send the request to Operator Service\n // on current provider we sign: {owner}{job_id}{nonce}\" OR {owner}{nonce} if no jobId\n // On provider service STOP route, we just check signature owner + jobId OR just owner if no jobId\n // signatureMessage += (agreementId && `${this.noZeroX(agreementId)}`) || ''\n // signatureMessage += nonce\n const signature = await this.getSignature(signerOrAuthToken, signatureMessage)\n const queryParams = new URLSearchParams()\n queryParams.set('consumerAddress', consumerAddress)\n queryParams.set('signature', signature)\n queryParams.set('nonce', nonce)\n queryParams.set('jobId', jobId)\n if (agreementId) queryParams.set('agreementId', agreementId)\n\n const queryString = queryParams.toString()\n if (!queryString) return null\n let response\n try {\n response = await fetch(computeStopUrl + '?' + queryString, {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: this.getAuthorization(signerOrAuthToken)\n },\n signal\n })\n } catch (e) {\n LoggerInstance.error('Compute stop failed:')\n LoggerInstance.error(e)\n throw new Error('HTTP request failed calling Provider')\n }\n\n if (response?.ok) {\n const params = await response.json()\n return params\n }\n const resolvedResponse = await response.json()\n LoggerInstance.error(\n 'Compute stop failed: ',\n response.status,\n response.statusText,\n resolvedResponse\n )\n throw new Error(JSON.stringify(resolvedResponse))\n }\n\n /** Get compute status for a specific jobId/documentId/owner.\n * @param {string} providerUri The URI of the provider we want to query\n * @param {string} consumerAddress The consumer ethereum address\n * @param {string} jobId The ID of a compute job.\n * @param {string} agreementId The ID of the service agreement (tx id)\n * @param {AbortSignal} signal abort signal\n * @return {Promise<ComputeJob | ComputeJob[]>}\n */\n public async computeStatus(\n providerUri: string,\n consumerAddress: string,\n jobId?: string,\n agreementId?: string,\n signal?: AbortSignal,\n authorization?: string\n ): Promise<ComputeJob | ComputeJob[]> {\n const providerEndpoints = await this.getEndpoints(providerUri)\n const serviceEndpoints = await this.getServiceEndpoints(\n providerUri,\n providerEndpoints\n )\n const computeStatusUrl = this.getEndpointURL(serviceEndpoints, 'computeStatus')\n ? this.getEndpointURL(serviceEndpoints, 'computeStatus').urlPath\n : null\n\n let url = `?consumerAddress=${consumerAddress}`\n url += (agreementId && `&agreementId=${agreementId}`) || '' // ${this.noZeroX(agreementId)} #https://github.com/oceanprotocol/ocean.js/issues/1892\n url += (jobId && `&jobId=${jobId}`) || ''\n\n if (!computeStatusUrl) return null\n let response\n try {\n console.log('computeStatusUrl: ', computeStatusUrl + url)\n response = await fetch(computeStatusUrl + url, {\n method: 'GET',\n headers: { 'Content-Type': 'application/json', Authorization: authorization },\n signal\n })\n } catch (e) {\n LoggerInstance.error('Get compute status failed')\n LoggerInstance.error(e)\n throw new Error(e)\n }\n if (response?.ok) {\n const params = await response.json()\n return params\n }\n LoggerInstance.error(\n 'Get compute status failed:',\n response.status,\n response.statusText\n )\n if (response?.ok) {\n const params = await response.json()\n return params\n }\n const resolvedResponse = await response.json()\n LoggerInstance.error(\n 'Get compute status failed:',\n response.status,\n response.statusText,\n resolvedResponse\n )\n throw new Error(JSON.stringify(resolvedResponse))\n }\n\n /** Get compute result url\n * @param {string} providerUri The URI of the provider we want to query\n * @param {SignerOrAuthToken} signerOrAuthToken signer or auth token\n * @param {string} jobId The ID of a compute job.\n * @param {number} index Result index\n * @return {Promise<string>}\n */\n public async getComputeResultUrl(\n providerUri: string,\n signerOrAuthToken: Signer | string,\n jobId: string,\n index: number\n ): Promise<string> {\n const isAuthToken = typeof signerOrAuthToken === 'string'\n const providerEndpoints = await this.getEndpoints(providerUri)\n const serviceEndpoints = await this.getServiceEndpoints(\n providerUri,\n providerEndpoints\n )\n const computeResultUrl = this.getEndpointURL(serviceEndpoints, 'computeResult')\n ? this.getEndpointURL(serviceEndpoints, 'computeResult').urlPath\n : null\n\n const consumerAddress = await this.getConsumerAddress(signerOrAuthToken)\n const nonce = (\n (await this.getNonce(\n providerUri,\n consumerAddress,\n null,\n providerEndpoints,\n serviceEndpoints\n )) + 1\n ).toString()\n let signatureMessage = consumerAddress\n signatureMessage += jobId\n signatureMessage += index.toString()\n signatureMessage += nonce\n const signature = await this.getSignature(signerOrAuthToken, signatureMessage)\n if (!computeResultUrl) return null\n let resultUrl = computeResultUrl\n resultUrl += `?consumerAddress=${consumerAddress}`\n resultUrl += `&jobId=${jobId}`\n resultUrl += `&index=${index.toString()}`\n if (!isAuthToken) {\n resultUrl += `&nonce=${nonce}`\n resultUrl += `&signature=${signature}`\n }\n return resultUrl\n }\n\n /** Deletes a compute job.\n * @param {string} did asset did\n * @param {SignerOrAuthToken} signerOrAuthToken signer or auth token\n * @param {string} jobId the compute job ID\n * @param {string} providerUri The URI of the provider we want to query\n * @param {AbortSignal} signal abort signal\n * @return {Promise<ComputeJob | ComputeJob[]>}\n */\n public async computeDelete(\n did: string,\n signerOrAuthToken: Signer | string,\n jobId: string,\n providerUri: string,\n signal?: AbortSignal\n ): Promise<ComputeJob | ComputeJob[]> {\n const providerEndpoints = await this.getEndpoints(providerUri)\n const serviceEndpoints = await this.getServiceEndpoints(\n providerUri,\n providerEndpoints\n )\n const computeDeleteUrl = this.getEndpointURL(serviceEndpoints, 'computeDelete')\n ? this.getEndpointURL(serviceEndpoints, 'computeDelete').urlPath\n : null\n\n const consumerAddress = await this.getConsumerAddress(signerOrAuthToken)\n const nonce = (\n (await this.getNonce(\n providerUri,\n consumerAddress,\n signal,\n providerEndpoints,\n serviceEndpoints\n )) + 1\n ).toString()\n\n let signatureMessage = consumerAddress\n signatureMessage += jobId || ''\n signatureMessage += (did && `${this.noZeroX(did)}`) || ''\n signatureMessage += nonce\n const signature = await this.getSignature(signerOrAuthToken, signatureMessage)\n const payload = Object()\n payload.documentId = did // this.noZeroX(did) #https://github.com/oceanprotocol/ocean.js/issues/1892\n payload.consumerAddress = consumerAddress\n payload.jobId = jobId\n if (signature) payload.signature = signature\n\n if (!computeDeleteUrl) return null\n let response\n try {\n response = await fetch(computeDeleteUrl, {\n method: 'DELETE',\n body: JSON.stringify(payload),\n headers: {\n 'Content-Type': 'application/json',\n Authorization: this.getAuthorization(signerOrAuthToken)\n },\n signal\n })\n } catch (e) {\n LoggerInstance.error('Delete compute job failed:')\n LoggerInstance.error(e)\n LoggerInstance.error('Payload was:', payload)\n throw new Error('HTTP request failed calling Provider')\n }\n if (response?.ok) {\n const params = await response.json()\n return params\n }\n const resolvedResponse = await response.json()\n LoggerInstance.error(\n 'Delete compute job failed:',\n response.status,\n response.statusText,\n resolvedResponse\n )\n LoggerInstance.error('Payload was:', payload)\n throw new Error(JSON.stringify(resolvedResponse))\n }\n\n /** Generates an auth token\n * @param {Signer} consumer consumer Signer wallet object\n * @param {string} providerUri The URI of the provider we want to query\n * @param {AbortSignal} signal abort signal\n * @return {Promise<ComputeJob | ComputeJob[]>}\n */\n public async generateAuthToken(\n consumer: Signer,\n providerUri: string,\n signal?: AbortSignal\n ): Promise<string> {\n const consumerAddress = await consumer.getAddress()\n const providerEndpoints = await this.getEndpoints(providerUri)\n const serviceEndpoints = await this.getServiceEndpoints(\n providerUri,\n providerEndpoints\n )\n const url = this.getEndpointURL(serviceEndpoints, 'generateAuthToken').urlPath || null\n const nonce = (\n (await this.getNonce(\n providerUri,\n consumerAddress,\n signal,\n providerEndpoints,\n serviceEndpoints\n )) + 1\n ).toString()\n\n const signatureMessage = consumerAddress + nonce\n const signature = await this.signProviderRequest(consumer, signatureMessage)\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n body: JSON.stringify({\n address: consumerAddress,\n signature,\n nonce\n }),\n headers: { 'Content-Type': 'application/json' },\n signal\n })\n\n if (!response?.ok) {\n throw new Error(\n `Failed to generate auth token: ${response.status} ${response.statusText}`\n )\n }\n const params = await response.json()\n return params?.token\n } catch (e) {\n LoggerInstance.error('Generate auth token failed:')\n LoggerInstance.error(e)\n throw new Error('HTTP request failed calling Provider')\n }\n }\n\n /** Generates an auth token\n * @param {Signer} consumer consumer Signer wallet object\n * @param {string} token The auth token to invalidate\n * @param {string} providerUri The URI of the provider we want to query\n * @param {AbortSignal} signal abort signal\n * @return {Promise<ComputeJob | ComputeJob[]>}\n */\n public async invalidateAuthToken(\n consumer: Signer,\n token: string,\n providerUri: string,\n signal?: AbortSignal\n ): Promise<{ success: boolean }> {\n const consumerAddress = await consumer.getAddress()\n const providerEndpoints = await this.getEndpoints(providerUri)\n const serviceEndpoints = await this.getServiceEndpoints(\n providerUri,\n providerEndpoints\n )\n const url =\n this.getEndpointURL(serviceEndpoints, 'invalidateAuthToken').urlPath || null\n const nonce = (\n (await this.getNonce(\n providerUri,\n consumerAddress,\n signal,\n providerEndpoints,\n serviceEndpoints\n )) + 1\n ).toString()\n\n const signatureMessage = consumerAddress + nonce\n const signature = await this.signProviderRequest(consumer, signatureMessage)\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n body: JSON.stringify({\n address: consumerAddress,\n signature,\n token,\n nonce\n }),\n headers: { 'Content-Type': 'application/json' },\n signal\n })\n\n if (!response?.ok) {\n throw new Error(\n `Failed to invalidate auth token: ${response.status} ${response.statusText}`\n )\n }\n const params = await response.json()\n return params\n } catch (e) {\n LoggerInstance.error('Generate auth token failed:')\n LoggerInstance.error(e)\n throw new Error('HTTP request failed calling Provider')\n }\n }\n\n /** Check for a valid provider at URL\n * @param {String} url provider uri address\n * @param {AbortSignal} signal abort signal\n * @return {Promise<boolean>} valid or not\n */\n public async isValidProvider(url: string, signal?: AbortSignal): Promise<boolean> {\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers: { 'Content-Type': 'application/json' },\n signal\n })\n if (response?.ok) {\n const params = await response.json()\n if (params && (params.providerAddress || params.providerAddresses)) return true\n }\n return false\n } catch (error) {\n LoggerInstance.error(`Error validating provider: ${error.message}`)\n return false\n }\n }\n\n /** Sends a PolicyServer request to node to be passthrough to PS\n * @param {string} providerUri The provider URI.\n * @param {PolicyServerPassthroughCommand} request The request to be passed through to the Policy Server.\n * @param {AbortSignal} signal abort signal\n */\n public async PolicyServerPassthrough(\n providerUri: string,\n request: PolicyServerPassthroughCommand,\n signal?: AbortSignal\n ): Promise<any> {\n const providerEndpoints = await this.getEndpoints(providerUri)\n const serviceEndpoints = await this.getServiceEndpoints(\n providerUri,\n providerEndpoints\n )\n const initializeUrl = this.getEndpointURL(serviceEndpoints, 'PolicyServerPassthrough')\n ? this.getEndpointURL(serviceEndpoints, 'PolicyServerPassthrough').urlPath\n : null\n if (!initializeUrl) return null\n\n let response\n try {\n response = await fetch(initializeUrl, {\n method: 'POST',\n body: JSON.stringify(request),\n headers: {\n 'Content-Type': 'application/json'\n },\n signal\n })\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`${errorText}`)\n }\n } catch (e) {\n LoggerInstance.error('PolicyServerPassthrough failed: ')\n LoggerInstance.error(e)\n throw new Error(`PolicyServerPassthrough failed: ${e.message}.`)\n }\n if (response?.ok) {\n const params = await response.json()\n return params\n }\n const resolvedResponse = await response.json()\n LoggerInstance.error(\n 'PolicyServerPassthrough failed: ',\n response.status,\n response.statusText,\n resolvedResponse\n )\n LoggerInstance.error('Payload was:', JSON.stringify(request))\n throw new Error(JSON.stringify(resolvedResponse))\n }\n\n /** Initialize Policy Server verification\n * @param {string} providerUri The provider URI.\n * @param {PolicyServerInitializeCommand} request The request to be sent to the Policy Server.\n * @param {AbortSignal} signal abort signal\n */\n public async initializePSVerification(\n providerUri: string,\n request: PolicyServerInitializeCommand,\n signal?: AbortSignal\n ): Promise<any> {\n const providerEndpoints = await this.getEndpoints(providerUri)\n const serviceEndpoints = await this.getServiceEndpoints(\n providerUri,\n providerEndpoints\n )\n const initializeUrl = this.getEndpointURL(\n serviceEndpoints,\n 'initializePSVerification'\n )\n ? this.getEndpointURL(serviceEndpoints, 'initializePSVerification').urlPath\n : null\n if (!initializeUrl) return null\n\n let response\n try {\n response = await fetch(initializeUrl, {\n method: 'POST',\n body: JSON.stringify(request),\n headers: {\n 'Content-Type': 'application/json'\n },\n signal\n })\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`${errorText}`)\n }\n } catch (e) {\n LoggerInstance.error('initializePSVerification failed: ')\n LoggerInstance.error(e)\n throw new Error(`initializePSVerification failed: ${e.message}.`)\n }\n if (response?.ok) {\n const params = await response.json()\n return params\n }\n const resolvedResponse = await response.json()\n LoggerInstance.error(\n 'initializePSVerification failed: ',\n response.status,\n response.statusText,\n resolvedResponse\n )\n LoggerInstance.error('Payload was:', JSON.stringify(request))\n throw new Error(JSON.stringify(resolvedResponse))\n }\n\n /**\n * Private method that removes the leading 0x from a string.\n * @param {string} input - The input string.\n * @returns The transformed string.\n */\n private noZeroX(input: string): string {\n return this.zeroXTransformer(input, false)\n }\n\n /**\n * Private method that removes the leading 0x from a string.\n * @param {string} input - The input string.\n * @param {boolean} zeroOutput - Whether to include 0x in the output if the input is valid and zeroOutput is true.\n * @returns The transformed string.\n */\n private zeroXTransformer(input = '', zeroOutput: boolean): string {\n const { valid, output } = this.inputMatch(\n input,\n /^(?:0x)*([a-f0-9]+)$/i,\n 'zeroXTransformer'\n )\n return (zeroOutput && valid ? '0x' : '') + output\n }\n\n /**\n * Private method that matches an input string against a regular expression and returns the first capture group.\n * @param {string} input - The input string to match.\n * @param {RegExp} regexp - The regular expression to match against.\n * @param {string} conversorName - The name of the method calling this function.\n * @returns An object with two properties: `valid` (a boolean indicating whether the input matched the regular expression) and `output` (the first capture group of the match, or the original input if there was no match).\n */\n private inputMatch(\n input: string,\n regexp: RegExp,\n conversorName: string\n ): { valid: boolean; output: string } {\n if (typeof input !== 'string') {\n LoggerInstance.debug('Not input string:')\n LoggerInstance.debug(input)\n throw new Error(`[${conversorName}] Expected string, input type: ${typeof input}`)\n }\n const match = input.match(regexp)\n if (!match) {\n LoggerInstance.warn(`[${conversorName}] Input transformation failed.`)\n return { valid: false, output: input }\n }\n return { valid: true, output: match[1] }\n }\n\n /**\n * Private method that fetches data from a URL using the GET method.\n * @param {string} url - The URL to fetch data from.\n * @returns A Promise that resolves to a Response object.\n */\n private async getData(url: string, authorization?: string): Promise<Response> {\n return fetch(url, {\n method: 'GET',\n headers: {\n 'Content-type': 'application/json',\n Authorization: authorization\n }\n })\n }\n}\n\nexport const ProviderInstance = new Provider()\n","import jwt from 'jsonwebtoken'\nimport { JwtPayload } from '../@types/Jwt'\n\nexport function decodeJwt(token: string): JwtPayload {\n try {\n const decoded = jwt.decode(token, { json: true })\n return decoded as JwtPayload\n } catch (error) {\n throw new Error('Error decoding JWT')\n }\n}\n","import Decimal from 'decimal.js'\nimport { ethers, Signer } from 'ethers'\nimport { Config } from '../config/index.js'\nimport { ReceiptOrEstimate, ReceiptOrDecimal } from '../@types/index.js'\nimport { minAbi } from './minAbi.js'\nimport { amountToUnits, sendTx, unitsToAmount } from './ContractUtils.js'\nimport { LoggerInstance } from './Logger.js'\nimport BigNumber from 'bignumber.js'\n\n/**\n * Approve spender to spent amount tokens\n * @param {Signer} signer - The signer object\n * @param {Config} config - The config object\n * @param {string} account - The address of the caller\n * @param {string} tokenAddress - The address of the token\n * @param {string} spender - The address of the spender\n * @param {String} amount amount of ERC20 Datatokens (always expressed as wei)\n * @param {boolean} force if true, will overwrite any previous allowence. Else, will check if allowence is enough and will not send a transaction if it's not needed\n * @param {number} [tokenDecimals] optional number of decimals of the token\n * @param {boolean} [estimateGas] if true, returns the estimate gas cost for calling the method\n */\nexport async function approve<G extends boolean = false>(\n signer: Signer,\n config: Config,\n account: string,\n tokenAddress: string,\n spender: string,\n amount: string,\n force = false,\n tokenDecimals?: number,\n estimateGas?: G\n): Promise<ReceiptOrDecimal<G> | number> {\n const tokenContract = new ethers.Contract(tokenAddress, minAbi, signer)\n if (!force) {\n const currentAllowence = await allowance(signer, tokenAddress, account, spender)\n if (new Decimal(currentAllowence).greaterThanOrEqualTo(new Decimal(amount))) {\n return <ReceiptOrDecimal<G>>new Decimal(currentAllowence).toNumber()\n }\n }\n const amountFormatted = await amountToUnits(signer, tokenAddress, amount, tokenDecimals)\n const estGas = await tokenContract.approve.estimateGas(spender, amountFormatted)\n if (estimateGas) return <ReceiptOrDecimal<G>>(<unknown>new Decimal(estGas.toString()))\n\n const trxReceipt = await sendTx(\n estGas,\n signer,\n config?.gasFeeMultiplier,\n tokenContract.approve,\n spender,\n amountFormatted\n )\n return <ReceiptOrDecimal<G>>trxReceipt\n}\n\n/**\n * Approve spender to spent amount tokens\n * @param {Signer} signer - The signer object\n * @param {Config} config - The config object\n * @param {string} account - The address of the caller\n * @param {string} tokenAddress - The address of the token\n * @param {string} spender - The address of the spender\n * @param {string} amount amount of ERC20 tokens (always expressed as wei)\n * @param {boolean} force if true, will overwrite any previous allowence. Else, will check if allowence is enough and will not send a transaction if it's not needed\n * @param {boolean} [estimateGas] if true, returns the estimate gas cost for calling the method\n */\nexport async function approveWei<G extends boolean = false>(\n signer: Signer,\n config: Config,\n account: string,\n tokenAddress: string,\n spender: string,\n amount: string,\n force = false,\n estimateGas?: G\n): Promise<ReceiptOrEstimate<G>> {\n const tokenContract = new ethers.Contract(tokenAddress, minAbi, signer)\n if (!force) {\n const currentAllowence = await allowanceWei(signer, tokenAddress, account, spender)\n if (new BigNumber(currentAllowence).isGreaterThan(new BigNumber(amount))) {\n return <ReceiptOrEstimate<G>>BigInt(currentAllowence)\n }\n }\n let result = null\n\n const estGas = await tokenContract.approve.estimateGas(spender, amount)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n try {\n result = await sendTx(\n estGas,\n signer,\n config?.gasFeeMultiplier,\n tokenContract.approve,\n spender,\n amount\n )\n } catch (e) {\n LoggerInstance.error(\n `ERROR: Failed to approve spender to spend tokens : ${e.message}`\n )\n }\n return result as ReceiptOrEstimate<G>\n}\n\n/**\n * Moves amount tokens from the caller’s account to recipient.\n * @param {Signer} signer - The signer object\n * @param {Config} config - The config object\n * @param {string} tokenAddress - The address of the token\n * @param {string} recipient - The address of the tokens receiver\n * @param {String} amount amount of ERC20 Datatokens (not as wei)\n * @param {String} estimateGas if true returns the gas estimate\n */\nexport async function transfer<G extends boolean = false>(\n signer: Signer,\n config: Config,\n tokenAddress: string,\n recipient: string,\n amount: string,\n estimateGas?: G\n): Promise<ReceiptOrEstimate<G>> {\n const tokenContract = new ethers.Contract(tokenAddress, minAbi, signer)\n const amountFormatted = await amountToUnits(signer, tokenAddress, amount)\n const estGas = await tokenContract.transfer.estimateGas(recipient, amountFormatted)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n signer,\n config?.gasFeeMultiplier,\n tokenContract.transfer,\n recipient,\n amountFormatted\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n}\n\n/**\n * Get Allowance for any Datatoken\n * @param {Signer} signer - The signer object\n * @param {string} tokenAddress - The address of the token\n * @param {string} account - The address of the caller\n * @param {string} spender - The address of the spender\n * @param {number} tokenDecimals optional number of decimals of the token\n */\nexport async function allowance(\n signer: Signer,\n tokenAddress: string,\n account: string,\n spender: string,\n tokenDecimals?: number\n): Promise<string> {\n const tokenContract = new ethers.Contract(tokenAddress, minAbi, signer)\n const trxReceipt = await tokenContract.allowance(account, spender)\n\n return await unitsToAmount(signer, tokenAddress, trxReceipt, tokenDecimals)\n}\n\n/**\n * Get balance for any Datatoken\n * @param {Signer} signer - The signer object\n * @param {string} tokenAddress - The address of the token\n * @param {string} account - The address of the caller\n * @param {number} [tokenDecimals] optional number of decimals of the token\n */\nexport async function balance(\n signer: Signer,\n tokenAddress: string,\n account: string,\n tokenDecimals?: number\n): Promise<string> {\n const tokenContract = new ethers.Contract(tokenAddress, minAbi, signer)\n const trxReceipt = await tokenContract.balanceOf(account)\n\n return await unitsToAmount(signer, tokenAddress, trxReceipt, tokenDecimals)\n}\n\n/**\n * Get Allowance in wei for any erc20\n * @param {Signer} signer - The signer object\n * @param {string} tokenAddress - The address of the token\n * @param {string} account - The address of the caller\n * @param {string} spender - The address of the spneder\n */\nexport async function allowanceWei(\n signer: Signer,\n tokenAddress: string,\n account: string,\n spender: string\n): Promise<string> {\n const tokenContract = new ethers.Contract(tokenAddress, minAbi, signer)\n return await tokenContract.allowance(account, spender)\n}\n\n/**\n * Get decimals for any Datatoken\n * @param {Signer} signer - The signer object\n * @param {String} tokenAddress - The address of the token\n * @return {Promise<number>} Number of decimals of the token\n */\nexport async function decimals(signer: Signer, tokenAddress: string): Promise<number> {\n const tokenContract = new ethers.Contract(tokenAddress, minAbi, signer)\n const decimals = await tokenContract.decimals()\n return Number(decimals)\n}\n","import { LoggerInstance } from './Logger.js'\n\nconst PREDEFINED_ERRORS = {\n datasets: {\n invalid: 'Datasets is not a list, as expected'\n },\n algorithm: {\n serviceId: {\n missing: 'The serviceId key is missing from the algorithm s DDO.',\n not_found: 'The provided serviceId does not exist.',\n service_not_access_compute: 'Service type is neither access, nor compute.',\n main_service_compute:\n 'If the main service is not compute for this asset when calling initialize endpoint.',\n compute_services_not_in_same_provider:\n 'Files attached to the compute service are not decrypted by the correct provider. This occurs when both asset and algorithm are requested by their compute service which cannot be decrypted by a single provider as how it is supposed to be.'\n },\n container: {\n checksum_prefix: 'Container checksum does not start with the prefix sha256:.',\n mising_entrypoint_image_checksum:\n 'Either entrypoint, either image, or either checksum are missing from the container dictionary from the algorithm s DDO.'\n },\n documentId: {\n did_not_found:\n 'The algorithm s DID could not be retrieved from the metadata store, because the algorithm asset does not exist.',\n missing: 'The documentId key is missing from the algorithm s DDO.'\n },\n transferTxId: {\n missing: 'The transferTxId key is missing from the algorithm s DDO.'\n },\n missing_meta_documentId: 'Either algorithm metadata, or algorithm DID are missing.',\n did_not_found: 'Either algorithm metadata, or algorithm DID are missing.',\n not_algo: 'Either algorithm metadata, or algorithm DID are missing.',\n in_use_or_not_on_chain: 'Either algorithm metadata, or algorithm DID are missing.',\n meta_oneof_url_rawcode_remote:\n 'Either algorithm metadata, or algorithm DID are missing.',\n file_unavailable:\n 'One possibility is that the asset could not be retrieved from Aquariuss database. Otherwise, there are issues related to services'\n },\n error: {\n not_trusted_algo_publisher:\n \"The owner of the algorithm's DDO is not a trusted algorithms publishers list.\",\n not_trusted_algo:\n \"The algorithm's DID is not in the asset's trusted algorithms dictionary. \",\n no_publisherTrustedAlgorithms:\n \"The algorithm's key publisherTrustedAlgorithms does not exist in the algorithm's DDO.\",\n algorithm_file_checksum_mismatch:\n \"filesChecksum from the algorithm's DDO is invalid.\",\n algorithm_container_checksum_mismatch:\n \"The containerChecksum from the algorithm's DDO is invalid.\",\n no_raw_algo_allowed: 'The asset does not allow raw algorithms to be run on it.',\n 'Asset malformed':\n 'The asset published on chain is malformed, missing some required keys or not compliant with our schemas.',\n 'Asset is not consumable.':\n 'Assets metadata status is not in the range of valid status codes for assets. The recognized states for the metadata are defined on our docs.',\n 'DID is not a valid algorithm.':\n 'Either the algorithm assets DID is incorrectly typed, either the algorithm timeout expired.',\n 'Compute environment does not exist.':\n 'The compute environment provided by the user does not exist, it is not served by our compute-to-data feature. The user can use get_c2d_environments to check the list of available compute environments.',\n 'The validUntil value is not correct.': 'validUntil value is most probably expired.',\n 'Cannot resolve DID': 'The dataset DID does not exist in the Metadata store.',\n 'Invalid serviceId': 'The serviceId of that dataset is not correct.',\n 'Unable to get dataset files':\n 'The files of that dataset could not be decrypted or retrieved',\n 'cannot decrypt files for this service.':\n 'The files of that dataset could not be decrypted due to the fact that file object, which contains the structure and the type of specific file, is missing from the validation part.',\n 'Unsupported type ': 'The file object type is not supported by Provider.',\n 'malformed file object':\n 'The file object structure is invalid and does not contain the wanted information for the specific file.'\n },\n order: {\n fees_not_paid: ' Provider fees are not paid.'\n },\n output: {\n invalid:\n 'The algorithms validation after the build stage has not been decoded properly as a dictionary.'\n }\n}\n\nexport function getErrorMessage(err: string): string {\n try {\n const error = JSON.parse(err)\n const key = Object.keys(error)[0]\n if (key === 'error') {\n const message = error[key]\n const errorMessage =\n (PREDEFINED_ERRORS as Record<string, any>)[key]?.[message] ||\n `Provider request failed: ${message}`\n return errorMessage\n } else {\n const errorObject = error[key]\n const messagekey = Object.keys(error)[1]\n const errorMessage = error[messagekey]\n return `${errorMessage} : ${errorObject}`\n }\n } catch (e) {\n LoggerInstance.error('[getErrorMessage] error: ', e)\n return err\n }\n}\n","import { Signer } from 'ethers'\nimport Decimal from 'decimal.js'\nimport { Config } from '../config/Config.js'\nimport { Datatoken } from '../contracts/Datatoken.js'\nimport { ConsumeMarketFee, OrderParams } from '../@types/Datatoken.js'\nimport { ProviderFees } from '../@types/Provider.js'\nimport { ProviderInstance } from '../services/Provider.js'\nimport { ZERO_ADDRESS } from './Constants.js'\nimport { approve, approveWei } from './TokenUtils.js'\nimport { Dispenser } from '../contracts/Dispenser.js'\nimport { FixedRateExchange } from '../contracts/FixedRateExchange.js'\nimport { FreOrderParams } from '../@types/FixedPrice.js'\nimport { Asset, DDOManager } from '@oceanprotocol/ddo-js'\n\n/**\n * Orders an asset based on the specified pricing schema and configuration.\n * @param {Asset} asset - The asset to be ordered.\n * @param {Signer} consumerAccount - The signer account of the consumer.\n * @param {Config} config - The configuration settings.\n * @param {Datatoken} datatoken - The Datatoken instance.\n * @param {string} [providerUrl] - Optional the consumer address\n * @param {string} [consumerAccount] - Optional the consumer address\n * @param {ConsumeMarketFee} [consumeMarketOrderFee] - Optional consume market fee.\n * @param {ProviderFees} [providerFees] - Optional provider fees\n * @param {string} [consumeMarketFixedSwapFee='0'] - Fixed swap fee for consuming the market.\n * @param {number} [datatokenIndex=0] - Index of the datatoken within the asset.\n * @param {number} [serviceIndex=0] - Index of the service within the asset.\n * @param {number} [fixedRateIndex=0] - Index of the fixed rate within the pricing schema.\n * @returns {Promise<void>} - A promise that resolves when the asset order process is completed.\n * @throws {Error} If the pricing schema is not supported or if required indexes are invalid.\n */\nexport async function orderAsset(\n asset: Asset,\n consumerAccount: Signer,\n config: Config,\n datatoken: Datatoken,\n providerUrl?: string,\n consumerAddress?: string,\n consumeMarketOrderFee?: ConsumeMarketFee,\n providerFees?: ProviderFees,\n consumeMarketFixedSwapFee: string = '0',\n datatokenIndex: number = 0,\n serviceIndex: number = 0,\n fixedRateIndex: number = 0\n) {\n const ddoInstance = DDOManager.getDDOClass(asset)\n const { datatokens } = ddoInstance.getAssetFields()\n const { chainId: assetChainId, services } = ddoInstance.getDDOFields()\n if (!consumeMarketOrderFee)\n consumeMarketOrderFee = {\n consumeMarketFeeAddress: '0x0000000000000000000000000000000000000000',\n consumeMarketFeeAmount: '0',\n consumeMarketFeeToken: '0x0000000000000000000000000000000000000000'\n }\n const chainID = (await consumerAccount.provider.getNetwork()).chainId\n if (assetChainId !== Number(chainID)) {\n throw new Error('Chain ID from DDO is different than the configured network.')\n }\n\n if (!datatokens[datatokenIndex].address)\n throw new Error(\n `The datatoken with index: ${datatokenIndex} does not exist for the asset with did: ${asset.id}`\n )\n\n if (!services[serviceIndex].id)\n throw new Error(\n `There is no service with index: ${serviceIndex} defined for the asset with did: ${asset.id}`\n )\n\n const templateIndex = await datatoken.getId(datatokens[datatokenIndex].address)\n\n const fixedRates = await datatoken.getFixedRates(datatokens[datatokenIndex].address)\n const dispensers = await datatoken.getDispensers(datatokens[datatokenIndex].address)\n const publishMarketFees = await datatoken.getPublishingMarketFee(\n datatokens[datatokenIndex].address\n )\n const pricingType =\n fixedRates.length > 0 ? 'fixed' : dispensers.length > 0 ? 'free' : 'NOT_ALLOWED'\n\n const fees =\n providerFees ||\n (\n await ProviderInstance.initialize(\n asset.id,\n services[serviceIndex].id,\n 0,\n await consumerAccount.getAddress(),\n providerUrl || config.oceanNodeUri\n )\n ).providerFee\n\n if (\n fees &&\n fees.providerFeeAddress !== ZERO_ADDRESS &&\n fees.providerFeeAmount &&\n parseInt(fees.providerFeeAmount) > 0\n ) {\n try {\n await approveWei(\n consumerAccount,\n config,\n await consumerAccount.getAddress(),\n fees.providerFeeToken,\n services[0].datatokenAddress,\n fees.providerFeeAmount\n )\n } catch (error) {\n throw new Error(`Failed to approve provider fee token ${fees.providerFeeToken}`)\n }\n }\n\n const orderParams = {\n consumer: consumerAddress || (await consumerAccount.getAddress()),\n serviceIndex,\n _providerFee: fees,\n _consumeMarketFee: consumeMarketOrderFee\n } as OrderParams\n switch (pricingType) {\n case 'free': {\n if (templateIndex === 1) {\n const dispenser = new Dispenser(config.dispenserAddress, consumerAccount)\n const dispenserTx = await dispenser.dispense(\n datatokens[datatokenIndex].address,\n '1',\n await consumerAccount.getAddress()\n )\n if (!dispenserTx) {\n throw new Error(`Failed to dispense !`)\n }\n await dispenserTx.wait()\n return await datatoken.startOrder(\n datatokens[datatokenIndex].address,\n orderParams.consumer,\n orderParams.serviceIndex,\n orderParams._providerFee,\n orderParams._consumeMarketFee\n )\n }\n if (templateIndex === 2 || templateIndex === 4) {\n return await datatoken.buyFromDispenserAndOrder(\n services[serviceIndex].datatokenAddress,\n orderParams,\n config.dispenserAddress\n )\n }\n break\n }\n case 'fixed': {\n const fre = new FixedRateExchange(config.fixedRateExchangeAddress, consumerAccount)\n\n if (!fixedRates[fixedRateIndex].id)\n throw new Error(\n `There is no fixed rate exchange with index: ${serviceIndex} for the asset with did: ${asset.id}`\n )\n const fees = await fre.getFeesInfo(fixedRates[fixedRateIndex].id)\n const exchange = await fre.getExchange(fixedRates[fixedRateIndex].id)\n\n const { baseTokenAmount } = await fre.calcBaseInGivenDatatokensOut(\n fees.exchangeId,\n '1',\n consumeMarketOrderFee.consumeMarketFeeAmount\n )\n\n const price = new Decimal(+baseTokenAmount || 0)\n .add(new Decimal(consumeMarketOrderFee.consumeMarketFeeAmount || 0))\n .add(new Decimal(+publishMarketFees.publishMarketFeeAmount || 0))\n .toString()\n\n const freParams = {\n exchangeContract: config.fixedRateExchangeAddress,\n exchangeId: fees.exchangeId,\n maxBaseTokenAmount: price,\n baseTokenAddress: exchange.baseToken,\n baseTokenDecimals: parseInt(exchange.btDecimals) || 18,\n swapMarketFee: consumeMarketFixedSwapFee,\n marketFeeAddress: publishMarketFees.publishMarketFeeAddress\n } as FreOrderParams\n\n if (templateIndex === 1) {\n const tx: any = await approve(\n consumerAccount,\n config,\n await consumerAccount.getAddress(),\n exchange.baseToken,\n config.fixedRateExchangeAddress,\n price,\n false\n )\n const txApprove = typeof tx !== 'number' ? await tx.wait() : tx\n if (!txApprove) {\n throw new Error(`Failed to approve ${exchange.baseToken} !`)\n }\n const freTx = await fre.buyDatatokens(\n exchange.exchangeId,\n '1',\n price,\n publishMarketFees.publishMarketFeeAddress,\n consumeMarketFixedSwapFee\n )\n const buyDtTx = await freTx.wait()\n if (!buyDtTx) {\n throw new Error(`Failed to buy datatoken from fixed rate!`)\n }\n return await datatoken.startOrder(\n datatokens[datatokenIndex].address,\n orderParams.consumer,\n orderParams.serviceIndex,\n orderParams._providerFee,\n orderParams._consumeMarketFee\n )\n }\n if (templateIndex === 2 || templateIndex === 4) {\n const tx: any = await approve(\n consumerAccount,\n config,\n await consumerAccount.getAddress(),\n exchange.baseToken,\n datatokens[datatokenIndex].address,\n price,\n false\n )\n if (!tx) {\n throw new Error(`Failed to approve ${exchange.baseToken} !`)\n }\n const txApprove = typeof tx !== 'number' ? await tx.wait() : tx\n if (!txApprove) {\n throw new Error(`Failed to confirm/mine approval transaction!`)\n }\n const txBuy = await datatoken.buyFromFreAndOrder(\n datatokens[datatokenIndex].address,\n orderParams,\n freParams\n )\n return txBuy\n }\n break\n }\n default:\n throw new Error('Pricing schema not supported !')\n }\n}\n","import { AbiItem } from '../@types'\nimport { LogLevel } from '../utils'\n\ntype SDK = 'evm' | 'oasis'\n\nexport class Config {\n /**\n * Ethereum node URL.\n * @type {string}\n */\n public nodeUri?: string\n\n /**\n * Address of Provider.\n * @type {string}\n */\n public providerAddress?: string\n\n /**\n * Ocean Node URL.\n * @type {string}\n */\n public oceanNodeUri?: string\n\n /**\n * Web3 Provider.\n * @type {any}\n */\n public web3Provider?: any\n\n /**\n * Ocean Token address\n * @type {string}\n */\n public oceanTokenAddress?: string\n\n /**\n * Factory address\n * @type {string}\n */\n public nftFactoryAddress?: string\n\n /**\n * Router Factory address\n * @type {string}\n */\n public routerFactoryAddress?: string\n\n /**\n * datatokens ABI\n * @type {string}\n */\n public datatokensABI?: AbiItem | AbiItem[]\n\n /**\n * FixedRateExchangeAddress\n * @type {string}\n */\n public fixedRateExchangeAddress?: string\n\n /**\n * FixedRateExchangeAddressABI\n * @type {any}\n */\n public fixedRateExchangeAddressABI?: AbiItem | AbiItem[]\n\n /**\n * DispenserAddress\n * @type {string}\n */\n public dispenserAddress?: string\n\n /**\n * DispenserABI\n * @type {any}\n */\n public dispenserABI?: AbiItem | AbiItem[]\n\n /**\n * OPFCommunityFeeCollector\n * @type {string}\n */\n public opfCommunityFeeCollector?: string\n\n /**\n * SideStaking address\n * @type {string}\n */\n public sideStakingAddress?: string\n\n /**\n * block number of the deployment\n * @type {number}\n */\n public startBlock?: number\n /**\n * Log level.\n * @type {boolean | LogLevel}\n */\n public verbose?: boolean | LogLevel\n\n /**\n * Message shown when the user creates its own token.\n * @type {string}\n */\n public authMessage?: string\n\n /**\n * Token expiration time in ms.\n * @type {number}\n */\n public authTokenExpiration?: number\n\n /**\n * Parity config\n * @type {string}\n */\n public parityUri?: string\n\n public threshold?: number\n\n /**\n * Chain ID\n * @type {number}\n */\n chainId: number\n\n /**\n * Network name ex: mainnet, goerli, polygon\n * @type {string}\n */\n network: string\n\n /**\n * Url of the blockchain exporer ex: https://etherscan.io\n * @type {string}\n */\n explorerUri: string\n\n /**\n * Ocean toke symbol on the chain, it's used just for convenience to reduce number of calls\n * @type {string}\n */\n oceanTokenSymbol: string\n\n /**\n * Specify the transaction Block Timeout\n * @type {number}\n */\n transactionBlockTimeout: number\n\n /**\n * Specify the transaction Confirmation Blocks\n * @type {number}\n */\n transactionConfirmationBlocks: number\n\n /**\n * Specify the transaction Polling Blocks Timeout\n * @type {number}\n */\n transactionPollingTimeout: number\n\n /**\n * Specify the multiplier for the gas fee\n * @type {number}\n */\n gasFeeMultiplier: number\n\n veAllocate?: string\n veOCEAN?: string\n veDelegation?: string\n veFeeDistributor?: string\n veDelegationProxy?: string\n DFRewards?: string\n DFStrategyV1?: string\n veFeeEstimate?: string\n\n // is confidential evm\n sdk?: SDK\n accessListFactory?: string\n}\n","import { ethers, hexlify, Signer, toBeHex, toUtf8Bytes } from 'ethers'\nimport { ConfigHelper } from '../../src/config/index.js'\nimport { createHash } from 'crypto'\nimport { Aquarius } from '../services/Aquarius.js'\nimport { NftFactory } from '../contracts/NFTFactory.js'\nimport { Nft } from '../contracts/NFT.js'\nimport { DatatokenCreateParams } from '../@types/Datatoken.js'\nimport { NftCreateData } from '../@types/NFTFactory.js'\nimport { ZERO_ADDRESS } from './Constants.js'\nimport { DispenserCreationParams } from '../@types/Dispenser.js'\nimport { FreCreationParams } from '../@types/FixedPrice.js'\nimport { getEventFromTx } from './ContractUtils.js'\nimport { ProviderInstance } from '../services/Provider.js'\n\nimport AccessListFactory from '@oceanprotocol/contracts/artifacts/contracts/accesslists/AccessListFactory.sol/AccessListFactory.json'\nimport ERC20Template4 from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC20Template4.sol/ERC20Template4.json'\nimport { calculateActiveTemplateIndex } from './Addresses.js'\nimport { DDO, DDOManager } from '@oceanprotocol/ddo-js'\nimport { FileObjectType } from '../@types'\n\nexport const DEVELOPMENT_CHAIN_ID = 8996\n// template address OR templateId\nexport function useOasisSDK(network: string | number): boolean {\n const config = new ConfigHelper().getConfig(network)\n return config && config.sdk === 'oasis'\n}\n\n/**\n *\n * @param name asset name\n * @param symbol asse symbol\n * @param owner owner address\n * @param assetUrl asset url, if present and confidential evm, add it to token create params\n * @param templateIDorAddress either template address or id\n * @param ddo ddo\n * @param encryptDDO encrypt or not?\n * @param providerUrl the provider URL\n * @param providerFeeToken the provider fee token\n * @param aquariusInstance aquarius, could be node instance url\n * @param allowAccessList?: string,\n * @param denyAccessList?: string\n * @returns ddo id as string\n */\nexport async function createAsset(\n name: string,\n symbol: string,\n owner: Signer,\n assetUrl: any, // files object\n templateIDorAddress: string | number, // If string, it's template address , otherwise, it's templateId\n ddo: DDO,\n encryptDDO: boolean = true, // default is true\n providerUrl: string,\n providerFeeToken: string,\n aquariusInstance: Aquarius,\n accessListFactory?: string, // access list factory address\n allowAccessList?: string, // allow list address\n denyAccessList?: string // deny list address\n): Promise<string> {\n const ddoInstance = DDOManager.getDDOClass(ddo)\n const { indexedMetadata } = ddoInstance.getAssetFields()\n const value =\n ddoInstance.getDDOData()?.stats?.price?.value ||\n indexedMetadata?.stats[0]?.prices[0]?.price\n let { chainId: ddoChainId, nftAddress } = ddoInstance.getDDOFields()\n const { services } = ddoInstance.getDDOFields()\n\n const isAddress = typeof templateIDorAddress === 'string'\n const isTemplateIndex = typeof templateIDorAddress === 'number'\n if (!isAddress && !isTemplateIndex) {\n throw new Error('Invalid template! Must be a \"number\" or a \"string\"')\n }\n const chainID = (await owner.provider.getNetwork()).chainId\n\n if (ddoChainId && ddoChainId !== Number(chainID)) {\n throw new Error('Chain ID from DDO is different than the configured network.')\n }\n\n const config = new ConfigHelper().getConfig(parseInt(String(chainID)))\n\n let templateIndex = await calculateActiveTemplateIndex(\n owner,\n config.nftFactoryAddress,\n templateIDorAddress,\n Number(chainID)\n )\n\n if (templateIndex < 1) {\n // for testing purposes only\n if (Number(chainID) === DEVELOPMENT_CHAIN_ID) {\n templateIndex = 1\n } else throw new Error(`Invalid template index: ${templateIndex}`)\n }\n\n const nft = new Nft(owner, Number(chainID))\n\n const nftFactory = new NftFactory(config.nftFactoryAddress, owner, Number(chainID))\n\n // get nft owner\n const account = await owner.getAddress()\n\n // from hex to number format\n const nftParamsAsset: NftCreateData = {\n name,\n symbol,\n templateIndex: 1,\n tokenURI: 'aaa',\n transferable: true,\n owner: account\n }\n const datatokenParams: DatatokenCreateParams = {\n templateIndex,\n cap: '100000',\n feeAmount: '0',\n paymentCollector: account,\n feeToken: providerFeeToken || config.oceanTokenAddress,\n minter: account,\n mpFeeAddress: ZERO_ADDRESS\n }\n\n if (\n !assetUrl?.files[0].type ||\n ![FileObjectType.ARWEAVE, FileObjectType.IPFS, FileObjectType.URL].includes(\n assetUrl?.files[0]?.type?.toLowerCase()\n )\n ) {\n console.log('Missing or invalid files object type, defaulting to \"url\"')\n assetUrl.type = FileObjectType.URL\n }\n // include fileObject in the DT constructor\n if (config.sdk === 'oasis') {\n datatokenParams.filesObject = assetUrl\n datatokenParams.accessListFactory = accessListFactory || config.accessListFactory\n datatokenParams.allowAccessList = allowAccessList\n datatokenParams.denyAccessList = denyAccessList\n }\n\n let bundleNFT\n try {\n if (!value) {\n bundleNFT = await nftFactory.createNftWithDatatoken(nftParamsAsset, datatokenParams)\n } else if (value.toString() === '0') {\n const dispenserParams: DispenserCreationParams = {\n dispenserAddress: config.dispenserAddress,\n maxTokens: '1',\n maxBalance: '100000000',\n withMint: true,\n allowedSwapper: ZERO_ADDRESS\n }\n bundleNFT = await nftFactory.createNftWithDatatokenWithDispenser(\n nftParamsAsset,\n datatokenParams,\n dispenserParams\n )\n } else {\n // fixed price\n const fixedPriceParams: FreCreationParams = {\n fixedRateAddress: config.fixedRateExchangeAddress,\n baseTokenAddress: config.oceanTokenAddress,\n owner: account,\n marketFeeCollector: account,\n baseTokenDecimals: 18,\n datatokenDecimals: 18,\n fixedRate: value.toString(),\n marketFee: '0',\n allowedConsumer: account,\n withMint: true\n }\n bundleNFT = await nftFactory.createNftWithDatatokenWithFixedRate(\n nftParamsAsset,\n datatokenParams,\n fixedPriceParams\n )\n }\n } catch (err) {\n console.log('ERROR creating NFT bundle', err)\n return null\n }\n\n const trxReceipt = await bundleNFT.wait()\n // events have been emitted\n const nftCreatedEvent = getEventFromTx(trxReceipt, 'NFTCreated')\n const tokenCreatedEvent = getEventFromTx(trxReceipt, 'TokenCreated')\n\n const nftAddressFromEvent = nftCreatedEvent.args.newTokenAddress\n const datatokenAddressAsset = tokenCreatedEvent.args.newTokenAddress\n // create the files encrypted string\n assetUrl.datatokenAddress = datatokenAddressAsset\n assetUrl.nftAddress = nftAddressFromEvent\n\n if (config.sdk === 'oasis') {\n // we need to update files object on the SC otherwise it will fail validation on provider\n // because DDO datatokenAddress and nftAddress will not match the values on files object\n const contract = new ethers.Contract(datatokenAddressAsset, ERC20Template4.abi, owner)\n try {\n const tx = await contract.setFilesObject(toUtf8Bytes(JSON.stringify(assetUrl)))\n if (tx.wait) {\n await tx.wait()\n }\n } catch (err) {\n console.log('Error updating files object with data token and nft addresses: ', err)\n return null\n }\n }\n\n // if confidential EVM no need to make encrypt call here\n if (config.sdk === 'oasis') {\n services[0].files = '' // on confidental EVM it needs to be empty string not null, for schema validation\n } else {\n services[0].files = await ProviderInstance.encrypt(\n assetUrl,\n Number(chainID),\n providerUrl\n )\n }\n\n services[0].datatokenAddress = datatokenAddressAsset\n services[0].serviceEndpoint = providerUrl\n\n nftAddress = nftAddressFromEvent\n\n const id = ddoInstance.makeDid(nftAddress, ddoChainId.toString())\n ddo = ddoInstance.updateFields({ id, nftAddress }) as DDO\n\n let metadata\n let metadataHash\n let flags\n if (encryptDDO) {\n metadata = await ProviderInstance.encrypt(ddo, Number(chainID), providerUrl)\n const validateResult = await aquariusInstance.validate(ddo, owner, providerUrl)\n metadataHash = validateResult.hash\n flags = 2\n } else {\n const stringDDO = JSON.stringify(ddo)\n const bytes = Buffer.from(stringDDO)\n metadata = hexlify(bytes)\n metadataHash = '0x' + createHash('sha256').update(metadata).digest('hex')\n flags = 0\n }\n\n await nft.setMetadata(\n nftAddress,\n await owner.getAddress(),\n 0,\n providerUrl,\n '',\n toBeHex(flags),\n metadata,\n metadataHash\n )\n return ddo.id\n}\n\n/**\n * deploy new access list factory if needed\n * @param accessListFactory accessListFactory address\n * @param owner owner account\n * @param addressesList list of addresses to deploy\n * @returns accessListFactory address\n */\nexport async function createAccessListFactory(\n accessListFactory: string,\n owner: Signer,\n addressesList?: string[]\n): Promise<any> {\n const factory = new ethers.Contract(accessListFactory, AccessListFactory.abi, owner)\n const ownerAccount = await owner.getAddress()\n try {\n const accessListTx = await factory.deployAccessListContract(\n 'AllowList',\n 'ALLOW',\n true,\n ownerAccount,\n addressesList || [ownerAccount],\n ['https://oceanprotocol.com/nft/']\n )\n if (accessListTx && accessListTx.wait) {\n const trxReceipt = await accessListTx.wait()\n const events = getEventFromTx(trxReceipt, 'NewAccessList')\n return events.args[0]\n }\n } catch (error) {\n console.log('ERROR createAccessListFactory(): ', error)\n }\n return null\n}\n","import { DownloadResponse } from '../@types/index.js'\n\n/**\n * Triggers a file download from the specified URL when called from a browser context.\n * @param {string} url - The URL of the file to download\n * @returns {Promise<void>} - A Promise that resolves when the file has been downloaded\n */\nexport function downloadFileBrowser(url: string): void {\n const xhr = new XMLHttpRequest()\n xhr.responseType = 'blob'\n xhr.open('GET', url)\n xhr.onload = () => {\n const contentDispositionHeader = xhr.getResponseHeader('content-disposition')\n const fileNameMatch = contentDispositionHeader?.match(\n /filename[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/\n )\n const fileName = fileNameMatch && fileNameMatch[1] ? fileNameMatch[1] : 'file'\n\n const blobURL = window.URL.createObjectURL(xhr.response)\n const a = document.createElement('a')\n a.href = blobURL\n a.setAttribute('download', fileName)\n document.body.appendChild(a)\n a.click()\n a.remove()\n window.URL.revokeObjectURL(blobURL)\n }\n xhr.send()\n}\n\n/**\n * Triggers a file download from the specified URL when called from a browser context.\n * @param {string} url - The URL of the file to download\n * @param {number} [index] - The file index\n * @returns {Promise<void>} - A Promise that resolves when the file has been downloaded\n */\nexport async function downloadFile(\n url: string,\n index?: number\n): Promise<DownloadResponse> {\n const response = await fetch(url)\n if (!response.ok) {\n throw new Error('Response error.')\n }\n let filename: string\n try {\n filename = response.headers\n .get('content-disposition')\n .match(/attachment;filename=(.+)/)[1]\n } catch {\n try {\n filename = url.split('/').pop()\n } catch {\n filename = `file${index}`\n }\n }\n\n return { data: await response.arrayBuffer(), filename }\n}\n","import sha256 from 'crypto-js/sha256.js'\nimport { getAddress } from 'ethers'\n\n/**\n * Generates a valid DID\n * @param {string} nftAddress - The NFT address\n * @param {number} chainId - The chain ID\n * @returns {string} - The DID\n */\nexport function generateDid(nftAddress: string, chainId: number): string {\n nftAddress = getAddress(nftAddress)\n const checksum = sha256(nftAddress + chainId.toString(10))\n return `did:op:${checksum.toString()}`\n}\n\n/**\n * Returns the SHA256 hash of the input data\n * @param {any} data - The input data\n * @returns {string} - The SHA256 hash of the input data\n */\nexport function getHash(data: any): string {\n return sha256(data).toString()\n}\n"],"names":["FileObjectType","EncryptMethod","LogLevel","Logger","logLevel","this","Error","_proto","prototype","setLevel","bypass","dispatch","apply","Infinity","concat","slice","call","arguments","debug","Verbose","log","Log","warn","Warn","error","verb","level","_console","console","LoggerInstance","configHelperNetworksBase","chainId","network","nodeUri","oceanNodeUri","explorerUri","oceanTokenAddress","oceanTokenSymbol","fixedRateExchangeAddress","dispenserAddress","startBlock","transactionBlockTimeout","transactionConfirmationBlocks","transactionPollingTimeout","gasFeeMultiplier","configHelperNetworks","_extends","sdk","KNOWN_CONFIDENTIAL_EVMS","ConfigHelper","getAddressesFromEnv","customAddresses","configAddresses","getUris","process","env","NODE_URL","_customAddresses$netw","nftFactoryAddress","ERC721Factory","opfCommunityFeeCollector","OPFCommunityFeeCollector","FixedPrice","Dispenser","Ocean","routerFactoryAddress","Router","veAllocate","veOCEAN","veDelegation","veFeeDistributor","veDelegationProxy","DFRewards","DFStrategyV1","veFeeEstimate","accessListFactory","AccessListFactory","DefaultContractsAddresses","_DefaultContractsAddr","getConfig","infuraProjectId","addresses","filterBy","config","find","c","ADDRESS_FILE","JSON","parse","fs","readFileSync","e","contractAddressesConfig","includes","replace","minAbi","constant","inputs","name","outputs","type","payable","stateMutability","anonymous","indexed","sendTx","estGas","signer","functionToSend","_arguments","Promise","resolve","provider","getNetwork","then","_ref","getFeeData","feeHistory","overrides","maxPriorityFeePerGas","aggressiveFeePriorityFeePerGas","toString","aggressiveFeePerGas","maxFeePerGas","Math","round","Number","MUMBAI_NETWORK_ID","POLYGON_NETWORK_ID","MIN_GAS_FEE_POLYGON","SEPOLIA_NETWORK_ID","MIN_GAS_FEE_SEPOLIA","MIN_GAS_FEE_SAPPHIRE","gasPrice","gasLimit","BigInt","BigNumber","plus","trxReceipt","wait","_catch","reject","amountToUnits","token","amount","tokenDecimals","_temp2","decimals","parseUnits","getTokenDecimals","unitsToAmount","_temp","formatUnits","tokenContract","ethers","Contract","getFairGasPrice","_signer$provider$getF","price","x","setContractDefaults","contract","getEventFromTx","txReceipt","eventName","logs","filter","EventLog","SmartContract","abi","getDefaultAbi","getSignerAccordingSdk","sapphire","wrap","_this3$config","getContract","address","Interface","stringify","SmartContractWithAddress","_SmartContract","_this","_inheritsLoose","_SmartContractWithAdd","DispenserAbi","status","dtAdress","status2","_status2$isMinter","isMinter","_status2$owner","owner","_status2$active","active","maxTokens","_this$unitsToAmount","maxBalance","_this$unitsToAmount2","balance","_this$unitsToAmount3","allowedSwapper","create","dtAddress","estimateGas","_this2","_this2$config","activate","_this3","deactivate","_this4","_this4$config","setAllowedSwapper","newAllowedSwapper","_this5","_this5$config","dispense","destination","_this6","_this6$config","ownerWithdraw","_this7","_this7$config","isDispensable","datatoken","_datatoken$balance","Decimal","greaterThanOrEqualTo","String","greaterThan","ZERO_ADDRESS","FixedRateExchange","FixedRateExchangeAbi","generateExchangeId","baseToken","buyDatatokens","exchangeId","datatokenAmount","maxBaseTokenAmount","consumeMarketAddress","consumeMarketFee","getExchange","exchange","consumeMarketFeeFormatted","dtDecimals","dtAmountFormatted","btDecimals","maxBtFormatted","buyDT","sellDatatokens","minBaseTokenAmount","minBtFormatted","sellDT","getNumberOfExchanges","setRate","newRate","_this5$contract$setRa2","_estimateGas","_this5$amountToUnits2","_this5$contract$setRa","_this5$config$gasFeeM","_this5$getSignerAccor","_this5$amountToUnits","toggleExchangeState","_this8","_this8$config","getRate","_this9","weiRate","getDatatokenSupply","_this10","getDTSupply","dtSupply","getBasetokenSupply","_this11","getBTSupply","btSupply","getAllowedSwapper","calcBaseInGivenDatatokensOut","_this13","fixedRateExchange","_this13$contract","_calcBaseInGivenOutDT","calcBaseInGivenOutDT","_this13$amountToUnits","_this13$amountToUnits2","outDT","baseTokenAmount","_this13$unitsToAmount","publishMarketFeeAmount","_this13$unitsToAmount2","oceanFeeAmount","_this13$unitsToAmount3","consumeMarketFeeAmount","_this13$unitsToAmount4","marketFeeAmount","getAmountBasetokensOut","_this14","_this14$contract","_calcBaseOutGivenInDT","calcBaseOutGivenInDT","_this14$amountToUnits","_this14$amountToUnits2","_this15","result","_result$btDecimals$to","_result$dtDecimals$to","_result$allowedSwappe","_result$exchangeOwner","exchangeOwner","_result$withMint","withMint","_result$baseToken","_result$datatoken","_result$active","dtBalance","_this15$unitsToAmount","btBalance","_this15$unitsToAmount2","_this15$unitsToAmount3","_this15$unitsToAmount4","fixedRate","_this15$unitsToAmount5","getFeesInfo","_this16","opcFee","_this16$unitsToAmount","marketFee","_this16$unitsToAmount2","_result$marketFeeColl","marketFeeCollector","marketFeeAvailable","_this16$unitsToAmount3","oceanFeeAvailable","_this16$unitsToAmount4","getExchanges","isActive","activateMint","_this19","toggleMintState","_this19$config","deactivateMint","_this20","_this20$config","collectBasetokens","_this21","fixedrate","amountWei","collectBT","_this21$config","collectDatatokens","_this22","collectDT","_this22$config","collectMarketFee","_this23","_this23$config","collectOceanFee","_this24","_this24$config","getOPCCollector","opcCollector","getRouter","router","getExchangeOwner","_this27$getExchange","updateMarketFee","newMarketFee","_this28","_this28$contract$upda2","_estimateGas2","_this28$amountToUnits2","_this28$config","_this28$contract$upda","_this28$config$gasFee","_this28$getSignerAcco","_this28$amountToUnits","updateMarketFeeCollector","newMarketFeeCollector","_this29","_this29$config","FactoryRouter","buyDatatokenBatch","operations","buyDTBatch","_this$config","isApprovedToken","isFixedPrice","isFixedRateContract","getOwner","routerOwner","getNFTFactory","factory","addApprovedToken","tokenAddress","_this6$getOwner","removeApprovedToken","_this7$getOwner","addFixedRateContract","_exit3","_this8$getOwner","removeFixedRateContract","_this9$getOwner","_this9$config","addDispenserContract","_this10$getOwner","_this10$config","removeDispenserContract","_this11$getOwner","_this11$config","getOPCFee","getCurrentOPCFee","swapOceanFee","updateOPCFee","newSwapOceanFee","newSwapNonOceanFee","newConsumeFee","newProviderFee","_this14$getOwner","_this14$config","generateDtName","wordList","list","wordListDefault","random1","floor","random","adjectives","length","random2","nouns","indexNumber","adjective","toUpperCase","noun","symbol","substring","NftFactory","createNFT","nftData","_exit","templateIndex","_generateDtName","_nftData$templateInde","getCurrentNFTTemplateCount","_this$getCurrentNFTTe","getNFTTemplate","_this$getNFTTemplate","deployERC721Contract","tokenURI","transferable","tx","args","getCurrentNFTCount","getCurrentTokenCount","getCurrentTokenTemplateCount","getCurrentTemplateCount","index","_this7$getCurrentNFTT","getTokenTemplate","checkDatatoken","erc20List","checkNFT","nftAddress","erc721List","addNFTTemplate","templateAddress","_exit4","add721TokenTemplate","disableNFTTemplate","_this12","_this12$getOwner","_this12$getCurrentNFT","disable721TokenTemplate","_this12$config","reactivateNFTTemplate","_this13$getOwner","_this13$getCurrentNFT","reactivate721TokenTemplate","_this13$config","addTokenTemplate","_exit9","disableTokenTemplate","_exit10","_this15$getOwner","_this15$getCurrentTok","_this15$getTokenTempl","_this15$config","reactivateTokenTemplate","_this16$getOwner","_this16$getCurrentTok","_this16$getTokenTempl","_this16$config","startMultipleTokenOrder","orders","_this17","_this17$config","createNftWithDatatoken","nftCreateData","dtParams","_this18","getErcCreationParams","ercCreateData","createNftWithErc20","_this18$config","createNftWithDatatokenWithFixedRate","freParams","getFreCreationParams","fixedData","createNftWithErc20WithFixedRate","createNftWithDatatokenWithDispenser","dispenserParams","_this20$amountToUnits","_this20$amountToUnits2","createNftWithErc20WithDispenser","_temp4","minter","paymentCollector","mpFeeAddress","feeToken","filesObject","push","allowAccessList","denyAccessList","_dtParams$templateInd","cap","_this21$amountToUnits","feeAmount","feeTokenDecimals","_this21$amountToUnits2","strings","uints","bytess","toUtf8Bytes","_generateDtName2","_temp3","_getTokenDecimals","allowedConsumer","_temp5","baseTokenAddress","_freParams$fixedRateA","fixedRateAddress","_freParams$datatokenD","datatokenDecimals","_freParams$baseTokenD","baseTokenDecimals","_this22$amountToUnits","_this22$amountToUnits2","fixedPriceAddress","_settle","pact","state","value","s","_Pact","o","bind","v","observer","onFulfilled","onRejected","callback","thenable","calculateActiveTemplateIndex","nftContractAddress","template","chainID","isTemplateID","factoryERC721","currentTokenCount","_result2","i","_for","tokenTemplate","erc20Template","ERC20Template","getId","id","Nft","ERC721Template","createDatatoken","accessListContract","getNftPermissions","_this$getNftPermissio","deployERC20","nftContract","_nftContract$createER2","createERC20","_templateIndex2","_this$amountToUnits3","_this$amountToUnits4","toLowerCase","_templateIndex","_nftContract$createER","_this$config$gasFeeMu","_this$getSignerAccord","_this$amountToUnits","_this$amountToUnits2","event","artifacts","chain","data","Addresses","getOceanArtifactsAddresses","networks","Object","keys","_i","_networks","getOceanArtifactsAddressesByChainId","_calculateActiveTempl","addManager","manager","_exit2","getNftOwner","_this2$getNftOwner","removeManager","_this3$getNftOwner","addDatatokenDeployer","datatokenDeployer","_this4$getNftPermissi","addToCreateERC20List","removeDatatokenDeployer","_this5$getNftPermissi","_temp6","_this5$getNftPermissi2","removeFromCreateERC20List","addMetadataUpdater","metadataUpdater","_exit7","_this6$getNftPermissi","addToMetadataList","removeMetadataUpdater","_exit8","_this7$getNftPermissi","_temp8","_this7$getNftPermissi2","_temp7","updateMetadata","removeFromMetadataList","addStoreUpdater","storeUpdater","_this8$getNftPermissi","addTo725StoreList","removeStoreUpdater","_exit11","_this9$getNftPermissi","_temp10","_this9$getNftPermissi2","_temp9","store","removeFrom725StoreList","cleanPermissions","_this10$getNftOwner","transferNft","nftOwner","nftReceiver","tokenId","_this11$getNftOwner","tokenIdentifier","transferFrom","safeTransferNft","_exit15","_this12$getNftOwner","safeTransferFrom","setMetadata","metadataState","metadataDecryptorUrl","metadataDecryptorAddress","flags","metadataHash","metadataProofs","_exit16","_this13$getNftPermiss","setMetaData","setMetadataAndTokenURI","metadataAndTokenURI","_this14$getNftPermiss","sanitizedMetadataAndTokenURI","setMetaDataAndTokenURI","setMetadataState","_this15$getNftPermiss","setMetaDataState","setTokenURI","ownerOf","getPermissions","getMetadata","getMetaData","isDatatokenDeployer","isERC20Deployer","setData","key","_this21$getNftPermiss","keyHash","keccak256","valueHex","hexlify","setNewData","getData","toUtf8String","getTokenURI","isDatatokenDeployed","datatokenAddress","isDeployed","Datatoken","abiEnterprise","nft","ERC20TemplateEnterprise","approve","spender","dtContract","createFixedRate","fixedRateParams","_this3$isDatatokenDep","createDispenser","_this4$isDatatokenDep","mint","toAddress","_this5$getPermissions","getCap","capAvailble","gte","addMinter","_this6$isDatatokenDep","removeMinter","_this7$isDatatokenDep","addPaymentManager","paymentManager","_this8$isDatatokenDep","removePaymentManager","_this9$isDatatokenDep","setPaymentCollector","_this10$getPermission","_this10$nft$getNftOwn","nftPermissions","isPaymentManager","isNftOwner","getNFTAddress","getPaymentCollector","transfer","_transferWei","transferWei","_amountToUnits","startOrder","consumer","serviceIndex","providerFees","consumeMarketFeeAddress","consumeMarketFeeToken","reuseOrder","orderTxId","buyFromFreAndOrder","orderParams","getFreOrderParams","freContractParams","buyFromDispenserAndOrder","dispenserContract","_this18$isDatatokenDe","_this19$nft","_getNftOwner","_this19$getNFTAddress","_this19$nft$getNftOwn","permissions","getDecimals","getSymbol","getName","_this25","_this26","getERC721Address","getFixedRates","getDispensers","_this30","balanceOf","allowance","_this31","setPublishingMarketFee","publishMarketFeeAddress","publishMarketFeeToken","_this32","getPublishingMarketFee","_dtContract$getPublis","_this32$config","_this33","publishingMarketFee","_this34","_freParams$exchangeId","_freParams$exchangeCo","exchangeContract","_amountToUnits2","swapMarketFee","_amountToUnits3","marketFeeAddress","Datatoken4","_Datatoken2","fileObject","accessList","ERC20Template4","setFileObj","fileObj","getAllowlistContract","getAllowListContract","getDenylistContract","getDenyListContract","setAllowListContract","setDenyListContract","_this5$isDatatokenDep","setFileObject","setFilesObject","getFileObject","providerAddress","providerSignature","consumerData","consumerSignature","consumerAddress","AccessListContract","AccessList","getTokenUri","user","tokenUri","batchMint","users","tokenUris","burn","transferOwnership","newOwner","renounceOwnership","AccesslistFactory","deployAccessListContract","nameAccessList","symbolAccessList","isSoulbound","contractAddress","isSoulBound","changeTemplateAddress","VeOcean","veOceanABI","lockTokens","unlockTime","getToken","_this$getToken","amountFormatted","create_lock","depositFor","_this2$getToken","deposit_for","increaseAmount","_this3$getToken","increase_amount","increaseUnlockTime","increase_unlock_time","withdraw","getVotingPower","userAddress","getLockedAmount","locked","_unitsToAmount","_this7$getToken","lockEnd","locked__end","untilLock","parseInt","totalSupply","_unitsToAmount2","_this9$getToken","_this9$contract$total","VeFeeDistributor","veFeeABI","claim","claimMany","claim_many","VeFeeEstimate","estimateClaim","voting_escrow","_this$contract$voting","veOcean","_veOcean$getToken","VeAllocate","veAllocateABI","setAllocation","setBatchAllocation","getTotalAllocation","getVeAllocation","getveAllocation","DfRewards","dfRewardsABI","getAvailableRewards","claimable","rewards","claimRewards","claimFor","allocateRewards","userAddresses","amounts","allocate","_this3$amountToUnits","DfStrategyV1","dfStrategyV1ABI","getMultipleAvailableRewards","tokenAddresses","claimables","rewardsFormated","_push","claimMultipleRewards","claimMultiple","EscrowContract","Escrow","getFunds","getUserFunds","payer","getUserTokens","getLocks","payee","getAuthorizations","verifyFundsForEscrowPayment","amountToDeposit","maxLockedAmount","maxLockSeconds","maxLockCounts","_this7$signer$provide","getBalance","getAddress","balanceNativeToken","isZero","isValid","message","_allowance","_this7$signer$getAddr4","target","_this7$amountToUnits","_balance","_this7$signer$getAddr3","balancePaymentToken","_getAuthorizations","_this7$signer$getAddr2","auths","_getUserFunds","_this7$signer$getAddr","funds","authorize","parseEther","isLessThanOrEqualTo","isGreaterThan","deposit","_deposit","_this7$unitsToAmount","isLessThan","amountParsed","tokens","tokensWithSufficientFunds","amountsWithSufficientFunds","_temp11","amountsParsed","map","array","body","available","_cycle","_getAuthorizations2","_this10$signer$getAdd","maxLockedAmountParsed","maxLockSecondsParsed","maxLockCountsParsed","cancelExpiredLocks","jobIds","payers","payees","sleep","ms","setTimeout","signRequest","consumerMessage","messageHashBytes","getBytes","signMessage","_legacySignMessage","Aquarius","aquariusURL","did","signal","authorization","path","fetch","method","headers","Authorization","response","ok","json","waitForIndexer","txid","interval","maxRetries","tries","_do","_result","ddo","indexedMetadata","DDOManager","getDDOClass","getAssetFields","_result3","validate","providerUrl","ddoValidateRoute","pathNonce","publisherAddress","responseNonce","nonce","nextNonce","signature","jsonResponse","valid","hash","proof","validatorAddress","publicKey","r","getAssetMetadata","statusText","querySearch","query","recover","Provider","getConsumerAddress","signerOrAuthToken","jwt","decode","decodeJwt","getSignature","signProviderRequest","getAuthorization","undefined","getEndpoints","providerUri","endpoints","getEndpointURL","servicesEndpoints","serviceName","getServiceEndpoints","providerEndpoint","serviceEndpoints","endpoint","urlPath","getNonce","providerEndpoints","_this3$getServiceEndp","_this3$getEndpoints","encrypt","text","checkDidFiles","serviceId","withChecksum","_result4","resolvedResponse","_response","results","_step","_iterator","_createForOfIteratorHelperLoose","done","files","checksum","_fetch","getFileInfo","file","_temp12","_result5","_result6","_response2","_step2","_iterator2","_fetch2","getComputeEnvironments","_this7$getEndpointURL","_temp14","_result7","_response3","_temp13","_fetch3","initialize","fileIndex","userCustomParameters","computeEnv","validUntil","_temp18","_result8","_temp16","_result9","_temp15","_response4","initializeUrl","encodeURI","_temp17","_fetch4","initializeComputeV1","assets","algorithm","accountId","maxJobDuration","_temp22","_result10","_temp20","_result11","payload","_temp19","_response5","params","datasets","payment","environment","_temp21","_fetch5","initializeCompute","resources","policyServer","_this10$getNonce","_assets$","signatureMessage","documentId","_temp26","_result12","_temp24","_result14","providerData","_temp23","_response6","_temp25","_fetch6","errorText","getDownloadUrl","transferTxId","downloadUrl","_this11$getNonce","consumeUrl","computeStartV1","dataset","additionalDatasets","output","computeStartUrl","_this12$getNonce","_temp30","_result15","_exit13","_temp28","_result16","_error","_response$statusText","_response$status","_response$json","_temp27","_response7","_temp29","_fetch7","computeStart","metadata","additionalViewers","_this13$getNonce","_datasets$","_temp34","_result17","_temp32","_result18","_error2","_response$statusText2","_response$status2","_response$json2","_temp31","_response8","_temp33","_fetch8","freeComputeStart","_this14$getNonce","_temp38","_result19","_exit17","_temp36","_result20","_error3","_response$statusText3","_response$status3","_response$json3","_temp35","_response9","_temp37","_fetch9","computeStreamableLogs","jobId","isAuthToken","_this15$getNonce","_temp42","_exit18","_temp40","_result21","_response10","_response11","_error4","_response$statusText4","_response$status4","_response$json4","_temp39","url","_fetch10","_temp41","getComputeStartRoutes","isFreeCompute","computeStop","agreementId","computeStopUrl","_this17$getNonce","_temp46","_result22","_exit20","_temp44","_result23","_temp43","_response12","queryParams","URLSearchParams","set","queryString","_temp45","_fetch11","computeStatus","_temp52","_result24","_exit22","_temp50","_result25","_exit23","_temp48","_result26","_temp47","_response13","_temp49","_response14","computeStatusUrl","_temp51","_fetch12","getComputeResultUrl","computeResultUrl","_this19$getNonce","resultUrl","computeDelete","computeDeleteUrl","_this20$getNonce","noZeroX","_temp56","_result27","_exit25","_temp54","_result28","_temp53","_response15","_temp55","_fetch13","generateAuthToken","_this21$getNonce","invalidateAuthToken","_this22$getNonce","isValidProvider","_exit26","_temp57","providerAddresses","_result29","PolicyServerPassthrough","request","_temp61","_result30","_exit28","_temp59","_result32","_temp58","_response16","_temp60","_fetch14","initializePSVerification","_temp65","_result33","_exit30","_temp63","_result35","_temp62","_response17","_temp64","_fetch15","input","zeroXTransformer","zeroOutput","_this$inputMatch","inputMatch","regexp","conversorName","match","ProviderInstance","allowanceWei","account","approveWei","force","_sendTx","currentAllowence","_BigInt","_Decimal$toNumber","toNumber","PREDEFINED_ERRORS","invalid","missing","not_found","service_not_access_compute","main_service_compute","compute_services_not_in_same_provider","container","checksum_prefix","mising_entrypoint_image_checksum","did_not_found","missing_meta_documentId","not_algo","in_use_or_not_on_chain","meta_oneof_url_rawcode_remote","file_unavailable","not_trusted_algo_publisher","not_trusted_algo","no_publisherTrustedAlgorithms","algorithm_file_checksum_mismatch","algorithm_container_checksum_mismatch","no_raw_algo_allowed","order","fees_not_paid","web3Provider","datatokensABI","fixedRateExchangeAddressABI","dispenserABI","sideStakingAddress","verbose","authMessage","authTokenExpiration","parityUri","threshold","addressesList","ownerAccount","accessListTx","events","_events$args$","assetUrl","templateIDorAddress","encryptDDO","providerFeeToken","aquariusInstance","ddoInstance","_ddoInstance$getDDODa","getDDOData","stats","_indexedMetadata$stat","prices","_ddoInstance$getDDOFi","getDDOFields","ddoChainId","services","_owner$provider$getNe","nftFactory","_assetUrl$files$","bundleNFT","_setMetadata","_nftAddress","_owner$getAddress","toBeHex","datatokenAddressAsset","serviceEndpoint","makeDid","nftAddressFromEvent","updateFields","_ProviderInstance$enc2","validateResult","stringDDO","bytes","Buffer","from","createHash","update","digest","_ProviderInstance$enc","nftCreatedEvent","tokenCreatedEvent","newTokenAddress","err","nftParamsAsset","datatokenParams","ARWEAVE","IPFS","URL","_nftFactory$createNft","_nftFactory$createNft2","fixedPriceParams","_nftFactory$createNft3","filename","get","_unused","split","pop","_unused2","arrayBuffer","_response$arrayBuffer","xhr","XMLHttpRequest","responseType","open","onload","contentDispositionHeader","getResponseHeader","fileNameMatch","fileName","blobURL","window","createObjectURL","a","document","createElement","href","setAttribute","appendChild","click","remove","revokeObjectURL","send","sha256","_PREDEFINED_ERRORS$ke","errorObject","something","asset","consumerAccount","consumeMarketOrderFee","consumeMarketFixedSwapFee","datatokenIndex","fixedRateIndex","datatokens","assetChainId","_consumerAccount$prov","fixedRates","dispensers","publishMarketFees","_consumerAccount$getA6","_initialize","_asset$id","_services$serviceInde","_ProviderInstance$ini","_consumerAccount$getA2","_providerFee","fees","_consumeMarketFee","_switch","pricingType","_await$datatoken$buyF","dispenser","_dispense","_datatokens$datatoken","_consumerAccount$getA3","dispenserTx","_await$datatoken$star","fre","_exit5","_consumerAccount$getA5","txApprove","txBuy","add","_consumerAccount$getA4","freTx","buyDtTx","_await$datatoken$star2","providerFee","providerFeeAddress","providerFeeAmount","_consumerAccount$getA","signedMessage","substr","recipient"],"mappings":"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"}
1
+ {"version":3,"file":"lib.umd.js","sources":["../src/@types/Compute.ts","../src/utils/Logger.ts","../src/config/ConfigHelper.ts","../src/utils/minAbi.ts","../src/utils/ContractUtils.ts","../src/contracts/SmartContract.ts","../src/contracts/SmartContractWithAddress.ts","../src/contracts/Dispenser.ts","../src/utils/Constants.ts","../src/contracts/FixedRateExchange.ts","../src/contracts/Router.ts","../src/utils/DatatokenName.ts","../src/contracts/NFTFactory.ts","../src/utils/Addresses.ts","../src/contracts/NFT.ts","../src/contracts/Datatoken.ts","../src/contracts/Datatoken4.ts","../src/contracts/AccessList.ts","../src/contracts/AccessListFactory.ts","../src/contracts/ve/VeOcean.ts","../src/contracts/ve/VeFeeDistributor.ts","../src/contracts/ve/VeFeeEstimate.ts","../src/contracts/ve/VeAllocate.ts","../src/contracts/df/DfRewards.ts","../src/contracts/df/DfStrategyV1.ts","../src/contracts/Escrow.ts","../src/utils/General.ts","../src/utils/SignatureUtils.ts","../src/services/Aquarius.ts","../src/services/Provider.ts","../src/utils/Jwt.ts","../src/utils/TokenUtils.ts","../src/utils/ProviderErrors.ts","../src/utils/OrderUtils.ts","../src/config/Config.ts","../src/utils/Assets.ts","../src/utils/FetchHelper.ts","../src/utils/DdoHelpers.ts"],"sourcesContent":["import { Metadata, MetadataAlgorithm } from '@oceanprotocol/ddo-js'\n\nexport type ComputeResultType =\n | 'algorithmLog'\n | 'output'\n | 'configrationLog'\n | 'publishLog'\n\n// OLD V1 ComputeEnvironment specs\n// export interface ComputeEnvironment {\n// id: string\n// cpuNumber: number\n// cpuType: string\n// gpuNumber: number\n// gpuType: string\n// ramGB: number\n// diskGB: number\n// priceMin: number\n// desc: string\n// currentJobs: number\n// maxJobs: number\n// consumerAddress: string\n// storageExpiry: number\n// maxJobDuration: number\n// lastSeen: number\n// free: boolean\n// }\n\n// new V2 C2D Compute Environment specs\nexport interface RunningPlatform {\n architecture: string\n os: string\n}\n\nexport type ComputeResourceType = 'cpu' | 'memory' | 'storage'\n\nexport interface ComputeResourcesPricingInfo {\n type: ComputeResourceType\n price: number\n}\nexport interface ComputeEnvFees {\n feeToken: string\n prices: ComputeResourcesPricingInfo[]\n}\nexport interface ComputeEnvFeesStructure {\n [chainId: string]: ComputeEnvFees\n}\n\nexport interface ComputeResourceRequest {\n id: string\n amount: number\n}\n\nexport interface ComputeResource {\n id: ComputeResourceType\n type?: string\n kind?: string\n total: number // total number of specific resource\n min: number // min number of resource needed for a job\n max: number // max number of resource for a job\n inUse?: number // for display purposes\n}\n\nexport interface ComputeEnvironmentFreeOptions {\n // only if a compute env exposes free jobs\n storageExpiry?: number\n maxJobDuration?: number\n maxJobs?: number // maximum number of simultaneous free jobs\n resources?: ComputeResource[]\n}\nexport interface ComputeEnvironment {\n // legacy\n // cpuNumber: number\n // cpuType: string\n // gpuNumber: number\n // gpuType: string\n // ramGB: number\n // diskGB: number\n // priceMin: number\n // totalCpu: number // total cpu available for jobs\n // maxCpu: number // max cpu for a single job. Imagine a K8 cluster with two nodes, each node with 10 cpus. Total=20, but at most you can allocate 10 cpu for a job\n // totalRam: number // total gb of RAM\n // maxRam: number // max allocatable GB RAM for a single job.\n // maxDisk: number // max GB of disck allocatable for a single job\n // currentJobs: number\n // lastSeen: number\n // legacy\n id: string\n description: string\n consumerAddress: string\n storageExpiry?: number // amount of seconds for storage\n minJobDuration?: number // min billable seconds for a paid job\n maxJobDuration?: number // max duration in seconds for a paid job\n maxJobs?: number // maximum number of simultaneous paid jobs\n runningJobs: number // amount of running jobs (paid jobs)\n runningfreeJobs?: number // amount of running jobs (free jobs)\n fees: ComputeEnvFeesStructure\n resources?: ComputeResource[]\n free?: ComputeEnvironmentFreeOptions\n platform?: RunningPlatform\n}\n\nexport interface ComputeResult {\n filename: string\n filesize: number\n type: ComputeResultType\n index?: number\n}\n\nexport type ComputeJobMetadata = {\n [key: string]: string | number | boolean\n}\n\nexport interface ComputeJob {\n owner: string\n did?: string\n jobId: string\n dateCreated: string\n dateFinished: string\n status: number\n statusText: string\n results: ComputeResult[]\n inputDID?: string[]\n algoDID?: string\n agreementId?: string\n expireTimestamp: number\n metadata?: ComputeJobMetadata\n}\n\nexport interface ComputeOutput {\n publishAlgorithmLog?: boolean\n publishOutput?: boolean\n providerAddress?: string\n providerUri?: string\n metadata?: Metadata\n metadataUri?: string\n nodeUri?: string\n owner?: string\n secretStoreUri?: string\n whitelist?: string[]\n}\n\nexport enum FileObjectType {\n URL = 'url',\n IPFS = 'ipfs',\n ARWEAVE = 'arweave'\n}\n\nexport enum EncryptMethod {\n AES = 'AES',\n ECIES = 'ECIES'\n}\n\nexport interface HeadersObject {\n [key: string]: string\n}\n\nexport interface BaseFileObject {\n type: string\n encryptedBy?: string\n encryptMethod?: EncryptMethod\n}\n\nexport interface UrlFileObject extends BaseFileObject {\n url: string\n method: string\n headers?: [HeadersObject]\n}\n\nexport interface IpfsFileObject extends BaseFileObject {\n hash: string\n}\n\nexport interface ArweaveFileObject extends BaseFileObject {\n transactionId: string\n}\nexport interface ComputeAsset {\n fileObject?: BaseFileObject // C2D v2\n documentId: string\n serviceId: string\n transferTxId?: string\n userdata?: { [key: string]: any }\n}\n\nexport interface ComputeAlgorithm {\n fileObject?: BaseFileObject // C2D v2\n documentId?: string\n serviceId?: string\n meta?: MetadataAlgorithm\n transferTxId?: string\n algocustomdata?: { [key: string]: any }\n userdata?: { [key: string]: any }\n}\n\nexport interface ComputePayment {\n chainId: number\n token: string\n maxJobDuration: number\n}\n\nexport interface ValidationResponse {\n isValid: boolean\n message: string\n}\n","/* eslint-disable no-unused-vars */\nexport enum LogLevel {\n None = -1,\n Error = 0,\n Warn = 1,\n Log = 2,\n Verbose = 3\n}\n/* eslint-enable no-unused-vars */\n\nexport class Logger {\n constructor(private logLevel?: LogLevel) {\n this.logLevel = logLevel || LogLevel.Error\n }\n\n public setLevel(logLevel: LogLevel): void {\n this.logLevel = logLevel\n }\n\n public bypass(...args: any[]): void {\n this.dispatch('log', -Infinity as any, ...args)\n }\n\n public debug(...args: any[]): void {\n this.dispatch('debug', LogLevel.Verbose, ...args)\n }\n\n public log(...args: any[]): void {\n this.dispatch('log', LogLevel.Log, ...args)\n }\n\n public warn(...args: any[]): void {\n this.dispatch('warn', LogLevel.Warn, ...args)\n }\n\n public error(...args: any[]): void {\n this.dispatch('error', LogLevel.Error, ...args)\n }\n\n private dispatch(verb: string, level: LogLevel, ...args: any[]) {\n if (this.logLevel >= level) {\n ;(console as Record<string, any>)[verb](...args)\n }\n }\n}\n\nexport const LoggerInstance = new Logger()\n","// eslint-disable-next-line import/no-named-default\nimport { default as DefaultContractsAddresses } from '@oceanprotocol/contracts/addresses/address.json'\nimport fs from 'fs'\nimport { Config } from '.'\nimport { LoggerInstance } from '../utils/Logger.js'\n\nconst configHelperNetworksBase: Config = {\n chainId: null,\n network: 'unknown',\n nodeUri: 'http://127.0.0.1:8545',\n oceanNodeUri: 'http://127.0.0.1:8001',\n explorerUri: null,\n oceanTokenAddress: null,\n oceanTokenSymbol: 'OCEAN',\n fixedRateExchangeAddress: null,\n dispenserAddress: null,\n startBlock: 0,\n transactionBlockTimeout: 50,\n transactionConfirmationBlocks: 1,\n transactionPollingTimeout: 750,\n gasFeeMultiplier: 1\n}\n\nexport const configHelperNetworks: Config[] = [\n {\n ...configHelperNetworksBase\n },\n {\n // barge\n ...configHelperNetworksBase,\n chainId: 8996,\n network: 'development',\n oceanNodeUri: 'http://127.0.0.1:8001',\n sdk: 'evm'\n },\n {\n ...configHelperNetworksBase,\n chainId: 11155111,\n network: 'sepolia',\n nodeUri: 'https://sepolia.infura.io/v3',\n explorerUri: 'https://sepolia.etherscan.io',\n gasFeeMultiplier: 1.1,\n sdk: 'evm'\n },\n {\n ...configHelperNetworksBase,\n chainId: 1,\n network: 'mainnet',\n nodeUri: 'https://mainnet.infura.io/v3',\n explorerUri: 'https://etherscan.io',\n startBlock: 11105459,\n transactionBlockTimeout: 150,\n transactionConfirmationBlocks: 5,\n transactionPollingTimeout: 1750,\n gasFeeMultiplier: 1.05,\n sdk: 'evm'\n },\n {\n ...configHelperNetworksBase,\n chainId: 137,\n network: 'polygon',\n nodeUri: 'https://polygon-mainnet.infura.io/v3',\n explorerUri: 'https://polygonscan.com',\n oceanTokenSymbol: 'mOCEAN',\n gasFeeMultiplier: 1.6,\n sdk: 'evm'\n },\n {\n ...configHelperNetworksBase,\n chainId: 2021000,\n network: 'gaiaxtestnet',\n nodeUri: 'https://rpc.gaiaxtestnet.oceanprotocol.com',\n explorerUri: 'https://blockscout.gaiaxtestnet.oceanprotocol.com',\n sdk: 'evm'\n },\n {\n ...configHelperNetworksBase,\n chainId: 80001,\n network: 'mumbai',\n nodeUri: 'https://polygon-mumbai.infura.io/v3',\n explorerUri: 'https://mumbai.polygonscan.com',\n gasFeeMultiplier: 1.1,\n sdk: 'evm'\n },\n {\n ...configHelperNetworksBase,\n chainId: 56,\n network: 'bsc',\n nodeUri: 'https://bsc-dataseed.binance.org',\n explorerUri: 'https://bscscan.com/',\n gasFeeMultiplier: 1.05,\n sdk: 'evm'\n },\n {\n ...configHelperNetworksBase,\n chainId: 246,\n network: 'energyweb',\n nodeUri: 'https://rpc.energyweb.org',\n explorerUri: 'https://explorer.energyweb.org',\n gasFeeMultiplier: 1.05,\n sdk: 'evm'\n },\n {\n ...configHelperNetworksBase,\n chainId: 1285,\n network: 'moonriver',\n nodeUri: 'https://moonriver.api.onfinality.io/public',\n explorerUri: 'https://moonriver.moonscan.io/',\n gasFeeMultiplier: 1.05,\n sdk: 'evm'\n },\n {\n ...configHelperNetworksBase,\n chainId: 100,\n network: 'gen-x-testnet',\n nodeUri: 'https://rpc.genx.minimal-gaia-x.eu',\n explorerUri: 'https://explorer.genx.minimal-gaia-x.eu/',\n gasFeeMultiplier: 1,\n sdk: 'evm'\n },\n {\n ...configHelperNetworksBase,\n chainId: 10,\n network: 'optimism',\n nodeUri: 'https://mainnet.optimism.io',\n explorerUri: 'https://optimistic.etherscan.io/',\n gasFeeMultiplier: 1.1,\n sdk: 'evm'\n },\n {\n ...configHelperNetworksBase,\n chainId: 11155420,\n network: 'optimism_sepolia',\n nodeUri: 'https://sepolia.optimism.io',\n explorerUri: 'https://sepolia-optimism.etherscan.io/',\n gasFeeMultiplier: 1.1,\n sdk: 'evm'\n },\n {\n ...configHelperNetworksBase,\n chainId: 23294,\n network: 'oasis_sapphire',\n nodeUri: 'https://sapphire.oasis.io',\n explorerUri: 'https://explorer.oasis.io/mainnet/sapphire/',\n gasFeeMultiplier: 1,\n sdk: 'oasis'\n },\n {\n ...configHelperNetworksBase,\n chainId: 23295,\n network: 'oasis_sapphire_testnet',\n nodeUri: 'https://testnet.sapphire.oasis.dev',\n explorerUri: 'https://explorer.oasis.io/testnet/sapphire/',\n gasFeeMultiplier: 1,\n sdk: 'oasis'\n },\n {\n ...configHelperNetworksBase,\n chainId: 32456,\n network: 'pontus-x-devnet',\n nodeUri: 'https://rpc.dev.pontus-x.eu',\n explorerUri: 'https://explorer.dev.pontus-x.eu/testnet/pontusx',\n sdk: 'evm'\n }\n]\n\nexport const KNOWN_CONFIDENTIAL_EVMS = [\n 23294, // oasis_sapphire\n 23295 // oasis_sapphire_testnet\n]\n\nexport class ConfigHelper {\n /* Load contract addresses from env ADDRESS_FILE (generated by ocean-contracts) */\n public getAddressesFromEnv(network: string, customAddresses?: any): Partial<Config> {\n let configAddresses: Partial<Config>\n\n const getUris = () => {\n if (process.env.NODE_URL) {\n return {\n oceanNodeUri: process.env.NODE_URL\n }\n }\n\n return {}\n }\n\n if (customAddresses && customAddresses[network]) {\n const {\n FixedPrice,\n Dispenser,\n ERC721Factory,\n OPFCommunityFeeCollector,\n Ocean,\n chainId,\n startBlock,\n veAllocate,\n veOCEAN,\n veDelegation,\n veFeeDistributor,\n veDelegationProxy,\n DFRewards,\n DFStrategyV1,\n veFeeEstimate,\n Router,\n AccessListFactory\n } = customAddresses[network]\n configAddresses = {\n nftFactoryAddress: ERC721Factory,\n opfCommunityFeeCollector: OPFCommunityFeeCollector,\n fixedRateExchangeAddress: FixedPrice,\n dispenserAddress: Dispenser,\n oceanTokenAddress: Ocean,\n routerFactoryAddress: Router,\n chainId,\n startBlock,\n veAllocate,\n veOCEAN,\n veDelegation,\n veFeeDistributor,\n veDelegationProxy,\n DFRewards,\n DFStrategyV1,\n veFeeEstimate,\n accessListFactory: AccessListFactory,\n ...getUris()\n }\n } else if ((DefaultContractsAddresses as { [key: string]: any })[network]) {\n const {\n FixedPrice,\n Dispenser,\n OPFCommunityFeeCollector,\n ERC721Factory,\n Ocean,\n chainId,\n startBlock,\n veAllocate,\n veOCEAN,\n veDelegation,\n veFeeDistributor,\n veDelegationProxy,\n DFRewards,\n DFStrategyV1,\n veFeeEstimate,\n Router,\n AccessListFactory\n } = (DefaultContractsAddresses as { [key: string]: any })[network]\n configAddresses = {\n nftFactoryAddress: ERC721Factory,\n opfCommunityFeeCollector: OPFCommunityFeeCollector,\n fixedRateExchangeAddress: FixedPrice,\n dispenserAddress: Dispenser,\n oceanTokenAddress: Ocean,\n routerFactoryAddress: Router,\n chainId,\n startBlock,\n veAllocate,\n veOCEAN,\n veDelegation,\n veFeeDistributor,\n veDelegationProxy,\n DFRewards,\n DFStrategyV1,\n veFeeEstimate,\n accessListFactory: AccessListFactory,\n ...getUris()\n }\n }\n return configAddresses\n }\n\n /**\n * Returns the config object for a specific network supported by the oceanprotocol stack\n * @param {string | number} network the network's chainId or name\n * @param {string} infuraProjectId optional infura project id that will replace the configs node URI\n * @return {Config} Config obhjedct\n */\n public getConfig(network: string | number, infuraProjectId?: string): Config {\n const filterBy = typeof network === 'string' ? 'network' : 'chainId'\n\n let config = configHelperNetworks.find((c) => c[filterBy] === network)\n\n if (!config) {\n LoggerInstance.error(`No config found for given network '${network}'`)\n return null\n }\n\n let addresses\n try {\n addresses = process.env.ADDRESS_FILE\n ? JSON.parse(\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n fs.readFileSync(process.env.ADDRESS_FILE, 'utf8')\n )\n : null\n } catch (e) {\n console.log(e)\n addresses = null\n }\n\n let contractAddressesConfig = this.getAddressesFromEnv(config.network, addresses)\n // check oasis network name typos on addresses.json\n if (!contractAddressesConfig && KNOWN_CONFIDENTIAL_EVMS.includes(config.chainId)) {\n contractAddressesConfig = this.getAddressesFromEnv(\n config.network.replace('sapph', 'saph'),\n addresses\n )\n }\n\n if (!('sdk' in config) || config.sdk === null) {\n if (KNOWN_CONFIDENTIAL_EVMS.includes(config.chainId)) {\n config.sdk = 'oasis'\n } else {\n config.sdk = 'evm'\n }\n }\n if (contractAddressesConfig && 'accessListFactory' in contractAddressesConfig) {\n config.accessListFactory = contractAddressesConfig.accessListFactory\n }\n\n config = { ...config, ...contractAddressesConfig }\n\n const nodeUri = infuraProjectId\n ? `${config.nodeUri}/${infuraProjectId}`\n : config.nodeUri\n\n return { ...config, nodeUri }\n }\n}\n","export const minAbi = [\n {\n constant: true,\n inputs: [],\n name: 'name',\n outputs: [\n {\n name: '',\n type: 'string'\n }\n ],\n payable: false,\n stateMutability: 'view',\n type: 'function'\n },\n {\n constant: false,\n inputs: [\n {\n name: '_spender',\n type: 'address'\n },\n {\n name: '_value',\n type: 'uint256'\n }\n ],\n name: 'approve',\n outputs: [\n {\n name: '',\n type: 'bool'\n }\n ],\n payable: false,\n stateMutability: 'nonpayable',\n type: 'function'\n },\n {\n constant: true,\n inputs: [],\n name: 'totalSupply',\n outputs: [\n {\n name: '',\n type: 'uint256'\n }\n ],\n payable: false,\n stateMutability: 'view',\n type: 'function'\n },\n {\n constant: false,\n inputs: [\n {\n name: '_from',\n type: 'address'\n },\n {\n name: '_to',\n type: 'address'\n },\n {\n name: '_value',\n type: 'uint256'\n }\n ],\n name: 'transferFrom',\n outputs: [\n {\n name: '',\n type: 'bool'\n }\n ],\n payable: false,\n stateMutability: 'nonpayable',\n type: 'function'\n },\n {\n constant: true,\n inputs: [],\n name: 'decimals',\n outputs: [\n {\n name: '',\n type: 'uint8'\n }\n ],\n payable: false,\n stateMutability: 'view',\n type: 'function'\n },\n {\n constant: true,\n inputs: [\n {\n name: '_owner',\n type: 'address'\n }\n ],\n name: 'balanceOf',\n outputs: [\n {\n name: 'balance',\n type: 'uint256'\n }\n ],\n payable: false,\n stateMutability: 'view',\n type: 'function'\n },\n {\n constant: true,\n inputs: [],\n name: 'symbol',\n outputs: [\n {\n name: '',\n type: 'string'\n }\n ],\n payable: false,\n stateMutability: 'view',\n type: 'function'\n },\n {\n constant: false,\n inputs: [\n {\n name: '_to',\n type: 'address'\n },\n {\n name: '_value',\n type: 'uint256'\n }\n ],\n name: 'transfer',\n outputs: [\n {\n name: '',\n type: 'bool'\n }\n ],\n payable: false,\n stateMutability: 'nonpayable',\n type: 'function'\n },\n {\n constant: true,\n inputs: [\n {\n name: '_owner',\n type: 'address'\n },\n {\n name: '_spender',\n type: 'address'\n }\n ],\n name: 'allowance',\n outputs: [\n {\n name: '',\n type: 'uint256'\n }\n ],\n payable: false,\n stateMutability: 'view',\n type: 'function'\n },\n {\n payable: true,\n stateMutability: 'payable',\n type: 'fallback'\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n name: 'owner',\n type: 'address'\n },\n {\n indexed: true,\n name: 'spender',\n type: 'address'\n },\n {\n indexed: false,\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 name: 'from',\n type: 'address'\n },\n {\n indexed: true,\n name: 'to',\n type: 'address'\n },\n {\n indexed: false,\n name: 'value',\n type: 'uint256'\n }\n ],\n name: 'Transfer',\n type: 'event'\n }\n]\n","import {\n ethers,\n Signer,\n Contract,\n TransactionResponse,\n BaseContractMethod,\n formatUnits,\n parseUnits,\n EventLog,\n TransactionReceipt\n} from 'ethers'\n\nimport { Config, KNOWN_CONFIDENTIAL_EVMS } from '../config/index.js'\nimport { LoggerInstance } from './Logger.js'\nimport { minAbi } from './minAbi.js'\nimport BigNumber from 'bignumber.js'\n\nconst MIN_GAS_FEE_POLYGON = 30000000000 // minimum recommended 30 gwei polygon main and mumbai fees\nconst MIN_GAS_FEE_SEPOLIA = 4000000000 // minimum 4 gwei for eth sepolia testnet\nconst MIN_GAS_FEE_SAPPHIRE = 10000000000 // recommended for mainnet and testnet 10 gwei\nconst POLYGON_NETWORK_ID = 137\nconst MUMBAI_NETWORK_ID = 80001\nconst SEPOLIA_NETWORK_ID = 11155111\n\nexport function setContractDefaults(contract: Contract, config: Config): Contract {\n // TO DO - since ethers does not provide this\n /* if (config) {\n if (config.transactionBlockTimeout)\n contract.transactionBlockTimeout = config.transactionBlockTimeout\n if (config.transactionConfirmationBlocks)\n contract.transactionConfirmationBlocks = config.transactionConfirmationBlocks\n if (config.transactionPollingTimeout)\n contract.transactionPollingTimeout = config.transactionPollingTimeout\n }\n */\n return contract\n}\n\n/**\n * Asynchronous function that returns a fair gas price based on the current gas price and a multiplier.\n * @param {Signer} signer - The signer object to use for fetching the current gas price.\n * @param {number} gasFeeMultiplier - The multiplier to apply to the current gas price. If not provided, the current gas price is returned as a string.\n * @returns A Promise that resolves to a string representation of the fair gas price.\n */\nexport async function getFairGasPrice(\n signer: Signer,\n gasFeeMultiplier: number\n): Promise<string> {\n const price = await (await signer.provider.getFeeData()).gasPrice\n const x = BigInt(price.toString())\n if (gasFeeMultiplier) return (x * BigInt(gasFeeMultiplier)).toString(10)\n else return x.toString()\n}\n\n/**\n * Asynchronous function that returns the number of decimal places for a given token.\n * @param {Signer} signer - The signer object to use for fetching the token decimals.\n * @param {string} token - The address of the token contract.\n * @returns A Promise that resolves to the number of decimal places for the token.\n */\nexport async function getTokenDecimals(signer: Signer, token: string) {\n const tokenContract = new ethers.Contract(token, minAbi, signer)\n return tokenContract.decimals()\n}\n\n/**\n * Converts an amount of units to tokens\n * @param {Signer} signer - The signer object to use.\n * @param {string} token - The token to convert\n * @param {string} amount - The amount of units to convert\n * @param {number} [tokenDecimals] - The number of decimals in the token\n * @returns {Promise<string>} - The converted amount in tokens\n */\nexport async function unitsToAmount(\n signer: Signer,\n token: string,\n amount: string,\n tokenDecimals?: number\n): Promise<string> {\n let decimals = tokenDecimals || (await getTokenDecimals(signer, token))\n if (decimals === '0') {\n decimals = 18\n }\n\n const amountFormatted = formatUnits(amount, decimals)\n return amountFormatted.toString()\n}\n\n/**\n * Converts an amount of tokens to units\n * @param {Signer} signer - The signer object to use.\n * @param {string} token - The token to convert\n * @param {string} amount - The amount of tokens to convert\n * @param {number} [tokenDecimals] - The number of decimals of the token\n * @returns {Promise<string>} - The converted amount in units\n */\nexport async function amountToUnits(\n signer: Signer,\n token: string,\n amount: string,\n tokenDecimals?: number\n): Promise<string> {\n let decimals = tokenDecimals || (await getTokenDecimals(signer, token))\n if (decimals === '0') {\n decimals = 18\n }\n const amountFormatted = parseUnits(amount, decimals)\n return amountFormatted.toString()\n}\n\nexport function getEventFromTx(\n txReceipt: TransactionReceipt,\n eventName: string\n): EventLog | undefined {\n if (!txReceipt || !txReceipt.logs) {\n return undefined\n }\n\n const foundLog = txReceipt.logs.filter((log): log is EventLog => {\n return log instanceof EventLog && log.eventName === eventName\n })[0]\n\n return foundLog\n}\n\n/**\n * Send the transation on chain\n * @param {BigNumber} estGas estimated gas for the transaction\n * @param {Signer} signer signer object\n * @param {number} gasFeeMultiplier number represinting the multiplier we apply to gas fees\n * @param {Function} functionToSend function that we need to send\n * @param {...any[]} args arguments of the function\n * @return {Promise<any>} transaction receipt\n */\nexport async function sendTx(\n estGas: bigint,\n signer: Signer,\n gasFeeMultiplier: number,\n functionToSend: BaseContractMethod,\n ...args: any[]\n): Promise<TransactionResponse> {\n const { chainId } = await signer.provider.getNetwork()\n const feeHistory = await signer.provider.getFeeData()\n let overrides: Record<string, any> = {}\n if (feeHistory.maxPriorityFeePerGas) {\n let aggressiveFeePriorityFeePerGas = feeHistory.maxPriorityFeePerGas.toString()\n let aggressiveFeePerGas = feeHistory.maxFeePerGas.toString()\n if (gasFeeMultiplier > 1) {\n aggressiveFeePriorityFeePerGas = Math.round(\n Number(feeHistory.maxPriorityFeePerGas) * gasFeeMultiplier\n ).toString()\n aggressiveFeePerGas = Math.round(\n Number(feeHistory.maxFeePerGas) * gasFeeMultiplier\n ).toString()\n }\n overrides = {\n maxPriorityFeePerGas:\n (Number(chainId) === MUMBAI_NETWORK_ID ||\n Number(chainId) === POLYGON_NETWORK_ID) &&\n Number(aggressiveFeePriorityFeePerGas) < MIN_GAS_FEE_POLYGON\n ? MIN_GAS_FEE_POLYGON\n : Number(chainId) === SEPOLIA_NETWORK_ID &&\n Number(aggressiveFeePriorityFeePerGas) < MIN_GAS_FEE_SEPOLIA\n ? MIN_GAS_FEE_SEPOLIA\n : KNOWN_CONFIDENTIAL_EVMS.includes(Number(chainId)) &&\n Number(aggressiveFeePriorityFeePerGas) < MIN_GAS_FEE_SAPPHIRE\n ? MIN_GAS_FEE_SAPPHIRE\n : Number(aggressiveFeePriorityFeePerGas),\n\n maxFeePerGas:\n (Number(chainId) === MUMBAI_NETWORK_ID ||\n Number(chainId) === POLYGON_NETWORK_ID) &&\n Number(aggressiveFeePerGas) < MIN_GAS_FEE_POLYGON\n ? MIN_GAS_FEE_POLYGON\n : Number(chainId) === SEPOLIA_NETWORK_ID &&\n Number(aggressiveFeePerGas) < MIN_GAS_FEE_SEPOLIA\n ? MIN_GAS_FEE_SEPOLIA\n : KNOWN_CONFIDENTIAL_EVMS.includes(Number(chainId)) &&\n Number(aggressiveFeePerGas) < MIN_GAS_FEE_SAPPHIRE\n ? MIN_GAS_FEE_SAPPHIRE\n : Number(aggressiveFeePerGas)\n }\n } else {\n overrides = {\n gasPrice: feeHistory.gasPrice\n }\n }\n overrides.gasLimit = BigInt(new BigNumber(estGas).plus(20000n).toString())\n try {\n const trxReceipt = await functionToSend(...args, overrides)\n await trxReceipt.wait()\n return trxReceipt\n } catch (e) {\n LoggerInstance.error('Send tx error: ', e)\n return null\n }\n}\n","import { ethers, Signer, Contract } from 'ethers'\nimport { AbiItem } from '../@types/index.js'\nimport { Config, ConfigHelper } from '../config/index.js'\nimport * as sapphire from '@oasisprotocol/sapphire-paratime'\nimport {\n amountToUnits,\n getFairGasPrice,\n setContractDefaults,\n unitsToAmount\n} from '../utils/ContractUtils.js'\n\nexport abstract class SmartContract {\n public signer: Signer\n public config: Config\n public abi: AbiItem[]\n\n abstract getDefaultAbi(): any[]\n\n /**\n * Instantiate the smart contract.\n * @param {Signer} signer The signer object.\n * @param {string | number} [network] Network id or name\n * @param {Config} [config] The configuration object.\n * @param {AbiItem[]} [abi] ABI array of the smart contract\n */\n constructor(\n signer: Signer,\n network?: string | number,\n config?: Config,\n abi?: AbiItem[]\n ) {\n this.signer = signer\n this.config = config || new ConfigHelper().getConfig(network)\n this.abi = abi || this.getDefaultAbi()\n }\n\n protected getSignerAccordingSdk() {\n return this.config && 'sdk' in this.config && this.config.sdk === 'oasis'\n ? sapphire.wrap(this.signer)\n : this.signer\n }\n\n /**\n * Converts an amount of tokens to units\n * @param {string} token - The token to convert\n * @param {string} amount - The amount of tokens to convert\n * @param {number} [tokenDecimals] - The number of decimals of the token\n * @returns {Promise<string>} - The converted amount in units\n */\n protected async amountToUnits(\n token: string,\n amount: string,\n tokenDecimals?: number\n ): Promise<string> {\n return amountToUnits(this.signer, token, amount, tokenDecimals)\n }\n\n /**\n * Converts an amount of units to tokens\n * @param {string} token - The token to convert\n * @param {string} amount - The amount of units to convert\n * @param {number} [tokenDecimals] - The number of decimals in the token\n * @returns {Promise<string>} - The converted amount in tokens\n */\n protected async unitsToAmount(\n token: string,\n amount: string,\n tokenDecimals?: number\n ): Promise<string> {\n return unitsToAmount(this.signer, token, amount, tokenDecimals)\n }\n\n /**\n * Retruns the gas price\n * @returns {Promise<string>} - The fair gas price\n */\n protected async getFairGasPrice(): Promise<string> {\n return getFairGasPrice(this.signer, this.config?.gasFeeMultiplier)\n }\n\n /**\n * Returns a contract instance for the given address\n * @param {string} address - The address of the contract\n * @param {AbiItem[]} [abi] - The ABI of the contract\n * @returns {Contract} - The contract instance\n */\n protected getContract(address: string, abi?: AbiItem[]): Contract {\n if (!address) {\n throw new Error('Contract address is required but not provided')\n }\n const abiToUse = abi || this.abi\n const contract = new ethers.Contract(\n address,\n new ethers.Interface(JSON.stringify(abiToUse)),\n this.signer\n )\n return setContractDefaults(contract, this.config)\n }\n}\n","import { Signer, Contract } from 'ethers'\nimport { AbiItem } from '../@types/index.js'\nimport { Config } from '../config/index.js'\nimport { SmartContract } from './SmartContract.js'\nexport abstract class SmartContractWithAddress extends SmartContract {\n public address: string\n public contract: Contract\n\n /**\n * Instantiate the smart contract.\n * @param {string} address The address of the contract.\n * @param {Signer} signer The signer object.\n * @param {string | number} network Network id or name\n * @param {Config} config The configuration object.\n * @param {AbiItem[]} abi ABI array of the smart contract\n */\n constructor(\n address: string,\n signer: Signer,\n network?: string | number,\n config?: Config,\n abi?: AbiItem[]\n ) {\n super(signer, network, config, abi)\n this.address = address\n this.contract = this.getContract(this.address)\n }\n}\n","import Decimal from 'decimal.js'\nimport DispenserAbi from '@oceanprotocol/contracts/artifacts/contracts/pools/dispenser/Dispenser.sol/Dispenser.json'\nimport { Datatoken } from './Datatoken.js'\nimport { SmartContractWithAddress } from './SmartContractWithAddress.js'\nimport { DispenserToken, ReceiptOrEstimate, AbiItem } from '../@types/index.js'\nimport { sendTx } from '../utils/ContractUtils.js'\n\nexport class Dispenser extends SmartContractWithAddress {\n getDefaultAbi() {\n return DispenserAbi.abi as AbiItem[]\n }\n\n /**\n * Get information about a datatoken dispenser\n * @param {String} dtAddress\n * @return {Promise<DispenserToken>}\n */\n public async status(dtAdress: string): Promise<DispenserToken> {\n const status2: DispenserToken = await this.contract.status(dtAdress)\n if (!status2) {\n throw new Error(`Np dispenser found for the given datatoken address`)\n }\n const status = {\n active: status2.active,\n owner: status2.owner,\n isMinter: status2.isMinter,\n maxTokens: await this.unitsToAmount(null, status2.maxTokens, 18),\n maxBalance: await this.unitsToAmount(null, status2.maxBalance, 18),\n balance: await this.unitsToAmount(null, status2.balance, 18),\n allowedSwapper: status2.allowedSwapper\n }\n return status\n }\n\n /**\n * Creates a new Dispenser\n * @param {String} dtAddress Datatoken address\n * @param {String} address Owner address\n * @param {String} maxTokens max tokens to dispense\n * @param {String} maxBalance max balance of requester\n * @param {String} allowedSwapper only account that can ask tokens. set address(0) if not required\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transactionId\n */\n public async create<G extends boolean = false>(\n dtAddress: string,\n address: string,\n maxTokens: string,\n maxBalance: string,\n allowedSwapper: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const estGas = await this.contract.create.estimateGas(\n dtAddress,\n this.amountToUnits(null, maxTokens, 18),\n this.amountToUnits(null, maxBalance, 18),\n address,\n allowedSwapper\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n // Call createFixedRate contract method\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.create,\n dtAddress,\n this.amountToUnits(null, maxTokens, 18),\n this.amountToUnits(null, maxBalance, 18),\n address,\n allowedSwapper\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Activates a dispener.\n * @param {String} dtAddress refers to datatoken address.\n * @param {Number} maxTokens max amount of tokens to dispense\n * @param {Number} maxBalance max balance of user. If user balance is >, then dispense will be rejected\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} TransactionReceipt\n */\n public async activate<G extends boolean = false>(\n dtAddress: string,\n maxTokens: string,\n maxBalance: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const estGas = await this.contract.activate.estimateGas(\n dtAddress,\n this.amountToUnits(null, maxTokens, 18),\n this.amountToUnits(null, maxBalance, 18)\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.activate,\n dtAddress,\n this.amountToUnits(null, maxTokens, 18),\n this.amountToUnits(null, maxBalance, 18)\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Deactivate an existing dispenser.\n * @param {String} dtAddress refers to datatoken address.\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} TransactionReceipt\n */\n public async deactivate<G extends boolean = false>(\n dtAddress: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const estGas = await this.contract.deactivate.estimateGas(dtAddress)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.deactivate,\n dtAddress\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Sets a new allowed swapper.\n * @param {String} dtAddress Datatoken address.\n * @param {String} newAllowedSwapper The address of the new allowed swapper.\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async setAllowedSwapper<G extends boolean = false>(\n dtAddress: string,\n newAllowedSwapper: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const estGas = await this.contract.setAllowedSwapper.estimateGas(\n dtAddress,\n newAllowedSwapper\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.setAllowedSwapper,\n dtAddress,\n newAllowedSwapper\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Dispense datatokens to caller.\n * The dispenser must be active, hold enough datatokens (or be able to mint more)\n * and respect maxTokens/maxBalance requirements\n * @param {String} dtAddress Datatoken address.\n * @param {String} amount Amount of datatokens required.\n * @param {String} destination address of tokens receiver\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async dispense<G extends boolean = false>(\n dtAddress: string,\n amount: string = '1',\n destination: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const estGas = await this.contract.dispense.estimateGas(\n dtAddress,\n this.amountToUnits(null, amount, 18),\n destination\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.dispense,\n dtAddress,\n this.amountToUnits(null, amount, 18),\n destination\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Withdraw all tokens from the dispenser\n * @param {String} dtAddress Datatoken address.\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async ownerWithdraw<G extends boolean = false>(\n dtAddress: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const estGas = await this.contract.ownerWithdraw.estimateGas(dtAddress)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.ownerWithdraw,\n dtAddress\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Check if tokens can be dispensed\n * @param {String} dtAddress Datatoken address\n * @param {String} address User address that will receive datatokens\n * @param {String} amount amount of datatokens required.\n * @return {Promise<Boolean>}\n */\n public async isDispensable(\n dtAddress: string,\n datatoken: Datatoken,\n address: string,\n amount: string = '1'\n ): Promise<Boolean> {\n const status = await this.status(dtAddress)\n if (!status) return false\n // check active\n if (status.active === false) return false\n // check maxBalance\n const userBalance = new Decimal(await datatoken.balance(dtAddress, address))\n if (userBalance.greaterThanOrEqualTo(status.maxBalance)) return false\n // check maxAmount\n if (new Decimal(String(amount)).greaterThan(status.maxTokens)) return false\n // check dispenser balance\n const contractBalance = new Decimal(status.balance)\n if (contractBalance.greaterThanOrEqualTo(amount) || status.isMinter === true)\n return true\n return false\n }\n}\n","export const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000'\nexport const GASLIMIT_DEFAULT = 1000000\nexport const MAX_UINT_256 =\n '115792089237316195423570985008687907853269984665640564039457584007913129639934'\nexport const FEE_HISTORY_NOT_SUPPORTED =\n 'Returned error: Method eth_feeHistory not supported.'\n","import FixedRateExchangeAbi from '@oceanprotocol/contracts/artifacts/contracts/pools/fixedRate/FixedRateExchange.sol/FixedRateExchange.json'\nimport { sendTx } from '../utils/ContractUtils.js'\nimport {\n PriceAndFees,\n FeesInfo,\n FixedPriceExchange,\n ReceiptOrEstimate,\n AbiItem\n} from '../@types/index.js'\nimport { SmartContractWithAddress } from './SmartContractWithAddress.js'\nimport { ZERO_ADDRESS } from '../utils/Constants.js'\n\nexport class FixedRateExchange extends SmartContractWithAddress {\n getDefaultAbi() {\n return FixedRateExchangeAbi.abi as AbiItem[]\n }\n\n /**\n * Creates unique exchange identifier.\n * @param {String} baseToken baseToken contract address\n * @param {String} datatoken Datatoken contract address\n * @return {Promise<string>} exchangeId\n */\n public async generateExchangeId(baseToken: string, datatoken: string): Promise<string> {\n const exchangeId = await this.contract.generateExchangeId(baseToken, datatoken)\n return exchangeId\n }\n\n /**\n * Atomic swap\n * @param {String} exchangeId ExchangeId\n * @param {String} datatokenAmount Amount of datatokens\n * @param {String} maxBaseTokenAmount max amount of baseToken we want to pay for datatokenAmount\n * @param {String} consumeMarketAddress consumeMarketAddress\n * @param {String} consumeMarketFee consumeMarketFee in fraction\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transaction receipt\n */\n public async buyDatatokens<G extends boolean = false>(\n exchangeId: string,\n datatokenAmount: string,\n maxBaseTokenAmount: string,\n consumeMarketAddress: string = ZERO_ADDRESS,\n consumeMarketFee: string = '0',\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const exchange = await this.getExchange(exchangeId)\n const consumeMarketFeeFormatted = await this.amountToUnits(null, consumeMarketFee, 18)\n const dtAmountFormatted = await this.amountToUnits(\n exchange.datatoken,\n datatokenAmount,\n Number(exchange.dtDecimals)\n )\n const maxBtFormatted = await this.amountToUnits(\n exchange.baseToken,\n maxBaseTokenAmount,\n Number(exchange.btDecimals)\n )\n\n const estGas = await this.contract.buyDT.estimateGas(\n exchangeId,\n dtAmountFormatted,\n maxBtFormatted,\n consumeMarketAddress,\n consumeMarketFeeFormatted\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.buyDT,\n exchangeId,\n dtAmountFormatted,\n maxBtFormatted,\n consumeMarketAddress,\n consumeMarketFeeFormatted\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Sell datatokenAmount while expecting at least minBaseTokenAmount\n * @param {String} exchangeId ExchangeId\n * @param {String} datatokenAmount Amount of datatokens\n * @param {String} minBaseTokenAmount min amount of baseToken we want to receive back\n * @param {String} consumeMarketAddress consumeMarketAddress\n * @param {String} consumeMarketFee consumeMarketFee in fraction\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transaction receipt\n */\n public async sellDatatokens<G extends boolean = false>(\n exchangeId: string,\n datatokenAmount: string,\n minBaseTokenAmount: string,\n consumeMarketAddress: string = ZERO_ADDRESS,\n consumeMarketFee: string = '0',\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const exchange = await this.getExchange(exchangeId)\n const consumeMarketFeeFormatted = await this.amountToUnits(null, consumeMarketFee, 18)\n const dtAmountFormatted = await this.amountToUnits(\n exchange.datatoken,\n datatokenAmount,\n Number(exchange.dtDecimals)\n )\n const minBtFormatted = await this.amountToUnits(\n exchange.baseToken,\n minBaseTokenAmount,\n Number(exchange.btDecimals)\n )\n const estGas = await this.contract.sellDT.estimateGas(\n exchangeId,\n dtAmountFormatted,\n minBtFormatted,\n consumeMarketAddress,\n consumeMarketFeeFormatted\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.sellDT,\n exchangeId,\n dtAmountFormatted,\n minBtFormatted,\n consumeMarketAddress,\n consumeMarketFeeFormatted\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Gets total number of exchanges\n * @return {Promise<Number>} no of available exchanges\n */\n public async getNumberOfExchanges(): Promise<number> {\n const numExchanges = await this.contract.getNumberOfExchanges()\n return Number(numExchanges)\n }\n\n /**\n * Set new rate\n * @param {String} exchangeId Exchange ID\n * @param {String} newRate New rate\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transaction receipt\n */\n public async setRate<G extends boolean = false>(\n exchangeId: string,\n newRate: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const estGas = await this.contract.setRate.estimateGas(\n exchangeId,\n await this.amountToUnits(null, newRate, 18)\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.setRate,\n exchangeId,\n await this.amountToUnits(null, newRate, 18)\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Sets a new allowedSwapper\n * @param {String} exchangeId Exchange ID\n * @param {String} newAllowedSwapper The address of the new allowed swapper (set address zero if we want to remove allowed swapper)\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transaction receipt\n */\n public async setAllowedSwapper<G extends boolean = false>(\n exchangeId: string,\n newAllowedSwapper: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const estGas = await this.contract.setAllowedSwapper.estimateGas(\n exchangeId,\n newAllowedSwapper\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.setAllowedSwapper,\n exchangeId,\n newAllowedSwapper\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Activate an exchange\n * @param {String} exchangeId ExchangeId\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transaction receipt\n */\n public async activate<G extends boolean = false>(\n exchangeId: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const exchange = await this.getExchange(exchangeId)\n if (!exchange) return null\n if (exchange.active === true) return null\n const estGas = await this.contract.toggleExchangeState.estimateGas(exchangeId)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.toggleExchangeState,\n exchangeId\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Deactivate an exchange\n * @param {String} exchangeId ExchangeId\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transaction receipt\n */\n public async deactivate<G extends boolean = false>(\n exchangeId: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const exchange = await this.getExchange(exchangeId)\n if (!exchange) return null\n if (exchange.active === false) return null\n\n const estGas = await this.contract.toggleExchangeState.estimateGas(exchangeId)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.toggleExchangeState,\n exchangeId\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Get Exchange Rate\n * @param {String} exchangeId Exchange ID\n * @return {Promise<string>} Rate (converted from wei)\n */\n public async getRate(exchangeId: string): Promise<string> {\n const weiRate = await this.contract.getRate(exchangeId)\n return await this.unitsToAmount(null, weiRate, 18)\n }\n\n /**\n * Get Datatoken Supply in the exchange\n * @param {String} exchangeId Exchange Id\n * @return {Promise<string>} dt supply formatted\n */\n public async getDatatokenSupply(exchangeId: string): Promise<string> {\n const dtSupply = await this.contract.getDTSupply(exchangeId)\n const exchange = await this.getExchange(exchangeId)\n return await this.unitsToAmount(\n exchange.datatoken,\n dtSupply,\n Number(exchange.dtDecimals)\n )\n }\n\n /**\n * Returns basetoken supply in the exchange\n * @param {String} exchangeId Exchange Id\n * @return {Promise<string>} dt supply formatted\n */\n public async getBasetokenSupply(exchangeId: string): Promise<string> {\n const btSupply = await this.contract.getBTSupply(exchangeId)\n const exchange = await this.getExchange(exchangeId)\n return await this.unitsToAmount(\n exchange.baseToken,\n btSupply,\n Number(exchange.btDecimals)\n )\n }\n\n /**\n * Get Allower Swapper (if set this is the only account which can use this exchange, else is set at address(0))\n * @param {String} exchangeId Exchange Id\n * @return {Promise<string>} address of allowed swapper\n */\n public async getAllowedSwapper(exchangeId: string): Promise<string> {\n return await this.contract.getAllowedSwapper(exchangeId)\n }\n\n /**\n * calcBaseInGivenDatatokensOut - Calculates how many base tokens are needed to get specified amount of datatokens\n * @param {String} exchangeId Exchange Id\n * @param {string} datatokenAmount Amount of datatokens user wants to buy\n * @param {String} consumeMarketFee consumeMarketFee in fraction\n * @return {Promise<PriceAndFees>} how many base tokens are needed and fees\n */\n public async calcBaseInGivenDatatokensOut(\n exchangeId: string,\n datatokenAmount: string,\n consumeMarketFee: string = '0'\n ): Promise<PriceAndFees> {\n const fixedRateExchange = await this.getExchange(exchangeId)\n const outDT = await this.contract.calcBaseInGivenOutDT(\n exchangeId,\n await this.amountToUnits(\n fixedRateExchange.datatoken,\n datatokenAmount,\n Number(fixedRateExchange.dtDecimals)\n ),\n await this.amountToUnits(null, consumeMarketFee, 18)\n )\n const priceAndFees = {\n baseTokenAmount: await this.unitsToAmount(\n fixedRateExchange.baseToken,\n outDT.baseTokenAmount,\n Number(fixedRateExchange.btDecimals)\n ),\n marketFeeAmount: await this.unitsToAmount(\n fixedRateExchange.baseToken,\n outDT.publishMarketFeeAmount,\n Number(fixedRateExchange.btDecimals)\n ),\n oceanFeeAmount: await this.unitsToAmount(\n fixedRateExchange.baseToken,\n outDT.oceanFeeAmount,\n Number(fixedRateExchange.btDecimals)\n ),\n consumeMarketFeeAmount: await this.unitsToAmount(\n fixedRateExchange.baseToken,\n outDT.consumeMarketFeeAmount,\n Number(fixedRateExchange.btDecimals)\n )\n } as PriceAndFees\n return priceAndFees\n }\n\n /**\n * Returns amount in baseToken that user will receive for datatokenAmount sold\n * @param {String} exchangeId Exchange Id\n * @param {Number} datatokenAmount Amount of datatokens\n * @param {String} consumeMarketFee consumeMarketFee in fraction\n * @return {Promise<string>} Amount of baseTokens user will receive\n */\n public async getAmountBasetokensOut(\n exchangeId: string,\n datatokenAmount: string,\n consumeMarketFee: string = '0'\n ): Promise<string> {\n const exchange = await this.getExchange(exchangeId)\n const amount = await this.contract.calcBaseOutGivenInDT(\n exchangeId,\n await this.amountToUnits(\n exchange.datatoken,\n datatokenAmount,\n Number(exchange.dtDecimals)\n ),\n await this.amountToUnits(null, consumeMarketFee, 18)\n )\n\n return await this.unitsToAmount(\n exchange.baseToken,\n amount[0],\n Number(exchange.btDecimals)\n )\n }\n\n /**\n * Get exchange details\n * @param {String} exchangeId Exchange Id\n * @return {Promise<FixedPricedExchange>} Exchange details\n */\n public async getExchange(exchangeId: string): Promise<FixedPriceExchange> {\n const result: FixedPriceExchange = await this.contract.getExchange(exchangeId)\n const exchange: FixedPriceExchange = {\n active: result.active,\n datatoken: result.datatoken,\n baseToken: result.baseToken,\n withMint: result.withMint,\n exchangeOwner: result.exchangeOwner,\n allowedSwapper: result.allowedSwapper,\n dtDecimals: result.dtDecimals.toString(),\n btDecimals: result.btDecimals.toString(),\n dtBalance: await this.unitsToAmount(\n result.datatoken,\n result.dtBalance,\n Number(result.dtDecimals)\n ),\n btBalance: await this.unitsToAmount(\n result.baseToken,\n result.btBalance,\n Number(result.btDecimals)\n ),\n dtSupply: await this.unitsToAmount(\n result.datatoken,\n result.dtSupply,\n Number(result.dtDecimals)\n ),\n btSupply: await this.unitsToAmount(\n result.baseToken,\n result.btSupply,\n Number(result.btDecimals)\n ),\n fixedRate: await this.unitsToAmount(null, result.fixedRate, 18),\n exchangeId\n }\n return exchange\n }\n\n /**\n * Get fee details for an exchange\n * @param {String} exchangeId Exchange Id\n * @return {Promise<FeesInfo>} Exchange details\n */\n public async getFeesInfo(exchangeId: string): Promise<FeesInfo> {\n const result: FeesInfo = await this.contract.getFeesInfo(exchangeId)\n const exchange = await this.getExchange(exchangeId)\n const feesInfo: FeesInfo = {\n opcFee: await this.unitsToAmount(null, result.opcFee.toString(), 18),\n marketFee: await this.unitsToAmount(null, result.marketFee.toString(), 18),\n marketFeeCollector: result.marketFeeCollector,\n marketFeeAvailable: await this.unitsToAmount(\n exchange.baseToken,\n result.marketFeeAvailable,\n Number(exchange.btDecimals)\n ),\n oceanFeeAvailable: await this.unitsToAmount(\n exchange.baseToken,\n result.oceanFeeAvailable,\n Number(exchange.btDecimals)\n ),\n\n exchangeId\n }\n return feesInfo\n }\n\n /**\n * Returns all exchanges\n * @param {String} exchangeId Exchang eId\n * @return {Promise<String[]>} Exchanges list\n */\n public async getExchanges(): Promise<string[]> {\n return await this.contract.getExchanges()\n }\n\n /**\n * Check if an exchange is active\n * @param {String} exchangeId ExchangeId\n * @return {Promise<Boolean>}\n */\n public async isActive(exchangeId: string): Promise<boolean> {\n const active = await this.contract.isActive(exchangeId)\n return active\n }\n\n /**\n * Activate minting option for fixed rate contract\n * @param {String} exchangeId Exchang eId\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transaction receipt\n */\n public async activateMint<G extends boolean = false>(\n exchangeId: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const exchange = await this.getExchange(exchangeId)\n if (!exchange) return null\n if (exchange.withMint === true) return null\n\n const estGas = await this.contract.toggleMintState.estimateGas(exchangeId, true)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.toggleMintState,\n exchangeId,\n true\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Deactivate minting for fixed rate\n * @param {String} exchangeId ExchangeId\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transaction receipt\n */\n public async deactivateMint<G extends boolean = false>(\n exchangeId: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const exchange = await this.getExchange(exchangeId)\n if (!exchange) return null\n if (exchange.withMint === false) return null\n\n const estGas = await this.contract.toggleMintState.estimateGas(exchangeId, false)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.toggleMintState,\n exchangeId,\n false\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Collect BaseTokens in the contract (anyone can call this, funds are sent to Datatoken.paymentCollector)\n * @param {String} exchangeId Exchange Id\n * @param {String} amount amount to be collected\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transaction receipt\n */\n public async collectBasetokens<G extends boolean = false>(\n exchangeId: string,\n amount: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const exchange = await this.getExchange(exchangeId)\n if (!exchange) return null\n\n const fixedrate: FixedPriceExchange = await this.contract.getExchange(exchangeId)\n const amountWei = await this.amountToUnits(\n fixedrate.baseToken,\n amount,\n Number(fixedrate.btDecimals)\n )\n\n const estGas = await this.contract.collectBT.estimateGas(exchangeId, amountWei)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.collectBT,\n exchangeId,\n amountWei\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Collect datatokens in the contract (anyone can call this, funds are sent to Datatoken.paymentCollector)\n * @param {String} exchangeId Exchange Id\n * @param {String} amount amount to be collected\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transaction receipt\n */\n public async collectDatatokens<G extends boolean = false>(\n exchangeId: string,\n amount: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const exchange = await this.getExchange(exchangeId)\n if (!exchange) return null\n\n const fixedrate: FixedPriceExchange = await this.contract.getExchange(exchangeId)\n const amountWei = await this.amountToUnits(\n fixedrate.datatoken,\n amount,\n Number(fixedrate.dtDecimals)\n )\n\n const estGas = await this.contract.collectDT.estimateGas(exchangeId, amountWei)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.collectDT,\n exchangeId,\n amountWei\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Collect market fee and send it to marketFeeCollector (anyone can call it)\n * @param {String} exchangeId Exchange Id\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transaction receipt\n */\n public async collectMarketFee<G extends boolean = false>(\n exchangeId: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const exchange = await this.getExchange(exchangeId)\n if (!exchange) return null\n\n const estGas = await this.contract.collectMarketFee.estimateGas(exchangeId)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.collectMarketFee,\n exchangeId\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Collect ocean fee and send it to OPF collector (anyone can call it)\n * @param {String} exchangeId Exchange Id\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transaction receipt\n */\n public async collectOceanFee<G extends boolean = false>(\n exchangeId: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const exchange = await this.getExchange(exchangeId)\n if (!exchange) return null\n\n const estGas = await this.contract.collectOceanFee.estimateGas(exchangeId)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.collectOceanFee,\n exchangeId\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Get OPF Collector of fixed rate contract\n * @return {String}\n */\n async getOPCCollector(): Promise<string> {\n const address = await this.contract.opcCollector()\n return address\n }\n\n /**\n * Get Router address set in fixed rate contract\n * @return {String}\n */\n public async getRouter(): Promise<string> {\n const address = await this.contract.router()\n return address\n }\n\n /**\n * Get Exchange Owner given an exchangeId\n * @param {String} exchangeId Exchange Id\n * @return {String} return exchange owner\n */\n async getExchangeOwner(exchangeId: string): Promise<string> {\n const address = await (await this.getExchange(exchangeId)).exchangeOwner\n return address\n }\n\n /**\n * Set new market fee, only market fee collector can update it\n * @param {String} exchangeId Exchange Id\n * @param {String} newMarketFee New market fee\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transaction receipt\n */\n public async updateMarketFee<G extends boolean = false>(\n exchangeId: string,\n newMarketFee: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const estGas = await this.contract.updateMarketFee.estimateGas(\n exchangeId,\n await this.amountToUnits(null, newMarketFee, 18)\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.updateMarketFee,\n exchangeId,\n await this.amountToUnits(null, newMarketFee, 18)\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Set new market fee collector, only market fee collector can update it\n * @param {String} exchangeId Exchange Id\n * @param {String} newMarketFeeCollector New market fee collector\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transaction receipt\n */\n public async updateMarketFeeCollector<G extends boolean = false>(\n exchangeId: string,\n newMarketFeeCollector: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const estGas = await this.contract.updateMarketFeeCollector.estimateGas(\n exchangeId,\n newMarketFeeCollector\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.updateMarketFeeCollector,\n exchangeId,\n newMarketFeeCollector\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n}\n","import FactoryRouter from '@oceanprotocol/contracts/artifacts/contracts/pools/FactoryRouter.sol/FactoryRouter.json'\nimport { sendTx } from '../utils/ContractUtils.js'\nimport { Operation, ReceiptOrEstimate, AbiItem } from '../@types/index.js'\nimport { SmartContractWithAddress } from './SmartContractWithAddress.js'\n\n/**\n * Provides an interface for FactoryRouter contract\n */\nexport class Router extends SmartContractWithAddress {\n getDefaultAbi() {\n return FactoryRouter.abi as AbiItem[]\n }\n\n /**\n * * Buys a batch of datatokens.\n * one single call to buy multiple DT for multiple assets.\n * require tokenIn approvals for router from user. (except for dispenser operations)\n * @param {Operation[]} operations - The operations to execute.\n * @param {boolean} [estimateGas=false] - Whether to return only the estimate gas or not.\n * @return {Promise<ReceiptOrEstimate>} Transaction receipt\n */\n public async buyDatatokenBatch<G extends boolean = false>(\n operations: Operation[],\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const estGas = await this.contract.buyDTBatch.estimateGas(operations)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.buyDTBatch,\n operations\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Checks if a token is on approved tokens list,\n * if true opfFee is lower in pools with that token/DT\n * @param {string} address - The address of the token to check.\n * @return {Promise<boolean>} true if is on the list.\n */\n public async isApprovedToken(address: string): Promise<boolean> {\n return await this.contract.isApprovedToken(address)\n }\n\n /**\n * Check if an address is a Fixed Rate contract.\n * @param {string} address - The address of the fixed rate exchange to check.\n * @return {Promise<boolean>} true if is a Fixed Rate contract\n */\n public async isFixedPrice(address: string): Promise<boolean> {\n return await this.contract.isFixedRateContract(address)\n }\n\n /**\n * Get Router Owner\n * @return {Promise<string>} Router Owner address\n */\n public async getOwner(): Promise<string> {\n return await this.contract.routerOwner()\n }\n\n /**\n * Get NFT Factory address\n * @return {Promise<string>} NFT Factory address\n */\n public async getNFTFactory(): Promise<string> {\n return await this.contract.factory()\n }\n\n /**\n * Adds a token to the list of tokens with reduced fees\n * @param {String} address caller address\n * @param {String} tokenAddress token address to add\n * @param {Boolean} [estimateGas] if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async addApprovedToken<G extends boolean = false>(\n address: string,\n tokenAddress: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n if ((await this.getOwner()) !== address) {\n throw new Error(`Caller is not Router Owner`)\n }\n\n const estGas = await this.contract.addApprovedToken.estimateGas(tokenAddress)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.addApprovedToken,\n tokenAddress\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Removes a token if exists from the list of tokens with reduced fees\n * @param {String} address caller address\n * @param {String} tokenAddress token address to remove\n * @param {Boolean} [estimateGas] if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async removeApprovedToken<G extends boolean = false>(\n address: string,\n tokenAddress: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n if ((await this.getOwner()) !== address) {\n throw new Error(`Caller is not Router Owner`)\n }\n\n const estGas = await this.contract.removeApprovedToken.estimateGas(tokenAddress)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.removeApprovedToken,\n tokenAddress\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Adds an address to the list of fixed rate contracts\n * @param {String} address caller address\n * @param {String} tokenAddress contract address to add\n * @param {Boolean} [estimateGas] if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async addFixedRateContract<G extends boolean = false>(\n address: string,\n tokenAddress: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n if ((await this.getOwner()) !== address) {\n throw new Error(`Caller is not Router Owner`)\n }\n\n const estGas = await this.contract.addFixedRateContract.estimateGas(tokenAddress)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.addFixedRateContract,\n tokenAddress\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Removes an address from the list of fixed rate contracts\n * @param {String} address caller address\n * @param {String} tokenAddress contract address to add\n * @param {Boolean} [estimateGas] if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async removeFixedRateContract<G extends boolean = false>(\n address: string,\n tokenAddress: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n if ((await this.getOwner()) !== address) {\n throw new Error(`Caller is not Router Owner`)\n }\n\n const estGas = await this.contract.removeFixedRateContract.estimateGas(tokenAddress)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.removeFixedRateContract,\n tokenAddress\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Adds an address to the list of dispensers\n * @param {String} address caller address\n * @param {String} tokenAddress contract address to add\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async addDispenserContract<G extends boolean = false>(\n address: string,\n tokenAddress: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n if ((await this.getOwner()) !== address) {\n throw new Error(`Caller is not Router Owner`)\n }\n\n const estGas = await this.contract.addDispenserContract.estimateGas(tokenAddress)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.addDispenserContract,\n tokenAddress\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Removes an address from the list of dispensers\n * @param {String} address caller address\n * @param {String} tokenAddress address Contract to be removed\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async removeDispenserContract<G extends boolean = false>(\n address: string,\n tokenAddress: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n if ((await this.getOwner()) !== address) {\n throw new Error(`Caller is not Router Owner`)\n }\n\n const estGas = await this.contract.removeDispenserContract.estimateGas(tokenAddress)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.removeDispenserContract,\n tokenAddress\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /** Get OPF Fee per token\n * @return {Promise<number>} OPC fee for a specific baseToken\n */\n public async getOPCFee(baseToken: string): Promise<number> {\n const fee = await this.contract.getOPCFee(baseToken)\n return Number(fee)\n }\n\n /** Get Current OPF Fee\n * @return {Promise<number>} OPF fee\n */\n public async getCurrentOPCFee(): Promise<number> {\n const fee = await this.contract.swapOceanFee()\n return Number(fee)\n }\n\n /**\n * Updates OP Community Fees\n * @param {String} address caller address\n * @param {number} newSwapOceanFee Amount charged for swapping with ocean approved tokens\n * @param {number} newSwapNonOceanFee Amount charged for swapping with non ocean approved tokens\n * @param {number} newConsumeFee Amount charged from consumeFees\n * @param {number} newProviderFee Amount charged for providerFees\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async updateOPCFee<G extends boolean = false>(\n address: string,\n newSwapOceanFee: number,\n newSwapNonOceanFee: number,\n newConsumeFee: number,\n newProviderFee: number,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n if ((await this.getOwner()) !== address) {\n throw new Error(`Caller is not Router Owner`)\n }\n\n const estGas = await this.contract.updateOPCFee.estimateGas(\n newSwapOceanFee,\n newSwapNonOceanFee,\n newConsumeFee,\n newProviderFee\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.updateOPCFee,\n newSwapOceanFee,\n newSwapNonOceanFee,\n newConsumeFee,\n newProviderFee\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n}\n","import wordListDefault from './data/words.json'\n\n/**\n * This function generates a datatoken name and symbol from a given word list.\n * @param {Object} [wordList] - An object containing an array of nouns and adjectives.\n * @param {string[]} [wordList.nouns] - An array of nouns.\n * @param {string[]} [wordList.adjectives] - An array of adjectives.\n * @returns {Object} Returns an object containing the generated name and symbol. Produces e.g. \"Endemic Jellyfish Token\" & \"ENDJEL-45\"\n */\nexport function generateDtName(wordList?: { nouns: string[]; adjectives: string[] }): {\n name: string\n symbol: string\n} {\n const list = wordList || wordListDefault\n const random1 = Math.floor(Math.random() * list.adjectives.length)\n const random2 = Math.floor(Math.random() * list.nouns.length)\n const indexNumber = Math.floor(Math.random() * 100)\n\n // Capitalized adjective & noun\n const adjective = list.adjectives[random1].replace(/^\\w/, (c) => c.toUpperCase())\n const noun = list.nouns[random2].replace(/^\\w/, (c) => c.toUpperCase())\n\n const name = `${adjective} ${noun} Token`\n // use first 3 letters of name, uppercase it, and add random number\n const symbol = `${(\n adjective.substring(0, 3) + noun.substring(0, 3)\n ).toUpperCase()}-${indexNumber}`\n\n return { name, symbol }\n}\n","import { toUtf8Bytes } from 'ethers'\nimport ERC721Factory from '@oceanprotocol/contracts/artifacts/contracts/ERC721Factory.sol/ERC721Factory.json'\nimport {\n AbiItem,\n FreCreationParams,\n DatatokenCreateParams,\n DispenserCreationParams,\n NftCreateData,\n Template,\n TokenOrder,\n ReceiptOrEstimate\n} from '../@types/index.js'\nimport { SmartContractWithAddress } from './SmartContractWithAddress.js'\nimport { generateDtName } from '../utils/DatatokenName.js'\nimport { ZERO_ADDRESS } from '../utils/Constants.js'\nimport { getEventFromTx, getTokenDecimals, sendTx } from '../utils/ContractUtils.js'\nimport { LoggerInstance } from '../utils/Logger.js'\n\n/**\n * Provides an interface for NFT Factory contract\n */\nexport class NftFactory extends SmartContractWithAddress {\n getDefaultAbi() {\n return ERC721Factory.abi as AbiItem[]\n }\n\n /**\n * Create new data NFT\n * @param {NFTCreateData} nftData The data needed to create an NFT.\n * @param {Boolean} [estimateGas] if True, return gas estimate\n * @return {Promise<string|BigNumber>} The transaction hash or the gas estimate.\n */\n public async createNFT<G extends boolean = false>(\n nftData: NftCreateData,\n estimateGas?: G\n ): Promise<G extends false ? string : bigint> {\n if (!nftData.templateIndex) nftData.templateIndex = 1\n\n if (!nftData.name || !nftData.symbol) {\n const { name, symbol } = generateDtName()\n nftData.name = name\n nftData.symbol = symbol\n }\n if (nftData.templateIndex > (await this.getCurrentNFTTemplateCount())) {\n throw new Error(`Template index doesnt exist`)\n }\n\n if (nftData.templateIndex === 0) {\n throw new Error(`Template index cannot be ZERO`)\n }\n if ((await this.getNFTTemplate(nftData.templateIndex)).isActive === false) {\n throw new Error(`Template is not active`)\n }\n\n const estGas = await this.contract.deployERC721Contract.estimateGas(\n nftData.name,\n nftData.symbol,\n nftData.templateIndex,\n ZERO_ADDRESS,\n ZERO_ADDRESS,\n nftData.tokenURI,\n nftData.transferable,\n nftData.owner\n )\n if (estimateGas) return <G extends false ? string : bigint>estGas\n // Invoke createToken function of the contract\n try {\n const tx = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.deployERC721Contract,\n nftData.name,\n nftData.symbol,\n nftData.templateIndex,\n ZERO_ADDRESS,\n ZERO_ADDRESS,\n nftData.tokenURI,\n nftData.transferable,\n nftData.owner\n )\n if (!tx) {\n const e =\n 'Tx for deploying new NFT contract does not exist or status is not successful.'\n console.error(e)\n throw e\n }\n const trxReceipt = await tx.wait()\n const events = getEventFromTx(trxReceipt, 'NFTCreated')\n return events.args[0]\n } catch (e) {\n console.error(`Creation of NFT failed: ${e}`)\n }\n }\n\n /**\n * Get Current NFT Count (NFT created)\n * @return {Promise<number>} Number of NFT created from this factory\n */\n public async getCurrentNFTCount(): Promise<number> {\n const nftCount = await this.contract.getCurrentNFTCount()\n return Number(nftCount)\n }\n\n /**\n * Get Current Datatoken Count\n * @return {Promise<number>} Number of DTs created from this factory\n */\n public async getCurrentTokenCount(): Promise<number> {\n const tokenCount = await this.contract.getCurrentTokenCount()\n return Number(tokenCount)\n }\n\n /**\n * Get Factory Owner\n * @return {Promise<string>} Factory Owner address\n */\n public async getOwner(): Promise<string> {\n const owner = await this.contract.owner()\n return owner\n }\n\n /**\n * Get Current NFT Template Count\n * @return {Promise<number>} Number of NFT Template added to this factory\n */\n public async getCurrentNFTTemplateCount(): Promise<number> {\n const count = await this.contract.getCurrentNFTTemplateCount()\n return Number(count)\n }\n\n /**\n * Get Current Template Datatoken (ERC20) Count\n * @return {Promise<number>} Number of Datatoken Template added to this factory\n */\n public async getCurrentTokenTemplateCount(): Promise<number> {\n const count = await this.contract.getCurrentTemplateCount()\n return Number(count)\n }\n\n /**\n * Get NFT Template\n * @param {number} index Template index\n * @return {Promise<Template>} Number of Template added to this factory\n */\n public async getNFTTemplate(index: number): Promise<Template> {\n if (index > (await this.getCurrentNFTTemplateCount())) {\n throw new Error(`Template index doesnt exist`)\n }\n\n if (index === 0) {\n throw new Error(`Template index cannot be ZERO`)\n }\n const template = await this.contract.getNFTTemplate(index)\n return template\n }\n\n /**\n * Get Datatoken (ERC20) Template\n * @param {number} index Template index\n * @return {Promise<Template>} DT Template info\n */\n public async getTokenTemplate(index: number): Promise<Template> {\n const template = await this.contract.getTokenTemplate(index)\n return template\n }\n\n /**\n * Check if Datatoken is deployed from the factory\n * @param {String} datatoken Datatoken address to check\n * @return {Promise<Boolean>} return true if deployed from this factory\n */\n public async checkDatatoken(datatoken: string): Promise<Boolean> {\n const isDeployed = await this.contract.erc20List(datatoken)\n return isDeployed\n }\n\n /**\n * Check if NFT is deployed from the factory\n * @param {String} nftAddress nftAddress address to check\n * @return {Promise<String>} return address(0) if it's not, or the nftAddress if true\n */\n public async checkNFT(nftAddress: string): Promise<String> {\n const confirmAddress = await this.contract.erc721List(nftAddress)\n return confirmAddress\n }\n\n /**\n * Add a new NFT token template - only factory Owner\n * @param {String} address caller address\n * @param {String} templateAddress template address to add\n * @param {Boolean} [estimateGas] if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async addNFTTemplate<G extends boolean = false>(\n address: string,\n templateAddress: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n if ((await this.getOwner()) !== address) {\n throw new Error(`Caller is not Factory Owner`)\n }\n if (templateAddress === ZERO_ADDRESS) {\n throw new Error(`Template cannot be ZERO address`)\n }\n\n const estGas = await this.contract.add721TokenTemplate.estimateGas(templateAddress)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.add721TokenTemplate,\n templateAddress\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Disable token template - only factory Owner\n * @param {String} address\n * @param {Number} templateIndex index of the template we want to disable\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} current token template count\n */\n public async disableNFTTemplate<G extends boolean = false>(\n address: string,\n templateIndex: number,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n if ((await this.getOwner()) !== address) {\n throw new Error(`Caller is not Factory Owner`)\n }\n if (templateIndex > (await this.getCurrentNFTTemplateCount())) {\n throw new Error(`Template index doesnt exist`)\n }\n\n if (templateIndex === 0) {\n throw new Error(`Template index cannot be ZERO`)\n }\n\n const estGas = await this.contract.disable721TokenTemplate.estimateGas(templateIndex)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.disable721TokenTemplate,\n templateIndex\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Reactivate a previously disabled token template - only factory Owner\n * @param {String} address\n * @param {Number} templateIndex index of the template we want to reactivate\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} current token template count\n */\n public async reactivateNFTTemplate<G extends boolean = false>(\n address: string,\n templateIndex: number,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n if ((await this.getOwner()) !== address) {\n throw new Error(`Caller is not Factory Owner`)\n }\n if (templateIndex > (await this.getCurrentNFTTemplateCount())) {\n throw new Error(`Template index doesnt exist`)\n }\n\n if (templateIndex === 0) {\n throw new Error(`Template index cannot be ZERO`)\n }\n\n const estGas = await this.contract.reactivate721TokenTemplate.estimateGas(\n templateIndex\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.reactivate721TokenTemplate,\n templateIndex\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Add a new NFT token template - only factory Owner\n * @param {String} address caller address\n * @param {String} templateAddress template address to add\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async addTokenTemplate<G extends boolean = false>(\n address: string,\n templateAddress: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n if ((await this.getOwner()) !== address) {\n throw new Error(`Caller is not Factory Owner`)\n }\n if (templateAddress === ZERO_ADDRESS) {\n throw new Error(`Template cannot be address ZERO`)\n }\n\n const estGas = await this.contract.addTokenTemplate.estimateGas(templateAddress)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.addTokenTemplate,\n templateAddress\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Disable token template - only factory Owner\n * @param {String} address caller address\n * @param {Number} templateIndex index of the template we want to disable\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} current token template count\n */\n public async disableTokenTemplate<G extends boolean = false>(\n address: string,\n templateIndex: number,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n if ((await this.getOwner()) !== address) {\n throw new Error(`Caller is not Factory Owner`)\n }\n if (templateIndex > (await this.getCurrentTokenTemplateCount())) {\n throw new Error(`Template index doesnt exist`)\n }\n\n if (templateIndex === 0) {\n throw new Error(`Template index cannot be ZERO`)\n }\n if ((await this.getTokenTemplate(templateIndex)).isActive === false) {\n throw new Error(`Template is already disabled`)\n }\n\n const estGas = await this.contract.disableTokenTemplate.estimateGas(templateIndex)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.disableTokenTemplate,\n templateIndex\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Reactivate a previously disabled token template - only factory Owner\n * @param {String} address caller address\n * @param {Number} templateIndex index of the template we want to reactivate\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} current token template count\n */\n public async reactivateTokenTemplate<G extends boolean = false>(\n address: string,\n templateIndex: number,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n if ((await this.getOwner()) !== address) {\n throw new Error(`Caller is not Factory Owner`)\n }\n if (templateIndex > (await this.getCurrentTokenTemplateCount())) {\n throw new Error(`Template index doesnt exist`)\n }\n\n if (templateIndex === 0) {\n throw new Error(`Template index cannot be ZERO`)\n }\n if ((await this.getTokenTemplate(templateIndex)).isActive === true) {\n throw new Error(`Template is already active`)\n }\n\n const estGas = await this.contract.reactivateTokenTemplate.estimateGas(templateIndex)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.reactivateTokenTemplate,\n templateIndex\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Used as a proxy to order multiple services\n * Users can have inifinite approvals for fees for factory instead of having one approval/ Datatoken contract\n * Requires previous approval of all :\n * - consumeFeeTokens\n * - publishMarketFeeTokens\n * - ERC20 Datatokens\n * @param {TokenOrder[]} orders array of orders\n * @param {Boolean} [estimateGas] if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transaction receipt\n */\n public async startMultipleTokenOrder<G extends boolean = false>(\n orders: TokenOrder[],\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n if (orders.length > 50) {\n throw new Error(`Too many orders`)\n }\n\n const estGas = await this.contract.startMultipleTokenOrder.estimateGas(orders)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.startMultipleTokenOrder,\n orders\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Creates a new NFT, then a datatoken,all in one call\n * @param {NftCreateData} nftCreateData - The data required to create an NFT.\n * @param {DatatokenCreateParams} dtParams - The parameters required to create a datatoken.\n * @param {boolean} [estimateGas] - Whether to return only estimate gas or not.\n * @return {Promise<ReceiptOrEstimate>} transaction receipt\n */\n\n public async createNftWithDatatoken<G extends boolean = false>(\n nftCreateData: NftCreateData,\n dtParams: DatatokenCreateParams,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const ercCreateData = await this.getErcCreationParams(dtParams)\n\n const estGas = await this.contract.createNftWithErc20.estimateGas(\n nftCreateData,\n ercCreateData\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.createNftWithErc20,\n nftCreateData,\n ercCreateData\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Creates an NFT with a datatoken with a fixed rate all in one call.\n * be aware if Fixed Rate creation fails, you are still going to pay a lot of gas\n * @param {NftCreateData} nftCreateData - The data required to create an NFT.\n * @param {DatatokenCreateParams} dtParams - The parameters required to create a datatoken.\n * @param {FreCreationParams} freParams - The parameters required to create a fixed-rate exchange contract.\n * @param {boolean} [estimateGas] - Whether to return only estimate gas or not.\n * @returns {Promis<ReceiptOrEstimate<G>>}\n */\n public async createNftWithDatatokenWithFixedRate<G extends boolean = false>(\n nftCreateData: NftCreateData,\n dtParams: DatatokenCreateParams,\n freParams: FreCreationParams,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const ercCreateData = await this.getErcCreationParams(dtParams)\n const fixedData = await this.getFreCreationParams(freParams)\n\n const estGas = await this.contract.createNftWithErc20WithFixedRate.estimateGas(\n nftCreateData,\n ercCreateData,\n fixedData\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.createNftWithErc20WithFixedRate,\n nftCreateData,\n ercCreateData,\n fixedData\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Creates an NFT with a datatoken with a dispenser in one call.\n * Be aware if Fixed Rate creation fails, you are still going to pay a lot of gas\n * @param {NftCreateData} nftCreateData - The data required to create an NFT.\n * @param {DatatokenCreateParams} dtParams - The parameters required to create a datatoken.\n * @param {DispenserCreationParams} dispenserParams - The parameters required to create a dispenser contract.\n * @param {boolean} [estimateGas] - Whether to estimate gas or not.\n * @returns {Promis<ReceiptOrEstimate<G>>}\n */\n public async createNftWithDatatokenWithDispenser<G extends boolean = false>(\n nftCreateData: NftCreateData,\n dtParams: DatatokenCreateParams,\n dispenserParams: DispenserCreationParams,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const ercCreateData = await this.getErcCreationParams(dtParams)\n\n dispenserParams.maxBalance = await this.amountToUnits(\n null,\n dispenserParams.maxBalance,\n 18\n )\n\n dispenserParams.maxTokens = await this.amountToUnits(\n null,\n dispenserParams.maxTokens,\n 18\n )\n\n const estGas = await this.contract.createNftWithErc20WithDispenser.estimateGas(\n nftCreateData,\n ercCreateData,\n dispenserParams\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.createNftWithErc20WithDispenser,\n nftCreateData,\n ercCreateData,\n dispenserParams\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Gets the parameters required to create an ERC20 token.\n * @param {DatatokenCreateParams} dtParams - The parameters required to create a datatoken.\n * @returns {Promise<any>}\n */\n private async getErcCreationParams(dtParams: DatatokenCreateParams): Promise<any> {\n let name: string, symbol: string\n // Generate name & symbol if not present\n if (!dtParams.name || !dtParams.symbol) {\n ;({ name, symbol } = generateDtName())\n }\n\n let feeTokenDecimals = 18\n if (dtParams.feeToken !== ZERO_ADDRESS) {\n try {\n feeTokenDecimals = await getTokenDecimals(this.signer, dtParams.feeToken)\n } catch (error) {\n LoggerInstance.error('getTokenDecimals error', error)\n }\n }\n\n // common stuff for other templates\n const addresses = [\n dtParams.minter,\n dtParams.paymentCollector,\n dtParams.mpFeeAddress,\n dtParams.feeToken\n ]\n\n if (dtParams.filesObject) {\n // template 4 only, ignored for others\n if (dtParams.accessListFactory) {\n addresses.push(dtParams.accessListFactory)\n }\n if (dtParams.allowAccessList) {\n addresses.push(dtParams.allowAccessList)\n }\n\n if (dtParams.denyAccessList) {\n addresses.push(dtParams.denyAccessList)\n }\n }\n\n return {\n templateIndex: dtParams.templateIndex,\n strings: [dtParams.name || name, dtParams.symbol || symbol],\n addresses,\n uints: [\n await this.amountToUnits(null, dtParams.cap, 18),\n await this.amountToUnits(null, dtParams.feeAmount, feeTokenDecimals)\n ],\n bytess: dtParams.filesObject\n ? [toUtf8Bytes(JSON.stringify(dtParams.filesObject))]\n : []\n }\n }\n\n /**\n * Gets the parameters required to create a fixed-rate exchange contract.\n * @param {FreCreationParams} freParams - The parameters required to create a fixed-rate exchange contract.\n * @returns {Promise<any> }\n */\n private async getFreCreationParams(freParams: FreCreationParams): Promise<any> {\n if (!freParams.allowedConsumer) freParams.allowedConsumer = ZERO_ADDRESS\n const withMint = freParams.withMint === false ? 0 : 1\n\n return {\n fixedPriceAddress: freParams.fixedRateAddress,\n addresses: [\n freParams.baseTokenAddress,\n freParams.owner,\n freParams.marketFeeCollector,\n freParams.allowedConsumer\n ],\n uints: [\n freParams.baseTokenDecimals,\n freParams.datatokenDecimals,\n await this.amountToUnits(null, freParams.fixedRate, 18),\n await this.amountToUnits(null, freParams.marketFee, 18),\n withMint\n ]\n }\n }\n}\n","import { ethers, Signer } from 'ethers'\nimport { NftFactory } from '../contracts/NFTFactory.js'\nimport fs from 'fs'\n// eslint-disable-next-line import/no-named-default\nimport ERC20Template from '@oceanprotocol/contracts/artifacts/contracts/interfaces/IERC20Template.sol/IERC20Template.json'\n// eslint-disable-next-line import/no-named-default, prettier/prettier\nimport { default as Addresses } from '@oceanprotocol/contracts/addresses/address.json'\n/**\n * Get the artifacts address from the address.json file\n * either from the env or from the ocean-contracts dir\n * @returns data or null\n */\nexport function getOceanArtifactsAddresses(): any {\n try {\n if (process.env.ADDRESS_FILE) {\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n const data = fs.readFileSync(process.env.ADDRESS_FILE, 'utf8')\n return JSON.parse(data)\n }\n return Addresses\n } catch (error) {\n return Addresses\n }\n}\n\n/**\n * Get the artifacts address from the address.json file, for the given chain\n * either from the env or from the ocean-contracts dir, safer than above, because sometimes the network name\n * is mispeled, best example \"optimism_sepolia\" vs \"optimism-sepolia\"\n * @returns data or null\n */\nexport function getOceanArtifactsAddressesByChainId(chain: number): any {\n try {\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n const data = getOceanArtifactsAddresses()\n if (data) {\n const networks = Object.keys(data)\n for (const network of networks) {\n if (data[network].chainId === chain) {\n return data[network]\n }\n }\n }\n } catch (error) {\n console.error(error)\n }\n return null\n}\n/**\n * Use this function to accurately calculate the template index, and also checking if the template is active\n * @param owner the signer account\n * @param nftContractAddress the nft contract address, usually artifactsAddresses.ERC721Factory\n * @param template the template ID or template address (from smart contract getId() function)\n * @returns index of the template on the list\n */\nexport async function calculateActiveTemplateIndex(\n owner: Signer,\n nftContractAddress: string, // addresses.ERC721Factory,\n template: string | number,\n chainID?: number\n): Promise<number> {\n // is an ID number?\n const isTemplateID = typeof template === 'number'\n\n const factoryERC721 = new NftFactory(nftContractAddress, owner, chainID)\n const currentTokenCount = await factoryERC721.getCurrentTokenTemplateCount()\n for (let i = 1; i <= currentTokenCount; i++) {\n const tokenTemplate = await factoryERC721.getTokenTemplate(i)\n\n const erc20Template = new ethers.Contract(\n tokenTemplate.templateAddress,\n ERC20Template.abi,\n owner\n )\n\n // check for ID\n if (isTemplateID) {\n const id = await erc20Template.getId()\n if (tokenTemplate.isActive && id.toString() === template.toString()) {\n return i\n }\n } else if (\n tokenTemplate.isActive &&\n tokenTemplate.templateAddress === template.toString()\n ) {\n return i\n }\n }\n // if nothing is found it returns -1\n return -1\n}\n","import { hexlify, keccak256, toUtf8Bytes, toUtf8String } from 'ethers'\nimport ERC721Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC721Template.sol/ERC721Template.json'\nimport {\n MetadataAndTokenURI,\n NftRoles,\n ReceiptOrEstimate,\n AbiItem\n} from '../@types/index.js'\nimport { SmartContract } from './SmartContract.js'\n\nimport { generateDtName } from '../utils/DatatokenName.js'\nimport { ZERO_ADDRESS } from '../utils/Constants.js'\nimport { getEventFromTx, sendTx } from '../utils/ContractUtils.js'\nimport {\n calculateActiveTemplateIndex,\n getOceanArtifactsAddressesByChainId\n} from '../utils/Addresses.js'\nimport { MetadataProof } from '@oceanprotocol/ddo-js'\nexport class Nft extends SmartContract {\n getDefaultAbi() {\n return ERC721Template.abi as AbiItem[]\n }\n\n /**\n * Create new ERC20 Datatoken - only user with DatatokenDeployer permission can succeed\n * @param {String} nftAddress NFT address\n * @param {String} address User address\n * @param {String} minter User set as initial minter for the Datatoken\n * @param {String} paymentCollector initial paymentCollector for this DT\n * @param {String} mpFeeAddress Consume marketplace fee address\n * @param {String} feeToken address of the token marketplace wants to add fee on top\n * @param {String} feeAmount amount of feeToken to be transferred to mpFeeAddress on top, will be converted to WEI\n * @param {String} cap Maximum cap (Number) - will be converted to wei\n * @param {String} name Token name\n * @param {String} symbol Token symbol\n * @param {Number} templateIndex NFT template index\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<string>} ERC20 Datatoken address\n */\n public async createDatatoken<G extends boolean = false>(\n nftAddress: string,\n address: string,\n minter: string,\n paymentCollector: string,\n mpFeeAddress: string,\n feeToken: string,\n feeAmount: string,\n cap: string,\n name?: string,\n symbol?: string,\n templateIndex?: number,\n filesObject?: string,\n accessListContract?: string,\n allowAccessList?: string,\n denyAccessList?: string,\n estimateGas?: G\n ): Promise<G extends false ? string : BigInt> {\n if ((await this.getNftPermissions(nftAddress, address)).deployERC20 !== true) {\n throw new Error(`Caller is not DatatokenDeployer`)\n }\n if (!templateIndex) templateIndex = 1\n\n // Generate name & symbol if not present\n if (!name || !symbol) {\n ;({ name, symbol } = generateDtName())\n }\n\n // Create 721contract object\n const nftContract = this.getContract(nftAddress)\n\n if (!this.signer.provider) {\n throw new Error('Provider is required but not available')\n }\n const { chainId } = await this.signer.provider.getNetwork()\n const artifacts = getOceanArtifactsAddressesByChainId(Number(chainId))\n if (filesObject) {\n templateIndex = await calculateActiveTemplateIndex(\n this.signer,\n artifacts.ERC721Factory,\n 4,\n Number(chainId)\n )\n }\n const estGas = await nftContract.createERC20.estimateGas(\n templateIndex,\n [name, symbol],\n [minter, paymentCollector, mpFeeAddress, feeToken],\n [\n await this.amountToUnits(null, cap, 18),\n await this.amountToUnits(null, feeAmount, 18)\n ],\n []\n )\n if (estimateGas) return <G extends false ? string : bigint>estGas\n\n const addresses = [minter, paymentCollector, mpFeeAddress, feeToken]\n if (accessListContract) {\n addresses.push(accessListContract.toLowerCase())\n if (allowAccessList) {\n addresses.push(allowAccessList.toLowerCase())\n } else {\n addresses.push(ZERO_ADDRESS)\n }\n if (denyAccessList) {\n addresses.push(denyAccessList)\n } else {\n addresses.push(ZERO_ADDRESS)\n }\n }\n\n const tx = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n nftContract.createERC20,\n templateIndex,\n [name, symbol],\n addresses,\n [\n await this.amountToUnits(null, cap, 18),\n await this.amountToUnits(null, feeAmount, 18)\n ],\n filesObject ? [toUtf8Bytes(filesObject)] : []\n )\n const trxReceipt = await tx.wait()\n const event = getEventFromTx(trxReceipt, 'TokenCreated')\n return event?.args[0]\n }\n\n /**\n * Add Manager for NFT Contract (only NFT Owner can succeed)\n * @param {String} nftAddress NFT contract address\n * @param {String} address NFT Owner adress\n * @param {String} manager User adress which is going to be assing manager\n * @param {Boolean} [estimateGas] if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} trxReceipt\n */\n public async addManager<G extends boolean = false>(\n nftAddress: string,\n address: string,\n manager: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const nftContract = this.getContract(nftAddress)\n\n if ((await this.getNftOwner(nftAddress)) !== address) {\n throw new Error(`Caller is not NFT Owner`)\n }\n\n const estGas = await nftContract.addManager.estimateGas(manager)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n nftContract.addManager,\n manager\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Removes a specific manager for NFT Contract (only NFT Owner can succeed)\n * @param {String} nftAddress NFT contract address\n * @param {String} address NFT Owner adress\n * @param {String} manager User adress which is going to be removed as manager\n * @param {Boolean} [estimateGas] if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} trxReceipt\n */\n public async removeManager<G extends boolean = false>(\n nftAddress: string,\n address: string,\n manager: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const nftContract = this.getContract(nftAddress)\n\n if ((await this.getNftOwner(nftAddress)) !== address) {\n throw new Error(`Caller is not NFT Owner`)\n }\n\n const estGas = await nftContract.removeManager.estimateGas(manager)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n nftContract.removeManager,\n manager\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Add DatatokenDeployer permission - only Manager can succeed\n * @param {String} nftAddress NFT contract address\n * @param {String} address NFT Manager adress\n * @param {String} datatokenDeployer User adress which is going to have DatatokenDeployer permission\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} trxReceipt\n */\n public async addDatatokenDeployer<G extends boolean = false>(\n nftAddress: string,\n address: string,\n datatokenDeployer: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const nftContract = this.getContract(nftAddress)\n\n if ((await this.getNftPermissions(nftAddress, address)).manager !== true) {\n throw new Error(`Caller is not Manager`)\n }\n\n // Estimate gas for addToCreateERC20List method\n const estGas = await nftContract.addToCreateERC20List.estimateGas(datatokenDeployer)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n nftContract.addToCreateERC20List,\n datatokenDeployer\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Remove DatatokenDeployer permission - only Manager can succeed\n * @param {String} nftAddress NFT contract address\n * @param {String} address NFT Manager adress\n * @param {String} datatokenDeployer Address of the user to be revoked DatatokenDeployer Permission\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} trxReceipt\n */\n public async removeDatatokenDeployer<G extends boolean = false>(\n nftAddress: string,\n address: string,\n datatokenDeployer: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const nftContract = this.getContract(nftAddress)\n\n if (\n (await this.getNftPermissions(nftAddress, address)).manager !== true ||\n (address === datatokenDeployer &&\n (await this.getNftPermissions(nftAddress, address)).deployERC20 !== true)\n ) {\n throw new Error(`Caller is not Manager nor DatatokenDeployer`)\n }\n const estGas = await nftContract.removeFromCreateERC20List.estimateGas(\n datatokenDeployer\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n nftContract.removeFromCreateERC20List,\n datatokenDeployer\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Add Metadata Updater permission - only Manager can succeed\n * @param {String} nftAddress NFT contract address\n * @param {String} address NFT Manager adress\n * @param {String} metadataUpdater User adress which is going to have Metadata Updater permission\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} trxReceipt\n */\n public async addMetadataUpdater<G extends boolean = false>(\n nftAddress: string,\n address: string,\n metadataUpdater: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const nftContract = this.getContract(nftAddress)\n\n if ((await this.getNftPermissions(nftAddress, address)).manager !== true) {\n throw new Error(`Caller is not Manager`)\n }\n\n const estGas = await nftContract.addToMetadataList.estimateGas(metadataUpdater)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n nftContract.addToMetadataList,\n metadataUpdater\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Remove Metadata Updater permission - only Manager can succeed\n * @param {String} nftAddress NFT contract address\n * @param {String} address NFT Manager adress\n * @param {String} metadataUpdater Address of the user to be revoked Metadata updater Permission\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} trxReceipt\n */\n public async removeMetadataUpdater<G extends boolean = false>(\n nftAddress: string,\n address: string,\n metadataUpdater: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const nftContract = this.getContract(nftAddress)\n if (\n (await this.getNftPermissions(nftAddress, address)).manager !== true ||\n (address !== metadataUpdater &&\n (await this.getNftPermissions(nftAddress, address)).updateMetadata !== true)\n ) {\n throw new Error(`Caller is not Manager nor Metadata Updater`)\n }\n\n const estGas = await nftContract.removeFromMetadataList.estimateGas(metadataUpdater)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n nftContract.removeFromMetadataList,\n metadataUpdater\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Add Store Updater permission - only Manager can succeed\n * @param {String} nftAddress NFT contract address\n * @param {String} address NFT Manager adress\n * @param {String} storeUpdater User adress which is going to have Store Updater permission\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} trxReceipt\n */\n public async addStoreUpdater<G extends boolean = false>(\n nftAddress: string,\n address: string,\n storeUpdater: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const nftContract = this.getContract(nftAddress)\n\n if ((await this.getNftPermissions(nftAddress, address)).manager !== true) {\n throw new Error(`Caller is not Manager`)\n }\n\n const estGas = await nftContract.addTo725StoreList.estimateGas(storeUpdater)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n nftContract.addTo725StoreList,\n storeUpdater\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Remove Store Updater permission - only Manager can succeed\n * @param {String} nftAddress NFT contract address\n * @param {String} address NFT Manager adress\n * @param {String} storeUpdater Address of the user to be revoked Store Updater Permission\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} trxReceipt\n */\n public async removeStoreUpdater<G extends boolean = false>(\n nftAddress: string,\n address: string,\n storeUpdater: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const nftContract = this.getContract(nftAddress)\n if (\n (await this.getNftPermissions(nftAddress, address)).manager !== true ||\n (address !== storeUpdater &&\n (await this.getNftPermissions(nftAddress, address)).store !== true)\n ) {\n throw new Error(`Caller is not Manager nor storeUpdater`)\n }\n\n const estGas = await nftContract.removeFrom725StoreList.estimateGas(storeUpdater)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n nftContract.removeFrom725StoreList,\n storeUpdater\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * This function allows to remove all ROLES at NFT level: Managers, DatatokenDeployer, MetadataUpdater, StoreUpdater\n * Even NFT Owner has to readd himself as Manager\n * Permissions at Datatoken level stay.\n * Only NFT Owner can call it.\n * @param {String} nftAddress NFT contract address\n * @param {String} address NFT Owner adress\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} trxReceipt\n */\n public async cleanPermissions<G extends boolean = false>(\n nftAddress: string,\n address: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const nftContract = this.getContract(nftAddress)\n if ((await this.getNftOwner(nftAddress)) !== address) {\n throw new Error(`Caller is not NFT Owner`)\n }\n\n const estGas = await nftContract.cleanPermissions.estimateGas()\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n nftContract.cleanPermissions\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Transfers the NFT\n * will clean all permissions both on NFT and Datatoken level.\n * @param {String} nftAddress NFT contract address\n * @param {String} nftOwner Current NFT Owner adress\n * @param {String} nftReceiver User which will receive the NFT, will also be set as Manager\n * @param {Number} tokenId The id of the token to be transfered\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} trxReceipt\n */\n public async transferNft<G extends boolean = false>(\n nftAddress: string,\n nftOwner: string,\n nftReceiver: string,\n tokenId?: number,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const nftContract = this.getContract(nftAddress)\n if ((await this.getNftOwner(nftAddress)) !== nftOwner) {\n throw new Error(`Caller is not NFT Owner`)\n }\n\n const tokenIdentifier = tokenId || 1\n\n const estGas = await nftContract.transferFrom.estimateGas(\n nftOwner,\n nftReceiver,\n tokenIdentifier\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n nftContract.transferFrom,\n nftOwner,\n nftReceiver,\n tokenIdentifier\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * safeTransferNFT Used for transferring the NFT, can be used by an approved relayer\n * will clean all permissions both on NFT and Datatoken level.\n * @param {String} nftAddress NFT contract address\n * @param {String} nftOwner Current NFT Owner adress\n * @param {String} nftReceiver User which will receive the NFT, will also be set as Manager\n * @param {Number} tokenId The id of the token to be transfered\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} trxReceipt\n */\n public async safeTransferNft<G extends boolean = false>(\n nftAddress: string,\n nftOwner: string,\n nftReceiver: string,\n tokenId?: number,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const nftContract = this.getContract(nftAddress)\n if ((await this.getNftOwner(nftAddress)) !== nftOwner) {\n throw new Error(`Caller is not NFT Owner`)\n }\n\n const tokenIdentifier = tokenId || 1\n\n const estGas = await nftContract.safeTransferFrom.estimateGas(\n nftOwner,\n nftReceiver,\n tokenIdentifier\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n nftContract.safeTransferFrom,\n nftOwner,\n nftReceiver,\n tokenIdentifier\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Creates or update Metadata cached by Aquarius. Also, updates the METADATA_DECRYPTOR key\n * @param {String} nftAddress NFT contract address\n * @param {String} address Caller address NFT Owner adress\n * @param {Number} metadataState\n * @param {String} metadataDecryptorUrl\n * @param {String} metadataDecryptorAddress\n * @param {String} flags\n * @param {String} data\n * @param {String} metadataHash\n * @param {MetadataProof[]} metadataProofs\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} trxReceipt\n */\n public async setMetadata<G extends boolean = false>(\n nftAddress: string,\n address: string,\n metadataState: number,\n metadataDecryptorUrl: string,\n metadataDecryptorAddress: string,\n flags: string,\n data: string,\n metadataHash: string,\n metadataProofs?: MetadataProof[],\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const nftContract = this.getContract(nftAddress)\n if (!metadataProofs) metadataProofs = []\n if (!(await this.getNftPermissions(nftAddress, address)).updateMetadata) {\n throw new Error(`Caller is not Metadata updater`)\n }\n const estGas = await nftContract.setMetaData.estimateGas(\n metadataState,\n metadataDecryptorUrl,\n metadataDecryptorAddress,\n flags,\n data,\n metadataHash,\n metadataProofs\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.signer,\n this.config?.gasFeeMultiplier,\n nftContract.setMetaData,\n metadataState,\n metadataDecryptorUrl,\n metadataDecryptorAddress,\n flags,\n data,\n metadataHash,\n metadataProofs\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Helper function to improve UX sets both MetaData & TokenURI in one tx\n * @param {String} nftAddress NFT contract address\n * @param {String} address Caller address\n * @param {MetadataAndTokenURI} metadataAndTokenURI metaDataAndTokenURI object\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} trxReceipt\n */\n public async setMetadataAndTokenURI<G extends boolean = false>(\n nftAddress: string,\n metadataUpdater: string,\n metadataAndTokenURI: MetadataAndTokenURI,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const nftContract = this.getContract(nftAddress)\n if (!(await this.getNftPermissions(nftAddress, metadataUpdater)).updateMetadata) {\n throw new Error(`Caller is not Metadata updater`)\n }\n const sanitizedMetadataAndTokenURI = {\n ...metadataAndTokenURI,\n metadataProofs: metadataAndTokenURI.metadataProofs || []\n }\n const estGas = await nftContract.setMetaDataAndTokenURI.estimateGas(\n sanitizedMetadataAndTokenURI\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.signer,\n this.config?.gasFeeMultiplier,\n nftContract.setMetaDataAndTokenURI,\n sanitizedMetadataAndTokenURI\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * setMetadataState Used for updating the metadata State\n * @param {String} nftAddress NFT contract address\n * @param {String} address Caller address => metadata updater\n * @param {Number} metadataState new metadata state\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} trxReceipt\n */\n public async setMetadataState<G extends boolean = false>(\n nftAddress: string,\n address: string,\n metadataState: number,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const nftContract = this.getContract(nftAddress)\n if (!(await this.getNftPermissions(nftAddress, address)).updateMetadata) {\n throw new Error(`Caller is not Metadata updater`)\n }\n\n const estGas = await nftContract.setMetaDataState.estimateGas(metadataState)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n nftContract.setMetaDataState,\n metadataState\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * set TokenURI on an nft\n * @param {String} nftAddress NFT contract address\n * @param {String} data input data for TokenURI\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transaction receipt\n */\n public async setTokenURI<G extends boolean = false>(\n nftAddress: string,\n data: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const nftContract = this.getContract(nftAddress)\n const estGas = await nftContract.setTokenURI.estimateGas('1', data)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n nftContract.setTokenURI,\n '1',\n data\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Get NFT Owner\n * @param {String} nftAddress NFT contract address\n * @return {Promise<string>} string\n */\n public async getNftOwner(nftAddress: string): Promise<string> {\n const nftContract = this.getContract(nftAddress)\n const trxReceipt = await nftContract.ownerOf(1)\n return trxReceipt\n }\n\n /**\n * Gets NFT Permissions for a specified user\n * @param {String} nftAddress NFT contract address\n * @param {String} address user adress\n * @return {Promise<NftRoles>}\n */\n public async getNftPermissions(nftAddress: string, address: string): Promise<NftRoles> {\n const nftContract = this.getContract(nftAddress)\n const roles = await nftContract.getPermissions(address)\n return roles\n }\n\n /**\n * Returns Metadata details for an NFT\n * @param {String} nftAddress NFT contract address\n * @return {Promise<Objecta>}\n */\n public async getMetadata(nftAddress: string): Promise<Object> {\n const nftContract = this.getContract(nftAddress)\n return await nftContract.getMetaData()\n }\n\n /**\n * Checks if user has DatatokenDeployer role\n * @param {String} nftAddress NFT contract address\n * @param {String} address user adress\n * @return {Promise<boolean>}\n */\n public async isDatatokenDeployer(\n nftAddress: string,\n address: string\n ): Promise<boolean> {\n const nftContract = this.getContract(nftAddress)\n const isDatatokenDeployer = await nftContract.isERC20Deployer(address)\n return isDatatokenDeployer\n }\n\n /**\n * Allows users to store data with a preset key (keccak256(ERC20Address)) into NFT 725 Store\n * only ERC20Deployer can succeed\n * @param {string} nftAddress Nft datatoken adress\n * @param {string} address User adress\n * @param {string} key Key of the data to be stored into 725Y standard\n * @param {string} value Data to be stored into 725Y standard\n * @param {boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transactionId\n */\n public async setData<G extends boolean = false>(\n nftAddress: string,\n address: string,\n key: string,\n value: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n if ((await this.getNftPermissions(nftAddress, address)).store !== true) {\n throw new Error(`User is not ERC20 store updater`)\n }\n\n const nftContract = this.getContract(nftAddress)\n const keyHash = keccak256(key)\n const valueHex = hexlify(toUtf8Bytes(value))\n\n const estGas = await nftContract.setNewData.estimateGas(keyHash, valueHex)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n nftContract.setNewData,\n keyHash,\n valueHex\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Gets stored data at a given `key` in an NFT\n * @param {string} nftAddress - The address of the NFT.\n * @param {string} key - The key of the data to get.\n * @return {Promise<string>} The data stored at the key\n */\n public async getData(nftAddress: string, key: string): Promise<string> {\n const nftContract = this.getContract(nftAddress)\n const keyHash = keccak256(key)\n const data = await nftContract.getData(keyHash)\n return data ? toUtf8String(data) : null\n }\n\n /**\n * Gets the token URI of an NFT.\n * @param {string} nftAddress - The address of the NFT.\n * @param {number} id - The ID of the token.\n * @returns {Promise&lt;string&gt;}\n */\n public async getTokenURI(nftAddress: string, id: number): Promise<string> {\n const nftContract = this.getContract(nftAddress)\n const data = await nftContract.tokenURI(id)\n return data\n }\n\n /**\n * Is datatoken deployed?\n * @param {string} nftAddress - The address of the NFT.\n * @param {string} datatokenAddress - The datatoken address.\n * @returns {Promise<boolean>}\n */\n public async isDatatokenDeployed(\n nftAddress: string,\n datatokenAddress: string\n ): Promise<boolean> {\n const nftContract = this.getContract(nftAddress)\n const data = await nftContract.isDeployed(datatokenAddress)\n return data\n }\n}\n","import { hexlify, Signer, toUtf8Bytes } from 'ethers'\nimport Decimal from 'decimal.js'\nimport ERC20Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC20Template.sol/ERC20Template.json'\nimport ERC20TemplateEnterprise from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC20TemplateEnterprise.sol/ERC20TemplateEnterprise.json'\nimport { amountToUnits, sendTx } from '../utils/ContractUtils.js'\nimport { ZERO_ADDRESS } from '../utils/Constants.js'\nimport {\n AbiItem,\n ConsumeMarketFee,\n FreOrderParams,\n FreCreationParams,\n ProviderFees,\n PublishingMarketFee,\n DispenserParams,\n OrderParams,\n DatatokenRoles,\n ReceiptOrEstimate\n} from '../@types/index.js'\nimport { Nft } from './NFT.js'\nimport { Config } from '../config/index.js'\nimport { SmartContract } from './SmartContract.js'\n\nexport class Datatoken extends SmartContract {\n public abiEnterprise: AbiItem[]\n public nft: Nft\n\n getDefaultAbi() {\n return ERC20Template.abi as AbiItem[]\n }\n\n /**\n * Instantiate Datatoken class\n * @param {Signer} signer The signer object.\n * @param {string | number} [network] Network id or name\n * @param {Config} [config] The configuration object.\n * @param {AbiItem[]} [abi] ABI array of the smart contract\n * @param {AbiItem[]} abiEnterprise Enterprise ABI array of the smart contract\n */\n constructor(\n signer: Signer,\n network?: string | number,\n config?: Config,\n abi?: AbiItem[],\n abiEnterprise?: AbiItem[]\n ) {\n super(signer, network, config, abi)\n this.abiEnterprise = abiEnterprise || (ERC20TemplateEnterprise.abi as AbiItem[])\n this.nft = new Nft(this.signer, network)\n }\n\n /**\n * Approves a spender to spend a certain amount of datatokens.\n * @param {String} dtAddress Datatoken address\n * @param {String} spender Spender address\n * @param {string} amount Number of datatokens, as number. Will be converted to wei\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async approve<G extends boolean = false>(\n dtAddress: string,\n spender: string,\n amount: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const dtContract = this.getContract(dtAddress)\n const estGas = await dtContract.approve.estimateGas(\n spender,\n amountToUnits(null, null, amount, 18)\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n dtContract.approve,\n spender,\n amountToUnits(null, null, amount, 18)\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Creates a new FixedRateExchange setup.\n * @param {String} dtAddress Datatoken address\n * @param {String} address Caller address\n * @param {FixedRateParams} fixedRateParams The parameters required to create a fixed-rate exchange contract.\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async createFixedRate<G extends boolean = false>(\n dtAddress: string,\n address: string,\n fixedRateParams: FreCreationParams,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const dtContract = this.getContract(dtAddress)\n if (!(await this.isDatatokenDeployer(dtAddress, address))) {\n throw new Error(`User is not Datatoken Deployer`)\n }\n if (!fixedRateParams.allowedConsumer) fixedRateParams.allowedConsumer = ZERO_ADDRESS\n\n const withMint = fixedRateParams.withMint === false ? 0 : 1\n\n // should check DatatokenDeployer role using NFT level ..\n\n const estGas = await dtContract.createFixedRate.estimateGas(\n fixedRateParams.fixedRateAddress,\n [\n fixedRateParams.baseTokenAddress,\n fixedRateParams.owner,\n fixedRateParams.marketFeeCollector,\n fixedRateParams.allowedConsumer\n ],\n [\n fixedRateParams.baseTokenDecimals,\n fixedRateParams.datatokenDecimals,\n fixedRateParams.fixedRate,\n fixedRateParams.marketFee,\n withMint\n ]\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n dtContract.createFixedRate,\n fixedRateParams.fixedRateAddress,\n [\n fixedRateParams.baseTokenAddress,\n fixedRateParams.owner,\n fixedRateParams.marketFeeCollector,\n fixedRateParams.allowedConsumer\n ],\n [\n fixedRateParams.baseTokenDecimals,\n fixedRateParams.datatokenDecimals,\n fixedRateParams.fixedRate,\n fixedRateParams.marketFee,\n withMint\n ]\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Creates a new Dispenser\n * @param {String} dtAddress Datatoken address\n * @param {String} address Caller address\n * @param {String} dispenserAddress Dispenser contract address\n * @param {DispenserParams} dispenserParams The parameters required to create a dispenser contract.\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transactionId\n */\n public async createDispenser<G extends boolean = false>(\n dtAddress: string,\n address: string,\n dispenserAddress: string,\n dispenserParams: DispenserParams,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n if (!(await this.isDatatokenDeployer(dtAddress, address))) {\n throw new Error(`User is not Datatoken Deployer`)\n }\n\n const dtContract = this.getContract(dtAddress)\n if (!dispenserParams.allowedSwapper) dispenserParams.allowedSwapper = ZERO_ADDRESS\n\n dispenserParams.withMint = dispenserParams.withMint !== false\n\n // should check DatatokenDeployer role using NFT level ..\n\n const estGas = await dtContract.createDispenser.estimateGas(\n dispenserAddress,\n dispenserParams.maxTokens,\n dispenserParams.maxBalance,\n dispenserParams.withMint,\n dispenserParams.allowedSwapper\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n dtContract.createDispenser,\n dispenserAddress,\n dispenserParams.maxTokens,\n dispenserParams.maxBalance,\n dispenserParams.withMint,\n dispenserParams.allowedSwapper\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Mints datatokens\n * @param {String} dtAddress Datatoken address\n * @param {String} address Minter address\n * @param {String} amount Number of datatokens, as number. Will be converted to wei\n * @param {String} toAddress only if toAddress is different from the minter\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transactionId\n */\n public async mint<G extends boolean = false>(\n dtAddress: string,\n address: string,\n amount: string,\n toAddress?: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const dtContract = this.getContract(dtAddress)\n if ((await this.getPermissions(dtAddress, address)).minter !== true) {\n throw new Error(`Caller is not Minter`)\n }\n\n const capAvailble = await this.getCap(dtAddress)\n if (new Decimal(capAvailble).gte(amount)) {\n const estGas = await dtContract.mint.estimateGas(\n toAddress || address,\n amountToUnits(null, null, amount, 18)\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n dtContract.mint,\n toAddress || address,\n amountToUnits(null, null, amount, 18)\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n } else {\n throw new Error(`Mint amount exceeds cap available`)\n }\n }\n\n /**\n * Add Minter for an ERC20 Datatoken\n * only DatatokenDeployer can succeed\n * @param {String} dtAddress Datatoken address\n * @param {String} address caller address\n * @param {String} minter address which is going to be a Minter\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transactionId\n */\n public async addMinter<G extends boolean = false>(\n dtAddress: string,\n address: string,\n minter: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const dtContract = this.getContract(dtAddress)\n if ((await this.isDatatokenDeployer(dtAddress, address)) !== true) {\n throw new Error(`Caller is not DatatokenDeployer`)\n }\n // Estimate gas cost for addMinter method\n const estGas = await dtContract.addMinter.estimateGas(minter)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n dtContract.addMinter,\n minter\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Revoke Minter permission for an ERC20 Datatoken\n * only DatatokenDeployer can succeed\n * @param {String} dtAddress Datatoken address\n * @param {String} address caller address\n * @param {String} minter address which will have removed the Minter permission\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async removeMinter<G extends boolean = false>(\n dtAddress: string,\n address: string,\n minter: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const dtContract = this.getContract(dtAddress)\n if ((await this.isDatatokenDeployer(dtAddress, address)) !== true) {\n throw new Error(`Caller is not DatatokenDeployer`)\n }\n\n const estGas = await dtContract.removeMinter.estimateGas(minter)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n dtContract.removeMinter,\n minter\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Adds a payment manager on a datatoken to a desired address.(can set who's going to collect fee when consuming orders)\n * only DatatokenDeployer can succeed\n * @param {String} dtAddress Datatoken address\n * @param {String} address Caller address\n * @param {String} paymentManager The address of the payment manager\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transactionId\n */\n public async addPaymentManager<G extends boolean = false>(\n dtAddress: string,\n address: string,\n paymentManager: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const dtContract = this.getContract(dtAddress)\n if ((await this.isDatatokenDeployer(dtAddress, address)) !== true) {\n throw new Error(`Caller is not DatatokenDeployer`)\n }\n\n const estGas = await dtContract.addPaymentManager.estimateGas(paymentManager)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n dtContract.addPaymentManager,\n paymentManager\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Revoke paymentManager permission for an ERC20 Datatoken\n * only DatatokenDeployer can succeed\n * @param {String} dtAddress Datatoken address\n * @param {String} address User address\n * @param {String} paymentManager User which will be removed from paymentManager permission\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} trxReceipt\n */\n public async removePaymentManager<G extends boolean = false>(\n dtAddress: string,\n address: string,\n paymentManager: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const dtContract = this.getContract(dtAddress)\n if ((await this.isDatatokenDeployer(dtAddress, address)) !== true) {\n throw new Error(`Caller is not DatatokenDeployer`)\n }\n\n const estGas = await dtContract.removePaymentManager.estimateGas(paymentManager)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n dtContract.removePaymentManager,\n paymentManager\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * This function allows to set a new PaymentCollector (receives DT when consuming)\n * If not set the paymentCollector is the NFT Owner\n * only NFT owner can call\n * @param dtAddress Datatoken address\n * @param address Caller address\n * @param paymentCollector User to be set as new payment collector\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} trxReceipt\n */\n public async setPaymentCollector<G extends boolean = false>(\n dtAddress: string,\n address: string,\n paymentCollector: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const dtContract = this.getContract(dtAddress)\n const isPaymentManager = (await this.getPermissions(dtAddress, address))\n .paymentManager\n const nftAddress = !isPaymentManager && (await this.getNFTAddress(dtAddress))\n const isNftOwner = nftAddress && (await this.nft.getNftOwner(nftAddress)) === address\n const nftPermissions =\n nftAddress && !isNftOwner && (await this.nft.getNftPermissions(nftAddress, address))\n const isDatatokenDeployer = nftPermissions?.deployERC20\n if (!isPaymentManager && !isNftOwner && !isDatatokenDeployer) {\n throw new Error(`Caller is not Fee Manager, owner or Datatoken Deployer`)\n }\n\n const estGas = await dtContract.setPaymentCollector.estimateGas(paymentCollector)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n dtContract.setPaymentCollector,\n paymentCollector\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * getPaymentCollector - It returns the current paymentCollector\n * @param dtAddress datatoken address\n * @return {Promise<string>}\n */\n public async getPaymentCollector(dtAddress: string): Promise<string> {\n const dtContract = this.getContract(dtAddress)\n const paymentCollector = await dtContract.getPaymentCollector()\n return paymentCollector\n }\n\n /**\n * Transfer tokens(as number) from address to toAddress\n * @param {String} dtAddress Datatoken address\n * @param {String} toAddress Receiver address\n * @param {String} amount Number of datatokens, as number. Will be converted to wei.\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transactionId\n */\n public async transfer<G extends boolean = false>(\n dtAddress: string,\n toAddress: string,\n amount: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n return this.transferWei(\n dtAddress,\n toAddress,\n await amountToUnits(null, null, amount, 18),\n estimateGas\n )\n }\n\n /**\n * Transfer in wei from address to toAddress\n * @param {String} dtAddress Datatoken address\n * @param {String} toAddress Receiver address\n * @param {String} amount Number of datatokens (number) expressed as wei\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transactionId\n */\n public async transferWei<G extends boolean = false>(\n dtAddress: string,\n toAddress: string,\n amount: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const dtContract = this.getContract(dtAddress)\n const estGas = await dtContract.transfer.estimateGas(toAddress, amount)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n dtContract.transfer,\n toAddress,\n amount\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Start Order: called by payer or consumer prior ordering a service consume on a marketplace.\n * @param {String} dtAddress Datatoken address\n * @param {String} consumer Consumer Address\n * @param {Number} serviceIndex Service index in the metadata\n * @param {providerFees} providerFees provider fees\n * @param {consumeMarketFee} ConsumeMarketFee consume market fees\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} string\n */\n public async startOrder<G extends boolean = false>(\n dtAddress: string,\n consumer: string,\n serviceIndex: number,\n providerFees: ProviderFees,\n consumeMarketFee?: ConsumeMarketFee,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const dtContract = this.getContract(dtAddress, this.abi)\n if (!consumeMarketFee) {\n consumeMarketFee = {\n consumeMarketFeeAddress: ZERO_ADDRESS,\n consumeMarketFeeToken: ZERO_ADDRESS,\n consumeMarketFeeAmount: '0'\n }\n }\n\n const estGas = await dtContract.startOrder.estimateGas(\n consumer,\n serviceIndex,\n providerFees,\n consumeMarketFee\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n dtContract.startOrder,\n consumer,\n serviceIndex,\n providerFees,\n consumeMarketFee\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Reuse Order: called by payer or consumer having a valid order, but with expired provider access.\n * Pays the provider fee again, but it will not require a new datatoken payment\n * Requires previous approval of provider fee.\n * @param {String} dtAddress Datatoken address\n * @param {String} orderTxId previous valid order\n * @param {providerFees} providerFees provider fees\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} string\n */\n public async reuseOrder<G extends boolean = false>(\n dtAddress: string,\n orderTxId: string,\n providerFees: ProviderFees,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const dtContract = this.getContract(dtAddress)\n\n const estGas = await dtContract.reuseOrder.estimateGas(orderTxId, providerFees)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n dtContract.reuseOrder,\n orderTxId,\n providerFees\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Buys 1 DT from the FRE and then startsOrder, while burning that DT\n * @param {String} dtAddress Datatoken address\n * @param {OrderParams} orderParams The parameters required to place an order.\n * @param {FreParams} freParams The parameters required to buy from a fixed-rate exchange.\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async buyFromFreAndOrder<G extends boolean = false>(\n dtAddress: string,\n orderParams: OrderParams,\n freParams: FreOrderParams,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const dtContract = this.getContract(dtAddress, this.abiEnterprise)\n\n const freContractParams = await this.getFreOrderParams(freParams)\n\n const estGas = await dtContract.buyFromFreAndOrder.estimateGas(\n orderParams,\n freContractParams\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n dtContract.buyFromFreAndOrder,\n orderParams,\n freContractParams\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Gets 1 DT from dispenser and then startsOrder, while burning that DT\n * @param {String} dtAddress Datatoken address\n * @param {OrderParams} orderParams - The parameters required to place an order.\n * @param {String} dispenserContract dispenser address\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async buyFromDispenserAndOrder<G extends boolean = false>(\n dtAddress: string,\n orderParams: OrderParams,\n dispenserContract: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const dtContract = this.getContract(dtAddress, this.abiEnterprise)\n\n const estGas = await dtContract.buyFromDispenserAndOrder.estimateGas(\n orderParams,\n dispenserContract\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n dtContract.buyFromDispenserAndOrder,\n orderParams,\n dispenserContract\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /** setData\n * This function allows to store data with a preset key (keccak256(dtAddress)) into NFT 725 Store\n * only DatatokenDeployer can succeed\n * @param {String} dtAddress Datatoken address\n * @param {String} address User address\n * @param {String} value Data to be stored into 725Y standard\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transactionId\n */\n public async setData<G extends boolean = false>(\n dtAddress: string,\n address: string,\n value: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n if (!(await this.isDatatokenDeployer(dtAddress, address))) {\n throw new Error(`User is not Datatoken Deployer`)\n }\n\n const dtContract = this.getContract(dtAddress)\n const valueHex = hexlify(toUtf8Bytes(value))\n\n const estGas = await dtContract.setData.estimateGas(valueHex)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n dtContract.setData,\n valueHex\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Clean Datatoken level Permissions (minters, paymentManager and reset the paymentCollector) for an ERC20 Datatoken\n * Only NFT Owner (at 721 level) can call it.\n * @param {string} dtAddress Datatoken address where we want to clean permissions\n * @param {string} address User adress\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} transactionId\n */\n public async cleanPermissions<G extends boolean = false>(\n dtAddress: string,\n address: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n if ((await this.nft.getNftOwner(await this.getNFTAddress(dtAddress))) !== address) {\n throw new Error('Caller is NOT Nft Owner')\n }\n const dtContract = this.getContract(dtAddress)\n const estGas = await dtContract.cleanPermissions.estimateGas()\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n dtContract.cleanPermissions\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Returns ERC20 Datatoken user's permissions for a datatoken\n * @param {String} dtAddress Datatoken adress\n * @param {String} address user adress\n * @return {Promise<DatatokenRoles>}\n */\n public async getPermissions(\n dtAddress: string,\n address: string\n ): Promise<DatatokenRoles> {\n const dtContract = this.getContract(dtAddress)\n const roles = await dtContract.permissions(address)\n return roles\n }\n\n /**\n * Returns the Datatoken cap\n * @param {String} dtAddress Datatoken adress\n * @return {Promise<string>}\n */\n public async getCap(dtAddress: string): Promise<string> {\n const dtContract = this.getContract(dtAddress)\n const cap = await dtContract.cap()\n return await this.unitsToAmount(null, cap, 18)\n }\n\n /**\n * It returns the token decimals, how many supported decimal points\n * @param {String} dtAddress Datatoken adress\n * @return {Promise<number>}\n */\n public async getDecimals(dtAddress: string): Promise<number> {\n const dtContract = this.getContract(dtAddress)\n const decimals = await dtContract.decimals()\n return Number(decimals)\n }\n\n /**\n * It returns the token template index.\n * @param {String} dtAddress Datatoken adress\n * @return {Promise<number>}\n */\n public async getId(dtAddress: string): Promise<number> {\n const dtContract = this.getContract(dtAddress)\n const id = await dtContract.getId()\n return Number(id)\n }\n\n /**\n * It returns the token symbol\n * @param {String} dtAddress Datatoken adress\n * @return {Promise<number>}\n */\n public async getSymbol(dtAddress: string): Promise<string> {\n const dtContract = this.getContract(dtAddress)\n const symbol = await dtContract.symbol()\n return symbol\n }\n\n /**\n * It returns the name of the token\n * @param {String} dtAddress Datatoken adress\n * @return {Promise<number>}\n */\n public async getName(dtAddress: string): Promise<string> {\n const dtContract = this.getContract(dtAddress)\n const name = await dtContract.name()\n return name\n }\n\n /**\n * It returns the token decimals, how many supported decimal points\n * @param {String} dtAddress Datatoken adress\n * @return {Promise<number>}\n */\n public async getNFTAddress(dtAddress: string): Promise<string> {\n const dtContract = this.getContract(dtAddress)\n const nftAddress = await dtContract.getERC721Address()\n return nftAddress\n }\n\n /**\n * It returns the list of fixedRateExchanges created for this datatoken.\n * @param {String} dtAddress Datatoken adress\n * @return {Promise<number>}\n */\n public async getFixedRates(dtAddress: string): Promise<any[]> {\n const dtContract = this.getContract(dtAddress)\n const fixedRates = await dtContract.getFixedRates()\n return fixedRates\n }\n\n /**\n * It returns the list of dispensers created for this datatoken.\n * @param {String} dtAddress Datatoken adress\n * @return {Promise<number>}\n */\n public async getDispensers(dtAddress: string): Promise<any[]> {\n const dtContract = this.getContract(dtAddress)\n const dispensers = await dtContract.getDispensers()\n return dispensers\n }\n\n /**\n * Returns true if address has deployERC20 role\n * @param {String} dtAddress Datatoken adress\n * @param {String} dtAddress Datatoken adress\n * @return {Promise<boolean>}\n */\n public async isDatatokenDeployer(dtAddress: string, address: string): Promise<boolean> {\n const dtContract = this.getContract(dtAddress)\n const isDatatokenDeployer = await dtContract.isERC20Deployer(address)\n return isDatatokenDeployer\n }\n\n /**\n * Get Address Balance for datatoken\n * @param {String} dtAddress Datatoken adress\n * @param {String} address user adress\n * @return {Promise<String>} balance Number of datatokens. Will be converted from wei\n */\n public async balance(datatokenAddress: string, address: string): Promise<string> {\n const dtContract = this.getContract(datatokenAddress)\n const balance = await dtContract.balanceOf(address)\n return await this.unitsToAmount(null, balance, 18)\n }\n\n /**\n * Get Address Allowance for datatoken\n * @param {String} dtAddress Datatoken adress\n * @param {String} owner owner adress\n * @param {String} spender spender adress\n * @param {Number} decimals numer of token decimals, default 18\n * @return {Promise<String>} allowance Number of datatokens. Will be converted from wei\n */\n public async allowance(\n datatokenAddress: string,\n owner: string,\n spender: string,\n decimals: number = 18\n ): Promise<string> {\n const dtContract = this.getContract(datatokenAddress)\n const allowance = await dtContract.allowance(owner, spender)\n return await this.unitsToAmount(null, allowance, decimals)\n }\n\n /**\n * Allows to set the fee required by the publisherMarket\n * only publishMarketFeeAddress can call it\n * @param {string} datatokenAddress Datatoken adress\n * @param {string} publishMarketFeeAddress new publish Market Fee Address\n * @param {string} publishMarketFeeToken new publish Market Fee Token\n * @param {string} publishMarketFeeAmount new fee amount\n * @param {String} address user adress\n * @param {Boolean} estimateGas if True, return gas estimate\n */\n public async setPublishingMarketFee<G extends boolean = false>(\n datatokenAddress: string,\n publishMarketFeeAddress: string,\n publishMarketFeeToken: string,\n publishMarketFeeAmount: string,\n address: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const dtContract = this.getContract(datatokenAddress)\n const mktFeeAddress = (await dtContract.getPublishingMarketFee())[0]\n if (mktFeeAddress !== address) {\n throw new Error(`Caller is not the Publishing Market Fee Address`)\n }\n const estGas = await dtContract.setPublishingMarketFee.estimateGas(\n publishMarketFeeAddress,\n publishMarketFeeToken,\n publishMarketFeeAmount\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n dtContract.setPublishingMarketFee,\n publishMarketFeeAddress,\n publishMarketFeeToken,\n publishMarketFeeAmount\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Returns the current fee set by the publishing market\n * @param {String} datatokenAddress Datatoken adress\n * @return {Promise<PublishingMarketFee>} Current fee set by the publishing market\n */\n public async getPublishingMarketFee(\n datatokenAddress: string\n ): Promise<PublishingMarketFee> {\n const dtContract = this.getContract(datatokenAddress)\n\n const publishingMarketFee = await dtContract.getPublishingMarketFee()\n const returnValues = {\n publishMarketFeeAddress: publishingMarketFee[0],\n publishMarketFeeToken: publishingMarketFee[1],\n publishMarketFeeAmount: publishingMarketFee[2].toString()\n }\n return returnValues\n }\n\n private async getFreOrderParams(freParams: FreOrderParams): Promise<any> {\n return {\n exchangeContract: freParams.exchangeContract,\n exchangeId: freParams.exchangeId,\n maxBaseTokenAmount: await amountToUnits(\n this.signer,\n freParams.baseTokenAddress,\n freParams.maxBaseTokenAmount,\n freParams.baseTokenDecimals\n ),\n swapMarketFee: await amountToUnits(\n this.signer,\n freParams.baseTokenAddress,\n freParams.swapMarketFee,\n freParams.baseTokenDecimals\n ),\n\n marketFeeAddress: freParams.marketFeeAddress\n }\n }\n}\n","/* eslint-disable lines-between-class-members */\nimport { Datatoken } from './Datatoken.js'\nimport { Signer } from 'ethers'\nimport ERC20Template4 from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC20Template4.sol/ERC20Template4.json'\nimport { AbiItem, ReceiptOrEstimate } from '../@types/index.js'\nimport { AccessListContract } from './AccessList.js'\nimport { Config } from '../config/index.js'\nimport { sendTx } from '../utils/ContractUtils.js'\n\nexport class Datatoken4 extends Datatoken {\n public accessList: AccessListContract\n public fileObject: Uint8Array\n getDefaultAbi() {\n return ERC20Template4.abi as AbiItem[]\n }\n\n /**\n * Instantiate Datatoken class\n * @param {Signer} signer The signer object.\n * @param {string | number} [network] Network id or name\n * @param {Config} [config] The configuration object.\n * @param {AbiItem[]} [abi] ABI array of the smart contract\n */\n constructor(\n signer: Signer,\n fileObject: Uint8Array,\n network?: string | number,\n config?: Config,\n abi?: AbiItem[]\n ) {\n super(signer, network, config, abi)\n this.abi = this.getDefaultAbi()\n this.fileObject = fileObject\n }\n\n public setFileObj(fileObj: Uint8Array): void {\n this.fileObject = fileObj\n }\n\n /**\n * getAllowListContract - It returns the current allowList contract address\n * @param dtAddress datatoken address\n * @return {Promise<string>}\n */\n public async getAllowlistContract(dtAddress: string): Promise<string> {\n const dtContract = this.getContract(dtAddress, this.getDefaultAbi())\n const allowList = await dtContract.getAllowListContract()\n return allowList\n }\n\n /**\n * getDenyListContract - It returns the current denyList contract address\n * @param dtAddress datatoken address\n * @return {Promise<string>}\n */\n public async getDenylistContract(dtAddress: string): Promise<string> {\n const dtContract = this.getContract(dtAddress, this.getDefaultAbi())\n const denyList = await dtContract.getDenyListContract()\n return denyList\n }\n\n /** setAllowListContract\n * This function allows to set another address for allowListContract, only by datatoken deployer\n * only DatatokenDeployer can succeed\n * @param {String} dtAddress Datatoken address\n * @param {String} address Contract address\n * @param {String} consumer User address\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} returns the transaction receipt or the estimateGas value\n */\n public async setAllowListContract<G extends boolean = false>(\n dtAddress: string,\n address: string,\n consumer: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n if (!(await this.isDatatokenDeployer(dtAddress, consumer))) {\n throw new Error(`User is not Datatoken Deployer`)\n }\n\n const dtContract = this.getContract(dtAddress)\n const estGas = await dtContract.setAllowListContract.estimateGas(address)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n dtContract.setAllowListContract,\n address\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /** setDenyListContract\n * This function allows to set another address for allowListContract, only by datatoken deployer\n * only DatatokenDeployer can succeed\n * @param {String} dtAddress Datatoken address\n * @param {String} address Contract address\n * @param {String} consumer User address\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} returns the transaction receipt or the estimateGas value\n */\n public async setDenyListContract<G extends boolean = false>(\n dtAddress: string,\n address: string,\n consumer: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n if (!(await this.isDatatokenDeployer(dtAddress, consumer))) {\n throw new Error(`User is not Datatoken Deployer`)\n }\n\n const dtContract = this.getContract(dtAddress)\n const estGas = await dtContract.setDenyListContract.estimateGas(address)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n dtContract.setDenyListContract,\n address\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n /** setFileObject\n * This function allows to set file object in ecnrypted format, only by datatoken deployer\n * only DatatokenDeployer can succeed\n * @param {String} dtAddress Datatoken address\n * @param {String} address User address\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} returns the transaction receipt or the estimateGas value\n */\n public async setFileObject<G extends boolean = false>(\n dtAddress: string,\n address: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n if (!(await this.isDatatokenDeployer(dtAddress, address))) {\n throw new Error(`User is not Datatoken Deployer`)\n }\n\n const dtContract = this.getContract(dtAddress)\n const estGas = await dtContract.setFilesObject.estimateGas(this.fileObject)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n dtContract.setFilesObject,\n this.fileObject\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * getFileObject - It returns the consumer's file object encrypted format.\n * @param {String} dtAddress datatoken address\n * @param {Number} serviceIndex - service index\n * @param {String} providerAddress\n * @param {Bytes} providerSignature\n * @param {Bytes} consumerData\n * @param {Bytes} consumerSignature\n * @param {String} consumerAddress\n * @return {Promise<Bytes>} returns file object\n */\n public async getFileObject(\n dtAddress: string,\n serviceIndex: number,\n providerAddress: string,\n providerSignature: Uint8Array,\n consumerData: Uint8Array,\n consumerSignature: Uint8Array,\n consumerAddress: string\n ): Promise<Uint8Array> {\n const dtContract = this.getContract(dtAddress, this.getDefaultAbi())\n const fileObject = await dtContract.getFileObject(\n serviceIndex,\n providerAddress,\n providerSignature,\n consumerData,\n consumerSignature,\n consumerAddress\n )\n return fileObject\n }\n}\n","import { Signer } from 'ethers'\nimport AccessList from '@oceanprotocol/contracts/artifacts/contracts/accesslists/AccessList.sol/AccessList.json'\nimport { sendTx } from '../utils/ContractUtils.js'\nimport { AbiItem, ReceiptOrEstimate } from '../@types/index.js'\nimport { Config } from '../config/index.js'\nimport { SmartContractWithAddress } from './SmartContractWithAddress.js'\n\nexport class AccessListContract extends SmartContractWithAddress {\n public abiEnterprise: AbiItem[]\n\n getDefaultAbi() {\n return AccessList.abi as AbiItem[]\n }\n\n /**\n * Instantiate AccessList class\n * @param {string} address The contract address.\n * @param {Signer} signer The signer object.\n * @param {string | number} [network] Network id or name\n * @param {Config} [config] The configuration object.\n * @param {AbiItem[]} [abi] ABI array of the smart contract\n * @param {AbiItem[]} abiEnterprise Enterprise ABI array of the smart contract\n */\n constructor(\n address: string,\n signer: Signer,\n network?: string | number,\n config?: Config,\n abi?: AbiItem[]\n ) {\n super(address, signer, network, config, abi)\n this.abi = abi || this.getDefaultAbi()\n }\n\n /**\n * Get Token Uri\n * @return {Promise<string>} Token URI\n */\n public async getTokenUri(tokenId: number): Promise<string> {\n return await this.contract.tokenURI(tokenId)\n }\n\n /**\n * Get Owner\n * @return {Promise<string>} Owner\n */\n public async getOwner(): Promise<string> {\n return await this.contract.owner()\n }\n\n /**\n * Get Id\n * @return {Promise<string>} Id\n */\n public async getId(): Promise<number> {\n const id = await this.contract.getId()\n return Number(id)\n }\n\n /**\n * Get Name of Access list\n * @return {Promise<string>} Name\n */\n public async getName(): Promise<string> {\n return await this.contract.name()\n }\n\n /**\n * Get Symbol of Access list\n * @return {Promise<string>} Symbol\n */\n public async getSymbol(): Promise<string> {\n return await this.contract.symbol()\n }\n\n /**\n * Get Address Balance for access list token\n * @param {String} address user adress\n * @return {Promise<String>} balance Number of datatokens. Will be converted from wei\n */\n public async balance(address: string): Promise<string> {\n const balance = await this.contract.balanceOf(address)\n return await this.unitsToAmount(null, balance, 18)\n }\n\n /**\n * Add address to access list\n * @param {String} user Minter address\n * @param {String} tokenUri tokenURI\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} returns the transaction receipt or the estimateGas value\n */\n public async mint<G extends boolean = false>(\n user: string,\n tokenUri: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const estGas = await this.contract.mint.estimateGas(user, tokenUri)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.mint,\n user,\n tokenUri\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Batch add addresses to the access list\n * @param {String} users Minter addresses\n * @param {String} tokenUris tokenURI\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} returns the transaction receipt or the estimateGas value\n */\n public async batchMint<G extends boolean = false>(\n users: Array<string>,\n tokenUris: Array<string>,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const estGas = await this.contract.batchMint.estimateGas(users, tokenUris)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.batchMint,\n users,\n tokenUris\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Delete address from access list\n * @param {Number} tokenId token ID\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} returns the transaction receipt or the estimateGas value\n */\n public async burn<G extends boolean = false>(\n tokenId: number,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const estGas = await this.contract.burn.estimateGas(tokenId)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.burn,\n tokenId\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Transfer Ownership of an access list, called by owner of access list\n * @param {Number} newOwner new owner of the access list\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} returns the transaction receipt or the estimateGas value\n */\n public async transferOwnership<G extends boolean = false>(\n newOwner: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const estGas = await this.contract.transferOwnership.estimateGas(newOwner)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.transferOwnership,\n newOwner\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Renounce Ownership of an access list, called by owner of access list\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} returns the transaction receipt or the estimateGas value\n */\n public async renounceOwnership<G extends boolean = false>(\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const estGas = await this.contract.renounceOwnership.estimateGas()\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.renounceOwnership\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n}\n","import { BigNumberish, Signer } from 'ethers'\nimport { Config } from '../config/index.js'\nimport AccessListFactory from '@oceanprotocol/contracts/artifacts/contracts/accesslists/AccessListFactory.sol/AccessListFactory.json'\nimport { sendTx, getEventFromTx } from '../utils/ContractUtils.js'\nimport { ZERO_ADDRESS } from '../utils/Constants.js'\nimport { AbiItem, ReceiptOrEstimate } from '../@types/index.js'\nimport { SmartContractWithAddress } from './SmartContractWithAddress.js'\nimport { generateDtName } from '../utils/DatatokenName.js'\n\n/**\n * Provides an interface for Access List Factory contract\n */\nexport class AccesslistFactory extends SmartContractWithAddress {\n getDefaultAbi() {\n return AccessListFactory.abi as AbiItem[]\n }\n\n /**\n * Instantiate AccessListFactory class\n * @param {string} address The factory contract address.\n * @param {Signer} signer The signer object.\n * @param {string | number} [network] Network id or name\n * @param {Config} [config] The configuration object.\n * @param {AbiItem[]} [abi] ABI array of the smart contract\n */\n constructor(\n address: string,\n signer: Signer,\n network?: string | number,\n config?: Config,\n abi?: AbiItem[]\n ) {\n super(address, signer, network, config, abi)\n this.abi = abi || this.getDefaultAbi()\n }\n\n /**\n * Create new Access List Contract\n * @param {string} nameAccessList The name for access list.\n * @param {string} symbolAccessList The symbol for access list.\n * @param {string[]} tokenURI Token URIs list.\n * @param {boolean} transferable Default false, to be soulbound.\n * @param {string} owner Owner of the access list.\n * @param {string[]} user Users of the access lists as addresses.\n * @param {Boolean} [estimateGas] if True, return gas estimate\n * @return {Promise<string|BigNumber>} Deployed contract address\n */\n public async deployAccessListContract<G extends boolean = false>(\n nameAccessList: string,\n symbolAccessList: string,\n tokenURI: string[],\n transferable: boolean = false,\n owner: string,\n user: string[],\n estimateGas?: G\n ): Promise<G extends false ? string : BigNumberish> {\n if (!nameAccessList || !symbolAccessList) {\n const { name, symbol } = generateDtName()\n nameAccessList = name\n symbolAccessList = symbol\n }\n const estGas = await this.contract.deployAccessListContract.estimateGas(\n nameAccessList,\n symbolAccessList,\n transferable,\n owner,\n user,\n tokenURI\n )\n if (estimateGas) return <G extends false ? string : BigNumberish>estGas\n // Invoke createToken function of the contract\n try {\n const tx = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.deployAccessListContract,\n nameAccessList,\n symbolAccessList,\n transferable,\n owner,\n user,\n tokenURI\n )\n if (!tx) {\n const e = 'Tx for deploying new access list was not processed on chain.'\n console.error(e)\n throw e\n }\n const trxReceipt = await tx.wait()\n const events = getEventFromTx(trxReceipt, 'NewAccessList')\n return events.args[0]\n } catch (e) {\n console.error(`Creation of AccessList failed: ${e}`)\n }\n }\n\n /**\n * Get Factory Owner\n * @return {Promise<string>} Factory Owner address\n */\n public async getOwner(): Promise<string> {\n const owner = await this.contract.owner()\n return owner\n }\n\n /**\n * Is a list contract soul bound?\n * @param {String} contractAddress list contract address\n * @return {Promise<boolean>} is soulbound?\n */\n public async isSoulbound(contractAddress: string): Promise<boolean> {\n const isSoulbound = await this.contract.isSoulBound(contractAddress)\n return isSoulbound\n }\n\n /**\n * Is a list contract deployed?\n * @param {String} contractAddress list contract address\n * @return {Promise<boolean>} is deployed?\n */\n public async isDeployed(contractAddress: string): Promise<boolean> {\n const isDeployed = await this.contract.isDeployed(contractAddress)\n return isDeployed\n }\n\n /**\n * changeTemplateAddress - only factory Owner\n * @param {String} owner caller address\n * @param {Number} templateAddress address of the template we want to change\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} returns the transaction receipt or the estimateGas value, current token template count\n */\n public async changeTemplateAddress<G extends boolean = false>(\n owner: string,\n templateAddress: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n if ((await this.getOwner()) !== owner) {\n throw new Error(`Caller is not Factory Owner`)\n }\n\n if (templateAddress === ZERO_ADDRESS) {\n throw new Error(`Template address cannot be ZERO address`)\n }\n\n const estGas = await this.contract.changeTemplateAddress.estimateGas(templateAddress)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.changeTemplateAddress,\n templateAddress\n )\n\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n}\n","import veOceanABI from '@oceanprotocol/contracts/artifacts/contracts/ve/veOCEAN.vy/veOCEAN.json'\nimport { sendTx } from '../../utils/ContractUtils.js'\nimport { SmartContractWithAddress } from '../SmartContractWithAddress.js'\nimport { ReceiptOrEstimate, AbiItem } from '../../@types/index.js'\nimport BigNumber from 'bignumber.js'\n/**\n * Provides an interface for veOcean contract\n */\nexport class VeOcean extends SmartContractWithAddress {\n getDefaultAbi() {\n return veOceanABI.abi as AbiItem[]\n }\n\n /**\n * Deposit `amount` tokens for `userAddress` and lock until `unlockTime`\n * @param {String} amount Amount of tokens to be locked\n * @param {Number} unlockTime Timestamp for unlock\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async lockTokens<G extends boolean = false>(\n amount: string,\n unlockTime: number,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const amountFormatted = await this.amountToUnits(await this.getToken(), amount)\n const estGas = await this.contract.create_lock.estimateGas(\n amountFormatted,\n unlockTime\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n // Invoke function of the contract\n const trxReceipt = await sendTx(\n BigInt(new BigNumber(estGas).plus(20000n).toString()),\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.create_lock,\n amountFormatted,\n unlockTime\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Deposit `amount` tokens for `toAddress` and add to the existing lock\n * Anyone (even a smart contract) can deposit for someone else, but cannot extend their locktime and deposit for a brand new user\n * @param {String} toAddress user address to deposit for\n * @param {String} amount Amount of tokens to be locked\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async depositFor<G extends boolean = false>(\n toAddress: string,\n amount: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const amountFormatted = await this.amountToUnits(await this.getToken(), amount)\n const estGas = await this.contract.deposit_for.estimateGas(toAddress, amountFormatted)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n // Invoke function of the contract\n const trxReceipt = await sendTx(\n BigInt(new BigNumber(estGas).plus(20000n).toString()),\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.deposit_for,\n toAddress,\n amountFormatted\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Deposit `amount` additional tokens for `userAddress` without modifying the unlock time\n * @param {String} amount Amount of tokens to be locked\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async increaseAmount<G extends boolean = false>(\n amount: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const amountFormatted = await this.amountToUnits(await this.getToken(), amount)\n const estGas = await this.contract.increase_amount.estimateGas(amountFormatted)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n // Invoke function of the contract\n const trxReceipt = await sendTx(\n BigInt(new BigNumber(estGas).plus(20000n).toString()),\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.increase_amount,\n amountFormatted\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Extend the unlock time for `userAddress` to `unlockTime`\n * @param {Number} unlockTime Timestamp for new unlock time\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async increaseUnlockTime<G extends boolean = false>(\n unlockTime: number,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const estGas = await this.contract.increase_unlock_time.estimateGas(unlockTime)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n // Invoke function of the contract\n const trxReceipt = await sendTx(\n BigInt(new BigNumber(estGas).plus(20000n).toString()),\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.increase_unlock_time,\n unlockTime\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Withdraw all tokens for `userAddress`\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async withdraw<G extends boolean = false>(\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const estGas = await this.contract.withdraw.estimateGas()\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n // Invoke function of the contract\n const trxReceipt = await sendTx(\n BigInt(new BigNumber(estGas).plus(20000n).toString()),\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.withdraw\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /** Get voting power for address\n * @param {String} userAddress user address\n * @return {Promise<number>}\n */\n public async getVotingPower(userAddress: string): Promise<number> {\n const balance = await this.contract.balanceOf(userAddress)\n return Number(balance)\n }\n\n /** Get locked balance\n * @param {String} userAddress user address\n * @return {Promise<string>}\n */\n public async getLockedAmount(userAddress: string): Promise<string> {\n const balance = await this.contract.locked(userAddress)\n const balanceFormated = await this.unitsToAmount(\n await this.getToken(),\n balance.amount.toString()\n )\n\n return balanceFormated\n }\n\n /** Get untilLock for address\n * @param {String} userAddress user address\n * @return {Promise<number>}\n */\n public async lockEnd(userAddress: string): Promise<number> {\n const untilLock = await this.contract.locked__end(userAddress)\n return parseInt(untilLock.toString())\n }\n\n /** Get total supply\n * @return {Promise<number>}\n */\n public async totalSupply(): Promise<string> {\n const supplyFormated = await this.unitsToAmount(\n await this.getToken(),\n await this.contract.totalSupply()\n )\n return supplyFormated\n }\n\n /** Get token\n * @return {Promise<string>}\n */\n public async getToken(): Promise<string> {\n const tokenAddress = await this.contract.token()\n return tokenAddress\n }\n}\n","import veFeeABI from '@oceanprotocol/contracts/artifacts/contracts/ve/veFeeDistributor.vy/veFeeDistributor.json'\nimport { sendTx } from '../../utils/ContractUtils.js'\nimport { SmartContractWithAddress } from '../SmartContractWithAddress.js'\nimport { ReceiptOrEstimate, AbiItem } from '../../@types/index.js'\nimport BigNumber from 'bignumber.js'\n/**\n * Provides an interface for veOcean contract\n */\nexport class VeFeeDistributor extends SmartContractWithAddress {\n getDefaultAbi() {\n return veFeeABI.abi as AbiItem[]\n }\n\n /**\n * Claim fees for `userAddress`\n * Each call to claim look at a maximum of 50 user veOCEAN points.\n For accounts with many veOCEAN related actions, this function\n may need to be called more than once to claim all available\n fees. In the `Claimed` event that fires, if `claim_epoch` is\n less than `max_epoch`, the account may claim again\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async claim<G extends boolean = false>(\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const estGas = await this.contract.claim.estimateGas()\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n // Invoke function of the contract\n const trxReceipt = await sendTx(\n BigInt(new BigNumber(estGas).plus(20000n).toString()),\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.claim\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Make multiple fee claims in a single call\n Used to claim for many accounts at once, or to make\n multiple claims for the same address when that address\n has significant veOCEAN history\n * @param {String} addresses array of addresses to claim\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async claimMany<G extends boolean = false>(\n addresses: string[],\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const estGas = await this.contract.claim_many.estimateGas(addresses)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n // Invoke function of the contract\n const trxReceipt = await sendTx(\n BigInt(new BigNumber(estGas).plus(20000n).toString()),\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.claim_many,\n addresses\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n}\n","import veFeeEstimate from '@oceanprotocol/contracts/artifacts/contracts/ve/veFeeEstimate.vy/veFeeEstimate.json'\nimport { SmartContractWithAddress } from '../SmartContractWithAddress.js'\nimport { VeOcean } from './VeOcean.js'\nimport { AbiItem } from '../../@types/index.js'\n/**\n * Provides an interface for veOcean contract\n */\nexport class VeFeeEstimate extends SmartContractWithAddress {\n getDefaultAbi() {\n return veFeeEstimate.abi as AbiItem[]\n }\n\n /**\n * estimateClaim\n * @param {String} userAddress user address\n * @return {Promise<string>}\n */\n public async estimateClaim(userAddress: string): Promise<string> {\n const amount = await this.contract.estimateClaim(userAddress)\n const veOcean = new VeOcean(await this.contract.voting_escrow(), this.signer)\n const amountFormated = await this.unitsToAmount(await veOcean.getToken(), amount)\n return amountFormated\n }\n}\n","import veAllocateABI from '@oceanprotocol/contracts/artifacts/contracts/ve/veAllocate.sol/veAllocate.json'\nimport { sendTx } from '../../utils/ContractUtils.js'\nimport { SmartContractWithAddress } from '../SmartContractWithAddress.js'\nimport { ReceiptOrEstimate, AbiItem } from '../../@types/index.js'\nimport BigNumber from 'bignumber.js'\n\n/**\n * Provides an interface for veOcean contract\n */\nexport class VeAllocate extends SmartContractWithAddress {\n getDefaultAbi() {\n return veAllocateABI.abi as AbiItem[]\n }\n\n /**\n * set a specific percentage of veOcean to a specific nft\n * Maximum allocated percentage is 10000, so 1% is specified as 100\n * @param {String} amount Percentage used\n * @param {String} nft NFT address to allocate to\n * @param {String} chainId chainId of NFT\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async setAllocation<G extends boolean = false>(\n amount: string,\n nft: string,\n chainId: number,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const estGas = await this.contract.setAllocation.estimateGas(amount, nft, chainId)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n // Invoke function of the contract\n const trxReceipt = await sendTx(\n BigInt(new BigNumber(estGas).plus(20000n).toString()),\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.setAllocation,\n amount,\n nft,\n chainId\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * set specific percentage of veOcean to multiple nfts\n * Maximum allocated percentage is 10000, so 1% is specified as 100\n * @param {String[]} amount Array of percentages used\n * @param {String[]} nft Array of NFT addresses\n * @param {String[]} chainId Array of chainIds\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async setBatchAllocation<G extends boolean = false>(\n amount: string[],\n nft: string[],\n chainId: number[],\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const estGas = await this.contract.setBatchAllocation.estimateGas(\n amount,\n nft,\n chainId\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n // Invoke function of the contract\n const trxReceipt = await sendTx(\n BigInt(new BigNumber(estGas).plus(20000n).toString()),\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.setBatchAllocation,\n amount,\n nft,\n chainId\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /** Get totalAllocation for address\n * @param {String} userAddress user address\n * @return {Promise<number>}\n */\n public async getTotalAllocation(userAddress: string): Promise<number> {\n const allocation = await this.contract.getTotalAllocation(userAddress)\n return Number(allocation)\n }\n\n /** Get getveAllocation for address, nft, chainId\n * @param {String} userAddress user address\n * @param {String} nft NFT address to allocate to\n * @param {String} chainId chainId of NFT\n * @return {Promise<number>}\n */\n public async getVeAllocation(\n userAddress: string,\n nft: string,\n chainId: string\n ): Promise<number> {\n const allocation = await this.contract.getveAllocation(userAddress, nft, chainId)\n return Number(allocation)\n }\n}\n","import dfRewardsABI from '@oceanprotocol/contracts/artifacts/contracts/df/DFRewards.sol/DFRewards.json'\nimport { sendTx } from '../../utils/ContractUtils.js'\nimport { SmartContractWithAddress } from '../SmartContractWithAddress.js'\nimport { AbiItem, ReceiptOrEstimate } from '../../@types'\n\n/**\n * Provides an interface for DFRewards contract\n */\nexport class DfRewards extends SmartContractWithAddress {\n getDefaultAbi() {\n return dfRewardsABI.abi as AbiItem[]\n }\n\n /** Get available DF Rewards for a token\n * @param {String} userAddress user address\n * @param {String} tokenAddress token address\n * @return {Promise<string>}\n */\n public async getAvailableRewards(\n userAddress: string,\n tokenAddress: string\n ): Promise<string> {\n const rewards = await this.contract.claimable(userAddress, tokenAddress)\n const rewardsFormated = await this.unitsToAmount(tokenAddress, rewards)\n\n return rewardsFormated\n }\n\n /**\n * claim rewards for any address\n * @param {String} userAddress user address to claim\n * @param {String} tokenAddress token address\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async claimRewards<G extends boolean = false>(\n userAddress: string,\n tokenAddress: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const estGas = await this.contract.claimFor.estimateGas(userAddress, tokenAddress)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n // Invoke function of the contract\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.claimFor,\n userAddress,\n tokenAddress\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * allocate rewards to address. An approve must exist before calling this function.\n * @param {String[]} userAddresses array of users that will receive rewards\n * @param {String[]} amounts array of amounts\n * @param {String} tokenAddress token address\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async allocateRewards<G extends boolean = false>(\n userAddresses: string[],\n amounts: string[],\n tokenAddress: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n for (let i = 0; i < amounts.length; i++) {\n amounts[i] = await this.amountToUnits(tokenAddress, amounts[i])\n }\n const estGas = await this.contract.allocate.estimateGas(\n userAddresses,\n amounts,\n tokenAddress\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n // Invoke function of the contract\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.allocate,\n userAddresses,\n amounts,\n tokenAddress\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n}\n","import dfStrategyV1ABI from '@oceanprotocol/contracts/artifacts/contracts/df/DFStrategyV1.sol/DFStrategyV1.json'\nimport { sendTx } from '../../utils/ContractUtils.js'\nimport { SmartContractWithAddress } from '../SmartContractWithAddress.js'\nimport { ReceiptOrEstimate, AbiItem } from '../../@types'\n/**\n * Provides an interface for dfStrategyV1 contract\n */\nexport class DfStrategyV1 extends SmartContractWithAddress {\n getDefaultAbi() {\n return dfStrategyV1ABI.abi as AbiItem[]\n }\n\n /** Get available DF Rewards for multiple tokens\n * @param {String} userAddress user address\n * @param {String} tokenAddresses array of tokens\n * @return {Promise<string[]>}\n */\n public async getMultipleAvailableRewards(\n userAddress: string,\n tokenAddresses: string[]\n ): Promise<string[]> {\n const rewards = await this.contract.claimables(userAddress, tokenAddresses)\n const rewardsFormated: string[] = []\n for (let i = 0; i < rewards.length; i++) {\n rewardsFormated.push(await this.unitsToAmount(tokenAddresses[i], rewards[i]))\n }\n return rewardsFormated\n }\n\n /**\n * claim multiple token rewards for any address\n * @param {String} userAddress user address to claim\n * @param {String} tokenAddresses array of tokens\n * @return {Promise<ReceiptOrEstimate>}\n */\n public async claimMultipleRewards<G extends boolean = false>(\n userAddress: string,\n tokenAddresses: string[],\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const estGas = await this.contract.claimMultiple.estimateGas(\n userAddress,\n tokenAddresses\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n // Invoke function of the contract\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.claimMultiple,\n userAddress,\n tokenAddresses\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n}\n","import { Signer, getAddress, parseEther } from 'ethers'\nimport Escrow from '@oceanprotocol/contracts/artifacts/contracts/escrow/Escrow.sol/Escrow.json'\nimport { amountToUnits, sendTx } from '../utils/ContractUtils'\nimport { AbiItem, ReceiptOrEstimate, ValidationResponse } from '../@types'\nimport { Config } from '../config'\nimport { SmartContractWithAddress } from './SmartContractWithAddress'\nimport { Datatoken } from './Datatoken'\nimport BigNumber from 'bignumber.js'\n\nexport class EscrowContract extends SmartContractWithAddress {\n public abiEnterprise: AbiItem[]\n\n getDefaultAbi() {\n return Escrow.abi as AbiItem[]\n }\n\n /**\n * Instantiate AccessList class\n * @param {string} address The contract address.\n * @param {Signer} signer The signer object.\n * @param {string | number} [network] Network id or name\n * @param {Config} [config] The configuration object.\n * @param {AbiItem[]} [abi] ABI array of the smart contract\n * @param {AbiItem[]} abiEnterprise Enterprise ABI array of the smart contract\n */\n constructor(\n address: string,\n signer: Signer,\n network?: string | number,\n config?: Config,\n abi?: AbiItem[]\n ) {\n super(address, signer, network, config, abi)\n this.abi = abi || this.getDefaultAbi()\n }\n\n /**\n * Get Funds\n * @return {Promise<any>} Funds\n */\n public async getFunds(token: string): Promise<any> {\n return await this.contract.getFunds(token)\n }\n\n /**\n * Get User Funds\n * @return {Promise<any>} User funds\n */\n public async getUserFunds(payer: string, token: string): Promise<any> {\n return await this.contract.getUserFunds(payer, token)\n }\n\n /**\n * Get User Tokens\n * @return {Promise<any>} Array of tokens\n */\n public async getUserTokens(payer: string): Promise<any> {\n return await this.contract.getUserTokens(payer)\n }\n\n /**\n * Get Locks\n * @return {Promise<[]>} Locks\n */\n public async getLocks(token: string, payer: string, payee: string): Promise<any[]> {\n return await this.contract.getLocks(token, payer, payee)\n }\n\n /**\n * Get Authorizations\n * @return {Promise<[]>} Authorizations\n */\n public async getAuthorizations(\n token: string,\n payer: string,\n payee: string\n ): Promise<any[]> {\n return await this.contract.getAuthorizations(token, payer, payee)\n }\n\n /**\n * Checks funds for escrow payment.\n * Does authorization when needed.\n * Does deposit when needed.\n * @param {String} token as payment token for escrow\n * @param {String} consumerAddress as consumerAddress for that environment\n * @param {String} amountToDeposit wanted amount for escrow lock deposit. If this is\n * not provided and funds for escrow are 0 -> fallback to maxLockedAmount, else\n * use balance of payment token.\n * @param {String} maxLockedAmount amount necessary to be paid for starting compute job,\n * returned from initialize compute payment and used for authorize if needed.\n * @param {String} maxLockSeconds max seconds to lock the payment,\n * returned from initialize compute payment and used for authorize if needed.\n * @param {String} maxLockCounts max lock counts,\n * returned from initialize compute payment and used for authorize if needed.\n * @return {Promise<ValidationResponse>} validation response\n */\n public async verifyFundsForEscrowPayment(\n token: string,\n consumerAddress: string,\n amountToDeposit?: string,\n maxLockedAmount?: string,\n maxLockSeconds?: string,\n maxLockCounts?: string\n ): Promise<ValidationResponse> {\n const balanceNativeToken = await this.signer.provider?.getBalance(\n getAddress(consumerAddress)\n )\n if (new BigNumber(balanceNativeToken).isZero()) {\n return {\n isValid: false,\n message: 'Native token balance is 0. Please add funds'\n }\n }\n const tokenContract = new Datatoken(this.signer)\n const allowance = await tokenContract.allowance(\n token,\n await this.signer.getAddress(),\n this.contract.target.toString()\n )\n if (\n new BigNumber(await this.amountToUnits(token, allowance, 18)).isLessThan(\n new BigNumber(maxLockedAmount)\n )\n ) {\n await tokenContract.approve(\n getAddress(token),\n getAddress(this.contract.target.toString()),\n maxLockedAmount\n )\n }\n const balancePaymentToken = await tokenContract.balance(\n token,\n await this.signer.getAddress()\n )\n if (new BigNumber(balancePaymentToken).isZero()) {\n return {\n isValid: false,\n message: 'Payment token balance is 0. Please add funds'\n }\n }\n const auths = await this.getAuthorizations(\n token,\n await this.signer.getAddress(),\n consumerAddress\n )\n const funds = await this.getUserFunds(await this.signer.getAddress(), token)\n if (new BigNumber(funds[0]).isZero()) {\n if (\n amountToDeposit &&\n new BigNumber(parseEther(balancePaymentToken)).isLessThanOrEqualTo(\n new BigNumber(parseEther(amountToDeposit))\n ) &&\n new BigNumber(parseEther(amountToDeposit)).isGreaterThan(\n new BigNumber(maxLockedAmount)\n )\n ) {\n await this.deposit(token, amountToDeposit)\n } else if (\n new BigNumber(parseEther(balancePaymentToken)).isLessThanOrEqualTo(\n new BigNumber(parseEther(maxLockedAmount))\n )\n ) {\n await this.deposit(token, await this.unitsToAmount(token, maxLockedAmount))\n } else {\n await this.deposit(token, balancePaymentToken)\n }\n }\n if (auths.length === 0) {\n await this.authorize(\n getAddress(token),\n getAddress(consumerAddress),\n (Number(maxLockedAmount) / 2).toString(),\n maxLockSeconds,\n maxLockCounts\n )\n }\n return {\n isValid: true,\n message: ''\n }\n }\n\n /**\n * Deposit funds\n * @param {String} token Token address\n * @param {String} amount amount\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} returns the transaction receipt or the estimateGas value\n */\n public async deposit<G extends boolean = false>(\n token: string,\n amount: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const amountParsed = amountToUnits(null, null, amount, 18)\n const estGas = await this.contract.deposit.estimateGas(token, amountParsed)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.deposit,\n token,\n amountParsed\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Withdraw funds\n * @param {String[]} tokens Array of token addresses\n * @param {String[]} amounts Array of token amounts\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} returns the transaction receipt or the estimateGas value\n */\n public async withdraw<G extends boolean = false>(\n tokens: string[],\n amounts: string[],\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n // check if funds exist in escrow in order to be withdrawed\n const tokensWithSufficientFunds = []\n const amountsWithSufficientFunds = []\n\n if (tokens.length !== amounts.length) {\n throw new Error('Tokens and amounts arrays must have the same length')\n }\n\n const userAddress = await this.signer.getAddress()\n\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i]\n const amount = new BigNumber(amounts[i])\n\n const funds = await this.getUserFunds(userAddress, token)\n const available = new BigNumber(funds[0])\n\n if (amount.isGreaterThan(0) && amount.isLessThanOrEqualTo(available)) {\n tokensWithSufficientFunds.push(token)\n amountsWithSufficientFunds.push(amounts[i])\n } else {\n console.log(`Insufficient funds for token ${token}`)\n }\n }\n const amountsParsed = amountsWithSufficientFunds.map((amount) =>\n amountToUnits(null, null, amount, 18)\n )\n\n const estGas = await this.contract.withdraw.estimateGas(tokens, amountsParsed)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.withdraw,\n tokensWithSufficientFunds,\n amountsParsed\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Authorize locks\n * @param {String} token Token address\n * @param {String} payee,\n * @param {String} maxLockedAmount,\n * @param {String} maxLockSeconds,\n * @param {String} maxLockCounts,\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} returns the transaction receipt or the estimateGas value\n */\n public async authorize<G extends boolean = false>(\n token: string,\n payee: string,\n maxLockedAmount: string,\n maxLockSeconds: string,\n maxLockCounts: string,\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const auths = await this.getAuthorizations(\n token,\n await this.signer.getAddress(),\n payee\n )\n if (auths.length !== 0) {\n console.log(`Payee ${payee} already authorized`)\n return null\n }\n const maxLockedAmountParsed = amountToUnits(null, null, maxLockedAmount, 18)\n const maxLockSecondsParsed = amountToUnits(null, null, maxLockSeconds, 18)\n const maxLockCountsParsed = amountToUnits(null, null, maxLockCounts, 18)\n const estGas = await this.contract.authorize.estimateGas(\n token,\n payee,\n maxLockedAmountParsed,\n maxLockSecondsParsed,\n maxLockCountsParsed\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.authorize,\n token,\n payee,\n maxLockedAmountParsed,\n maxLockSecondsParsed,\n maxLockCountsParsed\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n\n /**\n * Cancel expired locks\n * @param {String} jobId Job ID with hash\n * @param {String} token Token address\n * @param {String} payee, Payee address for the compute job,\n * @param {String} payer, Payer address for the compute job\n * @param {Boolean} estimateGas if True, return gas estimate\n * @return {Promise<ReceiptOrEstimate>} returns the transaction receipt or the estimateGas value\n */\n public async cancelExpiredLocks<G extends boolean = false>(\n jobIds: string[],\n tokens: string[],\n payers: string[],\n payees: string[],\n estimateGas?: G\n ): Promise<ReceiptOrEstimate<G>> {\n const estGas = await this.contract.cancelExpiredLocks.estimateGas(\n jobIds,\n tokens,\n payers,\n payees\n )\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n const trxReceipt = await sendTx(\n estGas,\n this.getSignerAccordingSdk(),\n this.config?.gasFeeMultiplier,\n this.contract.cancelExpiredLocks,\n jobIds,\n tokens,\n payers,\n payees\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n }\n}\n","/**\n * Simple blocking sleep function\n * @param {number} ms - Number of milliseconds to wait\n */\nexport async function sleep(ms: number) {\n return new Promise((resolve) => {\n setTimeout(resolve, ms)\n })\n}\n\nexport function isDefined(something: any): boolean {\n return something !== undefined && something !== null\n}\n","import { JsonRpcSigner, Signer, getBytes, keccak256, toUtf8Bytes } from 'ethers'\nimport { LoggerInstance } from './Logger'\n\n/**\n * Signs the hash of a message using the provided signer.\n * @param {Signer} signer - The signer to use for signing the hash.\n * @param {string} message - The message to sign.\n * @returns {Promise<string>} - A Promise that resolves to the signature of the hash of the message.\n */\nexport async function signHash(signer: Signer, message: string) {\n // Since ganache has no support yet for personal_sign, we must use the legacy implementation\n // const signedMessage = await user2.signMessage(message)\n\n const messageHashBytes = getBytes(message)\n let signedMessage = await (signer as JsonRpcSigner)._legacySignMessage(messageHashBytes)\n signedMessage = signedMessage.substr(2) // remove 0x\n const r = '0x' + signedMessage.slice(0, 64)\n const s = '0x' + signedMessage.slice(64, 128)\n let v = '0x' + signedMessage.slice(128, 130)\n if (v === '0x00') v = '0x1b'\n if (v === '0x01') v = '0x1c'\n\n return { v, r, s }\n}\n\nexport async function signRequest(signer: Signer, message: string): Promise<string> {\n const consumerMessage = keccak256(toUtf8Bytes(message))\n const messageHashBytes = getBytes(consumerMessage)\n if (!signer.provider) {\n throw new Error('Provider is required but not available')\n }\n const { chainId } = await signer.provider.getNetwork()\n try {\n return await signer.signMessage(messageHashBytes)\n } catch (error) {\n LoggerInstance.error('Sign message error: ', error)\n if (Number(chainId) === 8996) {\n console.log('Signing message with _legacySignMessage')\n return await (signer as JsonRpcSigner)._legacySignMessage(messageHashBytes)\n }\n }\n}\n","import fetch from 'cross-fetch'\nimport { LoggerInstance } from '../utils/Logger'\nimport { sleep } from '../utils/General.js'\nimport { Signer } from 'ethers'\nimport { signRequest } from '../utils/SignatureUtils.js'\nimport { Asset, DDO, DDOManager, ValidateMetadata } from '@oceanprotocol/ddo-js'\n\nexport interface SearchQuery {\n from?: number\n size?: number\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n query: any\n sort?: { [jsonPath: string]: string }\n aggs?: any\n}\n\nexport class Aquarius {\n public aquariusURL: string\n\n /**\n * Instantiate Aquarius\n * @param {String} aquariusURL\n */\n constructor(aquariusURL: string) {\n this.aquariusURL = aquariusURL\n }\n\n /** Resolves a DID\n * @param {string} did DID of the asset.\n * @param {AbortSignal} signal abort signal\n * @return {Promise<Asset>} Asset\n */\n public async resolve(\n did: string,\n signal?: AbortSignal,\n authorization?: string\n ): Promise<Asset> {\n const path = this.aquariusURL + '/api/aquarius/assets/ddo/' + did\n try {\n const response = await fetch(path, {\n method: 'GET',\n headers: { 'Content-Type': 'application/json', Authorization: authorization },\n signal\n })\n\n if (response.ok) {\n const raw = await response.json()\n return raw as Asset\n } else {\n throw new Error('HTTP request failed with status ' + response.status)\n }\n } catch (e) {\n LoggerInstance.error(e)\n throw new Error('HTTP request failed')\n }\n }\n\n /**\n * Blocks until Indexer will cache the did (or the update for that did) or timeouts\n * @param {string} did DID of the asset.\n * @param {string} txid used when the did exists and we expect an update with that txid.\n * @param {AbortSignal} signal abort signal\n * @return {Promise<Asset>} DDO of the asset.\n */\n public async waitForIndexer(\n did: string,\n txid?: string,\n signal?: AbortSignal,\n interval: number = 30000,\n maxRetries: number = 100,\n authorization?: string\n ): Promise<Asset> {\n let tries = 0\n // lets have a cap to prevent possible abuse as well\n if (maxRetries > 500) {\n LoggerInstance.warn('Max Limit exceeded, defaulting to 500 retries.')\n maxRetries = 500\n }\n do {\n try {\n const path = this.aquariusURL + '/api/aquarius/assets/ddo/' + did\n const response = await fetch(path, {\n method: 'GET',\n headers: { 'Content-Type': 'application/json', Authorization: authorization },\n signal\n })\n if (response.ok) {\n const ddo = await response.json()\n const ddoInstance = DDOManager.getDDOClass(ddo)\n const { indexedMetadata } = ddoInstance.getAssetFields()\n if (txid) {\n // check tx\n if (indexedMetadata.event && indexedMetadata.event.txid === txid)\n return ddo as Asset\n } else return ddo as Asset\n }\n } catch (e) {\n // do nothing\n }\n await sleep(interval)\n tries++\n } while (tries < maxRetries)\n return null\n }\n\n /**\n * Validate DDO content\n * @param {DDO} ddo DID Descriptor Object content.\n * @param {signer} ddo publisher account.\n * @param {providerUrl} provider url used to get the nonce.\n * @param {AbortSignal} signal abort signal\n * @return {Promise<ValidateMetadata>}.\n */\n public async validate(\n ddo: DDO,\n signer: Signer,\n providerUrl: string,\n signal?: AbortSignal,\n authorization?: string\n ): Promise<ValidateMetadata> {\n const ddoValidateRoute = providerUrl + '/api/aquarius/assets/ddo/validate'\n const pathNonce = providerUrl + '/api/services/nonce'\n\n try {\n const publisherAddress = await signer.getAddress()\n // aquarius is always same url of other components with ocean nodes\n const responseNonce = await fetch(pathNonce + `?userAddress=${publisherAddress}`, {\n method: 'GET',\n headers: { 'Content-Type': 'application/json', Authorization: authorization },\n signal\n })\n let { nonce } = await responseNonce.json()\n console.log(`[getNonce] Consumer: ${publisherAddress} nonce: ${nonce}`)\n if (!nonce || nonce === null) {\n nonce = '0'\n }\n const nextNonce = (Number(nonce) + 1).toString() // have to increase the previous\n // same signed message as usual (did + nonce)\n // the node will only validate (add his signature if there fields are present and are valid)\n // let signatureMessage = publisherAddress\n const signatureMessage = publisherAddress + nextNonce\n const signature = await signRequest(signer, signatureMessage)\n const data = { ddo, publisherAddress, nonce: nextNonce, signature }\n const response = await fetch(ddoValidateRoute, {\n method: 'POST',\n body: JSON.stringify(data),\n headers: {\n 'Content-Type': 'application/octet-stream',\n Authorization: authorization\n },\n signal\n })\n const jsonResponse = await response.json()\n if (response.status !== 200) {\n throw new Error('Metadata validation failed')\n }\n console.log('Ddo successfully validated')\n\n return {\n valid: true,\n hash: jsonResponse.hash,\n proof: {\n validatorAddress: jsonResponse.publicKey,\n r: jsonResponse.r[0],\n s: jsonResponse.s[0],\n v: jsonResponse.v\n }\n }\n } catch (e) {\n LoggerInstance.error('Metadata validation failed', e.message)\n }\n }\n\n /**\n * Search over the DDOs using a query.\n * @param {string} did DID of the asset\n * @param {AbortSignal} signal abort signal\n * @return {Promise<QueryResult>}\n */\n public async getAssetMetadata(\n did: string,\n signal?: AbortSignal,\n authorization?: string\n ): Promise<any> {\n const path = this.aquariusURL + '/api/aquarius/assets/metadata/' + did\n\n try {\n const response = await fetch(path, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: authorization\n },\n signal\n })\n\n if (response.ok) {\n return response.json()\n } else {\n throw new Error(\n 'getAssetMetadata failed: ' + response.status + response.statusText\n )\n }\n } catch (error) {\n LoggerInstance.error('Error getting metadata: ', error)\n throw new Error('Error getting metadata: ' + error)\n }\n }\n\n /**\n * Search over the DDOs using a query.\n * @param {SearchQuery} query Query to filter the DDOs.\n * @param {AbortSignal} signal abort signal\n * @return {Promise<QueryResult>}\n */\n public async querySearch(\n query: SearchQuery,\n signal?: AbortSignal,\n authorization?: string\n ): Promise<any> {\n const path = this.aquariusURL + '/api/aquarius/assets/query'\n\n try {\n const response = await fetch(path, {\n method: 'POST',\n body: JSON.stringify(query),\n headers: {\n 'Content-Type': 'application/json',\n Authorization: authorization\n },\n signal\n })\n\n if (response.ok) {\n return response.json()\n } else {\n throw new Error('querySearch failed: ' + response.status + response.statusText)\n }\n } catch (error) {\n LoggerInstance.error('Error querying metadata: ', error)\n throw new Error('Error querying metadata: ' + error)\n }\n }\n}\n","import fetch from 'cross-fetch'\nimport { ethers, JsonRpcSigner, Signer, toUtf8Bytes } from 'ethers'\nimport { LoggerInstance } from '../utils/Logger.js'\nimport {\n Arweave,\n FileInfo,\n ComputeJob,\n ComputeOutput,\n ComputeAlgorithm,\n ComputeAsset,\n ComputeEnvironment,\n ProviderInitialize,\n ProviderComputeInitializeResults,\n ServiceEndpoint,\n UrlFile,\n UserCustomParameters,\n Ipfs,\n ComputeResourceRequest,\n ComputePayment,\n ComputeJobMetadata,\n PolicyServerInitializeCommand,\n PolicyServerPassthroughCommand\n} from '../@types'\nimport { decodeJwt } from '../utils/Jwt.js'\n\nexport class Provider {\n private async getConsumerAddress(signerOrAuthToken: Signer | string): Promise<string> {\n const isAuthToken = typeof signerOrAuthToken === 'string'\n return isAuthToken\n ? decodeJwt(signerOrAuthToken).address\n : await signerOrAuthToken.getAddress()\n }\n\n private async getSignature(\n signerOrAuthToken: Signer | string,\n message: string\n ): Promise<string | null> {\n const isAuthToken = typeof signerOrAuthToken === 'string'\n return isAuthToken ? null : await this.signProviderRequest(signerOrAuthToken, message)\n }\n\n private getAuthorization(signerOrAuthToken: Signer | string): string | undefined {\n const isAuthToken = typeof signerOrAuthToken === 'string'\n return isAuthToken ? signerOrAuthToken : undefined\n }\n\n /**\n * Returns the provider endpoints\n * @param {string} providerUri - the provider url\n * @return {Promise<any>}\n */\n async getEndpoints(providerUri: string, authorization?: string): Promise<any> {\n try {\n const endpoints = await this.getData(providerUri, authorization)\n return await endpoints.json()\n } catch (e) {\n LoggerInstance.error('Finding the service endpoints failed:', e)\n throw new Error('HTTP request failed calling Provider')\n }\n }\n\n /**\n * This function returns the endpoint URL for a given service name.\n * @param {ServiceEndpoint[]} servicesEndpoints - The array of service endpoints\n * @param {string} serviceName - The name of the service\n * @returns {ServiceEndpoint} The endpoint URL for the given service name\n */\n getEndpointURL(\n servicesEndpoints: ServiceEndpoint[],\n serviceName: string\n ): ServiceEndpoint {\n if (!servicesEndpoints) return null\n return servicesEndpoints.find(\n (s) => s.serviceName.toLowerCase() === serviceName.toLowerCase()\n ) as ServiceEndpoint\n }\n\n /**\n * This function returns an array of service endpoints for a given provider endpoint.\n * @param {string} providerEndpoint - The provider endpoint\n * @param {any} endpoints - The endpoints object\n * @returns {ServiceEndpoint[]} An array of service endpoints\n */\n public async getServiceEndpoints(providerEndpoint: string, endpoints: any) {\n const serviceEndpoints: ServiceEndpoint[] = []\n for (const i in endpoints.serviceEndpoints) {\n const endpoint: ServiceEndpoint = {\n serviceName: i,\n method: endpoints.serviceEndpoints[i][0],\n urlPath:\n providerEndpoint.replace(/\\/+$/, '') +\n '/' +\n endpoints.serviceEndpoints[i][1].replace(/^\\/+/, '')\n }\n serviceEndpoints.push(endpoint)\n }\n return serviceEndpoints\n }\n\n /**\n * Get current nonce from the provider.\n * @param {string} providerUri provider uri address\n * @param {string} consumerAddress Publisher address\n * @param {AbortSignal} signal abort signal\n * @param {string} providerEndpoints Identifier of the asset to be registered in ocean\n * @param {string} serviceEndpoints document description object (DDO)=\n * @return {Promise<string>} urlDetails\n */\n public async getNonce(\n providerUri: string,\n consumerAddress: string,\n signal?: AbortSignal,\n providerEndpoints?: any,\n serviceEndpoints?: ServiceEndpoint[]\n ): Promise<number> {\n if (!providerEndpoints) {\n providerEndpoints = await this.getEndpoints(providerUri)\n }\n if (!serviceEndpoints) {\n serviceEndpoints = await this.getServiceEndpoints(providerUri, providerEndpoints)\n }\n const path = this.getEndpointURL(serviceEndpoints, 'nonce')\n ? this.getEndpointURL(serviceEndpoints, 'nonce').urlPath\n : null\n if (!path) return null\n try {\n const response = await fetch(path + `?userAddress=${consumerAddress}`, {\n method: 'GET',\n headers: { 'Content-Type': 'application/json' },\n signal\n })\n const { nonce } = await response.json()\n console.log(`[getNonce] Consumer: ${consumerAddress} nonce: ${nonce}`)\n const sanitizedNonce = !nonce || nonce === null ? 0 : Number(nonce)\n return sanitizedNonce\n } catch (e) {\n LoggerInstance.error(e)\n throw new Error(e.message)\n }\n }\n\n /**\n * Sign a provider request with a signer.\n * @param {Signer} signer - The signer to use.\n * @param {string} message - The message to sign.\n * @returns {Promise<string>} A promise that resolves with the signature.\n */\n public async signProviderRequest(signer: Signer, message: string): Promise<string> {\n // const isMetaMask = web3 && web3.currentProvider && (web3.currentProvider as any).isMetaMask\n // if (isMetaMask) return await web3.eth.personal.sign(consumerMessage, accountId, password)\n // await web3.eth.sign(consumerMessage, await signer.getAddress())\n const consumerMessage = ethers.keccak256(toUtf8Bytes(message))\n const messageHashBytes = ethers.getBytes(consumerMessage)\n try {\n return await signer.signMessage(messageHashBytes)\n } catch (error) {\n // LoggerInstance.error('Sign provider message error: ', error)\n // Check if the user is using barge chain\n const network = await signer.provider.getNetwork()\n const chainId = Number(network.chainId)\n if (chainId === 8996) {\n return await (signer as JsonRpcSigner)._legacySignMessage(messageHashBytes)\n }\n }\n }\n\n /**\n * Encrypt data using the Provider's own symmetric key\n * @param {string} data data in json format that needs to be sent , it can either be a DDO or a File array\n * @param {number} chainId network's id so provider can choose the corresponding Signer object\n * @param {string} providerUri provider uri address\n * @param {AbortSignal} signal abort signal\n * @return {Promise<string>} urlDetails\n */\n public async encrypt(\n data: any,\n chainId: number,\n providerUri: string,\n signal?: AbortSignal\n ): Promise<string> {\n const providerEndpoints = await this.getEndpoints(providerUri)\n const serviceEndpoints = await this.getServiceEndpoints(\n providerUri,\n providerEndpoints\n )\n const path =\n (this.getEndpointURL(serviceEndpoints, 'encrypt')\n ? this.getEndpointURL(serviceEndpoints, 'encrypt').urlPath\n : null) + `?chainId=${chainId}`\n if (!path) return null\n try {\n const response = await fetch(path, {\n method: 'POST',\n body: JSON.stringify(data),\n headers: { 'Content-Type': 'application/octet-stream' },\n signal\n })\n return await response.text()\n } catch (e) {\n LoggerInstance.error(e)\n throw new Error('HTTP request failed calling Provider')\n }\n }\n\n /**\n * Get file details for a given DID and service ID.\n * @param {string} did - The DID to check.\n * @param {string} serviceId - The service ID to check.\n * @param {string} providerUri - The URI of the provider.\n * @param {boolean} [withChecksum=false] - Whether or not to include a checksum.\n * @param {AbortSignal} [signal] - An optional abort signal.\n * @returns {Promise<FileInfo[]>} A promise that resolves with an array of file info objects.\n */\n public async checkDidFiles(\n did: string,\n serviceId: string,\n providerUri: string,\n withChecksum: boolean = false,\n signal?: AbortSignal\n ): Promise<FileInfo[]> {\n const providerEndpoints = await this.getEndpoints(providerUri)\n const serviceEndpoints = await this.getServiceEndpoints(\n providerUri,\n providerEndpoints\n )\n const args = { did, serviceId, checksum: withChecksum }\n const files: FileInfo[] = []\n const path = this.getEndpointURL(serviceEndpoints, 'fileinfo')\n ? this.getEndpointURL(serviceEndpoints, 'fileinfo').urlPath\n : null\n if (!path) return null\n let response\n try {\n response = await fetch(path, {\n method: 'POST',\n body: JSON.stringify(args),\n headers: { 'Content-Type': 'application/json' },\n signal\n })\n } catch (e) {\n LoggerInstance.error('File info call failed: ')\n LoggerInstance.error(e)\n throw new Error(e)\n }\n if (response?.ok) {\n const results: FileInfo[] = await response.json()\n for (const result of results) {\n files.push(result)\n }\n return files\n }\n const resolvedResponse = await response.json()\n LoggerInstance.error(\n 'File info call failed: ',\n response.status,\n response.statusText,\n resolvedResponse\n )\n throw new Error(JSON.stringify(resolvedResponse))\n }\n\n /**\n * Get File details (if possible)\n * @param {UrlFile | Arweave | Ipfs | GraphqlQuery | Smartcontract} file one of the supported file structures\n * @param {string} providerUri uri of the provider that will be used to check the file\n * @param {boolean} [withChecksum=false] - Whether or not to include a checksum.\n * @param {AbortSignal} [signal] - An optional abort signal.\n * @returns {Promise<FileInfo[]>} A promise that resolves with an array of file info objects.\n */\n public async getFileInfo(\n file: UrlFile | Arweave | Ipfs,\n providerUri: string,\n withChecksum: boolean = false,\n signal?: AbortSignal\n ): Promise<FileInfo[]> {\n const providerEndpoints = await this.getEndpoints(providerUri)\n const serviceEndpoints = await this.getServiceEndpoints(\n providerUri,\n providerEndpoints\n )\n const args = { ...file, checksum: withChecksum }\n const files: FileInfo[] = []\n const path = this.getEndpointURL(serviceEndpoints, 'fileinfo')\n ? this.getEndpointURL(serviceEndpoints, 'fileinfo').urlPath\n : null\n if (!path) return null\n let response\n try {\n response = await fetch(path, {\n method: 'POST',\n body: JSON.stringify(args),\n headers: { 'Content-Type': 'application/json' },\n signal\n })\n } catch (e) {\n LoggerInstance.error('File info call failed: ')\n LoggerInstance.error(e)\n throw new Error(e)\n }\n if (response?.ok) {\n const results: FileInfo[] = await response.json()\n for (const result of results) {\n files.push(result)\n }\n return files\n }\n const resolvedResponse = await response.json()\n LoggerInstance.error(\n 'File info call failed: ',\n response.status,\n response.statusText,\n resolvedResponse\n )\n throw new Error(JSON.stringify(resolvedResponse))\n }\n\n /**\n * Returns compute environments from a provider.\n * @param {string} providerUri - The URI of the provider.\n * @param {AbortSignal} [signal] - An optional abort signal.\n * @returns {Promise<{[chainId: number]: ComputeEnvironment[]}>} A promise that resolves with an object containing compute environments for each chain ID.\n */\n public async getComputeEnvironments(\n providerUri: string,\n signal?: AbortSignal\n ): Promise<ComputeEnvironment[]> {\n const providerEndpoints = await this.getEndpoints(providerUri)\n const serviceEndpoints = await this.getServiceEndpoints(\n providerUri,\n providerEndpoints\n )\n const path = this.getEndpointURL(serviceEndpoints, 'computeEnvironments')?.urlPath\n if (!path) return null\n let response\n try {\n response = await fetch(path, {\n method: 'GET',\n headers: { 'Content-Type': 'application/json' },\n signal\n })\n } catch (e) {\n LoggerInstance.error('Fetch compute env failed: ')\n LoggerInstance.error(e)\n throw new Error(e)\n }\n if (response?.ok) {\n const result = response.json()\n // chain is not part of response\n // if (Array.isArray(result)) {\n // const providerChain: number = providerEndpoints.chainId\n // return { [providerChain]: result }\n // }\n return result\n }\n const resolvedResponse = await response.json()\n LoggerInstance.error(\n 'Fetch compute env failed: ',\n response.status,\n response.statusText,\n resolvedResponse\n )\n throw new Error(JSON.stringify(resolvedResponse))\n }\n\n /**\n * Initializes the provider for a service request.\n * @param {string} did - The asset DID .\n * @param {string} serviceId - The asset service ID.\n * @param {number} fileIndex - The file index.\n * @param {string} consumerAddress - The consumer address.\n * @param {string} providerUri - The URI of the provider.\n * @param {AbortSignal} [signal] - The abort signal if any.\n * @param {UserCustomParameters} [userCustomParameters] - The custom parameters if any.\n * @param {string} [computeEnv] - The compute environment if any.\n * @param {number} [validUntil] - The validity time if any.\n * @returns {Promise<ProviderInitialize>} A promise that resolves with ProviderInitialize response.\n */\n public async initialize(\n did: string,\n serviceId: string,\n fileIndex: number,\n consumerAddress: string,\n providerUri: string,\n signal?: AbortSignal,\n userCustomParameters?: UserCustomParameters,\n computeEnv?: string,\n validUntil?: number\n ): Promise<ProviderInitialize> {\n const providerEndpoints = await this.getEndpoints(providerUri)\n const serviceEndpoints = await this.getServiceEndpoints(\n providerUri,\n providerEndpoints\n )\n let initializeUrl = this.getEndpointURL(serviceEndpoints, 'initialize')\n ? this.getEndpointURL(serviceEndpoints, 'initialize').urlPath\n : null\n\n if (!initializeUrl) return null\n initializeUrl += `?documentId=${did}`\n initializeUrl += `&serviceId=${serviceId}`\n initializeUrl += `&fileIndex=${fileIndex}`\n initializeUrl += `&consumerAddress=${consumerAddress}`\n if (userCustomParameters)\n initializeUrl += '&userdata=' + encodeURI(JSON.stringify(userCustomParameters))\n if (computeEnv) initializeUrl += '&environment=' + encodeURI(computeEnv)\n if (validUntil) initializeUrl += '&validUntil=' + validUntil\n let response\n try {\n response = await fetch(initializeUrl, {\n method: 'GET',\n headers: { 'Content-Type': 'application/json' },\n signal\n })\n } catch (e) {\n LoggerInstance.error('Provider initialized failed: ')\n LoggerInstance.error(e)\n throw new Error(`Provider initialize failed url: ${initializeUrl} `)\n }\n if (response?.status === 200) {\n const results: ProviderInitialize = await response.json()\n return results\n }\n const resolvedResponse = await response.json()\n LoggerInstance.error(\n 'Provider initialized failed: ',\n response.status,\n response.statusText,\n resolvedResponse\n )\n throw new Error(JSON.stringify(resolvedResponse))\n }\n\n /** Initializes the provider for a compute request.\n * @param {ComputeAsset[]} assets The datasets array to initialize compute request.\n * @param {ComputeAlgorithmber} algorithm The algorithm to use.\n * @param {string} computeEnv The compute environment.\n * @param {number} validUntil The job expiration date.\n * @param {string} providerUri The provider URI.\n * @param {string} accountId caller address\n * @param {AbortSignal} signal abort signal\n * @return {Promise<ProviderComputeInitialize>} ProviderComputeInitialize data\n */\n public async initializeComputeV1(\n assets: ComputeAsset[],\n algorithm: ComputeAlgorithm,\n computeEnv: string,\n providerUri: string,\n accountId: string,\n chainId: number,\n token: string,\n maxJobDuration: number,\n signal?: AbortSignal\n ): Promise<ProviderComputeInitializeResults> {\n const providerEndpoints = await this.getEndpoints(providerUri)\n const serviceEndpoints = await this.getServiceEndpoints(\n providerUri,\n providerEndpoints\n )\n const payment: ComputePayment = {\n chainId,\n token,\n maxJobDuration\n }\n const payload: Object = {\n datasets: assets,\n algorithm,\n payment,\n consumerAddress: accountId,\n environment: computeEnv\n }\n const initializeUrl = this.getEndpointURL(serviceEndpoints, 'initializeCompute')\n ? this.getEndpointURL(serviceEndpoints, 'initializeCompute').urlPath\n : null\n if (!initializeUrl) return null\n let response\n try {\n response = await fetch(initializeUrl, {\n method: 'POST',\n body: JSON.stringify(payload),\n headers: { 'Content-Type': 'application/json' },\n signal\n })\n } catch (e) {\n LoggerInstance.error('Initialize compute failed: ')\n LoggerInstance.error(e)\n throw new Error('ComputeJob cannot be initialized')\n }\n if (response?.ok) {\n const params = await response.json()\n return params\n }\n const resolvedResponse = await response.json()\n LoggerInstance.error(\n 'Initialize compute failed: ',\n response.status,\n response.statusText,\n resolvedResponse\n )\n LoggerInstance.error('Payload was:', JSON.stringify(payload))\n throw new Error(JSON.stringify(resolvedResponse))\n }\n\n /** Initializes the provider for a compute request.\n * @param {ComputeAsset[]} assets The datasets array to initialize compute request.\n * @param {ComputeAlgorithmber} algorithm The algorithm to use.\n * @param {string} computeEnv The compute environment.\n * @param {string} token The payment token address.\n * @param {number} validUntil The job expiration date.\n * @param {string} providerUri The provider URI.\n * @param {SignerOrAuthToken} signerOrAuthToken Signer or auth token\n * @param {ComputeResourceRequest[]} resources The resources to start compute job with.\n * @param {number} chainId The chain used to do payments\n * @param {any} policyServer Policy server data.\n * @param {AbortSignal} signal abort signal\n * @return {Promise<ProviderComputeInitialize>} ProviderComputeInitialize data\n */\n public async initializeCompute(\n assets: ComputeAsset[],\n algorithm: ComputeAlgorithm,\n computeEnv: string,\n token: string,\n validUntil: number,\n providerUri: string,\n signerOrAuthToken: Signer | string,\n resources: ComputeResourceRequest[],\n chainId: number,\n policyServer?: any,\n signal?: AbortSignal\n ): Promise<ProviderComputeInitializeResults> {\n const providerEndpoints = await this.getEndpoints(providerUri)\n const serviceEndpoints = await this.getServiceEndpoints(\n providerUri,\n providerEndpoints\n )\n const initializeUrl = this.getEndpointURL(serviceEndpoints, 'initializeCompute')\n ? this.getEndpointURL(serviceEndpoints, 'initializeCompute').urlPath\n : null\n if (!initializeUrl) return null\n\n // Diff from V1. We might need a signature to get the files object, specially if dealing with confidential evm and template 4\n // otherwise it can be ignored\n const consumerAddress = await this.getConsumerAddress(signerOrAuthToken)\n const nonce = (\n (await this.getNonce(\n providerUri,\n consumerAddress,\n signal,\n providerEndpoints,\n serviceEndpoints\n )) + 1\n ).toString()\n\n // same signed message as for start compute (consumer address + did[0] + nonce)\n let signatureMessage = consumerAddress\n signatureMessage += assets[0]?.documentId\n signatureMessage += nonce\n const signature = await this.getSignature(signerOrAuthToken, signatureMessage)\n\n const providerData: Record<string, any> = {\n datasets: assets,\n algorithm,\n environment: computeEnv,\n payment: {\n chainId,\n token,\n resources\n },\n maxJobDuration: validUntil,\n consumerAddress,\n signature\n }\n\n if (policyServer) providerData.policyServer = policyServer\n\n let response\n try {\n console.log('Initialize compute url:', initializeUrl)\n response = await fetch(initializeUrl, {\n method: 'POST',\n body: JSON.stringify(providerData),\n headers: {\n 'Content-Type': 'application/json',\n Authorization: this.getAuthorization(signerOrAuthToken)\n },\n signal\n })\n console.log('Raw response:', response)\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`${errorText}`)\n }\n } catch (e) {\n LoggerInstance.error('Initialize compute failed: ')\n LoggerInstance.error(e)\n throw new Error(`ComputeJob cannot be initialized: ${e.message}.`)\n }\n if (response?.ok) {\n const params = await response.json()\n return params\n }\n const resolvedResponse = await response.json()\n LoggerInstance.error(\n 'Initialize compute failed: ',\n response.status,\n response.statusText,\n resolvedResponse\n )\n LoggerInstance.error('Payload was:', JSON.stringify(providerData))\n throw new Error(JSON.stringify(resolvedResponse))\n }\n\n /**\n * Gets the download URL.\n * @param {string} did - The DID.\n * @param {string} serviceId - The service ID.\n * @param {number} fileIndex - The file index.\n * @param {string} transferTxId - The transfer transaction ID.\n * @param {string} providerUri - The provider URI.\n * @param {SignerOrAuthToken} signerOrAuthToken - The signer or auth token.\n * @param {any} policyServer Policy server data.\n * @param {UserCustomParameters} userCustomParameters - The user custom parameters.\n * @returns {Promise<any>} The download URL.\n */\n public async getDownloadUrl(\n did: string,\n serviceId: string,\n fileIndex: number,\n transferTxId: string,\n providerUri: string,\n signerOrAuthToken: Signer | string,\n policyServer?: any,\n userCustomParameters?: UserCustomParameters\n ): Promise<any> {\n const providerEndpoints = await this.getEndpoints(providerUri)\n const serviceEndpoints = await this.getServiceEndpoints(\n providerUri,\n providerEndpoints\n )\n const downloadUrl = this.getEndpointURL(serviceEndpoints, 'download')\n ? this.getEndpointURL(serviceEndpoints, 'download').urlPath\n : null\n if (!downloadUrl) return null\n const consumerAddress = await this.getConsumerAddress(signerOrAuthToken)\n const nonce = (\n (await this.getNonce(\n providerUri,\n consumerAddress,\n null,\n providerEndpoints,\n serviceEndpoints\n )) + 1\n ).toString()\n\n const signature = await this.getSignature(signerOrAuthToken, did + nonce)\n let consumeUrl = downloadUrl\n consumeUrl += `?fileIndex=${fileIndex}`\n consumeUrl += `&documentId=${did}`\n consumeUrl += `&transferTxId=${transferTxId}`\n consumeUrl += `&serviceId=${serviceId}`\n consumeUrl += `&consumerAddress=${consumerAddress}`\n consumeUrl += `&nonce=${nonce}`\n if (policyServer) {\n consumeUrl += '&policyServer=' + encodeURI(JSON.stringify(policyServer))\n }\n\n consumeUrl += `&signature=${signature}`\n if (userCustomParameters)\n consumeUrl += '&userdata=' + encodeURI(JSON.stringify(userCustomParameters))\n return consumeUrl\n }\n\n /** Instruct the provider to start a compute job (Old C2D V1) Kept for now, for backwards compatibility\n * @param {string} providerUri The provider URI.\n * @param {Signer} signer The consumer signer object.\n * @param {string} computeEnv The compute environment.\n * @param {ComputeAsset} dataset The dataset to start compute on\n * @param {ComputeAlgorithm} algorithm The algorithm to start compute with.\n * @param {AbortSignal} signal abort signal\n * @param {ComputeAsset[]} additionalDatasets The additional datasets if that is the case.\n * @param {ComputeOutput} output The compute job output settings.\n * @return {Promise<ComputeJob | ComputeJob[]>} The compute job or jobs.\n * @deprecated Use {@link computeStart} instead.\n */\n public async computeStartV1(\n providerUri: string,\n consumer: Signer,\n computeEnv: string,\n dataset: ComputeAsset,\n algorithm: ComputeAlgorithm,\n signal?: AbortSignal,\n additionalDatasets?: ComputeAsset[],\n output?: ComputeOutput\n ): Promise<ComputeJob | ComputeJob[]> {\n const providerEndpoints = await this.getEndpoints(providerUri)\n const serviceEndpoints = await this.getServiceEndpoints(\n providerUri,\n providerEndpoints\n )\n const computeStartUrl = this.getEndpointURL(serviceEndpoints, 'computeStart')\n ? this.getEndpointURL(serviceEndpoints, 'computeStart').urlPath\n : null\n\n const consumerAddress = await consumer.getAddress()\n const nonce = (\n (await this.getNonce(\n providerUri,\n consumerAddress,\n signal,\n providerEndpoints,\n serviceEndpoints\n )) + 1\n ).toString()\n\n let signatureMessage = consumerAddress\n signatureMessage += dataset.documentId\n signatureMessage += nonce\n const signature = await this.signProviderRequest(consumer, signatureMessage)\n const payload = Object()\n payload.consumerAddress = consumerAddress\n payload.signature = signature\n payload.nonce = nonce\n payload.environment = computeEnv\n payload.dataset = dataset\n payload.algorithm = algorithm\n if (additionalDatasets) payload.additionalDatasets = additionalDatasets\n if (output) payload.output = output\n if (!computeStartUrl) return null\n let response\n try {\n response = await fetch(computeStartUrl, {\n method: 'POST',\n body: JSON.stringify(payload),\n headers: { 'Content-Type': 'application/json' },\n signal\n })\n } catch (e) {\n LoggerInstance.error('Compute start failed:')\n LoggerInstance.error(e)\n LoggerInstance.error('Payload was:', payload)\n throw new Error('HTTP request failed calling Provider')\n }\n if (response?.ok) {\n const params = await response.json()\n return params\n }\n LoggerInstance.error(\n 'Compute start failed: ',\n response.status,\n response.statusText,\n await response.json()\n )\n LoggerInstance.error('Payload was:', payload)\n return null\n }\n\n /** Instruct the provider to start a PAYED compute job (new C2D V2)\n * @param {string} providerUri The provider URI.\n * @param {SignerOrAuthToken} signerOrAuthToken The consumer signer object or auth token.\n * @param {string} computeEnv The compute environment.\n * @param {ComputeAsset} datasets The dataset to start compute on + additionalDatasets (the additional datasets if that is the case)\n * @param {ComputeAlgorithm} algorithm The algorithm to start compute with.\n * @param {number} maxJobDuration The compute job max execution time.\n * @param {string} token The token address for compute payment.\n * @param {ComputeResourceRequest} resources The resources to start compute job with.\n * @param {chainId} chainId The chain used to do payments\n * @param {ComputeJobMetadata} metadata The compute job metadata. Additional metadata to be stored in the database.\n * @param {ComputeOutput} output The compute job output settings.\n * @param {any} policyServer Policy server data.\n * @param {AbortSignal} signal abort signal\n * @return {Promise<ComputeJob | ComputeJob[]>} The compute job or jobs.\n */\n public async computeStart(\n providerUri: string,\n signerOrAuthToken: Signer | string,\n computeEnv: string,\n datasets: ComputeAsset[],\n algorithm: ComputeAlgorithm,\n maxJobDuration: number,\n token: string,\n resources: ComputeResourceRequest[],\n chainId: number, // network used by payment (only for payed compute jobs)\n metadata?: ComputeJobMetadata,\n additionalViewers?: string[],\n output?: ComputeOutput,\n policyServer?: any,\n signal?: AbortSignal\n ): Promise<ComputeJob | ComputeJob[]> {\n console.log('called new compute start method...')\n console.log('datasets: ', datasets)\n console.log('algorithm: ', algorithm)\n const providerEndpoints = await this.getEndpoints(providerUri)\n const serviceEndpoints = await this.getServiceEndpoints(\n providerUri,\n providerEndpoints\n )\n\n const computeStartUrl = this.getEndpointURL(serviceEndpoints, 'computeStart')\n ? this.getEndpointURL(serviceEndpoints, 'computeStart').urlPath\n : null\n\n if (!computeStartUrl) {\n LoggerInstance.error(\n 'Compute start failed: Cannot get proper computeStart route (perhaps not implemented on provider?)'\n )\n return null\n }\n\n const consumerAddress = await this.getConsumerAddress(signerOrAuthToken)\n const nonce = (\n (await this.getNonce(\n providerUri,\n consumerAddress,\n signal,\n providerEndpoints,\n serviceEndpoints\n )) + 1\n ).toString()\n\n let signatureMessage = consumerAddress\n signatureMessage += datasets[0]?.documentId\n signatureMessage += nonce\n const signature = await this.getSignature(signerOrAuthToken, signatureMessage)\n const payload = Object()\n payload.consumerAddress = consumerAddress\n payload.signature = signature\n payload.nonce = nonce\n payload.environment = computeEnv\n payload.maxJobDuration = maxJobDuration\n payload.resources = resources\n // kept for backwards compatibility (tests running against existing provider)\n payload.dataset = datasets[0]\n // new field for C2D v2\n payload.datasets = datasets\n payload.algorithm = algorithm\n payload.chainId = chainId\n payload.payment = {\n chainId,\n token,\n maxJobDuration\n }\n if (resources) payload.payment.resources = resources\n if (metadata) payload.metadata = metadata\n if (additionalViewers) payload.additionalViewers = additionalViewers\n // if (additionalDatasets) payload.additionalDatasets = additionalDatasets\n if (output) payload.output = output\n if (policyServer) payload.policyServer = policyServer\n let response\n try {\n response = await fetch(computeStartUrl, {\n method: 'POST',\n body: JSON.stringify(payload),\n headers: {\n 'Content-Type': 'application/json',\n Authorization: this.getAuthorization(signerOrAuthToken)\n },\n signal\n })\n } catch (e) {\n LoggerInstance.error('Compute start failed:')\n LoggerInstance.error(e)\n LoggerInstance.error('Payload was:', payload)\n throw new Error('HTTP request failed calling Provider')\n }\n if (response?.ok) {\n const params = await response.json()\n return params\n }\n const resolvedResponse = await response.json()\n LoggerInstance.error(\n 'Compute start failed: ',\n response.status,\n response.statusText,\n resolvedResponse\n )\n LoggerInstance.error('Payload was:', payload)\n throw new Error(JSON.stringify(resolvedResponse))\n }\n\n /** Instruct the provider to start a FREE compute job (new C2D V2)\n * @param {string} providerUri The provider URI.\n * @param {SignerOrAuthToken} signerOrAuthToken The consumer signer object or auth token.\n * @param {string} computeEnv The compute environment.\n * @param {ComputeAsset} datasets The dataset to start compute on + additionalDatasets (the additional datasets if that is the case)\n * @param {ComputeAlgorithm} algorithm The algorithm to start compute with.\n * @param {ComputeResourceRequest} resources The resources to start compute job with.\n * @param {ComputeJobMetadata} metadata The compute job metadata. Additional metadata to be stored in the database.\n * @param {ComputeOutput} output The compute job output settings.\n * @param {any} policyServer Policy server data.\n * @param {AbortSignal} signal abort signal\n * @return {Promise<ComputeJob | ComputeJob[]>} The compute job or jobs.\n */\n public async freeComputeStart(\n providerUri: string,\n signerOrAuthToken: Signer | string,\n computeEnv: string,\n datasets: ComputeAsset[],\n algorithm: ComputeAlgorithm,\n resources?: ComputeResourceRequest[],\n metadata?: ComputeJobMetadata,\n additionalViewers?: string[],\n output?: ComputeOutput,\n policyServer?: any,\n signal?: AbortSignal\n ): Promise<ComputeJob | ComputeJob[]> {\n console.log('called new free compute start method...')\n console.log('datasets: ', datasets)\n console.log('algorithm: ', algorithm)\n const providerEndpoints = await this.getEndpoints(providerUri)\n const serviceEndpoints = await this.getServiceEndpoints(\n providerUri,\n providerEndpoints\n )\n\n const computeStartUrl = this.getEndpointURL(serviceEndpoints, 'freeCompute')\n ? this.getEndpointURL(serviceEndpoints, 'freeCompute').urlPath\n : null\n\n if (!computeStartUrl) {\n LoggerInstance.error(\n 'Compute start failed: Cannot get proper computeStart route (perhaps not implemented on provider?)'\n )\n return null\n }\n\n const consumerAddress = await this.getConsumerAddress(signerOrAuthToken)\n const nonce = (\n (await this.getNonce(\n providerUri,\n consumerAddress,\n signal,\n providerEndpoints,\n serviceEndpoints\n )) + 1\n ).toString()\n\n const signatureMessage = nonce // datasets[0].documentId\n console.log('signatureMessage: ', signatureMessage)\n const signature = await this.getSignature(signerOrAuthToken, signatureMessage)\n const payload = Object()\n payload.consumerAddress = consumerAddress\n payload.signature = signature\n payload.nonce = nonce\n payload.environment = computeEnv\n payload.resources = resources\n // kept for backwards compatibility (tests running against existing provider)\n payload.dataset = datasets[0]\n // new field for C2D v2\n payload.datasets = datasets\n payload.algorithm = algorithm\n if (metadata) payload.metadata = metadata\n if (additionalViewers) payload.additionalViewers = additionalViewers\n // if (additionalDatasets) payload.additionalDatasets = additionalDatasets\n payload.output = output\n if (policyServer) payload.policyServer = policyServer\n let response\n try {\n response = await fetch(computeStartUrl, {\n method: 'POST',\n body: JSON.stringify(payload),\n headers: {\n 'Content-Type': 'application/json',\n Authorization: this.getAuthorization(signerOrAuthToken)\n },\n signal\n })\n } catch (e) {\n LoggerInstance.error('Compute start failed:')\n LoggerInstance.error(e)\n LoggerInstance.error('Payload was:', payload)\n throw new Error('HTTP request failed calling Provider')\n }\n if (response?.ok) {\n const params = await response.json()\n return params\n }\n const resolvedResponse = await response.json()\n LoggerInstance.error(\n 'Compute start failed: ',\n response.status,\n response.statusText,\n resolvedResponse\n )\n LoggerInstance.error('Payload was:', payload)\n throw new Error(JSON.stringify(resolvedResponse))\n }\n\n /**\n *\n * @param providerUri provider URL\n * @param signerOrAuthToken signer or auth token\n * @param jobId jobId\n * @param signal abort signal\n * @returns logs response\n */\n public async computeStreamableLogs(\n providerUri: string,\n signerOrAuthToken: Signer | string,\n jobId: string,\n signal?: AbortSignal\n ): Promise<any> {\n const isAuthToken = typeof signerOrAuthToken === 'string'\n const providerEndpoints = await this.getEndpoints(providerUri)\n const serviceEndpoints = await this.getServiceEndpoints(\n providerUri,\n providerEndpoints\n )\n\n const computeStreamableLogs = this.getEndpointURL(\n serviceEndpoints,\n 'computeStreamableLogs'\n )\n ? this.getEndpointURL(serviceEndpoints, 'computeStreamableLogs').urlPath\n : null\n\n if (!computeStreamableLogs) {\n LoggerInstance.error(\n 'Compute start failed: Cannot get proper computeStreamableLogs route (perhaps not implemented on provider?)'\n )\n return null\n }\n const consumerAddress = await this.getConsumerAddress(signerOrAuthToken)\n const nonce = (\n (await this.getNonce(\n providerUri,\n consumerAddress,\n signal,\n providerEndpoints,\n serviceEndpoints\n )) + 1\n ).toString()\n\n let url = `?consumerAddress=${consumerAddress}&jobId=${jobId}`\n // Is signer, add signature and nonce\n if (!isAuthToken) {\n const signatureMessage = `${consumerAddress}${jobId}${nonce}`\n const signature = await this.getSignature(signerOrAuthToken, signatureMessage)\n url += `&signature=${signature}`\n url += `&nonce=${nonce}`\n }\n\n let response\n try {\n response = await fetch(computeStreamableLogs + url, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: this.getAuthorization(signerOrAuthToken)\n },\n signal\n })\n console.log('Raw response:', response)\n } catch (e) {\n LoggerInstance.error('computeStreamableLogs failed:')\n LoggerInstance.error(e)\n throw new Error('HTTP request failed calling Provider')\n }\n if (response?.ok || response?.status === 200) {\n // do not handle the response here\n console.log('Response body:', response.body)\n return response.body\n }\n LoggerInstance.error(\n 'computeStreamableLogs failed: ',\n response.status,\n response.statusText,\n await response.json()\n )\n return null\n }\n\n public async getComputeStartRoutes(\n providerUri: string,\n isFreeCompute: boolean = false\n ): Promise<string | null> {\n const providerEndpoints = await this.getEndpoints(providerUri)\n const serviceEndpoints = await this.getServiceEndpoints(\n providerUri,\n providerEndpoints\n )\n let computeStartUrl = null\n if (isFreeCompute) {\n computeStartUrl = this.getEndpointURL(serviceEndpoints, 'freeCompute')\n ? this.getEndpointURL(serviceEndpoints, 'freeCompute').urlPath\n : null\n } else {\n computeStartUrl = this.getEndpointURL(serviceEndpoints, 'computeStart')\n ? this.getEndpointURL(serviceEndpoints, 'computeStart').urlPath\n : null\n }\n return computeStartUrl\n }\n\n /** Instruct the provider to Stop the execution of a to stop a compute job.\n * @param {string} jobId the compute job id\n * @param {string} providerUri The provider URI.\n * @param {SignerOrAuthToken} signerOrAuthToken The consumer signer or auth token.\n * @param {string} agreementId The agreement id.\n * @param {AbortSignal} signal abort signal\n * @return {Promise<ComputeJob | ComputeJob[]>}\n */\n public async computeStop(\n jobId: string,\n providerUri: string,\n signerOrAuthToken: Signer | string,\n agreementId?: string,\n signal?: AbortSignal\n ): Promise<ComputeJob | ComputeJob[]> {\n const providerEndpoints = await this.getEndpoints(providerUri)\n const serviceEndpoints = await this.getServiceEndpoints(\n providerUri,\n providerEndpoints\n )\n const computeStopUrl = this.getEndpointURL(serviceEndpoints, 'computeStop')\n ? this.getEndpointURL(serviceEndpoints, 'computeStop').urlPath\n : null\n\n const consumerAddress = await this.getConsumerAddress(signerOrAuthToken)\n\n const nonce = (\n (await this.getNonce(\n providerUri,\n consumerAddress,\n signal,\n providerEndpoints,\n serviceEndpoints\n )) + 1\n ).toString()\n\n const signatureMessage = consumerAddress + (jobId || '')\n // On current provider impl (and nodes) we DO NOT check this signature\n // On nodes we are signing again just the Nonce to send the request to Operator Service\n // on current provider we sign: {owner}{job_id}{nonce}\" OR {owner}{nonce} if no jobId\n // On provider service STOP route, we just check signature owner + jobId OR just owner if no jobId\n // signatureMessage += (agreementId && `${this.noZeroX(agreementId)}`) || ''\n // signatureMessage += nonce\n const signature = await this.getSignature(signerOrAuthToken, signatureMessage)\n const queryParams = new URLSearchParams()\n queryParams.set('consumerAddress', consumerAddress)\n queryParams.set('signature', signature)\n queryParams.set('nonce', nonce)\n queryParams.set('jobId', jobId)\n if (agreementId) queryParams.set('agreementId', agreementId)\n\n const queryString = queryParams.toString()\n if (!queryString) return null\n let response\n try {\n response = await fetch(computeStopUrl + '?' + queryString, {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: this.getAuthorization(signerOrAuthToken)\n },\n signal\n })\n } catch (e) {\n LoggerInstance.error('Compute stop failed:')\n LoggerInstance.error(e)\n throw new Error('HTTP request failed calling Provider')\n }\n\n if (response?.ok) {\n const params = await response.json()\n return params\n }\n const resolvedResponse = await response.json()\n LoggerInstance.error(\n 'Compute stop failed: ',\n response.status,\n response.statusText,\n resolvedResponse\n )\n throw new Error(JSON.stringify(resolvedResponse))\n }\n\n /** Get compute status for a specific jobId/documentId/owner.\n * @param {string} providerUri The URI of the provider we want to query\n * @param {string} consumerAddress The consumer ethereum address\n * @param {string} jobId The ID of a compute job.\n * @param {string} agreementId The ID of the service agreement (tx id)\n * @param {AbortSignal} signal abort signal\n * @return {Promise<ComputeJob | ComputeJob[]>}\n */\n public async computeStatus(\n providerUri: string,\n consumerAddress: string,\n jobId?: string,\n agreementId?: string,\n signal?: AbortSignal,\n authorization?: string\n ): Promise<ComputeJob | ComputeJob[]> {\n const providerEndpoints = await this.getEndpoints(providerUri)\n const serviceEndpoints = await this.getServiceEndpoints(\n providerUri,\n providerEndpoints\n )\n const computeStatusUrl = this.getEndpointURL(serviceEndpoints, 'computeStatus')\n ? this.getEndpointURL(serviceEndpoints, 'computeStatus').urlPath\n : null\n\n let url = `?consumerAddress=${consumerAddress}`\n url += (agreementId && `&agreementId=${agreementId}`) || '' // ${this.noZeroX(agreementId)} #https://github.com/oceanprotocol/ocean.js/issues/1892\n url += (jobId && `&jobId=${jobId}`) || ''\n\n if (!computeStatusUrl) return null\n let response\n try {\n console.log('computeStatusUrl: ', computeStatusUrl + url)\n response = await fetch(computeStatusUrl + url, {\n method: 'GET',\n headers: { 'Content-Type': 'application/json', Authorization: authorization },\n signal\n })\n } catch (e) {\n LoggerInstance.error('Get compute status failed')\n LoggerInstance.error(e)\n throw new Error(e)\n }\n if (response?.ok) {\n const params = await response.json()\n return params\n }\n LoggerInstance.error(\n 'Get compute status failed:',\n response.status,\n response.statusText\n )\n if (response?.ok) {\n const params = await response.json()\n return params\n }\n const resolvedResponse = await response.json()\n LoggerInstance.error(\n 'Get compute status failed:',\n response.status,\n response.statusText,\n resolvedResponse\n )\n throw new Error(JSON.stringify(resolvedResponse))\n }\n\n /** Get compute result url\n * @param {string} providerUri The URI of the provider we want to query\n * @param {SignerOrAuthToken} signerOrAuthToken signer or auth token\n * @param {string} jobId The ID of a compute job.\n * @param {number} index Result index\n * @return {Promise<string>}\n */\n public async getComputeResultUrl(\n providerUri: string,\n signerOrAuthToken: Signer | string,\n jobId: string,\n index: number\n ): Promise<string> {\n const isAuthToken = typeof signerOrAuthToken === 'string'\n const providerEndpoints = await this.getEndpoints(providerUri)\n const serviceEndpoints = await this.getServiceEndpoints(\n providerUri,\n providerEndpoints\n )\n const computeResultUrl = this.getEndpointURL(serviceEndpoints, 'computeResult')\n ? this.getEndpointURL(serviceEndpoints, 'computeResult').urlPath\n : null\n\n const consumerAddress = await this.getConsumerAddress(signerOrAuthToken)\n const nonce = (\n (await this.getNonce(\n providerUri,\n consumerAddress,\n null,\n providerEndpoints,\n serviceEndpoints\n )) + 1\n ).toString()\n let signatureMessage = consumerAddress\n signatureMessage += jobId\n signatureMessage += index.toString()\n signatureMessage += nonce\n const signature = await this.getSignature(signerOrAuthToken, signatureMessage)\n if (!computeResultUrl) return null\n let resultUrl = computeResultUrl\n resultUrl += `?consumerAddress=${consumerAddress}`\n resultUrl += `&jobId=${jobId}`\n resultUrl += `&index=${index.toString()}`\n if (!isAuthToken) {\n resultUrl += `&nonce=${nonce}`\n resultUrl += `&signature=${signature}`\n }\n return resultUrl\n }\n\n /** Deletes a compute job.\n * @param {string} did asset did\n * @param {SignerOrAuthToken} signerOrAuthToken signer or auth token\n * @param {string} jobId the compute job ID\n * @param {string} providerUri The URI of the provider we want to query\n * @param {AbortSignal} signal abort signal\n * @return {Promise<ComputeJob | ComputeJob[]>}\n */\n public async computeDelete(\n did: string,\n signerOrAuthToken: Signer | string,\n jobId: string,\n providerUri: string,\n signal?: AbortSignal\n ): Promise<ComputeJob | ComputeJob[]> {\n const providerEndpoints = await this.getEndpoints(providerUri)\n const serviceEndpoints = await this.getServiceEndpoints(\n providerUri,\n providerEndpoints\n )\n const computeDeleteUrl = this.getEndpointURL(serviceEndpoints, 'computeDelete')\n ? this.getEndpointURL(serviceEndpoints, 'computeDelete').urlPath\n : null\n\n const consumerAddress = await this.getConsumerAddress(signerOrAuthToken)\n const nonce = (\n (await this.getNonce(\n providerUri,\n consumerAddress,\n signal,\n providerEndpoints,\n serviceEndpoints\n )) + 1\n ).toString()\n\n let signatureMessage = consumerAddress\n signatureMessage += jobId || ''\n signatureMessage += (did && `${this.noZeroX(did)}`) || ''\n signatureMessage += nonce\n const signature = await this.getSignature(signerOrAuthToken, signatureMessage)\n const payload = Object()\n payload.documentId = did // this.noZeroX(did) #https://github.com/oceanprotocol/ocean.js/issues/1892\n payload.consumerAddress = consumerAddress\n payload.jobId = jobId\n if (signature) payload.signature = signature\n\n if (!computeDeleteUrl) return null\n let response\n try {\n response = await fetch(computeDeleteUrl, {\n method: 'DELETE',\n body: JSON.stringify(payload),\n headers: {\n 'Content-Type': 'application/json',\n Authorization: this.getAuthorization(signerOrAuthToken)\n },\n signal\n })\n } catch (e) {\n LoggerInstance.error('Delete compute job failed:')\n LoggerInstance.error(e)\n LoggerInstance.error('Payload was:', payload)\n throw new Error('HTTP request failed calling Provider')\n }\n if (response?.ok) {\n const params = await response.json()\n return params\n }\n const resolvedResponse = await response.json()\n LoggerInstance.error(\n 'Delete compute job failed:',\n response.status,\n response.statusText,\n resolvedResponse\n )\n LoggerInstance.error('Payload was:', payload)\n throw new Error(JSON.stringify(resolvedResponse))\n }\n\n /** Generates an auth token\n * @param {Signer} consumer consumer Signer wallet object\n * @param {string} providerUri The URI of the provider we want to query\n * @param {AbortSignal} signal abort signal\n * @return {Promise<ComputeJob | ComputeJob[]>}\n */\n public async generateAuthToken(\n consumer: Signer,\n providerUri: string,\n signal?: AbortSignal\n ): Promise<string> {\n const consumerAddress = await consumer.getAddress()\n const providerEndpoints = await this.getEndpoints(providerUri)\n const serviceEndpoints = await this.getServiceEndpoints(\n providerUri,\n providerEndpoints\n )\n const url = this.getEndpointURL(serviceEndpoints, 'generateAuthToken').urlPath || null\n const nonce = (\n (await this.getNonce(\n providerUri,\n consumerAddress,\n signal,\n providerEndpoints,\n serviceEndpoints\n )) + 1\n ).toString()\n\n const signatureMessage = consumerAddress + nonce\n const signature = await this.signProviderRequest(consumer, signatureMessage)\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n body: JSON.stringify({\n address: consumerAddress,\n signature,\n nonce\n }),\n headers: { 'Content-Type': 'application/json' },\n signal\n })\n\n if (!response?.ok) {\n throw new Error(\n `Failed to generate auth token: ${response.status} ${response.statusText}`\n )\n }\n const params = await response.json()\n return params?.token\n } catch (e) {\n LoggerInstance.error('Generate auth token failed:')\n LoggerInstance.error(e)\n throw new Error('HTTP request failed calling Provider')\n }\n }\n\n /** Generates an auth token\n * @param {Signer} consumer consumer Signer wallet object\n * @param {string} token The auth token to invalidate\n * @param {string} providerUri The URI of the provider we want to query\n * @param {AbortSignal} signal abort signal\n * @return {Promise<ComputeJob | ComputeJob[]>}\n */\n public async invalidateAuthToken(\n consumer: Signer,\n token: string,\n providerUri: string,\n signal?: AbortSignal\n ): Promise<{ success: boolean }> {\n const consumerAddress = await consumer.getAddress()\n const providerEndpoints = await this.getEndpoints(providerUri)\n const serviceEndpoints = await this.getServiceEndpoints(\n providerUri,\n providerEndpoints\n )\n const url =\n this.getEndpointURL(serviceEndpoints, 'invalidateAuthToken').urlPath || null\n const nonce = (\n (await this.getNonce(\n providerUri,\n consumerAddress,\n signal,\n providerEndpoints,\n serviceEndpoints\n )) + 1\n ).toString()\n\n const signatureMessage = consumerAddress + nonce\n const signature = await this.signProviderRequest(consumer, signatureMessage)\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n body: JSON.stringify({\n address: consumerAddress,\n signature,\n token,\n nonce\n }),\n headers: { 'Content-Type': 'application/json' },\n signal\n })\n\n if (!response?.ok) {\n throw new Error(\n `Failed to invalidate auth token: ${response.status} ${response.statusText}`\n )\n }\n const params = await response.json()\n return params\n } catch (e) {\n LoggerInstance.error('Generate auth token failed:')\n LoggerInstance.error(e)\n throw new Error('HTTP request failed calling Provider')\n }\n }\n\n /** Check for a valid provider at URL\n * @param {String} url provider uri address\n * @param {AbortSignal} signal abort signal\n * @return {Promise<boolean>} valid or not\n */\n public async isValidProvider(url: string, signal?: AbortSignal): Promise<boolean> {\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers: { 'Content-Type': 'application/json' },\n signal\n })\n if (response?.ok) {\n const params = await response.json()\n if (params && (params.providerAddress || params.providerAddresses)) return true\n }\n return false\n } catch (error) {\n LoggerInstance.error(`Error validating provider: ${error.message}`)\n return false\n }\n }\n\n /** Sends a PolicyServer request to node to be passthrough to PS\n * @param {string} providerUri The provider URI.\n * @param {PolicyServerPassthroughCommand} request The request to be passed through to the Policy Server.\n * @param {AbortSignal} signal abort signal\n */\n public async PolicyServerPassthrough(\n providerUri: string,\n request: PolicyServerPassthroughCommand,\n signal?: AbortSignal\n ): Promise<any> {\n const providerEndpoints = await this.getEndpoints(providerUri)\n const serviceEndpoints = await this.getServiceEndpoints(\n providerUri,\n providerEndpoints\n )\n const initializeUrl = this.getEndpointURL(serviceEndpoints, 'PolicyServerPassthrough')\n ? this.getEndpointURL(serviceEndpoints, 'PolicyServerPassthrough').urlPath\n : null\n if (!initializeUrl) return null\n\n let response\n try {\n response = await fetch(initializeUrl, {\n method: 'POST',\n body: JSON.stringify(request),\n headers: {\n 'Content-Type': 'application/json'\n },\n signal\n })\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`${errorText}`)\n }\n } catch (e) {\n LoggerInstance.error('PolicyServerPassthrough failed: ')\n LoggerInstance.error(e)\n throw new Error(`PolicyServerPassthrough failed: ${e.message}.`)\n }\n if (response?.ok) {\n const params = await response.json()\n return params\n }\n const resolvedResponse = await response.json()\n LoggerInstance.error(\n 'PolicyServerPassthrough failed: ',\n response.status,\n response.statusText,\n resolvedResponse\n )\n LoggerInstance.error('Payload was:', JSON.stringify(request))\n throw new Error(JSON.stringify(resolvedResponse))\n }\n\n /** Initialize Policy Server verification\n * @param {string} providerUri The provider URI.\n * @param {PolicyServerInitializeCommand} request The request to be sent to the Policy Server.\n * @param {AbortSignal} signal abort signal\n */\n public async initializePSVerification(\n providerUri: string,\n request: PolicyServerInitializeCommand,\n signal?: AbortSignal\n ): Promise<any> {\n const providerEndpoints = await this.getEndpoints(providerUri)\n const serviceEndpoints = await this.getServiceEndpoints(\n providerUri,\n providerEndpoints\n )\n const initializeUrl = this.getEndpointURL(\n serviceEndpoints,\n 'initializePSVerification'\n )\n ? this.getEndpointURL(serviceEndpoints, 'initializePSVerification').urlPath\n : null\n if (!initializeUrl) return null\n\n let response\n try {\n response = await fetch(initializeUrl, {\n method: 'POST',\n body: JSON.stringify(request),\n headers: {\n 'Content-Type': 'application/json'\n },\n signal\n })\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`${errorText}`)\n }\n } catch (e) {\n LoggerInstance.error('initializePSVerification failed: ')\n LoggerInstance.error(e)\n throw new Error(`initializePSVerification failed: ${e.message}.`)\n }\n if (response?.ok) {\n const params = await response.json()\n return params\n }\n const resolvedResponse = await response.json()\n LoggerInstance.error(\n 'initializePSVerification failed: ',\n response.status,\n response.statusText,\n resolvedResponse\n )\n LoggerInstance.error('Payload was:', JSON.stringify(request))\n throw new Error(JSON.stringify(resolvedResponse))\n }\n\n /**\n * Private method that removes the leading 0x from a string.\n * @param {string} input - The input string.\n * @returns The transformed string.\n */\n private noZeroX(input: string): string {\n return this.zeroXTransformer(input, false)\n }\n\n /**\n * Private method that removes the leading 0x from a string.\n * @param {string} input - The input string.\n * @param {boolean} zeroOutput - Whether to include 0x in the output if the input is valid and zeroOutput is true.\n * @returns The transformed string.\n */\n private zeroXTransformer(input = '', zeroOutput: boolean): string {\n const { valid, output } = this.inputMatch(\n input,\n /^(?:0x)*([a-f0-9]+)$/i,\n 'zeroXTransformer'\n )\n return (zeroOutput && valid ? '0x' : '') + output\n }\n\n /**\n * Private method that matches an input string against a regular expression and returns the first capture group.\n * @param {string} input - The input string to match.\n * @param {RegExp} regexp - The regular expression to match against.\n * @param {string} conversorName - The name of the method calling this function.\n * @returns An object with two properties: `valid` (a boolean indicating whether the input matched the regular expression) and `output` (the first capture group of the match, or the original input if there was no match).\n */\n private inputMatch(\n input: string,\n regexp: RegExp,\n conversorName: string\n ): { valid: boolean; output: string } {\n if (typeof input !== 'string') {\n LoggerInstance.debug('Not input string:')\n LoggerInstance.debug(input)\n throw new Error(`[${conversorName}] Expected string, input type: ${typeof input}`)\n }\n const match = input.match(regexp)\n if (!match) {\n LoggerInstance.warn(`[${conversorName}] Input transformation failed.`)\n return { valid: false, output: input }\n }\n return { valid: true, output: match[1] }\n }\n\n /**\n * Private method that fetches data from a URL using the GET method.\n * @param {string} url - The URL to fetch data from.\n * @returns A Promise that resolves to a Response object.\n */\n private async getData(url: string, authorization?: string): Promise<Response> {\n return fetch(url, {\n method: 'GET',\n headers: {\n 'Content-type': 'application/json',\n Authorization: authorization\n }\n })\n }\n}\n\nexport const ProviderInstance = new Provider()\n","import jwt from 'jsonwebtoken'\nimport { JwtPayload } from '../@types/Jwt'\n\nexport function decodeJwt(token: string): JwtPayload {\n try {\n const decoded = jwt.decode(token, { json: true })\n return decoded as JwtPayload\n } catch (error) {\n throw new Error('Error decoding JWT')\n }\n}\n","import Decimal from 'decimal.js'\nimport { ethers, Signer } from 'ethers'\nimport { Config } from '../config/index.js'\nimport { ReceiptOrEstimate, ReceiptOrDecimal } from '../@types/index.js'\nimport { minAbi } from './minAbi.js'\nimport { amountToUnits, sendTx, unitsToAmount } from './ContractUtils.js'\nimport { LoggerInstance } from './Logger.js'\nimport BigNumber from 'bignumber.js'\n\n/**\n * Approve spender to spent amount tokens\n * @param {Signer} signer - The signer object\n * @param {Config} config - The config object\n * @param {string} account - The address of the caller\n * @param {string} tokenAddress - The address of the token\n * @param {string} spender - The address of the spender\n * @param {String} amount amount of ERC20 Datatokens (always expressed as wei)\n * @param {boolean} force if true, will overwrite any previous allowence. Else, will check if allowence is enough and will not send a transaction if it's not needed\n * @param {number} [tokenDecimals] optional number of decimals of the token\n * @param {boolean} [estimateGas] if true, returns the estimate gas cost for calling the method\n */\nexport async function approve<G extends boolean = false>(\n signer: Signer,\n config: Config,\n account: string,\n tokenAddress: string,\n spender: string,\n amount: string,\n force = false,\n tokenDecimals?: number,\n estimateGas?: G\n): Promise<ReceiptOrDecimal<G> | number> {\n const tokenContract = new ethers.Contract(tokenAddress, minAbi, signer)\n if (!force) {\n const currentAllowence = await allowance(signer, tokenAddress, account, spender)\n if (new Decimal(currentAllowence).greaterThanOrEqualTo(new Decimal(amount))) {\n return <ReceiptOrDecimal<G>>new Decimal(currentAllowence).toNumber()\n }\n }\n const amountFormatted = await amountToUnits(signer, tokenAddress, amount, tokenDecimals)\n const estGas = await tokenContract.approve.estimateGas(spender, amountFormatted)\n if (estimateGas) return <ReceiptOrDecimal<G>>(<unknown>new Decimal(estGas.toString()))\n\n const trxReceipt = await sendTx(\n estGas,\n signer,\n config?.gasFeeMultiplier,\n tokenContract.approve,\n spender,\n amountFormatted\n )\n return <ReceiptOrDecimal<G>>trxReceipt\n}\n\n/**\n * Approve spender to spent amount tokens\n * @param {Signer} signer - The signer object\n * @param {Config} config - The config object\n * @param {string} account - The address of the caller\n * @param {string} tokenAddress - The address of the token\n * @param {string} spender - The address of the spender\n * @param {string} amount amount of ERC20 tokens (always expressed as wei)\n * @param {boolean} force if true, will overwrite any previous allowence. Else, will check if allowence is enough and will not send a transaction if it's not needed\n * @param {boolean} [estimateGas] if true, returns the estimate gas cost for calling the method\n */\nexport async function approveWei<G extends boolean = false>(\n signer: Signer,\n config: Config,\n account: string,\n tokenAddress: string,\n spender: string,\n amount: string,\n force = false,\n estimateGas?: G\n): Promise<ReceiptOrEstimate<G>> {\n const tokenContract = new ethers.Contract(tokenAddress, minAbi, signer)\n if (!force) {\n const currentAllowence = await allowanceWei(signer, tokenAddress, account, spender)\n if (new BigNumber(currentAllowence).isGreaterThan(new BigNumber(amount))) {\n return <ReceiptOrEstimate<G>>BigInt(currentAllowence)\n }\n }\n let result = null\n\n const estGas = await tokenContract.approve.estimateGas(spender, amount)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n try {\n result = await sendTx(\n estGas,\n signer,\n config?.gasFeeMultiplier,\n tokenContract.approve,\n spender,\n amount\n )\n } catch (e) {\n LoggerInstance.error(\n `ERROR: Failed to approve spender to spend tokens : ${e.message}`\n )\n }\n return result as ReceiptOrEstimate<G>\n}\n\n/**\n * Moves amount tokens from the caller’s account to recipient.\n * @param {Signer} signer - The signer object\n * @param {Config} config - The config object\n * @param {string} tokenAddress - The address of the token\n * @param {string} recipient - The address of the tokens receiver\n * @param {String} amount amount of ERC20 Datatokens (not as wei)\n * @param {String} estimateGas if true returns the gas estimate\n */\nexport async function transfer<G extends boolean = false>(\n signer: Signer,\n config: Config,\n tokenAddress: string,\n recipient: string,\n amount: string,\n estimateGas?: G\n): Promise<ReceiptOrEstimate<G>> {\n const tokenContract = new ethers.Contract(tokenAddress, minAbi, signer)\n const amountFormatted = await amountToUnits(signer, tokenAddress, amount)\n const estGas = await tokenContract.transfer.estimateGas(recipient, amountFormatted)\n if (estimateGas) return <ReceiptOrEstimate<G>>estGas\n\n const trxReceipt = await sendTx(\n estGas,\n signer,\n config?.gasFeeMultiplier,\n tokenContract.transfer,\n recipient,\n amountFormatted\n )\n return <ReceiptOrEstimate<G>>trxReceipt\n}\n\n/**\n * Get Allowance for any Datatoken\n * @param {Signer} signer - The signer object\n * @param {string} tokenAddress - The address of the token\n * @param {string} account - The address of the caller\n * @param {string} spender - The address of the spender\n * @param {number} tokenDecimals optional number of decimals of the token\n */\nexport async function allowance(\n signer: Signer,\n tokenAddress: string,\n account: string,\n spender: string,\n tokenDecimals?: number\n): Promise<string> {\n const tokenContract = new ethers.Contract(tokenAddress, minAbi, signer)\n const trxReceipt = await tokenContract.allowance(account, spender)\n\n return await unitsToAmount(signer, tokenAddress, trxReceipt, tokenDecimals)\n}\n\n/**\n * Get balance for any Datatoken\n * @param {Signer} signer - The signer object\n * @param {string} tokenAddress - The address of the token\n * @param {string} account - The address of the caller\n * @param {number} [tokenDecimals] optional number of decimals of the token\n */\nexport async function balance(\n signer: Signer,\n tokenAddress: string,\n account: string,\n tokenDecimals?: number\n): Promise<string> {\n const tokenContract = new ethers.Contract(tokenAddress, minAbi, signer)\n const trxReceipt = await tokenContract.balanceOf(account)\n\n return await unitsToAmount(signer, tokenAddress, trxReceipt, tokenDecimals)\n}\n\n/**\n * Get Allowance in wei for any erc20\n * @param {Signer} signer - The signer object\n * @param {string} tokenAddress - The address of the token\n * @param {string} account - The address of the caller\n * @param {string} spender - The address of the spneder\n */\nexport async function allowanceWei(\n signer: Signer,\n tokenAddress: string,\n account: string,\n spender: string\n): Promise<string> {\n const tokenContract = new ethers.Contract(tokenAddress, minAbi, signer)\n return await tokenContract.allowance(account, spender)\n}\n\n/**\n * Get decimals for any Datatoken\n * @param {Signer} signer - The signer object\n * @param {String} tokenAddress - The address of the token\n * @return {Promise<number>} Number of decimals of the token\n */\nexport async function decimals(signer: Signer, tokenAddress: string): Promise<number> {\n const tokenContract = new ethers.Contract(tokenAddress, minAbi, signer)\n const decimals = await tokenContract.decimals()\n return Number(decimals)\n}\n","import { LoggerInstance } from './Logger.js'\n\nconst PREDEFINED_ERRORS = {\n datasets: {\n invalid: 'Datasets is not a list, as expected'\n },\n algorithm: {\n serviceId: {\n missing: 'The serviceId key is missing from the algorithm s DDO.',\n not_found: 'The provided serviceId does not exist.',\n service_not_access_compute: 'Service type is neither access, nor compute.',\n main_service_compute:\n 'If the main service is not compute for this asset when calling initialize endpoint.',\n compute_services_not_in_same_provider:\n 'Files attached to the compute service are not decrypted by the correct provider. This occurs when both asset and algorithm are requested by their compute service which cannot be decrypted by a single provider as how it is supposed to be.'\n },\n container: {\n checksum_prefix: 'Container checksum does not start with the prefix sha256:.',\n mising_entrypoint_image_checksum:\n 'Either entrypoint, either image, or either checksum are missing from the container dictionary from the algorithm s DDO.'\n },\n documentId: {\n did_not_found:\n 'The algorithm s DID could not be retrieved from the metadata store, because the algorithm asset does not exist.',\n missing: 'The documentId key is missing from the algorithm s DDO.'\n },\n transferTxId: {\n missing: 'The transferTxId key is missing from the algorithm s DDO.'\n },\n missing_meta_documentId: 'Either algorithm metadata, or algorithm DID are missing.',\n did_not_found: 'Either algorithm metadata, or algorithm DID are missing.',\n not_algo: 'Either algorithm metadata, or algorithm DID are missing.',\n in_use_or_not_on_chain: 'Either algorithm metadata, or algorithm DID are missing.',\n meta_oneof_url_rawcode_remote:\n 'Either algorithm metadata, or algorithm DID are missing.',\n file_unavailable:\n 'One possibility is that the asset could not be retrieved from Aquariuss database. Otherwise, there are issues related to services'\n },\n error: {\n not_trusted_algo_publisher:\n \"The owner of the algorithm's DDO is not a trusted algorithms publishers list.\",\n not_trusted_algo:\n \"The algorithm's DID is not in the asset's trusted algorithms dictionary. \",\n no_publisherTrustedAlgorithms:\n \"The algorithm's key publisherTrustedAlgorithms does not exist in the algorithm's DDO.\",\n algorithm_file_checksum_mismatch:\n \"filesChecksum from the algorithm's DDO is invalid.\",\n algorithm_container_checksum_mismatch:\n \"The containerChecksum from the algorithm's DDO is invalid.\",\n no_raw_algo_allowed: 'The asset does not allow raw algorithms to be run on it.',\n 'Asset malformed':\n 'The asset published on chain is malformed, missing some required keys or not compliant with our schemas.',\n 'Asset is not consumable.':\n 'Assets metadata status is not in the range of valid status codes for assets. The recognized states for the metadata are defined on our docs.',\n 'DID is not a valid algorithm.':\n 'Either the algorithm assets DID is incorrectly typed, either the algorithm timeout expired.',\n 'Compute environment does not exist.':\n 'The compute environment provided by the user does not exist, it is not served by our compute-to-data feature. The user can use get_c2d_environments to check the list of available compute environments.',\n 'The validUntil value is not correct.': 'validUntil value is most probably expired.',\n 'Cannot resolve DID': 'The dataset DID does not exist in the Metadata store.',\n 'Invalid serviceId': 'The serviceId of that dataset is not correct.',\n 'Unable to get dataset files':\n 'The files of that dataset could not be decrypted or retrieved',\n 'cannot decrypt files for this service.':\n 'The files of that dataset could not be decrypted due to the fact that file object, which contains the structure and the type of specific file, is missing from the validation part.',\n 'Unsupported type ': 'The file object type is not supported by Provider.',\n 'malformed file object':\n 'The file object structure is invalid and does not contain the wanted information for the specific file.'\n },\n order: {\n fees_not_paid: ' Provider fees are not paid.'\n },\n output: {\n invalid:\n 'The algorithms validation after the build stage has not been decoded properly as a dictionary.'\n }\n}\n\nexport function getErrorMessage(err: string): string {\n try {\n const error = JSON.parse(err)\n const key = Object.keys(error)[0]\n if (key === 'error') {\n const message = error[key]\n const errorMessage =\n (PREDEFINED_ERRORS as Record<string, any>)[key]?.[message] ||\n `Provider request failed: ${message}`\n return errorMessage\n } else {\n const errorObject = error[key]\n const messagekey = Object.keys(error)[1]\n const errorMessage = error[messagekey]\n return `${errorMessage} : ${errorObject}`\n }\n } catch (e) {\n LoggerInstance.error('[getErrorMessage] error: ', e)\n return err\n }\n}\n","import { Signer } from 'ethers'\nimport Decimal from 'decimal.js'\nimport { Config } from '../config/Config.js'\nimport { Datatoken } from '../contracts/Datatoken.js'\nimport { ConsumeMarketFee, OrderParams } from '../@types/Datatoken.js'\nimport { ProviderFees } from '../@types/Provider.js'\nimport { ProviderInstance } from '../services/Provider.js'\nimport { ZERO_ADDRESS } from './Constants.js'\nimport { approve, approveWei } from './TokenUtils.js'\nimport { Dispenser } from '../contracts/Dispenser.js'\nimport { FixedRateExchange } from '../contracts/FixedRateExchange.js'\nimport { FreOrderParams } from '../@types/FixedPrice.js'\nimport { Asset, DDOManager } from '@oceanprotocol/ddo-js'\n\n/**\n * Orders an asset based on the specified pricing schema and configuration.\n * @param {Asset} asset - The asset to be ordered.\n * @param {Signer} consumerAccount - The signer account of the consumer.\n * @param {Config} config - The configuration settings.\n * @param {Datatoken} datatoken - The Datatoken instance.\n * @param {string} [providerUrl] - Optional the consumer address\n * @param {string} [consumerAccount] - Optional the consumer address\n * @param {ConsumeMarketFee} [consumeMarketOrderFee] - Optional consume market fee.\n * @param {ProviderFees} [providerFees] - Optional provider fees\n * @param {string} [consumeMarketFixedSwapFee='0'] - Fixed swap fee for consuming the market.\n * @param {number} [datatokenIndex=0] - Index of the datatoken within the asset.\n * @param {number} [serviceIndex=0] - Index of the service within the asset.\n * @param {number} [fixedRateIndex=0] - Index of the fixed rate within the pricing schema.\n * @returns {Promise<void>} - A promise that resolves when the asset order process is completed.\n * @throws {Error} If the pricing schema is not supported or if required indexes are invalid.\n */\nexport async function orderAsset(\n asset: Asset,\n consumerAccount: Signer,\n config: Config,\n datatoken: Datatoken,\n providerUrl?: string,\n consumerAddress?: string,\n consumeMarketOrderFee?: ConsumeMarketFee,\n providerFees?: ProviderFees,\n consumeMarketFixedSwapFee: string = '0',\n datatokenIndex: number = 0,\n serviceIndex: number = 0,\n fixedRateIndex: number = 0\n) {\n const ddoInstance = DDOManager.getDDOClass(asset)\n const { datatokens } = ddoInstance.getAssetFields()\n const { chainId: assetChainId, services } = ddoInstance.getDDOFields()\n if (!consumeMarketOrderFee)\n consumeMarketOrderFee = {\n consumeMarketFeeAddress: '0x0000000000000000000000000000000000000000',\n consumeMarketFeeAmount: '0',\n consumeMarketFeeToken: '0x0000000000000000000000000000000000000000'\n }\n const chainID = (await consumerAccount.provider.getNetwork()).chainId\n if (assetChainId !== Number(chainID)) {\n throw new Error('Chain ID from DDO is different than the configured network.')\n }\n\n if (!datatokens[datatokenIndex].address)\n throw new Error(\n `The datatoken with index: ${datatokenIndex} does not exist for the asset with did: ${asset.id}`\n )\n\n if (!services[serviceIndex].id)\n throw new Error(\n `There is no service with index: ${serviceIndex} defined for the asset with did: ${asset.id}`\n )\n\n const templateIndex = await datatoken.getId(datatokens[datatokenIndex].address)\n\n const fixedRates = await datatoken.getFixedRates(datatokens[datatokenIndex].address)\n const dispensers = await datatoken.getDispensers(datatokens[datatokenIndex].address)\n const publishMarketFees = await datatoken.getPublishingMarketFee(\n datatokens[datatokenIndex].address\n )\n const pricingType =\n fixedRates.length > 0 ? 'fixed' : dispensers.length > 0 ? 'free' : 'NOT_ALLOWED'\n\n const fees =\n providerFees ||\n (\n await ProviderInstance.initialize(\n asset.id,\n services[serviceIndex].id,\n 0,\n await consumerAccount.getAddress(),\n providerUrl || config.oceanNodeUri\n )\n ).providerFee\n\n if (\n fees &&\n fees.providerFeeAddress !== ZERO_ADDRESS &&\n fees.providerFeeAmount &&\n parseInt(fees.providerFeeAmount) > 0\n ) {\n try {\n await approveWei(\n consumerAccount,\n config,\n await consumerAccount.getAddress(),\n fees.providerFeeToken,\n services[0].datatokenAddress,\n fees.providerFeeAmount\n )\n } catch (error) {\n throw new Error(`Failed to approve provider fee token ${fees.providerFeeToken}`)\n }\n }\n\n const orderParams = {\n consumer: consumerAddress || (await consumerAccount.getAddress()),\n serviceIndex,\n _providerFee: fees,\n _consumeMarketFee: consumeMarketOrderFee\n } as OrderParams\n switch (pricingType) {\n case 'free': {\n if (templateIndex === 1) {\n const dispenser = new Dispenser(config.dispenserAddress, consumerAccount)\n const dispenserTx = await dispenser.dispense(\n datatokens[datatokenIndex].address,\n '1',\n await consumerAccount.getAddress()\n )\n if (!dispenserTx) {\n throw new Error(`Failed to dispense !`)\n }\n await dispenserTx.wait()\n return await datatoken.startOrder(\n datatokens[datatokenIndex].address,\n orderParams.consumer,\n orderParams.serviceIndex,\n orderParams._providerFee,\n orderParams._consumeMarketFee\n )\n }\n if (templateIndex === 2 || templateIndex === 4) {\n return await datatoken.buyFromDispenserAndOrder(\n services[serviceIndex].datatokenAddress,\n orderParams,\n config.dispenserAddress\n )\n }\n break\n }\n case 'fixed': {\n const fre = new FixedRateExchange(config.fixedRateExchangeAddress, consumerAccount)\n\n if (!fixedRates[fixedRateIndex].id)\n throw new Error(\n `There is no fixed rate exchange with index: ${serviceIndex} for the asset with did: ${asset.id}`\n )\n const fees = await fre.getFeesInfo(fixedRates[fixedRateIndex].id)\n const exchange = await fre.getExchange(fixedRates[fixedRateIndex].id)\n\n const { baseTokenAmount } = await fre.calcBaseInGivenDatatokensOut(\n fees.exchangeId,\n '1',\n consumeMarketOrderFee.consumeMarketFeeAmount\n )\n\n const price = new Decimal(+baseTokenAmount || 0)\n .add(new Decimal(consumeMarketOrderFee.consumeMarketFeeAmount || 0))\n .add(new Decimal(+publishMarketFees.publishMarketFeeAmount || 0))\n .toString()\n\n const freParams = {\n exchangeContract: config.fixedRateExchangeAddress,\n exchangeId: fees.exchangeId,\n maxBaseTokenAmount: price,\n baseTokenAddress: exchange.baseToken,\n baseTokenDecimals: parseInt(exchange.btDecimals) || 18,\n swapMarketFee: consumeMarketFixedSwapFee,\n marketFeeAddress: publishMarketFees.publishMarketFeeAddress\n } as FreOrderParams\n\n if (templateIndex === 1) {\n const tx: any = await approve(\n consumerAccount,\n config,\n await consumerAccount.getAddress(),\n exchange.baseToken,\n config.fixedRateExchangeAddress,\n price,\n false\n )\n const txApprove = typeof tx !== 'number' ? await tx.wait() : tx\n if (!txApprove) {\n throw new Error(`Failed to approve ${exchange.baseToken} !`)\n }\n const freTx = await fre.buyDatatokens(\n exchange.exchangeId,\n '1',\n price,\n publishMarketFees.publishMarketFeeAddress,\n consumeMarketFixedSwapFee\n )\n const buyDtTx = await freTx.wait()\n if (!buyDtTx) {\n throw new Error(`Failed to buy datatoken from fixed rate!`)\n }\n return await datatoken.startOrder(\n datatokens[datatokenIndex].address,\n orderParams.consumer,\n orderParams.serviceIndex,\n orderParams._providerFee,\n orderParams._consumeMarketFee\n )\n }\n if (templateIndex === 2 || templateIndex === 4) {\n const tx: any = await approve(\n consumerAccount,\n config,\n await consumerAccount.getAddress(),\n exchange.baseToken,\n datatokens[datatokenIndex].address,\n price,\n false\n )\n if (!tx) {\n throw new Error(`Failed to approve ${exchange.baseToken} !`)\n }\n const txApprove = typeof tx !== 'number' ? await tx.wait() : tx\n if (!txApprove) {\n throw new Error(`Failed to confirm/mine approval transaction!`)\n }\n const txBuy = await datatoken.buyFromFreAndOrder(\n datatokens[datatokenIndex].address,\n orderParams,\n freParams\n )\n return txBuy\n }\n break\n }\n default:\n throw new Error('Pricing schema not supported !')\n }\n}\n","import { AbiItem } from '../@types'\nimport { LogLevel } from '../utils'\n\ntype SDK = 'evm' | 'oasis'\n\nexport class Config {\n /**\n * Ethereum node URL.\n * @type {string}\n */\n public nodeUri?: string\n\n /**\n * Address of Provider.\n * @type {string}\n */\n public providerAddress?: string\n\n /**\n * Ocean Node URL.\n * @type {string}\n */\n public oceanNodeUri?: string\n\n /**\n * Web3 Provider.\n * @type {any}\n */\n public web3Provider?: any\n\n /**\n * Ocean Token address\n * @type {string}\n */\n public oceanTokenAddress?: string\n\n /**\n * Factory address\n * @type {string}\n */\n public nftFactoryAddress?: string\n\n /**\n * Router Factory address\n * @type {string}\n */\n public routerFactoryAddress?: string\n\n /**\n * datatokens ABI\n * @type {string}\n */\n public datatokensABI?: AbiItem | AbiItem[]\n\n /**\n * FixedRateExchangeAddress\n * @type {string}\n */\n public fixedRateExchangeAddress?: string\n\n /**\n * FixedRateExchangeAddressABI\n * @type {any}\n */\n public fixedRateExchangeAddressABI?: AbiItem | AbiItem[]\n\n /**\n * DispenserAddress\n * @type {string}\n */\n public dispenserAddress?: string\n\n /**\n * DispenserABI\n * @type {any}\n */\n public dispenserABI?: AbiItem | AbiItem[]\n\n /**\n * OPFCommunityFeeCollector\n * @type {string}\n */\n public opfCommunityFeeCollector?: string\n\n /**\n * SideStaking address\n * @type {string}\n */\n public sideStakingAddress?: string\n\n /**\n * block number of the deployment\n * @type {number}\n */\n public startBlock?: number\n /**\n * Log level.\n * @type {boolean | LogLevel}\n */\n public verbose?: boolean | LogLevel\n\n /**\n * Message shown when the user creates its own token.\n * @type {string}\n */\n public authMessage?: string\n\n /**\n * Token expiration time in ms.\n * @type {number}\n */\n public authTokenExpiration?: number\n\n /**\n * Parity config\n * @type {string}\n */\n public parityUri?: string\n\n public threshold?: number\n\n /**\n * Chain ID\n * @type {number}\n */\n chainId: number\n\n /**\n * Network name ex: mainnet, goerli, polygon\n * @type {string}\n */\n network: string\n\n /**\n * Url of the blockchain exporer ex: https://etherscan.io\n * @type {string}\n */\n explorerUri: string\n\n /**\n * Ocean toke symbol on the chain, it's used just for convenience to reduce number of calls\n * @type {string}\n */\n oceanTokenSymbol: string\n\n /**\n * Specify the transaction Block Timeout\n * @type {number}\n */\n transactionBlockTimeout: number\n\n /**\n * Specify the transaction Confirmation Blocks\n * @type {number}\n */\n transactionConfirmationBlocks: number\n\n /**\n * Specify the transaction Polling Blocks Timeout\n * @type {number}\n */\n transactionPollingTimeout: number\n\n /**\n * Specify the multiplier for the gas fee\n * @type {number}\n */\n gasFeeMultiplier: number\n\n veAllocate?: string\n veOCEAN?: string\n veDelegation?: string\n veFeeDistributor?: string\n veDelegationProxy?: string\n DFRewards?: string\n DFStrategyV1?: string\n veFeeEstimate?: string\n\n // is confidential evm\n sdk?: SDK\n accessListFactory?: string\n}\n","import { ethers, hexlify, Signer, toBeHex, toUtf8Bytes } from 'ethers'\nimport { ConfigHelper } from '../../src/config/index.js'\nimport { createHash } from 'crypto'\nimport { Aquarius } from '../services/Aquarius.js'\nimport { NftFactory } from '../contracts/NFTFactory.js'\nimport { Nft } from '../contracts/NFT.js'\nimport { DatatokenCreateParams } from '../@types/Datatoken.js'\nimport { NftCreateData } from '../@types/NFTFactory.js'\nimport { ZERO_ADDRESS } from './Constants.js'\nimport { DispenserCreationParams } from '../@types/Dispenser.js'\nimport { FreCreationParams } from '../@types/FixedPrice.js'\nimport { getEventFromTx } from './ContractUtils.js'\nimport { ProviderInstance } from '../services/Provider.js'\n\nimport AccessListFactory from '@oceanprotocol/contracts/artifacts/contracts/accesslists/AccessListFactory.sol/AccessListFactory.json'\nimport ERC20Template4 from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC20Template4.sol/ERC20Template4.json'\nimport { calculateActiveTemplateIndex } from './Addresses.js'\nimport { DDO, DDOManager } from '@oceanprotocol/ddo-js'\nimport { FileObjectType } from '../@types'\n\nexport const DEVELOPMENT_CHAIN_ID = 8996\n// template address OR templateId\nexport function useOasisSDK(network: string | number): boolean {\n const config = new ConfigHelper().getConfig(network)\n return config && config.sdk === 'oasis'\n}\n\n/**\n *\n * @param name asset name\n * @param symbol asse symbol\n * @param owner owner address\n * @param assetUrl asset url, if present and confidential evm, add it to token create params\n * @param templateIDorAddress either template address or id\n * @param ddo ddo\n * @param encryptDDO encrypt or not?\n * @param providerUrl the provider URL\n * @param providerFeeToken the provider fee token\n * @param aquariusInstance aquarius, could be node instance url\n * @param allowAccessList?: string,\n * @param denyAccessList?: string\n * @returns ddo id as string\n */\nexport async function createAsset(\n name: string,\n symbol: string,\n owner: Signer,\n assetUrl: any, // files object\n templateIDorAddress: string | number, // If string, it's template address , otherwise, it's templateId\n ddo: DDO,\n encryptDDO: boolean = true, // default is true\n providerUrl: string,\n providerFeeToken: string,\n aquariusInstance: Aquarius,\n accessListFactory?: string, // access list factory address\n allowAccessList?: string, // allow list address\n denyAccessList?: string // deny list address\n): Promise<string> {\n const ddoInstance = DDOManager.getDDOClass(ddo)\n const { indexedMetadata } = ddoInstance.getAssetFields()\n const value =\n ddoInstance.getDDOData()?.stats?.price?.value ||\n indexedMetadata?.stats[0]?.prices[0]?.price\n let { chainId: ddoChainId, nftAddress } = ddoInstance.getDDOFields()\n const { services } = ddoInstance.getDDOFields()\n\n const isAddress = typeof templateIDorAddress === 'string'\n const isTemplateIndex = typeof templateIDorAddress === 'number'\n if (!isAddress && !isTemplateIndex) {\n throw new Error('Invalid template! Must be a \"number\" or a \"string\"')\n }\n const chainID = (await owner.provider.getNetwork()).chainId\n\n if (ddoChainId && ddoChainId !== Number(chainID)) {\n throw new Error('Chain ID from DDO is different than the configured network.')\n }\n\n const config = new ConfigHelper().getConfig(parseInt(String(chainID)))\n\n let templateIndex = await calculateActiveTemplateIndex(\n owner,\n config.nftFactoryAddress,\n templateIDorAddress,\n Number(chainID)\n )\n\n if (templateIndex < 1) {\n // for testing purposes only\n if (Number(chainID) === DEVELOPMENT_CHAIN_ID) {\n templateIndex = 1\n } else throw new Error(`Invalid template index: ${templateIndex}`)\n }\n\n const nft = new Nft(owner, Number(chainID))\n\n const nftFactory = new NftFactory(config.nftFactoryAddress, owner, Number(chainID))\n\n // get nft owner\n const account = await owner.getAddress()\n\n // from hex to number format\n const nftParamsAsset: NftCreateData = {\n name,\n symbol,\n templateIndex: 1,\n tokenURI: 'aaa',\n transferable: true,\n owner: account\n }\n const datatokenParams: DatatokenCreateParams = {\n templateIndex,\n cap: '100000',\n feeAmount: '0',\n paymentCollector: account,\n feeToken: providerFeeToken || config.oceanTokenAddress,\n minter: account,\n mpFeeAddress: ZERO_ADDRESS\n }\n\n if (\n !assetUrl?.files[0].type ||\n ![FileObjectType.ARWEAVE, FileObjectType.IPFS, FileObjectType.URL].includes(\n assetUrl?.files[0]?.type?.toLowerCase()\n )\n ) {\n console.log('Missing or invalid files object type, defaulting to \"url\"')\n assetUrl.type = FileObjectType.URL\n }\n // include fileObject in the DT constructor\n if (config.sdk === 'oasis') {\n datatokenParams.filesObject = assetUrl\n datatokenParams.accessListFactory = accessListFactory || config.accessListFactory\n datatokenParams.allowAccessList = allowAccessList\n datatokenParams.denyAccessList = denyAccessList\n }\n\n let bundleNFT\n try {\n if (!value) {\n bundleNFT = await nftFactory.createNftWithDatatoken(nftParamsAsset, datatokenParams)\n } else if (value.toString() === '0') {\n const dispenserParams: DispenserCreationParams = {\n dispenserAddress: config.dispenserAddress,\n maxTokens: '1',\n maxBalance: '100000000',\n withMint: true,\n allowedSwapper: ZERO_ADDRESS\n }\n bundleNFT = await nftFactory.createNftWithDatatokenWithDispenser(\n nftParamsAsset,\n datatokenParams,\n dispenserParams\n )\n } else {\n // fixed price\n const fixedPriceParams: FreCreationParams = {\n fixedRateAddress: config.fixedRateExchangeAddress,\n baseTokenAddress: config.oceanTokenAddress,\n owner: account,\n marketFeeCollector: account,\n baseTokenDecimals: 18,\n datatokenDecimals: 18,\n fixedRate: value.toString(),\n marketFee: '0',\n allowedConsumer: account,\n withMint: true\n }\n bundleNFT = await nftFactory.createNftWithDatatokenWithFixedRate(\n nftParamsAsset,\n datatokenParams,\n fixedPriceParams\n )\n }\n } catch (err) {\n console.log('ERROR creating NFT bundle', err)\n return null\n }\n\n const trxReceipt = await bundleNFT.wait()\n // events have been emitted\n const nftCreatedEvent = getEventFromTx(trxReceipt, 'NFTCreated')\n const tokenCreatedEvent = getEventFromTx(trxReceipt, 'TokenCreated')\n\n const nftAddressFromEvent = nftCreatedEvent.args.newTokenAddress\n const datatokenAddressAsset = tokenCreatedEvent.args.newTokenAddress\n // create the files encrypted string\n assetUrl.datatokenAddress = datatokenAddressAsset\n assetUrl.nftAddress = nftAddressFromEvent\n\n if (config.sdk === 'oasis') {\n // we need to update files object on the SC otherwise it will fail validation on provider\n // because DDO datatokenAddress and nftAddress will not match the values on files object\n const contract = new ethers.Contract(datatokenAddressAsset, ERC20Template4.abi, owner)\n try {\n const tx = await contract.setFilesObject(toUtf8Bytes(JSON.stringify(assetUrl)))\n if (tx.wait) {\n await tx.wait()\n }\n } catch (err) {\n console.log('Error updating files object with data token and nft addresses: ', err)\n return null\n }\n }\n\n // if confidential EVM no need to make encrypt call here\n if (config.sdk === 'oasis') {\n services[0].files = '' // on confidental EVM it needs to be empty string not null, for schema validation\n } else {\n services[0].files = await ProviderInstance.encrypt(\n assetUrl,\n Number(chainID),\n providerUrl\n )\n }\n\n services[0].datatokenAddress = datatokenAddressAsset\n services[0].serviceEndpoint = providerUrl\n\n nftAddress = nftAddressFromEvent\n\n const id = ddoInstance.makeDid(nftAddress, ddoChainId.toString())\n ddo = ddoInstance.updateFields({ id, nftAddress }) as DDO\n\n let metadata\n let metadataHash\n let flags\n if (encryptDDO) {\n metadata = await ProviderInstance.encrypt(ddo, Number(chainID), providerUrl)\n const validateResult = await aquariusInstance.validate(ddo, owner, providerUrl)\n metadataHash = validateResult.hash\n flags = 2\n } else {\n const stringDDO = JSON.stringify(ddo)\n const bytes = Buffer.from(stringDDO)\n metadata = hexlify(bytes)\n metadataHash = '0x' + createHash('sha256').update(metadata).digest('hex')\n flags = 0\n }\n\n await nft.setMetadata(\n nftAddress,\n await owner.getAddress(),\n 0,\n providerUrl,\n '',\n toBeHex(flags),\n metadata,\n metadataHash\n )\n return ddo.id\n}\n\n/**\n * deploy new access list factory if needed\n * @param accessListFactory accessListFactory address\n * @param owner owner account\n * @param addressesList list of addresses to deploy\n * @returns accessListFactory address\n */\nexport async function createAccessListFactory(\n accessListFactory: string,\n owner: Signer,\n addressesList?: string[]\n): Promise<any> {\n const factory = new ethers.Contract(accessListFactory, AccessListFactory.abi, owner)\n const ownerAccount = await owner.getAddress()\n try {\n const accessListTx = await factory.deployAccessListContract(\n 'AllowList',\n 'ALLOW',\n true,\n ownerAccount,\n addressesList || [ownerAccount],\n ['https://oceanprotocol.com/nft/']\n )\n if (accessListTx && accessListTx.wait) {\n const trxReceipt = await accessListTx.wait()\n const events = getEventFromTx(trxReceipt, 'NewAccessList')\n return events.args[0]\n }\n } catch (error) {\n console.log('ERROR createAccessListFactory(): ', error)\n }\n return null\n}\n","import { DownloadResponse } from '../@types/index.js'\n\n/**\n * Triggers a file download from the specified URL when called from a browser context.\n * @param {string} url - The URL of the file to download\n * @returns {Promise<void>} - A Promise that resolves when the file has been downloaded\n */\nexport function downloadFileBrowser(url: string): void {\n const xhr = new XMLHttpRequest()\n xhr.responseType = 'blob'\n xhr.open('GET', url)\n xhr.onload = () => {\n const contentDispositionHeader = xhr.getResponseHeader('content-disposition')\n const fileNameMatch = contentDispositionHeader?.match(\n /filename[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/\n )\n const fileName = fileNameMatch && fileNameMatch[1] ? fileNameMatch[1] : 'file'\n\n const blobURL = window.URL.createObjectURL(xhr.response)\n const a = document.createElement('a')\n a.href = blobURL\n a.setAttribute('download', fileName)\n document.body.appendChild(a)\n a.click()\n a.remove()\n window.URL.revokeObjectURL(blobURL)\n }\n xhr.send()\n}\n\n/**\n * Triggers a file download from the specified URL when called from a browser context.\n * @param {string} url - The URL of the file to download\n * @param {number} [index] - The file index\n * @returns {Promise<void>} - A Promise that resolves when the file has been downloaded\n */\nexport async function downloadFile(\n url: string,\n index?: number\n): Promise<DownloadResponse> {\n const response = await fetch(url)\n if (!response.ok) {\n throw new Error('Response error.')\n }\n let filename: string\n try {\n filename = response.headers\n .get('content-disposition')\n .match(/attachment;filename=(.+)/)[1]\n } catch {\n try {\n filename = url.split('/').pop()\n } catch {\n filename = `file${index}`\n }\n }\n\n return { data: await response.arrayBuffer(), filename }\n}\n","import sha256 from 'crypto-js/sha256.js'\nimport { getAddress } from 'ethers'\n\n/**\n * Generates a valid DID\n * @param {string} nftAddress - The NFT address\n * @param {number} chainId - The chain ID\n * @returns {string} - The DID\n */\nexport function generateDid(nftAddress: string, chainId: number): string {\n nftAddress = getAddress(nftAddress)\n const checksum = sha256(nftAddress + chainId.toString(10))\n return `did:op:${checksum.toString()}`\n}\n\n/**\n * Returns the SHA256 hash of the input data\n * @param {any} data - The input data\n * @returns {string} - The SHA256 hash of the input data\n */\nexport function getHash(data: any): string {\n return sha256(data).toString()\n}\n"],"names":["FileObjectType","EncryptMethod","LogLevel","Logger","logLevel","this","Error","_proto","prototype","setLevel","bypass","dispatch","apply","Infinity","concat","slice","call","arguments","debug","Verbose","log","Log","warn","Warn","error","verb","level","_console","console","LoggerInstance","configHelperNetworksBase","chainId","network","nodeUri","oceanNodeUri","explorerUri","oceanTokenAddress","oceanTokenSymbol","fixedRateExchangeAddress","dispenserAddress","startBlock","transactionBlockTimeout","transactionConfirmationBlocks","transactionPollingTimeout","gasFeeMultiplier","configHelperNetworks","_extends","sdk","KNOWN_CONFIDENTIAL_EVMS","ConfigHelper","getAddressesFromEnv","customAddresses","configAddresses","getUris","process","env","NODE_URL","_customAddresses$netw","nftFactoryAddress","ERC721Factory","opfCommunityFeeCollector","OPFCommunityFeeCollector","FixedPrice","Dispenser","Ocean","routerFactoryAddress","Router","veAllocate","veOCEAN","veDelegation","veFeeDistributor","veDelegationProxy","DFRewards","DFStrategyV1","veFeeEstimate","accessListFactory","AccessListFactory","DefaultContractsAddresses","_DefaultContractsAddr","getConfig","infuraProjectId","addresses","filterBy","config","find","c","ADDRESS_FILE","JSON","parse","fs","readFileSync","e","contractAddressesConfig","includes","replace","minAbi","constant","inputs","name","outputs","type","payable","stateMutability","anonymous","indexed","sendTx","estGas","signer","functionToSend","_arguments","Promise","resolve","provider","getNetwork","then","_ref","getFeeData","feeHistory","overrides","maxPriorityFeePerGas","aggressiveFeePriorityFeePerGas","toString","aggressiveFeePerGas","maxFeePerGas","Math","round","Number","MUMBAI_NETWORK_ID","POLYGON_NETWORK_ID","MIN_GAS_FEE_POLYGON","SEPOLIA_NETWORK_ID","MIN_GAS_FEE_SEPOLIA","MIN_GAS_FEE_SAPPHIRE","gasPrice","gasLimit","BigInt","BigNumber","plus","trxReceipt","wait","_catch","reject","amountToUnits","token","amount","tokenDecimals","_temp2","decimals","parseUnits","getTokenDecimals","unitsToAmount","_temp","formatUnits","tokenContract","ethers","Contract","getFairGasPrice","_signer$provider$getF","price","x","setContractDefaults","contract","getEventFromTx","txReceipt","eventName","logs","filter","EventLog","SmartContract","abi","getDefaultAbi","getSignerAccordingSdk","sapphire","wrap","_this3$config","getContract","address","Interface","stringify","SmartContractWithAddress","_SmartContract","_this","_inheritsLoose","_SmartContractWithAdd","DispenserAbi","status","dtAdress","status2","_status2$isMinter","isMinter","_status2$owner","owner","_status2$active","active","maxTokens","_this$unitsToAmount","maxBalance","_this$unitsToAmount2","balance","_this$unitsToAmount3","allowedSwapper","create","dtAddress","estimateGas","_this2","_this2$config","activate","_this3","deactivate","_this4","_this4$config","setAllowedSwapper","newAllowedSwapper","_this5","_this5$config","dispense","destination","_this6","_this6$config","ownerWithdraw","_this7","_this7$config","isDispensable","datatoken","_datatoken$balance","Decimal","greaterThanOrEqualTo","String","greaterThan","ZERO_ADDRESS","FixedRateExchange","FixedRateExchangeAbi","generateExchangeId","baseToken","buyDatatokens","exchangeId","datatokenAmount","maxBaseTokenAmount","consumeMarketAddress","consumeMarketFee","getExchange","exchange","consumeMarketFeeFormatted","dtDecimals","dtAmountFormatted","btDecimals","maxBtFormatted","buyDT","sellDatatokens","minBaseTokenAmount","minBtFormatted","sellDT","getNumberOfExchanges","setRate","newRate","_this5$contract$setRa2","_estimateGas","_this5$amountToUnits2","_this5$contract$setRa","_this5$config$gasFeeM","_this5$getSignerAccor","_this5$amountToUnits","toggleExchangeState","_this8","_this8$config","getRate","_this9","weiRate","getDatatokenSupply","_this10","getDTSupply","dtSupply","getBasetokenSupply","_this11","getBTSupply","btSupply","getAllowedSwapper","calcBaseInGivenDatatokensOut","_this13","fixedRateExchange","_this13$contract","_calcBaseInGivenOutDT","calcBaseInGivenOutDT","_this13$amountToUnits","_this13$amountToUnits2","outDT","baseTokenAmount","_this13$unitsToAmount","publishMarketFeeAmount","_this13$unitsToAmount2","oceanFeeAmount","_this13$unitsToAmount3","consumeMarketFeeAmount","_this13$unitsToAmount4","marketFeeAmount","getAmountBasetokensOut","_this14","_this14$contract","_calcBaseOutGivenInDT","calcBaseOutGivenInDT","_this14$amountToUnits","_this14$amountToUnits2","_this15","result","_result$btDecimals$to","_result$dtDecimals$to","_result$allowedSwappe","_result$exchangeOwner","exchangeOwner","_result$withMint","withMint","_result$baseToken","_result$datatoken","_result$active","dtBalance","_this15$unitsToAmount","btBalance","_this15$unitsToAmount2","_this15$unitsToAmount3","_this15$unitsToAmount4","fixedRate","_this15$unitsToAmount5","getFeesInfo","_this16","opcFee","_this16$unitsToAmount","marketFee","_this16$unitsToAmount2","_result$marketFeeColl","marketFeeCollector","marketFeeAvailable","_this16$unitsToAmount3","oceanFeeAvailable","_this16$unitsToAmount4","getExchanges","isActive","activateMint","_this19","toggleMintState","_this19$config","deactivateMint","_this20","_this20$config","collectBasetokens","_this21","fixedrate","amountWei","collectBT","_this21$config","collectDatatokens","_this22","collectDT","_this22$config","collectMarketFee","_this23","_this23$config","collectOceanFee","_this24","_this24$config","getOPCCollector","opcCollector","getRouter","router","getExchangeOwner","_this27$getExchange","updateMarketFee","newMarketFee","_this28","_this28$contract$upda2","_estimateGas2","_this28$amountToUnits2","_this28$config","_this28$contract$upda","_this28$config$gasFee","_this28$getSignerAcco","_this28$amountToUnits","updateMarketFeeCollector","newMarketFeeCollector","_this29","_this29$config","FactoryRouter","buyDatatokenBatch","operations","buyDTBatch","_this$config","isApprovedToken","isFixedPrice","isFixedRateContract","getOwner","routerOwner","getNFTFactory","factory","addApprovedToken","tokenAddress","_this6$getOwner","removeApprovedToken","_this7$getOwner","addFixedRateContract","_exit3","_this8$getOwner","removeFixedRateContract","_this9$getOwner","_this9$config","addDispenserContract","_this10$getOwner","_this10$config","removeDispenserContract","_this11$getOwner","_this11$config","getOPCFee","getCurrentOPCFee","swapOceanFee","updateOPCFee","newSwapOceanFee","newSwapNonOceanFee","newConsumeFee","newProviderFee","_this14$getOwner","_this14$config","generateDtName","wordList","list","wordListDefault","random1","floor","random","adjectives","length","random2","nouns","indexNumber","adjective","toUpperCase","noun","symbol","substring","NftFactory","createNFT","nftData","_exit","templateIndex","_generateDtName","_nftData$templateInde","getCurrentNFTTemplateCount","_this$getCurrentNFTTe","getNFTTemplate","_this$getNFTTemplate","deployERC721Contract","tokenURI","transferable","tx","args","getCurrentNFTCount","getCurrentTokenCount","getCurrentTokenTemplateCount","getCurrentTemplateCount","index","_this7$getCurrentNFTT","getTokenTemplate","checkDatatoken","erc20List","checkNFT","nftAddress","erc721List","addNFTTemplate","templateAddress","_exit4","add721TokenTemplate","disableNFTTemplate","_this12","_this12$getOwner","_this12$getCurrentNFT","disable721TokenTemplate","_this12$config","reactivateNFTTemplate","_this13$getOwner","_this13$getCurrentNFT","reactivate721TokenTemplate","_this13$config","addTokenTemplate","_exit9","disableTokenTemplate","_exit10","_this15$getOwner","_this15$getCurrentTok","_this15$getTokenTempl","_this15$config","reactivateTokenTemplate","_this16$getOwner","_this16$getCurrentTok","_this16$getTokenTempl","_this16$config","startMultipleTokenOrder","orders","_this17","_this17$config","createNftWithDatatoken","nftCreateData","dtParams","_this18","getErcCreationParams","ercCreateData","createNftWithErc20","_this18$config","createNftWithDatatokenWithFixedRate","freParams","getFreCreationParams","fixedData","createNftWithErc20WithFixedRate","createNftWithDatatokenWithDispenser","dispenserParams","_this20$amountToUnits","_this20$amountToUnits2","createNftWithErc20WithDispenser","_temp4","minter","paymentCollector","mpFeeAddress","feeToken","filesObject","push","allowAccessList","denyAccessList","_dtParams$templateInd","cap","_this21$amountToUnits","feeAmount","feeTokenDecimals","_this21$amountToUnits2","strings","uints","bytess","toUtf8Bytes","_generateDtName2","_temp3","_getTokenDecimals","allowedConsumer","_temp5","baseTokenAddress","_freParams$fixedRateA","fixedRateAddress","_freParams$datatokenD","datatokenDecimals","_freParams$baseTokenD","baseTokenDecimals","_this22$amountToUnits","_this22$amountToUnits2","fixedPriceAddress","_settle","pact","state","value","s","_Pact","o","bind","v","observer","onFulfilled","onRejected","callback","thenable","calculateActiveTemplateIndex","nftContractAddress","template","chainID","isTemplateID","factoryERC721","currentTokenCount","_result2","i","_for","tokenTemplate","erc20Template","ERC20Template","getId","id","Nft","ERC721Template","createDatatoken","accessListContract","getNftPermissions","_this$getNftPermissio","deployERC20","nftContract","_nftContract$createER2","createERC20","_templateIndex2","_this$amountToUnits3","_this$amountToUnits4","toLowerCase","_templateIndex","_nftContract$createER","_this$config$gasFeeMu","_this$getSignerAccord","_this$amountToUnits","_this$amountToUnits2","event","artifacts","chain","data","Addresses","getOceanArtifactsAddresses","networks","Object","keys","_i","_networks","getOceanArtifactsAddressesByChainId","_calculateActiveTempl","addManager","manager","_exit2","getNftOwner","_this2$getNftOwner","removeManager","_this3$getNftOwner","addDatatokenDeployer","datatokenDeployer","_this4$getNftPermissi","addToCreateERC20List","removeDatatokenDeployer","_this5$getNftPermissi","_temp6","_this5$getNftPermissi2","removeFromCreateERC20List","addMetadataUpdater","metadataUpdater","_exit7","_this6$getNftPermissi","addToMetadataList","removeMetadataUpdater","_exit8","_this7$getNftPermissi","_temp8","_this7$getNftPermissi2","_temp7","updateMetadata","removeFromMetadataList","addStoreUpdater","storeUpdater","_this8$getNftPermissi","addTo725StoreList","removeStoreUpdater","_exit11","_this9$getNftPermissi","_temp10","_this9$getNftPermissi2","_temp9","store","removeFrom725StoreList","cleanPermissions","_this10$getNftOwner","transferNft","nftOwner","nftReceiver","tokenId","_this11$getNftOwner","tokenIdentifier","transferFrom","safeTransferNft","_exit15","_this12$getNftOwner","safeTransferFrom","setMetadata","metadataState","metadataDecryptorUrl","metadataDecryptorAddress","flags","metadataHash","metadataProofs","_exit16","_this13$getNftPermiss","setMetaData","setMetadataAndTokenURI","metadataAndTokenURI","_this14$getNftPermiss","sanitizedMetadataAndTokenURI","setMetaDataAndTokenURI","setMetadataState","_this15$getNftPermiss","setMetaDataState","setTokenURI","ownerOf","getPermissions","getMetadata","getMetaData","isDatatokenDeployer","isERC20Deployer","setData","key","_this21$getNftPermiss","keyHash","keccak256","valueHex","hexlify","setNewData","getData","toUtf8String","getTokenURI","isDatatokenDeployed","datatokenAddress","isDeployed","Datatoken","abiEnterprise","nft","ERC20TemplateEnterprise","approve","spender","dtContract","createFixedRate","fixedRateParams","_this3$isDatatokenDep","createDispenser","_this4$isDatatokenDep","mint","toAddress","_this5$getPermissions","getCap","capAvailble","gte","addMinter","_this6$isDatatokenDep","removeMinter","_this7$isDatatokenDep","addPaymentManager","paymentManager","_this8$isDatatokenDep","removePaymentManager","_this9$isDatatokenDep","setPaymentCollector","_this10$getPermission","_this10$nft$getNftOwn","nftPermissions","isPaymentManager","isNftOwner","getNFTAddress","getPaymentCollector","transfer","_transferWei","transferWei","_amountToUnits","startOrder","consumer","serviceIndex","providerFees","consumeMarketFeeAddress","consumeMarketFeeToken","reuseOrder","orderTxId","buyFromFreAndOrder","orderParams","getFreOrderParams","freContractParams","buyFromDispenserAndOrder","dispenserContract","_this18$isDatatokenDe","_this19$nft","_getNftOwner","_this19$getNFTAddress","_this19$nft$getNftOwn","permissions","getDecimals","getSymbol","getName","_this25","_this26","getERC721Address","getFixedRates","getDispensers","_this30","balanceOf","allowance","_this31","setPublishingMarketFee","publishMarketFeeAddress","publishMarketFeeToken","_this32","getPublishingMarketFee","_dtContract$getPublis","_this32$config","_this33","publishingMarketFee","_this34","_freParams$exchangeId","_freParams$exchangeCo","exchangeContract","_amountToUnits2","swapMarketFee","_amountToUnits3","marketFeeAddress","Datatoken4","_Datatoken2","fileObject","accessList","ERC20Template4","setFileObj","fileObj","getAllowlistContract","getAllowListContract","getDenylistContract","getDenyListContract","setAllowListContract","setDenyListContract","_this5$isDatatokenDep","setFileObject","setFilesObject","getFileObject","providerAddress","providerSignature","consumerData","consumerSignature","consumerAddress","AccessListContract","AccessList","getTokenUri","user","tokenUri","batchMint","users","tokenUris","burn","transferOwnership","newOwner","renounceOwnership","AccesslistFactory","deployAccessListContract","nameAccessList","symbolAccessList","isSoulbound","contractAddress","isSoulBound","changeTemplateAddress","VeOcean","veOceanABI","lockTokens","unlockTime","getToken","_this$getToken","amountFormatted","create_lock","depositFor","_this2$getToken","deposit_for","increaseAmount","_this3$getToken","increase_amount","increaseUnlockTime","increase_unlock_time","withdraw","getVotingPower","userAddress","getLockedAmount","locked","_unitsToAmount","_this7$getToken","lockEnd","locked__end","untilLock","parseInt","totalSupply","_unitsToAmount2","_this9$getToken","_this9$contract$total","VeFeeDistributor","veFeeABI","claim","claimMany","claim_many","VeFeeEstimate","estimateClaim","voting_escrow","_this$contract$voting","veOcean","_veOcean$getToken","VeAllocate","veAllocateABI","setAllocation","setBatchAllocation","getTotalAllocation","getVeAllocation","getveAllocation","DfRewards","dfRewardsABI","getAvailableRewards","claimable","rewards","claimRewards","claimFor","allocateRewards","userAddresses","amounts","allocate","_this3$amountToUnits","DfStrategyV1","dfStrategyV1ABI","getMultipleAvailableRewards","tokenAddresses","claimables","rewardsFormated","_push","claimMultipleRewards","claimMultiple","EscrowContract","Escrow","getFunds","getUserFunds","payer","getUserTokens","getLocks","payee","getAuthorizations","verifyFundsForEscrowPayment","amountToDeposit","maxLockedAmount","maxLockSeconds","maxLockCounts","_this7$signer$provide","getBalance","getAddress","balanceNativeToken","isZero","isValid","message","_allowance","_this7$signer$getAddr4","target","_this7$amountToUnits","_balance","_this7$signer$getAddr3","balancePaymentToken","_getAuthorizations","_this7$signer$getAddr2","auths","_getUserFunds","_this7$signer$getAddr","funds","authorize","parseEther","isLessThanOrEqualTo","isGreaterThan","deposit","_deposit","_this7$unitsToAmount","isLessThan","amountParsed","tokens","tokensWithSufficientFunds","amountsWithSufficientFunds","_temp11","amountsParsed","map","array","body","available","_cycle","_getAuthorizations2","_this10$signer$getAdd","maxLockedAmountParsed","maxLockSecondsParsed","maxLockCountsParsed","cancelExpiredLocks","jobIds","payers","payees","sleep","ms","setTimeout","signRequest","consumerMessage","messageHashBytes","getBytes","signMessage","_legacySignMessage","Aquarius","aquariusURL","did","signal","authorization","path","fetch","method","headers","Authorization","response","ok","json","waitForIndexer","txid","interval","maxRetries","tries","_do","_result","ddo","indexedMetadata","DDOManager","getDDOClass","getAssetFields","_result3","validate","providerUrl","ddoValidateRoute","pathNonce","publisherAddress","responseNonce","nonce","nextNonce","signature","jsonResponse","valid","hash","proof","validatorAddress","publicKey","r","getAssetMetadata","statusText","querySearch","query","recover","Provider","getConsumerAddress","signerOrAuthToken","jwt","decode","decodeJwt","getSignature","signProviderRequest","getAuthorization","undefined","getEndpoints","providerUri","endpoints","getEndpointURL","servicesEndpoints","serviceName","getServiceEndpoints","providerEndpoint","serviceEndpoints","endpoint","urlPath","getNonce","providerEndpoints","_this3$getServiceEndp","_this3$getEndpoints","encrypt","text","checkDidFiles","serviceId","withChecksum","_result4","resolvedResponse","_response","results","_iterator","_step","_createForOfIteratorHelperLoose","done","files","checksum","_fetch","getFileInfo","file","_temp12","_result5","_result6","_response2","_step2","_iterator2","_fetch2","getComputeEnvironments","_this7$getEndpointURL","_temp14","_result7","_response3","_temp13","_fetch3","initialize","fileIndex","userCustomParameters","computeEnv","validUntil","_temp18","_result8","_temp16","_result9","_temp15","_response4","initializeUrl","encodeURI","_temp17","_fetch4","initializeComputeV1","assets","algorithm","accountId","maxJobDuration","_temp22","_result10","_temp20","_result11","payload","_temp19","_response5","params","datasets","payment","environment","_temp21","_fetch5","initializeCompute","resources","policyServer","_this10$getNonce","_assets$","signatureMessage","documentId","_temp26","_result12","_temp24","_result14","providerData","_temp23","_response6","_temp25","_fetch6","errorText","getDownloadUrl","transferTxId","downloadUrl","_this11$getNonce","consumeUrl","computeStartV1","dataset","additionalDatasets","output","computeStartUrl","_this12$getNonce","_temp30","_result15","_exit13","_temp28","_result16","_error","_response$statusText","_response$status","_response$json","_temp27","_response7","_temp29","_fetch7","computeStart","metadata","additionalViewers","_this13$getNonce","_datasets$","_temp34","_result17","_temp32","_result18","_temp31","_response8","_temp33","_fetch8","freeComputeStart","_this14$getNonce","_temp38","_result19","_exit17","_temp36","_result20","_temp35","_response9","_temp37","_fetch9","computeStreamableLogs","jobId","isAuthToken","_this15$getNonce","_temp42","_exit18","_temp40","_result21","_response10","_response11","_error2","_response$statusText2","_response$status2","_response$json2","_temp39","url","_fetch10","_temp41","getComputeStartRoutes","isFreeCompute","computeStop","agreementId","computeStopUrl","_this17$getNonce","_temp46","_result22","_exit20","_temp44","_result23","_temp43","_response12","queryParams","URLSearchParams","set","queryString","_temp45","_fetch11","computeStatus","_temp52","_result24","_exit22","_temp50","_result25","_exit23","_temp48","_result26","_temp47","_response13","_temp49","_response14","computeStatusUrl","_temp51","_fetch12","getComputeResultUrl","computeResultUrl","_this19$getNonce","resultUrl","computeDelete","computeDeleteUrl","_this20$getNonce","noZeroX","_temp56","_result27","_exit25","_temp54","_result28","_temp53","_response15","_temp55","_fetch13","generateAuthToken","_this21$getNonce","invalidateAuthToken","_this22$getNonce","isValidProvider","_exit26","_temp57","providerAddresses","_result29","PolicyServerPassthrough","request","_temp61","_result30","_exit28","_temp59","_result32","_temp58","_response16","_temp60","_fetch14","initializePSVerification","_temp65","_result33","_exit30","_temp63","_result35","_temp62","_response17","_temp64","_fetch15","input","zeroXTransformer","zeroOutput","_this$inputMatch","inputMatch","regexp","conversorName","match","ProviderInstance","allowanceWei","account","approveWei","force","_sendTx","currentAllowence","_BigInt","_Decimal$toNumber","toNumber","PREDEFINED_ERRORS","invalid","missing","not_found","service_not_access_compute","main_service_compute","compute_services_not_in_same_provider","container","checksum_prefix","mising_entrypoint_image_checksum","did_not_found","missing_meta_documentId","not_algo","in_use_or_not_on_chain","meta_oneof_url_rawcode_remote","file_unavailable","not_trusted_algo_publisher","not_trusted_algo","no_publisherTrustedAlgorithms","algorithm_file_checksum_mismatch","algorithm_container_checksum_mismatch","no_raw_algo_allowed","order","fees_not_paid","web3Provider","datatokensABI","fixedRateExchangeAddressABI","dispenserABI","sideStakingAddress","verbose","authMessage","authTokenExpiration","parityUri","threshold","addressesList","ownerAccount","accessListTx","events","_events$args$","assetUrl","templateIDorAddress","encryptDDO","providerFeeToken","aquariusInstance","ddoInstance","_ddoInstance$getDDODa","getDDOData","stats","_indexedMetadata$stat","prices","_ddoInstance$getDDOFi","getDDOFields","ddoChainId","services","_owner$provider$getNe","nftFactory","_assetUrl$files$","bundleNFT","_setMetadata","_nftAddress","_owner$getAddress","toBeHex","datatokenAddressAsset","serviceEndpoint","makeDid","nftAddressFromEvent","updateFields","_ProviderInstance$enc2","validateResult","stringDDO","bytes","Buffer","from","createHash","update","digest","_ProviderInstance$enc","nftCreatedEvent","tokenCreatedEvent","newTokenAddress","err","nftParamsAsset","datatokenParams","ARWEAVE","IPFS","URL","_nftFactory$createNft","_nftFactory$createNft2","fixedPriceParams","_nftFactory$createNft3","filename","get","_unused","split","pop","_unused2","arrayBuffer","_response$arrayBuffer","xhr","XMLHttpRequest","responseType","open","onload","contentDispositionHeader","getResponseHeader","fileNameMatch","fileName","blobURL","window","createObjectURL","a","document","createElement","href","setAttribute","appendChild","click","remove","revokeObjectURL","send","sha256","_PREDEFINED_ERRORS$ke","errorObject","something","asset","consumerAccount","consumeMarketOrderFee","consumeMarketFixedSwapFee","datatokenIndex","fixedRateIndex","datatokens","assetChainId","_consumerAccount$prov","fixedRates","dispensers","publishMarketFees","_consumerAccount$getA6","_initialize","_asset$id","_services$serviceInde","_ProviderInstance$ini","_consumerAccount$getA2","_providerFee","fees","_consumeMarketFee","_switch","pricingType","_await$datatoken$buyF","dispenser","_dispense","_datatokens$datatoken","_consumerAccount$getA3","dispenserTx","_await$datatoken$star","fre","_exit5","_consumerAccount$getA5","txApprove","txBuy","add","_consumerAccount$getA4","freTx","buyDtTx","_await$datatoken$star2","providerFee","providerFeeAddress","providerFeeAmount","_consumerAccount$getA","signedMessage","substr","recipient"],"mappings":"k5JA8IYA,EAMAC,ECnJAC,0uDD6IAF,EAAAA,oBAAAA,GAAAA,EAAAA,EAAAA,iBAAAA,EAAcA,eAIzB,CAAA,IAHC,IAAA,MACAA,EAAA,KAAA,OACAA,EAAA,QAAA,UAGUC,EAAZA,mBAAA,GAAYA,EAAAA,EAAAA,gBAAAA,EAAAA,cAGX,CAAA,IAFC,IAAA,MACAA,EAAA,MAAA,QCrJUC,EAAAA,cAAAA,GAAAA,EAAAA,EAAQA,WAARA,WAMX,CAAA,IALCA,EAAA,MAAA,GAAA,OACAA,EAAAA,EAAA,MAAA,GAAA,QACAA,EAAAA,EAAA,KAAA,GAAA,OACAA,EAAAA,EAAA,IAAA,GAAA,MACAA,EAAAA,EAAA,QAAA,GAAA,UAIW,IAAAC,gBAAM,WACjB,SAAAA,EAAoBC,GAAmBC,KAAnBD,cAAA,EAAAC,KAAQD,SAARA,EAClBC,KAAKD,SAAWA,GAAYF,WAASI,KACvC,CAAC,IAAAC,EAAAJ,EAAAK,iBAAAD,EAEME,SAAA,SAASL,GACdC,KAAKD,SAAWA,CAClB,EAACG,EAEMG,OAAA,WACLL,KAAKM,SAAQC,MAAbP,KAAI,CAAU,OAAQQ,UAAeC,OAAAC,GAAAA,MAAAC,KAAAC,YACvC,EAACV,EAEMW,MAAA,WACLb,KAAKM,SAAQC,MAAbP,KAAc,CAAA,QAASH,EAAQA,SAACiB,SAAOL,OAAAC,GAAAA,MAAAC,KAAAC,YACzC,EAACV,EAEMa,IAAA,WACLf,KAAKM,SAAQC,MAAbP,KAAI,CAAU,MAAOH,WAASmB,KAAGP,OAAA,GAAAC,MAAAC,KAAAC,YACnC,EAACV,EAEMe,KAAA,WACLjB,KAAKM,SAAQC,MAAbP,MAAc,OAAQH,EAAAA,SAASqB,MAAIT,OAAA,GAAAC,MAAAC,KAAAC,YACrC,EAACV,EAEMiB,MAAA,WACLnB,KAAKM,SAAQC,MAAbP,MAAc,QAASH,EAAQA,SAACI,OAAKQ,UAAAC,MAAAC,KAAAC,YACvC,EAACV,EAEOI,SAAA,SAASc,EAAcC,OACDC,EAAxBtB,KAAKD,UAAYsB,IACjBC,EAAAC,SAAgCH,GAAKb,MAAAe,EAAA,GAAAZ,MAAAC,KAAAC,UAAA,GAE3C,EAACd,CAAA,CAjCgB,GAoCN0B,GAAiB,IAAI1B,GCxC5B2B,GAAmC,CACvCC,QAAS,KACTC,QAAS,UACTC,QAAS,wBACTC,aAAc,wBACdC,YAAa,KACbC,kBAAmB,KACnBC,iBAAkB,QAClBC,yBAA0B,KAC1BC,iBAAkB,KAClBC,WAAY,EACZC,wBAAyB,GACzBC,8BAA+B,EAC/BC,0BAA2B,IAC3BC,iBAAkB,GAGPC,GAAiC,CAAAC,GAEvChB,CAAAA,EAAAA,IAAwBgB,MAIxBhB,GAAwB,CAC3BC,QAAS,KACTC,QAAS,cACTE,aAAc,wBACda,IAAK,QAAKD,MAGPhB,GAAwB,CAC3BC,QAAS,SACTC,QAAS,UACTC,QAAS,+BACTE,YAAa,+BACbS,iBAAkB,IAClBG,IAAK,QAAKD,GAAA,GAGPhB,GACHC,CAAAA,QAAS,EACTC,QAAS,UACTC,QAAS,+BACTE,YAAa,uBACbK,WAAY,SACZC,wBAAyB,IACzBC,8BAA+B,EAC/BC,0BAA2B,KAC3BC,iBAAkB,KAClBG,IAAK,QAAKD,MAGPhB,GAAwB,CAC3BC,QAAS,IACTC,QAAS,UACTC,QAAS,uCACTE,YAAa,0BACbE,iBAAkB,SAClBO,iBAAkB,IAClBG,IAAK,QAAKD,GAGPhB,GAAAA,IACHC,QAAS,OACTC,QAAS,eACTC,QAAS,6CACTE,YAAa,oDACbY,IAAK,QAAKD,GAGPhB,CAAAA,EAAAA,IACHC,QAAS,MACTC,QAAS,SACTC,QAAS,sCACTE,YAAa,iCACbS,iBAAkB,IAClBG,IAAK,QAAKD,GAGPhB,GAAAA,GACHC,CAAAA,QAAS,GACTC,QAAS,MACTC,QAAS,mCACTE,YAAa,uBACbS,iBAAkB,KAClBG,IAAK,QAAKD,MAGPhB,GAAwB,CAC3BC,QAAS,IACTC,QAAS,YACTC,QAAS,4BACTE,YAAa,iCACbS,iBAAkB,KAClBG,IAAK,QAAKD,GAAA,GAGPhB,GACHC,CAAAA,QAAS,KACTC,QAAS,YACTC,QAAS,6CACTE,YAAa,iCACbS,iBAAkB,KAClBG,IAAK,QAAKD,GAAA,CAAA,EAGPhB,GACHC,CAAAA,QAAS,IACTC,QAAS,gBACTC,QAAS,qCACTE,YAAa,2CACbS,iBAAkB,EAClBG,IAAK,QAAKD,GAAA,GAGPhB,GAAwB,CAC3BC,QAAS,GACTC,QAAS,WACTC,QAAS,8BACTE,YAAa,mCACbS,iBAAkB,IAClBG,IAAK,QAAKD,GAGPhB,CAAAA,EAAAA,GACHC,CAAAA,QAAS,SACTC,QAAS,mBACTC,QAAS,8BACTE,YAAa,yCACbS,iBAAkB,IAClBG,IAAK,QAAKD,MAGPhB,GAAwB,CAC3BC,QAAS,MACTC,QAAS,iBACTC,QAAS,4BACTE,YAAa,8CACbS,iBAAkB,EAClBG,IAAK,UAAOD,GAGThB,CAAAA,EAAAA,GACHC,CAAAA,QAAS,MACTC,QAAS,yBACTC,QAAS,qCACTE,YAAa,8CACbS,iBAAkB,EAClBG,IAAK,UAAOD,GAAA,CAAA,EAGThB,GAAwB,CAC3BC,QAAS,MACTC,QAAS,kBACTC,QAAS,8BACTE,YAAa,mDACbY,IAAK,SAIIC,GAA0B,CACrC,MACA,OAGWC,gBAAYA,WAAAA,SAAAA,IAAA1C,CAAAA,IAAAA,EAAA0C,EAAAzC,iBAAAD,EAEhB2C,oBAAA,SAAoBlB,EAAiBmB,GAC1C,IAAIC,EAEEC,EAAU,WACd,OAAIC,QAAQC,IAAIC,SACP,CACLtB,aAAcoB,QAAQC,IAAIC,UAIvB,CAAA,CACT,EAEA,GAAIL,GAAmBA,EAAgBnB,GAAU,CAC/C,IAAAyB,EAkBIN,EAAgBnB,GACpBoB,EAAeN,GACbY,CAAAA,kBAjBaD,EAAbE,cAkBAC,yBAjBwBH,EAAxBI,yBAkBAvB,yBArBUmB,EAAVK,WAsBAvB,iBArBSkB,EAATM,UAsBA3B,kBAnBKqB,EAALO,MAoBAC,qBATMR,EAANS,OAUAnC,QApBO0B,EAAP1B,QAqBAS,WApBUiB,EAAVjB,WAqBA2B,WApBUV,EAAVU,WAqBAC,QApBOX,EAAPW,QAqBAC,aApBYZ,EAAZY,aAqBAC,iBApBgBb,EAAhBa,iBAqBAC,kBApBiBd,EAAjBc,kBAqBAC,UApBSf,EAATe,UAqBAC,aApBYhB,EAAZgB,aAqBAC,cApBajB,EAAbiB,cAqBAC,kBAnBiBlB,EAAjBmB,mBAoBGvB,IAEN,SAAWwB,EAAoD,QAAC7C,GAAU,CACzE,IAAA8C,EAkBKD,UAAqD7C,GAC1DoB,EAAeN,GAAA,CACbY,kBAhBaoB,EAAbnB,cAiBAC,yBAlBwBkB,EAAxBjB,yBAmBAvB,yBArBUwC,EAAVhB,WAsBAvB,iBArBSuC,EAATf,UAsBA3B,kBAnBK0C,EAALd,MAoBAC,qBATMa,EAANZ,OAUAnC,QApBO+C,EAAP/C,QAqBAS,WApBUsC,EAAVtC,WAqBA2B,WApBUW,EAAVX,WAqBAC,QApBOU,EAAPV,QAqBAC,aApBYS,EAAZT,aAqBAC,iBApBgBQ,EAAhBR,iBAqBAC,kBApBiBO,EAAjBP,kBAqBAC,UApBSM,EAATN,UAqBAC,aApBYK,EAAZL,aAqBAC,cApBaI,EAAbJ,cAqBAC,kBAnBiBG,EAAjBF,mBAoBGvB,IAEN,CACD,OAAOD,CACT,EAAC7C,EAQMwE,UAAA,SAAU/C,EAA0BgD,GACzC,IASIC,EATEC,EAA8B,iBAAZlD,EAAuB,UAAY,UAEvDmD,EAAStC,GAAqBuC,KAAK,SAACC,GAAM,OAAAA,EAAEH,KAAclD,CAAO,GAErE,IAAKmD,EAEH,OADAtD,GAAeL,MAA4CQ,sCAAAA,EAAU,KAC9D,KAIT,IACEiD,EAAY3B,QAAQC,IAAI+B,aACpBC,KAAKC,MAEHC,UAAGC,aAAapC,QAAQC,IAAI+B,aAAc,SAE5C,IACL,CAAC,MAAOK,GACP/D,QAAQR,IAAIuE,GACZV,EAAY,IACb,CAED,IAAIW,EAA0BvF,KAAK6C,oBAAoBiC,EAAOnD,QAASiD,GA0BvE,OAxBKW,GAA2B5C,GAAwB6C,SAASV,EAAOpD,WACtE6D,EAA0BvF,KAAK6C,oBAC7BiC,EAAOnD,QAAQ8D,QAAQ,QAAS,QAChCb,IAIE,QAASE,GAA0B,OAAfA,EAAOpC,MAE7BoC,EAAOpC,IADLC,GAAwB6C,SAASV,EAAOpD,SAC7B,QAEA,OAGb6D,GAA2B,sBAAuBA,IACpDT,EAAOR,kBAAoBiB,EAAwBjB,mBAGrDQ,EAAMrC,GAAQqC,CAAAA,EAAAA,EAAWS,GAMzB9C,GAAA,CAAA,EAAYqC,EAAM,CAAElD,QAJJ+C,EACTG,EAAOlD,QAAW+C,IAAAA,EACrBG,EAAOlD,SAGb,EAACgB,CAAA,CA3JsBA,GC3KZ8C,GAAS,CACpB,CACEC,UAAU,EACVC,OAAQ,GACRC,KAAM,OACNC,QAAS,CACP,CACED,KAAM,GACNE,KAAM,WAGVC,SAAS,EACTC,gBAAiB,OACjBF,KAAM,YAER,CACEJ,UAAU,EACVC,OAAQ,CACN,CACEC,KAAM,WACNE,KAAM,WAER,CACEF,KAAM,SACNE,KAAM,YAGVF,KAAM,UACNC,QAAS,CACP,CACED,KAAM,GACNE,KAAM,SAGVC,SAAS,EACTC,gBAAiB,aACjBF,KAAM,YAER,CACEJ,UAAU,EACVC,OAAQ,GACRC,KAAM,cACNC,QAAS,CACP,CACED,KAAM,GACNE,KAAM,YAGVC,SAAS,EACTC,gBAAiB,OACjBF,KAAM,YAER,CACEJ,UAAU,EACVC,OAAQ,CACN,CACEC,KAAM,QACNE,KAAM,WAER,CACEF,KAAM,MACNE,KAAM,WAER,CACEF,KAAM,SACNE,KAAM,YAGVF,KAAM,eACNC,QAAS,CACP,CACED,KAAM,GACNE,KAAM,SAGVC,SAAS,EACTC,gBAAiB,aACjBF,KAAM,YAER,CACEJ,UAAU,EACVC,OAAQ,GACRC,KAAM,WACNC,QAAS,CACP,CACED,KAAM,GACNE,KAAM,UAGVC,SAAS,EACTC,gBAAiB,OACjBF,KAAM,YAER,CACEJ,UAAU,EACVC,OAAQ,CACN,CACEC,KAAM,SACNE,KAAM,YAGVF,KAAM,YACNC,QAAS,CACP,CACED,KAAM,UACNE,KAAM,YAGVC,SAAS,EACTC,gBAAiB,OACjBF,KAAM,YAER,CACEJ,UAAU,EACVC,OAAQ,GACRC,KAAM,SACNC,QAAS,CACP,CACED,KAAM,GACNE,KAAM,WAGVC,SAAS,EACTC,gBAAiB,OACjBF,KAAM,YAER,CACEJ,UAAU,EACVC,OAAQ,CACN,CACEC,KAAM,MACNE,KAAM,WAER,CACEF,KAAM,SACNE,KAAM,YAGVF,KAAM,WACNC,QAAS,CACP,CACED,KAAM,GACNE,KAAM,SAGVC,SAAS,EACTC,gBAAiB,aACjBF,KAAM,YAER,CACEJ,UAAU,EACVC,OAAQ,CACN,CACEC,KAAM,SACNE,KAAM,WAER,CACEF,KAAM,WACNE,KAAM,YAGVF,KAAM,YACNC,QAAS,CACP,CACED,KAAM,GACNE,KAAM,YAGVC,SAAS,EACTC,gBAAiB,OACjBF,KAAM,YAER,CACEC,SAAS,EACTC,gBAAiB,UACjBF,KAAM,YAER,CACEG,WAAW,EACXN,OAAQ,CACN,CACEO,SAAS,EACTN,KAAM,QACNE,KAAM,WAER,CACEI,SAAS,EACTN,KAAM,UACNE,KAAM,WAER,CACEI,SAAS,EACTN,KAAM,QACNE,KAAM,YAGVF,KAAM,WACNE,KAAM,SAER,CACEG,WAAW,EACXN,OAAQ,CACN,CACEO,SAAS,EACTN,KAAM,OACNE,KAAM,WAER,CACEI,SAAS,EACTN,KAAM,KACNE,KAAM,WAER,CACEI,SAAS,EACTN,KAAM,QACNE,KAAM,YAGVF,KAAM,WACNE,KAAM,UCrFYK,GAAA,SACpBC,EACAC,EACA/D,EACAgE,GAAkC,IACpBC,IAAAA,EAAA5F,iBAAA6F,QAAAC,QAEYJ,EAAOK,SAASC,cAAYC,KAAAC,SAAAA,GAA9C,IAAApF,EAAOoF,EAAPpF,QAAO+E,OAAAA,QAAAC,QACUJ,EAAOK,SAASI,cAAYF,KAA/CG,SAAAA,GACN,IAAIC,EAAiC,GACrC,GAAID,EAAWE,qBAAsB,CACnC,IAAIC,EAAiCH,EAAWE,qBAAqBE,WACjEC,EAAsBL,EAAWM,aAAaF,WAC9C7E,EAAmB,IACrB4E,EAAiCI,KAAKC,MACpCC,OAAOT,EAAWE,sBAAwB3E,GAC1C6E,WACFC,EAAsBE,KAAKC,MACzBC,OAAOT,EAAWM,cAAgB/E,GAClC6E,YAEJH,EAAY,CACVC,sBACGO,OAAO/F,KAAagG,IACnBD,OAAO/F,KAAaiG,KACtBF,OAAON,GAAkCS,GACrCA,GACAH,OAAO/F,KAAamG,IACpBJ,OAAON,GAAkCW,GACzCA,GACAnF,GAAwB6C,SAASiC,OAAO/F,KACxC+F,OAAON,GAAkCY,GACzCA,GACAN,OAAON,GAEbG,cACGG,OAAO/F,KAAagG,IACnBD,OAAO/F,KAAaiG,KACtBF,OAAOJ,GAAuBO,GAC1BA,GACAH,OAAO/F,KAAamG,IACpBJ,OAAOJ,GAAuBS,GAC9BA,GACAnF,GAAwB6C,SAASiC,OAAO/F,KACxC+F,OAAOJ,GAAuBU,GAC9BA,GACAN,OAAOJ,GAEhB,MACCJ,EAAY,CACVe,SAAUhB,EAAWgB,UAGiD,OAA1Ef,EAAUgB,SAAWC,OAAO,IAAIC,EAAS,QAAC9B,GAAQ+B,KAAK,QAAQhB,oCAC3DX,QAAAC,QACuBH,EAAchG,gBAAAG,MAAAC,KAAA6F,EAAA,GAAA/F,OAAUwG,CAAAA,MAAUJ,KAAA,SAArDwB,GAAU5B,OAAAA,QAAAC,QACV2B,EAAWC,QAAMzB,KAAA,WACvB,OAAOwB,CAAU,EAClB,4DALyEE,CACtE,EAIKjD,SAAAA,GAEP,OADA9D,GAAeL,MAAM,kBAAmBmE,GACjC,IACR,EACH,EAAA,EAAA,CAAC,MAAAA,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAA,CAAA,EApGqBmD,GAAA,SACpBnC,EACAoC,EACAC,EACAC,GAAsB,IAAA,IAAAC,EAAAA,SAElBC,GAKJ,MAJiB,MAAbA,IACFA,EAAW,IAEWC,EAAAA,WAAWJ,EAAQG,GACpB1B,UAAU,EAAAX,OAAAA,QAAAC,QALlBkC,EAAaC,EAAbD,GAAanC,QAAAC,QAAWsC,GAAiB1C,EAAQoC,IAAM7B,KAAAgC,GAMxE,CAAC,MAAAvD,GAAA,OAAAmB,QAAA+B,OAAAlD,EAnCD,CAAA,EAAsB2D,GAAa,SACjC3C,EACAoC,EACAC,EACAC,OAAsBM,IAAAA,EAAAA,SAElBJ,GAMJ,MALiB,MAAbA,IACFA,EAAW,IAGWK,cAAYR,EAAQG,GACrB1B,UAAU,SAAAX,QAAAC,QANlBkC,EAAaM,EAAbN,GAAanC,QAAAC,QAAWsC,GAAiB1C,EAAQoC,IAAM7B,KAAAqC,GAOxE,CAAC,MAAA5D,GAAAmB,OAAAA,QAAA+B,OAAAlD,KA1BqB0D,GAAgB,SAAC1C,EAAgBoC,GAAa,IAClE,IAAMU,EAAgB,IAAIC,EAAMA,OAACC,SAASZ,EAAOhD,GAAQY,GACzD,OAAAG,QAAAC,QAAO0C,EAAcN,WACvB,CAAC,MAAAxD,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAA,CAAA,EAnBqBiE,GAAe,SACnCjD,EACA/D,GAAwB,WAAAkE,QAAAC,QAEGJ,EAAOK,SAASI,cAAYF,cAAA2C,GAAA,OAAA/C,QAAAC,QAAnC8C,EAAqCxB,UAAQnB,KAA3D4C,SAAAA,GACN,IAAMC,EAAIxB,OAAOuB,EAAMrC,YACvB,OAAI7E,GAA0BmH,EAAIxB,OAAO3F,IAAmB6E,SAAS,IACzDsC,EAAEtC,UAAU,EAAA,EAC1B,CAAC,MAAA9B,GAAAmB,OAAAA,QAAA+B,OAAAlD,KAnCKsC,GAAsB,KACtBE,GAAsB,IACtBC,GAAuB,KACvBJ,GAAqB,IACrBD,GAAoB,MACpBG,GAAqB,SAEX,SAAA8B,GAAoBC,EAAoB9E,GAWtD,OAAO8E,CACT,CA0EgB,SAAAC,GACdC,EACAC,GAEA,GAAKD,GAAcA,EAAUE,KAQ7B,OAJiBF,EAAUE,KAAKC,OAAO,SAAClJ,GACtC,OAAOA,aAAemJ,EAAAA,UAAYnJ,EAAIgJ,YAAcA,CACtD,GAAG,EAGL,CChHsB,IAAAI,gBAAa,WAcjC,SAAAA,EACE7D,EACA3E,EACAmD,EACAsF,GAAepK,KAjBVsG,YACAxB,EAAAA,KAAAA,YACAsF,EAAAA,KAAAA,WAiBLpK,KAAKsG,OAASA,EACdtG,KAAK8E,OAASA,IAAU,IAAIlC,IAAe8B,UAAU/C,GACrD3B,KAAKoK,IAAMA,GAAOpK,KAAKqK,eACzB,CAAC,IAAAnK,EAAAiK,EAAAhK,iBAAAD,EAESoK,sBAAA,WACR,OAAOtK,KAAK8E,QAAU,aAAcA,QAA8B,UAApB9E,KAAK8E,OAAOpC,IACtD6H,EAASC,KAAKxK,KAAKsG,QACnBtG,KAAKsG,MACX,EAACpG,EASeuI,uBACdC,EACAC,EACAC,OAEA,OAAAnC,QAAAC,QAAO+B,GAAczI,KAAKsG,OAAQoC,EAAOC,EAAQC,GACnD,CAAC,MAAAtD,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EASe+I,cAAA,SACdP,EACAC,EACAC,GAAsB,IAEtB,OAAAnC,QAAAC,QAAOuC,GAAcjJ,KAAKsG,OAAQoC,EAAOC,EAAQC,GACnD,CAAC,MAAAtD,UAAAmB,QAAA+B,OAAAlD,KAAApF,EAMeqJ,gBAAe,eAAAkB,IAAAA,EAC7B,OAAAhE,QAAAC,QAAO6C,GAAgBvJ,KAAKsG,OAAQmE,OAAFA,EAAXzK,KAAkB8E,aAAL2F,EAAAA,EAAalI,kBACnD,CAAC,MAAA+C,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAQSwK,YAAA,SAAYC,EAAiBP,GACrC,IAAKO,EACH,MAAM,IAAI1K,MAAM,iDAQlB,OAAO0J,GALU,IAAIN,EAAAA,OAAOC,SAC1BqB,EACA,IAAItB,EAAMA,OAACuB,UAAU1F,KAAK2F,UAHXT,GAAOpK,KAAKoK,MAI3BpK,KAAKsG,QAGT,EAAC6D,CAAA,CAtFgC,GCPbW,gBAAyB,SAAAC,GAY7C,SAAAD,EACEH,EACArE,EACA3E,EACAmD,EACAsF,GAAe,IAAAY,EAI+B,OAF9CA,EAAAD,EAAApK,UAAM2F,EAAQ3E,EAASmD,EAAQsF,IAAIY,MAlB9BL,aAAO,EAAAK,EACPpB,cAkBLoB,EAAAA,EAAKL,QAAUA,EACfK,EAAKpB,SAAWoB,EAAKN,YAAYM,EAAKL,SAAQK,CAChD,CAACF,OAAAG,GAAAH,EAAAC,GAAAD,CAAA,CAtB4C,CAAQX,ICG1CzG,gBAAUwH,SAAAA,GAAAxH,SAAAA,WAAAwH,EAAA3K,MAAAP,KAAAY,YAAAZ,IAAA,CAAAiL,GAAAvH,EAAAwH,GAAA,IAAAhL,EAAAwD,EAAAvD,UA6OpBuD,OA7OoBxD,EACrBmK,cAAA,WACE,OAAOc,EAAY,QAACf,GACtB,EAAClK,EAOYkL,OAAA,SAAOC,GAAgB,IAAAL,IAAAA,EACIhL,KAAIyG,OAAAA,QAAAC,QAAJsE,EAAKpB,SAASwB,OAAOC,IAASxE,KAAA,SAA9DyE,GACN,IAAKA,EACH,MAAM,IAAIrL,MAA0D,sDACrE,IAAAsL,EAIWD,EAAQE,SAAQC,EADnBH,EAAQI,MAAKC,EADZL,EAAQM,OAAM,OAAAnF,QAAAC,QAGLsE,EAAK/B,cAAc,KAAMqC,EAAQO,UAAW,KAAGhF,KAAA,SAAAiF,GAAA,OAAArF,QAAAC,QAC9CsE,EAAK/B,cAAc,KAAMqC,EAAQS,WAAY,KAAGlF,KAAA,SAAAmF,GAAA,OAAAvF,QAAAC,QACnDsE,EAAK/B,cAAc,KAAMqC,EAAQW,QAAS,KAAGpF,KAAAqF,SAAAA,GAG9D,MATe,CACbN,OAAMD,EACND,MAAKD,EACLD,SAAQD,EACRM,UAASC,EACTC,WAAUC,EACVC,QAAOC,EACPC,eAAgBb,EAAQa,eAEb,EACf,EAAA,EAAA,EAAA,CAAC,MAAA7G,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAYYkM,OAAA,SACXC,EACA1B,EACAkB,EACAE,EACAI,EACAG,GAAe,IAAA,IAAAC,EAEMvM,KAAIyG,OAAAA,QAAAC,QAAJ6F,EAAK3C,SAASwC,OAAOE,YACxCD,EACAE,EAAK9D,cAAc,KAAMoD,EAAW,IACpCU,EAAK9D,cAAc,KAAMsD,EAAY,IACrCpB,EACAwB,IACDtF,KANKR,SAAAA,GAAMmG,IAAAA,EAOR,OAAAF,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACAkG,EAAKjC,wBACLkC,OAD4BA,EAC5BD,EAAKzH,aAAL0H,EAAAA,EAAajK,iBACbgK,EAAK3C,SAASwC,OACdC,EACAE,EAAK9D,cAAc,KAAMoD,EAAW,IACpCU,EAAK9D,cAAc,KAAMsD,EAAY,IACrCpB,EACAwB,GAIJ,EAAA,CAAC,MAAA7G,UAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAUYuM,SAAQ,SACnBJ,EACAR,EACAE,EACAO,GAAe,IAAAI,IAAAA,EAEM1M,KAAIyG,OAAAA,QAAAC,QAAJgG,EAAK9C,SAAS6C,SAASH,YAC1CD,EACAK,EAAKjE,cAAc,KAAMoD,EAAW,IACpCa,EAAKjE,cAAc,KAAMsD,EAAY,MACtClF,KAJKR,SAAAA,GAAMoE,IAAAA,EAKR,OAAA6B,EAA0CjG,EAAMI,QAAAC,QAC3BN,GACvBC,EACAqG,EAAKpC,wBACLG,OAD4BA,EAC5BiC,EAAK5H,aAAL2F,EAAAA,EAAalI,iBACbmK,EAAK9C,SAAS6C,SACdJ,EACAK,EAAKjE,cAAc,KAAMoD,EAAW,IACpCa,EAAKjE,cAAc,KAAMsD,EAAY,KAIzC,EAAA,CAAC,MAAAzG,UAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAQYyM,WAAU,SACrBN,EACAC,OAAeM,IAAAA,EAEM5M,KAAIyG,OAAAA,QAAAC,QAAJkG,EAAKhD,SAAS+C,WAAWL,YAAYD,IAAUxF,KAAA,SAA9DR,GAAM,IAAAwG,EAAA,OACRP,EAA0CjG,EAAMI,QAAAC,QAC3BN,GACvBC,EACAuG,EAAKtC,wBACM,OADiBuC,EAC5BD,EAAK9H,aAAM,EAAX+H,EAAatK,iBACbqK,EAAKhD,SAAS+C,WACdN,GAIJ,EAAA,CAAC,MAAA/G,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EASY4M,kBAAiB,SAC5BT,EACAU,EACAT,GAAe,IAAA,IAAAU,EAEMhN,KAAI,OAAAyG,QAAAC,QAAJsG,EAAKpD,SAASkD,kBAAkBR,YACnDD,EACAU,IACDlG,KAAA,SAHKR,GAAM,IAAA4G,EAAA,OAIRX,EAA0CjG,EAAMI,QAAAC,QAC3BN,GACvBC,EACA2G,EAAK1C,wBACM,OADiB2C,EAC5BD,EAAKlI,aAAM,EAAXmI,EAAa1K,iBACbyK,EAAKpD,SAASkD,kBACdT,EACAU,GAGJ,EAAA,CAAC,MAAAzH,GAAAmB,OAAAA,QAAA+B,OAAAlD,KAAApF,EAYYgN,SAAQ,SACnBb,EACA1D,EACAwE,EACAb,QAFA3D,IAAAA,IAAAA,EAAiB,KAEF,IAAA,IAAAyE,EAEMpN,KAAI,OAAAyG,QAAAC,QAAJ0G,EAAKxD,SAASsD,SAASZ,YAC1CD,EACAe,EAAK3E,cAAc,KAAME,EAAQ,IACjCwE,IACDtG,KAJKR,SAAAA,GAAMgH,IAAAA,EAKR,OAAAf,EAA0CjG,EAAMI,QAAAC,QAC3BN,GACvBC,EACA+G,EAAK9C,wBACM,OADiB+C,EAC5BD,EAAKtI,aAAM,EAAXuI,EAAa9K,iBACb6K,EAAKxD,SAASsD,SACdb,EACAe,EAAK3E,cAAc,KAAME,EAAQ,IACjCwE,GAGJ,EAAA,CAAC,MAAA7H,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAQYoN,cAAA,SACXjB,EACAC,GAAe,QAAAiB,EAEMvN,KAAI,OAAAyG,QAAAC,QAAJ6G,EAAK3D,SAAS0D,cAAchB,YAAYD,IAAUxF,KAAjER,SAAAA,GAAMmH,IAAAA,EACR,OAAAlB,EAA0CjG,EAAMI,QAAAC,QAC3BN,GACvBC,EACAkH,EAAKjD,wBACLkD,OAD4BA,EAC5BD,EAAKzI,aAAL0I,EAAAA,EAAajL,iBACbgL,EAAK3D,SAAS0D,cACdjB,GACD,EAGH,CAAC,MAAA/G,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EASYuN,cAAA,SACXpB,EACAqB,EACA/C,EACAhC,QAAAA,IAAAA,IAAAA,EAAiB,KAAG,IAEK,OAAAlC,QAAAC,QAAJ1G,KAAKoL,OAAOiB,IAAUxF,KAAA,SAArCuE,GAAM,QACPA,IAEiB,IAAlBA,EAAOQ,QAA8BnF,QAAAC,QAEHgH,EAAUzB,QAAQI,EAAW1B,IAAQ9D,KAAA8G,SAAAA,GAC3E,QADoB,IAAIC,EAAAA,QAAOD,GACfE,qBAAqBzC,EAAOW,aAExC,IAAI6B,EAAO,QAACE,OAAOnF,IAASoF,YAAY3C,EAAOS,aAE3B,IAAI+B,EAAO,QAACxC,EAAOa,SACvB4B,qBAAqBlF,KAA+B,IAApByC,EAAOI,SAE/C,EAZa,EAa3B,CAAC,MAAAlG,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAA5B,CAAAA,EAAAA,CAAA,CA7OoBwH,CAAQJ,ICPlBkD,GAAe,6CCYfC,gBAAkB,SAAA/C,GAAA+C,SAAAA,WAAA/C,EAAA3K,MAAAK,KAAAA,YAAAqK,IAAAA,CAAAA,GAAAgD,EAAA/C,GAAA,IAAAhL,EAAA+N,EAAA9N,UA0sB5B,OA1sB4BD,EAC7BmK,cAAA,WACE,OAAO6D,EAAAA,QAAqB9D,GAC9B,EAAClK,EAQYiO,mBAAkB,SAACC,EAAmBV,GAAiB,IACrCjH,OAAAA,QAAAC,QAAJ1G,KAAK4J,SAASuE,mBAAmBC,EAAWV,GAEvE,CAAC,MAAApI,UAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAYYmO,uBACXC,EACAC,EACAC,EACAC,EACAC,EACApC,QAFAmC,IAAAA,IAAAA,EAA+BT,aAC/BU,IAAAA,EAA2B,KACZ,IAAA,IAAAnC,EAEQvM,KAAIyG,OAAAA,QAAAC,QAAJ6F,EAAKoC,YAAYL,IAAWzH,KAAA,SAA7C+H,GAAQ,OAAAnI,QAAAC,QAC0B6F,EAAK9D,cAAc,KAAMiG,EAAkB,KAAG7H,KAAhFgI,SAAAA,UAAyBpI,QAAAC,QACC6F,EAAK9D,cACnCmG,EAASlB,UACTa,EACA9G,OAAOmH,EAASE,cACjBjI,KAJKkI,SAAAA,GAAiBtI,OAAAA,QAAAC,QAKM6F,EAAK9D,cAChCmG,EAASR,UACTI,EACA/G,OAAOmH,EAASI,cACjBnI,cAJKoI,GAAc,OAAAxI,QAAAC,QAMC6F,EAAK3C,SAASsF,MAAM5C,YACvCgC,EACAS,EACAE,EACAR,EACAI,IACDhI,KANKR,SAAAA,OAAMmG,EAAA,OAORF,EAA0CjG,EAAMI,QAAAC,QAC3BN,GACvBC,EACAkG,EAAKjC,wBACLkC,OAD4BA,EAC5BD,EAAKzH,aAAL0H,EAAAA,EAAajK,iBACbgK,EAAK3C,SAASsF,MACdZ,EACAS,EACAE,EACAR,EACAI,GACD,EAAA,EAAA,EAAA,EAAA,EAGH,CAAC,MAAAvJ,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAYYiP,eAAc,SACzBb,EACAC,EACAa,EACAX,EACAC,EACApC,YAFAmC,IAAAA,EAA+BT,SAC/BU,IAAAA,IAAAA,EAA2B,SACZhC,IAAAA,EAEQ1M,KAAI,OAAAyG,QAAAC,QAAJgG,EAAKiC,YAAYL,IAAWzH,KAA7C+H,SAAAA,UAAQnI,QAAAC,QAC0BgG,EAAKjE,cAAc,KAAMiG,EAAkB,KAAG7H,KAAA,SAAhFgI,GAAyB,OAAApI,QAAAC,QACCgG,EAAKjE,cACnCmG,EAASlB,UACTa,EACA9G,OAAOmH,EAASE,cACjBjI,KAAA,SAJKkI,GAAiB,OAAAtI,QAAAC,QAKMgG,EAAKjE,cAChCmG,EAASR,UACTgB,EACA3H,OAAOmH,EAASI,cACjBnI,KAJKwI,SAAAA,GAAc5I,OAAAA,QAAAC,QAKCgG,EAAK9C,SAAS0F,OAAOhD,YACxCgC,EACAS,EACAM,EACAZ,EACAI,IACDhI,KAAA,SANKR,GAAM,IAAAoE,EAOR,OAAA6B,EAA0CjG,EAAMI,QAAAC,QAC3BN,GACvBC,EACAqG,EAAKpC,+BAAuBG,EAC5BiC,EAAK5H,eAAL2F,EAAalI,iBACbmK,EAAK9C,SAAS0F,OACdhB,EACAS,EACAM,EACAZ,EACAI,GACD,EAAA,EAAA,EAAA,EAAA,EAEH,CAAC,MAAAvJ,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAMYqP,qBAAoB,WAAA,IACA9I,OAAAA,QAAAC,QAAJ1G,KAAK4J,SAAS2F,wBAAsB1I,KACxDY,OACT,CAAC,MAAAnC,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EASYsP,QAAO,SAClBlB,EACAmB,EACAnD,GAAe,IAAAU,IAAAA,EAEMhN,KAAI0P,EAAJ1C,EAAKpD,SAAS4F,QAAOG,EAArBD,EAAsBpD,YAAW7F,OAAAA,QAAAC,QAE9CsG,EAAKvE,cAAc,KAAMgH,EAAS,KAAG5I,cAAA+I,GAAA,OAAAnJ,QAAAC,QAAAiJ,EAAAhP,KAAA+O,EAD3CpB,EAAUsB,IAAA/I,KADNR,SAAAA,OAAM4G,EAIZ,GAAIX,EAAa,OAA6BjG,EAAM,IAAAwJ,EAKlD7C,EAAKpD,SAAS4F,QAAOM,SAAA7C,EADrBD,EAAKlI,eAALmI,EAAa1K,iBAAgBwN,EAD7B/C,EAAK1C,wBAAuB,OAAA7D,QAAAC,QAItBsG,EAAKvE,cAAc,KAAMgH,EAAS,KAAG5I,KAAA,SAAAmJ,GAAA,OAAAvJ,QAAAC,QANpBN,GACvBC,EAAM0J,EAAAD,EAAAD,EAINvB,EAAU0B,SAKd,CAAC,MAAA1K,GAAAmB,OAAAA,QAAA+B,OAAAlD,KAAApF,EASY4M,kBAAA,SACXwB,EACAvB,EACAT,OAAec,IAAAA,EAEMpN,KAAIyG,OAAAA,QAAAC,QAAJ0G,EAAKxD,SAASkD,kBAAkBR,YACnDgC,EACAvB,IACDlG,KAAA,SAHKR,GAAM,IAAAgH,EAIR,OAAAf,EAA0CjG,EAAMI,QAAAC,QAC3BN,GACvBC,EACA+G,EAAK9C,+BAAuB+C,EAC5BD,EAAKtI,eAALuI,EAAa9K,iBACb6K,EAAKxD,SAASkD,kBACdwB,EACAvB,GAGJ,EAAA,CAAC,MAAAzH,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAQYuM,SAAQ,SACnB6B,EACAhC,GAAe,IAAA,IAAAiB,EAEQvN,KAAIyG,OAAAA,QAAAC,QAAJ6G,EAAKoB,YAAYL,IAAWzH,KAA7C+H,SAAAA,GACD,OAAAA,GACmB,IAApBA,EAAShD,OAAwB,KAAInF,QAAAC,QACpB6G,EAAK3D,SAASqG,oBAAoB3D,YAAYgC,IAAWzH,KAAxER,SAAAA,OAAMmH,EAAA,OACRlB,EAA0CjG,EAAMI,QAAAC,QAC3BN,GACvBC,EACAkH,EAAKjD,wBACLkD,OAD4BA,EAC5BD,EAAKzI,aAAL0I,EAAAA,EAAajL,iBACbgL,EAAK3D,SAASqG,oBACd3B,GAToB,GAAA,IAAI,EAY5B,CAAC,MAAAhJ,UAAAmB,QAAA+B,OAAAlD,KAAApF,EAQYyM,WAAU,SACrB2B,EACAhC,GAAe,IAAA,IAAA4D,EAEQlQ,KAAIyG,OAAAA,QAAAC,QAAJwJ,EAAKvB,YAAYL,IAAWzH,KAAA,SAA7C+H,GAAQ,OACTA,GACmB,IAApBA,EAAShD,OAAyB,KAAInF,QAAAC,QAErBwJ,EAAKtG,SAASqG,oBAAoB3D,YAAYgC,IAAWzH,KAAA,SAAxER,GAAM8J,IAAAA,SACR7D,EAA0CjG,EAAMI,QAAAC,QAC3BN,GACvBC,EACA6J,EAAK5F,wBACL6F,OAD4BA,EAC5BD,EAAKpL,aAALqL,EAAAA,EAAa5N,iBACb2N,EAAKtG,SAASqG,oBACd3B,GAVoB,GAAA,IAAI,EAa5B,CAAC,MAAAhJ,GAAAmB,OAAAA,QAAA+B,OAAAlD,KAAApF,EAOYkQ,QAAA,SAAQ9B,GAAkB,IAAA,IAAA+B,EACfrQ,KAAIyG,OAAAA,QAAAC,QAAJ2J,EAAKzG,SAASwG,QAAQ9B,IAAWzH,KAAA,SAAjDyJ,GAAO7J,OAAAA,QAAAC,QACA2J,EAAKpH,cAAc,KAAMqH,EAAS,MACjD,CAAC,MAAAhL,GAAA,OAAAmB,QAAA+B,OAAAlD,KAAApF,EAOYqQ,mBAAA,SAAmBjC,GAAkB,QAAAkC,EACzBxQ,KAAI,OAAAyG,QAAAC,QAAJ8J,EAAK5G,SAAS6G,YAAYnC,IAAWzH,KAAA,SAAtD6J,GAAQjK,OAAAA,QAAAC,QACS8J,EAAK7B,YAAYL,IAAWzH,KAA7C+H,SAAAA,GAAQnI,OAAAA,QAAAC,QACD8J,EAAKvH,cAChB2F,EAASlB,UACTgD,EACAjJ,OAAOmH,EAASE,aAEpB,EAAA,EAAA,CAAC,MAAAxJ,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAOYyQ,mBAAkB,SAACrC,GAAkB,IAAAsC,IAAAA,EACzB5Q,KAAI,OAAAyG,QAAAC,QAAJkK,EAAKhH,SAASiH,YAAYvC,IAAWzH,KAAtDiK,SAAAA,UAAQrK,QAAAC,QACSkK,EAAKjC,YAAYL,IAAWzH,KAAA,SAA7C+H,GAAQnI,OAAAA,QAAAC,QACDkK,EAAK3H,cAChB2F,EAASR,UACT0C,EACArJ,OAAOmH,EAASI,iBAEpB,CAAC,MAAA1J,GAAAmB,OAAAA,QAAA+B,OAAAlD,KAAApF,EAOY6Q,kBAAA,SAAkBzC,GAAkB,IAC9B7H,OAAAA,QAAAC,QAAJ1G,KAAK4J,SAASmH,kBAAkBzC,GAC/C,CAAC,MAAAhJ,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EASY8Q,6BAAA,SACX1C,EACAC,EACAG,YAAAA,IAAAA,EAA2B,SAAGuC,IAAAA,EAEEjR,KAAI,OAAAyG,QAAAC,QAAJuK,EAAKtC,YAAYL,IAAWzH,KAAA,SAAtDqK,GAAiB,IAAAC,EACHF,EAAKrH,SAAQwH,EAAbD,EAAcE,qBAAoB5K,OAAAA,QAAAC,QAE9CuK,EAAKxI,cACTyI,EAAkBxD,UAClBa,EACA9G,OAAOyJ,EAAkBpC,cAC1BjI,KAAAyK,SAAAA,GAAA7K,OAAAA,QAAAC,QACKuK,EAAKxI,cAAc,KAAMiG,EAAkB,KAAG7H,KAAA,SAAA0K,GAAA9K,OAAAA,QAAAC,QAAA0K,EAAAzQ,KAAAwQ,EANpD7C,EAAUgD,EAAAC,IAAA1K,cADN2K,GAAK,OAAA/K,QAAAC,QAUcuK,EAAKhI,cAC1BiI,EAAkB9C,UAClBoD,EAAMC,gBACNhK,OAAOyJ,EAAkBlC,cAC1BnI,KAAA6K,SAAAA,GAAAjL,OAAAA,QAAAC,QACsBuK,EAAKhI,cAC1BiI,EAAkB9C,UAClBoD,EAAMG,uBACNlK,OAAOyJ,EAAkBlC,cAC1BnI,KAAA+K,SAAAA,GAAAnL,OAAAA,QAAAC,QACqBuK,EAAKhI,cACzBiI,EAAkB9C,UAClBoD,EAAMK,eACNpK,OAAOyJ,EAAkBlC,cAC1BnI,KAAA,SAAAiL,GAAA,OAAArL,QAAAC,QAC6BuK,EAAKhI,cACjCiI,EAAkB9C,UAClBoD,EAAMO,uBACNtK,OAAOyJ,EAAkBlC,cAC1BnI,KAAA,SAAAmL,GAEH,MAtBqB,CACnBP,gBAAeC,EAKfO,gBAAeL,EAKfC,eAAcC,EAKdC,uBAAsBC,EAML,gBACrB,CAAC,MAAA1M,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EASYgS,uBAAA,SACX5D,EACAC,EACAG,YAAAA,IAAAA,EAA2B,SAAGyD,IAAAA,EAEPnS,KAAI,OAAAyG,QAAAC,QAAJyL,EAAKxD,YAAYL,IAAWzH,KAA7C+H,SAAAA,GAAQwD,IAAAA,EACOD,EAAKvI,SAAQyI,EAAbD,EAAcE,qBAAoB,OAAA7L,QAAAC,QAE/CyL,EAAK1J,cACTmG,EAASlB,UACTa,EACA9G,OAAOmH,EAASE,cACjBjI,cAAA0L,GAAA,OAAA9L,QAAAC,QACKyL,EAAK1J,cAAc,KAAMiG,EAAkB,KAAG7H,KAAA2L,SAAAA,UAAA/L,QAAAC,QAAA2L,EAAA1R,KAAAyR,EANpD9D,EAAUiE,EAAAC,IAAA3L,KAAA,SADN8B,GAAMlC,OAAAA,QAAAC,QAUCyL,EAAKlJ,cAChB2F,EAASR,UACTzF,EAAO,GACPlB,OAAOmH,EAASI,aACjB,EAAA,EAAA,EAAA,EACH,CAAC,MAAA1J,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAOYyO,qBAAYL,GAAkB,IAAA,IAAAmE,EACAzS,YAAIyG,QAAAC,QAAJ+L,EAAK7I,SAAS+E,YAAYL,IAAWzH,KAAA,SAAxE6L,GAAMC,IAAAA,EASED,EAAO1D,WAAW5H,WAAUwL,EAD5BF,EAAO5D,WAAW1H,WAAUyL,EADxBH,EAAOvG,eAAc2G,EADtBJ,EAAOK,cAAaC,EADzBN,EAAOO,SAAQC,EADdR,EAAOtE,UAAS+E,EADhBT,EAAOhF,UAAS0F,EADnBV,EAAO9G,OAAMnF,OAAAA,QAAAC,QAQJ+L,EAAKxJ,cACpByJ,EAAOhF,UACPgF,EAAOW,UACP5L,OAAOiL,EAAO5D,cACfjI,KAAA,SAAAyM,GAAA,OAAA7M,QAAAC,QACgB+L,EAAKxJ,cACpByJ,EAAOtE,UACPsE,EAAOa,UACP9L,OAAOiL,EAAO1D,cACfnI,KAAA,SAAA2M,GAAA/M,OAAAA,QAAAC,QACe+L,EAAKxJ,cACnByJ,EAAOhF,UACPgF,EAAOhC,SACPjJ,OAAOiL,EAAO5D,cACfjI,cAAA4M,GAAA,OAAAhN,QAAAC,QACe+L,EAAKxJ,cACnByJ,EAAOtE,UACPsE,EAAO5B,SACPrJ,OAAOiL,EAAO1D,cACfnI,KAAA,SAAA6M,GAAA,OAAAjN,QAAAC,QACgB+L,EAAKxJ,cAAc,KAAMyJ,EAAOiB,UAAW,KAAG9M,KAAA+M,SAAAA,GAGjE,MAhCqC,CACnChI,OAAMwH,EACN1F,UAASyF,EACT/E,UAAS8E,EACTD,SAAQD,EACRD,cAAaD,EACb3G,eAAc0G,EACd/D,WAAU8D,EACV5D,WAAU2D,EACVU,UAASC,EAKTC,UAASC,EAKT9C,SAAQ+C,EAKR3C,SAAQ4C,EAKRC,UAASC,EACTtF,WAAAA,EAEa,EACjB,EAAA,EAAA,EAAA,EAAA,EAAA,CAAC,MAAAhJ,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAOY2T,YAAW,SAACvF,GAAkB,IAAAwF,IAAAA,EACV9T,KAAI,OAAAyG,QAAAC,QAAJoN,EAAKlK,SAASiK,YAAYvF,IAAWzH,KAAA,SAA9D6L,GAAM,OAAAjM,QAAAC,QACWoN,EAAKnF,YAAYL,IAAWzH,KAAA,SAA7C+H,GAAQnI,OAAAA,QAAAC,QAEEoN,EAAK7K,cAAc,KAAMyJ,EAAOqB,OAAO3M,WAAY,KAAGP,KAAA,SAAAmN,GAAA,OAAAvN,QAAAC,QACnDoN,EAAK7K,cAAc,KAAMyJ,EAAOuB,UAAU7M,WAAY,KAAGP,KAAAqN,SAAAA,GAAAC,IAAAA,EACtDzB,EAAO0B,mBAAkB3N,OAAAA,QAAAC,QACnBoN,EAAK7K,cAC7B2F,EAASR,UACTsE,EAAO2B,mBACP5M,OAAOmH,EAASI,cACjBnI,cAAAyN,GAAA,OAAA7N,QAAAC,QACwBoN,EAAK7K,cAC5B2F,EAASR,UACTsE,EAAO6B,kBACP9M,OAAOmH,EAASI,cACjBnI,KAAA,SAAA2N,GAIH,MAjB2B,CACzBT,OAAMC,EACNC,UAASC,EACTE,mBAAkBD,EAClBE,mBAAkBC,EAKlBC,kBAAiBC,EAMjBlG,WAAAA,EAEa,EAAA,EAAA,EAAA,EAAA,EAAA,EACjB,CAAC,MAAAhJ,UAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAOYuU,wBAAY,IACN,OAAAhO,QAAAC,QAAJ1G,KAAK4J,SAAS6K,eAC7B,CAAC,MAAAnP,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAOYwU,SAAA,SAASpG,OACK,OAAA7H,QAAAC,QAAJ1G,KAAK4J,SAAS8K,SAASpG,GAE9C,CAAC,MAAAhJ,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAQYyU,aAAY,SACvBrG,EACAhC,GAAe,QAAAsI,EAEQ5U,KAAIyG,OAAAA,QAAAC,QAAJkO,EAAKjG,YAAYL,IAAWzH,KAA7C+H,SAAAA,GACD,OAAAA,GACqB,IAAtBA,EAASqE,SAA0B,KAAIxM,QAAAC,QAEtBkO,EAAKhL,SAASiL,gBAAgBvI,YAAYgC,GAAY,IAAKzH,KAAA,SAA1ER,GAAMyO,IAAAA,SACRxI,EAA0CjG,EAAMI,QAAAC,QAC3BN,GACvBC,EACAuO,EAAKtK,wBACM,OADiBwK,EAC5BF,EAAK9P,aAAM,EAAXgQ,EAAavS,iBACbqS,EAAKhL,SAASiL,gBACdvG,GACA,GACD,GAZqB,IAAI,EAc5B,CAAC,MAAAhJ,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAQY6U,wBACXzG,EACAhC,OAAe0I,IAAAA,EAEQhV,KAAI,OAAAyG,QAAAC,QAAJsO,EAAKrG,YAAYL,IAAWzH,KAAA,SAA7C+H,GACD,OAAAA,GACqB,IAAtBA,EAASqE,SAA2B,KAAIxM,QAAAC,QAEvBsO,EAAKpL,SAASiL,gBAAgBvI,YAAYgC,GAAY,IAAMzH,KAAA,SAA3ER,GAAM,IAAA4O,EACR,OAAA3I,EAA0CjG,EAAMI,QAAAC,QAC3BN,GACvBC,EACA2O,EAAK1K,+BAAuB2K,EAC5BD,EAAKlQ,eAALmQ,EAAa1S,iBACbyS,EAAKpL,SAASiL,gBACdvG,GACA,GAXoB,GAAA,IAAI,EAc5B,CAAC,MAAAhJ,GAAAmB,OAAAA,QAAA+B,OAAAlD,KAAApF,EASYgV,kBAAA,SACX5G,EACA3F,EACA2D,OAAe6I,IAAAA,EAEQnV,KAAI,OAAAyG,QAAAC,QAAJyO,EAAKxG,YAAYL,IAAWzH,KAA7C+H,SAAAA,UACDA,EAAQnI,QAAAC,QAE+ByO,EAAKvL,SAAS+E,YAAYL,IAAWzH,KAA3EuO,SAAAA,UAAS3O,QAAAC,QACSyO,EAAK1M,cAC3B2M,EAAUhH,UACVzF,EACAlB,OAAO2N,EAAUpG,cAClBnI,KAJKwO,SAAAA,UAAS5O,QAAAC,QAMMyO,EAAKvL,SAAS0L,UAAUhJ,YAAYgC,EAAY+G,IAAUxO,cAAzER,GAAM,IAAAkP,EAAA,OACRjJ,EAA0CjG,EAAMI,QAAAC,QAC3BN,GACvBC,EACA8O,EAAK7K,wBACLiL,OAD4BA,EAC5BJ,EAAKrQ,aAALyQ,EAAAA,EAAahT,iBACb4S,EAAKvL,SAAS0L,UACdhH,EACA+G,GACD,EAAA,EAAA,GAlBqB,IAAI,EAoB5B,CAAC,MAAA/P,UAAAmB,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EASYsV,2BACXlH,EACA3F,EACA2D,GAAe,IAAA,IAAAmJ,EAEQzV,KAAIyG,OAAAA,QAAAC,QAAJ+O,EAAK9G,YAAYL,IAAWzH,KAA7C+H,SAAAA,GACD,OAAAA,EAAQnI,QAAAC,QAE+B+O,EAAK7L,SAAS+E,YAAYL,IAAWzH,KAA3EuO,SAAAA,GAAS3O,OAAAA,QAAAC,QACS+O,EAAKhN,cAC3B2M,EAAU1H,UACV/E,EACAlB,OAAO2N,EAAUtG,cAClBjI,KAJKwO,SAAAA,GAAS5O,OAAAA,QAAAC,QAMM+O,EAAK7L,SAAS8L,UAAUpJ,YAAYgC,EAAY+G,IAAUxO,KAAzER,SAAAA,OAAMsP,EAAA,OACRrJ,EAA0CjG,EAAMI,QAAAC,QAC3BN,GACvBC,EACAoP,EAAKnL,wBACLqL,OAD4BA,EAC5BF,EAAK3Q,aAAL6Q,EAAAA,EAAapT,iBACbkT,EAAK7L,SAAS8L,UACdpH,EACA+G,GACD,EAAA,EAAA,GAlBqB,IAAI,EAoB5B,CAAC,MAAA/P,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAQY0V,iBAAgB,SAC3BtH,EACAhC,GAAe,QAAAuJ,EAEQ7V,KAAIyG,OAAAA,QAAAC,QAAJmP,EAAKlH,YAAYL,IAAWzH,KAA7C+H,SAAAA,GACD,OAAAA,EAAQnI,QAAAC,QAEQmP,EAAKjM,SAASgM,iBAAiBtJ,YAAYgC,IAAWzH,KAAA,SAArER,GAAMyP,IAAAA,SACRxJ,EAA0CjG,EAAMI,QAAAC,QAC3BN,GACvBC,EACAwP,EAAKvL,wBACM,OADiBwL,EAC5BD,EAAK/Q,aAAM,EAAXgR,EAAavT,iBACbsT,EAAKjM,SAASgM,iBACdtH,GAToB,GAAA,IAAI,EAa5B,CAAC,MAAAhJ,GAAA,OAAAmB,QAAA+B,OAAAlD,KAAApF,EAQY6V,gBAAA,SACXzH,EACAhC,GAAe,IAAA,IAAA0J,EAEQhW,YAAIyG,QAAAC,QAAJsP,EAAKrH,YAAYL,IAAWzH,cAA7C+H,GAAQ,OACTA,EAAQnI,QAAAC,QAEQsP,EAAKpM,SAASmM,gBAAgBzJ,YAAYgC,IAAWzH,KAApER,SAAAA,OAAM4P,EAAA,OACR3J,EAA0CjG,EAAMI,QAAAC,QAC3BN,GACvBC,EACA2P,EAAK1L,wBACL2L,OAD4BA,EAC5BD,EAAKlR,aAALmR,EAAAA,EAAa1T,iBACbyT,EAAKpM,SAASmM,gBACdzH,GAToB,GAAA,IAAI,EAa5B,CAAC,MAAAhJ,GAAA,OAAAmB,QAAA+B,OAAAlD,KAAApF,EAMKgW,gBAAA,WAAe,WACOzP,QAAAC,QAAJ1G,KAAK4J,SAASuM,eAEtC,CAAC,MAAA7Q,UAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAMYkW,UAAA,eACe3P,OAAAA,QAAAC,QAAJ1G,KAAK4J,SAASyM,SAEtC,CAAC,MAAA/Q,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAOKoW,iBAAA,SAAiBhI,OACY,OAAA7H,QAAAC,QAAJ1G,KAAK2O,YAAYL,IAAWzH,KAAA0P,SAAAA,GAAA9P,OAAAA,QAAAC,QAAnC6P,EAAqCxD,cAE7D,EAAA,CAAC,MAAAzN,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EASYsW,gBAAe,SAC1BlI,EACAmI,EACAnK,GAAe,IAAA,IAAAoK,EAEM1W,KAAI2W,EAAJD,EAAK9M,SAAS4M,gBAAeI,EAA7BD,EAA8BrK,mBAAW7F,QAAAC,QAEtDgQ,EAAKjO,cAAc,KAAMgO,EAAc,KAAG5P,KAAA,SAAAgQ,GAAA,OAAApQ,QAAAC,QAAAkQ,EAAAjW,KAAAgW,EADhDrI,EAAUuI,IAAAhQ,KAAA,SADNR,GAAMyQ,IAAAA,EAIZ,GAAIxK,EAAa,OAA6BjG,EAAM,IAAA0Q,EAKlDL,EAAK9M,SAAS4M,gBAAeQ,SAAAF,EAD7BJ,EAAK5R,eAALgS,EAAavU,iBAAgB0U,EAD7BP,EAAKpM,wBAAuB,OAAA7D,QAAAC,QAItBgQ,EAAKjO,cAAc,KAAMgO,EAAc,KAAG5P,cAAAqQ,GAAA,OAAAzQ,QAAAC,QANzBN,GACvBC,EAAM4Q,EAAAD,EAAAD,EAINzI,EAAU4I,SAKd,CAAC,MAAA5R,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EASYiX,yBAAA,SACX7I,EACA8I,EACA9K,GAAe,IAAA+K,IAAAA,EAEMrX,KAAI,OAAAyG,QAAAC,QAAJ2Q,EAAKzN,SAASuN,yBAAyB7K,YAC1DgC,EACA8I,IACDvQ,KAHKR,SAAAA,GAAMiR,IAAAA,EAIR,OAAAhL,EAA0CjG,EAAMI,QAAAC,QAC3BN,GACvBC,EACAgR,EAAK/M,wBACM,OADiBgN,EAC5BD,EAAKvS,aAAM,EAAXwS,EAAa/U,iBACb8U,EAAKzN,SAASuN,yBACd7I,EACA8I,GACD,EAGH,CAAC,MAAA9R,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAA,CAAA,EAAA2I,CAAA,CA1sB4B,CAAQnD,ICJ1BjH,gBAAOqH,SAAAA,GAAArH,SAAAA,WAAAqH,EAAA3K,MAAAP,KAAAY,YAAAqK,IAAAA,CAAAA,GAAApH,EAAAqH,GAAA,IAAAhL,EAAA2D,EAAA1D,UA6SjB0D,OA7SiB3D,EAClBmK,cAAA,WACE,OAAOkN,UAAcnN,GACvB,EAAClK,EAUYsX,2BACXC,EACAnL,GAAe,IAAAtB,IAAAA,EAEMhL,KAAI,OAAAyG,QAAAC,QAAJsE,EAAKpB,SAAS8N,WAAWpL,YAAYmL,IAAW5Q,cAA/DR,GAAM,IAAAsR,EAAA,OACRrL,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACA2E,EAAKV,wBACLqN,OAD4BA,EAC5B3M,EAAKlG,aAAL6S,EAAAA,EAAapV,iBACbyI,EAAKpB,SAAS8N,WACdD,GACD,EAGH,CAAC,MAAAnS,GAAA,OAAAmB,QAAA+B,OAAAlD,KAAApF,EAQY0X,gBAAe,SAACjN,GAAe,WACzBlE,QAAAC,QAAJ1G,KAAK4J,SAASgO,gBAAgBjN,GAC7C,CAAC,MAAArF,GAAA,OAAAmB,QAAA+B,OAAAlD,KAAApF,EAOY2X,aAAY,SAAClN,GAAe,WACtBlE,QAAAC,QAAJ1G,KAAK4J,SAASkO,oBAAoBnN,GACjD,CAAC,MAAArF,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAMY6X,SAAA,WAAQ,IACFtR,OAAAA,QAAAC,QAAJ1G,KAAK4J,SAASoO,cAC7B,CAAC,MAAA1S,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAMY+X,yBAAa,IACP,OAAAxR,QAAAC,QAAJ1G,KAAK4J,SAASsO,UAC7B,CAAC,MAAA5S,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EASYiY,iBAAgB,SAC3BxN,EACAyN,EACA9L,GAAe,IAAA,IAAAc,EAEJpN,KAAI,OAAAyG,QAAAC,QAAJ0G,EAAK2K,YAAUlR,KAAA,SAAAwR,GAA1B,GAAIA,IAA4B1N,EAC9B,MAAU,IAAA1K,MAAkC,8BAC7C,OAAAwG,QAAAC,QAEoB0G,EAAKxD,SAASuO,iBAAiB7L,YAAY8L,IAAavR,KAAA,SAAvER,GAAM,IAAAgH,EACR,OAAAf,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACA+G,EAAK9C,wBACL+C,OAD4BA,EAC5BD,EAAKtI,aAALuI,EAAAA,EAAa9K,iBACb6K,EAAKxD,SAASuO,iBACdC,GAIJ,EAAA,EAAA,CAAC,MAAA9S,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EASYoY,oBAAA,SACX3N,EACAyN,EACA9L,GAAe,IAAA,IAAAiB,EAEJvN,KAAIyG,OAAAA,QAAAC,QAAJ6G,EAAKwK,YAAUlR,KAAA0R,SAAAA,GAA1B,GAAIA,IAA4B5N,EAC9B,MAAU,IAAA1K,MAAK,8BAChB,OAAAwG,QAAAC,QAEoB6G,EAAK3D,SAAS0O,oBAAoBhM,YAAY8L,IAAavR,KAA1ER,SAAAA,GAAMmH,IAAAA,EACR,OAAAlB,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACAkH,EAAKjD,wBACM,OADiBkD,EAC5BD,EAAKzI,aAAM,EAAX0I,EAAajL,iBACbgL,EAAK3D,SAAS0O,oBACdF,GAGJ,EAAA,EAAA,CAAC,MAAA9S,UAAAmB,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EASYsY,8BACX7N,EACAyN,EACA9L,OAAemM,IAAAvI,EAEJlQ,KAAI,OAAAyG,QAAAC,QAAJwJ,EAAK6H,YAAUlR,cAAA6R,GAA1B,GAAIA,IAA4B/N,EAC9B,UAAU1K,MAAkC,8BAC7C,OAAAwG,QAAAC,QAEoBwJ,EAAKtG,SAAS4O,qBAAqBlM,YAAY8L,IAAavR,KAAA,SAA3ER,GAAM,IAAA8J,EAAA,OACR7D,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACA6J,EAAK5F,wBACL6F,OAD4BA,EAC5BD,EAAKpL,aAALqL,EAAAA,EAAa5N,iBACb2N,EAAKtG,SAAS4O,qBACdJ,OAIJ,CAAC,MAAA9S,GAAA,OAAAmB,QAAA+B,OAAAlD,KAAApF,EASYyY,wBAAuB,SAClChO,EACAyN,EACA9L,GAAe,QAAA+D,EAEJrQ,KAAIyG,OAAAA,QAAAC,QAAJ2J,EAAK0H,YAAUlR,KAAA,SAAA+R,GAA1B,GAAIA,IAA4BjO,EAC9B,MAAM,IAAI1K,MAAkC,8BAC7C,OAAAwG,QAAAC,QAEoB2J,EAAKzG,SAAS+O,wBAAwBrM,YAAY8L,IAAavR,KAAA,SAA9ER,GAAMwS,IAAAA,EACR,OAAAvM,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACAgK,EAAK/F,wBACM,OADiBuO,EAC5BxI,EAAKvL,aAAM,EAAX+T,EAAatW,iBACb8N,EAAKzG,SAAS+O,wBACdP,GAIJ,EAAA,EAAA,CAAC,MAAA9S,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EASY4Y,qBAAA,SACXnO,EACAyN,EACA9L,GAAe,IAAA,IAAAkE,EAEJxQ,KAAIyG,OAAAA,QAAAC,QAAJ8J,EAAKuH,YAAUlR,KAAAkS,SAAAA,GAA1B,GAAIA,IAA4BpO,EAC9B,MAAM,IAAI1K,MAAK,8BAChB,OAAAwG,QAAAC,QAEoB8J,EAAK5G,SAASkP,qBAAqBxM,YAAY8L,IAAavR,KAA3ER,SAAAA,OAAM2S,EAAA,OACR1M,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACAmK,EAAKlG,wBACL0O,OAD4BA,EAC5BxI,EAAK1L,aAALkU,EAAAA,EAAazW,iBACbiO,EAAK5G,SAASkP,qBACdV,GACD,EAAA,EAEH,CAAC,MAAA9S,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EASY+Y,wBAAuB,SAClCtO,EACAyN,EACA9L,GAAe,IAAA,IAAAsE,EAEJ5Q,KAAI,OAAAyG,QAAAC,QAAJkK,EAAKmH,YAAUlR,KAAAqS,SAAAA,GAA1B,GAAIA,IAA4BvO,EAC9B,MAAM,IAAI1K,MAAkC,8BAC7C,OAAAwG,QAAAC,QAEoBkK,EAAKhH,SAASqP,wBAAwB3M,YAAY8L,IAAavR,KAAA,SAA9ER,GAAM,IAAA8S,EACR,OAAA7M,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACAuK,EAAKtG,wBACL6O,OAD4BA,EAC5BvI,EAAK9L,aAALqU,EAAAA,EAAa5W,iBACbqO,EAAKhH,SAASqP,wBACdb,GAGJ,EAAA,EAAA,CAAC,MAAA9S,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAKYkZ,UAAA,SAAUhL,GAAiB,IAChB,OAAA3H,QAAAC,QAAJ1G,KAAK4J,SAASwP,UAAUhL,IAAUvH,KAC7CY,OACT,CAAC,MAAAnC,GAAA,OAAAmB,QAAA+B,OAAAlD,KAAApF,EAKYmZ,iBAAgB,WAAA,IACL,OAAA5S,QAAAC,QAAJ1G,KAAK4J,SAAS0P,gBAAczS,KACvCY,OACT,CAAC,MAAAnC,UAAAmB,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAYYqZ,sBACX5O,EACA6O,EACAC,EACAC,EACAC,EACArN,GAAe,IAAA,IAAA6F,EAEJnS,KAAIyG,OAAAA,QAAAC,QAAJyL,EAAK4F,YAAUlR,KAAA+S,SAAAA,GAA1B,GAAIA,IAA4BjP,EAC9B,MAAM,IAAI1K,oCACX,OAAAwG,QAAAC,QAEoByL,EAAKvI,SAAS2P,aAAajN,YAC9CkN,EACAC,EACAC,EACAC,IACD9S,KAAA,SALKR,GAAM,IAAAwT,EAMR,OAAAvN,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACA8L,EAAK7H,wBACLuP,OAD4BA,EAC5B1H,EAAKrN,aAAL+U,EAAAA,EAAatX,iBACb4P,EAAKvI,SAAS2P,aACdC,EACAC,EACAC,EACAC,GAIJ,EAAA,EAAA,CAAC,MAAArU,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAAzB,CAAAA,EAAAA,CAAA,CA7SiBqH,CAAQJ,8qECCZgP,GAAeC,GAI7B,IAAMC,EAAOD,GAAYE,GACnBC,EAAU3S,KAAK4S,MAAM5S,KAAK6S,SAAWJ,EAAKK,WAAWC,QACrDC,EAAUhT,KAAK4S,MAAM5S,KAAK6S,SAAWJ,EAAKQ,MAAMF,QAChDG,EAAclT,KAAK4S,MAAsB,IAAhB5S,KAAK6S,UAG9BM,EAAYV,EAAKK,WAAWH,GAASzU,QAAQ,MAAO,SAACT,UAAMA,EAAE2V,aAAa,GAC1EC,EAAOZ,EAAKQ,MAAMD,GAAS9U,QAAQ,MAAO,SAACT,UAAMA,EAAE2V,aAAa,GAQtE,MAAO,CAAE9U,KANO6U,MAAaE,EAAI,SAMlBC,QAHbH,EAAUI,UAAU,EAAG,GAAKF,EAAKE,UAAU,EAAG,IAC9CH,cAAiBF,IAAAA,EAGrB,yFCRa,IAAAM,yBAAW7P,GAAA,SAAA6P,IAAA,OAAA7P,EAAA3K,WAAAK,YAAAZ,IAAA,CAAAiL,GAAA8P,EAAA7P,OAAAhL,EAAA6a,EAAA5a,UA8mBrB4a,OA9mBqB7a,EACtBmK,cAAA,WACE,OAAO/G,UAAc8G,GACvB,EAAClK,EAQY8a,UAAA,SACXC,EACA3O,OAAe4O,IAAAlQ,EASoBhL,KALnC,GAFKib,EAAQE,gBAAeF,EAAQE,cAAgB,IAE/CF,EAAQpV,OAASoV,EAAQJ,OAAQ,CACpC,IAAAO,EAAyBtB,KAAXe,EAAMO,EAANP,OACdI,EAAQpV,KADIuV,EAAJvV,KAERoV,EAAQJ,OAASA,CAClB,CAAA,IAAAQ,EACGJ,EAAQE,cAAa,OAAA1U,QAAAC,QAAUsE,EAAKsQ,8BAA4BzU,cAAA0U,GAApE,GAAIF,EAAAE,EACF,MAAU,IAAAtb,MAAmC,+BAG/C,GAA8B,IAA1Bgb,EAAQE,cACV,MAAM,IAAIlb,uCACX,OAAAwG,QAAAC,QACUsE,EAAKwQ,eAAeP,EAAQE,gBAActU,KAAA4U,SAAAA,GAArD,IAAoE,IAAhEA,EAAmD/G,SACrD,MAAM,IAAIzU,gCACX,OAAAwG,QAAAC,QAEoBsE,EAAKpB,SAAS8R,qBAAqBpP,YACtD2O,EAAQpV,KACRoV,EAAQJ,OACRI,EAAQE,cACRnN,GACAA,GACAiN,EAAQU,SACRV,EAAQW,aACRX,EAAQvP,QACT7E,KAAA,SATKR,GAUF,OAAAiG,EAAuDjG,EAAMkC,GAAA,eAE7DoP,EAAA,OAAAlR,QAAAC,QACeN,GACfC,EACA2E,EAAKV,+BAAuBqN,EAC5B3M,EAAKlG,eAAL6S,EAAapV,iBACbyI,EAAKpB,SAAS8R,qBACdT,EAAQpV,KACRoV,EAAQJ,OACRI,EAAQE,cACRnN,GACAA,GACAiN,EAAQU,SACRV,EAAQW,aACRX,EAAQvP,QACT7E,KAAA,SAbKgV,GAcN,IAAKA,EAAI,CACP,IAAMvW,EACJ,gFAEF,MADA/D,QAAQJ,MAAMmE,GACRA,CACP,CAAA,OAAAmB,QAAAC,QACwBmV,EAAGvT,QAAMzB,KAA5BwB,SAAAA,GAEN,OADewB,GAAexB,EAAY,cAC5ByT,KAAK,EAAE,EACtB,EAAA,WAAQxW,GACP/D,QAAQJ,MAAK,2BAA4BmE,EAC1C,QACH,CAAC,MAAAA,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAMY6b,8BAAkB,IACFtV,OAAAA,QAAAC,QAAJ1G,KAAK4J,SAASmS,sBAAoBlV,KAClDY,OACT,CAAC,MAAAnC,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAMY8b,gCAAoB,IACFvV,OAAAA,QAAAC,QAAJ1G,KAAK4J,SAASoS,wBAAsBnV,KACtDY,OACT,CAAC,MAAAnC,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAMY6X,oBAAQ,IACKtR,OAAAA,QAAAC,QAAJ1G,KAAK4J,SAAS8B,QAEpC,CAAC,MAAApG,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAMYob,2BAA0B,eACb,OAAA7U,QAAAC,QAAJ1G,KAAK4J,SAAS0R,8BAA4BzU,KACvDY,OACT,CAAC,MAAAnC,UAAAmB,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAMY+b,6BAA4B,sBACfxV,QAAAC,QAAJ1G,KAAK4J,SAASsS,2BAAyBrV,KACpDY,OACT,CAAC,MAAAnC,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAOYsb,eAAc,SAACW,GAAa,QAAA5O,EACpBvN,YAAIyG,QAAAC,QAAJ6G,EAAK+N,8BAA4BzU,KAAAuV,SAAAA,GAApD,GAAID,EAAKC,EACP,MAAM,IAAInc,qCAGZ,GAAc,IAAVkc,EACF,MAAM,IAAIlc,MAAK,iCAChB,OAAAwG,QAAAC,QACsB6G,EAAK3D,SAAS4R,eAAeW,GAEtD,EAAA,CAAC,MAAA7W,UAAAmB,QAAA+B,OAAAlD,KAAApF,EAOYmc,iBAAgB,SAACF,GAAa,IACd1V,OAAAA,QAAAC,QAAJ1G,KAAK4J,SAASyS,iBAAiBF,GAExD,CAAC,MAAA7W,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAOYoc,wBAAe5O,GAAiB,IACd,OAAAjH,QAAAC,QAAJ1G,KAAK4J,SAAS2S,UAAU7O,GAEnD,CAAC,MAAApI,GAAA,OAAAmB,QAAA+B,OAAAlD,KAAApF,EAOYsc,SAAA,SAASC,GAAkB,WACLhW,QAAAC,QAAJ1G,KAAK4J,SAAS8S,WAAWD,GAExD,CAAC,MAAAnX,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EASYyc,eAAc,SACzBhS,EACAiS,EACAtQ,GAAe,IAAAuQ,IAAAjM,EAEJ5Q,KAAIyG,OAAAA,QAAAC,QAAJkK,EAAKmH,YAAUlR,KAAA,SAAAqS,GAA1B,GAAIA,IAA4BvO,EAC9B,MAAU,IAAA1K,MAAmC,+BAE/C,GAAI2c,IAAoB5O,GACtB,UAAU/N,MAAuC,mCAClD,OAAAwG,QAAAC,QAEoBkK,EAAKhH,SAASkT,oBAAoBxQ,YAAYsQ,IAAgB/V,KAA7ER,SAAAA,GAAM8S,IAAAA,SACR7M,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACAuK,EAAKtG,wBACM,OADiB6O,EAC5BvI,EAAK9L,aAAM,EAAXqU,EAAa5W,iBACbqO,EAAKhH,SAASkT,oBACdF,GAGJ,EAAA,EAAA,CAAC,MAAAtX,GAAA,OAAAmB,QAAA+B,OAAAlD,KAAApF,EASY6c,mBAAA,SACXpS,EACAwQ,EACA7O,GAAe,QAAA0Q,EAEJhd,KAAIyG,OAAAA,QAAAC,QAAJsW,EAAKjF,YAAUlR,KAAA,SAAAoW,GAA1B,GAAIA,IAA4BtS,EAC9B,UAAU1K,qCACX,OAAAwG,QAAAC,QAC0BsW,EAAK1B,8BAA4BzU,KAAAqW,SAAAA,GAA5D,GAAI/B,EAAa+B,EACf,MAAM,IAAIjd,qCAGZ,GAAsB,IAAlBkb,EACF,MAAM,IAAIlb,MAAK,iCAChB,OAAAwG,QAAAC,QAEoBsW,EAAKpT,SAASuT,wBAAwB7Q,YAAY6O,IAActU,cAA/ER,GAAM,IAAA+W,EACR,OAAA9Q,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACA2W,EAAK1S,wBACL8S,OAD4BA,EAC5BJ,EAAKlY,aAALsY,EAAAA,EAAa7a,iBACbya,EAAKpT,SAASuT,wBACdhC,GAIJ,EAAA,EAAA,EAAA,CAAC,MAAA7V,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EASYmd,sBAAA,SACX1S,EACAwQ,EACA7O,GAAe,QAAA2E,EAEJjR,YAAIyG,QAAAC,QAAJuK,EAAK8G,YAAUlR,KAAAyW,SAAAA,GAA1B,GAAIA,IAA4B3S,EAC9B,MAAM,IAAI1K,qCACX,OAAAwG,QAAAC,QAC0BuK,EAAKqK,8BAA4BzU,KAAA0W,SAAAA,GAA5D,GAAIpC,EAAaoC,EACf,MAAM,IAAItd,MAAK,+BAGjB,GAAsB,IAAlBkb,EACF,MAAU,IAAAlb,MAAqC,iCAChD,OAAAwG,QAAAC,QAEoBuK,EAAKrH,SAAS4T,2BAA2BlR,YAC5D6O,IACDtU,KAAA,SAFKR,GAAMoX,IAAAA,EAGR,OAAAnR,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACA4K,EAAK3G,wBACLmT,OAD4BA,EAC5BxM,EAAKnM,aAAL2Y,EAAAA,EAAalb,iBACb0O,EAAKrH,SAAS4T,2BACdrC,SAIJ,CAAC,MAAA7V,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EASYwd,iBAAgB,SAC3B/S,EACAiS,EACAtQ,OAAeqR,IAAAxL,EAEJnS,KAAI,OAAAyG,QAAAC,QAAJyL,EAAK4F,YAAUlR,cAAA+S,GAA1B,GAAIA,IAA4BjP,EAC9B,MAAM,IAAI1K,MAAK,+BAEjB,GAAI2c,IAAoB5O,GACtB,MAAU,IAAA/N,MAAuC,mCAClD,OAAAwG,QAAAC,QAEoByL,EAAKvI,SAAS8T,iBAAiBpR,YAAYsQ,IAAgB/V,KAAA,SAA1ER,GAAMwT,IAAAA,SACRvN,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACA8L,EAAK7H,wBACM,OADiBuP,EAC5B1H,EAAKrN,aAAM,EAAX+U,EAAatX,iBACb4P,EAAKvI,SAAS8T,iBACdd,GACD,EAAA,EAGH,CAAC,MAAAtX,UAAAmB,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EASY0d,qBAAoB,SAC/BjT,EACAwQ,EACA7O,OAAeuR,IAAApL,EAEJzS,KAAIyG,OAAAA,QAAAC,QAAJ+L,EAAKsF,YAAUlR,KAAA,SAAAiX,GAA1B,GAAIA,IAA4BnT,EAC9B,MAAU,IAAA1K,MAAmC,+BAC9C,OAAAwG,QAAAC,QAC0B+L,EAAKwJ,gCAA8BpV,KAAA,SAAAkX,GAA9D,GAAI5C,EAAa4C,EACf,UAAU9d,MAAmC,+BAG/C,GAAsB,IAAlBkb,EACF,MAAM,IAAIlb,uCACX,OAAAwG,QAAAC,QACU+L,EAAK4J,iBAAiBlB,IAActU,KAAA,SAAAmX,GAA/C,IAA8D,IAA1DA,EAA6CtJ,SAC/C,UAAUzU,MAAoC,gCAC/C,OAAAwG,QAAAC,QAEoB+L,EAAK7I,SAASgU,qBAAqBtR,YAAY6O,IAActU,cAA5ER,GAAM,IAAA4X,EAAA,OACR3R,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACAoM,EAAKnI,wBACM,OADiB2T,EAC5BxL,EAAK3N,aAAM,EAAXmZ,EAAa1b,iBACbkQ,EAAK7I,SAASgU,qBACdzC,GAIJ,EAAA,EAAA,EAAA,EAAA,CAAC,MAAA7V,GAAA,OAAAmB,QAAA+B,OAAAlD,KAAApF,EASYge,wBAAA,SACXvT,EACAwQ,EACA7O,GAAe,QAAAwH,EAEJ9T,KAAIyG,OAAAA,QAAAC,QAAJoN,EAAKiE,YAAUlR,KAAAsX,SAAAA,GAA1B,GAAIA,IAA4BxT,EAC9B,MAAM,IAAI1K,MAAK,+BAChB,OAAAwG,QAAAC,QAC0BoN,EAAKmI,gCAA8BpV,KAAAuX,SAAAA,GAA9D,GAAIjD,EAAaiD,EACf,MAAM,IAAIne,MAAK,+BAGjB,GAAsB,IAAlBkb,EACF,MAAU,IAAAlb,MAAqC,iCAChD,OAAAwG,QAAAC,QACUoN,EAAKuI,iBAAiBlB,IAActU,KAAAwX,SAAAA,GAA/C,IAA8D,IAA1DA,EAA6C3J,SAC/C,MAAU,IAAAzU,MAAkC,8BAC7C,OAAAwG,QAAAC,QAEoBoN,EAAKlK,SAASsU,wBAAwB5R,YAAY6O,IAActU,KAAA,SAA/ER,GAAMiY,IAAAA,SACRhS,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACAyN,EAAKxJ,+BAAuBgU,EAC5BxK,EAAKhP,eAALwZ,EAAa/b,iBACbuR,EAAKlK,SAASsU,wBACd/C,GACD,EAAA,EAAA,EAAA,EAGH,CAAC,MAAA7V,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAaYqe,iCACXC,EACAlS,GAAe,IAAA,IAAAmS,EAMMze,KAJrB,GAAIwe,EAAOlE,OAAS,GAClB,UAAUra,yBACX,OAAAwG,QAAAC,QAEoB+X,EAAK7U,SAAS2U,wBAAwBjS,YAAYkS,IAAO3X,KAAxER,SAAAA,OAAMqY,EAAA,OACRpS,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACAoY,EAAKnU,wBACM,OADiBoU,EAC5BD,EAAK3Z,aAAM,EAAX4Z,EAAanc,iBACbkc,EAAK7U,SAAS2U,wBACdC,GACD,EAGH,CAAC,MAAAlZ,UAAAmB,QAAA+B,OAAAlD,KAAApF,EAUYye,uBAAA,SACXC,EACAC,EACAvS,GAAe,QAAAwS,EAEa9e,KAAIyG,OAAAA,QAAAC,QAAJoY,EAAKC,qBAAqBF,IAAShY,cAAzDmY,GAAa,OAAAvY,QAAAC,QAEEoY,EAAKlV,SAASqV,mBAAmB3S,YACpDsS,EACAI,IACDnY,KAAA,SAHKR,GAAM6Y,IAAAA,EAIR,OAAA5S,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACAyY,EAAKxU,wBACL4U,OAD4BA,EAC5BJ,EAAKha,aAALoa,EAAAA,EAAa3c,iBACbuc,EAAKlV,SAASqV,mBACdL,EACAI,GAIJ,EAAA,EAAA,CAAC,MAAA1Z,GAAA,OAAAmB,QAAA+B,OAAAlD,KAAApF,EAWYif,oCAAA,SACXP,EACAC,EACAO,EACA9S,GAAe,IAAA,IAAAsI,EAEa5U,KAAIyG,OAAAA,QAAAC,QAAJkO,EAAKmK,qBAAqBF,IAAShY,cAAzDmY,GAAa,OAAAvY,QAAAC,QACKkO,EAAKyK,qBAAqBD,IAAUvY,KAAtDyY,SAAAA,GAAS7Y,OAAAA,QAAAC,QAEMkO,EAAKhL,SAAS2V,gCAAgCjT,YACjEsS,EACAI,EACAM,IACDzY,KAAA,SAJKR,GAAMyO,IAAAA,SAKRxI,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACAuO,EAAKtK,+BAAuBwK,EAC5BF,EAAK9P,eAALgQ,EAAavS,iBACbqS,EAAKhL,SAAS2V,gCACdX,EACAI,EACAM,GAIJ,EAAA,EAAA,EAAA,CAAC,MAAAha,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAWYsf,oCAAA,SACXZ,EACAC,EACAY,EACAnT,GAAe,IAAA,IAAA0I,EAEahV,YAAIyG,QAAAC,QAAJsO,EAAK+J,qBAAqBF,IAAShY,KAAA,SAAzDmY,GAAa,OAAAvY,QAAAC,QAEgBsO,EAAKvM,cACtC,KACAgX,EAAgB1T,WAChB,KACDlF,KAAA6Y,SAAAA,GAAA,OAJDD,EAAgB1T,WAAU2T,EAIzBjZ,QAAAC,QAEiCsO,EAAKvM,cACrC,KACAgX,EAAgB5T,UAChB,KACDhF,KAAA,SAAA8Y,GAAA,OAJDF,EAAgB5T,UAAS8T,EAIxBlZ,QAAAC,QAEoBsO,EAAKpL,SAASgW,gCAAgCtT,YACjEsS,EACAI,EACAS,IACD5Y,KAAA,SAJKR,GAAM4O,IAAAA,SAKR3I,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACA2O,EAAK1K,wBACM,OADiB2K,EAC5BD,EAAKlQ,aAAM,EAAXmQ,EAAa1S,iBACbyS,EAAKpL,SAASgW,gCACdhB,EACAI,EACAS,WAIJ,CAAC,MAAAna,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAOa6e,8BAAqBF,GAA+B,IAAAgB,IAC5Dha,EAAcgV,EAD8CgF,aAiBhE,IAAMjb,EAAY,CAChBia,EAASiB,OACTjB,EAASkB,iBACTlB,EAASmB,aACTnB,EAASoB,UAGPpB,EAASqB,cAEPrB,EAASva,mBACXM,EAAUub,KAAKtB,EAASva,mBAEtBua,EAASuB,iBACXxb,EAAUub,KAAKtB,EAASuB,iBAGtBvB,EAASwB,gBACXzb,EAAUub,KAAKtB,EAASwB,iBAE3B,IAAAxX,EAIU,CAACgW,EAAShZ,MAAQA,EAAMgZ,EAAShE,QAAUA,GAAOyF,EAD5CzB,EAAS1D,cAAa,OAAA1U,QAAAC,QAI7ByO,EAAK1M,cAAc,KAAMoW,EAAS0B,IAAK,KAAG1Z,KAAA2Z,SAAAA,UAAA/Z,QAAAC,QAC1CyO,EAAK1M,cAAc,KAAMoW,EAAS4B,UAAWC,IAAiB7Z,KAAA,SAAA8Z,GANxE,MAAO,CACLxF,cAAamF,EACbM,QAAO/X,EACPjE,UAAAA,EACAic,MAAO,CAAAL,EAAAG,GAIPG,OAAQjC,EAASqB,YACb,CAACa,EAAWA,YAAC7b,KAAK2F,UAAUgU,EAASqB,eACrC,GACL,EAAA,EAAA,EAAA/K,EAvC6CnV,KAP9C,IAAK6e,EAAShZ,OAASgZ,EAAShE,OAAQ,CACrC,IAAAmG,EAAoBlH,KAAjBjU,EAAImb,EAAJnb,KAAMgV,EAAMmG,EAANnG,MACX,CAED,IAAI6F,EAAmB,GAAEO,EACrBpC,WAAAA,GAAAA,EAASoB,WAAajS,GAAY,CAAA,IAAA9E,EAAAX,cAChC9B,OAAAA,QAAAC,QACuBsC,GAAiBmM,EAAK7O,OAAQuY,EAASoB,WAASpZ,KAAA,SAAAqa,GAAzER,EAAgBQ,CAAyD,EAC1E,EAAQ/f,SAAAA,GACPK,GAAeL,MAAM,yBAA0BA,EAChD,GAAA+H,GAAAA,GAAAA,EAAArC,KAAAqC,OAAAA,EAAArC,KAAA,WAAA,EAAA,CAAA,CALCgY,GAKD,OAAApY,QAAAC,QAAAua,GAAAA,EAAApa,KAAAoa,EAAApa,KAAAgZ,GAAAA,IAqCL,CAAC,MAAAva,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAOamf,qBAAoB,SAACD,GAA4B,QAAA3J,EAenDzV,KAdLof,EAAU+B,kBAAiB/B,EAAU+B,gBAAkBnT,IAC5D,IAAMiF,GAAkC,IAAvBmM,EAAUnM,SAAqB,EAAI,EAACmO,EAIxC,CACThC,EAAUiC,iBACVjC,EAAU1T,MACV0T,EAAUhL,mBACVgL,EAAU+B,iBACXG,EANkBlC,EAAUmC,iBAAgBC,EAS3CpC,EAAUqC,kBAAiBC,EAD3BtC,EAAUuC,kBAAiB,OAAAlb,QAAAC,QAErB+O,EAAKhN,cAAc,KAAM2W,EAAUzL,UAAW,KAAG9M,KAAA,SAAA+a,GAAAnb,OAAAA,QAAAC,QACjD+O,EAAKhN,cAAc,KAAM2W,EAAUnL,UAAW,KAAGpN,KAAAgb,SAAAA,GAZ3D,MAAO,CACLC,kBAAiBR,EACjB1c,UAASwc,EAMTP,MAAO,CAAAa,EAAAF,EAAAI,EAAAC,EAKL5O,GAEH,IACH,CAAC,MAAA3N,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAAyV,CAAAA,EAAAA,CAAA,EA9mB6BjQ,ICkBtB,SAAAiX,GAAAC,EAAWC,EAAQC,GACpB,IAAAF,EAAAG,EAAA,CACF,GAAAD,aAAAE,GAAA,CACF,IAAAF,EAAAC,EAML,YADCD,EAAAG,EAAAN,GAAAO,KAAA,KAAAN,EAAAC,IAJE,EAAAA,IAACA,IAAcE,GAEfD,EAAAA,EAAAK,uEAUGP,EAACG,IAGLH,EAAAO,EACgBL,QAEGM,EAAAR,EAAAK,EACnBG,KAEMR,IA/DD,IAAEI,2BACF,SAAAA,KAiCH,OAhC+CA,EAAAjiB,UAAA0G,KAAA,SAAA4b,EAAAC,GAC5C,IAAAhQ,EAAA,IAAA0P,EAC+DH,EAAAjiB,KAAAmiB,EACtE,GAAAF,EAAgB,CAChB,IAAAU,EAAA,EAAAV,EAAAQ,EAAAC,6BAIG,CAAA,MAAApd,GACHyc,KAA0C,EAAAzc,EACxC,CACE,OAAAoN,EAEE,OACA1S,IACD,QACDA,KAAAqiB,EAAA,YACD,IAAC,IAAAH,EAAclX,EAAAuX,IACdvX,EAAAmX,EACDJ,GAAArP,EAAA,EAAA+P,EAAAA,EAAAP,GAAAA,GACFQ,EAEDX,GAAArP,EAAA,EAAAgQ,EAAAR,uBAKGH,GAAArP,EAAA,EAAApN,EACG,GAEiEoN,CACnE,EACA0P,iBAwCeQ,GACf,OAAAA,iBAAkB,EAAAA,EAAAT,CAChB,KAtBgBU,GAAA,SACpBnX,EACAoX,EACAC,EACAC,OAGA,IAAMC,EAAmC,iBAAbF,EAEtBG,EAAgB,IAAInI,GAAW+H,EAAoBpX,EAAOsX,GAAQ,OAAAvc,QAAAC,QACxCwc,EAAcjH,gCAA8BpV,KAAtEsc,SAAAA,GAAiBjI,IAAAA,WAAArS,EAAAua,GAAAlI,OAAAA,EAAAkI,GAwBf,CAAC,CAvBJ,IAAIC,EAAI,EAACna,uqBAAAoa,CAAA,WAAA,OAAApI,GAAEmI,GAAKF,CAAiB,EAAA,WAAA,OAAEE,GAAG,EAAE,WAAA,OAAA5c,QAAAC,QACfwc,EAAc7G,iBAAiBgH,IAAExc,KAAvD0c,SAAAA,GAEN,IAAMC,EAAgB,IAAIna,EAAMA,OAACC,SAC/Bia,EAAc3G,gBACd6G,UAAcrZ,IACdsB,GACD,OAGGuX,EAAYxc,QAAAC,QACG8c,EAAcE,SAAO7c,KAAhC8c,SAAAA,MACFJ,EAAc7O,UAAYiP,EAAGvc,aAAe2b,EAAS3b,kBAAU8T,IAC1DmI,CAEJ,GACLE,EAAc7O,UACd6O,EAAc3G,kBAAoBmG,EAAS3b,YAC3C8T,EAAA,EACOmI,QAJF,CAMR,EAAA,GAAAna,OAAAA,GAAAA,EAAArC,KAAAqC,EAAArC,KAAAgC,GAAAA,EAAAK,IAGH,CAAC,MAAA5D,GAAA,OAAAmB,QAAA+B,OAAAlD,EA9ED,CAAA,ECMase,gBAAI,SAAA7Y,GAAA,SAAA6Y,IAAA7Y,OAAAA,EAAAxK,MAAAP,KAAAY,YAAAqK,IAAAA,CAAAA,GAAA2Y,EAAA7Y,OAAA7K,EAAA0jB,EAAAzjB,UA2xBd,OA3xBcD,EACfmK,cAAA,WACE,OAAOwZ,EAAc,QAACzZ,GACxB,EAAClK,EAkBY4jB,yBACXrH,EACA9R,EACAmV,EACAC,EACAC,EACAC,EACAQ,EACAF,EACA1a,EACAgV,EACAM,EACA+E,EACA6D,EACA3D,EACAC,EACA/T,GAAe,IAAA4O,IAAAlQ,EAEJhL,KAAI,OAAAyG,QAAAC,QAAJsE,EAAKgZ,kBAAkBvH,EAAY9R,IAAQ9D,KAAA,SAAAod,GAAtD,IAAwE,IAApEA,EAAoDC,YACtD,MAAM,IAAIjkB,MAAK,mCAKjB,GAHKkb,IAAeA,EAAgB,IAG/BtV,IAASgV,EAAQ,CACnB,IAAAO,EAAoBtB,KAAjBjU,EAAIuV,EAAJvV,KAAMgV,EAAMO,EAANP,MACX,CAGD,IAAMsJ,EAAcnZ,EAAKN,YAAY+R,GAErC,IAAKzR,EAAK1E,OAAOK,SACf,MAAM,IAAI1G,MAAM,0CACjB,OAAAwG,QAAAC,QACyBsE,EAAK1E,OAAOK,SAASC,cAAYC,KAAAC,SAAAA,GAAnD,IAAApF,EAAOoF,EAAPpF,QAAOme,SAAAA,QAAAuE,EAUMD,EAAYE,YAAW1U,EAAvByU,EAAwB9X,YAAWzD,EAEtD,CAAChD,EAAMgV,GAAOyJ,EADdnJ,EAAa1U,OAAAA,QAAAC,QAILsE,EAAKvC,cAAc,KAAM8X,EAAK,KAAG1Z,KAAA,SAAA0d,GAAA,OAAA9d,QAAAC,QACjCsE,EAAKvC,cAAc,KAAMgY,EAAW,KAAG5Z,cAAA2d,GAAA,OAAA/d,QAAAC,QAAAiJ,EAAAhP,KAAAyjB,EAAAE,EAAAzb,EAH/C,CAACiX,EAAQC,EAAkBC,EAAcC,GACzC,CAAAsE,EAAAC,GAIA,KAAE3d,KAAA,SARER,GAAM,IAAAsR,EAUZ,GAAIrL,EAAa,OAA0CjG,EAE3D,IAAMzB,EAAY,CAACkb,EAAQC,EAAkBC,EAAcC,GACvD8D,IACFnf,EAAUub,KAAK4D,EAAmBU,eAEhC7f,EAAUub,KADRC,EACaA,EAAgBqE,cAEhBzW,IAGfpJ,EAAUub,KADRE,GAGarS,KAElB,IAAA9E,EAQC,CAACrD,EAAMgV,GAAO6J,EADdvJ,EAAawJ,EADbR,EAAYE,YAAWO,EADvBjN,OACuBA,EADvB3M,EAAKlG,aAAL6S,EAAAA,EAAapV,iBAAgBsiB,EAD7B7Z,EAAKV,wBAAuB7D,OAAAA,QAAAC,QAOpBsE,EAAKvC,cAAc,KAAM8X,EAAK,KAAG1Z,KAAA,SAAAie,GAAAre,OAAAA,QAAAC,QACjCsE,EAAKvC,cAAc,KAAMgY,EAAW,KAAG5Z,KAAAke,SAAAA,UAAAte,QAAAC,QAVhCN,GACfC,EAAMwe,EAAAD,EAAAD,EAAAD,EAAAxb,EAMNtE,EACA,CAAAkgB,EAAAC,GAIA7E,EAAc,CAACa,EAAWA,YAACb,IAAgB,KAC5CrZ,cAbKgV,GAAE,OAAApV,QAAAC,QAciBmV,EAAGvT,QAAMzB,KAA5BwB,SAAAA,GACN,IAAM2c,EAAQnb,GAAexB,EAAY,gBACzC,OAAO2c,MAAAA,OAAAA,EAAAA,EAAOlJ,KAAK,EAAE,EApDrB,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA,IAAMmJ,ED3CM,SAAoCC,GAClD,IAEE,IAAMC,EAtBM,WACd,IACE,GAAIliB,QAAQC,IAAI+B,aAAc,CAE5B,IAAMkgB,EAAO/f,EAAE,QAACC,aAAapC,QAAQC,IAAI+B,aAAc,QACvD,OAAOC,KAAKC,MAAMggB,EACnB,CACD,OAAOC,EACR,OAAA,CAAC,MAAOjkB,GACP,OAAOikB,EACR,OAAA,CACH,CAWiBC,GACb,GAAIF,EAEF,IADA,IAAMG,EAAWC,OAAOC,KAAKL,GAC7BM,EAAAC,EAAAA,EAAsBJ,EAAQG,EAAAC,EAAApL,OAAAmL,IAAE,CAA3B,IAAM9jB,EAAO+jB,EAAAD,GAChB,GAAIN,EAAKxjB,GAASD,UAAYwjB,EAC5B,OAAOC,EAAKxjB,EAEf,CAEJ,CAAC,MAAOR,GACPI,QAAQJ,MAAMA,EACf,CACD,OACF,IAAA,CC2BsBwkB,CAAoCle,OAAO/F,IAASuf,gBAClEf,EAAW,OAAAzZ,QAAAC,QACSmc,GACpB7X,EAAK1E,OACL2e,EAAU3hB,cACV,EACAmE,OAAO/F,KACRmF,KAAA,SAAA+e,GALDzK,EAAayK,CAKZ,EAAA,IAAA,OAAA3E,GAAAA,EAAApa,KAAAoa,EAAApa,KAAAgZ,GAAAA,GAAA,EAAA,EA8CL,CAAC,MAAAva,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAUY2lB,WAAA,SACXpJ,EACA9R,EACAmb,EACAxZ,OAAeyZ,IAAAxZ,EAEKvM,KAAdmkB,EAAc5X,EAAK7B,YAAY+R,GAAW,OAAAhW,QAAAC,QAErC6F,EAAKyZ,YAAYvJ,IAAW5V,KAAA,SAAAof,GAAvC,GAAIA,IAAyCtb,EAC3C,MAAU,IAAA1K,MAAK,2BAChB,OAAAwG,QAAAC,QAEoByd,EAAY0B,WAAWvZ,YAAYwZ,IAAQjf,cAA1DR,GAAM,IAAAmG,EACR,OAAAF,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACAkG,EAAKjC,+BAAuBkC,EAC5BD,EAAKzH,eAAL0H,EAAajK,iBACb4hB,EAAY0B,WACZC,GACD,EAAA,EAGH,CAAC,MAAAxgB,GAAAmB,OAAAA,QAAA+B,OAAAlD,KAAApF,EAUYgmB,cAAA,SACXzJ,EACA9R,EACAmb,EACAxZ,GAAe,IAAAmM,IAAA/L,EAEK1M,KAAdmkB,EAAczX,EAAKhC,YAAY+R,GAAW,OAAAhW,QAAAC,QAErCgG,EAAKsZ,YAAYvJ,IAAW5V,cAAAsf,GAAvC,GAAIA,IAAyCxb,EAC3C,UAAU1K,iCACX,OAAAwG,QAAAC,QAEoByd,EAAY+B,cAAc5Z,YAAYwZ,IAAQjf,KAA7DR,SAAAA,OAAMoE,EAAA,OACR6B,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACAqG,EAAKpC,+BAAuBG,EAC5BiC,EAAK5H,eAAL2F,EAAalI,iBACb4hB,EAAY+B,cACZJ,GAIJ,EAAA,EAAA,CAAC,MAAAxgB,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAUYkmB,qBAAoB,SAC/B3J,EACA9R,EACA0b,EACA/Z,GAAe,IAAAuQ,IAAAjQ,EAEK5M,KAAdmkB,EAAcvX,EAAKlC,YAAY+R,GAAW,OAAAhW,QAAAC,QAErCkG,EAAKoX,kBAAkBvH,EAAY9R,IAAQ9D,KAAAyf,SAAAA,GAAtD,IAAoE,IAAhEA,EAAoDR,QACtD,UAAU7lB,+BACX,OAAAwG,QAAAC,QAGoByd,EAAYoC,qBAAqBja,YAAY+Z,IAAkBxf,KAAA,SAA9ER,GAAM,IAAAwG,EACR,OAAAP,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACAuG,EAAKtC,+BAAuBuC,EAC5BD,EAAK9H,eAAL+H,EAAatK,iBACb4hB,EAAYoC,qBACZF,GAIJ,EAAA,EAAA,CAAC,MAAA/gB,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAUYsmB,wBAAA,SACX/J,EACA9R,EACA0b,EACA/Z,GAAe,IAAA,IAAAU,EAEKhN,KAAdmkB,EAAcnX,EAAKtC,YAAY+R,GAAW,OAAAhW,QAAAC,QAGvCsG,EAAKgX,kBAAkBvH,EAAY9R,IAAQ9D,KAAA,SAAA4f,GAAAC,SAAAA,EAAAC,GADpD,GACEvF,GACCzW,IAAY0b,IACyD,IAApEM,EAAoDzC,YAEtD,UAAUjkB,qDACX,OAAAwG,QAAAC,QACoByd,EAAYyC,0BAA0Bta,YACzD+Z,IACDxf,KAAA,SAFKR,GAAM,IAAA4G,EAAA,OAGRX,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACA2G,EAAK1C,wBACM,OADiB2C,EAC5BD,EAAKlI,aAAM,EAAXmI,EAAa1K,iBACb4hB,EAAYyC,0BACZP,GACD,EAAA,CAAA,IAAAjF,GAjBiE,IAAhEqF,EAAoDX,eAAgB1E,GACnEzW,IAAY0b,EAAiBK,EAAAtF,GAA7BzW,IAAY0b,GACJrZ,EAAKgX,kBAAkBvH,EAAY9R,IAAQlE,QAAAC,QAAA0a,GADnDzW,IAAY0b,GACJrZ,EAAKgX,kBAAkBvH,EAAY9R,IAAQ9D,KAAA6f,EAAA,EAkBxD,CAAC,MAAAphB,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAUY2mB,mBAAA,SACXpK,EACA9R,EACAmc,EACAxa,OAAeya,IAAA3Z,EAEKpN,KAAdmkB,EAAc/W,EAAK1C,YAAY+R,GAAW,OAAAhW,QAAAC,QAErC0G,EAAK4W,kBAAkBvH,EAAY9R,IAAQ9D,KAAAmgB,SAAAA,GAAtD,IAAoE,IAAhEA,EAAoDlB,QACtD,UAAU7lB,MAA6B,yBACxC,OAAAwG,QAAAC,QAEoByd,EAAY8C,kBAAkB3a,YAAYwa,IAAgBjgB,KAAzER,SAAAA,GAAMgH,IAAAA,EACR,OAAAf,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACA+G,EAAK9C,wBACM,OADiB+C,EAC5BD,EAAKtI,aAAM,EAAXuI,EAAa9K,iBACb4hB,EAAY8C,kBACZH,GAGJ,EAAA,EAAA,CAAC,MAAAxhB,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAUYgnB,sBAAqB,SAChCzK,EACA9R,EACAmc,EACAxa,OAAe6a,IAAA5Z,EAEKvN,KAAdmkB,EAAc5W,EAAK7C,YAAY+R,GAAW,OAAAhW,QAAAC,QAEvC6G,EAAKyW,kBAAkBvH,EAAY9R,IAAQ9D,cAAAugB,GAAAC,SAAAA,EAAAC,GADpD,GACEC,GACC5c,IAAYmc,IAC4D,IAAvEQ,EAAoDE,eAEtD,MAAM,IAAIvnB,oDACX,OAAAwG,QAAAC,QAEoByd,EAAYsD,uBAAuBnb,YAAYwa,IAAgBjgB,KAA9ER,SAAAA,OAAMmH,EAAA,OACRlB,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACAkH,EAAKjD,wBACLkD,OAD4BA,EAC5BD,EAAKzI,aAAL0I,EAAAA,EAAajL,iBACb4hB,EAAYsD,uBACZX,GACD,EAAA,CAAA,IAAAS,GAhBiE,IAAhEH,EAAoDtB,eAAgByB,GACnE5c,IAAYmc,EAAeO,EAAAE,GAA3B5c,IAAYmc,GACJvZ,EAAKyW,kBAAkBvH,EAAY9R,IAAQlE,QAAAC,QAAA6gB,GADnD5c,IAAYmc,GACJvZ,EAAKyW,kBAAkBvH,EAAY9R,IAAQ9D,KAAAwgB,IAgBxD,CAAC,MAAA/hB,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAUYwnB,yBACXjL,EACA9R,EACAgd,EACArb,GAAe,IAAA,IAAA4D,EAEKlQ,KAAdmkB,EAAcjU,EAAKxF,YAAY+R,GAAW,OAAAhW,QAAAC,QAErCwJ,EAAK8T,kBAAkBvH,EAAY9R,IAAQ9D,KAAA,SAAA+gB,GAAtD,IAAoE,IAAhEA,EAAoD9B,QACtD,MAAM,IAAI7lB,+BACX,OAAAwG,QAAAC,QAEoByd,EAAY0D,kBAAkBvb,YAAYqb,IAAa9gB,KAAtER,SAAAA,OAAM8J,EAAA,OACR7D,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACA6J,EAAK5F,+BAAuB6F,EAC5BD,EAAKpL,eAALqL,EAAa5N,iBACb4hB,EAAY0D,kBACZF,GAIJ,EAAA,EAAA,CAAC,MAAAriB,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAUY4nB,mBAAkB,SAC7BrL,EACA9R,EACAgd,EACArb,OAAeyb,IAAA1X,EAEKrQ,KAAdmkB,EAAc9T,EAAK3F,YAAY+R,GAAW,OAAAhW,QAAAC,QAEvC2J,EAAK2T,kBAAkBvH,EAAY9R,IAAQ9D,KAAA,SAAAmhB,GAAAC,SAAAA,EAAAC,GADpD,GACEC,GACCxd,IAAYgd,IACmD,IAA9DO,EAAoDE,MAEtD,MAAU,IAAAnoB,MAAK,0CAChB,OAAAwG,QAAAC,QAEoByd,EAAYkE,uBAAuB/b,YAAYqb,IAAa9gB,KAA3ER,SAAAA,OAAMwS,EAAA,OACRvM,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACAgK,EAAK/F,wBACLuO,OAD4BA,EAC5BxI,EAAKvL,aAAL+T,EAAAA,EAAatW,iBACb4hB,EAAYkE,uBACZV,GACD,EAAA,CAAA,IAAAQ,GAhBiE,IAAhEH,EAAoDlC,QAAgBqC,OAAAA,GACnExd,IAAYgd,EAAYM,EAAAE,GAAxBxd,IAAYgd,GACJtX,EAAK2T,kBAAkBvH,EAAY9R,IAAQlE,QAAAC,QAAAyhB,GADnDxd,IAAYgd,GACJtX,EAAK2T,kBAAkBvH,EAAY9R,IAAQ9D,KAAAohB,EAiBxD,EAAA,CAAC,MAAA3iB,UAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAYYooB,0BACX7L,EACA9R,EACA2B,GAAe,QAAAkE,EAEKxQ,KAAdmkB,EAAc3T,EAAK9F,YAAY+R,GAAW,OAAAhW,QAAAC,QACrC8J,EAAKwV,YAAYvJ,IAAW5V,KAAA0hB,SAAAA,GAAvC,GAAIA,IAAyC5d,EAC3C,MAAU,IAAA1K,MAA+B,2BAC1C,OAAAwG,QAAAC,QAEoByd,EAAYmE,iBAAiBhc,eAAazF,KAAA,SAAzDR,GAAM,IAAA2S,EAAA,OACR1M,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACAmK,EAAKlG,wBACM,OADiB0O,EAC5BxI,EAAK1L,aAAM,EAAXkU,EAAazW,iBACb4hB,EAAYmE,sBAIhB,CAAC,MAAAhjB,GAAA,OAAAmB,QAAA+B,OAAAlD,KAAApF,EAYYsoB,YAAA,SACX/L,EACAgM,EACAC,EACAC,EACArc,GAAe,IAAA,IAAAsE,EAEK5Q,KAAdmkB,EAAcvT,EAAKlG,YAAY+R,GAAW,OAAAhW,QAAAC,QACrCkK,EAAKoV,YAAYvJ,IAAW5V,KAAA,SAAA+hB,GAAvC,GAAIA,IAAyCH,EAC3C,MAAM,IAAIxoB,MAA+B,2BAG3C,IAAM4oB,EAAkBF,GAAW,EAAC,OAAAliB,QAAAC,QAEfyd,EAAY2E,aAAaxc,YAC5Cmc,EACAC,EACAG,IACDhiB,KAJKR,SAAAA,OAAM8S,EAAA,OAKR7M,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACAuK,EAAKtG,wBACL6O,OAD4BA,EAC5BvI,EAAK9L,aAALqU,EAAAA,EAAa5W,iBACb4hB,EAAY2E,aACZL,EACAC,EACAG,GACD,EAAA,EAGH,CAAC,MAAAvjB,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAYY6oB,yBACXtM,EACAgM,EACAC,EACAC,EACArc,OAAe0c,IAAAhM,EAEKhd,KAAdmkB,EAAcnH,EAAKtS,YAAY+R,GAAW,OAAAhW,QAAAC,QACrCsW,EAAKgJ,YAAYvJ,IAAW5V,KAAAoiB,SAAAA,GAAvC,GAAIA,IAAyCR,EAC3C,MAAM,IAAIxoB,MAA+B,2BAG3C,IAAM4oB,EAAkBF,GAAW,EAAC,OAAAliB,QAAAC,QAEfyd,EAAY+E,iBAAiB5c,YAChDmc,EACAC,EACAG,IACDhiB,KAAA,SAJKR,GAAM,IAAA+W,EAAA,OAKR9Q,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACA2W,EAAK1S,wBACL8S,OAD4BA,EAC5BJ,EAAKlY,aAALsY,EAAAA,EAAa7a,iBACb4hB,EAAY+E,iBACZT,EACAC,EACAG,OAIJ,CAAC,MAAAvjB,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAgBYipB,qBACX1M,EACA9R,EACAye,EACAC,EACAC,EACAC,EACApE,EACAqE,EACAC,EACAnd,OAAeod,IAAAzY,EAEKjR,KAAdmkB,EAAclT,EAAKvG,YAAY+R,GACG,OAAnCgN,IAAgBA,EAAiB,IAAEhjB,QAAAC,QAC5BuK,EAAK+S,kBAAkBvH,EAAY9R,IAAQ9D,KAAA,SAAA8iB,GAAvD,IAAKA,EAAoDnC,eACvD,UAAUvnB,wCACX,OAAAwG,QAAAC,QACoByd,EAAYyF,YAAYtd,YAC3C8c,EACAC,EACAC,EACAC,EACApE,EACAqE,EACAC,IACD5iB,KARKR,SAAAA,GAAMoX,IAAAA,SASRnR,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACA4K,EAAK3K,OACM,OADAmX,EACXxM,EAAKnM,aAAM,EAAX2Y,EAAalb,iBACb4hB,EAAYyF,YACZR,EACAC,EACAC,EACAC,EACApE,EACAqE,EACAC,OAIJ,CAAC,MAAAnkB,GAAA,OAAAmB,QAAA+B,OAAAlD,KAAApF,EAUY2pB,uBAAA,SACXpN,EACAqK,EACAgD,EACAxd,GAAe,IAAA,IAAA6F,EAEKnS,KAAdmkB,EAAchS,EAAKzH,YAAY+R,GAAW,OAAAhW,QAAAC,QACpCyL,EAAK6R,kBAAkBvH,EAAYqK,IAAgBjgB,KAAAkjB,SAAAA,GAA/D,IAAKA,EAA4DvC,eAC/D,MAAU,IAAAvnB,MAAK,kCAEjB,IAAM+pB,EAA4BvnB,GAC7BqnB,CAAAA,EAAAA,EACHL,CAAAA,eAAgBK,EAAoBL,gBAAkB,KACvD,OAAAhjB,QAAAC,QACoByd,EAAY8F,uBAAuB3d,YACtD0d,IACDnjB,KAFKR,SAAAA,GAAMwT,IAAAA,EAGR,OAAAvN,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACA8L,EAAK7L,OACM,OADAuT,EACX1H,EAAKrN,aAAM,EAAX+U,EAAatX,iBACb4hB,EAAY8F,uBACZD,OAIJ,CAAC,MAAA1kB,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAUYgqB,0BACXzN,EACA9R,EACAye,EACA9c,GAAe,IAAA,IAAAmG,EAEKzS,KAAdmkB,EAAc1R,EAAK/H,YAAY+R,GAAW,OAAAhW,QAAAC,QACpC+L,EAAKuR,kBAAkBvH,EAAY9R,IAAQ9D,KAAA,SAAAsjB,GAAvD,IAAKA,EAAoD3C,eACvD,MAAU,IAAAvnB,MAAK,kCAChB,OAAAwG,QAAAC,QAEoByd,EAAYiG,iBAAiB9d,YAAY8c,IAAcviB,KAAtER,SAAAA,OAAM4X,EAAA,OACR3R,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACAoM,EAAKnI,+BAAuB2T,EAC5BxL,EAAK3N,eAALmZ,EAAa1b,iBACb4hB,EAAYiG,iBACZhB,GAGJ,EAAA,EAAA,CAAC,MAAA9jB,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EASYmqB,YAAW,SACtB5N,EACA0I,EACA7Y,GAAe,IAAA,IAAAwH,EAEK9T,KAAdmkB,EAAcrQ,EAAKpJ,YAAY+R,GAAW,OAAAhW,QAAAC,QAC3Byd,EAAYkG,YAAY/d,YAAY,IAAK6Y,IAAKte,KAAA,SAA7DR,GAAM,IAAAiY,EAAA,OACRhS,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACAyN,EAAKxJ,wBACLgU,OAD4BA,EAC5BxK,EAAKhP,aAALwZ,EAAAA,EAAa/b,iBACb4hB,EAAYkG,YACZ,IACAlF,GACD,EAEH,CAAC,MAAA7f,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAOY8lB,YAAA,SAAYvJ,OAAkBgC,IACnC0F,EAAcnkB,KAAK0K,YAAY+R,GAAW,OAAAhW,QAAAC,QACvByd,EAAYmG,QAAQ,GAE/C,CAAC,MAAAhlB,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAQY8jB,kBAAiB,SAACvH,EAAoB9R,GAAe,QAC1DwZ,EAAcnkB,KAAK0K,YAAY+R,GAAW,OAAAhW,QAAAC,QAC5Byd,EAAYoG,eAAe5f,GAEjD,CAAC,MAAArF,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAOYsqB,qBAAY/N,GAAkB,QACnC0H,EAAcnkB,KAAK0K,YAAY+R,GAAW,OAAAhW,QAAAC,QACnCyd,EAAYsG,cAC3B,CAAC,MAAAnlB,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAQYwqB,6BACXjO,EACA9R,OAAeqK,IAETmP,EAAcnkB,KAAK0K,YAAY+R,GAAW,OAAAhW,QAAAC,QACdyd,EAAYwG,gBAAgBhgB,GAEhE,CAAC,MAAArF,UAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAYY0qB,QAAA,SACXnO,EACA9R,EACAkgB,EACA3I,EACA5V,GAAe,QAAA6I,EAEJnV,KAAIyG,OAAAA,QAAAC,QAAJyO,EAAK6O,kBAAkBvH,EAAY9R,IAAQ9D,KAAAikB,SAAAA,GAAtD,IAAkE,IAA9DA,EAAoD1C,MACtD,MAAM,IAAInoB,yCAGZ,IAAMkkB,EAAchP,EAAKzK,YAAY+R,GAC/BsO,EAAUC,EAAAA,UAAUH,GACpBI,EAAWC,EAAAA,QAAQnK,EAAAA,YAAYmB,IAAO,OAAAzb,QAAAC,QAEvByd,EAAYgH,WAAW7e,YAAYye,EAASE,IAASpkB,KAAA,SAApER,GAAMkP,IAAAA,EACR,OAAAjJ,EAA0CjG,EAAMI,QAAAC,QAC3BN,GACvBC,EACA8O,EAAK7K,wBACLiL,OAD4BA,EAC5BJ,EAAKrQ,aAALyQ,EAAAA,EAAahT,iBACb4hB,EAAYgH,WACZJ,EACAE,GAIJ,EAAA,EAAA,CAAC,MAAA3lB,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAQYkrB,QAAO,SAAC3O,EAAoBoO,GAAW,IAAApV,IAC5C0O,EAAcnkB,KAAK0K,YAAY+R,GAC/BsO,EAAUC,EAASA,UAACH,GAAI,OAAApkB,QAAAC,QACXyd,EAAYiH,QAAQL,IAAQlkB,KAAA,SAAzCse,GACN,OAAOA,EAAOkG,EAAYA,aAAClG,GAAQ,IAAI,EACzC,CAAC,MAAA7f,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAQYorB,YAAW,SAAC7O,EAAoBkH,GAAU,QAC/CQ,EAAcnkB,KAAK0K,YAAY+R,GAAW,OAAAhW,QAAAC,QAC7Byd,EAAYxI,SAASgI,GAE1C,CAAC,MAAAre,GAAAmB,OAAAA,QAAA+B,OAAAlD,KAAApF,EAQYqrB,oBAAA,SACX9O,EACA+O,GAAwB,IAAA,IAElBrH,EAAcnkB,KAAK0K,YAAY+R,GAAW,OAAAhW,QAAAC,QAC7Byd,EAAYsH,WAAWD,GAE5C,CAAC,MAAAlmB,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAA,CAAA,EAAAse,CAAA,CA3xBc,CAAQzZ,ICIZuhB,gBAAU,SAAA3gB,GAgBrB,SAAA2gB,EACEplB,EACA3E,EACAmD,EACAsF,EACAuhB,GAAyB3gB,IAAAA,EAIe,OAFxCA,EAAAD,EAAApK,KAAAX,KAAMsG,EAAQ3E,EAASmD,EAAQsF,IAAIpK,MAtB9B2rB,mBAAa3gB,EAAAA,EACb4gB,WAsBL5gB,EAAK2gB,cAAgBA,GAAkBE,EAAAA,QAAwBzhB,IAC/DY,EAAK4gB,IAAM,IAAIhI,GAAI5Y,EAAK1E,OAAQ3E,GAAQqJ,CAC1C,CAACC,GAAAygB,EAAA3gB,GAAA7K,IAAAA,EAAAwrB,EAAAvrB,UAm2BA,OAn2BAD,EAtBDmK,cAAA,WACE,OAAOoZ,EAAAA,QAAcrZ,GACvB,EAAClK,EA8BY4rB,QAAA,SACXzf,EACA0f,EACApjB,EACA2D,GAAe,IAAA,IAAAC,EAEIvM,KAAbgsB,EAAazf,EAAK7B,YAAY2B,GAAU,OAAA5F,QAAAC,QACzBslB,EAAWF,QAAQxf,YACtCyf,EACAtjB,GAAc,KAAM,KAAME,EAAQ,MACnC9B,cAHKR,GAAM,IAAAmG,EAAA,OAIRF,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACAkG,EAAKjC,+BAAuBkC,EAC5BD,EAAKzH,eAAL0H,EAAajK,iBACbypB,EAAWF,QACXC,EACAtjB,GAAc,KAAM,KAAME,EAAQ,KAGtC,EAAA,CAAC,MAAArD,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAUY+rB,gBAAA,SACX5f,EACA1B,EACAuhB,EACA5f,GAAe,IAAA4O,IAAAxO,EAEI1M,KAAbgsB,EAAatf,EAAKhC,YAAY2B,GAAU,OAAA5F,QAAAC,QAClCgG,EAAKge,oBAAoBre,EAAW1B,IAAQ9D,KAAAslB,SAAAA,GAAxD,IAAIA,EACF,MAAU,IAAAlsB,MAAsC,kCAE7CisB,EAAgB/K,kBAAiB+K,EAAgB/K,gBAAkBnT,IAExE,IAAMiF,GAAwC,IAA7BiZ,EAAgBjZ,SAAqB,EAAI,EAAC,OAAAxM,QAAAC,QAItCslB,EAAWC,gBAAgB3f,YAC9C4f,EAAgB3K,iBAChB,CACE2K,EAAgB7K,iBAChB6K,EAAgBxgB,MAChBwgB,EAAgB9X,mBAChB8X,EAAgB/K,iBAElB,CACE+K,EAAgBvK,kBAChBuK,EAAgBzK,kBAChByK,EAAgBvY,UAChBuY,EAAgBjY,UAChBhB,KAEHpM,KAAA,SAfKR,GAAMoE,IAAAA,EAgBR,OAAA6B,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACAqG,EAAKpC,+BAAuBG,EAC5BiC,EAAK5H,eAAL2F,EAAalI,iBACbypB,EAAWC,gBACXC,EAAgB3K,iBAChB,CACE2K,EAAgB7K,iBAChB6K,EAAgBxgB,MAChBwgB,EAAgB9X,mBAChB8X,EAAgB/K,iBAElB,CACE+K,EAAgBvK,kBAChBuK,EAAgBzK,kBAChByK,EAAgBvY,UAChBuY,EAAgBjY,UAChBhB,IAIN,EAAA,EAAA,CAAC,MAAA3N,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAWYksB,gBAAA,SACX/f,EACA1B,EACAzI,EACAud,EACAnT,OAAeyZ,IAAAnZ,EAEH5M,YAAIyG,QAAAC,QAAJkG,EAAK8d,oBAAoBre,EAAW1B,IAAQ9D,KAAAwlB,SAAAA,GAAxD,IAAIA,EACF,MAAU,IAAApsB,MAAK,kCAGjB,IAAM+rB,EAAapf,EAAKlC,YAAY2B,GAGyB,OAFxDoT,EAAgBtT,iBAAgBsT,EAAgBtT,eAAiB6B,IAEtEyR,EAAgBxM,UAAwC,IAA7BwM,EAAgBxM,SAAkBxM,QAAAC,QAIxCslB,EAAWI,gBAAgB9f,YAC9CpK,EACAud,EAAgB5T,UAChB4T,EAAgB1T,WAChB0T,EAAgBxM,SAChBwM,EAAgBtT,iBACjBtF,KANKR,SAAAA,GAAMwG,IAAAA,EAOR,OAAAP,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACAuG,EAAKtC,wBACM,OADiBuC,EAC5BD,EAAK9H,aAAM,EAAX+H,EAAatK,iBACbypB,EAAWI,gBACXlqB,EACAud,EAAgB5T,UAChB4T,EAAgB1T,WAChB0T,EAAgBxM,SAChBwM,EAAgBtT,gBACjB,EAAA,EAEH,CAAC,MAAA7G,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAWYosB,cACXjgB,EACA1B,EACAhC,EACA4jB,EACAjgB,GAAe,QAAAU,EAEIhN,KAAbgsB,EAAahf,EAAKtC,YAAY2B,GAAU,OAAA5F,QAAAC,QACnCsG,EAAKud,eAAele,EAAW1B,IAAQ9D,KAAA,SAAA2lB,GAAlD,IAA+D,IAA3DA,EAAgD1M,OAClD,MAAM,IAAI7f,MAA4B,wBACvC,OAAAwG,QAAAC,QAEyBsG,EAAKyf,OAAOpgB,IAAUxF,cAA1C6lB,GAAW,GACb,IAAI9e,EAAO,QAAC8e,GAAaC,IAAIhkB,UAAOlC,QAAAC,QACjBslB,EAAWM,KAAKhgB,YACnCigB,GAAa5hB,EACblC,GAAc,KAAM,KAAME,EAAQ,MACnC9B,KAAA,SAHKR,GAAM4G,IAAAA,EAIR,OAAAX,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACA2G,EAAK1C,+BAAuB2C,EAC5BD,EAAKlI,eAALmI,EAAa1K,iBACbypB,EAAWM,KACXC,GAAa5hB,EACblC,GAAc,KAAM,KAAME,EAAQ,KACnC,GAGD,MAAM,IAAI1I,0CAA0C,EAAA,EAExD,CAAC,MAAAqF,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAWY0sB,UAAS,SACpBvgB,EACA1B,EACAmV,EACAxT,GAAe,QAAAc,EAEIpN,KAAbgsB,EAAa5e,EAAK1C,YAAY2B,GAAU,OAAA5F,QAAAC,QACnC0G,EAAKsd,oBAAoBre,EAAW1B,IAAQ9D,KAAA,SAAAgmB,GAAvD,IAA6D,IAAzDA,EACF,UAAU5sB,MAAuC,mCAClD,OAAAwG,QAAAC,QAEoBslB,EAAWY,UAAUtgB,YAAYwT,IAAOjZ,cAAvDR,GAAM,IAAAgH,EAAA,OACRf,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACA+G,EAAK9C,wBACL+C,OAD4BA,EAC5BD,EAAKtI,aAALuI,EAAAA,EAAa9K,iBACbypB,EAAWY,UACX9M,GAIJ,EAAA,EAAA,CAAC,MAAAxa,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAWY4sB,aAAA,SACXzgB,EACA1B,EACAmV,EACAxT,GAAe,IAAA,IAAAiB,EAEIvN,KAAbgsB,EAAaze,EAAK7C,YAAY2B,GAAU,OAAA5F,QAAAC,QACnC6G,EAAKmd,oBAAoBre,EAAW1B,IAAQ9D,cAAAkmB,GAAvD,IAA6D,IAAzDA,EACF,MAAU,IAAA9sB,MAAK,mCAChB,OAAAwG,QAAAC,QAEoBslB,EAAWc,aAAaxgB,YAAYwT,IAAOjZ,KAAA,SAA1DR,GAAM,IAAAmH,EAAA,OACRlB,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACAkH,EAAKjD,wBACLkD,OAD4BA,EAC5BD,EAAKzI,aAAL0I,EAAAA,EAAajL,iBACbypB,EAAWc,aACXhN,GAIJ,EAAA,EAAA,CAAC,MAAAxa,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAWY8sB,kBAAiB,SAC5B3gB,EACA1B,EACAsiB,EACA3gB,GAAe,IAAA,IAAA4D,EAEIlQ,KAAbgsB,EAAa9b,EAAKxF,YAAY2B,GAAU,OAAA5F,QAAAC,QACnCwJ,EAAKwa,oBAAoBre,EAAW1B,IAAQ9D,KAAAqmB,SAAAA,GAAvD,IAA6D,IAAzDA,EACF,MAAM,IAAIjtB,yCACX,OAAAwG,QAAAC,QAEoBslB,EAAWgB,kBAAkB1gB,YAAY2gB,IAAepmB,KAAA,SAAvER,GAAM,IAAA8J,EACR,OAAA7D,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACA6J,EAAK5F,wBACM,OADiB6F,EAC5BD,EAAKpL,aAAM,EAAXqL,EAAa5N,iBACbypB,EAAWgB,kBACXC,GAIJ,EAAA,EAAA,CAAC,MAAA3nB,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAWYitB,qBAAA,SACX9gB,EACA1B,EACAsiB,EACA3gB,GAAe,IAAA,IAAA+D,EAEIrQ,KAAbgsB,EAAa3b,EAAK3F,YAAY2B,GAAU,OAAA5F,QAAAC,QACnC2J,EAAKqa,oBAAoBre,EAAW1B,IAAQ9D,KAAAumB,SAAAA,GAAvD,IAA6D,IAAzDA,EACF,MAAM,IAAIntB,MAAK,mCAChB,OAAAwG,QAAAC,QAEoBslB,EAAWmB,qBAAqB7gB,YAAY2gB,IAAepmB,KAAA,SAA1ER,GAAMwS,IAAAA,EACR,OAAAvM,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACAgK,EAAK/F,wBACM,OADiBuO,EAC5BxI,EAAKvL,aAAM,EAAX+T,EAAatW,iBACbypB,EAAWmB,qBACXF,GAIJ,EAAA,EAAA,CAAC,MAAA3nB,UAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAYYmtB,oBAAA,SACXhhB,EACA1B,EACAoV,EACAzT,OAAekE,IAAAA,EAEIxQ,KAAbgsB,EAAaxb,EAAK9F,YAAY2B,GAAU,OAAA5F,QAAAC,QACd8J,EAAK+Z,eAAele,EAAW1B,IAAQ9D,KAAA,SAAAymB,GAAA,SAAArM,EAEjExE,GAAU,SAAA5T,EAAA0kB,GAAArkB,SAAAA,EAEVskB,GAGN,IAAKC,IAAqBC,WADEF,SAAAA,EAAgBtJ,aAE1C,MAAM,IAAIjkB,MAA8D,0DACzE,OAAAwG,QAAAC,QAEoBslB,EAAWqB,oBAAoB/gB,YAAYyT,IAAiBlZ,KAAA,SAA3ER,GAAM,IAAA2S,EAAA,OACR1M,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACAmK,EAAKlG,wBACM,OADiB0O,EAC5BxI,EAAK1L,aAAM,EAAXkU,EAAazW,iBACbypB,EAAWqB,oBACXtN,GACD,EAAA,CAjBD,IAAM2N,EAAajR,GAAc8Q,IAA6C5iB,EAAO,OAEnF8R,IAAeiR,EAAUjnB,QAAAC,QAAzB+V,IAAeiR,GAAqBld,EAAKob,IAAI5H,kBAAkBvH,EAAY9R,IAAQ9D,KAAAqC,GAAAA,EAAnFuT,IAAeiR,GAAqBld,EAAKob,IAAI5H,kBAAkBvH,EAAY9R,GAF1D,CAAA,OAAA8R,EAAUhW,QAAAC,QAAW8J,EAAKob,IAAI5F,YAAYvJ,IAAW5V,KAAAgC,GAAAA,EAArD4T,EAAU,CAH7B,IAAMgR,EAAmBH,EACtBL,eAAc,OACGQ,EAAgBxM,GAAhBwM,GAA2Bjd,EAAKmd,cAActhB,IAAU5F,QAAAC,SAAxD+mB,GAA2Bjd,EAAKmd,cAActhB,IAAUxF,KAAAoa,EAoB9E,EAAA,CAAC,MAAA3b,UAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAOY0tB,oBAAA,SAAoBvhB,GAAiB,IAAA,IAC1C2f,EAAahsB,KAAK0K,YAAY2B,GAAU,OAAA5F,QAAAC,QACfslB,EAAW4B,sBAE5C,CAAC,MAAAtoB,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAUY2tB,SAAQ,SACnBxhB,EACAkgB,EACA5jB,EACA2D,GAAe,IAAA,IAAA0Q,EAERhd,KAAI8tB,EAAJ9Q,EAAK+Q,mBAAWtnB,QAAAC,QAGf+B,GAAc,KAAM,KAAME,EAAQ,KAAG9B,KAAA,SAAAmnB,GAH7C,OAAAF,EAAAntB,KAAAqc,EACE3Q,EACAkgB,EAASyB,EAET1hB,EACD,EACH,CAAC,MAAAhH,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAUY6tB,YAAW,SACtB1hB,EACAkgB,EACA5jB,EACA2D,GAAe,IAAA,IAAA2E,EAEIjR,KAAbgsB,EAAa/a,EAAKvG,YAAY2B,GAAU,OAAA5F,QAAAC,QACzBslB,EAAW6B,SAASvhB,YAAYigB,EAAW5jB,IAAO9B,KAAjER,SAAAA,GAAMoX,IAAAA,EACR,OAAAnR,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACA4K,EAAK3G,wBACM,OADiBmT,EAC5BxM,EAAKnM,aAAM,EAAX2Y,EAAalb,iBACbypB,EAAW6B,SACXtB,EACA5jB,GAGJ,EAAA,CAAC,MAAArD,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAYY+tB,WAAA,SACX5hB,EACA6hB,EACAC,EACAC,EACA1f,EACApC,GAAe,IAAA6F,IAAAA,EAEInS,KAAbgsB,EAAa7Z,EAAKzH,YAAY2B,EAAW8F,EAAK/H,KAOnD,OANIsE,IACHA,EAAmB,CACjB2f,wBAAyBrgB,GACzBsgB,sBAAuBtgB,GACvB+D,uBAAwB,MAE3BtL,QAAAC,QAEoBslB,EAAWiC,WAAW3hB,YACzC4hB,EACAC,EACAC,EACA1f,IACD7H,KALKR,SAAAA,GAAMwT,IAAAA,EAMR,OAAAvN,EAA0CjG,EAAMI,QAAAC,QAC3BN,GACvBC,EACA8L,EAAK7H,wBACLuP,OAD4BA,EAC5B1H,EAAKrN,aAAL+U,EAAAA,EAAatX,iBACbypB,EAAWiC,WACXC,EACAC,EACAC,EACA1f,GACD,EAEH,CAAC,MAAApJ,GAAAmB,OAAAA,QAAA+B,OAAAlD,KAAApF,EAYYquB,WAAU,SACrBliB,EACAmiB,EACAJ,EACA9hB,OAAemG,IAAAA,EAEIzS,KAAbgsB,EAAavZ,EAAK/H,YAAY2B,GAAU,OAAA5F,QAAAC,QAEzBslB,EAAWuC,WAAWjiB,YAAYkiB,EAAWJ,IAAavnB,KAAA,SAAzER,GAAM4X,IAAAA,EACR,OAAA3R,EAA0CjG,EAAMI,QAAAC,QAC3BN,GACvBC,EACAoM,EAAKnI,wBACM,OADiB2T,EAC5BxL,EAAK3N,aAAM,EAAXmZ,EAAa1b,iBACbypB,EAAWuC,WACXC,EACAJ,GAGJ,EAAA,CAAC,MAAA9oB,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAUYuuB,mBAAA,SACXpiB,EACAqiB,EACAtP,EACA9S,GAAe,IAAAwH,IAAAA,EAEI9T,KAAbgsB,EAAalY,EAAKpJ,YAAY2B,EAAWyH,EAAK6X,eAAc,OAAAllB,QAAAC,QAElCoN,EAAK6a,kBAAkBvP,IAAUvY,cAA3D+nB,GAAiB,OAAAnoB,QAAAC,QAEFslB,EAAWyC,mBAAmBniB,YACjDoiB,EACAE,IACD/nB,KAHKR,SAAAA,OAAMiY,EAAA,OAIRhS,EAA0CjG,EAAMI,QAAAC,QAC3BN,GACvBC,EACAyN,EAAKxJ,wBACLgU,OAD4BA,EAC5BxK,EAAKhP,aAALwZ,EAAAA,EAAa/b,iBACbypB,EAAWyC,mBACXC,EACAE,GACD,EAAA,EAEH,CAAC,MAAAtpB,GAAAmB,OAAAA,QAAA+B,OAAAlD,KAAApF,EAUY2uB,yBAAwB,SACnCxiB,EACAqiB,EACAI,EACAxiB,GAAe,IAAAmS,IAAAA,EAEIze,KAAbgsB,EAAavN,EAAK/T,YAAY2B,EAAWoS,EAAKkN,eAAc,OAAAllB,QAAAC,QAE7CslB,EAAW6C,yBAAyBviB,YACvDoiB,EACAI,IACDjoB,KAHKR,SAAAA,GAAMqY,IAAAA,SAIRpS,EAA0CjG,EAAMI,QAAAC,QAC3BN,GACvBC,EACAoY,EAAKnU,wBACM,OADiBoU,EAC5BD,EAAK3Z,aAAM,EAAX4Z,EAAanc,iBACbypB,EAAW6C,yBACXH,EACAI,GAGJ,EAAA,CAAC,MAAAxpB,UAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAWY0qB,QAAA,SACXve,EACA1B,EACAuX,EACA5V,OAAe6a,IAAArI,EAEH9e,KAAIyG,OAAAA,QAAAC,QAAJoY,EAAK4L,oBAAoBre,EAAW1B,IAAQ9D,cAAAkoB,GAAxD,IAAIA,EACF,MAAM,IAAI9uB,MAAsC,kCAGlD,IAAM+rB,EAAalN,EAAKpU,YAAY2B,GAC9B4e,EAAWC,EAAAA,QAAQnK,EAAAA,YAAYmB,IAAO,OAAAzb,QAAAC,QAEvBslB,EAAWpB,QAAQte,YAAY2e,IAASpkB,KAAvDR,SAAAA,GAAM6Y,IAAAA,SACR5S,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACAyY,EAAKxU,wBACM,OADiB4U,EAC5BJ,EAAKha,aAAM,EAAXoa,EAAa3c,iBACbypB,EAAWpB,QACXK,GAIJ,EAAA,EAAA,CAAC,MAAA3lB,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAUYooB,0BACXjc,EACA1B,EACA2B,GAAe,IAAAqR,IAAA/I,EAEJ5U,KAAIgvB,EAAJpa,EAAKgX,IAAGqD,EAARD,EAAShJ,mBAAWvf,QAAAC,QAAOkO,EAAK+Y,cAActhB,IAAUxF,KAAA,SAAAqoB,GAAAzoB,OAAAA,QAAAC,QAAAuoB,EAAAtuB,KAAAquB,EAAAE,IAAAroB,cAAAsoB,GAAnE,GAAIA,IAAsExkB,EACxE,MAAU,IAAA1K,MAAM,2BAElB,IAAM+rB,EAAapX,EAAKlK,YAAY2B,GAAU,OAAA5F,QAAAC,QACzBslB,EAAW1D,iBAAiBhc,eAAazF,cAAxDR,GAAM,IAAAyO,EAAA,OACRxI,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACAuO,EAAKtK,+BAAuBwK,EAC5BF,EAAK9P,eAALgQ,EAAavS,iBACbypB,EAAW1D,kBACZ,EAAA,EAAA,EAGH,CAAC,MAAAhjB,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAQYqqB,eAAc,SACzBle,EACA1B,GAAe,IAAAqK,IAETgX,EAAahsB,KAAK0K,YAAY2B,GAAU,OAAA5F,QAAAC,QAC1BslB,EAAWoD,YAAYzkB,GAE7C,CAAC,MAAArF,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAOYusB,OAAA,SAAOpgB,GAAiB,QAAA8I,EAChBnV,KAAbgsB,EAAa7W,EAAKzK,YAAY2B,GAAU,OAAA5F,QAAAC,QAC5BslB,EAAWzL,OAAK1Z,KAAA,SAA5B0Z,GAAG9Z,OAAAA,QAAAC,QACIyO,EAAKlM,cAAc,KAAMsX,EAAK,IAAG,EAChD,CAAC,MAAAjb,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAOYmvB,YAAW,SAAChjB,OAAiBoJ,IAClCuW,EAAahsB,KAAK0K,YAAY2B,GAAU,OAAA5F,QAAAC,QACvBslB,EAAWljB,YAAUjC,KACrCY,OACT,CAAC,MAAAnC,UAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAOYwjB,MAAA,SAAMrX,GAAiB,IAAA,IAC5B2f,EAAahsB,KAAK0K,YAAY2B,GAAU,OAAA5F,QAAAC,QAC7BslB,EAAWtI,SAAO7c,KAC5BY,OACT,CAAC,MAAAnC,UAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAOYovB,UAAA,SAAUjjB,GAAiB,IAAA,IAChC2f,EAAahsB,KAAK0K,YAAY2B,GAAU,OAAA5F,QAAAC,QACzBslB,EAAWnR,SAElC,CAAC,MAAAvV,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAOYqvB,QAAO,SAACljB,GAAiB,IAAAmjB,IAC9BxD,EAAahsB,KAAK0K,YAAY2B,GAAU,OAAA5F,QAAAC,QAC3BslB,EAAWnmB,OAEhC,CAAC,MAAAP,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAOYytB,cAAa,SAACthB,OAAiBojB,IACpCzD,EAAahsB,KAAK0K,YAAY2B,GAAU,OAAA5F,QAAAC,QACrBslB,EAAW0D,mBAEtC,CAAC,MAAApqB,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAOYyvB,cAAa,SAACtjB,GAAiB,IAAA,IACpC2f,EAAahsB,KAAK0K,YAAY2B,GAAU,OAAA5F,QAAAC,QACrBslB,EAAW2D,gBAEtC,CAAC,MAAArqB,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAOY0vB,cAAa,SAACvjB,OAAiBqK,IACpCsV,EAAahsB,KAAK0K,YAAY2B,GAAU,OAAA5F,QAAAC,QACrBslB,EAAW4D,gBAEtC,CAAC,MAAAtqB,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAQYwqB,oBAAA,SAAoBre,EAAmB1B,GAAe,IAAA,IAC3DqhB,EAAahsB,KAAK0K,YAAY2B,GAAU,OAAA5F,QAAAC,QACZslB,EAAWrB,gBAAgBhgB,GAE/D,CAAC,MAAArF,GAAAmB,OAAAA,QAAA+B,OAAAlD,KAAApF,EAQY+L,QAAO,SAACuf,EAA0B7gB,GAAe,IAAAklB,IAAAA,EACzC7vB,KAAbgsB,EAAa6D,EAAKnlB,YAAY8gB,GAAiB,OAAA/kB,QAAAC,QAC/BslB,EAAW8D,UAAUnlB,IAAQ9D,KAA7CoF,SAAAA,UAAOxF,QAAAC,QACAmpB,EAAK5mB,cAAc,KAAMgD,EAAS,IACjD,EAAA,CAAC,MAAA3G,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAUY6vB,UAAA,SACXvE,EACA9f,EACAqgB,EACAjjB,YAAAA,IAAAA,EAAmB,IAAE,IAAAknB,IAAAA,EAEFhwB,KAAbgsB,EAAagE,EAAKtlB,YAAY8gB,GAAiB,OAAA/kB,QAAAC,QAC7BslB,EAAW+D,UAAUrkB,EAAOqgB,IAAQllB,cAAtDkpB,GAAS,OAAAtpB,QAAAC,QACFspB,EAAK/mB,cAAc,KAAM8mB,EAAWjnB,GACnD,EAAA,CAAC,MAAAxD,UAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAYY+vB,uBAAsB,SACjCzE,EACA0E,EACAC,EACAxe,EACAhH,EACA2B,GAAe,IAAA,IAAA8jB,EAEIpwB,KAAbgsB,EAAaoE,EAAK1lB,YAAY8gB,GAAiB,OAAA/kB,QAAAC,QACxBslB,EAAWqE,0BAAwBxpB,KAAA,SAAAypB,GAChE,GADsBA,EAA4C,KAC5C3lB,EACpB,MAAU,IAAA1K,MAAK,mDAChB,OAAAwG,QAAAC,QACoBslB,EAAWiE,uBAAuB3jB,YACrD4jB,EACAC,EACAxe,IACD9K,KAJKR,SAAAA,OAAMkqB,EAAA,OAKRjkB,EAA0CjG,EAAMI,QAAAC,QAC3BN,GACvBC,EACA+pB,EAAK9lB,wBACLimB,OAD4BA,EAC5BH,EAAKtrB,aAALyrB,EAAAA,EAAahuB,iBACbypB,EAAWiE,uBACXC,EACAC,EACAxe,GACD,EAAA,EAGH,CAAC,MAAArM,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAOYmwB,uBAAsB,SACjC7E,GAAwB,IAAAgF,IAElBxE,EAAahsB,KAAK0K,YAAY8gB,GAAiB,OAAA/kB,QAAAC,QAEnBslB,EAAWqE,0BAAwBxpB,KAAA,SAA/D4pB,GAMN,MALqB,CACnBP,wBAAyBO,EAAoB,GAC7CN,sBAAuBM,EAAoB,GAC3C9e,uBAAwB8e,EAAoB,GAAGrpB,WAE9B,EACrB,CAAC,MAAA9B,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAEayuB,kBAAA,SAAkBvP,GAAyB,IAAA,IAAAsR,EAKnD1wB,KAAI2wB,EAFMvR,EAAU9Q,WAAUsiB,EADdxR,EAAUyR,iBAAgB,OAAApqB,QAAAC,QAElB+B,GACxBioB,EAAKpqB,OACL8Y,EAAUiC,iBACVjC,EAAU5Q,mBACV4Q,EAAUuC,oBACX9a,KAAAiqB,SAAAA,GAAArqB,OAAAA,QAAAC,QACoB+B,GACnBioB,EAAKpqB,OACL8Y,EAAUiC,iBACVjC,EAAU2R,cACV3R,EAAUuC,oBACX9a,KAAAmqB,SAAAA,GAdH,MAAO,CACLH,iBAAgBD,EAChBtiB,WAAUqiB,EACVniB,mBAAkBsiB,EAMlBC,cAAaC,EAObC,iBAAkB7R,EAAU6R,iBAC7B,IACH,CAAC,MAAA3rB,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,EAAAomB,CAAA,CA73BoB,CAAQvhB,ICblB+mB,gBAAW,SAAAC,GActB,SAAAD,EACE5qB,EACA8qB,EACAzvB,EACAmD,EACAsF,GAAeY,IAAAA,EAIa,OAF5BA,EAAAmmB,EAAAxwB,KAAM2F,KAAAA,EAAQ3E,EAASmD,EAAQsF,IAAIpK,MApB9BqxB,gBAAUrmB,EAAAA,EACVomB,gBAAU,EAoBfpmB,EAAKZ,IAAMY,EAAKX,gBAChBW,EAAKomB,WAAaA,EAAUpmB,CAC9B,CAACC,GAAAimB,EAAAC,GAAA,IAAAjxB,EAAAgxB,EAAA/wB,UA6JA+wB,OA7JAhxB,EArBDmK,cAAA,WACE,OAAOinB,EAAAA,QAAelnB,GACxB,EAAClK,EAqBMqxB,WAAA,SAAWC,GAChBxxB,KAAKoxB,WAAaI,CACpB,EAACtxB,EAOYuxB,qBAAoB,SAACplB,GAAiB,QAC3C2f,EAAahsB,KAAK0K,YAAY2B,EAAjBrM,KAAiCqK,iBAAgB,OAAA5D,QAAAC,QAC5CslB,EAAW0F,uBAErC,CAAC,MAAApsB,UAAAmB,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAOYyxB,6BAAoBtlB,OAAiBK,IAC1Csf,EAAahsB,KAAK0K,YAAY2B,EAAjBrM,KAAiCqK,iBAAgB,OAAA5D,QAAAC,QAC7CslB,EAAW4F,sBAEpC,CAAC,MAAAtsB,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAWY2xB,8BACXxlB,EACA1B,EACAujB,EACA5hB,OAAe4O,IAAAtO,EAEH5M,KAAI,OAAAyG,QAAAC,QAAJkG,EAAK8d,oBAAoBre,EAAW6hB,IAASrnB,KAAAwlB,SAAAA,GAAzD,IAAIA,EACF,MAAM,IAAIpsB,MAAK,kCAGjB,IAAM+rB,EAAapf,EAAKlC,YAAY2B,GAAU,OAAA5F,QAAAC,QACzBslB,EAAW6F,qBAAqBvlB,YAAY3B,IAAQ9D,KAAnER,SAAAA,OAAMwG,EAAA,OACRP,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACAuG,EAAKtC,wBACM,OADiBuC,EAC5BD,EAAK9H,aAAM,EAAX+H,EAAatK,iBACbypB,EAAW6F,qBACXlnB,GACD,EAAA,EAGH,CAAC,MAAArF,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAWY4xB,oBAAA,SACXzlB,EACA1B,EACAujB,EACA5hB,GAAe,IAAA,IAAAU,EAEHhN,KAAI,OAAAyG,QAAAC,QAAJsG,EAAK0d,oBAAoBre,EAAW6hB,IAASrnB,KAAAkrB,SAAAA,GAAzD,IAAIA,EACF,UAAU9xB,wCAGZ,IAAM+rB,EAAahf,EAAKtC,YAAY2B,GAAU,OAAA5F,QAAAC,QACzBslB,EAAW8F,oBAAoBxlB,YAAY3B,IAAQ9D,KAAA,SAAlER,GAAM4G,IAAAA,EACR,OAAAX,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACA2G,EAAK1C,wBACL2C,OAD4BA,EAC5BD,EAAKlI,aAALmI,EAAAA,EAAa1K,iBACbypB,EAAW8F,oBACXnnB,GAIJ,EAAA,EAAA,CAAC,MAAArF,UAAAmB,QAAA+B,OAAAlD,KAAApF,EASY8xB,cAAa,SACxB3lB,EACA1B,EACA2B,GAAe,IAAAmM,IAAArL,EAEHpN,KAAIyG,OAAAA,QAAAC,QAAJ0G,EAAKsd,oBAAoBre,EAAW1B,IAAQ9D,KAAA,SAAAgmB,GAAxD,IAAIA,EACF,MAAU,IAAA5sB,MAAK,kCAGjB,IAAM+rB,EAAa5e,EAAK1C,YAAY2B,GAAU,OAAA5F,QAAAC,QACzBslB,EAAWiG,eAAe3lB,YAAYc,EAAKgkB,aAAWvqB,KAAA,SAArER,GAAM,IAAAgH,EACR,OAAAf,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACA+G,EAAK9C,wBACL+C,OAD4BA,EAC5BD,EAAKtI,aAALuI,EAAAA,EAAa9K,iBACbypB,EAAWiG,eACX7kB,EAAKgkB,gBAIT,CAAC,MAAA9rB,GAAA,OAAAmB,QAAA+B,OAAAlD,KAAApF,EAaYgyB,cAAa,SACxB7lB,EACA8hB,EACAgE,EACAC,EACAC,EACAC,EACAC,GAAuB,QAEjBvG,EAAahsB,KAAK0K,YAAY2B,EAAjBrM,KAAiCqK,iBAAgB,OAAA5D,QAAAC,QAC3CslB,EAAWkG,cAClC/D,EACAgE,EACAC,EACAC,EACAC,EACAC,GAGJ,CAAC,MAAAjtB,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAA4rB,CAAAA,EAAAA,CAAA,CArLqB,CAAQxF,ICFnB8G,gBAAmB,SAAAtnB,GAgB9B,SAAAsnB,EACE7nB,EACArE,EACA3E,EACAmD,EACAsF,GAAe,IAAAY,EAGuB,OADtCA,EAAAE,EAAAvK,KAAMgK,KAAAA,EAASrE,EAAQ3E,EAASmD,EAAQsF,UAtBnCuhB,mBAuBL3gB,EAAAA,EAAKZ,IAAMA,GAAOY,EAAKX,gBAAeW,CACxC,CAACC,GAAAunB,EAAAtnB,GAAAhL,IAAAA,EAAAsyB,EAAAryB,UAoKA,OApKAD,EAtBDmK,cAAA,WACE,OAAOooB,EAAAA,QAAWroB,GACpB,EAAClK,EA0BYwyB,qBAAY/J,GAAe,IACrBliB,OAAAA,QAAAC,QAAJ1G,KAAK4J,SAAS+R,SAASgN,GACtC,CAAC,MAAArjB,UAAAmB,QAAA+B,OAAAlD,KAAApF,EAMY6X,SAAA,WAAQ,IACFtR,OAAAA,QAAAC,QAAJ1G,KAAK4J,SAAS8B,QAC7B,CAAC,MAAApG,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAMYwjB,iBAAK,WACKjd,QAAAC,QAAJ1G,KAAK4J,SAAS8Z,SAAO7c,KAC/BY,OACT,CAAC,MAAAnC,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAMYqvB,QAAO,eACD,OAAA9oB,QAAAC,QAAJ1G,KAAK4J,SAAS/D,OAC7B,CAAC,MAAAP,UAAAmB,QAAA+B,OAAAlD,KAAApF,EAMYovB,UAAA,WAAS,IACH7oB,OAAAA,QAAAC,QAAJ1G,KAAK4J,SAASiR,SAC7B,CAAC,MAAAvV,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAOY+L,QAAA,SAAQtB,GAAe,IAAA,IAAA4C,EACZvN,YAAIyG,QAAAC,QAAJ6G,EAAK3D,SAASkmB,UAAUnlB,IAAQ9D,cAAhDoF,GAAO,OAAAxF,QAAAC,QACA6G,EAAKtE,cAAc,KAAMgD,EAAS,IAAG,EACpD,CAAC,MAAA3G,UAAAmB,QAAA+B,OAAAlD,KAAApF,EASYosB,KAAA,SACXqG,EACAC,EACAtmB,GAAe,IAAA,IAAA4D,EAEMlQ,YAAIyG,QAAAC,QAAJwJ,EAAKtG,SAAS0iB,KAAKhgB,YAAYqmB,EAAMC,IAAS/rB,KAA7DR,SAAAA,OAAM8J,EAAA,OACR7D,EAA0CjG,EAAMI,QAAAC,QAC3BN,GACvBC,EACA6J,EAAK5F,wBACM,OADiB6F,EAC5BD,EAAKpL,aAAM,EAAXqL,EAAa5N,iBACb2N,EAAKtG,SAAS0iB,KACdqG,EACAC,GACD,EAEH,CAAC,MAAAttB,UAAAmB,QAAA+B,OAAAlD,KAAApF,EASY2yB,UAAA,SACXC,EACAC,EACAzmB,GAAe,IAAA,IAAA+D,EAEMrQ,YAAIyG,QAAAC,QAAJ2J,EAAKzG,SAASipB,UAAUvmB,YAAYwmB,EAAOC,IAAUlsB,KAApER,SAAAA,OAAMwS,EAAA,OACRvM,EAA0CjG,EAAMI,QAAAC,QAC3BN,GACvBC,EACAgK,EAAK/F,wBACM,OADiBuO,EAC5BxI,EAAKvL,aAAM,EAAX+T,EAAatW,iBACb8N,EAAKzG,SAASipB,UACdC,EACAC,GACD,EAEH,CAAC,MAAAztB,UAAAmB,QAAA+B,OAAAlD,KAAApF,EAQY8yB,KAAA,SACXrK,EACArc,GAAe,QAAAkE,EAEMxQ,KAAIyG,OAAAA,QAAAC,QAAJ8J,EAAK5G,SAASopB,KAAK1mB,YAAYqc,IAAQ9hB,cAAtDR,GAAM,IAAA2S,EACR,OAAA1M,EAA0CjG,EAAMI,QAAAC,QAC3BN,GACvBC,EACAmK,EAAKlG,wBACL0O,OAD4BA,EAC5BxI,EAAK1L,aAALkU,EAAAA,EAAazW,iBACbiO,EAAK5G,SAASopB,KACdrK,GACD,EAEH,CAAC,MAAArjB,UAAAmB,QAAA+B,OAAAlD,KAAApF,EAQY+yB,kBAAA,SACXC,EACA5mB,GAAe,QAAAsE,EAEM5Q,KAAIyG,OAAAA,QAAAC,QAAJkK,EAAKhH,SAASqpB,kBAAkB3mB,YAAY4mB,IAASrsB,cAApER,GAAM,IAAA8S,EACR,OAAA7M,EAA0CjG,EAAMI,QAAAC,QAC3BN,GACvBC,EACAuK,EAAKtG,wBACM,OADiB6O,EAC5BvI,EAAK9L,aAAM,EAAXqU,EAAa5W,iBACbqO,EAAKhH,SAASqpB,kBACdC,GACD,EAEH,CAAC,MAAA5tB,UAAAmB,QAAA+B,OAAAlD,KAAApF,EAOYizB,kBAAA,SACX7mB,OAAe0Q,IAAAA,EAEMhd,KAAI,OAAAyG,QAAAC,QAAJsW,EAAKpT,SAASupB,kBAAkB7mB,eAAazF,cAA5DR,GAAM,IAAA+W,EACR,OAAA9Q,EAA0CjG,EAAMI,QAAAC,QAC3BN,GACvBC,EACA2W,EAAK1S,wBACM,OADiB8S,EAC5BJ,EAAKlY,aAAM,EAAXsY,EAAa7a,iBACbya,EAAKpT,SAASupB,mBAGlB,EAAA,CAAC,MAAA7tB,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,EAAAktB,CAAA,CA7L6B,CAAQ1nB,ICK3BsoB,gBAAkBloB,SAAAA,GAa7B,SAAAkoB,EACEzoB,EACArE,EACA3E,EACAmD,EACAsF,GAAeY,IAAAA,EAGuB,OADtCA,EAAAE,EAAAvK,KAAMgK,KAAAA,EAASrE,EAAQ3E,EAASmD,EAAQsF,IAAIpK,MACvCoK,IAAMA,GAAOY,EAAKX,gBAAeW,CACxC,CAACC,GAAAmoB,EAAAloB,GAAAhL,IAAAA,EAAAkzB,EAAAjzB,UA2HAizB,OA3HAlzB,EArBDmK,cAAA,WACE,OAAO9F,EAAAA,QAAkB6F,GAC3B,EAAClK,EAgCYmzB,yBAAwB,SACnCC,EACAC,EACA5X,EACAC,EACAlQ,EACAinB,EACArmB,QAHAsP,IAAAA,IAAAA,GAAwB,GAAK,IAGdrP,IAAAA,EAOMvM,KALrB,IAAKszB,IAAmBC,EAAkB,CACxC,IAAAnY,EAAyBtB,KACzBwZ,EADYlY,EAAJvV,KAER0tB,EAFoBnY,EAANP,MAGf,CAAA,OAAApU,QAAAC,QACoB6F,EAAK3C,SAASypB,yBAAyB/mB,YAC1DgnB,EACAC,EACA3X,EACAlQ,EACAinB,EACAhX,IACD9U,cAPKR,GAAM,OAQRiG,EAA6DjG,0BAE7DI,QAAAC,QACeN,GACfC,EACAkG,EAAKjC,wBACM,OADiBkC,EAC5BD,EAAKzH,aAAM,EAAX0H,EAAajK,iBACbgK,EAAK3C,SAASypB,yBACdC,EACAC,EACA3X,EACAlQ,EACAinB,EACAhX,IACD9U,KAAA,SAXKgV,GAYN,IAAKA,EAAI,CACP,IAAMvW,EAAI,+DAEV,MADA/D,QAAQJ,MAAMmE,GACRA,CACP,CAAA,OAAAmB,QAAAC,QACwBmV,EAAGvT,QAAMzB,KAAA,SAA5BwB,GAEN,OADewB,GAAexB,EAAY,iBAC5ByT,KAAK,EAAE,EACtB,wBAvBsE,IAEnEtP,sCAFmEjE,CAAA,EAuB9DjD,SAAAA,GACP/D,QAAQJ,wCAAwCmE,EACjD,EAAA,EACH,CAAC,MAAAA,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAMY6X,SAAA,WAAQ,IACK,OAAAtR,QAAAC,QAAJ1G,KAAK4J,SAAS8B,QAEpC,CAAC,MAAApG,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAOYszB,YAAA,SAAYC,GAAuB,IAChBhtB,OAAAA,QAAAC,QAAJ1G,KAAK4J,SAAS8pB,YAAYD,GAEtD,CAAC,MAAAnuB,UAAAmB,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAOYurB,oBAAWgI,cACOhtB,QAAAC,QAAJ1G,KAAK4J,SAAS6hB,WAAWgI,GAEpD,CAAC,MAAAnuB,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EASYyzB,sBAAqB,SAChCjoB,EACAkR,EACAtQ,GAAe,IAAA,IAAAc,EAEJpN,KAAIyG,OAAAA,QAAAC,QAAJ0G,EAAK2K,YAAUlR,cAAAwR,GAA1B,GAAIA,IAA4B3M,EAC9B,UAAUzL,MAAmC,+BAG/C,GAAI2c,IAAoB5O,GACtB,MAAU,IAAA/N,MAA+C,2CAC1D,OAAAwG,QAAAC,QAEoB0G,EAAKxD,SAAS+pB,sBAAsBrnB,YAAYsQ,IAAgB/V,KAA/ER,SAAAA,GAAMgH,IAAAA,SACRf,EAA0CjG,EAAMI,QAAAC,QAC3BN,GACvBC,EACA+G,EAAK9C,+BAAuB+C,EAC5BD,EAAKtI,eAALuI,EAAa9K,iBACb6K,EAAKxD,SAAS+pB,sBACd/W,GAIJ,EAAA,EAAA,CAAC,MAAAtX,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAA8tB,CAAAA,EAAAA,CAAA,CAjJ4BloB,CAAQJ,ICJ1B8oB,gBAAQ1oB,SAAAA,GAAA0oB,SAAAA,WAAA1oB,EAAA3K,MAAAP,KAAAY,YAAAZ,IAAA,CAAAiL,GAAA2oB,EAAA1oB,GAAA,IAAAhL,EAAA0zB,EAAAzzB,UAmLlB,OAnLkBD,EACnBmK,cAAA,WACE,OAAOwpB,EAAU,QAACzpB,GACpB,EAAClK,EASY4zB,WAAA,SACXnrB,EACAorB,EACAznB,GAAe,IAAA,IAAAtB,EAEehL,KAAIguB,EAAJhjB,EAAKvC,cAAa,OAAAhC,QAAAC,QAAOsE,EAAKgpB,YAAUntB,KAAAotB,SAAAA,GAAAxtB,OAAAA,QAAAC,QAAAsnB,EAAArtB,KAAAqK,EAAAipB,EAAEtrB,IAAM9B,KAAxEqtB,SAAAA,GAAeztB,OAAAA,QAAAC,QACAsE,EAAKpB,SAASuqB,YAAY7nB,YAC7C4nB,EACAH,IACDltB,KAAA,SAHKR,GAAM,IAAAsR,EAAA,OAIRrL,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvB8B,OAAO,IAAIC,EAAS,QAAC9B,GAAQ+B,KAAK,QAAQhB,YAC1C4D,EAAKV,wBACM,OADiBqN,EAC5B3M,EAAKlG,aAAM,EAAX6S,EAAapV,iBACbyI,EAAKpB,SAASuqB,YACdD,EACAH,GAGJ,EAAA,EAAA,EAAA,CAAC,MAAAzuB,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAUYk0B,oBACX7H,EACA5jB,EACA2D,GAAe,IAAA,IAAAC,EAEevM,KAAI8wB,EAAJvkB,EAAK9D,cAAa,OAAAhC,QAAAC,QAAO6F,EAAKynB,YAAUntB,KAAAwtB,SAAAA,GAAA5tB,OAAAA,QAAAC,QAAAoqB,EAAAnwB,KAAA4L,EAAA8nB,EAAE1rB,IAAM9B,KAAA,SAAxEqtB,GAAe,OAAAztB,QAAAC,QACA6F,EAAK3C,SAAS0qB,YAAYhoB,YAAYigB,EAAW2H,IAAgBrtB,KAAA,SAAhFR,GAAM,IAAAmG,EAAA,OACRF,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvB8B,OAAO,IAAIC,EAAS,QAAC9B,GAAQ+B,KAAK,QAAQhB,YAC1CmF,EAAKjC,wBACLkC,OAD4BA,EAC5BD,EAAKzH,aAAL0H,EAAAA,EAAajK,iBACbgK,EAAK3C,SAAS0qB,YACd/H,EACA2H,GAGJ,EAAA,EAAA,EAAA,CAAC,MAAA5uB,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAQYq0B,eAAA,SACX5rB,EACA2D,GAAe,QAAAI,EAEe1M,KAAIgxB,EAAJtkB,EAAKjE,cAAa,OAAAhC,QAAAC,QAAOgG,EAAKsnB,YAAUntB,KAAA2tB,SAAAA,GAAA/tB,OAAAA,QAAAC,QAAAsqB,EAAArwB,KAAA+L,EAAA8nB,EAAE7rB,IAAM9B,KAAA,SAAxEqtB,GAAe,OAAAztB,QAAAC,QACAgG,EAAK9C,SAAS6qB,gBAAgBnoB,YAAY4nB,IAAgBrtB,KAAzER,SAAAA,OAAMoE,EAAA,OACR6B,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvB8B,OAAO,IAAIC,EAAAA,QAAU9B,GAAQ+B,KAAK,QAAQhB,YAC1CsF,EAAKpC,wBACLG,OAD4BA,EAC5BiC,EAAK5H,aAAL2F,EAAAA,EAAalI,iBACbmK,EAAK9C,SAAS6qB,gBACdP,GACD,EAAA,EAAA,EAEH,CAAC,MAAA5uB,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAQYw0B,mBAAA,SACXX,EACAznB,GAAe,IAAA,IAAAM,EAEM5M,KAAI,OAAAyG,QAAAC,QAAJkG,EAAKhD,SAAS+qB,qBAAqBroB,YAAYynB,IAAWltB,KAAA,SAAzER,GAAM,IAAAwG,EAAA,OACRP,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvB8B,OAAO,IAAIC,EAAS,QAAC9B,GAAQ+B,KAAK,QAAQhB,YAC1CwF,EAAKtC,wBACM,OADiBuC,EAC5BD,EAAK9H,aAAM,EAAX+H,EAAatK,iBACbqK,EAAKhD,SAAS+qB,qBACdZ,GACD,EAEH,CAAC,MAAAzuB,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAOY00B,SAAQ,SACnBtoB,GAAe,IAAA,IAAAU,EAEMhN,KAAI,OAAAyG,QAAAC,QAAJsG,EAAKpD,SAASgrB,SAAStoB,eAAazF,cAAnDR,GAAM,IAAA4G,EAAA,OACRX,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvB8B,OAAO,IAAIC,EAAS,QAAC9B,GAAQ+B,KAAK,QAAQhB,YAC1C4F,EAAK1C,+BAAuB2C,EAC5BD,EAAKlI,eAALmI,EAAa1K,iBACbyK,EAAKpD,SAASgrB,UAGlB,EAAA,CAAC,MAAAtvB,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAMY20B,eAAA,SAAeC,GAAmB,IACnB,OAAAruB,QAAAC,QAAJ1G,KAAK4J,SAASkmB,UAAUgF,IAAYjuB,KACnDY,OACT,CAAC,MAAAnC,GAAAmB,OAAAA,QAAA+B,OAAAlD,KAAApF,EAMY60B,gBAAe,SAACD,GAAmB,IAAA,IAAAvnB,EACxBvN,KAAI,OAAAyG,QAAAC,QAAJ6G,EAAK3D,SAASorB,OAAOF,IAAYjuB,KAAA,SAAjDoF,GAAOgpB,IAAAA,EACiB1nB,EAAKtE,cAAaxC,OAAAA,QAAAC,QACxC6G,EAAKymB,YAAUntB,KAAAquB,SAAAA,GAAAzuB,OAAAA,QAAAC,QAAAuuB,EAAAt0B,KAAA4M,EAAA2nB,EACrBjpB,EAAQtD,OAAOvB,YAAU,EAAA,EAI7B,CAAC,MAAA9B,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAMYi1B,QAAO,SAACL,GAAmB,IACVruB,OAAAA,QAAAC,QAAJ1G,KAAK4J,SAASwrB,YAAYN,IAAYjuB,KAAA,SAAxDwuB,GACN,OAAOC,SAASD,EAAUjuB,WAAW,EACvC,CAAC,MAAA9B,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAKYq1B,YAAW,WAAA,IAAA,IAAAllB,EACOrQ,KAAIw1B,EAAJnlB,EAAKpH,cAAa,OAAAxC,QAAAC,QACvC2J,EAAK2jB,YAAUntB,KAAA4uB,SAAAA,GAAAhvB,OAAAA,QAAAC,QACf2J,EAAKzG,SAAS2rB,eAAa1uB,KAAA6uB,SAAAA,GAAAjvB,OAAAA,QAAAC,QAAA8uB,EAAA70B,KAAA0P,EAAAolB,EAAAC,GAAA,EAAA,EAGrC,CAAC,MAAApwB,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAKY8zB,SAAQ,WAAA,IACY,OAAAvtB,QAAAC,QAAJ1G,KAAK4J,SAASlB,QAE3C,CAAC,MAAApD,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,EAAAsuB,CAAA,CAnLkB1oB,CAAQJ,ICAhB6qB,gBAAiBzqB,SAAAA,GAAAyqB,SAAAA,WAAAzqB,EAAA3K,MAAAP,KAAAY,YAAAZ,IAAA,CAAAiL,GAAA0qB,EAAAzqB,GAAA,IAAAhL,EAAAy1B,EAAAx1B,UAuD3Bw1B,OAvD2Bz1B,EAC5BmK,cAAA,WACE,OAAOurB,EAAQ,QAACxrB,GAClB,EAAClK,EAYY21B,MAAK,SAChBvpB,GAAe,IAAA,IAAAtB,EAEMhL,KAAI,OAAAyG,QAAAC,QAAJsE,EAAKpB,SAASisB,MAAMvpB,eAAazF,KAAA,SAAhDR,GAAM,IAAAsR,EACR,OAAArL,EAA0CjG,EAAMI,QAAAC,QAG3BN,GACvB8B,OAAO,IAAIC,EAAS,QAAC9B,GAAQ+B,KAAK,QAAQhB,YAC1C4D,EAAKV,wBACLqN,OAD4BA,EAC5B3M,EAAKlG,aAAL6S,EAAAA,EAAapV,iBACbyI,EAAKpB,SAASisB,OACf,EAEH,CAAC,MAAAvwB,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAWY41B,UAAA,SACXlxB,EACA0H,GAAe,IAAAC,IAAAA,EAEMvM,KAAIyG,OAAAA,QAAAC,QAAJ6F,EAAK3C,SAASmsB,WAAWzpB,YAAY1H,IAAUiC,KAA9DR,SAAAA,GAAMmG,IAAAA,SACRF,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvB8B,OAAO,IAAIC,UAAU9B,GAAQ+B,KAAK,QAAQhB,YAC1CmF,EAAKjC,wBACLkC,OAD4BA,EAC5BD,EAAKzH,aAAL0H,EAAAA,EAAajK,iBACbgK,EAAK3C,SAASmsB,WACdnxB,GAGJ,EAAA,CAAC,MAAAU,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAAqwB,CAAAA,EAAAA,CAAA,CAvD2BzqB,CAAQJ,ICDzBkrB,gBAAc,SAAA9qB,GAAA,SAAA8qB,IAAA9qB,OAAAA,EAAA3K,WAAAK,YAAAZ,IAAA,CAAAiL,GAAA+qB,EAAA9qB,OAAAhL,EAAA81B,EAAA71B,UAexB61B,OAfwB91B,EACzBmK,cAAA,WACE,OAAOhG,EAAa,QAAC+F,GACvB,EAAClK,EAOY+1B,cAAa,SAACnB,GAAmB,QAAA9pB,EACvBhL,KAAIyG,OAAAA,QAAAC,QAAJsE,EAAKpB,SAASqsB,cAAcnB,IAAYjuB,cAAvD8B,GAAM,OAAAlC,QAAAC,QACsBsE,EAAKpB,SAASssB,iBAAervB,cAAAsvB,GAA/D,IAAMC,EAAU,IAAIxC,GAAOuC,EAAsCnrB,EAAK1E,QAAO2uB,EAChDjqB,EAAK/B,cAAaxC,OAAAA,QAAAC,QAAO0vB,EAAQpC,YAAUntB,cAAAwvB,GAAA,OAAA5vB,QAAAC,QAAAuuB,EAAAt0B,KAAAqK,EAAAqrB,EAAE1tB,GAAM,EAAA,EAAA,EAElF,CAAC,MAAArD,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAA0wB,CAAAA,EAAAA,CAAA,CAfwB,CAAQlrB,ICEtBwrB,gBAAW,SAAAprB,GAAAorB,SAAAA,WAAAprB,EAAA3K,MAAAK,KAAAA,iBAAAqK,GAAAqrB,EAAAprB,OAAAhL,EAAAo2B,EAAAn2B,UA0FrB,OA1FqBD,EACtBmK,cAAA,WACE,OAAOksB,WAAcnsB,GACvB,EAAClK,EAUYs2B,cAAa,SACxB7tB,EACAijB,EACAlqB,EACA4K,GAAe,IAAA,IAAAtB,EAEMhL,YAAIyG,QAAAC,QAAJsE,EAAKpB,SAAS4sB,cAAclqB,YAAY3D,EAAQijB,EAAKlqB,IAAQmF,cAA5ER,GAAM,IAAAsR,EACR,OAAArL,EAA0CjG,EAAMI,QAAAC,QAG3BN,GACvB8B,OAAO,IAAIC,EAAS,QAAC9B,GAAQ+B,KAAK,QAAQhB,YAC1C4D,EAAKV,wBACLqN,OAD4BA,EAC5B3M,EAAKlG,aAAL6S,EAAAA,EAAapV,iBACbyI,EAAKpB,SAAS4sB,cACd7tB,EACAijB,EACAlqB,KAGJ,CAAC,MAAA4D,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAUYu2B,mBAAkB,SAC7B9tB,EACAijB,EACAlqB,EACA4K,OAAeC,IAAAA,EAEMvM,KAAI,OAAAyG,QAAAC,QAAJ6F,EAAK3C,SAAS6sB,mBAAmBnqB,YACpD3D,EACAijB,EACAlqB,IACDmF,KAAA,SAJKR,GAAMmG,IAAAA,SAKRF,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvB8B,OAAO,IAAIC,EAAAA,QAAU9B,GAAQ+B,KAAK,QAAQhB,YAC1CmF,EAAKjC,+BAAuBkC,EAC5BD,EAAKzH,eAAL0H,EAAajK,iBACbgK,EAAK3C,SAAS6sB,mBACd9tB,EACAijB,EACAlqB,GACD,EAEH,CAAC,MAAA4D,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAMYw2B,4BAAmB5B,GAAmB,IACpBruB,OAAAA,QAAAC,QAAJ1G,KAAK4J,SAAS8sB,mBAAmB5B,IAAYjuB,KAC/DY,OACT,CAAC,MAAAnC,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAQYy2B,gBAAe,SAC1B7B,EACAlJ,EACAlqB,GAAe,IAEc+E,OAAAA,QAAAC,QAAJ1G,KAAK4J,SAASgtB,gBAAgB9B,EAAalJ,EAAKlqB,IAAQmF,KAC1EY,OACT,CAAC,MAAAnC,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,EAAAgxB,CAAA,CA1FqB,CAAQxrB,oDCoD3B,IAAAoX,EAAAC,EAegB,YAAjBD,EAAAG,EAAeN,GAAAO,KAAA,KAAAN,EAAAC,MAdLA,IAMVA,EAAKC,EAAQC,GAEZD,EAAAA,EAAAK,CAQD,CASA,GAAAL,GAA6BA,OAEhC,cADErb,KAAAkb,GAAAO,KAAA,KAAAN,EAAAC,GAAAF,GAAAO,KAAA,KAAAN,EAAA,qCAvFI,IAAEI,2BACT,SAAAA,IAAS,CAoDP,OAjDFA,EAAAjiB,UAAA0G,KAAA,SAAA4b,EAAAC,eAEGT,EAAAjiB,KAAAmiB,EACG,GAAAF,EAAO,KACEU,EAAA,EAAAV,EAAAQ,EAAAC,OACJ,CACT,IAEAX,GAAArP,EAAA,EAAAiQ,EAAA3iB,KAAAuiB,uBAIG,OAAA7P,CACI,CAIL,WAGA,CA0BA,YAzBD2P,EAAA,SAAArX,GAED,oDAOO+W,GAAkBrP,EAAA,IAMvB,CAAA,MAAIpN,GAAayc,GAAArP,OAEjB,EAQAA,GAGF0P,KA9CWyU,gBAAU,SAAA3rB,GAAA,SAAA2rB,IAAA3rB,OAAAA,EAAA3K,MAAAK,KAAAA,iBAAAqK,GAAA4rB,EAAA3rB,GAAA,IAAAhL,EAAA22B,EAAA12B,UAgFpB,OAhFoBD,EACrBmK,cAAA,WACE,OAAOysB,GAAY,QAAC1sB,GACtB,EAAClK,EAOY62B,oBAAA,SACXjC,EACA1c,GAAoB,IAAA,IAAApN,EAEEhL,YAAIyG,QAAAC,QAAJsE,EAAKpB,SAASotB,UAAUlC,EAAa1c,IAAavR,cAAlEowB,GAAO,OAAAxwB,QAAAC,QACiBsE,EAAK/B,cAAcmP,EAAc6e,GAAQ,EAGzE,CAAC,MAAA3xB,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EASYg3B,aAAY,SACvBpC,EACA1c,EACA9L,GAAe,IAAAC,IAAAA,EAEMvM,KAAI,OAAAyG,QAAAC,QAAJ6F,EAAK3C,SAASutB,SAAS7qB,YAAYwoB,EAAa1c,IAAavR,cAA5ER,GAAM,IAAAmG,EACR,OAAAF,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACAkG,EAAKjC,wBACM,OADiBkC,EAC5BD,EAAKzH,aAAM,EAAX0H,EAAajK,iBACbgK,EAAK3C,SAASutB,SACdrC,EACA1c,GACD,EAEH,CAAC,MAAA9S,GAAAmB,OAAAA,QAAA+B,OAAAlD,KAAApF,EAUYk3B,gBAAA,SACXC,EACAC,EACAlf,EACA9L,GAAe,IAAAzD,IAAAA,EAAAA,kBAAApC,QAAAC,QAKMgG,EAAK9C,SAAS2tB,SAASjrB,YAC1C+qB,EACAC,EACAlf,IACDvR,cAJKR,GAAM,IAAAoE,EAAA,OAKR6B,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACAqG,EAAKpC,wBACM,OADiBG,EAC5BiC,EAAK5H,aAAM,EAAX2F,EAAalI,iBACbmK,EAAK9C,SAAS2tB,SACdF,EACAC,EACAlf,GACD,EAAA,EAAA1L,EAjBoB1M,KAAIkJ,KADLouB,IAAO,SAAlBjU,GAAgC5c,OAAAA,QAAAC,QACpBgG,EAAKjE,cAAc2P,EAAckf,EAAQjU,KAAGxc,KAAA2wB,SAAAA,GAA/DF,EAAQjU,GAAEmU,CAAqD,EAChE,+NAAA/wB,QAAAC,QAAAwC,GAAAA,EAAArC,KAAAqC,EAAArC,KAAAgC,GAAAA,IAkBH,CAAC,MAAAvD,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAA,cAAA,EAAAuxB,CAAA,CAhFoB,CAAQ/rB,wNCPxB,IAAEsX,2BACT,SAAAA,IAEAA,CAkDI,OAlDJA,EAAAjiB,UAAA0G,KAAA,SAAA4b,EAAAC,eAEGT,EAAAjiB,KAAAmiB,EACG,GAAAF,EAAO,KACEU,EAAA,EAAAV,EAAAQ,EAAAC,OACJ,CACT,IAEAX,GAAArP,EAAA,EAAAiQ,EAAA3iB,KAAAuiB,uBAIG,OAAA7P,CACI,CAIL,OAAA1S,IAEA,QACEA,KAAAqiB,EAAA,SAAArX,GACD,IACD,IAAAkX,MACD,EAAAlX,EAAAmX,EAEDJ,GAAArP,EAAA,EAAA+P,EAAAA,EAAAP,GAAAA,2BAMO,CAAA,MAA0B5c,GAK/Byc,GAAArP,EAAY,EAAGpN,EAIf,CAAiB,EACiBoN,CAClC,EAQA0P,KA/CSqV,yBAAavsB,GAAA,SAAAusB,IAAAvsB,OAAAA,EAAA3K,MAAAP,KAAAY,YAAAqK,IAAAA,CAAAA,GAAAwsB,EAAAvsB,GAAAhL,IAAAA,EAAAu3B,EAAAt3B,UAgDvB,OAhDuBD,EACxBmK,cAAA,WACE,OAAOqtB,WAAgBttB,GACzB,EAAClK,EAOYy3B,qCACX7C,EACA8C,GAAwB,IAAA,IAAA5sB,EAEFhL,KAAIyG,OAAAA,QAAAC,QAAJsE,EAAKpB,SAASiuB,WAAW/C,EAAa8C,IAAe/wB,KAArEowB,SAAAA,GACN,cAAMa,EAA4B,GAAE5uB,KAChB+tB,IAAX5T,SAAAA,GAAgC0U,IAAAA,EACvCD,EAAgB3X,KAAI1Z,OAAAA,QAAAC,QAAOsE,EAAK/B,cAAc2uB,EAAevU,GAAI4T,EAAQ5T,KAAGxc,KAAAiF,SAAAA,GAA5EisB,EAAAp3B,KAAAm3B,EAAehsB,EAA8D,EAC9E,wNAAA,OAAA5C,GAAAA,EAAArC,KAAAqC,EAAArC,gBACD,OAAOixB,CAAe,GAAfA,CAAe,EACxB,CAAC,MAAAxyB,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAQY83B,qBAAoB,SAC/BlD,EACA8C,EACAtrB,GAAe,QAAAC,EAEMvM,KAAIyG,OAAAA,QAAAC,QAAJ6F,EAAK3C,SAASquB,cAAc3rB,YAC/CwoB,EACA8C,IACD/wB,KAAA,SAHKR,GAAMmG,IAAAA,SAIRF,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACAkG,EAAKjC,wBACLkC,OAD4BA,EAC5BD,EAAKzH,aAAL0H,EAAAA,EAAajK,iBACbgK,EAAK3C,SAASquB,cACdnD,EACA8C,GAGJ,EAAA,CAAC,MAAAtyB,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,EAAAmyB,CAAA,EAhD+B3sB,gCCgD7B,GAAAoX,aAAAE,GAAA,KACSF,EAAcC,EAQnB,YADJD,EAAAG,EAAAN,GAAAO,KAAA,KAAAN,EAAAC,IANM,EAAPA,IACDA,EAAAC,EAAAC,SAUD,GAAAD,GAAAA,EAAArb,6DAIOmb,EAAAG,EAAuBF,EAK5BD,EAAAO,EAAAL,QACDM,EAAAR,EAAAK,EAEDG,SA/EK,IAAMJ,gBAAM,WACnB,SAAAA,IAAsB,CA8Cb,OA3CTA,EAAOjiB,UAAE0G,KAAA,SAAwB4b,KACjC,IAAS/P,EAAA,IAAA0P,EACFH,EAASjiB,KAAMmiB,EAEhB,GAAAF,EAAO,CACJ,IAAAU,EAAwB,EAAAV,EAAAQ,EAAAC,KAElBC,EAAA,KAEZZ,GAAArP,EAAA,EAAAiQ,EAAA3iB,KAAAuiB,GAED,CAAA,MAAAjd,yCAQGtF,KAAAqiB,EAAA,SAAArX,WAQIkX,EAAQlX,EAAQuX,EACV,EAAXvX,IACD+W,GAAArP,EAAA,EAAA+P,EAAAA,EAAAP,GAAAA,GAEDQ,eAGGX,GAAArP,EAAA,EAAAwP,SAEM5c,GACTyc,GAACrP,EAAA,EAAApN,EAED,IAGG,EACI8c,EA/CU,GAQN8V,gBAAe,SAAAhtB,GAgB1B,SAAAgtB,EACEvtB,EACArE,EACA3E,EACAmD,EACAsF,GAAe,IAAAY,EAGuB,OADtCA,EAAAE,EAAAvK,KAAMgK,KAAAA,EAASrE,EAAQ3E,EAASmD,EAAQsF,IAAIpK,MAtBvC2rB,mBAAa,EAuBlB3gB,EAAKZ,IAAMA,GAAOY,EAAKX,gBAAeW,CACxC,CAACC,GAAAitB,EAAAhtB,GAAAhL,IAAAA,EAAAg4B,EAAA/3B,UA2TA+3B,OA3TAh4B,EAtBDmK,cAAA,WACE,OAAO8tB,GAAM,QAAC/tB,GAChB,EAAClK,EA0BYk4B,SAAQ,SAAC1vB,OACHjC,OAAAA,QAAAC,QAAJ1G,KAAK4J,SAASwuB,SAAS1vB,GACtC,CAAC,MAAApD,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAMYm4B,aAAA,SAAaC,EAAe5vB,GAAa,IACnCjC,OAAAA,QAAAC,QAAJ1G,KAAK4J,SAASyuB,aAAaC,EAAO5vB,GACjD,CAAC,MAAApD,GAAAmB,OAAAA,QAAA+B,OAAAlD,KAAApF,EAMYq4B,cAAa,SAACD,GAAa,IACrB,OAAA7xB,QAAAC,QAAJ1G,KAAK4J,SAAS2uB,cAAcD,GAC3C,CAAC,MAAAhzB,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAMYs4B,SAAA,SAAS9vB,EAAe4vB,EAAeG,GAAa,IAC9C,OAAAhyB,QAAAC,QAAJ1G,KAAK4J,SAAS4uB,SAAS9vB,EAAO4vB,EAAOG,GACpD,CAAC,MAAAnzB,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAMYw4B,kBAAA,SACXhwB,EACA4vB,EACAG,GAAa,IAEIhyB,OAAAA,QAAAC,QAAJ1G,KAAK4J,SAAS8uB,kBAAkBhwB,EAAO4vB,EAAOG,GAC7D,CAAC,MAAAnzB,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAmBYy4B,4BAAA,SACXjwB,EACA6pB,EACAqG,EACAC,EACAC,EACAC,GAAsB,IAAA,IAAAC,EAAAzrB,EAEWvN,KAAI,OAAAyG,QAAAC,QAAJsyB,OAAIA,EAAJzrB,EAAKjH,OAAOK,eAAZqyB,EAAAA,EAAsBC,WACrDC,aAAW3G,KACZ1rB,KAAA,SAFKsyB,GAGN,GAAI,IAAIhxB,EAAS,QAACgxB,GAAoBC,SACpC,MAAO,CACLC,SAAS,EACTC,QAAS,+CAGb,IAAMlwB,EAAgB,IAAIsiB,GAAUne,EAAKjH,QAAOizB,EACxBnwB,EAAc2mB,UAAStpB,OAAAA,QAAAC,QAEvC6G,EAAKjH,OAAO4yB,cAAYryB,KAAA2yB,SAAAA,UAAA/yB,QAAAC,QAAA6yB,EAAA54B,KAFRyI,EACtBV,EAAK8wB,EAELjsB,EAAK3D,SAAS6vB,OAAOryB,aAAUP,KAAA,SAH3BkpB,GAAS,OAAAtpB,QAAAC,QAMO6G,EAAK9E,cAAcC,EAAOqnB,EAAW,KAAGlpB,KAAA,SAAA6yB,GAAA,SAAArS,IAAA,IAAAsS,EAU5BvwB,EAAc6C,QAAOxF,OAAAA,QAAAC,QAE/C6G,EAAKjH,OAAO4yB,cAAYryB,cAAA+yB,GAAA,OAAAnzB,QAAAC,QAAAizB,EAAAh5B,KAFEyI,EAChCV,EAAKkxB,IAAA/yB,cADDgzB,GAIN,GAAI,IAAI1xB,EAAAA,QAAU0xB,GAAqBT,SACrC,MAAO,CACLC,SAAS,EACTC,QAAS,gDAEZ,IAAAQ,EACmBvsB,EAAKmrB,kBAAiB,OAAAjyB,QAAAC,QAElC6G,EAAKjH,OAAO4yB,cAAYryB,KAAAkzB,SAAAA,GAAAtzB,OAAAA,QAAAC,QAAAozB,EAAAn5B,KAAA4M,EAD9B7E,EAAKqxB,EAELxH,IAAe1rB,KAHXmzB,SAAAA,OAAKC,EAKS1sB,EAAK8qB,aAAY,OAAA5xB,QAAAC,QAAO6G,EAAKjH,OAAO4yB,cAAYryB,KAAAqzB,SAAAA,GAAAzzB,OAAAA,QAAAC,QAAAuzB,EAAAt5B,KAAA4M,EAAA2sB,EAAExxB,IAAK7B,KAAA,SAArEszB,GAAK,SAAAzT,IAkCV,IAAAzF,EAAA,WAAA,GAZoB,IAAjB+Y,EAAM1f,OAAY,OAAA7T,QAAAC,QACd6G,EAAK6sB,UACTlB,aAAWxwB,GACXwwB,aAAW3G,IACV9qB,OAAOoxB,GAAmB,GAAGzxB,WAC9B0xB,EACAC,IACDlyB,KAAAoa,WAAAA,EAAAA,CAKF,GALEA,OAAAA,GAAAA,EAAApa,KAAAoa,EAAApa,KA7BQ,WA+BX,MAAO,CACLwyB,SAAS,EACTC,QAAS,GACV,GAHM,CACLD,SAAS,EACTC,QAAS,GAJR,CAAA,IAAAlY,EAAA,WAAA,GA5BC,IAAIjZ,UAAUgyB,EAAM,IAAIf,SAAQ,CAAA,IAAAvwB,EAAA,WAAA,GAEhC+vB,GACA,IAAIzwB,EAAS,QAACkyB,EAAUA,WAACR,IAAsBS,oBAC7C,IAAInyB,EAAS,QAACkyB,aAAWzB,MAE3B,IAAIzwB,EAAS,QAACkyB,EAAUA,WAACzB,IAAkB2B,cACzC,IAAIpyB,UAAU0wB,IACf,OAAApyB,QAAAC,QAEK6G,EAAKitB,QAAQ9xB,EAAOkwB,IAAgB/xB,KAAA,WAAA,GAAA,IAAAshB,EAAA,WAAA,GAE1C,IAAIhgB,EAAS,QAACkyB,aAAWR,IAAsBS,oBAC7C,IAAInyB,EAAAA,QAAUkyB,EAAAA,WAAWxB,KAC1B,CAAA,IAAA4B,EAEKltB,EAAKitB,QAAO/zB,OAAAA,QAAAC,QAAc6G,EAAKtE,cAAcP,EAAOmwB,IAAgBhyB,KAAA6zB,SAAAA,GAAAj0B,OAAAA,QAAAC,QAAA+zB,EAAA95B,KAAA4M,EAAvD7E,EAAKgyB,IAAA7zB,KAAA,aAAA,EAAA,CAAA,OAAAJ,QAAAC,QAElB6G,EAAKitB,QAAQ9xB,EAAOmxB,IAAoBhzB,KAAA,WAAA,EAAA,CARJ,GAQI,OAAAshB,GAAAA,EAAAthB,KAAAshB,EAAAthB,KAAAgC,mBAAA,CAAAA,CAlBd,GAkBcA,GAAAA,GAAAA,EAAAhC,KAAAgC,OAAAA,EAAAhC,KAAA,aAAA,CAAA,CAU/C,GAV+C,OAAAua,GAAAA,EAAAva,KAAAua,EAAAva,KAAA6f,GAAAA,GAAAa,EAAAA,EAAAA,EAAAA,EAAAA,EAAAA,EAAAA,CAAAA,IAAAA,EA5ChD,WAAA,GAAA,IAAIpf,UAASuxB,GAAiDiB,WAC5D,IAAIxyB,EAAS,QAAC0wB,IACfpyB,OAAAA,QAAAC,QAEK0C,EAAc0iB,QAClBoN,aAAWxwB,GACXwwB,EAAUA,WAAC3rB,EAAK3D,SAAS6vB,OAAOryB,YAChCyxB,IACDhyB,mBARD,UAQC0gB,GAAAA,EAAA1gB,KAAA0gB,EAAA1gB,KAAAwgB,GAAAA,GAAA,EAAA,EAAA,EAAA,EAoDL,CAAC,MAAA/hB,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EASYs6B,QAAA,SACX9xB,EACAC,EACA2D,GAAe,IAAA,IAAA4D,EAGMlQ,KADf46B,EAAenyB,GAAc,KAAM,KAAME,EAAQ,IAAG,OAAAlC,QAAAC,QACrCwJ,EAAKtG,SAAS4wB,QAAQluB,YAAY5D,EAAOkyB,IAAa/zB,KAAA,SAArER,GAAM,IAAA8J,EAAA,OACR7D,EAA0CjG,EAAMI,QAAAC,QAC3BN,GACvBC,EACA6J,EAAK5F,wBACL6F,OAD4BA,EAC5BD,EAAKpL,aAALqL,EAAAA,EAAa5N,iBACb2N,EAAKtG,SAAS4wB,QACd9xB,EACAkyB,GACD,EAEH,CAAC,MAAAt1B,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EASY00B,SAAQ,SACnBiG,EACAvD,EACAhrB,GAAe,IAAA+D,IAAAA,EAUWrQ,KAPpB86B,EAA4B,GAC5BC,EAA6B,GAEnC,GAAIF,EAAOvgB,SAAWgd,EAAQhd,OAC5B,MAAU,IAAAra,MAAM,uDACjB,OAAAwG,QAAAC,QAEyB2J,EAAK/J,OAAO4yB,cAAYryB,KAAA,SAA5CiuB,GAAW,SAAAkG,IAgBjB,IAAMC,EAAgBF,EAA2BG,IAAI,SAACvyB,GAAM,OAC1DF,GAAc,KAAM,KAAME,EAAQ,GAAG,GACtC,OAAAlC,QAAAC,QAEoB2J,EAAKzG,SAASgrB,SAAStoB,YAAYuuB,EAAQI,IAAcp0B,KAAxER,SAAAA,GAAMwS,IAAAA,EACR,OAAAvM,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACAgK,EAAK/F,wBACLuO,OAD4BA,EAC5BxI,EAAKvL,aAAL+T,EAAAA,EAAatW,iBACb8N,EAAKzG,SAASgrB,SACdkG,EACAG,GACDhT,EAAAA,CAAAA,IAlFMkT,EAAAC,EACLpZ,EAAOxZ,EAAP6a,EAiFD4E,GAlFMkT,EAsDaN,EAtDbO,EAsDmB,SAAjB/X,GACP,IAAM3a,EAAQmyB,EAAOxX,GACf1a,EAAS,IAAIR,EAAS,QAACmvB,EAAQjU,IAAG,OAAA5c,QAAAC,QAEpB2J,EAAKgoB,aAAavD,EAAapsB,IAAM7B,KAAnDszB,SAAAA,GACN,IAAMkB,EAAY,IAAIlzB,EAAAA,QAAUgyB,EAAM,IAElCxxB,EAAO4xB,cAAc,IAAM5xB,EAAO2xB,oBAAoBe,IACxDP,EAA0B3a,KAAKzX,GAC/BqyB,EAA2B5a,KAAKmX,EAAQjU,KAExC9hB,QAAQR,IAAoC2H,gCAAAA,EAAQ,EAEvD,EAlEC2a,GAAA,EACA,SAAAiY,EAAA5oB,cAEH2Q,EAAA8X,EAAA7gB,YAED5H,EAAA0oB,EAAA/X,6CAMG,2DAMD,CAEArB,EAAiBD,GAAAC,EAAA,KASjBA,EAAAtP,CAGF,CAAA,MAAApN,qCAmCG,OAAA2iB,GAAAA,EAAAphB,KAAAohB,EAAAphB,KAAAm0B,GAAAA,GAiBH,EAAA,CAAC,MAAA11B,UAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAYYk6B,UAAS,SACpB1xB,EACA+vB,EACAI,EACAC,EACAC,EACAzsB,GAAe,IAAAkE,IAAAA,EAEKxQ,KAAIu7B,EAAJ/qB,EAAKkoB,kBAAiB,OAAAjyB,QAAAC,QAElC8J,EAAKlK,OAAO4yB,cAAYryB,KAAA20B,SAAAA,UAAA/0B,QAAAC,QAAA60B,EAAA56B,KAAA6P,EAD9B9H,EAAK8yB,EAEL/C,IAAK5xB,KAHDmzB,SAAAA,GAKN,GAAqB,IAAjBA,EAAM1f,OAER,OADA/Y,QAAQR,IAAa03B,SAAAA,yBACd,KAET,IAAMgD,EAAwBhzB,GAAc,KAAM,KAAMowB,EAAiB,IACnE6C,EAAuBjzB,GAAc,KAAM,KAAMqwB,EAAgB,IACjE6C,EAAsBlzB,GAAc,KAAM,KAAMswB,EAAe,IAAG,OAAAtyB,QAAAC,QACnD8J,EAAK5G,SAASwwB,UAAU9tB,YAC3C5D,EACA+vB,EACAgD,EACAC,EACAC,IACD90B,KAAA,SANKR,GAAM,IAAA2S,EAAA,OAOR1M,EAA0CjG,EAAMI,QAAAC,QAC3BN,GACvBC,EACAmK,EAAKlG,wBACM,OADiB0O,EAC5BxI,EAAK1L,aAAM,EAAXkU,EAAazW,iBACbiO,EAAK5G,SAASwwB,UACd1xB,EACA+vB,EACAgD,EACAC,EACAC,GACD,EAAA,EAAA,EAEH,CAAC,MAAAr2B,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAWY07B,mBAAA,SACXC,EACAhB,EACAiB,EACAC,EACAzvB,GAAe,QAAAsE,EAEM5Q,KAAI,OAAAyG,QAAAC,QAAJkK,EAAKhH,SAASgyB,mBAAmBtvB,YACpDuvB,EACAhB,EACAiB,EACAC,IACDl1B,KALKR,SAAAA,GAAM8S,IAAAA,EAMR,OAAA7M,EAA0CjG,EAAMI,QAAAC,QAC3BN,GACvBC,EACAuK,EAAKtG,wBACM,OADiB6O,EAC5BvI,EAAK9L,aAAM,EAAXqU,EAAa5W,iBACbqO,EAAKhH,SAASgyB,mBACdC,EACAhB,EACAiB,EACAC,GACD,EAEH,CAAC,MAAAz2B,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAA4yB,CAAAA,EAAAA,CAAA,CApVyB,CAAQptB,ICLdkxB,GAAK,SAACC,GAAU,IACpC,OAAAx1B,QAAAC,QAAO,IAAID,QAAQ,SAACC,GAClBw1B,WAAWx1B,EAASu1B,EACtB,GACF,CAAC,MAAA32B,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,ECiBqB62B,GAAW,SAAC71B,EAAgBgzB,GAAe,IAC/D,IAAM8C,EAAkBpR,EAAAA,UAAUjK,EAAWA,YAACuY,IACxC+C,EAAmBC,EAAAA,SAASF,GAClC,IAAK91B,EAAOK,SACV,UAAU1G,MAAM,0CACjB,OAAAwG,QAAAC,QACyBJ,EAAOK,SAASC,cAAYC,cAAAC,GAAA,IAA9CpF,EAAOoF,EAAPpF,QAAO,+BACX+E,QAAAC,QACWJ,EAAOi2B,YAAYF,6DAFnB9zB,CACX,EAEKpH,SAAAA,GAC4C,OAAnDK,GAAeL,MAAM,uBAAwBA,iBACrB,OAApBsG,OAAO/F,GAC6C,OAAtDH,QAAQR,IAAI,2CAA0C0F,QAAAC,QACxCJ,EAAyBk2B,mBAAmBH,MAE7D,EAAA,EACH,CAAC,MAAA/2B,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAA,CAAA,0FCcE,SAAAyc,GAAAC,EAAAC,EAAAC,GAED,IAAAF,EAAAG,EAAA,2CAeME,EAAAN,GAASO,KAAA,KAAAN,EAAAC,iBATZC,EAAAA,EAAAK,CAYC,OACUL,EAAArb,iBACXqb,EAAArb,KAAAkb,GAAAO,KAAA,KAAAN,EAAAC,GAAAF,GAAAO,KAAA,KAAAN,EAAA,UAIGA,EAAAO,EAAAL,EACE,IAAAM,EAAAR,EAAAK,UAKA,CAtFH,IAAED,2BACT,SAAAA,IAEAA,CA+CM,OA/CNA,EAAOjiB,UAAE0G,KAAa,cACtB,IAAqB6L,EAAA,IAAA0P,IAWApiB,KAAAmiB,EACZ,GAAAF,EAAA,CAEP,IAAAU,EAAA,EAAAV,EAAAQ,EAAAC,YAGGX,GAAArP,EAAA,EAAAiQ,EAAA3iB,KAAAuiB,GACH,CAAA,MAAAjd,GACEyc,GAAKrP,EAAA,EAAWpN,EAClB,CAEA,OAAAoN,aAIG,CAmBE,OAlBE1S,KAAAqiB,EAAa,oBAMdH,EAAAlX,EAAAuX,EACI,EAANvX,EAAAmX,EACEJ,GAAArP,EAAA,EAAQ+P,EAAKA,EAAAP,GAAAA,UAEP,EAAAQ,EAAAR,OAGJxP,EAAA,EAAQwP,EAEV,CAAA,MAAA5c,GACDyc,GAAArP,EAAA,EAAApN,EAAM,GAENoN,CACF,EAAC0P,CACA,mBAsCI,OAAAQ,aAAAR,IAAU,EAAAQ,EAAAT,EA1EP,IAAAsa,gBAOX,WAAA,SAAAA,EAAYC,GANLA,KAAAA,iBAOL,EAAA18B,KAAK08B,YAAcA,CACrB,CAAC,IAAAx8B,EAAAu8B,EAAAt8B,UAyNA,OAzNAD,EAOYwG,QAAO,SAClBi2B,EACAC,EACAC,OAAsB7xB,IAEhB8xB,EAAO98B,KAAK08B,YAAc,4BAA8BC,EAAG,OAAAl2B,QAAAC,QAAA6B,GAC7D,WAAA,OAAA9B,QAAAC,QACqBq2B,GAAK,QAACD,EAAM,CACjCE,OAAQ,MACRC,QAAS,CAAE,eAAgB,mBAAoBC,cAAeL,GAC9DD,OAAAA,KACA/1B,KAAA,SAJIs2B,GAMFA,GAAAA,EAASC,GAAE32B,OAAAA,QAAAC,QACKy2B,EAASE,QAG3B,MAAM,IAAIp9B,MAAM,mCAAqCk9B,EAAS/xB,OAAO,EAExE,EAAA,SAAQ9F,GAEP,MADA9D,GAAeL,MAAMmE,GACf,IAAIrF,MAAM,sBACjB,GACH,CAAC,MAAAqF,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EASYo9B,eAAA,SACXX,EACAY,EACAX,EACAY,EACAC,EACAZ,YAFAW,IAAAA,EAAmB,UACE,IAArBC,IAAAA,EAAqB,KACC,IAAA,IAAAviB,EAAA3O,EAULvM,KARb09B,EAAQ,EAERD,EAAa,MACfj8B,GAAeP,KAAK,kDACpBw8B,EAAa,KACd,IAAAxc,2kBAAA0c,CACE,WAAA,SAAA90B,EAAA+0B,GAAA1iB,OAAAA,EAAA0iB,EAAAn3B,QAAAC,QAqBKs1B,GAAMwB,IAAS32B,KACrB62B,WAAAA,GAAO,EAAA,CAAA,IAAAx0B,EAAAX,GArBH,WAC+D,OAAA9B,QAAAC,QAC1Cq2B,GAAAA,QADVxwB,EAAKmwB,YAAc,4BAA8BC,EAC3B,CACjCK,OAAQ,MACRC,QAAS,CAAE,eAAgB,mBAAoBC,cAAeL,GAC9DD,OAAAA,KACA/1B,KAJIs2B,SAAAA,GAKFA,OAAAA,WAAAA,GAAAA,EAASC,GAAE32B,OAAAA,QAAAC,QACKy2B,EAASE,QAAMx2B,KAA3Bg3B,SAAAA,GACN,IACQC,EADYC,EAAUA,WAACC,YAAYH,GACHI,iBAAhCH,gBAAgD,OACpDP,EAEEO,EAAgB9Y,OAAS8Y,EAAgB9Y,MAAMuY,OAASA,GAAIriB,EACvD,EAAA2iB,QAHH,GAGe3iB,EACT,EAAA2iB,EAAY,EAAA,CARxBV,EAQwB,EAE7B,EAAA,WAAA,GAAA,OAAAj0B,GAAAA,EAAArC,KAAAqC,EAAArC,KAAAgC,GAAAA,EAAAK,IAKF,WAAA,OAAAgS,GAAQwiB,EAAQD,CAAU,GAAAh3B,OAAAA,QAAAC,QAAAua,GAAAA,EAAApa,KAAAoa,EAAApa,KAAAq3B,SAAAA,GAAAhjB,OAAAA,EAAAgjB,EACpB,IAAI,GAAAhjB,EAAA+F,EAAJ,KACT,CAAC,MAAA3b,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAUYi+B,kBACXN,EACAv3B,EACA83B,EACAxB,EACAC,GAAsB,IAEtB,IAAMwB,EAAmBD,EAAc,oCACjCE,EAAYF,EAAc,sBAAqB,OAAA33B,QAAAC,QAAA6B,GAEjD,WAAA,OAAA9B,QAAAC,QAC6BJ,EAAO4yB,cAAYryB,KAA5C03B,SAAAA,UAAgB93B,QAAAC,QAEMq2B,GAAK,QAACuB,EAA4BC,gBAAAA,EAAoB,CAChFvB,OAAQ,MACRC,QAAS,CAAE,eAAgB,mBAAoBC,cAAeL,GAC9DD,OAAAA,KACA/1B,KAAA,SAJI23B,GAAa/3B,OAAAA,QAAAC,QAKG83B,EAAcnB,QAAMx2B,KAAAC,SAAAA,OAApC23B,EAAK33B,EAAL23B,MACNl9B,QAAQR,IAAG,wBAAyBw9B,EAAgB,WAAWE,GAC1DA,GAAmB,OAAVA,IACZA,EAAQ,KAEV,IAAMC,GAAaj3B,OAAOg3B,GAAS,GAAGr3B,WAIe,OAAAX,QAAAC,QAC7By1B,GAAY71B,EADXi4B,EAAmBG,IACiB73B,KAAvD83B,SAAAA,GAC6D,OAAAl4B,QAAAC,QAC5Cq2B,GAAAA,QAAMsB,EAAkB,CAC7CrB,OAAQ,OACR5B,KAAMl2B,KAAK2F,UAHA,CAAEgzB,IAAAA,EAAKU,iBAAAA,EAAkBE,MAAOC,EAAWC,UAAAA,IAItD1B,QAAS,CACP,eAAgB,2BAChBC,cAAeL,GAEjBD,OAAAA,KACA/1B,KARIs2B,SAAAA,GAAQ12B,OAAAA,QAAAC,QASay2B,EAASE,QAAMx2B,KAAA,SAApC+3B,GACN,GAAwB,MAApBzB,EAAS/xB,OACX,MAAM,IAAInL,MAAM,8BAIlB,OAFAsB,QAAQR,IAAI,8BAEL,CACL89B,OAAO,EACPC,KAAMF,EAAaE,KACnBC,MAAO,CACLC,iBAAkBJ,EAAaK,UAC/BC,EAAGN,EAAaM,EAAE,GAClB/c,EAAGyc,EAAazc,EAAE,GAClBI,EAAGqc,EAAarc,GAEnB,YACF,EAAA,SAAQjd,GACP9D,GAAeL,MAAM,6BAA8BmE,EAAEg0B,QACtD,GACH,CAAC,MAAAh0B,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAQYi/B,iBAAgB,SAC3BxC,EACAC,EACAC,GAAsB,IAAA,IAEhBC,EAAO98B,KAAK08B,YAAc,iCAAmCC,EAAG,OAAAl2B,QAAAC,QAAA6B,GAElE,WAAA,OAAA9B,QAAAC,QACqBq2B,GAAAA,QAAMD,EAAM,CACjCE,OAAQ,MACRC,QAAS,CACP,eAAgB,mBAChBC,cAAeL,GAEjBD,OAAAA,KACA/1B,KAAA,SAPIs2B,GAAQ,GASVA,EAASC,GACX,OAAOD,EAASE,OAEhB,MAAM,IAAIp9B,MACR,4BAA8Bk9B,EAAS/xB,OAAS+xB,EAASiC,WAG9D,EAAA,EAAQj+B,SAAAA,GAEP,MADAK,GAAeL,MAAM,2BAA4BA,GACvC,IAAAlB,MAAM,2BAA6BkB,EAC9C,GACH,CAAC,MAAAmE,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAQYm/B,YAAW,SACtBC,EACA1C,EACAC,OAAsBjwB,IAEhBkwB,EAAO98B,KAAK08B,YAAc,6BAA4B,OAAAj2B,QAAAC,QAAA6B,cAExD9B,OAAAA,QAAAC,QACqBq2B,GAAAA,QAAMD,EAAM,CACjCE,OAAQ,OACR5B,KAAMl2B,KAAK2F,UAAUy0B,GACrBrC,QAAS,CACP,eAAgB,mBAChBC,cAAeL,GAEjBD,OAAAA,KACA/1B,KAAA,SARIs2B,GAAQ,GAUVA,EAASC,GACX,OAAOD,EAASE,OAEhB,UAAUp9B,MAAM,uBAAyBk9B,EAAS/xB,OAAS+xB,EAASiC,WAEvE,EAAA,EAAQj+B,SAAAA,GAEP,MADAK,GAAeL,MAAM,4BAA6BA,GAC5C,IAAIlB,MAAM,4BAA8BkB,EAC/C,GACH,CAAC,MAAAmE,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,EAAAm3B,CAAA,CA3ND,GC0tBC,SAAAl0B,GAAA6yB,EAAAmE,GAED,uEA1tBW,IAAAC,gBAAQA,WAAAA,SAAAA,KAAAt/B,IAAAA,EAAAs/B,EAAAr/B,iBAAAD,EACLu/B,mBAAkB,SAACC,GAAkC,IACR,OAAAj5B,QAAAC,QAAR,iBAAtBg5B,ECxBzB,SAAoBh3B,GACxB,IAEE,OADgBi3B,WAAIC,OAAOl3B,EAAO,CAAE20B,MAAM,GAE3C,CAAC,MAAOl8B,GACP,MAAM,IAAIlB,MAAM,qBACjB,CACH,CDmBQ4/B,CAAUH,GAAmB/0B,QACvB+0B,EAAkBxG,aAC9B,CAAC,MAAA5zB,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAEa4/B,aAAA,SACZJ,EACApG,GAAe,IAE0C,OAAA7yB,QAAAC,QAAR,iBAAtBg5B,EACN,KAAa1/B,KAAK+/B,oBAAoBL,EAAmBpG,GAChF,CAAC,MAAAh0B,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAEO8/B,iBAAA,SAAiBN,GAEvB,MADiD,iBAAtBA,EACNA,OAAoBO,CAC3C,EAAC//B,EAOKggC,aAAY,SAACC,EAAqBtD,OAAsBtwB,IAAAA,EAElCvM,KAAIyG,OAAAA,QAAAC,QAAA6B,GAAA,WAD1B9B,OAAAA,QAAAC,QACsB6F,EAAK6e,QAAQ+U,EAAatD,IAAch2B,KAA1Du5B,SAAAA,GAAS35B,OAAAA,QAAAC,QACF05B,EAAU/C,OAAM,EAC9B,EAAA,SAAQ/3B,GAEP,MADA9D,GAAeL,MAAM,wCAAyCmE,GACpD,IAAArF,MAAM,uCACjB,GACH,CAAC,MAAAqF,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAQDmgC,eAAA,SACEC,EACAC,GAEA,OAAKD,EACEA,EAAkBv7B,KACvB,SAACod,GAAM,OAAAA,EAAEoe,YAAY9b,gBAAkB8b,EAAY9b,aAAa,GAFnC,IAIjC,EAACvkB,EAQYsgC,oBAAmB,SAACC,EAA0BL,GAAc,IACvE,IAAMM,EAAsC,GAC5C,IAAK,IAAMrd,KAAK+c,EAAUM,iBAAkB,CAC1C,IAAMC,EAA4B,CAChCJ,YAAald,EACb2Z,OAAQoD,EAAUM,iBAAiBrd,GAAG,GACtCud,QACEH,EAAiBh7B,QAAQ,OAAQ,IACjC,IACA26B,EAAUM,iBAAiBrd,GAAG,GAAG5d,QAAQ,OAAQ,KAErDi7B,EAAiBvgB,KAAKwgB,EACvB,CACD,OAAAl6B,QAAAC,QAAOg6B,EACT,CAAC,MAAAp7B,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAWY2gC,SAAQ,SACnBV,EACA5N,EACAqK,EACAkE,EACAJ,GAAoC,IAAA7gB,IAAAA,EAAAA,oBAAAhX,IAQpC,IAAMi0B,EAAOpwB,EAAK2zB,eAAeK,EAAkB,SAC/Ch0B,EAAK2zB,eAAeK,EAAkB,SAASE,QAC/C,KAAI,OACH9D,EAAIv0B,GAAA,kBACL9B,QAAAC,QACqBq2B,GAAK,QAACD,EAAI,gBAAmBvK,EAAmB,CACrEyK,OAAQ,MACRC,QAAS,CAAE,eAAgB,oBAC3BL,OAAAA,KACA/1B,KAAA,SAJIs2B,GAAQ,OAAA12B,QAAAC,QAKUy2B,EAASE,QAAMx2B,KAAA,SAAAC,GAAA,IAA/B23B,EAAK33B,EAAL23B,MAGR,OAFAl9B,QAAQR,IAA4BwxB,wBAAAA,aAA0BkM,GACtCA,GAAmB,OAAVA,EAAqBh3B,OAAOg3B,GAAX,CAC7B,EAAA,EACtB,EAAA,SAAQn5B,GAEP,MADA9D,GAAeL,MAAMmE,GACX,IAAArF,MAAMqF,EAAEg0B,QACnB,GAdiB,IAAI,CAAApwB,IAAAA,iBANjBw3B,EAAgBj6B,OAAAA,QAAAC,QACMgG,EAAK8zB,oBAAoBL,EAAaW,IAAkBj6B,KAAAk6B,SAAAA,GAAjFL,EAAgBK,CAAiE,EAAA73B,IAAAA,OAAAA,GAAAA,EAAArC,KAAAqC,EAAArC,KAAAgC,GAAAA,GAAA6D,EAAAA,EAHvD1M,KAAIihB,EAD5B,WAAA,IAAC6f,EAAiB,OAAAr6B,QAAAC,QACMgG,EAAKwzB,aAAaC,IAAYt5B,KAAAm6B,SAAAA,GAAxDF,EAAiBE,CAAuC,EAAAv6B,CADtD,GACsDA,OAAAA,QAAAC,QAAAua,GAAAA,EAAApa,KAAAoa,EAAApa,KAAAgZ,GAAAA,IAuB5D,CAAC,MAAAva,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAQY6/B,oBAAA,SAAoBz5B,EAAgBgzB,GAAe,IAI9D,IAAM8C,EAAkB/yB,EAAMA,OAAC2hB,UAAUjK,EAAAA,YAAYuY,IAC/C+C,EAAmBhzB,EAAMA,OAACizB,SAASF,GAAgB,OAAA31B,QAAAC,QAAA6B,GACrD,WAAA,OAAA9B,QAAAC,QACWJ,EAAOi2B,YAAYF,GACjC,aAAe51B,OAAAA,QAAAC,QAGQJ,EAAOK,SAASC,cAAYC,KAAA,SAA5ClF,GACN,IAAMD,EAAU+F,OAAO9F,EAAQD,SAAQ,OACnCA,WAAAA,GAAY,OAAZA,EAAgB+E,OAAAA,QAAAC,QACJJ,EAAyBk2B,mBAAmBH,IADxD36B,IAGL,GACH,CAAC,MAAA4D,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAUY+gC,QAAA,SACX9b,EACAzjB,EACAy+B,EACAvD,GAAoB,IAAA,IAAAhwB,EAEY5M,KAAI,OAAAyG,QAAAC,QAAJkG,EAAKszB,aAAaC,IAAYt5B,KAAA,SAAxDi6B,GAAiB,OAAAr6B,QAAAC,QACQkG,EAAK4zB,oBAClCL,EACAW,IACDj6B,KAAA,SAHK65B,GAIN,IAAM5D,GACHlwB,EAAKyzB,eAAeK,EAAkB,WACnC9zB,EAAKyzB,eAAeK,EAAkB,WAAWE,QACjD,MAAoBl/B,YAAAA,EAAS,OAC9Bo7B,EAAIv0B,GACL,WAAA,OAAA9B,QAAAC,QACqBq2B,WAAMD,EAAM,CACjCE,OAAQ,OACR5B,KAAMl2B,KAAK2F,UAAUsa,GACrB8X,QAAS,CAAE,eAAgB,4BAC3BL,OAAAA,KACA/1B,cALIs2B,GAAQ,OAAA12B,QAAAC,QAMDy2B,EAAS+D,OACvB,EAAA,EAAQ57B,SAAAA,GAEP,MADA9D,GAAeL,MAAMmE,OACXrF,MAAM,uCACjB,GAZiB,IAAI,IAaxB,CAAC,MAAAqF,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAWYihC,cAAA,SACXxE,EACAyE,EACAjB,EACAkB,EACAzE,QADAyE,IAAAA,IAAAA,GAAwB,GACJ,IAAA,IAAAr0B,EAEYhN,KAAIyG,OAAAA,QAAAC,QAAJsG,EAAKkzB,aAAaC,IAAYt5B,KAAxDi6B,SAAAA,GAAiBr6B,OAAAA,QAAAC,QACQsG,EAAKwzB,oBAClCL,EACAW,IACDj6B,KAHK65B,SAAAA,GAAgB,SAAArZ,EAAA6W,GAAAnY,IAAAA,EAAA,SAAAW,EAAA4a,GAAAvb,OAAAA,EAAAub,EAAA76B,QAAAC,QA8BSy2B,EAASE,QAAMx2B,KAAA,SAAxC06B,GAON,MANA//B,GAAeL,MACb,0BACAg8B,EAAS/xB,OACT+xB,EAASiC,WACTmC,GAEQ,IAAAthC,MAAMiF,KAAK2F,UAAU02B,GAAkB,EAAAngB,CAAAA,IAAAA,EAAAogB,SAAAA,GAAAA,GAd7CA,OAc6CA,EAd7CrE,IAAAqE,EAAUpE,GAAE32B,OAAAA,QAAAC,QACoBy2B,EAASE,QAAMx2B,KAAA,SAA3C46B,GACN,IAAAC,IAA4BC,EAA5BD,EAAAE,GAAqBH,KAAOE,EAAAD,KAAAG,MAC1BC,EAAM3hB,KADSwhB,EAAAzf,OAGV,OADN6D,EACM,EAAA+b,CAAK,EAAA,CASmCN,GATnC,OAAApgB,GAAAA,EAAAva,KAAAua,EAAAva,KAAA6f,GAAAA,EAAAtF,GAxBd,IAMI+b,EANErhB,EAAO,CAAE6gB,IAAAA,EAAKyE,UAAAA,EAAWW,SAAUV,GACnCS,EAAoB,GACpBhF,EAAO9vB,EAAKqzB,eAAeK,EAAkB,YAC/C1zB,EAAKqzB,eAAeK,EAAkB,YAAYE,QAClD,KACJ,IAAK9D,EAAM,OAAO,KACN,IAAAvV,EAAAhf,GACR,WAAA,OAAA9B,QAAAC,QACeq2B,WAAMD,EAAM,CAC3BE,OAAQ,OACR5B,KAAMl2B,KAAK2F,UAAUiR,GACrBmhB,QAAS,CAAE,eAAgB,oBAC3BL,OAAAA,KACA/1B,KAAAm7B,SAAAA,GALF7E,EAAQ6E,CAKN,EACH,WAAQ18B,GAGP,MAFA9D,GAAeL,MAAM,2BACrBK,GAAeL,MAAMmE,GACf,IAAIrF,MAAMqF,EACjB,UAAAiiB,GAAAA,EAAA1gB,KAAA0gB,EAAA1gB,KAAAwgB,GAAAA,GAgBH,EAAA,EAAA,CAAC,MAAA/hB,GAAAmB,OAAAA,QAAA+B,OAAAlD,KAAApF,EAUY+hC,YAAW,SACtBC,EACA/B,EACAkB,EACAzE,QADA,IAAAyE,IAAAA,GAAwB,GACJ,IAAA,IAAAj0B,EAEYpN,KAAI,OAAAyG,QAAAC,QAAJ0G,EAAK8yB,aAAaC,IAAYt5B,KAAA,SAAxDi6B,GAAiB,OAAAr6B,QAAAC,QACQ0G,EAAKozB,oBAClCL,EACAW,IACDj6B,KAAA,SAHK65B,GAAgB,SAAAyB,EAAAC,GAAAvlB,IAAAA,WAAAoL,EAAAoa,GAAAxlB,OAAAA,EAAAwlB,EAAA57B,QAAAC,QA8BSy2B,EAASE,QAAMx2B,KAAxC06B,SAAAA,GAON,MANA//B,GAAeL,MACb,0BACAg8B,EAAS/xB,OACT+xB,EAASiC,WACTmC,GAEQ,IAAAthC,MAAMiF,KAAK2F,UAAU02B,GAAkB,EAAApZ,CAAAA,IAAAA,WAAAma,GAAA,GAdrC,OAcqCA,EAd7CnF,IAAAmF,EAAUlF,GAAE,OAAA32B,QAAAC,QACoBy2B,EAASE,QAAMx2B,KAA3C46B,SAAAA,GACN,IAAA,IAA4Bc,EAA5BC,EAAAZ,GAAqBH,KAAOc,EAAAC,KAAAX,MAC1BC,EAAM3hB,KADSoiB,EAAArgB,OAEhB,OAAArF,EAAA,EACMilB,CAAK,EAAA3Z,IAAAA,OAAAA,GAAAA,EAAAthB,KAAAshB,EAAAthB,KAAAohB,GAAAA,EAAAE,EAxBd,CAAA,IAMIgV,EANErhB,EAAIrZ,GAAQy/B,CAAAA,EAAAA,EAAMH,CAAAA,SAAUV,IAC5BS,EAAoB,GACpBhF,EAAO1vB,EAAKizB,eAAeK,EAAkB,YAC/CtzB,EAAKizB,eAAeK,EAAkB,YAAYE,QAClD,KACJ,IAAK9D,EAAM,OAAO,KACN,IAAA9B,EAAAzyB,GACR,WAAA,OAAA9B,QAAAC,QACeq2B,GAAK,QAACD,EAAM,CAC3BE,OAAQ,OACR5B,KAAMl2B,KAAK2F,UAAUiR,GACrBmhB,QAAS,CAAE,eAAgB,oBAC3BL,OAAAA,KACA/1B,cAAA47B,GALFtF,EAAQsF,CAKN,EACH,EAAA,SAAQn9B,GAGP,MAFA9D,GAAeL,MAAM,2BACrBK,GAAeL,MAAMmE,GACf,IAAIrF,MAAMqF,EACjB,UAAA01B,GAAAA,EAAAn0B,KAAAm0B,EAAAn0B,KAAAs7B,GAAAA,GAAA,EAAA,EAgBH,CAAC,MAAA78B,GAAAmB,OAAAA,QAAA+B,OAAAlD,KAAApF,EAQYwiC,uBAAsB,SACjCvC,EACAvD,GAAoB,IAAArvB,IAAAA,EAEYvN,KAAIyG,OAAAA,QAAAC,QAAJ6G,EAAK2yB,aAAaC,IAAYt5B,KAAxDi6B,SAAAA,GAAiBr6B,OAAAA,QAAAC,QACQ6G,EAAKizB,oBAClCL,EACAW,IACDj6B,KAAA,SAHK65B,GAAgB,IAAAiC,EAAA,SAAAC,EAAAC,GAAAC,IAAAA,EAkBtB,OAAIA,OAAJA,EAAI3F,IAAA2F,EAAU1F,GACGD,EAASE,OAOzB52B,QAAAC,QAC8By2B,EAASE,QAAMx2B,KAAA,SAAxC06B,GAON,MANA//B,GAAeL,MACb,6BACAg8B,EAAS/xB,OACT+xB,EAASiC,WACTmC,GAEI,IAAIthC,MAAMiF,KAAK2F,UAAU02B,GAAkB,GA9BjD,IAEIpE,EAFEL,EAAmE,OAA/D6F,EAAGp1B,EAAK8yB,eAAeK,EAAkB,6BAAsB,EAA5DiC,EAA8D/B,QAC3E,IAAK9D,EAAM,OAAW,KACV,IAAAiG,EAAAx6B,cACR9B,OAAAA,QAAAC,QACeq2B,GAAK,QAACD,EAAM,CAC3BE,OAAQ,MACRC,QAAS,CAAE,eAAgB,oBAC3BL,OAAAA,KACA/1B,KAAA,SAAAm8B,GAJF7F,EAAQ6F,CAIN,EACH,EAAQ19B,SAAAA,GAGP,MAFA9D,GAAeL,MAAM,8BACrBK,GAAeL,MAAMmE,GACf,IAAIrF,MAAMqF,EACjB,GAAAy9B,OAAAA,GAAAA,EAAAl8B,KAAAk8B,EAAAl8B,KAAA+7B,GAAAA,GAAA,EAAA,EAkBH,CAAC,MAAAt9B,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAeY+iC,WAAA,SACXtG,EACAyE,EACA8B,EACA3Q,EACA4N,EACAvD,EACAuG,EACAC,EACAC,GAAmB,IAAAnzB,IAAAA,EAEalQ,KAAIyG,OAAAA,QAAAC,QAAJwJ,EAAKgwB,aAAaC,IAAYt5B,KAAxDi6B,SAAAA,GAAiBr6B,OAAAA,QAAAC,QACQwJ,EAAKswB,oBAClCL,EACAW,IACDj6B,KAAA,SAHK65B,GAAgB,SAAA4C,EAAAC,OAAAxc,EAAA,SAAAyc,EAAAC,GAAA1c,OAAAA,EAAA0c,EAAAh9B,QAAAC,QAiCSy2B,EAASE,QAAMx2B,KAAA,SAAxC06B,GAON,MANA//B,GAAeL,MACb,gCACAg8B,EAAS/xB,OACT+xB,EAASiC,WACTmC,GAEQ,IAAAthC,MAAMiF,KAAK2F,UAAU02B,GAAkB,EAAAmC,CAAAA,IAAAA,EAAAC,SAAAA,MAXxB,OAArBA,OAAAA,EAAAxG,QAAAwG,EAAAA,EAAUv4B,QAAc,OAAA3E,QAAAC,QACgBy2B,EAASE,QAAMx2B,KAAA,SAAnD46B,GACC,OADM1a,EACN,EAAA0a,CAAO,EAAA,CASiCkC,GATjC,OAAAD,GAAAA,EAAA78B,KAAA68B,EAAA78B,KAAA28B,GAAAA,EAAAE,EAAA,CA3BhB,IAaIvG,EAbAyG,EAAgB1zB,EAAKmwB,eAAeK,EAAkB,cACtDxwB,EAAKmwB,eAAeK,EAAkB,cAAcE,QACpD,KAEJ,IAAKgD,EAAe,OAAO,KAC3BA,GAAa,eAAmBjH,EAChCiH,GAAa,cAAkBxC,EAC/BwC,GAAa,cAAkBV,EAC/BU,GAAa,oBAAwBrR,EACjC4Q,IACFS,GAAiB,aAAeC,UAAU3+B,KAAK2F,UAAUs4B,KACvDC,IAAYQ,GAAiB,gBAAkBC,UAAUT,IACzDC,IAAYO,GAAiB,eAAiBP,GACtC,IAAAS,EAAAv7B,GACR,WAAA,OAAA9B,QAAAC,QACeq2B,GAAK,QAAC6G,EAAe,CACpC5G,OAAQ,MACRC,QAAS,CAAE,eAAgB,oBAC3BL,OAAAA,KACA/1B,KAAAk9B,SAAAA,GAJF5G,EAAQ4G,CAIN,EACH,EAAA,SAAQz+B,GAGP,MAFA9D,GAAeL,MAAM,iCACrBK,GAAeL,MAAMmE,GACf,IAAIrF,MAAK,mCAAoC2jC,EAAa,IACjE,GAAAE,OAAAA,GAAAA,EAAAj9B,KAAAi9B,EAAAj9B,KAAAy8B,GAAAA,GAaH,EAAA,EAAA,CAAC,MAAAh+B,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAYY8jC,oBAAmB,SAC9BC,EACAC,EACAd,EACAjD,EACAgE,EACAziC,EACAgH,EACA07B,EACAxH,GAAoB,IAAA,IAAAvsB,EAEYrQ,KAAI,OAAAyG,QAAAC,QAAJ2J,EAAK6vB,aAAaC,IAAYt5B,KAAA,SAAxDi6B,GAAiB,OAAAr6B,QAAAC,QACQ2J,EAAKmwB,oBAClCL,EACAW,IACDj6B,KAAA,SAHK65B,GAAgB,SAAA2D,EAAAC,GAAA3mB,IAAAA,EAAA,SAAA4mB,EAAAC,GAAA7mB,OAAAA,EAAA6mB,EAAA/9B,QAAAC,QAqCSy2B,EAASE,QAAMx2B,KAAxC06B,SAAAA,GAQN,MAPA//B,GAAeL,MACb,8BACAg8B,EAAS/xB,OACT+xB,EAASiC,WACTmC,GAEF//B,GAAeL,MAAM,eAAgB+D,KAAK2F,UAAU45B,IAC1C,IAAAxkC,MAAMiF,KAAK2F,UAAU02B,GAAkB,EAAA,CAAA,IAAAmD,EAAA,SAAAC,GAAAA,GAZ7CA,OAY6CA,EAZ7CxH,IAAAwH,EAAUvH,UAAE32B,QAAAC,QACOy2B,EAASE,QAAMx2B,KAA9B+9B,SAAAA,GACC,OADKjnB,EACL,EAAAinB,CAAM,EAAA,CAUkC,GAVlC,OAAAF,GAAAA,EAAA79B,KAAA69B,EAAA79B,KAAA09B,GAAAA,EAAAG,EA/Bf,CAAA,IAgBIvH,EAXEsH,EAAkB,CACtBI,SAAUZ,EACVC,UAAAA,EACAY,QAR8B,CAC9BpjC,QAAAA,EACAgH,MAAAA,EACA07B,eAAAA,GAMA7R,gBAAiB4R,EACjBY,YAAa3B,GAETQ,EAAgBvzB,EAAKgwB,eAAeK,EAAkB,qBACxDrwB,EAAKgwB,eAAeK,EAAkB,qBAAqBE,QAC3D,KACJ,IAAKgD,EAAe,OAAW,KACnB,IAAAoB,EAAAz8B,GAAA,WACR9B,OAAAA,QAAAC,QACeq2B,WAAM6G,EAAe,CACpC5G,OAAQ,OACR5B,KAAMl2B,KAAK2F,UAAU45B,GACrBxH,QAAS,CAAE,eAAgB,oBAC3BL,OAAAA,KACA/1B,KAAA,SAAAo+B,GALF9H,EAAQ8H,CAKN,EACH,EAAQ3/B,SAAAA,GAGP,MAFA9D,GAAeL,MAAM,+BACrBK,GAAeL,MAAMmE,GACf,IAAIrF,MAAM,mCACjB,GAAA+kC,OAAAA,GAAAA,EAAAn+B,KAAAm+B,EAAAn+B,KAAAw9B,GAAAA,GAcH,EAAA,EAAA,CAAC,MAAA/+B,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAgBYglC,kBAAiB,SAC5BjB,EACAC,EACAd,EACA16B,EACA26B,EACAlD,EACAT,EACAyF,EACAzjC,EACA0jC,EACAxI,GAAoB,IAAA,IAAApsB,EAEYxQ,KAAIyG,OAAAA,QAAAC,QAAJ8J,EAAK0vB,aAAaC,IAAYt5B,KAAA,SAAxDi6B,GAAiB,OAAAr6B,QAAAC,QACQ8J,EAAKgwB,oBAClCL,EACAW,IACDj6B,KAHK65B,SAAAA,GAIN,IAAMkD,EAAgBpzB,EAAK6vB,eAAeK,EAAkB,qBACxDlwB,EAAK6vB,eAAeK,EAAkB,qBAAqBE,QAC3D,KAAI,OACHgD,EAAan9B,QAAAC,QAIY8J,EAAKivB,mBAAmBC,IAAkB74B,KAAlE0rB,SAAAA,GAAe9rB,OAAAA,QAAAC,QAEZ8J,EAAKqwB,SACVV,EACA5N,EACAqK,EACAkE,EACAJ,IACD75B,KAAA,SAAAw+B,GAAA,IAAAC,EAPG7G,GACJ4G,EAMK,GACLj+B,WAGEm+B,EAAmBhT,EAEE,OADzBgT,GAAoBD,OAAJA,EAAIrB,EAAO,SAAPqB,EAAAA,EAAWE,WAC/BD,GAAoB9G,EAAKh4B,QAAAC,QACD8J,EAAKsvB,aAAaJ,EAAmB6F,IAAiB1+B,KAAA,SAAxE83B,GAAS8G,SAAAA,EAAAC,GAAA,IAAA3d,EAAA4d,SAAAA,EAAAC,GAAA,OAAA7d,EAAA6d,EAAAn/B,QAAAC,QA4CgBy2B,EAASE,QAAMx2B,KAAxC06B,SAAAA,GAQN,MAPA//B,GAAeL,MACb,8BACAg8B,EAAS/xB,OACT+xB,EAASiC,WACTmC,GAEF//B,GAAeL,MAAM,eAAgB+D,KAAK2F,UAAUg7B,IAC9C,IAAI5lC,MAAMiF,KAAK2F,UAAU02B,GAAkB,EAAA,CAAA,IAAAuE,EAAAC,SAAAA,GAAAA,GAZ7CA,OAY6CA,EAZ7C5I,IAAA4I,EAAU3I,GAAE,OAAA32B,QAAAC,QACOy2B,EAASE,QAAMx2B,KAAA,SAA9B+9B,GACC,OADK7c,EACL,EAAA6c,CAAM,EAAA,CAUkCmB,GAVlC,OAAAD,GAAAA,EAAAj/B,KAAAi/B,EAAAj/B,KAAA8+B,GAAAA,EAAAG,EAAA,CAxCf,IAgBI3I,EAhBE0I,EAAoC,CACxChB,SAAUZ,EACVC,UAAAA,EACAa,YAAa3B,EACb0B,QAAS,CACPpjC,QAAAA,EACAgH,MAAAA,EACAy8B,UAAAA,GAEFf,eAAgBf,EAChB9Q,gBAAAA,EACAoM,UAAAA,GAGEyG,IAAcS,EAAaT,aAAeA,GAElC,IAAAY,EAAAz9B,GAAA,WAE2C,OAArDhH,QAAQR,IAAI,0BAA2B6iC,GAAcn9B,QAAAC,QACpCq2B,WAAM6G,EAAe,CACpC5G,OAAQ,OACR5B,KAAMl2B,KAAK2F,UAAUg7B,GACrB5I,QAAS,CACP,eAAgB,mBAChBC,cAAe1sB,EAAKwvB,iBAAiBN,IAEvC9C,OAAAA,KACA/1B,KAAAo/B,SAAAA,GACoC,OATtC9I,EAAQ8I,EASR1kC,QAAQR,IAAI,gBAAiBo8B,GACzB,WAAA,IAACA,EAASC,GAAE,OAAA32B,QAAAC,QACUy2B,EAAS+D,QAAMr6B,KAAjCq/B,SAAAA,GACN,MAAU,IAAAjmC,MAAK,GAAIimC,EAAY,EAAA,CAF7B,EAE6B,EAElC,EAAA,SAAQ5gC,GAGP,MAFA9D,GAAeL,MAAM,+BACrBK,GAAeL,MAAMmE,GACf,IAAIrF,2CAA2CqF,EAAEg0B,QAAO,IAC/D,GAAA0M,OAAAA,GAAAA,EAAAn/B,KAAAm/B,EAAAn/B,KAAA4+B,GAAAA,GA1D0B,EAAA,EAAA,GAAA,IAAI,EAwEjC,EAAA,CAAC,MAAAngC,GAAAmB,OAAAA,QAAA+B,OAAAlD,KAAApF,EAcYimC,eAAc,SACzBxJ,EACAyE,EACA8B,EACAkD,EACAjG,EACAT,EACA0F,EACAjC,GAA2C,IAAA,IAAAvyB,EAEX5Q,KAAI,OAAAyG,QAAAC,QAAJkK,EAAKsvB,aAAaC,IAAYt5B,KAAA,SAAxDi6B,GAAiB,OAAAr6B,QAAAC,QACQkK,EAAK4vB,oBAClCL,EACAW,IACDj6B,KAHK65B,SAAAA,GAIN,IAAM2F,EAAcz1B,EAAKyvB,eAAeK,EAAkB,YACtD9vB,EAAKyvB,eAAeK,EAAkB,YAAYE,QAClD,KAAI,OACHyF,EAAW5/B,QAAAC,QACckK,EAAK6uB,mBAAmBC,IAAkB74B,KAAlE0rB,SAAAA,UAAe9rB,QAAAC,QAEZkK,EAAKiwB,SACVV,EACA5N,EACA,KACAuO,EACAJ,IACD75B,KAAA,SAAAy/B,GAPH,IAAM7H,GACJ6H,EAMK,GACLl/B,WAAU,OAAAX,QAAAC,QAEYkK,EAAKkvB,aAAaJ,EAAmB/C,EAAM8B,IAAM53B,KAAA,SAAnE83B,GACN,IAAI4H,EAAaF,EAcjB,OAbAE,GAAU,cAAkBrD,EAC5BqD,GAAU,eAAmB5J,EAC7B4J,GAA+BH,iBAAAA,EAC/BG,GAA4BnF,cAAAA,EAC5BmF,GAAU,oBAAwBhU,EAClCgU,GAAU,UAAc9H,EACpB2G,IACFmB,GAAc,iBAAmB1C,UAAU3+B,KAAK2F,UAAUu6B,KAG5DmB,GAAU,cAAkB5H,EACxBwE,IACFoD,GAAc,aAAe1C,UAAU3+B,KAAK2F,UAAUs4B,KACjDoD,CAAU,EA3BQ,EAAA,GAAA,IAAI,EA4B/B,EAAA,CAAC,MAAAjhC,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAcYsmC,eAAc,SACzBrG,EACAjS,EACAkV,EACAqD,EACAvC,EACAtH,EACA8J,EACAC,GAAsB,IAAA3pB,IAAAA,EAEUhd,KAAIyG,OAAAA,QAAAC,QAAJsW,EAAKkjB,aAAaC,IAAYt5B,cAAxDi6B,GAAiB,OAAAr6B,QAAAC,QACQsW,EAAKwjB,oBAClCL,EACAW,IACDj6B,KAAA,SAHK65B,GAIN,IAAMkG,EAAkB5pB,EAAKqjB,eAAeK,EAAkB,gBAC1D1jB,EAAKqjB,eAAeK,EAAkB,gBAAgBE,QACtD,KAAI,OAAAn6B,QAAAC,QAEsBwnB,EAASgL,cAAYryB,KAAA,SAA7C0rB,GAAe,OAAA9rB,QAAAC,QAEZsW,EAAK6jB,SACVV,EACA5N,EACAqK,EACAkE,EACAJ,IACD75B,KAAA,SAAAggC,GAPH,IAAMpI,GACJoI,EAMK,GACLz/B,WAEEm+B,EAAmBhT,EAEE,OADzBgT,GAAoBkB,EAAQjB,WAC5BD,GAAoB9G,EAAKh4B,QAAAC,QACDsW,EAAK+iB,oBAAoB7R,EAAUqX,IAAiB1+B,KAAtE83B,SAAAA,GAAS,SAAAmI,EAAAC,GAAAC,IAAAA,EAAA,SAAAC,EAAAC,GAAAF,GAAAA,EAAAE,OAAAA,MAAAC,EA6Bf3lC,GAAeL,MAAKimC,EAGlBjK,EAASiC,WAAUiI,EADnBlK,EAAS/xB,OAAM3E,OAAAA,QAAAC,QAETy2B,EAASE,QAAMx2B,KAAA,SAAAygC,GAGvB,OAPAH,EAAAxmC,KAAAa,GACE,yBAAwB6lC,EAAAD,EAAAE,GAK1B9lC,GAAeL,MAAM,eAAgBsjC,GAC1B,IAAA,EAAA,CAAA,IAAA8C,EAAA,SAAAC,GAAAA,GAXPA,OAWOA,EAXPrK,IAAAqK,EAAUpK,UAAE32B,QAAAC,QACOy2B,EAASE,QAAMx2B,KAAA,SAA9B+9B,GAAM,OAAAoC,EAAA,EACLpC,CAAM,EAAA,CASJ,GATI,OAAA2C,GAAAA,EAAA1gC,KAAA0gC,EAAA1gC,KAAAogC,GAAAA,EAAAM,GA1Bf,IAUIpK,EAVEsH,EAAUlf,SAShB,GARAkf,EAAQlS,gBAAkBA,EAC1BkS,EAAQ9F,UAAYA,EACpB8F,EAAQhG,MAAQA,EAChBgG,EAAQM,YAAc3B,EACtBqB,EAAQgC,QAAUA,EAClBhC,EAAQP,UAAYA,EAChBwC,IAAoBjC,EAAQiC,mBAAqBA,GACjDC,IAAQlC,EAAQkC,OAASA,IACxBC,EAAiB,OAAW,KACrB,IAAAa,EAAAl/B,GAAA,WACR9B,OAAAA,QAAAC,QACeq2B,GAAK,QAAC6J,EAAiB,CACtC5J,OAAQ,OACR5B,KAAMl2B,KAAK2F,UAAU45B,GACrBxH,QAAS,CAAE,eAAgB,oBAC3BL,OAAAA,KACA/1B,KAAA,SAAA6gC,GALFvK,EAAQuK,CAKN,EACH,EAAQpiC,SAAAA,GAIP,MAHA9D,GAAeL,MAAM,yBACrBK,GAAeL,MAAMmE,GACrB9D,GAAeL,MAAM,eAAgBsjC,GAC/B,IAAIxkC,MAAM,uCACjB,GAAA,OAAAwnC,GAAAA,EAAA5gC,KAAA4gC,EAAA5gC,KAAAigC,GAAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAaH,CAAC,MAAAxhC,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAkBYynC,aAAY,SACvBxH,EACAT,EACA0D,EACAyB,EACAX,EACAE,EACA17B,EACAy8B,EACAzjC,EACAkmC,EACAC,EACAlB,EACAvB,EACAxI,GAAoB,IAAA3rB,IAAAA,EAKYjR,KADK,OAFrCuB,QAAQR,IAAI,sCACZQ,QAAQR,IAAI,aAAc8jC,GAC1BtjC,QAAQR,IAAI,cAAemjC,GAAUz9B,QAAAC,QACLuK,EAAKivB,aAAaC,IAAYt5B,KAAA,SAAxDi6B,GAAiB,OAAAr6B,QAAAC,QACQuK,EAAKuvB,oBAClCL,EACAW,IACDj6B,KAHK65B,SAAAA,GAKN,IAAMkG,EAAkB31B,EAAKovB,eAAeK,EAAkB,gBAC1DzvB,EAAKovB,eAAeK,EAAkB,gBAAgBE,QACtD,KAEJ,OAAKgG,EAKJngC,QAAAC,QAE6BuK,EAAKwuB,mBAAmBC,IAAkB74B,KAAA,SAAlE0rB,GAAe9rB,OAAAA,QAAAC,QAEZuK,EAAK4vB,SACVV,EACA5N,EACAqK,EACAkE,EACAJ,IACD75B,KAAAihC,SAAAA,GAAAC,IAAAA,EAPGtJ,GACJqJ,EAMK,GACL1gC,WAEEm+B,EAAmBhT,EAEE,OADzBgT,GAA+B,OAAfwC,EAAIlD,EAAS,SAAE,EAAXkD,EAAavC,WACjCD,GAAoB9G,EAAKh4B,QAAAC,QACDuK,EAAK6uB,aAAaJ,EAAmB6F,IAAiB1+B,cAAxE83B,GAAS,SAAAqJ,EAAAC,GAAAjf,IAAAA,EAAAkf,SAAAA,EAAAC,GAAA,OAAAnf,EAAAmf,EAAA1hC,QAAAC,QA8CgBy2B,EAASE,QAAMx2B,KAAA,SAAxC06B,GAQN,MAPA//B,GAAeL,MACb,yBACAg8B,EAAS/xB,OACT+xB,EAASiC,WACTmC,GAEF//B,GAAeL,MAAM,eAAgBsjC,GAC3B,IAAAxkC,MAAMiF,KAAK2F,UAAU02B,GAAkB,EAAA6G,CAAAA,IAAAA,EAAAC,SAAAA,GAAAA,GAZ7CA,OAY6CA,EAZ7ClL,IAAAkL,EAAUjL,GAAE32B,OAAAA,QAAAC,QACOy2B,EAASE,QAAMx2B,KAA9B+9B,SAAAA,GACC,OADK5b,EACL,EAAA4b,CAAM,EAAA,CAUkCyD,GAVlC,OAAAD,GAAAA,EAAAvhC,KAAAuhC,EAAAvhC,KAAAqhC,GAAAA,EAAAE,EA3Cf,CAAA,IAwBIjL,EAxBEsH,EAAUlf,SAChBkf,EAAQlS,gBAAkBA,EAC1BkS,EAAQ9F,UAAYA,EACpB8F,EAAQhG,MAAQA,EAChBgG,EAAQM,YAAc3B,EACtBqB,EAAQL,eAAiBA,EACzBK,EAAQU,UAAYA,EAEpBV,EAAQgC,QAAU5B,EAAS,GAE3BJ,EAAQI,SAAWA,EACnBJ,EAAQP,UAAYA,EACpBO,EAAQ/iC,QAAUA,EAClB+iC,EAAQK,QAAU,CAChBpjC,QAAAA,EACAgH,MAAAA,EACA07B,eAAAA,GAEEe,IAAWV,EAAQK,QAAQK,UAAYA,GACvCyC,IAAUnD,EAAQmD,SAAWA,GAC7BC,IAAmBpD,EAAQoD,kBAAoBA,GAE/ClB,IAAQlC,EAAQkC,OAASA,GACzBvB,IAAcX,EAAQW,aAAeA,GAC7B,IAAAkD,EAAA//B,GACR,WAAA,OAAA9B,QAAAC,QACeq2B,WAAM6J,EAAiB,CACtC5J,OAAQ,OACR5B,KAAMl2B,KAAK2F,UAAU45B,GACrBxH,QAAS,CACP,eAAgB,mBAChBC,cAAejsB,EAAK+uB,iBAAiBN,IAEvC9C,OAAAA,KACA/1B,KAAA,SAAA0hC,GARFpL,EAAQoL,CAQN,EACH,EAAQjjC,SAAAA,GAIP,MAHA9D,GAAeL,MAAM,yBACrBK,GAAeL,MAAMmE,GACrB9D,GAAeL,MAAM,eAAgBsjC,OAC3BxkC,MAAM,uCACjB,GAAAqoC,OAAAA,GAAAA,EAAAzhC,KAAAyhC,EAAAzhC,KAAAmhC,GAAAA,GAAA,EAAA,EAAA,IA7DCxmC,GAAeL,MACb,qGAEK,KA0DR,EAAA,EAcH,CAAC,MAAAmE,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAeYsoC,iBAAgB,SAC3BrI,EACAT,EACA0D,EACAyB,EACAX,EACAiB,EACAyC,EACAC,EACAlB,EACAvB,EACAxI,GAAoB,IAAAzqB,IAAAA,EAKYnS,KADK,OAFrCuB,QAAQR,IAAI,2CACZQ,QAAQR,IAAI,aAAc8jC,GAC1BtjC,QAAQR,IAAI,cAAemjC,GAAUz9B,QAAAC,QACLyL,EAAK+tB,aAAaC,IAAYt5B,KAAA,SAAxDi6B,GAAiB,OAAAr6B,QAAAC,QACQyL,EAAKquB,oBAClCL,EACAW,IACDj6B,KAAA,SAHK65B,GAKN,IAAMkG,EAAkBz0B,EAAKkuB,eAAeK,EAAkB,eAC1DvuB,EAAKkuB,eAAeK,EAAkB,eAAeE,QACrD,KAEJ,OAAKgG,EAKJngC,QAAAC,QAE6ByL,EAAKstB,mBAAmBC,IAAkB74B,KAAA,SAAlE0rB,GAAe,OAAA9rB,QAAAC,QAEZyL,EAAK0uB,SACVV,EACA5N,EACAqK,EACAkE,EACAJ,IACD75B,KAAA,SAAA4hC,GAPH,IAAMhK,GACJgK,EAMK,GACLrhC,WAEIm+B,EAAmB9G,EAC0B,OAAnDl9B,QAAQR,IAAI,qBAAsBwkC,GAAiB9+B,QAAAC,QAC3ByL,EAAK2tB,aAAaJ,EAAmB6F,IAAiB1+B,KAAA,SAAxE83B,GAAS,SAAA+J,EAAAC,GAAAC,IAAAA,EAAA,SAAAC,EAAAC,GAAAF,OAAAA,EAAAE,EAAAriC,QAAAC,QAsCgBy2B,EAASE,QAAMx2B,KAAxC06B,SAAAA,GAQN,MAPA//B,GAAeL,MACb,yBACAg8B,EAAS/xB,OACT+xB,EAASiC,WACTmC,GAEF//B,GAAeL,MAAM,eAAgBsjC,GAC3B,IAAAxkC,MAAMiF,KAAK2F,UAAU02B,GAAkB,EAAAwH,CAAAA,IAAAA,EAAAC,SAAAA,GAAAA,UAAAA,EAZ7C7L,IAAA6L,EAAU5L,GAAE,OAAA32B,QAAAC,QACOy2B,EAASE,QAAMx2B,KAA9B+9B,SAAAA,GAAM,OAAAgE,EAAA,EACLhE,CAAM,EAAAmE,CAUkCC,GAVlCD,OAAAA,GAAAA,EAAAliC,KAAAkiC,EAAAliC,KAAAgiC,GAAAA,EAAAE,EAAA,CAnCf,IAgBI5L,EAhBEsH,EAAUlf,SAChBkf,EAAQlS,gBAAkBA,EAC1BkS,EAAQ9F,UAAYA,EACpB8F,EAAQhG,MAAQA,EAChBgG,EAAQM,YAAc3B,EACtBqB,EAAQU,UAAYA,EAEpBV,EAAQgC,QAAU5B,EAAS,GAE3BJ,EAAQI,SAAWA,EACnBJ,EAAQP,UAAYA,EAChB0D,IAAUnD,EAAQmD,SAAWA,GAC7BC,IAAmBpD,EAAQoD,kBAAoBA,GAEnDpD,EAAQkC,OAASA,EACbvB,IAAcX,EAAQW,aAAeA,GAC7B,IAAA6D,EAAA1gC,cACR9B,OAAAA,QAAAC,QACeq2B,GAAAA,QAAM6J,EAAiB,CACtC5J,OAAQ,OACR5B,KAAMl2B,KAAK2F,UAAU45B,GACrBxH,QAAS,CACP,eAAgB,mBAChBC,cAAe/qB,EAAK6tB,iBAAiBN,IAEvC9C,OAAAA,KACA/1B,KAAAqiC,SAAAA,GARF/L,EAAQ+L,CAQN,EACH,EAAA,SAAQ5jC,GAIP,MAHA9D,GAAeL,MAAM,yBACrBK,GAAeL,MAAMmE,GACrB9D,GAAeL,MAAM,eAAgBsjC,GAC/B,IAAIxkC,MAAM,uCACjB,GAAA,OAAAgpC,GAAAA,EAAApiC,KAAAoiC,EAAApiC,KAAA6hC,GAAAA,GAcH,EAAA,EAAA,IAlEIlnC,GAAeL,MACb,0GAiEN,EAAA,EAAA,CAAC,MAAAmE,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAUYipC,sBAAqB,SAChChJ,EACAT,EACA0J,EACAxM,GAAoB,IAAAnqB,IAAAA,EAGYzS,KAD1BqpC,EAA2C,iBAAtB3J,EAA8B,OAAAj5B,QAAAC,QACzB+L,EAAKytB,aAAaC,IAAYt5B,KAAxDi6B,SAAAA,GAAiBr6B,OAAAA,QAAAC,QACQ+L,EAAK+tB,oBAClCL,EACAW,IACDj6B,KAHK65B,SAAAA,GAKN,IAAMyI,EAAwB12B,EAAK4tB,eACjCK,EACA,yBAEEjuB,EAAK4tB,eAAeK,EAAkB,yBAAyBE,QAC/D,KAEJ,OAAKuI,EAKJ1iC,QAAAC,QAC6B+L,EAAKgtB,mBAAmBC,IAAkB74B,KAAlE0rB,SAAAA,GAAe9rB,OAAAA,QAAAC,QAEZ+L,EAAKouB,SACVV,EACA5N,EACAqK,EACAkE,EACAJ,IACD75B,KAAA,SAAAyiC,GAAA,SAAAC,IAAAC,IAYCrM,EAZDsM,SAAAA,EAAAC,GAAA,IAAAC,EAAAC,EA4BH,GAAID,OAAAA,EAAAxM,IAAAwM,EAAUvM,IAA2B,OAAb,OAARwM,EAAAzM,QAAQ,EAARyM,EAAUx+B,QAG5B,OADA7J,QAAQR,IAAI,iBAAkBo8B,EAAS/B,MAChC+B,EAAS/B,KACjB,IAAAyO,EACDroC,GAAeL,MAAK2oC,EAGlB3M,EAASiC,WAAU2K,EADnB5M,EAAS/xB,OAAM3E,OAAAA,QAAAC,QAETy2B,EAASE,QAAMx2B,KAAAmjC,SAAAA,GAEvB,OANAH,EAAAlpC,KAAAa,GACE,iCAAgCuoC,EAAAD,EAAAE,GAKvB,IAAA,EAAA,CA3BC,IAAAC,EAAA1hC,GAAA,WACR9B,OAAAA,QAAAC,QACeq2B,GAAAA,QAAMoM,EAAwBe,EAAK,CAClDlN,OAAQ,MACRC,QAAS,CACP,eAAgB,mBAChBC,cAAezqB,EAAKutB,iBAAiBN,IAEvC9C,OAAAA,KACA/1B,KAAA,SAAAsjC,GAPFhN,EAAQgN,EAQR5oC,QAAQR,IAAI,gBAAiBo8B,EAAS,EACvC,EAAQ73B,SAAAA,GAGP,MAFA9D,GAAeL,MAAM,iCACrBK,GAAeL,MAAMmE,GACX,IAAArF,MAAM,uCACjB,GAAAgqC,OAAAA,GAAAA,EAAApjC,KAAAojC,EAAApjC,KAAA4iC,GAAAA,GAlCD,CAAA,IAAMhL,GACJ6K,EAMK,GACLliC,WAEE8iC,EAA0B3X,oBAAAA,EAAyB6W,UAAAA,EAAOgB,EAE1D,WAAA,IAACf,EAC0D,OAAA5iC,QAAAC,QACrC+L,EAAKqtB,aAAaJ,EADpB,GAAMnN,EAAkB6W,EAAQ3K,IACwB53B,KAAA,SAAxE83B,GACNuL,GAAG,cAAkBvL,EACrBuL,GAAiBzL,UAAAA,CAAO,EAAA2L,CAJtB,GAIsBA,OAAAA,GAAAA,EAAAvjC,KAAAujC,EAAAvjC,KAAA0iC,GAAAA,GAAA,EAAA,IAtBxB/nC,GAAeL,MACb,8GAGH,KAkByB,EAAA,EA+B5B,CAAC,MAAAmE,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAEYmqC,sBAAA,SACXlK,EACAmK,QAAAA,IAAAA,IAAAA,GAAyB,GAAK,IAAA,IAAAx2B,EAEE9T,KAAI,OAAAyG,QAAAC,QAAJoN,EAAKosB,aAAaC,IAAYt5B,KAAA,SAAxDi6B,GAAiB,OAAAr6B,QAAAC,QACQoN,EAAK0sB,oBAClCL,EACAW,IACDj6B,KAHK65B,SAAAA,GAcN,OATI4J,EACgBx2B,EAAKusB,eAAeK,EAAkB,eACpD5sB,EAAKusB,eAAeK,EAAkB,eAAeE,QACrD,KAEc9sB,EAAKusB,eAAeK,EAAkB,gBACpD5sB,EAAKusB,eAAeK,EAAkB,gBAAgBE,QACtD,IAEgB,EACxB,EAAA,CAAC,MAAAt7B,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAUYqqC,YAAA,SACXnB,EACAjJ,EACAT,EACA8K,EACA5N,GAAoB,IAAA,IAAAne,EAEYze,KAAI,OAAAyG,QAAAC,QAAJ+X,EAAKyhB,aAAaC,IAAYt5B,KAAA,SAAxDi6B,GAAiB,OAAAr6B,QAAAC,QACQ+X,EAAK+hB,oBAClCL,EACAW,IACDj6B,KAHK65B,SAAAA,GAIN,IAAM+J,EAAiBhsB,EAAK4hB,eAAeK,EAAkB,eACzDjiB,EAAK4hB,eAAeK,EAAkB,eAAeE,QACrD,KAAI,OAAAn6B,QAAAC,QAEsB+X,EAAKghB,mBAAmBC,IAAkB74B,KAAlE0rB,SAAAA,GAAe9rB,OAAAA,QAAAC,QAGZ+X,EAAKoiB,SACVV,EACA5N,EACAqK,EACAkE,EACAJ,IACD75B,KAAA6jC,SAAAA,GAPH,IAAMjM,GACJiM,EAMK,GACLtjC,WAEsD,OAAAX,QAAAC,QAOhC+X,EAAKqhB,aAAaJ,EAPjBnN,GAAmB6W,GAAS,MAOyBviC,KAAA,SAAxE83B,GAASgM,SAAAA,EAAAC,GAAA,IAAAC,EAAA,SAAAC,EAAAC,GAAAF,OAAAA,EAAAE,EAAAtkC,QAAAC,QA8BgBy2B,EAASE,QAAMx2B,KAAxC06B,SAAAA,GAON,MANA//B,GAAeL,MACb,wBACAg8B,EAAS/xB,OACT+xB,EAASiC,WACTmC,GAEQ,IAAAthC,MAAMiF,KAAK2F,UAAU02B,GAAkB,OAAAyJ,EAAA,SAAAC,GAAA,GAXrC,OAWqCA,EAX7C9N,IAAA8N,EAAU7N,GAAE32B,OAAAA,QAAAC,QACOy2B,EAASE,QAAMx2B,KAA9B+9B,SAAAA,GAAM,OAAAiG,EAAA,EACLjG,CAAM,EAAAoG,CASkC,GATlCA,OAAAA,GAAAA,EAAAnkC,KAAAmkC,EAAAnkC,KAAAikC,GAAAA,EAAAE,EA3Bf,CAAA,IAAME,EAAc,IAAIC,gBACxBD,EAAYE,IAAI,kBAAmB7Y,GACnC2Y,EAAYE,IAAI,YAAazM,GAC7BuM,EAAYE,IAAI,QAAS3M,GACzByM,EAAYE,IAAI,QAAShC,GACrBoB,GAAaU,EAAYE,IAAI,cAAeZ,GAEhD,IAEIrN,EAFEkO,EAAcH,EAAY9jC,WAChC,IAAKikC,EAAa,OAAW,KACjB,IAAAC,EAAA/iC,GACR,WAAA,OAAA9B,QAAAC,QACeq2B,GAAK,QAAC0N,EAAiB,IAAMY,EAAa,CACzDrO,OAAQ,MACRC,QAAS,CACP,eAAgB,mBAChBC,cAAeze,EAAKuhB,iBAAiBN,IAEvC9C,OAAAA,KACA/1B,KAAA,SAAA0kC,GAPFpO,EAAQoO,CAON,EACH,EAAQjmC,SAAAA,GAGP,MAFA9D,GAAeL,MAAM,wBACrBK,GAAeL,MAAMmE,GACX,IAAArF,MAAM,uCACjB,GAAAqrC,OAAAA,GAAAA,EAAAzkC,KAAAykC,EAAAzkC,KAAA8jC,GAAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EAcH,CAAC,MAAArlC,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAUYsrC,cAAA,SACXrL,EACA5N,EACA6W,EACAoB,EACA5N,EACAC,GAAsB,IAAA,IAAA/d,EAEU9e,KAAIyG,OAAAA,QAAAC,QAAJoY,EAAKohB,aAAaC,IAAYt5B,KAAA,SAAxDi6B,GAAiBr6B,OAAAA,QAAAC,QACQoY,EAAK0hB,oBAClCL,EACAW,IACDj6B,KAHK65B,SAAAA,GAAgB,SAAA+K,EAAAC,GAAAC,IAAAA,EAAAC,SAAAA,EAAAC,GAAA,IAAAC,EAAA,GAAAH,EAAAE,OAAAA,EAAAE,SAAAA,EAAAC,GAAA,OAAAF,EAAAE,EAAAvlC,QAAAC,QAuCSy2B,EAASE,QAAMx2B,KAAA,SAAxC06B,GAON,MANA//B,GAAeL,MACb,6BACAg8B,EAAS/xB,OACT+xB,EAASiC,WACTmC,GAEI,IAAIthC,MAAMiF,KAAK2F,UAAU02B,GAAkB,EAAA,CAhBjD//B,GAAeL,MACb,6BACAg8B,EAAS/xB,OACT+xB,EAASiC,YACV,IAAA6M,EAAAC,SAAAA,GAAAA,UAAAA,EACG/O,IAAA+O,EAAU9O,GAAE,OAAA32B,QAAAC,QACOy2B,EAASE,QAAMx2B,KAA9B+9B,SAAAA,GACC,OADKkH,EACL,EAAAlH,CAAM,EAAA,CAHdsH,GAGc,OAAAD,GAAAA,EAAAplC,KAAAolC,EAAAplC,KAAAklC,GAAAA,EAAAE,EAAA,CAAA,IAAAE,EAAA,SAAAC,GAAA,GAXXA,OAWWA,EAXXjP,IAAAiP,EAAUhP,GAAE32B,OAAAA,QAAAC,QACOy2B,EAASE,QAAMx2B,KAAA,SAA9B+9B,GAAM,OAAA+G,EAAA,EACL/G,CAAM,GASA,UATAuH,GAAAA,EAAAtlC,KAAAslC,EAAAtlC,KAAA+kC,GAAAA,EAAAO,EAxBf,CAAA,IASIhP,EATEkP,EAAmBvtB,EAAKuhB,eAAeK,EAAkB,iBAC3D5hB,EAAKuhB,eAAeK,EAAkB,iBAAiBE,QACvD,KAEAsJ,EAA0B3X,oBAAAA,EAI9B,GAHA2X,GAAQM,GAA+BA,gBAAAA,GAAkB,GACzDN,GAAQd,aAAmBA,GAAY,IAElCiD,EAAkB,OAAW,KACtB,IAAAC,EAAA/jC,GAAA,WAE+C,OAAzDhH,QAAQR,IAAI,qBAAsBsrC,EAAmBnC,GAAIzjC,QAAAC,QACxCq2B,GAAAA,QAAMsP,EAAmBnC,EAAK,CAC7ClN,OAAQ,MACRC,QAAS,CAAE,eAAgB,mBAAoBC,cAAeL,GAC9DD,OAAAA,KACA/1B,KAAA0lC,SAAAA,GAJFpP,EAAQoP,CAIN,EACH,EAAA,SAAQjnC,GAGP,MAFA9D,GAAeL,MAAM,6BACrBK,GAAeL,MAAMmE,GACX,IAAArF,MAAMqF,EACjB,GAAA,OAAAgnC,GAAAA,EAAAzlC,KAAAylC,EAAAzlC,KAAA4kC,GAAAA,GAAA,EAAA,EAsBH,CAAC,MAAAnmC,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EASYssC,oBAAA,SACXrM,EACAT,EACA0J,EACAjtB,GAAa,IAAA,IAAAvH,EAGmB5U,KAD1BqpC,EAA2C,iBAAtB3J,EAA8B,OAAAj5B,QAAAC,QACzBkO,EAAKsrB,aAAaC,IAAYt5B,KAAA,SAAxDi6B,GAAiB,OAAAr6B,QAAAC,QACQkO,EAAK4rB,oBAClCL,EACAW,IACDj6B,KAHK65B,SAAAA,GAIN,IAAM+L,EAAmB73B,EAAKyrB,eAAeK,EAAkB,iBAC3D9rB,EAAKyrB,eAAeK,EAAkB,iBAAiBE,QACvD,KAAI,OAAAn6B,QAAAC,QAEsBkO,EAAK6qB,mBAAmBC,IAAkB74B,KAAlE0rB,SAAAA,GAAe9rB,OAAAA,QAAAC,QAEZkO,EAAKisB,SACVV,EACA5N,EACA,KACAuO,EACAJ,IACD75B,KAAA6lC,SAAAA,GAPH,IAAMjO,GACJiO,EAMK,GACLtlC,WACEm+B,EAAmBhT,EAGE,OAFzBgT,GAAoB6D,EACpB7D,GAAoBppB,EAAM/U,WAC1Bm+B,GAAoB9G,EAAKh4B,QAAAC,QACDkO,EAAKkrB,aAAaJ,EAAmB6F,IAAiB1+B,KAAA,SAAxE83B,GACN,IAAK8N,EAAkB,OAAW,KAClC,IAAIE,EAAYF,EAQhB,OAPAE,GAAiCpa,oBAAAA,EACjCoa,GAAuBvD,UAAAA,EACvBuD,aAAuBxwB,EAAM/U,WACxBiiC,IACHsD,GAAuBlO,UAAAA,EACvBkO,iBAA2BhO,GAEtBgO,CAAS,EAAA,EAAA,EAAA,EAAA,EAClB,CAAC,MAAArnC,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAUY0sC,cAAa,SACxBjQ,EACA+C,EACA0J,EACAjJ,EACAvD,GAAoB,IAAA,IAAA5nB,EAEYhV,KAAIyG,OAAAA,QAAAC,QAAJsO,EAAKkrB,aAAaC,IAAYt5B,KAAA,SAAxDi6B,GAAiBr6B,OAAAA,QAAAC,QACQsO,EAAKwrB,oBAClCL,EACAW,IACDj6B,KAAA,SAHK65B,GAIN,IAAMmM,EAAmB73B,EAAKqrB,eAAeK,EAAkB,iBAC3D1rB,EAAKqrB,eAAeK,EAAkB,iBAAiBE,QACvD,KAAI,OAAAn6B,QAAAC,QAEsBsO,EAAKyqB,mBAAmBC,IAAkB74B,KAAA,SAAlE0rB,GAAe,OAAA9rB,QAAAC,QAEZsO,EAAK6rB,SACVV,EACA5N,EACAqK,EACAkE,EACAJ,IACD75B,KAAAimC,SAAAA,GAPH,IAAMrO,GACJqO,EAMK,GACL1lC,WAEEm+B,EAAmBhT,EAGE,OAFzBgT,GAAoB6D,GAAS,GAC7B7D,GAAqB5I,GAAU3nB,GAAAA,EAAK+3B,QAAQpQ,IAAW,GACvD4I,GAAoB9G,EAAKh4B,QAAAC,QACDsO,EAAK8qB,aAAaJ,EAAmB6F,IAAiB1+B,KAAA,SAAxE83B,GAAS,SAAAqO,EAAAC,GAAAC,IAAAA,EAAAC,SAAAA,EAAAC,GAAAF,OAAAA,EAAAE,EAAA3mC,QAAAC,QA6BgBy2B,EAASE,QAAMx2B,KAAA,SAAxC06B,GAQN,MAPA//B,GAAeL,MACb,6BACAg8B,EAAS/xB,OACT+xB,EAASiC,WACTmC,GAEF//B,GAAeL,MAAM,eAAgBsjC,GAC3B,IAAAxkC,MAAMiF,KAAK2F,UAAU02B,GAAkB,EAAA8L,CAAAA,IAAAA,EAAAC,SAAAA,GAAAA,GAZ7CA,OAY6CA,EAZ7CnQ,IAAAmQ,EAAUlQ,UAAE32B,QAAAC,QACOy2B,EAASE,QAAMx2B,KAA9B+9B,SAAAA,GACC,OADKsI,EACL,EAAAtI,CAAM,EAAAyI,CAUkCC,GAVlCD,OAAAA,GAAAA,EAAAxmC,KAAAwmC,EAAAxmC,KAAAsmC,GAAAA,EAAAE,GA1Bf,IAOIlQ,EAPEsH,EAAUlf,SAMhB,GALAkf,EAAQe,WAAa7I,EACrB8H,EAAQlS,gBAAkBA,EAC1BkS,EAAQ2E,MAAQA,EACZzK,IAAW8F,EAAQ9F,UAAYA,IAE9BkO,EAAkB,OAAO,KAClB,IAAAU,EAAAhlC,GACR,WAAA,OAAA9B,QAAAC,QACeq2B,GAAAA,QAAM8P,EAAkB,CACvC7P,OAAQ,SACR5B,KAAMl2B,KAAK2F,UAAU45B,GACrBxH,QAAS,CACP,eAAgB,mBAChBC,cAAeloB,EAAKgrB,iBAAiBN,IAEvC9C,OAAAA,KACA/1B,KAAA2mC,SAAAA,GARFrQ,EAAQqQ,CAQN,EACH,EAAA,SAAQloC,GAIP,MAHA9D,GAAeL,MAAM,8BACrBK,GAAeL,MAAMmE,GACrB9D,GAAeL,MAAM,eAAgBsjC,GAC/B,IAAIxkC,MAAM,uCACjB,GAAA,OAAAstC,GAAAA,EAAA1mC,KAAA0mC,EAAA1mC,KAAAmmC,GAAAA,GAcH,EAAA,EAAA,EAAA,EAAA,EAAA,CAAC,MAAA1nC,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAQYutC,kBAAA,SACXvf,EACAiS,EACAvD,GAAoB,IAAA,IAAAznB,EAGYnV,KAAIyG,OAAAA,QAAAC,QADNwnB,EAASgL,cAAYryB,KAAA,SAA7C0rB,GAAe,OAAA9rB,QAAAC,QACWyO,EAAK+qB,aAAaC,IAAYt5B,KAAA,SAAxDi6B,GAAiB,OAAAr6B,QAAAC,QACQyO,EAAKqrB,oBAClCL,EACAW,IACDj6B,KAHK65B,SAAAA,GAIN,IAAMwJ,EAAM/0B,EAAKkrB,eAAeK,EAAkB,qBAAqBE,SAAW,KAAI,OAAAn6B,QAAAC,QAE7EyO,EAAK0rB,SACVV,EACA5N,EACAqK,EACAkE,EACAJ,IACD75B,KAAA6mC,SAAAA,GAPH,IAAMjP,GACJiP,EAMK,GACLtmC,WAE8C,OAAAX,QAAAC,QACxByO,EAAK4qB,oBAAoB7R,EADxBqE,EAAkBkM,IACiC53B,KAAA,SAAtE83B,GAAS,OAAAp2B,GAEX,WAAA,OAAA9B,QAAAC,QACqBq2B,GAAAA,QAAMmN,EAAK,CAChClN,OAAQ,OACR5B,KAAMl2B,KAAK2F,UAAU,CACnBF,QAAS4nB,EACToM,UAAAA,EACAF,MAAAA,IAEFxB,QAAS,CAAE,eAAgB,oBAC3BL,OAAAA,KACA/1B,KAAA,SATIs2B,GAWN,GAAKA,MAAAA,IAAAA,EAAUC,GACb,MAAM,IAAIn9B,MAC0Bk9B,kCAAAA,EAAS/xB,OAAM,IAAI+xB,EAASiC,YAEjE,OAAA34B,QAAAC,QACoBy2B,EAASE,QAAMx2B,KAAA,SAA9B+9B,GACN,OAAa,MAANA,OAAM,EAANA,EAAQl8B,KAAK,EAAA,EACrB,EAAA,SAAQpD,GAGP,MAFA9D,GAAeL,MAAM,+BACrBK,GAAeL,MAAMmE,GACf,IAAIrF,MAAM,uCACjB,EAAA,EAAA,EAAA,EAAA,EAAA,EACH,CAAC,MAAAqF,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EASYytC,oBAAA,SACXzf,EACAxlB,EACAy3B,EACAvD,GAAoB,IAAA,IAAAnnB,EAGYzV,KAAIyG,OAAAA,QAAAC,QADNwnB,EAASgL,cAAYryB,KAA7C0rB,SAAAA,GAAe9rB,OAAAA,QAAAC,QACW+O,EAAKyqB,aAAaC,IAAYt5B,KAAA,SAAxDi6B,GAAiB,OAAAr6B,QAAAC,QACQ+O,EAAK+qB,oBAClCL,EACAW,IACDj6B,KAAA,SAHK65B,GAIN,IAAMwJ,EACJz0B,EAAK4qB,eAAeK,EAAkB,uBAAuBE,SAAW,KAAI,OAAAn6B,QAAAC,QAErE+O,EAAKorB,SACVV,EACA5N,EACAqK,EACAkE,EACAJ,IACD75B,KAAA,SAAA+mC,GAPH,IAAMnP,GACJmP,EAMK,GACLxmC,WAE8C,OAAAX,QAAAC,QACxB+O,EAAKsqB,oBAAoB7R,EADxBqE,EAAkBkM,IACiC53B,KAAtE83B,SAAAA,GAASp2B,OAAAA,GAEX,WAAA,OAAA9B,QAAAC,QACqBq2B,GAAAA,QAAMmN,EAAK,CAChClN,OAAQ,OACR5B,KAAMl2B,KAAK2F,UAAU,CACnBF,QAAS4nB,EACToM,UAAAA,EACAj2B,MAAAA,EACA+1B,MAAAA,IAEFxB,QAAS,CAAE,eAAgB,oBAC3BL,OAAAA,KACA/1B,KAVIs2B,SAAAA,GAYN,GAAKA,MAAAA,IAAAA,EAAUC,GACb,MAAU,IAAAn9B,MAAK,oCACuBk9B,EAAS/xB,OAAU+xB,IAAAA,EAASiC,YAEnE,OAAA34B,QAAAC,QACoBy2B,EAASE,OAAM,EAErC,EAAA,SAAQ/3B,GAGP,MAFA9D,GAAeL,MAAM,+BACrBK,GAAeL,MAAMmE,GACf,IAAIrF,MAAM,uCACjB,EAAA,EAAA,EAAA,EAAA,EAAA,EACH,CAAC,MAAAqF,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAOY2tC,gBAAA,SAAgB3D,EAAatN,GAAoB,WAAAn2B,QAAAC,QAAA6B,GAAA,WACxD9B,OAAAA,QAAAC,QACqBq2B,GAAAA,QAAMmN,EAAK,CAChClN,OAAQ,MACRC,QAAS,CAAE,eAAgB,oBAC3BL,OAAAA,KACA/1B,KAJIs2B,SAAAA,GAAQ2Q,IAAAA,EAAAC,EAKV5Q,WAAAA,SAAAA,GAAAA,EAAUC,GAAE,OAAA32B,QAAAC,QACOy2B,EAASE,QAAMx2B,KAAA,SAA9B+9B,GACN,GAAIA,IAAWA,EAAOzS,iBAAmByS,EAAOoJ,mBAAkB,OAAAF,GAAS,CAAI,EAAA,CAF7E3Q,GAE6E,OAAA4Q,GAAAA,EAAAlnC,KAAAknC,EAAAlnC,KAAAonC,SAAAA,GAAAH,QAAAA,GAAAG,CAErE,KAAAH,GAAAC,CAAA,EACb,EAAA,SAAQ5sC,GAEP,OADAK,GAAeL,MAAoCA,8BAAAA,EAAMm4B,UAE1D,CAAA,GACH,CAAC,MAAAh0B,GAAAmB,OAAAA,QAAA+B,OAAAlD,KAAApF,EAOYguC,wBAAuB,SAClC/N,EACAgO,EACAvR,GAAoB,IAAA/mB,IAAAA,EAEY7V,YAAIyG,QAAAC,QAAJmP,EAAKqqB,aAAaC,IAAYt5B,KAAxDi6B,SAAAA,GAAiBr6B,OAAAA,QAAAC,QACQmP,EAAK2qB,oBAClCL,EACAW,IACDj6B,KAAA,SAHK65B,GAAgB,SAAA0N,EAAAC,GAAA,IAAAC,EAAA,SAAAC,EAAAC,GAAAF,OAAAA,EAAAE,EAAA/nC,QAAAC,QAgCSy2B,EAASE,QAAMx2B,KAAxC06B,SAAAA,GAQN,MAPA//B,GAAeL,MACb,mCACAg8B,EAAS/xB,OACT+xB,EAASiC,WACTmC,GAEF//B,GAAeL,MAAM,eAAgB+D,KAAK2F,UAAUsjC,IAC9C,IAAIluC,MAAMiF,KAAK2F,UAAU02B,GAAkB,EAAA,CAAA,IAAAkN,EAAA,SAAAC,GAAA,GAZrC,OAYqCA,EAZ7CvR,IAAAuR,EAAUtR,GAAE,OAAA32B,QAAAC,QACOy2B,EAASE,QAAMx2B,KAAA,SAA9B+9B,GAAM,OAAA0J,EAAA,EACL1J,CAAM,GAUkC,UAVlC6J,GAAAA,EAAA5nC,KAAA4nC,EAAA5nC,KAAA0nC,GAAAA,EAAAE,EAAA,CA1Bf,IAKItR,EALEyG,EAAgB/tB,EAAKwqB,eAAeK,EAAkB,2BACxD7qB,EAAKwqB,eAAeK,EAAkB,2BAA2BE,QACjE,KACJ,IAAKgD,EAAe,OAAW,KAEnB,IAAA+K,EAAApmC,GAAA,WACR9B,OAAAA,QAAAC,QACeq2B,GAAK,QAAC6G,EAAe,CACpC5G,OAAQ,OACR5B,KAAMl2B,KAAK2F,UAAUsjC,GACrBlR,QAAS,CACP,eAAgB,oBAElBL,OAAAA,KACA/1B,KAAA+nC,SAAAA,GAAA,OAPFzR,EAAQyR,EAON,WAAA,IACGzR,EAASC,GAAE,OAAA32B,QAAAC,QACUy2B,EAAS+D,QAAMr6B,KAAA,SAAjCq/B,GACN,MAAU,IAAAjmC,MAAK,GAAIimC,EAAY,GAH/B,IAKH,EAAA,SAAQ5gC,GAGP,MAFA9D,GAAeL,MAAM,oCACrBK,GAAeL,MAAMmE,GACf,IAAIrF,MAAyCqF,mCAAAA,EAAEg0B,QAAO,IAC7D,GAAAqV,OAAAA,GAAAA,EAAA9nC,KAAA8nC,EAAA9nC,KAAAunC,GAAAA,GAcH,EAAA,EAAA,CAAC,MAAA9oC,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAApF,CAAAA,EAAAA,EAOY2uC,kCACX1O,EACAgO,EACAvR,OAAoB5mB,IAAAA,EAEYhW,KAAIyG,OAAAA,QAAAC,QAAJsP,EAAKkqB,aAAaC,IAAYt5B,KAAxDi6B,SAAAA,GAAiBr6B,OAAAA,QAAAC,QACQsP,EAAKwqB,oBAClCL,EACAW,IACDj6B,KAHK65B,SAAAA,GAAgBoO,SAAAA,EAAAC,GAAA,IAAAC,EAAAC,SAAAA,EAAAC,GAAA,OAAAF,EAAAE,EAAAzoC,QAAAC,QAmCSy2B,EAASE,QAAMx2B,KAAxC06B,SAAAA,GAQN,MAPA//B,GAAeL,MACb,oCACAg8B,EAAS/xB,OACT+xB,EAASiC,WACTmC,GAEF//B,GAAeL,MAAM,eAAgB+D,KAAK2F,UAAUsjC,IAC1C,IAAAluC,MAAMiF,KAAK2F,UAAU02B,GAAkB,OAAA4N,EAAA,SAAAC,GAAA,GAZrC,OAYqCA,EAZ7CjS,IAAAiS,EAAUhS,GAAE,OAAA32B,QAAAC,QACOy2B,EAASE,QAAMx2B,KAA9B+9B,SAAAA,GAAM,OAAAoK,EAAA,EACLpK,CAAM,EAAAuK,CAUkC,GAVlCA,OAAAA,GAAAA,EAAAtoC,KAAAsoC,EAAAtoC,KAAAooC,GAAAA,EAAAE,EAAA,CA7Bf,IAQIhS,EAREyG,EAAgB5tB,EAAKqqB,eACzBK,EACA,4BAEE1qB,EAAKqqB,eAAeK,EAAkB,4BAA4BE,QAClE,KACJ,IAAKgD,EAAe,OAAW,KAEnB,IAAAyL,EAAA9mC,GAAA,WACR9B,OAAAA,QAAAC,QACeq2B,GAAK,QAAC6G,EAAe,CACpC5G,OAAQ,OACR5B,KAAMl2B,KAAK2F,UAAUsjC,GACrBlR,QAAS,CACP,eAAgB,oBAElBL,OAAAA,KACA/1B,KAAA,SAAAyoC,GAAA,OAPFnS,EAAQmS,EAON,WAAA,IACGnS,EAASC,UAAE32B,QAAAC,QACUy2B,EAAS+D,QAAMr6B,KAAA,SAAjCq/B,GACN,MAAM,IAAIjmC,MAAK,GAAIimC,EAAY,EAElC,CALG,EAKH,EAAA,EAAQ5gC,SAAAA,GAGP,MAFA9D,GAAeL,MAAM,qCACrBK,GAAeL,MAAMmE,GACf,IAAIrF,MAA0CqF,oCAAAA,EAAEg0B,QAAU,IACjE,GAAA+V,OAAAA,GAAAA,EAAAxoC,KAAAwoC,EAAAxoC,KAAAioC,GAAAA,OAcH,CAAC,MAAAxpC,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,EAAApF,EAOO6sC,QAAA,SAAQwC,GACd,OAAWvvC,KAACwvC,iBAAiBD,GAAO,EACtC,EAACrvC,EAQOsvC,iBAAA,SAAiBD,EAAYE,QAAP,IAALF,IAAAA,EAAQ,IAC/B,IAAAG,EAA0B1vC,KAAK2vC,WAC7BJ,EACA,wBACA,oBAEF,OAAQE,GALKC,EAAL7Q,MAKsB,KAAO,IALhB6Q,EAAN/I,MAMjB,EAACzmC,EASOyvC,WAAA,SACNJ,EACAK,EACAC,GAEA,GAAqB,iBAAVN,EAGT,MAFA/tC,GAAeX,MAAM,qBACrBW,GAAeX,MAAM0uC,GACf,IAAItvC,MAAU4vC,IAAAA,2CAAsDN,GAE5E,IAAMO,EAAQP,EAAMO,MAAMF,GAC1B,OAAKE,EAIE,CAAEjR,OAAO,EAAM8H,OAAQmJ,EAAM,KAHlCtuC,GAAeP,KAAI,IAAK4uC,EAA6C,kCAC9D,CAAEhR,OAAO,EAAO8H,OAAQ4I,GAGnC,EAACrvC,EAOakrB,QAAA,SAAQ8e,EAAarN,GAAsB,IACvD,OAAAp2B,QAAAC,QAAOq2B,GAAAA,QAAMmN,EAAK,CAChBlN,OAAQ,MACRC,QAAS,CACP,eAAgB,mBAChBC,cAAeL,KAGrB,CAAC,MAAAv3B,GAAAmB,OAAAA,QAAA+B,OAAAlD,KAAAk6B,CAAA,CA3nDkBA,GA8nDRuQ,GAAmB,IAAIvQ,GE/9CdwQ,YACpB1pC,EACA8R,EACA63B,EACAlkB,GAAe,IAEf,IAAM3iB,EAAgB,IAAIC,SAAOC,SAAS8O,EAAc1S,GAAQY,GAAO,OAAAG,QAAAC,QAC1D0C,EAAc2mB,UAAUkgB,EAASlkB,GAChD,CAAC,MAAAzmB,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,EA/CqByqB,YACpBzpB,EACA8R,EACA63B,EACAlkB,EACAnjB,GAAsB,IAEtB,IAAMQ,EAAgB,IAAIC,EAAAA,OAAOC,SAAS8O,EAAc1S,GAAQY,GAAO,OAAAG,QAAAC,QAC9C0C,EAAc2mB,UAAUkgB,EAASlkB,IAAQllB,KAA5DwB,SAAAA,GAAU5B,OAAAA,QAAAC,QAEHuC,GAAc3C,EAAQ8R,EAAc/P,EAAYO,GAC/D,EAAA,CAAC,MAAAtD,GAAAmB,OAAAA,QAAA+B,OAAAlD,KA3FqB4qC,GAAA,SACpB5pC,EACAxB,EACAmrC,EACA73B,EACA2T,EACApjB,EACAwnC,EACA7jC,QADK,IAAL6jC,IAAAA,GAAQ,GAAK,IACE/uB,IA4BsB2E,EA5BtB3E,WAAAgC,GAAA2C,GAAAA,EAAA3C,OAAAA,EASf,IAAI1Q,EAAS,KAAI,OAAAjM,QAAAC,QAEI0C,EAAc0iB,QAAQxf,YAAYyf,EAASpjB,IAAO9B,KAAA,SAAjER,GACN,GAAIiG,EAAa,OAA6BjG,EAAM,IAAA4a,uFAAA1Y,CAAA,WAEhD9B,OAAAA,QAAAC,QACaN,GACbC,EACAC,QACAxB,SAAAA,EAAQvC,iBACR6G,EAAc0iB,QACdC,EACApjB,IACD9B,cAAAupC,GAPD19B,EAAM09B,CAOL,EACF,EAAA,SAAQ9qC,GACP9D,GAAeL,4DACyCmE,EAAEg0B,QAE3D,GAAA,OAAArY,GAAAA,EAAApa,KAAAoa,EAAApa,KAAA,WACD,OAAO6L,CAA8B,GAA9BA,CAA8B,EAAA,EA1B/BtJ,EAAgB,IAAIC,EAAAA,OAAOC,SAAS8O,EAAc1S,GAAQY,GAAOuZ,EACnE,WAAA,IAACswB,EAAK,OAAA1pC,QAAAC,QACuBspC,GAAa1pC,EAAQ8R,EAAc63B,EAASlkB,IAAQllB,KAAA,SAA7EwpC,GACF,GAAA,IAAIloC,EAAAA,QAAUkoC,GAAkB9V,cAAc,IAAIpyB,EAAAA,QAAUQ,IAAQ2nC,CAAAA,IAAAA,EACzCpoC,OAAOmoC,GAAiBC,OAAAvqB,EAAAuqB,EAAAA,CAAA,CAAA7pC,EAAAA,CAHrD,GAGqDA,OAAAA,QAAAC,QAAAmZ,GAAAA,EAAAhZ,KAAAgZ,EAAAhZ,KAAAua,GAAAA,EAAAvB,GAuB3D,CAAC,MAAAva,GAAAmB,OAAAA,QAAA+B,OAAAlD,KAjFqBwmB,GAAO,SAC3BxlB,EACAxB,EACAmrC,EACA73B,EACA2T,EACApjB,EACAwnC,EACAvnC,EACA0D,QAFA6jC,IAAAA,IAAAA,GAAQ,GAAK,IAEEtnC,IAoBdqS,EApBcrS,EAAAA,SAAA+0B,GAAA1iB,OAAAA,EAAA0iB,EAAAn3B,QAAAC,QASe+B,GAAcnC,EAAQ8R,EAAczP,EAAQC,IAAc/B,cAAlFqtB,GAAe,OAAAztB,QAAAC,QACA0C,EAAc0iB,QAAQxf,YAAYyf,EAASmI,IAAgBrtB,KAAA,SAA1ER,GAAM,OACRiG,EAAmD,IAAIsB,EAAAA,QAAQvH,EAAOe,YAAYX,QAAAC,QAE7DN,GACvBC,EACAC,EACM,MAANxB,OAAM,EAANA,EAAQvC,iBACR6G,EAAc0iB,QACdC,EACAmI,GACDhZ,EAAAA,EAAAA,EAlBK9R,EAAgB,IAAIC,EAAMA,OAACC,SAAS8O,EAAc1S,GAAQY,GAAO4C,EACnE,WAAA,IAACinC,EAAK,OAAA1pC,QAAAC,QACuBqpB,GAAUzpB,EAAQ8R,EAAc63B,EAASlkB,IAAQllB,KAA1EwpC,SAAAA,GACF,GAAA,IAAIziC,EAAO,QAACyiC,GAAkBxiC,qBAAqB,IAAID,UAAQjF,IAAQ,CAAA,IAAA4nC,EAC7C,IAAI3iC,EAAO,QAACyiC,GAAkBG,WAAU,OAAAt1B,EAAA,EAAAq1B,CAAA,CAAA,EAAA,CAHpE,GAGoE,OAAA9pC,QAAAC,QAAAwC,GAAAA,EAAArC,KAAAqC,EAAArC,KAAAgC,GAAAA,EAAAK,GAgB1E,CAAC,MAAA5D,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,EClDKmrC,GAAoB,CACxB5L,SAAU,CACR6L,QAAS,uCAEXxM,UAAW,CACT9C,UAAW,CACTuP,QAAS,yDACTC,UAAW,yCACXC,2BAA4B,+CAC5BC,qBACE,sFACFC,sCACE,iPAEJC,UAAW,CACTC,gBAAiB,6DACjBC,iCACE,2HAEJ1L,WAAY,CACV2L,cACE,kHACFR,QAAS,2DAEXvK,aAAc,CACZuK,QAAS,6DAEXS,wBAAyB,2DACzBD,cAAe,2DACfE,SAAU,2DACVC,uBAAwB,2DACxBC,8BACE,2DACFC,iBACE,qIAEJrwC,MAAO,CACLswC,2BACE,gFACFC,iBACE,4EACFC,8BACE,wFACFC,iCACE,qDACFC,sCACE,6DACFC,oBAAqB,2DACrB,kBACE,2GACF,2BACE,+IACF,gCACE,8FACF,sCACE,2MACF,uCAAwC,6CACxC,qBAAsB,wDACtB,oBAAqB,gDACrB,8BACE,gEACF,yCACE,sLACF,oBAAqB,qDACrB,wBACE,2GAEJC,MAAO,CACLC,cAAe,gCAEjBrL,OAAQ,CACN+J,QACE,+GCbA1uB,EAA6BC,EAAAC,GAGjC,IAAAF,EAAaG,EAAA,iBACLC,GAC+B,CAGvC,IAAAF,EAAmBC,EAsBnB,YAVED,EACQG,EAAAN,GAAAO,KAAA,KAAiBN,EAAAC,IAXX,EAAhBA,IACAA,EAAgBC,EAAAC,GAIhBD,EAAMA,EAAAK,CAkBJ,CACA,GAAAL,GAAAA,EAAarb,mBAETA,KAAAkb,GAAAO,KAAA,KAAAN,EAAAC,GAAAF,GAAAO,KAAA,KAAAN,EAAA,IASFA,EAAAG,EAAAF,QAED,IAAAO,EAAAR,EAAAK,EACFG,GAEDA,KAGE,CA5GG,IAAEJ,2BACT,SAAAA,KAgDE,OA/CFA,EAAOjiB,UAAS0G,cAAc4b,KAC9B,IAAS/P,EAAA,IAAA0P,EACAH,EAAAjiB,KAAAmiB,EAET,GAAAF,EAAgB,CAEhB,IAAAU,EAAA,EAAAV,EAAAQ,EAAAC,oHAgBGX,GAAArP,EAAA,EAAA+P,EAAAA,EAAAP,GAAAA,GACmBQ,EAcdX,GAAArP,EAAW,EAAGgQ,EAAWR,IAE/BH,GAAQrP,EAAS,EAAAwP,EAEf,CAAA,MAAA5c,GACEyc,GAAArP,EAAA,EAAApN,EACA,CACA,EACDoN,CACH,EACA0P,CACE,kKCnDe,WAAApiB,KAKV4B,aAMAuwB,EAAAA,KAAAA,qBAMAtwB,EAAAA,KAAAA,yBAMAowC,kBAAY,EAAAjyC,KAMZ+B,uBAAiB,EAAA/B,KAMjBqD,uBAMAO,EAAAA,KAAAA,0BAMAsuC,EAAAA,KAAAA,0BAMAjwC,8BAAwB,EAAAjC,KAMxBmyC,iCAA2B,EAAAnyC,KAM3BkC,sBAMAkwC,EAAAA,KAAAA,kBAMA7uC,EAAAA,KAAAA,qCAMA8uC,wBAAkB,EAAAryC,KAMlBmC,gBAKAmwC,EAAAA,KAAAA,oBAMAC,iBAAW,EAAAvyC,KAMXwyC,yBAAmB,EAAAxyC,KAMnByyC,eAEAC,EAAAA,KAAAA,eAMPhxC,EAAAA,KAAAA,oBAMAC,aAAO,EAAA3B,KAMP8B,iBAAW,EAAA9B,KAMXgC,sBAMAI,EAAAA,KAAAA,oCAMAC,mCAA6B,EAAArC,KAM7BsC,+BAMAC,EAAAA,KAAAA,sBAEAuB,EAAAA,KAAAA,uBACAC,aAAO,EAAA/D,KACPgE,kBAAY,EAAAhE,KACZiE,sBACAC,EAAAA,KAAAA,uBACAC,EAAAA,KAAAA,sBACAC,kBAAY,EAAApE,KACZqE,mBAGA3B,EAAAA,KAAAA,gBACA4B,uBAAiB,CAAA,2CChKiB,oI3BflC,iGAJ8B,gFAE9B,8XuBkK2B,SAC3BgC,EACA8R,EACA63B,EACArnC,GAAsB,IAEtB,IAAMQ,EAAgB,IAAIC,EAAAA,OAAOC,SAAS8O,EAAc1S,GAAQY,GAAO,OAAAG,QAAAC,QAC9C0C,EAAc0mB,UAAUmgB,IAAQppC,KAAnDwB,SAAAA,UAAU5B,QAAAC,QAEHuC,GAAc3C,EAAQ8R,EAAc/P,EAAYO,KAC/D,CAAC,MAAAtD,GAAA,OAAAmB,QAAA+B,OAAAlD,EA9BD,CAAA,sDIkH6C,SAC3ChB,EACAoH,EACAinC,GAAwB,IAExB,IAAMz6B,EAAU,IAAI7O,EAAMA,OAACC,SAAShF,EAAmBC,EAAAA,QAAkB6F,IAAKsB,GAAM,OAAAjF,QAAAC,QACzDgF,EAAMwtB,cAAYryB,KAAA,SAAvC+rC,GAAYn6B,IAAAA,EAAAirB,EAAAn7B,GAAA,WACd9B,OAAAA,QAAAC,QACyBwR,EAAQmb,yBACjC,YACA,SACA,EACAuf,EACAD,GAAiB,CAACC,GAClB,CAAC,oCACF/rC,KAPKgsC,SAAAA,wBAQFA,GAAgBA,EAAavqC,KAAI7B,OAAAA,QAAAC,QACVmsC,EAAavqC,QAAMzB,KAAA,SAAtCwB,GACN,IAAMyqC,EAASjpC,GAAexB,EAAY,iBACrB0qC,OAAAt6B,EAAAs6B,EAAdD,EAAOh3B,KAAK,EAAE,EAExB,GAAA,EAAA,EAAQ3a,SAAAA,GACPI,QAAQR,IAAI,oCAAqCI,EAClD,GAAAuiC,OAAAA,GAAAA,EAAA78B,KAAA68B,EAAA78B,KAAA,SAAAy6B,GAAA,OAAA7oB,EAAA6oB,EACM,IAAI,GAAA7oB,EAAAirB,EAAJ,IAAI,EACb,CAAC,MAAAp+B,UAAAmB,QAAA+B,OAAAlD,mBAjPgC,SAC/BO,EACAgV,EACAnP,EACAsnC,EACAC,EACApV,EACAqV,EACA9U,EACA+U,EACAC,EACA9uC,EACA8b,EACAC,QANA,IAAA6yB,IAAAA,GAAsB,eAQhBG,EAActV,EAAUA,WAACC,YAAYH,GACnCC,EAAoBuV,EAAYpV,iBAAhCH,gBACF5b,GACoBoxB,OAAxBA,EAAAD,EAAYE,eAAmBD,OAAPA,EAAxBA,EAA0BE,QAAY,OAAPF,EAA/BA,EAAiC7pC,YAAK,EAAtC6pC,EAAwCpxB,eACxC4b,GAAyB,OAAV2V,EAAf3V,EAAiB0V,MAAM,KAAa,OAAXC,EAAzBA,EAA2BC,OAAO,SAAE,EAApCD,EAAsChqC,OACxCkqC,EAA0CN,EAAYO,eAAvCC,EAAUF,EAAnBjyC,QAAqB+a,EAAUk3B,EAAVl3B,WACnBq3B,EAAaT,EAAYO,eAAzBE,SAIR,GAFiD,iBAAxBb,GAC8B,iBAAxBA,EAE7B,UAAUhzC,MAAM,sDACjB,OAAAwG,QAAAC,QACsBgF,EAAM/E,SAASC,cAAYC,KAAA,SAAAktC,GAAlD,IAAM/wB,EAAU+wB,EAAoCryC,QAEpD,GAAImyC,GAAcA,IAAepsC,OAAOub,GACtC,MAAM,IAAI/iB,MAAM,+DAGlB,IAAM6E,GAAS,IAAIlC,IAAe8B,UAAU4wB,SAASxnB,OAAOkV,KAAU,OAAAvc,QAAAC,QAE5Cmc,GACxBnX,EACA5G,EAAOzB,kBACP4vC,EACAxrC,OAAOub,KACRnc,cALGsU,GAOJ,GAAIA,EAAgB,EAAG,CAErB,GApEgC,OAoE5B1T,OAAOub,SAEM,IAAA/iB,MAAiCkb,2BAAAA,GADhDA,EAAgB,CAEnB,CAED,IAAMyQ,EAAM,IAAIhI,GAAIlY,EAAOjE,OAAOub,IAE5BgxB,EAAa,IAAIj5B,GAAWjW,EAAOzB,kBAAmBqI,EAAOjE,OAAOub,IAAS,OAAAvc,QAAAC,QAG7DgF,EAAMwtB,cAAYryB,KAAlCopC,SAAAA,OAAOgE,EAAA/4B,EAAA,SAAA6nB,EAAAnF,UAAA1iB,EAAA0iB,EAAAn3B,QAAAC,QAgFYwtC,EAAU5rC,QAAMzB,cAAnCwB,GAAU,IAAA0d,EAAAiV,SAAAA,EAAAkD,GAAA,GAAAnY,EAAA,OAAAmY,EAAA/V,SAAAA,aAAAZ,IAAA,IAAA4sB,EA6DVvoB,EAAIzC,YAAWirB,EACnB33B,EAAU,OAAAhW,QAAAC,QACJgF,EAAMwtB,cAAYryB,KAAAwtC,SAAAA,UAAA5tC,QAAAC,QAAAytC,EAAAxzC,KAFpBirB,EAAGwoB,EAAAC,EAGP,EACAjW,EACA,GACAkW,EAAAA,QAAQ/qB,GACRqe,EACApe,IAAY3iB,KAAA,WAEd,OAAOg3B,EAAIla,EAAE,EAlCbmwB,EAAAA,CAAAA,EAAS,GAAGtoB,iBAAmB+oB,EAC/BT,EAAS,GAAGU,gBAAkBpW,EAI9B,IAGIwJ,EACApe,EACAD,EALE5F,EAAK0vB,EAAYoB,QAFvBh4B,EAAai4B,EAE8Bb,EAAWzsC,YACtDy2B,EAAMwV,EAAYsB,aAAa,CAAEhxB,GAAAA,EAAIlH,WAAAA,IAI5B,IAAAiK,gBACLwsB,EAAU,OAAAzsC,QAAAC,QACKqpC,GAAiB9O,QAAQpD,EAAKp2B,OAAOub,GAAUob,IAAYv3B,KAAA,SAAA+tC,GAAA,OAA5EhN,EAAQgN,EAAoEnuC,QAAAC,QAC/C0sC,EAAiBjV,SAASN,EAAKnyB,EAAO0yB,IAAYv3B,cAAzEguC,GACNrrB,EAAeqrB,EAAe/V,KAC9BvV,EAAQ,CAAC,EAAA,GAET,IAAMurB,EAAY5vC,KAAK2F,UAAUgzB,GAC3BkX,EAAQC,OAAOC,KAAKH,GAC1BlN,EAAW1c,EAAAA,QAAQ6pB,GACnBvrB,EAAe,KAAO0rB,EAAAA,WAAW,UAAUC,OAAOvN,GAAUwN,OAAO,OACnE7rB,EAAQ,CAAC,IAAA,OAAA7C,GAAAA,EAAA7f,KAAA6f,EAAA7f,KAAA0gB,GAAAA,GAAA,CAAA,IAAAF,EA/BPviB,WAAAA,GAAe,UAAfA,EAAOpC,WACa+D,QAAAC,QAEIqpC,GAAiB9O,QACzC+R,EACAvrC,OAAOub,GACPob,IACDv3B,cAAAwuC,GAJDvB,EAAS,GAAGhS,MAAKuT,CAIhB,GANDvB,EAAS,GAAGhS,MAAQ,EAMnBza,CAPCviB,GAODuiB,OAAAA,GAAAA,EAAAxgB,KAAAwgB,EAAAxgB,KAAAshB,GAAAA,GAhCH,CAAA,IAAMmtB,EAAkBzrC,GAAexB,EAAY,cAC7CktC,EAAoB1rC,GAAexB,EAAY,gBAE/CqsC,EAAsBY,EAAgBx5B,KAAK05B,gBAC3CjB,EAAwBgB,EAAkBz5B,KAAK05B,gBAErDxC,EAASxnB,iBAAmB+oB,EAC5BvB,EAASv2B,WAAai4B,EAAmB,IAAAzsB,gBAEtB,UAAfnjB,EAAOpC,IAAe,CAGxB,IAAMkH,EAAW,IAAIP,EAAAA,OAAOC,SAASirC,EAAuBjjB,EAAc,QAAClnB,IAAKsB,GAAM,OAAAnD,GAAA,WAClF9B,OAAAA,QAAAC,QACekD,EAASqoB,eAAelR,EAAWA,YAAC7b,KAAK2F,UAAUmoC,MAAWnsC,KAAzEgV,SAAAA,OAAEuF,EAAA,WAAA,GACJvF,EAAGvT,KAAI,OAAA7B,QAAAC,QACHmV,EAAGvT,QAAMzB,KAAAua,WAAAA,EAAAA,CAFT,GAESA,GAAAA,GAAAA,EAAAva,KAAAua,OAAAA,EAAAva,KAAA,WAAA,EAAA,EAElB,EAAA,SAAQ4uC,UACPl0C,QAAQR,IAAI,kEAAmE00C,GACpE1vB,IAAJ,IACR,cAAAkC,GAAAA,EAAAphB,KAAAohB,EAAAphB,KAAAm0B,GAAAA,EAAA/S,EApGH,EAAA,CAAA,IAmCIisB,EAnCEwB,EAAgC,CACpC7vC,KAAAA,EACAgV,OAAAA,EACAM,cAAe,EACfQ,SAAU,MACVC,cAAc,EACdlQ,MAAOukC,GAEH0F,EAAyC,CAC7Cx6B,cAAAA,EACAoF,IAAK,SACLE,UAAW,IACXV,iBAAkBkwB,EAClBhwB,SAAUkzB,GAAoBruC,EAAO/C,kBACrC+d,OAAQmwB,EACRjwB,aAAchS,IAIL,MAARglC,GAAAA,EAAUlR,MAAM,GAAG/7B,MACnB,CAACpG,EAAcA,eAACi2C,QAASj2C,EAAcA,eAACk2C,KAAMl2C,EAAAA,eAAem2C,KAAKtwC,SACzDyuC,MAARjB,UAAQiB,EAARjB,EAAUlR,MAAM,YAAEmS,EAAlBA,EAAoBluC,aAApBkuC,EAA0BxvB,iBAG5BljB,QAAQR,IAAI,6DACZiyC,EAASjtC,KAAOpG,EAAAA,eAAem2C,KAGd,UAAfhxC,EAAOpC,MACTizC,EAAgBz1B,YAAc8yB,EAC9B2C,EAAgBrxC,kBAAoBA,GAAqBQ,EAAOR,kBAChEqxC,EAAgBv1B,gBAAkBA,EAClCu1B,EAAgBt1B,eAAiBA,GAGtB,IAAA8hB,EAAA55B,GACT,WAAA,IAAA0Y,EAAA,WAAA,IACGiB,EAAK,OAAAzb,QAAAC,QACUstC,EAAWr1B,uBAAuB+2B,EAAgBC,IAAgB9uC,KAAAkvC,SAAAA,GAApF7B,EAAS6B,CAA2E,GAAA,IAAAnT,EAAA,WAAA,GACtD,MAArB1gB,EAAM9a,WAOd,OAAAX,QAAAC,QACiBstC,EAAWx0B,oCAC3Bk2B,EACAC,EAT+C,CAC/CzzC,iBAAkB4C,EAAO5C,iBACzB2J,UAAW,IACXE,WAAY,YACZkH,UAAU,EACV9G,eAAgB6B,MAMjBnH,KAAAmvC,SAAAA,GAJD9B,EAAS8B,CAIR,GAGD,IAAMC,EAAsC,CAC1C10B,iBAAkBzc,EAAO7C,yBACzBof,iBAAkBvc,EAAO/C,kBACzB2J,MAAOukC,EACP77B,mBAAoB67B,EACpBtuB,kBAAmB,GACnBF,kBAAmB,GACnB9N,UAAWuO,EAAM9a,WACjB6M,UAAW,IACXkN,gBAAiB8uB,EACjBh9B,UAAU,GACX,OAAAxM,QAAAC,QACiBstC,EAAW70B,oCAC3Bu2B,EACAC,EACAM,IACDpvC,KAAAqvC,SAAAA,GAJDhC,EAASgC,CAIR,EAAAtT,CAhCmF,GAgCnFA,OAAAA,GAAAA,EAAA/7B,KAAA+7B,EAAA/7B,KAAAoa,WAAAA,QAAA2hB,CAAA3hB,CAlCD,GAkCCA,GAAAA,GAAAA,EAAApa,KAAA,OAAAoa,EAAApa,KAEJ,aAAA,WAAQ4uC,GAEIvsC,OADX3H,QAAQR,IAAI,4BAA6B00C,GAC9Bv6B,EAAAhS,EAAJ,IACR,GAAA,OAAAi5B,GAAAA,EAAAt7B,KAAAs7B,EAAAt7B,KAAAk8B,GAAAA,EAAAZ,EAAA,EAAA,EAAA,EA0EH,CAAC,MAAA78B,UAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,aJlDqB,SAASgB,EAAgB8R,GAAoB,IACjE,IAAMhP,EAAgB,IAAIC,EAAAA,OAAOC,SAAS8O,EAAc1S,GAAQY,GAAO,OAAAG,QAAAC,QAChD0C,EAAcN,YAAUjC,KACxCY,OACT,CAAC,MAAAnC,GAAAmB,OAAAA,QAAA+B,OAAAlD,EApBD,CAAA,iBKpJsB,SACpB4kC,EACA/tB,GAAc,IAAA1V,OAAAA,QAAAC,QAESq2B,MAAMmN,IAAIrjC,cAA3Bs2B,GACN,IAAKA,EAASC,GACZ,MAAM,IAAIn9B,MAAM,mBAElB,IAAIk2C,EACJ,IACEA,EAAWhZ,EAASF,QACjBmZ,IAAI,uBACJtG,MAAM,4BAA4B,EACtC,CAAC,MAAAuG,GACA,IACEF,EAAWjM,EAAIoM,MAAM,KAAKC,KAC3B,CAAC,MAAAC,GACAL,EAAQ,OAAUh6B,CACnB,CACF,CAAA,OAAA1V,QAAAC,QAEoBy2B,EAASsZ,eAAa5vC,KAAA,SAAA6vC,GAA3C,MAAO,CAAEvxB,KAAIuxB,EAAgCP,SAAAA,EAAU,EAAA,EACzD,CAAC,MAAA7wC,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAnDD,CAAA,iCAAoC4kC,GAClC,IAAMyM,EAAM,IAAIC,eAChBD,EAAIE,aAAe,OACnBF,EAAIG,KAAK,MAAO5M,GAChByM,EAAII,OAAS,WACX,IAAMC,EAA2BL,EAAIM,kBAAkB,uBACjDC,EAAgBF,MAAAA,OAAAA,EAAAA,EAA0BlH,MAC9C,0CAEIqH,EAAWD,GAAiBA,EAAc,GAAKA,EAAc,GAAK,OAElEE,EAAUC,OAAOvB,IAAIwB,gBAAgBX,EAAIxZ,UACzCoa,EAAIC,SAASC,cAAc,KACjCF,EAAEG,KAAON,EACTG,EAAEI,aAAa,WAAYR,GAC3BK,SAASpc,KAAKwc,YAAYL,GAC1BA,EAAEM,QACFN,EAAEO,SACFT,OAAOvB,IAAIiC,gBAAgBX,EAC7B,EACAT,EAAIqB,MACN,gBCnBgB,SAAYv7B,EAAoB/a,GAG9C,OAFA+a,EAAayc,EAAUA,WAACzc,GAExB,UADiBw7B,GAAAA,QAAOx7B,EAAa/a,EAAQ0F,SAAS,KAC5BA,UAC5B,wCLiEgB,SAAgBquC,GAC9B,IACE,IAAMt0C,EAAQ+D,KAAKC,MAAMswC,GACnB5qB,EAAMtF,OAAOC,KAAKrkB,GAAO,GAC/B,GAAY,UAAR0pB,EAAiB,CAAA,IAAAqtB,EACb5e,EAAUn4B,EAAM0pB,GAItB,OAFiD,OAA9CqtB,EAAAzH,GAA0C5lB,SAAI,EAA9CqtB,EAAiD5e,KAAQ,4BAC9BA,CAE/B,CACC,IAAM6e,EAAch3C,EAAM0pB,GAG1B,OADqB1pB,EADFokB,OAAOC,KAAKrkB,GAAO,IAEhB,MAAMg3C,CAE/B,CAAC,MAAO7yC,GAEP,OADA9D,GAAeL,MAAM,4BAA6BmE,GAC3CmwC,CACR,CACH,qDK9EgB,SAAQtwB,GACtB,OAAO8yB,GAAAA,QAAO9yB,GAAM/d,UACtB,oCXZM,SAAoBgxC,GACxB,OAAOA,OACT,2BOmBgC,SAC9BC,EACAC,EACAxzC,EACA4I,EACA0wB,EACA7L,EACAgmB,EACAnqB,EACAoqB,EACAC,EACAtqB,EACAuqB,YAHAF,IAAAA,EAAoC,UACpCC,IAAAA,IAAAA,EAAyB,QACzB,IAAAtqB,IAAAA,EAAuB,QACvBuqB,IAAAA,IAAAA,EAAyB,GAAC,IAE1B,IAAMrF,EAActV,EAAUA,WAACC,YAAYqa,GACnCM,EAAetF,EAAYpV,iBAA3B0a,WACRhF,EAA4CN,EAAYO,eAAvCgF,EAAYjF,EAArBjyC,QAAuBoyC,EAAQH,EAARG,SAM5B,OALEyE,IACHA,EAAwB,CACtBlqB,wBAAyB,6CACzBtc,uBAAwB,IACxBuc,sBAAuB,+CACxB7nB,QAAAC,QACoB4xC,EAAgB3xC,SAASC,cAAYC,cAAAgyC,GAC5D,GAAID,IAAiBnxC,OADLoxC,EAA8Cn3C,SAE5D,MAAM,IAAIzB,MAAM,+DAGlB,IAAK04C,EAAWF,GAAgB9tC,QAC9B,UAAU1K,MACqBw4C,6BAAAA,6CAAyDJ,EAAM10B,IAGhG,IAAKmwB,EAAS3lB,GAAcxK,GAC1B,MAAM,IAAI1jB,yCAC2BkuB,EAAY,oCAAoCkqB,EAAM10B,IAC1F,OAAAld,QAAAC,QAEyBgH,EAAUgW,MAAMi1B,EAAWF,GAAgB9tC,UAAQ9D,KAAA,SAAzEsU,GAAa,OAAA1U,QAAAC,QAEMgH,EAAUiiB,cAAcgpB,EAAWF,GAAgB9tC,UAAQ9D,KAA9EiyC,SAAAA,GAAUryC,OAAAA,QAAAC,QACSgH,EAAUkiB,cAAc+oB,EAAWF,GAAgB9tC,UAAQ9D,KAA9EkyC,SAAAA,GAAUtyC,OAAAA,QAAAC,QACgBgH,EAAU2iB,uBACxCsoB,EAAWF,GAAgB9tC,UAC5B9D,KAAA,SAFKmyC,GAAiB,SAAAtV,EAAAuV,GAAA,OAOrB7qB,EAAY6qB,EAAAxyC,QAAAC,QAAAwyC,EAAAv4C,KAEJovC,GAAgBoJ,EAAAC,EAGpB,EAACH,EAED7a,GAAet5B,EAAOjD,eAAYgF,KAAA+7B,EAAA,CAAA,SAAAA,EAAAyW,GAAA,SAAAtW,EAAA3f,GAAA,SAAA4X,EAAAse,GAAA,IAAAvzB,EAwBlC2I,EAAc,CAClBR,SAAQorB,EACRnrB,aAAAA,EACAorB,aAAcC,EACdC,kBAAmBlB,GACL,i0BAAAmB,CACRC,qBACD,MAAM,EAAA,WAAE95B,IAAAA,WAAAqe,GAAAzlB,IAAAA,EAAAsN,GAAAA,EAAAmY,OAAAA,WAAAr1B,EAAAy4B,GAAA7oB,GAAAA,SAAA6oB,CAAA,CAAA,IAAAp4B,EAoBPiS,WAAAA,GAAkB,IAAlBA,GAAyC,IAAlBA,SAAmB1U,QAAAC,QAC/BgH,EAAUmhB,yBACrBilB,EAAS3lB,GAAc3C,iBACvBkD,EACA5pB,EAAO5C,mBACR2E,KAAA+yC,SAAAA,UAAAnhC,IAAAmhC,CAAA,EAAA,CALCz+B,GAKD,OAAAjS,GAAAA,EAAArC,KAAAqC,EAAArC,KAAAgC,GAAAA,EAAAK,EAAA,EAAA+X,EAxBC9F,WAAAA,GAAkB,IAAlBA,EACF,CAAA,IAAM0+B,EAAY,IAAIn2C,GAAUoB,EAAO5C,iBAAkBo2C,GAAgBwB,EAC/CD,EAAU3sC,SAAQ6sC,EAC1CpB,EAAWF,GAAgB9tC,QAAOlE,OAAAA,QAAAC,QAE5B4xC,EAAgBpf,cAAYryB,KAAAmzC,SAAAA,GAAAvzC,OAAAA,QAAAC,QAAAozC,EAAAn5C,KAHVk5C,EAASE,EAEjC,IAAGC,IAAAnzC,KAAA,SAFCozC,GAKN,IAAKA,EACH,MAAU,IAAAh6C,MAAK,wBAChB,OAAAwG,QAAAC,QACKuzC,EAAY3xC,QAAMzB,uBAAAJ,QAAAC,QACXgH,EAAUugB,WACrB0qB,EAAWF,GAAgB9tC,QAC3B+jB,EAAYR,SACZQ,EAAYP,aACZO,EAAY6qB,aACZ7qB,EAAY+qB,oBACb5yC,KAAA,SAAAqzC,GAAAA,OAAAn0B,EAAAm0B,EAAAA,CAAA,EAAAj5B,EAAAA,EAAAA,EAAAA,CAAAA,CAjBC9F,GAiBD8F,OAAAA,GAAAA,EAAApa,KAAAoa,EAAApa,KAAAgZ,GAAAA,EAAAoB,EAUJ,GAAA,CAAA,WAAA,MACI,OAAO,EAAA,WACV,IAAMk5B,EAAM,IAAIlsC,GAAkBnJ,EAAO7C,yBAA0Bq2C,GAEnE,IAAKQ,EAAWJ,GAAgB/0B,GAC9B,MAAU,IAAA1jB,MACuCkuB,+CAAAA,EAAwCkqB,4BAAAA,EAAM10B,IAC9F,OAAAld,QAAAC,QACgByzC,EAAItmC,YAAYilC,EAAWJ,GAAgB/0B,KAAG9c,KAA3D2yC,SAAAA,GAAI/yC,OAAAA,QAAAC,QACayzC,EAAIxrC,YAAYmqC,EAAWJ,GAAgB/0B,KAAG9c,KAAA,SAA/D+H,GAAQ,OAAAnI,QAAAC,QAEoByzC,EAAInpC,6BACpCwoC,EAAKlrC,WACL,IACAiqC,EAAsBxmC,yBACvBlL,KAAA,SAAAC,GAAA+V,IAAAA,WAJsBoL,EAAAoa,GAAA+X,IAAAA,EAAAv9B,GAAAA,EAAAwlB,OAAAA,WAAAhb,EAAAwb,GAAAuX,GAAAA,SAAAvX,CAAA,CAAA,IAAAtb,EAsDnBpM,WAAAA,GAAkB,IAAlBA,GAAyC,IAAlBA,SAAmB1U,QAAAC,QAIpC4xC,EAAgBpf,cAAYryB,KAAA,SAAAwzC,GAAA,OAAA5zC,QAAAC,QAHdolB,GACpBwsB,EACAxzC,EAAMu1C,EAENzrC,EAASR,UACTuqC,EAAWF,GAAgB9tC,QAC3BlB,GACA,IACD5C,KARKgV,SAAAA,GAAE6K,SAAAA,EAYF4zB,GACN,IAAKA,EACH,MAAM,IAAIr6C,MAAK,gDAChB,OAAAwG,QAAAC,QACmBgH,EAAU+gB,mBAC5BkqB,EAAWF,GAAgB9tC,QAC3B+jB,EACAtP,IACDvY,KAJK0zC,SAAAA,GAAK,OAAAH,EAAA,EAKJG,CAAK,EAZZ,CAAA,IAAK1+B,EACH,MAAU,IAAA5b,MAA2B2O,qBAAAA,EAASR,gBAC/C,MAC+B,iBAAPyN,EAAepV,QAAAC,QAAR,iBAAPmV,EAAwBA,EAAGvT,OAASuT,GAAEhV,KAAA6f,GAAAA,EAA/B,iBAAP7K,EAAwBA,EAAGvT,OAASuT,EAAE0L,EAAAA,EAAAA,CAb7DpM,GAa6DoM,OAAAA,GAAAA,EAAA1gB,KAAA0gB,EAAA1gB,KAAAwgB,GAAAA,EAAAE,EA7DjE,CAAA,IAAM9d,EAAQ,IAAImE,EAAAA,SANK9G,EAAf2K,iBAMsC,GAC3C+oC,IAAI,IAAI5sC,UAAQ2qC,EAAsBxmC,wBAA0B,IAChEyoC,IAAI,IAAI5sC,WAASorC,EAAkBrnC,wBAA0B,IAC7DvK,WAEGgY,EAAY,CAChByR,iBAAkB/rB,EAAO7C,yBACzBqM,WAAYkrC,EAAKlrC,WACjBE,mBAAoB/E,EACpB4X,iBAAkBzS,EAASR,UAC3BuT,kBAAmB2T,SAAS1mB,EAASI,aAAe,GACpD+hB,cAAeynB,EACfvnB,iBAAkB+nB,EAAkB9oB,yBACnB/H,EAAA,WAAA,GAEG,IAAlBhN,EAAmB1U,OAAAA,QAAAC,QAIb4xC,EAAgBpf,cAAYryB,KAAA,SAAA4zC,GAAAh0C,OAAAA,QAAAC,QAHdolB,GACpBwsB,EACAxzC,EAAM21C,EAEN7rC,EAASR,UACTtJ,EAAO7C,yBACPwH,GACA,IACD5C,KAAA,SARKgV,GAAEuF,SAAAA,EASFk5B,GACN,IAAKA,EACH,MAAM,IAAIr6C,2BAA2B2O,EAASR,UAAS,MACxD,OAAA3H,QAAAC,QACmByzC,EAAI9rC,cACtBO,EAASN,WACT,IACA7E,EACAuvC,EAAkB9oB,wBAClBsoB,IACD3xC,KAAA,SANK6zC,GAAKj0C,OAAAA,QAAAC,QAOWg0C,EAAMpyC,QAAMzB,KAA5B8zC,SAAAA,GACN,IAAKA,EACH,MAAU,IAAA16C,MAAgD,4CAC3D,OAAAwG,QAAAC,QACYgH,EAAUugB,WACrB0qB,EAAWF,GAAgB9tC,QAC3B+jB,EAAYR,SACZQ,EAAYP,aACZO,EAAY6qB,aACZ7qB,EAAY+qB,oBACb5yC,KAAA+zC,SAAAA,UAAA/9B,IAAA+9B,CAAA,EAAA,EAAA,EAAA,CAAA,MArB+B,iBAAP/+B,EAAepV,QAAAC,QAAR,iBAAPmV,EAAwBA,EAAGvT,OAASuT,GAAEhV,KAAAua,GAAAA,EAA/B,iBAAPvF,EAAwBA,EAAGvT,OAASuT,EAAE,EAAA,EAAA,CAZ9C,GAY8C,OAAAsM,GAAAA,EAAAthB,KAAAshB,EAAAthB,KAAAohB,GAAAA,EAAAE,EAgDlE,EAAA,EAAA,EAAA,GAEC,MAAA,EAAA,WAAA,UAAUloB,MAAM,iCAAiC,IA9HzC,CAAA,OAAAsyB,EAAeyI,EAAfzI,GAAe9rB,QAAAC,QAAW4xC,EAAgBpf,cAAYryB,KAAAm0B,EAjClE,CAAA,IAAMwe,EACJprB,GACAirB,EAQEwB,YAAW1Y,EAAA,WAAA,GAGbqX,GACAA,EAAKsB,qBAAuB9sC,IAC5BwrC,EAAKuB,mBACLzlB,SAASkkB,EAAKuB,mBAAqB,EAAC,+BAEhCt0C,QAAAC,QAIM4xC,EAAgBpf,cAAYryB,cAAAm0C,GAAA,OAAAv0C,QAAAC,QAH9BwpC,GACJoI,EACAxzC,EAAMk2C,EAENxB,EAAKrG,iBACLW,EAAS,GAAGtoB,iBACZguB,EAAKuB,oBACNl0C,KACF,WAAA,EAAA,2DAXmC0B,CAEhC,EASY,WACd,MAAM,IAAItI,MAAK,wCAAyCu5C,EAAKrG,iBAC9D,EAAAhR,CAnBY,GAmBZA,OAAAA,GAAAA,EAAAt7B,KAAAs7B,EAAAt7B,KAAAk8B,GAAAA,IAhCH,IAAM4W,EACJb,EAAWx+B,OAAS,EAAI,QAAUy+B,EAAWz+B,OAAS,EAAI,OAAS,cAAa4+B,EAGhF9qB,GAEQ2hB,GAAiB9M,WAAUmW,EAFnChrB,GAII0lB,EAAS3lB,GAAcxK,GAAEw1B,EAJ7B/qB,GAGIiqB,EAAM10B,GAHV,OAAAyK,EAAYsV,EAAAd,EAAZxU,IAAY3nB,QAAAC,QAMF4xC,EAAgBpf,cAAYryB,KAAA68B,EAAA,EAAA,EAAA,EAAA,EAAA,EA0J1C,CAAC,MAAAp+B,GAAAmB,OAAAA,QAAA+B,OAAAlD,EAAA,CAAA,2DNvO8BgB,EAAgBgzB,GAAe,IAI5D,IAAM+C,EAAmBC,EAAAA,SAAShD,GAAQ,OAAA7yB,QAAAC,QACfJ,EAAyBk2B,mBAAmBH,IAAiBx1B,KAAA,SAApFo0C,GAEJ,IAAM/b,EAAI,MADV+b,EAAgBA,EAAcC,OAAO,IACNx6C,MAAM,EAAG,IAClCyhB,EAAI,KAAO84B,EAAcv6C,MAAM,GAAI,KACrC6hB,EAAI,KAAO04B,EAAcv6C,MAAM,IAAK,KAIxC,MAHU,SAAN6hB,IAAcA,EAAI,QACZ,SAANA,IAAcA,EAAI,QAEf,CAAEA,EAAAA,EAAG2c,EAAAA,EAAG/c,EAAAA,EAAG,EACpB,CAAC,MAAA7c,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,yCI0F6B,SAC5BgB,EACAxB,EACAsT,EACA+iC,EACAxyC,EACA2D,GAAe,IAEf,IAAMlD,EAAgB,IAAIC,EAAMA,OAACC,SAAS8O,EAAc1S,GAAQY,GAAO,OAAAG,QAAAC,QACzC+B,GAAcnC,EAAQ8R,EAAczP,IAAO9B,KAAA,SAAnEqtB,GAAe,OAAAztB,QAAAC,QACA0C,EAAcykB,SAASvhB,YAAY6uC,EAAWjnB,IAAgBrtB,cAA7ER,GAAM,OACRiG,EAA0CjG,EAAMI,QAAAC,QAE3BN,GACvBC,EACAC,EACM,MAANxB,OAAM,EAANA,EAAQvC,iBACR6G,EAAcykB,SACdstB,EACAjnB,GACD,EAAA,EAEH,CAAC,MAAA5uB,GAAA,OAAAmB,QAAA+B,OAAAlD,EAAA,CAAA,mCIjHK,SAAsB3D,GAC1B,IAAMmD,GAAS,IAAIlC,IAAe8B,UAAU/C,GAC5C,OAAOmD,GAAyB,UAAfA,EAAOpC,GAC1B"}