@ledgerhq/context-module 0.0.0-test-recursive-stack-20251002122259 → 0.0.0-test-ble-20251112111541
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/lib/cjs/package.json +1 -1
- package/lib/cjs/src/ContextModule.js +1 -1
- package/lib/cjs/src/ContextModule.js.map +1 -1
- package/lib/cjs/src/ContextModuleBuilder.js +1 -1
- package/lib/cjs/src/ContextModuleBuilder.js.map +2 -2
- package/lib/cjs/src/ContextModuleBuilder.test.js +1 -1
- package/lib/cjs/src/ContextModuleBuilder.test.js.map +2 -2
- package/lib/cjs/src/DefaultContextModule.js +1 -1
- package/lib/cjs/src/DefaultContextModule.js.map +3 -3
- package/lib/cjs/src/DefaultContextModule.test.js +1 -1
- package/lib/cjs/src/DefaultContextModule.test.js.map +3 -3
- package/lib/cjs/src/config/model/ContextModuleConfig.js +1 -1
- package/lib/cjs/src/config/model/ContextModuleConfig.js.map +1 -1
- package/lib/cjs/src/di.js +1 -1
- package/lib/cjs/src/di.js.map +3 -3
- package/lib/cjs/src/external-plugin/domain/ExternalPluginContextLoader.js +1 -1
- package/lib/cjs/src/external-plugin/domain/ExternalPluginContextLoader.js.map +3 -3
- package/lib/cjs/src/external-plugin/domain/ExternalPluginContextLoader.test.js +1 -1
- package/lib/cjs/src/external-plugin/domain/ExternalPluginContextLoader.test.js.map +3 -3
- package/lib/cjs/src/index.js +1 -1
- package/lib/cjs/src/index.js.map +2 -2
- package/lib/cjs/src/pki/model/KeyUsage.js +1 -1
- package/lib/cjs/src/pki/model/KeyUsage.js.map +2 -2
- package/lib/cjs/src/safe/data/HttpSafeAccountDataSource.js +2 -0
- package/lib/cjs/src/safe/data/HttpSafeAccountDataSource.js.map +7 -0
- package/lib/cjs/src/safe/data/HttpSafeAccountDataSource.test.js +2 -0
- package/lib/cjs/src/safe/data/HttpSafeAccountDataSource.test.js.map +7 -0
- package/lib/cjs/src/safe/data/SafeAccountDataSource.js +2 -0
- package/lib/cjs/src/safe/data/SafeAccountDataSource.js.map +7 -0
- package/lib/cjs/src/safe/data/dto/SafeAccountDto.js +2 -0
- package/lib/cjs/src/safe/data/dto/SafeAccountDto.js.map +7 -0
- package/lib/cjs/src/safe/di/safeModuleFactory.js +2 -0
- package/lib/cjs/src/safe/di/safeModuleFactory.js.map +7 -0
- package/lib/cjs/src/safe/di/safeModuleFactory.test.js +2 -0
- package/lib/cjs/src/safe/di/safeModuleFactory.test.js.map +7 -0
- package/lib/cjs/src/safe/di/safeTypes.js +2 -0
- package/lib/cjs/src/safe/di/safeTypes.js.map +7 -0
- package/lib/cjs/src/safe/domain/SafeAddressLoader.js +2 -0
- package/lib/cjs/src/safe/domain/SafeAddressLoader.js.map +7 -0
- package/lib/cjs/src/safe/domain/SafeAddressLoader.test.js +2 -0
- package/lib/cjs/src/safe/domain/SafeAddressLoader.test.js.map +7 -0
- package/lib/cjs/src/shared/model/ClearSignContext.js +1 -1
- package/lib/cjs/src/shared/model/ClearSignContext.js.map +2 -2
- package/lib/cjs/src/shared/utils/KeyUsageMapper.js +1 -1
- package/lib/cjs/src/shared/utils/KeyUsageMapper.js.map +2 -2
- package/lib/cjs/src/shared/utils/KeyUsageMapper.test.js +1 -1
- package/lib/cjs/src/shared/utils/KeyUsageMapper.test.js.map +2 -2
- package/lib/cjs/src/token/data/HttpTokenDataSource.js +1 -1
- package/lib/cjs/src/token/data/HttpTokenDataSource.js.map +2 -2
- package/lib/cjs/src/token/data/HttpTokenDataSource.test.js +1 -1
- package/lib/cjs/src/token/data/HttpTokenDataSource.test.js.map +2 -2
- package/lib/cjs/src/transaction-check/data/HttpTransactionCheckDataSource.js +2 -0
- package/lib/cjs/src/transaction-check/data/HttpTransactionCheckDataSource.js.map +7 -0
- package/lib/cjs/src/transaction-check/data/HttpTransactionCheckDataSource.test.js +2 -0
- package/lib/cjs/src/transaction-check/data/HttpTransactionCheckDataSource.test.js.map +7 -0
- package/lib/cjs/src/transaction-check/data/HttpTypedDataCheckDataSource.js +2 -0
- package/lib/cjs/src/transaction-check/data/HttpTypedDataCheckDataSource.js.map +7 -0
- package/lib/cjs/src/transaction-check/data/HttpTypedDataCheckDataSource.test.js +2 -0
- package/lib/cjs/src/transaction-check/data/HttpTypedDataCheckDataSource.test.js.map +7 -0
- package/lib/cjs/src/transaction-check/data/TransactionCheckDataSource.js +2 -0
- package/lib/cjs/src/transaction-check/data/TransactionCheckDataSource.js.map +7 -0
- package/lib/cjs/src/transaction-check/data/TypedDataCheckDataSource.js +2 -0
- package/lib/cjs/src/transaction-check/data/TypedDataCheckDataSource.js.map +7 -0
- package/lib/cjs/src/transaction-check/data/dto/TransactionCheckDto.js +2 -0
- package/lib/cjs/src/transaction-check/data/dto/TransactionCheckDto.js.map +7 -0
- package/lib/cjs/src/transaction-check/data/dto/TypedDataCheckDto.js +2 -0
- package/lib/cjs/src/transaction-check/data/dto/TypedDataCheckDto.js.map +7 -0
- package/lib/cjs/src/transaction-check/di/transactionCheckModuleFactory.js +2 -0
- package/lib/cjs/src/transaction-check/di/transactionCheckModuleFactory.js.map +7 -0
- package/lib/cjs/src/transaction-check/di/transactionCheckTypes.js +2 -0
- package/lib/cjs/src/transaction-check/di/transactionCheckTypes.js.map +7 -0
- package/lib/cjs/src/transaction-check/domain/TransactionCheckContextLoader.js +2 -0
- package/lib/cjs/src/transaction-check/domain/TransactionCheckContextLoader.js.map +7 -0
- package/lib/cjs/src/transaction-check/domain/TransactionCheckContextLoader.test.js +2 -0
- package/lib/cjs/src/transaction-check/domain/TransactionCheckContextLoader.test.js.map +7 -0
- package/lib/cjs/src/transaction-check/domain/TypedDataCheckContextLoader.js +2 -0
- package/lib/cjs/src/transaction-check/domain/TypedDataCheckContextLoader.js.map +7 -0
- package/lib/cjs/src/transaction-check/domain/TypedDataCheckContextLoader.test.js +2 -0
- package/lib/cjs/src/transaction-check/domain/TypedDataCheckContextLoader.test.js.map +7 -0
- package/lib/cjs/src/uniswap/constants/uniswap.js +1 -1
- package/lib/cjs/src/uniswap/constants/uniswap.js.map +3 -3
- package/lib/cjs/src/uniswap/domain/UniswapContextLoader.js +1 -1
- package/lib/cjs/src/uniswap/domain/UniswapContextLoader.js.map +3 -3
- package/lib/cjs/src/uniswap/domain/UniswapContextLoader.test.js +1 -1
- package/lib/cjs/src/uniswap/domain/UniswapContextLoader.test.js.map +2 -2
- package/lib/esm/package.json +1 -1
- package/lib/esm/src/ContextModuleBuilder.js +1 -1
- package/lib/esm/src/ContextModuleBuilder.js.map +2 -2
- package/lib/esm/src/ContextModuleBuilder.test.js +1 -1
- package/lib/esm/src/ContextModuleBuilder.test.js.map +2 -2
- package/lib/esm/src/DefaultContextModule.js +1 -1
- package/lib/esm/src/DefaultContextModule.js.map +3 -3
- package/lib/esm/src/DefaultContextModule.test.js +1 -1
- package/lib/esm/src/DefaultContextModule.test.js.map +3 -3
- package/lib/esm/src/di.js +1 -1
- package/lib/esm/src/di.js.map +3 -3
- package/lib/esm/src/external-plugin/domain/ExternalPluginContextLoader.js +1 -1
- package/lib/esm/src/external-plugin/domain/ExternalPluginContextLoader.js.map +3 -3
- package/lib/esm/src/external-plugin/domain/ExternalPluginContextLoader.test.js +1 -1
- package/lib/esm/src/external-plugin/domain/ExternalPluginContextLoader.test.js.map +3 -3
- package/lib/esm/src/index.js +1 -1
- package/lib/esm/src/index.js.map +2 -2
- package/lib/esm/src/pki/model/KeyUsage.js +1 -1
- package/lib/esm/src/pki/model/KeyUsage.js.map +2 -2
- package/lib/esm/src/safe/data/HttpSafeAccountDataSource.js +2 -0
- package/lib/esm/src/safe/data/HttpSafeAccountDataSource.js.map +7 -0
- package/lib/esm/src/safe/data/HttpSafeAccountDataSource.test.js +2 -0
- package/lib/esm/src/safe/data/HttpSafeAccountDataSource.test.js.map +7 -0
- package/lib/esm/src/safe/data/SafeAccountDataSource.js +1 -0
- package/lib/esm/src/safe/data/dto/SafeAccountDto.js +1 -0
- package/lib/esm/src/safe/di/safeModuleFactory.js +2 -0
- package/lib/esm/src/safe/di/safeModuleFactory.js.map +7 -0
- package/lib/esm/src/safe/di/safeModuleFactory.test.js +2 -0
- package/lib/esm/src/safe/di/safeModuleFactory.test.js.map +7 -0
- package/lib/esm/src/safe/di/safeTypes.js +2 -0
- package/lib/esm/src/safe/di/safeTypes.js.map +7 -0
- package/lib/esm/src/safe/domain/SafeAddressLoader.js +2 -0
- package/lib/esm/src/safe/domain/SafeAddressLoader.js.map +7 -0
- package/lib/esm/src/safe/domain/SafeAddressLoader.test.js +2 -0
- package/lib/esm/src/safe/domain/SafeAddressLoader.test.js.map +7 -0
- package/lib/esm/src/shared/model/ClearSignContext.js +1 -1
- package/lib/esm/src/shared/model/ClearSignContext.js.map +2 -2
- package/lib/esm/src/shared/utils/KeyUsageMapper.js +1 -1
- package/lib/esm/src/shared/utils/KeyUsageMapper.js.map +2 -2
- package/lib/esm/src/shared/utils/KeyUsageMapper.test.js +1 -1
- package/lib/esm/src/shared/utils/KeyUsageMapper.test.js.map +2 -2
- package/lib/esm/src/token/data/HttpTokenDataSource.js +1 -1
- package/lib/esm/src/token/data/HttpTokenDataSource.js.map +2 -2
- package/lib/esm/src/token/data/HttpTokenDataSource.test.js +1 -1
- package/lib/esm/src/token/data/HttpTokenDataSource.test.js.map +2 -2
- package/lib/esm/src/transaction-check/data/HttpTransactionCheckDataSource.js +2 -0
- package/lib/esm/src/transaction-check/data/HttpTransactionCheckDataSource.js.map +7 -0
- package/lib/esm/src/transaction-check/data/HttpTransactionCheckDataSource.test.js +2 -0
- package/lib/esm/src/transaction-check/data/HttpTransactionCheckDataSource.test.js.map +7 -0
- package/lib/esm/src/transaction-check/data/HttpTypedDataCheckDataSource.js +2 -0
- package/lib/esm/src/transaction-check/data/HttpTypedDataCheckDataSource.js.map +7 -0
- package/lib/esm/src/transaction-check/data/HttpTypedDataCheckDataSource.test.js +2 -0
- package/lib/esm/src/transaction-check/data/HttpTypedDataCheckDataSource.test.js.map +7 -0
- package/lib/esm/src/transaction-check/data/TransactionCheckDataSource.js +1 -0
- package/lib/esm/src/transaction-check/data/TypedDataCheckDataSource.js +1 -0
- package/lib/esm/src/transaction-check/data/dto/TransactionCheckDto.js +1 -0
- package/lib/esm/src/transaction-check/data/dto/TransactionCheckDto.js.map +7 -0
- package/lib/esm/src/transaction-check/data/dto/TypedDataCheckDto.js +1 -0
- package/lib/esm/src/transaction-check/data/dto/TypedDataCheckDto.js.map +7 -0
- package/lib/esm/src/transaction-check/di/transactionCheckModuleFactory.js +2 -0
- package/lib/esm/src/transaction-check/di/transactionCheckModuleFactory.js.map +7 -0
- package/lib/esm/src/transaction-check/di/transactionCheckTypes.js +2 -0
- package/lib/esm/src/transaction-check/di/transactionCheckTypes.js.map +7 -0
- package/lib/esm/src/transaction-check/domain/TransactionCheckContextLoader.js +2 -0
- package/lib/esm/src/transaction-check/domain/TransactionCheckContextLoader.js.map +7 -0
- package/lib/esm/src/transaction-check/domain/TransactionCheckContextLoader.test.js +2 -0
- package/lib/esm/src/transaction-check/domain/TransactionCheckContextLoader.test.js.map +7 -0
- package/lib/esm/src/transaction-check/domain/TypedDataCheckContextLoader.js +2 -0
- package/lib/esm/src/transaction-check/domain/TypedDataCheckContextLoader.js.map +7 -0
- package/lib/esm/src/transaction-check/domain/TypedDataCheckContextLoader.test.js +2 -0
- package/lib/esm/src/transaction-check/domain/TypedDataCheckContextLoader.test.js.map +7 -0
- package/lib/esm/src/uniswap/constants/uniswap.js +1 -1
- package/lib/esm/src/uniswap/constants/uniswap.js.map +3 -3
- package/lib/esm/src/uniswap/domain/UniswapContextLoader.js +1 -1
- package/lib/esm/src/uniswap/domain/UniswapContextLoader.js.map +3 -3
- package/lib/esm/src/uniswap/domain/UniswapContextLoader.test.js +1 -1
- package/lib/esm/src/uniswap/domain/UniswapContextLoader.test.js.map +3 -3
- package/lib/types/src/ContextModule.d.ts +0 -2
- package/lib/types/src/ContextModule.d.ts.map +1 -1
- package/lib/types/src/ContextModuleBuilder.d.ts +0 -9
- package/lib/types/src/ContextModuleBuilder.d.ts.map +1 -1
- package/lib/types/src/DefaultContextModule.d.ts +1 -5
- package/lib/types/src/DefaultContextModule.d.ts.map +1 -1
- package/lib/types/src/config/model/ContextModuleConfig.d.ts +0 -2
- package/lib/types/src/config/model/ContextModuleConfig.d.ts.map +1 -1
- package/lib/types/src/di.d.ts.map +1 -1
- package/lib/types/src/external-plugin/domain/ExternalPluginContextLoader.d.ts +9 -1
- package/lib/types/src/external-plugin/domain/ExternalPluginContextLoader.d.ts.map +1 -1
- package/lib/types/src/index.d.ts +0 -5
- package/lib/types/src/index.d.ts.map +1 -1
- package/lib/types/src/pki/model/KeyUsage.d.ts +2 -1
- package/lib/types/src/pki/model/KeyUsage.d.ts.map +1 -1
- package/lib/types/src/safe/data/HttpSafeAccountDataSource.d.ts +11 -0
- package/lib/types/src/safe/data/HttpSafeAccountDataSource.d.ts.map +1 -0
- package/lib/types/src/safe/data/HttpSafeAccountDataSource.test.d.ts +2 -0
- package/lib/types/src/safe/data/HttpSafeAccountDataSource.test.d.ts.map +1 -0
- package/lib/types/src/safe/data/SafeAccountDataSource.d.ts +20 -0
- package/lib/types/src/safe/data/SafeAccountDataSource.d.ts.map +1 -0
- package/lib/types/src/safe/data/dto/SafeAccountDto.d.ts +10 -0
- package/lib/types/src/safe/data/dto/SafeAccountDto.d.ts.map +1 -0
- package/lib/types/src/safe/di/safeModuleFactory.d.ts +3 -0
- package/lib/types/src/safe/di/safeModuleFactory.d.ts.map +1 -0
- package/lib/types/src/safe/di/safeModuleFactory.test.d.ts +2 -0
- package/lib/types/src/safe/di/safeModuleFactory.test.d.ts.map +1 -0
- package/lib/types/src/safe/di/safeTypes.d.ts +5 -0
- package/lib/types/src/safe/di/safeTypes.d.ts.map +1 -0
- package/lib/types/src/safe/domain/SafeAddressLoader.d.ts +19 -0
- package/lib/types/src/safe/domain/SafeAddressLoader.d.ts.map +1 -0
- package/lib/types/src/safe/domain/SafeAddressLoader.test.d.ts +2 -0
- package/lib/types/src/safe/domain/SafeAddressLoader.test.d.ts.map +1 -0
- package/lib/types/src/shared/model/ClearSignContext.d.ts +4 -2
- package/lib/types/src/shared/model/ClearSignContext.d.ts.map +1 -1
- package/lib/types/src/shared/utils/KeyUsageMapper.d.ts.map +1 -1
- package/lib/types/src/token/data/HttpTokenDataSource.d.ts.map +1 -1
- package/lib/types/src/transaction-check/data/HttpTransactionCheckDataSource.d.ts +10 -0
- package/lib/types/src/transaction-check/data/HttpTransactionCheckDataSource.d.ts.map +1 -0
- package/lib/types/src/transaction-check/data/HttpTransactionCheckDataSource.test.d.ts +2 -0
- package/lib/types/src/transaction-check/data/HttpTransactionCheckDataSource.test.d.ts.map +1 -0
- package/lib/types/src/transaction-check/data/HttpTypedDataCheckDataSource.d.ts +10 -0
- package/lib/types/src/transaction-check/data/HttpTypedDataCheckDataSource.d.ts.map +1 -0
- package/lib/types/src/transaction-check/data/HttpTypedDataCheckDataSource.test.d.ts +2 -0
- package/lib/types/src/transaction-check/data/HttpTypedDataCheckDataSource.test.d.ts.map +1 -0
- package/lib/types/src/transaction-check/data/TransactionCheckDataSource.d.ts +14 -0
- package/lib/types/src/transaction-check/data/TransactionCheckDataSource.d.ts.map +1 -0
- package/lib/types/src/transaction-check/data/TypedDataCheckDataSource.d.ts +28 -0
- package/lib/types/src/transaction-check/data/TypedDataCheckDataSource.d.ts.map +1 -0
- package/lib/types/src/transaction-check/data/dto/TransactionCheckDto.d.ts +5 -0
- package/lib/types/src/transaction-check/data/dto/TransactionCheckDto.d.ts.map +1 -0
- package/lib/types/src/transaction-check/data/dto/TypedDataCheckDto.d.ts +5 -0
- package/lib/types/src/transaction-check/data/dto/TypedDataCheckDto.d.ts.map +1 -0
- package/lib/types/src/transaction-check/di/transactionCheckModuleFactory.d.ts +3 -0
- package/lib/types/src/transaction-check/di/transactionCheckModuleFactory.d.ts.map +1 -0
- package/lib/types/src/transaction-check/di/transactionCheckTypes.d.ts +7 -0
- package/lib/types/src/transaction-check/di/transactionCheckTypes.d.ts.map +1 -0
- package/lib/types/src/transaction-check/domain/TransactionCheckContextLoader.d.ts +19 -0
- package/lib/types/src/transaction-check/domain/TransactionCheckContextLoader.d.ts.map +1 -0
- package/lib/types/src/transaction-check/domain/TransactionCheckContextLoader.test.d.ts +2 -0
- package/lib/types/src/transaction-check/domain/TransactionCheckContextLoader.test.d.ts.map +1 -0
- package/lib/types/src/transaction-check/domain/TypedDataCheckContextLoader.d.ts +18 -0
- package/lib/types/src/transaction-check/domain/TypedDataCheckContextLoader.d.ts.map +1 -0
- package/lib/types/src/transaction-check/domain/TypedDataCheckContextLoader.test.d.ts +2 -0
- package/lib/types/src/transaction-check/domain/TypedDataCheckContextLoader.test.d.ts.map +1 -0
- package/lib/types/src/uniswap/constants/uniswap.d.ts +0 -1
- package/lib/types/src/uniswap/constants/uniswap.d.ts.map +1 -1
- package/lib/types/src/uniswap/domain/UniswapContextLoader.d.ts +0 -8
- package/lib/types/src/uniswap/domain/UniswapContextLoader.d.ts.map +1 -1
- package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
- package/package.json +5 -5
- package/lib/cjs/src/uniswap/constants/plugin.js +0 -2
- package/lib/cjs/src/uniswap/constants/plugin.js.map +0 -7
- package/lib/cjs/src/web3-check/data/HttpWeb3CheckDataSource.js +0 -2
- package/lib/cjs/src/web3-check/data/HttpWeb3CheckDataSource.js.map +0 -7
- package/lib/cjs/src/web3-check/data/HttpWeb3CheckDataSource.test.js +0 -2
- package/lib/cjs/src/web3-check/data/HttpWeb3CheckDataSource.test.js.map +0 -7
- package/lib/cjs/src/web3-check/data/Web3CheckDataSource.js +0 -2
- package/lib/cjs/src/web3-check/data/Web3CheckDataSource.js.map +0 -7
- package/lib/cjs/src/web3-check/data/Web3CheckDto.js +0 -2
- package/lib/cjs/src/web3-check/data/Web3CheckDto.js.map +0 -7
- package/lib/cjs/src/web3-check/di/web3CheckModuleFactory.js +0 -2
- package/lib/cjs/src/web3-check/di/web3CheckModuleFactory.js.map +0 -7
- package/lib/cjs/src/web3-check/di/web3CheckTypes.js +0 -2
- package/lib/cjs/src/web3-check/di/web3CheckTypes.js.map +0 -7
- package/lib/cjs/src/web3-check/domain/DefaultWeb3CheckLoader.js +0 -2
- package/lib/cjs/src/web3-check/domain/DefaultWeb3CheckLoader.js.map +0 -7
- package/lib/cjs/src/web3-check/domain/DefaultWeb3CheckLoader.test.js +0 -2
- package/lib/cjs/src/web3-check/domain/DefaultWeb3CheckLoader.test.js.map +0 -7
- package/lib/cjs/src/web3-check/domain/Web3CheckContextLoader.js +0 -2
- package/lib/cjs/src/web3-check/domain/Web3CheckContextLoader.js.map +0 -7
- package/lib/cjs/src/web3-check/domain/web3CheckTypes.js +0 -2
- package/lib/cjs/src/web3-check/domain/web3CheckTypes.js.map +0 -7
- package/lib/esm/src/uniswap/constants/plugin.js +0 -2
- package/lib/esm/src/uniswap/constants/plugin.js.map +0 -7
- package/lib/esm/src/web3-check/data/HttpWeb3CheckDataSource.js +0 -2
- package/lib/esm/src/web3-check/data/HttpWeb3CheckDataSource.js.map +0 -7
- package/lib/esm/src/web3-check/data/HttpWeb3CheckDataSource.test.js +0 -2
- package/lib/esm/src/web3-check/data/HttpWeb3CheckDataSource.test.js.map +0 -7
- package/lib/esm/src/web3-check/data/Web3CheckDataSource.js +0 -1
- package/lib/esm/src/web3-check/data/Web3CheckDto.js +0 -1
- package/lib/esm/src/web3-check/di/web3CheckModuleFactory.js +0 -2
- package/lib/esm/src/web3-check/di/web3CheckModuleFactory.js.map +0 -7
- package/lib/esm/src/web3-check/di/web3CheckTypes.js +0 -2
- package/lib/esm/src/web3-check/di/web3CheckTypes.js.map +0 -7
- package/lib/esm/src/web3-check/domain/DefaultWeb3CheckLoader.js +0 -2
- package/lib/esm/src/web3-check/domain/DefaultWeb3CheckLoader.js.map +0 -7
- package/lib/esm/src/web3-check/domain/DefaultWeb3CheckLoader.test.js +0 -2
- package/lib/esm/src/web3-check/domain/DefaultWeb3CheckLoader.test.js.map +0 -7
- package/lib/esm/src/web3-check/domain/Web3CheckContextLoader.js +0 -1
- package/lib/esm/src/web3-check/domain/web3CheckTypes.js +0 -1
- package/lib/types/src/uniswap/constants/plugin.d.ts +0 -3
- package/lib/types/src/uniswap/constants/plugin.d.ts.map +0 -1
- package/lib/types/src/web3-check/data/HttpWeb3CheckDataSource.d.ts +0 -14
- package/lib/types/src/web3-check/data/HttpWeb3CheckDataSource.d.ts.map +0 -1
- package/lib/types/src/web3-check/data/HttpWeb3CheckDataSource.test.d.ts +0 -2
- package/lib/types/src/web3-check/data/HttpWeb3CheckDataSource.test.d.ts.map +0 -1
- package/lib/types/src/web3-check/data/Web3CheckDataSource.d.ts +0 -6
- package/lib/types/src/web3-check/data/Web3CheckDataSource.d.ts.map +0 -1
- package/lib/types/src/web3-check/data/Web3CheckDto.d.ts +0 -20
- package/lib/types/src/web3-check/data/Web3CheckDto.d.ts.map +0 -1
- package/lib/types/src/web3-check/di/web3CheckModuleFactory.d.ts +0 -3
- package/lib/types/src/web3-check/di/web3CheckModuleFactory.d.ts.map +0 -1
- package/lib/types/src/web3-check/di/web3CheckTypes.d.ts +0 -5
- package/lib/types/src/web3-check/di/web3CheckTypes.d.ts.map +0 -1
- package/lib/types/src/web3-check/domain/DefaultWeb3CheckLoader.d.ts +0 -10
- package/lib/types/src/web3-check/domain/DefaultWeb3CheckLoader.d.ts.map +0 -1
- package/lib/types/src/web3-check/domain/DefaultWeb3CheckLoader.test.d.ts +0 -2
- package/lib/types/src/web3-check/domain/DefaultWeb3CheckLoader.test.d.ts.map +0 -1
- package/lib/types/src/web3-check/domain/Web3CheckContextLoader.d.ts +0 -6
- package/lib/types/src/web3-check/domain/Web3CheckContextLoader.d.ts.map +0 -1
- package/lib/types/src/web3-check/domain/web3CheckTypes.d.ts +0 -35
- package/lib/types/src/web3-check/domain/web3CheckTypes.d.ts.map +0 -1
- /package/lib/esm/src/{web3-check/data/Web3CheckDataSource.js.map → safe/data/SafeAccountDataSource.js.map} +0 -0
- /package/lib/esm/src/{web3-check/data/Web3CheckDto.js.map → safe/data/dto/SafeAccountDto.js.map} +0 -0
- /package/lib/esm/src/{web3-check/domain/Web3CheckContextLoader.js.map → transaction-check/data/TransactionCheckDataSource.js.map} +0 -0
- /package/lib/esm/src/{web3-check/domain/web3CheckTypes.js.map → transaction-check/data/TypedDataCheckDataSource.js.map} +0 -0
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import t from"axios";import{Left as s,Right as i}from"purify-ts";import{LEDGER_CLIENT_VERSION_HEADER as p,LEDGER_ORIGIN_TOKEN_HEADER as u}from"../../shared/constant/HttpHeaders";import{HttpTypedDataCheckDataSource as d}from"../../transaction-check/data/HttpTypedDataCheckDataSource";import l from"../../../package.json";vi.mock("axios");describe("HttpTypedDataCheckDataSource",()=>{const a={web3checks:{url:"web3checksUrl"},originToken:"originToken"};beforeEach(()=>{vi.resetAllMocks()}),describe("getTypedDataCheck",()=>{const r={from:"0x1234567890123456789012345678901234567890",data:{domain:{name:"Test Domain",version:"1",chainId:1,verifyingContract:"0x1234567890123456789012345678901234567890"},types:{EIP712Domain:[{name:"name",type:"string"},{name:"version",type:"string"},{name:"chainId",type:"uint256"},{name:"verifyingContract",type:"address"}],Person:[{name:"name",type:"string"},{name:"wallet",type:"address"}]},primaryType:"Person",message:{name:"Alice",wallet:"0x1234567890123456789012345678901234567890"}}};it("should return an object if the request is successful",async()=>{const e={public_key_id:"test-key-id",descriptor:"test-descriptor"};vi.spyOn(t,"request").mockResolvedValueOnce({data:e});const o=await new d(a).getTypedDataCheck(r);expect(o).toEqual(i({publicKeyId:"test-key-id",descriptor:"test-descriptor"}))}),it("should return an error if the request fails",async()=>{vi.spyOn(t,"request").mockRejectedValue(new Error("error"));const c=await new d(a).getTypedDataCheck(r);expect(c).toEqual(s(new Error("[ContextModule] HttpTypedDataCheckDataSource: Failed to fetch typed data check information")))}),it("should return an error if the response is invalid",async()=>{const e={};vi.spyOn(t,"request").mockResolvedValue({data:e});const o=await new d(a).getTypedDataCheck(r);expect(o).toEqual(s(new Error("[ContextModule] HttpTypedDataCheckDataSource: Cannot exploit typed data check data received")))}),it("should return an error if public_key_id is missing",async()=>{const e={descriptor:"test-descriptor"};vi.spyOn(t,"request").mockResolvedValue({data:e});const o=await new d(a).getTypedDataCheck(r);expect(o).toEqual(s(new Error("[ContextModule] HttpTypedDataCheckDataSource: Cannot exploit typed data check data received")))}),it("should return an error if descriptor is missing",async()=>{const e={public_key_id:"test-key-id"};vi.spyOn(t,"request").mockResolvedValue({data:e});const o=await new d(a).getTypedDataCheck(r);expect(o).toEqual(s(new Error("[ContextModule] HttpTypedDataCheckDataSource: Cannot exploit typed data check data received")))}),it("should return an error if public_key_id is null",async()=>{const e={public_key_id:null,descriptor:"test-descriptor"};vi.spyOn(t,"request").mockResolvedValue({data:e});const o=await new d(a).getTypedDataCheck(r);expect(o).toEqual(s(new Error("[ContextModule] HttpTypedDataCheckDataSource: Cannot exploit typed data check data received")))}),it("should return an error if descriptor is null",async()=>{const e={public_key_id:"test-key-id",descriptor:null};vi.spyOn(t,"request").mockResolvedValue({data:e});const o=await new d(a).getTypedDataCheck(r);expect(o).toEqual(s(new Error("[ContextModule] HttpTypedDataCheckDataSource: Cannot exploit typed data check data received")))}),it("should call axios with the correct headers",async()=>{const e={public_key_id:"test-key-id",descriptor:"test-descriptor"};vi.spyOn(t,"request").mockResolvedValueOnce({data:e}),await new d(a).getTypedDataCheck(r),expect(t.request).toHaveBeenCalledWith(expect.objectContaining({headers:{[p]:`context-module/${l.version}`,[u]:a.originToken}}))}),it("should call axios with the correct URL and method",async()=>{const e={public_key_id:"test-key-id",descriptor:"test-descriptor"};vi.spyOn(t,"request").mockResolvedValueOnce({data:e}),await new d(a).getTypedDataCheck(r),expect(t.request).toHaveBeenCalledWith(expect.objectContaining({method:"POST",url:`${a.web3checks.url}/ethereum/scan/eip-712`}))}),it("should call axios with the correct request data",async()=>{const e={public_key_id:"test-key-id",descriptor:"test-descriptor"};vi.spyOn(t,"request").mockResolvedValueOnce({data:e}),await new d(a).getTypedDataCheck(r),expect(t.request).toHaveBeenCalledWith(expect.objectContaining({data:{msg:{from:r.from,data:r.data}}}))}),it("should handle empty typed data",async()=>{const c={from:"0x1234567890123456789012345678901234567890",data:{domain:{},types:{},primaryType:"",message:{}}},o={public_key_id:"test-key-id",descriptor:"test-descriptor"};vi.spyOn(t,"request").mockResolvedValueOnce({data:o});const n=await new d(a).getTypedDataCheck(c);expect(n).toEqual(i({publicKeyId:"test-key-id",descriptor:"test-descriptor"}))})})});
|
|
2
|
+
//# sourceMappingURL=HttpTypedDataCheckDataSource.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/transaction-check/data/HttpTypedDataCheckDataSource.test.ts"],
|
|
4
|
+
"sourcesContent": ["import axios from \"axios\";\nimport { Left, Right } from \"purify-ts\";\n\nimport { type ContextModuleConfig } from \"@/config/model/ContextModuleConfig\";\nimport {\n LEDGER_CLIENT_VERSION_HEADER,\n LEDGER_ORIGIN_TOKEN_HEADER,\n} from \"@/shared/constant/HttpHeaders\";\nimport { type TypedDataCheckDto } from \"@/transaction-check/data/dto/TypedDataCheckDto\";\nimport { HttpTypedDataCheckDataSource } from \"@/transaction-check/data/HttpTypedDataCheckDataSource\";\nimport {\n type GetTypedDataCheckParams,\n type TypedData,\n} from \"@/transaction-check/data/TypedDataCheckDataSource\";\nimport PACKAGE from \"@root/package.json\";\n\nvi.mock(\"axios\");\n\ndescribe(\"HttpTypedDataCheckDataSource\", () => {\n const config = {\n web3checks: {\n url: \"web3checksUrl\",\n },\n originToken: \"originToken\",\n } as ContextModuleConfig;\n\n beforeEach(() => {\n vi.resetAllMocks();\n });\n\n describe(\"getTypedDataCheck\", () => {\n const validTypedData: TypedData = {\n domain: {\n name: \"Test Domain\",\n version: \"1\",\n chainId: 1,\n verifyingContract: \"0x1234567890123456789012345678901234567890\",\n },\n types: {\n EIP712Domain: [\n { name: \"name\", type: \"string\" },\n { name: \"version\", type: \"string\" },\n { name: \"chainId\", type: \"uint256\" },\n { name: \"verifyingContract\", type: \"address\" },\n ],\n Person: [\n { name: \"name\", type: \"string\" },\n { name: \"wallet\", type: \"address\" },\n ],\n },\n primaryType: \"Person\",\n message: {\n name: \"Alice\",\n wallet: \"0x1234567890123456789012345678901234567890\",\n },\n };\n\n const params: GetTypedDataCheckParams = {\n from: \"0x1234567890123456789012345678901234567890\",\n data: validTypedData,\n };\n\n it(\"should return an object if the request is successful\", async () => {\n // GIVEN\n const dto: TypedDataCheckDto = {\n public_key_id: \"test-key-id\",\n descriptor: \"test-descriptor\",\n };\n vi.spyOn(axios, \"request\").mockResolvedValueOnce({ data: dto });\n\n // WHEN\n const dataSource = new HttpTypedDataCheckDataSource(config);\n const result = await dataSource.getTypedDataCheck(params);\n\n // THEN\n expect(result).toEqual(\n Right({\n publicKeyId: \"test-key-id\",\n descriptor: \"test-descriptor\",\n }),\n );\n });\n\n it(\"should return an error if the request fails\", async () => {\n // GIVEN\n vi.spyOn(axios, \"request\").mockRejectedValue(new Error(\"error\"));\n\n // WHEN\n const dataSource = new HttpTypedDataCheckDataSource(config);\n const result = await dataSource.getTypedDataCheck(params);\n\n // THEN\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] HttpTypedDataCheckDataSource: Failed to fetch typed data check information\",\n ),\n ),\n );\n });\n\n it(\"should return an error if the response is invalid\", async () => {\n // GIVEN\n const dto = {};\n vi.spyOn(axios, \"request\").mockResolvedValue({ data: dto });\n\n // WHEN\n const dataSource = new HttpTypedDataCheckDataSource(config);\n const result = await dataSource.getTypedDataCheck(params);\n\n // THEN\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] HttpTypedDataCheckDataSource: Cannot exploit typed data check data received\",\n ),\n ),\n );\n });\n\n it(\"should return an error if public_key_id is missing\", async () => {\n // GIVEN\n const dto = {\n descriptor: \"test-descriptor\",\n };\n vi.spyOn(axios, \"request\").mockResolvedValue({ data: dto });\n\n // WHEN\n const dataSource = new HttpTypedDataCheckDataSource(config);\n const result = await dataSource.getTypedDataCheck(params);\n\n // THEN\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] HttpTypedDataCheckDataSource: Cannot exploit typed data check data received\",\n ),\n ),\n );\n });\n\n it(\"should return an error if descriptor is missing\", async () => {\n // GIVEN\n const dto = {\n public_key_id: \"test-key-id\",\n };\n vi.spyOn(axios, \"request\").mockResolvedValue({ data: dto });\n\n // WHEN\n const dataSource = new HttpTypedDataCheckDataSource(config);\n const result = await dataSource.getTypedDataCheck(params);\n\n // THEN\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] HttpTypedDataCheckDataSource: Cannot exploit typed data check data received\",\n ),\n ),\n );\n });\n\n it(\"should return an error if public_key_id is null\", async () => {\n // GIVEN\n const dto = {\n public_key_id: null,\n descriptor: \"test-descriptor\",\n };\n vi.spyOn(axios, \"request\").mockResolvedValue({ data: dto });\n\n // WHEN\n const dataSource = new HttpTypedDataCheckDataSource(config);\n const result = await dataSource.getTypedDataCheck(params);\n\n // THEN\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] HttpTypedDataCheckDataSource: Cannot exploit typed data check data received\",\n ),\n ),\n );\n });\n\n it(\"should return an error if descriptor is null\", async () => {\n // GIVEN\n const dto = {\n public_key_id: \"test-key-id\",\n descriptor: null,\n };\n vi.spyOn(axios, \"request\").mockResolvedValue({ data: dto });\n\n // WHEN\n const dataSource = new HttpTypedDataCheckDataSource(config);\n const result = await dataSource.getTypedDataCheck(params);\n\n // THEN\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] HttpTypedDataCheckDataSource: Cannot exploit typed data check data received\",\n ),\n ),\n );\n });\n\n it(\"should call axios with the correct headers\", async () => {\n // GIVEN\n const dto: TypedDataCheckDto = {\n public_key_id: \"test-key-id\",\n descriptor: \"test-descriptor\",\n };\n vi.spyOn(axios, \"request\").mockResolvedValueOnce({ data: dto });\n\n // WHEN\n const dataSource = new HttpTypedDataCheckDataSource(config);\n await dataSource.getTypedDataCheck(params);\n\n // THEN\n expect(axios.request).toHaveBeenCalledWith(\n expect.objectContaining({\n headers: {\n [LEDGER_CLIENT_VERSION_HEADER]: `context-module/${PACKAGE.version}`,\n [LEDGER_ORIGIN_TOKEN_HEADER]: config.originToken,\n },\n }),\n );\n });\n\n it(\"should call axios with the correct URL and method\", async () => {\n // GIVEN\n const dto: TypedDataCheckDto = {\n public_key_id: \"test-key-id\",\n descriptor: \"test-descriptor\",\n };\n vi.spyOn(axios, \"request\").mockResolvedValueOnce({ data: dto });\n\n // WHEN\n const dataSource = new HttpTypedDataCheckDataSource(config);\n await dataSource.getTypedDataCheck(params);\n\n // THEN\n expect(axios.request).toHaveBeenCalledWith(\n expect.objectContaining({\n method: \"POST\",\n url: `${config.web3checks.url}/ethereum/scan/eip-712`,\n }),\n );\n });\n\n it(\"should call axios with the correct request data\", async () => {\n // GIVEN\n const dto: TypedDataCheckDto = {\n public_key_id: \"test-key-id\",\n descriptor: \"test-descriptor\",\n };\n vi.spyOn(axios, \"request\").mockResolvedValueOnce({ data: dto });\n\n // WHEN\n const dataSource = new HttpTypedDataCheckDataSource(config);\n await dataSource.getTypedDataCheck(params);\n\n // THEN\n expect(axios.request).toHaveBeenCalledWith(\n expect.objectContaining({\n data: {\n msg: {\n from: params.from,\n data: params.data,\n },\n },\n }),\n );\n });\n\n it(\"should handle empty typed data\", async () => {\n // GIVEN\n const emptyTypedData: TypedData = {\n domain: {},\n types: {},\n primaryType: \"\",\n message: {},\n };\n const paramsWithEmptyData: GetTypedDataCheckParams = {\n from: \"0x1234567890123456789012345678901234567890\",\n data: emptyTypedData,\n };\n const dto: TypedDataCheckDto = {\n public_key_id: \"test-key-id\",\n descriptor: \"test-descriptor\",\n };\n vi.spyOn(axios, \"request\").mockResolvedValueOnce({ data: dto });\n\n // WHEN\n const dataSource = new HttpTypedDataCheckDataSource(config);\n const result = await dataSource.getTypedDataCheck(paramsWithEmptyData);\n\n // THEN\n expect(result).toEqual(\n Right({\n publicKeyId: \"test-key-id\",\n descriptor: \"test-descriptor\",\n }),\n );\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["axios", "Left", "Right", "LEDGER_CLIENT_VERSION_HEADER", "LEDGER_ORIGIN_TOKEN_HEADER", "HttpTypedDataCheckDataSource", "PACKAGE", "config", "params", "dto", "result", "paramsWithEmptyData"]
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=TransactionCheckDataSource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=TypedDataCheckDataSource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=TransactionCheckDto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=TypedDataCheckDto.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{ContainerModule as a}from"inversify";import{HttpTransactionCheckDataSource as e}from"../../transaction-check/data/HttpTransactionCheckDataSource";import{HttpTypedDataCheckDataSource as r}from"../../transaction-check/data/HttpTypedDataCheckDataSource";import{transactionCheckTypes as o}from"../../transaction-check/di/transactionCheckTypes";import{TransactionCheckContextLoader as c}from"../../transaction-check/domain/TransactionCheckContextLoader";import{TypedDataCheckContextLoader as n}from"../../transaction-check/domain/TypedDataCheckContextLoader";const T=()=>new a(({bind:t})=>{t(o.TransactionCheckDataSource).to(e),t(o.TransactionCheckContextLoader).to(c),t(o.TypedDataCheckDataSource).to(r),t(o.TypedDataCheckContextLoader).to(n)});export{T as transactionCheckModuleFactory};
|
|
2
|
+
//# sourceMappingURL=transactionCheckModuleFactory.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/transaction-check/di/transactionCheckModuleFactory.ts"],
|
|
4
|
+
"sourcesContent": ["import { ContainerModule } from \"inversify\";\n\nimport { HttpTransactionCheckDataSource } from \"@/transaction-check/data/HttpTransactionCheckDataSource\";\nimport { HttpTypedDataCheckDataSource } from \"@/transaction-check/data/HttpTypedDataCheckDataSource\";\nimport { transactionCheckTypes } from \"@/transaction-check/di/transactionCheckTypes\";\nimport { TransactionCheckContextLoader } from \"@/transaction-check/domain/TransactionCheckContextLoader\";\nimport { TypedDataCheckContextLoader } from \"@/transaction-check/domain/TypedDataCheckContextLoader\";\n\nexport const transactionCheckModuleFactory = () =>\n new ContainerModule(({ bind }) => {\n bind(transactionCheckTypes.TransactionCheckDataSource).to(\n HttpTransactionCheckDataSource,\n );\n bind(transactionCheckTypes.TransactionCheckContextLoader).to(\n TransactionCheckContextLoader,\n );\n bind(transactionCheckTypes.TypedDataCheckDataSource).to(\n HttpTypedDataCheckDataSource,\n );\n bind(transactionCheckTypes.TypedDataCheckContextLoader).to(\n TypedDataCheckContextLoader,\n );\n });\n"],
|
|
5
|
+
"mappings": "AAAA,OAAS,mBAAAA,MAAuB,YAEhC,OAAS,kCAAAC,MAAsC,0DAC/C,OAAS,gCAAAC,MAAoC,wDAC7C,OAAS,yBAAAC,MAA6B,+CACtC,OAAS,iCAAAC,MAAqC,2DAC9C,OAAS,+BAAAC,MAAmC,yDAErC,MAAMC,EAAgC,IAC3C,IAAIN,EAAgB,CAAC,CAAE,KAAAO,CAAK,IAAM,CAChCA,EAAKJ,EAAsB,0BAA0B,EAAE,GACrDF,CACF,EACAM,EAAKJ,EAAsB,6BAA6B,EAAE,GACxDC,CACF,EACAG,EAAKJ,EAAsB,wBAAwB,EAAE,GACnDD,CACF,EACAK,EAAKJ,EAAsB,2BAA2B,EAAE,GACtDE,CACF,CACF,CAAC",
|
|
6
|
+
"names": ["ContainerModule", "HttpTransactionCheckDataSource", "HttpTypedDataCheckDataSource", "transactionCheckTypes", "TransactionCheckContextLoader", "TypedDataCheckContextLoader", "transactionCheckModuleFactory", "bind"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const a={TransactionCheckDataSource:Symbol.for("TransactionCheckDataSource"),TransactionCheckContextLoader:Symbol.for("TransactionCheckContextLoader"),TypedDataCheckDataSource:Symbol.for("TypedDataCheckDataSource"),TypedDataCheckContextLoader:Symbol.for("TypedDataCheckContextLoader")};export{a as transactionCheckTypes};
|
|
2
|
+
//# sourceMappingURL=transactionCheckTypes.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/transaction-check/di/transactionCheckTypes.ts"],
|
|
4
|
+
"sourcesContent": ["export const transactionCheckTypes = {\n TransactionCheckDataSource: Symbol.for(\"TransactionCheckDataSource\"),\n TransactionCheckContextLoader: Symbol.for(\"TransactionCheckContextLoader\"),\n TypedDataCheckDataSource: Symbol.for(\"TypedDataCheckDataSource\"),\n TypedDataCheckContextLoader: Symbol.for(\"TypedDataCheckContextLoader\"),\n};\n"],
|
|
5
|
+
"mappings": "AAAO,MAAMA,EAAwB,CACnC,2BAA4B,OAAO,IAAI,4BAA4B,EACnE,8BAA+B,OAAO,IAAI,+BAA+B,EACzE,yBAA0B,OAAO,IAAI,0BAA0B,EAC/D,4BAA6B,OAAO,IAAI,6BAA6B,CACvE",
|
|
6
|
+
"names": ["transactionCheckTypes"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var p=Object.defineProperty;var I=Object.getOwnPropertyDescriptor;var C=(n,e,t,o)=>{for(var r=o>1?void 0:o?I(e,t):e,a=n.length-1,i;a>=0;a--)(i=n[a])&&(r=(o?i(e,t,r):i(r))||r);return o&&r&&p(e,t,r),r},s=(n,e)=>(t,o)=>e(t,o,n);import{bufferToHexaString as S,DeviceModelId as h,isHexaString as m}from"@ledgerhq/device-management-kit";import{inject as l,injectable as x}from"inversify";import{pkiTypes as T}from"../../pki/di/pkiTypes";import{KeyUsage as k}from"../../pki/model/KeyUsage";import{ClearSignContextType as f}from"../../shared/model/ClearSignContext";import{transactionCheckTypes as g}from"../../transaction-check/di/transactionCheckTypes";const u=[f.TRANSACTION_CHECK];let d=class{constructor(e,t){this.transactionCheckDataSource=e;this.certificateLoader=t}canHandle(e,t){return typeof e=="object"&&e!==null&&"from"in e&&e.from!==void 0&&m(e.from)&&"chainId"in e&&e.chainId!==void 0&&typeof e.chainId=="number"&&"transaction"in e&&e.transaction!==void 0&&"deviceModelId"in e&&e.deviceModelId!==void 0&&e.deviceModelId!==h.NANO_S&&typeof e.chainId=="number"&&m(e.from)&&e.from!=="0x"&&u.every(r=>t.includes(r))}async load(e){const{from:t,chainId:o,transaction:r}=e,a=S(r);return!t||!a?[]:[await(await this.transactionCheckDataSource.getTransactionCheck({chainId:o,rawTx:a,from:t})).caseOf({Left:c=>Promise.resolve({type:f.ERROR,error:c}),Right:async c=>{const y=await this.certificateLoader.loadCertificate({keyId:c.publicKeyId,keyUsage:k.TxSimulationSigner,targetDevice:e.deviceModelId});return{type:f.TRANSACTION_CHECK,payload:c.descriptor,certificate:y}}})]}};d=C([x(),s(0,l(g.TransactionCheckDataSource)),s(1,l(T.PkiCertificateLoader))],d);export{d as TransactionCheckContextLoader};
|
|
2
|
+
//# sourceMappingURL=TransactionCheckContextLoader.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/transaction-check/domain/TransactionCheckContextLoader.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n bufferToHexaString,\n DeviceModelId,\n isHexaString,\n} from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\n\nimport { pkiTypes } from \"@/pki/di/pkiTypes\";\nimport { type PkiCertificateLoader } from \"@/pki/domain/PkiCertificateLoader\";\nimport { KeyUsage } from \"@/pki/model/KeyUsage\";\nimport { ContextLoader } from \"@/shared/domain/ContextLoader\";\nimport {\n ClearSignContext,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\nimport { type TransactionCheckDataSource } from \"@/transaction-check/data/TransactionCheckDataSource\";\nimport { transactionCheckTypes } from \"@/transaction-check/di/transactionCheckTypes\";\n\nexport type TransactionCheckContextInput = {\n from: string;\n chainId: number;\n transaction: Uint8Array;\n deviceModelId: DeviceModelId;\n};\n\nconst SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.TRANSACTION_CHECK,\n];\n\n@injectable()\nexport class TransactionCheckContextLoader\n implements ContextLoader<TransactionCheckContextInput>\n{\n constructor(\n @inject(transactionCheckTypes.TransactionCheckDataSource)\n private transactionCheckDataSource: TransactionCheckDataSource,\n @inject(pkiTypes.PkiCertificateLoader)\n private certificateLoader: PkiCertificateLoader,\n ) {}\n\n canHandle(\n input: unknown,\n expectedType: ClearSignContextType[],\n ): input is TransactionCheckContextInput {\n const result =\n typeof input === \"object\" &&\n input !== null &&\n \"from\" in input &&\n input.from !== undefined &&\n isHexaString(input.from) &&\n \"chainId\" in input &&\n input.chainId !== undefined &&\n typeof input.chainId === \"number\" &&\n \"transaction\" in input &&\n input.transaction !== undefined &&\n \"deviceModelId\" in input &&\n input.deviceModelId !== undefined &&\n input.deviceModelId !== DeviceModelId.NANO_S &&\n typeof input.chainId === \"number\" &&\n isHexaString(input.from) &&\n input.from !== \"0x\" &&\n SUPPORTED_TYPES.every((type) => expectedType.includes(type));\n return result;\n }\n\n async load(ctx: TransactionCheckContextInput): Promise<ClearSignContext[]> {\n const { from, chainId, transaction } = ctx;\n\n const rawTx = bufferToHexaString(transaction);\n\n if (!from || !rawTx) {\n return [];\n }\n\n const txCheck = await this.transactionCheckDataSource.getTransactionCheck({\n chainId,\n rawTx,\n from,\n });\n\n const context = await txCheck.caseOf<Promise<ClearSignContext>>({\n Left: (error) =>\n Promise.resolve({\n type: ClearSignContextType.ERROR,\n error,\n }),\n Right: async (data) => {\n const certificate = await this.certificateLoader.loadCertificate({\n keyId: data.publicKeyId,\n keyUsage: KeyUsage.TxSimulationSigner,\n targetDevice: ctx.deviceModelId,\n });\n\n return {\n type: ClearSignContextType.TRANSACTION_CHECK,\n payload: data.descriptor,\n certificate,\n };\n },\n });\n\n return [context];\n }\n}\n"],
|
|
5
|
+
"mappings": "iOAAA,OACE,sBAAAA,EACA,iBAAAC,EACA,gBAAAC,MACK,kCACP,OAAS,UAAAC,EAAQ,cAAAC,MAAkB,YAEnC,OAAS,YAAAC,MAAgB,oBAEzB,OAAS,YAAAC,MAAgB,uBAEzB,OAEE,wBAAAC,MACK,kCAEP,OAAS,yBAAAC,MAA6B,+CAStC,MAAMC,EAA0C,CAC9CC,EAAqB,iBACvB,EAGO,IAAMC,EAAN,KAEP,CACE,YAEUC,EAEAC,EACR,CAHQ,gCAAAD,EAEA,uBAAAC,CACP,CAEH,UACEC,EACAC,EACuC,CAmBvC,OAjBE,OAAOD,GAAU,UACjBA,IAAU,MACV,SAAUA,GACVA,EAAM,OAAS,QACfE,EAAaF,EAAM,IAAI,GACvB,YAAaA,GACbA,EAAM,UAAY,QAClB,OAAOA,EAAM,SAAY,UACzB,gBAAiBA,GACjBA,EAAM,cAAgB,QACtB,kBAAmBA,GACnBA,EAAM,gBAAkB,QACxBA,EAAM,gBAAkBG,EAAc,QACtC,OAAOH,EAAM,SAAY,UACzBE,EAAaF,EAAM,IAAI,GACvBA,EAAM,OAAS,MACfL,EAAgB,MAAOS,GAASH,EAAa,SAASG,CAAI,CAAC,CAE/D,CAEA,MAAM,KAAKC,EAAgE,CACzE,KAAM,CAAE,KAAAC,EAAM,QAAAC,EAAS,YAAAC,CAAY,EAAIH,EAEjCI,EAAQC,EAAmBF,CAAW,EAE5C,MAAI,CAACF,GAAQ,CAACG,EACL,CAAC,EA8BH,CArBS,MANA,MAAM,KAAK,2BAA2B,oBAAoB,CACxE,QAAAF,EACA,MAAAE,EACA,KAAAH,CACF,CAAC,GAE6B,OAAkC,CAC9D,KAAOK,GACL,QAAQ,QAAQ,CACd,KAAMf,EAAqB,MAC3B,MAAAe,CACF,CAAC,EACH,MAAO,MAAOC,GAAS,CACrB,MAAMC,EAAc,MAAM,KAAK,kBAAkB,gBAAgB,CAC/D,MAAOD,EAAK,YACZ,SAAUE,EAAS,mBACnB,aAAcT,EAAI,aACpB,CAAC,EAED,MAAO,CACL,KAAMT,EAAqB,kBAC3B,QAASgB,EAAK,WACd,YAAAC,CACF,CACF,CACF,CAAC,CAEc,CACjB,CACF,EAzEahB,EAANkB,EAAA,CADNC,EAAW,EAKPC,EAAA,EAAAC,EAAOC,EAAsB,0BAA0B,GAEvDF,EAAA,EAAAC,EAAOE,EAAS,oBAAoB,IAN5BvB",
|
|
6
|
+
"names": ["bufferToHexaString", "DeviceModelId", "isHexaString", "inject", "injectable", "pkiTypes", "KeyUsage", "ClearSignContextType", "transactionCheckTypes", "SUPPORTED_TYPES", "ClearSignContextType", "TransactionCheckContextLoader", "transactionCheckDataSource", "certificateLoader", "input", "expectedType", "isHexaString", "DeviceModelId", "type", "ctx", "from", "chainId", "transaction", "rawTx", "bufferToHexaString", "error", "data", "certificate", "KeyUsage", "__decorateClass", "injectable", "__decorateParam", "inject", "transactionCheckTypes", "pkiTypes"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{DeviceModelId as d}from"@ledgerhq/device-management-kit";import{Left as u,Right as l}from"purify-ts";import{KeyUsage as f}from"../../pki/model/KeyUsage";import{ClearSignContextType as s}from"../../shared/model/ClearSignContext";import{TransactionCheckContextLoader as p}from"../../transaction-check/domain/TransactionCheckContextLoader";describe("TransactionCheckContextLoader",()=>{const i={getTransactionCheck:vi.fn()},c={loadCertificate:vi.fn()},a=new p(i,c),r=[s.TRANSACTION_CHECK];beforeEach(()=>{vi.resetAllMocks()}),describe("canHandle function",()=>{const e={from:"0x1234567890123456789012345678901234567890",chainId:1,transaction:new Uint8Array([1,2,3]),deviceModelId:d.FLEX};it("should return true for valid input",()=>{expect(a.canHandle(e,r)).toBe(!0)}),it("should return false for invalid expected type",()=>{expect(a.canHandle(e,[s.TOKEN])).toBe(!1)}),it.each([[null,"null input"],[void 0,"undefined input"],[{},"empty object"],["string","string input"],[123,"number input"]])("should return false for %s",(n,t)=>{expect(a.canHandle(n,r)).toBe(!1)}),it.each([[{...e,from:void 0},"missing from"],[{...e,chainId:void 0},"missing chainId"],[{...e,transaction:void 0},"missing transaction"],[{...e,deviceModelId:void 0},"missing deviceModelId"]])("should return false for %s",(n,t)=>{expect(a.canHandle(n,r)).toBe(!1)}),it.each([[{...e,from:"invalid-hex"},"invalid from hex"],[{...e,from:"0x"},"empty from hex"],[{...e,from:"not-hex"},"non-hex from"]])("should return false for %s",(n,t)=>{expect(a.canHandle(n,r)).toBe(!1)}),it("should return false for NANO_S device model",()=>{const n={...e,deviceModelId:d.NANO_S};expect(a.canHandle(n,r)).toBe(!1)}),it("should return false for non-number chainId",()=>{const n={...e,chainId:"not-a-number"};expect(a.canHandle(n,r)).toBe(!1)})}),describe("load function",()=>{const e={from:"0x1234567890123456789012345678901234567890",chainId:1,transaction:new Uint8Array([1,2,3]),deviceModelId:d.FLEX},n={descriptor:"cert-descriptor",signature:"cert-signature",keyUsageNumber:0,payload:new Uint8Array};it("should return empty array when from is empty",async()=>{const t={...e,from:""},o=await a.load(t);expect(o).toEqual([])}),it("should return error context when transaction check fails",async()=>{const t=new Error("Transaction check failed");vi.spyOn(i,"getTransactionCheck").mockResolvedValue(u(t));const o=await a.load(e);expect(o).toEqual([{type:s.ERROR,error:t}])}),it("should return transaction check context when successful",async()=>{const t={publicKeyId:"test-key-id",descriptor:"test-descriptor"};vi.spyOn(i,"getTransactionCheck").mockResolvedValue(l(t)),vi.spyOn(c,"loadCertificate").mockResolvedValue(n);const o=await a.load(e);expect(i.getTransactionCheck).toHaveBeenCalledWith({chainId:e.chainId,rawTx:"0x010203",from:e.from}),expect(c.loadCertificate).toHaveBeenCalledWith({keyId:t.publicKeyId,keyUsage:f.TxSimulationSigner,targetDevice:e.deviceModelId}),expect(o).toEqual([{type:s.TRANSACTION_CHECK,payload:t.descriptor,certificate:n}])}),it("should handle certificate loading failure",async()=>{const t={publicKeyId:"test-key-id",descriptor:"test-descriptor"},o=new Error("Certificate loading failed");vi.spyOn(i,"getTransactionCheck").mockResolvedValue(l(t)),vi.spyOn(c,"loadCertificate").mockRejectedValue(o),await expect(a.load(e)).rejects.toThrow(o)}),it("should convert transaction buffer to hex string correctly",async()=>{const t={publicKeyId:"test-key-id",descriptor:"test-descriptor"};vi.spyOn(i,"getTransactionCheck").mockResolvedValue(l(t)),vi.spyOn(c,"loadCertificate").mockResolvedValue(n),await a.load(e),expect(i.getTransactionCheck).toHaveBeenCalledWith({chainId:e.chainId,rawTx:"0x010203",from:e.from})})})});
|
|
2
|
+
//# sourceMappingURL=TransactionCheckContextLoader.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/transaction-check/domain/TransactionCheckContextLoader.test.ts"],
|
|
4
|
+
"sourcesContent": ["import { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\n\nimport type { PkiCertificateLoader } from \"@/pki/domain/PkiCertificateLoader\";\nimport { KeyUsage } from \"@/pki/model/KeyUsage\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\nimport { type TransactionCheckDataSource } from \"@/transaction-check/data/TransactionCheckDataSource\";\nimport {\n type TransactionCheckContextInput,\n TransactionCheckContextLoader,\n} from \"@/transaction-check/domain/TransactionCheckContextLoader\";\n\ndescribe(\"TransactionCheckContextLoader\", () => {\n const mockTransactionCheckDataSource: TransactionCheckDataSource = {\n getTransactionCheck: vi.fn(),\n };\n const mockCertificateLoader: PkiCertificateLoader = {\n loadCertificate: vi.fn(),\n };\n const loader = new TransactionCheckContextLoader(\n mockTransactionCheckDataSource,\n mockCertificateLoader,\n );\n\n const SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.TRANSACTION_CHECK,\n ];\n\n beforeEach(() => {\n vi.resetAllMocks();\n });\n\n describe(\"canHandle function\", () => {\n const validInput: TransactionCheckContextInput = {\n from: \"0x1234567890123456789012345678901234567890\",\n chainId: 1,\n transaction: new Uint8Array([1, 2, 3]),\n deviceModelId: DeviceModelId.FLEX,\n };\n\n it(\"should return true for valid input\", () => {\n expect(loader.canHandle(validInput, SUPPORTED_TYPES)).toBe(true);\n });\n\n it(\"should return false for invalid expected type\", () => {\n expect(loader.canHandle(validInput, [ClearSignContextType.TOKEN])).toBe(\n false,\n );\n });\n\n it.each([\n [null, \"null input\"],\n [undefined, \"undefined input\"],\n [{}, \"empty object\"],\n [\"string\", \"string input\"],\n [123, \"number input\"],\n ])(\"should return false for %s\", (input, _description) => {\n expect(loader.canHandle(input, SUPPORTED_TYPES)).toBe(false);\n });\n\n it.each([\n [{ ...validInput, from: undefined }, \"missing from\"],\n [{ ...validInput, chainId: undefined }, \"missing chainId\"],\n [{ ...validInput, transaction: undefined }, \"missing transaction\"],\n [{ ...validInput, deviceModelId: undefined }, \"missing deviceModelId\"],\n ])(\"should return false for %s\", (input, _description) => {\n expect(loader.canHandle(input, SUPPORTED_TYPES)).toBe(false);\n });\n\n it.each([\n [{ ...validInput, from: \"invalid-hex\" }, \"invalid from hex\"],\n [{ ...validInput, from: \"0x\" }, \"empty from hex\"],\n [{ ...validInput, from: \"not-hex\" }, \"non-hex from\"],\n ])(\"should return false for %s\", (input, _description) => {\n expect(loader.canHandle(input, SUPPORTED_TYPES)).toBe(false);\n });\n\n it(\"should return false for NANO_S device model\", () => {\n const inputWithNanoS = {\n ...validInput,\n deviceModelId: DeviceModelId.NANO_S,\n };\n expect(loader.canHandle(inputWithNanoS, SUPPORTED_TYPES)).toBe(false);\n });\n\n it(\"should return false for non-number chainId\", () => {\n const inputWithInvalidChainId = {\n ...validInput,\n chainId: \"not-a-number\" as unknown as number,\n };\n expect(loader.canHandle(inputWithInvalidChainId, SUPPORTED_TYPES)).toBe(\n false,\n );\n });\n });\n\n describe(\"load function\", () => {\n const validInput: TransactionCheckContextInput = {\n from: \"0x1234567890123456789012345678901234567890\",\n chainId: 1,\n transaction: new Uint8Array([1, 2, 3]),\n deviceModelId: DeviceModelId.FLEX,\n };\n\n const mockCertificate = {\n descriptor: \"cert-descriptor\",\n signature: \"cert-signature\",\n keyUsageNumber: 0,\n payload: new Uint8Array(),\n };\n\n it(\"should return empty array when from is empty\", async () => {\n const inputWithEmptyFrom = { ...validInput, from: \"\" };\n const result = await loader.load(inputWithEmptyFrom);\n expect(result).toEqual([]);\n });\n\n it(\"should return error context when transaction check fails\", async () => {\n const error = new Error(\"Transaction check failed\");\n vi.spyOn(\n mockTransactionCheckDataSource,\n \"getTransactionCheck\",\n ).mockResolvedValue(Left(error));\n\n const result = await loader.load(validInput);\n\n expect(result).toEqual([\n {\n type: ClearSignContextType.ERROR,\n error,\n },\n ]);\n });\n\n it(\"should return transaction check context when successful\", async () => {\n const transactionCheckData = {\n publicKeyId: \"test-key-id\",\n descriptor: \"test-descriptor\",\n };\n vi.spyOn(\n mockTransactionCheckDataSource,\n \"getTransactionCheck\",\n ).mockResolvedValue(Right(transactionCheckData));\n vi.spyOn(mockCertificateLoader, \"loadCertificate\").mockResolvedValue(\n mockCertificate,\n );\n\n const result = await loader.load(validInput);\n\n expect(\n mockTransactionCheckDataSource.getTransactionCheck,\n ).toHaveBeenCalledWith({\n chainId: validInput.chainId,\n rawTx: \"0x010203\",\n from: validInput.from,\n });\n\n expect(mockCertificateLoader.loadCertificate).toHaveBeenCalledWith({\n keyId: transactionCheckData.publicKeyId,\n keyUsage: KeyUsage.TxSimulationSigner,\n targetDevice: validInput.deviceModelId,\n });\n\n expect(result).toEqual([\n {\n type: ClearSignContextType.TRANSACTION_CHECK,\n payload: transactionCheckData.descriptor,\n certificate: mockCertificate,\n },\n ]);\n });\n\n it(\"should handle certificate loading failure\", async () => {\n const transactionCheckData = {\n publicKeyId: \"test-key-id\",\n descriptor: \"test-descriptor\",\n };\n const certificateError = new Error(\"Certificate loading failed\");\n\n vi.spyOn(\n mockTransactionCheckDataSource,\n \"getTransactionCheck\",\n ).mockResolvedValue(Right(transactionCheckData));\n vi.spyOn(mockCertificateLoader, \"loadCertificate\").mockRejectedValue(\n certificateError,\n );\n\n await expect(loader.load(validInput)).rejects.toThrow(certificateError);\n });\n\n it(\"should convert transaction buffer to hex string correctly\", async () => {\n const transactionCheckData = {\n publicKeyId: \"test-key-id\",\n descriptor: \"test-descriptor\",\n };\n vi.spyOn(\n mockTransactionCheckDataSource,\n \"getTransactionCheck\",\n ).mockResolvedValue(Right(transactionCheckData));\n vi.spyOn(mockCertificateLoader, \"loadCertificate\").mockResolvedValue(\n mockCertificate,\n );\n\n await loader.load(validInput);\n\n expect(\n mockTransactionCheckDataSource.getTransactionCheck,\n ).toHaveBeenCalledWith({\n chainId: validInput.chainId,\n rawTx: \"0x010203\", // Uint8Array([1, 2, 3]) converted to hex\n from: validInput.from,\n });\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["DeviceModelId", "Left", "Right", "KeyUsage", "ClearSignContextType", "TransactionCheckContextLoader", "mockTransactionCheckDataSource", "mockCertificateLoader", "loader", "SUPPORTED_TYPES", "validInput", "input", "_description", "inputWithNanoS", "inputWithInvalidChainId", "mockCertificate", "inputWithEmptyFrom", "result", "error", "transactionCheckData", "certificateError"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var f=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var p=(i,e,t,a)=>{for(var o=a>1?void 0:a?y(e,t):e,c=i.length-1,r;c>=0;c--)(r=i[c])&&(o=(a?r(e,t,o):r(o))||o);return a&&o&&f(e,t,o),o},n=(i,e)=>(t,a)=>e(t,a,i);import{DeviceModelId as l,isHexaString as S}from"@ledgerhq/device-management-kit";import{inject as m,injectable as T}from"inversify";import{pkiTypes as D}from"../../pki/di/pkiTypes";import{KeyUsage as k}from"../../pki/model/KeyUsage";import{ClearSignContextType as C}from"../../shared/model/ClearSignContext";import{transactionCheckTypes as x}from"../../transaction-check/di/transactionCheckTypes";const I=[C.TRANSACTION_CHECK];let d=class{constructor(e,t){this.typedDataCheckDataSource=e;this.certificateLoader=t}canHandle(e,t){return typeof e=="object"&&e!==null&&"from"in e&&e.from!==void 0&&S(e.from)&&e.from!=="0x"&&"data"in e&&typeof e.data=="object"&&"deviceModelId"in e&&e.deviceModelId!==void 0&&e.deviceModelId!==l.NANO_S&&I.every(o=>t.includes(o))}async load(e){const{from:t,data:a}=e;return!t||!a?[]:[await(await this.typedDataCheckDataSource.getTypedDataCheck({data:a,from:t})).caseOf({Left:r=>Promise.resolve({type:C.ERROR,error:r}),Right:async r=>{const s=await this.certificateLoader.loadCertificate({keyId:r.publicKeyId,keyUsage:k.TxSimulationSigner,targetDevice:e.deviceModelId});return{type:C.TRANSACTION_CHECK,payload:r.descriptor,certificate:s}}})]}};d=p([T(),n(0,m(x.TypedDataCheckDataSource)),n(1,m(D.PkiCertificateLoader))],d);export{d as TypedDataCheckContextLoader};
|
|
2
|
+
//# sourceMappingURL=TypedDataCheckContextLoader.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/transaction-check/domain/TypedDataCheckContextLoader.ts"],
|
|
4
|
+
"sourcesContent": ["import { DeviceModelId, isHexaString } from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\n\nimport { pkiTypes } from \"@/pki/di/pkiTypes\";\nimport { type PkiCertificateLoader } from \"@/pki/domain/PkiCertificateLoader\";\nimport { KeyUsage } from \"@/pki/model/KeyUsage\";\nimport { ContextLoader } from \"@/shared/domain/ContextLoader\";\nimport {\n ClearSignContext,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\nimport {\n TypedData,\n type TypedDataCheckDataSource,\n} from \"@/transaction-check/data/TypedDataCheckDataSource\";\nimport { transactionCheckTypes } from \"@/transaction-check/di/transactionCheckTypes\";\n\nexport type TypedDataCheckContextInput = {\n from: string;\n data: TypedData;\n deviceModelId: DeviceModelId;\n};\n\nconst SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.TRANSACTION_CHECK,\n];\n\n@injectable()\nexport class TypedDataCheckContextLoader\n implements ContextLoader<TypedDataCheckContextInput>\n{\n constructor(\n @inject(transactionCheckTypes.TypedDataCheckDataSource)\n private typedDataCheckDataSource: TypedDataCheckDataSource,\n @inject(pkiTypes.PkiCertificateLoader)\n private certificateLoader: PkiCertificateLoader,\n ) {}\n\n canHandle(\n input: unknown,\n expectedType: ClearSignContextType[],\n ): input is TypedDataCheckContextInput {\n const result =\n typeof input === \"object\" &&\n input !== null &&\n \"from\" in input &&\n input.from !== undefined &&\n isHexaString(input.from) &&\n input.from !== \"0x\" &&\n \"data\" in input &&\n typeof input.data === \"object\" &&\n \"deviceModelId\" in input &&\n input.deviceModelId !== undefined &&\n input.deviceModelId !== DeviceModelId.NANO_S &&\n SUPPORTED_TYPES.every((type) => expectedType.includes(type));\n\n return result;\n }\n\n async load(ctx: TypedDataCheckContextInput): Promise<ClearSignContext[]> {\n const { from, data } = ctx;\n\n if (!from || !data) {\n return [];\n }\n\n const txCheck = await this.typedDataCheckDataSource.getTypedDataCheck({\n data,\n from,\n });\n\n const context = await txCheck.caseOf<Promise<ClearSignContext>>({\n Left: (error) =>\n Promise.resolve({\n type: ClearSignContextType.ERROR,\n error,\n }),\n Right: async (result) => {\n const certificate = await this.certificateLoader.loadCertificate({\n keyId: result.publicKeyId,\n keyUsage: KeyUsage.TxSimulationSigner,\n targetDevice: ctx.deviceModelId,\n });\n\n return {\n type: ClearSignContextType.TRANSACTION_CHECK,\n payload: result.descriptor,\n certificate,\n };\n },\n });\n\n return [context];\n }\n}\n"],
|
|
5
|
+
"mappings": "iOAAA,OAAS,iBAAAA,EAAe,gBAAAC,MAAoB,kCAC5C,OAAS,UAAAC,EAAQ,cAAAC,MAAkB,YAEnC,OAAS,YAAAC,MAAgB,oBAEzB,OAAS,YAAAC,MAAgB,uBAEzB,OAEE,wBAAAC,MACK,kCAKP,OAAS,yBAAAC,MAA6B,+CAQtC,MAAMC,EAA0C,CAC9CC,EAAqB,iBACvB,EAGO,IAAMC,EAAN,KAEP,CACE,YAEUC,EAEAC,EACR,CAHQ,8BAAAD,EAEA,uBAAAC,CACP,CAEH,UACEC,EACAC,EACqC,CAerC,OAbE,OAAOD,GAAU,UACjBA,IAAU,MACV,SAAUA,GACVA,EAAM,OAAS,QACfE,EAAaF,EAAM,IAAI,GACvBA,EAAM,OAAS,MACf,SAAUA,GACV,OAAOA,EAAM,MAAS,UACtB,kBAAmBA,GACnBA,EAAM,gBAAkB,QACxBA,EAAM,gBAAkBG,EAAc,QACtCR,EAAgB,MAAOS,GAASH,EAAa,SAASG,CAAI,CAAC,CAG/D,CAEA,MAAM,KAAKC,EAA8D,CACvE,KAAM,CAAE,KAAAC,EAAM,KAAAC,CAAK,EAAIF,EAEvB,MAAI,CAACC,GAAQ,CAACC,EACL,CAAC,EA6BH,CArBS,MALA,MAAM,KAAK,yBAAyB,kBAAkB,CACpE,KAAAA,EACA,KAAAD,CACF,CAAC,GAE6B,OAAkC,CAC9D,KAAOE,GACL,QAAQ,QAAQ,CACd,KAAMZ,EAAqB,MAC3B,MAAAY,CACF,CAAC,EACH,MAAO,MAAOC,GAAW,CACvB,MAAMC,EAAc,MAAM,KAAK,kBAAkB,gBAAgB,CAC/D,MAAOD,EAAO,YACd,SAAUE,EAAS,mBACnB,aAAcN,EAAI,aACpB,CAAC,EAED,MAAO,CACL,KAAMT,EAAqB,kBAC3B,QAASa,EAAO,WAChB,YAAAC,CACF,CACF,CACF,CAAC,CAEc,CACjB,CACF,EAlEab,EAANe,EAAA,CADNC,EAAW,EAKPC,EAAA,EAAAC,EAAOC,EAAsB,wBAAwB,GAErDF,EAAA,EAAAC,EAAOE,EAAS,oBAAoB,IAN5BpB",
|
|
6
|
+
"names": ["DeviceModelId", "isHexaString", "inject", "injectable", "pkiTypes", "KeyUsage", "ClearSignContextType", "transactionCheckTypes", "SUPPORTED_TYPES", "ClearSignContextType", "TypedDataCheckContextLoader", "typedDataCheckDataSource", "certificateLoader", "input", "expectedType", "isHexaString", "DeviceModelId", "type", "ctx", "from", "data", "error", "result", "certificate", "KeyUsage", "__decorateClass", "injectable", "__decorateParam", "inject", "transactionCheckTypes", "pkiTypes"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{DeviceModelId as l}from"@ledgerhq/device-management-kit";import{Left as y,Right as p}from"purify-ts";import{KeyUsage as m}from"../../pki/model/KeyUsage";import{ClearSignContextType as c}from"../../shared/model/ClearSignContext";import{TypedDataCheckContextLoader as u}from"../../transaction-check/domain/TypedDataCheckContextLoader";describe("TypedDataCheckContextLoader",()=>{const o={getTypedDataCheck:vi.fn()},d={loadCertificate:vi.fn()},n=new u(o,d),r=[c.TRANSACTION_CHECK];beforeEach(()=>{vi.resetAllMocks()}),describe("canHandle function",()=>{const e={from:"0x1234567890123456789012345678901234567890",data:{domain:{name:"Test Domain",version:"1",chainId:1,verifyingContract:"0x1234567890123456789012345678901234567890"},types:{EIP712Domain:[{name:"name",type:"string"},{name:"version",type:"string"},{name:"chainId",type:"uint256"},{name:"verifyingContract",type:"address"}],Person:[{name:"name",type:"string"},{name:"wallet",type:"address"}]},primaryType:"Person",message:{name:"Alice",wallet:"0x1234567890123456789012345678901234567890"}},deviceModelId:l.FLEX};it("should return true for valid input",()=>{expect(n.canHandle(e,r)).toBe(!0)}),it("should return false for invalid expected type",()=>{expect(n.canHandle(e,[c.TOKEN])).toBe(!1)}),it.each([[null,"null input"],[void 0,"undefined input"],[{},"empty object"],["string","string input"],[123,"number input"]])("should return false for %s",(a,t)=>{expect(n.canHandle(a,r)).toBe(!1)}),it.each([[{...e,from:void 0},"missing from"],[{...e,data:void 0},"missing data"],[{...e,deviceModelId:void 0},"missing deviceModelId"]])("should return false for %s",(a,t)=>{expect(n.canHandle(a,r)).toBe(!1)}),it.each([[{...e,from:"invalid-hex"},"invalid from hex"],[{...e,from:"0x"},"empty from hex"],[{...e,from:"not-hex"},"non-hex from"]])("should return false for %s",(a,t)=>{expect(n.canHandle(a,r)).toBe(!1)}),it("should return false for NANO_S device model",()=>{const a={...e,deviceModelId:l.NANO_S};expect(n.canHandle(a,r)).toBe(!1)}),it("should return false for non-object data",()=>{const a={...e,data:"not-an-object"};expect(n.canHandle(a,r)).toBe(!1)})}),describe("load function",()=>{const s={domain:{name:"Test Domain",version:"1",chainId:1,verifyingContract:"0x1234567890123456789012345678901234567890"},types:{EIP712Domain:[{name:"name",type:"string"},{name:"version",type:"string"},{name:"chainId",type:"uint256"},{name:"verifyingContract",type:"address"}],Person:[{name:"name",type:"string"},{name:"wallet",type:"address"}]},primaryType:"Person",message:{name:"Alice",wallet:"0x1234567890123456789012345678901234567890"}},e={from:"0x1234567890123456789012345678901234567890",data:s,deviceModelId:l.FLEX},a={descriptor:"cert-descriptor",signature:"cert-signature",keyUsageNumber:0,payload:new Uint8Array};it("should return empty array when from is empty",async()=>{const t={...e,from:""},i=await n.load(t);expect(i).toEqual([])}),it("should return error context when typed data check fails",async()=>{const t=new Error("Typed data check failed");vi.spyOn(o,"getTypedDataCheck").mockResolvedValue(y(t));const i=await n.load(e);expect(i).toEqual([{type:c.ERROR,error:t}])}),it("should return transaction check context when successful",async()=>{const t={publicKeyId:"test-key-id",descriptor:"test-descriptor"};vi.spyOn(o,"getTypedDataCheck").mockResolvedValue(p(t)),vi.spyOn(d,"loadCertificate").mockResolvedValue(a);const i=await n.load(e);expect(o.getTypedDataCheck).toHaveBeenCalledWith({data:e.data,from:e.from}),expect(d.loadCertificate).toHaveBeenCalledWith({keyId:t.publicKeyId,keyUsage:m.TxSimulationSigner,targetDevice:e.deviceModelId}),expect(i).toEqual([{type:c.TRANSACTION_CHECK,payload:t.descriptor,certificate:a}])}),it("should handle certificate loading failure",async()=>{const t={publicKeyId:"test-key-id",descriptor:"test-descriptor"},i=new Error("Certificate loading failed");vi.spyOn(o,"getTypedDataCheck").mockResolvedValue(p(t)),vi.spyOn(d,"loadCertificate").mockRejectedValue(i),await expect(n.load(e)).rejects.toThrow(i)}),it("should call typed data check with correct parameters",async()=>{const t={publicKeyId:"test-key-id",descriptor:"test-descriptor"};vi.spyOn(o,"getTypedDataCheck").mockResolvedValue(p(t)),vi.spyOn(d,"loadCertificate").mockResolvedValue(a),await n.load(e),expect(o.getTypedDataCheck).toHaveBeenCalledWith({data:s,from:e.from})})})});
|
|
2
|
+
//# sourceMappingURL=TypedDataCheckContextLoader.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/transaction-check/domain/TypedDataCheckContextLoader.test.ts"],
|
|
4
|
+
"sourcesContent": ["import { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\n\nimport type { PkiCertificateLoader } from \"@/pki/domain/PkiCertificateLoader\";\nimport { KeyUsage } from \"@/pki/model/KeyUsage\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\nimport {\n type TypedData,\n type TypedDataCheckDataSource,\n} from \"@/transaction-check/data/TypedDataCheckDataSource\";\nimport {\n type TypedDataCheckContextInput,\n TypedDataCheckContextLoader,\n} from \"@/transaction-check/domain/TypedDataCheckContextLoader\";\n\ndescribe(\"TypedDataCheckContextLoader\", () => {\n const mockTypedDataCheckDataSource: TypedDataCheckDataSource = {\n getTypedDataCheck: vi.fn(),\n };\n const mockCertificateLoader: PkiCertificateLoader = {\n loadCertificate: vi.fn(),\n };\n const loader = new TypedDataCheckContextLoader(\n mockTypedDataCheckDataSource,\n mockCertificateLoader,\n );\n\n const SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.TRANSACTION_CHECK,\n ];\n\n beforeEach(() => {\n vi.resetAllMocks();\n });\n\n describe(\"canHandle function\", () => {\n const validTypedData: TypedData = {\n domain: {\n name: \"Test Domain\",\n version: \"1\",\n chainId: 1,\n verifyingContract: \"0x1234567890123456789012345678901234567890\",\n },\n types: {\n EIP712Domain: [\n { name: \"name\", type: \"string\" },\n { name: \"version\", type: \"string\" },\n { name: \"chainId\", type: \"uint256\" },\n { name: \"verifyingContract\", type: \"address\" },\n ],\n Person: [\n { name: \"name\", type: \"string\" },\n { name: \"wallet\", type: \"address\" },\n ],\n },\n primaryType: \"Person\",\n message: {\n name: \"Alice\",\n wallet: \"0x1234567890123456789012345678901234567890\",\n },\n };\n\n const validInput: TypedDataCheckContextInput = {\n from: \"0x1234567890123456789012345678901234567890\",\n data: validTypedData,\n deviceModelId: DeviceModelId.FLEX,\n };\n\n it(\"should return true for valid input\", () => {\n expect(loader.canHandle(validInput, SUPPORTED_TYPES)).toBe(true);\n });\n\n it(\"should return false for invalid expected type\", () => {\n expect(loader.canHandle(validInput, [ClearSignContextType.TOKEN])).toBe(\n false,\n );\n });\n\n it.each([\n [null, \"null input\"],\n [undefined, \"undefined input\"],\n [{}, \"empty object\"],\n [\"string\", \"string input\"],\n [123, \"number input\"],\n ])(\"should return false for %s\", (input, _description) => {\n expect(loader.canHandle(input, SUPPORTED_TYPES)).toBe(false);\n });\n\n it.each([\n [{ ...validInput, from: undefined }, \"missing from\"],\n [{ ...validInput, data: undefined }, \"missing data\"],\n [{ ...validInput, deviceModelId: undefined }, \"missing deviceModelId\"],\n ])(\"should return false for %s\", (input, _description) => {\n expect(loader.canHandle(input, SUPPORTED_TYPES)).toBe(false);\n });\n\n it.each([\n [{ ...validInput, from: \"invalid-hex\" }, \"invalid from hex\"],\n [{ ...validInput, from: \"0x\" }, \"empty from hex\"],\n [{ ...validInput, from: \"not-hex\" }, \"non-hex from\"],\n ])(\"should return false for %s\", (input, _description) => {\n expect(loader.canHandle(input, SUPPORTED_TYPES)).toBe(false);\n });\n\n it(\"should return false for NANO_S device model\", () => {\n const inputWithNanoS = {\n ...validInput,\n deviceModelId: DeviceModelId.NANO_S,\n };\n expect(loader.canHandle(inputWithNanoS, SUPPORTED_TYPES)).toBe(false);\n });\n\n it(\"should return false for non-object data\", () => {\n const inputWithInvalidData = {\n ...validInput,\n data: \"not-an-object\" as unknown as TypedData,\n };\n expect(loader.canHandle(inputWithInvalidData, SUPPORTED_TYPES)).toBe(\n false,\n );\n });\n });\n\n describe(\"load function\", () => {\n const validTypedData: TypedData = {\n domain: {\n name: \"Test Domain\",\n version: \"1\",\n chainId: 1,\n verifyingContract: \"0x1234567890123456789012345678901234567890\",\n },\n types: {\n EIP712Domain: [\n { name: \"name\", type: \"string\" },\n { name: \"version\", type: \"string\" },\n { name: \"chainId\", type: \"uint256\" },\n { name: \"verifyingContract\", type: \"address\" },\n ],\n Person: [\n { name: \"name\", type: \"string\" },\n { name: \"wallet\", type: \"address\" },\n ],\n },\n primaryType: \"Person\",\n message: {\n name: \"Alice\",\n wallet: \"0x1234567890123456789012345678901234567890\",\n },\n };\n\n const validInput: TypedDataCheckContextInput = {\n from: \"0x1234567890123456789012345678901234567890\",\n data: validTypedData,\n deviceModelId: DeviceModelId.FLEX,\n };\n\n const mockCertificate = {\n descriptor: \"cert-descriptor\",\n signature: \"cert-signature\",\n keyUsageNumber: 0,\n payload: new Uint8Array(),\n };\n\n it(\"should return empty array when from is empty\", async () => {\n const inputWithEmptyFrom = { ...validInput, from: \"\" };\n const result = await loader.load(inputWithEmptyFrom);\n expect(result).toEqual([]);\n });\n\n it(\"should return error context when typed data check fails\", async () => {\n const error = new Error(\"Typed data check failed\");\n vi.spyOn(\n mockTypedDataCheckDataSource,\n \"getTypedDataCheck\",\n ).mockResolvedValue(Left(error));\n\n const result = await loader.load(validInput);\n\n expect(result).toEqual([\n {\n type: ClearSignContextType.ERROR,\n error,\n },\n ]);\n });\n\n it(\"should return transaction check context when successful\", async () => {\n const typedDataCheckData = {\n publicKeyId: \"test-key-id\",\n descriptor: \"test-descriptor\",\n };\n vi.spyOn(\n mockTypedDataCheckDataSource,\n \"getTypedDataCheck\",\n ).mockResolvedValue(Right(typedDataCheckData));\n vi.spyOn(mockCertificateLoader, \"loadCertificate\").mockResolvedValue(\n mockCertificate,\n );\n\n const result = await loader.load(validInput);\n\n expect(\n mockTypedDataCheckDataSource.getTypedDataCheck,\n ).toHaveBeenCalledWith({\n data: validInput.data,\n from: validInput.from,\n });\n\n expect(mockCertificateLoader.loadCertificate).toHaveBeenCalledWith({\n keyId: typedDataCheckData.publicKeyId,\n keyUsage: KeyUsage.TxSimulationSigner,\n targetDevice: validInput.deviceModelId,\n });\n\n expect(result).toEqual([\n {\n type: ClearSignContextType.TRANSACTION_CHECK,\n payload: typedDataCheckData.descriptor,\n certificate: mockCertificate,\n },\n ]);\n });\n\n it(\"should handle certificate loading failure\", async () => {\n const typedDataCheckData = {\n publicKeyId: \"test-key-id\",\n descriptor: \"test-descriptor\",\n };\n const certificateError = new Error(\"Certificate loading failed\");\n\n vi.spyOn(\n mockTypedDataCheckDataSource,\n \"getTypedDataCheck\",\n ).mockResolvedValue(Right(typedDataCheckData));\n vi.spyOn(mockCertificateLoader, \"loadCertificate\").mockRejectedValue(\n certificateError,\n );\n\n await expect(loader.load(validInput)).rejects.toThrow(certificateError);\n });\n\n it(\"should call typed data check with correct parameters\", async () => {\n const typedDataCheckData = {\n publicKeyId: \"test-key-id\",\n descriptor: \"test-descriptor\",\n };\n vi.spyOn(\n mockTypedDataCheckDataSource,\n \"getTypedDataCheck\",\n ).mockResolvedValue(Right(typedDataCheckData));\n vi.spyOn(mockCertificateLoader, \"loadCertificate\").mockResolvedValue(\n mockCertificate,\n );\n\n await loader.load(validInput);\n\n expect(\n mockTypedDataCheckDataSource.getTypedDataCheck,\n ).toHaveBeenCalledWith({\n data: validTypedData,\n from: validInput.from,\n });\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["DeviceModelId", "Left", "Right", "KeyUsage", "ClearSignContextType", "TypedDataCheckContextLoader", "mockTypedDataCheckDataSource", "mockCertificateLoader", "loader", "SUPPORTED_TYPES", "validInput", "input", "_description", "inputWithNanoS", "inputWithInvalidData", "validTypedData", "mockCertificate", "inputWithEmptyFrom", "result", "error", "typedDataCheckData", "certificateError"]
|
|
7
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const A=["function execute(bytes calldata commands, bytes[] calldata inputs, uint256 deadline) external payable"],E="
|
|
1
|
+
const A=["function execute(bytes calldata commands, bytes[] calldata inputs, uint256 deadline) external payable"],E="0x3593564c";var T=(_=>(_.V2_SWAP_EXACT_IN="V2_SWAP_EXACT_IN",_.V2_SWAP_EXACT_OUT="V2_SWAP_EXACT_OUT",_.V3_SWAP_EXACT_IN="V3_SWAP_EXACT_IN",_.V3_SWAP_EXACT_OUT="V3_SWAP_EXACT_OUT",_.WRAP_ETH="WRAP_ETH",_.UNWRAP_ETH="UNWRAP_ETH",_.PERMIT2_PERMIT="PERMIT2_PERMIT",_.PERMIT2_TRANSFER_FROM="PERMIT2_TRANSFER_FROM",_.PERMIT2_PERMIT_BATCH="PERMIT2_PERMIT_BATCH",_.PERMIT2_TRANSFER_FROM_BATCH="PERMIT2_TRANSFER_FROM_BATCH",_.PAY_PORTION="PAY_PORTION",_.SWEEP="SWEEP",_))(T||{});const P={"0x08":"V2_SWAP_EXACT_IN","0x09":"V2_SWAP_EXACT_OUT","0x00":"V3_SWAP_EXACT_IN","0x01":"V3_SWAP_EXACT_OUT","0x0b":"WRAP_ETH","0x0c":"UNWRAP_ETH","0x0a":"PERMIT2_PERMIT","0x0d":"PERMIT2_TRANSFER_FROM","0x02":"PERMIT2_PERMIT_BATCH","0x03":"PERMIT2_TRANSFER_FROM_BATCH","0x06":"PAY_PORTION","0x04":"SWEEP"},R=["V2_SWAP_EXACT_IN","V2_SWAP_EXACT_OUT","V3_SWAP_EXACT_IN","V3_SWAP_EXACT_OUT"];export{P as UNISWAP_COMMANDS,A as UNISWAP_EXECUTE_ABI,E as UNISWAP_EXECUTE_SELECTOR,R as UNISWAP_SWAP_COMMANDS,T as UniswapSupportedCommand};
|
|
2
2
|
//# sourceMappingURL=uniswap.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/uniswap/constants/uniswap.ts"],
|
|
4
|
-
"sourcesContent": ["import { type HexaString } from \"@ledgerhq/device-management-kit\";\n\nexport const UNISWAP_EXECUTE_ABI = [\n \"function execute(bytes calldata commands, bytes[] calldata inputs, uint256 deadline) external payable\",\n];\n\nexport const
|
|
5
|
-
"mappings": "AAEO,MAAMA,EAAsB,CACjC,uGACF,EAEaC,
|
|
6
|
-
"names": ["UNISWAP_EXECUTE_ABI", "
|
|
4
|
+
"sourcesContent": ["import { type HexaString } from \"@ledgerhq/device-management-kit\";\n\nexport const UNISWAP_EXECUTE_ABI = [\n \"function execute(bytes calldata commands, bytes[] calldata inputs, uint256 deadline) external payable\",\n];\n\nexport const UNISWAP_EXECUTE_SELECTOR = \"0x3593564c\";\n\nexport enum UniswapSupportedCommand {\n V2_SWAP_EXACT_IN = \"V2_SWAP_EXACT_IN\",\n V2_SWAP_EXACT_OUT = \"V2_SWAP_EXACT_OUT\",\n V3_SWAP_EXACT_IN = \"V3_SWAP_EXACT_IN\",\n V3_SWAP_EXACT_OUT = \"V3_SWAP_EXACT_OUT\",\n WRAP_ETH = \"WRAP_ETH\",\n UNWRAP_ETH = \"UNWRAP_ETH\",\n PERMIT2_PERMIT = \"PERMIT2_PERMIT\",\n PERMIT2_TRANSFER_FROM = \"PERMIT2_TRANSFER_FROM\",\n PERMIT2_PERMIT_BATCH = \"PERMIT2_PERMIT_BATCH\",\n PERMIT2_TRANSFER_FROM_BATCH = \"PERMIT2_TRANSFER_FROM_BATCH\",\n PAY_PORTION = \"PAY_PORTION\",\n SWEEP = \"SWEEP\",\n}\n\nexport const UNISWAP_COMMANDS: Record<HexaString, UniswapSupportedCommand> = {\n \"0x08\": UniswapSupportedCommand.V2_SWAP_EXACT_IN,\n \"0x09\": UniswapSupportedCommand.V2_SWAP_EXACT_OUT,\n \"0x00\": UniswapSupportedCommand.V3_SWAP_EXACT_IN,\n \"0x01\": UniswapSupportedCommand.V3_SWAP_EXACT_OUT,\n \"0x0b\": UniswapSupportedCommand.WRAP_ETH,\n \"0x0c\": UniswapSupportedCommand.UNWRAP_ETH,\n \"0x0a\": UniswapSupportedCommand.PERMIT2_PERMIT,\n \"0x0d\": UniswapSupportedCommand.PERMIT2_TRANSFER_FROM,\n \"0x02\": UniswapSupportedCommand.PERMIT2_PERMIT_BATCH,\n \"0x03\": UniswapSupportedCommand.PERMIT2_TRANSFER_FROM_BATCH,\n \"0x06\": UniswapSupportedCommand.PAY_PORTION,\n \"0x04\": UniswapSupportedCommand.SWEEP,\n};\n\nexport const UNISWAP_SWAP_COMMANDS: UniswapSupportedCommand[] = [\n UniswapSupportedCommand.V2_SWAP_EXACT_IN,\n UniswapSupportedCommand.V2_SWAP_EXACT_OUT,\n UniswapSupportedCommand.V3_SWAP_EXACT_IN,\n UniswapSupportedCommand.V3_SWAP_EXACT_OUT,\n];\n"],
|
|
5
|
+
"mappings": "AAEO,MAAMA,EAAsB,CACjC,uGACF,EAEaC,EAA2B,aAEjC,IAAKC,OACVA,EAAA,iBAAmB,mBACnBA,EAAA,kBAAoB,oBACpBA,EAAA,iBAAmB,mBACnBA,EAAA,kBAAoB,oBACpBA,EAAA,SAAW,WACXA,EAAA,WAAa,aACbA,EAAA,eAAiB,iBACjBA,EAAA,sBAAwB,wBACxBA,EAAA,qBAAuB,uBACvBA,EAAA,4BAA8B,8BAC9BA,EAAA,YAAc,cACdA,EAAA,MAAQ,QAZEA,OAAA,IAeL,MAAMC,EAAgE,CAC3E,OAAQ,mBACR,OAAQ,oBACR,OAAQ,mBACR,OAAQ,oBACR,OAAQ,WACR,OAAQ,aACR,OAAQ,iBACR,OAAQ,wBACR,OAAQ,uBACR,OAAQ,8BACR,OAAQ,cACR,OAAQ,OACV,EAEaC,EAAmD,CAC9D,mBACA,oBACA,mBACA,mBACF",
|
|
6
|
+
"names": ["UNISWAP_EXECUTE_ABI", "UNISWAP_EXECUTE_SELECTOR", "UniswapSupportedCommand", "UNISWAP_COMMANDS", "UNISWAP_SWAP_COMMANDS"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var
|
|
1
|
+
var w=Object.defineProperty;var T=Object.getOwnPropertyDescriptor;var C=(c,e,t,n)=>{for(var a=n>1?void 0:n?T(e,t):e,r=c.length-1,o;r>=0;r--)(o=c[r])&&(a=(n?o(e,t,a):o(a))||a);return n&&a&&w(e,t,a),a},p=(c,e)=>(t,n)=>e(t,n,c);import{isHexaString as d}from"@ledgerhq/device-management-kit";import{Interface as _}from"ethers";import{inject as f,injectable as H}from"inversify";import{Maybe as g,Nothing as P}from"purify-ts";import{ClearSignContextType as S}from"../../shared/model/ClearSignContext";import{tokenTypes as A}from"../../token/di/tokenTypes";import{UNISWAP_COMMANDS as I,UNISWAP_EXECUTE_ABI as k,UNISWAP_EXECUTE_SELECTOR as E,UNISWAP_SWAP_COMMANDS as U}from"../../uniswap/constants/uniswap";import{uniswapTypes as N}from"../../uniswap/di/uniswapTypes";const b=[S.TOKEN];let m=class{constructor(e,t){this.commandDecoderDataSource=e;this.tokenDataSource=t}canHandle(e,t){return typeof e=="object"&&e!==null&&"data"in e&&"selector"in e&&"chainId"in e&&typeof e.chainId=="number"&&d(e.data)&&e.data!=="0x"&&d(e.selector)&&e.selector===E&&b.every(n=>t.includes(n))}async load(e){const{data:t,chainId:n}=e;return await this._extractClearSignContexts(t,n)}async _extractClearSignContexts(e,t){try{const a=new _(k).parseTransaction({data:e}),r=a?.args[0],o=a?.args[1];if(!d(r)||!this._isHexaStringArray(o))return[];const u=this._extractCommands(r).orDefault([]);if(r.length===0||o.length!==u.length)return[];const l=u.reduce((i,s,y)=>{const h=o[y],D=this.commandDecoderDataSource.decode(s,h,t);return i.push([s,D]),i},[]);if(!this._isChainingSwapSupported(l))return[];const x=[...new Set(l.flatMap(([,i])=>i))];return(await Promise.all(x.map(i=>this.tokenDataSource.getTokenInfosPayload({address:i,chainId:t})))).map(i=>i.caseOf({Left:s=>({type:S.ERROR,error:s}),Right:s=>({type:S.TOKEN,payload:s})}))}catch{return[]}}_extractCommands(e){return g.fromNullable(e.slice(2).match(/../g)).map(t=>t.map(n=>`0x${n}`)).map(t=>t.map(n=>I[n])).chain(t=>t.every(n=>n!==void 0)?g.of(t):P)}_isChainingSwapSupported(e){let t,n;for(const[a,r]of e){if(!U.includes(a))continue;const o=a.slice(0,2);if(t&&(t!==r[0]||n!==o))return!1;t=r[r.length-1],n=o}return!0}_isHexaStringArray(e){return Array.isArray(e)&&e.every(t=>typeof t=="string"&&d(t))}};m=C([H(),p(0,f(N.CommandDecoderDataSource)),p(1,f(A.TokenDataSource))],m);export{m as UniswapContextLoader};
|
|
2
2
|
//# sourceMappingURL=UniswapContextLoader.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/uniswap/domain/UniswapContextLoader.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n bufferToHexaString,\n ByteArrayBuilder,\n HexaString,\n hexaStringToBuffer,\n isHexaString,\n} from \"@ledgerhq/device-management-kit\";\nimport { Interface } from \"ethers\";\nimport { inject, injectable } from \"inversify\";\nimport { Maybe, Nothing } from \"purify-ts\";\n\nimport { ContextLoader } from \"@/shared/domain/ContextLoader\";\nimport {\n ClearSignContext,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\nimport { type TokenDataSource } from \"@/token/data/TokenDataSource\";\nimport { tokenTypes } from \"@/token/di/tokenTypes\";\nimport {\n UNISWAP_PLUGIN_NAME,\n UNISWAP_PLUGIN_SIGNATURE,\n} from \"@/uniswap/constants/plugin\";\nimport {\n UNISWAP_COMMANDS,\n UNISWAP_EXECUTE_ABI,\n UNISWAP_EXECUTE_SELECTOR,\n UNISWAP_SWAP_COMMANDS,\n UNISWAP_UNIVERSAL_ROUTER_ADDRESS,\n UniswapSupportedCommand,\n} from \"@/uniswap/constants/uniswap\";\nimport { type CommandDecoderDataSource } from \"@/uniswap/data/CommandDecoderDataSource\";\nimport { uniswapTypes } from \"@/uniswap/di/uniswapTypes\";\n\nexport type UniswapContextInput = {\n to: HexaString;\n data: HexaString;\n selector: HexaString;\n chainId: number;\n};\n\nconst SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.EXTERNAL_PLUGIN,\n ClearSignContextType.TOKEN,\n];\n\n@injectable()\nexport class UniswapContextLoader\n implements ContextLoader<UniswapContextInput>\n{\n constructor(\n @inject(uniswapTypes.CommandDecoderDataSource)\n private commandDecoderDataSource: CommandDecoderDataSource,\n @inject(tokenTypes.TokenDataSource)\n private tokenDataSource: TokenDataSource,\n ) {}\n\n canHandle(\n input: unknown,\n expectedTypes: ClearSignContextType[],\n ): input is UniswapContextInput {\n return (\n typeof input === \"object\" &&\n input !== null &&\n \"to\" in input &&\n \"data\" in input &&\n \"selector\" in input &&\n \"chainId\" in input &&\n typeof input.chainId === \"number\" &&\n isHexaString(input.data) &&\n input.data !== \"0x\" &&\n isHexaString(input.selector) &&\n input.selector === UNISWAP_EXECUTE_SELECTOR &&\n isHexaString(input.to) &&\n input.to === UNISWAP_UNIVERSAL_ROUTER_ADDRESS &&\n SUPPORTED_TYPES.every((type) => expectedTypes.includes(type))\n );\n }\n\n async load(input: UniswapContextInput): Promise<ClearSignContext[]> {\n const { data, chainId } = input;\n\n const externalPluginContext = this._buildUniswapPluginCommandData();\n const tokenContexts = await this._extractClearSignContexts(data, chainId);\n\n if (tokenContexts.length > 0)\n return [externalPluginContext, ...tokenContexts];\n\n return [];\n }\n\n /**\n * Constructs the external plugin context for Uniswap external plugin command.\n *\n * @private\n * @returns {ClearSignContext} - The generated external plugin context.\n */\n private _buildUniswapPluginCommandData(): ClearSignContext {\n const buffer = new ByteArrayBuilder()\n .add8BitUIntToData(UNISWAP_PLUGIN_NAME.length)\n .addAsciiStringToData(UNISWAP_PLUGIN_NAME)\n .addBufferToData(hexaStringToBuffer(UNISWAP_UNIVERSAL_ROUTER_ADDRESS)!)\n .addBufferToData(hexaStringToBuffer(UNISWAP_EXECUTE_SELECTOR)!)\n .addBufferToData(hexaStringToBuffer(UNISWAP_PLUGIN_SIGNATURE)!)\n .build();\n\n return {\n type: ClearSignContextType.EXTERNAL_PLUGIN,\n payload: bufferToHexaString(buffer, false),\n };\n }\n\n /**\n * Extracts and decodes the clear sign contexts from a Uniswap calldata transaction.\n *\n * This function:\n * - Parses the calldata using the Uniswap `execute` function signature.\n * - Extracts and validates the `commands` and `inputs`.\n * - Decodes the commands and ensures they match the number of inputs.\n * - Extracts addresses used in the transaction and verifies if chaining swaps are supported.\n * - Fetches token information for unique addresses.\n * - Returns an array of `ClearSignContext` objects representing either token data or errors.\n *\n * @private\n * @param {HexaString} calldata - The raw calldata of the Uniswap transaction.\n * @param {number} chainId - The blockchain chain ID where the transaction is being executed.\n * @returns {Promise<ClearSignContext[]>} - A promise resolving to an array of clear sign contexts.\n */\n private async _extractClearSignContexts(\n calldata: HexaString,\n chainId: number,\n ): Promise<ClearSignContext[]> {\n try {\n const iface = new Interface(UNISWAP_EXECUTE_ABI);\n\n const tx = iface.parseTransaction({ data: calldata });\n const commands: unknown = tx?.args[0];\n const inputs: unknown = tx?.args[1];\n\n if (!isHexaString(commands) || !this._isHexaStringArray(inputs)) {\n return [];\n }\n\n const decodedCommands = this._extractCommands(commands).orDefault([]);\n if (commands.length === 0 || inputs.length !== decodedCommands.length) {\n // Invalid commands or inputs\n return [];\n }\n\n const addressesByCommand = decodedCommands.reduce(\n (acc, command, index) => {\n const input = inputs[index]!;\n const decoded: HexaString[] = this.commandDecoderDataSource.decode(\n command,\n input,\n chainId,\n );\n\n acc.push([command, decoded]);\n\n return acc;\n },\n [] as [UniswapSupportedCommand, HexaString[]][],\n );\n\n if (!this._isChainingSwapSupported(addressesByCommand)) {\n return [];\n }\n\n const uniqueAddresses = [\n ...new Set(addressesByCommand.flatMap(([, addresses]) => addresses)),\n ];\n\n const tokensPayload = await Promise.all(\n uniqueAddresses.map((address) =>\n this.tokenDataSource.getTokenInfosPayload({ address, chainId }),\n ),\n );\n\n return tokensPayload.map((either) =>\n either.caseOf<ClearSignContext>({\n Left: (error) => ({ type: ClearSignContextType.ERROR, error }),\n Right: (payload) => ({ type: ClearSignContextType.TOKEN, payload }),\n }),\n );\n } catch (_) {\n return [];\n }\n }\n\n /**\n * Extracts Uniswap-supported commands from a hexadecimal string.\n * Each command is represented by one byte (2 hex characters), and this function:\n * - Maps each command to a known Uniswap command.\n * - Returns `Nothing` if any extracted command is unsupported.\n *\n * @private\n * @param {HexaString} hex - A hexadecimal string representing commands.\n * @returns {Maybe<UniswapSupportedCommand[]>} - A `Maybe` containing an array of recognized commands, or `Nothing` if any command is unsupported.\n *\n * @example\n * // Valid command extraction\n * _extractCommands('0x0008');\n * // Returns: Just(['0x00', '0x08'])\n *\n * @example\n * // Contains an unsupported command (0x05 is not supported)\n * _extractCommands('0x0005');\n * // Returns: Nothing\n *\n * @example\n * // Empty or invalid input\n * _extractCommands('0x');\n * // Returns: Nothing\n */\n private _extractCommands(hex: HexaString): Maybe<UniswapSupportedCommand[]> {\n return Maybe.fromNullable(hex.slice(2).match(/../g))\n .map((bytes) => bytes.map((b) => `0x${b}` as HexaString))\n .map((hexBytes) => hexBytes.map((b) => UNISWAP_COMMANDS[b]))\n .chain((commands) =>\n commands.every((command) => command !== undefined)\n ? Maybe.of(commands as UniswapSupportedCommand[])\n : Nothing,\n );\n }\n\n /**\n * Checks if the provided swap commands can be chained together.\n * A valid chain requires that:\n * - The output asset of the previous swap matches the input asset of the next swap.\n * - The pool version remains consistent across swaps.\n *\n * @private\n * @param {Array<[UniswapSupportedCommand, HexaString[]]>} data - An array of tuples containing a swap command and associated addresses.\n * @returns {boolean} - Returns `true` if the swap commands form a valid chain, otherwise `false`.\n *\n * @example\n * // Valid chaining: same output/input asset and pool version\n * _isChainingSwapSupported([\n * ['0x08', ['0xABC', '0xDEF']],\n * ['0x08', ['0xDEF', '0x123']]\n * ]);\n * // Returns: true\n *\n * @example\n * // Invalid chaining: different pool versions\n * _isChainingSwapSupported([\n * ['0x08', ['0xABC', '0xDEF']],\n * ['0x01', ['0xDEF', '0x123']]\n * ]);\n * // Returns: false\n *\n * @example\n * // Invalid chaining: output does not match next input\n * _isChainingSwapSupported([\n * ['0x01A1', ['0xABC', '0xDEF']],\n * ['0x01B2', ['0xXYZ', '0x123']]\n * ]);\n * // Returns: false\n */\n private _isChainingSwapSupported(\n data: [UniswapSupportedCommand, HexaString[]][],\n ): boolean {\n let lastAsset: HexaString | undefined = undefined;\n let lastPoolVersion: string | undefined = undefined;\n\n for (const [command, addresses] of data) {\n if (!UNISWAP_SWAP_COMMANDS.includes(command)) continue; // Ignore non-swap commands\n\n const poolVersion = command.slice(0, 2);\n\n if (\n lastAsset &&\n (lastAsset !== addresses[0] || lastPoolVersion !== poolVersion)\n ) {\n // Invalid chaining, return empty array\n return false;\n }\n\n // update last asset and pool version\n lastAsset = addresses[addresses.length - 1];\n lastPoolVersion = poolVersion;\n }\n\n return true;\n }\n\n /**\n * Checks if a given value is an array of hexadecimal strings.\n *\n * @private\n * @param {unknown} array - The value to check.\n * @returns {array is HexaString[]} - `true` if the value is an array of hexadecimal strings, otherwise `false`.\n */\n private _isHexaStringArray(array: unknown): array is HexaString[] {\n return (\n Array.isArray(array) &&\n array.every((item) => typeof item === \"string\" && isHexaString(item))\n );\n }\n}\n"],
|
|
5
|
-
"mappings": "iOAAA,
|
|
6
|
-
"names": ["
|
|
4
|
+
"sourcesContent": ["import { HexaString, isHexaString } from \"@ledgerhq/device-management-kit\";\nimport { Interface } from \"ethers\";\nimport { inject, injectable } from \"inversify\";\nimport { Maybe, Nothing } from \"purify-ts\";\n\nimport { ContextLoader } from \"@/shared/domain/ContextLoader\";\nimport {\n ClearSignContext,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\nimport { type TokenDataSource } from \"@/token/data/TokenDataSource\";\nimport { tokenTypes } from \"@/token/di/tokenTypes\";\nimport {\n UNISWAP_COMMANDS,\n UNISWAP_EXECUTE_ABI,\n UNISWAP_EXECUTE_SELECTOR,\n UNISWAP_SWAP_COMMANDS,\n UniswapSupportedCommand,\n} from \"@/uniswap/constants/uniswap\";\nimport { type CommandDecoderDataSource } from \"@/uniswap/data/CommandDecoderDataSource\";\nimport { uniswapTypes } from \"@/uniswap/di/uniswapTypes\";\n\nexport type UniswapContextInput = {\n data: HexaString;\n selector: HexaString;\n chainId: number;\n};\n\nconst SUPPORTED_TYPES: ClearSignContextType[] = [ClearSignContextType.TOKEN];\n\n@injectable()\nexport class UniswapContextLoader\n implements ContextLoader<UniswapContextInput>\n{\n constructor(\n @inject(uniswapTypes.CommandDecoderDataSource)\n private commandDecoderDataSource: CommandDecoderDataSource,\n @inject(tokenTypes.TokenDataSource)\n private tokenDataSource: TokenDataSource,\n ) {}\n\n canHandle(\n input: unknown,\n expectedTypes: ClearSignContextType[],\n ): input is UniswapContextInput {\n return (\n typeof input === \"object\" &&\n input !== null &&\n \"data\" in input &&\n \"selector\" in input &&\n \"chainId\" in input &&\n typeof input.chainId === \"number\" &&\n isHexaString(input.data) &&\n input.data !== \"0x\" &&\n isHexaString(input.selector) &&\n input.selector === UNISWAP_EXECUTE_SELECTOR &&\n SUPPORTED_TYPES.every((type) => expectedTypes.includes(type))\n );\n }\n\n async load(input: UniswapContextInput): Promise<ClearSignContext[]> {\n const { data, chainId } = input;\n return await this._extractClearSignContexts(data, chainId);\n }\n\n /**\n * Extracts and decodes the clear sign contexts from a Uniswap calldata transaction.\n *\n * This function:\n * - Parses the calldata using the Uniswap `execute` function signature.\n * - Extracts and validates the `commands` and `inputs`.\n * - Decodes the commands and ensures they match the number of inputs.\n * - Extracts addresses used in the transaction and verifies if chaining swaps are supported.\n * - Fetches token information for unique addresses.\n * - Returns an array of `ClearSignContext` objects representing either token data or errors.\n *\n * @private\n * @param {HexaString} calldata - The raw calldata of the Uniswap transaction.\n * @param {number} chainId - The blockchain chain ID where the transaction is being executed.\n * @returns {Promise<ClearSignContext[]>} - A promise resolving to an array of clear sign contexts.\n */\n private async _extractClearSignContexts(\n calldata: HexaString,\n chainId: number,\n ): Promise<ClearSignContext[]> {\n try {\n const iface = new Interface(UNISWAP_EXECUTE_ABI);\n\n const tx = iface.parseTransaction({ data: calldata });\n const commands: unknown = tx?.args[0];\n const inputs: unknown = tx?.args[1];\n\n if (!isHexaString(commands) || !this._isHexaStringArray(inputs)) {\n return [];\n }\n\n const decodedCommands = this._extractCommands(commands).orDefault([]);\n if (commands.length === 0 || inputs.length !== decodedCommands.length) {\n // Invalid commands or inputs\n return [];\n }\n\n const addressesByCommand = decodedCommands.reduce(\n (acc, command, index) => {\n const input = inputs[index]!;\n const decoded: HexaString[] = this.commandDecoderDataSource.decode(\n command,\n input,\n chainId,\n );\n\n acc.push([command, decoded]);\n\n return acc;\n },\n [] as [UniswapSupportedCommand, HexaString[]][],\n );\n\n if (!this._isChainingSwapSupported(addressesByCommand)) {\n return [];\n }\n\n const uniqueAddresses = [\n ...new Set(addressesByCommand.flatMap(([, addresses]) => addresses)),\n ];\n\n const tokensPayload = await Promise.all(\n uniqueAddresses.map((address) =>\n this.tokenDataSource.getTokenInfosPayload({ address, chainId }),\n ),\n );\n\n return tokensPayload.map((either) =>\n either.caseOf<ClearSignContext>({\n Left: (error) => ({ type: ClearSignContextType.ERROR, error }),\n Right: (payload) => ({ type: ClearSignContextType.TOKEN, payload }),\n }),\n );\n } catch (_) {\n return [];\n }\n }\n\n /**\n * Extracts Uniswap-supported commands from a hexadecimal string.\n * Each command is represented by one byte (2 hex characters), and this function:\n * - Maps each command to a known Uniswap command.\n * - Returns `Nothing` if any extracted command is unsupported.\n *\n * @private\n * @param {HexaString} hex - A hexadecimal string representing commands.\n * @returns {Maybe<UniswapSupportedCommand[]>} - A `Maybe` containing an array of recognized commands, or `Nothing` if any command is unsupported.\n *\n * @example\n * // Valid command extraction\n * _extractCommands('0x0008');\n * // Returns: Just(['0x00', '0x08'])\n *\n * @example\n * // Contains an unsupported command (0x05 is not supported)\n * _extractCommands('0x0005');\n * // Returns: Nothing\n *\n * @example\n * // Empty or invalid input\n * _extractCommands('0x');\n * // Returns: Nothing\n */\n private _extractCommands(hex: HexaString): Maybe<UniswapSupportedCommand[]> {\n return Maybe.fromNullable(hex.slice(2).match(/../g))\n .map((bytes) => bytes.map((b) => `0x${b}` as HexaString))\n .map((hexBytes) => hexBytes.map((b) => UNISWAP_COMMANDS[b]))\n .chain((commands) =>\n commands.every((command) => command !== undefined)\n ? Maybe.of(commands as UniswapSupportedCommand[])\n : Nothing,\n );\n }\n\n /**\n * Checks if the provided swap commands can be chained together.\n * A valid chain requires that:\n * - The output asset of the previous swap matches the input asset of the next swap.\n * - The pool version remains consistent across swaps.\n *\n * @private\n * @param {Array<[UniswapSupportedCommand, HexaString[]]>} data - An array of tuples containing a swap command and associated addresses.\n * @returns {boolean} - Returns `true` if the swap commands form a valid chain, otherwise `false`.\n *\n * @example\n * // Valid chaining: same output/input asset and pool version\n * _isChainingSwapSupported([\n * ['0x08', ['0xABC', '0xDEF']],\n * ['0x08', ['0xDEF', '0x123']]\n * ]);\n * // Returns: true\n *\n * @example\n * // Invalid chaining: different pool versions\n * _isChainingSwapSupported([\n * ['0x08', ['0xABC', '0xDEF']],\n * ['0x01', ['0xDEF', '0x123']]\n * ]);\n * // Returns: false\n *\n * @example\n * // Invalid chaining: output does not match next input\n * _isChainingSwapSupported([\n * ['0x01A1', ['0xABC', '0xDEF']],\n * ['0x01B2', ['0xXYZ', '0x123']]\n * ]);\n * // Returns: false\n */\n private _isChainingSwapSupported(\n data: [UniswapSupportedCommand, HexaString[]][],\n ): boolean {\n let lastAsset: HexaString | undefined = undefined;\n let lastPoolVersion: string | undefined = undefined;\n\n for (const [command, addresses] of data) {\n if (!UNISWAP_SWAP_COMMANDS.includes(command)) continue; // Ignore non-swap commands\n\n const poolVersion = command.slice(0, 2);\n\n if (\n lastAsset &&\n (lastAsset !== addresses[0] || lastPoolVersion !== poolVersion)\n ) {\n // Invalid chaining, return empty array\n return false;\n }\n\n // update last asset and pool version\n lastAsset = addresses[addresses.length - 1];\n lastPoolVersion = poolVersion;\n }\n\n return true;\n }\n\n /**\n * Checks if a given value is an array of hexadecimal strings.\n *\n * @private\n * @param {unknown} array - The value to check.\n * @returns {array is HexaString[]} - `true` if the value is an array of hexadecimal strings, otherwise `false`.\n */\n private _isHexaStringArray(array: unknown): array is HexaString[] {\n return (\n Array.isArray(array) &&\n array.every((item) => typeof item === \"string\" && isHexaString(item))\n );\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["isHexaString", "Interface", "inject", "injectable", "Maybe", "Nothing", "ClearSignContextType", "tokenTypes", "UNISWAP_COMMANDS", "UNISWAP_EXECUTE_ABI", "UNISWAP_EXECUTE_SELECTOR", "UNISWAP_SWAP_COMMANDS", "uniswapTypes", "SUPPORTED_TYPES", "ClearSignContextType", "UniswapContextLoader", "commandDecoderDataSource", "tokenDataSource", "input", "expectedTypes", "isHexaString", "UNISWAP_EXECUTE_SELECTOR", "type", "data", "chainId", "calldata", "tx", "Interface", "UNISWAP_EXECUTE_ABI", "commands", "inputs", "decodedCommands", "addressesByCommand", "acc", "command", "index", "decoded", "uniqueAddresses", "addresses", "address", "either", "error", "payload", "hex", "Maybe", "bytes", "b", "hexBytes", "UNISWAP_COMMANDS", "Nothing", "lastAsset", "lastPoolVersion", "UNISWAP_SWAP_COMMANDS", "poolVersion", "array", "item", "__decorateClass", "injectable", "__decorateParam", "inject", "uniswapTypes", "tokenTypes"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{Interface as p}from"ethers";import{Left as y,Right as f}from"purify-ts";import{ClearSignContextType as r}from"../../shared/model/ClearSignContext";import{UNISWAP_EXECUTE_SELECTOR as c,UNISWAP_UNIVERSAL_ROUTER_ADDRESS as d,UniswapSupportedCommand as i}from"../../uniswap/constants/uniswap";import{DefaultCommandDecoderDataSource as u}from"../../uniswap/data/DefaultCommandDecoderDataSource";import{EthersAbiDecoderDataSource as b}from"../../uniswap/data/EthersAbiDecoderDataSource";import{UniswapContextLoader as x}from"./UniswapContextLoader";describe("UniswapContextLoader",()=>{const o={decode:vi.fn()},a={getTokenInfosPayload:vi.fn()};let n;describe("canHandle function",()=>{beforeEach(()=>{n=new x(new u(new b),a)});const e={data:"0x3593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000067a4855b",selector:c,chainId:1,to:d};it("should return true for valid input",()=>{expect(n.canHandle(e,[r.TOKEN,r.EXTERNAL_PLUGIN])).toBe(!0)}),it("should return false for invalid expected type",()=>{expect(n.canHandle(e,[r.NFT])).toBe(!1),expect(n.canHandle(e,[r.TOKEN])).toBe(!1),expect(n.canHandle(e,[r.EXTERNAL_PLUGIN])).toBe(!1)}),it.each([[null,"null input"],[void 0,"undefined input"],[{},"empty object"],["string","string input"],[123,"number input"],[{...e,data:void 0},"missing data"],[{...e,selector:void 0},"missing selector"],[{...e,chainId:void 0},"missing chainId"],[{...e,data:"invalid-hex"},"invalid data hex"],[{...e,data:"0x"},"empty data hex"],[{...e,selector:"invalid-hex"},"invalid selector hex"],[{...e,selector:"0x"},"empty selector hex"],[{...e,selector:"not-hex-at-all"},"non-hex selector"],[{...e,selector:0},"different selector"],[{...e,chainId:"1"},"string chainId"],[{...e,chainId:null},"null chainId"],[{...e,to:void 0},"missing to"],[{...e,to:"invalid-hex"},"invalid to hex"],[{...e,to:"0x"},"empty to hex"],[{...e,to:"0x0000000000000000000000000000000000000000"},"different to uniswap router address"]])("should return false for %s",(t,s)=>{expect(n.canHandle(t,[r.TOKEN])).toBe(!1)})}),describe("load",()=>{describe("with tokenDataSourceMock",()=>{beforeEach(()=>{vi.spyOn(a,"getTokenInfosPayload").mockImplementation(({address:e})=>Promise.resolve(f(`payload-${e}`))),n=new x(new u(new b),a)}),it("should return an empty array if the selector is not UNISWAP_EXECUTE_SELECTOR",async()=>{const e={to:d,selector:"0x00000000",data:"0x00000000",chainId:1},t=await n.load(e);expect(t).toEqual([])}),it("should return the external plugin context and the decoded contexts",async()=>{const e={chainId:1,data:"0x3593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000067a4855b000000000000000000000000000000000000000000000000000000000000000300060c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000a18f07d736b90be5500000000000000000000000000000000000000000000000000000000b0b8122abd8412900000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002bb9f599ce614feb2e1bbe58f180f370d05b39344e002710c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000017cc6042605381c158d2adab487434bde79aa61c000000000000000000000000000000000000000000000000000000000000005b000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000b0b8122abd84129c001a053efc49d03b694742500f49aa09df2360bd7e297fa730c745e0d4320b42fc33fa01ca1c85a46c561f624830fffbae2441ba0f2d54eb5b0f17e0e3561d10db0b7ee",selector:c,to:d},t=await n.load(e);expect(t).toEqual([{type:r.EXTERNAL_PLUGIN,payload:"07556e69737761703fc91a3afd70395cd496c647d5a6cc9d4b2b7fad3593564c3044022014391e8f355867a57fe88f6a5a4dbcb8bf8f888a9db3ff3449caf72d120396bd02200c13d9c3f79400fe0aa0434ac54d59b79503c9964a4abc3e8cd22763e0242935"},{type:"token",payload:"payload-0xb9f599ce614feb2e1bbe58f180f370d05b39344e"},{type:"token",payload:"payload-0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"}])}),it("should return the external plugin context and the decoded contexts with a permit",async()=>{const e={chainId:1,data:"0x3593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000669b9ec100000000000000000000000000000000000000000000000000000000000000030a010c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000016000000000000000000000000055747be9f9f5beb232ad59fe7af013b81d95fd5e000000000000000000000000ffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000066c32b0d0000000000000000000000000000000000000000000000000000000000000008000000000000000000000000ef1c6e67703c7bd7107eed8303fbe6ec2554bf6b00000000000000000000000000000000000000000000000000000000669b9ec100000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000410d756f55acf289e9754faf91bba0a704b5c7c0aa4b1dfd551115ccbe4c7f290234e1a14265e1da0bc872a23627d997fe37a689c290d519f7b8c9bdde1b79108e1b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000030ba49cbff5a00000000000000000000000000000000000000000000000089677c957272141800000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc200271055747be9f9f5beb232ad59fe7af013b81d95fd5e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000030ba49cbff5a000c001a0e406d9c91c8b46d959fcd31a28518a77bb248ebb316c5fab7b98335cce922f2aa0462cb970c32a8dbfe71c57b888c43b9ed04fce41d169dbfcc745445587adb771",selector:c,to:d},t=await n.load(e);expect(t).toEqual([{type:r.EXTERNAL_PLUGIN,payload:"07556e69737761703fc91a3afd70395cd496c647d5a6cc9d4b2b7fad3593564c3044022014391e8f355867a57fe88f6a5a4dbcb8bf8f888a9db3ff3449caf72d120396bd02200c13d9c3f79400fe0aa0434ac54d59b79503c9964a4abc3e8cd22763e0242935"},{type:"token",payload:"payload-0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"},{type:"token",payload:"payload-0x55747be9f9f5beb232ad59fe7af013b81d95fd5e"}])}),it("should return an empty array if the transaction is not supported",async()=>{const e={};vi.spyOn(o,"decode").mockReturnValue([]);const t=await n.load(e);expect(t).toEqual([])}),it("should return an empty array if a command is not supported",async()=>{const e={chainId:1,data:"0x3593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000067a4bef600000000000000000000000000000000000000000000000000000000000000050b0105040c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000078e6708e70aed0f000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000059a16770000000000000000000000000000000000000000000000000078e6708e70aed0f00000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002ba0b86991c6218b36c1d19d4a2e9eb0ce3606eb480001f4c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000027213e28d7fda5c57fe9e5dd923818dbccf71c4700000000000000000000000000000000000000000000000000000000003938700000000000000000000000000000000000000000000000000000000000000060000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000006f939b43d65be049b7533907db08e80ba6969f450000000000000000000000000000000000000000000000000000000059682f0000000000000000000000000000000000000000000000000000000000000000400000000000000000000000006f939b43d65be049b7533907db08e80ba6969f4500000000000000000000000000000000000000000000000000000000000000000cc080a07c86dd5813ec1f3725c402f8bea6105546d1093c59676023b971f1d83f61bd4ea02a353bf3028cabcbe68c5dc8906752bafe55afc86b6344edb3ffd8a3650332e8",selector:c,to:d},t=await n.load(e);expect(t).toEqual([])})}),describe("with mocked ethers parseTransaction",()=>{beforeEach(()=>{vi.resetAllMocks(),n=new x(o,a)}),it("should return an array with contexts if 2 chain swaps are supported",async()=>{const e={to:d,data:c,chainId:66,selector:c};vi.spyOn(p.prototype,"parseTransaction").mockReturnValue({args:["0x0809",["0x0001","0x0002"]]}),vi.spyOn(o,"decode").mockReturnValueOnce(["0x01","0x04","0x02"]).mockReturnValueOnce(["0x02","0x03"]),vi.spyOn(a,"getTokenInfosPayload").mockImplementation(({address:l})=>Promise.resolve(f(`payload-${l}`)));const s=await n.load(e);expect(o.decode).toHaveBeenNthCalledWith(1,i.V2_SWAP_EXACT_IN,"0x0001",66),expect(o.decode).toHaveBeenNthCalledWith(2,i.V2_SWAP_EXACT_OUT,"0x0002",66),expect(a.getTokenInfosPayload).toHaveBeenNthCalledWith(1,{address:"0x01",chainId:66}),expect(a.getTokenInfosPayload).toHaveBeenNthCalledWith(2,{address:"0x04",chainId:66}),expect(a.getTokenInfosPayload).toHaveBeenNthCalledWith(3,{address:"0x02",chainId:66}),expect(a.getTokenInfosPayload).toHaveBeenNthCalledWith(4,{address:"0x03",chainId:66}),expect(s).toEqual([{type:r.EXTERNAL_PLUGIN,payload:"07556e69737761703fc91a3afd70395cd496c647d5a6cc9d4b2b7fad3593564c3044022014391e8f355867a57fe88f6a5a4dbcb8bf8f888a9db3ff3449caf72d120396bd02200c13d9c3f79400fe0aa0434ac54d59b79503c9964a4abc3e8cd22763e0242935"},{type:"token",payload:"payload-0x01"},{type:"token",payload:"payload-0x04"},{type:"token",payload:"payload-0x02"},{type:"token",payload:"payload-0x03"}])}),it("should return an array with contexts if 1 chain swap with a non swap command",async()=>{const e={to:d,data:c,chainId:66,selector:c};vi.spyOn(p.prototype,"parseTransaction").mockReturnValue({args:["0x0b0004",["0x0001","0x0002","0x0003"]]}),vi.spyOn(o,"decode").mockReturnValueOnce(["0x01"]).mockReturnValueOnce(["0x02","0x03"]).mockReturnValueOnce(["0x04"]),vi.spyOn(a,"getTokenInfosPayload").mockImplementation(({address:l})=>Promise.resolve(f(`payload-${l}`)));const s=await n.load(e);expect(o.decode).toHaveBeenNthCalledWith(1,i.WRAP_ETH,"0x0001",66),expect(a.getTokenInfosPayload).toHaveBeenNthCalledWith(1,{address:"0x01",chainId:66}),expect(a.getTokenInfosPayload).toHaveBeenNthCalledWith(2,{address:"0x02",chainId:66}),expect(a.getTokenInfosPayload).toHaveBeenNthCalledWith(3,{address:"0x03",chainId:66}),expect(a.getTokenInfosPayload).toHaveBeenNthCalledWith(4,{address:"0x04",chainId:66}),expect(s).toEqual([{type:r.EXTERNAL_PLUGIN,payload:"07556e69737761703fc91a3afd70395cd496c647d5a6cc9d4b2b7fad3593564c3044022014391e8f355867a57fe88f6a5a4dbcb8bf8f888a9db3ff3449caf72d120396bd02200c13d9c3f79400fe0aa0434ac54d59b79503c9964a4abc3e8cd22763e0242935"},{type:"token",payload:"payload-0x01"},{type:"token",payload:"payload-0x02"},{type:"token",payload:"payload-0x03"},{type:"token",payload:"payload-0x04"}])}),it("should return an array with contexts if one token is not found",async()=>{const e={to:d,data:c,chainId:66,selector:c};vi.spyOn(p.prototype,"parseTransaction").mockReturnValue({args:["0x0809",["0x0001","0x0002"]]}),vi.spyOn(o,"decode").mockReturnValueOnce(["0x01","0x02"]).mockReturnValueOnce(["0x02","0x03"]),vi.spyOn(a,"getTokenInfosPayload").mockResolvedValueOnce(y("error")).mockImplementation(({address:l})=>Promise.resolve(f(`payload-${l}`)));const s=await n.load(e);expect(o.decode).toHaveBeenNthCalledWith(1,i.V2_SWAP_EXACT_IN,"0x0001",66),expect(o.decode).toHaveBeenNthCalledWith(2,i.V2_SWAP_EXACT_OUT,"0x0002",66),expect(a.getTokenInfosPayload).toHaveBeenNthCalledWith(1,{address:"0x01",chainId:66}),expect(a.getTokenInfosPayload).toHaveBeenNthCalledWith(2,{address:"0x02",chainId:66}),expect(a.getTokenInfosPayload).toHaveBeenNthCalledWith(3,{address:"0x03",chainId:66}),expect(s).toEqual([{type:r.EXTERNAL_PLUGIN,payload:"07556e69737761703fc91a3afd70395cd496c647d5a6cc9d4b2b7fad3593564c3044022014391e8f355867a57fe88f6a5a4dbcb8bf8f888a9db3ff3449caf72d120396bd02200c13d9c3f79400fe0aa0434ac54d59b79503c9964a4abc3e8cd22763e0242935"},{type:"error",error:"error"},{type:"token",payload:"payload-0x02"},{type:"token",payload:"payload-0x03"}])}),it("should return an empty array if the if 2 chain swaps are not supported",async()=>{const e={to:d,data:c,chainId:66,selector:c};vi.spyOn(p.prototype,"parseTransaction").mockReturnValue({args:["0x0809",["0x0001","0x0002"]]}),vi.spyOn(o,"decode").mockReturnValueOnce(["0x01","0x02"]),vi.spyOn(o,"decode").mockReturnValueOnce(["0x03","0x04"]);const s=await n.load(e);expect(o.decode).toHaveBeenNthCalledWith(1,i.V2_SWAP_EXACT_IN,"0x0001",66),expect(o.decode).toHaveBeenNthCalledWith(2,i.V2_SWAP_EXACT_OUT,"0x0002",66),expect(a.getTokenInfosPayload).not.toHaveBeenCalled(),expect(s).toEqual([])}),it("should return an empty array if no command are returned from parseTransaction",async()=>{const e={to:d,data:c,selector:c,chainId:1};vi.spyOn(p.prototype,"parseTransaction").mockReturnValue({args:[""]});const t=await n.load(e);expect(o.decode).not.toHaveBeenCalled(),expect(a.getTokenInfosPayload).not.toHaveBeenCalled(),expect(t).toEqual([])}),it("should return an empty array if no inputs are returned from parseTransaction",async()=>{const e={to:d,data:c,selector:c,chainId:1};vi.spyOn(p.prototype,"parseTransaction").mockReturnValue({args:["0x08",[]]}),vi.spyOn(o,"decode").mockReturnValue([]);const t=await n.load(e);expect(a.getTokenInfosPayload).not.toHaveBeenCalled(),expect(t).toEqual([])}),it("should return an empty array if parseTransaction throws an error",async()=>{const e={to:d,data:c,selector:c,chainId:1};vi.spyOn(p.prototype,"parseTransaction").mockImplementation(()=>{throw new Error});const t=await n.load(e);expect(o.decode).not.toHaveBeenCalled(),expect(a.getTokenInfosPayload).not.toHaveBeenCalled(),expect(t).toEqual([])}),it("should return an empty array if the swap is with multiple pool versions",async()=>{const e={to:d,data:c,chainId:66,selector:c};vi.spyOn(p.prototype,"parseTransaction").mockReturnValue({args:["0x080900",["0x00","0x01","0x02"]]}),vi.spyOn(o,"decode").mockReturnValue(["0x01","0x02"]);const s=await n.load(e);expect(o.decode).toHaveBeenNthCalledWith(1,i.V2_SWAP_EXACT_IN,"0x00",66),expect(o.decode).toHaveBeenNthCalledWith(2,i.V2_SWAP_EXACT_OUT,"0x01",66),expect(o.decode).toHaveBeenNthCalledWith(3,i.V3_SWAP_EXACT_IN,"0x02",66),expect(a.getTokenInfosPayload).not.toHaveBeenCalled(),expect(s).toEqual([])}),it("should return an empty array if the selector is not supported",async()=>{const e={to:d,data:"0x00000000",chainId:66,selector:c},t=await n.load(e);expect(o.decode).not.toHaveBeenCalled(),expect(a.getTokenInfosPayload).not.toHaveBeenCalled(),expect(t).toEqual([])}),it("should return an empty array if the length of the commands and inputs are different",async()=>{const e={to:d,data:c,chainId:66,selector:c};vi.spyOn(p.prototype,"parseTransaction").mockReturnValue({args:["0x0809",["0x0001"]]});const s=await n.load(e);expect(o.decode).not.toHaveBeenCalled(),expect(a.getTokenInfosPayload).not.toHaveBeenCalled(),expect(s).toEqual([])})})})});
|
|
1
|
+
import{Interface as r}from"ethers";import{Left as y,Right as p}from"purify-ts";import{ClearSignContextType as l}from"../../shared/model/ClearSignContext";import{UNISWAP_EXECUTE_SELECTOR as o,UniswapSupportedCommand as s}from"../../uniswap/constants/uniswap";import{DefaultCommandDecoderDataSource as x}from"../../uniswap/data/DefaultCommandDecoderDataSource";import{EthersAbiDecoderDataSource as u}from"../../uniswap/data/EthersAbiDecoderDataSource";import{UniswapContextLoader as f}from"./UniswapContextLoader";describe("UniswapContextLoader",()=>{const n={decode:vi.fn()},a={getTokenInfosPayload:vi.fn()};let c;describe("canHandle function",()=>{beforeEach(()=>{c=new f(new x(new u),a)});const e={data:"0x3593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000067a4855b",selector:o,chainId:1};it("should return true for valid input",()=>{expect(c.canHandle(e,[l.TOKEN])).toBe(!0)}),it("should return false for invalid expected type",()=>{expect(c.canHandle(e,[l.NFT])).toBe(!1),expect(c.canHandle(e,[l.EXTERNAL_PLUGIN])).toBe(!1)}),it.each([[null,"null input"],[void 0,"undefined input"],[{},"empty object"],["string","string input"],[123,"number input"],[{...e,data:void 0},"missing data"],[{...e,selector:void 0},"missing selector"],[{...e,chainId:void 0},"missing chainId"],[{...e,data:"invalid-hex"},"invalid data hex"],[{...e,data:"0x"},"empty data hex"],[{...e,selector:"invalid-hex"},"invalid selector hex"],[{...e,selector:"0x"},"empty selector hex"],[{...e,selector:"not-hex-at-all"},"non-hex selector"],[{...e,selector:0},"different selector"],[{...e,chainId:"1"},"string chainId"],[{...e,chainId:null},"null chainId"]])("should return false for %s",(t,d)=>{expect(c.canHandle(t,[l.TOKEN])).toBe(!1)})}),describe("load",()=>{describe("with tokenDataSourceMock",()=>{beforeEach(()=>{vi.spyOn(a,"getTokenInfosPayload").mockImplementation(({address:e})=>Promise.resolve(p(`payload-${e}`))),c=new f(new x(new u),a)}),it("should return an empty array if the selector is not UNISWAP_EXECUTE_SELECTOR",async()=>{const e={selector:"0x00000000",data:"0x00000000",chainId:1},t=await c.load(e);expect(t).toEqual([])}),it("should return the decoded contexts",async()=>{const e={chainId:1,data:"0x3593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000067a4855b000000000000000000000000000000000000000000000000000000000000000300060c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000a18f07d736b90be5500000000000000000000000000000000000000000000000000000000b0b8122abd8412900000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002bb9f599ce614feb2e1bbe58f180f370d05b39344e002710c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000017cc6042605381c158d2adab487434bde79aa61c000000000000000000000000000000000000000000000000000000000000005b000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000b0b8122abd84129c001a053efc49d03b694742500f49aa09df2360bd7e297fa730c745e0d4320b42fc33fa01ca1c85a46c561f624830fffbae2441ba0f2d54eb5b0f17e0e3561d10db0b7ee",selector:o},t=await c.load(e);expect(t).toEqual([{type:"token",payload:"payload-0xb9f599ce614feb2e1bbe58f180f370d05b39344e"},{type:"token",payload:"payload-0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"}])}),it("should return the decoded contexts with a permit",async()=>{const e={chainId:1,data:"0x3593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000669b9ec100000000000000000000000000000000000000000000000000000000000000030a010c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000016000000000000000000000000055747be9f9f5beb232ad59fe7af013b81d95fd5e000000000000000000000000ffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000066c32b0d0000000000000000000000000000000000000000000000000000000000000008000000000000000000000000ef1c6e67703c7bd7107eed8303fbe6ec2554bf6b00000000000000000000000000000000000000000000000000000000669b9ec100000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000410d756f55acf289e9754faf91bba0a704b5c7c0aa4b1dfd551115ccbe4c7f290234e1a14265e1da0bc872a23627d997fe37a689c290d519f7b8c9bdde1b79108e1b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000030ba49cbff5a00000000000000000000000000000000000000000000000089677c957272141800000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002bc02aaa39b223fe8d0a0e5c4f27ead9083c756cc200271055747be9f9f5beb232ad59fe7af013b81d95fd5e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000030ba49cbff5a000c001a0e406d9c91c8b46d959fcd31a28518a77bb248ebb316c5fab7b98335cce922f2aa0462cb970c32a8dbfe71c57b888c43b9ed04fce41d169dbfcc745445587adb771",selector:o},t=await c.load(e);expect(t).toEqual([{type:"token",payload:"payload-0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"},{type:"token",payload:"payload-0x55747be9f9f5beb232ad59fe7af013b81d95fd5e"}])}),it("should return an empty array if the transaction is not supported",async()=>{const e={};vi.spyOn(n,"decode").mockReturnValue([]);const t=await c.load(e);expect(t).toEqual([])}),it("should return an empty array if a command is not supported",async()=>{const e={chainId:1,data:"0x3593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000067a4bef600000000000000000000000000000000000000000000000000000000000000050b0105040c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000078e6708e70aed0f000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000059a16770000000000000000000000000000000000000000000000000078e6708e70aed0f00000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002ba0b86991c6218b36c1d19d4a2e9eb0ce3606eb480001f4c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000027213e28d7fda5c57fe9e5dd923818dbccf71c4700000000000000000000000000000000000000000000000000000000003938700000000000000000000000000000000000000000000000000000000000000060000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000006f939b43d65be049b7533907db08e80ba6969f450000000000000000000000000000000000000000000000000000000059682f0000000000000000000000000000000000000000000000000000000000000000400000000000000000000000006f939b43d65be049b7533907db08e80ba6969f4500000000000000000000000000000000000000000000000000000000000000000cc080a07c86dd5813ec1f3725c402f8bea6105546d1093c59676023b971f1d83f61bd4ea02a353bf3028cabcbe68c5dc8906752bafe55afc86b6344edb3ffd8a3650332e8",selector:o},t=await c.load(e);expect(t).toEqual([])})}),describe("with mocked ethers parseTransaction",()=>{beforeEach(()=>{vi.resetAllMocks(),c=new f(n,a)}),it("should return an array with contexts if 2 chain swaps are supported",async()=>{const e={data:o,chainId:66,selector:o};vi.spyOn(r.prototype,"parseTransaction").mockReturnValue({args:["0x0809",["0x0001","0x0002"]]}),vi.spyOn(n,"decode").mockReturnValueOnce(["0x01","0x04","0x02"]).mockReturnValueOnce(["0x02","0x03"]),vi.spyOn(a,"getTokenInfosPayload").mockImplementation(({address:i})=>Promise.resolve(p(`payload-${i}`)));const d=await c.load(e);expect(n.decode).toHaveBeenNthCalledWith(1,s.V2_SWAP_EXACT_IN,"0x0001",66),expect(n.decode).toHaveBeenNthCalledWith(2,s.V2_SWAP_EXACT_OUT,"0x0002",66),expect(a.getTokenInfosPayload).toHaveBeenNthCalledWith(1,{address:"0x01",chainId:66}),expect(a.getTokenInfosPayload).toHaveBeenNthCalledWith(2,{address:"0x04",chainId:66}),expect(a.getTokenInfosPayload).toHaveBeenNthCalledWith(3,{address:"0x02",chainId:66}),expect(a.getTokenInfosPayload).toHaveBeenNthCalledWith(4,{address:"0x03",chainId:66}),expect(d).toEqual([{type:"token",payload:"payload-0x01"},{type:"token",payload:"payload-0x04"},{type:"token",payload:"payload-0x02"},{type:"token",payload:"payload-0x03"}])}),it("should return an array with contexts if 1 chain swap with a non swap command",async()=>{const e={data:o,chainId:66,selector:o};vi.spyOn(r.prototype,"parseTransaction").mockReturnValue({args:["0x0b0004",["0x0001","0x0002","0x0003"]]}),vi.spyOn(n,"decode").mockReturnValueOnce(["0x01"]).mockReturnValueOnce(["0x02","0x03"]).mockReturnValueOnce(["0x04"]),vi.spyOn(a,"getTokenInfosPayload").mockImplementation(({address:i})=>Promise.resolve(p(`payload-${i}`)));const d=await c.load(e);expect(n.decode).toHaveBeenNthCalledWith(1,s.WRAP_ETH,"0x0001",66),expect(a.getTokenInfosPayload).toHaveBeenNthCalledWith(1,{address:"0x01",chainId:66}),expect(a.getTokenInfosPayload).toHaveBeenNthCalledWith(2,{address:"0x02",chainId:66}),expect(a.getTokenInfosPayload).toHaveBeenNthCalledWith(3,{address:"0x03",chainId:66}),expect(a.getTokenInfosPayload).toHaveBeenNthCalledWith(4,{address:"0x04",chainId:66}),expect(d).toEqual([{type:"token",payload:"payload-0x01"},{type:"token",payload:"payload-0x02"},{type:"token",payload:"payload-0x03"},{type:"token",payload:"payload-0x04"}])}),it("should return an array with contexts if one token is not found",async()=>{const e={data:o,chainId:66,selector:o};vi.spyOn(r.prototype,"parseTransaction").mockReturnValue({args:["0x0809",["0x0001","0x0002"]]}),vi.spyOn(n,"decode").mockReturnValueOnce(["0x01","0x02"]).mockReturnValueOnce(["0x02","0x03"]),vi.spyOn(a,"getTokenInfosPayload").mockResolvedValueOnce(y("error")).mockImplementation(({address:i})=>Promise.resolve(p(`payload-${i}`)));const d=await c.load(e);expect(n.decode).toHaveBeenNthCalledWith(1,s.V2_SWAP_EXACT_IN,"0x0001",66),expect(n.decode).toHaveBeenNthCalledWith(2,s.V2_SWAP_EXACT_OUT,"0x0002",66),expect(a.getTokenInfosPayload).toHaveBeenNthCalledWith(1,{address:"0x01",chainId:66}),expect(a.getTokenInfosPayload).toHaveBeenNthCalledWith(2,{address:"0x02",chainId:66}),expect(a.getTokenInfosPayload).toHaveBeenNthCalledWith(3,{address:"0x03",chainId:66}),expect(d).toEqual([{type:"error",error:"error"},{type:"token",payload:"payload-0x02"},{type:"token",payload:"payload-0x03"}])}),it("should return an empty array if the if 2 chain swaps are not supported",async()=>{const e={data:o,chainId:66,selector:o};vi.spyOn(r.prototype,"parseTransaction").mockReturnValue({args:["0x0809",["0x0001","0x0002"]]}),vi.spyOn(n,"decode").mockReturnValueOnce(["0x01","0x02"]),vi.spyOn(n,"decode").mockReturnValueOnce(["0x03","0x04"]);const d=await c.load(e);expect(n.decode).toHaveBeenNthCalledWith(1,s.V2_SWAP_EXACT_IN,"0x0001",66),expect(n.decode).toHaveBeenNthCalledWith(2,s.V2_SWAP_EXACT_OUT,"0x0002",66),expect(a.getTokenInfosPayload).not.toHaveBeenCalled(),expect(d).toEqual([])}),it("should return an empty array if no command are returned from parseTransaction",async()=>{const e={data:o,selector:o,chainId:1};vi.spyOn(r.prototype,"parseTransaction").mockReturnValue({args:[""]});const t=await c.load(e);expect(n.decode).not.toHaveBeenCalled(),expect(a.getTokenInfosPayload).not.toHaveBeenCalled(),expect(t).toEqual([])}),it("should return an empty array if no inputs are returned from parseTransaction",async()=>{const e={data:o,selector:o,chainId:1};vi.spyOn(r.prototype,"parseTransaction").mockReturnValue({args:["0x08",[]]}),vi.spyOn(n,"decode").mockReturnValue([]);const t=await c.load(e);expect(a.getTokenInfosPayload).not.toHaveBeenCalled(),expect(t).toEqual([])}),it("should return an empty array if parseTransaction throws an error",async()=>{const e={data:o,selector:o,chainId:1};vi.spyOn(r.prototype,"parseTransaction").mockImplementation(()=>{throw new Error});const t=await c.load(e);expect(n.decode).not.toHaveBeenCalled(),expect(a.getTokenInfosPayload).not.toHaveBeenCalled(),expect(t).toEqual([])}),it("should return an empty array if the swap is with multiple pool versions",async()=>{const e={data:o,chainId:66,selector:o};vi.spyOn(r.prototype,"parseTransaction").mockReturnValue({args:["0x080900",["0x00","0x01","0x02"]]}),vi.spyOn(n,"decode").mockReturnValue(["0x01","0x02"]);const d=await c.load(e);expect(n.decode).toHaveBeenNthCalledWith(1,s.V2_SWAP_EXACT_IN,"0x00",66),expect(n.decode).toHaveBeenNthCalledWith(2,s.V2_SWAP_EXACT_OUT,"0x01",66),expect(n.decode).toHaveBeenNthCalledWith(3,s.V3_SWAP_EXACT_IN,"0x02",66),expect(a.getTokenInfosPayload).not.toHaveBeenCalled(),expect(d).toEqual([])}),it("should return an empty array if the selector is not supported",async()=>{const e={data:"0x00000000",chainId:66,selector:o},t=await c.load(e);expect(n.decode).not.toHaveBeenCalled(),expect(a.getTokenInfosPayload).not.toHaveBeenCalled(),expect(t).toEqual([])}),it("should return an empty array if the length of the commands and inputs are different",async()=>{const e={data:o,chainId:66,selector:o};vi.spyOn(r.prototype,"parseTransaction").mockReturnValue({args:["0x0809",["0x0001"]]});const d=await c.load(e);expect(n.decode).not.toHaveBeenCalled(),expect(a.getTokenInfosPayload).not.toHaveBeenCalled(),expect(d).toEqual([])})})})});
|
|
2
2
|
//# sourceMappingURL=UniswapContextLoader.test.js.map
|