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",