@ledgerhq/device-signer-kit-solana 0.0.0-multisig-20250905101831 → 0.0.0-patch-transactionInspector-20250910142959

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.
Files changed (31) hide show
  1. package/lib/cjs/api/app-binder/SignTransactionDeviceActionTypes.js.map +1 -1
  2. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.js +1 -1
  3. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.js.map +2 -2
  4. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.test.js +1 -1
  5. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.test.js.map +2 -2
  6. package/lib/cjs/internal/app-binder/services/TransactionInspector.js +1 -1
  7. package/lib/cjs/internal/app-binder/services/TransactionInspector.js.map +3 -3
  8. package/lib/cjs/internal/app-binder/services/utils/transactionDecoders.js +2 -0
  9. package/lib/cjs/internal/app-binder/services/utils/transactionDecoders.js.map +7 -0
  10. package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.test.js +1 -1
  11. package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.test.js.map +2 -2
  12. package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.js +1 -1
  13. package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.js.map +2 -2
  14. package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.test.js +1 -1
  15. package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.test.js.map +2 -2
  16. package/lib/esm/internal/app-binder/services/TransactionInspector.js +1 -1
  17. package/lib/esm/internal/app-binder/services/TransactionInspector.js.map +3 -3
  18. package/lib/esm/internal/app-binder/services/utils/transactionDecoders.js +2 -0
  19. package/lib/esm/internal/app-binder/services/utils/transactionDecoders.js.map +7 -0
  20. package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.test.js +1 -1
  21. package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.test.js.map +2 -2
  22. package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts +1 -1
  23. package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts.map +1 -1
  24. package/lib/types/internal/app-binder/device-action/SignTransactionDeviceAction.d.ts +1 -1
  25. package/lib/types/internal/app-binder/device-action/SignTransactionDeviceAction.d.ts.map +1 -1
  26. package/lib/types/internal/app-binder/services/TransactionInspector.d.ts +13 -16
  27. package/lib/types/internal/app-binder/services/TransactionInspector.d.ts.map +1 -1
  28. package/lib/types/internal/app-binder/services/utils/transactionDecoders.d.ts +25 -0
  29. package/lib/types/internal/app-binder/services/utils/transactionDecoders.d.ts.map +1 -0
  30. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  31. package/package.json +6 -6
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/api/app-binder/SignTransactionDeviceActionTypes.ts"],
4
- "sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport { type SolanaTransactionContextResultSuccess } from \"@ledgerhq/context-module/src/solana/domain/solanaContextTypes.js\";\nimport {\n type DeviceActionState,\n type ExecuteDeviceActionReturnType,\n type OpenAppDAError,\n type OpenAppDARequiredInteraction,\n type SendCommandInAppDAError,\n type UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type AppConfiguration } from \"@api/model/AppConfiguration\";\nimport { type Signature } from \"@api/model/Signature\";\nimport { type Transaction } from \"@api/model/Transaction\";\nimport { type SolanaAppErrorCodes } from \"@internal/app-binder/command/utils/SolanaApplicationErrors\";\nimport { type TxInspectorResult } from \"@internal/app-binder/services/TransactionInspector\";\n\nexport type SignTransactionDAOutput = Signature;\n\nexport type SignTransactionDAInput = {\n readonly derivationPath: string;\n readonly transaction: Transaction;\n readonly skipOpenApp: boolean;\n readonly contextModule: ContextModule;\n};\n\nexport type SignTransactionDAError =\n | OpenAppDAError\n | SendCommandInAppDAError<SolanaAppErrorCodes>;\n\ntype SignTransactionDARequiredInteraction =\n | UserInteractionRequired\n | OpenAppDARequiredInteraction;\n\nexport type SignTransactionDAIntermediateValue = {\n requiredUserInteraction: SignTransactionDARequiredInteraction;\n};\n\nexport type SignTransactionDAState = DeviceActionState<\n SignTransactionDAOutput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n>;\n\nexport type SignTransactionDAInternalState = {\n readonly error: SignTransactionDAError | null;\n readonly signature: Signature | null;\n readonly appConfig: AppConfiguration | null;\n readonly solanaTransactionContext: SolanaTransactionContextResultSuccess | null;\n readonly inspectorResult: TxInspectorResult | null;\n};\n\nexport type SignTransactionDAReturnType = ExecuteDeviceActionReturnType<\n SignTransactionDAOutput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n>;\n"],
4
+ "sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport { type SolanaTransactionContextResultSuccess } from \"@ledgerhq/context-module/src/solana/domain/solanaContextTypes.js\";\nimport {\n type DeviceActionState,\n type ExecuteDeviceActionReturnType,\n type OpenAppDAError,\n type OpenAppDARequiredInteraction,\n type SendCommandInAppDAError,\n type UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type AppConfiguration } from \"@api/model/AppConfiguration\";\nimport { type Signature } from \"@api/model/Signature\";\nimport { type Transaction } from \"@api/model/Transaction\";\nimport { type SolanaAppErrorCodes } from \"@internal/app-binder/command/utils/SolanaApplicationErrors\";\nimport { type TxInspectorResult } from \"@internal/app-binder/services/utils/transactionDecoders\";\n\nexport type SignTransactionDAOutput = Signature;\n\nexport type SignTransactionDAInput = {\n readonly derivationPath: string;\n readonly transaction: Transaction;\n readonly skipOpenApp: boolean;\n readonly contextModule: ContextModule;\n};\n\nexport type SignTransactionDAError =\n | OpenAppDAError\n | SendCommandInAppDAError<SolanaAppErrorCodes>;\n\ntype SignTransactionDARequiredInteraction =\n | UserInteractionRequired\n | OpenAppDARequiredInteraction;\n\nexport type SignTransactionDAIntermediateValue = {\n requiredUserInteraction: SignTransactionDARequiredInteraction;\n};\n\nexport type SignTransactionDAState = DeviceActionState<\n SignTransactionDAOutput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n>;\n\nexport type SignTransactionDAInternalState = {\n readonly error: SignTransactionDAError | null;\n readonly signature: Signature | null;\n readonly appConfig: AppConfiguration | null;\n readonly solanaTransactionContext: SolanaTransactionContextResultSuccess | null;\n readonly inspectorResult: TxInspectorResult | null;\n};\n\nexport type SignTransactionDAReturnType = ExecuteDeviceActionReturnType<\n SignTransactionDAOutput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n>;\n"],
5
5
  "mappings": "+WAAA,IAAAA,EAAA,kBAAAC,EAAAD",
6
6
  "names": ["SignTransactionDeviceActionTypes_exports", "__toCommonJS"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var d=Object.defineProperty;var E=Object.getOwnPropertyDescriptor;var f=Object.getOwnPropertyNames;var x=Object.prototype.hasOwnProperty;var v=(i,a)=>{for(var s in a)d(i,s,{get:a[s],enumerable:!0})},I=(i,a,s,p)=>{if(a&&typeof a=="object"||typeof a=="function")for(let o of f(a))!x.call(i,o)&&o!==s&&d(i,o,{get:()=>a[o],enumerable:!(p=E(a,o))||p.enumerable});return i};var h=i=>I(d({},"__esModule",{value:!0}),i);var R={};v(R,{SignTransactionDeviceAction:()=>k});module.exports=h(R);var e=require("@ledgerhq/device-management-kit"),u=require("purify-ts"),n=require("xstate"),T=require("../../app-binder/command/GetAppConfigurationCommand"),A=require("../../app-binder/command/SignTransactionCommand"),m=require("../../app-binder/services/ApplicationChecker"),l=require("../../app-binder/services/TransactionInspector"),C=require("../../app-binder/task/BuildTransactionContextTask"),y=require("../../app-binder/task/ProvideTransactionContextTask"),D=require("../../app-binder/task/SendSignDataTask");class k extends e.XStateDeviceAction{makeStateMachine(a){const{signTransaction:s,getAppConfig:p,buildContext:o,provideContext:g,inspectTransaction:S}=this.extractDependencies(a);return(0,n.setup)({types:{input:{},context:{},output:{}},actors:{openAppStateMachine:new e.OpenAppDeviceAction({input:{appName:"Solana"}}).makeStateMachine(a),getAppConfig:(0,n.fromPromise)(p),inspectTransaction:(0,n.fromPromise)(({input:t})=>S({serializedTransaction:t.transaction})),buildContext:(0,n.fromPromise)(o),provideContext:(0,n.fromPromise)(g),signTransaction:(0,n.fromPromise)(s)},guards:{noInternalError:({context:t})=>t._internalState.error===null,skipOpenApp:({context:t})=>t.input.skipOpenApp,isSPLSupported:({context:t})=>new m.ApplicationChecker(a.getDeviceSessionState(),t._internalState.appConfig).withMinVersionExclusive("1.4.0").excludeDeviceModel(e.DeviceModelId.NANO_S).check(),isAnSPLTransaction:({context:t})=>t._internalState.inspectorResult?.transactionType===l.SolanaTransactionTypes.SPL},actions:{assignErrorFromEvent:(0,n.assign)({_internalState:t=>({...t.context._internalState,error:new e.UnknownDAError(t.event.error instanceof Error?t.event.error.message:String(t.event.error))})})}}).createMachine({id:"SignTransactionDeviceAction",initial:"InitialState",context:({input:t})=>({input:t,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},_internalState:{error:null,signature:null,appConfig:null,solanaTransactionContext:null,inspectorResult:null}}),states:{InitialState:{always:[{target:"GetAppConfig",guard:"skipOpenApp"},{target:"OpenAppDeviceAction"}]},OpenAppDeviceAction:{exit:(0,n.assign)({intermediateValue:()=>({requiredUserInteraction:e.UserInteractionRequired.None})}),invoke:{id:"openAppStateMachine",src:"openAppStateMachine",input:()=>({appName:"Solana"}),onSnapshot:{actions:(0,n.assign)({intermediateValue:({event:t})=>t.snapshot.context.intermediateValue})},onDone:{target:"CheckOpenAppDeviceActionResult",actions:(0,n.assign)({_internalState:({event:t,context:r})=>t.output.caseOf({Right:()=>r._internalState,Left:c=>({...r._internalState,error:c})})})}}},CheckOpenAppDeviceActionResult:{always:[{target:"GetAppConfig",guard:"noInternalError"},{target:"Error"}]},GetAppConfig:{entry:(0,n.assign)({intermediateValue:()=>({requiredUserInteraction:e.UserInteractionRequired.None})}),invoke:{id:"getAppConfig",src:"getAppConfig",onDone:{target:"GetAppConfigResultCheck",actions:(0,n.assign)({_internalState:({event:t,context:r})=>(0,e.isSuccessCommandResult)(t.output)?{...r._internalState,appConfig:t.output.data}:{...r._internalState,error:t.output.error}})},onError:{target:"Error",actions:"assignErrorFromEvent"}}},GetAppConfigResultCheck:{always:[{target:"InspectTransaction",guard:"noInternalError"},{target:"Error"}]},InspectTransaction:{invoke:{id:"inspectTransaction",src:"inspectTransaction",input:({context:t})=>({...t.input,serializedTransaction:t.input.transaction}),onDone:{target:"AfterInspect",actions:(0,n.assign)({_internalState:({context:t,event:r})=>({...t._internalState,inspectorResult:r.output})})},onError:{target:"Error",actions:"assignErrorFromEvent"}}},AfterInspect:{always:[{target:"BuildContext",guard:"isAnSPLTransaction"},{target:"SignTransaction",guard:"noInternalError"},{target:"Error"}]},BuildContext:{entry:(0,n.assign)({intermediateValue:()=>({requiredUserInteraction:e.UserInteractionRequired.None})}),invoke:{id:"buildContext",src:"buildContext",input:({context:t})=>{const r=t._internalState.inspectorResult?.data;return{contextModule:t.input.contextModule,options:{tokenAddress:r?.tokenAddress,createATA:r?.createATA}}},onDone:{target:"ProvideContext",actions:[(0,n.assign)({_internalState:({event:t,context:r})=>({...r._internalState,solanaTransactionContext:{descriptor:t.output.descriptor,certificate:t.output.calCertificate,tokenAccount:t.output.addressResult.tokenAccount,owner:t.output.addressResult.owner,contract:t.output.addressResult.contract}})})]},onError:{target:"Error",actions:"assignErrorFromEvent"}}},ProvideContext:{entry:(0,n.assign)({intermediateValue:()=>({requiredUserInteraction:e.UserInteractionRequired.None})}),invoke:{id:"provideContext",src:"provideContext",input:({context:t})=>{if(!t._internalState.solanaTransactionContext)throw new e.UnknownDAError("Solana transaction context is not available");return t._internalState.solanaTransactionContext},onDone:{target:"ProvideContextResultCheck"},onError:{target:"Error",actions:"assignErrorFromEvent"}}},ProvideContextResultCheck:{always:[{target:"SignTransaction",guard:"noInternalError"},{target:"Error"}]},SignTransaction:{entry:(0,n.assign)({intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.SignTransaction}}),exit:(0,n.assign)({intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None}}),invoke:{id:"signTransaction",src:"signTransaction",input:({context:t})=>({derivationPath:t.input.derivationPath,serializedTransaction:t.input.transaction}),onDone:{target:"SignTransactionResultCheck",actions:[(0,n.assign)({_internalState:({event:t,context:r})=>{if(!(0,e.isSuccessCommandResult)(t.output))return{...r._internalState,error:t.output.error};const c=t.output.data.extract();return t.output.data.isJust()&&c instanceof Uint8Array?{...r._internalState,signature:c}:{...r._internalState,error:new e.UnknownDAError("No Signature available")}}})]},onError:{target:"Error",actions:"assignErrorFromEvent"}}},SignTransactionResultCheck:{always:[{guard:"noInternalError",target:"Success"},{target:"Error"}]},Success:{type:"final"},Error:{type:"final"}},output:({context:t})=>t._internalState.signature?(0,u.Right)(t._internalState.signature):(0,u.Left)(t._internalState.error||new e.UnknownDAError("No error or signature available"))})}extractDependencies(a){return{getAppConfig:async()=>a.sendCommand(new T.GetAppConfigurationCommand),buildContext:async t=>new C.BuildTransactionContextTask(a,t.input).run(),provideContext:async t=>new y.ProvideSolanaTransactionContextTask(a,t.input).run(),signTransaction:async t=>new D.SignDataTask(a,{commandFactory:r=>new A.SignTransactionCommand({serializedTransaction:r.chunkedData,more:r.more,extend:r.extend}),derivationPath:t.input.derivationPath,sendingData:t.input.serializedTransaction}).run(),inspectTransaction:async t=>Promise.resolve(new l.TransactionInspector(t.serializedTransaction).inspectTransactionType())}}}0&&(module.exports={SignTransactionDeviceAction});
1
+ "use strict";var d=Object.defineProperty;var f=Object.getOwnPropertyDescriptor;var E=Object.getOwnPropertyNames;var x=Object.prototype.hasOwnProperty;var v=(i,a)=>{for(var s in a)d(i,s,{get:a[s],enumerable:!0})},I=(i,a,s,p)=>{if(a&&typeof a=="object"||typeof a=="function")for(let o of E(a))!x.call(i,o)&&o!==s&&d(i,o,{get:()=>a[o],enumerable:!(p=f(a,o))||p.enumerable});return i};var h=i=>I(d({},"__esModule",{value:!0}),i);var R={};v(R,{SignTransactionDeviceAction:()=>k});module.exports=h(R);var e=require("@ledgerhq/device-management-kit"),u=require("purify-ts"),n=require("xstate"),T=require("../../app-binder/command/GetAppConfigurationCommand"),m=require("../../app-binder/command/SignTransactionCommand"),A=require("../../app-binder/services/ApplicationChecker"),l=require("../../app-binder/services/TransactionInspector"),C=require("../../app-binder/task/BuildTransactionContextTask"),y=require("../../app-binder/task/ProvideTransactionContextTask"),D=require("../../app-binder/task/SendSignDataTask");class k extends e.XStateDeviceAction{makeStateMachine(a){const{signTransaction:s,getAppConfig:p,buildContext:o,provideContext:g,inspectTransaction:S}=this.extractDependencies(a);return(0,n.setup)({types:{input:{},context:{},output:{}},actors:{openAppStateMachine:new e.OpenAppDeviceAction({input:{appName:"Solana"}}).makeStateMachine(a),getAppConfig:(0,n.fromPromise)(p),inspectTransaction:(0,n.fromPromise)(({input:t})=>S({serializedTransaction:t.transaction})),buildContext:(0,n.fromPromise)(o),provideContext:(0,n.fromPromise)(g),signTransaction:(0,n.fromPromise)(s)},guards:{noInternalError:({context:t})=>t._internalState.error===null,skipOpenApp:({context:t})=>t.input.skipOpenApp,isSPLSupported:({context:t})=>new A.ApplicationChecker(a.getDeviceSessionState(),t._internalState.appConfig).withMinVersionExclusive("1.4.0").excludeDeviceModel(e.DeviceModelId.NANO_S).check(),isAnSPLTransaction:({context:t})=>t._internalState.inspectorResult?.transactionType===l.SolanaTransactionTypes.SPL},actions:{assignErrorFromEvent:(0,n.assign)({_internalState:t=>({...t.context._internalState,error:new e.UnknownDAError(t.event.error instanceof Error?t.event.error.message:String(t.event.error))})})}}).createMachine({id:"SignTransactionDeviceAction",initial:"InitialState",context:({input:t})=>({input:t,intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},_internalState:{error:null,signature:null,appConfig:null,solanaTransactionContext:null,inspectorResult:null}}),states:{InitialState:{always:[{target:"GetAppConfig",guard:"skipOpenApp"},{target:"OpenAppDeviceAction"}]},OpenAppDeviceAction:{exit:(0,n.assign)({intermediateValue:()=>({requiredUserInteraction:e.UserInteractionRequired.None})}),invoke:{id:"openAppStateMachine",src:"openAppStateMachine",input:()=>({appName:"Solana"}),onSnapshot:{actions:(0,n.assign)({intermediateValue:({event:t})=>t.snapshot.context.intermediateValue})},onDone:{target:"CheckOpenAppDeviceActionResult",actions:(0,n.assign)({_internalState:({event:t,context:r})=>t.output.caseOf({Right:()=>r._internalState,Left:c=>({...r._internalState,error:c})})})}}},CheckOpenAppDeviceActionResult:{always:[{target:"GetAppConfig",guard:"noInternalError"},{target:"Error"}]},GetAppConfig:{entry:(0,n.assign)({intermediateValue:()=>({requiredUserInteraction:e.UserInteractionRequired.None})}),invoke:{id:"getAppConfig",src:"getAppConfig",onDone:{target:"GetAppConfigResultCheck",actions:(0,n.assign)({_internalState:({event:t,context:r})=>(0,e.isSuccessCommandResult)(t.output)?{...r._internalState,appConfig:t.output.data}:{...r._internalState,error:t.output.error}})},onError:{target:"Error",actions:"assignErrorFromEvent"}}},GetAppConfigResultCheck:{always:[{target:"InspectTransaction",guard:"noInternalError"},{target:"Error"}]},InspectTransaction:{invoke:{id:"inspectTransaction",src:"inspectTransaction",input:({context:t})=>({...t.input,serializedTransaction:t.input.transaction}),onDone:{target:"AfterInspect",actions:(0,n.assign)({_internalState:({context:t,event:r})=>({...t._internalState,inspectorResult:r.output})})},onError:{target:"Error",actions:"assignErrorFromEvent"}}},AfterInspect:{always:[{target:"BuildContext",guard:"isAnSPLTransaction"},{target:"SignTransaction",guard:"noInternalError"},{target:"Error"}]},BuildContext:{entry:(0,n.assign)({intermediateValue:()=>({requiredUserInteraction:e.UserInteractionRequired.None})}),invoke:{id:"buildContext",src:"buildContext",input:({context:t})=>{const r=t._internalState.inspectorResult?.data;return{contextModule:t.input.contextModule,options:{tokenAddress:r?.tokenAddress,createATA:r?.createATA}}},onDone:{target:"ProvideContext",actions:[(0,n.assign)({_internalState:({event:t,context:r})=>({...r._internalState,solanaTransactionContext:{descriptor:t.output.descriptor,certificate:t.output.calCertificate,tokenAccount:t.output.addressResult.tokenAccount,owner:t.output.addressResult.owner,contract:t.output.addressResult.contract}})})]},onError:{target:"Error",actions:"assignErrorFromEvent"}}},ProvideContext:{entry:(0,n.assign)({intermediateValue:()=>({requiredUserInteraction:e.UserInteractionRequired.None})}),invoke:{id:"provideContext",src:"provideContext",input:({context:t})=>{if(!t._internalState.solanaTransactionContext)throw new e.UnknownDAError("Solana transaction context is not available");return t._internalState.solanaTransactionContext},onDone:{target:"ProvideContextResultCheck"},onError:{target:"Error",actions:"assignErrorFromEvent"}}},ProvideContextResultCheck:{always:[{target:"SignTransaction",guard:"noInternalError"},{target:"Error"}]},SignTransaction:{entry:(0,n.assign)({intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.SignTransaction}}),exit:(0,n.assign)({intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None}}),invoke:{id:"signTransaction",src:"signTransaction",input:({context:t})=>({derivationPath:t.input.derivationPath,serializedTransaction:t.input.transaction}),onDone:{target:"SignTransactionResultCheck",actions:[(0,n.assign)({_internalState:({event:t,context:r})=>{if(!(0,e.isSuccessCommandResult)(t.output))return{...r._internalState,error:t.output.error};const c=t.output.data.extract();return t.output.data.isJust()&&c instanceof Uint8Array?{...r._internalState,signature:c}:{...r._internalState,error:new e.UnknownDAError("No Signature available")}}})]},onError:{target:"Error",actions:"assignErrorFromEvent"}}},SignTransactionResultCheck:{always:[{guard:"noInternalError",target:"Success"},{target:"Error"}]},Success:{type:"final"},Error:{type:"final"}},output:({context:t})=>t._internalState.signature?(0,u.Right)(t._internalState.signature):(0,u.Left)(t._internalState.error||new e.UnknownDAError("No error or signature available"))})}extractDependencies(a){return{getAppConfig:async()=>a.sendCommand(new T.GetAppConfigurationCommand),buildContext:async t=>new C.BuildTransactionContextTask(a,t.input).run(),provideContext:async t=>new y.ProvideSolanaTransactionContextTask(a,t.input).run(),signTransaction:async t=>new D.SignDataTask(a,{commandFactory:r=>new m.SignTransactionCommand({serializedTransaction:r.chunkedData,more:r.more,extend:r.extend}),derivationPath:t.input.derivationPath,sendingData:t.input.serializedTransaction}).run(),inspectTransaction:async t=>Promise.resolve(new l.TransactionInspector(t.serializedTransaction).inspectTransactionType())}}}0&&(module.exports={SignTransactionDeviceAction});
2
2
  //# sourceMappingURL=SignTransactionDeviceAction.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/device-action/SignTransactionDeviceAction.ts"],
4
- "sourcesContent": ["import {\n type CommandErrorResult,\n type CommandResult,\n type DeviceActionStateMachine,\n DeviceModelId,\n type InternalApi,\n isSuccessCommandResult,\n OpenAppDeviceAction,\n type StateMachineTypes,\n UnknownDAError,\n UserInteractionRequired,\n XStateDeviceAction,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, type Maybe, Right } from \"purify-ts\";\nimport { assign, fromPromise, setup } from \"xstate\";\n\nimport {\n type SignTransactionDAError,\n type SignTransactionDAInput,\n type SignTransactionDAIntermediateValue,\n type SignTransactionDAInternalState,\n type SignTransactionDAOutput,\n} from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { type AppConfiguration } from \"@api/model/AppConfiguration\";\nimport { type Signature } from \"@api/model/Signature\";\nimport { GetAppConfigurationCommand } from \"@internal/app-binder/command/GetAppConfigurationCommand\";\nimport { SignTransactionCommand } from \"@internal/app-binder/command/SignTransactionCommand\";\nimport { type SolanaAppErrorCodes } from \"@internal/app-binder/command/utils/SolanaApplicationErrors\";\nimport { ApplicationChecker } from \"@internal/app-binder/services/ApplicationChecker\";\nimport {\n SolanaTransactionTypes,\n TransactionInspector,\n type TxInspectorResult,\n} from \"@internal/app-binder/services/TransactionInspector\";\nimport {\n BuildTransactionContextTask,\n type BuildTransactionContextTaskArgs,\n type SolanaBuildContextResult,\n} from \"@internal/app-binder/task/BuildTransactionContextTask\";\nimport {\n ProvideSolanaTransactionContextTask,\n type SolanaContextForDevice,\n} from \"@internal/app-binder/task/ProvideTransactionContextTask\";\nimport { SignDataTask } from \"@internal/app-binder/task/SendSignDataTask\";\n\nexport type MachineDependencies = {\n readonly getAppConfig: () => Promise<\n CommandResult<AppConfiguration, SolanaAppErrorCodes>\n >;\n readonly buildContext: (arg0: {\n input: BuildTransactionContextTaskArgs;\n }) => Promise<SolanaBuildContextResult>;\n readonly provideContext: (arg0: {\n input: SolanaContextForDevice;\n }) => Promise<Maybe<CommandErrorResult<SolanaAppErrorCodes>>>;\n readonly inspectTransaction: (arg0: {\n serializedTransaction: Uint8Array;\n }) => Promise<TxInspectorResult>;\n readonly signTransaction: (arg0: {\n input: {\n derivationPath: string;\n serializedTransaction: Uint8Array;\n };\n }) => Promise<\n CommandResult<Maybe<Signature | SolanaAppErrorCodes>, SolanaAppErrorCodes>\n >;\n};\n\nexport class SignTransactionDeviceAction extends XStateDeviceAction<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n> {\n makeStateMachine(\n internalApi: InternalApi,\n ): DeviceActionStateMachine<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n > {\n type types = StateMachineTypes<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n >;\n\n const {\n signTransaction,\n getAppConfig,\n buildContext,\n provideContext,\n inspectTransaction,\n } = this.extractDependencies(internalApi);\n\n return setup({\n types: {\n input: {} as types[\"input\"],\n context: {} as types[\"context\"],\n output: {} as types[\"output\"],\n },\n actors: {\n openAppStateMachine: new OpenAppDeviceAction({\n input: { appName: \"Solana\" },\n }).makeStateMachine(internalApi),\n getAppConfig: fromPromise(getAppConfig),\n inspectTransaction: fromPromise(\n ({ input }: { input: SignTransactionDAInput }) =>\n inspectTransaction({ serializedTransaction: input.transaction }),\n ),\n buildContext: fromPromise(buildContext),\n provideContext: fromPromise(provideContext),\n signTransaction: fromPromise(signTransaction),\n },\n guards: {\n noInternalError: ({ context }) => context._internalState.error === null,\n skipOpenApp: ({ context }) => context.input.skipOpenApp,\n isSPLSupported: ({ context }) =>\n new ApplicationChecker(\n internalApi.getDeviceSessionState(),\n context._internalState.appConfig!,\n )\n .withMinVersionExclusive(\"1.4.0\")\n .excludeDeviceModel(DeviceModelId.NANO_S)\n .check(),\n isAnSPLTransaction: ({ context }) =>\n context._internalState.inspectorResult?.transactionType ===\n SolanaTransactionTypes.SPL,\n },\n actions: {\n assignErrorFromEvent: assign({\n _internalState: (_) => ({\n ..._.context._internalState,\n error: new UnknownDAError(\n _.event[\"error\"] instanceof Error\n ? _.event[\"error\"].message\n : String(_.event[\"error\"]),\n ),\n }),\n }),\n },\n }).createMachine({\n /** @xstate-layout N4IgpgJg5mDOIC5QGUCWUB2AVATgQw1jwGMAXVAewwBEwA3VYsAQTMowDoBJDVcvADbJSeUmADEAbQAMAXUSgADhVh92CkAA9EARgDsAZg4AOPdL37pAFj1WArACYANCACeuh4Y46dxgGzSBnZ6AQZ6dgC+ES5omLgERGxUtAxMrORU3Lz8QiJiUjrySCDKqhkYGtoI+kam5pY29s5uujrSxhzSAJw+AcZWplZ+BlEx6Nj4hCTlKYwsSZwA8opgGMyKirNpC+IQVGAcqBh0FADWBxQraxvComAAsiQAFkdgMkVKKmpUlYjhOhw7F0bAYrAN9HZrC53NV2lZAV1AnYrGEul0wpFoiBYhMEtN2Ft5uUOABhJ5gYinZardabehzdLsABKcAArgJSFI5BpSt8KsUqjoDDoHJ0ug5jAY6jowbZoa0ZYDpHYfA59A47H4BqNseN4lMFoTGZkyRSqVdaUaFizYOzOZJCjyvuVftVhaLuhKpWYZY15QhjADpH4HAMQ0FzOEujqcfrEjN6dtiQBxMCkWkkqgAM3Qu32h2OZwOMHTG0zGBzUHeTrK6gFukDeg4fj04Slwbavis-pFAw4en6wSGfmRXWMMb1k3jBMTRPYHFTpcU5cr4jAOBwFBwHEUAlEWa3AFsOCWM9n0NXiryXfXqo3m627O2-J3+j20RwHIjhiHPAOrIEE5xFO+LJLOxqcIuZ4VugNp2qalJch8JTOnWoBVA4njwv0OiOFYaohNIwY9p4HR+GiGrGNYAEOEEQG4gaCapHOmRQWW55QHBHIIacBTIdeaFaIgmG2CYVi4aGBEBMRLQIKCQY6F0QIigY0iKdGWKxiBhrgQsWSwCsZBxqBGB5hgBxHCc5wFgZFKkMZCyXp8tY-LeEr4f2yKmGOwyGF0JHkRwYQGORxj+C2fgtvRDlMQyek8LZRnaeUa4bluO57qQB44MeRyJfZyXsE5KEufy6HCf0orhAMeg+cF-myfYXSfjYtgiphiLIn40WFWBzEQRwzBZmIOAJYZ9rcleqGueVcmYUYtFdC2spSphPYih0QxLX4gbCqCdiYmMwF4jp-V6UNI1jXZfE1nyroGPNn4GEttggsYa2yUK0iilYSkorRaqqQYIyaZOJ2xUm84XeuV1kFIDj8dNZVCXNtFPS9K3vc0MLSRwXQhFqkZKYpOg9eDM5ncSABCrKoAIEDlmImicns5kFlZBwAEa0-TjNgMzxUCTNKNhDYn5jqpA6guJB3rWjNiOARX74-YZOMRTcXUzzDNUEznLrpu267vuR4cNzdM6xgeuC0j922E2X6SuYkpgrhdj+hYzUONY-QK8Y4o7Wr059Zr84AAqbgwEBgHzzNmRZhbWYokeoNHsekDbpWuvhYWAp4in9Pj4r2OtWr9p4yIE-0YXjqDx3qyHkOZBHFBRzHuv8-raVG5l2XHsnrep+3Vud5nd23jnHSOJ7he1aG7uyf40h48Dr3CgdAGHbq9fBzQunEi3bfp1xpA8Uht03rNCvYQO3T+IMIbrRYJhLUC3syvtQcmVaB8p2nHfMxPmfB0iMs4T2qiYW+PkH7Y10ERUUkUHBam9GqZEIMjoMV3j-ecWlyZUHjuzIsHBVA7xMmPS+KNHCSiCsCMEAQfRjhIgObwL4vwahJqwr+p1Q6ZFwQ3UyBt0rGyyqbEhmCyGTWcuPWaVCjDPTBEMcwalGGfRFMvf2cIBwqk1L4LhEMWKcD4bvIB5JELkMElUYIyJvDBEijYF8wweyqQ6OYAIkJhT6DClvIx39944LBvwkxZobpTTATIiBuECb2J0I4z6SCEEFzsO9NErZAxRCxBgCg0d4DFB8dwpuyMhbIyqAAWj8P6Epdg8ZohqbUmpX49EawKVkNQghbhiAvhYxA+EArwnIm0b6SC1JmG8QErBfjMjUmuHSSmgkin3QOs2bo5hHDbXEjoHswZl5fkUphAZ-gkGNMbgY0kpjzQ0g2NgqgJ9OnC0FERZerZES7X2Z4dawZOiPjaMYTUoUjl71maxNM0FKy3OKboSEP0RQ+HCFY-GsDqioI4DVAI3skn-FGaQ-JJy2LLg4kEykYLXTew1J0B6L5HCr1qgYJh2yLAqnaL4XCwN-lXM4LDAqeDCm2zckMKpMSVK-RbCFZUJEnzIuGe-GqIRSZ13Ediga0NRqEHGkS28qkdotQOWGQMxgSKIhMH0A6oIgieAcKyiZnAaYW3Tmq2a0sqnkWRJqAYalgx6E2QazxIq1IDCBhawFnBD5D1taE6RIs-rNlWU+HwQRIrlNUe0Zs1cJTKk1GYbqcqYpNJOcG-+I9AFsm4mcu1KMwRKRMFjcILZgw-NLkYIYpgQqBkhHoUMAaeGGLGSZUtVRfr2G8PjKiwIwiYQRe1JsT4-rPVwuib6Hbml5PKAS04vbECjkeb9SlkklINRhCKD8Wpfb+13WqTNGDs3HIGsgVkxAmCwByVIihlixzwlahiFUQo926FUthX0iJ8K-Xmguk5ABRbua6EBAn6Mi1sH7Y3foQIYJsQR1n42VEKRw6SIhAA */\n id: \"SignTransactionDeviceAction\",\n initial: \"InitialState\",\n context: ({ input }) => ({\n input,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n _internalState: {\n error: null,\n signature: null,\n appConfig: null,\n solanaTransactionContext: null,\n inspectorResult: null,\n },\n }),\n states: {\n InitialState: {\n always: [\n { target: \"GetAppConfig\", guard: \"skipOpenApp\" },\n { target: \"OpenAppDeviceAction\" },\n ],\n },\n OpenAppDeviceAction: {\n exit: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n invoke: {\n id: \"openAppStateMachine\",\n src: \"openAppStateMachine\",\n input: () => ({ appName: \"Solana\" }),\n onSnapshot: {\n actions: assign({\n intermediateValue: ({ event }) =>\n event.snapshot.context.intermediateValue,\n }),\n },\n onDone: {\n target: \"CheckOpenAppDeviceActionResult\",\n actions: assign({\n _internalState: ({ event, context }) =>\n event.output.caseOf({\n Right: () => context._internalState,\n Left: (error) => ({\n ...context._internalState,\n error,\n }),\n }),\n }),\n },\n },\n },\n CheckOpenAppDeviceActionResult: {\n always: [\n { target: \"GetAppConfig\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n GetAppConfig: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n invoke: {\n id: \"getAppConfig\",\n src: \"getAppConfig\",\n onDone: {\n target: \"GetAppConfigResultCheck\",\n actions: assign({\n _internalState: ({ event, context }) =>\n isSuccessCommandResult(event.output)\n ? {\n ...context._internalState,\n appConfig: event.output.data,\n }\n : { ...context._internalState, error: event.output.error },\n }),\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n GetAppConfigResultCheck: {\n always: [\n { target: \"InspectTransaction\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n InspectTransaction: {\n invoke: {\n id: \"inspectTransaction\",\n src: \"inspectTransaction\",\n input: ({ context }) => ({\n ...context.input,\n serializedTransaction: context.input.transaction,\n }),\n onDone: {\n target: \"AfterInspect\",\n actions: assign({\n _internalState: ({ context, event }) => ({\n ...context._internalState,\n inspectorResult: event.output,\n }),\n }),\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n AfterInspect: {\n always: [\n { target: \"BuildContext\", guard: \"isAnSPLTransaction\" },\n { target: \"SignTransaction\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n BuildContext: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n invoke: {\n id: \"buildContext\",\n src: \"buildContext\",\n input: ({ context }) => {\n const inspectorData =\n context._internalState.inspectorResult?.data;\n return {\n contextModule: context.input.contextModule,\n options: {\n tokenAddress: inspectorData?.tokenAddress,\n createATA: inspectorData?.createATA,\n },\n };\n },\n onDone: {\n target: \"ProvideContext\",\n actions: [\n assign({\n _internalState: ({ event, context }) => ({\n ...context._internalState,\n solanaTransactionContext: {\n descriptor: event.output.descriptor,\n certificate: event.output.calCertificate,\n tokenAccount: event.output.addressResult.tokenAccount,\n owner: event.output.addressResult.owner,\n contract: event.output.addressResult.contract,\n },\n }),\n }),\n ],\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n ProvideContext: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n invoke: {\n id: \"provideContext\",\n src: \"provideContext\",\n input: ({ context }) => {\n if (!context._internalState.solanaTransactionContext) {\n throw new UnknownDAError(\n \"Solana transaction context is not available\",\n );\n }\n return context._internalState.solanaTransactionContext;\n },\n onDone: {\n target: \"ProvideContextResultCheck\",\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n ProvideContextResultCheck: {\n always: [\n { target: \"SignTransaction\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n SignTransaction: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n },\n }),\n exit: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n }),\n invoke: {\n id: \"signTransaction\",\n src: \"signTransaction\",\n input: ({ context }) => {\n return {\n derivationPath: context.input.derivationPath,\n serializedTransaction: context.input.transaction,\n };\n },\n onDone: {\n target: \"SignTransactionResultCheck\",\n actions: [\n assign({\n _internalState: ({ event, context }) => {\n if (!isSuccessCommandResult(event.output))\n return {\n ...context._internalState,\n error: event.output.error,\n };\n\n const data = event.output.data.extract();\n if (\n event.output.data.isJust() &&\n data instanceof Uint8Array\n )\n return {\n ...context._internalState,\n signature: data,\n };\n\n return {\n ...context._internalState,\n error: new UnknownDAError(\"No Signature available\"),\n };\n },\n }),\n ],\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n SignTransactionResultCheck: {\n always: [\n { guard: \"noInternalError\", target: \"Success\" },\n { target: \"Error\" },\n ],\n },\n Success: { type: \"final\" },\n Error: { type: \"final\" },\n },\n output: ({ context }) =>\n context._internalState.signature\n ? Right(context._internalState.signature)\n : Left(\n context._internalState.error ||\n new UnknownDAError(`No error or signature available`),\n ),\n });\n }\n\n extractDependencies(internalApi: InternalApi): MachineDependencies {\n const getAppConfig = async () =>\n internalApi.sendCommand(new GetAppConfigurationCommand());\n\n const buildContext = async (arg0: {\n input: BuildTransactionContextTaskArgs;\n }) => new BuildTransactionContextTask(internalApi, arg0.input).run();\n\n const provideContext = async (arg0: { input: SolanaContextForDevice }) =>\n new ProvideSolanaTransactionContextTask(internalApi, arg0.input).run();\n\n const inspectTransaction = async (arg0: {\n serializedTransaction: Uint8Array;\n }) =>\n Promise.resolve(\n new TransactionInspector(\n arg0.serializedTransaction,\n ).inspectTransactionType(),\n );\n\n const signTransaction = async (arg0: {\n input: {\n derivationPath: string;\n serializedTransaction: Uint8Array;\n };\n }) =>\n new SignDataTask(internalApi, {\n commandFactory: (args) =>\n new SignTransactionCommand({\n serializedTransaction: args.chunkedData,\n more: args.more,\n extend: args.extend,\n }),\n derivationPath: arg0.input.derivationPath,\n sendingData: arg0.input.serializedTransaction,\n }).run();\n\n return {\n getAppConfig,\n buildContext,\n provideContext,\n signTransaction,\n inspectTransaction,\n };\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {\n type CommandErrorResult,\n type CommandResult,\n type DeviceActionStateMachine,\n DeviceModelId,\n type InternalApi,\n isSuccessCommandResult,\n OpenAppDeviceAction,\n type StateMachineTypes,\n UnknownDAError,\n UserInteractionRequired,\n XStateDeviceAction,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, type Maybe, Right } from \"purify-ts\";\nimport { assign, fromPromise, setup } from \"xstate\";\n\nimport {\n type SignTransactionDAError,\n type SignTransactionDAInput,\n type SignTransactionDAIntermediateValue,\n type SignTransactionDAInternalState,\n type SignTransactionDAOutput,\n} from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { type AppConfiguration } from \"@api/model/AppConfiguration\";\nimport { type Signature } from \"@api/model/Signature\";\nimport { GetAppConfigurationCommand } from \"@internal/app-binder/command/GetAppConfigurationCommand\";\nimport { SignTransactionCommand } from \"@internal/app-binder/command/SignTransactionCommand\";\nimport { type SolanaAppErrorCodes } from \"@internal/app-binder/command/utils/SolanaApplicationErrors\";\nimport { ApplicationChecker } from \"@internal/app-binder/services/ApplicationChecker\";\nimport {\n SolanaTransactionTypes,\n TransactionInspector,\n} from \"@internal/app-binder/services/TransactionInspector\";\nimport { type TxInspectorResult } from \"@internal/app-binder/services/utils/transactionDecoders\";\nimport {\n BuildTransactionContextTask,\n type BuildTransactionContextTaskArgs,\n type SolanaBuildContextResult,\n} from \"@internal/app-binder/task/BuildTransactionContextTask\";\nimport {\n ProvideSolanaTransactionContextTask,\n type SolanaContextForDevice,\n} from \"@internal/app-binder/task/ProvideTransactionContextTask\";\nimport { SignDataTask } from \"@internal/app-binder/task/SendSignDataTask\";\n\nexport type MachineDependencies = {\n readonly getAppConfig: () => Promise<\n CommandResult<AppConfiguration, SolanaAppErrorCodes>\n >;\n readonly buildContext: (arg0: {\n input: BuildTransactionContextTaskArgs;\n }) => Promise<SolanaBuildContextResult>;\n readonly provideContext: (arg0: {\n input: SolanaContextForDevice;\n }) => Promise<Maybe<CommandErrorResult<SolanaAppErrorCodes>>>;\n readonly inspectTransaction: (arg0: {\n serializedTransaction: Uint8Array;\n }) => Promise<TxInspectorResult>;\n readonly signTransaction: (arg0: {\n input: {\n derivationPath: string;\n serializedTransaction: Uint8Array;\n };\n }) => Promise<\n CommandResult<Maybe<Signature | SolanaAppErrorCodes>, SolanaAppErrorCodes>\n >;\n};\n\nexport class SignTransactionDeviceAction extends XStateDeviceAction<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n> {\n makeStateMachine(\n internalApi: InternalApi,\n ): DeviceActionStateMachine<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n > {\n type types = StateMachineTypes<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n >;\n\n const {\n signTransaction,\n getAppConfig,\n buildContext,\n provideContext,\n inspectTransaction,\n } = this.extractDependencies(internalApi);\n\n return setup({\n types: {\n input: {} as types[\"input\"],\n context: {} as types[\"context\"],\n output: {} as types[\"output\"],\n },\n actors: {\n openAppStateMachine: new OpenAppDeviceAction({\n input: { appName: \"Solana\" },\n }).makeStateMachine(internalApi),\n getAppConfig: fromPromise(getAppConfig),\n inspectTransaction: fromPromise(\n ({ input }: { input: SignTransactionDAInput }) =>\n inspectTransaction({ serializedTransaction: input.transaction }),\n ),\n buildContext: fromPromise(buildContext),\n provideContext: fromPromise(provideContext),\n signTransaction: fromPromise(signTransaction),\n },\n guards: {\n noInternalError: ({ context }) => context._internalState.error === null,\n skipOpenApp: ({ context }) => context.input.skipOpenApp,\n isSPLSupported: ({ context }) =>\n new ApplicationChecker(\n internalApi.getDeviceSessionState(),\n context._internalState.appConfig!,\n )\n .withMinVersionExclusive(\"1.4.0\")\n .excludeDeviceModel(DeviceModelId.NANO_S)\n .check(),\n isAnSPLTransaction: ({ context }) =>\n context._internalState.inspectorResult?.transactionType ===\n SolanaTransactionTypes.SPL,\n },\n actions: {\n assignErrorFromEvent: assign({\n _internalState: (_) => ({\n ..._.context._internalState,\n error: new UnknownDAError(\n _.event[\"error\"] instanceof Error\n ? _.event[\"error\"].message\n : String(_.event[\"error\"]),\n ),\n }),\n }),\n },\n }).createMachine({\n /** @xstate-layout N4IgpgJg5mDOIC5QGUCWUB2AVATgQw1jwGMAXVAewwBEwA3VYsAQTMowDoBJDVcvADbJSeUmADEAbQAMAXUSgADhVh92CkAA9EARgDsAZg4AOPdL37pAFj1WArACYANCACeuh4Y46dxgGzSBnZ6AQZ6dgC+ES5omLgERGxUtAxMrORU3Lz8QiJiUjrySCDKqhkYGtoI+kam5pY29s5uujrSxhzSAJw+AcZWplZ+BlEx6Nj4hCTlKYwsSZwA8opgGMyKirNpC+IQVGAcqBh0FADWBxQraxvComAAsiQAFkdgMkVKKmpUlYjhOhw7F0bAYrAN9HZrC53NV2lZAV1AnYrGEul0wpFoiBYhMEtN2Ft5uUOABhJ5gYinZardabehzdLsABKcAArgJSFI5BpSt8KsUqjoDDoHJ0ug5jAY6jowbZoa0ZYDpHYfA59A47H4BqNseN4lMFoTGZkyRSqVdaUaFizYOzOZJCjyvuVftVhaLuhKpWYZY15QhjADpH4HAMQ0FzOEujqcfrEjN6dtiQBxMCkWkkqgAM3Qu32h2OZwOMHTG0zGBzUHeTrK6gFukDeg4fj04Slwbavis-pFAw4en6wSGfmRXWMMb1k3jBMTRPYHFTpcU5cr4jAOBwFBwHEUAlEWa3AFsOCWM9n0NXiryXfXqo3m627O2-J3+j20RwHIjhiHPAOrIEE5xFO+LJLOxqcIuZ4VugNp2qalJch8JTOnWoBVA4njwv0OiOFYaohNIwY9p4HR+GiGrGNYAEOEEQG4gaCapHOmRQWW55QHBHIIacBTIdeaFaIgmG2CYVi4aGBEBMRLQIKCQY6F0QIigY0iKdGWKxiBhrgQsWSwCsZBxqBGB5hgBxHCc5wFgZFKkMZCyXp8tY-LeEr4f2yKmGOwyGF0JHkRwYQGORxj+C2fgtvRDlMQyek8LZRnaeUa4bluO57qQB44MeRyJfZyXsE5KEufy6HCf0orhAMeg+cF-myfYXSfjYtgiphiLIn40WFWBzEQRwzBZmIOAJYZ9rcleqGueVcmYUYtFdC2spSphPYih0QxLX4gbCqCdiYmMwF4jp-V6UNI1jXZfE1nyroGPNn4GEttggsYa2yUK0iilYSkorRaqqQYIyaZOJ2xUm84XeuV1kFIDj8dNZVCXNtFPS9K3vc0MLSRwXQhFqkZKYpOg9eDM5ncSABCrKoAIEDlmImicns5kFlZBwAEa0-TjNgMzxUCTNKNhDYn5jqpA6guJB3rWjNiOARX74-YZOMRTcXUzzDNUEznLrpu267vuR4cNzdM6xgeuC0j922E2X6SuYkpgrhdj+hYzUONY-QK8Y4o7Wr059Zr84AAqbgwEBgHzzNmRZhbWYokeoNHsekDbpWuvhYWAp4in9Pj4r2OtWr9p4yIE-0YXjqDx3qyHkOZBHFBRzHuv8-raVG5l2XHsnrep+3Vud5nd23jnHSOJ7he1aG7uyf40h48Dr3CgdAGHbq9fBzQunEi3bfp1xpA8Uht03rNCvYQO3T+IMIbrRYJhLUC3syvtQcmVaB8p2nHfMxPmfB0iMs4T2qiYW+PkH7Y10ERUUkUHBam9GqZEIMjoMV3j-ecWlyZUHjuzIsHBVA7xMmPS+KNHCSiCsCMEAQfRjhIgObwL4vwahJqwr+p1Q6ZFwQ3UyBt0rGyyqbEhmCyGTWcuPWaVCjDPTBEMcwalGGfRFMvf2cIBwqk1L4LhEMWKcD4bvIB5JELkMElUYIyJvDBEijYF8wweyqQ6OYAIkJhT6DClvIx39944LBvwkxZobpTTATIiBuECb2J0I4z6SCEEFzsO9NErZAxRCxBgCg0d4DFB8dwpuyMhbIyqAAWj8P6Epdg8ZohqbUmpX49EawKVkNQghbhiAvhYxA+EArwnIm0b6SC1JmG8QErBfjMjUmuHSSmgkin3QOs2bo5hHDbXEjoHswZl5fkUphAZ-gkGNMbgY0kpjzQ0g2NgqgJ9OnC0FERZerZES7X2Z4dawZOiPjaMYTUoUjl71maxNM0FKy3OKboSEP0RQ+HCFY-GsDqioI4DVAI3skn-FGaQ-JJy2LLg4kEykYLXTew1J0B6L5HCr1qgYJh2yLAqnaL4XCwN-lXM4LDAqeDCm2zckMKpMSVK-RbCFZUJEnzIuGe-GqIRSZ13Ediga0NRqEHGkS28qkdotQOWGQMxgSKIhMH0A6oIgieAcKyiZnAaYW3Tmq2a0sqnkWRJqAYalgx6E2QazxIq1IDCBhawFnBD5D1taE6RIs-rNlWU+HwQRIrlNUe0Zs1cJTKk1GYbqcqYpNJOcG-+I9AFsm4mcu1KMwRKRMFjcILZgw-NLkYIYpgQqBkhHoUMAaeGGLGSZUtVRfr2G8PjKiwIwiYQRe1JsT4-rPVwuib6Hbml5PKAS04vbECjkeb9SlkklINRhCKD8Wpfb+13WqTNGDs3HIGsgVkxAmCwByVIihlixzwlahiFUQo926FUthX0iJ8K-Xmguk5ABRbua6EBAn6Mi1sH7Y3foQIYJsQR1n42VEKRw6SIhAA */\n id: \"SignTransactionDeviceAction\",\n initial: \"InitialState\",\n context: ({ input }) => ({\n input,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n _internalState: {\n error: null,\n signature: null,\n appConfig: null,\n solanaTransactionContext: null,\n inspectorResult: null,\n },\n }),\n states: {\n InitialState: {\n always: [\n { target: \"GetAppConfig\", guard: \"skipOpenApp\" },\n { target: \"OpenAppDeviceAction\" },\n ],\n },\n OpenAppDeviceAction: {\n exit: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n invoke: {\n id: \"openAppStateMachine\",\n src: \"openAppStateMachine\",\n input: () => ({ appName: \"Solana\" }),\n onSnapshot: {\n actions: assign({\n intermediateValue: ({ event }) =>\n event.snapshot.context.intermediateValue,\n }),\n },\n onDone: {\n target: \"CheckOpenAppDeviceActionResult\",\n actions: assign({\n _internalState: ({ event, context }) =>\n event.output.caseOf({\n Right: () => context._internalState,\n Left: (error) => ({\n ...context._internalState,\n error,\n }),\n }),\n }),\n },\n },\n },\n CheckOpenAppDeviceActionResult: {\n always: [\n { target: \"GetAppConfig\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n GetAppConfig: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n invoke: {\n id: \"getAppConfig\",\n src: \"getAppConfig\",\n onDone: {\n target: \"GetAppConfigResultCheck\",\n actions: assign({\n _internalState: ({ event, context }) =>\n isSuccessCommandResult(event.output)\n ? {\n ...context._internalState,\n appConfig: event.output.data,\n }\n : { ...context._internalState, error: event.output.error },\n }),\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n GetAppConfigResultCheck: {\n always: [\n { target: \"InspectTransaction\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n InspectTransaction: {\n invoke: {\n id: \"inspectTransaction\",\n src: \"inspectTransaction\",\n input: ({ context }) => ({\n ...context.input,\n serializedTransaction: context.input.transaction,\n }),\n onDone: {\n target: \"AfterInspect\",\n actions: assign({\n _internalState: ({ context, event }) => ({\n ...context._internalState,\n inspectorResult: event.output,\n }),\n }),\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n AfterInspect: {\n always: [\n { target: \"BuildContext\", guard: \"isAnSPLTransaction\" },\n { target: \"SignTransaction\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n BuildContext: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n invoke: {\n id: \"buildContext\",\n src: \"buildContext\",\n input: ({ context }) => {\n const inspectorData =\n context._internalState.inspectorResult?.data;\n return {\n contextModule: context.input.contextModule,\n options: {\n tokenAddress: inspectorData?.tokenAddress,\n createATA: inspectorData?.createATA,\n },\n };\n },\n onDone: {\n target: \"ProvideContext\",\n actions: [\n assign({\n _internalState: ({ event, context }) => ({\n ...context._internalState,\n solanaTransactionContext: {\n descriptor: event.output.descriptor,\n certificate: event.output.calCertificate,\n tokenAccount: event.output.addressResult.tokenAccount,\n owner: event.output.addressResult.owner,\n contract: event.output.addressResult.contract,\n },\n }),\n }),\n ],\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n ProvideContext: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n invoke: {\n id: \"provideContext\",\n src: \"provideContext\",\n input: ({ context }) => {\n if (!context._internalState.solanaTransactionContext) {\n throw new UnknownDAError(\n \"Solana transaction context is not available\",\n );\n }\n return context._internalState.solanaTransactionContext;\n },\n onDone: {\n target: \"ProvideContextResultCheck\",\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n ProvideContextResultCheck: {\n always: [\n { target: \"SignTransaction\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n SignTransaction: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n },\n }),\n exit: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n }),\n invoke: {\n id: \"signTransaction\",\n src: \"signTransaction\",\n input: ({ context }) => {\n return {\n derivationPath: context.input.derivationPath,\n serializedTransaction: context.input.transaction,\n };\n },\n onDone: {\n target: \"SignTransactionResultCheck\",\n actions: [\n assign({\n _internalState: ({ event, context }) => {\n if (!isSuccessCommandResult(event.output))\n return {\n ...context._internalState,\n error: event.output.error,\n };\n\n const data = event.output.data.extract();\n if (\n event.output.data.isJust() &&\n data instanceof Uint8Array\n )\n return {\n ...context._internalState,\n signature: data,\n };\n\n return {\n ...context._internalState,\n error: new UnknownDAError(\"No Signature available\"),\n };\n },\n }),\n ],\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n SignTransactionResultCheck: {\n always: [\n { guard: \"noInternalError\", target: \"Success\" },\n { target: \"Error\" },\n ],\n },\n Success: { type: \"final\" },\n Error: { type: \"final\" },\n },\n output: ({ context }) =>\n context._internalState.signature\n ? Right(context._internalState.signature)\n : Left(\n context._internalState.error ||\n new UnknownDAError(`No error or signature available`),\n ),\n });\n }\n\n extractDependencies(internalApi: InternalApi): MachineDependencies {\n const getAppConfig = async () =>\n internalApi.sendCommand(new GetAppConfigurationCommand());\n\n const buildContext = async (arg0: {\n input: BuildTransactionContextTaskArgs;\n }) => new BuildTransactionContextTask(internalApi, arg0.input).run();\n\n const provideContext = async (arg0: { input: SolanaContextForDevice }) =>\n new ProvideSolanaTransactionContextTask(internalApi, arg0.input).run();\n\n const inspectTransaction = async (arg0: {\n serializedTransaction: Uint8Array;\n }) =>\n Promise.resolve(\n new TransactionInspector(\n arg0.serializedTransaction,\n ).inspectTransactionType(),\n );\n\n const signTransaction = async (arg0: {\n input: {\n derivationPath: string;\n serializedTransaction: Uint8Array;\n };\n }) =>\n new SignDataTask(internalApi, {\n commandFactory: (args) =>\n new SignTransactionCommand({\n serializedTransaction: args.chunkedData,\n more: args.more,\n extend: args.extend,\n }),\n derivationPath: arg0.input.derivationPath,\n sendingData: arg0.input.serializedTransaction,\n }).run();\n\n return {\n getAppConfig,\n buildContext,\n provideContext,\n signTransaction,\n inspectTransaction,\n };\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["SignTransactionDeviceAction_exports", "__export", "SignTransactionDeviceAction", "__toCommonJS", "import_device_management_kit", "import_purify_ts", "import_xstate", "import_GetAppConfigurationCommand", "import_SignTransactionCommand", "import_ApplicationChecker", "import_TransactionInspector", "import_BuildTransactionContextTask", "import_ProvideTransactionContextTask", "import_SendSignDataTask", "internalApi", "signTransaction", "getAppConfig", "buildContext", "provideContext", "inspectTransaction", "input", "context", "_", "event", "error", "inspectorData", "data", "arg0", "args"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var e=require("@ledgerhq/device-management-kit"),r=require("purify-ts"),t=require("vitest"),m=require("../../app-binder/device-action/__test-utils__/testDeviceActionStates"),c=require("../../app-binder/services/TransactionInspector"),f=require("./__test-utils__/makeInternalApi"),A=require("./SignTransactionDeviceAction");const v="44'/501'/0'/0'",y=new Uint8Array([222,173,190,239]),D={getSolanaContext:t.vi.fn(),getFieldContext:t.vi.fn(),getContexts:t.vi.fn(),getTypedDataFilters:t.vi.fn(),getWeb3Checks:t.vi.fn(),getProxyDelegateCall:t.vi.fn()};let i,u,d,g,S,l;function T(){return{getAppConfig:u,buildContext:d,provideContext:g,signTransaction:S,inspectTransaction:l}}(0,t.describe)("SignTransactionDeviceAction (Solana)",()=>{(0,t.beforeEach)(()=>{i=(0,f.makeDeviceActionInternalApiMock)(),u=t.vi.fn(),d=t.vi.fn(),g=t.vi.fn(),S=t.vi.fn(),l=t.vi.fn().mockResolvedValue({transactionType:c.SolanaTransactionTypes.SPL,data:{tokenAddress:null,createATA:!1}})}),(0,t.it)("happy path (skip open): getAppConfig -> inspect -> build -> provide -> sign",()=>new Promise((o,s)=>{i.getDeviceSessionState.mockReturnValue({sessionStateType:e.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:e.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:e.DeviceModelId.NANO_X,isSecureConnectionAllowed:!0}),u.mockResolvedValue((0,e.CommandResultFactory)({data:{}})),l.mockResolvedValue({transactionType:c.SolanaTransactionTypes.SPL});const n={descriptor:new Uint8Array([1]),calCertificate:{keyUsageNumber:0,payload:new Uint8Array([1])},challenge:void 0,addressResult:{tokenAccount:"",owner:"",contract:""}};d.mockResolvedValue(n),g.mockResolvedValue(r.Nothing);const a=new Uint8Array([170,187]);S.mockResolvedValue((0,e.CommandResultFactory)({data:(0,r.Just)(a)}));const p=new A.SignTransactionDeviceAction({input:{derivationPath:v,transaction:y,skipOpenApp:!0,options:{},contextModule:D}});t.vi.spyOn(p,"extractDependencies").mockReturnValue(T());const k=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.SignTransaction},status:e.DeviceActionStatus.Pending},{output:a,status:e.DeviceActionStatus.Completed}];(0,m.testDeviceActionStates)(p,k,i,{onDone:o,onError:s})})),(0,t.it)("failure in provideContext still signs",()=>new Promise((o,s)=>{i.getDeviceSessionState.mockReturnValue({sessionStateType:e.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:e.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:e.DeviceModelId.NANO_X,isSecureConnectionAllowed:!0}),u.mockResolvedValue((0,e.CommandResultFactory)({data:{}})),l.mockResolvedValue({transactionType:c.SolanaTransactionTypes.SPL}),d.mockResolvedValue({descriptor:new Uint8Array([2]),calCertificate:{keyUsageNumber:0,payload:new Uint8Array},challenge:void 0,addressResult:{tokenAccount:"",owner:"",contract:""}}),g.mockResolvedValue((0,r.Just)((0,e.CommandResultFactory)({error:new e.InvalidStatusWordError("ctxErr")})));const n=new Uint8Array([254]);S.mockResolvedValue((0,e.CommandResultFactory)({data:(0,r.Just)(n)}));const a=new A.SignTransactionDeviceAction({input:{derivationPath:v,transaction:y,skipOpenApp:!0,options:{},contextModule:D}});t.vi.spyOn(a,"extractDependencies").mockReturnValue(T());const p=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.SignTransaction},status:e.DeviceActionStatus.Pending},{output:n,status:e.DeviceActionStatus.Completed}];(0,m.testDeviceActionStates)(a,p,i,{onDone:o,onError:s})})),(0,t.it)("buildContext throws \u2192 error",()=>new Promise((o,s)=>{i.getDeviceSessionState.mockReturnValue({sessionStateType:e.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:e.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:e.DeviceModelId.NANO_X,isSecureConnectionAllowed:!0}),u.mockResolvedValue((0,e.CommandResultFactory)({data:{}})),l.mockResolvedValue({transactionType:c.SolanaTransactionTypes.SPL}),d.mockRejectedValue(new e.InvalidStatusWordError("bldErr"));const n=new A.SignTransactionDeviceAction({input:{derivationPath:v,transaction:y,skipOpenApp:!0,options:{},contextModule:D}});t.vi.spyOn(n,"extractDependencies").mockReturnValue(T());const a=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{error:expect.anything(),status:e.DeviceActionStatus.Error}];(0,m.testDeviceActionStates)(n,a,i,{onDone:o,onError:s})}))});
1
+ "use strict";var e=require("@ledgerhq/device-management-kit"),r=require("purify-ts"),t=require("vitest"),m=require("../../app-binder/device-action/__test-utils__/testDeviceActionStates"),c=require("../../app-binder/services/TransactionInspector"),f=require("./__test-utils__/makeInternalApi"),A=require("./SignTransactionDeviceAction");const v="44'/501'/0'/0'",y=new Uint8Array([222,173,190,239]),T={getSolanaContext:t.vi.fn(),getContext:t.vi.fn(),getContexts:t.vi.fn(),getTypedDataFilters:t.vi.fn(),getWeb3Checks:t.vi.fn()};let i,u,d,S,g,l;function D(){return{getAppConfig:u,buildContext:d,provideContext:S,signTransaction:g,inspectTransaction:l}}(0,t.describe)("SignTransactionDeviceAction (Solana)",()=>{(0,t.beforeEach)(()=>{i=(0,f.makeDeviceActionInternalApiMock)(),u=t.vi.fn(),d=t.vi.fn(),S=t.vi.fn(),g=t.vi.fn(),l=t.vi.fn().mockResolvedValue({transactionType:c.SolanaTransactionTypes.SPL,data:{tokenAddress:null,createATA:!1}})}),(0,t.it)("happy path (skip open): getAppConfig -> inspect -> build -> provide -> sign",()=>new Promise((o,s)=>{i.getDeviceSessionState.mockReturnValue({sessionStateType:e.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:e.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:e.DeviceModelId.NANO_X,isSecureConnectionAllowed:!0}),u.mockResolvedValue((0,e.CommandResultFactory)({data:{}})),l.mockResolvedValue({transactionType:c.SolanaTransactionTypes.SPL});const n={descriptor:new Uint8Array([1]),calCertificate:{keyUsageNumber:0,payload:new Uint8Array([1])},challenge:void 0,addressResult:{tokenAccount:"",owner:"",contract:""}};d.mockResolvedValue(n),S.mockResolvedValue(r.Nothing);const a=new Uint8Array([170,187]);g.mockResolvedValue((0,e.CommandResultFactory)({data:(0,r.Just)(a)}));const p=new A.SignTransactionDeviceAction({input:{derivationPath:v,transaction:y,skipOpenApp:!0,options:{},contextModule:T}});t.vi.spyOn(p,"extractDependencies").mockReturnValue(D());const k=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.SignTransaction},status:e.DeviceActionStatus.Pending},{output:a,status:e.DeviceActionStatus.Completed}];(0,m.testDeviceActionStates)(p,k,i,{onDone:o,onError:s})})),(0,t.it)("failure in provideContext still signs",()=>new Promise((o,s)=>{i.getDeviceSessionState.mockReturnValue({sessionStateType:e.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:e.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:e.DeviceModelId.NANO_X,isSecureConnectionAllowed:!0}),u.mockResolvedValue((0,e.CommandResultFactory)({data:{}})),l.mockResolvedValue({transactionType:c.SolanaTransactionTypes.SPL}),d.mockResolvedValue({descriptor:new Uint8Array([2]),calCertificate:{keyUsageNumber:0,payload:new Uint8Array},challenge:void 0,addressResult:{tokenAccount:"",owner:"",contract:""}}),S.mockResolvedValue((0,r.Just)((0,e.CommandResultFactory)({error:new e.InvalidStatusWordError("ctxErr")})));const n=new Uint8Array([254]);g.mockResolvedValue((0,e.CommandResultFactory)({data:(0,r.Just)(n)}));const a=new A.SignTransactionDeviceAction({input:{derivationPath:v,transaction:y,skipOpenApp:!0,options:{},contextModule:T}});t.vi.spyOn(a,"extractDependencies").mockReturnValue(D());const p=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.SignTransaction},status:e.DeviceActionStatus.Pending},{output:n,status:e.DeviceActionStatus.Completed}];(0,m.testDeviceActionStates)(a,p,i,{onDone:o,onError:s})})),(0,t.it)("buildContext throws \u2192 error",()=>new Promise((o,s)=>{i.getDeviceSessionState.mockReturnValue({sessionStateType:e.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:e.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:e.DeviceModelId.NANO_X,isSecureConnectionAllowed:!0}),u.mockResolvedValue((0,e.CommandResultFactory)({data:{}})),l.mockResolvedValue({transactionType:c.SolanaTransactionTypes.SPL}),d.mockRejectedValue(new e.InvalidStatusWordError("bldErr"));const n=new A.SignTransactionDeviceAction({input:{derivationPath:v,transaction:y,skipOpenApp:!0,options:{},contextModule:T}});t.vi.spyOn(n,"extractDependencies").mockReturnValue(D());const a=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None},status:e.DeviceActionStatus.Pending},{error:expect.anything(),status:e.DeviceActionStatus.Error}];(0,m.testDeviceActionStates)(n,a,i,{onDone:o,onError:s})}))});
2
2
  //# sourceMappingURL=SignTransactionDeviceAction.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/device-action/SignTransactionDeviceAction.test.ts"],
4
- "sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n CommandResultFactory,\n type DeviceActionState,\n DeviceActionStatus,\n DeviceModelId,\n DeviceSessionStateType,\n DeviceStatus,\n InvalidStatusWordError,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { Just, Nothing } from \"purify-ts\";\nimport { beforeEach, describe, it, vi } from \"vitest\";\n\nimport {\n type SignTransactionDAError,\n type SignTransactionDAInput,\n type SignTransactionDAIntermediateValue,\n} from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { testDeviceActionStates } from \"@internal/app-binder/device-action/__test-utils__/testDeviceActionStates\";\nimport { SolanaTransactionTypes } from \"@internal/app-binder/services/TransactionInspector\";\nimport { type SolanaBuildContextResult } from \"@internal/app-binder/task/BuildTransactionContextTask\";\n\nimport { makeDeviceActionInternalApiMock } from \"./__test-utils__/makeInternalApi\";\nimport { SignTransactionDeviceAction } from \"./SignTransactionDeviceAction\";\n\nconst defaultDerivation = \"44'/501'/0'/0'\";\nconst exampleTx = new Uint8Array([0xde, 0xad, 0xbe, 0xef]);\n\nconst contextModuleStub: ContextModule = {\n getSolanaContext: vi.fn(),\n getFieldContext: vi.fn(),\n getContexts: vi.fn(),\n getTypedDataFilters: vi.fn(),\n getWeb3Checks: vi.fn(),\n getProxyDelegateCall: vi.fn(),\n};\n\nlet apiMock: ReturnType<typeof makeDeviceActionInternalApiMock>;\nlet getAppConfigMock: ReturnType<typeof vi.fn>;\nlet buildContextMock: ReturnType<typeof vi.fn>;\nlet provideContextMock: ReturnType<typeof vi.fn>;\nlet signMock: ReturnType<typeof vi.fn>;\nlet inspectTransactionMock: ReturnType<typeof vi.fn>;\n\nfunction extractDeps() {\n return {\n getAppConfig: getAppConfigMock,\n buildContext: buildContextMock,\n provideContext: provideContextMock,\n signTransaction: signMock,\n inspectTransaction: inspectTransactionMock,\n };\n}\n\ndescribe(\"SignTransactionDeviceAction (Solana)\", () => {\n beforeEach(() => {\n apiMock = makeDeviceActionInternalApiMock();\n getAppConfigMock = vi.fn();\n buildContextMock = vi.fn();\n provideContextMock = vi.fn();\n signMock = vi.fn();\n inspectTransactionMock = vi.fn().mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n data: { tokenAddress: null, createATA: false },\n });\n });\n\n it(\"happy path (skip open): getAppConfig -> inspect -> build -> provide -> sign\", () =>\n new Promise<void>((resolve, reject) => {\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.1\" },\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: true,\n });\n\n getAppConfigMock.mockResolvedValue(CommandResultFactory({ data: {} }));\n inspectTransactionMock.mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n });\n\n const ctx: SolanaBuildContextResult = {\n descriptor: new Uint8Array([1]),\n calCertificate: { keyUsageNumber: 0, payload: new Uint8Array([0x01]) },\n challenge: undefined,\n addressResult: { tokenAccount: \"\", owner: \"\", contract: \"\" },\n };\n buildContextMock.mockResolvedValue(ctx);\n provideContextMock.mockResolvedValue(Nothing);\n\n const signature = new Uint8Array([0xaa, 0xbb]);\n signMock.mockResolvedValue(\n CommandResultFactory({ data: Just(signature) }),\n );\n\n const action = new SignTransactionDeviceAction({\n input: {\n derivationPath: defaultDerivation,\n transaction: exampleTx,\n skipOpenApp: true, // always skip open\n options: {},\n contextModule: contextModuleStub,\n } as SignTransactionDAInput,\n });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n\n const expected = [\n // getAppConfig\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // inspectTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // buildContext\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // provideContext\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // signTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n },\n status: DeviceActionStatus.Pending,\n },\n // success\n { output: signature, status: DeviceActionStatus.Completed },\n ] as DeviceActionState<\n Uint8Array,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[];\n\n testDeviceActionStates<\n Uint8Array,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >(action, expected, apiMock, { onDone: resolve, onError: reject });\n }));\n\n it(\"failure in provideContext still signs\", () =>\n new Promise<void>((resolve, reject) => {\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.1\" },\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: true,\n });\n\n getAppConfigMock.mockResolvedValue(CommandResultFactory({ data: {} }));\n inspectTransactionMock.mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n });\n\n buildContextMock.mockResolvedValue({\n descriptor: new Uint8Array([2]),\n calCertificate: { keyUsageNumber: 0, payload: new Uint8Array() },\n challenge: undefined,\n addressResult: { tokenAccount: \"\", owner: \"\", contract: \"\" },\n });\n provideContextMock.mockResolvedValue(\n Just(\n CommandResultFactory({ error: new InvalidStatusWordError(\"ctxErr\") }),\n ),\n );\n const sig = new Uint8Array([0xfe]);\n signMock.mockResolvedValue(CommandResultFactory({ data: Just(sig) }));\n\n const action = new SignTransactionDeviceAction({\n input: {\n derivationPath: defaultDerivation,\n transaction: exampleTx,\n skipOpenApp: true,\n options: {},\n contextModule: contextModuleStub,\n } as SignTransactionDAInput,\n });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n\n const expected = [\n // getAppConfig\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // inspectTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // buildContext\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // provideContext (returns error but continues)\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // signTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n },\n status: DeviceActionStatus.Pending,\n },\n // success\n { output: sig, status: DeviceActionStatus.Completed },\n ] as DeviceActionState<\n Uint8Array,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[];\n\n testDeviceActionStates<\n Uint8Array,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >(action, expected, apiMock, { onDone: resolve, onError: reject });\n }));\n\n it(\"buildContext throws \u2192 error\", () =>\n new Promise<void>((resolve, reject) => {\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.1\" },\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: true,\n });\n\n getAppConfigMock.mockResolvedValue(CommandResultFactory({ data: {} }));\n inspectTransactionMock.mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n });\n\n buildContextMock.mockRejectedValue(new InvalidStatusWordError(\"bldErr\"));\n\n const action = new SignTransactionDeviceAction({\n input: {\n derivationPath: defaultDerivation,\n transaction: exampleTx,\n skipOpenApp: true,\n options: {},\n contextModule: contextModuleStub,\n } as SignTransactionDAInput,\n });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n\n const expected = [\n // getAppConfig\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // inspectTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // buildContext (throws)\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // error raised from buildContext\n {\n error: expect.anything() as unknown as SignTransactionDAError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n Uint8Array,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[];\n\n testDeviceActionStates<\n Uint8Array,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >(action, expected, apiMock, { onDone: resolve, onError: reject });\n }));\n});\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n CommandResultFactory,\n type DeviceActionState,\n DeviceActionStatus,\n DeviceModelId,\n DeviceSessionStateType,\n DeviceStatus,\n InvalidStatusWordError,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { Just, Nothing } from \"purify-ts\";\nimport { beforeEach, describe, it, vi } from \"vitest\";\n\nimport {\n type SignTransactionDAError,\n type SignTransactionDAInput,\n type SignTransactionDAIntermediateValue,\n} from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { testDeviceActionStates } from \"@internal/app-binder/device-action/__test-utils__/testDeviceActionStates\";\nimport { SolanaTransactionTypes } from \"@internal/app-binder/services/TransactionInspector\";\nimport { type SolanaBuildContextResult } from \"@internal/app-binder/task/BuildTransactionContextTask\";\n\nimport { makeDeviceActionInternalApiMock } from \"./__test-utils__/makeInternalApi\";\nimport { SignTransactionDeviceAction } from \"./SignTransactionDeviceAction\";\n\nconst defaultDerivation = \"44'/501'/0'/0'\";\nconst exampleTx = new Uint8Array([0xde, 0xad, 0xbe, 0xef]);\n\nconst contextModuleStub: ContextModule = {\n getSolanaContext: vi.fn(),\n getContext: vi.fn(),\n getContexts: vi.fn(),\n getTypedDataFilters: vi.fn(),\n getWeb3Checks: vi.fn(),\n};\n\nlet apiMock: ReturnType<typeof makeDeviceActionInternalApiMock>;\nlet getAppConfigMock: ReturnType<typeof vi.fn>;\nlet buildContextMock: ReturnType<typeof vi.fn>;\nlet provideContextMock: ReturnType<typeof vi.fn>;\nlet signMock: ReturnType<typeof vi.fn>;\nlet inspectTransactionMock: ReturnType<typeof vi.fn>;\n\nfunction extractDeps() {\n return {\n getAppConfig: getAppConfigMock,\n buildContext: buildContextMock,\n provideContext: provideContextMock,\n signTransaction: signMock,\n inspectTransaction: inspectTransactionMock,\n };\n}\n\ndescribe(\"SignTransactionDeviceAction (Solana)\", () => {\n beforeEach(() => {\n apiMock = makeDeviceActionInternalApiMock();\n getAppConfigMock = vi.fn();\n buildContextMock = vi.fn();\n provideContextMock = vi.fn();\n signMock = vi.fn();\n inspectTransactionMock = vi.fn().mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n data: { tokenAddress: null, createATA: false },\n });\n });\n\n it(\"happy path (skip open): getAppConfig -> inspect -> build -> provide -> sign\", () =>\n new Promise<void>((resolve, reject) => {\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.1\" },\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: true,\n });\n\n getAppConfigMock.mockResolvedValue(CommandResultFactory({ data: {} }));\n inspectTransactionMock.mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n });\n\n const ctx: SolanaBuildContextResult = {\n descriptor: new Uint8Array([1]),\n calCertificate: { keyUsageNumber: 0, payload: new Uint8Array([0x01]) },\n challenge: undefined,\n addressResult: { tokenAccount: \"\", owner: \"\", contract: \"\" },\n };\n buildContextMock.mockResolvedValue(ctx);\n provideContextMock.mockResolvedValue(Nothing);\n\n const signature = new Uint8Array([0xaa, 0xbb]);\n signMock.mockResolvedValue(\n CommandResultFactory({ data: Just(signature) }),\n );\n\n const action = new SignTransactionDeviceAction({\n input: {\n derivationPath: defaultDerivation,\n transaction: exampleTx,\n skipOpenApp: true, // always skip open\n options: {},\n contextModule: contextModuleStub,\n } as SignTransactionDAInput,\n });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n\n const expected = [\n // getAppConfig\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // inspectTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // buildContext\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // provideContext\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // signTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n },\n status: DeviceActionStatus.Pending,\n },\n // success\n { output: signature, status: DeviceActionStatus.Completed },\n ] as DeviceActionState<\n Uint8Array,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[];\n\n testDeviceActionStates<\n Uint8Array,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >(action, expected, apiMock, { onDone: resolve, onError: reject });\n }));\n\n it(\"failure in provideContext still signs\", () =>\n new Promise<void>((resolve, reject) => {\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.1\" },\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: true,\n });\n\n getAppConfigMock.mockResolvedValue(CommandResultFactory({ data: {} }));\n inspectTransactionMock.mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n });\n\n buildContextMock.mockResolvedValue({\n descriptor: new Uint8Array([2]),\n calCertificate: { keyUsageNumber: 0, payload: new Uint8Array() },\n challenge: undefined,\n addressResult: { tokenAccount: \"\", owner: \"\", contract: \"\" },\n });\n provideContextMock.mockResolvedValue(\n Just(\n CommandResultFactory({ error: new InvalidStatusWordError(\"ctxErr\") }),\n ),\n );\n const sig = new Uint8Array([0xfe]);\n signMock.mockResolvedValue(CommandResultFactory({ data: Just(sig) }));\n\n const action = new SignTransactionDeviceAction({\n input: {\n derivationPath: defaultDerivation,\n transaction: exampleTx,\n skipOpenApp: true,\n options: {},\n contextModule: contextModuleStub,\n } as SignTransactionDAInput,\n });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n\n const expected = [\n // getAppConfig\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // inspectTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // buildContext\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // provideContext (returns error but continues)\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // signTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n },\n status: DeviceActionStatus.Pending,\n },\n // success\n { output: sig, status: DeviceActionStatus.Completed },\n ] as DeviceActionState<\n Uint8Array,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[];\n\n testDeviceActionStates<\n Uint8Array,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >(action, expected, apiMock, { onDone: resolve, onError: reject });\n }));\n\n it(\"buildContext throws \u2192 error\", () =>\n new Promise<void>((resolve, reject) => {\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.1\" },\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: true,\n });\n\n getAppConfigMock.mockResolvedValue(CommandResultFactory({ data: {} }));\n inspectTransactionMock.mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n });\n\n buildContextMock.mockRejectedValue(new InvalidStatusWordError(\"bldErr\"));\n\n const action = new SignTransactionDeviceAction({\n input: {\n derivationPath: defaultDerivation,\n transaction: exampleTx,\n skipOpenApp: true,\n options: {},\n contextModule: contextModuleStub,\n } as SignTransactionDAInput,\n });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n\n const expected = [\n // getAppConfig\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // inspectTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // buildContext (throws)\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // error raised from buildContext\n {\n error: expect.anything() as unknown as SignTransactionDAError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n Uint8Array,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[];\n\n testDeviceActionStates<\n Uint8Array,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >(action, expected, apiMock, { onDone: resolve, onError: reject });\n }));\n});\n"],
5
+ "mappings": "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",
6
6
  "names": ["import_device_management_kit", "import_purify_ts", "import_vitest", "import_testDeviceActionStates", "import_TransactionInspector", "import_makeInternalApi", "import_SignTransactionDeviceAction", "defaultDerivation", "exampleTx", "contextModuleStub", "apiMock", "getAppConfigMock", "buildContextMock", "provideContextMock", "signMock", "inspectTransactionMock", "extractDeps", "resolve", "reject", "ctx", "signature", "action", "expected", "sig"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var p=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var f=Object.getOwnPropertyNames;var g=Object.prototype.hasOwnProperty;var K=(i,e)=>{for(var n in e)p(i,n,{get:e[n],enumerable:!0})},k=(i,e,n,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let c of f(e))!g.call(i,c)&&c!==n&&p(i,c,{get:()=>e[c],enumerable:!(o=A(e,c))||o.enumerable});return i};var b=i=>k(p({},"__esModule",{value:!0}),i);var x={};K(x,{SolanaTransactionTypes:()=>T,TransactionInspector:()=>P});module.exports=b(x);var s=require("@solana/spl-token"),u=require("@solana/web3.js"),I=require("buffer"),T=(n=>(n.STANDARD="Standard",n.SPL="SPL",n))(T||{});class P{constructor(e){this.rawTransactionBytes=e}inspectTransactionType(){try{const e=this.normaliseMessage(this.rawTransactionBytes);for(const n of e.compiledInstructions){const o=e.allKeys[n.programIdIndex];if(!o)continue;if(o.equals(s.ASSOCIATED_TOKEN_PROGRAM_ID)){const a=n.accountKeyIndexes.map(r=>e.allKeys[r]).filter(Boolean),y=a[1],t=a[3];if(y&&t)return{transactionType:"SPL",data:{createATA:{address:y.toBase58(),mintAddress:t.toBase58()}}};continue}if(!(o.equals(s.TOKEN_PROGRAM_ID)||o.equals(s.TOKEN_2022_PROGRAM_ID)))continue;const d=new u.TransactionInstruction({programId:o,keys:n.accountKeyIndexes.map(a=>{if(!e.allKeys[a])throw new Error(`TransactionInspector: missing key at index ${a} in allKeys`);return{pubkey:e.allKeys[a],isSigner:!1,isWritable:!1}}),data:I.Buffer.from(n.data)}),m=d.data[0];try{switch(m){case s.TokenInstruction.Transfer:{const{keys:{destination:a}}=(0,s.decodeTransferInstruction)(d);return{transactionType:"SPL",data:{tokenAddress:a.pubkey.toBase58()}}}case s.TokenInstruction.TransferChecked:{const{keys:{destination:a,mint:y}}=(0,s.decodeTransferCheckedInstruction)(d);return{transactionType:"SPL",data:{tokenAddress:a.pubkey.toBase58(),mintAddress:y.pubkey.toBase58()}}}case s.TokenInstruction.InitializeAccount:{const{keys:{account:a,mint:y}}=(0,s.decodeInitializeAccountInstruction)(d);return{transactionType:"SPL",data:{createATA:{address:a.pubkey.toBase58(),mintAddress:y.pubkey.toBase58()}}}}default:break}}catch{continue}}return{transactionType:"Standard",data:{}}}catch{return{transactionType:"Standard",data:{}}}}normaliseMessage(e){const n=this.tryDeserialiseVersioned(e);if(n){const t=n.message;let r;return typeof t.getAccountKeys=="function"?r=t.getAccountKeys().keySegments().flat():r=[...t.staticAccountKeys],{compiledInstructions:t.compiledInstructions.map(l=>({programIdIndex:l.programIdIndex,accountKeyIndexes:Array.from(l.accountKeyIndexes??[]),data:l.data instanceof Uint8Array?l.data:I.Buffer.from(l.data??[])})),allKeys:r}}const o=u.Transaction.from(e),c=new Map,d=t=>{if(!t)return;const r=t.toBase58();c.has(r)||c.set(r,t)};d(o.feePayer??null);for(const t of o.instructions){d(t.programId);for(const r of t.keys)d(r.pubkey)}const m=Array.from(c.values()),a=new Map(m.map((t,r)=>[t.toBase58(),r]));return{compiledInstructions:o.instructions.map(t=>({programIdIndex:a.get(t.programId.toBase58())??-1,accountKeyIndexes:t.keys.map(r=>a.get(r.pubkey.toBase58())??-1),data:t.data})),allKeys:m}}tryDeserialiseVersioned(e){try{return u.VersionedTransaction.deserialize(e)}catch{try{return{message:u.VersionedMessage.deserialize(e)}}catch{return null}}}}0&&(module.exports={SolanaTransactionTypes,TransactionInspector});
1
+ "use strict";var p=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var x=Object.getOwnPropertyNames;var T=Object.prototype.hasOwnProperty;var P=(i,e)=>{for(var t in e)p(i,t,{get:e[t],enumerable:!0})},S=(i,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of x(e))!T.call(i,n)&&n!==t&&p(i,n,{get:()=>e[n],enumerable:!(r=b(e,n))||r.enumerable});return i};var h=i=>S(p({},"__esModule",{value:!0}),i);var D={};P(D,{SolanaTransactionTypes:()=>g,TransactionInspector:()=>k});module.exports=h(D);var d=require("@solana/web3.js"),I=require("buffer"),f=require("../../app-binder/services/utils/transactionDecoders"),g=(t=>(t.STANDARD="Standard",t.SPL="SPL",t))(g||{});class k{constructor(e){this.rawTransactionBytes=e}inspectTransactionType(){try{const e=this.normaliseMessage(this.rawTransactionBytes);for(const t of e.compiledInstructions){const r=e.allKeys[t.programIdIndex];if(!r)continue;const n=t.accountKeyIndexes.map(a=>e.allKeys[a]).filter(a=>!!a);if(n.length!==t.accountKeyIndexes.length)continue;const u=new d.TransactionInstruction({programId:r,keys:n.map(a=>({pubkey:a,isSigner:!1,isWritable:!1})),data:I.Buffer.from(t.data)}),y={programId:r,ixMeta:t,message:e,instruction:u};for(const a of f.DECODERS){if(!a.when(y))continue;const m=a.decode(y);if(m)return{transactionType:"SPL",data:m}}}return{transactionType:"Standard",data:{}}}catch{return{transactionType:"Standard",data:{}}}}normaliseMessage(e){const t=this.tryDeserialiseVersioned(e);if(t){const s=t.message;let o;return typeof s.getAccountKeys=="function"?o=s.getAccountKeys().keySegments().flat():o=[...s.staticAccountKeys],{compiledInstructions:s.compiledInstructions.map(c=>{const K=c,A=Array.from(K.accounts??c.accountKeyIndexes??[]);let l;return c.data instanceof Uint8Array?l=c.data:typeof c.data=="string"?l=I.Buffer.from(c.data,"base64"):l=Uint8Array.from(c.data??[]),{programIdIndex:c.programIdIndex,accountKeyIndexes:A,data:l}}),allKeys:o}}const r=d.Transaction.from(e),n=new Map,u=s=>{if(!s)return;const o=s.toBase58();n.has(o)||n.set(o,s)};u(r.feePayer??null);for(const s of r.instructions){u(s.programId);for(const o of s.keys)u(o.pubkey)}const y=Array.from(n.values()),a=new Map(y.map((s,o)=>[s.toBase58(),o]));return{compiledInstructions:r.instructions.map(s=>({programIdIndex:a.get(s.programId.toBase58())??-1,accountKeyIndexes:s.keys.map(o=>a.get(o.pubkey.toBase58())??-1),data:s.data})),allKeys:y}}tryDeserialiseVersioned(e){try{return d.VersionedTransaction.deserialize(e)}catch{try{return{message:d.VersionedMessage.deserialize(e)}}catch{return null}}}}0&&(module.exports={SolanaTransactionTypes,TransactionInspector});
2
2
  //# sourceMappingURL=TransactionInspector.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/services/TransactionInspector.ts"],
4
- "sourcesContent": ["import {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n decodeInitializeAccountInstruction,\n decodeTransferCheckedInstruction,\n decodeTransferInstruction,\n TOKEN_2022_PROGRAM_ID,\n TOKEN_PROGRAM_ID,\n TokenInstruction,\n} from \"@solana/spl-token\";\nimport {\n type PublicKey,\n Transaction,\n TransactionInstruction,\n VersionedMessage,\n VersionedTransaction,\n} from \"@solana/web3.js\";\nimport { Buffer } from \"buffer\";\n\nexport enum SolanaTransactionTypes {\n STANDARD = \"Standard\",\n SPL = \"SPL\",\n}\n\nexport interface TxInspectorResult {\n transactionType: SolanaTransactionTypes;\n data: {\n tokenAddress?: string;\n mintAddress?: string;\n createATA?: {\n address: string;\n mintAddress: string;\n };\n };\n}\n\ntype NormalizedCompiledIx = {\n programIdIndex: number;\n accountKeyIndexes: number[];\n data: Uint8Array;\n};\n\ntype NormalizedMessage = {\n compiledInstructions: NormalizedCompiledIx[];\n allKeys: PublicKey[];\n};\n\ntype LoadedAddresses = { writable: PublicKey[]; readonly: PublicKey[] };\n\nexport class TransactionInspector {\n /**\n * @param rawTransactionBytes - the raw tx bytes (legacy or v0)\n */\n constructor(private readonly rawTransactionBytes: Uint8Array) {}\n\n public inspectTransactionType(): TxInspectorResult {\n try {\n const message = this.normaliseMessage(this.rawTransactionBytes);\n\n for (const ixMeta of message.compiledInstructions) {\n const programId = message.allKeys[ixMeta.programIdIndex];\n if (!programId) continue;\n\n // Associated Token Account (ATA) Program: detect ATA creation\n if (programId.equals(ASSOCIATED_TOKEN_PROGRAM_ID)) {\n // expected accounts: [payer, ata, owner, mint, systemProgram, tokenProgram, rent?]\n const accountPks = ixMeta.accountKeyIndexes\n .map((i) => message.allKeys[i])\n .filter(Boolean) as PublicKey[];\n const ataPk = accountPks[1];\n const mintPk = accountPks[3];\n if (ataPk && mintPk) {\n return {\n transactionType: SolanaTransactionTypes.SPL,\n data: {\n createATA: {\n address: ataPk.toBase58(),\n mintAddress: mintPk.toBase58(),\n },\n },\n };\n }\n continue;\n }\n\n // Token Program (classic or 2022)\n const isTokenProgram =\n programId.equals(TOKEN_PROGRAM_ID) ||\n programId.equals(TOKEN_2022_PROGRAM_ID);\n if (!isTokenProgram) continue;\n\n // minimal TransactionInstruction for the decoders\n const instruction = new TransactionInstruction({\n programId,\n keys: ixMeta.accountKeyIndexes.map((i) => {\n if (!message.allKeys[i]) {\n throw new Error(\n `TransactionInspector: missing key at index ${i} in allKeys`,\n );\n }\n return {\n pubkey: message.allKeys[i],\n isSigner: false,\n isWritable: false,\n };\n }),\n data: Buffer.from(ixMeta.data),\n });\n\n const instructionType = instruction.data[0];\n\n try {\n switch (instructionType) {\n case TokenInstruction.Transfer: {\n const {\n keys: { destination },\n } = decodeTransferInstruction(instruction);\n return {\n transactionType: SolanaTransactionTypes.SPL,\n data: { tokenAddress: destination.pubkey.toBase58() },\n };\n }\n case TokenInstruction.TransferChecked: {\n const {\n keys: { destination, mint },\n } = decodeTransferCheckedInstruction(instruction);\n return {\n transactionType: SolanaTransactionTypes.SPL,\n data: {\n tokenAddress: destination.pubkey.toBase58(),\n mintAddress: mint.pubkey.toBase58(),\n },\n };\n }\n case TokenInstruction.InitializeAccount: {\n // InitializeAccount != ATA creation, ATA is via the Associated Token Account Program above.\n const {\n keys: { account, mint },\n } = decodeInitializeAccountInstruction(instruction);\n return {\n transactionType: SolanaTransactionTypes.SPL,\n data: {\n createATA: {\n address: account.pubkey.toBase58(),\n mintAddress: mint.pubkey.toBase58(),\n },\n },\n };\n }\n default:\n // not a token instruction we care about\u2014keep scanning.\n break;\n }\n } catch {\n // if a decoder throws (bad match), keep scanning other instructions.\n continue;\n }\n }\n\n return { transactionType: SolanaTransactionTypes.STANDARD, data: {} };\n } catch {\n return { transactionType: SolanaTransactionTypes.STANDARD, data: {} };\n }\n }\n\n /**\n * normalise any tx (legacy or v0) into { compiledInstructions, allKeys }.\n * if LUT accounts are provided, looked-up keys are included in allKeys.\n */\n private normaliseMessage(rawBytes: Uint8Array): NormalizedMessage {\n const vtx = this.tryDeserialiseVersioned(rawBytes);\n if (vtx) {\n const msg = vtx.message as VersionedMessage & {\n getAccountKeys?: (opts?: {\n accountKeysFromLookups?: LoadedAddresses;\n }) => {\n staticAccountKeys: PublicKey[];\n accountKeysFromLookups?: LoadedAddresses;\n keySegments: () => PublicKey[][];\n };\n compiledInstructions: Array<{\n programIdIndex: number;\n accountKeyIndexes?: number[];\n accounts?: number[];\n data: Uint8Array | string | number[];\n }>;\n staticAccountKeys: PublicKey[];\n };\n\n // build the full key array in the exact index order used by compiledInstructions\n let allKeys: PublicKey[];\n if (typeof msg.getAccountKeys === \"function\") {\n const mak = msg.getAccountKeys();\n allKeys = mak.keySegments().flat();\n } else {\n // very old builds: fall back to concatenation (same order)\n allKeys = [...msg.staticAccountKeys];\n }\n\n const compiledInstructions: NormalizedCompiledIx[] =\n msg.compiledInstructions.map((ix) => ({\n programIdIndex: ix.programIdIndex,\n accountKeyIndexes: Array.from(ix.accountKeyIndexes ?? []),\n data:\n ix.data instanceof Uint8Array\n ? ix.data\n : Buffer.from(ix.data ?? []),\n }));\n\n return { compiledInstructions, allKeys };\n }\n\n // legacy fallback\n const legacy = Transaction.from(rawBytes);\n\n const allKeyMap = new Map<string, PublicKey>();\n const add = (pk?: PublicKey | null) => {\n if (!pk) return;\n const k = pk.toBase58();\n if (!allKeyMap.has(k)) allKeyMap.set(k, pk);\n };\n\n add(legacy.feePayer ?? null);\n for (const ix of legacy.instructions) {\n add(ix.programId);\n for (const k of ix.keys) add(k.pubkey);\n }\n const allKeys = Array.from(allKeyMap.values());\n const indexByB58 = new Map(allKeys.map((pk, i) => [pk.toBase58(), i]));\n\n const compiledInstructions: NormalizedCompiledIx[] =\n legacy.instructions.map((ix) => ({\n programIdIndex: indexByB58.get(ix.programId.toBase58()) ?? -1,\n accountKeyIndexes: ix.keys.map(\n (k) => indexByB58.get(k.pubkey.toBase58()) ?? -1,\n ),\n data: ix.data,\n }));\n\n return { compiledInstructions, allKeys };\n }\n\n private tryDeserialiseVersioned(\n rawBytes: Uint8Array,\n ): VersionedTransaction | null {\n try {\n return VersionedTransaction.deserialize(rawBytes);\n } catch {\n try {\n const msg = VersionedMessage.deserialize(rawBytes);\n // wrap in a dummy VersionedTransaction-like shape just for uniform handling\n return { message: msg } as VersionedTransaction;\n } catch {\n return null;\n }\n }\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["TransactionInspector_exports", "__export", "SolanaTransactionTypes", "TransactionInspector", "__toCommonJS", "import_spl_token", "import_web3", "import_buffer", "rawTransactionBytes", "message", "ixMeta", "programId", "accountPks", "i", "ataPk", "mintPk", "instruction", "instructionType", "destination", "mint", "account", "rawBytes", "vtx", "msg", "allKeys", "ix", "legacy", "allKeyMap", "add", "pk", "k", "indexByB58"]
4
+ "sourcesContent": ["import {\n type PublicKey,\n Transaction,\n TransactionInstruction,\n VersionedMessage,\n VersionedTransaction,\n} from \"@solana/web3.js\";\nimport { Buffer } from \"buffer\";\n\nimport {\n DECODERS,\n type IxContext,\n type TxInspectorResult,\n} from \"@internal/app-binder/services/utils/transactionDecoders\";\n\nexport enum SolanaTransactionTypes {\n STANDARD = \"Standard\",\n SPL = \"SPL\",\n}\n\nexport type NormalizedCompiledIx = {\n programIdIndex: number;\n accountKeyIndexes: number[];\n data: Uint8Array;\n};\n\nexport type NormalizedMessage = {\n compiledInstructions: NormalizedCompiledIx[];\n allKeys: PublicKey[];\n};\n\ntype LoadedAddresses = { writable: PublicKey[]; readonly: PublicKey[] };\n\nexport class TransactionInspector {\n constructor(private readonly rawTransactionBytes: Uint8Array) {}\n\n public inspectTransactionType(): TxInspectorResult {\n try {\n const message = this.normaliseMessage(this.rawTransactionBytes);\n\n for (const ixMeta of message.compiledInstructions) {\n const programId = message.allKeys[ixMeta.programIdIndex];\n if (!programId) continue;\n\n // resolve all referenced keys, if any are missing skip this\n const resolvedKeys = ixMeta.accountKeyIndexes\n .map((i) => message.allKeys[i])\n .filter((key): key is PublicKey => !!key);\n\n if (resolvedKeys.length !== ixMeta.accountKeyIndexes.length) {\n // unresolved keys, can't decode reliably\n continue;\n }\n\n const instruction = new TransactionInstruction({\n programId,\n keys: resolvedKeys.map((key) => ({\n pubkey: key,\n isSigner: false,\n isWritable: false,\n })),\n data: Buffer.from(ixMeta.data),\n });\n\n const ctx: IxContext = { programId, ixMeta, message, instruction };\n\n for (const decoder of DECODERS) {\n if (!decoder.when(ctx)) continue;\n const data = decoder.decode(ctx);\n if (data) {\n return { transactionType: SolanaTransactionTypes.SPL, data };\n }\n }\n }\n\n return { transactionType: SolanaTransactionTypes.STANDARD, data: {} };\n } catch {\n return { transactionType: SolanaTransactionTypes.STANDARD, data: {} };\n }\n }\n\n /**\n * Normalise any tx (legacy or v0) into { compiledInstructions, allKeys }.\n * If LUT accounts are provided, looked-up keys are included in allKeys.\n */\n private normaliseMessage(rawBytes: Uint8Array): NormalizedMessage {\n const versionedTX = this.tryDeserialiseVersioned(rawBytes);\n if (versionedTX) {\n const msg = versionedTX.message as VersionedMessage & {\n getAccountKeys?: (options?: {\n accountKeysFromLookups?: LoadedAddresses;\n }) => {\n staticAccountKeys: PublicKey[];\n accountKeysFromLookups?: LoadedAddresses;\n keySegments: () => PublicKey[][];\n };\n compiledInstructions: Array<{\n programIdIndex: number;\n accountKeyIndexes?: number[]; // legacy field name\n accounts?: number[]; // v0 field name\n data: Uint8Array | string | number[];\n }>;\n staticAccountKeys: PublicKey[];\n };\n\n // build the full key array in the exact index order used by compiledInstructions\n let allKeys: PublicKey[];\n if (typeof msg.getAccountKeys === \"function\") {\n const messageAccountKeys = msg.getAccountKeys();\n allKeys = messageAccountKeys.keySegments().flat();\n } else {\n // fallback to statics\n allKeys = [...msg.staticAccountKeys];\n }\n\n const compiledInstructions: NormalizedCompiledIx[] =\n msg.compiledInstructions.map((ix) => {\n // prefer v0 `accounts`, fall back to legacy `accountKeyIndexes`\n const ixWithAccounts = ix as typeof ix & { accounts?: number[] };\n const accountKeyIndexes = Array.from(\n ixWithAccounts.accounts ?? ix.accountKeyIndexes ?? [],\n ) as number[];\n\n // normalise data\n let data: Uint8Array;\n if (ix.data instanceof Uint8Array) {\n data = ix.data;\n } else if (typeof ix.data === \"string\") {\n // v0 encodes instruction data as base64 strings\n data = Buffer.from(ix.data, \"base64\");\n } else {\n data = Uint8Array.from(ix.data ?? []);\n }\n\n return {\n programIdIndex: ix.programIdIndex,\n accountKeyIndexes,\n data,\n };\n });\n\n return { compiledInstructions, allKeys };\n }\n\n // legacy fallback\n const legacy = Transaction.from(rawBytes);\n\n const allKeyMap = new Map<string, PublicKey>();\n const add = (pubkey?: PublicKey | null) => {\n if (!pubkey) return;\n const key = pubkey.toBase58();\n if (!allKeyMap.has(key)) allKeyMap.set(key, pubkey);\n };\n\n add(legacy.feePayer ?? null);\n for (const ix of legacy.instructions) {\n add(ix.programId);\n for (const key of ix.keys) add(key.pubkey);\n }\n const allKeys = Array.from(allKeyMap.values());\n const indexByB58 = new Map(allKeys.map((pk, i) => [pk.toBase58(), i]));\n\n const compiledInstructions: NormalizedCompiledIx[] =\n legacy.instructions.map((ix) => ({\n programIdIndex: indexByB58.get(ix.programId.toBase58()) ?? -1,\n accountKeyIndexes: ix.keys.map(\n (key) => indexByB58.get(key.pubkey.toBase58()) ?? -1,\n ),\n data: ix.data,\n }));\n\n return { compiledInstructions, allKeys };\n }\n\n private tryDeserialiseVersioned(\n rawBytes: Uint8Array,\n ): VersionedTransaction | null {\n try {\n return VersionedTransaction.deserialize(rawBytes);\n } catch {\n try {\n const msg = VersionedMessage.deserialize(rawBytes);\n // wrap in a dummy VersionedTransaction-like shape just for uniform handling\n return { message: msg } as VersionedTransaction;\n } catch {\n return null;\n }\n }\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["TransactionInspector_exports", "__export", "SolanaTransactionTypes", "TransactionInspector", "__toCommonJS", "import_web3", "import_buffer", "import_transactionDecoders", "rawTransactionBytes", "message", "ixMeta", "programId", "resolvedKeys", "i", "key", "instruction", "ctx", "decoder", "data", "rawBytes", "versionedTX", "msg", "allKeys", "ix", "ixWithAccounts", "accountKeyIndexes", "legacy", "allKeyMap", "add", "pubkey", "indexByB58", "pk"]
7
7
  }
@@ -0,0 +1,2 @@
1
+ "use strict";var a=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var y=Object.prototype.hasOwnProperty;var p=(e,t)=>{for(var n in t)a(e,n,{get:t[n],enumerable:!0})},A=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of k(t))!y.call(e,r)&&r!==n&&a(e,r,{get:()=>t[r],enumerable:!(o=i(t,r))||o.enumerable});return e};var m=e=>A(a({},"__esModule",{value:!0}),e);var I={};p(I,{DECODERS:()=>l});module.exports=m(I);var s=require("@solana/spl-token");const c=e=>e.equals(s.TOKEN_PROGRAM_ID)||e.equals(s.TOKEN_2022_PROGRAM_ID),d=e=>{try{return e()}catch{return null}},l=[{when:({programId:e})=>e.equals(s.ASSOCIATED_TOKEN_PROGRAM_ID),decode:({ixMeta:e,message:t})=>{const n=e.accountKeyIndexes.map(u=>t.allKeys[u]).filter(Boolean),o=n[1],r=n[3];return o&&r?{createATA:{address:o.toBase58(),mintAddress:r.toBase58()}}:null}},{when:({programId:e})=>e.equals(s.TOKEN_2022_PROGRAM_ID),decode:({instruction:e,programId:t})=>d(()=>{const{keys:{destination:n,mint:o}}=(0,s.decodeTransferCheckedWithFeeInstruction)(e,t);return{tokenAddress:n.pubkey.toBase58(),mintAddress:o.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:t})=>d(()=>{const{keys:{destination:n}}=(0,s.decodeTransferInstruction)(e,t);return{tokenAddress:n.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:t})=>d(()=>{const{keys:{destination:n,mint:o}}=(0,s.decodeTransferCheckedInstruction)(e,t);return{tokenAddress:n.pubkey.toBase58(),mintAddress:o.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:t})=>d(()=>{const{keys:{account:n,mint:o}}=(0,s.decodeInitializeAccountInstruction)(e,t);return{createATA:{address:n.pubkey.toBase58(),mintAddress:o.pubkey.toBase58()}}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:t})=>d(()=>{const{keys:{account:n,mint:o}}=(0,s.decodeInitializeAccount2Instruction)(e,t);return{createATA:{address:n.pubkey.toBase58(),mintAddress:o.pubkey.toBase58()}}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:t})=>d(()=>{const{keys:{account:n,mint:o}}=(0,s.decodeInitializeAccount3Instruction)(e,t);return{createATA:{address:n.pubkey.toBase58(),mintAddress:o.pubkey.toBase58()}}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:t})=>d(()=>{const{keys:{account:n}}=(0,s.decodeInitializeImmutableOwnerInstruction)(e,t);return{tokenAddress:n.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:t})=>d(()=>{const{keys:{account:n}}=(0,s.decodeCloseAccountInstruction)(e,t);return{tokenAddress:n.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:t})=>d(()=>{const{keys:{account:n}}=(0,s.decodeSyncNativeInstruction)(e,t);return{tokenAddress:n.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:t})=>d(()=>{const{keys:{account:n,mint:o}}=(0,s.decodeBurnCheckedInstruction)(e,t);return{tokenAddress:n.pubkey.toBase58(),mintAddress:o.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:t})=>d(()=>{const{keys:{account:n,mint:o}}=(0,s.decodeBurnInstruction)(e,t);return{tokenAddress:n.pubkey.toBase58(),mintAddress:o.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:t})=>d(()=>{const{keys:{account:n,mint:o}}=(0,s.decodeFreezeAccountInstruction)(e,t);return{tokenAddress:n.pubkey.toBase58(),mintAddress:o.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:t})=>d(()=>{const{keys:{account:n,mint:o}}=(0,s.decodeThawAccountInstruction)(e,t);return{tokenAddress:n.pubkey.toBase58(),mintAddress:o.pubkey.toBase58()}})}];0&&(module.exports={DECODERS});
2
+ //# sourceMappingURL=transactionDecoders.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/internal/app-binder/services/utils/transactionDecoders.ts"],
4
+ "sourcesContent": ["import {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n decodeBurnCheckedInstruction,\n decodeBurnInstruction,\n decodeCloseAccountInstruction,\n decodeFreezeAccountInstruction,\n decodeInitializeAccount2Instruction,\n decodeInitializeAccount3Instruction,\n decodeInitializeAccountInstruction,\n decodeInitializeImmutableOwnerInstruction,\n decodeSyncNativeInstruction,\n decodeThawAccountInstruction,\n decodeTransferCheckedInstruction,\n decodeTransferCheckedWithFeeInstruction,\n decodeTransferInstruction,\n TOKEN_2022_PROGRAM_ID,\n TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport { type PublicKey, type TransactionInstruction } from \"@solana/web3.js\";\n\nimport {\n type NormalizedCompiledIx,\n type NormalizedMessage,\n type SolanaTransactionTypes,\n} from \"@internal/app-binder/services/TransactionInspector\";\n\nexport interface TxInspectorResult {\n transactionType: SolanaTransactionTypes;\n data: {\n tokenAddress?: string;\n mintAddress?: string;\n createATA?: {\n address: string;\n mintAddress: string;\n };\n };\n}\n\nexport type IxContext = {\n programId: PublicKey;\n ixMeta: NormalizedCompiledIx;\n message: NormalizedMessage;\n instruction: TransactionInstruction;\n};\n\nexport type Decoder = {\n when: (ctx: IxContext) => boolean;\n decode: (ctx: IxContext) => TxInspectorResult[\"data\"] | null;\n};\n\nconst isTokenProgramId = (pid: PublicKey) =>\n pid.equals(TOKEN_PROGRAM_ID) || pid.equals(TOKEN_2022_PROGRAM_ID);\n\nconst safe = <T>(fn: () => T): T | null => {\n try {\n return fn();\n } catch {\n return null;\n }\n};\n\nexport const DECODERS: Decoder[] = [\n // ATA creation (Associated Token Account Program)\n {\n when: ({ programId }) => programId.equals(ASSOCIATED_TOKEN_PROGRAM_ID),\n decode: ({ ixMeta, message }) => {\n const accountPks = ixMeta.accountKeyIndexes\n .map((i) => message.allKeys[i])\n .filter(Boolean) as PublicKey[];\n const ataPk = accountPks[1];\n const mintPk = accountPks[3];\n return ataPk && mintPk\n ? {\n createATA: {\n address: ataPk.toBase58(),\n mintAddress: mintPk.toBase58(),\n },\n }\n : null;\n },\n },\n\n // token-2022 fee'd transfers \u2014 first for Token-2022\n {\n when: ({ programId }) => programId.equals(TOKEN_2022_PROGRAM_ID),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { destination, mint },\n } = decodeTransferCheckedWithFeeInstruction(instruction, programId);\n return {\n tokenAddress: destination.pubkey.toBase58(),\n mintAddress: mint.pubkey.toBase58(),\n };\n }),\n },\n\n // generic SPL decoders (classic & 2022)\n // transfers\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { destination },\n } = decodeTransferInstruction(instruction, programId);\n return { tokenAddress: destination.pubkey.toBase58() };\n }),\n },\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { destination, mint },\n } = decodeTransferCheckedInstruction(instruction, programId);\n return {\n tokenAddress: destination.pubkey.toBase58(),\n mintAddress: mint.pubkey.toBase58(),\n };\n }),\n },\n\n // account initialisation (non-ATA included)\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account, mint },\n } = decodeInitializeAccountInstruction(instruction, programId);\n return {\n createATA: {\n address: account.pubkey.toBase58(),\n mintAddress: mint.pubkey.toBase58(),\n },\n };\n }),\n },\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account, mint },\n } = decodeInitializeAccount2Instruction(instruction, programId);\n return {\n createATA: {\n address: account.pubkey.toBase58(),\n mintAddress: mint.pubkey.toBase58(),\n },\n };\n }),\n },\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account, mint },\n } = decodeInitializeAccount3Instruction(instruction, programId);\n return {\n createATA: {\n address: account.pubkey.toBase58(),\n mintAddress: mint.pubkey.toBase58(),\n },\n };\n }),\n },\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account },\n } = decodeInitializeImmutableOwnerInstruction(instruction, programId);\n return { tokenAddress: account.pubkey.toBase58() };\n }),\n },\n\n // lifecycle / WSOL\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account },\n } = decodeCloseAccountInstruction(instruction, programId);\n return { tokenAddress: account.pubkey.toBase58() };\n }),\n },\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account },\n } = decodeSyncNativeInstruction(instruction, programId);\n return { tokenAddress: account.pubkey.toBase58() };\n }),\n },\n\n // mint / burn\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account, mint },\n } = decodeBurnCheckedInstruction(instruction, programId);\n return {\n tokenAddress: account.pubkey.toBase58(),\n mintAddress: mint.pubkey.toBase58(),\n };\n }),\n },\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account, mint },\n } = decodeBurnInstruction(instruction, programId);\n return {\n tokenAddress: account.pubkey.toBase58(),\n mintAddress: mint.pubkey.toBase58(),\n };\n }),\n },\n\n // freeze / thaw\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account, mint },\n } = decodeFreezeAccountInstruction(instruction, programId);\n return {\n tokenAddress: account.pubkey.toBase58(),\n mintAddress: mint.pubkey.toBase58(),\n };\n }),\n },\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account, mint },\n } = decodeThawAccountInstruction(instruction, programId);\n return {\n tokenAddress: account.pubkey.toBase58(),\n mintAddress: mint.pubkey.toBase58(),\n };\n }),\n },\n];\n"],
5
+ "mappings": "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",
6
+ "names": ["transactionDecoders_exports", "__export", "DECODERS", "__toCommonJS", "import_spl_token", "isTokenProgramId", "pid", "safe", "fn", "programId", "ixMeta", "message", "accountPks", "i", "ataPk", "mintPk", "instruction", "destination", "mint", "account"]
7
+ }
@@ -1,2 +1,2 @@
1
- "use strict";var n=require("@ledgerhq/device-management-kit"),c=require("purify-ts"),e=require("vitest"),i=require("../../app-binder/command/GetChallengeCommand"),l=require("./BuildTransactionContextTask");const a={getSolanaContext:e.vi.fn(),getFieldContext:e.vi.fn(),getContexts:e.vi.fn(),getTypedDataFilters:e.vi.fn(),getWeb3Checks:e.vi.fn(),getProxyDelegateCall:e.vi.fn()},d={contextModule:a,options:{tokenAddress:"someAddress",createATA:void 0}},t={descriptor:new Uint8Array([1,2,3]),tokenAccount:"someTokenAccount",owner:"someOwner",contract:"someContract",certificate:{payload:new Uint8Array([170,187]),keyUsageNumber:1}};let o;(0,e.describe)("BuildTransactionContextTask",()=>{(0,e.beforeEach)(()=>{e.vi.resetAllMocks(),o={getDeviceSessionState:e.vi.fn().mockReturnValue({deviceModelId:n.DeviceModelId.NANO_X}),sendCommand:e.vi.fn().mockResolvedValue({status:n.CommandResultStatus.Success,data:{challenge:"someChallenge"}})}}),(0,e.it)("returns context successfully when challenge command succeeds",async()=>{a.getSolanaContext.mockResolvedValue((0,c.Right)(t));const s=await new l.BuildTransactionContextTask(o,d).run();(0,e.expect)(o.sendCommand).toHaveBeenCalledWith(e.expect.any(i.GetChallengeCommand)),(0,e.expect)(a.getSolanaContext).toHaveBeenCalledWith({deviceModelId:n.DeviceModelId.NANO_X,tokenAddress:"someAddress",challenge:"someChallenge",createATA:void 0}),(0,e.expect)(s).toEqual({challenge:"someChallenge",descriptor:t.descriptor,calCertificate:t.certificate,addressResult:{tokenAccount:t.tokenAccount,owner:t.owner,contract:t.contract}})}),(0,e.it)("returns context when challenge command fails",async()=>{o.sendCommand.mockResolvedValue({status:n.CommandResultStatus.Error,data:{}}),a.getSolanaContext.mockResolvedValue((0,c.Right)(t));const s=await new l.BuildTransactionContextTask(o,d).run();(0,e.expect)(a.getSolanaContext).toHaveBeenCalledWith({deviceModelId:n.DeviceModelId.NANO_X,tokenAddress:"someAddress",challenge:void 0,createATA:void 0}),(0,e.expect)(s).toEqual({challenge:void 0,descriptor:t.descriptor,calCertificate:t.certificate,addressResult:{tokenAccount:t.tokenAccount,owner:t.owner,contract:t.contract}})}),(0,e.it)("throws if getSolanaContext returns Left",async()=>{const r=new Error("Solana context failure");a.getSolanaContext.mockResolvedValue((0,c.Left)(r));const s=new l.BuildTransactionContextTask(o,d);await(0,e.expect)(s.run()).rejects.toThrow("Solana context failure")})});
1
+ "use strict";var n=require("@ledgerhq/device-management-kit"),c=require("purify-ts"),e=require("vitest"),i=require("../../app-binder/command/GetChallengeCommand"),l=require("./BuildTransactionContextTask");const a={getSolanaContext:e.vi.fn(),getContext:e.vi.fn(),getContexts:e.vi.fn(),getTypedDataFilters:e.vi.fn(),getWeb3Checks:e.vi.fn()},d={contextModule:a,options:{tokenAddress:"someAddress",createATA:void 0}},t={descriptor:new Uint8Array([1,2,3]),tokenAccount:"someTokenAccount",owner:"someOwner",contract:"someContract",certificate:{payload:new Uint8Array([170,187]),keyUsageNumber:1}};let o;(0,e.describe)("BuildTransactionContextTask",()=>{(0,e.beforeEach)(()=>{e.vi.resetAllMocks(),o={getDeviceSessionState:e.vi.fn().mockReturnValue({deviceModelId:n.DeviceModelId.NANO_X}),sendCommand:e.vi.fn().mockResolvedValue({status:n.CommandResultStatus.Success,data:{challenge:"someChallenge"}})}}),(0,e.it)("returns context successfully when challenge command succeeds",async()=>{a.getSolanaContext.mockResolvedValue((0,c.Right)(t));const s=await new l.BuildTransactionContextTask(o,d).run();(0,e.expect)(o.sendCommand).toHaveBeenCalledWith(e.expect.any(i.GetChallengeCommand)),(0,e.expect)(a.getSolanaContext).toHaveBeenCalledWith({deviceModelId:n.DeviceModelId.NANO_X,tokenAddress:"someAddress",challenge:"someChallenge",createATA:void 0}),(0,e.expect)(s).toEqual({challenge:"someChallenge",descriptor:t.descriptor,calCertificate:t.certificate,addressResult:{tokenAccount:t.tokenAccount,owner:t.owner,contract:t.contract}})}),(0,e.it)("returns context when challenge command fails",async()=>{o.sendCommand.mockResolvedValue({status:n.CommandResultStatus.Error,data:{}}),a.getSolanaContext.mockResolvedValue((0,c.Right)(t));const s=await new l.BuildTransactionContextTask(o,d).run();(0,e.expect)(a.getSolanaContext).toHaveBeenCalledWith({deviceModelId:n.DeviceModelId.NANO_X,tokenAddress:"someAddress",challenge:void 0,createATA:void 0}),(0,e.expect)(s).toEqual({challenge:void 0,descriptor:t.descriptor,calCertificate:t.certificate,addressResult:{tokenAccount:t.tokenAccount,owner:t.owner,contract:t.contract}})}),(0,e.it)("throws if getSolanaContext returns Left",async()=>{const r=new Error("Solana context failure");a.getSolanaContext.mockResolvedValue((0,c.Left)(r));const s=new l.BuildTransactionContextTask(o,d);await(0,e.expect)(s.run()).rejects.toThrow("Solana context failure")})});
2
2
  //# sourceMappingURL=BuildTransactionContextTask.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/task/BuildTransactionContextTask.test.ts"],
4
- "sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-call */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n CommandResultStatus,\n DeviceModelId,\n type InternalApi,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { GetChallengeCommand } from \"@internal/app-binder/command/GetChallengeCommand\";\n\nimport {\n BuildTransactionContextTask,\n type SolanaBuildContextResult,\n} from \"./BuildTransactionContextTask\";\n\nconst contextModuleMock: ContextModule = {\n getSolanaContext: vi.fn(),\n getFieldContext: vi.fn(),\n getContexts: vi.fn(),\n getTypedDataFilters: vi.fn(),\n getWeb3Checks: vi.fn(),\n getProxyDelegateCall: vi.fn(),\n};\n\nconst defaultArgs = {\n contextModule: contextModuleMock,\n options: {\n tokenAddress: \"someAddress\",\n createATA: undefined,\n },\n};\n\nconst domainSolanaPayload = {\n descriptor: new Uint8Array([1, 2, 3]),\n tokenAccount: \"someTokenAccount\",\n owner: \"someOwner\",\n contract: \"someContract\",\n certificate: { payload: new Uint8Array([0xaa, 0xbb]), keyUsageNumber: 1 },\n} as const;\n\nlet apiMock: InternalApi;\n\ndescribe(\"BuildTransactionContextTask\", () => {\n beforeEach(() => {\n vi.resetAllMocks();\n\n apiMock = {\n getDeviceSessionState: vi\n .fn()\n .mockReturnValue({ deviceModelId: DeviceModelId.NANO_X }),\n sendCommand: vi.fn().mockResolvedValue({\n status: CommandResultStatus.Success,\n data: { challenge: \"someChallenge\" },\n }),\n } as unknown as InternalApi;\n });\n\n it(\"returns context successfully when challenge command succeeds\", async () => {\n (contextModuleMock.getSolanaContext as any).mockResolvedValue(\n Right(domainSolanaPayload),\n );\n\n const task = new BuildTransactionContextTask(apiMock, defaultArgs);\n const result = await task.run();\n\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n expect.any(GetChallengeCommand),\n );\n\n expect(contextModuleMock.getSolanaContext).toHaveBeenCalledWith({\n deviceModelId: DeviceModelId.NANO_X,\n tokenAddress: \"someAddress\",\n challenge: \"someChallenge\",\n createATA: undefined,\n });\n\n expect(result).toEqual<SolanaBuildContextResult>({\n challenge: \"someChallenge\",\n descriptor: domainSolanaPayload.descriptor,\n calCertificate: domainSolanaPayload.certificate,\n addressResult: {\n tokenAccount: domainSolanaPayload.tokenAccount,\n owner: domainSolanaPayload.owner,\n contract: domainSolanaPayload.contract,\n },\n });\n });\n\n it(\"returns context when challenge command fails\", async () => {\n (apiMock.sendCommand as any).mockResolvedValue({\n status: CommandResultStatus.Error,\n data: {},\n });\n (contextModuleMock.getSolanaContext as any).mockResolvedValue(\n Right(domainSolanaPayload),\n );\n\n const task = new BuildTransactionContextTask(apiMock, defaultArgs);\n const result = await task.run();\n\n expect(contextModuleMock.getSolanaContext).toHaveBeenCalledWith({\n deviceModelId: DeviceModelId.NANO_X,\n tokenAddress: \"someAddress\",\n challenge: undefined,\n createATA: undefined,\n });\n\n expect(result).toEqual<SolanaBuildContextResult>({\n challenge: undefined,\n descriptor: domainSolanaPayload.descriptor,\n calCertificate: domainSolanaPayload.certificate,\n addressResult: {\n tokenAccount: domainSolanaPayload.tokenAccount,\n owner: domainSolanaPayload.owner,\n contract: domainSolanaPayload.contract,\n },\n });\n });\n\n it(\"throws if getSolanaContext returns Left\", async () => {\n const error = new Error(\"Solana context failure\");\n (contextModuleMock.getSolanaContext as any).mockResolvedValue(Left(error));\n\n const task = new BuildTransactionContextTask(apiMock, defaultArgs);\n\n await expect(task.run()).rejects.toThrow(\"Solana context failure\");\n });\n});\n"],
5
- "mappings": "aAIA,IAAAA,EAIO,2CACPC,EAA4B,qBAC5BC,EAAqD,kBAErDC,EAAoC,4DAEpCC,EAGO,yCAEP,MAAMC,EAAmC,CACvC,iBAAkB,KAAG,GAAG,EACxB,gBAAiB,KAAG,GAAG,EACvB,YAAa,KAAG,GAAG,EACnB,oBAAqB,KAAG,GAAG,EAC3B,cAAe,KAAG,GAAG,EACrB,qBAAsB,KAAG,GAAG,CAC9B,EAEMC,EAAc,CAClB,cAAeD,EACf,QAAS,CACP,aAAc,cACd,UAAW,MACb,CACF,EAEME,EAAsB,CAC1B,WAAY,IAAI,WAAW,CAAC,EAAG,EAAG,CAAC,CAAC,EACpC,aAAc,mBACd,MAAO,YACP,SAAU,eACV,YAAa,CAAE,QAAS,IAAI,WAAW,CAAC,IAAM,GAAI,CAAC,EAAG,eAAgB,CAAE,CAC1E,EAEA,IAAIC,KAEJ,YAAS,8BAA+B,IAAM,IAC5C,cAAW,IAAM,CACf,KAAG,cAAc,EAEjBA,EAAU,CACR,sBAAuB,KACpB,GAAG,EACH,gBAAgB,CAAE,cAAe,gBAAc,MAAO,CAAC,EAC1D,YAAa,KAAG,GAAG,EAAE,kBAAkB,CACrC,OAAQ,sBAAoB,QAC5B,KAAM,CAAE,UAAW,eAAgB,CACrC,CAAC,CACH,CACF,CAAC,KAED,MAAG,+DAAgE,SAAY,CAC5EH,EAAkB,iBAAyB,qBAC1C,SAAME,CAAmB,CAC3B,EAGA,MAAME,EAAS,MADF,IAAI,8BAA4BD,EAASF,CAAW,EACvC,IAAI,KAE9B,UAAOE,EAAQ,WAAW,EAAE,qBAC1B,SAAO,IAAI,qBAAmB,CAChC,KAEA,UAAOH,EAAkB,gBAAgB,EAAE,qBAAqB,CAC9D,cAAe,gBAAc,OAC7B,aAAc,cACd,UAAW,gBACX,UAAW,MACb,CAAC,KAED,UAAOI,CAAM,EAAE,QAAkC,CAC/C,UAAW,gBACX,WAAYF,EAAoB,WAChC,eAAgBA,EAAoB,YACpC,cAAe,CACb,aAAcA,EAAoB,aAClC,MAAOA,EAAoB,MAC3B,SAAUA,EAAoB,QAChC,CACF,CAAC,CACH,CAAC,KAED,MAAG,+CAAgD,SAAY,CAC5DC,EAAQ,YAAoB,kBAAkB,CAC7C,OAAQ,sBAAoB,MAC5B,KAAM,CAAC,CACT,CAAC,EACAH,EAAkB,iBAAyB,qBAC1C,SAAME,CAAmB,CAC3B,EAGA,MAAME,EAAS,MADF,IAAI,8BAA4BD,EAASF,CAAW,EACvC,IAAI,KAE9B,UAAOD,EAAkB,gBAAgB,EAAE,qBAAqB,CAC9D,cAAe,gBAAc,OAC7B,aAAc,cACd,UAAW,OACX,UAAW,MACb,CAAC,KAED,UAAOI,CAAM,EAAE,QAAkC,CAC/C,UAAW,OACX,WAAYF,EAAoB,WAChC,eAAgBA,EAAoB,YACpC,cAAe,CACb,aAAcA,EAAoB,aAClC,MAAOA,EAAoB,MAC3B,SAAUA,EAAoB,QAChC,CACF,CAAC,CACH,CAAC,KAED,MAAG,0CAA2C,SAAY,CACxD,MAAMG,EAAQ,IAAI,MAAM,wBAAwB,EAC/CL,EAAkB,iBAAyB,qBAAkB,QAAKK,CAAK,CAAC,EAEzE,MAAMC,EAAO,IAAI,8BAA4BH,EAASF,CAAW,EAEjE,QAAM,UAAOK,EAAK,IAAI,CAAC,EAAE,QAAQ,QAAQ,wBAAwB,CACnE,CAAC,CACH,CAAC",
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-call */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n CommandResultStatus,\n DeviceModelId,\n type InternalApi,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { GetChallengeCommand } from \"@internal/app-binder/command/GetChallengeCommand\";\n\nimport {\n BuildTransactionContextTask,\n type SolanaBuildContextResult,\n} from \"./BuildTransactionContextTask\";\n\nconst contextModuleMock: ContextModule = {\n getSolanaContext: vi.fn(),\n getContext: vi.fn(),\n getContexts: vi.fn(),\n getTypedDataFilters: vi.fn(),\n getWeb3Checks: vi.fn(),\n};\n\nconst defaultArgs = {\n contextModule: contextModuleMock,\n options: {\n tokenAddress: \"someAddress\",\n createATA: undefined,\n },\n};\n\nconst domainSolanaPayload = {\n descriptor: new Uint8Array([1, 2, 3]),\n tokenAccount: \"someTokenAccount\",\n owner: \"someOwner\",\n contract: \"someContract\",\n certificate: { payload: new Uint8Array([0xaa, 0xbb]), keyUsageNumber: 1 },\n} as const;\n\nlet apiMock: InternalApi;\n\ndescribe(\"BuildTransactionContextTask\", () => {\n beforeEach(() => {\n vi.resetAllMocks();\n\n apiMock = {\n getDeviceSessionState: vi\n .fn()\n .mockReturnValue({ deviceModelId: DeviceModelId.NANO_X }),\n sendCommand: vi.fn().mockResolvedValue({\n status: CommandResultStatus.Success,\n data: { challenge: \"someChallenge\" },\n }),\n } as unknown as InternalApi;\n });\n\n it(\"returns context successfully when challenge command succeeds\", async () => {\n (contextModuleMock.getSolanaContext as any).mockResolvedValue(\n Right(domainSolanaPayload),\n );\n\n const task = new BuildTransactionContextTask(apiMock, defaultArgs);\n const result = await task.run();\n\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n expect.any(GetChallengeCommand),\n );\n\n expect(contextModuleMock.getSolanaContext).toHaveBeenCalledWith({\n deviceModelId: DeviceModelId.NANO_X,\n tokenAddress: \"someAddress\",\n challenge: \"someChallenge\",\n createATA: undefined,\n });\n\n expect(result).toEqual<SolanaBuildContextResult>({\n challenge: \"someChallenge\",\n descriptor: domainSolanaPayload.descriptor,\n calCertificate: domainSolanaPayload.certificate,\n addressResult: {\n tokenAccount: domainSolanaPayload.tokenAccount,\n owner: domainSolanaPayload.owner,\n contract: domainSolanaPayload.contract,\n },\n });\n });\n\n it(\"returns context when challenge command fails\", async () => {\n (apiMock.sendCommand as any).mockResolvedValue({\n status: CommandResultStatus.Error,\n data: {},\n });\n (contextModuleMock.getSolanaContext as any).mockResolvedValue(\n Right(domainSolanaPayload),\n );\n\n const task = new BuildTransactionContextTask(apiMock, defaultArgs);\n const result = await task.run();\n\n expect(contextModuleMock.getSolanaContext).toHaveBeenCalledWith({\n deviceModelId: DeviceModelId.NANO_X,\n tokenAddress: \"someAddress\",\n challenge: undefined,\n createATA: undefined,\n });\n\n expect(result).toEqual<SolanaBuildContextResult>({\n challenge: undefined,\n descriptor: domainSolanaPayload.descriptor,\n calCertificate: domainSolanaPayload.certificate,\n addressResult: {\n tokenAccount: domainSolanaPayload.tokenAccount,\n owner: domainSolanaPayload.owner,\n contract: domainSolanaPayload.contract,\n },\n });\n });\n\n it(\"throws if getSolanaContext returns Left\", async () => {\n const error = new Error(\"Solana context failure\");\n (contextModuleMock.getSolanaContext as any).mockResolvedValue(Left(error));\n\n const task = new BuildTransactionContextTask(apiMock, defaultArgs);\n\n await expect(task.run()).rejects.toThrow(\"Solana context failure\");\n });\n});\n"],
5
+ "mappings": "aAIA,IAAAA,EAIO,2CACPC,EAA4B,qBAC5BC,EAAqD,kBAErDC,EAAoC,4DAEpCC,EAGO,yCAEP,MAAMC,EAAmC,CACvC,iBAAkB,KAAG,GAAG,EACxB,WAAY,KAAG,GAAG,EAClB,YAAa,KAAG,GAAG,EACnB,oBAAqB,KAAG,GAAG,EAC3B,cAAe,KAAG,GAAG,CACvB,EAEMC,EAAc,CAClB,cAAeD,EACf,QAAS,CACP,aAAc,cACd,UAAW,MACb,CACF,EAEME,EAAsB,CAC1B,WAAY,IAAI,WAAW,CAAC,EAAG,EAAG,CAAC,CAAC,EACpC,aAAc,mBACd,MAAO,YACP,SAAU,eACV,YAAa,CAAE,QAAS,IAAI,WAAW,CAAC,IAAM,GAAI,CAAC,EAAG,eAAgB,CAAE,CAC1E,EAEA,IAAIC,KAEJ,YAAS,8BAA+B,IAAM,IAC5C,cAAW,IAAM,CACf,KAAG,cAAc,EAEjBA,EAAU,CACR,sBAAuB,KACpB,GAAG,EACH,gBAAgB,CAAE,cAAe,gBAAc,MAAO,CAAC,EAC1D,YAAa,KAAG,GAAG,EAAE,kBAAkB,CACrC,OAAQ,sBAAoB,QAC5B,KAAM,CAAE,UAAW,eAAgB,CACrC,CAAC,CACH,CACF,CAAC,KAED,MAAG,+DAAgE,SAAY,CAC5EH,EAAkB,iBAAyB,qBAC1C,SAAME,CAAmB,CAC3B,EAGA,MAAME,EAAS,MADF,IAAI,8BAA4BD,EAASF,CAAW,EACvC,IAAI,KAE9B,UAAOE,EAAQ,WAAW,EAAE,qBAC1B,SAAO,IAAI,qBAAmB,CAChC,KAEA,UAAOH,EAAkB,gBAAgB,EAAE,qBAAqB,CAC9D,cAAe,gBAAc,OAC7B,aAAc,cACd,UAAW,gBACX,UAAW,MACb,CAAC,KAED,UAAOI,CAAM,EAAE,QAAkC,CAC/C,UAAW,gBACX,WAAYF,EAAoB,WAChC,eAAgBA,EAAoB,YACpC,cAAe,CACb,aAAcA,EAAoB,aAClC,MAAOA,EAAoB,MAC3B,SAAUA,EAAoB,QAChC,CACF,CAAC,CACH,CAAC,KAED,MAAG,+CAAgD,SAAY,CAC5DC,EAAQ,YAAoB,kBAAkB,CAC7C,OAAQ,sBAAoB,MAC5B,KAAM,CAAC,CACT,CAAC,EACAH,EAAkB,iBAAyB,qBAC1C,SAAME,CAAmB,CAC3B,EAGA,MAAME,EAAS,MADF,IAAI,8BAA4BD,EAASF,CAAW,EACvC,IAAI,KAE9B,UAAOD,EAAkB,gBAAgB,EAAE,qBAAqB,CAC9D,cAAe,gBAAc,OAC7B,aAAc,cACd,UAAW,OACX,UAAW,MACb,CAAC,KAED,UAAOI,CAAM,EAAE,QAAkC,CAC/C,UAAW,OACX,WAAYF,EAAoB,WAChC,eAAgBA,EAAoB,YACpC,cAAe,CACb,aAAcA,EAAoB,aAClC,MAAOA,EAAoB,MAC3B,SAAUA,EAAoB,QAChC,CACF,CAAC,CACH,CAAC,KAED,MAAG,0CAA2C,SAAY,CACxD,MAAMG,EAAQ,IAAI,MAAM,wBAAwB,EAC/CL,EAAkB,iBAAyB,qBAAkB,QAAKK,CAAK,CAAC,EAEzE,MAAMC,EAAO,IAAI,8BAA4BH,EAASF,CAAW,EAEjE,QAAM,UAAOK,EAAK,IAAI,CAAC,EAAE,QAAQ,QAAQ,wBAAwB,CACnE,CAAC,CACH,CAAC",
6
6
  "names": ["import_device_management_kit", "import_purify_ts", "import_vitest", "import_GetChallengeCommand", "import_BuildTransactionContextTask", "contextModuleMock", "defaultArgs", "domainSolanaPayload", "apiMock", "result", "error", "task"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{DeviceModelId as S,isSuccessCommandResult as g,OpenAppDeviceAction as T,UnknownDAError as s,UserInteractionRequired as a,XStateDeviceAction as A}from"@ledgerhq/device-management-kit";import{Left as m,Right as C}from"purify-ts";import{assign as e,fromPromise as i,setup as y}from"xstate";import{GetAppConfigurationCommand as D}from"../../app-binder/command/GetAppConfigurationCommand";import{SignTransactionCommand as E}from"../../app-binder/command/SignTransactionCommand";import{ApplicationChecker as f}from"../../app-binder/services/ApplicationChecker";import{SolanaTransactionTypes as x,TransactionInspector as v}from"../../app-binder/services/TransactionInspector";import{BuildTransactionContextTask as I}from"../../app-binder/task/BuildTransactionContextTask";import{ProvideSolanaTransactionContextTask as h}from"../../app-binder/task/ProvideTransactionContextTask";import{SignDataTask as k}from"../../app-binder/task/SendSignDataTask";class F extends A{makeStateMachine(r){const{signTransaction:p,getAppConfig:c,buildContext:u,provideContext:l,inspectTransaction:d}=this.extractDependencies(r);return y({types:{input:{},context:{},output:{}},actors:{openAppStateMachine:new T({input:{appName:"Solana"}}).makeStateMachine(r),getAppConfig:i(c),inspectTransaction:i(({input:t})=>d({serializedTransaction:t.transaction})),buildContext:i(u),provideContext:i(l),signTransaction:i(p)},guards:{noInternalError:({context:t})=>t._internalState.error===null,skipOpenApp:({context:t})=>t.input.skipOpenApp,isSPLSupported:({context:t})=>new f(r.getDeviceSessionState(),t._internalState.appConfig).withMinVersionExclusive("1.4.0").excludeDeviceModel(S.NANO_S).check(),isAnSPLTransaction:({context:t})=>t._internalState.inspectorResult?.transactionType===x.SPL},actions:{assignErrorFromEvent:e({_internalState:t=>({...t.context._internalState,error:new s(t.event.error instanceof Error?t.event.error.message:String(t.event.error))})})}}).createMachine({id:"SignTransactionDeviceAction",initial:"InitialState",context:({input:t})=>({input:t,intermediateValue:{requiredUserInteraction:a.None},_internalState:{error:null,signature:null,appConfig:null,solanaTransactionContext:null,inspectorResult:null}}),states:{InitialState:{always:[{target:"GetAppConfig",guard:"skipOpenApp"},{target:"OpenAppDeviceAction"}]},OpenAppDeviceAction:{exit:e({intermediateValue:()=>({requiredUserInteraction:a.None})}),invoke:{id:"openAppStateMachine",src:"openAppStateMachine",input:()=>({appName:"Solana"}),onSnapshot:{actions:e({intermediateValue:({event:t})=>t.snapshot.context.intermediateValue})},onDone:{target:"CheckOpenAppDeviceActionResult",actions:e({_internalState:({event:t,context:n})=>t.output.caseOf({Right:()=>n._internalState,Left:o=>({...n._internalState,error:o})})})}}},CheckOpenAppDeviceActionResult:{always:[{target:"GetAppConfig",guard:"noInternalError"},{target:"Error"}]},GetAppConfig:{entry:e({intermediateValue:()=>({requiredUserInteraction:a.None})}),invoke:{id:"getAppConfig",src:"getAppConfig",onDone:{target:"GetAppConfigResultCheck",actions:e({_internalState:({event:t,context:n})=>g(t.output)?{...n._internalState,appConfig:t.output.data}:{...n._internalState,error:t.output.error}})},onError:{target:"Error",actions:"assignErrorFromEvent"}}},GetAppConfigResultCheck:{always:[{target:"InspectTransaction",guard:"noInternalError"},{target:"Error"}]},InspectTransaction:{invoke:{id:"inspectTransaction",src:"inspectTransaction",input:({context:t})=>({...t.input,serializedTransaction:t.input.transaction}),onDone:{target:"AfterInspect",actions:e({_internalState:({context:t,event:n})=>({...t._internalState,inspectorResult:n.output})})},onError:{target:"Error",actions:"assignErrorFromEvent"}}},AfterInspect:{always:[{target:"BuildContext",guard:"isAnSPLTransaction"},{target:"SignTransaction",guard:"noInternalError"},{target:"Error"}]},BuildContext:{entry:e({intermediateValue:()=>({requiredUserInteraction:a.None})}),invoke:{id:"buildContext",src:"buildContext",input:({context:t})=>{const n=t._internalState.inspectorResult?.data;return{contextModule:t.input.contextModule,options:{tokenAddress:n?.tokenAddress,createATA:n?.createATA}}},onDone:{target:"ProvideContext",actions:[e({_internalState:({event:t,context:n})=>({...n._internalState,solanaTransactionContext:{descriptor:t.output.descriptor,certificate:t.output.calCertificate,tokenAccount:t.output.addressResult.tokenAccount,owner:t.output.addressResult.owner,contract:t.output.addressResult.contract}})})]},onError:{target:"Error",actions:"assignErrorFromEvent"}}},ProvideContext:{entry:e({intermediateValue:()=>({requiredUserInteraction:a.None})}),invoke:{id:"provideContext",src:"provideContext",input:({context:t})=>{if(!t._internalState.solanaTransactionContext)throw new s("Solana transaction context is not available");return t._internalState.solanaTransactionContext},onDone:{target:"ProvideContextResultCheck"},onError:{target:"Error",actions:"assignErrorFromEvent"}}},ProvideContextResultCheck:{always:[{target:"SignTransaction",guard:"noInternalError"},{target:"Error"}]},SignTransaction:{entry:e({intermediateValue:{requiredUserInteraction:a.SignTransaction}}),exit:e({intermediateValue:{requiredUserInteraction:a.None}}),invoke:{id:"signTransaction",src:"signTransaction",input:({context:t})=>({derivationPath:t.input.derivationPath,serializedTransaction:t.input.transaction}),onDone:{target:"SignTransactionResultCheck",actions:[e({_internalState:({event:t,context:n})=>{if(!g(t.output))return{...n._internalState,error:t.output.error};const o=t.output.data.extract();return t.output.data.isJust()&&o instanceof Uint8Array?{...n._internalState,signature:o}:{...n._internalState,error:new s("No Signature available")}}})]},onError:{target:"Error",actions:"assignErrorFromEvent"}}},SignTransactionResultCheck:{always:[{guard:"noInternalError",target:"Success"},{target:"Error"}]},Success:{type:"final"},Error:{type:"final"}},output:({context:t})=>t._internalState.signature?C(t._internalState.signature):m(t._internalState.error||new s("No error or signature available"))})}extractDependencies(r){return{getAppConfig:async()=>r.sendCommand(new D),buildContext:async t=>new I(r,t.input).run(),provideContext:async t=>new h(r,t.input).run(),signTransaction:async t=>new k(r,{commandFactory:n=>new E({serializedTransaction:n.chunkedData,more:n.more,extend:n.extend}),derivationPath:t.input.derivationPath,sendingData:t.input.serializedTransaction}).run(),inspectTransaction:async t=>Promise.resolve(new v(t.serializedTransaction).inspectTransactionType())}}}export{F as SignTransactionDeviceAction};
1
+ import{DeviceModelId as S,isSuccessCommandResult as g,OpenAppDeviceAction as T,UnknownDAError as s,UserInteractionRequired as a,XStateDeviceAction as m}from"@ledgerhq/device-management-kit";import{Left as A,Right as C}from"purify-ts";import{assign as e,fromPromise as i,setup as y}from"xstate";import{GetAppConfigurationCommand as D}from"../../app-binder/command/GetAppConfigurationCommand";import{SignTransactionCommand as f}from"../../app-binder/command/SignTransactionCommand";import{ApplicationChecker as E}from"../../app-binder/services/ApplicationChecker";import{SolanaTransactionTypes as x,TransactionInspector as v}from"../../app-binder/services/TransactionInspector";import{BuildTransactionContextTask as I}from"../../app-binder/task/BuildTransactionContextTask";import{ProvideSolanaTransactionContextTask as h}from"../../app-binder/task/ProvideTransactionContextTask";import{SignDataTask as k}from"../../app-binder/task/SendSignDataTask";class F extends m{makeStateMachine(r){const{signTransaction:p,getAppConfig:c,buildContext:u,provideContext:l,inspectTransaction:d}=this.extractDependencies(r);return y({types:{input:{},context:{},output:{}},actors:{openAppStateMachine:new T({input:{appName:"Solana"}}).makeStateMachine(r),getAppConfig:i(c),inspectTransaction:i(({input:t})=>d({serializedTransaction:t.transaction})),buildContext:i(u),provideContext:i(l),signTransaction:i(p)},guards:{noInternalError:({context:t})=>t._internalState.error===null,skipOpenApp:({context:t})=>t.input.skipOpenApp,isSPLSupported:({context:t})=>new E(r.getDeviceSessionState(),t._internalState.appConfig).withMinVersionExclusive("1.4.0").excludeDeviceModel(S.NANO_S).check(),isAnSPLTransaction:({context:t})=>t._internalState.inspectorResult?.transactionType===x.SPL},actions:{assignErrorFromEvent:e({_internalState:t=>({...t.context._internalState,error:new s(t.event.error instanceof Error?t.event.error.message:String(t.event.error))})})}}).createMachine({id:"SignTransactionDeviceAction",initial:"InitialState",context:({input:t})=>({input:t,intermediateValue:{requiredUserInteraction:a.None},_internalState:{error:null,signature:null,appConfig:null,solanaTransactionContext:null,inspectorResult:null}}),states:{InitialState:{always:[{target:"GetAppConfig",guard:"skipOpenApp"},{target:"OpenAppDeviceAction"}]},OpenAppDeviceAction:{exit:e({intermediateValue:()=>({requiredUserInteraction:a.None})}),invoke:{id:"openAppStateMachine",src:"openAppStateMachine",input:()=>({appName:"Solana"}),onSnapshot:{actions:e({intermediateValue:({event:t})=>t.snapshot.context.intermediateValue})},onDone:{target:"CheckOpenAppDeviceActionResult",actions:e({_internalState:({event:t,context:n})=>t.output.caseOf({Right:()=>n._internalState,Left:o=>({...n._internalState,error:o})})})}}},CheckOpenAppDeviceActionResult:{always:[{target:"GetAppConfig",guard:"noInternalError"},{target:"Error"}]},GetAppConfig:{entry:e({intermediateValue:()=>({requiredUserInteraction:a.None})}),invoke:{id:"getAppConfig",src:"getAppConfig",onDone:{target:"GetAppConfigResultCheck",actions:e({_internalState:({event:t,context:n})=>g(t.output)?{...n._internalState,appConfig:t.output.data}:{...n._internalState,error:t.output.error}})},onError:{target:"Error",actions:"assignErrorFromEvent"}}},GetAppConfigResultCheck:{always:[{target:"InspectTransaction",guard:"noInternalError"},{target:"Error"}]},InspectTransaction:{invoke:{id:"inspectTransaction",src:"inspectTransaction",input:({context:t})=>({...t.input,serializedTransaction:t.input.transaction}),onDone:{target:"AfterInspect",actions:e({_internalState:({context:t,event:n})=>({...t._internalState,inspectorResult:n.output})})},onError:{target:"Error",actions:"assignErrorFromEvent"}}},AfterInspect:{always:[{target:"BuildContext",guard:"isAnSPLTransaction"},{target:"SignTransaction",guard:"noInternalError"},{target:"Error"}]},BuildContext:{entry:e({intermediateValue:()=>({requiredUserInteraction:a.None})}),invoke:{id:"buildContext",src:"buildContext",input:({context:t})=>{const n=t._internalState.inspectorResult?.data;return{contextModule:t.input.contextModule,options:{tokenAddress:n?.tokenAddress,createATA:n?.createATA}}},onDone:{target:"ProvideContext",actions:[e({_internalState:({event:t,context:n})=>({...n._internalState,solanaTransactionContext:{descriptor:t.output.descriptor,certificate:t.output.calCertificate,tokenAccount:t.output.addressResult.tokenAccount,owner:t.output.addressResult.owner,contract:t.output.addressResult.contract}})})]},onError:{target:"Error",actions:"assignErrorFromEvent"}}},ProvideContext:{entry:e({intermediateValue:()=>({requiredUserInteraction:a.None})}),invoke:{id:"provideContext",src:"provideContext",input:({context:t})=>{if(!t._internalState.solanaTransactionContext)throw new s("Solana transaction context is not available");return t._internalState.solanaTransactionContext},onDone:{target:"ProvideContextResultCheck"},onError:{target:"Error",actions:"assignErrorFromEvent"}}},ProvideContextResultCheck:{always:[{target:"SignTransaction",guard:"noInternalError"},{target:"Error"}]},SignTransaction:{entry:e({intermediateValue:{requiredUserInteraction:a.SignTransaction}}),exit:e({intermediateValue:{requiredUserInteraction:a.None}}),invoke:{id:"signTransaction",src:"signTransaction",input:({context:t})=>({derivationPath:t.input.derivationPath,serializedTransaction:t.input.transaction}),onDone:{target:"SignTransactionResultCheck",actions:[e({_internalState:({event:t,context:n})=>{if(!g(t.output))return{...n._internalState,error:t.output.error};const o=t.output.data.extract();return t.output.data.isJust()&&o instanceof Uint8Array?{...n._internalState,signature:o}:{...n._internalState,error:new s("No Signature available")}}})]},onError:{target:"Error",actions:"assignErrorFromEvent"}}},SignTransactionResultCheck:{always:[{guard:"noInternalError",target:"Success"},{target:"Error"}]},Success:{type:"final"},Error:{type:"final"}},output:({context:t})=>t._internalState.signature?C(t._internalState.signature):A(t._internalState.error||new s("No error or signature available"))})}extractDependencies(r){return{getAppConfig:async()=>r.sendCommand(new D),buildContext:async t=>new I(r,t.input).run(),provideContext:async t=>new h(r,t.input).run(),signTransaction:async t=>new k(r,{commandFactory:n=>new f({serializedTransaction:n.chunkedData,more:n.more,extend:n.extend}),derivationPath:t.input.derivationPath,sendingData:t.input.serializedTransaction}).run(),inspectTransaction:async t=>Promise.resolve(new v(t.serializedTransaction).inspectTransactionType())}}}export{F as SignTransactionDeviceAction};
2
2
  //# sourceMappingURL=SignTransactionDeviceAction.js.map