Releases: thirdweb-dev/dotnet
v2.12.0
IThirdwebWallet.UnlinkAccount
Adds the ability to Unlink a LinkedAccount from your In-App or Ecosystem Wallet in #107
List<LinkedAccount> linkedAccounts = await inAppWallet.GetLinkedAccounts();
List<LinkedAccount> linkedAccountsAfterUnlinking = await inAppWallet.UnlinkAccount(linkedAccounts[0]);EIP-7702 Integration (Experimental)
Integrates authorizationList for any transactions in #108
This EIP essentially allows you to set code to an EOA, unlocking a world of possibilities to enhance their functionality.
The best way to understand it outside of reading the EIP is looking at the example below; to preface it: we sign an authorization using the wallet we want to set code to. Another wallet sends a transaction with said authorization passed in, essentially activating it. The authority wallet now has code set to it pointing to an (insecure) Delegation contract in this case, which allows any wallet to execute any call through it on behalf of the authority. In this example, we call the wallet executing both the authorization and the claim transaction afterwards, the exectuor.
An authority may execute its own authorization, the only difference is internal whereby the authorization nonce is incremented by 1.
// Chain and contract addresses
var chainWith7702 = 911867;
var erc20ContractAddress = "0xAA462a5BE0fc5214507FDB4fB2474a7d5c69065b"; // Fake ERC20
var delegationContractAddress = "0x654F42b74885EE6803F403f077bc0409f1066c58"; // BatchCallDelegation
// Initialize contracts normally
var erc20Contract = await ThirdwebContract.Create(client: client, address: erc20ContractAddress, chain: chainWith7702);
var delegationContract = await ThirdwebContract.Create(client: client, address: delegationContractAddress, chain: chainWith7702);
// Initialize a (to-be) 7702 EOA
var eoaWallet = await PrivateKeyWallet.Generate(client);
var eoaWalletAddress = await eoaWallet.GetAddress();
Console.WriteLine($"EOA address: {eoaWalletAddress}");
// Initialize another wallet, the "executor" that will hit the eoa's (to-be) execute function
var executorWallet = await PrivateKeyWallet.Generate(client);
var executorWalletAddress = await executorWallet.GetAddress();
Console.WriteLine($"Executor address: {executorWalletAddress}");
// Fund the executor wallet
var fundingWallet = await PrivateKeyWallet.Create(client, privateKey);
var fundingHash = (await fundingWallet.Transfer(chainWith7702, executorWalletAddress, BigInteger.Parse("0.001".ToWei()))).TransactionHash;
Console.WriteLine($"Funded Executor Wallet: {fundingHash}");
// Sign the authorization to make it point to the delegation contract
var authorization = await eoaWallet.SignAuthorization(chainId: chainWith7702, contractAddress: delegationContractAddress, willSelfExecute: false);
Console.WriteLine($"Authorization: {JsonConvert.SerializeObject(authorization, Formatting.Indented)}");
// Execute the delegation
var tx = await ThirdwebTransaction.Create(executorWallet, new ThirdwebTransactionInput(chainId: chainWith7702, to: executorWalletAddress, authorization: authorization));
var hash = (await ThirdwebTransaction.SendAndWaitForTransactionReceipt(tx)).TransactionHash;
Console.WriteLine($"Authorization execution transaction hash: {hash}");
// Prove that code has been deployed to the eoa
var rpc = ThirdwebRPC.GetRpcInstance(client, chainWith7702);
var code = await rpc.SendRequestAsync<string>("eth_getCode", eoaWalletAddress, "latest");
Console.WriteLine($"EOA code: {code}");
// Log erc20 balance of executor before the claim
var executorBalanceBefore = await erc20Contract.ERC20_BalanceOf(executorWalletAddress);
Console.WriteLine($"Executor balance before: {executorBalanceBefore}");
// Prepare the claim call
var claimCallData = erc20Contract.CreateCallData(
"claim",
new object[]
{
executorWalletAddress, // receiver
100, // quantity
Constants.NATIVE_TOKEN_ADDRESS, // currency
0, // pricePerToken
new object[] { Array.Empty<byte>(), BigInteger.Zero, BigInteger.Zero, Constants.ADDRESS_ZERO }, // allowlistProof
Array.Empty<byte>() // data
}
);
// Embed the claim call in the execute call
var executeCallData = delegationContract.CreateCallData(
method: "execute",
parameters: new object[]
{
new List<Thirdweb.Console.Call>
{
new()
{
Data = claimCallData.HexToBytes(),
To = erc20ContractAddress,
Value = BigInteger.Zero
}
}
}
);
// Execute from the executor wallet targeting the eoa which is pointing to the delegation contract
var tx2 = await ThirdwebTransaction.Create(executorWallet, new ThirdwebTransactionInput(chainId: chainWith7702, to: eoaWalletAddress, data: executeCallData));
var hash2 = (await ThirdwebTransaction.SendAndWaitForTransactionReceipt(tx2)).TransactionHash;
Console.WriteLine($"Token claim transaction hash: {hash2}");
// Log erc20 balance of executor after the claim
var executorBalanceAfter = await erc20Contract.ERC20_BalanceOf(executorWalletAddress);
Console.WriteLine($"Executor balance after: {executorBalanceAfter}");Note that for the time being this only works on 7702-enabled chains such as Odyssey and the feature has only been integrated with PrivateKeyWallet.
EcosystemWallet.GetUserAuthDetails
Adds the ability to retrieve auth provider specific user information from In-App and Ecosystem Wallets in #110
Other additions
SwitchNetworkis now part of the mainIThirdwebWalletinterface. Smart Wallets now attempt to switch the underlying admin network automatically as well.ERC721_TotalSupplyextension now includes burned NFTs when using thirdweb contracts, allowing forERC721_GetAllandERC721_GetOwnedfunctions to return said NFTs as well.- Various new utilities for conversions and transaction decoding, including decoding
authorizationList.
Full Changelog: v2.11.1...v2.12.0
v2.11.1
What's Changed
- [SmartWallet] Fix SwitchNetwork from zksync stack to non zksync by @0xFirekeeper in #106
Full Changelog: v2.11.0...v2.11.1
v2.11.0
What's Changed
- [Pay] Allow passing purchaseData with quotes by @0xFirekeeper in #104
- ERC-6492 Predeploy Signature Verification by @0xFirekeeper in #105
- Adds ThirdwebContract.CreateCallData extension.
Full Changelog: v2.10.1...v2.11.0
v2.10.1
v2.10.0
What's Changed
- Added
AuthProvider.Steamas a login option for In-App or Ecosystem Wallets.
var steamWallet = await InAppWallet.Create(client: client, authProvider: AuthProvider.Steam);
if (!await steamWallet.IsConnected())
{
_ = await steamWallet.LoginWithOauth(...);
}
var steamWalletAddy = await steamWallet.GetAddress();- Added the ability to pay for gas with ERC20 tokens when using Smart Wallet.
- Currently supports Base USDC, Celo CUSD, and Lisk LSK tokens.
- Simply select a
TokenPaymasterwhen creating aSmartWalletand all transactions will be paid for with the corresponding ERC20 from the user's Smart Wallet. - Useful on L2s where the native token is ETH and you want to enshrine another coin or onramp your users directly to that coin.
- These TokenPaymasters entirely operate onchain, leveraging popular DEXes and decentralized price feeds from Uniswap & Chainlink.
- This product is in beta, and only compatible with EntryPoint v0.7.0, which we auto select for you if not overriden when configurin your wallet.
// Example of paying for a transaction using Lisk's LSK Stablecoin instead of native ETH
var chainId = 1135; // lisk
var erc20SmartWallet = await SmartWallet.Create(
personalWallet: privateKeyWallet,
chainId: chainId,
tokenPaymaster: TokenPaymaster.LISK_LSK
);
var erc20SmartWalletAddress = await erc20SmartWallet.GetAddress();
Console.WriteLine($"ERC20 Smart Wallet address: {erc20SmartWalletAddress}");
var receipt = await erc20SmartWallet.Transfer(chainId: chainId, toAddress: erc20SmartWalletAddress, weiAmount: 0);
Console.WriteLine($"Receipt: {JsonConvert.SerializeObject(receipt, Formatting.Indented)}");v2.9.0
What's Changed
- Fixed an issue with typed data signing using In-App/Ecosystem Wallets when one of the fields was larger than Uint32.
- Improved NFT Metadata Population & Added Filters
- The
ERC1155_GetOwnedNFTsextension now returns theQuantityOwnedmetadata field correctly for each NFT. - The
ERC721_GetNFTandERC721_GetAllNFTsextensions can now take in a newfillOwnerparameter that defaults to true and decides whether to make additional requests to populate theOwnerfield of the metadata, otherwise defaulting toConstants.ADDRESS_ZERO. - The
ERC1155_GetNFTandERC1155_GetAllNFTsextensions can now take in a newfillSupplyparameter that defaults to true and decides whether to make additional requests to populate theSupplyfield of the metadata, otherwise defaulting toBigInteger.MinusOne.
- The
v2.8.3
What's Changed
- Fixed edge case where migrating a sharded wallet to enclave would throw
Invalid enclave wallet details being migrated.
v2.8.2
What's Changed
- Adds
GenerateExternalLoginLinkmethod to forward the logged-in session of In-App or Ecosystem Wallets from .NET to React apps built using thirdweb.- Configure your React website to use thirdweb Connect, open the link generated by this method and your users will be autoconnected.
- If using Ecosystem Wallets, make sure to create the ecosystem wallet with the same ecosystem id and partner id (if any) and include it as one of your wallets in, for example, your ConnectButton's
walletsprop. - Make sure you're using the same api key on both ends.
v2.8.1
What's Changed
- The inability to fetch
NFTMetadatawhen calling an NFT-related method no longer throws, and instead returnsNFTMetadatawith a description containing the error message.
v2.8.0
What's Changed
- Having an incorrect or slightly off system time would produce errors when logging in with In-App Wallets in some cases, we have added a fallback in this scenario that will work around this issue.
IThirdwebWallet.Transfernow has an optionaltokenAddressoverride to transfer ERC20 tokens using said function; this is an alternative toThirdwebContract.ERC20_Transfer.- ERC1155 transfer-related functions'
databytes parameter has now been made optional.