@ledgerhq/device-signer-kit-tron 0.2.0 → 0.3.0
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.
- package/README.md +41 -0
- package/lib/cjs/api/SignerTrxBuilder.js +1 -1
- package/lib/cjs/api/SignerTrxBuilder.js.map +3 -3
- package/lib/cjs/api/SignerTrxBuilder.test.js +1 -1
- package/lib/cjs/api/SignerTrxBuilder.test.js.map +3 -3
- package/lib/cjs/api/app-binder/SignTransactionDeviceActionTypes.js +1 -1
- package/lib/cjs/api/app-binder/SignTransactionDeviceActionTypes.js.map +3 -3
- package/lib/cjs/api/index.js +1 -1
- package/lib/cjs/api/index.js.map +3 -3
- package/lib/cjs/api/model/TronAddressBook.js +1 -1
- package/lib/cjs/api/model/TronAddressBook.js.map +3 -3
- package/lib/cjs/internal/DefaultSignerTrx.js +1 -1
- package/lib/cjs/internal/DefaultSignerTrx.js.map +3 -3
- package/lib/cjs/internal/app-binder/TronAppBinder.js +1 -1
- package/lib/cjs/internal/app-binder/TronAppBinder.js.map +3 -3
- package/lib/cjs/internal/app-binder/TronAppBinder.test.js +1 -1
- package/lib/cjs/internal/app-binder/TronAppBinder.test.js.map +3 -3
- package/lib/cjs/internal/app-binder/TronApplicationResolver.js +2 -0
- package/lib/cjs/internal/app-binder/TronApplicationResolver.js.map +7 -0
- package/lib/cjs/internal/app-binder/TronApplicationResolver.test.js +2 -0
- package/lib/cjs/internal/app-binder/TronApplicationResolver.test.js.map +7 -0
- package/lib/cjs/internal/app-binder/constants.js +1 -1
- package/lib/cjs/internal/app-binder/constants.js.map +3 -3
- package/lib/cjs/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.js +2 -0
- package/lib/cjs/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.js.map +7 -0
- package/lib/cjs/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.test.js +2 -0
- package/lib/cjs/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.test.js.map +7 -0
- package/lib/cjs/internal/app-binder/device-action/__test-utils__/makeInternalApi.js +2 -0
- package/lib/cjs/internal/app-binder/device-action/__test-utils__/makeInternalApi.js.map +7 -0
- package/lib/cjs/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.js +2 -0
- package/lib/cjs/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.js.map +7 -0
- package/lib/cjs/internal/app-binder/services/TransactionSerializer.js +1 -1
- package/lib/cjs/internal/app-binder/services/TransactionSerializer.js.map +3 -3
- package/lib/cjs/internal/app-binder/services/TransactionSerializer.test.js +1 -1
- package/lib/cjs/internal/app-binder/services/TransactionSerializer.test.js.map +3 -3
- package/lib/cjs/internal/app-binder/task/GetTokenPayloadsTask.js +2 -0
- package/lib/cjs/internal/app-binder/task/GetTokenPayloadsTask.js.map +7 -0
- package/lib/cjs/internal/app-binder/task/GetTokenPayloadsTask.test.js +2 -0
- package/lib/cjs/internal/app-binder/task/GetTokenPayloadsTask.test.js.map +7 -0
- package/lib/cjs/internal/app-binder/task/ProvideContactTask.js +2 -0
- package/lib/cjs/internal/app-binder/task/ProvideContactTask.js.map +7 -0
- package/lib/cjs/internal/app-binder/task/ProvideContactTask.test.js +2 -0
- package/lib/cjs/internal/app-binder/task/ProvideContactTask.test.js.map +7 -0
- package/lib/cjs/internal/app-binder/task/SignTransactionTask.js +1 -1
- package/lib/cjs/internal/app-binder/task/SignTransactionTask.js.map +3 -3
- package/lib/cjs/internal/app-binder/task/SignTransactionTask.test.js +1 -1
- package/lib/cjs/internal/app-binder/task/SignTransactionTask.test.js.map +3 -3
- package/lib/cjs/internal/di.js +1 -1
- package/lib/cjs/internal/di.js.map +3 -3
- package/lib/cjs/internal/externalTypes.js +1 -1
- package/lib/cjs/internal/externalTypes.js.map +2 -2
- package/lib/cjs/internal/shared/utils/buildExternalContactPayload.js +2 -0
- package/lib/cjs/internal/shared/utils/buildExternalContactPayload.js.map +7 -0
- package/lib/cjs/internal/shared/utils/buildExternalContactPayload.test.js +2 -0
- package/lib/cjs/internal/shared/utils/buildExternalContactPayload.test.js.map +7 -0
- package/lib/cjs/internal/shared/utils/extractTransactionRecipient.js +2 -0
- package/lib/cjs/internal/shared/utils/extractTransactionRecipient.js.map +7 -0
- package/lib/cjs/internal/shared/utils/extractTransactionRecipient.test.js +2 -0
- package/lib/cjs/internal/shared/utils/extractTransactionRecipient.test.js.map +7 -0
- package/lib/cjs/internal/shared/utils/tronBase58Check.js +2 -0
- package/lib/cjs/internal/shared/utils/tronBase58Check.js.map +7 -0
- package/lib/cjs/internal/shared/utils/tronBase58Check.test.js +2 -0
- package/lib/cjs/internal/shared/utils/tronBase58Check.test.js.map +7 -0
- package/lib/cjs/package.json +6 -1
- package/lib/esm/api/SignerTrxBuilder.js +1 -1
- package/lib/esm/api/SignerTrxBuilder.js.map +3 -3
- package/lib/esm/api/SignerTrxBuilder.test.js +1 -1
- package/lib/esm/api/SignerTrxBuilder.test.js.map +3 -3
- package/lib/esm/api/app-binder/SignTransactionDeviceActionTypes.js +1 -0
- package/lib/esm/api/app-binder/SignTransactionDeviceActionTypes.js.map +4 -4
- package/lib/esm/api/index.js +1 -1
- package/lib/esm/api/index.js.map +3 -3
- package/lib/esm/api/model/TronAddressBook.js +1 -0
- package/lib/esm/api/model/TronAddressBook.js.map +4 -4
- package/lib/esm/internal/DefaultSignerTrx.js +1 -1
- package/lib/esm/internal/DefaultSignerTrx.js.map +3 -3
- package/lib/esm/internal/app-binder/TronAppBinder.js +1 -1
- package/lib/esm/internal/app-binder/TronAppBinder.js.map +3 -3
- package/lib/esm/internal/app-binder/TronAppBinder.test.js +1 -1
- package/lib/esm/internal/app-binder/TronAppBinder.test.js.map +3 -3
- package/lib/esm/internal/app-binder/TronApplicationResolver.js +2 -0
- package/lib/esm/internal/app-binder/TronApplicationResolver.js.map +7 -0
- package/lib/esm/internal/app-binder/TronApplicationResolver.test.js +2 -0
- package/lib/esm/internal/app-binder/TronApplicationResolver.test.js.map +7 -0
- package/lib/esm/internal/app-binder/constants.js +1 -1
- package/lib/esm/internal/app-binder/constants.js.map +3 -3
- package/lib/esm/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.js +2 -0
- package/lib/esm/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.js.map +7 -0
- package/lib/esm/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.test.js +2 -0
- package/lib/esm/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.test.js.map +7 -0
- package/lib/esm/internal/app-binder/device-action/__test-utils__/makeInternalApi.js +2 -0
- package/lib/esm/internal/app-binder/device-action/__test-utils__/makeInternalApi.js.map +7 -0
- package/lib/esm/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.js +2 -0
- package/lib/esm/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.js.map +7 -0
- package/lib/esm/internal/app-binder/services/TransactionSerializer.js +1 -1
- package/lib/esm/internal/app-binder/services/TransactionSerializer.js.map +3 -3
- package/lib/esm/internal/app-binder/services/TransactionSerializer.test.js +1 -1
- package/lib/esm/internal/app-binder/services/TransactionSerializer.test.js.map +3 -3
- package/lib/esm/internal/app-binder/task/GetTokenPayloadsTask.js +2 -0
- package/lib/esm/internal/app-binder/task/GetTokenPayloadsTask.js.map +7 -0
- package/lib/esm/internal/app-binder/task/GetTokenPayloadsTask.test.js +2 -0
- package/lib/esm/internal/app-binder/task/GetTokenPayloadsTask.test.js.map +7 -0
- package/lib/esm/internal/app-binder/task/ProvideContactTask.js +2 -0
- package/lib/esm/internal/app-binder/task/ProvideContactTask.js.map +7 -0
- package/lib/esm/internal/app-binder/task/ProvideContactTask.test.js +2 -0
- package/lib/esm/internal/app-binder/task/ProvideContactTask.test.js.map +7 -0
- package/lib/esm/internal/app-binder/task/SignTransactionTask.js +1 -1
- package/lib/esm/internal/app-binder/task/SignTransactionTask.js.map +3 -3
- package/lib/esm/internal/app-binder/task/SignTransactionTask.test.js +1 -1
- package/lib/esm/internal/app-binder/task/SignTransactionTask.test.js.map +3 -3
- package/lib/esm/internal/di.js +1 -1
- package/lib/esm/internal/di.js.map +3 -3
- package/lib/esm/internal/externalTypes.js +1 -1
- package/lib/esm/internal/externalTypes.js.map +2 -2
- package/lib/esm/internal/shared/utils/buildExternalContactPayload.js +2 -0
- package/lib/esm/internal/shared/utils/buildExternalContactPayload.js.map +7 -0
- package/lib/esm/internal/shared/utils/buildExternalContactPayload.test.js +2 -0
- package/lib/esm/internal/shared/utils/buildExternalContactPayload.test.js.map +7 -0
- package/lib/esm/internal/shared/utils/extractTransactionRecipient.js +2 -0
- package/lib/esm/internal/shared/utils/extractTransactionRecipient.js.map +7 -0
- package/lib/esm/internal/shared/utils/extractTransactionRecipient.test.js +2 -0
- package/lib/esm/internal/shared/utils/extractTransactionRecipient.test.js.map +7 -0
- package/lib/esm/internal/shared/utils/tronBase58Check.js +2 -0
- package/lib/esm/internal/shared/utils/tronBase58Check.js.map +7 -0
- package/lib/esm/internal/shared/utils/tronBase58Check.test.js +2 -0
- package/lib/esm/internal/shared/utils/tronBase58Check.test.js.map +7 -0
- package/lib/esm/package.json +6 -1
- package/lib/types/api/SignerTrxBuilder.d.ts +12 -1
- package/lib/types/api/SignerTrxBuilder.d.ts.map +1 -1
- package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts +25 -1
- package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts.map +1 -1
- package/lib/types/api/index.d.ts +2 -1
- package/lib/types/api/index.d.ts.map +1 -1
- package/lib/types/api/model/TronAddressBook.d.ts +8 -3
- package/lib/types/api/model/TronAddressBook.d.ts.map +1 -1
- package/lib/types/internal/DefaultSignerTrx.d.ts +3 -1
- package/lib/types/internal/DefaultSignerTrx.d.ts.map +1 -1
- package/lib/types/internal/app-binder/TronAppBinder.d.ts +5 -1
- package/lib/types/internal/app-binder/TronAppBinder.d.ts.map +1 -1
- package/lib/types/internal/app-binder/TronApplicationResolver.d.ts +5 -0
- package/lib/types/internal/app-binder/TronApplicationResolver.d.ts.map +1 -0
- package/lib/types/internal/app-binder/TronApplicationResolver.test.d.ts +2 -0
- package/lib/types/internal/app-binder/TronApplicationResolver.test.d.ts.map +1 -0
- package/lib/types/internal/app-binder/constants.d.ts +3 -0
- package/lib/types/internal/app-binder/constants.d.ts.map +1 -1
- package/lib/types/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.d.ts +35 -0
- package/lib/types/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.d.ts.map +1 -0
- package/lib/types/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.test.d.ts +2 -0
- package/lib/types/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.test.d.ts.map +1 -0
- package/lib/types/internal/app-binder/device-action/__test-utils__/makeInternalApi.d.ts +4 -0
- package/lib/types/internal/app-binder/device-action/__test-utils__/makeInternalApi.d.ts.map +1 -0
- package/lib/types/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.d.ts +15 -0
- package/lib/types/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.d.ts.map +1 -0
- package/lib/types/internal/app-binder/services/TransactionSerializer.d.ts +4 -1
- package/lib/types/internal/app-binder/services/TransactionSerializer.d.ts.map +1 -1
- package/lib/types/internal/app-binder/task/GetTokenPayloadsTask.d.ts +17 -0
- package/lib/types/internal/app-binder/task/GetTokenPayloadsTask.d.ts.map +1 -0
- package/lib/types/internal/app-binder/task/GetTokenPayloadsTask.test.d.ts +2 -0
- package/lib/types/internal/app-binder/task/GetTokenPayloadsTask.test.d.ts.map +1 -0
- package/lib/types/internal/app-binder/task/ProvideContactTask.d.ts +16 -0
- package/lib/types/internal/app-binder/task/ProvideContactTask.d.ts.map +1 -0
- package/lib/types/internal/app-binder/task/ProvideContactTask.test.d.ts +2 -0
- package/lib/types/internal/app-binder/task/ProvideContactTask.test.d.ts.map +1 -0
- package/lib/types/internal/app-binder/task/SignTransactionTask.d.ts +1 -0
- package/lib/types/internal/app-binder/task/SignTransactionTask.d.ts.map +1 -1
- package/lib/types/internal/di.d.ts +3 -1
- package/lib/types/internal/di.d.ts.map +1 -1
- package/lib/types/internal/externalTypes.d.ts +1 -0
- package/lib/types/internal/externalTypes.d.ts.map +1 -1
- package/lib/types/internal/shared/utils/buildExternalContactPayload.d.ts +11 -0
- package/lib/types/internal/shared/utils/buildExternalContactPayload.d.ts.map +1 -0
- package/lib/types/internal/shared/utils/buildExternalContactPayload.test.d.ts +2 -0
- package/lib/types/internal/shared/utils/buildExternalContactPayload.test.d.ts.map +1 -0
- package/lib/types/internal/shared/utils/extractTransactionRecipient.d.ts +2 -0
- package/lib/types/internal/shared/utils/extractTransactionRecipient.d.ts.map +1 -0
- package/lib/types/internal/shared/utils/extractTransactionRecipient.test.d.ts +2 -0
- package/lib/types/internal/shared/utils/extractTransactionRecipient.test.d.ts.map +1 -0
- package/lib/types/internal/shared/utils/tronBase58Check.d.ts +4 -0
- package/lib/types/internal/shared/utils/tronBase58Check.d.ts.map +1 -0
- package/lib/types/internal/shared/utils/tronBase58Check.test.d.ts +2 -0
- package/lib/types/internal/shared/utils/tronBase58Check.test.d.ts.map +1 -0
- package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
- package/package.json +13 -8
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var e=Object.defineProperty;var c=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var g=Object.prototype.hasOwnProperty;var f=(t,o)=>{for(var r in o)e(t,r,{get:o[r],enumerable:!0})},y=(t,o,r,i)=>{if(o&&typeof o=="object"||typeof o=="function")for(let a of l(o))!g.call(t,a)&&a!==r&&e(t,a,{get:()=>o[a],enumerable:!(i=c(o,a))||i.enumerable});return t};var u=t=>y(e({},"__esModule",{value:!0}),t);var m={};f(m,{ProvideContactTask:()=>C});module.exports=u(m);var n=require("@ledgerhq/device-contacts-kit"),s=require("@ledgerhq/device-management-kit"),d=require("../../shared/utils/buildExternalContactPayload"),p=require("../../shared/utils/extractTransactionRecipient");class C{constructor(o,r){this.api=o;this.args=r}async run(){const o=(0,p.extractTransactionRecipient)(this.args.transaction);if(o===void 0||this.args.appConfig===null)return;const r=(0,d.buildExternalContactPayload)({addressBook:this.args.addressBook,recipient:o,deviceState:this.api.getDeviceSessionState(),appConfig:this.args.appConfig});if(r===void 0)return;const i=this.api.loggerFactory?.("ProvideContactTask"),a=await(0,n.sendProvideContactPayload)(this.api,{payload:r,logger:i});(0,s.isSuccessCommandResult)(a)||i?.warn("[run] Contact rejected, signing without it",{data:{error:a.error}})}}0&&(module.exports={ProvideContactTask});
|
|
2
|
+
//# sourceMappingURL=ProvideContactTask.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/internal/app-binder/task/ProvideContactTask.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n sendProvideContactPayload,\n type SendProvideContactPayloadArgs,\n} from \"@ledgerhq/device-contacts-kit\";\nimport {\n type InternalApi,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type AppConfiguration } from \"@api/model/AppConfiguration\";\nimport { type TronAddressBook } from \"@api/model/TronAddressBook\";\nimport { buildExternalContactPayload } from \"@internal/shared/utils/buildExternalContactPayload\";\nimport { extractTransactionRecipient } from \"@internal/shared/utils/extractTransactionRecipient\";\n\ntype ProvideContactTaskArgs = {\n readonly addressBook: TronAddressBook;\n readonly transaction: Uint8Array;\n readonly appConfig: AppConfiguration | null;\n};\n\nexport class ProvideContactTask {\n constructor(\n private readonly api: InternalApi,\n private readonly args: ProvideContactTaskArgs,\n ) {}\n\n async run(): Promise<void> {\n const recipient = extractTransactionRecipient(this.args.transaction);\n if (recipient === undefined || this.args.appConfig === null) return;\n\n const payload = buildExternalContactPayload({\n addressBook: this.args.addressBook,\n recipient,\n deviceState: this.api.getDeviceSessionState(),\n appConfig: this.args.appConfig,\n });\n if (payload === undefined) return;\n\n const logger = this.api.loggerFactory?.(\"ProvideContactTask\");\n const result = await sendProvideContactPayload(this.api, {\n payload,\n logger,\n } satisfies SendProvideContactPayloadArgs);\n if (!isSuccessCommandResult(result)) {\n logger?.warn(\"[run] Contact rejected, signing without it\", {\n data: { error: result.error },\n });\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,wBAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAGO,yCACPC,EAGO,2CAIPC,EAA4C,8DAC5CC,EAA4C,8DAQrC,MAAML,CAAmB,CAC9B,YACmBM,EACAC,EACjB,CAFiB,SAAAD,EACA,UAAAC,CAChB,CAEH,MAAM,KAAqB,CACzB,MAAMC,KAAY,+BAA4B,KAAK,KAAK,WAAW,EACnE,GAAIA,IAAc,QAAa,KAAK,KAAK,YAAc,KAAM,OAE7D,MAAMC,KAAU,+BAA4B,CAC1C,YAAa,KAAK,KAAK,YACvB,UAAAD,EACA,YAAa,KAAK,IAAI,sBAAsB,EAC5C,UAAW,KAAK,KAAK,SACvB,CAAC,EACD,GAAIC,IAAY,OAAW,OAE3B,MAAMC,EAAS,KAAK,IAAI,gBAAgB,oBAAoB,EACtDC,EAAS,QAAM,6BAA0B,KAAK,IAAK,CACvD,QAAAF,EACA,OAAAC,CACF,CAAyC,KACpC,0BAAuBC,CAAM,GAChCD,GAAQ,KAAK,6CAA8C,CACzD,KAAM,CAAE,MAAOC,EAAO,KAAM,CAC9B,CAAC,CAEL,CACF",
|
|
6
|
+
"names": ["ProvideContactTask_exports", "__export", "ProvideContactTask", "__toCommonJS", "import_device_contacts_kit", "import_device_management_kit", "import_buildExternalContactPayload", "import_extractTransactionRecipient", "api", "args", "recipient", "payload", "logger", "result"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var t=require("@ledgerhq/device-contacts-kit"),a=require("@ledgerhq/device-management-kit"),c=require("../../../api/model/TronAddressBook"),d=require("../../app-binder/device-action/__test-utils__/makeInternalApi"),s=require("../../shared/utils/buildExternalContactPayload"),i=require("../../shared/utils/extractTransactionRecipient"),n=require("./ProvideContactTask");vi.mock("@ledgerhq/device-contacts-kit",async e=>({...await e(),sendProvideContactPayload:vi.fn()}));vi.mock("@internal/shared/utils/buildExternalContactPayload",()=>({buildExternalContactPayload:vi.fn()}));vi.mock("@internal/shared/utils/extractTransactionRecipient",()=>({extractTransactionRecipient:vi.fn()}));const l=new Uint8Array([1]),m=new Uint8Array(21).fill(17),r=new Uint8Array([170]),v={version:"0.8.0",versionN:800,allowData:!0,allowContract:!0,truncateAddress:!1,signByHash:!1};describe("ProvideContactTask",()=>{const e=(0,d.makeDeviceActionInternalApiMock)(),o={addressBook:c.EMPTY_TRON_ADDRESS_BOOK,transaction:l,appConfig:v};beforeEach(()=>{vi.clearAllMocks(),vi.mocked(i.extractTransactionRecipient).mockReturnValue(m),vi.mocked(s.buildExternalContactPayload).mockReturnValue(r),vi.mocked(t.sendProvideContactPayload).mockResolvedValue((0,a.CommandResultFactory)({data:void 0}))}),it("provides a matching contact",async()=>{await new n.ProvideContactTask(e,o).run(),expect(t.sendProvideContactPayload).toHaveBeenCalledWith(e,expect.objectContaining({payload:r}))}),it("continues when the device rejects the contact",async()=>{vi.mocked(t.sendProvideContactPayload).mockResolvedValue((0,a.CommandResultFactory)({error:new a.InvalidStatusWordError("rejected")})),await expect(new n.ProvideContactTask(e,o).run()).resolves.toBeUndefined()}),it("does not send anything without a recipient",async()=>{vi.mocked(i.extractTransactionRecipient).mockReturnValue(void 0),await new n.ProvideContactTask(e,o).run(),expect(t.sendProvideContactPayload).not.toHaveBeenCalled()})});
|
|
2
|
+
//# sourceMappingURL=ProvideContactTask.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/internal/app-binder/task/ProvideContactTask.test.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n sendProvideContactPayload,\n type SendProvideContactPayloadArgs,\n} from \"@ledgerhq/device-contacts-kit\";\nimport {\n CommandResultFactory,\n InvalidStatusWordError,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { EMPTY_TRON_ADDRESS_BOOK } from \"@api/model/TronAddressBook\";\nimport { makeDeviceActionInternalApiMock } from \"@internal/app-binder/device-action/__test-utils__/makeInternalApi\";\nimport { buildExternalContactPayload } from \"@internal/shared/utils/buildExternalContactPayload\";\nimport { extractTransactionRecipient } from \"@internal/shared/utils/extractTransactionRecipient\";\n\nimport { ProvideContactTask } from \"./ProvideContactTask\";\n\nvi.mock(\"@ledgerhq/device-contacts-kit\", async (importOriginal) => ({\n ...(await importOriginal()),\n sendProvideContactPayload: vi.fn(),\n}));\nvi.mock(\"@internal/shared/utils/buildExternalContactPayload\", () => ({\n buildExternalContactPayload: vi.fn(),\n}));\nvi.mock(\"@internal/shared/utils/extractTransactionRecipient\", () => ({\n extractTransactionRecipient: vi.fn(),\n}));\n\nconst TRANSACTION = new Uint8Array([0x01]);\nconst RECIPIENT = new Uint8Array(21).fill(0x11);\nconst PAYLOAD = new Uint8Array([0xaa]);\nconst APP_CONFIG = {\n version: \"0.8.0\",\n versionN: 800,\n allowData: true,\n allowContract: true,\n truncateAddress: false,\n signByHash: false,\n};\n\ndescribe(\"ProvideContactTask\", () => {\n const api = makeDeviceActionInternalApiMock();\n const args = {\n addressBook: EMPTY_TRON_ADDRESS_BOOK,\n transaction: TRANSACTION,\n appConfig: APP_CONFIG,\n };\n\n beforeEach(() => {\n vi.clearAllMocks();\n vi.mocked(extractTransactionRecipient).mockReturnValue(RECIPIENT);\n vi.mocked(buildExternalContactPayload).mockReturnValue(PAYLOAD);\n vi.mocked(sendProvideContactPayload).mockResolvedValue(\n CommandResultFactory({ data: undefined }),\n );\n });\n\n it(\"provides a matching contact\", async () => {\n await new ProvideContactTask(api, args).run();\n\n expect(sendProvideContactPayload).toHaveBeenCalledWith(\n api,\n expect.objectContaining({\n payload: PAYLOAD,\n }) as SendProvideContactPayloadArgs,\n );\n });\n\n it(\"continues when the device rejects the contact\", async () => {\n vi.mocked(sendProvideContactPayload).mockResolvedValue(\n CommandResultFactory({\n error: new InvalidStatusWordError(\"rejected\"),\n }) as never,\n );\n\n await expect(\n new ProvideContactTask(api, args).run(),\n ).resolves.toBeUndefined();\n });\n\n it(\"does not send anything without a recipient\", async () => {\n vi.mocked(extractTransactionRecipient).mockReturnValue(undefined);\n\n await new ProvideContactTask(api, args).run();\n\n expect(sendProvideContactPayload).not.toHaveBeenCalled();\n });\n});\n"],
|
|
5
|
+
"mappings": "aAAA,IAAAA,EAGO,yCACPC,EAGO,2CAEPC,EAAwC,sCACxCC,EAAgD,6EAChDC,EAA4C,8DAC5CC,EAA4C,8DAE5CC,EAAmC,gCAEnC,GAAG,KAAK,gCAAiC,MAAOC,IAAoB,CAClE,GAAI,MAAMA,EAAe,EACzB,0BAA2B,GAAG,GAAG,CACnC,EAAE,EACF,GAAG,KAAK,qDAAsD,KAAO,CACnE,4BAA6B,GAAG,GAAG,CACrC,EAAE,EACF,GAAG,KAAK,qDAAsD,KAAO,CACnE,4BAA6B,GAAG,GAAG,CACrC,EAAE,EAEF,MAAMC,EAAc,IAAI,WAAW,CAAC,CAAI,CAAC,EACnCC,EAAY,IAAI,WAAW,EAAE,EAAE,KAAK,EAAI,EACxCC,EAAU,IAAI,WAAW,CAAC,GAAI,CAAC,EAC/BC,EAAa,CACjB,QAAS,QACT,SAAU,IACV,UAAW,GACX,cAAe,GACf,gBAAiB,GACjB,WAAY,EACd,EAEA,SAAS,qBAAsB,IAAM,CACnC,MAAMC,KAAM,mCAAgC,EACtCC,EAAO,CACX,YAAa,0BACb,YAAaL,EACb,UAAWG,CACb,EAEA,WAAW,IAAM,CACf,GAAG,cAAc,EACjB,GAAG,OAAO,6BAA2B,EAAE,gBAAgBF,CAAS,EAChE,GAAG,OAAO,6BAA2B,EAAE,gBAAgBC,CAAO,EAC9D,GAAG,OAAO,2BAAyB,EAAE,qBACnC,wBAAqB,CAAE,KAAM,MAAU,CAAC,CAC1C,CACF,CAAC,EAED,GAAG,8BAA+B,SAAY,CAC5C,MAAM,IAAI,qBAAmBE,EAAKC,CAAI,EAAE,IAAI,EAE5C,OAAO,2BAAyB,EAAE,qBAChCD,EACA,OAAO,iBAAiB,CACtB,QAASF,CACX,CAAC,CACH,CACF,CAAC,EAED,GAAG,gDAAiD,SAAY,CAC9D,GAAG,OAAO,2BAAyB,EAAE,qBACnC,wBAAqB,CACnB,MAAO,IAAI,yBAAuB,UAAU,CAC9C,CAAC,CACH,EAEA,MAAM,OACJ,IAAI,qBAAmBE,EAAKC,CAAI,EAAE,IAAI,CACxC,EAAE,SAAS,cAAc,CAC3B,CAAC,EAED,GAAG,6CAA8C,SAAY,CAC3D,GAAG,OAAO,6BAA2B,EAAE,gBAAgB,MAAS,EAEhE,MAAM,IAAI,qBAAmBD,EAAKC,CAAI,EAAE,IAAI,EAE5C,OAAO,2BAAyB,EAAE,IAAI,iBAAiB,CACzD,CAAC,CACH,CAAC",
|
|
6
|
+
"names": ["import_device_contacts_kit", "import_device_management_kit", "import_TronAddressBook", "import_makeInternalApi", "import_buildExternalContactPayload", "import_extractTransactionRecipient", "import_ProvideContactTask", "importOriginal", "TRANSACTION", "RECIPIENT", "PAYLOAD", "APP_CONFIG", "api", "args"]
|
|
7
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var m=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var u=Object.getOwnPropertyNames;var g=Object.prototype.hasOwnProperty;var y=(t,r)=>{for(var o in r)m(t,o,{get:r[o],enumerable:!0})},f=(t,r,o,s)=>{if(r&&typeof r=="object"||typeof r=="function")for(let n of u(r))!g.call(t,n)&&n!==o&&m(t,n,{get:()=>r[n],enumerable:!(s=l(r,n))||s.enumerable});return t};var T=t=>f(m({},"__esModule",{value:!0}),t);var C={};y(C,{SignTransactionTask:()=>A});module.exports=T(C);var a=require("@ledgerhq/device-management-kit"),p=require("../../app-binder/command/SignTransactionCommand"),c=require("../../app-binder/command/utils/encodeDerivationPath"),d=require("../../app-binder/services/TransactionSerializer");class A{constructor(r,o){this.api=r;this.args=o}async run(){const{derivationPath:r,transaction:o,tokenPayloads:s}=this.args;let n;try{n=(0,d.serializeTransaction)((0,c.encodeDerivationPath)(r),o,s)}catch(i){return(0,a.DmkResultFactory)({error:new a.InvalidStatusWordError(i instanceof Error?i.message:"Failed to serialize transaction")})}let e=(0,a.DmkResultFactory)({error:new a.InvalidStatusWordError("No transaction frames to sign")});for(const i of n)if(e=await this.api.sendCommand(new p.SignTransactionCommand({payload:i.payload,p1:i.p1})),!(0,a.isSuccessCommandResult)(e))return e;return(0,a.isSuccessCommandResult)(e)&&e.data.length===0?(0,a.DmkResultFactory)({error:new a.InvalidStatusWordError("No signature returned by the device")}):e}}0&&(module.exports={SignTransactionTask});
|
|
2
2
|
//# sourceMappingURL=SignTransactionTask.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/internal/app-binder/task/SignTransactionTask.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n type CommandResult,\n DmkResultFactory,\n type InternalApi,\n InvalidStatusWordError,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type Signature } from \"@api/model/Signature\";\nimport { SignTransactionCommand } from \"@internal/app-binder/command/SignTransactionCommand\";\nimport { encodeDerivationPath } from \"@internal/app-binder/command/utils/encodeDerivationPath\";\nimport { type TronAppErrorCodes } from \"@internal/app-binder/command/utils/tronApplicationErrors\";\nimport {\n serializeTransaction,\n type TransactionFrame,\n} from \"@internal/app-binder/services/TransactionSerializer\";\n\ntype SignTransactionTaskArgs = {\n derivationPath: string;\n transaction: Uint8Array;\n};\n\nexport class SignTransactionTask {\n constructor(\n private api: InternalApi,\n private args: SignTransactionTaskArgs,\n ) {}\n\n async run(): Promise<CommandResult<Signature, TronAppErrorCodes>> {\n const { derivationPath, transaction } = this.args;\n\n // Serialization can throw (e.g. a single protobuf field exceeds the APDU\n // chunk size). Convert that into a typed command error instead of letting\n // it reject the task promise as an untyped device-action error.\n let frames: TransactionFrame[];\n try {\n frames = serializeTransaction(\n encodeDerivationPath(derivationPath),\n transaction,\n );\n } catch (error) {\n return DmkResultFactory({\n error: new InvalidStatusWordError(\n error instanceof Error\n ? error.message\n : \"Failed to serialize transaction\",\n ),\n });\n }\n\n // Each frame is sent in order; the signature is returned on the final frame.\n let result: CommandResult<Signature, TronAppErrorCodes> = DmkResultFactory({\n error: new InvalidStatusWordError(\"No transaction frames to sign\"),\n });\n\n for (const frame of frames) {\n result = await this.api.sendCommand(\n new SignTransactionCommand({ payload: frame.payload, p1: frame.p1 }),\n );\n\n if (!isSuccessCommandResult(result)) {\n return result;\n }\n }\n\n // The signature is only present on the final frame; guard against a device\n // returning an empty payload (or a wrong final P1) so an empty signature is\n // never surfaced as a successful result.\n if (isSuccessCommandResult(result) && result.data.length === 0) {\n return DmkResultFactory({\n error: new InvalidStatusWordError(\n \"No signature returned by the device\",\n ),\n });\n }\n\n return result;\n }\n}\n"],
|
|
5
|
-
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,yBAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAMO,2CAGPC,EAAuC,+DACvCC,EAAqC,mEAErCC,EAGO,+
|
|
6
|
-
"names": ["SignTransactionTask_exports", "__export", "SignTransactionTask", "__toCommonJS", "import_device_management_kit", "import_SignTransactionCommand", "import_encodeDerivationPath", "import_TransactionSerializer", "api", "args", "derivationPath", "transaction", "frames", "error", "result", "frame"]
|
|
4
|
+
"sourcesContent": ["import {\n type CommandResult,\n DmkResultFactory,\n type InternalApi,\n InvalidStatusWordError,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type Signature } from \"@api/model/Signature\";\nimport { SignTransactionCommand } from \"@internal/app-binder/command/SignTransactionCommand\";\nimport { encodeDerivationPath } from \"@internal/app-binder/command/utils/encodeDerivationPath\";\nimport { type TronAppErrorCodes } from \"@internal/app-binder/command/utils/tronApplicationErrors\";\nimport {\n serializeTransaction,\n type TransactionFrame,\n} from \"@internal/app-binder/services/TransactionSerializer\";\n\ntype SignTransactionTaskArgs = {\n derivationPath: string;\n transaction: Uint8Array;\n tokenPayloads: Uint8Array[];\n};\n\nexport class SignTransactionTask {\n constructor(\n private api: InternalApi,\n private args: SignTransactionTaskArgs,\n ) {}\n\n async run(): Promise<CommandResult<Signature, TronAppErrorCodes>> {\n const { derivationPath, transaction, tokenPayloads } = this.args;\n\n // Serialization can throw (e.g. a single protobuf field exceeds the APDU\n // chunk size). Convert that into a typed command error instead of letting\n // it reject the task promise as an untyped device-action error.\n let frames: TransactionFrame[];\n try {\n frames = serializeTransaction(\n encodeDerivationPath(derivationPath),\n transaction,\n tokenPayloads,\n );\n } catch (error) {\n return DmkResultFactory({\n error: new InvalidStatusWordError(\n error instanceof Error\n ? error.message\n : \"Failed to serialize transaction\",\n ),\n });\n }\n\n // Each frame is sent in order; the signature is returned on the final frame.\n let result: CommandResult<Signature, TronAppErrorCodes> = DmkResultFactory({\n error: new InvalidStatusWordError(\"No transaction frames to sign\"),\n });\n\n for (const frame of frames) {\n result = await this.api.sendCommand(\n new SignTransactionCommand({ payload: frame.payload, p1: frame.p1 }),\n );\n\n if (!isSuccessCommandResult(result)) {\n return result;\n }\n }\n\n // The signature is only present on the final frame; guard against a device\n // returning an empty payload (or a wrong final P1) so an empty signature is\n // never surfaced as a successful result.\n if (isSuccessCommandResult(result) && result.data.length === 0) {\n return DmkResultFactory({\n error: new InvalidStatusWordError(\n \"No signature returned by the device\",\n ),\n });\n }\n\n return result;\n }\n}\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,yBAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAMO,2CAGPC,EAAuC,+DACvCC,EAAqC,mEAErCC,EAGO,+DAQA,MAAML,CAAoB,CAC/B,YACUM,EACAC,EACR,CAFQ,SAAAD,EACA,UAAAC,CACP,CAEH,MAAM,KAA4D,CAChE,KAAM,CAAE,eAAAC,EAAgB,YAAAC,EAAa,cAAAC,CAAc,EAAI,KAAK,KAK5D,IAAIC,EACJ,GAAI,CACFA,KAAS,2BACP,wBAAqBH,CAAc,EACnCC,EACAC,CACF,CACF,OAASE,EAAO,CACd,SAAO,oBAAiB,CACtB,MAAO,IAAI,yBACTA,aAAiB,MACbA,EAAM,QACN,iCACN,CACF,CAAC,CACH,CAGA,IAAIC,KAAsD,oBAAiB,CACzE,MAAO,IAAI,yBAAuB,+BAA+B,CACnE,CAAC,EAED,UAAWC,KAASH,EAKlB,GAJAE,EAAS,MAAM,KAAK,IAAI,YACtB,IAAI,yBAAuB,CAAE,QAASC,EAAM,QAAS,GAAIA,EAAM,EAAG,CAAC,CACrE,EAEI,IAAC,0BAAuBD,CAAM,EAChC,OAAOA,EAOX,SAAI,0BAAuBA,CAAM,GAAKA,EAAO,KAAK,SAAW,KACpD,oBAAiB,CACtB,MAAO,IAAI,yBACT,qCACF,CACF,CAAC,EAGIA,CACT,CACF",
|
|
6
|
+
"names": ["SignTransactionTask_exports", "__export", "SignTransactionTask", "__toCommonJS", "import_device_management_kit", "import_SignTransactionCommand", "import_encodeDerivationPath", "import_TransactionSerializer", "api", "args", "derivationPath", "transaction", "tokenPayloads", "frames", "error", "result", "frame"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var e=require("@ledgerhq/device-management-kit"),
|
|
1
|
+
"use strict";var e=require("@ledgerhq/device-management-kit"),u=require("../../app-binder/command/SignTransactionCommand"),m=require("../../app-binder/command/utils/tronApplicationErrors"),l=require("./SignTransactionTask");const d="44'/195'/0'/0/0",x="058000002c800000c3800000000000000000000000",p=t=>Array.from(t,r=>r.toString(16).padStart(2,"0")).join(""),c=t=>Uint8Array.from(t.match(/.{1,2}/g).map(r=>parseInt(r,16))),i=c("ab".repeat(65));describe("SignTransactionTask",()=>{const t=vi.fn(),r={sendCommand:t},s=a=>{const n=t.mock.calls[a][0];return expect(n).toBeInstanceOf(u.SignTransactionCommand),n};beforeEach(()=>{vi.clearAllMocks()}),it("signs a single-frame transaction",async()=>{const a="0a0100";t.mockResolvedValueOnce((0,e.CommandResultFactory)({data:i}));const n=await new l.SignTransactionTask(r,{derivationPath:d,transaction:c(a),tokenPayloads:[]}).run();expect(t).toHaveBeenCalledTimes(1),expect(s(0).args.p1).toBe(16),expect(p(s(0).args.payload)).toBe(x+a),expect((0,e.isSuccessCommandResult)(n)).toBe(!0),expect((0,e.isSuccessCommandResult)(n)&&n.data).toEqual(i)}),it("signs a multi-frame transaction and returns the last frame's signature",async()=>{const a="0801".repeat(200);t.mockResolvedValueOnce((0,e.CommandResultFactory)({data:new Uint8Array})).mockResolvedValueOnce((0,e.CommandResultFactory)({data:i}));const n=await new l.SignTransactionTask(r,{derivationPath:d,transaction:c(a),tokenPayloads:[]}).run();expect(t).toHaveBeenCalledTimes(2),expect(s(0).args.p1).toBe(0),expect(s(1).args.p1).toBe(144),expect((0,e.isSuccessCommandResult)(n)).toBe(!0),expect((0,e.isSuccessCommandResult)(n)&&n.data).toEqual(i)}),it("aborts on the first failing frame",async()=>{const a="0801".repeat(200),n=(0,e.CommandResultFactory)({error:(0,m.TronAppCommandErrorFactory)({...m.TRON_APP_ERRORS["6a80"],errorCode:"6a80"})});t.mockResolvedValueOnce(n);const o=await new l.SignTransactionTask(r,{derivationPath:d,transaction:c(a),tokenPayloads:[]}).run();expect(t).toHaveBeenCalledTimes(1),expect(o).toBe(n),expect((0,e.isSuccessCommandResult)(o)).toBe(!1)}),it("propagates a user rejection (6985) on the final frame",async()=>{const a="0801".repeat(200),n=(0,e.CommandResultFactory)({error:(0,m.TronAppCommandErrorFactory)({...m.TRON_APP_ERRORS[6985],errorCode:"6985"})});t.mockResolvedValueOnce((0,e.CommandResultFactory)({data:new Uint8Array})).mockResolvedValueOnce(n);const o=await new l.SignTransactionTask(r,{derivationPath:d,transaction:c(a),tokenPayloads:[]}).run();expect(t).toHaveBeenCalledTimes(2),expect(o).toBe(n),expect((0,e.isSuccessCommandResult)(o)).toBe(!1)}),it("returns a typed error when serialization throws",async()=>{const a=await new l.SignTransactionTask(r,{derivationPath:d,transaction:c("0afb01"),tokenPayloads:[]}).run();expect(t).not.toHaveBeenCalled(),expect((0,e.isSuccessCommandResult)(a)).toBe(!1),expect(!(0,e.isSuccessCommandResult)(a)&&a.error.originalError?.message).toBe("Too many bytes to encode.")}),it("returns an error when the final frame carries no signature",async()=>{t.mockResolvedValueOnce((0,e.CommandResultFactory)({data:new Uint8Array}));const a=await new l.SignTransactionTask(r,{derivationPath:d,transaction:c("0a0100"),tokenPayloads:[]}).run();expect((0,e.isSuccessCommandResult)(a)).toBe(!1),expect(!(0,e.isSuccessCommandResult)(a)&&a.error.originalError?.message).toBe("No signature returned by the device")}),describe("TRC10 token names",()=>{const a="0a0100",n=o=>new l.SignTransactionTask(r,{derivationPath:d,transaction:c(a),tokenPayloads:o}).run();it("sends an extra frame carrying the token name",async()=>{t.mockResolvedValueOnce((0,e.CommandResultFactory)({data:new Uint8Array})).mockResolvedValueOnce((0,e.CommandResultFactory)({data:i}));const o=await n([c("aabbcc")]);expect(t).toHaveBeenCalledTimes(2),expect(s(0).args.p1).toBe(0),expect(p(s(0).args.payload)).toBe(x+a),expect(s(1).args.p1).toBe(168),expect(p(s(1).args.payload)).toBe("aabbcc"),expect((0,e.isSuccessCommandResult)(o)&&o.data).toEqual(i)}),it("signs exactly as today when no token name was resolved",async()=>{t.mockResolvedValueOnce((0,e.CommandResultFactory)({data:i}));const o=await n([]);expect(t).toHaveBeenCalledTimes(1),expect(s(0).args.p1).toBe(16),expect(p(s(0).args.payload)).toBe(x+a),expect((0,e.isSuccessCommandResult)(o)&&o.data).toEqual(i)})})});
|
|
2
2
|
//# sourceMappingURL=SignTransactionTask.test.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/internal/app-binder/task/SignTransactionTask.test.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n CommandResultFactory,\n type InternalApi,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { SignTransactionCommand } from \"@internal/app-binder/command/SignTransactionCommand\";\nimport {\n TRON_APP_ERRORS,\n TronAppCommandErrorFactory,\n} from \"@internal/app-binder/command/utils/tronApplicationErrors\";\n\nimport { SignTransactionTask } from \"./SignTransactionTask\";\n\nconst PATH = \"44'/195'/0'/0/0\";\n// Encoded \"44'/195'/0'/0/0\": length byte (05) + 5 BE32 path elements.\nconst PATH_HEX = \"058000002c800000c3800000000000000000000000\";\n\nconst toHex = (bytes: Uint8Array): string =>\n Array.from(bytes, (b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n\nconst fromHex = (hex: string): Uint8Array =>\n Uint8Array.from(hex.match(/.{1,2}/g)!.map((b) => parseInt(b, 16)));\n\nconst SIGNATURE = fromHex(\"ab\".repeat(65));\n\ndescribe(\"SignTransactionTask\", () => {\n const sendCommandMock = vi.fn();\n const api = { sendCommand: sendCommandMock } as unknown as InternalApi;\n\n const sentCommand = (call: number): SignTransactionCommand => {\n const command = sendCommandMock.mock.calls[call]![0] as unknown;\n expect(command).toBeInstanceOf(SignTransactionCommand);\n return command as SignTransactionCommand;\n };\n\n beforeEach(() => {\n vi.clearAllMocks();\n });\n\n it(\"signs a single-frame transaction\", async () => {\n // GIVEN a transaction fitting in one frame\n const rawTxHex = \"0a0100\";\n sendCommandMock.mockResolvedValueOnce(\n CommandResultFactory({ data: SIGNATURE }),\n );\n\n // WHEN\n const result = await new SignTransactionTask(api, {\n derivationPath: PATH,\n transaction: fromHex(rawTxHex),\n }).run();\n\n // THEN a single frame is sent with the path header and the signature returned\n expect(sendCommandMock).toHaveBeenCalledTimes(1);\n expect(sentCommand(0).args.p1).toBe(0x10);\n expect(toHex(sentCommand(0).args.payload)).toBe(PATH_HEX + rawTxHex);\n expect(isSuccessCommandResult(result)).toBe(true);\n expect(isSuccessCommandResult(result) && result.data).toEqual(SIGNATURE);\n });\n\n it(\"signs a multi-frame transaction and returns the last frame's signature\", async () => {\n // GIVEN a transaction spanning two frames; only the last returns a signature\n const rawTxHex = \"0801\".repeat(200);\n sendCommandMock\n .mockResolvedValueOnce(CommandResultFactory({ data: new Uint8Array() }))\n .mockResolvedValueOnce(CommandResultFactory({ data: SIGNATURE }));\n\n // WHEN\n const result = await new SignTransactionTask(api, {\n derivationPath: PATH,\n transaction: fromHex(rawTxHex),\n }).run();\n\n // THEN both frames are sent in order with the expected start bytes\n expect(sendCommandMock).toHaveBeenCalledTimes(2);\n expect(sentCommand(0).args.p1).toBe(0x00);\n expect(sentCommand(1).args.p1).toBe(0x90);\n expect(isSuccessCommandResult(result)).toBe(true);\n expect(isSuccessCommandResult(result) && result.data).toEqual(SIGNATURE);\n });\n\n it(\"aborts on the first failing frame\", async () => {\n // GIVEN a two-frame transaction whose first frame fails\n const rawTxHex = \"0801\".repeat(200);\n const error = CommandResultFactory({\n error: TronAppCommandErrorFactory({\n ...TRON_APP_ERRORS[\"6a80\"],\n errorCode: \"6a80\",\n }),\n });\n sendCommandMock.mockResolvedValueOnce(error);\n\n // WHEN\n const result = await new SignTransactionTask(api, {\n derivationPath: PATH,\n transaction: fromHex(rawTxHex),\n }).run();\n\n // THEN no further frame is sent and the error is returned unchanged\n expect(sendCommandMock).toHaveBeenCalledTimes(1);\n expect(result).toBe(error);\n expect(isSuccessCommandResult(result)).toBe(false);\n });\n\n it(\"propagates a user rejection (6985) on the final frame\", async () => {\n // GIVEN a two-frame transaction rejected by the user on the last frame\n const rawTxHex = \"0801\".repeat(200);\n const rejection = CommandResultFactory({\n error: TronAppCommandErrorFactory({\n ...TRON_APP_ERRORS[\"6985\"],\n errorCode: \"6985\",\n }),\n });\n sendCommandMock\n .mockResolvedValueOnce(CommandResultFactory({ data: new Uint8Array() }))\n .mockResolvedValueOnce(rejection);\n\n // WHEN\n const result = await new SignTransactionTask(api, {\n derivationPath: PATH,\n transaction: fromHex(rawTxHex),\n }).run();\n\n // THEN the rejection is propagated\n expect(sendCommandMock).toHaveBeenCalledTimes(2);\n expect(result).toBe(rejection);\n expect(isSuccessCommandResult(result)).toBe(false);\n });\n\n it(\"returns a typed error when serialization throws\", async () => {\n // GIVEN a transaction whose first protobuf field exceeds the chunk size\n // (field key 0x0a, declared length 251) - serializeTransaction throws\n const result = await new SignTransactionTask(api, {\n derivationPath: PATH,\n transaction: fromHex(\"0afb01\"),\n }).run();\n\n // THEN no command is sent and the failure is a typed command error\n expect(sendCommandMock).not.toHaveBeenCalled();\n expect(isSuccessCommandResult(result)).toBe(false);\n expect(\n !isSuccessCommandResult(result) &&\n (result.error as { originalError?: Error }).originalError?.message,\n ).toBe(\"Too many bytes to encode.\");\n });\n\n it(\"returns an error when the final frame carries no signature\", async () => {\n // GIVEN a single-frame transaction whose response has an empty payload\n sendCommandMock.mockResolvedValueOnce(\n CommandResultFactory({ data: new Uint8Array() }),\n );\n\n // WHEN\n const result = await new SignTransactionTask(api, {\n derivationPath: PATH,\n transaction: fromHex(\"0a0100\"),\n }).run();\n\n // THEN the empty signature is treated as an error, not a success\n expect(isSuccessCommandResult(result)).toBe(false);\n expect(\n !isSuccessCommandResult(result) &&\n (result.error as { originalError?: Error }).originalError?.message,\n ).toBe(\"No signature returned by the device\");\n });\n});\n"],
|
|
5
|
-
"mappings": "aAAA,IAAAA,EAIO,2CAEPC,EAAuC,+DACvCC,EAGO,oEAEPC,EAAoC,iCAEpC,MAAMC,EAAO,kBAEPC,EAAW,6CAEXC,EAASC,GACb,MAAM,KAAKA,EAAQC,GAAMA,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAAC,EAAE,KAAK,EAAE,EAE7DC,EAAWC,GACf,WAAW,KAAKA,EAAI,MAAM,SAAS,EAAG,IAAKF,GAAM,SAASA,EAAG,EAAE,CAAC,CAAC,EAE7DG,EAAYF,EAAQ,KAAK,OAAO,EAAE,CAAC,EAEzC,SAAS,sBAAuB,IAAM,CACpC,MAAMG,EAAkB,GAAG,GAAG,EACxBC,EAAM,CAAE,YAAaD,CAAgB,EAErCE,EAAeC,GAAyC,CAC5D,MAAMC,EAAUJ,EAAgB,KAAK,MAAMG,CAAI,EAAG,CAAC,EACnD,cAAOC,CAAO,EAAE,eAAe,wBAAsB,EAC9CA,CACT,EAEA,WAAW,IAAM,CACf,GAAG,cAAc,CACnB,CAAC,EAED,GAAG,mCAAoC,SAAY,CAEjD,MAAMC,EAAW,SACjBL,EAAgB,yBACd,wBAAqB,CAAE,KAAMD,CAAU,CAAC,CAC1C,EAGA,MAAMO,EAAS,MAAM,IAAI,sBAAoBL,EAAK,CAChD,eAAgBT,EAChB,YAAaK,EAAQQ,CAAQ,
|
|
6
|
-
"names": ["import_device_management_kit", "import_SignTransactionCommand", "import_tronApplicationErrors", "import_SignTransactionTask", "PATH", "PATH_HEX", "toHex", "bytes", "b", "fromHex", "hex", "SIGNATURE", "sendCommandMock", "api", "sentCommand", "call", "command", "rawTxHex", "result", "error", "rejection"]
|
|
4
|
+
"sourcesContent": ["import {\n CommandResultFactory,\n type InternalApi,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { SignTransactionCommand } from \"@internal/app-binder/command/SignTransactionCommand\";\nimport {\n TRON_APP_ERRORS,\n TronAppCommandErrorFactory,\n} from \"@internal/app-binder/command/utils/tronApplicationErrors\";\n\nimport { SignTransactionTask } from \"./SignTransactionTask\";\n\nconst PATH = \"44'/195'/0'/0/0\";\n// Encoded \"44'/195'/0'/0/0\": length byte (05) + 5 BE32 path elements.\nconst PATH_HEX = \"058000002c800000c3800000000000000000000000\";\n\nconst toHex = (bytes: Uint8Array): string =>\n Array.from(bytes, (b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n\nconst fromHex = (hex: string): Uint8Array =>\n Uint8Array.from(hex.match(/.{1,2}/g)!.map((b) => parseInt(b, 16)));\n\nconst SIGNATURE = fromHex(\"ab\".repeat(65));\n\ndescribe(\"SignTransactionTask\", () => {\n const sendCommandMock = vi.fn();\n const api = { sendCommand: sendCommandMock } as unknown as InternalApi;\n\n const sentCommand = (call: number): SignTransactionCommand => {\n const command = sendCommandMock.mock.calls[call]![0] as unknown;\n expect(command).toBeInstanceOf(SignTransactionCommand);\n return command as SignTransactionCommand;\n };\n\n beforeEach(() => {\n vi.clearAllMocks();\n });\n\n it(\"signs a single-frame transaction\", async () => {\n // GIVEN a transaction fitting in one frame\n const rawTxHex = \"0a0100\";\n sendCommandMock.mockResolvedValueOnce(\n CommandResultFactory({ data: SIGNATURE }),\n );\n\n // WHEN\n const result = await new SignTransactionTask(api, {\n derivationPath: PATH,\n transaction: fromHex(rawTxHex),\n tokenPayloads: [],\n }).run();\n\n // THEN a single frame is sent with the path header and the signature returned\n expect(sendCommandMock).toHaveBeenCalledTimes(1);\n expect(sentCommand(0).args.p1).toBe(0x10);\n expect(toHex(sentCommand(0).args.payload)).toBe(PATH_HEX + rawTxHex);\n expect(isSuccessCommandResult(result)).toBe(true);\n expect(isSuccessCommandResult(result) && result.data).toEqual(SIGNATURE);\n });\n\n it(\"signs a multi-frame transaction and returns the last frame's signature\", async () => {\n // GIVEN a transaction spanning two frames; only the last returns a signature\n const rawTxHex = \"0801\".repeat(200);\n sendCommandMock\n .mockResolvedValueOnce(CommandResultFactory({ data: new Uint8Array() }))\n .mockResolvedValueOnce(CommandResultFactory({ data: SIGNATURE }));\n\n // WHEN\n const result = await new SignTransactionTask(api, {\n derivationPath: PATH,\n transaction: fromHex(rawTxHex),\n tokenPayloads: [],\n }).run();\n\n // THEN both frames are sent in order with the expected start bytes\n expect(sendCommandMock).toHaveBeenCalledTimes(2);\n expect(sentCommand(0).args.p1).toBe(0x00);\n expect(sentCommand(1).args.p1).toBe(0x90);\n expect(isSuccessCommandResult(result)).toBe(true);\n expect(isSuccessCommandResult(result) && result.data).toEqual(SIGNATURE);\n });\n\n it(\"aborts on the first failing frame\", async () => {\n // GIVEN a two-frame transaction whose first frame fails\n const rawTxHex = \"0801\".repeat(200);\n const error = CommandResultFactory({\n error: TronAppCommandErrorFactory({\n ...TRON_APP_ERRORS[\"6a80\"],\n errorCode: \"6a80\",\n }),\n });\n sendCommandMock.mockResolvedValueOnce(error);\n\n // WHEN\n const result = await new SignTransactionTask(api, {\n derivationPath: PATH,\n transaction: fromHex(rawTxHex),\n tokenPayloads: [],\n }).run();\n\n // THEN no further frame is sent and the error is returned unchanged\n expect(sendCommandMock).toHaveBeenCalledTimes(1);\n expect(result).toBe(error);\n expect(isSuccessCommandResult(result)).toBe(false);\n });\n\n it(\"propagates a user rejection (6985) on the final frame\", async () => {\n // GIVEN a two-frame transaction rejected by the user on the last frame\n const rawTxHex = \"0801\".repeat(200);\n const rejection = CommandResultFactory({\n error: TronAppCommandErrorFactory({\n ...TRON_APP_ERRORS[\"6985\"],\n errorCode: \"6985\",\n }),\n });\n sendCommandMock\n .mockResolvedValueOnce(CommandResultFactory({ data: new Uint8Array() }))\n .mockResolvedValueOnce(rejection);\n\n // WHEN\n const result = await new SignTransactionTask(api, {\n derivationPath: PATH,\n transaction: fromHex(rawTxHex),\n tokenPayloads: [],\n }).run();\n\n // THEN the rejection is propagated\n expect(sendCommandMock).toHaveBeenCalledTimes(2);\n expect(result).toBe(rejection);\n expect(isSuccessCommandResult(result)).toBe(false);\n });\n\n it(\"returns a typed error when serialization throws\", async () => {\n // GIVEN a transaction whose first protobuf field exceeds the chunk size\n // (field key 0x0a, declared length 251) - serializeTransaction throws\n const result = await new SignTransactionTask(api, {\n derivationPath: PATH,\n transaction: fromHex(\"0afb01\"),\n tokenPayloads: [],\n }).run();\n\n // THEN no command is sent and the failure is a typed command error\n expect(sendCommandMock).not.toHaveBeenCalled();\n expect(isSuccessCommandResult(result)).toBe(false);\n expect(\n !isSuccessCommandResult(result) &&\n (result.error as { originalError?: Error }).originalError?.message,\n ).toBe(\"Too many bytes to encode.\");\n });\n\n it(\"returns an error when the final frame carries no signature\", async () => {\n // GIVEN a single-frame transaction whose response has an empty payload\n sendCommandMock.mockResolvedValueOnce(\n CommandResultFactory({ data: new Uint8Array() }),\n );\n\n // WHEN\n const result = await new SignTransactionTask(api, {\n derivationPath: PATH,\n transaction: fromHex(\"0a0100\"),\n tokenPayloads: [],\n }).run();\n\n // THEN the empty signature is treated as an error, not a success\n expect(isSuccessCommandResult(result)).toBe(false);\n expect(\n !isSuccessCommandResult(result) &&\n (result.error as { originalError?: Error }).originalError?.message,\n ).toBe(\"No signature returned by the device\");\n });\n\n describe(\"TRC10 token names\", () => {\n const rawTxHex = \"0a0100\";\n\n const run = (tokenPayloads: Uint8Array[]) =>\n new SignTransactionTask(api, {\n derivationPath: PATH,\n transaction: fromHex(rawTxHex),\n tokenPayloads,\n }).run();\n\n it(\"sends an extra frame carrying the token name\", async () => {\n // GIVEN one resolved TRC10 token descriptor\n sendCommandMock\n .mockResolvedValueOnce(CommandResultFactory({ data: new Uint8Array() }))\n .mockResolvedValueOnce(CommandResultFactory({ data: SIGNATURE }));\n\n // WHEN\n const result = await run([fromHex(\"aabbcc\")]);\n\n // THEN the token frame follows the transaction frame, which is demoted\n // from SINGLE to FIRST\n expect(sendCommandMock).toHaveBeenCalledTimes(2);\n expect(sentCommand(0).args.p1).toBe(0x00);\n expect(toHex(sentCommand(0).args.payload)).toBe(PATH_HEX + rawTxHex);\n expect(sentCommand(1).args.p1).toBe(0xa8);\n expect(toHex(sentCommand(1).args.payload)).toBe(\"aabbcc\");\n expect(isSuccessCommandResult(result) && result.data).toEqual(SIGNATURE);\n });\n\n it(\"signs exactly as today when no token name was resolved\", async () => {\n // GIVEN no token name to provide\n sendCommandMock.mockResolvedValueOnce(\n CommandResultFactory({ data: SIGNATURE }),\n );\n\n // WHEN\n const result = await run([]);\n\n // THEN the APDUs are byte-identical to the blind-signing path\n expect(sendCommandMock).toHaveBeenCalledTimes(1);\n expect(sentCommand(0).args.p1).toBe(0x10);\n expect(toHex(sentCommand(0).args.payload)).toBe(PATH_HEX + rawTxHex);\n expect(isSuccessCommandResult(result) && result.data).toEqual(SIGNATURE);\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_device_management_kit", "import_SignTransactionCommand", "import_tronApplicationErrors", "import_SignTransactionTask", "PATH", "PATH_HEX", "toHex", "bytes", "b", "fromHex", "hex", "SIGNATURE", "sendCommandMock", "api", "sentCommand", "call", "command", "rawTxHex", "result", "error", "rejection", "run", "tokenPayloads"]
|
|
7
7
|
}
|
package/lib/cjs/internal/di.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var a=Object.defineProperty;var
|
|
1
|
+
"use strict";var a=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var C=Object.getOwnPropertyNames;var f=Object.prototype.hasOwnProperty;var k=(t,e)=>{for(var r in e)a(t,r,{get:e[r],enumerable:!0})},D=(t,e,r,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of C(e))!f.call(t,o)&&o!==r&&a(t,o,{get:()=>e[o],enumerable:!(i=y(e,o))||i.enumerable});return t};var S=t=>D(a({},"__esModule",{value:!0}),t);var F={};k(F,{makeContainer:()=>v});module.exports=S(F);var s=require("inversify"),d=require("../api/model/TronAddressBook"),m=require("./app-binder/di/appBinderModule"),n=require("./externalTypes"),p=require("./use-cases/address/di/addressModule"),c=require("./use-cases/app-configuration/di/appConfigurationModule"),l=require("./use-cases/ecdh/di/ecdhModule"),u=require("./use-cases/message/di/messageModule"),g=require("./use-cases/transaction/di/transactionModule");const v=({dmk:t,sessionId:e,contextModule:r,addressBook:i})=>{const o=new s.Container;return o.bind(n.externalTypes.Dmk).toConstantValue(t),o.bind(n.externalTypes.ContextModule).toConstantValue(r),o.bind(n.externalTypes.SessionId).toConstantValue(e),o.bind(n.externalTypes.AddressBook).toConstantValue(i??d.EMPTY_TRON_ADDRESS_BOOK),o.bind(n.externalTypes.DmkLoggerFactory).toConstantValue(M=>t.getLoggerFactory()(["SignerTron",M])),o.loadSync((0,m.appBindingModuleFactory)(),(0,p.addressModuleFactory)(),(0,g.transactionModuleFactory)(),(0,u.messageModuleFactory)(),(0,c.appConfigurationModuleFactory)(),(0,l.ecdhModuleFactory)()),o};0&&(module.exports={makeContainer});
|
|
2
2
|
//# sourceMappingURL=di.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/internal/di.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n type DeviceManagementKit,\n type DeviceSessionId,\n type LoggerPublisherService,\n} from \"@ledgerhq/device-management-kit\";\nimport { Container } from \"inversify\";\n\nimport {
|
|
5
|
-
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,mBAAAE,IAAA,eAAAC,EAAAH,
|
|
6
|
-
"names": ["di_exports", "__export", "makeContainer", "__toCommonJS", "import_inversify", "import_appBinderModule", "import_externalTypes", "import_addressModule", "import_appConfigurationModule", "import_ecdhModule", "import_messageModule", "import_transactionModule", "dmk", "sessionId", "addressBook", "container", "tag"]
|
|
4
|
+
"sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n type DeviceManagementKit,\n type DeviceSessionId,\n type LoggerPublisherService,\n} from \"@ledgerhq/device-management-kit\";\nimport { Container } from \"inversify\";\n\nimport {\n EMPTY_TRON_ADDRESS_BOOK,\n type TronAddressBook,\n} from \"@api/model/TronAddressBook\";\nimport { appBindingModuleFactory } from \"@internal/app-binder/di/appBinderModule\";\nimport { externalTypes } from \"@internal/externalTypes\";\nimport { addressModuleFactory } from \"@internal/use-cases/address/di/addressModule\";\nimport { appConfigurationModuleFactory } from \"@internal/use-cases/app-configuration/di/appConfigurationModule\";\nimport { ecdhModuleFactory } from \"@internal/use-cases/ecdh/di/ecdhModule\";\nimport { messageModuleFactory } from \"@internal/use-cases/message/di/messageModule\";\nimport { transactionModuleFactory } from \"@internal/use-cases/transaction/di/transactionModule\";\n\ntype MakeContainerProps = {\n dmk: DeviceManagementKit;\n sessionId: DeviceSessionId;\n contextModule: ContextModule;\n addressBook?: TronAddressBook;\n};\n\nexport const makeContainer = ({\n dmk,\n sessionId,\n contextModule,\n addressBook,\n}: MakeContainerProps) => {\n const container = new Container();\n\n container.bind<DeviceManagementKit>(externalTypes.Dmk).toConstantValue(dmk);\n container\n .bind<ContextModule>(externalTypes.ContextModule)\n .toConstantValue(contextModule);\n container\n .bind<DeviceSessionId>(externalTypes.SessionId)\n .toConstantValue(sessionId);\n // Always bound: an absent address book is an empty one, which simply never\n // matches, so consumers never have to handle `undefined`.\n container\n .bind<TronAddressBook>(externalTypes.AddressBook)\n .toConstantValue(addressBook ?? EMPTY_TRON_ADDRESS_BOOK);\n\n container\n .bind<\n (tag: string) => LoggerPublisherService\n >(externalTypes.DmkLoggerFactory)\n .toConstantValue((tag: string) =>\n dmk.getLoggerFactory()([\"SignerTron\", tag]),\n );\n\n container.loadSync(\n appBindingModuleFactory(),\n addressModuleFactory(),\n transactionModuleFactory(),\n messageModuleFactory(),\n appConfigurationModuleFactory(),\n ecdhModuleFactory(),\n );\n\n return container;\n};\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,mBAAAE,IAAA,eAAAC,EAAAH,GAMA,IAAAI,EAA0B,qBAE1BC,EAGO,sCACPC,EAAwC,mDACxCC,EAA8B,mCAC9BC,EAAqC,wDACrCC,EAA8C,2EAC9CC,EAAkC,kDAClCC,EAAqC,wDACrCC,EAAyC,gEASlC,MAAMV,EAAgB,CAAC,CAC5B,IAAAW,EACA,UAAAC,EACA,cAAAC,EACA,YAAAC,CACF,IAA0B,CACxB,MAAMC,EAAY,IAAI,YAEtB,OAAAA,EAAU,KAA0B,gBAAc,GAAG,EAAE,gBAAgBJ,CAAG,EAC1EI,EACG,KAAoB,gBAAc,aAAa,EAC/C,gBAAgBF,CAAa,EAChCE,EACG,KAAsB,gBAAc,SAAS,EAC7C,gBAAgBH,CAAS,EAG5BG,EACG,KAAsB,gBAAc,WAAW,EAC/C,gBAAgBD,GAAe,yBAAuB,EAEzDC,EACG,KAEC,gBAAc,gBAAgB,EAC/B,gBAAiBC,GAChBL,EAAI,iBAAiB,EAAE,CAAC,aAAcK,CAAG,CAAC,CAC5C,EAEFD,EAAU,YACR,2BAAwB,KACxB,wBAAqB,KACrB,4BAAyB,KACzB,wBAAqB,KACrB,iCAA8B,KAC9B,qBAAkB,CACpB,EAEOA,CACT",
|
|
6
|
+
"names": ["di_exports", "__export", "makeContainer", "__toCommonJS", "import_inversify", "import_TronAddressBook", "import_appBinderModule", "import_externalTypes", "import_addressModule", "import_appConfigurationModule", "import_ecdhModule", "import_messageModule", "import_transactionModule", "dmk", "sessionId", "contextModule", "addressBook", "container", "tag"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var t=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var y=Object.prototype.hasOwnProperty;var n=(e,o)=>{for(var s in o)t(e,s,{get:o[s],enumerable:!0})},S=(e,o,s,m)=>{if(o&&typeof o=="object"||typeof o=="function")for(let r of l(o))!y.call(e,r)&&r!==s&&t(e,r,{get:()=>o[r],enumerable:!(m=d(o,r))||m.enumerable});return e};var k=e=>S(t({},"__esModule",{value:!0}),e);var f={};n(f,{externalTypes:()=>b});module.exports=k(f);const b={Dmk:Symbol.for("Dmk"),SessionId:Symbol.for("SessionId"),DmkLoggerFactory:Symbol.for("DmkLoggerFactory"),AddressBook:Symbol.for("AddressBook"),ContextModule:Symbol.for("ContextModule")};0&&(module.exports={externalTypes});
|
|
2
2
|
//# sourceMappingURL=externalTypes.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/internal/externalTypes.ts"],
|
|
4
|
-
"sourcesContent": ["export const externalTypes = {\n Dmk: Symbol.for(\"Dmk\"),\n SessionId: Symbol.for(\"SessionId\"),\n DmkLoggerFactory: Symbol.for(\"DmkLoggerFactory\"),\n AddressBook: Symbol.for(\"AddressBook\"),\n} as const;\n"],
|
|
5
|
-
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,mBAAAE,IAAA,eAAAC,EAAAH,GAAO,MAAME,EAAgB,CAC3B,IAAK,OAAO,IAAI,KAAK,EACrB,UAAW,OAAO,IAAI,WAAW,EACjC,iBAAkB,OAAO,IAAI,kBAAkB,EAC/C,YAAa,OAAO,IAAI,aAAa,
|
|
4
|
+
"sourcesContent": ["export const externalTypes = {\n Dmk: Symbol.for(\"Dmk\"),\n SessionId: Symbol.for(\"SessionId\"),\n DmkLoggerFactory: Symbol.for(\"DmkLoggerFactory\"),\n AddressBook: Symbol.for(\"AddressBook\"),\n ContextModule: Symbol.for(\"ContextModule\"),\n} as const;\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,mBAAAE,IAAA,eAAAC,EAAAH,GAAO,MAAME,EAAgB,CAC3B,IAAK,OAAO,IAAI,KAAK,EACrB,UAAW,OAAO,IAAI,WAAW,EACjC,iBAAkB,OAAO,IAAI,kBAAkB,EAC/C,YAAa,OAAO,IAAI,aAAa,EACrC,cAAe,OAAO,IAAI,eAAe,CAC3C",
|
|
6
6
|
"names": ["externalTypes_exports", "__export", "externalTypes", "__toCommonJS"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var d=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var C=Object.prototype.hasOwnProperty;var g=(o,e)=>{for(var r in e)d(o,r,{get:e[r],enumerable:!0})},h=(o,e,r,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of y(e))!C.call(o,n)&&n!==r&&d(o,n,{get:()=>e[n],enumerable:!(t=A(e,n))||t.enumerable});return o};var P=o=>h(d({},"__esModule",{value:!0}),o);var B={};g(B,{buildExternalContactPayload:()=>k});module.exports=P(B);var i=require("@ledgerhq/device-contacts-kit"),c=require("@ledgerhq/device-management-kit"),p=require("../../app-binder/TronApplicationResolver"),l=require("../../shared/utils/tronBase58Check");const v="tron";function k({addressBook:o,recipient:e,deviceState:r,appConfig:t}){if(x(r,t))for(const n of o.contactGroups){const a=n.externalAddresses.find(u=>{const s=(0,l.decodeTronAddress)(u.address);return s?.length===e.length&&s.every((f,m)=>f===e[m])});if(a!==void 0)return(0,i.buildProvideContactPayload)({contactName:n.contactName,scope:a.scope,identifier:e,groupHandle:n.groupHandle,hmacProof:n.hmacProof,hmacRest:a.hmacRest,blockchainFamily:v})}}function x(o,e){const r=(0,i.resolveContactsVersionRequirements)(o.deviceModelId);if(!r.supported)return!1;const t=r.minAppVersion[i.TRON_APP_NAME];return t===void 0?!1:new c.ApplicationChecker(o,e,new p.TronApplicationResolver).withMinVersionInclusiveAcceptingPrerelease(t).check()}0&&(module.exports={buildExternalContactPayload});
|
|
2
|
+
//# sourceMappingURL=buildExternalContactPayload.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/internal/shared/utils/buildExternalContactPayload.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n buildProvideContactPayload,\n resolveContactsVersionRequirements,\n TRON_APP_NAME,\n} from \"@ledgerhq/device-contacts-kit\";\nimport {\n ApplicationChecker,\n type DeviceSessionState,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type AppConfiguration } from \"@api/model/AppConfiguration\";\nimport { type TronAddressBook } from \"@api/model/TronAddressBook\";\nimport { TronApplicationResolver } from \"@internal/app-binder/TronApplicationResolver\";\nimport { decodeTronAddress } from \"@internal/shared/utils/tronBase58Check\";\n\nconst BLOCKCHAIN_FAMILY = \"tron\";\n\nexport type BuildExternalContactPayloadArgs = {\n readonly addressBook: TronAddressBook;\n readonly recipient: Uint8Array;\n readonly deviceState: DeviceSessionState;\n readonly appConfig: AppConfiguration;\n};\n\nexport function buildExternalContactPayload({\n addressBook,\n recipient,\n deviceState,\n appConfig,\n}: BuildExternalContactPayloadArgs): Uint8Array | undefined {\n if (!supportsContacts(deviceState, appConfig)) return undefined;\n\n for (const group of addressBook.contactGroups) {\n const match = group.externalAddresses.find((candidate) => {\n const decoded = decodeTronAddress(candidate.address);\n return (\n decoded?.length === recipient.length &&\n decoded.every((byte, index) => byte === recipient[index])\n );\n });\n if (match === undefined) continue;\n\n return buildProvideContactPayload({\n contactName: group.contactName,\n scope: match.scope,\n identifier: recipient,\n groupHandle: group.groupHandle,\n hmacProof: group.hmacProof,\n hmacRest: match.hmacRest,\n blockchainFamily: BLOCKCHAIN_FAMILY,\n });\n }\n\n return undefined;\n}\n\nfunction supportsContacts(\n deviceState: DeviceSessionState,\n appConfig: AppConfiguration,\n): boolean {\n const requirement = resolveContactsVersionRequirements(\n deviceState.deviceModelId,\n );\n if (!requirement.supported) return false;\n\n const minAppVersion = requirement.minAppVersion[TRON_APP_NAME];\n if (minAppVersion === undefined) return false;\n\n return new ApplicationChecker(\n deviceState,\n appConfig,\n new TronApplicationResolver(),\n )\n .withMinVersionInclusiveAcceptingPrerelease(minAppVersion)\n .check();\n}\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,iCAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAIO,yCACPC,EAGO,2CAIPC,EAAwC,wDACxCC,EAAkC,kDAElC,MAAMC,EAAoB,OASnB,SAASN,EAA4B,CAC1C,YAAAO,EACA,UAAAC,EACA,YAAAC,EACA,UAAAC,CACF,EAA4D,CAC1D,GAAKC,EAAiBF,EAAaC,CAAS,EAE5C,UAAWE,KAASL,EAAY,cAAe,CAC7C,MAAMM,EAAQD,EAAM,kBAAkB,KAAME,GAAc,CACxD,MAAMC,KAAU,qBAAkBD,EAAU,OAAO,EACnD,OACEC,GAAS,SAAWP,EAAU,QAC9BO,EAAQ,MAAM,CAACC,EAAMC,IAAUD,IAASR,EAAUS,CAAK,CAAC,CAE5D,CAAC,EACD,GAAIJ,IAAU,OAEd,SAAO,8BAA2B,CAChC,YAAaD,EAAM,YACnB,MAAOC,EAAM,MACb,WAAYL,EACZ,YAAaI,EAAM,YACnB,UAAWA,EAAM,UACjB,SAAUC,EAAM,SAChB,iBAAkBP,CACpB,CAAC,CACH,CAGF,CAEA,SAASK,EACPF,EACAC,EACS,CACT,MAAMQ,KAAc,sCAClBT,EAAY,aACd,EACA,GAAI,CAACS,EAAY,UAAW,MAAO,GAEnC,MAAMC,EAAgBD,EAAY,cAAc,eAAa,EAC7D,OAAIC,IAAkB,OAAkB,GAEjC,IAAI,qBACTV,EACAC,EACA,IAAI,yBACN,EACG,2CAA2CS,CAAa,EACxD,MAAM,CACX",
|
|
6
|
+
"names": ["buildExternalContactPayload_exports", "__export", "buildExternalContactPayload", "__toCommonJS", "import_device_contacts_kit", "import_device_management_kit", "import_TronApplicationResolver", "import_tronBase58Check", "BLOCKCHAIN_FAMILY", "addressBook", "recipient", "deviceState", "appConfig", "supportsContacts", "group", "match", "candidate", "decoded", "byte", "index", "requirement", "minAppVersion"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var r=require("@ledgerhq/device-contacts-kit"),n=require("@ledgerhq/device-management-kit"),u=require("../../../api/model/TronAddressBook"),d=require("../../shared/utils/tronBase58Check"),t=require("./buildExternalContactPayload");const l=new Uint8Array(21).fill(17),A=new Uint8Array(21).fill(34),f=new Uint8Array(64).fill(170),m=new Uint8Array(32).fill(187),c=new Uint8Array(32).fill(204),s={contactGroups:[{contactName:"Alice",groupHandle:f,hmacProof:m,externalAddresses:[{scope:"Tron",address:(0,d.encodeTronAddress)(A),hmacRest:new Uint8Array(32).fill(221)},{scope:"Tron",address:(0,d.encodeTronAddress)(l),hmacRest:c}]}],ledgerAccounts:[]},p=(()=>{const e=(0,r.resolveContactsVersionRequirements)(n.DeviceModelId.FLEX);if(!e.supported)throw new Error("Flex must be supported");const i=e.minAppVersion[r.TRON_APP_NAME];if(i===void 0)throw new Error("Tron min version required");return i})();function a(e=p,i=n.DeviceModelId.FLEX){return{sessionStateType:n.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:n.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Tron",version:e},deviceModelId:i,isSecureConnectionAllowed:!1}}function x(e=p){return{version:e,versionN:800,allowData:!0,allowContract:!0,truncateAddress:!1,signByHash:!1}}function o(e={}){return{addressBook:s,recipient:l,deviceState:a(),appConfig:x(),...e}}describe("buildExternalContactPayload",()=>{it("encodes the matching address and its group proofs",()=>{expect((0,t.buildExternalContactPayload)(o())).toStrictEqual((0,r.buildProvideContactPayload)({contactName:"Alice",scope:"Tron",identifier:l,groupHandle:f,hmacProof:m,hmacRest:c,blockchainFamily:"tron"}))}),it("returns undefined when no address matches",()=>{expect((0,t.buildExternalContactPayload)({...o(),recipient:new Uint8Array(21).fill(153)})).toBeUndefined()}),it("returns undefined for an empty address book",()=>{expect((0,t.buildExternalContactPayload)(o({addressBook:u.EMPTY_TRON_ADDRESS_BOOK}))).toBeUndefined()}),it("ignores a malformed address and continues matching",()=>{const e={...s,contactGroups:[{...s.contactGroups[0],externalAddresses:[{scope:"Tron",address:"invalid",hmacRest:c},...s.contactGroups[0].externalAddresses]}]};expect((0,t.buildExternalContactPayload)(o({addressBook:e}))).toBeDefined()}),it("returns undefined when the app is too old",()=>{expect((0,t.buildExternalContactPayload)(o({deviceState:a("0.7.9")}))).toBeUndefined()}),it("encodes the contact on a prerelease of the minimum app version",()=>{expect((0,t.buildExternalContactPayload)(o({deviceState:a(`${p}-dev2`)}))).toBeDefined()}),it("returns undefined on an unsupported device model",()=>{expect((0,t.buildExternalContactPayload)(o({deviceState:a("0.8.0",n.DeviceModelId.NANO_S)}))).toBeUndefined()})});
|
|
2
|
+
//# sourceMappingURL=buildExternalContactPayload.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/internal/shared/utils/buildExternalContactPayload.test.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n buildProvideContactPayload,\n resolveContactsVersionRequirements,\n TRON_APP_NAME,\n} from \"@ledgerhq/device-contacts-kit\";\nimport {\n DeviceModelId,\n type DeviceSessionState,\n DeviceSessionStateType,\n DeviceStatus,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type AppConfiguration } from \"@api/model/AppConfiguration\";\nimport {\n EMPTY_TRON_ADDRESS_BOOK,\n type TronAddressBook,\n} from \"@api/model/TronAddressBook\";\nimport { encodeTronAddress } from \"@internal/shared/utils/tronBase58Check\";\n\nimport {\n buildExternalContactPayload,\n type BuildExternalContactPayloadArgs,\n} from \"./buildExternalContactPayload\";\n\nconst RECIPIENT = new Uint8Array(21).fill(0x11);\nconst OTHER_ADDRESS = new Uint8Array(21).fill(0x22);\nconst GROUP_HANDLE = new Uint8Array(64).fill(0xaa);\nconst HMAC_PROOF = new Uint8Array(32).fill(0xbb);\nconst HMAC_REST = new Uint8Array(32).fill(0xcc);\n\nconst addressBook: TronAddressBook = {\n contactGroups: [\n {\n contactName: \"Alice\",\n groupHandle: GROUP_HANDLE,\n hmacProof: HMAC_PROOF,\n externalAddresses: [\n {\n scope: \"Tron\",\n address: encodeTronAddress(OTHER_ADDRESS),\n hmacRest: new Uint8Array(32).fill(0xdd),\n },\n {\n scope: \"Tron\",\n address: encodeTronAddress(RECIPIENT),\n hmacRest: HMAC_REST,\n },\n ],\n },\n ],\n ledgerAccounts: [],\n};\n\nconst minContactsAppVersion = (() => {\n const requirement = resolveContactsVersionRequirements(DeviceModelId.FLEX);\n if (!requirement.supported) throw new Error(\"Flex must be supported\");\n const version = requirement.minAppVersion[TRON_APP_NAME];\n if (version === undefined) throw new Error(\"Tron min version required\");\n return version;\n})();\n\nfunction deviceState(\n appVersion = minContactsAppVersion,\n deviceModelId = DeviceModelId.FLEX,\n): DeviceSessionState {\n return {\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Tron\", version: appVersion },\n deviceModelId,\n isSecureConnectionAllowed: false,\n };\n}\n\nfunction appConfig(version = minContactsAppVersion): AppConfiguration {\n return {\n version,\n versionN: 800,\n allowData: true,\n allowContract: true,\n truncateAddress: false,\n signByHash: false,\n };\n}\n\nfunction args(\n overrides: Partial<BuildExternalContactPayloadArgs> = {},\n): BuildExternalContactPayloadArgs {\n return {\n addressBook,\n recipient: RECIPIENT,\n deviceState: deviceState(),\n appConfig: appConfig(),\n ...overrides,\n };\n}\n\ndescribe(\"buildExternalContactPayload\", () => {\n it(\"encodes the matching address and its group proofs\", () => {\n expect(buildExternalContactPayload(args())).toStrictEqual(\n buildProvideContactPayload({\n contactName: \"Alice\",\n scope: \"Tron\",\n identifier: RECIPIENT,\n groupHandle: GROUP_HANDLE,\n hmacProof: HMAC_PROOF,\n hmacRest: HMAC_REST,\n blockchainFamily: \"tron\",\n }),\n );\n });\n\n it(\"returns undefined when no address matches\", () => {\n expect(\n buildExternalContactPayload({\n ...args(),\n recipient: new Uint8Array(21).fill(0x99),\n }),\n ).toBeUndefined();\n });\n\n it(\"returns undefined for an empty address book\", () => {\n expect(\n buildExternalContactPayload(\n args({ addressBook: EMPTY_TRON_ADDRESS_BOOK }),\n ),\n ).toBeUndefined();\n });\n\n it(\"ignores a malformed address and continues matching\", () => {\n const malformedFirst: TronAddressBook = {\n ...addressBook,\n contactGroups: [\n {\n ...addressBook.contactGroups[0]!,\n externalAddresses: [\n {\n scope: \"Tron\",\n address: \"invalid\",\n hmacRest: HMAC_REST,\n },\n ...addressBook.contactGroups[0]!.externalAddresses,\n ],\n },\n ],\n };\n\n expect(\n buildExternalContactPayload(args({ addressBook: malformedFirst })),\n ).toBeDefined();\n });\n\n it(\"returns undefined when the app is too old\", () => {\n expect(\n buildExternalContactPayload(args({ deviceState: deviceState(\"0.7.9\") })),\n ).toBeUndefined();\n });\n\n it(\"encodes the contact on a prerelease of the minimum app version\", () => {\n expect(\n buildExternalContactPayload(\n args({ deviceState: deviceState(`${minContactsAppVersion}-dev2`) }),\n ),\n ).toBeDefined();\n });\n\n it(\"returns undefined on an unsupported device model\", () => {\n expect(\n buildExternalContactPayload(\n args({ deviceState: deviceState(\"0.8.0\", DeviceModelId.NANO_S) }),\n ),\n ).toBeUndefined();\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_device_contacts_kit", "import_device_management_kit", "import_TronAddressBook", "import_tronBase58Check", "import_buildExternalContactPayload", "RECIPIENT", "OTHER_ADDRESS", "GROUP_HANDLE", "HMAC_PROOF", "HMAC_REST", "addressBook", "minContactsAppVersion", "requirement", "version", "deviceState", "appVersion", "deviceModelId", "appConfig", "args", "overrides", "malformedFirst"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var E=Object.defineProperty;var f=Object.getOwnPropertyDescriptor;var _=Object.getOwnPropertyNames;var A=Object.prototype.hasOwnProperty;var I=(t,d)=>{for(var n in d)E(t,n,{get:d[n],enumerable:!0})},o=(t,d,n,u)=>{if(d&&typeof d=="object"||typeof d=="function")for(let e of _(d))!A.call(t,e)&&e!==n&&E(t,e,{get:()=>d[e],enumerable:!(u=f(d,e))||u.enumerable});return t};var a=t=>o(E({},"__esModule",{value:!0}),t);var C={};I(C,{extractTransactionRecipient:()=>N});module.exports=a(C);function R(t,d){let n=0,u=1;for(let e=0;e<10;e++){const r=t[d+e];if(r===void 0)return;if(n+=(r&127)*u,(r&128)===0)return{value:n,next:d+e+1};u*=128}}function c(t,d){const n=R(t,d);if(n===void 0)return;const u=Math.floor(n.value/8),e=n.value%8;if(e===0){const r=R(t,n.next);return r===void 0?void 0:{fieldNumber:u,wireType:e,value:r.value,next:r.next}}if(e===2){const r=R(t,n.next);if(r===void 0)return;const i=r.next+r.value;return i>t.length?void 0:{fieldNumber:u,wireType:e,data:t.subarray(r.next,i),next:i}}if(e===1||e===5){const r=n.next+(e===1?8:4);return r>t.length?void 0:{fieldNumber:u,wireType:e,next:r}}}function T(t,d){let n=0;for(;n<t.length;){const u=c(t,n);if(u===void 0)return;if(u.fieldNumber===d)return u;n=u.next}}function N(t){const d=T(t,11)?.data;if(d===void 0)return;const n=T(d,1)?.value,u=T(d,2)?.data;if(u===void 0)return;const e=T(u,2)?.data;if(e===void 0)return;const r=n===1?2:n===2?3:n===31?2:void 0;if(r!==void 0)return T(e,r)?.data}0&&(module.exports={extractTransactionRecipient});
|
|
2
|
+
//# sourceMappingURL=extractTransactionRecipient.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/internal/shared/utils/extractTransactionRecipient.ts"],
|
|
4
|
+
"sourcesContent": ["const CONTRACT_FIELD = 11;\nconst CONTRACT_TYPE_FIELD = 1;\nconst CONTRACT_PARAMETER_FIELD = 2;\nconst ANY_VALUE_FIELD = 2;\n\nconst TRANSFER_CONTRACT = 1;\nconst TRANSFER_ASSET_CONTRACT = 2;\nconst TRIGGER_SMART_CONTRACT = 31;\n\nconst TRANSFER_RECIPIENT_FIELD = 2;\nconst TRANSFER_ASSET_RECIPIENT_FIELD = 3;\nconst SMART_CONTRACT_RECIPIENT_FIELD = 2;\n\nconst WIRE_VARINT = 0;\nconst WIRE_64BIT = 1;\nconst WIRE_LENGTH_DELIMITED = 2;\nconst WIRE_32BIT = 5;\nconst MAX_VARINT_BYTES = 10;\n\ntype ProtobufField = {\n fieldNumber: number;\n wireType: number;\n data?: Uint8Array;\n value?: number;\n next: number;\n};\n\nfunction readVarint(\n bytes: Uint8Array,\n offset: number,\n): { value: number; next: number } | undefined {\n let value = 0;\n let shift = 1;\n for (let index = 0; index < MAX_VARINT_BYTES; index++) {\n const byte = bytes[offset + index];\n if (byte === undefined) return undefined;\n value += (byte & 0x7f) * shift;\n if ((byte & 0x80) === 0) {\n return { value, next: offset + index + 1 };\n }\n shift *= 128;\n }\n return undefined;\n}\n\nfunction readField(\n bytes: Uint8Array,\n offset: number,\n): ProtobufField | undefined {\n const key = readVarint(bytes, offset);\n if (key === undefined) return undefined;\n\n const fieldNumber = Math.floor(key.value / 8);\n const wireType = key.value % 8;\n if (wireType === WIRE_VARINT) {\n const value = readVarint(bytes, key.next);\n return value === undefined\n ? undefined\n : { fieldNumber, wireType, value: value.value, next: value.next };\n }\n if (wireType === WIRE_LENGTH_DELIMITED) {\n const length = readVarint(bytes, key.next);\n if (length === undefined) return undefined;\n const end = length.next + length.value;\n return end > bytes.length\n ? undefined\n : {\n fieldNumber,\n wireType,\n data: bytes.subarray(length.next, end),\n next: end,\n };\n }\n if (wireType === WIRE_64BIT || wireType === WIRE_32BIT) {\n const end = key.next + (wireType === WIRE_64BIT ? 8 : 4);\n return end > bytes.length\n ? undefined\n : { fieldNumber, wireType, next: end };\n }\n return undefined;\n}\n\nfunction findField(\n bytes: Uint8Array,\n fieldNumber: number,\n): ProtobufField | undefined {\n let offset = 0;\n while (offset < bytes.length) {\n const field = readField(bytes, offset);\n if (field === undefined) return undefined;\n if (field.fieldNumber === fieldNumber) return field;\n offset = field.next;\n }\n return undefined;\n}\n\nexport function extractTransactionRecipient(\n rawTransaction: Uint8Array,\n): Uint8Array | undefined {\n const contract = findField(rawTransaction, CONTRACT_FIELD)?.data;\n if (contract === undefined) return undefined;\n\n const contractType = findField(contract, CONTRACT_TYPE_FIELD)?.value;\n const parameter = findField(contract, CONTRACT_PARAMETER_FIELD)?.data;\n if (parameter === undefined) return undefined;\n\n const value = findField(parameter, ANY_VALUE_FIELD)?.data;\n if (value === undefined) return undefined;\n\n const recipientField =\n contractType === TRANSFER_CONTRACT\n ? TRANSFER_RECIPIENT_FIELD\n : contractType === TRANSFER_ASSET_CONTRACT\n ? TRANSFER_ASSET_RECIPIENT_FIELD\n : contractType === TRIGGER_SMART_CONTRACT\n ? SMART_CONTRACT_RECIPIENT_FIELD\n : undefined;\n if (recipientField === undefined) return undefined;\n\n return findField(value, recipientField)?.data;\n}\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,iCAAAE,IAAA,eAAAC,EAAAH,GA2BA,SAASI,EACPC,EACAC,EAC6C,CAC7C,IAAIC,EAAQ,EACRC,EAAQ,EACZ,QAASC,EAAQ,EAAGA,EAAQ,GAAkBA,IAAS,CACrD,MAAMC,EAAOL,EAAMC,EAASG,CAAK,EACjC,GAAIC,IAAS,OAAW,OAExB,GADAH,IAAUG,EAAO,KAAQF,GACpBE,EAAO,OAAU,EACpB,MAAO,CAAE,MAAAH,EAAO,KAAMD,EAASG,EAAQ,CAAE,EAE3CD,GAAS,GACX,CAEF,CAEA,SAASG,EACPN,EACAC,EAC2B,CAC3B,MAAMM,EAAMR,EAAWC,EAAOC,CAAM,EACpC,GAAIM,IAAQ,OAAW,OAEvB,MAAMC,EAAc,KAAK,MAAMD,EAAI,MAAQ,CAAC,EACtCE,EAAWF,EAAI,MAAQ,EAC7B,GAAIE,IAAa,EAAa,CAC5B,MAAMP,EAAQH,EAAWC,EAAOO,EAAI,IAAI,EACxC,OAAOL,IAAU,OACb,OACA,CAAE,YAAAM,EAAa,SAAAC,EAAU,MAAOP,EAAM,MAAO,KAAMA,EAAM,IAAK,CACpE,CACA,GAAIO,IAAa,EAAuB,CACtC,MAAMC,EAASX,EAAWC,EAAOO,EAAI,IAAI,EACzC,GAAIG,IAAW,OAAW,OAC1B,MAAMC,EAAMD,EAAO,KAAOA,EAAO,MACjC,OAAOC,EAAMX,EAAM,OACf,OACA,CACE,YAAAQ,EACA,SAAAC,EACA,KAAMT,EAAM,SAASU,EAAO,KAAMC,CAAG,EACrC,KAAMA,CACR,CACN,CACA,GAAIF,IAAa,GAAcA,IAAa,EAAY,CACtD,MAAME,EAAMJ,EAAI,MAAQE,IAAa,EAAa,EAAI,GACtD,OAAOE,EAAMX,EAAM,OACf,OACA,CAAE,YAAAQ,EAAa,SAAAC,EAAU,KAAME,CAAI,CACzC,CAEF,CAEA,SAASC,EACPZ,EACAQ,EAC2B,CAC3B,IAAIP,EAAS,EACb,KAAOA,EAASD,EAAM,QAAQ,CAC5B,MAAMa,EAAQP,EAAUN,EAAOC,CAAM,EACrC,GAAIY,IAAU,OAAW,OACzB,GAAIA,EAAM,cAAgBL,EAAa,OAAOK,EAC9CZ,EAASY,EAAM,IACjB,CAEF,CAEO,SAASC,EACdC,EACwB,CACxB,MAAMC,EAAWJ,EAAUG,EAAgB,EAAc,GAAG,KAC5D,GAAIC,IAAa,OAAW,OAE5B,MAAMC,EAAeL,EAAUI,EAAU,CAAmB,GAAG,MACzDE,EAAYN,EAAUI,EAAU,CAAwB,GAAG,KACjE,GAAIE,IAAc,OAAW,OAE7B,MAAMhB,EAAQU,EAAUM,EAAW,CAAe,GAAG,KACrD,GAAIhB,IAAU,OAAW,OAEzB,MAAMiB,EACJF,IAAiB,EACb,EACAA,IAAiB,EACf,EACAA,IAAiB,GACf,EACA,OACV,GAAIE,IAAmB,OAEvB,OAAOP,EAAUV,EAAOiB,CAAc,GAAG,IAC3C",
|
|
6
|
+
"names": ["extractTransactionRecipient_exports", "__export", "extractTransactionRecipient", "__toCommonJS", "readVarint", "bytes", "offset", "value", "shift", "index", "byte", "readField", "key", "fieldNumber", "wireType", "length", "end", "findField", "field", "extractTransactionRecipient", "rawTransaction", "contract", "contractType", "parameter", "recipientField"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var a=require("./extractTransactionRecipient");const u=new Uint8Array(21).fill(34);function f(...t){const n=new Uint8Array(t.reduce((e,o)=>e+o.length,0));let r=0;for(const e of t)n.set(e,r),r+=e.length;return n}function i(t){const n=[];do{const r=t&127;t>>>=7,n.push(t===0?r:r|128)}while(t!==0);return Uint8Array.from(n)}function c(t,n){return f(i(t*8+2),i(n.length),n)}function s(t,n){const r=c(n,u),e=c(2,r),o=f(i(1*8),i(t),c(2,e));return c(11,o)}describe("extractTransactionRecipient",()=>{it.each([["TransferContract",1,2],["TransferAssetContract",2,3],["TriggerSmartContract",31,2]])("extracts the recipient from %s",(t,n,r)=>{expect((0,a.extractTransactionRecipient)(s(n,r))).toStrictEqual(u)}),it("returns undefined for an unsupported contract",()=>{expect((0,a.extractTransactionRecipient)(s(4,2))).toBeUndefined()}),it("returns undefined for a truncated transaction",()=>{const t=s(1,2);expect((0,a.extractTransactionRecipient)(t.subarray(0,-1))).toBeUndefined()})});
|
|
2
|
+
//# sourceMappingURL=extractTransactionRecipient.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/internal/shared/utils/extractTransactionRecipient.test.ts"],
|
|
4
|
+
"sourcesContent": ["import { extractTransactionRecipient } from \"./extractTransactionRecipient\";\n\nconst RECIPIENT = new Uint8Array(21).fill(0x22);\n\nfunction concat(...values: Uint8Array[]): Uint8Array {\n const result = new Uint8Array(\n values.reduce((length, value) => length + value.length, 0),\n );\n let offset = 0;\n for (const value of values) {\n result.set(value, offset);\n offset += value.length;\n }\n return result;\n}\n\nfunction varint(value: number): Uint8Array {\n const bytes: number[] = [];\n do {\n const part = value & 0x7f;\n value >>>= 7;\n bytes.push(value === 0 ? part : part | 0x80);\n } while (value !== 0);\n return Uint8Array.from(bytes);\n}\n\nfunction lengthDelimited(fieldNumber: number, value: Uint8Array): Uint8Array {\n return concat(varint(fieldNumber * 8 + 2), varint(value.length), value);\n}\n\nfunction transaction(contractType: number, recipientField: number): Uint8Array {\n const contractValue = lengthDelimited(recipientField, RECIPIENT);\n const parameter = lengthDelimited(2, contractValue);\n const contract = concat(\n varint(1 * 8),\n varint(contractType),\n lengthDelimited(2, parameter),\n );\n return lengthDelimited(11, contract);\n}\n\ndescribe(\"extractTransactionRecipient\", () => {\n it.each([\n [\"TransferContract\", 1, 2],\n [\"TransferAssetContract\", 2, 3],\n [\"TriggerSmartContract\", 31, 2],\n ])(\"extracts the recipient from %s\", (_name, contractType, fieldNumber) => {\n expect(\n extractTransactionRecipient(transaction(contractType, fieldNumber)),\n ).toStrictEqual(RECIPIENT);\n });\n\n it(\"returns undefined for an unsupported contract\", () => {\n expect(extractTransactionRecipient(transaction(4, 2))).toBeUndefined();\n });\n\n it(\"returns undefined for a truncated transaction\", () => {\n const complete = transaction(1, 2);\n\n expect(\n extractTransactionRecipient(complete.subarray(0, -1)),\n ).toBeUndefined();\n });\n});\n"],
|
|
5
|
+
"mappings": "aAAA,IAAAA,EAA4C,yCAE5C,MAAMC,EAAY,IAAI,WAAW,EAAE,EAAE,KAAK,EAAI,EAE9C,SAASC,KAAUC,EAAkC,CACnD,MAAMC,EAAS,IAAI,WACjBD,EAAO,OAAO,CAACE,EAAQC,IAAUD,EAASC,EAAM,OAAQ,CAAC,CAC3D,EACA,IAAIC,EAAS,EACb,UAAWD,KAASH,EAClBC,EAAO,IAAIE,EAAOC,CAAM,EACxBA,GAAUD,EAAM,OAElB,OAAOF,CACT,CAEA,SAASI,EAAOF,EAA2B,CACzC,MAAMG,EAAkB,CAAC,EACzB,EAAG,CACD,MAAMC,EAAOJ,EAAQ,IACrBA,KAAW,EACXG,EAAM,KAAKH,IAAU,EAAII,EAAOA,EAAO,GAAI,CAC7C,OAASJ,IAAU,GACnB,OAAO,WAAW,KAAKG,CAAK,CAC9B,CAEA,SAASE,EAAgBC,EAAqBN,EAA+B,CAC3E,OAAOJ,EAAOM,EAAOI,EAAc,EAAI,CAAC,EAAGJ,EAAOF,EAAM,MAAM,EAAGA,CAAK,CACxE,CAEA,SAASO,EAAYC,EAAsBC,EAAoC,CAC7E,MAAMC,EAAgBL,EAAgBI,EAAgBd,CAAS,EACzDgB,EAAYN,EAAgB,EAAGK,CAAa,EAC5CE,EAAWhB,EACfM,EAAO,EAAI,CAAC,EACZA,EAAOM,CAAY,EACnBH,EAAgB,EAAGM,CAAS,CAC9B,EACA,OAAON,EAAgB,GAAIO,CAAQ,CACrC,CAEA,SAAS,8BAA+B,IAAM,CAC5C,GAAG,KAAK,CACN,CAAC,mBAAoB,EAAG,CAAC,EACzB,CAAC,wBAAyB,EAAG,CAAC,EAC9B,CAAC,uBAAwB,GAAI,CAAC,CAChC,CAAC,EAAE,iCAAkC,CAACC,EAAOL,EAAcF,IAAgB,CACzE,UACE,+BAA4BC,EAAYC,EAAcF,CAAW,CAAC,CACpE,EAAE,cAAcX,CAAS,CAC3B,CAAC,EAED,GAAG,gDAAiD,IAAM,CACxD,UAAO,+BAA4BY,EAAY,EAAG,CAAC,CAAC,CAAC,EAAE,cAAc,CACvE,CAAC,EAED,GAAG,gDAAiD,IAAM,CACxD,MAAMO,EAAWP,EAAY,EAAG,CAAC,EAEjC,UACE,+BAA4BO,EAAS,SAAS,EAAG,EAAE,CAAC,CACtD,EAAE,cAAc,CAClB,CAAC,CACH,CAAC",
|
|
6
|
+
"names": ["import_extractTransactionRecipient", "RECIPIENT", "concat", "values", "result", "length", "value", "offset", "varint", "bytes", "part", "lengthDelimited", "fieldNumber", "transaction", "contractType", "recipientField", "contractValue", "parameter", "contract", "_name", "complete"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var h=Object.create;var u=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var U=Object.getOwnPropertyNames;var l=Object.getPrototypeOf,p=Object.prototype.hasOwnProperty;var g=(e,n)=>{for(var r in n)u(e,r,{get:n[r],enumerable:!0})},a=(e,n,r,c)=>{if(n&&typeof n=="object"||typeof n=="function")for(let t of U(n))!p.call(e,t)&&t!==r&&u(e,t,{get:()=>n[t],enumerable:!(c=m(n,t))||c.enumerable});return e};var A=(e,n,r)=>(r=e!=null?h(l(e)):{},a(n||!e||!e.__esModule?u(r,"default",{value:e,enumerable:!0}):r,e)),b=e=>a(u({},"__esModule",{value:!0}),e);var x={};g(x,{decodeTronAddress:()=>k,encodeTronAddress:()=>C});module.exports=b(x);var d=require("@noble/hashes/sha256"),i=A(require("bs58"));const o=4;function s(e){return(0,d.sha256)((0,d.sha256)(e)).subarray(0,o)}function C(e){const n=new Uint8Array(e.length+o);return n.set(e),n.set(s(e),e.length),i.default.encode(n)}function k(e){let n;try{n=i.default.decode(e)}catch{return}if(n.length<=o)return;const r=n.subarray(0,-o),c=n.subarray(-o),t=s(r);if(c.every((y,f)=>y===t[f]))return r}0&&(module.exports={decodeTronAddress,encodeTronAddress});
|
|
2
|
+
//# sourceMappingURL=tronBase58Check.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/internal/shared/utils/tronBase58Check.ts"],
|
|
4
|
+
"sourcesContent": ["import { sha256 } from \"@noble/hashes/sha256\";\nimport bs58 from \"bs58\";\n\nconst CHECKSUM_LENGTH = 4;\n\nfunction checksum(payload: Uint8Array): Uint8Array {\n return sha256(sha256(payload)).subarray(0, CHECKSUM_LENGTH);\n}\n\nexport function encodeTronAddress(rawAddress: Uint8Array): string {\n const encoded = new Uint8Array(rawAddress.length + CHECKSUM_LENGTH);\n encoded.set(rawAddress);\n encoded.set(checksum(rawAddress), rawAddress.length);\n return bs58.encode(encoded);\n}\n\n/** `undefined` when the address is malformed, a bad checksum included. */\nexport function decodeTronAddress(address: string): Uint8Array | undefined {\n let decoded: Uint8Array;\n try {\n decoded = bs58.decode(address);\n } catch {\n return undefined;\n }\n\n if (decoded.length <= CHECKSUM_LENGTH) return undefined;\n\n const payload = decoded.subarray(0, -CHECKSUM_LENGTH);\n const actualChecksum = decoded.subarray(-CHECKSUM_LENGTH);\n const expectedChecksum = checksum(payload);\n if (\n !actualChecksum.every((byte, index) => byte === expectedChecksum[index])\n ) {\n return undefined;\n }\n\n return payload;\n}\n"],
|
|
5
|
+
"mappings": "0jBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,uBAAAE,EAAA,sBAAAC,IAAA,eAAAC,EAAAJ,GAAA,IAAAK,EAAuB,gCACvBC,EAAiB,mBAEjB,MAAMC,EAAkB,EAExB,SAASC,EAASC,EAAiC,CACjD,SAAO,aAAO,UAAOA,CAAO,CAAC,EAAE,SAAS,EAAGF,CAAe,CAC5D,CAEO,SAASJ,EAAkBO,EAAgC,CAChE,MAAMC,EAAU,IAAI,WAAWD,EAAW,OAASH,CAAe,EAClE,OAAAI,EAAQ,IAAID,CAAU,EACtBC,EAAQ,IAAIH,EAASE,CAAU,EAAGA,EAAW,MAAM,EAC5C,EAAAE,QAAK,OAAOD,CAAO,CAC5B,CAGO,SAAST,EAAkBW,EAAyC,CACzE,IAAIC,EACJ,GAAI,CACFA,EAAU,EAAAF,QAAK,OAAOC,CAAO,CAC/B,MAAQ,CACN,MACF,CAEA,GAAIC,EAAQ,QAAUP,EAAiB,OAEvC,MAAME,EAAUK,EAAQ,SAAS,EAAG,CAACP,CAAe,EAC9CQ,EAAiBD,EAAQ,SAAS,CAACP,CAAe,EAClDS,EAAmBR,EAASC,CAAO,EACzC,GACGM,EAAe,MAAM,CAACE,EAAMC,IAAUD,IAASD,EAAiBE,CAAK,CAAC,EAKzE,OAAOT,CACT",
|
|
6
|
+
"names": ["tronBase58Check_exports", "__export", "decodeTronAddress", "encodeTronAddress", "__toCommonJS", "import_sha256", "import_bs58", "CHECKSUM_LENGTH", "checksum", "payload", "rawAddress", "encoded", "bs58", "address", "decoded", "actualChecksum", "expectedChecksum", "byte", "index"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var e=require("./tronBase58Check");const c=Uint8Array.from([65,136,64,230,197,91,154,218,50,109,33,29,129,140,52,169,148,174,201,237,128]);describe("Tron base58check",()=>{it("round-trips a raw Tron address",()=>{const d=(0,e.encodeTronAddress)(c);expect((0,e.decodeTronAddress)(d)).toStrictEqual(c)}),it("rejects an invalid checksum",()=>{const d=(0,e.encodeTronAddress)(c),t=d.endsWith("1")?"2":"1";expect((0,e.decodeTronAddress)(`${d.slice(0,-1)}${t}`)).toBeUndefined()}),it("rejects malformed base58",()=>{expect((0,e.decodeTronAddress)("not-a-tron-address")).toBeUndefined()})});
|
|
2
|
+
//# sourceMappingURL=tronBase58Check.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/internal/shared/utils/tronBase58Check.test.ts"],
|
|
4
|
+
"sourcesContent": ["import { decodeTronAddress, encodeTronAddress } from \"./tronBase58Check\";\n\nconst RAW_ADDRESS = Uint8Array.from([\n 0x41, 0x88, 0x40, 0xe6, 0xc5, 0x5b, 0x9a, 0xda, 0x32, 0x6d, 0x21, 0x1d, 0x81,\n 0x8c, 0x34, 0xa9, 0x94, 0xae, 0xc9, 0xed, 0x80,\n]);\n\ndescribe(\"Tron base58check\", () => {\n it(\"round-trips a raw Tron address\", () => {\n const encoded = encodeTronAddress(RAW_ADDRESS);\n\n expect(decodeTronAddress(encoded)).toStrictEqual(RAW_ADDRESS);\n });\n\n it(\"rejects an invalid checksum\", () => {\n const encoded = encodeTronAddress(RAW_ADDRESS);\n const replacement = encoded.endsWith(\"1\") ? \"2\" : \"1\";\n\n expect(\n decodeTronAddress(`${encoded.slice(0, -1)}${replacement}`),\n ).toBeUndefined();\n });\n\n it(\"rejects malformed base58\", () => {\n expect(decodeTronAddress(\"not-a-tron-address\")).toBeUndefined();\n });\n});\n"],
|
|
5
|
+
"mappings": "aAAA,IAAAA,EAAqD,6BAErD,MAAMC,EAAc,WAAW,KAAK,CAClC,GAAM,IAAM,GAAM,IAAM,IAAM,GAAM,IAAM,IAAM,GAAM,IAAM,GAAM,GAAM,IACxE,IAAM,GAAM,IAAM,IAAM,IAAM,IAAM,IAAM,GAC5C,CAAC,EAED,SAAS,mBAAoB,IAAM,CACjC,GAAG,iCAAkC,IAAM,CACzC,MAAMC,KAAU,qBAAkBD,CAAW,EAE7C,UAAO,qBAAkBC,CAAO,CAAC,EAAE,cAAcD,CAAW,CAC9D,CAAC,EAED,GAAG,8BAA+B,IAAM,CACtC,MAAMC,KAAU,qBAAkBD,CAAW,EACvCE,EAAcD,EAAQ,SAAS,GAAG,EAAI,IAAM,IAElD,UACE,qBAAkB,GAAGA,EAAQ,MAAM,EAAG,EAAE,CAAC,GAAGC,CAAW,EAAE,CAC3D,EAAE,cAAc,CAClB,CAAC,EAED,GAAG,2BAA4B,IAAM,CACnC,UAAO,qBAAkB,oBAAoB,CAAC,EAAE,cAAc,CAChE,CAAC,CACH,CAAC",
|
|
6
|
+
"names": ["import_tronBase58Check", "RAW_ADDRESS", "encoded", "replacement"]
|
|
7
|
+
}
|
package/lib/cjs/package.json
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"dependencies": {
|
|
3
|
+
"@ledgerhq/device-contacts-kit": "workspace:^",
|
|
3
4
|
"@ledgerhq/signer-utils": "^1.3.0",
|
|
5
|
+
"@noble/hashes": "^1.8.0",
|
|
6
|
+
"bs58": "catalog:",
|
|
4
7
|
"inversify": "catalog:",
|
|
5
8
|
"purify-ts": "catalog:",
|
|
6
9
|
"reflect-metadata": "catalog:",
|
|
7
10
|
"xstate": "catalog:"
|
|
8
11
|
},
|
|
9
12
|
"devDependencies": {
|
|
13
|
+
"@ledgerhq/context-module": "workspace:^",
|
|
10
14
|
"@ledgerhq/device-management-kit": "workspace:^",
|
|
11
15
|
"@ledgerhq/eslint-config-dsdk": "workspace:^",
|
|
12
16
|
"@ledgerhq/ldmk-tool": "workspace:^",
|
|
@@ -34,6 +38,7 @@
|
|
|
34
38
|
"license": "Apache-2.0",
|
|
35
39
|
"name": "@ledgerhq/device-signer-kit-tron",
|
|
36
40
|
"peerDependencies": {
|
|
41
|
+
"@ledgerhq/context-module": "workspace:^",
|
|
37
42
|
"@ledgerhq/device-management-kit": "workspace:^"
|
|
38
43
|
},
|
|
39
44
|
"private": false,
|
|
@@ -56,5 +61,5 @@
|
|
|
56
61
|
"watch:builds": "pnpm ldmk-tool watch --entryPoints src/index.ts,src/**/*.ts --tsconfig tsconfig.prod.json",
|
|
57
62
|
"watch:types": "concurrently \"tsc --watch -p tsconfig.prod.json\" \"tsc-alias --watch -p tsconfig.prod.json\""
|
|
58
63
|
},
|
|
59
|
-
"version": "0.
|
|
64
|
+
"version": "0.3.0"
|
|
60
65
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{ContextModuleBuilder as i,ContextModuleChainID as r}from"@ledgerhq/context-module";import{DefaultSignerTrx as n}from"../internal/DefaultSignerTrx";class a{_dmk;_sessionId;_originToken;_customContextModule;_addressBook;constructor({dmk:e,sessionId:o,originToken:t}){this._dmk=e,this._sessionId=o,this._originToken=t}withContextModule(e){return this._customContextModule=e,this}withAddressBook(e){return this._addressBook=e,this}build(){const e=this._customContextModule??new i({originToken:this._originToken,loggerFactory:o=>this._dmk.getLoggerFactory()(["ContextModule",o])}).setChain(r.Tron).build();return new n({dmk:this._dmk,sessionId:this._sessionId,contextModule:e,addressBook:this._addressBook})}}export{a as SignerTrxBuilder};
|
|
2
2
|
//# sourceMappingURL=SignerTrxBuilder.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/api/SignerTrxBuilder.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n type DeviceManagementKit,\n type DeviceSessionId,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type TronAddressBook } from \"@api/model/TronAddressBook\";\nimport { DefaultSignerTrx } from \"@internal/DefaultSignerTrx\";\n\ntype SignerTrxBuilderConstructorArgs = {\n dmk: DeviceManagementKit;\n sessionId: DeviceSessionId;\n};\n\n/**\n * Builder for the `SignerTrx` class.\n *\n * @example\n * ```\n * const signer = new SignerTrxBuilder({ dmk, sessionId })\n * .build();\n * ```\n */\nexport class SignerTrxBuilder {\n private readonly _dmk: DeviceManagementKit;\n private readonly _sessionId: DeviceSessionId;\n private _addressBook: TronAddressBook | undefined;\n\n constructor({
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": ["DefaultSignerTrx", "SignerTrxBuilder", "dmk", "sessionId", "addressBook"]
|
|
4
|
+
"sourcesContent": ["import {\n type ContextModule,\n ContextModuleBuilder,\n ContextModuleChainID,\n} from \"@ledgerhq/context-module\";\nimport {\n type DeviceManagementKit,\n type DeviceSessionId,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type TronAddressBook } from \"@api/model/TronAddressBook\";\nimport { DefaultSignerTrx } from \"@internal/DefaultSignerTrx\";\n\ntype SignerTrxBuilderConstructorArgs = {\n dmk: DeviceManagementKit;\n sessionId: DeviceSessionId;\n originToken?: string;\n};\n\n/**\n * Builder for the `SignerTrx` class.\n *\n * @example\n * ```\n * const signer = new SignerTrxBuilder({ dmk, sessionId })\n * .build();\n * ```\n */\nexport class SignerTrxBuilder {\n private readonly _dmk: DeviceManagementKit;\n private readonly _sessionId: DeviceSessionId;\n private readonly _originToken: string | undefined;\n private _customContextModule: ContextModule | undefined;\n private _addressBook: TronAddressBook | undefined;\n\n constructor({\n dmk,\n sessionId,\n originToken,\n }: SignerTrxBuilderConstructorArgs) {\n this._dmk = dmk;\n this._sessionId = sessionId;\n this._originToken = originToken;\n }\n\n /**\n * Override the default context module\n *\n * @param contextModule\n * @returns this\n */\n withContextModule(contextModule: ContextModule) {\n this._customContextModule = contextModule;\n return this;\n }\n\n /**\n * Provide the Tron-compatible address book used to clear-sign contact names.\n *\n * The snapshot must be complete: the signer neither mutates nor persists it,\n * and reads it as-is. Rebuild the signer to pick up later changes.\n *\n * @param addressBook a complete Tron address-book snapshot\n * @returns this\n */\n withAddressBook(addressBook: TronAddressBook) {\n this._addressBook = addressBook;\n return this;\n }\n\n /**\n * Build the Tron signer instance\n *\n * @returns the Tron signer instance\n */\n\n public build() {\n const contextModule =\n this._customContextModule ??\n new ContextModuleBuilder({\n originToken: this._originToken,\n loggerFactory: (tag: string) =>\n this._dmk.getLoggerFactory()([\"ContextModule\", tag]),\n })\n .setChain(ContextModuleChainID.Tron)\n .build();\n\n return new DefaultSignerTrx({\n dmk: this._dmk,\n sessionId: this._sessionId,\n contextModule,\n addressBook: this._addressBook,\n });\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAEE,wBAAAA,EACA,wBAAAC,MACK,2BAOP,OAAS,oBAAAC,MAAwB,6BAiB1B,MAAMC,CAAiB,CACX,KACA,WACA,aACT,qBACA,aAER,YAAY,CACV,IAAAC,EACA,UAAAC,EACA,YAAAC,CACF,EAAoC,CAClC,KAAK,KAAOF,EACZ,KAAK,WAAaC,EAClB,KAAK,aAAeC,CACtB,CAQA,kBAAkBC,EAA8B,CAC9C,YAAK,qBAAuBA,EACrB,IACT,CAWA,gBAAgBC,EAA8B,CAC5C,YAAK,aAAeA,EACb,IACT,CAQO,OAAQ,CACb,MAAMD,EACJ,KAAK,sBACL,IAAIP,EAAqB,CACvB,YAAa,KAAK,aAClB,cAAgBS,GACd,KAAK,KAAK,iBAAiB,EAAE,CAAC,gBAAiBA,CAAG,CAAC,CACvD,CAAC,EACE,SAASR,EAAqB,IAAI,EAClC,MAAM,EAEX,OAAO,IAAIC,EAAiB,CAC1B,IAAK,KAAK,KACV,UAAW,KAAK,WAChB,cAAAK,EACA,YAAa,KAAK,YACpB,CAAC,CACH,CACF",
|
|
6
|
+
"names": ["ContextModuleBuilder", "ContextModuleChainID", "DefaultSignerTrx", "SignerTrxBuilder", "dmk", "sessionId", "originToken", "contextModule", "addressBook", "tag"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{SignerTrxBuilder as
|
|
1
|
+
import{EMPTY_TRON_ADDRESS_BOOK as u}from"./model/TronAddressBook";import{SignerTrxBuilder as o}from"./SignerTrxBuilder";import{APP_NAME as l,INS as d,LEDGER_CLA as x}from"../internal/app-binder/constants";import{DefaultSignerTrx as a}from"../internal/DefaultSignerTrx";import{externalTypes as n}from"../internal/externalTypes";describe("SignerTrxBuilder",()=>{const r={dmk:{getLoggerFactory:vi.fn().mockReturnValue(vi.fn())},sessionId:""};test("should be an instance of SignerTrxBuilder",()=>{const e=new o(r);expect(e).toBeInstanceOf(o)}),test("should build a DefaultSignerTrx",()=>{const t=new o(r).build();expect(t).toBeInstanceOf(a)}),test("should build with a default Tron context module",()=>{const t=new o(r).build();expect(t._container.get(n.ContextModule)).toBeDefined()}),test("should build with a custom context module",()=>{const e={getContexts:vi.fn()},s=new o(r).withContextModule(e).build();expect(s._container.get(n.ContextModule)).toBe(e)}),test("should build with an empty address book by default",()=>{const t=new o(r).build();expect(t._container.get(n.AddressBook)).toEqual(u)}),test("should build with a custom address book",()=>{const e=new o(r),t={contactGroups:[{contactName:"Alice",groupHandle:Uint8Array.from([1,2]),hmacProof:Uint8Array.from([3,4]),externalAddresses:[{scope:"TRX",address:"TQ3zvJoxUCS3PtcAJ8f1FhezAxrEDbjyKh",hmacRest:Uint8Array.from([5])}]}],ledgerAccounts:[{accountName:"Main account",derivationPath:"44'/195'/0'/0/0",hmacProof:Uint8Array.from([6])}]},s=e.withAddressBook(t).build();expect(s).toBeInstanceOf(a),expect(s._container.get(n.AddressBook)).toBe(t)}),test("should preserve a contact group holding several addresses",()=>{const e=new o(r),t={contactGroups:[{contactName:"Bob",groupHandle:Uint8Array.from([10]),hmacProof:Uint8Array.from([11]),externalAddresses:[{scope:"TRX",address:"TN3W4H6rK2ce4vX9YnFQHwKENnHjoxb3m9",hmacRest:Uint8Array.from([12])},{scope:"USDT",address:"TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",hmacRest:Uint8Array.from([13])}]}],ledgerAccounts:[]},c=e.withAddressBook(t).build()._container.get(n.AddressBook);expect(c.contactGroups).toHaveLength(1),expect(c.contactGroups[0].externalAddresses).toHaveLength(2),expect(c.contactGroups[0].externalAddresses.map(i=>i.scope)).toEqual(["TRX","USDT"])})});describe("Tron APDU constants",()=>{test("APP_NAME should be Tron",()=>{expect(l).toBe("Tron")}),test("LEDGER_CLA should be 0xE0",()=>{expect(x).toBe(224)}),test("INS values should match the Tron app protocol",()=>{expect(d.GET_ADDRESS).toBe(2),expect(d.SIGN_TRANSACTION).toBe(4),expect(d.GET_APP_CONFIGURATION).toBe(6),expect(d.SIGN_PERSONAL_MESSAGE).toBe(8)})});
|
|
2
2
|
//# sourceMappingURL=SignerTrxBuilder.test.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/api/SignerTrxBuilder.test.ts"],
|
|
4
|
-
"sourcesContent": ["import { type DeviceManagementKit } from \"@ledgerhq/device-management-kit\";\n\nimport {
|
|
5
|
-
"mappings": "AAGA,OAAS,
|
|
6
|
-
"names": ["SignerTrxBuilder", "APP_NAME", "INS", "LEDGER_CLA", "DefaultSignerTrx", "externalTypes", "defaultConstructorArgs", "builder", "signer", "addressBook", "bound", "a"]
|
|
4
|
+
"sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport { type DeviceManagementKit } from \"@ledgerhq/device-management-kit\";\n\nimport {\n EMPTY_TRON_ADDRESS_BOOK,\n type TronAddressBook,\n} from \"@api/model/TronAddressBook\";\nimport { SignerTrxBuilder } from \"@api/SignerTrxBuilder\";\nimport { APP_NAME, INS, LEDGER_CLA } from \"@internal/app-binder/constants\";\nimport { DefaultSignerTrx } from \"@internal/DefaultSignerTrx\";\nimport { externalTypes } from \"@internal/externalTypes\";\n\ndescribe(\"SignerTrxBuilder\", () => {\n const dmk = {\n getLoggerFactory: vi.fn().mockReturnValue(vi.fn()),\n } as unknown as DeviceManagementKit;\n const defaultConstructorArgs = { dmk, sessionId: \"\" };\n\n test(\"should be an instance of SignerTrxBuilder\", () => {\n const builder = new SignerTrxBuilder(defaultConstructorArgs);\n\n expect(builder).toBeInstanceOf(SignerTrxBuilder);\n });\n\n test(\"should build a DefaultSignerTrx\", () => {\n const builder = new SignerTrxBuilder(defaultConstructorArgs);\n\n const signer = builder.build();\n\n expect(signer).toBeInstanceOf(DefaultSignerTrx);\n });\n test(\"should build with a default Tron context module\", () => {\n const builder = new SignerTrxBuilder(defaultConstructorArgs);\n\n const signer = builder.build();\n\n expect(\n signer[\"_container\"].get<ContextModule>(externalTypes.ContextModule),\n ).toBeDefined();\n });\n\n test(\"should build with a custom context module\", () => {\n const contextModule = { getContexts: vi.fn() } as unknown as ContextModule;\n const builder = new SignerTrxBuilder(defaultConstructorArgs);\n\n const signer = builder.withContextModule(contextModule).build();\n\n expect(\n signer[\"_container\"].get<ContextModule>(externalTypes.ContextModule),\n ).toBe(contextModule);\n });\n\n test(\"should build with an empty address book by default\", () => {\n const builder = new SignerTrxBuilder(defaultConstructorArgs);\n\n const signer = builder.build();\n\n expect(\n signer[\"_container\"].get<TronAddressBook>(externalTypes.AddressBook),\n ).toEqual(EMPTY_TRON_ADDRESS_BOOK);\n });\n\n test(\"should build with a custom address book\", () => {\n const builder = new SignerTrxBuilder(defaultConstructorArgs);\n const addressBook: TronAddressBook = {\n contactGroups: [\n {\n contactName: \"Alice\",\n groupHandle: Uint8Array.from([0x01, 0x02]),\n hmacProof: Uint8Array.from([0x03, 0x04]),\n externalAddresses: [\n {\n scope: \"TRX\",\n address: \"TQ3zvJoxUCS3PtcAJ8f1FhezAxrEDbjyKh\",\n hmacRest: Uint8Array.from([0x05]),\n },\n ],\n },\n ],\n ledgerAccounts: [\n {\n accountName: \"Main account\",\n derivationPath: \"44'/195'/0'/0/0\",\n hmacProof: Uint8Array.from([0x06]),\n },\n ],\n };\n\n const signer = builder.withAddressBook(addressBook).build();\n\n expect(signer).toBeInstanceOf(DefaultSignerTrx);\n expect(\n signer[\"_container\"].get<TronAddressBook>(externalTypes.AddressBook),\n ).toBe(addressBook);\n });\n\n test(\"should preserve a contact group holding several addresses\", () => {\n const builder = new SignerTrxBuilder(defaultConstructorArgs);\n const addressBook: TronAddressBook = {\n contactGroups: [\n {\n contactName: \"Bob\",\n groupHandle: Uint8Array.from([0x0a]),\n hmacProof: Uint8Array.from([0x0b]),\n externalAddresses: [\n {\n scope: \"TRX\",\n address: \"TN3W4H6rK2ce4vX9YnFQHwKENnHjoxb3m9\",\n hmacRest: Uint8Array.from([0x0c]),\n },\n {\n scope: \"USDT\",\n address: \"TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t\",\n hmacRest: Uint8Array.from([0x0d]),\n },\n ],\n },\n ],\n ledgerAccounts: [],\n };\n\n const signer = builder.withAddressBook(addressBook).build();\n const bound = signer[\"_container\"].get<TronAddressBook>(\n externalTypes.AddressBook,\n );\n\n expect(bound.contactGroups).toHaveLength(1);\n expect(bound.contactGroups[0]!.externalAddresses).toHaveLength(2);\n expect(\n bound.contactGroups[0]!.externalAddresses.map((a) => a.scope),\n ).toEqual([\"TRX\", \"USDT\"]);\n });\n});\n\ndescribe(\"Tron APDU constants\", () => {\n test(\"APP_NAME should be Tron\", () => {\n expect(APP_NAME).toBe(\"Tron\");\n });\n\n test(\"LEDGER_CLA should be 0xE0\", () => {\n expect(LEDGER_CLA).toBe(0xe0);\n });\n\n test(\"INS values should match the Tron app protocol\", () => {\n expect(INS.GET_ADDRESS).toBe(0x02);\n expect(INS.SIGN_TRANSACTION).toBe(0x04);\n expect(INS.GET_APP_CONFIGURATION).toBe(0x06);\n expect(INS.SIGN_PERSONAL_MESSAGE).toBe(0x08);\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["EMPTY_TRON_ADDRESS_BOOK", "SignerTrxBuilder", "APP_NAME", "INS", "LEDGER_CLA", "DefaultSignerTrx", "externalTypes", "defaultConstructorArgs", "builder", "signer", "contextModule", "addressBook", "bound", "a"]
|
|
7
7
|
}
|
|
@@ -1 +1,2 @@
|
|
|
1
|
+
var e=(r=>(r.OPEN_APP="signer.trx.steps.openApp",r.GET_APP_CONFIG="signer.trx.steps.getAppConfig",r.BUILD_CONTEXT="signer.trx.steps.buildContext",r.PROVIDE_CONTACT="signer.trx.steps.provideContact",r.SIGN_TRANSACTION="signer.trx.steps.signTransaction",r))(e||{});export{e as SignTransactionDAStep};
|
|
1
2
|
//# sourceMappingURL=SignTransactionDeviceActionTypes.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": [],
|
|
4
|
-
"sourcesContent": [],
|
|
5
|
-
"mappings": "",
|
|
6
|
-
"names": []
|
|
3
|
+
"sources": ["../../../../src/api/app-binder/SignTransactionDeviceActionTypes.ts"],
|
|
4
|
+
"sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n type CommandErrorResult,\n type ExecuteDeviceActionReturnType,\n type OpenAppDAError,\n type OpenAppDARequiredInteraction,\n type UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type AppConfiguration } from \"@api/model/AppConfiguration\";\nimport { type Signature } from \"@api/model/Signature\";\nimport { type TronAddressBook } from \"@api/model/TronAddressBook\";\nimport { type TronAppErrorCodes } from \"@internal/app-binder/command/utils/tronApplicationErrors\";\n\nexport type SignTransactionDAOutput = Signature;\n\nexport type SignTransactionDAInput = {\n readonly derivationPath: string;\n readonly transaction: Uint8Array;\n readonly contextModule: ContextModule;\n readonly addressBook: TronAddressBook;\n readonly skipOpenApp: boolean;\n};\n\nexport type SignTransactionDAError =\n | OpenAppDAError\n | CommandErrorResult<TronAppErrorCodes>[\"error\"];\n\ntype SignTransactionDARequiredInteraction =\n | OpenAppDARequiredInteraction\n | UserInteractionRequired.None\n | UserInteractionRequired.SignTransaction;\n\nexport enum SignTransactionDAStep {\n OPEN_APP = \"signer.trx.steps.openApp\",\n GET_APP_CONFIG = \"signer.trx.steps.getAppConfig\",\n BUILD_CONTEXT = \"signer.trx.steps.buildContext\",\n PROVIDE_CONTACT = \"signer.trx.steps.provideContact\",\n SIGN_TRANSACTION = \"signer.trx.steps.signTransaction\",\n}\n\nexport type SignTransactionDAIntermediateValue = {\n requiredUserInteraction: SignTransactionDARequiredInteraction;\n step: SignTransactionDAStep;\n};\n\nexport type SignTransactionDAInternalState = {\n readonly error: SignTransactionDAError | null;\n readonly appConfig: AppConfiguration | null;\n readonly tokenPayloads: Uint8Array[] | null;\n readonly signature: Signature | null;\n};\n\nexport type SignTransactionDAReturnType = ExecuteDeviceActionReturnType<\n SignTransactionDAOutput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n>;\n"],
|
|
5
|
+
"mappings": "AAiCO,IAAKA,OACVA,EAAA,SAAW,2BACXA,EAAA,eAAiB,gCACjBA,EAAA,cAAgB,gCAChBA,EAAA,gBAAkB,kCAClBA,EAAA,iBAAmB,mCALTA,OAAA",
|
|
6
|
+
"names": ["SignTransactionDAStep"]
|
|
7
7
|
}
|
package/lib/esm/api/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{EMPTY_TRON_ADDRESS_BOOK as r}from"./model/TronAddressBook";import{SignerTrxBuilder as p}from"./SignerTrxBuilder";import{decodeTronAddress as a,encodeTronAddress as s}from"../internal/shared/utils/tronBase58Check";export{r as EMPTY_TRON_ADDRESS_BOOK,p as SignerTrxBuilder,a as decodeTronAddress,s as encodeTronAddress};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|