{"version":3,"file":"commands.mjs","names":["commands","inputs","data","moveFunctions"],"sources":["../../../src/transaction-analyzer/rules/commands.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { Argument, Command } from '@mysten/sui/transactions';\nimport type { SuiClientTypes } from '@mysten/sui/client';\nimport { inputs } from './inputs.js';\nimport type { AnalyzedCommandInput } from './inputs.js';\nimport type { TransactionAnalysisIssue } from '../analyzer.js';\nimport { createAnalyzer } from '../analyzer.js';\nimport { data } from './core.js';\nimport { moveFunctions } from './functions.js';\n\nexport type AnalyzedCommandArgument =\n\t| AnalyzedCommandInput\n\t| {\n\t\t\t$kind: 'Unknown';\n\t\t\taccessLevel: 'read' | 'mutate' | 'transfer';\n\t  }\n\t| {\n\t\t\t$kind: 'GasCoin';\n\t\t\taccessLevel: 'read' | 'mutate' | 'transfer';\n\t  }\n\t| {\n\t\t\t$kind: 'Result';\n\t\t\tindex: [number, number];\n\t\t\taccessLevel: 'read' | 'mutate' | 'transfer';\n\t  };\n\nexport interface AnalyzedMoveCallCommand {\n\t$kind: 'MoveCall';\n\tindex: number;\n\targuments: AnalyzedCommandArgument[];\n\tfunction: SuiClientTypes.FunctionResponse;\n\tcommand: Extract<Command, { $kind: 'MoveCall' }>['MoveCall'];\n}\n\nexport type AnalyzedCommand =\n\t| AnalyzedMoveCallCommand\n\t| {\n\t\t\t$kind: 'TransferObjects';\n\t\t\tindex: number;\n\t\t\tobjects: AnalyzedCommandArgument[];\n\t\t\taddress: AnalyzedCommandArgument;\n\t\t\tcommand: Extract<Command, { $kind: 'TransferObjects' }>['TransferObjects'];\n\t  }\n\t| {\n\t\t\t$kind: 'MergeCoins';\n\t\t\tindex: number;\n\t\t\tsources: AnalyzedCommandArgument[];\n\t\t\tdestination: AnalyzedCommandArgument;\n\t\t\tcommand: Extract<Command, { $kind: 'MergeCoins' }>['MergeCoins'];\n\t  }\n\t| {\n\t\t\t$kind: 'SplitCoins';\n\t\t\tindex: number;\n\t\t\tcoin: AnalyzedCommandArgument;\n\t\t\tamounts: AnalyzedCommandArgument[];\n\t\t\tcommand: Extract<Command, { $kind: 'SplitCoins' }>['SplitCoins'];\n\t  }\n\t| {\n\t\t\t$kind: 'MakeMoveVec';\n\t\t\tindex: number;\n\t\t\telements: AnalyzedCommandArgument[];\n\t\t\tcommand: Extract<Command, { $kind: 'MakeMoveVec' }>['MakeMoveVec'];\n\t  }\n\t| {\n\t\t\t$kind: 'Upgrade';\n\t\t\tindex: number;\n\t\t\tticket: AnalyzedCommandArgument;\n\t\t\tcommand: Extract<Command, { $kind: 'Upgrade' }>['Upgrade'];\n\t  }\n\t| {\n\t\t\t$kind: 'Publish';\n\t\t\tindex: number;\n\t\t\tcommand: Extract<Command, { $kind: 'Publish' }>['Publish'];\n\t  }\n\t| {\n\t\t\t$kind: 'Unknown';\n\t\t\tindex: number;\n\t\t\tcommand: Extract<Command, { $kind: 'Unknown' }>['Unknown'];\n\t  };\n\nexport const commands = createAnalyzer({\n\tdependencies: {\n\t\tdata,\n\t\tmoveFunctions,\n\t\tinputs,\n\t},\n\tanalyze:\n\t\t() =>\n\t\t({ data, moveFunctions, inputs }) => {\n\t\t\tconst issues: TransactionAnalysisIssue[] = [];\n\t\t\tconst commands: AnalyzedCommand[] = [];\n\n\t\t\tconst mapInput = (\n\t\t\t\targ: Argument,\n\t\t\t\taccessLevel: 'read' | 'mutate' | 'transfer' = 'transfer',\n\t\t\t): AnalyzedCommandArgument => {\n\t\t\t\tswitch (arg.$kind) {\n\t\t\t\t\tcase 'Input':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'GasCoin':\n\t\t\t\t\t\treturn { $kind: 'GasCoin', accessLevel };\n\t\t\t\t\tcase 'Result':\n\t\t\t\t\t\treturn { $kind: 'Result', index: [arg.Result, 0], accessLevel };\n\t\t\t\t\tcase 'NestedResult':\n\t\t\t\t\t\treturn { $kind: 'Result', index: arg.NestedResult, accessLevel };\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tissues.push({ message: `Unexpected input type: ${JSON.stringify(arg)}` });\n\t\t\t\t\t\treturn { $kind: 'Unknown', accessLevel };\n\t\t\t\t}\n\n\t\t\t\tconst input = inputs[arg.Input];\n\n\t\t\t\tif (!input) {\n\t\t\t\t\tissues.push({ message: `Missing input for index ${arg.Input}` });\n\t\t\t\t\treturn { $kind: 'Unknown', accessLevel };\n\t\t\t\t}\n\n\t\t\t\treturn { ...input, accessLevel };\n\t\t\t};\n\n\t\t\tfor (let index = 0; index < data.commands.length; index++) {\n\t\t\t\tconst command = data.commands[index];\n\t\t\t\tswitch (command.$kind) {\n\t\t\t\t\tcase '$Intent':\n\t\t\t\t\t\tissues.push({ message: `Unexpected $Intent command: ${JSON.stringify(command)}` });\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'MakeMoveVec':\n\t\t\t\t\t\tcommands.push({\n\t\t\t\t\t\t\t$kind: 'MakeMoveVec',\n\t\t\t\t\t\t\tindex,\n\t\t\t\t\t\t\telements: command.MakeMoveVec.elements.map((el) => mapInput(el)),\n\t\t\t\t\t\t\tcommand: command.MakeMoveVec,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'TransferObjects':\n\t\t\t\t\t\tcommands.push({\n\t\t\t\t\t\t\t$kind: 'TransferObjects',\n\t\t\t\t\t\t\tindex,\n\t\t\t\t\t\t\taddress: mapInput(command.TransferObjects.address),\n\t\t\t\t\t\t\tobjects: command.TransferObjects.objects.map((obj) => mapInput(obj)),\n\t\t\t\t\t\t\tcommand: command.TransferObjects,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'MergeCoins':\n\t\t\t\t\t\tcommands.push({\n\t\t\t\t\t\t\t$kind: 'MergeCoins',\n\t\t\t\t\t\t\tindex,\n\t\t\t\t\t\t\tsources: command.MergeCoins.sources.map((src) => mapInput(src)),\n\t\t\t\t\t\t\tdestination: mapInput(command.MergeCoins.destination, 'mutate'),\n\t\t\t\t\t\t\tcommand: command.MergeCoins,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'SplitCoins':\n\t\t\t\t\t\tcommands.push({\n\t\t\t\t\t\t\t$kind: 'SplitCoins',\n\t\t\t\t\t\t\tindex,\n\t\t\t\t\t\t\tcoin: mapInput(command.SplitCoins.coin, 'mutate'),\n\t\t\t\t\t\t\tamounts: command.SplitCoins.amounts.map((amt) => mapInput(amt, 'transfer')),\n\t\t\t\t\t\t\tcommand: command.SplitCoins,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'MoveCall': {\n\t\t\t\t\t\tconst func = moveFunctions.find(\n\t\t\t\t\t\t\t(fn) =>\n\t\t\t\t\t\t\t\tfn.packageId === command.MoveCall.package &&\n\t\t\t\t\t\t\t\tfn.moduleName === command.MoveCall.module &&\n\t\t\t\t\t\t\t\tfn.name === command.MoveCall.function,\n\t\t\t\t\t\t)!;\n\t\t\t\t\t\tcommands.push({\n\t\t\t\t\t\t\t$kind: 'MoveCall',\n\t\t\t\t\t\t\tindex,\n\t\t\t\t\t\t\targuments: command.MoveCall.arguments.map((arg, i) => {\n\t\t\t\t\t\t\t\tlet accessLevel: 'read' | 'mutate' | 'transfer' = 'transfer';\n\t\t\t\t\t\t\t\tswitch (func.parameters[i].reference) {\n\t\t\t\t\t\t\t\t\tcase 'mutable':\n\t\t\t\t\t\t\t\t\t\taccessLevel = 'mutate';\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\tcase 'immutable':\n\t\t\t\t\t\t\t\t\t\taccessLevel = 'read';\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\treturn mapInput(arg, accessLevel);\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\tcommand: command.MoveCall,\n\t\t\t\t\t\t\tfunction: func,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'Publish':\n\t\t\t\t\t\tcommands.push({\n\t\t\t\t\t\t\t$kind: 'Publish',\n\t\t\t\t\t\t\tindex,\n\t\t\t\t\t\t\tcommand: command.Publish,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'Upgrade':\n\t\t\t\t\t\tcommands.push({\n\t\t\t\t\t\t\t$kind: 'Upgrade',\n\t\t\t\t\t\t\tindex,\n\t\t\t\t\t\t\tticket: mapInput(command.Upgrade.ticket),\n\t\t\t\t\t\t\tcommand: command.Upgrade,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tthrow new Error('Unknown command type: ' + (command as { $kind: string }).$kind);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (issues.length) {\n\t\t\t\treturn { issues };\n\t\t\t}\n\n\t\t\treturn { result: commands };\n\t\t},\n});\n"],"mappings":"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"}