Sign a transaction

Want to implement your own style, but with all the functionality Portal offers? Use these functions to implement your own custom web3 UI for your users.

This example shows how the Portal Provider interacts with the MPC wallet and the blockchain.

The params have a hardcoded address for the transaction of sending 1 wei from our MPC wallet. The Provider then receives a signed transaction from our mobile MPC library and submits that to chain using the configured RPC url.

Here is a quick example of how you can make requests using Portal's web3 provider:

Ensure you have set the gateway URL correctly with Infura or Alchemy when you initialize the portal class.

// Imports...

class MainActivity : AppCompatActivity() {
    lateinit var portal: Portal
    lateinit var sendButton: Button
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        sendButton = findViewById(R.id.sendButton)
        sendButton.setOnClickListener { sendOneWei() }
    }

    private fun sendOneWei() {
        CoroutineScope(Dispatchers.IO).launch {
            try {
                // Create the transaction params.
                val params = listOf(TransactionParams(
                    "",
                    "0x9AeCB4DA6b438830b88C5F40b6Bf36EF3073B350",
                    "0x${BigInteger("1").toString(16)}",
                    "0x6000",
                    portal.address
                ))

                // Attempt to send the transaction.
                val transactionHash = portal.provider.request(
                    "eth_sendTransaction",
                    params
                )

                // ✅ Transaction sent successfully!
            } catch (err: Error) {
                // ❌ Handle errors sending the transaction.
            }
        }
    }
}

Estimating Gas

By default, Portal will estimate and populate the gas property in a transaction object if the property is undefined.

To estimate the gas value manually use the eth_estimateGas RPC call and pass in your transaction as the parameter.

private fun estimateGas() {
    CoroutineScope(Dispatchers.IO).launch {
        try {
            // Create the transaction params.
            val params = listOf(TransactionParams(
                "",
                "0x9AeCB4DA6b438830b88C5F40b6Bf36EF3073B350",
                "0x${BigInteger("1").toString(16)}",
                "",
                portal.address
            ))

            // Attempt to send the transaction.
            val gas = portal.provider.request(
                "eth_estimateGas",
                params
            )

            return gas
        } catch (err: Error) {
            // ❌ Handle errors sending the transaction.
        }
    }
}

And now you are signing transactions with Portal! 🙌 🚀 Next, we'll explore how to simulate a transaction so that you can create smoother experiences for your users.

Last updated