Skip to content
Merged

v3 #157

Show file tree
Hide file tree
Changes from 15 commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
d19304d
Add social OAuth endpoint and update payments API
0xFirekeeper Sep 8, 2025
f096e7b
Remove User model and related code from EmbeddedWallet
0xFirekeeper Sep 8, 2025
bf6809e
Refactor RPC types and update namespace usage
0xFirekeeper Sep 8, 2025
88d44e4
Remove unused Nethereum import in ThirdwebBundler
0xFirekeeper Sep 8, 2025
7e89bb1
Remove Nethereum.RLP dependency and refactor RLP usage
0xFirekeeper Sep 8, 2025
4047d93
Refactor tests to use guest wallet instead of private key wallet
0xFirekeeper Sep 8, 2025
0bffbe3
Remove deprecated EngineWallet implementation
0xFirekeeper Sep 8, 2025
d81764e
Remove deprecated ThirdwebPay payment module
0xFirekeeper Sep 8, 2025
438e324
Remove Thirdweb AI and Indexer modules
0xFirekeeper Sep 8, 2025
13c7997
Remove commented Indexer and AI demo code
0xFirekeeper Sep 8, 2025
c15edc6
Remove Nebula AI tests and rename API client file
0xFirekeeper Sep 8, 2025
53eeaec
Remove unused exception and enum, refactor DataStorage
0xFirekeeper Sep 8, 2025
03a824c
Move EIP712 and RLP utilities to Utils folder
0xFirekeeper Sep 8, 2025
75c1f55
Refactor namespaces and consolidate type files
0xFirekeeper Sep 8, 2025
28a0b1c
Add Makefile and generator, update API client
0xFirekeeper Sep 24, 2025
6367923
Remove Thirdweb.Bridge and related constants
0xFirekeeper Sep 24, 2025
899a4f8
Update Makefile help text and remove generate-api alias
0xFirekeeper Sep 24, 2025
7ae8427
Remove marketplace extensions and update wallet flows
0xFirekeeper Sep 24, 2025
1c9894c
Comment out social auth example and remove marketplace tests
0xFirekeeper Sep 24, 2025
8c45dc2
Merge branch 'main' into v3
0xFirekeeper Sep 24, 2025
602e6eb
Update guest account logic and codecov ignore paths
0xFirekeeper Sep 24, 2025
cd1d59d
Make ThirdwebTransactionInput properties public and auto-implemented
0xFirekeeper Sep 24, 2025
098c1a6
Fix property backing fields in ThirdwebTransactionInput
0xFirekeeper Sep 24, 2025
9ef0d3d
Add extension methods for sending transactions
0xFirekeeper Sep 24, 2025
7123619
Fix missing await in LoginWithGuest call in tests
0xFirekeeper Sep 24, 2025
1c59cf3
Update Nethereum packages and remove AA silent revert tests
0xFirekeeper Sep 24, 2025
a816486
Refactor transaction input handling and remove ThirdwebApi
0xFirekeeper Sep 24, 2025
018ec19
Remove MinimalForwarder signature support
0xFirekeeper Sep 24, 2025
2edf6ef
Use cts.Token for delay in transaction polling
0xFirekeeper Sep 24, 2025
d2fc677
Update Program.cs
0xFirekeeper Sep 27, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ root = true
###############################

# Exclude Thirdweb.Api generated files from all linting and formatting rules
[Thirdweb/Thirdweb.Api/GeneratedClient.cs]
[Thirdweb/Thirdweb.Api/ThirdwebApi.cs]
generated_code = true
dotnet_analyzer_diagnostic.severity = none
dotnet_style_qualification_for_field = false
Expand Down
158 changes: 158 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
# Thirdweb Makefile
# Cross-platform targets to mirror tw.bat functionality
# Requires: GNU Make, dotnet SDK, optional CSharpier

# Use bash for consistent behavior across platforms (Git Bash/MSYS2/WSL/macOS/Linux)
SHELL := bash
.SHELLFLAGS := -o pipefail -c

# Default target
.DEFAULT_GOAL := help

# Tools and paths
DOTNET := dotnet
API_CLIENT := Thirdweb/Thirdweb.Api/ThirdwebApi.cs
CONSOLE_PROJ := Thirdweb.Console
GENERATOR_PROJ := Thirdweb.Generator

# Colors (best effort; will be empty if tput is unavailable)
C_RST := $(shell tput sgr0 2>/dev/null || echo "")
C_BOLD := $(shell tput bold 2>/dev/null || echo "")
C_DIM := $(shell tput dim 2>/dev/null || echo "")
C_RED := $(shell tput setaf 1 2>/dev/null || echo "")
C_GRN := $(shell tput setaf 2 2>/dev/null || echo "")
C_YEL := $(shell tput setaf 3 2>/dev/null || echo "")
C_BLU := $(shell tput setaf 4 2>/dev/null || echo "")
C_MAG := $(shell tput setaf 5 2>/dev/null || echo "")
C_CYN := $(shell tput setaf 6 2>/dev/null || echo "")

# Icons
IC_BUILD := BUILD
IC_CLEAN := CLEAN
IC_RESTORE := RESTORE
IC_TEST := TEST
IC_PACK := PACK
IC_RUN := RUN
IC_GEN := GEN
IC_INFO := INFO
IC_OK := OK
IC_WARN := WARN
IC_ERR := ERR
IC_FMT := FMT

hr = printf '$(C_DIM)%s$(C_RST)\n' '--------------------------------------------------------------------'
msg = printf '%s[%s]%s %s\n' '$(1)' '$(2)' '$(C_RST)' '$(3)'

.PHONY: help
help:
@printf '\n$(C_CYN)$(C_BOLD)%s$(C_RST)\n' 'Thirdweb Tools'
@$(hr)
@printf 'Usage: $(C_BOLD)make$(C_RST) $(C_CYN)[target]$(C_RST)\n\n'
@printf '$(C_BOLD)Targets:$(C_RST)\n'
@printf ' $(C_CYN)%-12s$(C_RST) - %s\n' 'build' 'Generate API (if needed) and build the solution'
@printf ' $(C_CYN)%-12s$(C_RST) - %s\n' 'clean' 'Clean build artifacts'
@printf ' $(C_CYN)%-12s$(C_RST) - %s\n' 'restore' 'Restore NuGet packages'
@printf ' $(C_CYN)%-12s$(C_RST) - %s\n' 'test' 'Run tests'
@printf ' $(C_CYN)%-12s$(C_RST) - %s\n' 'pack' 'Generate API (if needed) and create NuGet package'
@printf ' $(C_CYN)%-12s$(C_RST) - %s\n' 'run' 'Run the console application'
@printf ' $(C_CYN)%-12s$(C_RST) - %s\n' 'generate' 'Generate API client from OpenAPI spec'
@printf ' $(C_CYN)%-12s$(C_RST) - %s\n' 'lint' 'Check code formatting (dry run)'
@printf ' $(C_CYN)%-12s$(C_RST) - %s\n' 'fix' 'Fix code formatting issues'
@printf ' $(C_CYN)%-12s$(C_RST) - %s\n' 'help' 'Show this help message'
@$(hr)

.PHONY: generate generate-api
# Clean previous file and generate API client
generate:
@$(call msg,$(C_BLU),$(IC_INFO),$(IC_GEN) Cleaning generated API files)
@rm -f '$(API_CLIENT)' 2>/dev/null || true
@$(call msg,$(C_BLU),$(IC_INFO),$(IC_GEN) Generating Thirdweb API client with custom generator)
@$(DOTNET) run --project '$(GENERATOR_PROJ)' --no-build >/dev/null 2>&1 \
|| ( \
$(call msg,$(C_MAG),>> ,Building generator) ; \
$(DOTNET) build '$(GENERATOR_PROJ)' ; \
$(call msg,$(C_MAG),>> ,Running generator) ; \
$(DOTNET) run --project '$(GENERATOR_PROJ)' \
)
@$(call msg,$(C_GRN),$(IC_OK),API client generation complete)

# Alias for compatibility with older naming
generate-api: generate

.PHONY: build
build:
@$(MAKE) --no-print-directory generate
@$(call msg,$(C_BLU),$(IC_INFO),$(IC_BUILD) Building with dotnet build)
@$(DOTNET) build && \
$(call msg,$(C_GRN),$(IC_OK),Build succeeded) || \
$(call msg,$(C_RED),$(IC_ERR),Build failed)

.PHONY: clean
clean:
@$(call msg,$(C_BLU),$(IC_INFO),$(IC_CLEAN) Cleaning with dotnet clean)
@$(DOTNET) clean && \
$(call msg,$(C_GRN),$(IC_OK),Clean completed) || \
$(call msg,$(C_RED),$(IC_ERR),Clean failed)

.PHONY: restore
restore:
@$(call msg,$(C_BLU),$(IC_INFO),$(IC_RESTORE) Restoring with dotnet restore)
@$(DOTNET) restore && \
$(call msg,$(C_GRN),$(IC_OK),Restore completed) || \
$(call msg,$(C_RED),$(IC_ERR),Restore failed)

.PHONY: test
test:
@$(call msg,$(C_BLU),$(IC_INFO),$(IC_TEST) Running dotnet test)
@$(DOTNET) test && \
$(call msg,$(C_GRN),$(IC_OK),All tests passed) || \
$(call msg,$(C_RED),$(IC_ERR),Some tests failed)

.PHONY: pack
pack:
@if [ ! -f '$(API_CLIENT)' ]; then \
$(call msg,$(C_YEL),$(IC_WARN),API client not found, generating it first) ; \
$(MAKE) --no-print-directory generate ; \
fi
@$(call msg,$(C_BLU),$(IC_INFO),$(IC_BUILD) Building Release)
@$(DOTNET) build --configuration Release || { $(call msg,$(C_RED),$(IC_ERR),Build (Release) failed); exit 1; }
@$(call msg,$(C_BLU),$(IC_INFO),$(IC_PACK) Packing NuGet package(s))
@$(DOTNET) pack --configuration Release && \
$(call msg,$(C_GRN),$(IC_OK),Pack completed) || \
$(call msg,$(C_RED),$(IC_ERR),Packing failed)

.PHONY: run
run:
@$(call msg,$(C_BLU),$(IC_INFO),$(IC_RUN) dotnet run --project $(CONSOLE_PROJ))
@$(DOTNET) run --project '$(CONSOLE_PROJ)' && \
$(call msg,$(C_GRN),$(IC_OK),Application exited) || \
$(call msg,$(C_RED),$(IC_ERR),Application exited with errors)

.PHONY: lint
lint:
@$(call msg,$(C_BLU),$(IC_INFO),$(IC_FMT) Checking code formatting with CSharpier)
@csharpier --help >/dev/null 2>&1 || { \
$(call msg,$(C_YEL),$(IC_WARN),CSharpier is not installed) ; \
printf ' Install it with: dotnet tool install -g csharpier\n' ; \
exit 0 ; \
}
@csharpier check . >/dev/null 2>&1 || { \
$(call msg,$(C_YEL),$(IC_WARN),Formatting issues found) ; \
printf ' Run "make fix" to automatically fix them.\n' ; \
exit 0 ; \
}
@$(call msg,$(C_GRN),$(IC_OK),Code formatting is correct)

.PHONY: fix
fix:
@$(call msg,$(C_BLU),$(IC_INFO),$(IC_FMT) Running CSharpier formatter)
@csharpier --help >/dev/null 2>&1 || { \
$(call msg,$(C_YEL),$(IC_WARN),CSharpier is not installed) ; \
printf ' Install it with: dotnet tool install -g csharpier\n' ; \
exit 0 ; \
}
@csharpier format . >/dev/null 2>&1 || { \
$(call msg,$(C_RED),$(IC_ERR),CSharpier formatting failed) ; \
exit 1 ; \
}
@$(call msg,$(C_GRN),$(IC_OK),Code formatting completed)
182 changes: 21 additions & 161 deletions Thirdweb.Console/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,41 +16,40 @@

#region Basic Wallet Interaction

// Create a private key wallet
var privateKeyWallet = await PrivateKeyWallet.Generate(client);

// var walletAddress = await privateKeyWallet.GetAddress();
// Console.WriteLine($"PK Wallet address: {walletAddress}");
// Create a guest wallet
var guestWallet = await InAppWallet.Create(client, authProvider: AuthProvider.Guest);
var walletAddress = await guestWallet.LoginWithGuest();
Console.WriteLine($"Guest Wallet address: {walletAddress}");

#endregion

#region Basic Contract Interaction

// var contract = await ThirdwebContract.Create(client: client, address: "0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d", chain: 1);
// var nfts = await contract.ERC721_GetAllNFTs();
// var nfts = await contract.ERC721_GetNFT(0);
// Console.WriteLine($"NFTs: {JsonConvert.SerializeObject(nfts, Formatting.Indented)}");

#endregion

#region Deploy Contract

// var serverWallet = await ServerWallet.Create(client: client, label: "TestFromDotnet");
var serverWallet = await ServerWallet.Create(client: client, label: "TestFromDotnet");

// var abi =
// "[ { \"inputs\": [], \"name\": \"welcome\", \"outputs\": [ { \"internalType\": \"string\", \"name\": \"\", \"type\": \"string\" } ], \"stateMutability\": \"pure\", \"type\": \"function\" } ]";
var abi =
"[ { \"inputs\": [], \"name\": \"welcome\", \"outputs\": [ { \"internalType\": \"string\", \"name\": \"\", \"type\": \"string\" } ], \"stateMutability\": \"pure\", \"type\": \"function\" } ]";

// var contractAddress = await ThirdwebContract.Deploy(
// client: client,
// chainId: 11155111,
// serverWalletAddress: await serverWallet.GetAddress(),
// bytecode: "6080604052348015600e575f5ffd5b5061014e8061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610029575f3560e01c8063b627cf3b1461002d575b5f5ffd5b61003561004b565b60405161004291906100f8565b60405180910390f35b60606040518060400160405280601481526020017f57656c636f6d6520746f20746869726477656221000000000000000000000000815250905090565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6100ca82610088565b6100d48185610092565b93506100e48185602086016100a2565b6100ed816100b0565b840191505092915050565b5f6020820190508181035f83015261011081846100c0565b90509291505056fea264697066735822122001498e9d7d6125ce22613ef32fdb7e8e03bf11ad361d7b00e210b82d7b7e0d4464736f6c634300081e0033",
// abi: abi
// );
// Console.WriteLine($"Contract deployed at: {contractAddress}");
var contractAddress = await ThirdwebContract.Deploy(
client: client,
chainId: 11155111,
serverWalletAddress: await serverWallet.GetAddress(),
bytecode: "6080604052348015600e575f5ffd5b5061014e8061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610029575f3560e01c8063b627cf3b1461002d575b5f5ffd5b61003561004b565b60405161004291906100f8565b60405180910390f35b60606040518060400160405280601481526020017f57656c636f6d6520746f20746869726477656221000000000000000000000000815250905090565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6100ca82610088565b6100d48185610092565b93506100e48185602086016100a2565b6100ed816100b0565b840191505092915050565b5f6020820190508181035f83015261011081846100c0565b90509291505056fea264697066735822122001498e9d7d6125ce22613ef32fdb7e8e03bf11ad361d7b00e210b82d7b7e0d4464736f6c634300081e0033",
abi: abi
);
Console.WriteLine($"Contract deployed at: {contractAddress}");

// var contract = await ThirdwebContract.Create(client: client, address: contractAddress, chain: 11155111, abi: abi);
// var welcomeMessage = await contract.Read<string>("welcome");
// Console.WriteLine($"Welcome message from deployed contract: {welcomeMessage}");
var contract = await ThirdwebContract.Create(client: client, address: contractAddress, chain: 11155111, abi: abi);
var welcomeMessage = await contract.Read<string>("welcome");
Console.WriteLine($"Welcome message from deployed contract: {welcomeMessage}");

#endregion

Expand Down Expand Up @@ -174,143 +173,6 @@

#endregion

#region Indexer

// // Create a ThirdwebInsight instance
// var insight = await ThirdwebInsight.Create(client);

// var ethPriceToday = await insight.GetTokenPrice(addressOrSymbol: "ETH", chainId: 1);
// Console.WriteLine($"ETH price today: {ethPriceToday.PriceUsd}");

// var ethPriceYesterday = await insight.GetTokenPrice(addressOrSymbol: "ETH", chainId: 1, timestamp: Utils.GetUnixTimeStampNow() - 86400);
// Console.WriteLine($"ETH price yesterday: {ethPriceYesterday.PriceUsd}");

// var multiTokenPrices = await insight.GetTokenPrices(addressOrSymbols: new[] { "POL", "APE" }, chainIds: new BigInteger[] { 137, 33139 });
// Console.WriteLine($"Multi token prices: {JsonConvert.SerializeObject(multiTokenPrices, Formatting.Indented)}");

// // Setup some filters
// var address = await Utils.GetAddressFromENS(client, "vitalik.eth");
// var chains = new BigInteger[] { 1, 137, 42161 };

// // Fetch all token types
// var tokens = await insight.GetTokens(address, chains);
// Console.WriteLine($"ERC20 Count: {tokens.erc20Tokens.Length} | ERC721 Count: {tokens.erc721Tokens.Length} | ERC1155 Count: {tokens.erc1155Tokens.Length}");

// // Fetch specific token types
// var erc20Tokens = await insight.GetTokens_ERC20(address, chains);
// Console.WriteLine($"ERC20 Tokens: {JsonConvert.SerializeObject(erc20Tokens, Formatting.Indented)}");

// // Fetch specific token types
// var erc721Tokens = await insight.GetTokens_ERC721(address, chains);
// Console.WriteLine($"ERC721 Tokens: {JsonConvert.SerializeObject(erc721Tokens, Formatting.Indented)}");

// // Fetch specific token types
// var erc1155Tokens = await insight.GetTokens_ERC1155(address, chains);
// Console.WriteLine($"ERC1155 Tokens: {JsonConvert.SerializeObject(erc1155Tokens, Formatting.Indented)}");

// // Fetch events (great amount of optional filters available)
// var events = await insight.GetEvents(
// chainIds: new BigInteger[] { 1 }, // ethereum
// contractAddress: "0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d", // bored apes
// eventSignature: "Transfer(address,address,uint256)", // transfer event
// fromTimestamp: Utils.GetUnixTimeStampNow() - 3600, // last hour
// sortBy: SortBy.TransactionIndex, // block number, block timestamp or transaction index
// sortOrder: SortOrder.Desc, // latest first
// limit: 5 // last 5 transfers
// );
// Console.WriteLine($"Events: {JsonConvert.SerializeObject(events, Formatting.Indented)}");

// // Fetch transactions (great amount of optional filters available)
// var transactions = await insight.GetTransactions(
// chainIds: new BigInteger[] { 1 }, // ethereum
// contractAddress: "0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d", // bored apes
// fromTimestamp: Utils.GetUnixTimeStampNow() - 3600, // last hour
// sortBy: SortBy.TransactionIndex, // block number, block timestamp or transaction index
// sortOrder: SortOrder.Desc, // latest first
// limit: 5 // last 5 transactions
// );
// Console.WriteLine($"Transactions: {JsonConvert.SerializeObject(transactions, Formatting.Indented)}");

// // Use ToNFT to ToNFTList extensions
// var convertedNft = erc721Tokens[0].ToNFT();

// var convertedNfts = erc721Tokens.ToNFTList();

// // Use NFT Extensions (GetNFTImageBytes, or GetNFTSprite in Unity)
// var imageBytes = await convertedNft.GetNFTImageBytes(client);
// var pathToSave = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures), "nft.png");
// await File.WriteAllBytesAsync(pathToSave, imageBytes);
// Console.WriteLine($"NFT image saved to: {pathToSave}");

#endregion

#region AI

// // Prepare some context
// var myChain = 11155111;
// var myWallet = await SmartWallet.Create(personalWallet: await PrivateKeyWallet.Generate(client), chainId: myChain, gasless: true);
// var myContractAddress = "0xe2cb0eb5147b42095c2FfA6F7ec953bb0bE347D8"; // DropERC1155
// var usdcAddress = "0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238";

// // Create a Nebula session
// var nebula = await ThirdwebNebula.Create(client);

// // Chat, passing wallet context
// var response1 = await nebula.Chat(message: "What is my wallet address?", wallet: myWallet);
// Console.WriteLine($"Response 1: {response1.Message}");

// // Chat, passing contract context
// var response2 = await nebula.Chat(
// message: "What's the total supply of token id 0 for this contract?",
// context: new NebulaContext(contractAddresses: new List<string> { myContractAddress }, chainIds: new List<BigInteger> { myChain })
// );
// Console.WriteLine($"Response 2: {response2.Message}");

// // Chat, passing multiple messages and context
// var response3 = await nebula.Chat(
// messages: new List<NebulaChatMessage>
// {
// new($"Tell me the name of this contract: {myContractAddress}", NebulaChatRole.User),
// new("The name of the contract is CatDrop", NebulaChatRole.Assistant),
// new("What's the symbol of this contract?", NebulaChatRole.User),
// },
// context: new NebulaContext(contractAddresses: new List<string> { myContractAddress }, chainIds: new List<BigInteger> { myChain })
// );
// Console.WriteLine($"Response 3: {response3.Message}");

// // Execute, this directly sends transactions
// var executionResult = await nebula.Execute("Approve 1 USDC to vitalik.eth", wallet: myWallet, context: new NebulaContext(contractAddresses: new List<string>() { usdcAddress }));
// if (executionResult.TransactionReceipts != null && executionResult.TransactionReceipts.Count > 0)
// {
// Console.WriteLine($"Receipt: {executionResult.TransactionReceipts[0]}");
// }
// else
// {
// Console.WriteLine($"Message: {executionResult.Message}");
// }

// // Batch execute
// var batchExecutionResult = await nebula.Execute(
// new List<NebulaChatMessage>
// {
// new("What's the address of vitalik.eth", NebulaChatRole.User),
// new("The address of vitalik.eth is 0xd8dA6BF26964aF8E437eEa5e3616511D7G3a3298", NebulaChatRole.Assistant),
// new("Approve 1 USDC to them", NebulaChatRole.User),
// },
// wallet: myWallet,
// context: new NebulaContext(contractAddresses: new List<string>() { usdcAddress })
// );
// if (batchExecutionResult.TransactionReceipts != null && batchExecutionResult.TransactionReceipts.Count > 0)
// {
// Console.WriteLine($"Receipts: {JsonConvert.SerializeObject(batchExecutionResult.TransactionReceipts, Formatting.Indented)}");
// }
// else
// {
// Console.WriteLine($"Message: {batchExecutionResult.Message}");
// }

#endregion

#region Get Social Profiles

// var socialProfiles = await Utils.GetSocialProfiles(client, "joenrv.eth");
Expand All @@ -320,15 +182,15 @@

#region AA 0.6

// var smartWallet06 = await SmartWallet.Create(personalWallet: privateKeyWallet, chainId: 421614, gasless: true);
// var smartWallet06 = await SmartWallet.Create(personalWallet: guestWallet, chainId: 421614, gasless: true);
// var receipt06 = await smartWallet06.Transfer(chainId: 421614, toAddress: await smartWallet06.GetAddress(), weiAmount: 0);
// Console.WriteLine($"Receipt: {receipt06}");

#endregion

#region AA 0.7

// var smartWallet07 = await SmartWallet.Create(personalWallet: privateKeyWallet, chainId: 421614, gasless: true, entryPoint: Constants.ENTRYPOINT_ADDRESS_V07);
// var smartWallet07 = await SmartWallet.Create(personalWallet: guestWallet, chainId: 421614, gasless: true, entryPoint: Constants.ENTRYPOINT_ADDRESS_V07);
// var receipt07 = await smartWallet07.Transfer(chainId: 421614, toAddress: await smartWallet07.GetAddress(), weiAmount: 0);
// Console.WriteLine($"Receipt: {receipt07}");

Expand Down Expand Up @@ -498,8 +360,6 @@

// var ecosystemPersonalSignature = await ecosystemWallet.PersonalSign("Hello, Thirdweb!");
// Console.WriteLine($"Ecosystem Wallet personal sign: {ecosystemPersonalSignature}");
// var isValidPersonal = (await ecosystemWallet.RecoverAddressFromPersonalSign("Hello, Thirdweb!", ecosystemPersonalSignature)) == ecosystemWalletAddress;
// Console.WriteLine($"Ecosystem Wallet personal sign valid: {isValidPersonal}");

// var ecosystemTypedSignature = await ecosystemWallet.SignTypedDataV4(
// /*lang=json,strict*/
Expand Down
Loading