Skip to content

Commit 3b20fe9

Browse files
sig mint
1 parent b7f012e commit 3b20fe9

File tree

7 files changed

+128
-15
lines changed

7 files changed

+128
-15
lines changed

Assets/SDKTest.cs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,22 @@ public async void OnWriteButtonClick()
5858
var nftCollection = sdk.GetContract("0x8bFD00BD1D3A2778BDA12AFddE5E65Cca95082DF");
5959
var meta = new NFTMetadata();
6060
meta.name = "Unity NFT";
61-
meta.description = "Minted From Unity";
62-
// get a cat image url
61+
meta.description = "Minted From Unity (signature)";
62+
// get a cute kitten image url
63+
meta.image = "https://placekitten.com/200/300";
6364

64-
var result = await nftCollection.ERC721.Mint(meta);
65-
claimButton.text = "minted tokenId: " + result.id;
65+
// var result = await nftCollection.ERC721.Mint(meta);
66+
// claimButton.text = "minted tokenId: " + result.id;
67+
68+
var payload = new ERC721MintPayload();
69+
payload.metadata = meta;
70+
payload.to = "0xE79ee09bD47F4F5381dbbACaCff2040f2FbC5803";
71+
// TODO allow passing dates as unix timestamps
72+
var p = await nftCollection.ERC721.signature.Generate(payload);
73+
Debug.Log("sig:" + p.signature);
74+
var result = await nftCollection.ERC721.signature.Mint(p);
75+
claimButton.text = "sigminted tokenId: " + result.id;
76+
6677
}
78+
6779
}

Assets/Thirdweb/Scripts/Bridge.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public static void Initialize(string chainOrRPC) {
4343

4444
public static async Task<string> Connect() {
4545
var task = new TaskCompletionSource<string>();
46-
string taskId = System.Guid.NewGuid().ToString();
46+
string taskId = Guid.NewGuid().ToString();
4747
taskMap[taskId] = task;
4848
ThirdwebConnect(taskId, jsCallback);
4949
string result = await task.Task;
@@ -53,7 +53,7 @@ public static async Task<string> Connect() {
5353
public static async Task<T> InvokeRoute<T>(string route, string[] body)
5454
{
5555
var msg = JsonUtility.ToJson(new RequestMessageBody(body));
56-
string taskId = System.Guid.NewGuid().ToString();
56+
string taskId = Guid.NewGuid().ToString();
5757
var task = new TaskCompletionSource<string>();
5858
taskMap[taskId] = task;
5959
ThirdwebInvoke(taskId, route, msg, jsCallback);
@@ -65,7 +65,7 @@ public static async Task<T> InvokeRoute<T>(string route, string[] body)
6565
public static async Task<string> InvokeRouteRaw(string route, string[] body)
6666
{
6767
var msg = JsonUtility.ToJson(new RequestMessageBody(body));
68-
string taskId = System.Guid.NewGuid().ToString();
68+
string taskId = Guid.NewGuid().ToString();
6969
var task = new TaskCompletionSource<string>();
7070
taskMap[taskId] = task;
7171
ThirdwebInvoke(taskId, route, msg, jsCallback);

Assets/Thirdweb/Scripts/Contract.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ public class Contract
1010
public string chain;
1111
public string address;
1212
public ERC721 ERC721;
13+
1314
public Contract(string chain, string address) {
1415
this.chain = chain;
1516
this.address = address;
@@ -35,6 +36,5 @@ public async Task<TransactionResult> Write(string functionName, params object[]
3536
private string getRoute(string functionPath) {
3637
return this.address + "." + functionPath;
3738
}
38-
3939
}
4040
}

Assets/Thirdweb/Scripts/ERC721.cs

Lines changed: 81 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System;
12
using System.Threading.Tasks;
23

34
namespace Thirdweb
@@ -9,15 +10,17 @@ public class ERC721
910
{
1011
public string chain;
1112
public string address;
13+
public ERC721Signature signature;
14+
1215
public ERC721(string chain, string address)
1316
{
1417
this.chain = chain;
1518
this.address = address;
19+
this.signature = new ERC721Signature(chain, address);
1620
}
1721

1822
/// READ FUNCTIONS
1923

20-
2124
public async Task<NFT> Get(string tokenId)
2225
{
2326
return await Bridge.InvokeRoute<NFT>(getRoute("get"), new string[] { tokenId });
@@ -105,8 +108,85 @@ public async Task<TransactionResult> MintTo(string address, NFTMetadata nft)
105108
return await Bridge.InvokeRoute<TransactionResult>(getRoute("mintTo"), Utils.ToJsonStringArray(address, nft));
106109
}
107110

111+
public async Task<TransactionResult> GenerateSignature(NFTMetadata nft)
112+
{
113+
return await Bridge.InvokeRoute<TransactionResult>(getRoute("signature.generate"), Utils.ToJsonStringArray(nft));
114+
}
115+
116+
/// PRIVATE
117+
108118
private string getRoute(string functionPath) {
109119
return this.address + ".erc721." + functionPath;
110120
}
111121
}
122+
123+
[System.Serializable]
124+
#nullable enable
125+
public class ERC721MintPayload
126+
{
127+
public string to;
128+
public string price;
129+
public string currencyAddress;
130+
public string primarySaleRecipient;
131+
public string royaltyRecipient;
132+
public int royaltyBps;
133+
public int quantity;
134+
public NFTMetadata? metadata;
135+
public string uid;
136+
// TODO implement these, needs JS bridging support
137+
public DateTime? mintStartTime;
138+
public DateTime? mintEndTime;
139+
140+
public ERC721MintPayload() {
141+
this.to = Utils.AddressZero;
142+
this.price = "0";
143+
this.currencyAddress = Utils.AddressZero;
144+
this.primarySaleRecipient = Utils.AddressZero;
145+
this.royaltyRecipient = Utils.AddressZero;
146+
this.royaltyBps = 0;
147+
this.quantity = 1;
148+
this.metadata = null;
149+
this.mintEndTime = null;
150+
this.mintEndTime = null;
151+
this.uid = Utils.ToBytes32HexString(Guid.NewGuid().ToByteArray());
152+
}
153+
}
154+
155+
[System.Serializable]
156+
public struct ERC721SignedPayload
157+
{
158+
public string signature;
159+
public ERC721MintPayload payload;
160+
}
161+
162+
public class ERC721Signature
163+
{
164+
public string chain;
165+
public string address;
166+
167+
public ERC721Signature(string chain, string address)
168+
{
169+
this.chain = chain;
170+
this.address = address;
171+
}
172+
173+
public async Task<ERC721SignedPayload> Generate(ERC721MintPayload payloadToSign)
174+
{
175+
return await Bridge.InvokeRoute<ERC721SignedPayload>(getRoute("generate"), Utils.ToJsonStringArray(payloadToSign));
176+
}
177+
178+
public async Task<bool> Verify(ERC721SignedPayload signedPayload)
179+
{
180+
return await Bridge.InvokeRoute<bool>(getRoute("verify"), Utils.ToJsonStringArray(signedPayload));
181+
}
182+
183+
public async Task<TransactionResult> Mint(ERC721SignedPayload signedPayload)
184+
{
185+
return await Bridge.InvokeRoute<TransactionResult>(getRoute("mint"), Utils.ToJsonStringArray(signedPayload));
186+
}
187+
188+
private string getRoute(string functionPath) {
189+
return this.address + ".erc721.signature." + functionPath;
190+
}
191+
}
112192
}

Assets/Thirdweb/Scripts/Types.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
using System.Collections.Generic;
2+
13
namespace Thirdweb {
24
[System.Serializable]
35
public struct NFTMetadata
@@ -7,7 +9,8 @@ public struct NFTMetadata
79
public string description;
810
public string image;
911
public string name;
10-
// TODO: support properties;
12+
public string external_url;
13+
public Dictionary<string, string> properties;
1114
}
1215

1316
[System.Serializable]

Assets/Thirdweb/Scripts/Utils.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
1+
using System.Text;
12
using UnityEngine;
23

34
namespace Thirdweb
45
{
56
public class Utils
67
{
8+
9+
public static string AddressZero = "0x0000000000000000000000000000000000000000";
10+
711
public static string[] ToJsonStringArray(params object[] args) {
812
string[] stringArgs = new string[args.Length];
913
for (int i = 0; i < args.Length; i++)
1014
{
15+
Debug.Log("Type" + args[i].GetType());
1116
// if value type, convert to string otherwise serialize to json
1217
if (args[i].GetType().IsPrimitive || args[i] is string)
1318
{
@@ -20,5 +25,15 @@ public static string[] ToJsonStringArray(params object[] args) {
2025
}
2126
return stringArgs;
2227
}
28+
29+
public static string ToBytes32HexString(byte[] bytes)
30+
{
31+
var hex = new StringBuilder(64);
32+
foreach(var b in bytes)
33+
{
34+
hex.AppendFormat("{0:x2}", b);
35+
}
36+
return "0x" + hex.ToString().PadRight(64, '0');
37+
}
2338
}
2439
}

Assets/WebGLTemplates/Better2020/index.html

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -127,26 +127,29 @@
127127
}
128128

129129
w.bridge.invoke = async (route, payload) => {
130-
console.log("invoke called", route, payload);
131130
const routeArgs = route.split(".")
132131
const addr = routeArgs[0];
133132
const contract = await w.thirdweb.getContract(addr)
134133
const fnArgs = JSON.parse(payload).arguments;
135-
const parsedARgs = fnArgs.map((arg) => {
134+
const parsedArgs = fnArgs.map((arg) => {
136135
try {
137136
return JSON.parse(arg);
138137
} catch (e) {
139138
return arg;
140139
}
141140
});
141+
console.log("invoke called", route, parsedArgs);
142142
if(routeArgs.length === 2) {
143143
// TODO assumes contract call
144-
const result = await contract[routeArgs[1]](...parsedARgs)
144+
const result = await contract[routeArgs[1]](...parsedArgs)
145145
return JSON.stringify({ result: result }, bigNumberReplacer);
146146
} else if(routeArgs.length === 3) {
147-
const result = await contract[routeArgs[1]][routeArgs[2]](...parsedARgs)
147+
const result = await contract[routeArgs[1]][routeArgs[2]](...parsedArgs)
148148
return JSON.stringify({ result: result }, bigNumberReplacer);
149-
} else {
149+
} else if(routeArgs.length === 4) {
150+
const result = await contract[routeArgs[1]][routeArgs[2]][routeArgs[3]](...parsedArgs)
151+
return JSON.stringify({ result: result }, bigNumberReplacer);
152+
}else {
150153
console.error("invalid route", route);
151154
return null;
152155
}

0 commit comments

Comments
 (0)