{"openapi":"3.0.0","paths":{"/health/status":{"get":{"operationId":"HealthController_check","summary":"Check health status","description":"Get health status of the application including database and memory health","parameters":[],"responses":{"200":{"description":"The Health Check is successful","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","example":"ok"},"info":{"type":"object","example":{"database":{"status":"up"}},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true},"nullable":true},"error":{"type":"object","example":{},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true},"nullable":true},"details":{"type":"object","example":{"database":{"status":"up"}},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true}}}}}}},"503":{"description":"The Health Check is not successful","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","example":"error"},"info":{"type":"object","example":{"database":{"status":"up"}},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true},"nullable":true},"error":{"type":"object","example":{"redis":{"status":"down","message":"Could not connect"}},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true},"nullable":true},"details":{"type":"object","example":{"database":{"status":"up"},"redis":{"status":"down","message":"Could not connect"}},"additionalProperties":{"type":"object","required":["status"],"properties":{"status":{"type":"string"}},"additionalProperties":true}}}}}}}},"tags":["Health","Health"]}},"/v1/notifications":{"get":{"operationId":"NotificationController_getNotifications","summary":"Get notifications","description":"Retrieve notifications for a device with pagination","parameters":[{"name":"device-id","required":true,"in":"header","description":"Unique identifier of the device","schema":{"type":"string"}},{"name":"offset","required":false,"in":"query","description":"Pagination offset","schema":{"example":0,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Pagination limit","schema":{"example":50,"type":"number"}}],"responses":{"200":{"description":"Notifications retrieved successfully","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"type":{"type":"string","enum":["transaction","security","system"]},"title":{"type":"string"},"message":{"type":"string"},"read":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"}}}},"total":{"type":"number"}}},"example":{"items":[{"id":"123e4567-e89b-12d3-a456-426614174000","title":"Transaction Confirmed","message":"Your transaction has been confirmed","type":"transaction_confirmed","read":false,"createdAt":"2023-01-01T00:00:00.000Z"}],"total":2}}}},"403":{"description":"Device is not authorized","content":{"application/json":{"example":{"statusCode":403,"message":"Device is not authorized","error":"Forbidden"}}}}},"tags":["Notifications","Notifications"]}},"/v1/notifications/{id}":{"get":{"operationId":"NotificationController_getNotification","summary":"Get notification","description":"Retrieve a specific notification by ID","parameters":[{"name":"device-id","required":true,"in":"header","description":"Unique identifier of the device","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","description":"Notification ID","schema":{"format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","type":"string"}}],"responses":{"200":{"description":"Notification retrieved successfully","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"type":{"type":"string","enum":["transaction","security","system"]},"title":{"type":"string"},"message":{"type":"string"},"read":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"}}},"example":{"id":"123e4567-e89b-12d3-a456-426614174000","type":"transaction","title":"Transaction Confirmed","message":"Your transfer of 1.5 ETH has been confirmed","read":false,"createdAt":"2024-01-20T10:30:00Z"}}}},"403":{"description":"Device is not authorized","content":{"application/json":{"example":{"statusCode":403,"message":"Device is not authorized","error":"Forbidden"}}}},"404":{"description":"Notification not found","content":{"application/json":{"example":{"statusCode":404,"message":"Notification not found","error":"Not Found"}}}}},"tags":["Notifications","Notifications"]}},"/v1/notifications/{id}/read":{"put":{"operationId":"NotificationController_markAsRead","summary":"Mark notification as read","description":"Mark a notification as read","parameters":[{"name":"device-id","required":true,"in":"header","description":"Unique identifier of the device","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","description":"Notification ID","schema":{"format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","type":"string"}}],"responses":{"200":{"description":"Notification marked as read successfully","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"read":{"type":"boolean"},"updatedAt":{"type":"string","format":"date-time"}}},"example":{"id":"123e4567-e89b-12d3-a456-426614174000","read":true,"updatedAt":"2024-01-20T10:35:00Z"}}}},"404":{"description":"Notification not found","content":{"application/json":{"example":{"statusCode":404,"message":"Notification not found","error":"Not Found"}}}}},"tags":["Notifications","Notifications"]}},"/v1/notifications/read-all":{"put":{"operationId":"NotificationController_markAllAsRead","summary":"Mark all notifications as read","description":"Mark all notifications for a device as read","parameters":[{"name":"device-id","required":true,"in":"header","description":"Unique identifier of the device","schema":{"type":"string"}}],"responses":{"200":{"description":"All notifications marked as read successfully","content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"number"},"updatedAt":{"type":"string","format":"date-time"}}},"example":{"count":5,"updatedAt":"2024-01-20T10:35:00Z"}}}},"403":{"description":"Device is not authorized","content":{"application/json":{"example":{"statusCode":403,"message":"Device is not authorized","error":"Forbidden"}}}}},"tags":["Notifications","Notifications"]}},"/v1/platforms":{"get":{"operationId":"PlatformController_getPlatforms","summary":"Get platforms","description":"Get list of supported blockchain platforms","parameters":[{"name":"includeDisabled","required":false,"in":"query","description":"Include disabled platforms in the response","schema":{"example":false,"type":"boolean"}}],"responses":{"200":{"description":"List of platforms retrieved successfully","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"enabled":{"type":"boolean"},"nativeToken":{"type":"object","properties":{"symbol":{"type":"string"},"decimals":{"type":"number"}}}}}},"example":[{"id":"ethereum","name":"Ethereum","enabled":true,"nativeToken":{"symbol":"ETH","decimals":18}},{"id":"polygon","name":"Polygon","enabled":true,"nativeToken":{"symbol":"MATIC","decimals":18}}]}}}},"tags":["Platforms","Platforms"]}},"/v1/platforms/{id}/priority-fees":{"get":{"operationId":"PlatformController_getPriorityFees","summary":"Get priority fees","description":"Get priority fee information for a platform","parameters":[{"name":"id","required":true,"in":"path","description":"Platform ID","schema":{"example":"ethereum","type":"string"}}],"responses":{"200":{"description":"Priority fees retrieved successfully","content":{"application/json":{"schema":{"type":"object","properties":{"slow":{"type":"object","properties":{"maxFeePerGas":{"type":"string"},"maxPriorityFeePerGas":{"type":"string"}}},"standard":{"type":"object","properties":{"maxFeePerGas":{"type":"string"},"maxPriorityFeePerGas":{"type":"string"}}},"fast":{"type":"object","properties":{"maxFeePerGas":{"type":"string"},"maxPriorityFeePerGas":{"type":"string"}}}}},"example":{"slow":{"maxFeePerGas":"20000000000","maxPriorityFeePerGas":"1000000000"},"standard":{"maxFeePerGas":"25000000000","maxPriorityFeePerGas":"1500000000"},"fast":{"maxFeePerGas":"30000000000","maxPriorityFeePerGas":"2000000000"}}}}},"404":{"description":"Platform not found","content":{"application/json":{"example":{"statusCode":404,"message":"Platform not found","error":"Not Found"}}}}},"tags":["Platforms","Platforms"]}},"/v1/platforms/{id}/estimate-fees":{"post":{"operationId":"PlatformController_estimateFees","summary":"Estimate fees","description":"Estimate transaction fees for a platform","parameters":[{"name":"id","required":true,"in":"path","description":"Platform ID","schema":{"example":"ethereum","type":"string"}}],"requestBody":{"required":true,"description":"Transaction data","content":{"application/json":{"schema":{"type":"object","properties":{"from":{"type":"string","description":"Sender address","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"},"to":{"type":"string","description":"Recipient address","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"},"value":{"type":"string","description":"Transaction value in wei","example":"1000000000000000000"},"data":{"type":"string","description":"Transaction data","example":"0x"}},"required":["from","to","value"]}}}},"responses":{"200":{"description":"Fee estimation completed successfully","content":{"application/json":{"examples":{"ethereum":{"summary":"Ethereum fee estimate","value":{"gasLimit":"21000","maxFeePerGas":"25000000000","maxPriorityFeePerGas":"1500000000"}},"polygon":{"summary":"Polygon fee estimate","value":{"gasLimit":"21000","maxFeePerGas":"100000000000","maxPriorityFeePerGas":"30000000000"}}}}}},"201":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Platform not found or not supported"}},"tags":["Platforms","Platforms"]}},"/v1/tokens":{"get":{"operationId":"TokenController_getTokens","summary":"Get tokens or contracts","description":"Retrieve a list of tokens or token contracts with pagination","parameters":[{"name":"platformId","required":true,"in":"query","description":"ID of the blockchain platform","schema":{"example":"ethereum","type":"string"}},{"name":"offset","required":false,"in":"query","description":"Pagination offset","schema":{"example":0,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Pagination limit","schema":{"example":50,"type":"number"}},{"name":"includeDisabled","required":false,"in":"query","description":"Include disabled tokens in the response","schema":{"example":false,"type":"boolean"}},{"name":"returnContracts","required":false,"in":"query","description":"Return token contract information instead of tokens","schema":{"example":false,"type":"boolean"}}],"responses":{"200":{"description":"List of tokens or contracts retrieved successfully","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"symbol":{"type":"string"},"decimals":{"type":"number"},"contractAddress":{"type":"string"},"platformId":{"type":"string"},"enabled":{"type":"boolean"},"logoUrl":{"type":"string"}}}},"total":{"type":"number"}}},"examples":{"tokens":{"summary":"List of tokens","value":{"items":[{"id":"123e4567-e89b-12d3-a456-426614174000","name":"Ethereum","symbol":"ETH","decimals":18,"contractAddress":null,"platformId":"ethereum","enabled":true,"logoUrl":"https://example.com/eth-logo.png"},{"id":"123e4567-e89b-12d3-a456-426614174001","name":"USD Coin","symbol":"USDC","decimals":6,"contractAddress":"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48","platformId":"ethereum","enabled":true,"logoUrl":"https://example.com/usdc-logo.png"}],"total":2}},"contracts":{"summary":"List of token contracts","value":{"items":[{"id":"123e4567-e89b-12d3-a456-426614174002","contractAddress":"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48","platformId":"ethereum","enabled":true,"type":"erc20"}],"total":1}}}}}},"400":{"description":"Invalid query parameters","content":{"application/json":{"examples":{"invalidPlatform":{"summary":"Invalid platform ID","value":{"statusCode":400,"message":"Invalid platform ID","error":"Bad Request"}},"invalidPagination":{"summary":"Invalid pagination parameters","value":{"statusCode":400,"message":["limit must be a positive number"],"error":"Bad Request"}}}}}}},"tags":["Tokens","Tokens"]}},"/v1/devices/new":{"post":{"operationId":"DeviceController_addNewDevice","summary":"Register new device","description":"Register a new device with the application","parameters":[],"requestBody":{"required":true,"description":"Device registration details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDeviceDto"},"examples":{"ios":{"summary":"iOS Device","value":{"devicePlatform":"ios","appVersion":"1.2.0","deviceToken":"c4d6e8f0-a2b4-4c6d-8e0f-2a4b6c8d0e2f"}},"android":{"summary":"Android Device","value":{"devicePlatform":"android","appVersion":"1.2.1","deviceToken":"a1b3c5d7-e9f2-4a6b-8c0d-2e4f6a8c0e2d"}}}}}},"responses":{"201":{"description":"Device registered successfully","content":{"application/json":{"schema":{"type":"object","properties":{"deviceId":{"type":"string","format":"uuid","description":"Unique identifier for the device"},"devicePlatform":{"type":"string","enum":["ios","android"],"description":"Platform of the device"},"createdAt":{"type":"string","format":"date-time","description":"Device registration timestamp"}}},"example":{"deviceId":"b2c4d6e8-f0a2-4b6c-8e0f-2a4b6c8d0e2f","devicePlatform":"ios","createdAt":"2025-06-19T19:38:02.000Z"}}}},"400":{"description":"Invalid device registration parameters","content":{"application/json":{"example":{"statusCode":400,"message":["devicePlatform must be one of the following values: ios, android"],"error":"Bad Request"}}}}},"tags":["Devices","Devices"]}},"/v1/devices/use":{"put":{"operationId":"DeviceController_useDevice","summary":"Use device","description":"Update device usage information and get version requirements","parameters":[{"name":"device-id","required":true,"in":"header","description":"Unique identifier of the device","schema":{"type":"string","format":"uuid","example":"b2c4d6e8-f0a2-4b6c-8e0f-2a4b6c8d0e2f"}}],"requestBody":{"required":true,"description":"Device usage details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UseDeviceDto"},"examples":{"ios":{"summary":"iOS Device Update","value":{"appVersion":"1.2.0","deviceToken":"c4d6e8f0-a2b4-4c6d-8e0f-2a4b6c8d0e2f"}},"android":{"summary":"Android Device Update","value":{"appVersion":"1.2.1","deviceToken":"a1b3c5d7-e9f2-4a6b-8c0d-2e4f6a8c0e2d"}}}}}},"responses":{"200":{"description":"Device usage updated successfully","content":{"application/json":{"schema":{"type":"object","properties":{"devicePlatform":{"type":"string","enum":["ios","android"],"description":"Platform of the device"},"minRequiredVersion":{"type":"string","description":"Minimum required app version for this platform"}}},"examples":{"ios":{"summary":"iOS Version Requirements","value":{"devicePlatform":"ios","minRequiredVersion":"1.0.0"}},"android":{"summary":"Android Version Requirements","value":{"devicePlatform":"android","minRequiredVersion":"1.1.0"}}}}}},"400":{"description":"Invalid device usage parameters","content":{"application/json":{"example":{"statusCode":400,"message":["appVersion must be a valid semver version"],"error":"Bad Request"}}}},"403":{"description":"Device is not authorized","content":{"application/json":{"example":{"statusCode":403,"message":"Device not found or not authorized","error":"Forbidden"}}}}},"tags":["Devices","Devices"]}},"/v1/wallet/addresses":{"post":{"operationId":"WalletController_saveWalletAddresses","summary":"Save wallet addresses","description":"Save a list of wallet addresses associated with a device","parameters":[{"name":"device-id","required":true,"in":"header","description":"Unique identifier of the device","schema":{"type":"string"}}],"requestBody":{"required":true,"description":"List of wallet addresses to save","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletAddressListDto"}}}},"responses":{"200":{"description":"Wallet addresses saved successfully"},"201":{"description":""},"403":{"description":"Device is not authorized"}},"tags":["Wallet addresses","Wallet addresses"]}},"/v1/wallet/addresses/{address}/balances":{"get":{"operationId":"WalletController_getBalances","summary":"Get wallet balances","description":"Retrieve balances for a specific wallet address","parameters":[{"name":"device-id","required":true,"in":"header","description":"Unique identifier of the device","schema":{"type":"string"}},{"name":"address","required":true,"in":"path","description":"Wallet address","schema":{"type":"string"}},{"name":"platformId","required":true,"in":"query","description":"Platform identifier","schema":{"type":"string"}},{"name":"contracts","required":false,"in":"query","description":"Comma-separated list of token contract IDs","schema":{"type":"string"}}],"responses":{"200":{"description":"Balances retrieved successfully"},"403":{"description":"Device is not authorized to access this address"}},"tags":["Wallet addresses","Wallet addresses"]}},"/v1/wallet/addresses/{address}/nonce":{"get":{"operationId":"WalletController_getNonce","summary":"Get wallet nonce","description":"Retrieve the current nonce for a wallet address","parameters":[{"name":"device-id","required":true,"in":"header","description":"Unique identifier of the device","schema":{"type":"string"}},{"name":"address","required":true,"in":"path","description":"Wallet address","schema":{"type":"string"}},{"name":"platformId","required":true,"in":"query","description":"Platform identifier","schema":{"type":"string"}}],"responses":{"200":{"description":"Nonce retrieved successfully"},"403":{"description":"Device is not authorized to access this address"}},"tags":["Wallet addresses","Wallet addresses"]}},"/v1/wallet/addresses/{address}/info":{"get":{"operationId":"WalletController_getAccountInfo","parameters":[{"name":"address","required":true,"in":"path","schema":{"type":"string"}},{"name":"platformId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Wallet addresses"]}},"/v1/wallet/addresses/{address}/staking":{"get":{"operationId":"WalletController_getNativeStaking","parameters":[{"name":"device-id","required":true,"in":"header","schema":{"type":"string"}},{"name":"address","required":true,"in":"path","schema":{"type":"string"}},{"name":"platformId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Wallet addresses"]}},"/v1/wallet/addresses/{address}/send-tx":{"post":{"operationId":"WalletController_sendTransaction","parameters":[{"name":"device-id","required":true,"in":"header","schema":{"type":"string"}},{"name":"address","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendTransactionDto"}}}},"responses":{"201":{"description":""}},"tags":["Wallet addresses"]}},"/v1/wallet/blockhash":{"get":{"operationId":"WalletController_getLatestBlockhash","parameters":[{"name":"platformId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"string"}}}}},"tags":["Wallet addresses"]}},"/v1/swap/quote":{"post":{"operationId":"SwapController_getSwapQuote","summary":"Get swap quote","description":"Get a quote for swapping tokens","parameters":[{"name":"fromTokenId","required":true,"in":"query","description":"ID of the source token","schema":{"example":"123e4567-e89b-12d3-a456-426614174000","type":"string"}},{"name":"toTokenId","required":true,"in":"query","description":"ID of the destination token","schema":{"example":"123e4567-e89b-12d3-a456-426614174001","type":"string"}},{"name":"amount","required":true,"in":"query","description":"Amount of source token to swap (in wei)","schema":{"example":"1000000000000000000","type":"string"}},{"name":"slippage","required":false,"in":"query","description":"Maximum allowed slippage percentage","schema":{"example":0.5,"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteRequestDto"}}}},"responses":{"200":{"description":"Quote retrieved successfully","content":{"application/json":{"schema":{"type":"object","properties":{"fromToken":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"symbol":{"type":"string"},"decimals":{"type":"number"}}},"toToken":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"symbol":{"type":"string"},"decimals":{"type":"number"}}},"fromAmount":{"type":"string"},"toAmount":{"type":"string"},"exchangeRate":{"type":"string"},"priceImpact":{"type":"string"},"fee":{"type":"string"},"route":{"type":"array","items":{"type":"object","properties":{"protocol":{"type":"string"},"fromToken":{"type":"string"},"toToken":{"type":"string"},"share":{"type":"number"}}}}}},"example":{"fromToken":{"id":"123e4567-e89b-12d3-a456-426614174000","symbol":"ETH","decimals":18},"toToken":{"id":"123e4567-e89b-12d3-a456-426614174001","symbol":"USDC","decimals":6},"fromAmount":"1000000000000000000","toAmount":"1850000000","exchangeRate":"1850.00","priceImpact":"0.15","fee":"0.003","route":[{"protocol":"Uniswap V3","fromToken":"ETH","toToken":"USDC","share":100}]}}}},"201":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid query parameters","content":{"application/json":{"examples":{"invalidToken":{"summary":"Invalid token ID","value":{"statusCode":400,"message":"Invalid token ID","error":"Bad Request"}},"invalidAmount":{"summary":"Invalid amount","value":{"statusCode":400,"message":"Amount must be a valid number string","error":"Bad Request"}}}}}}},"tags":["Swaps","Swap"]}},"/v1/swap/tx":{"post":{"operationId":"SwapController_getSwapTransaction","summary":"Get swap transaction","description":"Get transaction data for a token swap","parameters":[{"name":"device-id","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwapTxRequestDto"}}}},"responses":{"200":{"description":"Swap transaction data retrieved successfully","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"string","description":"Transaction data"},"value":{"type":"string","description":"Transaction value in wei"},"to":{"type":"string","description":"Target contract address"},"gasLimit":{"type":"string","description":"Gas limit for the transaction"}}}}}},"201":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}},"403":{"description":"Device is not authorized to access this address"}},"tags":["Swaps","Swap"]}},"/v1/tx/op/webhook":{"post":{"operationId":"TxController_operationWebhook","summary":"Operation webhook","description":"Handle incoming operation webhook for transaction processing","parameters":[],"responses":{"200":{"description":"Operation processed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"txId":{"type":"number"}}},"example":{"success":true,"txId":12345}}}},"201":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Invalid operation data","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}},"example":{"error":"Invalid operation format"}}}}},"tags":["Transactions","Transactions"]}},"/v1/tx/history/{txId}":{"get":{"operationId":"TxController_getTransactionDetailsV2","summary":"Get transaction details","description":"Retrieve detailed information about a specific transaction","parameters":[{"name":"device-id","required":true,"in":"header","description":"Device ID","schema":{"type":"string"}},{"name":"address","required":true,"in":"query","description":"Wallet address","schema":{"type":"string"}},{"name":"txId","required":true,"in":"path","description":"Transaction ID","schema":{"type":"number"}}],"responses":{"200":{"description":"Transaction details retrieved successfully","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"number"},"hash":{"type":"string"},"status":{"type":"string","enum":["pending","confirmed","failed"]},"tokenContractId":{"type":"number"},"fromAddress":{"type":"string"},"toAddress":{"type":"string"},"amount":{"type":"string"},"fee":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}}}},"403":{"description":"Device is not authorized to access this address"},"404":{"description":"Transaction not found"}},"tags":["Transactions","Transactions"]}},"/v1/tx/history":{"get":{"operationId":"TxController_getTransactionsHistory","summary":"Get transaction history","description":"Retrieve transaction history for a device or address","parameters":[{"name":"device-id","required":true,"in":"header","description":"Device ID","schema":{"type":"string"}},{"name":"address","required":false,"in":"query","description":"Wallet address","schema":{"type":"string"}},{"name":"tokenContractId","required":false,"in":"query","description":"Token contract ID","schema":{"type":"number"}},{"name":"platformId","required":false,"in":"query","description":"Platform ID","schema":{"type":"string"}},{"name":"offset","required":false,"in":"query","description":"Pagination offset","schema":{"example":0,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Pagination limit","schema":{"example":50,"type":"number"}}],"responses":{"200":{"description":"Transaction history retrieved successfully","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number"},"hash":{"type":"string"},"status":{"type":"string","enum":["pending","confirmed","failed"]},"tokenContractId":{"type":"number"},"fromAddress":{"type":"string"},"toAddress":{"type":"string"},"amount":{"type":"string"},"fee":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}}},"total":{"type":"number"}}}}}},"403":{"description":"Device is not authorized to access this address"}},"tags":["Transactions","Transactions"]}},"/v1/settings":{"get":{"operationId":"SettingsController_getSettings","summary":"Get settings","description":"Retrieve general application settings","parameters":[],"responses":{"200":{"description":"Settings retrieved successfully","content":{"application/json":{"schema":{"type":"object","properties":{"minVersions":{"type":"array","items":{"type":"object","properties":{"devicePlatform":{"type":"string","enum":["ios","android"],"description":"Platform identifier"},"minRequiredVersion":{"type":"string","description":"Minimum required app version for this platform"}}}},"supportedPlatforms":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Platform identifier"},"name":{"type":"string","description":"Platform display name"},"enabled":{"type":"boolean","description":"Whether the platform is enabled"},"nativeToken":{"type":"object","properties":{"symbol":{"type":"string"},"decimals":{"type":"number"}}}}}}}},"example":{"minVersions":[{"devicePlatform":"ios","minRequiredVersion":"1.0.0"},{"devicePlatform":"android","minRequiredVersion":"1.1.0"}],"supportedPlatforms":[{"id":"ethereum","name":"Ethereum","enabled":true,"nativeToken":{"symbol":"ETH","decimals":18}},{"id":"polygon","name":"Polygon","enabled":true,"nativeToken":{"symbol":"MATIC","decimals":18}}]}}}}},"tags":["Settings","Settings"]}}},"info":{"title":"NDWallet","description":"NDWallet Server API","version":"1.0","contact":{}},"tags":[{"name":"Endpoints","description":""}],"servers":[],"components":{"securitySchemes":{"bearer":{"scheme":"bearer","bearerFormat":"JWT","type":"http"}},"schemas":{"CreateDeviceDto":{"type":"object","properties":{"devicePlatform":{"type":"object","enum":["ios","android"],"description":"Device platform (ios or android)"},"appVersion":{"type":"string","description":"App version"},"deviceToken":{"type":"string","description":"Device token that is used for push notifications"}},"required":["devicePlatform","appVersion"]},"UseDeviceDto":{"type":"object","properties":{"appVersion":{"type":"string","description":"App version"},"deviceToken":{"type":"string","description":"Device token"}},"required":["appVersion"]},"WalletAddressDto":{"type":"object","properties":{"address":{"type":"string","description":"Wallet address"},"platformId":{"type":"string","description":"Platform Id (see GET /v1/platforms)"}},"required":["address","platformId"]},"WalletAddressListDto":{"type":"object","properties":{"addresses":{"description":"List of wallet addresses","type":"array","items":{"$ref":"#/components/schemas/WalletAddressDto"}}},"required":["addresses"]},"SendTransactionDto":{"type":"object","properties":{"platformId":{"type":"string","description":"Platform ID"},"txData":{"type":"string","description":"Hex transaction data"}},"required":["platformId","txData"]},"QuoteRequestDto":{"type":"object","properties":{"inputToken":{"type":"string","description":"Input token"},"outputToken":{"type":"string","description":"Output token"},"amount":{"type":"number","description":"Amount"},"slippage":{"type":"number","description":"Slippage"}},"required":["inputToken","outputToken","amount","slippage"]},"PlatformFeeDto":{"type":"object","properties":{"amount":{"type":"string","description":"Platform fee amount"},"feeBps":{"type":"number","description":"Platform fee BPS"}},"required":["amount","feeBps"]},"SwapInfoDto":{"type":"object","properties":{"ammKey":{"type":"string","description":"AMM key"},"label":{"type":"string","description":"Label"},"inputAsset":{"type":"string","description":"Input asset"},"outputAsset":{"type":"string","description":"Output asset"},"inAmount":{"type":"string","description":"Input amount"},"outAmount":{"type":"string","description":"Output amount"},"feeAmount":{"type":"string","description":"Fee amount"},"feeAsset":{"type":"string","description":"Fee asset"}},"required":["ammKey","label","inputAsset","outputAsset","inAmount","outAmount","feeAmount","feeAsset"]},"SwapRouteDto":{"type":"object","properties":{"swapInfo":{"description":"Swap info","allOf":[{"$ref":"#/components/schemas/SwapInfoDto"}]},"percent":{"type":"number","description":"Percent"}},"required":["swapInfo","percent"]},"SwapQuoteDto":{"type":"object","properties":{"inputAsset":{"type":"string","description":"Input asset"},"inAmount":{"type":"string","description":"Input amount"},"outputAsset":{"type":"string","description":"Output asset"},"outAmount":{"type":"string","description":"Output amount"},"otherAmountThreshold":{"type":"string","description":"Other amount threshold"},"swapMode":{"type":"string","description":"Swap mode"},"slippageBps":{"type":"number","description":"Slippage BPS"},"priceImpactPct":{"type":"string","description":"Price impact PCT"},"platformFee":{"description":"Platform fee","allOf":[{"$ref":"#/components/schemas/PlatformFeeDto"}]},"swapRoutes":{"description":"Swap routes","type":"array","items":{"$ref":"#/components/schemas/SwapRouteDto"}}},"required":["inputAsset","inAmount","outputAsset","outAmount","otherAmountThreshold","swapMode","slippageBps","priceImpactPct","platformFee","swapRoutes"]},"SwapTxRequestDto":{"type":"object","properties":{"userPublicKey":{"type":"string","description":"User public key"},"platformId":{"type":"string","description":"Platform ID"},"quote":{"description":"Swap quote (received from /swap/quote)","allOf":[{"$ref":"#/components/schemas/SwapQuoteDto"}]}},"required":["userPublicKey","platformId","quote"]}}}}