Skip to main content

Data types

import WebKit

// MARK: - JS wrapper response types

struct ResultRaw: Codable {
var completionKey: String?
var error: BladeJSError?
}

protocol Response: Codable {
associatedtype DataType
var data: DataType { get }
}

struct InfoResponse: Response, Codable {
var data: InfoData
}

public struct InfoData: Codable {
public var apiKey: String
public var dAppCode: String
public var network: String
public var visitorId: String
public var sdkEnvironment: String
public var sdkVersion: String
public var nonce: Int
}

struct BalanceResponse: Response, Codable {
var data: BalanceData
}

public struct BalanceData: Codable {
public var hbars: Double
public var tokens: [BalanceDataToken]
}

public struct BalanceDataToken: Codable {
public var balance: Double
public var tokenId: String
}

struct PrivateKeyResponse: Response, Codable {
var data: PrivateKeyData
}

public struct PrivateKeyData: Codable {
public var privateKey: String
public var publicKey: String
public var accounts: [String]
public var evmAddress: String
}

struct AccountPrivateResponse: Response, Codable {
var data: AccountPrivateData
}

public struct AccountPrivateData: Codable {
public var accounts: [AccountPrivateRecord]
}

public struct AccountPrivateRecord: Codable {
public var privateKey: String
public var publicKey: String
public var evmAddress: String
public var address: String
public var path: String
public var keyType: CryptoKeyType
}

struct AccountAPIResponse: Codable {
var id: String
var network: String
var associationPresetTokenStatus: String
var transactionBytes: String
}

struct SignMessageResponse: Response, Codable {
var data: SignMessageData
}

public struct SignMessageData: Codable {
public var signedMessage: String
}

struct SignVerifyMessageResponse: Response, Codable {
var data: SignVerifyMessageData
}

public struct SignVerifyMessageData: Codable {
public var valid: Bool
}

struct CreatedAccountResponse: Response, Codable {
var data: CreatedAccountData
}

public struct CreatedAccountData: Codable {
public var seedPhrase: String
public var publicKey: String
public var privateKey: String
public var accountId: String?
public var evmAddress: String
public var transactionId: String?
public var status: String
public var queueNumber: Int?
}

struct AccountInfoResponse: Response, Codable {
var data: AccountInfoData
}

public struct AccountInfoData: Codable {
public var accountId: String
public var evmAddress: String
public var calculatedEvmAddress: String
public var publicKey: String
public var stakingInfo: StakingInfo
}

public struct StakingInfo: Codable {
public var pendingReward: Int64
public var stakedNodeId: Int64?
public var stakePeriodStart: String?
}

struct NodesResponse: Response, Codable {
var data: NodesData
}

public struct NodesData: Codable {
public var nodes: [NodeInfo]
}

public struct NodeInfo: Codable {
public var description: String
public var max_stake: Int64
public var min_stake: Int64
public var node_id: Int
public var node_account_id: String
public var stake: Int64
public var stake_not_rewarded: Int64
public var stake_rewarded: Int64
}


struct TransactionReceiptResponse: Response, Codable {
var data: TransactionReceiptData
}

public struct TransactionReceiptData: Codable {
public var status: String
public var contractId: String?
public var topicSequenceNumber: String?
public var totalSupply: String?
public var serials: [String]
}

struct EmergencyTransferResponse: Response, Codable {
var data: EmergencyTransferData
}

public struct EmergencyTransferData: Codable {
public var isValid: Bool
public var transferStatus: String
}

struct ContractQueryResponse: Response, Codable {
var data: ContractQueryData
}

public struct ContractQueryData: Codable {
public var gasUsed: Int
public var values: [ContractQueryRecord]
}

public struct ContractQueryRecord: Codable {
public var type: String
public var value: String
}

struct SplitSignatureResponse: Response, Codable {
var data: SplitSignatureData
}

public struct SplitSignatureData: Codable {
public var v: Int
public var r: String
public var s: String
}

struct TransactionsHistoryResponse: Response, Codable {
var data: TransactionsHistoryData
}

public struct TransactionsHistoryData: Codable {
public var nextPage: String?
public var transactions: [TransactionHistoryDetail]
}

public struct TransactionHistoryDetail: Codable {
public var fee: Double
public var memo: String
public var nftTransfers: [TransactionHistoryNftTransfer]?
public var time: String
public var transactionId: String
public var transfers: [TransactionHistoryTransfer]
public var type: String
public var plainData: TransactionHistoryPlainData?
public var consensusTimestamp: String
}

public struct TransactionHistoryPlainData: Codable {
public var type: String
public var token_id: String
public var amount: Decimal
public var senders: [String]
public var receivers: [String]
}

public struct TransactionHistoryTransfer: Codable {
public var account: String
public var amount: Decimal
public var is_approval: Bool
public var token_id: String?
}

public struct TransactionHistoryNftTransfer: Codable {
public var is_approval: Bool
public var receiver_account_id: String
public var sender_account_id: String?
public var serial_number: Int
public var token_id: String
}

struct IntegrationUrlResponse: Response, Codable {
var data: IntegrationUrlData
}

public struct IntegrationUrlData: Codable {
public var url: String
}

struct SwapQuotesResponse: Response, Codable {
var data: SwapQuotesData
}

public struct SwapQuotesData: Codable {
public var quotes: [ICryptoFlowQuote]
}

public struct ICryptoFlowQuote: Codable {
public struct Service: Codable {
public var id: String
public var name: String
public var logo: String
public var description: String?
}

public var service: Service
public var source: IAssetQuote
public var target: IAssetQuote
public var rate: Double?
public var widgetUrl: String?
public var paymentMethods: [String]?
}

public struct IAssetQuote: Codable {
public var asset: ICryptoFlowAsset
public var amountExpected: Double
public var totalFee: Double?
}

public struct ICryptoFlowAsset: Codable {
public var name: String
public var code: String
public var type: String
// crypto only
public var address: String?
public var chainId: Int?
public var decimals: Int?
public var minAmount: Double?
public var maxAmount: Double?
// fiat only
public var symbol: String?
// both
public var imageUrl: String?
}

struct ResultResponse: Response, Codable {
var data: ResultData
}

public struct ResultData: Codable {
public var success: Bool
}

struct SwapResultResponse: Response, Codable {
var data: SwapResultData
}

public struct SwapResultData: Codable {
public var success: Bool
public var sourceAddress: String
public var targetAddress: String
public var balance: BalanceData
}

struct TransakOrderInfoResponse: Response, Codable {
var data: TransakOrderInfoData
}

public struct TransakOrderInfoData: Codable {
public var orderId: String
public var status: String
public var walletAddress: String?
public var createdAt: String
public var autoExpiresAt: String
public var isBuyOrSell: String
public var network: String
public var notes: [String]
public var fiatCurrency: String
public var fiatAmount: Double
public var cryptoCurrency: String
public var cryptoAmount: Double
public var conversionPrice: Double?
public var slippage: Double?
public var totalFeeInFiat: Double
public var totalFee: Double?
}

struct CreateTokenResponse: Response, Codable {
var data: CreateTokenData
}

public struct CreateTokenData: Codable {
public var tokenId: String
}

public struct RemoteConfig: Codable {
public var fpApiKey: String
public var fpSubdomain: String
}

struct CoinListResponse: Response, Codable {
var data: CoinListData
}

public struct CoinListData: Codable {
public var coins: [CoinItem]
}

public struct CoinItem: Codable {
public var id: String
public var symbol: String
public var name: String
public var platforms: [CoinGeckoPlatform]
}

public struct CoinGeckoPlatform: Codable {
public var name: String
public var address: String
}

struct CoinInfoResponse: Response, Codable {
var data: CoinInfoData
}

public struct CoinInfoData: Codable {
public var coin: CoinData
public var priceUsd: Double
public var price: Double?
public var currency: String
}

public struct CoinData: Codable {
public var id: String
public var symbol: String
public var name: String
public var web_slug: String
public var description: CoinDataDescription
public var image: CoinDataImage
public var market_data: CoinDataMarket
public var platforms: [CoinGeckoPlatform]
}

public struct CoinDataDescription: Codable {
public var en: String
}

public struct CoinDataImage: Codable {
public var thumb: String
public var small: String
public var large: String
}

public struct CoinDataMarket: Codable {
public var current_price: [String: Double]
}

public struct KeyRecord: Codable {
public var privateKey: String
public var type: KeyType

public init(privateKey: String, type: KeyType) {
self.privateKey = privateKey
self.type = type
}
}

public struct IPFSProviderConfig: Encodable {
public var provider: IPFSProvider
public var token: String

public init(provider: IPFSProvider, token: String) {
self.provider = provider
self.token = token
}
}

struct TokenDropResponse: Response, Codable {
var data: TokenDropData
}

public struct TokenDropData: Codable {
public var status: String
public var statusCode: Int
public var timestamp: String
public var executionStatus: String
public var requestId: String
public var accountId: String
public var redirectUrl: String
}

struct CreateScheduleResponse: Response, Codable {
var data: CreateScheduleData
}

public struct CreateScheduleData: Codable {
public var scheduleId: String
}

public protocol ScheduleTransactionTransfer: Codable {
var type: ScheduleTransferType { get }
var sender: String { get }
var receiver: String { get }
var value: Int { get }
var tokenId: String { get set }
var serial: Int { get }
}

public class ScheduleTransactionTransferHbar: ScheduleTransactionTransfer {
public required init(sender: String, receiver: String, value: Int) {
self.sender = sender
self.receiver = receiver
self.value = value
}

public var type: ScheduleTransferType = .HBAR
public let sender: String
public let receiver: String
public let value: Int
public var tokenId: String = ""
public var serial: Int = 0
}

public class ScheduleTransactionTransferToken: ScheduleTransactionTransfer {
public required init(sender: String, receiver: String, tokenId: String, value: Int) {
self.sender = sender
self.receiver = receiver
self.tokenId = tokenId
self.value = value
}

public var type: ScheduleTransferType = .FT
public let sender: String
public let receiver: String
public let value: Int
public var tokenId: String
public var serial: Int = 0
}

public class ScheduleTransactionTransferNFT: ScheduleTransactionTransfer {
public required init(sender: String, receiver: String, tokenId: String, serial: Int) {
self.sender = sender
self.receiver = receiver
self.tokenId = tokenId
self.serial = serial
}

public var type: ScheduleTransferType = .NFT
public let sender: String
public let receiver: String
public var value: Int = 0
public var tokenId: String
public var serial: Int
}

// MARK: - SwiftBlade errors

public enum SwiftBladeError: Error {
case unknownJsError(String)
case apiError(String)
case initError(String)
}

public struct BladeJSError: Error, Codable {
public var name: String
public var reason: String
}

extension BladeJSError: LocalizedError {
public var errorDescription: String? {
NSLocalizedString("\(name): \(reason)", comment: reason)
}
}

// MARK: - SwiftBlade enums

public enum HederaNetwork: String {
case TESTNET
case MAINNET
}

public enum BladeEnv: String {
case Prod
case CI
}

public enum CryptoFlowServiceStrategy: String {
case BUY = "Buy"
case SELL = "Sell"
case SWAP = "Swap"
}

public enum CryptoKeyType: String, Codable {
case ECDSA_SECP256K1 = "ECDSA_SECP256K1"
case ED25519 = "ED25519"
}

public enum KeyType: String, Codable {
case admin = "admin"
case kyc = "kyc"
case freeze = "freeze"
case wipe = "wipe"
case pause = "pause"
case feeSchedule = "feeSchedule"
}

public enum IPFSProvider: String, Encodable {
case pinata = "pinata"
}

public enum ScheduleTransactionType: String, Codable {
case TRANSFER = "TRANSFER"
// case SUBMIT_MESSAGE = "SUBMIT_MESSAGE"
// case APPROVE_ALLOWANCE = "APPROVE_ALLOWANCE"
// case TOKEN_MINT = "TOKEN_MINT"
// case TOKEN_BURN = "TOKEN_BURN"
}

public enum ScheduleTransferType: String, Codable {
case HBAR = "HBAR"
case FT = "FT"
case NFT = "NFT"
}