Skip to content

Releases: thirdweb-dev/dotnet

v2.12.1

26 Dec 18:52
b4fbeef
Compare
Choose a tag to compare

What's Changed

  • Patch exposing GetUserDetails fields when using Ecosystem or In-App Wallets.

v2.12.0

25 Dec 19:07
e5c2aa7
Compare
Choose a tag to compare

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

  • SwitchNetwork is now part of the main IThirdwebWallet interface. Smart Wallets now attempt to switch the underlying admin network automatically as well.
  • ERC721_TotalSupply extension now includes burned NFTs when using thirdweb contracts, allowing for ERC721_GetAll and ERC721_GetOwned functions 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

09 Dec 14:38
67770be
Compare
Choose a tag to compare

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

06 Dec 23:23
c07ddf2
Compare
Choose a tag to compare

What's Changed

Full Changelog: v2.10.1...v2.11.0

v2.10.1

27 Nov 00:52
f3b8791
Compare
Choose a tag to compare

What's Changed

  • Add preferredProvider option for thirdweb pay by @Yash094 in #103

New Contributors

Full Changelog: v2.10.0...v2.10.1

v2.10.0

22 Nov 16:52
c158709
Compare
Choose a tag to compare

What's Changed

  • Added AuthProvider.Steam as 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 TokenPaymaster when creating a SmartWallet and 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

15 Nov 21:10
7404406
Compare
Choose a tag to compare

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_GetOwnedNFTs extension now returns the QuantityOwned metadata field correctly for each NFT.
    • The ERC721_GetNFT and ERC721_GetAllNFTs extensions can now take in a new fillOwner parameter that defaults to true and decides whether to make additional requests to populate the Owner field of the metadata, otherwise defaulting to Constants.ADDRESS_ZERO.
    • The ERC1155_GetNFT and ERC1155_GetAllNFTs extensions can now take in a new fillSupply parameter that defaults to true and decides whether to make additional requests to populate the Supply field of the metadata, otherwise defaulting to BigInteger.MinusOne.

v2.8.3

12 Nov 13:01
1fef151
Compare
Choose a tag to compare

What's Changed

  • Fixed edge case where migrating a sharded wallet to enclave would throw Invalid enclave wallet details being migrated.

v2.8.2

08 Nov 19:39
a15e9bb
Compare
Choose a tag to compare

What's Changed

  • Adds GenerateExternalLoginLink method 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 wallets prop.
    • Make sure you're using the same api key on both ends.

v2.8.1

07 Nov 16:26
c88f75c
Compare
Choose a tag to compare

What's Changed

  • The inability to fetch NFTMetadata when calling an NFT-related method no longer throws, and instead returns NFTMetadata with a description containing the error message.