@taqueria/plugin-flextesa
Version:
A plugin for Taqueria providing local sandbox capabilities built on Flextesa
1 lines • 49.9 kB
Source Map (JSON)
{"version":3,"sources":["index.ts","proxy.ts","tzkt-manager.ts","docker.ts"],"sourcesContent":["import { Option, Plugin, PositionalArg, Task } from '@taqueria/node-sdk';\nimport proxy from './proxy';\n\nPlugin.create(_i18n => ({\n\talias: 'flextesa',\n\tschema: '1.0',\n\tversion: '0.1',\n\ttasks: [\n\t\tTask.create({\n\t\t\ttask: 'start sandbox',\n\t\t\tcommand: 'start sandbox',\n\t\t\taliases: ['start flextesa'],\n\t\t\tdescription: 'Starts a flextesa sandbox',\n\t\t\toptions: [],\n\t\t\thandler: 'proxy',\n\t\t\tencoding: 'none',\n\t\t}),\n\t\tTask.create({\n\t\t\ttask: 'stop sandbox',\n\t\t\tcommand: 'stop sandbox',\n\t\t\taliases: ['stop flextesa'],\n\t\t\tdescription: 'Stops a flextesa sandbox',\n\t\t\toptions: [],\n\t\t\thandler: 'proxy',\n\t\t}),\n\t\tTask.create({\n\t\t\ttask: 'restart sandbox',\n\t\t\tcommand: 'restart sandbox',\n\t\t\taliases: ['restart flextesa'],\n\t\t\tdescription: 'Restarts a flextesa sandbox',\n\t\t\toptions: [],\n\t\t\thandler: 'proxy',\n\t\t}),\n\t\tTask.create({\n\t\t\ttask: 'list accounts',\n\t\t\tcommand: 'list accounts',\n\t\t\taliases: [],\n\t\t\tdescription: 'List the balances of all sandbox accounts',\n\t\t\toptions: [],\n\t\t\thandler: 'proxy',\n\t\t\tencoding: 'json',\n\t\t}),\n\t\tTask.create({\n\t\t\ttask: 'bake',\n\t\t\tcommand: 'bake',\n\t\t\taliases: ['b'],\n\t\t\tdescription: 'Manually bake a block. Use when the \"baking\" setting of a flextesa sandbox is set to \"disabled\".',\n\t\t\toptions: [\n\t\t\t\tOption.create({\n\t\t\t\t\tflag: 'watch',\n\t\t\t\t\tshortFlag: 'w',\n\t\t\t\t\tdescription:\n\t\t\t\t\t\t'Watch for operations as they are injected into the mempool and bake them as immediate as possible.',\n\t\t\t\t\tboolean: true,\n\t\t\t\t}),\n\t\t\t],\n\t\t\thandler: 'proxy',\n\t\t\tencoding: 'none',\n\t\t}),\n\t\tTask.create({\n\t\t\ttask: 'show protocols',\n\t\t\tcommand: 'show protocols',\n\t\t\taliases: ['list protocols'],\n\t\t\tdescription: 'List protocols understood by this version of Flextesa',\n\t\t\toptions: [],\n\t\t\thandler: 'proxy',\n\t\t\tencoding: 'json',\n\t\t}),\n\t],\n\tproxy: proxy,\n}), process.argv);\n","import {\n\texecCmd,\n\tgetArch,\n\tgetDefaultSandboxAccount,\n\tgetDockerImage,\n\tNonEmptyString,\n\tnoop,\n\treadJsonFile,\n\tsendAsyncErr,\n\tsendAsyncRes,\n\tsendErr,\n\tsendJsonRes,\n\tspawnCmd,\n\tstringToSHA256,\n\twriteJsonFile,\n} from '@taqueria/node-sdk';\nimport { Config } from '@taqueria/node-sdk';\nimport { LoadedConfig, Protocol, SandboxAccountConfig, SandboxConfig, StdIO } from '@taqueria/node-sdk/types';\nimport { Config as RawConfig, ConfigAccount } from '@taqueria/protocol/types';\nimport retry from 'async-retry';\nimport { BigNumber } from 'bignumber.js';\nimport type { ExecException } from 'child_process';\nimport { getPortPromise } from 'portfinder';\nimport { last } from 'rambda';\nimport { getTzKtContainerNames, getTzKtStartCommands } from './tzkt-manager';\n\nconst { Url } = Protocol;\n\nimport { getImage } from './docker';\nimport type { FlextesaAnnotations, Opts, ValidLoadedConfig, ValidOpts } from './types';\n\n// ATTENTION: There is a duplicate of this function in taqueria-vscode-extension/src/lib/gui/SandboxesDataProvider.ts\n// Please make sure the two are kept in-sync\nexport const getUniqueSandboxName = async (sandboxName: string, projectDir: string) => {\n\tconst hash = String(await stringToSHA256(sandboxName + projectDir));\n\treturn `${sandboxName.substring(0, 10)}-${hash.substring(0, 5)}`;\n};\n\nexport const getContainerName = async (parsedArgs: ValidOpts) => {\n\tconst uniqueSandboxName = await getUniqueSandboxName(parsedArgs.sandboxName, parsedArgs.projectDir);\n\treturn `taq-flextesa-${uniqueSandboxName}`;\n};\n\nexport const getNewPortIfPortInUse = async (port: number): Promise<number> => {\n\tconst newPort = await getPortPromise({ port });\n\treturn newPort;\n};\n\nconst replaceRpcUrlInConfig = async (newPort: string, oldUrl: string, sandboxName: string, opts: ValidOpts) => {\n\tawait updateConfig(opts, (config: RawConfig) => {\n\t\tconst newUrl = oldUrl.replace(/:\\d+/, ':' + newPort) as Protocol.Url.t;\n\t\tconst sandbox = config.sandbox;\n\t\tconst sandboxConfig = sandbox ? sandbox[sandboxName] : undefined;\n\t\tif (typeof sandboxConfig === 'string' || sandboxConfig === undefined) {\n\t\t\treturn;\n\t\t}\n\t\tconst updatedConfig: RawConfig = {\n\t\t\t...config,\n\t\t\tsandbox: {\n\t\t\t\t...sandbox,\n\t\t\t\t[sandboxName]: {\n\t\t\t\t\t...sandboxConfig,\n\t\t\t\t\trpcUrl: newUrl,\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t\treturn updatedConfig;\n\t});\n};\n\nexport const updateConfig = async (opts: ValidOpts, update: (config: RawConfig) => RawConfig | undefined) => {\n\tconst config = await readJsonFile<RawConfig>(opts.config.configFile);\n\tconst updatedConfig = update(config);\n\tif (!updatedConfig) {\n\t\treturn;\n\t}\n\n\tawait writeJsonFile(opts.config.configFile)(updatedConfig);\n\treturn config;\n};\n\n// TODO: We should adjust our plugins to have a types.ts file just like the taqueria-protocol, and\n// have our code generator generate type modules that use Zod schemas.\n//\n// We can then use those modules to parse things like annotations into plugin-specifc types\n// For now, I'll do things the old-fashioned way and just manually validate the annotations\nconst getFlextesaAnnotations = (sandbox: SandboxConfig.t): Promise<FlextesaAnnotations> => {\n\tconst defaults = {\n\t\tbaking: 'enabled',\n\t\tblock_time: 1,\n\t};\n\n\tconst settings = {\n\t\t...defaults,\n\t\t...sandbox.annotations,\n\t};\n\n\tif (!['enabled', 'disabled'].includes(settings.baking)) {\n\t\treturn Promise.reject(\n\t\t\t'The \"baking\" setting of a Flextesa Sandbox must to set to either \"enabled\" or \"disabled\".',\n\t\t);\n\t} else if (!Number.isInteger(settings.block_time)) {\n\t\treturn Promise.reject(\n\t\t\t'The \"block_time\" setting of a Flextesa Sandbox must be an integer, and set to a value greater than 0.',\n\t\t);\n\t} else if (settings.block_time <= 0) {\n\t\treturn Promise.reject(\n\t\t\t'The \"block_time\" setting of a Flextesa Sandbox must be set to a value greater than 0. If you are trying to disable baking, please set the \"baking\" setting to \"disabled\" instead.',\n\t\t);\n\t}\n\n\treturn Promise.resolve(settings as FlextesaAnnotations);\n};\n\nconst getBakingFlags = (sandbox: SandboxConfig.t) =>\n\tgetFlextesaAnnotations(sandbox)\n\t\t.then(settings => {\n\t\t\t// Enabled\n\t\t\tif (settings.baking === 'enabled') {\n\t\t\t\treturn [\n\t\t\t\t\t`--time-b ${settings.block_time}`,\n\t\t\t\t\t``,\n\t\t\t\t];\n\t\t\t} // Disabled\n\t\t\telse if (settings.baking === 'disabled') {\n\t\t\t\treturn [\n\t\t\t\t\t'--no-baking',\n\t\t\t\t\t`--time-b 1`,\n\t\t\t\t];\n\t\t\t}\n\n\t\t\t// Auto\n\t\t\treturn [\n\t\t\t\t'--no-baking',\n\t\t\t\t`--time-b 1`,\n\t\t\t];\n\t\t});\n\n// TODO work with Oxhead on this.\n// Uses memoization\nconst getSupportedProtocolKinds = (() => {\n\tlet protocols: string[] = [];\n\n\tconst getAll = (opts: ValidOpts): Promise<string[] | [string]> => {\n\t\tconst image = getImage(opts);\n\t\treturn execCmd(`docker run --rm ${image} flextesa mini-net --protocol-kind=foobar`)\n\t\t\t.catch(err => {\n\t\t\t\tconst { stderr } = err;\n\t\t\t\tconst protocols = stderr.match(/'[A-Z][a-z]+'/gm) ?? [];\n\t\t\t\treturn Promise.resolve(protocols.map((protocol: string) => protocol.replace(/'/gm, '')));\n\t\t\t});\n\t};\n\n\treturn async (opts: ValidOpts): Promise<string[] | [string]> => {\n\t\tif (protocols.length == 0) protocols = await getAll(opts);\n\t\treturn protocols ?? ['Alpha']; // if no known protocols are found, return Alpha which is always a valid protocol\n\t};\n})();\n\nconst getProtocolKind = (sandbox: SandboxConfig.t, opts: ValidOpts) =>\n\tgetSupportedProtocolKinds(opts)\n\t\t.then(protocols => {\n\t\t\tconst validProtocols = protocols.filter(p => p != 'Alpha' && p != 'Oxford'); // Oxford is filtered only because it's not supported in a image. Alpha is not a valid protocol as it doesn't work with the indexers\n\t\t\tif (!sandbox.protocol || sandbox.protocol.includes('lpha')) {\n\t\t\t\treturn last(validProtocols);\n\t\t\t}\n\t\t\treturn validProtocols.reduce(\n\t\t\t\t(retval, protocolKind) => {\n\t\t\t\t\tif (retval) return retval;\n\t\t\t\t\tconst givenProtocolHash = (sandbox.protocol!).toLowerCase();\n\t\t\t\t\tconst testProtocol = protocolKind.toLowerCase().slice(0, 4);\n\t\t\t\t\treturn givenProtocolHash.includes(testProtocol) ? protocolKind : undefined;\n\t\t\t\t},\n\t\t\t\tundefined as string | undefined,\n\t\t\t) ?? last(validProtocols);\n\t\t});\n\nconst getBootstrapBalance = (opts: ValidOpts) =>\n\tObject.values(opts.config.accounts || {})\n\t\t.reduce(\n\t\t\t(retval, amount) => retval.plus(new BigNumber(amount.replaceAll('_', ''))),\n\t\t\tnew BigNumber(0).multipliedBy(1000000),\n\t\t)\n\t\t.multipliedBy(1000); // give the baker lots to work with\n\nconst getMininetCommand = (sandboxName: string, sandbox: SandboxConfig.t, opts: ValidOpts) =>\n\tPromise.all([\n\t\t// getAccountFlags(sandbox, opts.config),\n\t\tgetBakingFlags(sandbox),\n\t\tgetProtocolKind(sandbox, opts),\n\t])\n\t\t.then(([bakingFlags, protocolKind]) => [\n\t\t\t'flextesa mini-net',\n\t\t\t'--root /tmp/mini-box',\n\t\t\t'--set-history-mode N000:archive', // TODO: Add annotation for this setting\n\t\t\t'--until-level 200_000_000', // TODO: Add annotation for this setting\n\t\t\t`--number-of-b 1`,\n\t\t\t`--protocol-kind=\"${protocolKind}\"`,\n\t\t\t'--size 1',\n\t\t\t`--balance-of-bootstrap-accounts=mutez:${getBootstrapBalance(opts)}`,\n\t\t\t// ...accountFlags,\n\t\t\t...bakingFlags,\n\t\t])\n\t\t.then(flags => flags.join(' '));\n\nconst getStartCommand = async (sandboxName: string, sandbox: SandboxConfig.t, opts: ValidOpts) => {\n\tconst port = new URL(sandbox.rpcUrl).port;\n\tconst newPort = (await getNewPortIfPortInUse(parseInt(port))).toString();\n\tif (newPort !== port) {\n\t\tconsole.log(\n\t\t\t`${port} is already in use, ${newPort} will be used for sandbox ${sandboxName} instead and .taq/config.json will be updated to reflect this.`,\n\t\t);\n\t\tawait replaceRpcUrlInConfig(newPort, sandbox.rpcUrl.toString(), sandboxName, opts);\n\t}\n\tconst ports = `-p ${newPort}:20000 --expose 20000`;\n\n\tconst containerName = await getContainerName(opts);\n\tconst mininetCmd = await getMininetCommand(sandboxName, sandbox, opts);\n\tconst arch = await getArch();\n\tconst image = getImage(opts);\n\tconst projectDir = process.env.PROJECT_DIR ?? opts.config.projectDir;\n\tconst proxyAbsPath = `${__dirname}/proxy.py`;\n\n\treturn `docker run -i --network sandbox_${sandboxName}_net --name ${containerName} --rm --detach --platform ${arch} ${ports} -v ${projectDir}:/project ${image} /bin/sh -c \"flextesa_node_cors_origin=* ${mininetCmd}\"`;\n};\n\n// const startMininet = async (sandboxName: string, sandbox: SandboxConfig.t, opts: ValidOpts) => {\n// \tconst containerName = await getContainerName(opts);\n// \tconst mininetCmd = await getMininetCommand(sandboxName, sandbox, opts);\n// \tconst cmd = `docker exec -d ${containerName} sh -c \"flextesa_node_cors_origin='*' ${mininetCmd}\"`;\n// \treturn execCmd(cmd);\n// };\n\nconst startSandbox = (sandboxName: string, sandbox: SandboxConfig.t, opts: ValidOpts): Promise<void> => {\n\tif (doesNotUseFlextesa(sandbox)) {\n\t\treturn sendAsyncErr(`Cannot start ${sandbox.label} as its configured to use the ${sandbox.plugin} plugin.`);\n\t}\n\n\treturn Promise.resolve(opts)\n\t\t.then(addSandboxAccounts)\n\t\t.then(loadedConfig => {\n\t\t\tconsole.log('Booting sandbox...');\n\t\t\treturn getStartCommand(sandboxName, sandbox, opts).then(execCmd)\n\t\t\t\t.then(() => {\n\t\t\t\t\tconsole.log('Importing accounts...');\n\t\t\t\t\treturn importSandboxAccounts(opts)(loadedConfig);\n\t\t\t\t});\n\t\t})\n\t\t.then(() => importBaker(opts))\n\t\t// .then(() => {\n\t\t// \tconsole.log('Starting node...');\n\t\t// \treturn startMininet(sandboxName, sandbox, opts);\n\t\t// })\n\t\t.then(() => configureTezosClient(sandboxName, opts))\n\t\t.then(() => {\n\t\t\tconsole.log('Waiting for bootstrapping to complete...');\n\t\t\treturn waitForBootstrap(opts);\n\t\t})\n\t\t.then(() => {\n\t\t\tconsole.log('Funding declared accounts (please wait)...');\n\t\t\treturn new Promise(resolve => setTimeout(resolve, 10000)).then(() => fundDeclaredAccounts(opts));\n\t\t})\n\t\t.then(() => {\n\t\t\tconsole.log(`The sandbox \"${sandboxName}\" is ready.`);\n\t\t});\n};\n\nconst getConfigureCommand = async (opts: ValidOpts): Promise<string> => {\n\tconst containerName = await getContainerName(opts);\n\treturn `docker exec -d ${containerName} octez-client --endpoint http://localhost:20000 config update`;\n};\n\nconst doesUseFlextesa = (sandbox: SandboxConfig.t) => !sandbox.plugin || sandbox.plugin === 'flextesa';\n\nconst doesNotUseFlextesa = (sandbox: SandboxConfig.t) => !doesUseFlextesa(sandbox);\n\nconst waitForBootstrap = (parsedArgs: ValidOpts): unknown => {\n\tconst sandbox = getValidSandbox(parsedArgs.sandboxName, parsedArgs.config);\n\tconst containerName = getContainerName(parsedArgs);\n\treturn getContainerName(parsedArgs)\n\t\t.then(container => execCmd(`docker exec ${container} octez-client bootstrapped`))\n\t\t.catch(({ stderr }) => {\n\t\t\tif (stderr.includes('Failed to acquire the protocol version from the node')) return waitForBootstrap(parsedArgs);\n\t\t\tthrow stderr;\n\t\t});\n};\n\ntype Transfer = { destination: string; amount: string };\n\nconst createTransferList = (sandbox: SandboxConfig.t, parsedArgs: ValidOpts) => {\n\tconst transferList = Object.keys(sandbox.accounts ?? {}).reduce(\n\t\t(retval, accountName) => {\n\t\t\tif (accountName === 'default') return retval;\n\t\t\tconst balance = new BigNumber(parsedArgs.config.accounts[accountName].replaceAll('_', '')).div(1000000);\n\t\t\treturn [...retval, { destination: accountName, amount: balance.toString() }];\n\t\t},\n\t\t[] as Transfer[],\n\t);\n\treturn transferList;\n};\n\nconst writeTransferList = (containerName: string, transferList: Transfer[]) => {\n\tconst fileAbsPath = '/tmp/transferList.json';\n\tconst cmd = `docker cp ${fileAbsPath} ${containerName}:${fileAbsPath}`;\n\treturn writeJsonFile(fileAbsPath)(transferList)\n\t\t.then(() => execCmd(cmd))\n\t\t.then(() => fileAbsPath);\n};\n\nconst fundDeclaredAccounts = async (parsedArgs: ValidOpts) => {\n\tconst sandbox = getValidSandbox(parsedArgs.sandboxName, parsedArgs.config);\n\tconst transferList = createTransferList(sandbox, parsedArgs);\n\n\ttry {\n\t\tconst containerName = await getContainerName(parsedArgs);\n\t\tconst transferListAbsPath = await writeTransferList(containerName, transferList);\n\t\tconst cmd =\n\t\t\t`docker exec ${containerName} octez-client multiple transfers from baker0 using ${transferListAbsPath} --burn-cap 1`;\n\t\tconst result = await execCmd(cmd);\n\t\treturn result;\n\t} catch (e) {\n\t\tif (parsedArgs.debug) console.warn(e);\n\t\treturn sendAsyncErr('Failed to fund declared accounts.');\n\t}\n};\n\nconst startContainer = async (container: { name: string; command: string }): Promise<void> => {\n\tconsole.log(`Starting ${container.name}`);\n\ttry {\n\t\tconst result = await execCmd(container.command);\n\t\tif (result.stderr) {\n\t\t\tconsole.error(result.stderr);\n\t\t}\n\t\tconsole.log(result.stdout);\n\t} catch (e: unknown) {\n\t\tthrow e;\n\t}\n};\n\nconst startInstance = async (sandboxName: string, sandbox: SandboxConfig.t, opts: ValidOpts): Promise<void> => {\n\tawait execCmd(\n\t\t`docker network ls | grep 'sandbox_${sandboxName}_net' > /dev/null || docker network create --driver bridge sandbox_${sandboxName}_net`,\n\t);\n\n\tconst isRunning = await isSandboxRunning(opts.sandboxName, opts);\n\tif (isRunning) {\n\t\tawait sendAsyncRes('Already running.');\n\t\treturn;\n\t}\n\n\tawait startSandbox(sandboxName, sandbox, opts);\n\n\tif (sandbox.tzkt?.disableAutostartWithSandbox === true) {\n\t\treturn;\n\t}\n\tconst { postgres, sync, api } = await getTzKtStartCommands(sandboxName, sandbox, opts);\n\tconst tzKtContainers = [\n\t\t{ name: 'postgresql', command: postgres },\n\t\t{ name: 'TzKt.Sync', command: sync },\n\t\t{ name: 'TzKt.Api', command: api },\n\t];\n\tfor (const container of tzKtContainers) {\n\t\tawait startContainer(container);\n\t}\n};\n\nconst configureTezosClient = (sandboxName: string, opts: ValidOpts): Promise<StdIO> =>\n\tretry(\n\t\t() =>\n\t\t\tgetConfigureCommand(opts)\n\t\t\t\t.then(execCmd)\n\t\t\t\t.then(({ stderr, stdout }) => {\n\t\t\t\t\tif (stderr.length) return Promise.reject(stderr);\n\t\t\t\t\treturn ({ stderr, stdout });\n\t\t\t\t}),\n\t);\n\nconst importBaker = (opts: ValidOpts) =>\n\tgetContainerName(opts)\n\t\t.then(container =>\n\t\t\t`docker exec -d ${container} octez-client import secret key baker0 unencrypted:edsk3RFgDiCt7tWB2oe96w1eRw72iYiiqZPLu9nnEY23MYRp2d8Kkx`\n\t\t)\n\t\t.then(execCmd);\n\nconst startAll = (opts: ValidOpts): Promise<void> => {\n\tif (opts.config.sandbox === undefined) return sendAsyncErr('No sandboxes configured to start');\n\n\tconst processes = Object.entries(opts.config.sandbox).reduce(\n\t\t(retval, [sandboxName, sandboxDetails]) => {\n\t\t\tif (sandboxName === 'default') return retval;\n\t\t\treturn [...retval, startInstance(sandboxName, sandboxDetails as SandboxConfig.t, opts)];\n\t\t},\n\t\t[] as Promise<void>[],\n\t);\n\n\treturn Promise.all(processes).then(_ => sendAsyncRes('Done.'));\n};\n\nconst getSandbox = ({ sandboxName, config }: Opts) => {\n\tif (sandboxName && config.sandbox && config.sandbox[sandboxName]) {\n\t\tconst sandboxConfig = config.sandbox![sandboxName] as SandboxConfig.t;\n\t\treturn sandboxConfig;\n\t}\n\treturn undefined;\n};\n\nconst getValidSandbox = (sandboxName: string, config: ValidLoadedConfig) => {\n\tconst retval = config.sandbox[sandboxName] as SandboxConfig.t;\n\tretval.rpcUrl = retval.rpcUrl && retval.rpcUrl.length > 0 ? retval.rpcUrl : Url.create('http://localhost:20000');\n\treturn retval;\n};\n\nconst startSandboxTask = (parsedArgs: ValidOpts): Promise<void> => {\n\tconst sandbox = getValidSandbox(parsedArgs.sandboxName, parsedArgs.config);\n\treturn sandbox\n\t\t? startInstance(parsedArgs.sandboxName, sandbox, parsedArgs)\n\t\t: sendAsyncErr(`There is no sandbox configuration with the name ${parsedArgs.sandboxName}.`);\n};\n\nconst isSandboxRunning = (sandboxName: string, opts: ValidOpts) => {\n\treturn getContainerName(opts)\n\t\t.then(containerName => execCmd(`docker ps --filter name=${containerName} | grep -w ${containerName}`))\n\t\t.then(_ => true)\n\t\t.catch(_ => false);\n};\n\ntype AccountBalance = { account: string; balance: string; address: string | undefined };\n\n// TODO - we should run all `octez-client` calls in a single `docker exec` call.\n// That will decrease response latency\nconst getAccountBalances = (\n\tsandboxName: string,\n\tsandbox: SandboxConfig.t,\n\topts: ValidOpts,\n): Promise<AccountBalance[]> => {\n\tconst processes = Object.entries(sandbox.accounts ?? {}).reduce(\n\t\t(retval: Promise<AccountBalance>[], [accountName, accountDetails]) => {\n\t\t\tif (accountName === 'default') return retval;\n\n\t\t\tconst getBalanceProcess = getArch()\n\t\t\t\t.then(_ => getContainerName(opts))\n\t\t\t\t.then(containerName => `docker exec ${containerName} octez-client get balance for ${accountName.trim()}`)\n\t\t\t\t.then(execCmd)\n\t\t\t\t.then(({ stdout, stderr }) => {\n\t\t\t\t\tif (stderr.length > 0) sendErr(stderr);\n\t\t\t\t\treturn {\n\t\t\t\t\t\taccount: accountName,\n\t\t\t\t\t\tbalance: stdout.trim(),\n\t\t\t\t\t\taddress: (accountDetails as SandboxAccountConfig.t).publicKeyHash,\n\t\t\t\t\t};\n\t\t\t\t})\n\t\t\t\t.catch((err: ExecException) => {\n\t\t\t\t\tsendErr(err.message);\n\t\t\t\t\treturn {\n\t\t\t\t\t\taccount: accountName,\n\t\t\t\t\t\tbalance: 'Error',\n\t\t\t\t\t\taddress: (accountDetails as SandboxAccountConfig.t).publicKeyHash,\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\treturn [...retval, getBalanceProcess];\n\t\t},\n\t\t[],\n\t);\n\n\treturn Promise.all(processes);\n};\n\nconst listAccountsTask = async <T>(parsedArgs: ValidOpts): Promise<void> => {\n\tif (parsedArgs.sandboxName) {\n\t\tconst sandbox = getSandbox(parsedArgs);\n\t\tif (sandbox) {\n\t\t\tif (doesUseFlextesa(sandbox)) {\n\t\t\t\treturn await isSandboxRunning(parsedArgs.sandboxName, parsedArgs)\n\t\t\t\t\t? getAccountBalances(parsedArgs.sandboxName, sandbox, parsedArgs)\n\t\t\t\t\t\t.then(sendJsonRes)\n\t\t\t\t\t: sendAsyncErr(`The ${parsedArgs.sandboxName} sandbox is not running.`);\n\t\t\t}\n\t\t\treturn sendAsyncErr(\n\t\t\t\t`Cannot start ${sandbox.label} as its configured to use the ${sandbox.plugin} plugin.`,\n\t\t\t);\n\t\t}\n\t\treturn sendAsyncErr(`There is no sandbox configuration with the name ${parsedArgs.sandboxName}.`);\n\t}\n\treturn sendAsyncErr(`Please specify a sandbox. E.g. taq list accounts local`);\n};\n\nconst stopSandboxTask = async (parsedArgs: ValidOpts): Promise<void> => {\n\tif (parsedArgs.sandboxName) {\n\t\tconst sandbox = getSandbox(parsedArgs);\n\t\tif (sandbox) {\n\t\t\tif (doesUseFlextesa(sandbox)) {\n\t\t\t\tawait isSandboxRunning(parsedArgs.sandboxName, parsedArgs)\n\t\t\t\t\t? execCmd(`docker kill ${await getContainerName(parsedArgs)}`)\n\t\t\t\t\t\t.then(_ => sendAsyncRes(`Stopped ${parsedArgs.sandboxName}.`))\n\t\t\t\t\t: sendAsyncRes(`The ${parsedArgs.sandboxName} sandbox was not running.`);\n\t\t\t\tawait stopTzKtContainers(parsedArgs.sandboxName, sandbox, parsedArgs);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treturn sendAsyncErr(`Cannot stop ${sandbox.label} as its configured to use the ${sandbox.plugin} plugin.`);\n\t\t}\n\t\treturn sendAsyncErr(`There is no sandbox configuration with the name ${parsedArgs.sandboxName}.`);\n\t}\n\treturn sendAsyncErr(`No sandbox specified`);\n};\n\nconst restartSandboxTask = async (parsedArgs: ValidOpts): Promise<void> => {\n\tawait stopSandboxTask(parsedArgs);\n\tawait startSandboxTask(parsedArgs);\n};\n\nconst stopTzKtContainers = async (\n\tsandboxName: string,\n\tsandbox: SandboxConfig.t,\n\tparsedArgs: ValidOpts,\n): Promise<void> => {\n\tconst containerNames = await getTzKtContainerNames(sandboxName, parsedArgs);\n\tconst containersToStop = [containerNames.api, containerNames.sync, containerNames.postgres];\n\tfor (const container of containersToStop) {\n\t\ttry {\n\t\t\tconst result = await execCmd(`docker stop ${container}`);\n\t\t\tif (result.stderr) {\n\t\t\t\tconsole.error(result.stderr);\n\t\t\t}\n\t\t\tconsole.log(result.stdout);\n\t\t} catch (e: unknown) {\n\t\t\t// ignore\n\t\t}\n\t}\n};\n\nconst listProtocolsTask = (parsedArgs: Opts) => {\n\tconst image = getImage(parsedArgs);\n\tconst cmd = `docker run --rm ${image} octez-client -M mockup list mockup protocols 2>/dev/null`;\n\treturn execCmd(cmd)\n\t\t.then(({ stdout }) => stdout.trim().split('\\n').map(hash => ({ 'protocols': hash })))\n\t\t.then(sendJsonRes);\n};\n\nconst bakeTask = (parsedArgs: ValidOpts) =>\n\tgetContainerName(parsedArgs)\n\t\t.then(async containerName => {\n\t\t\tif (parsedArgs.watch) {\n\t\t\t\tconsole.log('Baking on demand as operations are injected.');\n\t\t\t\tconsole.log('Press CTRL-C to stop and exit.');\n\t\t\t\tconsole.log();\n\t\t\t\twhile (true) {\n\t\t\t\t\tconsole.log('Waiting for operations to be injected...');\n\t\t\t\t\twhile (true) {\n\t\t\t\t\t\tconst { stdout } = await execCmd(\n\t\t\t\t\t\t\t`docker exec ${containerName} octez-client rpc get /chains/main/mempool/pending_operations`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst ops = JSON.parse(stdout);\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t(Array.isArray(ops.applied) && ops.applied.length > 0)\n\t\t\t\t\t\t\t|| (Array.isArray(ops.validated) && ops.validated.length > 0)\n\t\t\t\t\t\t) break;\n\t\t\t\t\t}\n\n\t\t\t\t\tawait spawnCmd(`docker exec ${containerName} octez-client bake for baker0`);\n\t\t\t\t\tnoop();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn spawnCmd(`docker exec ${containerName} octez-client bake for baker0`).then(noop);\n\t\t});\n\n// TODO - we should run all `flextesa key` calls in a single `docker run` call.\n// That will decrease response latency\nconst instantiateAccounts = (parsedArgs: ValidOpts) => {\n\tconsole.log('Generating account keys...');\n\treturn Object.entries(parsedArgs.config.accounts).reduce(\n\t\t(lastConfig, [accountName, _]) =>\n\t\t\t// TODO: This could probably be more performant by generating the key pairs using TS rather than proxy to docker/flextesa\n\t\t\tlastConfig\n\t\t\t\t.then(_ => execCmd(`docker run --rm ${getImage(parsedArgs)} flextesa key ${accountName}`))\n\t\t\t\t.then(result => result.stdout.trim().split(','))\n\t\t\t\t.then(([_alias, encryptedKey, publicKeyHash, secretKey]) =>\n\t\t\t\t\tSandboxAccountConfig.create({\n\t\t\t\t\t\tencryptedKey,\n\t\t\t\t\t\tpublicKeyHash,\n\t\t\t\t\t\tsecretKey,\n\t\t\t\t\t})\n\t\t\t\t)\n\t\t\t\t.then(async accountConfig => {\n\t\t\t\t\tconst config = await lastConfig;\n\t\t\t\t\tconst accounts = config.sandbox[parsedArgs.sandboxName].accounts\n\t\t\t\t\t\t?? { 'default': NonEmptyString.create(accountName) };\n\t\t\t\t\taccounts[accountName] = accountConfig;\n\t\t\t\t\tconfig.sandbox[parsedArgs.sandboxName].accounts = accounts;\n\t\t\t\t\treturn config;\n\t\t\t\t}),\n\t\tPromise.resolve(parsedArgs.config),\n\t)\n\t\t.then(Config.create)\n\t\t.then(config => writeJsonFile(parsedArgs.config.configFile)(config).then(_ => config))\n\t\t.then(config =>\n\t\t\tLoadedConfig.create({\n\t\t\t\t...parsedArgs.config,\n\t\t\t\t...config,\n\t\t\t}) as ValidLoadedConfig\n\t\t);\n};\n\nconst hasInstantiatedAccounts = (parsedArgs: ValidOpts) => {\n\tconst sandbox = getValidSandbox(parsedArgs.sandboxName, parsedArgs.config);\n\tconst accounts = sandbox.accounts ?? {};\n\treturn Object.keys(accounts).length > 0;\n};\n\nconst maybeInstantiateAccounts = (parsedArgs: ValidOpts) => {\n\treturn hasInstantiatedAccounts(parsedArgs)\n\t\t? Promise.resolve(parsedArgs.config)\n\t\t: instantiateAccounts(parsedArgs);\n};\n\nconst importSandboxAccounts = (parsedArgs: ValidOpts) => async (updatedConfig: ValidLoadedConfig) => {\n\tconst containerName = await getContainerName(parsedArgs);\n\tconst cmds = Object.entries(getValidSandbox(parsedArgs.sandboxName, updatedConfig).accounts ?? {}).reduce(\n\t\t(retval, [accountName, account]) =>\n\t\t\ttypeof account === 'string'\n\t\t\t\t? retval\n\t\t\t\t: [...retval, `octez-client import secret key ${accountName} ${account.secretKey} --force`],\n\t\t[] as string[],\n\t);\n\n\tawait execCmd(`docker exec -d ${containerName} sh -c '${cmds.join(' && ')}'`);\n};\n\nconst addSandboxAccounts = (parsedArgs: ValidOpts) => maybeInstantiateAccounts(parsedArgs);\n\nconst getDefaultSandboxName = (parsedArgs: Opts) => {\n\tconst env = parsedArgs.config.environment[parsedArgs.env] as Protocol.Environment.t;\n\tif (env.sandboxes && env.sandboxes.length > 0) {\n\t\treturn env.sandboxes[0];\n\t}\n\treturn undefined;\n};\n\nconst taskMap: Record<string, (opts: ValidOpts) => Promise<void>> = {\n\t'list accounts': listAccountsTask,\n\t'show protocols': listProtocolsTask,\n\t'list protocols': listProtocolsTask,\n\t'start sandbox': startSandboxTask,\n\t'start flextesa': startSandboxTask,\n\t'stop sandbox': stopSandboxTask,\n\t'stop flextesa': stopSandboxTask,\n\t'bake': bakeTask,\n\t'b': bakeTask,\n\t'restart sandbox': restartSandboxTask,\n\t'restart flextesa': restartSandboxTask,\n};\n\nconst validateRequest = async (unparsedArgs: Opts) => {\n\t// Validate that we have what we need\n\tconst origSandboxName = unparsedArgs.sandboxName;\n\tconst sandboxName = unparsedArgs.sandboxName ?? getDefaultSandboxName(unparsedArgs);\n\tconst modifiedArgs = { ...unparsedArgs, sandboxName: sandboxName };\n\tconst sandbox = getSandbox(modifiedArgs);\n\tif (!sandbox) {\n\t\treturn sendAsyncErr(\n\t\t\tunparsedArgs.sandboxName\n\t\t\t\t? `There is no sandbox called ${origSandboxName} in your .taq/config.json.`\n\t\t\t\t: `No sandbox name was specified. We couldn't find a valid sandbox config for the current environment.`,\n\t\t);\n\t}\n\n\tif (!unparsedArgs.task || !Object.keys(taskMap).includes(unparsedArgs.task)) {\n\t\treturn await sendAsyncErr(`${unparsedArgs.task} is not an understood task by the Flextesa plugin`);\n\t}\n\n\tif (doesNotUseFlextesa(sandbox)) {\n\t\treturn sendAsyncErr(\n\t\t\t`Cannot ${unparsedArgs.task} for ${sandbox.label} as its configured to use the ${sandbox.plugin} plugin.`,\n\t\t);\n\t}\n\n\tif (!unparsedArgs.config.accounts || Object.keys(unparsedArgs.config.accounts).length === 0) {\n\t\treturn await sendAsyncErr(`This task required a list of declared accounts in your .taq/config.json.`);\n\t}\n\n\treturn modifiedArgs;\n};\n\nexport const proxy = (unparsedArgs: Opts): Promise<void> => {\n\tif (unparsedArgs.task && (unparsedArgs.task == 'list protocols' || unparsedArgs.task === 'show protocols')) {\n\t\treturn listProtocolsTask(unparsedArgs);\n\t} else {\n\t\treturn validateRequest(unparsedArgs).then(modifiedArgs => {\n\t\t\tconst parsedArgs = modifiedArgs as ValidOpts;\n\t\t\treturn taskMap[parsedArgs.task](parsedArgs);\n\t\t});\n\t}\n};\nexport default proxy;\n","import { getArch, SandboxConfig } from '@taqueria/node-sdk';\nimport { Config as RawConfig } from '@taqueria/protocol/types';\nimport { getContainerName, getNewPortIfPortInUse, getUniqueSandboxName, updateConfig } from './proxy';\nimport { ValidOpts } from './types';\n\nconst getTzKtDockerImages = (opts: ValidOpts) => ({\n\tpostgres: `postgres:14.5-alpine`,\n\tsync: `bakingbad/tzkt-sync:latest`,\n\tapi: `bakingbad/tzkt-api:latest`,\n});\n\nexport const getTzKtContainerNames = async (sandboxName: string, parsedArgs: ValidOpts) => {\n\tconst uniqueSandboxName = await getUniqueSandboxName(sandboxName, parsedArgs.projectDir);\n\treturn {\n\t\tpostgres: `taq-postgres-${uniqueSandboxName}`,\n\t\tsync: `taq-tzkt-sync-${uniqueSandboxName}`,\n\t\tapi: `taq-tzkt-api-${uniqueSandboxName}`,\n\t};\n};\n\nconst getTzKtContainerEnvironments = async (sandboxName: string, sandbox: SandboxConfig, opts: ValidOpts) => {\n\tconst containerNames = await getTzKtContainerNames(sandboxName, opts);\n\tconst sandboxContainerName = await getContainerName(opts);\n\tconst connectionStringEnv =\n\t\t`ConnectionStrings__DefaultConnection=\"host=${containerNames.postgres};port=5432;database=sandbox_data;username=tzkt;password=${sandboxName};\"`;\n\treturn {\n\t\tpostgres: `--env POSTGRES_PASSWORD=${sandboxName} --env POSTGRES_USER=tzkt`,\n\t\tsync:\n\t\t\t`--env ${connectionStringEnv} --env TezosNode__Endpoint=\"http://${sandboxContainerName}:20000/\" --env Protocols__Fallback=\"PtLimaPtLMwfNinJi9rCfDPWea8dFgTZ1MeJ9f1m2SRic6ayiwW\"`,\n\t\tapi:\n\t\t\t`--env ${connectionStringEnv} --env Kestrel__Endpoints__Http__Url=\"http://*:5000\" --env MaxAttemptsForMigrations=120`,\n\t};\n};\n\nexport const getTzKtStartCommands = async (sandboxName: string, sandbox: SandboxConfig, opts: ValidOpts) => {\n\tconst pgPort = sandbox.tzkt?.postgresqlPort ?? 5432;\n\tconst newPGPort = await getNewPortIfPortInUse(pgPort);\n\n\tconst apiPort = sandbox.tzkt?.apiPort ?? 5000;\n\tconst newAPIPort = await getNewPortIfPortInUse(apiPort);\n\n\tif (newPGPort !== pgPort || newAPIPort !== apiPort) {\n\t\tif (newPGPort !== pgPort) {\n\t\t\tconsole.log(\n\t\t\t\t`${pgPort} is already in use, ${newPGPort} will be used for postgresql in ${sandboxName} instead and .taq/config.json will be updated to reflect this.`,\n\t\t\t);\n\t\t}\n\t\tif (newAPIPort !== apiPort) {\n\t\t\tconsole.log(\n\t\t\t\t`${apiPort} is already in use, ${newAPIPort} will be used for TzKt API in ${sandboxName} instead and .taq/config.json will be updated to reflect this.`,\n\t\t\t);\n\t\t}\n\t\tawait updateConfig(opts, (config: RawConfig) => {\n\t\t\tconst sandbox = config.sandbox?.[sandboxName];\n\t\t\tif (typeof sandbox === 'string' || sandbox === undefined) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tconst oldTzKt = sandbox?.tzkt ?? {\n\t\t\t\tdisableAutostartWithSandbox: false,\n\t\t\t\tapiPort: 5000,\n\t\t\t\tpostgresqlPort: 5432,\n\t\t\t};\n\t\t\tconst updatedConfig: RawConfig = {\n\t\t\t\t...config,\n\t\t\t\tsandbox: {\n\t\t\t\t\t...config.sandbox,\n\t\t\t\t\t[sandboxName]: {\n\t\t\t\t\t\t...sandbox,\n\t\t\t\t\t\ttzkt: {\n\t\t\t\t\t\t\t...oldTzKt,\n\t\t\t\t\t\t\tpostgresqlPort: newPGPort,\n\t\t\t\t\t\t\tapiPort: newAPIPort,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t\treturn updatedConfig;\n\t\t});\n\t}\n\n\tconst containerNames = await getTzKtContainerNames(sandboxName, opts);\n\tconst arch = await getArch();\n\tconst images = getTzKtDockerImages(opts);\n\tconst environmentVariables = await getTzKtContainerEnvironments(sandboxName, sandbox, opts);\n\n\treturn {\n\t\tpostgres:\n\t\t\t`docker run --network sandbox_${sandboxName}_net --name ${containerNames.postgres} --rm --detach --platform ${arch} -p ${newPGPort}:5432 ${environmentVariables.postgres} ${images.postgres}`,\n\t\tsync:\n\t\t\t`docker run --network sandbox_${sandboxName}_net --name ${containerNames.sync} --rm --detach --platform ${arch} ${environmentVariables.sync} ${images.sync}`,\n\t\tapi:\n\t\t\t`docker run --network sandbox_${sandboxName}_net --name ${containerNames.api} --rm --detach --platform ${arch} -p ${newAPIPort}:5000 ${environmentVariables.api} ${images.api}`,\n\t};\n};\n","import { getDockerImage } from '@taqueria/node-sdk';\nimport { Opts } from './types';\n\nexport const TAQ_FLEXTESA_IMAGE_ENV_VAR = 'TAQ_FLEXTESA_IMAGE';\n\nexport const getDefaultDockerImage = (opts: Opts) => `registry.gitlab.com/tezos/flextesa:018ac39a-run`;\n\nexport const getImage = (opts: Opts) => getDockerImage(getDefaultDockerImage(opts), TAQ_FLEXTESA_IMAGE_ENV_VAR);\n"],"mappings":"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","names":["getArch","_a","sandbox","protocols","getArch","getArch","_"]}