You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

499 lines
20 KiB
C#

using System.Collections.Generic;
using Newtonsoft.Json;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
namespace Thirdweb.Unity.Examples
{
[System.Serializable]
public class WalletPanelUI
{
public string Identifier;
public GameObject Panel;
public Button Action1Button;
public Button Action2Button;
public Button Action3Button;
public Button BackButton;
public Button NextButton;
public TMP_Text LogText;
public TMP_InputField InputField;
public Button InputFieldSubmitButton;
}
public class PlaygroundManager : MonoBehaviour
{
[field: SerializeField, Header("Wallet Options")]
private ulong ActiveChainId = 421614;
[field: SerializeField]
private bool WebglForceMetamaskExtension = false;
[field: SerializeField, Header("Connect Wallet")]
private GameObject ConnectWalletPanel;
[field: SerializeField]
private Button PrivateKeyWalletButton;
[field: SerializeField]
private Button EcosystemWalletButton;
[field: SerializeField]
private Button WalletConnectButton;
[field: SerializeField, Header("Wallet Panels")]
private List<WalletPanelUI> WalletPanels;
private ThirdwebChainData _chainDetails;
private void Awake()
{
InitializePanels();
}
private async void Start()
{
try
{
_chainDetails = await Utils.GetChainMetadata(client: ThirdwebManager.Instance.Client, chainId: ActiveChainId);
}
catch
{
_chainDetails = new ThirdwebChainData()
{
NativeCurrency = new ThirdwebChainNativeCurrency()
{
Decimals = 18,
Name = "ETH",
Symbol = "ETH"
}
};
}
}
private void InitializePanels()
{
CloseAllPanels();
ConnectWalletPanel.SetActive(true);
PrivateKeyWalletButton.onClick.RemoveAllListeners();
PrivateKeyWalletButton.onClick.AddListener(() =>
{
var options = GetWalletOptions(WalletProvider.PrivateKeyWallet);
ConnectWallet(options);
});
EcosystemWalletButton.onClick.RemoveAllListeners();
EcosystemWalletButton.onClick.AddListener(() => InitializeEcosystemWalletPanel());
WalletConnectButton.onClick.RemoveAllListeners();
WalletConnectButton.onClick.AddListener(() =>
{
var options = GetWalletOptions(WalletProvider.WalletConnectWallet);
ConnectWallet(options);
});
}
private async void ConnectWallet(WalletOptions options)
{
// Connect the wallet
var internalWalletProvider = options.Provider == WalletProvider.MetaMaskWallet ? WalletProvider.WalletConnectWallet : options.Provider;
var currentPanel = WalletPanels.Find(panel => panel.Identifier == internalWalletProvider.ToString());
Log(currentPanel.LogText, $"Connecting...");
var wallet = await ThirdwebManager.Instance.ConnectWallet(options);
// Initialize the wallet panel
CloseAllPanels();
// Setup actions
ClearLog(currentPanel.LogText);
currentPanel.Panel.SetActive(true);
currentPanel.BackButton.onClick.RemoveAllListeners();
currentPanel.BackButton.onClick.AddListener(InitializePanels);
currentPanel.NextButton.onClick.RemoveAllListeners();
currentPanel.NextButton.onClick.AddListener(InitializeContractsPanel);
currentPanel.Action1Button.onClick.RemoveAllListeners();
currentPanel.Action1Button.onClick.AddListener(async () =>
{
var address = await wallet.GetAddress();
address.CopyToClipboard();
Log(currentPanel.LogText, $"Address: {address}");
});
currentPanel.Action2Button.onClick.RemoveAllListeners();
currentPanel.Action2Button.onClick.AddListener(async () =>
{
var message = "Hello World!";
var signature = await wallet.PersonalSign(message);
Log(currentPanel.LogText, $"Signature: {signature}");
});
currentPanel.Action3Button.onClick.RemoveAllListeners();
currentPanel.Action3Button.onClick.AddListener(async () =>
{
LoadingLog(currentPanel.LogText);
var balance = await wallet.GetBalance(chainId: ActiveChainId);
var balanceEth = Utils.ToEth(wei: balance.ToString(), decimalsToDisplay: 4, addCommas: true);
Log(currentPanel.LogText, $"Balance: {balanceEth} {_chainDetails.NativeCurrency.Symbol}");
});
}
private WalletOptions GetWalletOptions(WalletProvider provider)
{
switch (provider)
{
case WalletProvider.PrivateKeyWallet:
return new WalletOptions(provider: WalletProvider.PrivateKeyWallet, chainId: ActiveChainId);
case WalletProvider.EcosystemWallet:
var ecosystemWalletOptions = new EcosystemWalletOptions(ecosystemId: "ecosystem.the-bonfire", authprovider: AuthProvider.Google);
return new WalletOptions(provider: WalletProvider.EcosystemWallet, chainId: ActiveChainId, ecosystemWalletOptions: ecosystemWalletOptions);
case WalletProvider.WalletConnectWallet:
var externalWalletProvider =
Application.platform == RuntimePlatform.WebGLPlayer && WebglForceMetamaskExtension ? WalletProvider.MetaMaskWallet : WalletProvider.WalletConnectWallet;
return new WalletOptions(provider: externalWalletProvider, chainId: ActiveChainId);
default:
throw new System.NotImplementedException("Wallet provider not implemented for this example.");
}
}
private void InitializeEcosystemWalletPanel()
{
var panel = WalletPanels.Find(walletPanel => walletPanel.Identifier == "EcosystemWallet_Authentication");
CloseAllPanels();
ClearLog(panel.LogText);
panel.Panel.SetActive(true);
panel.BackButton.onClick.RemoveAllListeners();
panel.BackButton.onClick.AddListener(InitializePanels);
// Email
panel.Action1Button.onClick.RemoveAllListeners();
panel.Action1Button.onClick.AddListener(() =>
{
InitializeEcosystemWalletPanel_Email();
});
// Phone
panel.Action2Button.onClick.RemoveAllListeners();
panel.Action2Button.onClick.AddListener(() =>
{
InitializeEcosystemWalletPanel_Phone();
});
// Socials
panel.Action3Button.onClick.RemoveAllListeners();
panel.Action3Button.onClick.AddListener(() =>
{
InitializeEcosystemWalletPanel_Socials();
});
}
private void InitializeEcosystemWalletPanel_Email()
{
var panel = WalletPanels.Find(walletPanel => walletPanel.Identifier == "EcosystemWallet_Email");
CloseAllPanels();
ClearLog(panel.LogText);
panel.Panel.SetActive(true);
panel.BackButton.onClick.RemoveAllListeners();
panel.BackButton.onClick.AddListener(InitializeEcosystemWalletPanel);
panel.InputFieldSubmitButton.onClick.RemoveAllListeners();
panel.InputFieldSubmitButton.onClick.AddListener(() =>
{
try
{
var email = panel.InputField.text;
var ecosystemWalletOptions = new EcosystemWalletOptions(ecosystemId: "ecosystem.the-bonfire", email: email);
var options = new WalletOptions(provider: WalletProvider.EcosystemWallet, chainId: ActiveChainId, ecosystemWalletOptions: ecosystemWalletOptions);
ConnectWallet(options);
}
catch (System.Exception e)
{
Log(panel.LogText, e.Message);
}
});
}
private void InitializeEcosystemWalletPanel_Phone()
{
var panel = WalletPanels.Find(walletPanel => walletPanel.Identifier == "EcosystemWallet_Phone");
CloseAllPanels();
ClearLog(panel.LogText);
panel.Panel.SetActive(true);
panel.BackButton.onClick.RemoveAllListeners();
panel.BackButton.onClick.AddListener(InitializeEcosystemWalletPanel);
panel.InputFieldSubmitButton.onClick.RemoveAllListeners();
panel.InputFieldSubmitButton.onClick.AddListener(() =>
{
try
{
var phone = panel.InputField.text;
var ecosystemWalletOptions = new EcosystemWalletOptions(ecosystemId: "ecosystem.the-bonfire", phoneNumber: phone);
var options = new WalletOptions(provider: WalletProvider.EcosystemWallet, chainId: ActiveChainId, ecosystemWalletOptions: ecosystemWalletOptions);
ConnectWallet(options);
}
catch (System.Exception e)
{
Log(panel.LogText, e.Message);
}
});
}
private void InitializeEcosystemWalletPanel_Socials()
{
var panel = WalletPanels.Find(walletPanel => walletPanel.Identifier == "EcosystemWallet_Socials");
CloseAllPanels();
ClearLog(panel.LogText);
panel.Panel.SetActive(true);
panel.BackButton.onClick.RemoveAllListeners();
panel.BackButton.onClick.AddListener(InitializeEcosystemWalletPanel);
// socials action 1 is google, 2 is apple 3 is discord
panel.Action1Button.onClick.RemoveAllListeners();
panel.Action1Button.onClick.AddListener(() =>
{
try
{
Log(panel.LogText, "Authenticating...");
var ecosystemWalletOptions = new EcosystemWalletOptions(ecosystemId: "ecosystem.the-bonfire", authprovider: AuthProvider.Google);
var options = new WalletOptions(provider: WalletProvider.EcosystemWallet, chainId: ActiveChainId, ecosystemWalletOptions: ecosystemWalletOptions);
ConnectWallet(options);
}
catch (System.Exception e)
{
Log(panel.LogText, e.Message);
}
});
panel.Action2Button.onClick.RemoveAllListeners();
panel.Action2Button.onClick.AddListener(() =>
{
try
{
Log(panel.LogText, "Authenticating...");
var ecosystemWalletOptions = new EcosystemWalletOptions(ecosystemId: "ecosystem.the-bonfire", authprovider: AuthProvider.Apple);
var options = new WalletOptions(provider: WalletProvider.EcosystemWallet, chainId: ActiveChainId, ecosystemWalletOptions: ecosystemWalletOptions);
ConnectWallet(options);
}
catch (System.Exception e)
{
Log(panel.LogText, e.Message);
}
});
panel.Action3Button.onClick.RemoveAllListeners();
panel.Action3Button.onClick.AddListener(() =>
{
try
{
Log(panel.LogText, "Authenticating...");
var ecosystemWalletOptions = new EcosystemWalletOptions(ecosystemId: "ecosystem.the-bonfire", authprovider: AuthProvider.Discord);
var options = new WalletOptions(provider: WalletProvider.EcosystemWallet, chainId: ActiveChainId, ecosystemWalletOptions: ecosystemWalletOptions);
ConnectWallet(options);
}
catch (System.Exception e)
{
Log(panel.LogText, e.Message);
}
});
}
private void InitializeContractsPanel()
{
var panel = WalletPanels.Find(walletPanel => walletPanel.Identifier == "Contracts");
CloseAllPanels();
ClearLog(panel.LogText);
panel.Panel.SetActive(true);
panel.BackButton.onClick.RemoveAllListeners();
panel.BackButton.onClick.AddListener(InitializePanels);
panel.NextButton.onClick.RemoveAllListeners();
panel.NextButton.onClick.AddListener(InitializeAccountAbstractionPanel);
// Get NFT
panel.Action1Button.onClick.RemoveAllListeners();
panel.Action1Button.onClick.AddListener(async () =>
{
try
{
LoadingLog(panel.LogText);
var dropErc1155Contract = await ThirdwebManager.Instance.GetContract(address: "0x94894F65d93eb124839C667Fc04F97723e5C4544", chainId: ActiveChainId);
var nft = await dropErc1155Contract.ERC1155_GetNFT(tokenId: 1);
Log(panel.LogText, $"NFT: {JsonConvert.SerializeObject(nft.Metadata)}");
var sprite = await nft.GetNFTSprite(client: ThirdwebManager.Instance.Client);
// spawn image for 3s
var image = new GameObject("NFT Image", typeof(RectTransform), typeof(CanvasRenderer), typeof(Image));
image.transform.SetParent(panel.Panel.transform, false);
image.GetComponent<Image>().sprite = sprite;
Destroy(image, 3f);
}
catch (System.Exception e)
{
Log(panel.LogText, e.Message);
}
});
// Call contract
panel.Action2Button.onClick.RemoveAllListeners();
panel.Action2Button.onClick.AddListener(async () =>
{
try
{
LoadingLog(panel.LogText);
var contract = await ThirdwebManager.Instance.GetContract(address: "0x6A7a26c9a595E6893C255C9dF0b593e77518e0c3", chainId: ActiveChainId);
var result = await contract.ERC1155_URI(tokenId: 1);
Log(panel.LogText, $"Result (uri): {result}");
}
catch (System.Exception e)
{
Log(panel.LogText, e.Message);
}
});
// Get ERC20 Balance
panel.Action3Button.onClick.RemoveAllListeners();
panel.Action3Button.onClick.AddListener(async () =>
{
try
{
LoadingLog(panel.LogText);
var dropErc20Contract = await ThirdwebManager.Instance.GetContract(address: "0xEBB8a39D865465F289fa349A67B3391d8f910da9", chainId: ActiveChainId);
var symbol = await dropErc20Contract.ERC20_Symbol();
var balance = await dropErc20Contract.ERC20_BalanceOf(ownerAddress: await ThirdwebManager.Instance.GetActiveWallet().GetAddress());
var balanceEth = Utils.ToEth(wei: balance.ToString(), decimalsToDisplay: 0, addCommas: false);
Log(panel.LogText, $"Balance: {balanceEth} {symbol}");
}
catch (System.Exception e)
{
Log(panel.LogText, e.Message);
}
});
}
private async void InitializeAccountAbstractionPanel()
{
var currentWallet = ThirdwebManager.Instance.GetActiveWallet();
var smartWallet = await ThirdwebManager.Instance.UpgradeToSmartWallet(personalWallet: currentWallet, chainId: ActiveChainId, smartWalletOptions: new SmartWalletOptions(sponsorGas: true));
var panel = WalletPanels.Find(walletPanel => walletPanel.Identifier == "AccountAbstraction");
CloseAllPanels();
ClearLog(panel.LogText);
panel.Panel.SetActive(true);
panel.BackButton.onClick.RemoveAllListeners();
panel.BackButton.onClick.AddListener(InitializePanels);
// Personal Sign (1271)
panel.Action1Button.onClick.RemoveAllListeners();
panel.Action1Button.onClick.AddListener(async () =>
{
try
{
var message = "Hello, World!";
var signature = await smartWallet.PersonalSign(message);
Log(panel.LogText, $"Signature: {signature}");
}
catch (System.Exception e)
{
Log(panel.LogText, e.Message);
}
});
// Create Session Key
panel.Action2Button.onClick.RemoveAllListeners();
panel.Action2Button.onClick.AddListener(async () =>
{
try
{
Log(panel.LogText, "Granting Session Key...");
var randomWallet = await PrivateKeyWallet.Generate(ThirdwebManager.Instance.Client);
var randomWalletAddress = await randomWallet.GetAddress();
var timeTomorrow = Utils.GetUnixTimeStampNow() + 60 * 60 * 24;
var sessionKey = await smartWallet.CreateSessionKey(
signerAddress: randomWalletAddress,
approvedTargets: new List<string> { Constants.ADDRESS_ZERO },
nativeTokenLimitPerTransactionInWei: "0",
permissionStartTimestamp: "0",
permissionEndTimestamp: timeTomorrow.ToString(),
reqValidityStartTimestamp: "0",
reqValidityEndTimestamp: timeTomorrow.ToString()
);
Log(panel.LogText, $"Session Key Created for {randomWalletAddress}: {sessionKey.TransactionHash}");
}
catch (System.Exception e)
{
Log(panel.LogText, e.Message);
}
});
// Get Active Signers
panel.Action3Button.onClick.RemoveAllListeners();
panel.Action3Button.onClick.AddListener(async () =>
{
try
{
LoadingLog(panel.LogText);
var activeSigners = await smartWallet.GetAllActiveSigners();
Log(panel.LogText, $"Active Signers: {JsonConvert.SerializeObject(activeSigners)}");
}
catch (System.Exception e)
{
Log(panel.LogText, e.Message);
}
});
}
private void CloseAllPanels()
{
ConnectWalletPanel.SetActive(false);
foreach (var walletPanel in WalletPanels)
{
walletPanel.Panel.SetActive(false);
}
}
private void ClearLog(TMP_Text logText)
{
logText.text = string.Empty;
}
private void Log(TMP_Text logText, string message)
{
logText.text = message;
ThirdwebDebug.Log(message);
}
private void LoadingLog(TMP_Text logText)
{
logText.text = "Loading...";
}
}
}