Transaction

  • To create the transaction with wallet

ETH Transaction

1. Build ETH Transaction

To create an Ethereum transaction, use the ETHTransactionRequest with the following attributes:

  • create a new Build ETHTransactionRequest should include the following attributes:

    • chainID : Chain ID (e.g., Ethereum is 1).

    • toAddress : Recipient's wallet address.

    • amount : Amount to transfer.

    • gasPrice : Gas price per unit.

    • gasLimit : Maximum gas allowed for the transaction.

    • nonce : Transaction count for the sender's account.

    • data : Optional additional data for the transaction.

    • paillierGroupID : User's Paillier group ID.

    • keyGenGroupID : the keygen Group ID of master wallet

    • keyIdentity : the keyIdentity of wallet

    • ecType: Cryptographic algorithm type (e.g., eddsa, ecdsa)

Example:

    let request = PayloadBuildETHTransactionRequest()
    request.chainID = chainId
    request.toAddress = toAddress
    request.amount = amount
    request.gasPrice = gasPrice
    request.gasLimit = gasLimit
    request.nonce = nonce
    request.data = data
    request.ecType = wallet.ecType
    request.paillierGroupID = paillierGroupId
    request.keyGenGroupID = keygenGroupId
    request.keyIdentity = wallet.keyIdentity

    let rawTransaction = try client.buildETHTransaction(request)

2. Send ETH Transaction with Web3

Example:

    import web3swift
    func sendRawTransaction(rawTransactionData: Data) {
    let infuraUrl = "https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID"
    let web3 = try! Web3.new(URL(string: infuraUrl)!)

    // Create a raw transaction from data
    let rawTxBytes = rawTransactionData

    // Send the raw transaction
    web3.eth.sendRawTransaction(rawTx: rawTxBytes) { result in
        switch result {
        case .success(let transactionHash):
            print("Transaction successfully sent. Hash: \(transactionHash)")
        case .failure(let error):
            print("Failed to send transaction: \(error.localizedDescription)")
        }
    }
}

SOLANA Transaction

1. Build Solana Transaction

  • create a new Build BuildSolTransactionRequest should include the following attributes:

    • chainID: Chain ID (e.g., Solana mainnet is 501).

    • fromAddress: Sender's wallet address.

    • toAddress: Recipient's wallet address.

    • Amount: Amount to transfer.

    • paillierGroupID: User's Paillier group ID.

    • keyGenGroupID: Master wallet's key generation group ID.

    • KkeyIdentity: the keyIdentity of wallet

    • eCType: Cryptographic algorithm type (e.g., eddsa, ecdsa).

Example:

   let request = PayloadBuildSolTransactionRequest()
    request.chainID = chainId
    request.fromAddress = fromAddress
    request.toAddress = toAddress
    request.amount = amount
    request.ecType = wallet.ecType
    request.paillierGroupID = paillierGroupId
    request.keyGenGroupID = keygenGroupId
    request.keyIdentity = wallet.keyIdentity
    
    let rawTransaction = try client.buildSolTransaction(request)

2. Send SOLANA Transaction

  • Use a Solana library to send the raw transaction. Encode the raw transaction to Base58 before sending. Example:

import Solana

func sendRawTransaction(rawTxBytes: Data) {
    let endpoint = APIEndPoint.mainnetBeta
    let solana = Solana(router: NetworkingRouter(endpoint: endpoint), accountStorage: InMemoryAccountStorage())

    // Encode raw transaction bytes to Base58
    let rawTxBase58 = rawTxBytes.base58EncodedString()

    // Send raw transaction
    solana.api.sendTransaction(
        serializedTransaction: rawTxBase58,
        configs: RequestConfiguration(encoding: "base64", skipPreflight: false, commitment: "finalized")
    ) { result in
        switch result {
        case .success(let transactionHash):
            print("Transaction successful! Hash: \(transactionHash)")
        case .failure(let error):
            print("Transaction failed: \(error.localizedDescription)")
        }
    }
}

import Base58

extension Data {
    func base58EncodedString() -> String {
        return Base58.encode(self)
    }
}

Tron Transaction

1. Build Tron Transaction

  • create a new Build BuildTronTransactionRequest should include the following attributes:

    • chainID: Chain ID (e.g., Tron mainnet is 728, testnet is 939).

    • fromAddress: Sender's wallet address.

    • toAddress: Recipient's wallet address.

    • Amount: Amount to transfer.

    • paillierGroupID: User's Paillier group ID.

    • keyGenGroupID: Master wallet's key generation group ID.

    • KkeyIdentity: the keyIdentity of wallet

    • eCType: Cryptographic algorithm type (e.g., eddsa, ecdsa).

Example:

   let request = PayloadBuildTronTransactionRequest()
    request.chainID = chainId
    request.fromAddress = fromAddress
    request.toAddress = toAddress
    request.amount = amount
    request.ecType = wallet.ecType
    request.paillierGroupID = paillierGroupId
    request.keyGenGroupID = keygenGroupId
    request.keyIdentity = wallet.keyIdentity
    
    let rawTransaction = try client.buildTronTransaction(request)

2. Send Tron Transaction

  • Use a Tron library to send the raw transaction. Encode the raw transaction to Base58 before sending. Example:

import Tron

func sendRawTransaction(rawTxBytes: Data) {
    let endpoint = APIEndPoint.mainnetBeta
    let rawTxBytes = Tron(router: NetworkingRouter(endpoint: endpoint), accountStorage: InMemoryAccountStorage())

    // Send raw transaction
    tron.api.sendTransaction(
        serializedTransaction: rawTxBytes,
        configs: RequestConfiguration(encoding: "base64", skipPreflight: false, commitment: "finalized")
    ) { result in
        switch result {
        case .success(let transactionHash):
            print("Transaction successful! Hash: \(transactionHash)")
        case .failure(let error):
            print("Transaction failed: \(error.localizedDescription)")
        }
    }
}

Ton CoinTransaction

1. Build Ton Coin Transaction

  • create a new Build PayloadBuildTonTransactionRequest should include the following attributes:

    • chainID: Chain ID (e.g., Ton mainnet is ton, testnet is ton-testnet).

    • fromAddress: Sender's wallet address.

    • toAddress: Recipient's wallet address.

    • amount: Amount to transfer.

    • paillierGroupID: User's Paillier group ID.

    • keyGenGroupID: Master wallet's key generation group ID.

    • keyIdentity: the keyIdentity of wallet

    • ellipticCurveType: Cryptographic algorithm type (e.g., eddsa, ecdsa).

    • derivationPath: derivation Path of Ton chain "m/44'/607'/0'"

    • subwallet: The type of ton wallet v3r2 (698983191)

    • comment: memo of transaction

    • bounce: the transaction to bounce (true, false)

Example:

   let request = PayloadBuildTonTransactionRequest()
        request.keyGenGroupID = "keygenGroupId"
        request.paillierGroupID = "paillierGroupId"
        request.keyIdentity = "keyIdentity"
        request.ellipticCurveType = "eddsa"
        request.derivationPath = "derivationPath"
        request.chainID = "ton-testnet"
        request.toAddress = "toAddress"
        request.fromAddress = "fromAddress"
        request.amount = "amount"
        request.subwallet = "subWallet"
        request.comment = "memo"
        request.bounce = true
    
    let rawTxBytes = try client.buildTonTransaction(request)

2. Send Ton Coin Transaction

  • Use a Ton library to send the raw transaction. Encode the raw transaction to Base64 before sending. Example:

import Foundation

struct BOCRequest: Codable {
    let boc: String
}

func sendRawTransaction(rawTxBytes: Data) {
    let bocMessage = rawTxBytes.base64EncodedString()
    // 2. Create the URL
    guard let url = URL(string: "https://quiknode/sendBocReturnHash") else {
        print("Invalid URL")
        return
    }
    
    // 3. Construct the URLRequest
    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    // Add headers
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    request.setValue("application/json", forHTTPHeaderField: "Accept")
    
    // 4. Create the request body
    let bocPayload = BOCRequest(
        boc: bocMessage
    )
    
    do {
        // Convert the Swift struct to JSON
        let jsonData = try JSONEncoder().encode(bocPayload)
        request.httpBody = jsonData
    } catch {
        print("Error encoding JSON: \(error.localizedDescription)")
        return
    }
    
    // 5. Send the request with URLSession
    let task = URLSession.shared.dataTask(with: request) { data, response, error in
        // Parse the response data (if any)
        if let data = data,
           let responseString = String(data: data, encoding: .utf8) {
            print("Response: \(responseString)")
        }
    }
    
    task.resume()

}

Bitcoin Transaction

1. Build Bitcoin Transaction

  • create a new Build PayloadBuildBtcTransactionRequest should include the following attributes:

    • chainID: Chain ID (e.g., BTC mainnet is btc, testnet is btc-testnet).

    • fromAddress: Sender's wallet address.

    • receiverAddress: Recipient's wallet address.

    • amount: Amount to transfer.

    • paillierGroupID: User's Paillier group ID.

    • keyGenGroupID: Master wallet's key generation group ID.

    • keyIdentity: the keyIdentity of wallet

    • ellipticCurveType: Cryptographic algorithm type (e.g., eddsa, ecdsa).

    • IgnoringFee: The flag used to skip fee enforcement on testnet. This should always be set to false on mainnet.

Example:

   let request = PayloadBuildBtcTransactionRequest()
        request.chainId = "chainId"
        request.fromAddress = "fromAddress"
        request.receiverAddress = "toAddress"
        request.amount = "amount"
        request.ellipticCurveType = "ecType"
        request.paillierGroupID = "paillierGroupId"
        request.keyGenGroupID = "keygenGroupId"
        request.keyIdentity = "keyIdentity"
        request.derivationPath = "derivationPath"
        request.IgnoringFee = true
    
    let rawTxBytes = try client.buildBtcTransaction(request)

2. Send Bitcoin Transaction

  • Use a BTC library to send the raw transaction Example:

import Foundation

extension Data {
    /// Returns a lowercase hex string representation of the Data.
    func toHexString() -> String {
        return self.map { String(format: "%02x", $0) }.joined()
    }
}

func sendRawTransaction(rawTxBytes: Data) {
    
    // 1. Define the URL
    guard let url = URL(string: "https://blockstream.info/testnet/api/tx") else {
        print("Invalid URL")
        return
    }
    
    // 2. Prepare the URLRequest
    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    // Blockstream’s API expects `text/plain`
    request.setValue("text/plain", forHTTPHeaderField: "Content-Type")
    
    // 3. The raw transaction in hex (same as in your curl --data)
    let rawTransactionHex = rawTxBytes.toHexString()
    
    // 4. Convert the hex string to Data and assign to request's body
    request.httpBody = rawTransactionHex.data(using: .utf8)
    
    // 5. Send the request
    let task = URLSession.shared.dataTask(with: request) { data, response, error in
        // Handle client-side error
        if let error = error {
            print("Error: \(error)")
            return
        }
        
        // Check server response
        guard let httpResponse = response as? HTTPURLResponse else {
            print("No response from server.")
            return
        }
        
        // Print status for debugging
        print("Status code: \(httpResponse.statusCode)")
        
        // Handle response data
        if let data = data, let responseString = String(data: data, encoding: .utf8) {
            // The API typically returns the transaction ID if successful,
            // or an error message otherwise.
            print("Response body: \(responseString)")
        } else {
            print("No data in response.")
        }
    }
    
    task.resume()

}

Xrp Transaction

1. Build XRP Transaction

  • create a new Build PayloadBuildXrpTransactionRequest should include the following attributes:

    • chainId: Chain ID (e.g., XRP mainnet is xrp, testnet is xrp-testnet).

    • fromAddress: Sender's XRP wallet address.

    • toAddr: Recipient's XRP wallet address.

    • amount: Amount to transfer.

    • paillierGroupID: User's Paillier group ID.

    • keyGenGroupID: Master wallet's key generation group ID.

    • keyIdentity: The keyIdentity of the wallet.

    • ellipticCurveType: Cryptographic algorithm type (e.g., ecdsa, eddsa).

    • derivationPath: Derivation path for the key.

Example:

    let request = PayloadBuildXrpTransactionRequest()
    request.chainId = "chainId"
    request.fromAddress = "fromAddress"
    request.toAddr = "toAddress"
    request.amount = "amount"
    request.ellipticCurveType = "ecType"
    request.paillierGroupID = "paillierGroupId"
    request.keyGenGroupID = "keygenGroupId"
    request.keyIdentity = "keyIdentity"
    request.derivationPath = "derivationPath"

    let rawTxBytes = try client.buildXrpTransaction(request)

2. Send XRP Transaction

  • Use an XRP library or network provider (such as the XRPL JSON-RPC API) to send the raw transaction.

Last updated