{"version":3,"file":"accessLevel.mjs","names":["gasCoins","objects","commands"],"sources":["../../../src/transaction-analyzer/rules/accessLevel.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { TransactionAnalysisIssue } from '../analyzer.js';\nimport { createAnalyzer } from '../analyzer.js';\nimport { gasCoins } from './coins.js';\nimport type { AnalyzedCommandArgument } from './commands.js';\nimport { commands } from './commands.js';\nimport { objects } from './objects.js';\n\nexport const accessLevel = createAnalyzer({\n\tdependencies: { commands, objects, gasCoins },\n\tanalyze:\n\t\t() =>\n\t\tasync ({ commands, objects, gasCoins }) => {\n\t\t\tconst issues: TransactionAnalysisIssue[] = [];\n\n\t\t\tconst gasCoinIds = new Set(gasCoins.map((g) => g.objectId));\n\n\t\t\tconst accessLevels: Record<string, 'read' | 'mutate' | 'transfer'> = Object.fromEntries(\n\t\t\t\tobjects.map((obj) => [obj.objectId, 'read' as const]),\n\t\t\t);\n\n\t\t\tfor (const id of gasCoinIds) {\n\t\t\t\taccessLevels[id] = 'mutate';\n\t\t\t}\n\n\t\t\tfor (const command of commands) {\n\t\t\t\tswitch (command.$kind) {\n\t\t\t\t\tcase 'TransferObjects':\n\t\t\t\t\t\tfor (const obj of command.objects) {\n\t\t\t\t\t\t\tupdateFromArgument(obj);\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\tfor (const arg of command.arguments) {\n\t\t\t\t\t\t\tupdateFromArgument(arg);\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\tupdateFromArgument(command.coin);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'MergeCoins':\n\t\t\t\t\t\tupdateFromArgument(command.destination);\n\t\t\t\t\t\tfor (const src of command.sources) {\n\t\t\t\t\t\t\tupdateFromArgument(src);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'MakeMoveVec':\n\t\t\t\t\t\tfor (const el of command.elements) {\n\t\t\t\t\t\t\tupdateFromArgument(el);\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\tupdateFromArgument(command.ticket);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'Publish':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tissues.push({ message: `Unknown command type: ${JSON.stringify(command)}` });\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 {\n\t\t\t\tresult: accessLevels,\n\t\t\t};\n\n\t\t\tfunction updateFromArgument(arg: AnalyzedCommandArgument) {\n\t\t\t\tswitch (arg.$kind) {\n\t\t\t\t\tcase 'GasCoin':\n\t\t\t\t\t\tfor (const id of gasCoinIds) {\n\t\t\t\t\t\t\tupdateAccessLevel(id, arg.accessLevel);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'Object':\n\t\t\t\t\t\tupdateAccessLevel(arg.object.objectId, arg.accessLevel);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction updateAccessLevel(id: string, level: 'read' | 'mutate' | 'transfer') {\n\t\t\t\tconst current = accessLevels[id];\n\t\t\t\tif (current === 'transfer') {\n\t\t\t\t\treturn;\n\t\t\t\t} else if (current === 'mutate') {\n\t\t\t\t\tif (level === 'transfer') {\n\t\t\t\t\t\taccessLevels[id] = 'transfer';\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\taccessLevels[id] = level;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n});\n"],"mappings":";;;;;;AAUA,MAAa,cAAc,eAAe;CACzC,cAAc;EAAE;EAAU;EAAS;EAAU;CAC7C,eAEC,OAAO,EAAE,sBAAU,oBAAS,2BAAe;EAC1C,MAAM,SAAqC,EAAE;EAE7C,MAAM,aAAa,IAAI,IAAIA,WAAS,KAAK,MAAM,EAAE,SAAS,CAAC;EAE3D,MAAM,eAA+D,OAAO,YAC3EC,UAAQ,KAAK,QAAQ,CAAC,IAAI,UAAU,OAAgB,CAAC,CACrD;AAED,OAAK,MAAM,MAAM,WAChB,cAAa,MAAM;AAGpB,OAAK,MAAM,WAAWC,WACrB,SAAQ,QAAQ,OAAhB;GACC,KAAK;AACJ,SAAK,MAAM,OAAO,QAAQ,QACzB,oBAAmB,IAAI;AAExB;GACD,KAAK;AACJ,SAAK,MAAM,OAAO,QAAQ,UACzB,oBAAmB,IAAI;AAExB;GACD,KAAK;AACJ,uBAAmB,QAAQ,KAAK;AAChC;GACD,KAAK;AACJ,uBAAmB,QAAQ,YAAY;AACvC,SAAK,MAAM,OAAO,QAAQ,QACzB,oBAAmB,IAAI;AAExB;GACD,KAAK;AACJ,SAAK,MAAM,MAAM,QAAQ,SACxB,oBAAmB,GAAG;AAEvB;GACD,KAAK;AACJ,uBAAmB,QAAQ,OAAO;AAClC;GACD,KAAK,UACJ;GACD,QACC,QAAO,KAAK,EAAE,SAAS,yBAAyB,KAAK,UAAU,QAAQ,IAAI,CAAC;;AAI/E,MAAI,OAAO,OACV,QAAO,EAAE,QAAQ;AAGlB,SAAO,EACN,QAAQ,cACR;EAED,SAAS,mBAAmB,KAA8B;AACzD,WAAQ,IAAI,OAAZ;IACC,KAAK;AACJ,UAAK,MAAM,MAAM,WAChB,mBAAkB,IAAI,IAAI,YAAY;AAEvC;IACD,KAAK;AACJ,uBAAkB,IAAI,OAAO,UAAU,IAAI,YAAY;AACvD;;;EAIH,SAAS,kBAAkB,IAAY,OAAuC;GAC7E,MAAM,UAAU,aAAa;AAC7B,OAAI,YAAY,WACf;YACU,YAAY,UACtB;QAAI,UAAU,WACb,cAAa,MAAM;SAGpB,cAAa,MAAM;;;CAIvB,CAAC"}