From ba97724cf0fb21f07a6ff21eac33baded7579fb8 Mon Sep 17 00:00:00 2001
From: Firekeeper <0xFirekeeper@gmail.com>
Date: Fri, 8 Sep 2023 20:20:32 +0300
Subject: [PATCH] [Unity] Add contract.Prepare / tx builder (#865)
* [Unity] Add contract.Prepare / tx builder
* Update prepare.mdx
* Update unity.js
* Update prepare.mdx
---
.../interacting-with-contracts/prepare.mdx | 148 ++++++++++++++++++
sidebars/unity.js | 5 +
2 files changed, 153 insertions(+)
create mode 100644 docs/unity/interacting-with-contracts/prepare.mdx
diff --git a/docs/unity/interacting-with-contracts/prepare.mdx b/docs/unity/interacting-with-contracts/prepare.mdx
new file mode 100644
index 000000000..bf7d2f537
--- /dev/null
+++ b/docs/unity/interacting-with-contracts/prepare.mdx
@@ -0,0 +1,148 @@
+---
+title: Transaction Builder
+slug: /contract.prepare
+hide_title: true
+---
+
+# Transaction Builder
+
+By default, all transactions initiated using the SDK perform every step of the process for a transaction; From preparing and building the transaction all the way to waiting until it has been mined, and the data is available to be read from the blockchain.
+
+To gain more granular control over the transaction process, all Contract objects come with a Prepare function that returns a Transaction object, which can be used to build, fine-tune, and execute the transaction.
+
+## Usage
+
+```csharp
+string connectedAddress = await ThirdwebManager.Instance.SDK.wallet.GetAddress();
+Transaction transaction = await contract.Prepare(
+ functionName: "claim",
+ from: connectedAddress, // optional, defaults to connected address
+ args: new object[] { connectedAddress, 0, 1 }
+);
+// transaction.SetValue("0.00000000001");
+// transaction.SetGasLimit("100000");
+
+try
+{
+ var data = await transaction.Simulate();
+ Debugger.Instance.Log("[Custom Call] Simulate Successful", "Data: " + data.ToString()");
+}
+catch (System.Exception e)
+{
+ Debugger.Instance.Log("[Custom Call] Simulate Error", e.Message);
+ return;
+}
+
+await transaction.EstimateAndSetGasLimitAsync();
+
+var gasPrice = await transaction.GetGasPrice();
+Debug.Log($"Gas Price: {gasPrice}");
+
+var gasCosts = await transaction.EstimateGasCosts();
+Debug.Log($"Gas Cost: {gasCosts.wei} WEI");
+
+Debugger.Instance.Log("[Custom Call] Transaction Preview", transaction.ToString());
+
+try
+{
+ string transactionResult = await transaction.Send(gasless: false);
+ Debugger.Instance.Log("[Custom Call] Send Successful", "Tx Hash: " + transactionResult);
+}
+catch (System.Exception e)
+{
+ Debugger.Instance.Log("[Custom Call] Send Error", e.ToString());
+}
+}
+```
+
+## EstimateGasCost
+
+Estimate the gas cost for a transaction.
+
+```csharp
+var gasCost = await tx.EstimateGasCosts();
+```
+
+
+ Configuration
+
+
+### Return Value
+
+Returns the gas cost for this transaction in both `ether` and `wei`.
+
+```csharp
+GasCosts;
+```
+
+
+
+
+## EstimateGasLimit
+
+Estimate the gas limit for a transaction.
+
+```csharp
+var gasLimit = await tx.EstimateGasLimit();
+```
+
+
+ Configuration
+
+
+### Return Value
+
+Returns the gas limit for this transaction.
+
+```csharp
+BigInteger;
+```
+
+
+
+
+## Send
+
+Send the transaction without waiting for it to be mined. This is useful for when you want the transaction to be executed, but don’t need the data returned.
+
+```csharp
+string txHash = await tx.Send();
+```
+
+
+ Configuration
+
+
+### Return Value
+
+Returns the transaction hash as a `string`.
+
+```csharp
+string;
+```
+
+
+
+
+## Execute
+
+Send the transaction and wait for it to be mined. This is useful for when you want the transaction to be executed, and need the data returned.
+
+```csharp
+TransactionResult result = await tx.SendAndWaitForTransactionResult();
+```
+
+
+ Configuration
+
+
+### Return Value
+
+Returns the transaction result as a object.
+
+```csharp
+TransactionResult;
+```
+
+
+
diff --git a/sidebars/unity.js b/sidebars/unity.js
index 4514dfd0a..88ce1963f 100644
--- a/sidebars/unity.js
+++ b/sidebars/unity.js
@@ -91,6 +91,11 @@ const sidebars = {
label: "Initiate Contract Transactions",
id: "interacting-with-contracts/write",
},
+ {
+ type: "doc",
+ label: "Transaction Builder",
+ id: "interacting-with-contracts/prepare",
+ },
{
type: "category",
label: "Using Extensions",