@ledgerhq/context-module 0.0.0-develop-20260917001250 → 0.0.0-develop-20260919001346

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 (139) hide show
  1. package/lib/cjs/package.json +1 -1
  2. package/lib/cjs/src/DefaultContextModule.js +1 -1
  3. package/lib/cjs/src/DefaultContextModule.js.map +3 -3
  4. package/lib/cjs/src/di.js +1 -1
  5. package/lib/cjs/src/di.js.map +3 -3
  6. package/lib/cjs/src/index.js +1 -1
  7. package/lib/cjs/src/index.js.map +2 -2
  8. package/lib/cjs/src/modules/multichain/reporter/model/BlindSigningEvent.js +1 -1
  9. package/lib/cjs/src/modules/multichain/reporter/model/BlindSigningEvent.js.map +2 -2
  10. package/lib/cjs/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.test.js +1 -1
  11. package/lib/cjs/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.test.js.map +2 -2
  12. package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoDto.js +1 -1
  13. package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoDto.js.map +3 -3
  14. package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoMapper.js +1 -1
  15. package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoMapper.js.map +3 -3
  16. package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoMapper.test.js +1 -1
  17. package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoMapper.test.js.map +2 -2
  18. package/lib/cjs/src/modules/solana/model/SolanaClearSignContext.js +1 -1
  19. package/lib/cjs/src/modules/solana/model/SolanaClearSignContext.js.map +2 -2
  20. package/lib/cjs/src/modules/solana/model/SolanaPayloads.js +1 -1
  21. package/lib/cjs/src/modules/solana/model/SolanaPayloads.js.map +2 -2
  22. package/lib/cjs/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.js +1 -1
  23. package/lib/cjs/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.js.map +3 -3
  24. package/lib/cjs/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.test.js +1 -1
  25. package/lib/cjs/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.test.js.map +3 -3
  26. package/lib/cjs/src/modules/tron/model/TronTransactionContext.js +2 -0
  27. package/lib/cjs/src/modules/tron/model/TronTransactionContext.js.map +7 -0
  28. package/lib/cjs/src/modules/tron/token/data/HttpTokenDataSource.js +2 -0
  29. package/lib/cjs/src/modules/tron/token/data/HttpTokenDataSource.js.map +7 -0
  30. package/lib/cjs/src/modules/tron/token/data/HttpTokenDataSource.test.js +2 -0
  31. package/lib/cjs/src/modules/tron/token/data/HttpTokenDataSource.test.js.map +7 -0
  32. package/lib/cjs/src/modules/tron/token/data/TokenDataSource.js +2 -0
  33. package/lib/cjs/src/modules/tron/token/data/TokenDataSource.js.map +7 -0
  34. package/lib/cjs/src/modules/tron/token/di/tokenModuleFactory.js +2 -0
  35. package/lib/cjs/src/modules/tron/token/di/tokenModuleFactory.js.map +7 -0
  36. package/lib/cjs/src/modules/tron/token/di/tokenTypes.js +2 -0
  37. package/lib/cjs/src/modules/tron/token/di/tokenTypes.js.map +7 -0
  38. package/lib/cjs/src/modules/tron/token/domain/TokenContextLoader.js +2 -0
  39. package/lib/cjs/src/modules/tron/token/domain/TokenContextLoader.js.map +7 -0
  40. package/lib/cjs/src/modules/tron/token/domain/TokenContextLoader.test.js +2 -0
  41. package/lib/cjs/src/modules/tron/token/domain/TokenContextLoader.test.js.map +7 -0
  42. package/lib/cjs/src/modules/tron/token/domain/parseTrc10AssetId.js +2 -0
  43. package/lib/cjs/src/modules/tron/token/domain/parseTrc10AssetId.js.map +7 -0
  44. package/lib/cjs/src/modules/tron/token/domain/parseTrc10AssetId.test.js +2 -0
  45. package/lib/cjs/src/modules/tron/token/domain/parseTrc10AssetId.test.js.map +7 -0
  46. package/lib/cjs/src/shared/domain/ContextModuleChainID.js +1 -1
  47. package/lib/cjs/src/shared/domain/ContextModuleChainID.js.map +2 -2
  48. package/lib/cjs/src/shared/model/ClearSignContext.js +1 -1
  49. package/lib/cjs/src/shared/model/ClearSignContext.js.map +2 -2
  50. package/lib/esm/package.json +1 -1
  51. package/lib/esm/src/DefaultContextModule.js +1 -1
  52. package/lib/esm/src/DefaultContextModule.js.map +3 -3
  53. package/lib/esm/src/di.js +1 -1
  54. package/lib/esm/src/di.js.map +3 -3
  55. package/lib/esm/src/index.js +1 -1
  56. package/lib/esm/src/index.js.map +2 -2
  57. package/lib/esm/src/modules/multichain/reporter/model/BlindSigningEvent.js +1 -1
  58. package/lib/esm/src/modules/multichain/reporter/model/BlindSigningEvent.js.map +2 -2
  59. package/lib/esm/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.test.js +1 -1
  60. package/lib/esm/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.test.js.map +2 -2
  61. package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoDto.js +1 -1
  62. package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoDto.js.map +3 -3
  63. package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoMapper.js +1 -1
  64. package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoMapper.js.map +3 -3
  65. package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoMapper.test.js +1 -1
  66. package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoMapper.test.js.map +3 -3
  67. package/lib/esm/src/modules/solana/model/SolanaClearSignContext.js +1 -1
  68. package/lib/esm/src/modules/solana/model/SolanaClearSignContext.js.map +2 -2
  69. package/lib/esm/src/modules/solana/model/SolanaPayloads.js.map +2 -2
  70. package/lib/esm/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.js +1 -1
  71. package/lib/esm/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.js.map +3 -3
  72. package/lib/esm/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.test.js +1 -1
  73. package/lib/esm/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.test.js.map +3 -3
  74. package/lib/esm/src/modules/tron/model/TronTransactionContext.js +1 -0
  75. package/lib/esm/src/modules/tron/model/TronTransactionContext.js.map +7 -0
  76. package/lib/esm/src/modules/tron/token/data/HttpTokenDataSource.js +2 -0
  77. package/lib/esm/src/modules/tron/token/data/HttpTokenDataSource.js.map +7 -0
  78. package/lib/esm/src/modules/tron/token/data/HttpTokenDataSource.test.js +2 -0
  79. package/lib/esm/src/modules/tron/token/data/HttpTokenDataSource.test.js.map +7 -0
  80. package/lib/esm/src/modules/tron/token/data/TokenDataSource.js +2 -0
  81. package/lib/esm/src/modules/tron/token/data/TokenDataSource.js.map +7 -0
  82. package/lib/esm/src/modules/tron/token/di/tokenModuleFactory.js +2 -0
  83. package/lib/esm/src/modules/tron/token/di/tokenModuleFactory.js.map +7 -0
  84. package/lib/esm/src/modules/tron/token/di/tokenTypes.js +2 -0
  85. package/lib/esm/src/modules/tron/token/di/tokenTypes.js.map +7 -0
  86. package/lib/esm/src/modules/tron/token/domain/TokenContextLoader.js +2 -0
  87. package/lib/esm/src/modules/tron/token/domain/TokenContextLoader.js.map +7 -0
  88. package/lib/esm/src/modules/tron/token/domain/TokenContextLoader.test.js +2 -0
  89. package/lib/esm/src/modules/tron/token/domain/TokenContextLoader.test.js.map +7 -0
  90. package/lib/esm/src/modules/tron/token/domain/parseTrc10AssetId.js +2 -0
  91. package/lib/esm/src/modules/tron/token/domain/parseTrc10AssetId.js.map +7 -0
  92. package/lib/esm/src/modules/tron/token/domain/parseTrc10AssetId.test.js +2 -0
  93. package/lib/esm/src/modules/tron/token/domain/parseTrc10AssetId.test.js.map +7 -0
  94. package/lib/esm/src/shared/domain/ContextModuleChainID.js +1 -1
  95. package/lib/esm/src/shared/domain/ContextModuleChainID.js.map +2 -2
  96. package/lib/esm/src/shared/model/ClearSignContext.js +1 -1
  97. package/lib/esm/src/shared/model/ClearSignContext.js.map +2 -2
  98. package/lib/types/src/DefaultContextModule.d.ts.map +1 -1
  99. package/lib/types/src/di.d.ts.map +1 -1
  100. package/lib/types/src/index.d.ts +1 -0
  101. package/lib/types/src/index.d.ts.map +1 -1
  102. package/lib/types/src/modules/multichain/reporter/model/BlindSigningEvent.d.ts +1 -0
  103. package/lib/types/src/modules/multichain/reporter/model/BlindSigningEvent.d.ts.map +1 -1
  104. package/lib/types/src/modules/solana/instruction-info/data/InstructionInfoDto.d.ts +27 -0
  105. package/lib/types/src/modules/solana/instruction-info/data/InstructionInfoDto.d.ts.map +1 -1
  106. package/lib/types/src/modules/solana/instruction-info/data/InstructionInfoMapper.d.ts +3 -2
  107. package/lib/types/src/modules/solana/instruction-info/data/InstructionInfoMapper.d.ts.map +1 -1
  108. package/lib/types/src/modules/solana/model/SolanaClearSignContext.d.ts +1 -1
  109. package/lib/types/src/modules/solana/model/SolanaClearSignContext.d.ts.map +1 -1
  110. package/lib/types/src/modules/solana/model/SolanaPayloads.d.ts +15 -0
  111. package/lib/types/src/modules/solana/model/SolanaPayloads.d.ts.map +1 -1
  112. package/lib/types/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.d.ts +3 -2
  113. package/lib/types/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.d.ts.map +1 -1
  114. package/lib/types/src/modules/tron/model/TronTransactionContext.d.ts +5 -0
  115. package/lib/types/src/modules/tron/model/TronTransactionContext.d.ts.map +1 -0
  116. package/lib/types/src/modules/tron/token/data/HttpTokenDataSource.d.ts +17 -0
  117. package/lib/types/src/modules/tron/token/data/HttpTokenDataSource.d.ts.map +1 -0
  118. package/lib/types/src/modules/tron/token/data/HttpTokenDataSource.test.d.ts +2 -0
  119. package/lib/types/src/modules/tron/token/data/HttpTokenDataSource.test.d.ts.map +1 -0
  120. package/lib/types/src/modules/tron/token/data/TokenDataSource.d.ts +20 -0
  121. package/lib/types/src/modules/tron/token/data/TokenDataSource.d.ts.map +1 -0
  122. package/lib/types/src/modules/tron/token/di/tokenModuleFactory.d.ts +3 -0
  123. package/lib/types/src/modules/tron/token/di/tokenModuleFactory.d.ts.map +1 -0
  124. package/lib/types/src/modules/tron/token/di/tokenTypes.d.ts +5 -0
  125. package/lib/types/src/modules/tron/token/di/tokenTypes.d.ts.map +1 -0
  126. package/lib/types/src/modules/tron/token/domain/TokenContextLoader.d.ts +16 -0
  127. package/lib/types/src/modules/tron/token/domain/TokenContextLoader.d.ts.map +1 -0
  128. package/lib/types/src/modules/tron/token/domain/TokenContextLoader.test.d.ts +2 -0
  129. package/lib/types/src/modules/tron/token/domain/TokenContextLoader.test.d.ts.map +1 -0
  130. package/lib/types/src/modules/tron/token/domain/parseTrc10AssetId.d.ts +16 -0
  131. package/lib/types/src/modules/tron/token/domain/parseTrc10AssetId.d.ts.map +1 -0
  132. package/lib/types/src/modules/tron/token/domain/parseTrc10AssetId.test.d.ts +2 -0
  133. package/lib/types/src/modules/tron/token/domain/parseTrc10AssetId.test.d.ts.map +1 -0
  134. package/lib/types/src/shared/domain/ContextModuleChainID.d.ts +2 -1
  135. package/lib/types/src/shared/domain/ContextModuleChainID.d.ts.map +1 -1
  136. package/lib/types/src/shared/model/ClearSignContext.d.ts +2 -1
  137. package/lib/types/src/shared/model/ClearSignContext.d.ts.map +1 -1
  138. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  139. package/package.json +6 -6
@@ -1,2 +1,2 @@
1
- "use strict";var s=Object.defineProperty;var S=Object.getOwnPropertyDescriptor;var I=Object.getOwnPropertyNames;var w=Object.prototype.hasOwnProperty;var x=(n,t)=>{for(var e in t)s(n,e,{get:t[e],enumerable:!0})},g=(n,t,e,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of I(t))!w.call(n,a)&&a!==e&&s(n,a,{get:()=>t[a],enumerable:!(o=S(t,a))||o.enumerable});return n};var R=n=>g(s({},"__esModule",{value:!0}),n);var V={};x(V,{toAccountResets:()=>_,toDisplayFields:()=>y,toHideRules:()=>f,toInstructionInfoPayload:()=>F,toOwnerAssociations:()=>C,toProgramEnumVariants:()=>A,toValueFlowPorts:()=>d});module.exports=R(V);var i=require("purify-ts"),r=require("../../../../modules/solana/model/SolanaPayloads"),l=require("../../../../shared/utils/uIntCodec");function p(n,t){return n[t]}function d(n=[]){return n.map(t=>({account_indices:t.account_indices,optional_account_strategy:t.optional_account_strategy,token_value:t.token_value,active_when:t.active_when}))}function _(n=[]){return n.flatMap(t=>t.account_index===void 0?[]:[{account_index:t.account_index,require_pre_balance_zero:t.require_pre_balance_zero}])}function f(n=[]){return n.map(t=>({rule_set_index:t.rule_set_index,target:t.target,condition:t.condition}))}function C(n){return n===void 0?[]:n.account_index===void 0||n.owner===void 0?[]:[{account_index:n.account_index,owner:n.owner}]}function y(n=[]){return n.map(t=>({name:t.name,param:t.param??{type:""}}))}function E(n){return[...(n.display_fields??[]).map(t=>({kind:r.SolanaInstructionSubstructureKind.DISPLAY_FIELD,data:t.descriptor})),...(n.value_flow_ports??[]).map(t=>({kind:r.SolanaInstructionSubstructureKind.VALUE_FLOW_PORT,data:t.descriptor})),...(n.hide_rules??[]).map(t=>({kind:r.SolanaInstructionSubstructureKind.HIDE_RULE,data:t.descriptor})),...(n.account_resets??[]).map(t=>({kind:r.SolanaInstructionSubstructureKind.ACCOUNT_RESET,data:t.descriptor}))]}function m(n,t){const e=[];for(const[o,a]of Object.entries(n.enum_variants??{}))for(const[D,u]of Object.entries(a)){const c=Number(D);l.u16Codec.decode(c).isLeft()||e.push({enumId:o,variantIndex:c,descriptor:{data:u.descriptor.data,signature:p(u.descriptor.signatures,t)??""}})}return e}function A(n,t){return Object.values(n).flatMap(e=>m(e,t))}function F(n,t,e,o){const a=p(e.descriptor.signatures,o);return a?(0,i.Right)({programId:n,discriminator:t,instructionName:e.instruction_name,instructionInfo:{data:e.descriptor.data,signature:a},substructures:E(e),enumVariants:m(e,o),idlDescriptor:{typePool:e.idl_descriptor?.type_pool??[],rootType:e.idl_descriptor?.root_type??0},mintAssociations:e.mint_association?[e.mint_association]:[],ownerAssociations:C(e.owner_association),valueFlowPorts:d(e.value_flow_ports),accountResets:_(e.account_resets),displayFields:y(e.display_fields),hideRules:f(e.hide_rules)}):(0,i.Left)(new Error(`[ContextModule] InstructionInfoDataSource: missing '${o}' signature for (${n}, ${t})`))}0&&(module.exports={toAccountResets,toDisplayFields,toHideRules,toInstructionInfoPayload,toOwnerAssociations,toProgramEnumVariants,toValueFlowPorts});
1
+ "use strict";var s=Object.defineProperty;var w=Object.getOwnPropertyDescriptor;var g=Object.getOwnPropertyNames;var R=Object.prototype.hasOwnProperty;var x=(n,t)=>{for(var a in t)s(n,a,{get:t[a],enumerable:!0})},A=(n,t,a,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let e of g(t))!R.call(n,e)&&e!==a&&s(n,e,{get:()=>t[e],enumerable:!(o=w(t,e))||o.enumerable});return n};var b=n=>A(s({},"__esModule",{value:!0}),n);var F={};x(F,{toAccountResets:()=>S,toAccountSchema:()=>y,toDisplayFields:()=>D,toHideRules:()=>f,toInstructionInfoPayload:()=>V,toOwnerAssociations:()=>m,toProgramEnumVariants:()=>v,toValueFlowPorts:()=>C});module.exports=b(F);var r=require("purify-ts"),i=require("../../../../modules/solana/model/SolanaPayloads"),_=require("../../../../shared/utils/uIntCodec");function d(n,t){return n[t]}function C(n=[]){return n.map(t=>({account_indices:t.account_indices,optional_account_strategy:t.optional_account_strategy,token_value:t.token_value,active_when:t.active_when}))}function S(n=[]){return n.flatMap(t=>t.account_index===void 0?[]:[{account_index:t.account_index,require_pre_balance_zero:t.require_pre_balance_zero,value_kind:t.value_kind,token:t.token,require_native_pre_balance_zero:t.require_native_pre_balance_zero}])}function f(n=[]){return n.map(t=>({rule_set_index:t.rule_set_index,target:t.target,condition:t.condition}))}function m(n){return n===void 0?[]:n.account_index===void 0||n.owner===void 0?[]:[{account_index:n.account_index,owner:n.owner}]}const l=new Set(["FORBIDDEN","EITHER","REQUIRED"]);function p(n){const t=l.has(n.signer)?n.signer:"EITHER",a=l.has(n.writable)?n.writable:"EITHER";return{signer:t,writable:a}}function y(n){if(n!==void 0)return{count_min:n.count_min??0,count_max:n.count_max??255,remaining_policy:n.remaining_policy?p(n.remaining_policy):{signer:"EITHER",writable:"EITHER"},slots:(n.slots??[]).map(p)}}function D(n=[]){return n.map(t=>({name:t.name,param:t.param??{type:""}}))}function h(n){return[...(n.display_fields??[]).map(t=>({kind:i.SolanaInstructionSubstructureKind.DISPLAY_FIELD,data:t.descriptor})),...(n.value_flow_ports??[]).map(t=>({kind:i.SolanaInstructionSubstructureKind.VALUE_FLOW_PORT,data:t.descriptor})),...(n.hide_rules??[]).map(t=>({kind:i.SolanaInstructionSubstructureKind.HIDE_RULE,data:t.descriptor})),...(n.account_resets??[]).map(t=>({kind:i.SolanaInstructionSubstructureKind.ACCOUNT_RESET,data:t.descriptor}))]}function I(n,t){const a=[];for(const[o,e]of Object.entries(n.enum_variants??{}))for(const[E,c]of Object.entries(e)){const u=Number(E);_.u16Codec.decode(u).isLeft()||a.push({enumId:o,variantIndex:u,descriptor:{data:c.descriptor.data,signature:d(c.descriptor.signatures,t)??""}})}return a}function v(n,t){return Object.values(n).flatMap(a=>I(a,t))}function V(n,t,a,o){const e=d(a.descriptor.signatures,o);return e?(0,r.Right)({programId:n,discriminator:t,instructionName:a.instruction_name,instructionInfo:{data:a.descriptor.data,signature:e},substructures:h(a),enumVariants:I(a,o),idlDescriptor:{typePool:a.idl_descriptor?.type_pool??[],rootType:a.idl_descriptor?.root_type??0},mintAssociations:a.mint_association?[a.mint_association]:[],ownerAssociations:m(a.owner_association),valueFlowPorts:C(a.value_flow_ports),accountResets:S(a.account_resets),displayFields:D(a.display_fields),hideRules:f(a.hide_rules),accountSchema:y(a.account_schema)}):(0,r.Left)(new Error(`[ContextModule] InstructionInfoDataSource: missing '${o}' signature for (${n}, ${t})`))}0&&(module.exports={toAccountResets,toAccountSchema,toDisplayFields,toHideRules,toInstructionInfoPayload,toOwnerAssociations,toProgramEnumVariants,toValueFlowPorts});
2
2
  //# sourceMappingURL=InstructionInfoMapper.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/modules/solana/instruction-info/data/InstructionInfoMapper.ts"],
4
- "sourcesContent": ["// Maps the validated CAL instruction-descriptor DTOs into the core\n// `SolanaInstructionInfoPayload` model. Keeping this in the data layer means\n// the domain `InstructionInfoContextLoader` never has to know the CAL DTO\n// shapes \u2014 it consumes core models only.\n\nimport { type Either, Left, Right } from \"purify-ts\";\n\nimport {\n type SolanaCalAccountReset,\n type SolanaCalDisplayField,\n type SolanaCalHideRule,\n type SolanaCalOwnerAssociation,\n type SolanaCalValueFlowPort,\n type SolanaInstructionEnumVariant,\n type SolanaInstructionInfoPayload,\n type SolanaInstructionSubstructure,\n SolanaInstructionSubstructureKind,\n} from \"@/modules/solana/model/SolanaPayloads\";\nimport { u16Codec } from \"@/shared/utils/uIntCodec\";\n\nimport {\n type CalAccountResetDto,\n type CalDisplayFieldDto,\n type CalHideRuleDto,\n type CalInstructionDescriptorDto,\n type CalOwnerAssociationDto,\n type CalSignatures,\n type CalValueFlowPortDto,\n} from \"./InstructionInfoDto\";\n\nexport type CalMode = \"prod\" | \"test\";\n\nfunction pickSignature(\n signatures: CalSignatures,\n mode: CalMode,\n): string | undefined {\n return signatures[mode];\n}\n\n// --- DTO \u2192 decoded-payload projections. Pick only the fields the host-side\n// requirement builder reads, dropping the signed-TLV `descriptor` carried by\n// the DTO. ---\n\nexport function toValueFlowPorts(\n dtos: CalValueFlowPortDto[] = [],\n): SolanaCalValueFlowPort[] {\n return dtos.map((port) => ({\n account_indices: port.account_indices,\n optional_account_strategy: port.optional_account_strategy,\n token_value: port.token_value,\n active_when: port.active_when,\n }));\n}\n\nexport function toAccountResets(\n dtos: CalAccountResetDto[] = [],\n): SolanaCalAccountReset[] {\n // Drop malformed resets (missing account_index) rather than defaulting to\n // slot 0, which would create an unintended TOKEN_ACCOUNT_STATE requirement.\n return dtos.flatMap((reset) =>\n reset.account_index === undefined\n ? []\n : [\n {\n account_index: reset.account_index,\n require_pre_balance_zero: reset.require_pre_balance_zero,\n },\n ],\n );\n}\n\n/**\n * Every rule is carried, including one CAL served without a `condition`. The\n * rule's signed TLV goes to the device through {@link toSubstructures}\n * regardless, and the device resolves the `target` of every rule it receives \u2014\n * so dropping the entry here would cost the host the `ALT_RESOLUTION` for that\n * target and make the device refuse to sign. A missing condition only means no\n * requirement keys off this rule's predicate.\n */\nexport function toHideRules(dtos: CalHideRuleDto[] = []): SolanaCalHideRule[] {\n return dtos.map((rule) => ({\n rule_set_index: rule.rule_set_index,\n target: rule.target,\n condition: rule.condition,\n }));\n}\n\n/**\n * CAL carries at most one `owner_association` per descriptor; the payload holds\n * a list so the transaction-wide owner map is built the same way as the mint\n * map. Both halves of the pair are required (spec: \"must both be present or\n * both absent\"), so a half-declared association is dropped.\n */\nexport function toOwnerAssociations(\n dto: CalOwnerAssociationDto | undefined,\n): SolanaCalOwnerAssociation[] {\n if (dto === undefined) return [];\n if (dto.account_index === undefined || dto.owner === undefined) return [];\n return [{ account_index: dto.account_index, owner: dto.owner }];\n}\n\nexport function toDisplayFields(\n dtos: CalDisplayFieldDto[] = [],\n): SolanaCalDisplayField[] {\n return dtos.map((field) => ({\n name: field.name,\n param: field.param ?? { type: \"\" },\n }));\n}\n\nfunction toSubstructures(\n dto: CalInstructionDescriptorDto,\n): SolanaInstructionSubstructure[] {\n return [\n ...(dto.display_fields ?? []).map((s) => ({\n kind: SolanaInstructionSubstructureKind.DISPLAY_FIELD,\n data: s.descriptor,\n })),\n ...(dto.value_flow_ports ?? []).map((s) => ({\n kind: SolanaInstructionSubstructureKind.VALUE_FLOW_PORT,\n data: s.descriptor,\n })),\n ...(dto.hide_rules ?? []).map((s) => ({\n kind: SolanaInstructionSubstructureKind.HIDE_RULE,\n data: s.descriptor,\n })),\n ...(dto.account_resets ?? []).map((s) => ({\n kind: SolanaInstructionSubstructureKind.ACCOUNT_RESET,\n data: s.descriptor,\n })),\n ];\n}\n\n/**\n * Flatten the CAL-bundled enum variants (keyed enumId \u2192 variantIndex). Keys\n * that don't validate as a u16 are skipped rather than leaking NaN/out-of-range\n * indices into the payload.\n */\nfunction toEnumVariants(\n dto: CalInstructionDescriptorDto,\n mode: CalMode,\n): SolanaInstructionEnumVariant[] {\n const enumVariants: SolanaInstructionEnumVariant[] = [];\n for (const [enumId, variants] of Object.entries(dto.enum_variants ?? {})) {\n for (const [variantIndex, variant] of Object.entries(variants)) {\n const index = Number(variantIndex);\n if (u16Codec.decode(index).isLeft()) {\n continue;\n }\n enumVariants.push({\n enumId,\n variantIndex: index,\n descriptor: {\n data: variant.descriptor.data,\n signature: pickSignature(variant.descriptor.signatures, mode) ?? \"\",\n },\n });\n }\n }\n return enumVariants;\n}\n\n/**\n * Flatten the enum variants of every descriptor in a program into a single\n * list. CAL nests `enum_variants` inside each instruction descriptor but\n * guarantees `(enumId, variantIndex)` is unique across a program, so the enum\n * loader resolves a selection against this program-level list \u2014 independently\n * of whether any individual instruction descriptor carried a usable signature.\n */\nexport function toProgramEnumVariants(\n descriptors: Record<string, CalInstructionDescriptorDto>,\n mode: CalMode,\n): SolanaInstructionEnumVariant[] {\n return Object.values(descriptors).flatMap((dto) => toEnumVariants(dto, mode));\n}\n\n/**\n * Transform one validated CAL descriptor DTO into the core\n * {@link SolanaInstructionInfoPayload}. Returns a `Left` when the descriptor is\n * unusable (no signature for the configured `mode`), so the caller can surface\n * a per-descriptor ERROR rather than emitting an empty signature.\n *\n * `programId` comes from the enclosing `solana_programs` envelope `id`;\n * `discriminator` from the instruction's `discriminator_hex`.\n */\nexport function toInstructionInfoPayload(\n programId: string,\n discriminator: string,\n dto: CalInstructionDescriptorDto,\n mode: CalMode,\n): Either<Error, SolanaInstructionInfoPayload> {\n const signature = pickSignature(dto.descriptor.signatures, mode);\n if (!signature) {\n return Left(\n new Error(\n `[ContextModule] InstructionInfoDataSource: missing '${mode}' signature for (${programId}, ${discriminator})`,\n ),\n );\n }\n\n return Right({\n programId,\n discriminator,\n instructionName: dto.instruction_name,\n instructionInfo: {\n data: dto.descriptor.data,\n signature,\n },\n substructures: toSubstructures(dto),\n enumVariants: toEnumVariants(dto, mode),\n idlDescriptor: {\n typePool: dto.idl_descriptor?.type_pool ?? [],\n rootType: dto.idl_descriptor?.root_type ?? 0,\n },\n mintAssociations: dto.mint_association ? [dto.mint_association] : [],\n ownerAssociations: toOwnerAssociations(dto.owner_association),\n valueFlowPorts: toValueFlowPorts(dto.value_flow_ports),\n accountResets: toAccountResets(dto.account_resets),\n displayFields: toDisplayFields(dto.display_fields),\n hideRules: toHideRules(dto.hide_rules),\n });\n}\n"],
5
- "mappings": "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",
6
- "names": ["InstructionInfoMapper_exports", "__export", "toAccountResets", "toDisplayFields", "toHideRules", "toInstructionInfoPayload", "toOwnerAssociations", "toProgramEnumVariants", "toValueFlowPorts", "__toCommonJS", "import_purify_ts", "import_SolanaPayloads", "import_uIntCodec", "pickSignature", "signatures", "mode", "dtos", "port", "reset", "rule", "dto", "field", "toSubstructures", "s", "toEnumVariants", "enumVariants", "enumId", "variants", "variantIndex", "variant", "index", "descriptors", "programId", "discriminator", "signature"]
4
+ "sourcesContent": ["// Maps the validated CAL instruction-descriptor DTOs into the core\n// `SolanaInstructionInfoPayload` model. Keeping this in the data layer means\n// the domain `InstructionInfoContextLoader` never has to know the CAL DTO\n// shapes \u2014 it consumes core models only.\n\nimport { type Either, Left, Right } from \"purify-ts\";\n\nimport {\n type SolanaCalAccountReset,\n type SolanaCalAccountSchema,\n type SolanaCalDisplayField,\n type SolanaCalHideRule,\n type SolanaCalOwnerAssociation,\n type SolanaCalSlotConstraint,\n type SolanaCalValueFlowPort,\n type SolanaInstructionEnumVariant,\n type SolanaInstructionInfoPayload,\n type SolanaInstructionSubstructure,\n SolanaInstructionSubstructureKind,\n} from \"@/modules/solana/model/SolanaPayloads\";\nimport { u16Codec } from \"@/shared/utils/uIntCodec\";\n\nimport {\n type CalAccountResetDto,\n type CalAccountSchemaDto,\n type CalDisplayFieldDto,\n type CalHideRuleDto,\n type CalInstructionDescriptorDto,\n type CalOwnerAssociationDto,\n type CalSignatures,\n type CalSlotConstraintDto,\n type CalValueFlowPortDto,\n} from \"./InstructionInfoDto\";\n\nexport type CalMode = \"prod\" | \"test\";\n\nfunction pickSignature(\n signatures: CalSignatures,\n mode: CalMode,\n): string | undefined {\n return signatures[mode];\n}\n\n// --- DTO \u2192 decoded-payload projections. Pick only the fields the host-side\n// requirement builder reads, dropping the signed-TLV `descriptor` carried by\n// the DTO. ---\n\nexport function toValueFlowPorts(\n dtos: CalValueFlowPortDto[] = [],\n): SolanaCalValueFlowPort[] {\n return dtos.map((port) => ({\n account_indices: port.account_indices,\n optional_account_strategy: port.optional_account_strategy,\n token_value: port.token_value,\n active_when: port.active_when,\n }));\n}\n\nexport function toAccountResets(\n dtos: CalAccountResetDto[] = [],\n): SolanaCalAccountReset[] {\n // Drop malformed resets (missing account_index) rather than defaulting to\n // slot 0, which would create an unintended TOKEN_ACCOUNT_STATE requirement.\n return dtos.flatMap((reset) =>\n reset.account_index === undefined\n ? []\n : [\n {\n account_index: reset.account_index,\n require_pre_balance_zero: reset.require_pre_balance_zero,\n value_kind: reset.value_kind,\n token: reset.token,\n require_native_pre_balance_zero:\n reset.require_native_pre_balance_zero,\n },\n ],\n );\n}\n\n/**\n * Every rule is carried, including one CAL served without a `condition`. The\n * rule's signed TLV goes to the device through {@link toSubstructures}\n * regardless, and the device resolves the `target` of every rule it receives \u2014\n * so dropping the entry here would cost the host the `ALT_RESOLUTION` for that\n * target and make the device refuse to sign. A missing condition only means no\n * requirement keys off this rule's predicate.\n */\nexport function toHideRules(dtos: CalHideRuleDto[] = []): SolanaCalHideRule[] {\n return dtos.map((rule) => ({\n rule_set_index: rule.rule_set_index,\n target: rule.target,\n condition: rule.condition,\n }));\n}\n\n/**\n * CAL carries at most one `owner_association` per descriptor; the payload holds\n * a list so the transaction-wide owner map is built the same way as the mint\n * map. Both halves of the pair are required (spec: \"must both be present or\n * both absent\"), so a half-declared association is dropped.\n */\nexport function toOwnerAssociations(\n dto: CalOwnerAssociationDto | undefined,\n): SolanaCalOwnerAssociation[] {\n if (dto === undefined) return [];\n if (dto.account_index === undefined || dto.owner === undefined) return [];\n return [{ account_index: dto.account_index, owner: dto.owner }];\n}\n\nconst VALID_CONSTRAINT_VALUES = new Set([\"FORBIDDEN\", \"EITHER\", \"REQUIRED\"]);\n\n/**\n * Unlike `value_kind` on `ACCOUNT_RESET` (an unknown value is a decode\n * error), an unknown/missing `signer` or `writable` here deliberately fails\n * open to `\"EITHER\"` \u2014 i.e. that slot is left unchecked rather than the whole\n * descriptor rejected. ACCOUNT_SCHEMA is only a host-side optimization (the\n * device is the authority at FINALIZE), so the worst outcome of a malformed\n * value is a missed early exit, not an incorrect signature.\n */\nfunction toSlotConstraint(dto: CalSlotConstraintDto): SolanaCalSlotConstraint {\n const signer = VALID_CONSTRAINT_VALUES.has(dto.signer)\n ? (dto.signer as SolanaCalSlotConstraint[\"signer\"])\n : \"EITHER\";\n const writable = VALID_CONSTRAINT_VALUES.has(dto.writable)\n ? (dto.writable as SolanaCalSlotConstraint[\"writable\"])\n : \"EITHER\";\n return { signer, writable };\n}\n\nexport function toAccountSchema(\n dto: CalAccountSchemaDto | undefined,\n): SolanaCalAccountSchema | undefined {\n if (dto === undefined) return undefined;\n return {\n count_min: dto.count_min ?? 0,\n count_max: dto.count_max ?? 255,\n remaining_policy: dto.remaining_policy\n ? toSlotConstraint(dto.remaining_policy)\n : { signer: \"EITHER\", writable: \"EITHER\" },\n slots: (dto.slots ?? []).map(toSlotConstraint),\n };\n}\n\nexport function toDisplayFields(\n dtos: CalDisplayFieldDto[] = [],\n): SolanaCalDisplayField[] {\n return dtos.map((field) => ({\n name: field.name,\n param: field.param ?? { type: \"\" },\n }));\n}\n\nfunction toSubstructures(\n dto: CalInstructionDescriptorDto,\n): SolanaInstructionSubstructure[] {\n return [\n ...(dto.display_fields ?? []).map((s) => ({\n kind: SolanaInstructionSubstructureKind.DISPLAY_FIELD,\n data: s.descriptor,\n })),\n ...(dto.value_flow_ports ?? []).map((s) => ({\n kind: SolanaInstructionSubstructureKind.VALUE_FLOW_PORT,\n data: s.descriptor,\n })),\n ...(dto.hide_rules ?? []).map((s) => ({\n kind: SolanaInstructionSubstructureKind.HIDE_RULE,\n data: s.descriptor,\n })),\n ...(dto.account_resets ?? []).map((s) => ({\n kind: SolanaInstructionSubstructureKind.ACCOUNT_RESET,\n data: s.descriptor,\n })),\n ];\n}\n\n/**\n * Flatten the CAL-bundled enum variants (keyed enumId \u2192 variantIndex). Keys\n * that don't validate as a u16 are skipped rather than leaking NaN/out-of-range\n * indices into the payload.\n */\nfunction toEnumVariants(\n dto: CalInstructionDescriptorDto,\n mode: CalMode,\n): SolanaInstructionEnumVariant[] {\n const enumVariants: SolanaInstructionEnumVariant[] = [];\n for (const [enumId, variants] of Object.entries(dto.enum_variants ?? {})) {\n for (const [variantIndex, variant] of Object.entries(variants)) {\n const index = Number(variantIndex);\n if (u16Codec.decode(index).isLeft()) {\n continue;\n }\n enumVariants.push({\n enumId,\n variantIndex: index,\n descriptor: {\n data: variant.descriptor.data,\n signature: pickSignature(variant.descriptor.signatures, mode) ?? \"\",\n },\n });\n }\n }\n return enumVariants;\n}\n\n/**\n * Flatten the enum variants of every descriptor in a program into a single\n * list. CAL nests `enum_variants` inside each instruction descriptor but\n * guarantees `(enumId, variantIndex)` is unique across a program, so the enum\n * loader resolves a selection against this program-level list \u2014 independently\n * of whether any individual instruction descriptor carried a usable signature.\n */\nexport function toProgramEnumVariants(\n descriptors: Record<string, CalInstructionDescriptorDto>,\n mode: CalMode,\n): SolanaInstructionEnumVariant[] {\n return Object.values(descriptors).flatMap((dto) => toEnumVariants(dto, mode));\n}\n\n/**\n * Transform one validated CAL descriptor DTO into the core\n * {@link SolanaInstructionInfoPayload}. Returns a `Left` when the descriptor is\n * unusable (no signature for the configured `mode`), so the caller can surface\n * a per-descriptor ERROR rather than emitting an empty signature.\n *\n * `programId` comes from the enclosing `solana_programs` envelope `id`;\n * `discriminator` from the instruction's `discriminator_hex`.\n */\nexport function toInstructionInfoPayload(\n programId: string,\n discriminator: string,\n dto: CalInstructionDescriptorDto,\n mode: CalMode,\n): Either<Error, SolanaInstructionInfoPayload> {\n const signature = pickSignature(dto.descriptor.signatures, mode);\n if (!signature) {\n return Left(\n new Error(\n `[ContextModule] InstructionInfoDataSource: missing '${mode}' signature for (${programId}, ${discriminator})`,\n ),\n );\n }\n\n return Right({\n programId,\n discriminator,\n instructionName: dto.instruction_name,\n instructionInfo: {\n data: dto.descriptor.data,\n signature,\n },\n substructures: toSubstructures(dto),\n enumVariants: toEnumVariants(dto, mode),\n idlDescriptor: {\n typePool: dto.idl_descriptor?.type_pool ?? [],\n rootType: dto.idl_descriptor?.root_type ?? 0,\n },\n mintAssociations: dto.mint_association ? [dto.mint_association] : [],\n ownerAssociations: toOwnerAssociations(dto.owner_association),\n valueFlowPorts: toValueFlowPorts(dto.value_flow_ports),\n accountResets: toAccountResets(dto.account_resets),\n displayFields: toDisplayFields(dto.display_fields),\n hideRules: toHideRules(dto.hide_rules),\n accountSchema: toAccountSchema(dto.account_schema),\n });\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,qBAAAE,EAAA,oBAAAC,EAAA,oBAAAC,EAAA,gBAAAC,EAAA,6BAAAC,EAAA,wBAAAC,EAAA,0BAAAC,EAAA,qBAAAC,IAAA,eAAAC,EAAAV,GAKA,IAAAW,EAAyC,qBAEzCC,EAYO,iDACPC,EAAyB,oCAgBzB,SAASC,EACPC,EACAC,EACoB,CACpB,OAAOD,EAAWC,CAAI,CACxB,CAMO,SAASP,EACdQ,EAA8B,CAAC,EACL,CAC1B,OAAOA,EAAK,IAAKC,IAAU,CACzB,gBAAiBA,EAAK,gBACtB,0BAA2BA,EAAK,0BAChC,YAAaA,EAAK,YAClB,YAAaA,EAAK,WACpB,EAAE,CACJ,CAEO,SAAShB,EACde,EAA6B,CAAC,EACL,CAGzB,OAAOA,EAAK,QAASE,GACnBA,EAAM,gBAAkB,OACpB,CAAC,EACD,CACE,CACE,cAAeA,EAAM,cACrB,yBAA0BA,EAAM,yBAChC,WAAYA,EAAM,WAClB,MAAOA,EAAM,MACb,gCACEA,EAAM,+BACV,CACF,CACN,CACF,CAUO,SAASd,EAAYY,EAAyB,CAAC,EAAwB,CAC5E,OAAOA,EAAK,IAAKG,IAAU,CACzB,eAAgBA,EAAK,eACrB,OAAQA,EAAK,OACb,UAAWA,EAAK,SAClB,EAAE,CACJ,CAQO,SAASb,EACdc,EAC6B,CAC7B,OAAIA,IAAQ,OAAkB,CAAC,EAC3BA,EAAI,gBAAkB,QAAaA,EAAI,QAAU,OAAkB,CAAC,EACjE,CAAC,CAAE,cAAeA,EAAI,cAAe,MAAOA,EAAI,KAAM,CAAC,CAChE,CAEA,MAAMC,EAA0B,IAAI,IAAI,CAAC,YAAa,SAAU,UAAU,CAAC,EAU3E,SAASC,EAAiBF,EAAoD,CAC5E,MAAMG,EAASF,EAAwB,IAAID,EAAI,MAAM,EAChDA,EAAI,OACL,SACEI,EAAWH,EAAwB,IAAID,EAAI,QAAQ,EACpDA,EAAI,SACL,SACJ,MAAO,CAAE,OAAAG,EAAQ,SAAAC,CAAS,CAC5B,CAEO,SAAStB,EACdkB,EACoC,CACpC,GAAIA,IAAQ,OACZ,MAAO,CACL,UAAWA,EAAI,WAAa,EAC5B,UAAWA,EAAI,WAAa,IAC5B,iBAAkBA,EAAI,iBAClBE,EAAiBF,EAAI,gBAAgB,EACrC,CAAE,OAAQ,SAAU,SAAU,QAAS,EAC3C,OAAQA,EAAI,OAAS,CAAC,GAAG,IAAIE,CAAgB,CAC/C,CACF,CAEO,SAASnB,EACda,EAA6B,CAAC,EACL,CACzB,OAAOA,EAAK,IAAKS,IAAW,CAC1B,KAAMA,EAAM,KACZ,MAAOA,EAAM,OAAS,CAAE,KAAM,EAAG,CACnC,EAAE,CACJ,CAEA,SAASC,EACPN,EACiC,CACjC,MAAO,CACL,IAAIA,EAAI,gBAAkB,CAAC,GAAG,IAAKO,IAAO,CACxC,KAAM,oCAAkC,cACxC,KAAMA,EAAE,UACV,EAAE,EACF,IAAIP,EAAI,kBAAoB,CAAC,GAAG,IAAKO,IAAO,CAC1C,KAAM,oCAAkC,gBACxC,KAAMA,EAAE,UACV,EAAE,EACF,IAAIP,EAAI,YAAc,CAAC,GAAG,IAAKO,IAAO,CACpC,KAAM,oCAAkC,UACxC,KAAMA,EAAE,UACV,EAAE,EACF,IAAIP,EAAI,gBAAkB,CAAC,GAAG,IAAKO,IAAO,CACxC,KAAM,oCAAkC,cACxC,KAAMA,EAAE,UACV,EAAE,CACJ,CACF,CAOA,SAASC,EACPR,EACAL,EACgC,CAChC,MAAMc,EAA+C,CAAC,EACtD,SAAW,CAACC,EAAQC,CAAQ,IAAK,OAAO,QAAQX,EAAI,eAAiB,CAAC,CAAC,EACrE,SAAW,CAACY,EAAcC,CAAO,IAAK,OAAO,QAAQF,CAAQ,EAAG,CAC9D,MAAMG,EAAQ,OAAOF,CAAY,EAC7B,WAAS,OAAOE,CAAK,EAAE,OAAO,GAGlCL,EAAa,KAAK,CAChB,OAAAC,EACA,aAAcI,EACd,WAAY,CACV,KAAMD,EAAQ,WAAW,KACzB,UAAWpB,EAAcoB,EAAQ,WAAW,WAAYlB,CAAI,GAAK,EACnE,CACF,CAAC,CACH,CAEF,OAAOc,CACT,CASO,SAAStB,EACd4B,EACApB,EACgC,CAChC,OAAO,OAAO,OAAOoB,CAAW,EAAE,QAASf,GAAQQ,EAAeR,EAAKL,CAAI,CAAC,CAC9E,CAWO,SAASV,EACd+B,EACAC,EACAjB,EACAL,EAC6C,CAC7C,MAAMuB,EAAYzB,EAAcO,EAAI,WAAW,WAAYL,CAAI,EAC/D,OAAKuB,KAQE,SAAM,CACX,UAAAF,EACA,cAAAC,EACA,gBAAiBjB,EAAI,iBACrB,gBAAiB,CACf,KAAMA,EAAI,WAAW,KACrB,UAAAkB,CACF,EACA,cAAeZ,EAAgBN,CAAG,EAClC,aAAcQ,EAAeR,EAAKL,CAAI,EACtC,cAAe,CACb,SAAUK,EAAI,gBAAgB,WAAa,CAAC,EAC5C,SAAUA,EAAI,gBAAgB,WAAa,CAC7C,EACA,iBAAkBA,EAAI,iBAAmB,CAACA,EAAI,gBAAgB,EAAI,CAAC,EACnE,kBAAmBd,EAAoBc,EAAI,iBAAiB,EAC5D,eAAgBZ,EAAiBY,EAAI,gBAAgB,EACrD,cAAenB,EAAgBmB,EAAI,cAAc,EACjD,cAAejB,EAAgBiB,EAAI,cAAc,EACjD,UAAWhB,EAAYgB,EAAI,UAAU,EACrC,cAAelB,EAAgBkB,EAAI,cAAc,CACnD,CAAC,KA5BQ,QACL,IAAI,MACF,uDAAuDL,CAAI,oBAAoBqB,CAAS,KAAKC,CAAa,GAC5G,CACF,CAyBJ",
6
+ "names": ["InstructionInfoMapper_exports", "__export", "toAccountResets", "toAccountSchema", "toDisplayFields", "toHideRules", "toInstructionInfoPayload", "toOwnerAssociations", "toProgramEnumVariants", "toValueFlowPorts", "__toCommonJS", "import_purify_ts", "import_SolanaPayloads", "import_uIntCodec", "pickSignature", "signatures", "mode", "dtos", "port", "reset", "rule", "dto", "VALID_CONSTRAINT_VALUES", "toSlotConstraint", "signer", "writable", "field", "toSubstructures", "s", "toEnumVariants", "enumVariants", "enumId", "variants", "variantIndex", "variant", "index", "descriptors", "programId", "discriminator", "signature"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var e=require("vitest"),t=require("./InstructionInfoMapper");const r="11111111111111111111111111111111";function o(n={}){return{discriminator_hex:"00000000",instruction_name:"createAccount",descriptor:{data:"0001sys_data",signatures:{prod:"prodsig",test:"testsig"}},...n}}(0,e.describe)("InstructionInfoMapper",()=>{(0,e.describe)("toValueFlowPorts",()=>{(0,e.it)("returns an empty list for undefined input",()=>{(0,e.expect)((0,t.toValueFlowPorts)()).toEqual([])}),(0,e.it)("picks only the decoded fields, dropping the signed-TLV descriptor",()=>{(0,e.expect)((0,t.toValueFlowPorts)([{descriptor:"vfp1",account_indices:[0,1],optional_account_strategy:"OMITTED",token_value:{kind:"RESOLVE",fallback_account:5},active_when:["IS_SIGNER"]}])).toEqual([{account_indices:[0,1],optional_account_strategy:"OMITTED",token_value:{kind:"RESOLVE",fallback_account:5},active_when:["IS_SIGNER"]}])}),(0,e.it)("leaves the absent optional strategy as undefined",()=>{(0,e.expect)((0,t.toValueFlowPorts)([{descriptor:"vfp1",account_indices:[0],token_value:{kind:"NATIVE"}}])).toEqual([{account_indices:[0],optional_account_strategy:void 0,token_value:{kind:"NATIVE"},active_when:void 0}])})}),(0,e.describe)("toHideRules",()=>{(0,e.it)("returns an empty list for undefined input",()=>{(0,e.expect)((0,t.toHideRules)()).toEqual([])}),(0,e.it)("maps the decoded fields, dropping the signed-TLV descriptor",()=>{(0,e.expect)((0,t.toHideRules)([{descriptor:"hr1",rule_set_index:1,target:{source:"ACCOUNT_PATH",account_index:2},condition:"IS_SIGNER"}])).toEqual([{rule_set_index:1,target:{source:"ACCOUNT_PATH",account_index:2},condition:"IS_SIGNER"}])}),(0,e.it)("keeps a rule with no condition so its target stays in the requirement set",()=>{(0,e.expect)((0,t.toHideRules)([{descriptor:"hrNoCondition",target:{source:"ACCOUNT_PATH",account_index:4}}])).toEqual([{rule_set_index:void 0,target:{source:"ACCOUNT_PATH",account_index:4},condition:void 0}])})}),(0,e.describe)("toOwnerAssociations",()=>{(0,e.it)("returns an empty list for undefined input",()=>{(0,e.expect)((0,t.toOwnerAssociations)(void 0)).toEqual([])}),(0,e.it)("wraps CAL's single association into a list",()=>{(0,e.expect)((0,t.toOwnerAssociations)({account_index:1,owner:{source:"ACCOUNT_PATH",account_index:0}})).toEqual([{account_index:1,owner:{source:"ACCOUNT_PATH",account_index:0}}])}),(0,e.it)("drops a half-declared pair",()=>{(0,e.expect)((0,t.toOwnerAssociations)({account_index:1})).toEqual([]),(0,e.expect)((0,t.toOwnerAssociations)({owner:{source:"ACCOUNT_PATH"}})).toEqual([])})}),(0,e.describe)("toAccountResets",()=>{(0,e.it)("returns an empty list for undefined input",()=>{(0,e.expect)((0,t.toAccountResets)()).toEqual([])}),(0,e.it)("maps the decoded fields, dropping the signed-TLV descriptor",()=>{(0,e.expect)((0,t.toAccountResets)([{descriptor:"ar1",account_index:2,require_pre_balance_zero:!0}])).toEqual([{account_index:2,require_pre_balance_zero:!0}])}),(0,e.it)("drops entries missing account_index instead of defaulting to slot 0",()=>{(0,e.expect)((0,t.toAccountResets)([{descriptor:"ar0",account_index:0},{descriptor:"arBad"},{descriptor:"ar1",account_index:1}])).toEqual([{account_index:0,require_pre_balance_zero:void 0},{account_index:1,require_pre_balance_zero:void 0}])})}),(0,e.describe)("toDisplayFields",()=>{(0,e.it)("returns an empty list for undefined input",()=>{(0,e.expect)((0,t.toDisplayFields)()).toEqual([])}),(0,e.it)("picks name and param, dropping the signed-TLV descriptor",()=>{(0,e.expect)((0,t.toDisplayFields)([{descriptor:"df1",name:"New Account",param:{type:"ACCOUNT",value:{source:"ACCOUNT_PATH",account_index:1}}}])).toEqual([{name:"New Account",param:{type:"ACCOUNT",value:{source:"ACCOUNT_PATH",account_index:1}}}])}),(0,e.it)("falls back to an empty-type param when param is absent",()=>{(0,e.expect)((0,t.toDisplayFields)([{descriptor:"df1"}])).toEqual([{name:void 0,param:{type:""}}])})}),(0,e.describe)("toInstructionInfoPayload",()=>{(0,e.it)("surfaces CAL's decoded JSON (type pool, mint assoc, ports, resets, fields) and ordered substructures",()=>{const n=o({idl_descriptor:{root_type:3,type_pool:[{index:0,kind:"STRUCT",refs:[1]},{index:1,kind:"U64"}]},mint_association:{account_index:1,mint_index:3},owner_association:{account_index:1,owner:{source:"ACCOUNT_PATH",account_index:0}},display_fields:[{descriptor:"df1",name:"New Account",param:{type:"ACCOUNT",value:{source:"ACCOUNT_PATH",account_index:1}}}],value_flow_ports:[{descriptor:"vfp1",account_indices:[0],token_value:{kind:"NATIVE"}}],hide_rules:[{descriptor:"hr1",rule_set_index:0,target:{source:"ACCOUNT_PATH",account_index:1},condition:"ACCOUNT_EFFECTS_DISPLAYED_ELSEWHERE"}],account_resets:[{descriptor:"ar1",account_index:1,require_pre_balance_zero:!0}]}),a=(0,t.toInstructionInfoPayload)(r,"00000000",n,"prod").unsafeCoerce();(0,e.expect)(a).toMatchObject({programId:r,discriminator:"00000000",instructionInfo:{data:"0001sys_data",signature:"prodsig"},idlDescriptor:{rootType:3,typePool:[{index:0,kind:"STRUCT",refs:[1]},{index:1,kind:"U64"}]},mintAssociations:[{account_index:1,mint_index:3}],ownerAssociations:[{account_index:1,owner:{source:"ACCOUNT_PATH",account_index:0}}],valueFlowPorts:[{account_indices:[0],optional_account_strategy:void 0,token_value:{kind:"NATIVE"}}],hideRules:[{rule_set_index:0,target:{source:"ACCOUNT_PATH",account_index:1},condition:"ACCOUNT_EFFECTS_DISPLAYED_ELSEWHERE"}],accountResets:[{account_index:1,require_pre_balance_zero:!0}],displayFields:[{name:"New Account",param:{type:"ACCOUNT",value:{source:"ACCOUNT_PATH",account_index:1}}}]}),(0,e.expect)(a.substructures).toEqual([{kind:0,data:"df1"},{kind:1,data:"vfp1"},{kind:2,data:"hr1"},{kind:3,data:"ar1"}])}),(0,e.it)("defaults idlDescriptor when CAL omits it",()=>{const n=(0,t.toInstructionInfoPayload)(r,"00000000",o(),"prod").unsafeCoerce();(0,e.expect)(n.idlDescriptor).toEqual({typePool:[],rootType:0}),(0,e.expect)(n.mintAssociations).toEqual([])}),(0,e.it)("bundles CAL enum_variants into the payload with the mode signature",()=>{const n=o({enum_variants:{swap:{46:{variant_name:"raydiumCP",descriptor:{data:"01_raydium_tlv",signatures:{prod:"prodsig_v46",test:"testsig_v46"}}}}}}),a=(0,t.toInstructionInfoPayload)(r,"00000000",n,"prod").unsafeCoerce();(0,e.expect)(a.enumVariants).toEqual([{enumId:"swap",variantIndex:46,descriptor:{data:"01_raydium_tlv",signature:"prodsig_v46"}}])}),(0,e.it)("skips enum_variants keyed by a non-u16 index instead of leaking NaN",()=>{const n=o({enum_variants:{swap:{46:{variant_name:"raydiumCP",descriptor:{data:"01_raydium_tlv",signatures:{prod:"prodsig_v46",test:"testsig_v46"}}},"7abc":{variant_name:"junk",descriptor:{data:"junk_tlv",signatures:{prod:"x",test:"x"}}},7e4:{variant_name:"overflow",descriptor:{data:"overflow_tlv",signatures:{prod:"x",test:"x"}}}}}}),a=(0,t.toInstructionInfoPayload)(r,"00000000",n,"prod").unsafeCoerce();(0,e.expect)(a.enumVariants).toEqual([{enumId:"swap",variantIndex:46,descriptor:{data:"01_raydium_tlv",signature:"prodsig_v46"}}])}),(0,e.it)("selects the signature for the configured mode",()=>{const n=(0,t.toInstructionInfoPayload)(r,"00000000",o(),"test").unsafeCoerce();(0,e.expect)(n.instructionInfo.signature).toBe("testsig")}),(0,e.it)("returns Left when the configured mode signature is missing",()=>{const n=o();delete n.descriptor.signatures.test;const a=(0,t.toInstructionInfoPayload)(r,"00000000",n,"test");(0,e.expect)(a.isLeft()).toBe(!0),(0,e.expect)(a.swap().unsafeCoerce().message).toMatch(/missing 'test' signature/)})}),(0,e.describe)("toProgramEnumVariants",()=>{(0,e.it)("flattens enum variants across all descriptors, dropping malformed keys",()=>{const n={"00000000":o({enum_variants:{swap:{46:{variant_name:"raydiumCP",descriptor:{data:"01_raydium_tlv",signatures:{prod:"prodsig_v46",test:"testsig_v46"}}},bad:{variant_name:"junk",descriptor:{data:"junk_tlv",signatures:{prod:"x",test:"x"}}}}}}),"00000001":o({enum_variants:{route:{12:{variant_name:"orca",descriptor:{data:"02_orca_tlv",signatures:{prod:"prodsig_v12",test:"testsig_v12"}}}}}})};(0,e.expect)((0,t.toProgramEnumVariants)(n,"prod")).toEqual([{enumId:"swap",variantIndex:46,descriptor:{data:"01_raydium_tlv",signature:"prodsig_v46"}},{enumId:"route",variantIndex:12,descriptor:{data:"02_orca_tlv",signature:"prodsig_v12"}}])}),(0,e.it)("leaves the signature empty when CAL has none for the configured mode",()=>{const n=o({enum_variants:{swap:{46:{variant_name:"raydiumCP",descriptor:{data:"01_raydium_tlv",signatures:{prod:"prodsig_v46"}}}}}});(0,e.expect)((0,t.toProgramEnumVariants)({"00000000":n},"test")).toEqual([{enumId:"swap",variantIndex:46,descriptor:{data:"01_raydium_tlv",signature:""}}])})})});
1
+ "use strict";var e=require("vitest"),t=require("./InstructionInfoMapper");const i="11111111111111111111111111111111";function o(n={}){return{discriminator_hex:"00000000",instruction_name:"createAccount",descriptor:{data:"0001sys_data",signatures:{prod:"prodsig",test:"testsig"}},...n}}(0,e.describe)("InstructionInfoMapper",()=>{(0,e.describe)("toValueFlowPorts",()=>{(0,e.it)("returns an empty list for undefined input",()=>{(0,e.expect)((0,t.toValueFlowPorts)()).toEqual([])}),(0,e.it)("picks only the decoded fields, dropping the signed-TLV descriptor",()=>{(0,e.expect)((0,t.toValueFlowPorts)([{descriptor:"vfp1",account_indices:[0,1],optional_account_strategy:"OMITTED",token_value:{kind:"RESOLVE",fallback_account:5},active_when:["IS_SIGNER"]}])).toEqual([{account_indices:[0,1],optional_account_strategy:"OMITTED",token_value:{kind:"RESOLVE",fallback_account:5},active_when:["IS_SIGNER"]}])}),(0,e.it)("leaves the absent optional strategy as undefined",()=>{(0,e.expect)((0,t.toValueFlowPorts)([{descriptor:"vfp1",account_indices:[0],token_value:{kind:"NATIVE"}}])).toEqual([{account_indices:[0],optional_account_strategy:void 0,token_value:{kind:"NATIVE"},active_when:void 0}])})}),(0,e.describe)("toHideRules",()=>{(0,e.it)("returns an empty list for undefined input",()=>{(0,e.expect)((0,t.toHideRules)()).toEqual([])}),(0,e.it)("maps the decoded fields, dropping the signed-TLV descriptor",()=>{(0,e.expect)((0,t.toHideRules)([{descriptor:"hr1",rule_set_index:1,target:{source:"ACCOUNT_PATH",account_index:2},condition:"IS_SIGNER"}])).toEqual([{rule_set_index:1,target:{source:"ACCOUNT_PATH",account_index:2},condition:"IS_SIGNER"}])}),(0,e.it)("keeps a rule with no condition so its target stays in the requirement set",()=>{(0,e.expect)((0,t.toHideRules)([{descriptor:"hrNoCondition",target:{source:"ACCOUNT_PATH",account_index:4}}])).toEqual([{rule_set_index:void 0,target:{source:"ACCOUNT_PATH",account_index:4},condition:void 0}])})}),(0,e.describe)("toOwnerAssociations",()=>{(0,e.it)("returns an empty list for undefined input",()=>{(0,e.expect)((0,t.toOwnerAssociations)(void 0)).toEqual([])}),(0,e.it)("wraps CAL's single association into a list",()=>{(0,e.expect)((0,t.toOwnerAssociations)({account_index:1,owner:{source:"ACCOUNT_PATH",account_index:0}})).toEqual([{account_index:1,owner:{source:"ACCOUNT_PATH",account_index:0}}])}),(0,e.it)("drops a half-declared pair",()=>{(0,e.expect)((0,t.toOwnerAssociations)({account_index:1})).toEqual([]),(0,e.expect)((0,t.toOwnerAssociations)({owner:{source:"ACCOUNT_PATH"}})).toEqual([])})}),(0,e.describe)("toAccountResets",()=>{(0,e.it)("returns an empty list for undefined input",()=>{(0,e.expect)((0,t.toAccountResets)()).toEqual([])}),(0,e.it)("maps the decoded fields, dropping the signed-TLV descriptor",()=>{(0,e.expect)((0,t.toAccountResets)([{descriptor:"ar1",account_index:2,require_pre_balance_zero:!0}])).toEqual([{account_index:2,require_pre_balance_zero:!0}])}),(0,e.it)("passes through value_kind, token, and require_native_pre_balance_zero",()=>{(0,e.expect)((0,t.toAccountResets)([{descriptor:"ar1",account_index:3,value_kind:"splToken",token:{kind:"RESOLVE",account_index:4},require_native_pre_balance_zero:!0}])).toEqual([{account_index:3,value_kind:"splToken",token:{kind:"RESOLVE",account_index:4},require_native_pre_balance_zero:!0}])}),(0,e.it)("drops entries missing account_index instead of defaulting to slot 0",()=>{(0,e.expect)((0,t.toAccountResets)([{descriptor:"ar0",account_index:0},{descriptor:"arBad"},{descriptor:"ar1",account_index:1}])).toEqual([{account_index:0,require_pre_balance_zero:void 0},{account_index:1,require_pre_balance_zero:void 0}])})}),(0,e.describe)("toDisplayFields",()=>{(0,e.it)("returns an empty list for undefined input",()=>{(0,e.expect)((0,t.toDisplayFields)()).toEqual([])}),(0,e.it)("picks name and param, dropping the signed-TLV descriptor",()=>{(0,e.expect)((0,t.toDisplayFields)([{descriptor:"df1",name:"New Account",param:{type:"ACCOUNT",value:{source:"ACCOUNT_PATH",account_index:1}}}])).toEqual([{name:"New Account",param:{type:"ACCOUNT",value:{source:"ACCOUNT_PATH",account_index:1}}}])}),(0,e.it)("falls back to an empty-type param when param is absent",()=>{(0,e.expect)((0,t.toDisplayFields)([{descriptor:"df1"}])).toEqual([{name:void 0,param:{type:""}}])})}),(0,e.describe)("toAccountSchema",()=>{(0,e.it)("returns undefined for undefined input (no ACCOUNT_SCHEMA check)",()=>{(0,e.expect)((0,t.toAccountSchema)(void 0)).toBeUndefined()}),(0,e.it)("maps count bounds, remaining_policy, and per-slot constraints",()=>{(0,e.expect)((0,t.toAccountSchema)({count_min:2,count_max:4,remaining_policy:{signer:"FORBIDDEN",writable:"EITHER"},slots:[{signer:"REQUIRED",writable:"EITHER"},{signer:"EITHER",writable:"REQUIRED"}]})).toEqual({count_min:2,count_max:4,remaining_policy:{signer:"FORBIDDEN",writable:"EITHER"},slots:[{signer:"REQUIRED",writable:"EITHER"},{signer:"EITHER",writable:"REQUIRED"}]})}),(0,e.it)("defaults count_min to 0, count_max to 255 (COUNT_UNBOUNDED), remaining_policy and slots to EITHER/empty",()=>{(0,e.expect)((0,t.toAccountSchema)({})).toEqual({count_min:0,count_max:255,remaining_policy:{signer:"EITHER",writable:"EITHER"},slots:[]})}),(0,e.it)("defaults an unknown or missing per-field constraint value to EITHER (fails open, unlike ACCOUNT_RESET's value_kind)",()=>{(0,e.expect)((0,t.toAccountSchema)({count_min:1,count_max:1,remaining_policy:{signer:"NOT_A_VALUE",writable:void 0},slots:[{signer:"REQUIRED"}]})).toEqual({count_min:1,count_max:1,remaining_policy:{signer:"EITHER",writable:"EITHER"},slots:[{signer:"REQUIRED",writable:"EITHER"}]})})}),(0,e.describe)("toInstructionInfoPayload",()=>{(0,e.it)("surfaces CAL's decoded JSON (type pool, mint assoc, ports, resets, fields) and ordered substructures",()=>{const n=o({idl_descriptor:{root_type:3,type_pool:[{index:0,kind:"STRUCT",refs:[1]},{index:1,kind:"U64"}]},mint_association:{account_index:1,mint_index:3},owner_association:{account_index:1,owner:{source:"ACCOUNT_PATH",account_index:0}},display_fields:[{descriptor:"df1",name:"New Account",param:{type:"ACCOUNT",value:{source:"ACCOUNT_PATH",account_index:1}}}],value_flow_ports:[{descriptor:"vfp1",account_indices:[0],token_value:{kind:"NATIVE"}}],hide_rules:[{descriptor:"hr1",rule_set_index:0,target:{source:"ACCOUNT_PATH",account_index:1},condition:"ACCOUNT_EFFECTS_DISPLAYED_ELSEWHERE"}],account_resets:[{descriptor:"ar1",account_index:1,require_pre_balance_zero:!0}],account_schema:{count_min:2,count_max:2,slots:[{signer:"REQUIRED",writable:"EITHER"}]}}),a=(0,t.toInstructionInfoPayload)(i,"00000000",n,"prod").unsafeCoerce();(0,e.expect)(a).toMatchObject({programId:i,discriminator:"00000000",instructionInfo:{data:"0001sys_data",signature:"prodsig"},idlDescriptor:{rootType:3,typePool:[{index:0,kind:"STRUCT",refs:[1]},{index:1,kind:"U64"}]},mintAssociations:[{account_index:1,mint_index:3}],ownerAssociations:[{account_index:1,owner:{source:"ACCOUNT_PATH",account_index:0}}],valueFlowPorts:[{account_indices:[0],optional_account_strategy:void 0,token_value:{kind:"NATIVE"}}],hideRules:[{rule_set_index:0,target:{source:"ACCOUNT_PATH",account_index:1},condition:"ACCOUNT_EFFECTS_DISPLAYED_ELSEWHERE"}],accountResets:[{account_index:1,require_pre_balance_zero:!0}],accountSchema:{count_min:2,count_max:2,remaining_policy:{signer:"EITHER",writable:"EITHER"},slots:[{signer:"REQUIRED",writable:"EITHER"}]},displayFields:[{name:"New Account",param:{type:"ACCOUNT",value:{source:"ACCOUNT_PATH",account_index:1}}}]}),(0,e.expect)(a.substructures).toEqual([{kind:0,data:"df1"},{kind:1,data:"vfp1"},{kind:2,data:"hr1"},{kind:3,data:"ar1"}])}),(0,e.it)("defaults idlDescriptor when CAL omits it",()=>{const n=(0,t.toInstructionInfoPayload)(i,"00000000",o(),"prod").unsafeCoerce();(0,e.expect)(n.idlDescriptor).toEqual({typePool:[],rootType:0}),(0,e.expect)(n.mintAssociations).toEqual([])}),(0,e.it)("bundles CAL enum_variants into the payload with the mode signature",()=>{const n=o({enum_variants:{swap:{46:{variant_name:"raydiumCP",descriptor:{data:"01_raydium_tlv",signatures:{prod:"prodsig_v46",test:"testsig_v46"}}}}}}),a=(0,t.toInstructionInfoPayload)(i,"00000000",n,"prod").unsafeCoerce();(0,e.expect)(a.enumVariants).toEqual([{enumId:"swap",variantIndex:46,descriptor:{data:"01_raydium_tlv",signature:"prodsig_v46"}}])}),(0,e.it)("skips enum_variants keyed by a non-u16 index instead of leaking NaN",()=>{const n=o({enum_variants:{swap:{46:{variant_name:"raydiumCP",descriptor:{data:"01_raydium_tlv",signatures:{prod:"prodsig_v46",test:"testsig_v46"}}},"7abc":{variant_name:"junk",descriptor:{data:"junk_tlv",signatures:{prod:"x",test:"x"}}},7e4:{variant_name:"overflow",descriptor:{data:"overflow_tlv",signatures:{prod:"x",test:"x"}}}}}}),a=(0,t.toInstructionInfoPayload)(i,"00000000",n,"prod").unsafeCoerce();(0,e.expect)(a.enumVariants).toEqual([{enumId:"swap",variantIndex:46,descriptor:{data:"01_raydium_tlv",signature:"prodsig_v46"}}])}),(0,e.it)("selects the signature for the configured mode",()=>{const n=(0,t.toInstructionInfoPayload)(i,"00000000",o(),"test").unsafeCoerce();(0,e.expect)(n.instructionInfo.signature).toBe("testsig")}),(0,e.it)("returns Left when the configured mode signature is missing",()=>{const n=o();delete n.descriptor.signatures.test;const a=(0,t.toInstructionInfoPayload)(i,"00000000",n,"test");(0,e.expect)(a.isLeft()).toBe(!0),(0,e.expect)(a.swap().unsafeCoerce().message).toMatch(/missing 'test' signature/)})}),(0,e.describe)("toProgramEnumVariants",()=>{(0,e.it)("flattens enum variants across all descriptors, dropping malformed keys",()=>{const n={"00000000":o({enum_variants:{swap:{46:{variant_name:"raydiumCP",descriptor:{data:"01_raydium_tlv",signatures:{prod:"prodsig_v46",test:"testsig_v46"}}},bad:{variant_name:"junk",descriptor:{data:"junk_tlv",signatures:{prod:"x",test:"x"}}}}}}),"00000001":o({enum_variants:{route:{12:{variant_name:"orca",descriptor:{data:"02_orca_tlv",signatures:{prod:"prodsig_v12",test:"testsig_v12"}}}}}})};(0,e.expect)((0,t.toProgramEnumVariants)(n,"prod")).toEqual([{enumId:"swap",variantIndex:46,descriptor:{data:"01_raydium_tlv",signature:"prodsig_v46"}},{enumId:"route",variantIndex:12,descriptor:{data:"02_orca_tlv",signature:"prodsig_v12"}}])}),(0,e.it)("leaves the signature empty when CAL has none for the configured mode",()=>{const n=o({enum_variants:{swap:{46:{variant_name:"raydiumCP",descriptor:{data:"01_raydium_tlv",signatures:{prod:"prodsig_v46"}}}}}});(0,e.expect)((0,t.toProgramEnumVariants)({"00000000":n},"test")).toEqual([{enumId:"swap",variantIndex:46,descriptor:{data:"01_raydium_tlv",signature:""}}])})})});
2
2
  //# sourceMappingURL=InstructionInfoMapper.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/modules/solana/instruction-info/data/InstructionInfoMapper.test.ts"],
4
- "sourcesContent": ["import { describe, expect, it } from \"vitest\";\n\nimport { type CalInstructionDescriptorDto } from \"./InstructionInfoDto\";\nimport {\n toAccountResets,\n toDisplayFields,\n toHideRules,\n toInstructionInfoPayload,\n toOwnerAssociations,\n toProgramEnumVariants,\n toValueFlowPorts,\n} from \"./InstructionInfoMapper\";\n\nconst PROGRAM = \"11111111111111111111111111111111\";\n\nfunction makeDescriptor(\n overrides: Partial<CalInstructionDescriptorDto> = {},\n): CalInstructionDescriptorDto {\n return {\n discriminator_hex: \"00000000\",\n instruction_name: \"createAccount\",\n descriptor: {\n data: \"0001sys_data\",\n signatures: { prod: \"prodsig\", test: \"testsig\" },\n },\n ...overrides,\n };\n}\n\ndescribe(\"InstructionInfoMapper\", () => {\n describe(\"toValueFlowPorts\", () => {\n it(\"returns an empty list for undefined input\", () => {\n expect(toValueFlowPorts()).toEqual([]);\n });\n\n it(\"picks only the decoded fields, dropping the signed-TLV descriptor\", () => {\n expect(\n toValueFlowPorts([\n {\n descriptor: \"vfp1\",\n account_indices: [0, 1],\n optional_account_strategy: \"OMITTED\",\n token_value: { kind: \"RESOLVE\", fallback_account: 5 },\n active_when: [\"IS_SIGNER\"],\n },\n ]),\n ).toEqual([\n {\n account_indices: [0, 1],\n optional_account_strategy: \"OMITTED\",\n token_value: { kind: \"RESOLVE\", fallback_account: 5 },\n active_when: [\"IS_SIGNER\"],\n },\n ]);\n });\n\n it(\"leaves the absent optional strategy as undefined\", () => {\n expect(\n toValueFlowPorts([\n {\n descriptor: \"vfp1\",\n account_indices: [0],\n token_value: { kind: \"NATIVE\" },\n },\n ]),\n ).toEqual([\n {\n account_indices: [0],\n optional_account_strategy: undefined,\n token_value: { kind: \"NATIVE\" },\n active_when: undefined,\n },\n ]);\n });\n });\n\n describe(\"toHideRules\", () => {\n it(\"returns an empty list for undefined input\", () => {\n expect(toHideRules()).toEqual([]);\n });\n\n it(\"maps the decoded fields, dropping the signed-TLV descriptor\", () => {\n expect(\n toHideRules([\n {\n descriptor: \"hr1\",\n rule_set_index: 1,\n target: { source: \"ACCOUNT_PATH\", account_index: 2 },\n condition: \"IS_SIGNER\",\n },\n ]),\n ).toEqual([\n {\n rule_set_index: 1,\n target: { source: \"ACCOUNT_PATH\", account_index: 2 },\n condition: \"IS_SIGNER\",\n },\n ]);\n });\n\n it(\"keeps a rule with no condition so its target stays in the requirement set\", () => {\n // The signed TLV reaches the device regardless, and the device resolves\n // the target of every rule it receives.\n expect(\n toHideRules([\n {\n descriptor: \"hrNoCondition\",\n target: { source: \"ACCOUNT_PATH\", account_index: 4 },\n },\n ]),\n ).toEqual([\n {\n rule_set_index: undefined,\n target: { source: \"ACCOUNT_PATH\", account_index: 4 },\n condition: undefined,\n },\n ]);\n });\n });\n\n describe(\"toOwnerAssociations\", () => {\n it(\"returns an empty list for undefined input\", () => {\n expect(toOwnerAssociations(undefined)).toEqual([]);\n });\n\n it(\"wraps CAL's single association into a list\", () => {\n expect(\n toOwnerAssociations({\n account_index: 1,\n owner: { source: \"ACCOUNT_PATH\", account_index: 0 },\n }),\n ).toEqual([\n {\n account_index: 1,\n owner: { source: \"ACCOUNT_PATH\", account_index: 0 },\n },\n ]);\n });\n\n it(\"drops a half-declared pair\", () => {\n expect(toOwnerAssociations({ account_index: 1 })).toEqual([]);\n expect(\n toOwnerAssociations({ owner: { source: \"ACCOUNT_PATH\" } }),\n ).toEqual([]);\n });\n });\n\n describe(\"toAccountResets\", () => {\n it(\"returns an empty list for undefined input\", () => {\n expect(toAccountResets()).toEqual([]);\n });\n\n it(\"maps the decoded fields, dropping the signed-TLV descriptor\", () => {\n expect(\n toAccountResets([\n {\n descriptor: \"ar1\",\n account_index: 2,\n require_pre_balance_zero: true,\n },\n ]),\n ).toEqual([{ account_index: 2, require_pre_balance_zero: true }]);\n });\n\n it(\"drops entries missing account_index instead of defaulting to slot 0\", () => {\n expect(\n toAccountResets([\n { descriptor: \"ar0\", account_index: 0 },\n { descriptor: \"arBad\" },\n { descriptor: \"ar1\", account_index: 1 },\n ]),\n ).toEqual([\n { account_index: 0, require_pre_balance_zero: undefined },\n { account_index: 1, require_pre_balance_zero: undefined },\n ]);\n });\n });\n\n describe(\"toDisplayFields\", () => {\n it(\"returns an empty list for undefined input\", () => {\n expect(toDisplayFields()).toEqual([]);\n });\n\n it(\"picks name and param, dropping the signed-TLV descriptor\", () => {\n expect(\n toDisplayFields([\n {\n descriptor: \"df1\",\n name: \"New Account\",\n param: {\n type: \"ACCOUNT\",\n value: { source: \"ACCOUNT_PATH\", account_index: 1 },\n },\n },\n ]),\n ).toEqual([\n {\n name: \"New Account\",\n param: {\n type: \"ACCOUNT\",\n value: { source: \"ACCOUNT_PATH\", account_index: 1 },\n },\n },\n ]);\n });\n\n it(\"falls back to an empty-type param when param is absent\", () => {\n expect(toDisplayFields([{ descriptor: \"df1\" }])).toEqual([\n { name: undefined, param: { type: \"\" } },\n ]);\n });\n });\n\n describe(\"toInstructionInfoPayload\", () => {\n it(\"surfaces CAL's decoded JSON (type pool, mint assoc, ports, resets, fields) and ordered substructures\", () => {\n const dto = makeDescriptor({\n idl_descriptor: {\n root_type: 3,\n type_pool: [\n { index: 0, kind: \"STRUCT\", refs: [1] },\n { index: 1, kind: \"U64\" },\n ],\n },\n mint_association: { account_index: 1, mint_index: 3 },\n owner_association: {\n account_index: 1,\n owner: { source: \"ACCOUNT_PATH\", account_index: 0 },\n },\n display_fields: [\n {\n descriptor: \"df1\",\n name: \"New Account\",\n param: {\n type: \"ACCOUNT\",\n value: { source: \"ACCOUNT_PATH\", account_index: 1 },\n },\n },\n ],\n value_flow_ports: [\n {\n descriptor: \"vfp1\",\n account_indices: [0],\n token_value: { kind: \"NATIVE\" },\n },\n ],\n hide_rules: [\n {\n descriptor: \"hr1\",\n rule_set_index: 0,\n target: { source: \"ACCOUNT_PATH\", account_index: 1 },\n condition: \"ACCOUNT_EFFECTS_DISPLAYED_ELSEWHERE\",\n },\n ],\n account_resets: [\n {\n descriptor: \"ar1\",\n account_index: 1,\n require_pre_balance_zero: true,\n },\n ],\n });\n\n const payload = toInstructionInfoPayload(\n PROGRAM,\n \"00000000\",\n dto,\n \"prod\",\n ).unsafeCoerce();\n\n expect(payload).toMatchObject({\n programId: PROGRAM,\n discriminator: \"00000000\",\n instructionInfo: { data: \"0001sys_data\", signature: \"prodsig\" },\n idlDescriptor: {\n rootType: 3,\n typePool: [\n { index: 0, kind: \"STRUCT\", refs: [1] },\n { index: 1, kind: \"U64\" },\n ],\n },\n mintAssociations: [{ account_index: 1, mint_index: 3 }],\n ownerAssociations: [\n {\n account_index: 1,\n owner: { source: \"ACCOUNT_PATH\", account_index: 0 },\n },\n ],\n valueFlowPorts: [\n {\n account_indices: [0],\n optional_account_strategy: undefined,\n token_value: { kind: \"NATIVE\" },\n },\n ],\n hideRules: [\n {\n rule_set_index: 0,\n target: { source: \"ACCOUNT_PATH\", account_index: 1 },\n condition: \"ACCOUNT_EFFECTS_DISPLAYED_ELSEWHERE\",\n },\n ],\n accountResets: [{ account_index: 1, require_pre_balance_zero: true }],\n displayFields: [\n {\n name: \"New Account\",\n param: {\n type: \"ACCOUNT\",\n value: { source: \"ACCOUNT_PATH\", account_index: 1 },\n },\n },\n ],\n });\n // Substructures carry the signed TLVs for the device, in order.\n expect(payload.substructures).toEqual([\n { kind: 0x00, data: \"df1\" },\n { kind: 0x01, data: \"vfp1\" },\n { kind: 0x02, data: \"hr1\" },\n { kind: 0x03, data: \"ar1\" },\n ]);\n });\n\n it(\"defaults idlDescriptor when CAL omits it\", () => {\n const payload = toInstructionInfoPayload(\n PROGRAM,\n \"00000000\",\n makeDescriptor(),\n \"prod\",\n ).unsafeCoerce();\n expect(payload.idlDescriptor).toEqual({ typePool: [], rootType: 0 });\n expect(payload.mintAssociations).toEqual([]);\n });\n\n it(\"bundles CAL enum_variants into the payload with the mode signature\", () => {\n const dto = makeDescriptor({\n enum_variants: {\n swap: {\n \"46\": {\n variant_name: \"raydiumCP\",\n descriptor: {\n data: \"01_raydium_tlv\",\n signatures: { prod: \"prodsig_v46\", test: \"testsig_v46\" },\n },\n },\n },\n },\n });\n const payload = toInstructionInfoPayload(\n PROGRAM,\n \"00000000\",\n dto,\n \"prod\",\n ).unsafeCoerce();\n expect(payload.enumVariants).toEqual([\n {\n enumId: \"swap\",\n variantIndex: 46,\n descriptor: { data: \"01_raydium_tlv\", signature: \"prodsig_v46\" },\n },\n ]);\n });\n\n it(\"skips enum_variants keyed by a non-u16 index instead of leaking NaN\", () => {\n const dto = makeDescriptor({\n enum_variants: {\n swap: {\n \"46\": {\n variant_name: \"raydiumCP\",\n descriptor: {\n data: \"01_raydium_tlv\",\n signatures: { prod: \"prodsig_v46\", test: \"testsig_v46\" },\n },\n },\n \"7abc\": {\n variant_name: \"junk\",\n descriptor: {\n data: \"junk_tlv\",\n signatures: { prod: \"x\", test: \"x\" },\n },\n },\n \"70000\": {\n variant_name: \"overflow\",\n descriptor: {\n data: \"overflow_tlv\",\n signatures: { prod: \"x\", test: \"x\" },\n },\n },\n },\n },\n });\n const payload = toInstructionInfoPayload(\n PROGRAM,\n \"00000000\",\n dto,\n \"prod\",\n ).unsafeCoerce();\n expect(payload.enumVariants).toEqual([\n {\n enumId: \"swap\",\n variantIndex: 46,\n descriptor: { data: \"01_raydium_tlv\", signature: \"prodsig_v46\" },\n },\n ]);\n });\n\n it(\"selects the signature for the configured mode\", () => {\n const payload = toInstructionInfoPayload(\n PROGRAM,\n \"00000000\",\n makeDescriptor(),\n \"test\",\n ).unsafeCoerce();\n expect(payload.instructionInfo.signature).toBe(\"testsig\");\n });\n\n it(\"returns Left when the configured mode signature is missing\", () => {\n const dto = makeDescriptor();\n delete (dto.descriptor.signatures as { test?: string }).test;\n const result = toInstructionInfoPayload(PROGRAM, \"00000000\", dto, \"test\");\n expect(result.isLeft()).toBe(true);\n expect(result.swap().unsafeCoerce().message).toMatch(\n /missing 'test' signature/,\n );\n });\n });\n\n describe(\"toProgramEnumVariants\", () => {\n it(\"flattens enum variants across all descriptors, dropping malformed keys\", () => {\n const descriptors: Record<string, CalInstructionDescriptorDto> = {\n \"00000000\": makeDescriptor({\n enum_variants: {\n swap: {\n \"46\": {\n variant_name: \"raydiumCP\",\n descriptor: {\n data: \"01_raydium_tlv\",\n signatures: { prod: \"prodsig_v46\", test: \"testsig_v46\" },\n },\n },\n bad: {\n variant_name: \"junk\",\n descriptor: {\n data: \"junk_tlv\",\n signatures: { prod: \"x\", test: \"x\" },\n },\n },\n },\n },\n }),\n \"00000001\": makeDescriptor({\n enum_variants: {\n route: {\n \"12\": {\n variant_name: \"orca\",\n descriptor: {\n data: \"02_orca_tlv\",\n signatures: { prod: \"prodsig_v12\", test: \"testsig_v12\" },\n },\n },\n },\n },\n }),\n };\n expect(toProgramEnumVariants(descriptors, \"prod\")).toEqual([\n {\n enumId: \"swap\",\n variantIndex: 46,\n descriptor: { data: \"01_raydium_tlv\", signature: \"prodsig_v46\" },\n },\n {\n enumId: \"route\",\n variantIndex: 12,\n descriptor: { data: \"02_orca_tlv\", signature: \"prodsig_v12\" },\n },\n ]);\n });\n\n it(\"leaves the signature empty when CAL has none for the configured mode\", () => {\n const dto = makeDescriptor({\n enum_variants: {\n swap: {\n \"46\": {\n variant_name: \"raydiumCP\",\n descriptor: {\n data: \"01_raydium_tlv\",\n signatures: { prod: \"prodsig_v46\" },\n },\n },\n },\n },\n });\n expect(toProgramEnumVariants({ \"00000000\": dto }, \"test\")).toEqual([\n {\n enumId: \"swap\",\n variantIndex: 46,\n descriptor: { data: \"01_raydium_tlv\", signature: \"\" },\n },\n ]);\n });\n });\n});\n"],
5
- "mappings": "aAAA,IAAAA,EAAqC,kBAGrCC,EAQO,mCAEP,MAAMC,EAAU,mCAEhB,SAASC,EACPC,EAAkD,CAAC,EACtB,CAC7B,MAAO,CACL,kBAAmB,WACnB,iBAAkB,gBAClB,WAAY,CACV,KAAM,eACN,WAAY,CAAE,KAAM,UAAW,KAAM,SAAU,CACjD,EACA,GAAGA,CACL,CACF,IAEA,YAAS,wBAAyB,IAAM,IACtC,YAAS,mBAAoB,IAAM,IACjC,MAAG,4CAA6C,IAAM,IACpD,aAAO,oBAAiB,CAAC,EAAE,QAAQ,CAAC,CAAC,CACvC,CAAC,KAED,MAAG,oEAAqE,IAAM,IAC5E,aACE,oBAAiB,CACf,CACE,WAAY,OACZ,gBAAiB,CAAC,EAAG,CAAC,EACtB,0BAA2B,UAC3B,YAAa,CAAE,KAAM,UAAW,iBAAkB,CAAE,EACpD,YAAa,CAAC,WAAW,CAC3B,CACF,CAAC,CACH,EAAE,QAAQ,CACR,CACE,gBAAiB,CAAC,EAAG,CAAC,EACtB,0BAA2B,UAC3B,YAAa,CAAE,KAAM,UAAW,iBAAkB,CAAE,EACpD,YAAa,CAAC,WAAW,CAC3B,CACF,CAAC,CACH,CAAC,KAED,MAAG,mDAAoD,IAAM,IAC3D,aACE,oBAAiB,CACf,CACE,WAAY,OACZ,gBAAiB,CAAC,CAAC,EACnB,YAAa,CAAE,KAAM,QAAS,CAChC,CACF,CAAC,CACH,EAAE,QAAQ,CACR,CACE,gBAAiB,CAAC,CAAC,EACnB,0BAA2B,OAC3B,YAAa,CAAE,KAAM,QAAS,EAC9B,YAAa,MACf,CACF,CAAC,CACH,CAAC,CACH,CAAC,KAED,YAAS,cAAe,IAAM,IAC5B,MAAG,4CAA6C,IAAM,IACpD,aAAO,eAAY,CAAC,EAAE,QAAQ,CAAC,CAAC,CAClC,CAAC,KAED,MAAG,8DAA+D,IAAM,IACtE,aACE,eAAY,CACV,CACE,WAAY,MACZ,eAAgB,EAChB,OAAQ,CAAE,OAAQ,eAAgB,cAAe,CAAE,EACnD,UAAW,WACb,CACF,CAAC,CACH,EAAE,QAAQ,CACR,CACE,eAAgB,EAChB,OAAQ,CAAE,OAAQ,eAAgB,cAAe,CAAE,EACnD,UAAW,WACb,CACF,CAAC,CACH,CAAC,KAED,MAAG,4EAA6E,IAAM,IAGpF,aACE,eAAY,CACV,CACE,WAAY,gBACZ,OAAQ,CAAE,OAAQ,eAAgB,cAAe,CAAE,CACrD,CACF,CAAC,CACH,EAAE,QAAQ,CACR,CACE,eAAgB,OAChB,OAAQ,CAAE,OAAQ,eAAgB,cAAe,CAAE,EACnD,UAAW,MACb,CACF,CAAC,CACH,CAAC,CACH,CAAC,KAED,YAAS,sBAAuB,IAAM,IACpC,MAAG,4CAA6C,IAAM,IACpD,aAAO,uBAAoB,MAAS,CAAC,EAAE,QAAQ,CAAC,CAAC,CACnD,CAAC,KAED,MAAG,6CAA8C,IAAM,IACrD,aACE,uBAAoB,CAClB,cAAe,EACf,MAAO,CAAE,OAAQ,eAAgB,cAAe,CAAE,CACpD,CAAC,CACH,EAAE,QAAQ,CACR,CACE,cAAe,EACf,MAAO,CAAE,OAAQ,eAAgB,cAAe,CAAE,CACpD,CACF,CAAC,CACH,CAAC,KAED,MAAG,6BAA8B,IAAM,IACrC,aAAO,uBAAoB,CAAE,cAAe,CAAE,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,KAC5D,aACE,uBAAoB,CAAE,MAAO,CAAE,OAAQ,cAAe,CAAE,CAAC,CAC3D,EAAE,QAAQ,CAAC,CAAC,CACd,CAAC,CACH,CAAC,KAED,YAAS,kBAAmB,IAAM,IAChC,MAAG,4CAA6C,IAAM,IACpD,aAAO,mBAAgB,CAAC,EAAE,QAAQ,CAAC,CAAC,CACtC,CAAC,KAED,MAAG,8DAA+D,IAAM,IACtE,aACE,mBAAgB,CACd,CACE,WAAY,MACZ,cAAe,EACf,yBAA0B,EAC5B,CACF,CAAC,CACH,EAAE,QAAQ,CAAC,CAAE,cAAe,EAAG,yBAA0B,EAAK,CAAC,CAAC,CAClE,CAAC,KAED,MAAG,sEAAuE,IAAM,IAC9E,aACE,mBAAgB,CACd,CAAE,WAAY,MAAO,cAAe,CAAE,EACtC,CAAE,WAAY,OAAQ,EACtB,CAAE,WAAY,MAAO,cAAe,CAAE,CACxC,CAAC,CACH,EAAE,QAAQ,CACR,CAAE,cAAe,EAAG,yBAA0B,MAAU,EACxD,CAAE,cAAe,EAAG,yBAA0B,MAAU,CAC1D,CAAC,CACH,CAAC,CACH,CAAC,KAED,YAAS,kBAAmB,IAAM,IAChC,MAAG,4CAA6C,IAAM,IACpD,aAAO,mBAAgB,CAAC,EAAE,QAAQ,CAAC,CAAC,CACtC,CAAC,KAED,MAAG,2DAA4D,IAAM,IACnE,aACE,mBAAgB,CACd,CACE,WAAY,MACZ,KAAM,cACN,MAAO,CACL,KAAM,UACN,MAAO,CAAE,OAAQ,eAAgB,cAAe,CAAE,CACpD,CACF,CACF,CAAC,CACH,EAAE,QAAQ,CACR,CACE,KAAM,cACN,MAAO,CACL,KAAM,UACN,MAAO,CAAE,OAAQ,eAAgB,cAAe,CAAE,CACpD,CACF,CACF,CAAC,CACH,CAAC,KAED,MAAG,yDAA0D,IAAM,IACjE,aAAO,mBAAgB,CAAC,CAAE,WAAY,KAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,CACvD,CAAE,KAAM,OAAW,MAAO,CAAE,KAAM,EAAG,CAAE,CACzC,CAAC,CACH,CAAC,CACH,CAAC,KAED,YAAS,2BAA4B,IAAM,IACzC,MAAG,uGAAwG,IAAM,CAC/G,MAAMC,EAAMF,EAAe,CACzB,eAAgB,CACd,UAAW,EACX,UAAW,CACT,CAAE,MAAO,EAAG,KAAM,SAAU,KAAM,CAAC,CAAC,CAAE,EACtC,CAAE,MAAO,EAAG,KAAM,KAAM,CAC1B,CACF,EACA,iBAAkB,CAAE,cAAe,EAAG,WAAY,CAAE,EACpD,kBAAmB,CACjB,cAAe,EACf,MAAO,CAAE,OAAQ,eAAgB,cAAe,CAAE,CACpD,EACA,eAAgB,CACd,CACE,WAAY,MACZ,KAAM,cACN,MAAO,CACL,KAAM,UACN,MAAO,CAAE,OAAQ,eAAgB,cAAe,CAAE,CACpD,CACF,CACF,EACA,iBAAkB,CAChB,CACE,WAAY,OACZ,gBAAiB,CAAC,CAAC,EACnB,YAAa,CAAE,KAAM,QAAS,CAChC,CACF,EACA,WAAY,CACV,CACE,WAAY,MACZ,eAAgB,EAChB,OAAQ,CAAE,OAAQ,eAAgB,cAAe,CAAE,EACnD,UAAW,qCACb,CACF,EACA,eAAgB,CACd,CACE,WAAY,MACZ,cAAe,EACf,yBAA0B,EAC5B,CACF,CACF,CAAC,EAEKG,KAAU,4BACdJ,EACA,WACAG,EACA,MACF,EAAE,aAAa,KAEf,UAAOC,CAAO,EAAE,cAAc,CAC5B,UAAWJ,EACX,cAAe,WACf,gBAAiB,CAAE,KAAM,eAAgB,UAAW,SAAU,EAC9D,cAAe,CACb,SAAU,EACV,SAAU,CACR,CAAE,MAAO,EAAG,KAAM,SAAU,KAAM,CAAC,CAAC,CAAE,EACtC,CAAE,MAAO,EAAG,KAAM,KAAM,CAC1B,CACF,EACA,iBAAkB,CAAC,CAAE,cAAe,EAAG,WAAY,CAAE,CAAC,EACtD,kBAAmB,CACjB,CACE,cAAe,EACf,MAAO,CAAE,OAAQ,eAAgB,cAAe,CAAE,CACpD,CACF,EACA,eAAgB,CACd,CACE,gBAAiB,CAAC,CAAC,EACnB,0BAA2B,OAC3B,YAAa,CAAE,KAAM,QAAS,CAChC,CACF,EACA,UAAW,CACT,CACE,eAAgB,EAChB,OAAQ,CAAE,OAAQ,eAAgB,cAAe,CAAE,EACnD,UAAW,qCACb,CACF,EACA,cAAe,CAAC,CAAE,cAAe,EAAG,yBAA0B,EAAK,CAAC,EACpE,cAAe,CACb,CACE,KAAM,cACN,MAAO,CACL,KAAM,UACN,MAAO,CAAE,OAAQ,eAAgB,cAAe,CAAE,CACpD,CACF,CACF,CACF,CAAC,KAED,UAAOI,EAAQ,aAAa,EAAE,QAAQ,CACpC,CAAE,KAAM,EAAM,KAAM,KAAM,EAC1B,CAAE,KAAM,EAAM,KAAM,MAAO,EAC3B,CAAE,KAAM,EAAM,KAAM,KAAM,EAC1B,CAAE,KAAM,EAAM,KAAM,KAAM,CAC5B,CAAC,CACH,CAAC,KAED,MAAG,2CAA4C,IAAM,CACnD,MAAMA,KAAU,4BACdJ,EACA,WACAC,EAAe,EACf,MACF,EAAE,aAAa,KACf,UAAOG,EAAQ,aAAa,EAAE,QAAQ,CAAE,SAAU,CAAC,EAAG,SAAU,CAAE,CAAC,KACnE,UAAOA,EAAQ,gBAAgB,EAAE,QAAQ,CAAC,CAAC,CAC7C,CAAC,KAED,MAAG,qEAAsE,IAAM,CAC7E,MAAMD,EAAMF,EAAe,CACzB,cAAe,CACb,KAAM,CACJ,GAAM,CACJ,aAAc,YACd,WAAY,CACV,KAAM,iBACN,WAAY,CAAE,KAAM,cAAe,KAAM,aAAc,CACzD,CACF,CACF,CACF,CACF,CAAC,EACKG,KAAU,4BACdJ,EACA,WACAG,EACA,MACF,EAAE,aAAa,KACf,UAAOC,EAAQ,YAAY,EAAE,QAAQ,CACnC,CACE,OAAQ,OACR,aAAc,GACd,WAAY,CAAE,KAAM,iBAAkB,UAAW,aAAc,CACjE,CACF,CAAC,CACH,CAAC,KAED,MAAG,sEAAuE,IAAM,CAC9E,MAAMD,EAAMF,EAAe,CACzB,cAAe,CACb,KAAM,CACJ,GAAM,CACJ,aAAc,YACd,WAAY,CACV,KAAM,iBACN,WAAY,CAAE,KAAM,cAAe,KAAM,aAAc,CACzD,CACF,EACA,OAAQ,CACN,aAAc,OACd,WAAY,CACV,KAAM,WACN,WAAY,CAAE,KAAM,IAAK,KAAM,GAAI,CACrC,CACF,EACA,IAAS,CACP,aAAc,WACd,WAAY,CACV,KAAM,eACN,WAAY,CAAE,KAAM,IAAK,KAAM,GAAI,CACrC,CACF,CACF,CACF,CACF,CAAC,EACKG,KAAU,4BACdJ,EACA,WACAG,EACA,MACF,EAAE,aAAa,KACf,UAAOC,EAAQ,YAAY,EAAE,QAAQ,CACnC,CACE,OAAQ,OACR,aAAc,GACd,WAAY,CAAE,KAAM,iBAAkB,UAAW,aAAc,CACjE,CACF,CAAC,CACH,CAAC,KAED,MAAG,gDAAiD,IAAM,CACxD,MAAMA,KAAU,4BACdJ,EACA,WACAC,EAAe,EACf,MACF,EAAE,aAAa,KACf,UAAOG,EAAQ,gBAAgB,SAAS,EAAE,KAAK,SAAS,CAC1D,CAAC,KAED,MAAG,6DAA8D,IAAM,CACrE,MAAMD,EAAMF,EAAe,EAC3B,OAAQE,EAAI,WAAW,WAAiC,KACxD,MAAME,KAAS,4BAAyBL,EAAS,WAAYG,EAAK,MAAM,KACxE,UAAOE,EAAO,OAAO,CAAC,EAAE,KAAK,EAAI,KACjC,UAAOA,EAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,QAC3C,0BACF,CACF,CAAC,CACH,CAAC,KAED,YAAS,wBAAyB,IAAM,IACtC,MAAG,yEAA0E,IAAM,CACjF,MAAMC,EAA2D,CAC/D,WAAYL,EAAe,CACzB,cAAe,CACb,KAAM,CACJ,GAAM,CACJ,aAAc,YACd,WAAY,CACV,KAAM,iBACN,WAAY,CAAE,KAAM,cAAe,KAAM,aAAc,CACzD,CACF,EACA,IAAK,CACH,aAAc,OACd,WAAY,CACV,KAAM,WACN,WAAY,CAAE,KAAM,IAAK,KAAM,GAAI,CACrC,CACF,CACF,CACF,CACF,CAAC,EACD,WAAYA,EAAe,CACzB,cAAe,CACb,MAAO,CACL,GAAM,CACJ,aAAc,OACd,WAAY,CACV,KAAM,cACN,WAAY,CAAE,KAAM,cAAe,KAAM,aAAc,CACzD,CACF,CACF,CACF,CACF,CAAC,CACH,KACA,aAAO,yBAAsBK,EAAa,MAAM,CAAC,EAAE,QAAQ,CACzD,CACE,OAAQ,OACR,aAAc,GACd,WAAY,CAAE,KAAM,iBAAkB,UAAW,aAAc,CACjE,EACA,CACE,OAAQ,QACR,aAAc,GACd,WAAY,CAAE,KAAM,cAAe,UAAW,aAAc,CAC9D,CACF,CAAC,CACH,CAAC,KAED,MAAG,uEAAwE,IAAM,CAC/E,MAAMH,EAAMF,EAAe,CACzB,cAAe,CACb,KAAM,CACJ,GAAM,CACJ,aAAc,YACd,WAAY,CACV,KAAM,iBACN,WAAY,CAAE,KAAM,aAAc,CACpC,CACF,CACF,CACF,CACF,CAAC,KACD,aAAO,yBAAsB,CAAE,WAAYE,CAAI,EAAG,MAAM,CAAC,EAAE,QAAQ,CACjE,CACE,OAAQ,OACR,aAAc,GACd,WAAY,CAAE,KAAM,iBAAkB,UAAW,EAAG,CACtD,CACF,CAAC,CACH,CAAC,CACH,CAAC,CACH,CAAC",
4
+ "sourcesContent": ["import { describe, expect, it } from \"vitest\";\n\nimport { type CalInstructionDescriptorDto } from \"./InstructionInfoDto\";\nimport {\n toAccountResets,\n toAccountSchema,\n toDisplayFields,\n toHideRules,\n toInstructionInfoPayload,\n toOwnerAssociations,\n toProgramEnumVariants,\n toValueFlowPorts,\n} from \"./InstructionInfoMapper\";\n\nconst PROGRAM = \"11111111111111111111111111111111\";\n\nfunction makeDescriptor(\n overrides: Partial<CalInstructionDescriptorDto> = {},\n): CalInstructionDescriptorDto {\n return {\n discriminator_hex: \"00000000\",\n instruction_name: \"createAccount\",\n descriptor: {\n data: \"0001sys_data\",\n signatures: { prod: \"prodsig\", test: \"testsig\" },\n },\n ...overrides,\n };\n}\n\ndescribe(\"InstructionInfoMapper\", () => {\n describe(\"toValueFlowPorts\", () => {\n it(\"returns an empty list for undefined input\", () => {\n expect(toValueFlowPorts()).toEqual([]);\n });\n\n it(\"picks only the decoded fields, dropping the signed-TLV descriptor\", () => {\n expect(\n toValueFlowPorts([\n {\n descriptor: \"vfp1\",\n account_indices: [0, 1],\n optional_account_strategy: \"OMITTED\",\n token_value: { kind: \"RESOLVE\", fallback_account: 5 },\n active_when: [\"IS_SIGNER\"],\n },\n ]),\n ).toEqual([\n {\n account_indices: [0, 1],\n optional_account_strategy: \"OMITTED\",\n token_value: { kind: \"RESOLVE\", fallback_account: 5 },\n active_when: [\"IS_SIGNER\"],\n },\n ]);\n });\n\n it(\"leaves the absent optional strategy as undefined\", () => {\n expect(\n toValueFlowPorts([\n {\n descriptor: \"vfp1\",\n account_indices: [0],\n token_value: { kind: \"NATIVE\" },\n },\n ]),\n ).toEqual([\n {\n account_indices: [0],\n optional_account_strategy: undefined,\n token_value: { kind: \"NATIVE\" },\n active_when: undefined,\n },\n ]);\n });\n });\n\n describe(\"toHideRules\", () => {\n it(\"returns an empty list for undefined input\", () => {\n expect(toHideRules()).toEqual([]);\n });\n\n it(\"maps the decoded fields, dropping the signed-TLV descriptor\", () => {\n expect(\n toHideRules([\n {\n descriptor: \"hr1\",\n rule_set_index: 1,\n target: { source: \"ACCOUNT_PATH\", account_index: 2 },\n condition: \"IS_SIGNER\",\n },\n ]),\n ).toEqual([\n {\n rule_set_index: 1,\n target: { source: \"ACCOUNT_PATH\", account_index: 2 },\n condition: \"IS_SIGNER\",\n },\n ]);\n });\n\n it(\"keeps a rule with no condition so its target stays in the requirement set\", () => {\n // The signed TLV reaches the device regardless, and the device resolves\n // the target of every rule it receives.\n expect(\n toHideRules([\n {\n descriptor: \"hrNoCondition\",\n target: { source: \"ACCOUNT_PATH\", account_index: 4 },\n },\n ]),\n ).toEqual([\n {\n rule_set_index: undefined,\n target: { source: \"ACCOUNT_PATH\", account_index: 4 },\n condition: undefined,\n },\n ]);\n });\n });\n\n describe(\"toOwnerAssociations\", () => {\n it(\"returns an empty list for undefined input\", () => {\n expect(toOwnerAssociations(undefined)).toEqual([]);\n });\n\n it(\"wraps CAL's single association into a list\", () => {\n expect(\n toOwnerAssociations({\n account_index: 1,\n owner: { source: \"ACCOUNT_PATH\", account_index: 0 },\n }),\n ).toEqual([\n {\n account_index: 1,\n owner: { source: \"ACCOUNT_PATH\", account_index: 0 },\n },\n ]);\n });\n\n it(\"drops a half-declared pair\", () => {\n expect(toOwnerAssociations({ account_index: 1 })).toEqual([]);\n expect(\n toOwnerAssociations({ owner: { source: \"ACCOUNT_PATH\" } }),\n ).toEqual([]);\n });\n });\n\n describe(\"toAccountResets\", () => {\n it(\"returns an empty list for undefined input\", () => {\n expect(toAccountResets()).toEqual([]);\n });\n\n it(\"maps the decoded fields, dropping the signed-TLV descriptor\", () => {\n expect(\n toAccountResets([\n {\n descriptor: \"ar1\",\n account_index: 2,\n require_pre_balance_zero: true,\n },\n ]),\n ).toEqual([{ account_index: 2, require_pre_balance_zero: true }]);\n });\n\n it(\"passes through value_kind, token, and require_native_pre_balance_zero\", () => {\n expect(\n toAccountResets([\n {\n descriptor: \"ar1\",\n account_index: 3,\n value_kind: \"splToken\",\n token: {\n kind: \"RESOLVE\",\n account_index: 4,\n },\n require_native_pre_balance_zero: true,\n },\n ]),\n ).toEqual([\n {\n account_index: 3,\n value_kind: \"splToken\",\n token: { kind: \"RESOLVE\", account_index: 4 },\n require_native_pre_balance_zero: true,\n },\n ]);\n });\n\n it(\"drops entries missing account_index instead of defaulting to slot 0\", () => {\n expect(\n toAccountResets([\n { descriptor: \"ar0\", account_index: 0 },\n { descriptor: \"arBad\" },\n { descriptor: \"ar1\", account_index: 1 },\n ]),\n ).toEqual([\n { account_index: 0, require_pre_balance_zero: undefined },\n { account_index: 1, require_pre_balance_zero: undefined },\n ]);\n });\n });\n\n describe(\"toDisplayFields\", () => {\n it(\"returns an empty list for undefined input\", () => {\n expect(toDisplayFields()).toEqual([]);\n });\n\n it(\"picks name and param, dropping the signed-TLV descriptor\", () => {\n expect(\n toDisplayFields([\n {\n descriptor: \"df1\",\n name: \"New Account\",\n param: {\n type: \"ACCOUNT\",\n value: { source: \"ACCOUNT_PATH\", account_index: 1 },\n },\n },\n ]),\n ).toEqual([\n {\n name: \"New Account\",\n param: {\n type: \"ACCOUNT\",\n value: { source: \"ACCOUNT_PATH\", account_index: 1 },\n },\n },\n ]);\n });\n\n it(\"falls back to an empty-type param when param is absent\", () => {\n expect(toDisplayFields([{ descriptor: \"df1\" }])).toEqual([\n { name: undefined, param: { type: \"\" } },\n ]);\n });\n });\n\n describe(\"toAccountSchema\", () => {\n it(\"returns undefined for undefined input (no ACCOUNT_SCHEMA check)\", () => {\n expect(toAccountSchema(undefined)).toBeUndefined();\n });\n\n it(\"maps count bounds, remaining_policy, and per-slot constraints\", () => {\n expect(\n toAccountSchema({\n count_min: 2,\n count_max: 4,\n remaining_policy: { signer: \"FORBIDDEN\", writable: \"EITHER\" },\n slots: [\n { signer: \"REQUIRED\", writable: \"EITHER\" },\n { signer: \"EITHER\", writable: \"REQUIRED\" },\n ],\n }),\n ).toEqual({\n count_min: 2,\n count_max: 4,\n remaining_policy: { signer: \"FORBIDDEN\", writable: \"EITHER\" },\n slots: [\n { signer: \"REQUIRED\", writable: \"EITHER\" },\n { signer: \"EITHER\", writable: \"REQUIRED\" },\n ],\n });\n });\n\n it(\"defaults count_min to 0, count_max to 255 (COUNT_UNBOUNDED), remaining_policy and slots to EITHER/empty\", () => {\n expect(toAccountSchema({})).toEqual({\n count_min: 0,\n count_max: 255,\n remaining_policy: { signer: \"EITHER\", writable: \"EITHER\" },\n slots: [],\n });\n });\n\n it(\"defaults an unknown or missing per-field constraint value to EITHER (fails open, unlike ACCOUNT_RESET's value_kind)\", () => {\n expect(\n toAccountSchema({\n count_min: 1,\n count_max: 1,\n // @ts-expect-error exercising a malformed/unexpected value from CAL\n remaining_policy: { signer: \"NOT_A_VALUE\", writable: undefined },\n slots: [{ signer: \"REQUIRED\" } as never],\n }),\n ).toEqual({\n count_min: 1,\n count_max: 1,\n remaining_policy: { signer: \"EITHER\", writable: \"EITHER\" },\n slots: [{ signer: \"REQUIRED\", writable: \"EITHER\" }],\n });\n });\n });\n\n describe(\"toInstructionInfoPayload\", () => {\n it(\"surfaces CAL's decoded JSON (type pool, mint assoc, ports, resets, fields) and ordered substructures\", () => {\n const dto = makeDescriptor({\n idl_descriptor: {\n root_type: 3,\n type_pool: [\n { index: 0, kind: \"STRUCT\", refs: [1] },\n { index: 1, kind: \"U64\" },\n ],\n },\n mint_association: { account_index: 1, mint_index: 3 },\n owner_association: {\n account_index: 1,\n owner: { source: \"ACCOUNT_PATH\", account_index: 0 },\n },\n display_fields: [\n {\n descriptor: \"df1\",\n name: \"New Account\",\n param: {\n type: \"ACCOUNT\",\n value: { source: \"ACCOUNT_PATH\", account_index: 1 },\n },\n },\n ],\n value_flow_ports: [\n {\n descriptor: \"vfp1\",\n account_indices: [0],\n token_value: { kind: \"NATIVE\" },\n },\n ],\n hide_rules: [\n {\n descriptor: \"hr1\",\n rule_set_index: 0,\n target: { source: \"ACCOUNT_PATH\", account_index: 1 },\n condition: \"ACCOUNT_EFFECTS_DISPLAYED_ELSEWHERE\",\n },\n ],\n account_resets: [\n {\n descriptor: \"ar1\",\n account_index: 1,\n require_pre_balance_zero: true,\n },\n ],\n account_schema: {\n count_min: 2,\n count_max: 2,\n slots: [{ signer: \"REQUIRED\", writable: \"EITHER\" }],\n },\n });\n\n const payload = toInstructionInfoPayload(\n PROGRAM,\n \"00000000\",\n dto,\n \"prod\",\n ).unsafeCoerce();\n\n expect(payload).toMatchObject({\n programId: PROGRAM,\n discriminator: \"00000000\",\n instructionInfo: { data: \"0001sys_data\", signature: \"prodsig\" },\n idlDescriptor: {\n rootType: 3,\n typePool: [\n { index: 0, kind: \"STRUCT\", refs: [1] },\n { index: 1, kind: \"U64\" },\n ],\n },\n mintAssociations: [{ account_index: 1, mint_index: 3 }],\n ownerAssociations: [\n {\n account_index: 1,\n owner: { source: \"ACCOUNT_PATH\", account_index: 0 },\n },\n ],\n valueFlowPorts: [\n {\n account_indices: [0],\n optional_account_strategy: undefined,\n token_value: { kind: \"NATIVE\" },\n },\n ],\n hideRules: [\n {\n rule_set_index: 0,\n target: { source: \"ACCOUNT_PATH\", account_index: 1 },\n condition: \"ACCOUNT_EFFECTS_DISPLAYED_ELSEWHERE\",\n },\n ],\n accountResets: [{ account_index: 1, require_pre_balance_zero: true }],\n accountSchema: {\n count_min: 2,\n count_max: 2,\n remaining_policy: { signer: \"EITHER\", writable: \"EITHER\" },\n slots: [{ signer: \"REQUIRED\", writable: \"EITHER\" }],\n },\n displayFields: [\n {\n name: \"New Account\",\n param: {\n type: \"ACCOUNT\",\n value: { source: \"ACCOUNT_PATH\", account_index: 1 },\n },\n },\n ],\n });\n // Substructures carry the signed TLVs for the device, in order.\n expect(payload.substructures).toEqual([\n { kind: 0x00, data: \"df1\" },\n { kind: 0x01, data: \"vfp1\" },\n { kind: 0x02, data: \"hr1\" },\n { kind: 0x03, data: \"ar1\" },\n ]);\n });\n\n it(\"defaults idlDescriptor when CAL omits it\", () => {\n const payload = toInstructionInfoPayload(\n PROGRAM,\n \"00000000\",\n makeDescriptor(),\n \"prod\",\n ).unsafeCoerce();\n expect(payload.idlDescriptor).toEqual({ typePool: [], rootType: 0 });\n expect(payload.mintAssociations).toEqual([]);\n });\n\n it(\"bundles CAL enum_variants into the payload with the mode signature\", () => {\n const dto = makeDescriptor({\n enum_variants: {\n swap: {\n \"46\": {\n variant_name: \"raydiumCP\",\n descriptor: {\n data: \"01_raydium_tlv\",\n signatures: { prod: \"prodsig_v46\", test: \"testsig_v46\" },\n },\n },\n },\n },\n });\n const payload = toInstructionInfoPayload(\n PROGRAM,\n \"00000000\",\n dto,\n \"prod\",\n ).unsafeCoerce();\n expect(payload.enumVariants).toEqual([\n {\n enumId: \"swap\",\n variantIndex: 46,\n descriptor: { data: \"01_raydium_tlv\", signature: \"prodsig_v46\" },\n },\n ]);\n });\n\n it(\"skips enum_variants keyed by a non-u16 index instead of leaking NaN\", () => {\n const dto = makeDescriptor({\n enum_variants: {\n swap: {\n \"46\": {\n variant_name: \"raydiumCP\",\n descriptor: {\n data: \"01_raydium_tlv\",\n signatures: { prod: \"prodsig_v46\", test: \"testsig_v46\" },\n },\n },\n \"7abc\": {\n variant_name: \"junk\",\n descriptor: {\n data: \"junk_tlv\",\n signatures: { prod: \"x\", test: \"x\" },\n },\n },\n \"70000\": {\n variant_name: \"overflow\",\n descriptor: {\n data: \"overflow_tlv\",\n signatures: { prod: \"x\", test: \"x\" },\n },\n },\n },\n },\n });\n const payload = toInstructionInfoPayload(\n PROGRAM,\n \"00000000\",\n dto,\n \"prod\",\n ).unsafeCoerce();\n expect(payload.enumVariants).toEqual([\n {\n enumId: \"swap\",\n variantIndex: 46,\n descriptor: { data: \"01_raydium_tlv\", signature: \"prodsig_v46\" },\n },\n ]);\n });\n\n it(\"selects the signature for the configured mode\", () => {\n const payload = toInstructionInfoPayload(\n PROGRAM,\n \"00000000\",\n makeDescriptor(),\n \"test\",\n ).unsafeCoerce();\n expect(payload.instructionInfo.signature).toBe(\"testsig\");\n });\n\n it(\"returns Left when the configured mode signature is missing\", () => {\n const dto = makeDescriptor();\n delete (dto.descriptor.signatures as { test?: string }).test;\n const result = toInstructionInfoPayload(PROGRAM, \"00000000\", dto, \"test\");\n expect(result.isLeft()).toBe(true);\n expect(result.swap().unsafeCoerce().message).toMatch(\n /missing 'test' signature/,\n );\n });\n });\n\n describe(\"toProgramEnumVariants\", () => {\n it(\"flattens enum variants across all descriptors, dropping malformed keys\", () => {\n const descriptors: Record<string, CalInstructionDescriptorDto> = {\n \"00000000\": makeDescriptor({\n enum_variants: {\n swap: {\n \"46\": {\n variant_name: \"raydiumCP\",\n descriptor: {\n data: \"01_raydium_tlv\",\n signatures: { prod: \"prodsig_v46\", test: \"testsig_v46\" },\n },\n },\n bad: {\n variant_name: \"junk\",\n descriptor: {\n data: \"junk_tlv\",\n signatures: { prod: \"x\", test: \"x\" },\n },\n },\n },\n },\n }),\n \"00000001\": makeDescriptor({\n enum_variants: {\n route: {\n \"12\": {\n variant_name: \"orca\",\n descriptor: {\n data: \"02_orca_tlv\",\n signatures: { prod: \"prodsig_v12\", test: \"testsig_v12\" },\n },\n },\n },\n },\n }),\n };\n expect(toProgramEnumVariants(descriptors, \"prod\")).toEqual([\n {\n enumId: \"swap\",\n variantIndex: 46,\n descriptor: { data: \"01_raydium_tlv\", signature: \"prodsig_v46\" },\n },\n {\n enumId: \"route\",\n variantIndex: 12,\n descriptor: { data: \"02_orca_tlv\", signature: \"prodsig_v12\" },\n },\n ]);\n });\n\n it(\"leaves the signature empty when CAL has none for the configured mode\", () => {\n const dto = makeDescriptor({\n enum_variants: {\n swap: {\n \"46\": {\n variant_name: \"raydiumCP\",\n descriptor: {\n data: \"01_raydium_tlv\",\n signatures: { prod: \"prodsig_v46\" },\n },\n },\n },\n },\n });\n expect(toProgramEnumVariants({ \"00000000\": dto }, \"test\")).toEqual([\n {\n enumId: \"swap\",\n variantIndex: 46,\n descriptor: { data: \"01_raydium_tlv\", signature: \"\" },\n },\n ]);\n });\n });\n});\n"],
5
+ "mappings": "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",
6
6
  "names": ["import_vitest", "import_InstructionInfoMapper", "PROGRAM", "makeDescriptor", "overrides", "dto", "payload", "result", "descriptors"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var l=Object.defineProperty;var T=Object.getOwnPropertyDescriptor;var A=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var y=(e,t)=>{for(var n in t)l(e,n,{get:t[n],enumerable:!0})},N=(e,t,n,S)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of A(t))!c.call(e,o)&&o!==n&&l(e,o,{get:()=>t[o],enumerable:!(S=T(t,o))||S.enumerable});return e};var p=e=>N(l({},"__esModule",{value:!0}),e);var _={};y(_,{SOLANA_CLEAR_SIGN_CONTEXT_SUCCESS_TYPES:()=>C,SolanaContextType:()=>i,SolanaInstructionSubstructureKind:()=>r.SolanaInstructionSubstructureKind,isSolanaContextSuccess:()=>O});module.exports=p(_);var a=require("../../../shared/model/ClearSignContext"),r=require("../../../modules/solana/model/SolanaPayloads");const i={TOKEN:a.ClearSignContextType.SOLANA_TOKEN,LIFI:a.ClearSignContextType.SOLANA_LIFI,TRUSTED_NAME:a.ClearSignContextType.SOLANA_TRUSTED_NAME,BASIC_TRUSTED_NAME:a.ClearSignContextType.SOLANA_BASIC_TRUSTED_NAME,TRANSACTION_CHECK:a.ClearSignContextType.SOLANA_TRANSACTION_CHECK,INSTRUCTION_INFO:a.ClearSignContextType.SOLANA_INSTRUCTION_INFO,ENUM_VARIANT:a.ClearSignContextType.SOLANA_ENUM_VARIANT,TOKEN_INFO:a.ClearSignContextType.SOLANA_TOKEN_INFO,TOKEN_ACCOUNT_STATE:a.ClearSignContextType.SOLANA_TOKEN_ACCOUNT_STATE,ALT_RESOLUTION:a.ClearSignContextType.SOLANA_ALT_RESOLUTION},C=new Set(Object.values(i));function O(e){return C.has(e.type)}0&&(module.exports={SOLANA_CLEAR_SIGN_CONTEXT_SUCCESS_TYPES,SolanaContextType,SolanaInstructionSubstructureKind,isSolanaContextSuccess});
1
+ "use strict";var l=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var T=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var y=(t,e)=>{for(var n in e)l(t,n,{get:e[n],enumerable:!0})},N=(t,e,n,S)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of T(e))!c.call(t,o)&&o!==n&&l(t,o,{get:()=>e[o],enumerable:!(S=A(e,o))||S.enumerable});return t};var p=t=>N(l({},"__esModule",{value:!0}),t);var _={};y(_,{SOLANA_CLEAR_SIGN_CONTEXT_SUCCESS_TYPES:()=>C,SolanaContextType:()=>i,SolanaInstructionSubstructureKind:()=>r.SolanaInstructionSubstructureKind,isSolanaContextSuccess:()=>O});module.exports=p(_);var a=require("../../../shared/model/ClearSignContext"),r=require("../../../modules/solana/model/SolanaPayloads");const i={TOKEN:a.ClearSignContextType.SOLANA_TOKEN,LIFI:a.ClearSignContextType.SOLANA_LIFI,TRUSTED_NAME:a.ClearSignContextType.SOLANA_TRUSTED_NAME,BASIC_TRUSTED_NAME:a.ClearSignContextType.SOLANA_BASIC_TRUSTED_NAME,TRANSACTION_CHECK:a.ClearSignContextType.SOLANA_TRANSACTION_CHECK,INSTRUCTION_INFO:a.ClearSignContextType.SOLANA_INSTRUCTION_INFO,ENUM_VARIANT:a.ClearSignContextType.SOLANA_ENUM_VARIANT,TOKEN_INFO:a.ClearSignContextType.SOLANA_TOKEN_INFO,TOKEN_ACCOUNT_STATE:a.ClearSignContextType.SOLANA_TOKEN_ACCOUNT_STATE,ALT_RESOLUTION:a.ClearSignContextType.SOLANA_ALT_RESOLUTION},C=new Set(Object.values(i));function O(t){return C.has(t.type)}0&&(module.exports={SOLANA_CLEAR_SIGN_CONTEXT_SUCCESS_TYPES,SolanaContextType,SolanaInstructionSubstructureKind,isSolanaContextSuccess});
2
2
  //# sourceMappingURL=SolanaClearSignContext.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/modules/solana/model/SolanaClearSignContext.ts"],
4
- "sourcesContent": ["import { type PkiCertificate } from \"@/modules/multichain/pki/model/PkiCertificate\";\nimport {\n type SolanaAltResolutionPayload,\n type SolanaEnumVariantPayload,\n type SolanaInstructionInfoPayload,\n type SolanaLifiPayload,\n type SolanaTokenAccountStatePayload,\n type SolanaTokenData,\n type SolanaTokenInfoPayload,\n type SolanaTransactionCheckPayload,\n} from \"@/modules/solana/model/SolanaPayloads\";\nimport {\n type ClearSignContext,\n type ClearSignContextSuccess,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\n\n// Re-export Solana payload types so consumers can import from this file\nexport type {\n SolanaAltResolutionPayload,\n SolanaCalAccountReset,\n SolanaCalActiveWhenPredicate,\n SolanaCalDisplayField,\n SolanaCalHideRule,\n SolanaCalMintAssociation,\n SolanaCalOwnerAssociation,\n SolanaCalTokenValue,\n SolanaCalTypePoolEntry,\n SolanaCalValue,\n SolanaCalValueFlowPort,\n SolanaEnumVariantPayload,\n SolanaInstructionEnumVariant,\n SolanaInstructionInfoPayload,\n SolanaInstructionSubstructure,\n SolanaLifiInstructionMeta,\n SolanaLifiPayload,\n SolanaSignedDescriptor,\n SolanaTokenAccountStatePayload,\n SolanaTokenData,\n SolanaTokenInfoPayload,\n SolanaTransactionCheckPayload,\n SolanaTransactionDescriptor,\n} from \"@/modules/solana/model/SolanaPayloads\";\nexport { SolanaInstructionSubstructureKind } from \"@/modules/solana/model/SolanaPayloads\";\n\n/**\n * Solana-specific payload overrides \u2014 contributed to the shared\n * ClearSignContextSuccessPayloads map at the integration boundary.\n */\nexport type SolanaPayloadOverrides = {\n [ClearSignContextType.SOLANA_TOKEN]: {\n payload: SolanaTokenData;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_LIFI]: {\n payload: SolanaLifiPayload;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_TRUSTED_NAME]: {\n payload: Uint8Array;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_BASIC_TRUSTED_NAME]: {\n payload: Uint8Array;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_TRANSACTION_CHECK]: {\n payload: SolanaTransactionCheckPayload;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_INSTRUCTION_INFO]: {\n payload: SolanaInstructionInfoPayload;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_ENUM_VARIANT]: {\n payload: SolanaEnumVariantPayload;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_TOKEN_INFO]: {\n payload: SolanaTokenInfoPayload;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_TOKEN_ACCOUNT_STATE]: {\n payload: SolanaTokenAccountStatePayload;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_ALT_RESOLUTION]: {\n payload: SolanaAltResolutionPayload;\n certificate?: PkiCertificate;\n };\n};\n\nexport const SolanaContextType = {\n TOKEN: ClearSignContextType.SOLANA_TOKEN,\n LIFI: ClearSignContextType.SOLANA_LIFI,\n TRUSTED_NAME: ClearSignContextType.SOLANA_TRUSTED_NAME,\n BASIC_TRUSTED_NAME: ClearSignContextType.SOLANA_BASIC_TRUSTED_NAME,\n TRANSACTION_CHECK: ClearSignContextType.SOLANA_TRANSACTION_CHECK,\n INSTRUCTION_INFO: ClearSignContextType.SOLANA_INSTRUCTION_INFO,\n ENUM_VARIANT: ClearSignContextType.SOLANA_ENUM_VARIANT,\n TOKEN_INFO: ClearSignContextType.SOLANA_TOKEN_INFO,\n TOKEN_ACCOUNT_STATE: ClearSignContextType.SOLANA_TOKEN_ACCOUNT_STATE,\n ALT_RESOLUTION: ClearSignContextType.SOLANA_ALT_RESOLUTION,\n} as const;\n\n/**\n * Union of all Solana-relevant success context types.\n */\nexport type SolanaClearSignContextSuccessType =\n (typeof SolanaContextType)[keyof typeof SolanaContextType];\n\n/**\n * A ClearSignContextSuccess narrowed to only Solana-relevant types.\n */\nexport type SolanaClearSignContextSuccess =\n ClearSignContextSuccess<SolanaClearSignContextSuccessType>;\n\n/**\n * Set of all Solana-relevant success ClearSignContextType values.\n * Used by the type guard below to filter out non-Solana contexts at runtime.\n */\nexport const SOLANA_CLEAR_SIGN_CONTEXT_SUCCESS_TYPES =\n new Set<ClearSignContextType>(Object.values(SolanaContextType));\n\n/**\n * Type guard that narrows a ClearSignContextSuccess to a\n * SolanaClearSignContextSuccess, filtering out non-Solana types.\n */\nexport function isSolanaContextSuccess(\n ctx: ClearSignContext,\n): ctx is SolanaClearSignContextSuccess {\n return SOLANA_CLEAR_SIGN_CONTEXT_SUCCESS_TYPES.has(ctx.type);\n}\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,6CAAAE,EAAA,sBAAAC,EAAA,qGAAAC,IAAA,eAAAC,EAAAL,GAWA,IAAAM,EAIO,2CA4BPC,EAAkD,iDAiD3C,MAAMJ,EAAoB,CAC/B,MAAO,uBAAqB,aAC5B,KAAM,uBAAqB,YAC3B,aAAc,uBAAqB,oBACnC,mBAAoB,uBAAqB,0BACzC,kBAAmB,uBAAqB,yBACxC,iBAAkB,uBAAqB,wBACvC,aAAc,uBAAqB,oBACnC,WAAY,uBAAqB,kBACjC,oBAAqB,uBAAqB,2BAC1C,eAAgB,uBAAqB,qBACvC,EAkBaD,EACX,IAAI,IAA0B,OAAO,OAAOC,CAAiB,CAAC,EAMzD,SAASC,EACdI,EACsC,CACtC,OAAON,EAAwC,IAAIM,EAAI,IAAI,CAC7D",
4
+ "sourcesContent": ["import { type PkiCertificate } from \"@/modules/multichain/pki/model/PkiCertificate\";\nimport {\n type SolanaAltResolutionPayload,\n type SolanaEnumVariantPayload,\n type SolanaInstructionInfoPayload,\n type SolanaLifiPayload,\n type SolanaTokenAccountStatePayload,\n type SolanaTokenData,\n type SolanaTokenInfoPayload,\n type SolanaTransactionCheckPayload,\n} from \"@/modules/solana/model/SolanaPayloads\";\nimport {\n type ClearSignContext,\n type ClearSignContextSuccess,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\n\n// Re-export Solana payload types so consumers can import from this file\nexport type {\n SolanaAltResolutionPayload,\n SolanaCalAccountReset,\n SolanaCalAccountSchema,\n SolanaCalActiveWhenPredicate,\n SolanaCalDisplayField,\n SolanaCalHideRule,\n SolanaCalMintAssociation,\n SolanaCalOwnerAssociation,\n SolanaCalSlotConstraint,\n SolanaCalTokenValue,\n SolanaCalTypePoolEntry,\n SolanaCalValue,\n SolanaCalValueFlowPort,\n SolanaEnumVariantPayload,\n SolanaInstructionEnumVariant,\n SolanaInstructionInfoPayload,\n SolanaInstructionSubstructure,\n SolanaLifiInstructionMeta,\n SolanaLifiPayload,\n SolanaSignedDescriptor,\n SolanaTokenAccountStatePayload,\n SolanaTokenData,\n SolanaTokenInfoPayload,\n SolanaTransactionCheckPayload,\n SolanaTransactionDescriptor,\n} from \"@/modules/solana/model/SolanaPayloads\";\nexport { SolanaInstructionSubstructureKind } from \"@/modules/solana/model/SolanaPayloads\";\n\n/**\n * Solana-specific payload overrides \u2014 contributed to the shared\n * ClearSignContextSuccessPayloads map at the integration boundary.\n */\nexport type SolanaPayloadOverrides = {\n [ClearSignContextType.SOLANA_TOKEN]: {\n payload: SolanaTokenData;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_LIFI]: {\n payload: SolanaLifiPayload;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_TRUSTED_NAME]: {\n payload: Uint8Array;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_BASIC_TRUSTED_NAME]: {\n payload: Uint8Array;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_TRANSACTION_CHECK]: {\n payload: SolanaTransactionCheckPayload;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_INSTRUCTION_INFO]: {\n payload: SolanaInstructionInfoPayload;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_ENUM_VARIANT]: {\n payload: SolanaEnumVariantPayload;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_TOKEN_INFO]: {\n payload: SolanaTokenInfoPayload;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_TOKEN_ACCOUNT_STATE]: {\n payload: SolanaTokenAccountStatePayload;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_ALT_RESOLUTION]: {\n payload: SolanaAltResolutionPayload;\n certificate?: PkiCertificate;\n };\n};\n\nexport const SolanaContextType = {\n TOKEN: ClearSignContextType.SOLANA_TOKEN,\n LIFI: ClearSignContextType.SOLANA_LIFI,\n TRUSTED_NAME: ClearSignContextType.SOLANA_TRUSTED_NAME,\n BASIC_TRUSTED_NAME: ClearSignContextType.SOLANA_BASIC_TRUSTED_NAME,\n TRANSACTION_CHECK: ClearSignContextType.SOLANA_TRANSACTION_CHECK,\n INSTRUCTION_INFO: ClearSignContextType.SOLANA_INSTRUCTION_INFO,\n ENUM_VARIANT: ClearSignContextType.SOLANA_ENUM_VARIANT,\n TOKEN_INFO: ClearSignContextType.SOLANA_TOKEN_INFO,\n TOKEN_ACCOUNT_STATE: ClearSignContextType.SOLANA_TOKEN_ACCOUNT_STATE,\n ALT_RESOLUTION: ClearSignContextType.SOLANA_ALT_RESOLUTION,\n} as const;\n\n/**\n * Union of all Solana-relevant success context types.\n */\nexport type SolanaClearSignContextSuccessType =\n (typeof SolanaContextType)[keyof typeof SolanaContextType];\n\n/**\n * A ClearSignContextSuccess narrowed to only Solana-relevant types.\n */\nexport type SolanaClearSignContextSuccess =\n ClearSignContextSuccess<SolanaClearSignContextSuccessType>;\n\n/**\n * Set of all Solana-relevant success ClearSignContextType values.\n * Used by the type guard below to filter out non-Solana contexts at runtime.\n */\nexport const SOLANA_CLEAR_SIGN_CONTEXT_SUCCESS_TYPES =\n new Set<ClearSignContextType>(Object.values(SolanaContextType));\n\n/**\n * Type guard that narrows a ClearSignContextSuccess to a\n * SolanaClearSignContextSuccess, filtering out non-Solana types.\n */\nexport function isSolanaContextSuccess(\n ctx: ClearSignContext,\n): ctx is SolanaClearSignContextSuccess {\n return SOLANA_CLEAR_SIGN_CONTEXT_SUCCESS_TYPES.has(ctx.type);\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,6CAAAE,EAAA,sBAAAC,EAAA,qGAAAC,IAAA,eAAAC,EAAAL,GAWA,IAAAM,EAIO,2CA8BPC,EAAkD,iDAiD3C,MAAMJ,EAAoB,CAC/B,MAAO,uBAAqB,aAC5B,KAAM,uBAAqB,YAC3B,aAAc,uBAAqB,oBACnC,mBAAoB,uBAAqB,0BACzC,kBAAmB,uBAAqB,yBACxC,iBAAkB,uBAAqB,wBACvC,aAAc,uBAAqB,oBACnC,WAAY,uBAAqB,kBACjC,oBAAqB,uBAAqB,2BAC1C,eAAgB,uBAAqB,qBACvC,EAkBaD,EACX,IAAI,IAA0B,OAAO,OAAOC,CAAiB,CAAC,EAMzD,SAASC,EACdI,EACsC,CACtC,OAAON,EAAwC,IAAIM,EAAI,IAAI,CAC7D",
6
6
  "names": ["SolanaClearSignContext_exports", "__export", "SOLANA_CLEAR_SIGN_CONTEXT_SUCCESS_TYPES", "SolanaContextType", "isSolanaContextSuccess", "__toCommonJS", "import_ClearSignContext", "import_SolanaPayloads", "ctx"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var o=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var c=(e,n)=>{for(var t in n)o(e,t,{get:n[t],enumerable:!0})},d=(e,n,t,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let a of s(n))!p.call(e,a)&&a!==t&&o(e,a,{get:()=>n[a],enumerable:!(r=l(n,a))||r.enumerable});return e};var g=e=>d(o({},"__esModule",{value:!0}),e);var u={};c(u,{SolanaInstructionSubstructureKind:()=>i});module.exports=g(u);var i=(a=>(a[a.DISPLAY_FIELD=0]="DISPLAY_FIELD",a[a.VALUE_FLOW_PORT=1]="VALUE_FLOW_PORT",a[a.HIDE_RULE=2]="HIDE_RULE",a[a.ACCOUNT_RESET=3]="ACCOUNT_RESET",a))(i||{});0&&(module.exports={SolanaInstructionSubstructureKind});
1
+ "use strict";var o=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var c=(e,n)=>{for(var t in n)o(e,t,{get:n[t],enumerable:!0})},d=(e,n,t,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let a of s(n))!p.call(e,a)&&a!==t&&o(e,a,{get:()=>n[a],enumerable:!(r=l(n,a))||r.enumerable});return e};var u=e=>d(o({},"__esModule",{value:!0}),e);var g={};c(g,{SolanaInstructionSubstructureKind:()=>i});module.exports=u(g);var i=(a=>(a[a.DISPLAY_FIELD=0]="DISPLAY_FIELD",a[a.VALUE_FLOW_PORT=1]="VALUE_FLOW_PORT",a[a.HIDE_RULE=2]="HIDE_RULE",a[a.ACCOUNT_RESET=3]="ACCOUNT_RESET",a))(i||{});0&&(module.exports={SolanaInstructionSubstructureKind});
2
2
  //# sourceMappingURL=SolanaPayloads.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/modules/solana/model/SolanaPayloads.ts"],
4
- "sourcesContent": ["// Solana payload types \u2014 used both by Solana loaders and (type-only)\n// referenced by the shared ClearSignContext union for typed-payload variants.\n\nexport type SolanaTokenData = {\n solanaTokenDescriptor: {\n data: string;\n signature: string;\n };\n};\n\nexport type SolanaTransactionDescriptor = {\n data: string;\n descriptorType: string;\n descriptorVersion: string;\n signature: string;\n has_basis_point?: boolean;\n};\n\nexport type SolanaLifiInstructionMeta = {\n program_id: string;\n discriminator_hex?: string;\n has_basis_point?: boolean;\n};\n\nexport type SolanaLifiPayload = {\n descriptors: Record<string, SolanaTransactionDescriptor[]>;\n instructions: SolanaLifiInstructionMeta[];\n};\n\nexport type SolanaTransactionCheckPayload = {\n descriptor: string;\n};\n\n// --- Generic clear-signing payloads ---\n\n// CAL static descriptor payloads. `data` is the signed TLV (hex string);\n// `signature` is the resolved signature for the configured CAL signature\n// kind (`prod` | `test`).\n\nexport type SolanaSignedDescriptor = {\n data: string;\n signature: string;\n};\n\n/**\n * One enum-variant descriptor bundled with an instruction descriptor by CAL.\n * The signed TLV (`descriptor.data`) feeds the host-side type-pool decode\n * cache, `enumId`/`variantIndex` identify which variant it describes (and let\n * the host stream the selected variant's signed descriptor to the device).\n */\nexport type SolanaInstructionEnumVariant = {\n enumId: string;\n variantIndex: number;\n descriptor: SolanaSignedDescriptor;\n};\n\n/**\n * Payload for ClearSignContextType.SOLANA_INSTRUCTION_INFO.\n *\n * `instructionInfo` + `substructures` are the signed TLVs streamed to the\n * device, and `enumVariants` are the signed enum-variant descriptors CAL\n * bundles for the program's enums (used to build the host decode cache). The\n * remaining fields are CAL's decoded JSON consumed host-side by the\n * requirement builder.\n */\nexport type SolanaInstructionInfoPayload = {\n programId: string;\n discriminator: string;\n instructionName?: string;\n instructionInfo: SolanaSignedDescriptor;\n substructures: SolanaInstructionSubstructure[];\n enumVariants: SolanaInstructionEnumVariant[];\n idlDescriptor: {\n typePool: SolanaCalTypePoolEntry[];\n rootType: number;\n };\n mintAssociations: SolanaCalMintAssociation[];\n ownerAssociations: SolanaCalOwnerAssociation[];\n valueFlowPorts: SolanaCalValueFlowPort[];\n accountResets: SolanaCalAccountReset[];\n displayFields: SolanaCalDisplayField[];\n hideRules: SolanaCalHideRule[];\n};\n\nexport enum SolanaInstructionSubstructureKind {\n DISPLAY_FIELD = 0x00,\n VALUE_FLOW_PORT = 0x01,\n HIDE_RULE = 0x02,\n ACCOUNT_RESET = 0x03,\n}\n\nexport type SolanaInstructionSubstructure = {\n kind: SolanaInstructionSubstructureKind;\n // TLV payload (hex string) for the substructure.\n data: string;\n};\n\n// --- Decoded CAL JSON (snake_case mirrors the CAL response) ---\n\nexport type SolanaCalValue = {\n source: string;\n /** ACCOUNT_PATH: index into the instruction's accounts. */\n account_index?: number;\n /** CONSTANT: hex-encoded bytes. */\n data?: string;\n /** ARGUMENT_PATH: decoded steps. */\n path?: { steps: number[] };\n};\n\nexport type SolanaCalTokenValue = {\n kind: string;\n value?: SolanaCalValue;\n account_index?: number;\n /**\n * `RESOLVE` only: account index whose *address* the device uses as the mint\n * when the binding lookup fails through both the mint-association map and\n * `TOKEN_ACCOUNT_STATE` (`accountMintTokenNode.fallbackAccount`).\n */\n fallback_account?: number;\n};\n\n/**\n * One `VALUE_FLOW_PORT.ACTIVE_WHEN` predicate: a bare `ActiveWhenPredicate`\n * name, or `MINT_PREDICATE` with its trailing mint.\n */\nexport type SolanaCalActiveWhenPredicate =\n | string\n | { kind: string; mint?: string };\n\nexport type SolanaCalValueFlowPort = {\n /** Ordered candidate list of account indices (length 1 for a single-account port). */\n account_indices: number[];\n optional_account_strategy?: string;\n token_value: SolanaCalTokenValue;\n /** Port activation predicates; all must pass for the port to be active. */\n active_when?: SolanaCalActiveWhenPredicate[];\n};\n\n/**\n * One `HIDE_RULE` substructure: a `(rule_set_index, target, condition)` triple.\n * `condition` is non-optional in the TLV, but it stays optional here: the signed\n * substructure reaches the device either way, so a rule whose condition CAL\n * failed to name must still be surfaced \u2014 dropping it would lose the `target`\n * the device resolves for every rule.\n */\nexport type SolanaCalHideRule = {\n rule_set_index?: number;\n target?: SolanaCalValue;\n condition?: string;\n};\n\n/**\n * An `OWNER_ASSOC_ACCOUNT` / `OWNER_ASSOC_OWNER` pair: binds a token account to\n * its owner, seeding the transaction-scoped owner map the `IS_SIGNER` /\n * `IS_ANOTHER_SIGNER` predicates read.\n */\nexport type SolanaCalOwnerAssociation = {\n account_index: number;\n owner: SolanaCalValue;\n};\n\nexport type SolanaCalAccountReset = {\n account_index: number;\n require_pre_balance_zero?: boolean;\n};\n\nexport type SolanaCalDisplayField = {\n name?: string;\n param: { type: string; value?: SolanaCalValue; token?: SolanaCalValue };\n};\n\nexport type SolanaCalTypePoolEntry = {\n index: number;\n kind: string;\n refs?: number[];\n size?: number;\n encoding?: number;\n len_kind?: string;\n flag_kind?: string;\n sentinel?: string;\n disc_kind?: string;\n total_variants?: number;\n enum_id?: string;\n};\n\nexport type SolanaCalMintAssociation = {\n account_index: number;\n mint_index: number;\n};\n\n/**\n * Payload for ClearSignContextType.SOLANA_ENUM_VARIANT: one signed\n * ENUM_VARIANT descriptor for a `(programId, enumId, variantIndex)` triple.\n */\nexport type SolanaEnumVariantPayload = {\n programId: string;\n enumId: string;\n variantIndex: number;\n descriptor: SolanaSignedDescriptor;\n};\n\n/**\n * Payload for ClearSignContextType.SOLANA_TOKEN_INFO, keyed by mint pubkey.\n * Distinct from the legacy SOLANA_TOKEN context.\n */\nexport type SolanaTokenInfoPayload = {\n mint: string;\n descriptor: SolanaSignedDescriptor;\n};\n\n// --- Dynamic descriptor payloads (challenge-bound) ---\n//\n// Each payload carries the raw signed TLV bytes decoded from the backend's\n// hex `signedDescriptor`.\n\nexport type SolanaTokenAccountStatePayload = {\n descriptor: Uint8Array;\n mint?: string;\n};\n\nexport type SolanaAltResolutionPayload = {\n descriptor: Uint8Array;\n resolvedAddress?: string;\n};\n\n// SOLANA_TRUSTED_NAME (generic flow, with 2-byte length prefix) is emitted by\n// SolanaTrustedNameContextLoader. SOLANA_BASIC_TRUSTED_NAME (basic flow, raw\n// bytes) is emitted by OwnerInfoContextLoader. Both carry `payload: Uint8Array`.\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,uCAAAE,IAAA,eAAAC,EAAAH,GAoFO,IAAKE,OACVA,IAAA,cAAgB,GAAhB,gBACAA,IAAA,gBAAkB,GAAlB,kBACAA,IAAA,UAAY,GAAZ,YACAA,IAAA,cAAgB,GAAhB,gBAJUA,OAAA",
4
+ "sourcesContent": ["// Solana payload types \u2014 used both by Solana loaders and (type-only)\n// referenced by the shared ClearSignContext union for typed-payload variants.\n\nexport type SolanaTokenData = {\n solanaTokenDescriptor: {\n data: string;\n signature: string;\n };\n};\n\nexport type SolanaTransactionDescriptor = {\n data: string;\n descriptorType: string;\n descriptorVersion: string;\n signature: string;\n has_basis_point?: boolean;\n};\n\nexport type SolanaLifiInstructionMeta = {\n program_id: string;\n discriminator_hex?: string;\n has_basis_point?: boolean;\n};\n\nexport type SolanaLifiPayload = {\n descriptors: Record<string, SolanaTransactionDescriptor[]>;\n instructions: SolanaLifiInstructionMeta[];\n};\n\nexport type SolanaTransactionCheckPayload = {\n descriptor: string;\n};\n\n// --- Generic clear-signing payloads ---\n\n// CAL static descriptor payloads. `data` is the signed TLV (hex string);\n// `signature` is the resolved signature for the configured CAL signature\n// kind (`prod` | `test`).\n\nexport type SolanaSignedDescriptor = {\n data: string;\n signature: string;\n};\n\n/**\n * One enum-variant descriptor bundled with an instruction descriptor by CAL.\n * The signed TLV (`descriptor.data`) feeds the host-side type-pool decode\n * cache, `enumId`/`variantIndex` identify which variant it describes (and let\n * the host stream the selected variant's signed descriptor to the device).\n */\nexport type SolanaInstructionEnumVariant = {\n enumId: string;\n variantIndex: number;\n descriptor: SolanaSignedDescriptor;\n};\n\n/**\n * Payload for ClearSignContextType.SOLANA_INSTRUCTION_INFO.\n *\n * `instructionInfo` + `substructures` are the signed TLVs streamed to the\n * device, and `enumVariants` are the signed enum-variant descriptors CAL\n * bundles for the program's enums (used to build the host decode cache). The\n * remaining fields are CAL's decoded JSON consumed host-side by the\n * requirement builder.\n */\nexport type SolanaInstructionInfoPayload = {\n programId: string;\n discriminator: string;\n instructionName?: string;\n instructionInfo: SolanaSignedDescriptor;\n substructures: SolanaInstructionSubstructure[];\n enumVariants: SolanaInstructionEnumVariant[];\n idlDescriptor: {\n typePool: SolanaCalTypePoolEntry[];\n rootType: number;\n };\n mintAssociations: SolanaCalMintAssociation[];\n ownerAssociations: SolanaCalOwnerAssociation[];\n valueFlowPorts: SolanaCalValueFlowPort[];\n accountResets: SolanaCalAccountReset[];\n displayFields: SolanaCalDisplayField[];\n hideRules: SolanaCalHideRule[];\n accountSchema?: SolanaCalAccountSchema;\n};\n\nexport enum SolanaInstructionSubstructureKind {\n DISPLAY_FIELD = 0x00,\n VALUE_FLOW_PORT = 0x01,\n HIDE_RULE = 0x02,\n ACCOUNT_RESET = 0x03,\n}\n\nexport type SolanaInstructionSubstructure = {\n kind: SolanaInstructionSubstructureKind;\n // TLV payload (hex string) for the substructure.\n data: string;\n};\n\n// --- Decoded CAL JSON (snake_case mirrors the CAL response) ---\n\nexport type SolanaCalValue = {\n source: string;\n /** ACCOUNT_PATH: index into the instruction's accounts. */\n account_index?: number;\n /** CONSTANT: hex-encoded bytes. */\n data?: string;\n /** ARGUMENT_PATH: decoded steps. */\n path?: { steps: number[] };\n};\n\nexport type SolanaCalTokenValue = {\n kind: string;\n value?: SolanaCalValue;\n account_index?: number;\n /**\n * `RESOLVE` only: account index whose *address* the device uses as the mint\n * when the binding lookup fails through both the mint-association map and\n * `TOKEN_ACCOUNT_STATE` (`accountMintTokenNode.fallbackAccount`).\n */\n fallback_account?: number;\n};\n\n/**\n * One `VALUE_FLOW_PORT.ACTIVE_WHEN` predicate: a bare `ActiveWhenPredicate`\n * name, or `MINT_PREDICATE` with its trailing mint.\n */\nexport type SolanaCalActiveWhenPredicate =\n | string\n | { kind: string; mint?: string };\n\nexport type SolanaCalValueFlowPort = {\n /** Ordered candidate list of account indices (length 1 for a single-account port). */\n account_indices: number[];\n optional_account_strategy?: string;\n token_value: SolanaCalTokenValue;\n /** Port activation predicates; all must pass for the port to be active. */\n active_when?: SolanaCalActiveWhenPredicate[];\n};\n\n/**\n * One `HIDE_RULE` substructure: a `(rule_set_index, target, condition)` triple.\n * `condition` is non-optional in the TLV, but it stays optional here: the signed\n * substructure reaches the device either way, so a rule whose condition CAL\n * failed to name must still be surfaced \u2014 dropping it would lose the `target`\n * the device resolves for every rule.\n */\nexport type SolanaCalHideRule = {\n rule_set_index?: number;\n target?: SolanaCalValue;\n condition?: string;\n};\n\n/**\n * An `OWNER_ASSOC_ACCOUNT` / `OWNER_ASSOC_OWNER` pair: binds a token account to\n * its owner, seeding the transaction-scoped owner map the `IS_SIGNER` /\n * `IS_ANOTHER_SIGNER` predicates read.\n */\nexport type SolanaCalOwnerAssociation = {\n account_index: number;\n owner: SolanaCalValue;\n};\n\nexport type SolanaCalAccountReset = {\n account_index: number;\n require_pre_balance_zero?: boolean;\n value_kind?: string;\n token?: SolanaCalTokenValue;\n require_native_pre_balance_zero?: boolean;\n};\n\nexport type SolanaCalSlotConstraint = {\n signer: \"FORBIDDEN\" | \"EITHER\" | \"REQUIRED\";\n writable: \"FORBIDDEN\" | \"EITHER\" | \"REQUIRED\";\n};\n\nexport type SolanaCalAccountSchema = {\n count_min: number;\n /** 255 = COUNT_UNBOUNDED (no upper limit). */\n count_max: number;\n remaining_policy: SolanaCalSlotConstraint;\n slots: SolanaCalSlotConstraint[];\n};\n\nexport type SolanaCalDisplayField = {\n name?: string;\n param: { type: string; value?: SolanaCalValue; token?: SolanaCalValue };\n};\n\nexport type SolanaCalTypePoolEntry = {\n index: number;\n kind: string;\n refs?: number[];\n size?: number;\n encoding?: number;\n len_kind?: string;\n flag_kind?: string;\n sentinel?: string;\n disc_kind?: string;\n total_variants?: number;\n enum_id?: string;\n};\n\nexport type SolanaCalMintAssociation = {\n account_index: number;\n mint_index: number;\n};\n\n/**\n * Payload for ClearSignContextType.SOLANA_ENUM_VARIANT: one signed\n * ENUM_VARIANT descriptor for a `(programId, enumId, variantIndex)` triple.\n */\nexport type SolanaEnumVariantPayload = {\n programId: string;\n enumId: string;\n variantIndex: number;\n descriptor: SolanaSignedDescriptor;\n};\n\n/**\n * Payload for ClearSignContextType.SOLANA_TOKEN_INFO, keyed by mint pubkey.\n * Distinct from the legacy SOLANA_TOKEN context.\n */\nexport type SolanaTokenInfoPayload = {\n mint: string;\n descriptor: SolanaSignedDescriptor;\n};\n\n// --- Dynamic descriptor payloads (challenge-bound) ---\n//\n// Each payload carries the raw signed TLV bytes decoded from the backend's\n// hex `signedDescriptor`.\n\nexport type SolanaTokenAccountStatePayload = {\n descriptor: Uint8Array;\n mint?: string;\n};\n\nexport type SolanaAltResolutionPayload = {\n descriptor: Uint8Array;\n resolvedAddress?: string;\n};\n\n// SOLANA_TRUSTED_NAME (generic flow, with 2-byte length prefix) is emitted by\n// SolanaTrustedNameContextLoader. SOLANA_BASIC_TRUSTED_NAME (basic flow, raw\n// bytes) is emitted by OwnerInfoContextLoader. Both carry `payload: Uint8Array`.\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,uCAAAE,IAAA,eAAAC,EAAAH,GAqFO,IAAKE,OACVA,IAAA,cAAgB,GAAhB,gBACAA,IAAA,gBAAkB,GAAlB,kBACAA,IAAA,UAAY,GAAZ,YACAA,IAAA,cAAgB,GAAhB,gBAJUA,OAAA",
6
6
  "names": ["SolanaPayloads_exports", "__export", "SolanaInstructionSubstructureKind", "__toCommonJS"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var p=Object.defineProperty;var g=Object.getOwnPropertyDescriptor;var S=Object.getOwnPropertyNames;var T=Object.prototype.hasOwnProperty;var h=(r,t)=>{for(var o in t)p(r,o,{get:t[o],enumerable:!0})},D=(r,t,o,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let e of S(t))!T.call(r,e)&&e!==o&&p(r,e,{get:()=>t[e],enumerable:!(n=g(t,e))||n.enumerable});return r};var C=r=>D(p({},"__esModule",{value:!0}),r),l=(r,t,o,n)=>{for(var e=n>1?void 0:n?g(t,o):t,i=r.length-1,c;i>=0;i--)(c=r[i])&&(e=(n?c(t,o,e):c(e))||e);return n&&e&&p(t,o,e),e},u=(r,t)=>(o,n)=>t(o,n,r);var A={};h(A,{HttpTokenAccountStateDataSource:()=>a});module.exports=C(A);var m=require("inversify"),s=require("purify-ts"),f=require("../../../../config/di/configTypes"),k=require("../../../../shared/network/di/networkTypes"),d=require("../../../../shared/utils/HexStringUtils"),y=require("../../../../shared/utils/signedDescriptorDto");let a=class{constructor(t,o){this.config=t;this.http=o}async getTokenAccountState({tokenAccount:t,challenge:o}){let n;try{n=await this.http.get(`${this.config.metadataServiceDomain.url}/v2/solana/token-account-state/${t}`,{params:{challenge:o}})}catch(e){const i=e instanceof Error?e.message:String(e);return(0,s.Left)(new Error(`[ContextModule] HttpTokenAccountStateDataSource: Failed to fetch token account state: ${i}`))}return y.signedDescriptorDtoCodec.decode(n).caseOf({Left:e=>(0,s.Left)(new Error(`[ContextModule] HttpTokenAccountStateDataSource: malformed response for ${t}: ${e}`)),Right:e=>{let i;try{i=d.HexStringUtils.hexToBytes(e.signedDescriptor)}catch(c){return(0,s.Left)(new Error(`[ContextModule] HttpTokenAccountStateDataSource: invalid hex in signedDescriptor for ${t}: ${c.message}`))}return(0,s.Right)({tokenAccount:t,descriptor:i,mint:n.mint,keyId:e.keyId,keyUsage:e.keyUsage})}})}};a=l([(0,m.injectable)(),u(0,(0,m.inject)(f.configTypes.Config)),u(1,(0,m.inject)(k.networkTypes.NetworkClient))],a);0&&(module.exports={HttpTokenAccountStateDataSource});
1
+ "use strict";var p=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var h=Object.getOwnPropertyNames;var y=Object.prototype.hasOwnProperty;var T=(n,e)=>{for(var o in e)p(n,o,{get:e[o],enumerable:!0})},w=(n,e,o,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of h(e))!y.call(n,t)&&t!==o&&p(n,t,{get:()=>e[t],enumerable:!(r=m(e,t))||r.enumerable});return n};var b=n=>w(p({},"__esModule",{value:!0}),n),d=(n,e,o,r)=>{for(var t=r>1?void 0:r?m(e,o):e,i=n.length-1,c;i>=0;i--)(c=n[i])&&(t=(r?c(e,o,t):c(t))||t);return r&&t&&p(e,o,t),t},l=(n,e)=>(o,r)=>e(o,r,n);var v={};T(v,{HttpTokenAccountStateDataSource:()=>g});module.exports=b(v);var a=require("inversify"),s=require("purify-ts"),u=require("../../../../config/di/configTypes"),f=require("../../../../shared/network/di/networkTypes"),k=require("../../../../shared/utils/HexStringUtils"),S=require("../../../../shared/utils/signedDescriptorDto");let g=class{constructor(e,o,r){this.config=e;this.http=r;this.logger=o("HttpTokenAccountStateDataSource")}logger;async getTokenAccountState({tokenAccount:e,challenge:o}){let r;try{r=await this.http.get(`${this.config.metadataServiceDomain.url}/v2/solana/token-account-state/${e}`,{params:{challenge:o}})}catch(t){const i=t instanceof Error?t.message:String(t);return(0,s.Left)(new Error(`[ContextModule] HttpTokenAccountStateDataSource: Failed to fetch token account state: ${i}`))}return S.signedDescriptorDtoCodec.decode(r).caseOf({Left:t=>(0,s.Left)(new Error(`[ContextModule] HttpTokenAccountStateDataSource: malformed response for ${e}: ${t}`)),Right:t=>{r.owner!==void 0&&r.mint===void 0&&this.logger.warn("[getTokenAccountState] response has owner but no mint \u2014 canonical-ATA check will fail and the OWNER binding will be dropped by the device",{data:{tokenAccount:e}});let i;try{i=k.HexStringUtils.hexToBytes(t.signedDescriptor)}catch(c){return(0,s.Left)(new Error(`[ContextModule] HttpTokenAccountStateDataSource: invalid hex in signedDescriptor for ${e}: ${c.message}`))}return r.nativePreBalance===void 0&&this.logger.debug("[getTokenAccountState] nativePreBalance absent in response \u2014 native resets will not attest wrappable excess",{data:{tokenAccount:e}}),(0,s.Right)({tokenAccount:e,descriptor:i,mint:r.mint,keyId:t.keyId,keyUsage:t.keyUsage})}})}};g=d([(0,a.injectable)(),l(0,(0,a.inject)(u.configTypes.Config)),l(1,(0,a.inject)(u.configTypes.ContextModuleLoggerFactory)),l(2,(0,a.inject)(f.networkTypes.NetworkClient))],g);0&&(module.exports={HttpTokenAccountStateDataSource});
2
2
  //# sourceMappingURL=HttpTokenAccountStateDataSource.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.ts"],
4
- "sourcesContent": ["import { DmkNetworkClient } from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\nimport { Either, Left, Right } from \"purify-ts\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { type ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\nimport { networkTypes } from \"@/shared/network/di/networkTypes\";\nimport { HexStringUtils } from \"@/shared/utils/HexStringUtils\";\nimport { signedDescriptorDtoCodec } from \"@/shared/utils/signedDescriptorDto\";\n\nimport {\n type GetTokenAccountStateParams,\n type TokenAccountStateDataSource,\n type TokenAccountStateResult,\n} from \"./TokenAccountStateDataSource\";\n\ntype TokenAccountStateResponseDto = {\n descriptorType?: string;\n descriptorVersion?: number;\n tokenAccount?: string;\n mint?: string;\n owner?: string;\n preBalance?: number;\n signedDescriptor: string;\n keyId: string;\n keyUsage: string;\n};\n\n@injectable()\nexport class HttpTokenAccountStateDataSource\n implements TokenAccountStateDataSource\n{\n constructor(\n @inject(configTypes.Config)\n private readonly config: ContextModuleServiceConfig,\n @inject(networkTypes.NetworkClient)\n private readonly http: DmkNetworkClient,\n ) {}\n\n public async getTokenAccountState({\n tokenAccount,\n challenge,\n }: GetTokenAccountStateParams): Promise<\n Either<Error, TokenAccountStateResult>\n > {\n let dto: TokenAccountStateResponseDto;\n try {\n dto = (await this.http.get(\n `${this.config.metadataServiceDomain.url}/v2/solana/token-account-state/${tokenAccount}`,\n { params: { challenge } },\n )) as TokenAccountStateResponseDto;\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n return Left(\n new Error(\n `[ContextModule] HttpTokenAccountStateDataSource: Failed to fetch token account state: ${reason}`,\n ),\n );\n }\n\n return signedDescriptorDtoCodec\n .decode(dto)\n .caseOf<Either<Error, TokenAccountStateResult>>({\n Left: (error) =>\n Left(\n new Error(\n `[ContextModule] HttpTokenAccountStateDataSource: malformed response for ${tokenAccount}: ${error}`,\n ),\n ),\n Right: (validated) => {\n let descriptor: Uint8Array;\n try {\n descriptor = HexStringUtils.hexToBytes(validated.signedDescriptor);\n } catch (error) {\n return Left(\n new Error(\n `[ContextModule] HttpTokenAccountStateDataSource: invalid hex in signedDescriptor for ${tokenAccount}: ${(error as Error).message}`,\n ),\n );\n }\n\n return Right({\n tokenAccount,\n descriptor,\n mint: dto.mint,\n keyId: validated.keyId,\n keyUsage: validated.keyUsage,\n });\n },\n });\n }\n}\n"],
5
- "mappings": "okBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,qCAAAE,IAAA,eAAAC,EAAAH,GACA,IAAAI,EAAmC,qBACnCC,EAAoC,qBAEpCC,EAA4B,mCAE5BC,EAA6B,4CAC7BC,EAA+B,yCAC/BC,EAAyC,8CAqBlC,IAAMC,EAAN,KAEP,CACE,YAEmBC,EAEAC,EACjB,CAHiB,YAAAD,EAEA,UAAAC,CAChB,CAEH,MAAa,qBAAqB,CAChC,aAAAC,EACA,UAAAC,CACF,EAEE,CACA,IAAIC,EACJ,GAAI,CACFA,EAAO,MAAM,KAAK,KAAK,IACrB,GAAG,KAAK,OAAO,sBAAsB,GAAG,kCAAkCF,CAAY,GACtF,CAAE,OAAQ,CAAE,UAAAC,CAAU,CAAE,CAC1B,CACF,OAASE,EAAO,CACd,MAAMC,EAASD,aAAiB,MAAQA,EAAM,QAAU,OAAOA,CAAK,EACpE,SAAO,QACL,IAAI,MACF,yFAAyFC,CAAM,EACjG,CACF,CACF,CAEA,OAAO,2BACJ,OAAOF,CAAG,EACV,OAA+C,CAC9C,KAAOC,MACL,QACE,IAAI,MACF,2EAA2EH,CAAY,KAAKG,CAAK,EACnG,CACF,EACF,MAAQE,GAAc,CACpB,IAAIC,EACJ,GAAI,CACFA,EAAa,iBAAe,WAAWD,EAAU,gBAAgB,CACnE,OAASF,EAAO,CACd,SAAO,QACL,IAAI,MACF,wFAAwFH,CAAY,KAAMG,EAAgB,OAAO,EACnI,CACF,CACF,CAEA,SAAO,SAAM,CACX,aAAAH,EACA,WAAAM,EACA,KAAMJ,EAAI,KACV,MAAOG,EAAU,MACjB,SAAUA,EAAU,QACtB,CAAC,CACH,CACF,CAAC,CACL,CACF,EA9DaR,EAANU,EAAA,IADN,cAAW,EAKPC,EAAA,eAAO,cAAY,MAAM,GAEzBA,EAAA,eAAO,eAAa,aAAa,IANzBX",
6
- "names": ["HttpTokenAccountStateDataSource_exports", "__export", "HttpTokenAccountStateDataSource", "__toCommonJS", "import_inversify", "import_purify_ts", "import_configTypes", "import_networkTypes", "import_HexStringUtils", "import_signedDescriptorDto", "HttpTokenAccountStateDataSource", "config", "http", "tokenAccount", "challenge", "dto", "error", "reason", "validated", "descriptor", "__decorateClass", "__decorateParam"]
4
+ "sourcesContent": ["import {\n DmkNetworkClient,\n LoggerPublisherService,\n} from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\nimport { Either, Left, Right } from \"purify-ts\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { type ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\nimport { networkTypes } from \"@/shared/network/di/networkTypes\";\nimport { HexStringUtils } from \"@/shared/utils/HexStringUtils\";\nimport { signedDescriptorDtoCodec } from \"@/shared/utils/signedDescriptorDto\";\n\nimport {\n type GetTokenAccountStateParams,\n type TokenAccountStateDataSource,\n type TokenAccountStateResult,\n} from \"./TokenAccountStateDataSource\";\n\ntype TokenAccountStateResponseDto = {\n descriptorType?: string;\n descriptorVersion?: number;\n tokenAccount?: string;\n mint?: string;\n owner?: string;\n preBalance?: number;\n nativePreBalance?: number; // wrappable lamport excess; absent = old backend\n signedDescriptor: string;\n keyId: string;\n keyUsage: string;\n};\n\n@injectable()\nexport class HttpTokenAccountStateDataSource\n implements TokenAccountStateDataSource\n{\n private logger: LoggerPublisherService;\n\n constructor(\n @inject(configTypes.Config)\n private readonly config: ContextModuleServiceConfig,\n @inject(configTypes.ContextModuleLoggerFactory)\n loggerFactory: (tag: string) => LoggerPublisherService,\n @inject(networkTypes.NetworkClient)\n private readonly http: DmkNetworkClient,\n ) {\n this.logger = loggerFactory(\"HttpTokenAccountStateDataSource\");\n }\n\n public async getTokenAccountState({\n tokenAccount,\n challenge,\n }: GetTokenAccountStateParams): Promise<\n Either<Error, TokenAccountStateResult>\n > {\n let dto: TokenAccountStateResponseDto;\n try {\n dto = (await this.http.get(\n `${this.config.metadataServiceDomain.url}/v2/solana/token-account-state/${tokenAccount}`,\n { params: { challenge } },\n )) as TokenAccountStateResponseDto;\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n return Left(\n new Error(\n `[ContextModule] HttpTokenAccountStateDataSource: Failed to fetch token account state: ${reason}`,\n ),\n );\n }\n\n return signedDescriptorDtoCodec\n .decode(dto)\n .caseOf<Either<Error, TokenAccountStateResult>>({\n Left: (error) =>\n Left(\n new Error(\n `[ContextModule] HttpTokenAccountStateDataSource: malformed response for ${tokenAccount}: ${error}`,\n ),\n ),\n Right: (validated) => {\n if (dto.owner !== undefined && dto.mint === undefined) {\n this.logger.warn(\n \"[getTokenAccountState] response has owner but no mint \u2014 \" +\n \"canonical-ATA check will fail and the OWNER binding will be dropped by the device\",\n { data: { tokenAccount } },\n );\n }\n\n let descriptor: Uint8Array;\n try {\n descriptor = HexStringUtils.hexToBytes(validated.signedDescriptor);\n } catch (error) {\n return Left(\n new Error(\n `[ContextModule] HttpTokenAccountStateDataSource: invalid hex in signedDescriptor for ${tokenAccount}: ${(error as Error).message}`,\n ),\n );\n }\n\n if (dto.nativePreBalance === undefined) {\n this.logger.debug(\n \"[getTokenAccountState] nativePreBalance absent in response \u2014 native resets will not attest wrappable excess\",\n { data: { tokenAccount } },\n );\n }\n\n return Right({\n tokenAccount,\n descriptor,\n mint: dto.mint,\n keyId: validated.keyId,\n keyUsage: validated.keyUsage,\n });\n },\n });\n }\n}\n"],
5
+ "mappings": "okBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,qCAAAE,IAAA,eAAAC,EAAAH,GAIA,IAAAI,EAAmC,qBACnCC,EAAoC,qBAEpCC,EAA4B,mCAE5BC,EAA6B,4CAC7BC,EAA+B,yCAC/BC,EAAyC,8CAsBlC,IAAMC,EAAN,KAEP,CAGE,YAEmBC,EAEjBC,EAEiBC,EACjB,CALiB,YAAAF,EAIA,UAAAE,EAEjB,KAAK,OAASD,EAAc,iCAAiC,CAC/D,CAXQ,OAaR,MAAa,qBAAqB,CAChC,aAAAE,EACA,UAAAC,CACF,EAEE,CACA,IAAIC,EACJ,GAAI,CACFA,EAAO,MAAM,KAAK,KAAK,IACrB,GAAG,KAAK,OAAO,sBAAsB,GAAG,kCAAkCF,CAAY,GACtF,CAAE,OAAQ,CAAE,UAAAC,CAAU,CAAE,CAC1B,CACF,OAASE,EAAO,CACd,MAAMC,EAASD,aAAiB,MAAQA,EAAM,QAAU,OAAOA,CAAK,EACpE,SAAO,QACL,IAAI,MACF,yFAAyFC,CAAM,EACjG,CACF,CACF,CAEA,OAAO,2BACJ,OAAOF,CAAG,EACV,OAA+C,CAC9C,KAAOC,MACL,QACE,IAAI,MACF,2EAA2EH,CAAY,KAAKG,CAAK,EACnG,CACF,EACF,MAAQE,GAAc,CAChBH,EAAI,QAAU,QAAaA,EAAI,OAAS,QAC1C,KAAK,OAAO,KACV,iJAEA,CAAE,KAAM,CAAE,aAAAF,CAAa,CAAE,CAC3B,EAGF,IAAIM,EACJ,GAAI,CACFA,EAAa,iBAAe,WAAWD,EAAU,gBAAgB,CACnE,OAASF,EAAO,CACd,SAAO,QACL,IAAI,MACF,wFAAwFH,CAAY,KAAMG,EAAgB,OAAO,EACnI,CACF,CACF,CAEA,OAAID,EAAI,mBAAqB,QAC3B,KAAK,OAAO,MACV,mHACA,CAAE,KAAM,CAAE,aAAAF,CAAa,CAAE,CAC3B,KAGK,SAAM,CACX,aAAAA,EACA,WAAAM,EACA,KAAMJ,EAAI,KACV,MAAOG,EAAU,MACjB,SAAUA,EAAU,QACtB,CAAC,CACH,CACF,CAAC,CACL,CACF,EAnFaT,EAANW,EAAA,IADN,cAAW,EAOPC,EAAA,eAAO,cAAY,MAAM,GAEzBA,EAAA,eAAO,cAAY,0BAA0B,GAE7CA,EAAA,eAAO,eAAa,aAAa,IAVzBZ",
6
+ "names": ["HttpTokenAccountStateDataSource_exports", "__export", "HttpTokenAccountStateDataSource", "__toCommonJS", "import_inversify", "import_purify_ts", "import_configTypes", "import_networkTypes", "import_HexStringUtils", "import_signedDescriptorDto", "HttpTokenAccountStateDataSource", "config", "loggerFactory", "http", "tokenAccount", "challenge", "dto", "error", "reason", "validated", "descriptor", "__decorateClass", "__decorateParam"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var r=require("purify-ts"),e=require("vitest"),s=require("./HttpTokenAccountStateDataSource");(0,e.describe)("HttpTokenAccountStateDataSource",()=>{let n,o;const a="TokenAccountAddrXXXXXXXXXXXXXXXXXXXXXXXXXXX",c="deadbeef",i={metadataServiceDomain:{url:"https://nft.api.ledger.com"}};(0,e.beforeEach)(()=>{e.vi.clearAllMocks(),o={get:e.vi.fn()},n=new s.HttpTokenAccountStateDataSource(i,o)}),(0,e.it)("calls the metadata endpoint with the challenge param",async()=>{o.get.mockResolvedValue({descriptorType:"token_account_state",signedDescriptor:"01020304",keyId:"tas_key",keyUsage:"coin_meta"}),await n.getTokenAccountState({tokenAccount:a,challenge:c}),(0,e.expect)(o.get).toHaveBeenCalledWith(`https://nft.api.ledger.com/v2/solana/token-account-state/${a}`,{params:{challenge:c}})}),(0,e.it)("decodes signedDescriptor hex into Uint8Array",async()=>{o.get.mockResolvedValue({signedDescriptor:"deadbeef",keyId:"k",keyUsage:"u"});const t=await n.getTokenAccountState({tokenAccount:a,challenge:c});(0,e.expect)(t).toEqual((0,r.Right)({tokenAccount:a,descriptor:new Uint8Array([222,173,190,239]),keyId:"k",keyUsage:"u"}))}),(0,e.it)("returns Left on malformed response (missing signedDescriptor)",async()=>{o.get.mockResolvedValue({keyId:"k",keyUsage:"u"});const t=await n.getTokenAccountState({tokenAccount:a,challenge:c});(0,e.expect)(t.isLeft()).toBe(!0),(0,e.expect)(t.extract().message).toMatch(new RegExp(String.raw`\[ContextModule\] HttpTokenAccountStateDataSource: malformed response for ${a}:`))}),(0,e.it)("returns Left when signedDescriptor is not valid hex",async()=>{o.get.mockResolvedValue({signedDescriptor:"ZZZZ",keyId:"k",keyUsage:"u"});const t=await n.getTokenAccountState({tokenAccount:a,challenge:c});(0,e.expect)(t.isLeft()).toBe(!0),(0,e.expect)(t.extract().message).toMatch(/invalid hex/)}),(0,e.it)("returns Left when HTTP client throws",async()=>{o.get.mockRejectedValue(new Error("net"));const t=await n.getTokenAccountState({tokenAccount:a,challenge:c});(0,e.expect)(t).toEqual((0,r.Left)(new Error("[ContextModule] HttpTokenAccountStateDataSource: Failed to fetch token account state: net")))})});
1
+ "use strict";var c=require("purify-ts"),e=require("vitest"),s=require("./HttpTokenAccountStateDataSource");const X={debug:e.vi.fn(),info:e.vi.fn(),warn:e.vi.fn(),error:e.vi.fn(),subscribers:[]},d=()=>X;(0,e.describe)("HttpTokenAccountStateDataSource",()=>{let o,n;const t="TokenAccountAddrXXXXXXXXXXXXXXXXXXXXXXXXXXX",a="deadbeef",i={metadataServiceDomain:{url:"https://nft.api.ledger.com"}};(0,e.beforeEach)(()=>{e.vi.clearAllMocks(),n={get:e.vi.fn()},o=new s.HttpTokenAccountStateDataSource(i,d,n)}),(0,e.it)("calls the metadata endpoint with the challenge param",async()=>{n.get.mockResolvedValue({descriptorType:"token_account_state",signedDescriptor:"01020304",keyId:"tas_key",keyUsage:"coin_meta"}),await o.getTokenAccountState({tokenAccount:t,challenge:a}),(0,e.expect)(n.get).toHaveBeenCalledWith(`https://nft.api.ledger.com/v2/solana/token-account-state/${t}`,{params:{challenge:a}})}),(0,e.it)("decodes signedDescriptor hex into Uint8Array",async()=>{n.get.mockResolvedValue({signedDescriptor:"deadbeef",keyId:"k",keyUsage:"u"});const r=await o.getTokenAccountState({tokenAccount:t,challenge:a});(0,e.expect)(r).toEqual((0,c.Right)({tokenAccount:t,descriptor:new Uint8Array([222,173,190,239]),keyId:"k",keyUsage:"u"}))}),(0,e.it)("returns Left on malformed response (missing signedDescriptor)",async()=>{n.get.mockResolvedValue({keyId:"k",keyUsage:"u"});const r=await o.getTokenAccountState({tokenAccount:t,challenge:a});(0,e.expect)(r.isLeft()).toBe(!0),(0,e.expect)(r.extract().message).toMatch(new RegExp(String.raw`\[ContextModule\] HttpTokenAccountStateDataSource: malformed response for ${t}:`))}),(0,e.it)("returns Left when signedDescriptor is not valid hex",async()=>{n.get.mockResolvedValue({signedDescriptor:"ZZZZ",keyId:"k",keyUsage:"u"});const r=await o.getTokenAccountState({tokenAccount:t,challenge:a});(0,e.expect)(r.isLeft()).toBe(!0),(0,e.expect)(r.extract().message).toMatch(/invalid hex/)}),(0,e.it)("returns Left when HTTP client throws",async()=>{n.get.mockRejectedValue(new Error("net"));const r=await o.getTokenAccountState({tokenAccount:t,challenge:a});(0,e.expect)(r).toEqual((0,c.Left)(new Error("[ContextModule] HttpTokenAccountStateDataSource: Failed to fetch token account state: net")))}),(0,e.it)("logs debug when nativePreBalance is absent",async()=>{n.get.mockResolvedValue({signedDescriptor:"deadbeef",keyId:"k",keyUsage:"u"}),await o.getTokenAccountState({tokenAccount:t,challenge:a}),(0,e.expect)(X.debug).toHaveBeenCalledWith(e.expect.stringContaining("nativePreBalance absent"),e.expect.objectContaining({data:{tokenAccount:t}}))}),(0,e.it)("does not log debug when nativePreBalance is present",async()=>{n.get.mockResolvedValue({signedDescriptor:"deadbeef",keyId:"k",keyUsage:"u",nativePreBalance:1e3}),await o.getTokenAccountState({tokenAccount:t,challenge:a}),(0,e.expect)(X.debug).not.toHaveBeenCalled()}),(0,e.it)("logs warn when owner is present but mint is absent",async()=>{n.get.mockResolvedValue({signedDescriptor:"deadbeef",keyId:"k",keyUsage:"u",owner:"OwnerPubkeyXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"}),await o.getTokenAccountState({tokenAccount:t,challenge:a}),(0,e.expect)(X.warn).toHaveBeenCalledWith(e.expect.stringContaining("owner but no mint"),e.expect.objectContaining({data:{tokenAccount:t}}))}),(0,e.it)("does not log warn when both owner and mint are present",async()=>{n.get.mockResolvedValue({signedDescriptor:"deadbeef",keyId:"k",keyUsage:"u",owner:"OwnerPubkeyXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",mint:"MintPubkeyXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"}),await o.getTokenAccountState({tokenAccount:t,challenge:a}),(0,e.expect)(X.warn).not.toHaveBeenCalled()})});
2
2
  //# sourceMappingURL=HttpTokenAccountStateDataSource.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.test.ts"],
4
- "sourcesContent": ["import { type DmkNetworkClient } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { type ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\n\nimport { HttpTokenAccountStateDataSource } from \"./HttpTokenAccountStateDataSource\";\nimport { type TokenAccountStateDataSource } from \"./TokenAccountStateDataSource\";\n\ndescribe(\"HttpTokenAccountStateDataSource\", () => {\n let datasource: TokenAccountStateDataSource;\n let httpMock: { get: ReturnType<typeof vi.fn> };\n const tokenAccount = \"TokenAccountAddrXXXXXXXXXXXXXXXXXXXXXXXXXXX\";\n const challenge = \"deadbeef\";\n const config: ContextModuleServiceConfig = {\n metadataServiceDomain: { url: \"https://nft.api.ledger.com\" },\n } as ContextModuleServiceConfig;\n\n beforeEach(() => {\n vi.clearAllMocks();\n httpMock = { get: vi.fn() };\n datasource = new HttpTokenAccountStateDataSource(\n config,\n httpMock as unknown as DmkNetworkClient,\n );\n });\n\n it(\"calls the metadata endpoint with the challenge param\", async () => {\n httpMock.get.mockResolvedValue({\n descriptorType: \"token_account_state\",\n signedDescriptor: \"01020304\",\n keyId: \"tas_key\",\n keyUsage: \"coin_meta\",\n });\n\n await datasource.getTokenAccountState({ tokenAccount, challenge });\n\n expect(httpMock.get).toHaveBeenCalledWith(\n `https://nft.api.ledger.com/v2/solana/token-account-state/${tokenAccount}`,\n { params: { challenge } },\n );\n });\n\n it(\"decodes signedDescriptor hex into Uint8Array\", async () => {\n httpMock.get.mockResolvedValue({\n signedDescriptor: \"deadbeef\",\n keyId: \"k\",\n keyUsage: \"u\",\n });\n\n const result = await datasource.getTokenAccountState({\n tokenAccount,\n challenge,\n });\n\n expect(result).toEqual(\n Right({\n tokenAccount,\n descriptor: new Uint8Array([0xde, 0xad, 0xbe, 0xef]),\n keyId: \"k\",\n keyUsage: \"u\",\n }),\n );\n });\n\n it(\"returns Left on malformed response (missing signedDescriptor)\", async () => {\n httpMock.get.mockResolvedValue({ keyId: \"k\", keyUsage: \"u\" });\n\n const result = await datasource.getTokenAccountState({\n tokenAccount,\n challenge,\n });\n\n expect(result.isLeft()).toBe(true);\n expect((result.extract() as Error).message).toMatch(\n new RegExp(\n String.raw`\\[ContextModule\\] HttpTokenAccountStateDataSource: malformed response for ${tokenAccount}:`,\n ),\n );\n });\n\n it(\"returns Left when signedDescriptor is not valid hex\", async () => {\n httpMock.get.mockResolvedValue({\n signedDescriptor: \"ZZZZ\",\n keyId: \"k\",\n keyUsage: \"u\",\n });\n\n const result = await datasource.getTokenAccountState({\n tokenAccount,\n challenge,\n });\n\n expect(result.isLeft()).toBe(true);\n expect((result.extract() as Error).message).toMatch(/invalid hex/);\n });\n\n it(\"returns Left when HTTP client throws\", async () => {\n httpMock.get.mockRejectedValue(new Error(\"net\"));\n\n const result = await datasource.getTokenAccountState({\n tokenAccount,\n challenge,\n });\n\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] HttpTokenAccountStateDataSource: Failed to fetch token account state: net\",\n ),\n ),\n );\n });\n});\n"],
5
- "mappings": "aACA,IAAAA,EAA4B,qBAC5BC,EAAqD,kBAIrDC,EAAgD,gDAGhD,YAAS,kCAAmC,IAAM,CAChD,IAAIC,EACAC,EACJ,MAAMC,EAAe,8CACfC,EAAY,WACZC,EAAqC,CACzC,sBAAuB,CAAE,IAAK,4BAA6B,CAC7D,KAEA,cAAW,IAAM,CACf,KAAG,cAAc,EACjBH,EAAW,CAAE,IAAK,KAAG,GAAG,CAAE,EAC1BD,EAAa,IAAI,kCACfI,EACAH,CACF,CACF,CAAC,KAED,MAAG,uDAAwD,SAAY,CACrEA,EAAS,IAAI,kBAAkB,CAC7B,eAAgB,sBAChB,iBAAkB,WAClB,MAAO,UACP,SAAU,WACZ,CAAC,EAED,MAAMD,EAAW,qBAAqB,CAAE,aAAAE,EAAc,UAAAC,CAAU,CAAC,KAEjE,UAAOF,EAAS,GAAG,EAAE,qBACnB,4DAA4DC,CAAY,GACxE,CAAE,OAAQ,CAAE,UAAAC,CAAU,CAAE,CAC1B,CACF,CAAC,KAED,MAAG,+CAAgD,SAAY,CAC7DF,EAAS,IAAI,kBAAkB,CAC7B,iBAAkB,WAClB,MAAO,IACP,SAAU,GACZ,CAAC,EAED,MAAMI,EAAS,MAAML,EAAW,qBAAqB,CACnD,aAAAE,EACA,UAAAC,CACF,CAAC,KAED,UAAOE,CAAM,EAAE,WACb,SAAM,CACJ,aAAAH,EACA,WAAY,IAAI,WAAW,CAAC,IAAM,IAAM,IAAM,GAAI,CAAC,EACnD,MAAO,IACP,SAAU,GACZ,CAAC,CACH,CACF,CAAC,KAED,MAAG,gEAAiE,SAAY,CAC9ED,EAAS,IAAI,kBAAkB,CAAE,MAAO,IAAK,SAAU,GAAI,CAAC,EAE5D,MAAMI,EAAS,MAAML,EAAW,qBAAqB,CACnD,aAAAE,EACA,UAAAC,CACF,CAAC,KAED,UAAOE,EAAO,OAAO,CAAC,EAAE,KAAK,EAAI,KACjC,UAAQA,EAAO,QAAQ,EAAY,OAAO,EAAE,QAC1C,IAAI,OACF,OAAO,gFAAgFH,CAAY,GACrG,CACF,CACF,CAAC,KAED,MAAG,sDAAuD,SAAY,CACpED,EAAS,IAAI,kBAAkB,CAC7B,iBAAkB,OAClB,MAAO,IACP,SAAU,GACZ,CAAC,EAED,MAAMI,EAAS,MAAML,EAAW,qBAAqB,CACnD,aAAAE,EACA,UAAAC,CACF,CAAC,KAED,UAAOE,EAAO,OAAO,CAAC,EAAE,KAAK,EAAI,KACjC,UAAQA,EAAO,QAAQ,EAAY,OAAO,EAAE,QAAQ,aAAa,CACnE,CAAC,KAED,MAAG,uCAAwC,SAAY,CACrDJ,EAAS,IAAI,kBAAkB,IAAI,MAAM,KAAK,CAAC,EAE/C,MAAMI,EAAS,MAAML,EAAW,qBAAqB,CACnD,aAAAE,EACA,UAAAC,CACF,CAAC,KAED,UAAOE,CAAM,EAAE,WACb,QACE,IAAI,MACF,2FACF,CACF,CACF,CACF,CAAC,CACH,CAAC",
6
- "names": ["import_purify_ts", "import_vitest", "import_HttpTokenAccountStateDataSource", "datasource", "httpMock", "tokenAccount", "challenge", "config", "result"]
4
+ "sourcesContent": ["import { type DmkNetworkClient } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { type ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\n\nimport { HttpTokenAccountStateDataSource } from \"./HttpTokenAccountStateDataSource\";\nimport { type TokenAccountStateDataSource } from \"./TokenAccountStateDataSource\";\n\nconst mockLogger = {\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n};\nconst mockLoggerFactory = () => mockLogger;\n\ndescribe(\"HttpTokenAccountStateDataSource\", () => {\n let datasource: TokenAccountStateDataSource;\n let httpMock: { get: ReturnType<typeof vi.fn> };\n const tokenAccount = \"TokenAccountAddrXXXXXXXXXXXXXXXXXXXXXXXXXXX\";\n const challenge = \"deadbeef\";\n const config: ContextModuleServiceConfig = {\n metadataServiceDomain: { url: \"https://nft.api.ledger.com\" },\n } as ContextModuleServiceConfig;\n\n beforeEach(() => {\n vi.clearAllMocks();\n httpMock = { get: vi.fn() };\n datasource = new HttpTokenAccountStateDataSource(\n config,\n mockLoggerFactory,\n httpMock as unknown as DmkNetworkClient,\n );\n });\n\n it(\"calls the metadata endpoint with the challenge param\", async () => {\n httpMock.get.mockResolvedValue({\n descriptorType: \"token_account_state\",\n signedDescriptor: \"01020304\",\n keyId: \"tas_key\",\n keyUsage: \"coin_meta\",\n });\n\n await datasource.getTokenAccountState({ tokenAccount, challenge });\n\n expect(httpMock.get).toHaveBeenCalledWith(\n `https://nft.api.ledger.com/v2/solana/token-account-state/${tokenAccount}`,\n { params: { challenge } },\n );\n });\n\n it(\"decodes signedDescriptor hex into Uint8Array\", async () => {\n httpMock.get.mockResolvedValue({\n signedDescriptor: \"deadbeef\",\n keyId: \"k\",\n keyUsage: \"u\",\n });\n\n const result = await datasource.getTokenAccountState({\n tokenAccount,\n challenge,\n });\n\n expect(result).toEqual(\n Right({\n tokenAccount,\n descriptor: new Uint8Array([0xde, 0xad, 0xbe, 0xef]),\n keyId: \"k\",\n keyUsage: \"u\",\n }),\n );\n });\n\n it(\"returns Left on malformed response (missing signedDescriptor)\", async () => {\n httpMock.get.mockResolvedValue({ keyId: \"k\", keyUsage: \"u\" });\n\n const result = await datasource.getTokenAccountState({\n tokenAccount,\n challenge,\n });\n\n expect(result.isLeft()).toBe(true);\n expect((result.extract() as Error).message).toMatch(\n new RegExp(\n String.raw`\\[ContextModule\\] HttpTokenAccountStateDataSource: malformed response for ${tokenAccount}:`,\n ),\n );\n });\n\n it(\"returns Left when signedDescriptor is not valid hex\", async () => {\n httpMock.get.mockResolvedValue({\n signedDescriptor: \"ZZZZ\",\n keyId: \"k\",\n keyUsage: \"u\",\n });\n\n const result = await datasource.getTokenAccountState({\n tokenAccount,\n challenge,\n });\n\n expect(result.isLeft()).toBe(true);\n expect((result.extract() as Error).message).toMatch(/invalid hex/);\n });\n\n it(\"returns Left when HTTP client throws\", async () => {\n httpMock.get.mockRejectedValue(new Error(\"net\"));\n\n const result = await datasource.getTokenAccountState({\n tokenAccount,\n challenge,\n });\n\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] HttpTokenAccountStateDataSource: Failed to fetch token account state: net\",\n ),\n ),\n );\n });\n\n it(\"logs debug when nativePreBalance is absent\", async () => {\n httpMock.get.mockResolvedValue({\n signedDescriptor: \"deadbeef\",\n keyId: \"k\",\n keyUsage: \"u\",\n });\n\n await datasource.getTokenAccountState({ tokenAccount, challenge });\n\n expect(mockLogger.debug).toHaveBeenCalledWith(\n expect.stringContaining(\"nativePreBalance absent\"),\n expect.objectContaining({ data: { tokenAccount } }),\n );\n });\n\n it(\"does not log debug when nativePreBalance is present\", async () => {\n httpMock.get.mockResolvedValue({\n signedDescriptor: \"deadbeef\",\n keyId: \"k\",\n keyUsage: \"u\",\n nativePreBalance: 1000,\n });\n\n await datasource.getTokenAccountState({ tokenAccount, challenge });\n\n expect(mockLogger.debug).not.toHaveBeenCalled();\n });\n\n it(\"logs warn when owner is present but mint is absent\", async () => {\n httpMock.get.mockResolvedValue({\n signedDescriptor: \"deadbeef\",\n keyId: \"k\",\n keyUsage: \"u\",\n owner: \"OwnerPubkeyXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\",\n });\n\n await datasource.getTokenAccountState({ tokenAccount, challenge });\n\n expect(mockLogger.warn).toHaveBeenCalledWith(\n expect.stringContaining(\"owner but no mint\"),\n expect.objectContaining({ data: { tokenAccount } }),\n );\n });\n\n it(\"does not log warn when both owner and mint are present\", async () => {\n httpMock.get.mockResolvedValue({\n signedDescriptor: \"deadbeef\",\n keyId: \"k\",\n keyUsage: \"u\",\n owner: \"OwnerPubkeyXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\",\n mint: \"MintPubkeyXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\",\n });\n\n await datasource.getTokenAccountState({ tokenAccount, challenge });\n\n expect(mockLogger.warn).not.toHaveBeenCalled();\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["import_purify_ts", "import_vitest", "import_HttpTokenAccountStateDataSource", "mockLogger", "mockLoggerFactory", "datasource", "httpMock", "tokenAccount", "challenge", "config", "result"]
7
7
  }
@@ -0,0 +1,2 @@
1
+ "use strict";var o=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var T=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var p=(r,n,e,a)=>{if(n&&typeof n=="object"||typeof n=="function")for(let t of T(n))!c.call(r,t)&&t!==e&&o(r,t,{get:()=>n[t],enumerable:!(a=i(n,t))||a.enumerable});return r};var s=r=>p(o({},"__esModule",{value:!0}),r);var x={};module.exports=s(x);
2
+ //# sourceMappingURL=TronTransactionContext.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/modules/tron/model/TronTransactionContext.ts"],
4
+ "sourcesContent": ["export type TronTransactionContext = {\n /** Protobuf-serialized `Transaction.raw` bytes, as given to the signer. */\n rawTransaction: Uint8Array;\n};\n"],
5
+ "mappings": "+WAAA,IAAAA,EAAA,kBAAAC,EAAAD",
6
+ "names": ["TronTransactionContext_exports", "__toCommonJS"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var f=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var u=Object.getOwnPropertyNames;var y=Object.prototype.hasOwnProperty;var C=(r,e)=>{for(var o in e)f(r,o,{get:e[o],enumerable:!0})},w=(r,e,o,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of u(e))!y.call(r,t)&&t!==o&&f(r,t,{get:()=>e[t],enumerable:!(n=d(e,t))||n.enumerable});return r};var T=r=>w(f({},"__esModule",{value:!0}),r),l=(r,e,o,n)=>{for(var t=n>1?void 0:n?d(e,o):e,i=r.length-1,m;i>=0;i--)(m=r[i])&&(t=(n?m(e,o,t):m(t))||t);return n&&t&&f(e,o,t),t},p=(r,e)=>(o,n)=>e(o,n,r);var x={};C(x,{HttpTokenDataSource:()=>a});module.exports=T(x);var s=require("inversify"),c=require("purify-ts"),k=require("../../../../config/di/configTypes"),g=require("../../../../modules/tron/token/data/TokenDataSource"),h=require("../../../../shared/network/di/networkTypes");let a=class{constructor(e,o){this.config=e;this.http=o}async getTokenInfosPayload({assetId:e}){const o=()=>(0,c.Left)(new Error(`[ContextModule] HttpTokenDataSource: no token metadata for asset id ${e}`));try{const n=await this.http.get(`${this.config.cal.url}/tokens`,{params:{id:`tron/trc10/${e}`,output:"id,ticker,decimals,descriptor",ref:`branch:${this.config.cal.branch}`}});return g.tokenDataResponsesCodec.decode(n).caseOf({Left:o,Right:t=>{const i=t[0]?.descriptor.signatures[this.config.cal.mode];return i===void 0||i.length===0?o():(0,c.Right)(i)}})}catch{return(0,c.Left)(new Error("[ContextModule] HttpTokenDataSource: Failed to fetch token informations"))}}};a=l([(0,s.injectable)(),p(0,(0,s.inject)(k.configTypes.Config)),p(1,(0,s.inject)(h.networkTypes.NetworkClient))],a);0&&(module.exports={HttpTokenDataSource});
2
+ //# sourceMappingURL=HttpTokenDataSource.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/modules/tron/token/data/HttpTokenDataSource.ts"],
4
+ "sourcesContent": ["import { DmkNetworkClient } from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\nimport { type Either, Left, Right } from \"purify-ts\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { type ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\nimport {\n type GetTokenInfosParams,\n tokenDataResponsesCodec,\n type TokenDataSource,\n} from \"@/modules/tron/token/data/TokenDataSource\";\nimport { networkTypes } from \"@/shared/network/di/networkTypes\";\n\n@injectable()\nexport class HttpTokenDataSource implements TokenDataSource {\n constructor(\n @inject(configTypes.Config)\n private readonly config: ContextModuleServiceConfig,\n @inject(networkTypes.NetworkClient)\n private readonly http: DmkNetworkClient,\n ) {}\n\n /**\n * Unlike the EVM descriptor, which is assembled from `descriptor.data` plus a\n * signature, the whole TRC10 payload the device expects is the signature\n * field: a protobuf `TokenDetails` the app checks against its built-in key.\n * `descriptor.data` is empty for these entries.\n */\n public async getTokenInfosPayload({\n assetId,\n }: GetTokenInfosParams): Promise<Either<Error, string>> {\n const noTokenMetadata = () =>\n Left(\n new Error(\n `[ContextModule] HttpTokenDataSource: no token metadata for asset id ${assetId}`,\n ),\n );\n\n try {\n const response = await this.http.get(`${this.config.cal.url}/tokens`, {\n params: {\n id: `tron/trc10/${assetId}`,\n output: \"id,ticker,decimals,descriptor\",\n ref: `branch:${this.config.cal.branch}`,\n },\n });\n\n return tokenDataResponsesCodec.decode(response).caseOf({\n Left: noTokenMetadata,\n Right: (entries) => {\n const payload =\n entries[0]?.descriptor.signatures[this.config.cal.mode];\n\n return payload === undefined || payload.length === 0\n ? noTokenMetadata()\n : Right(payload);\n },\n });\n } catch (_error) {\n return Left(\n new Error(\n \"[ContextModule] HttpTokenDataSource: Failed to fetch token informations\",\n ),\n );\n }\n }\n}\n"],
5
+ "mappings": "okBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,yBAAAE,IAAA,eAAAC,EAAAH,GACA,IAAAI,EAAmC,qBACnCC,EAAyC,qBAEzCC,EAA4B,mCAE5BC,EAIO,qDACPC,EAA6B,4CAGtB,IAAMC,EAAN,KAAqD,CAC1D,YAEmBC,EAEAC,EACjB,CAHiB,YAAAD,EAEA,UAAAC,CAChB,CAQH,MAAa,qBAAqB,CAChC,QAAAC,CACF,EAAwD,CACtD,MAAMC,EAAkB,OACtB,QACE,IAAI,MACF,uEAAuED,CAAO,EAChF,CACF,EAEF,GAAI,CACF,MAAME,EAAW,MAAM,KAAK,KAAK,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,UAAW,CACpE,OAAQ,CACN,GAAI,cAAcF,CAAO,GACzB,OAAQ,gCACR,IAAK,UAAU,KAAK,OAAO,IAAI,MAAM,EACvC,CACF,CAAC,EAED,OAAO,0BAAwB,OAAOE,CAAQ,EAAE,OAAO,CACrD,KAAMD,EACN,MAAQE,GAAY,CAClB,MAAMC,EACJD,EAAQ,CAAC,GAAG,WAAW,WAAW,KAAK,OAAO,IAAI,IAAI,EAExD,OAAOC,IAAY,QAAaA,EAAQ,SAAW,EAC/CH,EAAgB,KAChB,SAAMG,CAAO,CACnB,CACF,CAAC,CACH,MAAiB,CACf,SAAO,QACL,IAAI,MACF,yEACF,CACF,CACF,CACF,CACF,EApDaP,EAANQ,EAAA,IADN,cAAW,EAGPC,EAAA,eAAO,cAAY,MAAM,GAEzBA,EAAA,eAAO,eAAa,aAAa,IAJzBT",
6
+ "names": ["HttpTokenDataSource_exports", "__export", "HttpTokenDataSource", "__toCommonJS", "import_inversify", "import_purify_ts", "import_configTypes", "import_TokenDataSource", "import_networkTypes", "HttpTokenDataSource", "config", "http", "assetId", "noTokenMetadata", "response", "entries", "payload", "__decorateClass", "__decorateParam"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var n=require("purify-ts"),e=require("vitest"),i=require("./HttpTokenDataSource");(0,e.describe)("HttpTokenDataSource",()=>{let a,o;const r="1002000",c={cal:{url:"https://global.api.prd.ledger.com/cal/v1",mode:"prod",branch:"main"}},s=t=>[{id:`tron/trc10/${r}`,ticker:"BTTOLD",decimals:6,descriptor:{data:"",descriptorType:"token",signatures:t}}];(0,e.beforeEach)(()=>{e.vi.clearAllMocks(),o={get:e.vi.fn()},a=new i.HttpTokenDataSource(c,o)}),(0,e.it)("should call http.get with the correct url and params",async()=>{o.get.mockResolvedValue([]),await a.getTokenInfosPayload({assetId:r}),(0,e.expect)(o.get).toHaveBeenCalledWith("https://global.api.prd.ledger.com/cal/v1/tokens",{params:{id:"tron/trc10/1002000",output:"id,ticker,decimals,descriptor",ref:"branch:main"}})}),(0,e.it)("should return the signature matching the configured mode",async()=>{o.get.mockResolvedValue(s({prod:"prod-sig",test:"test-sig"}));const t=await a.getTokenInfosPayload({assetId:r});(0,e.expect)(t).toEqual((0,n.Right)("prod-sig"))}),(0,e.it)("should return an error when no token matches",async()=>{o.get.mockResolvedValue([]);const t=await a.getTokenInfosPayload({assetId:r});(0,e.expect)(t).toEqual((0,n.Left)(new Error("[ContextModule] HttpTokenDataSource: no token metadata for asset id 1002000")))}),(0,e.it)("should return an error when the descriptor carries no signature",async()=>{o.get.mockResolvedValue(s({prod:"",test:"test-sig"}));const t=await a.getTokenInfosPayload({assetId:r});(0,e.expect)(t).toEqual((0,n.Left)(new Error("[ContextModule] HttpTokenDataSource: no token metadata for asset id 1002000")))}),e.it.each([["the response is not a list",{descriptor:{}}],["an entry carries no descriptor",[{id:`tron/trc10/${r}`}]],["the descriptor carries no signature field",[{descriptor:{data:"",descriptorType:"token"}}]],["a signature is not a string",[{descriptor:{signatures:{prod:42,test:"test-sig"}}}]]])("should return an error when %s",async(t,d)=>{o.get.mockResolvedValue(d);const l=await a.getTokenInfosPayload({assetId:r});(0,e.expect)(l).toEqual((0,n.Left)(new Error("[ContextModule] HttpTokenDataSource: no token metadata for asset id 1002000")))}),(0,e.it)("should return an error when the request fails",async()=>{o.get.mockRejectedValue(new Error("network"));const t=await a.getTokenInfosPayload({assetId:r});(0,e.expect)(t).toEqual((0,n.Left)(new Error("[ContextModule] HttpTokenDataSource: Failed to fetch token informations")))})});
2
+ //# sourceMappingURL=HttpTokenDataSource.test.js.map