Skip to content

Commit 3f2b17d

Browse files
committed
EIP712 API Improvement
1 parent 55989cf commit 3f2b17d

File tree

8 files changed

+150
-255
lines changed

8 files changed

+150
-255
lines changed

Assets/Thirdweb/Core/Scripts/EIP712.cs

Lines changed: 54 additions & 208 deletions
Original file line numberDiff line numberDiff line change
@@ -11,78 +11,60 @@
1111
using WalletConnectSharp.Unity;
1212
using WalletConnectSharp.NEthereum;
1313
using MinimalForwarder = Thirdweb.Contracts.Forwarder.ContractDefinition;
14+
using MetaMask.Unity;
1415

1516
namespace Thirdweb
1617
{
1718
public static class EIP712
1819
{
1920
/// SIGNATURE GENERATION ///
2021

21-
public async static Task<string> GenerateSignature_TokenERC20(
22+
public async static Task<string> GenerateSignature_MinimalForwarder(
2223
string domainName,
2324
string version,
2425
BigInteger chainId,
2526
string verifyingContract,
26-
TokenERC20Contract.MintRequest mintRequest,
27+
MinimalForwarder.ForwardRequest forwardRequest,
2728
string privateKeyOverride = null
2829
)
2930
{
30-
var typedData = GetTypedDefinition_TokenERC20(domainName, version, chainId, verifyingContract);
31+
var typedData = GetTypedDefinition_MinimalForwarder(domainName, version, chainId, verifyingContract);
3132

32-
switch (ThirdwebManager.Instance.SDK.nativeSession.provider)
33+
if (privateKeyOverride != null)
34+
{
35+
var signer = new Eip712TypedDataSigner();
36+
var key = new EthECKey(privateKeyOverride);
37+
var signature = signer.SignTypedDataV4(forwardRequest, typedData, key);
38+
return signature;
39+
}
40+
else
3341
{
34-
case WalletProvider.LocalWallet:
35-
var signer = new Eip712TypedDataSigner();
36-
var key = new EthECKey(privateKeyOverride ?? ThirdwebManager.Instance.SDK.nativeSession.account.PrivateKey);
37-
var signature = signer.SignTypedDataV4(mintRequest, typedData, key);
38-
return signature;
39-
case WalletProvider.WalletConnectV1:
40-
var walletConnectMintRequest = new ERC20MintRequestWalletConnect()
41-
{
42-
To = mintRequest.To,
43-
PrimarySaleRecipient = mintRequest.PrimarySaleRecipient,
44-
Quantity = mintRequest.Quantity,
45-
Price = mintRequest.Price,
46-
Currency = mintRequest.Currency,
47-
ValidityStartTimestamp = mintRequest.ValidityStartTimestamp,
48-
ValidityEndTimestamp = mintRequest.ValidityEndTimestamp,
49-
Uid = mintRequest.Uid.ByteArrayToHexString()
50-
};
51-
return await WalletConnect.Instance.Session.EthSignTypedData(await ThirdwebManager.Instance.SDK.wallet.GetAddress(), walletConnectMintRequest, typedData);
52-
case WalletProvider.MagicLink:
53-
throw new UnityException("Magic Auth does not support EIP712 signing");
54-
default:
55-
throw new UnityException("No account connected!");
42+
return await ThirdwebManager.Instance.SDK.wallet.SignTypedDataV4(forwardRequest, typedData);
5643
}
5744
}
5845

59-
public partial class ERC20MintRequestWalletConnect : ERC20MintRequestBaseWalletConnect { }
60-
61-
public class ERC20MintRequestBaseWalletConnect
46+
public async static Task<string> GenerateSignature_TokenERC20(
47+
string domainName,
48+
string version,
49+
BigInteger chainId,
50+
string verifyingContract,
51+
TokenERC20Contract.MintRequest mintRequest,
52+
string privateKeyOverride = null
53+
)
6254
{
63-
[Parameter("address", "to", 1)]
64-
public virtual string To { get; set; }
65-
66-
[Parameter("address", "primarySaleRecipient", 2)]
67-
public virtual string PrimarySaleRecipient { get; set; }
68-
69-
[Parameter("uint256", "quantity", 3)]
70-
public virtual BigInteger Quantity { get; set; }
71-
72-
[Parameter("uint256", "price", 4)]
73-
public virtual BigInteger Price { get; set; }
74-
75-
[Parameter("address", "currency", 5)]
76-
public virtual string Currency { get; set; }
77-
78-
[Parameter("uint128", "validityStartTimestamp", 6)]
79-
public virtual BigInteger ValidityStartTimestamp { get; set; }
80-
81-
[Parameter("uint128", "validityEndTimestamp", 7)]
82-
public virtual BigInteger ValidityEndTimestamp { get; set; }
55+
var typedData = GetTypedDefinition_TokenERC20(domainName, version, chainId, verifyingContract);
8356

84-
[Parameter("bytes32", "uid", 8)]
85-
public virtual string Uid { get; set; }
57+
if (privateKeyOverride != null)
58+
{
59+
var signer = new Eip712TypedDataSigner();
60+
var key = new EthECKey(privateKeyOverride);
61+
var signature = signer.SignTypedDataV4(mintRequest, typedData, key);
62+
return signature;
63+
}
64+
else
65+
{
66+
return await ThirdwebManager.Instance.SDK.wallet.SignTypedDataV4(mintRequest, typedData);
67+
}
8668
}
8769

8870
public async static Task<string> GenerateSignature_TokenERC721(
@@ -96,68 +78,17 @@ public async static Task<string> GenerateSignature_TokenERC721(
9678
{
9779
var typedData = GetTypedDefinition_TokenERC721(domainName, version, chainId, verifyingContract);
9880

99-
switch (ThirdwebManager.Instance.SDK.nativeSession.provider)
81+
if (privateKeyOverride != null)
10082
{
101-
case WalletProvider.LocalWallet:
102-
var signer = new Eip712TypedDataSigner();
103-
var key = new EthECKey(privateKeyOverride ?? ThirdwebManager.Instance.SDK.nativeSession.account.PrivateKey);
104-
var signature = signer.SignTypedDataV4(mintRequest, typedData, key);
105-
return signature;
106-
case WalletProvider.WalletConnectV1:
107-
var walletConnectMintRequest = new ERC721MintRequestWalletConnect()
108-
{
109-
To = mintRequest.To,
110-
RoyaltyRecipient = mintRequest.RoyaltyRecipient,
111-
RoyaltyBps = mintRequest.RoyaltyBps,
112-
PrimarySaleRecipient = mintRequest.PrimarySaleRecipient,
113-
Uri = mintRequest.Uri,
114-
Price = mintRequest.Price,
115-
Currency = mintRequest.Currency,
116-
ValidityStartTimestamp = mintRequest.ValidityStartTimestamp,
117-
ValidityEndTimestamp = mintRequest.ValidityEndTimestamp,
118-
Uid = mintRequest.Uid.ByteArrayToHexString()
119-
};
120-
return await WalletConnect.Instance.Session.EthSignTypedData(await ThirdwebManager.Instance.SDK.wallet.GetAddress(), walletConnectMintRequest, typedData);
121-
case WalletProvider.MagicLink:
122-
throw new UnityException("Magic Auth does not support EIP712 signing");
123-
default:
124-
throw new UnityException("No account connected!");
83+
var signer = new Eip712TypedDataSigner();
84+
var key = new EthECKey(privateKeyOverride);
85+
var signature = signer.SignTypedDataV4(mintRequest, typedData, key);
86+
return signature;
87+
}
88+
else
89+
{
90+
return await ThirdwebManager.Instance.SDK.wallet.SignTypedDataV4(mintRequest, typedData);
12591
}
126-
}
127-
128-
public partial class ERC721MintRequestWalletConnect : ERC721MintRequestBaseWalletConnect { }
129-
130-
public class ERC721MintRequestBaseWalletConnect
131-
{
132-
[Parameter("address", "to", 1)]
133-
public virtual string To { get; set; }
134-
135-
[Parameter("address", "royaltyRecipient", 2)]
136-
public virtual string RoyaltyRecipient { get; set; }
137-
138-
[Parameter("uint256", "royaltyBps", 3)]
139-
public virtual BigInteger RoyaltyBps { get; set; }
140-
141-
[Parameter("address", "primarySaleRecipient", 4)]
142-
public virtual string PrimarySaleRecipient { get; set; }
143-
144-
[Parameter("string", "uri", 5)]
145-
public virtual string Uri { get; set; }
146-
147-
[Parameter("uint256", "price", 6)]
148-
public virtual BigInteger Price { get; set; }
149-
150-
[Parameter("address", "currency", 7)]
151-
public virtual string Currency { get; set; }
152-
153-
[Parameter("uint128", "validityStartTimestamp", 8)]
154-
public virtual BigInteger ValidityStartTimestamp { get; set; }
155-
156-
[Parameter("uint128", "validityEndTimestamp", 9)]
157-
public virtual BigInteger ValidityEndTimestamp { get; set; }
158-
159-
[Parameter("bytes32", "uid", 10)]
160-
public virtual string Uid { get; set; }
16192
}
16293

16394
public async static Task<string> GenerateSignature_TokenERC1155(
@@ -171,79 +102,20 @@ public async static Task<string> GenerateSignature_TokenERC1155(
171102
{
172103
var typedData = GetTypedDefinition_TokenERC1155(domainName, version, chainId, verifyingContract);
173104

174-
switch (ThirdwebManager.Instance.SDK.nativeSession.provider)
105+
if (privateKeyOverride != null)
175106
{
176-
case WalletProvider.LocalWallet:
177-
var signer = new Eip712TypedDataSigner();
178-
var key = new EthECKey(privateKeyOverride ?? ThirdwebManager.Instance.SDK.nativeSession.account.PrivateKey);
179-
var signature = signer.SignTypedDataV4(mintRequest, typedData, key);
180-
return signature;
181-
case WalletProvider.WalletConnectV1:
182-
var walletConnectMintRequest = new ERC1155MintRequestWalletConnect()
183-
{
184-
To = mintRequest.To,
185-
RoyaltyRecipient = mintRequest.RoyaltyRecipient,
186-
RoyaltyBps = mintRequest.RoyaltyBps,
187-
PrimarySaleRecipient = mintRequest.PrimarySaleRecipient,
188-
TokenId = mintRequest.TokenId,
189-
Uri = mintRequest.Uri,
190-
Quantity = mintRequest.Quantity,
191-
PricePerToken = mintRequest.PricePerToken,
192-
Currency = mintRequest.Currency,
193-
ValidityStartTimestamp = mintRequest.ValidityStartTimestamp,
194-
ValidityEndTimestamp = mintRequest.ValidityEndTimestamp,
195-
Uid = mintRequest.Uid.ByteArrayToHexString()
196-
};
197-
return await WalletConnect.Instance.Session.EthSignTypedData(await ThirdwebManager.Instance.SDK.wallet.GetAddress(), walletConnectMintRequest, typedData);
198-
case WalletProvider.MagicLink:
199-
throw new UnityException("Magic Auth does not support EIP712 signing");
200-
default:
201-
throw new UnityException("No account connected!");
107+
var signer = new Eip712TypedDataSigner();
108+
var key = new EthECKey(privateKeyOverride);
109+
var signature = signer.SignTypedDataV4(mintRequest, typedData, key);
110+
return signature;
111+
}
112+
else
113+
{
114+
return await ThirdwebManager.Instance.SDK.wallet.SignTypedDataV4(mintRequest, typedData);
202115
}
203116
}
204117

205-
public partial class ERC1155MintRequestWalletConnect : ERC1155MintRequestBaseWalletConnect { }
206-
207-
public class ERC1155MintRequestBaseWalletConnect
208-
{
209-
[Parameter("address", "to", 1)]
210-
public virtual string To { get; set; }
211-
212-
[Parameter("address", "royaltyRecipient", 2)]
213-
public virtual string RoyaltyRecipient { get; set; }
214-
215-
[Parameter("uint256", "royaltyBps", 3)]
216-
public virtual BigInteger RoyaltyBps { get; set; }
217-
218-
[Parameter("address", "primarySaleRecipient", 4)]
219-
public virtual string PrimarySaleRecipient { get; set; }
220-
221-
[Parameter("uint256", "tokenId", 5)]
222-
public virtual BigInteger TokenId { get; set; }
223-
224-
[Parameter("string", "uri", 6)]
225-
public virtual string Uri { get; set; }
226-
227-
[Parameter("uint256", "quantity", 7)]
228-
public virtual BigInteger Quantity { get; set; }
229-
230-
[Parameter("uint256", "pricePerToken", 8)]
231-
public virtual BigInteger PricePerToken { get; set; }
232-
233-
[Parameter("address", "currency", 9)]
234-
public virtual string Currency { get; set; }
235-
236-
[Parameter("uint128", "validityStartTimestamp", 10)]
237-
public virtual BigInteger ValidityStartTimestamp { get; set; }
238-
239-
[Parameter("uint128", "validityEndTimestamp", 11)]
240-
public virtual BigInteger ValidityEndTimestamp { get; set; }
241-
242-
[Parameter("bytes32", "uid", 12)]
243-
public virtual string Uid { get; set; }
244-
}
245-
246-
/// DOMAIN TYPES ///
118+
#region Typed Data Definitions
247119

248120
public static TypedData<Domain> GetTypedDefinition_TokenERC20(string domainName, string version, BigInteger chainId, string verifyingContract)
249121
{
@@ -293,34 +165,6 @@ public static TypedData<Domain> GetTypedDefinition_TokenERC1155(string domainNam
293165
};
294166
}
295167

296-
/// MINIMAL FORWARDER ///
297-
298-
public async static Task<string> GenerateSignature_MinimalForwarder(
299-
string domainName,
300-
string version,
301-
BigInteger chainId,
302-
string verifyingContract,
303-
MinimalForwarder.ForwardRequest forwardRequest,
304-
string privateKeyOverride = null
305-
)
306-
{
307-
var typedData = GetTypedDefinition_MinimalForwarder(domainName, version, chainId, verifyingContract);
308-
309-
switch (ThirdwebManager.Instance.SDK.nativeSession.provider)
310-
{
311-
case WalletProvider.LocalWallet:
312-
var signer = new Eip712TypedDataSigner();
313-
var key = new EthECKey(privateKeyOverride ?? ThirdwebManager.Instance.SDK.nativeSession.account.PrivateKey);
314-
return signer.SignTypedDataV4(forwardRequest, typedData, key);
315-
case WalletProvider.WalletConnectV1:
316-
return await WalletConnect.Instance.Session.EthSignTypedData(await ThirdwebManager.Instance.SDK.wallet.GetAddress(), forwardRequest, typedData);
317-
case WalletProvider.MagicLink:
318-
throw new UnityException("Magic Auth does not support EIP712 signing");
319-
default:
320-
throw new UnityException("No account connected!");
321-
}
322-
}
323-
324168
public static TypedData<Domain> GetTypedDefinition_MinimalForwarder(string domainName, string version, BigInteger chainId, string verifyingContract)
325169
{
326170
return new TypedData<Domain>
@@ -336,5 +180,7 @@ public static TypedData<Domain> GetTypedDefinition_MinimalForwarder(string domai
336180
PrimaryType = nameof(MinimalForwarder.ForwardRequest),
337181
};
338182
}
183+
184+
#endregion
339185
}
340186
}

Assets/Thirdweb/Core/Scripts/Utils.cs

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -117,13 +117,18 @@ public static string ReplaceIPFS(this string uri, string gateway = "https://gate
117117
public static TransactionResult ToTransactionResult(this Nethereum.RPC.Eth.DTOs.TransactionReceipt receipt)
118118
{
119119
TransactionResult result = new TransactionResult();
120-
result.receipt.from = receipt.From;
121-
result.receipt.to = receipt.To;
122-
result.receipt.transactionIndex = int.Parse(receipt.TransactionIndex.ToString());
123-
result.receipt.gasUsed = receipt.GasUsed.ToString();
124-
result.receipt.blockHash = receipt.BlockHash;
125-
result.receipt.transactionHash = receipt.TransactionHash;
126-
result.id = receipt.Status.ToString();
120+
121+
if (receipt != null)
122+
{
123+
result.receipt.from = receipt.From;
124+
result.receipt.to = receipt.To;
125+
result.receipt.transactionIndex = receipt.TransactionIndex != null ? int.Parse(receipt.TransactionIndex.ToString()) : -1;
126+
result.receipt.gasUsed = receipt.GasUsed != null ? receipt.GasUsed.ToString() : "-1";
127+
result.receipt.blockHash = receipt.BlockHash;
128+
result.receipt.transactionHash = receipt.TransactionHash;
129+
result.id = receipt.Status != null ? receipt.Status.ToString() : "-1";
130+
}
131+
127132
return result;
128133
}
129134

0 commit comments

Comments
 (0)