Skip to content

Commit 1a11c52

Browse files
committed
Gasless skeleton + fixes
1 parent 34c8975 commit 1a11c52

17 files changed

+501
-39
lines changed

Assets/Thirdweb/Core/Contract Definitions/Forwarder.meta

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/Thirdweb/Core/Contract Definitions/Forwarder/ContractDefinition.meta

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
using System;
2+
using System.Threading.Tasks;
3+
using System.Collections.Generic;
4+
using System.Numerics;
5+
using Nethereum.Hex.HexTypes;
6+
using Nethereum.ABI.FunctionEncoding.Attributes;
7+
8+
namespace Thirdweb.Contracts.Forwarder.ContractDefinition
9+
{
10+
public partial class ForwardRequest : ForwardRequestBase { }
11+
12+
public class ForwardRequestBase
13+
{
14+
[Parameter("address", "from", 1)]
15+
public virtual string From { get; set; }
16+
17+
[Parameter("address", "to", 2)]
18+
public virtual string To { get; set; }
19+
20+
[Parameter("uint256", "value", 3)]
21+
public virtual BigInteger Value { get; set; }
22+
23+
[Parameter("uint256", "gas", 4)]
24+
public virtual BigInteger Gas { get; set; }
25+
26+
[Parameter("uint256", "nonce", 5)]
27+
public virtual BigInteger Nonce { get; set; }
28+
29+
[Parameter("bytes", "data", 6)]
30+
public virtual byte[] Data { get; set; }
31+
}
32+
}

Assets/Thirdweb/Core/Contract Definitions/Forwarder/ContractDefinition/ForwardRequest.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
using System;
2+
using System.Threading.Tasks;
3+
using System.Collections.Generic;
4+
using System.Numerics;
5+
using Nethereum.Hex.HexTypes;
6+
using Nethereum.ABI.FunctionEncoding.Attributes;
7+
using Nethereum.Web3;
8+
using Nethereum.RPC.Eth.DTOs;
9+
using Nethereum.Contracts.CQS;
10+
using Nethereum.Contracts;
11+
using System.Threading;
12+
13+
namespace Thirdweb.Contracts.Forwarder.ContractDefinition
14+
{
15+
public partial class ForwarderDeployment : ForwarderDeploymentBase
16+
{
17+
public ForwarderDeployment()
18+
: base(BYTECODE) { }
19+
20+
public ForwarderDeployment(string byteCode)
21+
: base(byteCode) { }
22+
}
23+
24+
public class ForwarderDeploymentBase : ContractDeploymentMessage
25+
{
26+
public static string BYTECODE =
27+
"61014060405234801561001157600080fd5b50604080518082018252600f81526e23a9a73b19102337b93bb0b93232b960891b602080830191825283518085019094526005845264302e302e3160d81b908401528151902060e08190527fae209a0b48f21c054280f2455d32cf309387644879d9acbd8ffc1991638118856101008190524660a0529192917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6100fa8184846040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6080523060c052610120525061010f92505050565b60805160a05160c05160e0516101005161012051610c5961015e600039600061057b015260006105ca015260006105a5015260006104fe01526000610528015260006105520152610c596000f3fe6080604052600436106100345760003560e01c80632d0335ab1461003957806347153f8214610082578063bf5d3bdb146100a3575b600080fd5b34801561004557600080fd5b5061006f610054366004610903565b6001600160a01b031660009081526020819052604090205490565b6040519081526020015b60405180910390f35b610095610090366004610933565b6100d3565b604051610079929190610a22565b3480156100af57600080fd5b506100c36100be366004610933565b6102fb565b6040519015158152602001610079565b600060606100e28585856102fb565b61014e5760405162461bcd60e51b815260206004820152603260248201527f4d696e696d616c466f727761726465723a207369676e617475726520646f6573604482015271081b9bdd081b585d18da081c995c5d595cdd60721b60648201526084015b60405180910390fd5b61015d60808601356001610a45565b60008061016d6020890189610903565b6001600160a01b03166001600160a01b03168152602001908152602001600020819055506000808660200160208101906101a79190610903565b6001600160a01b0316606088013560408901356101c760a08b018b610a66565b6101d460208d018d610903565b6040516020016101e693929190610aad565b60408051601f198184030181529082905261020091610ad3565b600060405180830381858888f193505050503d806000811461023e576040519150601f19603f3d011682016040523d82523d6000602084013e610243565b606091505b5091509150816102d25760448151101561029f5760405162461bcd60e51b815260206004820152601d60248201527f5472616e73616374696f6e2072657665727465642073696c656e746c790000006044820152606401610145565b600481019050808060200190518101906102b99190610b05565b60405162461bcd60e51b81526004016101459190610bb2565b6102e1603f6060890135610bc5565b5a116102ef576102ef610be7565b90969095509350505050565b60008061040e84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061040892507fdd8f4b70b0f4393e889bd39128a30628a78b61816a9eb8199759e7a349657e48915061036b905060208a018a610903565b61037b60408b0160208c01610903565b60408b013560608c013560808d013561039760a08f018f610a66565b6040516103a5929190610bfd565b6040805191829003822060208301989098526001600160a01b0396871690820152949093166060850152608084019190915260a083015260c082015260e08101919091526101000160405160208183030381529060405280519060200120610479565b906104cd565b905060808501356000806104256020890189610903565b6001600160a01b03166001600160a01b0316815260200190815260200160002054148015610470575061045b6020860186610903565b6001600160a01b0316816001600160a01b0316145b95945050505050565b60006104c76104866104f1565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b92915050565b60008060006104dc8585610618565b915091506104e98161065d565b509392505050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561054a57507f000000000000000000000000000000000000000000000000000000000000000046145b1561057457507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600080825160410361064e5760208301516040840151606085015160001a61064287828585610816565b94509450505050610656565b506000905060025b9250929050565b600081600481111561067157610671610c0d565b036106795750565b600181600481111561068d5761068d610c0d565b036106da5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610145565b60028160048111156106ee576106ee610c0d565b0361073b5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610145565b600381600481111561074f5761074f610c0d565b036107a75760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610145565b60048160048111156107bb576107bb610c0d565b036108135760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610145565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561084d57506000905060036108fa565b8460ff16601b1415801561086557508460ff16601c14155b1561087657506000905060046108fa565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156108ca573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166108f3576000600192509250506108fa565b9150600090505b94509492505050565b60006020828403121561091557600080fd5b81356001600160a01b038116811461092c57600080fd5b9392505050565b60008060006040848603121561094857600080fd5b833567ffffffffffffffff8082111561096057600080fd5b9085019060c0828803121561097457600080fd5b9093506020850135908082111561098a57600080fd5b818601915086601f83011261099e57600080fd5b8135818111156109ad57600080fd5b8760208285010111156109bf57600080fd5b6020830194508093505050509250925092565b60005b838110156109ed5781810151838201526020016109d5565b50506000910152565b60008151808452610a0e8160208601602086016109d2565b601f01601f19169290920160200192915050565b8215158152604060208201526000610a3d60408301846109f6565b949350505050565b808201808211156104c757634e487b7160e01b600052601160045260246000fd5b6000808335601e19843603018112610a7d57600080fd5b83018035915067ffffffffffffffff821115610a9857600080fd5b60200191503681900382131561065657600080fd5b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b60008251610ae58184602087016109d2565b9190910192915050565b634e487b7160e01b600052604160045260246000fd5b600060208284031215610b1757600080fd5b815167ffffffffffffffff80821115610b2f57600080fd5b818401915084601f830112610b4357600080fd5b815181811115610b5557610b55610aef565b604051601f8201601f19908116603f01168101908382118183101715610b7d57610b7d610aef565b81604052828152876020848701011115610b9657600080fd5b610ba78360208301602088016109d2565b979650505050505050565b60208152600061092c60208301846109f6565b600082610be257634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052600160045260246000fd5b8183823760009101908152919050565b634e487b7160e01b600052602160045260246000fdfea2646970667358221220a3713a0e71de2e72b50e3feeef5f9bdf862ec156b120efaa2accba9ab238f7d764736f6c63430008130033";
28+
29+
public ForwarderDeploymentBase()
30+
: base(BYTECODE) { }
31+
32+
public ForwarderDeploymentBase(string byteCode)
33+
: base(byteCode) { }
34+
}
35+
36+
public partial class ExecuteFunction : ExecuteFunctionBase { }
37+
38+
[Function("execute", typeof(ExecuteOutputDTO))]
39+
public class ExecuteFunctionBase : FunctionMessage
40+
{
41+
[Parameter("tuple", "req", 1)]
42+
public virtual ForwardRequest Req { get; set; }
43+
44+
[Parameter("bytes", "signature", 2)]
45+
public virtual byte[] Signature { get; set; }
46+
}
47+
48+
public partial class GetNonceFunction : GetNonceFunctionBase { }
49+
50+
[Function("getNonce", "uint256")]
51+
public class GetNonceFunctionBase : FunctionMessage
52+
{
53+
[Parameter("address", "from", 1)]
54+
public virtual string From { get; set; }
55+
}
56+
57+
public partial class VerifyFunction : VerifyFunctionBase { }
58+
59+
[Function("verify", "bool")]
60+
public class VerifyFunctionBase : FunctionMessage
61+
{
62+
[Parameter("tuple", "req", 1)]
63+
public virtual ForwardRequest Req { get; set; }
64+
65+
[Parameter("bytes", "signature", 2)]
66+
public virtual byte[] Signature { get; set; }
67+
}
68+
69+
public partial class ExecuteOutputDTO : ExecuteOutputDTOBase { }
70+
71+
[FunctionOutput]
72+
public class ExecuteOutputDTOBase : IFunctionOutputDTO
73+
{
74+
[Parameter("bool", "", 1)]
75+
public virtual bool ReturnValue1 { get; set; }
76+
77+
[Parameter("bytes", "", 2)]
78+
public virtual byte[] ReturnValue2 { get; set; }
79+
}
80+
81+
public partial class GetNonceOutputDTO : GetNonceOutputDTOBase { }
82+
83+
[FunctionOutput]
84+
public class GetNonceOutputDTOBase : IFunctionOutputDTO
85+
{
86+
[Parameter("uint256", "", 1)]
87+
public virtual BigInteger ReturnValue1 { get; set; }
88+
}
89+
90+
public partial class VerifyOutputDTO : VerifyOutputDTOBase { }
91+
92+
[FunctionOutput]
93+
public class VerifyOutputDTOBase : IFunctionOutputDTO
94+
{
95+
[Parameter("bool", "", 1)]
96+
public virtual bool ReturnValue1 { get; set; }
97+
}
98+
}

Assets/Thirdweb/Core/Contract Definitions/Forwarder/ContractDefinition/ForwarderDefinition.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
using System;
2+
using System.Threading.Tasks;
3+
using System.Collections.Generic;
4+
using System.Numerics;
5+
using Nethereum.Hex.HexTypes;
6+
using Nethereum.ABI.FunctionEncoding.Attributes;
7+
using Nethereum.Web3;
8+
using Nethereum.RPC.Eth.DTOs;
9+
using Nethereum.Contracts.CQS;
10+
using Nethereum.Contracts.ContractHandlers;
11+
using Nethereum.Contracts;
12+
using System.Threading;
13+
using Thirdweb.Contracts.Forwarder.ContractDefinition;
14+
15+
namespace Thirdweb.Contracts.Forwarder
16+
{
17+
public partial class ForwarderService
18+
{
19+
public static Task<TransactionReceipt> DeployContractAndWaitForReceiptAsync(
20+
Nethereum.Web3.Web3 web3,
21+
ForwarderDeployment forwarderDeployment,
22+
CancellationTokenSource cancellationTokenSource = null
23+
)
24+
{
25+
return web3.Eth.GetContractDeploymentHandler<ForwarderDeployment>().SendRequestAndWaitForReceiptAsync(forwarderDeployment, cancellationTokenSource);
26+
}
27+
28+
public static Task<string> DeployContractAsync(Nethereum.Web3.Web3 web3, ForwarderDeployment forwarderDeployment)
29+
{
30+
return web3.Eth.GetContractDeploymentHandler<ForwarderDeployment>().SendRequestAsync(forwarderDeployment);
31+
}
32+
33+
public static async Task<ForwarderService> DeployContractAndGetServiceAsync(
34+
Nethereum.Web3.Web3 web3,
35+
ForwarderDeployment forwarderDeployment,
36+
CancellationTokenSource cancellationTokenSource = null
37+
)
38+
{
39+
var receipt = await DeployContractAndWaitForReceiptAsync(web3, forwarderDeployment, cancellationTokenSource);
40+
return new ForwarderService(web3, receipt.ContractAddress);
41+
}
42+
43+
protected Nethereum.Web3.Web3 Web3 { get; }
44+
45+
public ContractHandler ContractHandler { get; }
46+
47+
public ForwarderService(Nethereum.Web3.Web3 web3, string contractAddress)
48+
{
49+
Web3 = web3;
50+
ContractHandler = web3.Eth.GetContractHandler(contractAddress);
51+
}
52+
53+
public Task<string> ExecuteRequestAsync(ExecuteFunction executeFunction)
54+
{
55+
return ContractHandler.SendRequestAsync(executeFunction);
56+
}
57+
58+
public Task<TransactionReceipt> ExecuteRequestAndWaitForReceiptAsync(ExecuteFunction executeFunction, CancellationTokenSource cancellationToken = null)
59+
{
60+
return ContractHandler.SendRequestAndWaitForReceiptAsync(executeFunction, cancellationToken);
61+
}
62+
63+
public Task<string> ExecuteRequestAsync(ForwardRequest req, byte[] signature)
64+
{
65+
var executeFunction = new ExecuteFunction();
66+
executeFunction.Req = req;
67+
executeFunction.Signature = signature;
68+
69+
return ContractHandler.SendRequestAsync(executeFunction);
70+
}
71+
72+
public Task<TransactionReceipt> ExecuteRequestAndWaitForReceiptAsync(ForwardRequest req, byte[] signature, CancellationTokenSource cancellationToken = null)
73+
{
74+
var executeFunction = new ExecuteFunction();
75+
executeFunction.Req = req;
76+
executeFunction.Signature = signature;
77+
78+
return ContractHandler.SendRequestAndWaitForReceiptAsync(executeFunction, cancellationToken);
79+
}
80+
81+
public Task<BigInteger> GetNonceQueryAsync(GetNonceFunction getNonceFunction, BlockParameter blockParameter = null)
82+
{
83+
return ContractHandler.QueryAsync<GetNonceFunction, BigInteger>(getNonceFunction, blockParameter);
84+
}
85+
86+
public Task<BigInteger> GetNonceQueryAsync(string from, BlockParameter blockParameter = null)
87+
{
88+
var getNonceFunction = new GetNonceFunction();
89+
getNonceFunction.From = from;
90+
91+
return ContractHandler.QueryAsync<GetNonceFunction, BigInteger>(getNonceFunction, blockParameter);
92+
}
93+
94+
public Task<bool> VerifyQueryAsync(VerifyFunction verifyFunction, BlockParameter blockParameter = null)
95+
{
96+
return ContractHandler.QueryAsync<VerifyFunction, bool>(verifyFunction, blockParameter);
97+
}
98+
99+
public Task<bool> VerifyQueryAsync(ForwardRequest req, byte[] signature, BlockParameter blockParameter = null)
100+
{
101+
var verifyFunction = new VerifyFunction();
102+
verifyFunction.Req = req;
103+
verifyFunction.Signature = signature;
104+
105+
return ContractHandler.QueryAsync<VerifyFunction, bool>(verifyFunction, blockParameter);
106+
}
107+
}
108+
}

Assets/Thirdweb/Core/Contract Definitions/Forwarder/ForwarderService.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/Thirdweb/Core/Scripts/EIP712.cs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
using TokenERC1155Contract = Thirdweb.Contracts.TokenERC1155.ContractDefinition;
1111
using WalletConnectSharp.Unity;
1212
using WalletConnectSharp.NEthereum;
13+
using MinimalForwarder = Thirdweb.Contracts.Forwarder.ContractDefinition;
1314

1415
namespace Thirdweb
1516
{
@@ -289,5 +290,53 @@ public static TypedData<Domain> GetTypedDefinition_TokenERC1155(string domainNam
289290
PrimaryType = nameof(TokenERC1155Contract.MintRequest),
290291
};
291292
}
293+
294+
/// MINIMAL FORWARDER ///
295+
296+
public async static Task<string> GenerateSignature_MinimalForwarder(
297+
string domainName,
298+
string version,
299+
BigInteger chainId,
300+
string verifyingContract,
301+
MinimalForwarder.ForwardRequest forwardRequest
302+
)
303+
{
304+
if (ThirdwebManager.Instance.SDK.nativeSession.account != null)
305+
{
306+
var signer = new Eip712TypedDataSigner();
307+
var key = new EthECKey(ThirdwebManager.Instance.SDK.nativeSession.account.PrivateKey);
308+
var typedData = GetTypedDefinition_MinimalForwarder(domainName, version, chainId, verifyingContract);
309+
var signature = signer.SignTypedDataV4(forwardRequest, typedData, key);
310+
return signature;
311+
}
312+
else
313+
{
314+
if (Utils.ActiveWalletConnectSession())
315+
{
316+
var typedData = GetTypedDefinition_MinimalForwarder(domainName, version, chainId, verifyingContract);
317+
return await WalletConnect.Instance.Session.EthSignTypedData(await ThirdwebManager.Instance.SDK.wallet.GetAddress(), forwardRequest, typedData);
318+
}
319+
else
320+
{
321+
throw new UnityException("No account connected!");
322+
}
323+
}
324+
}
325+
326+
public static TypedData<Domain> GetTypedDefinition_MinimalForwarder(string domainName, string version, BigInteger chainId, string verifyingContract)
327+
{
328+
return new TypedData<Domain>
329+
{
330+
Domain = new Domain
331+
{
332+
Name = domainName,
333+
Version = version,
334+
ChainId = chainId,
335+
VerifyingContract = verifyingContract,
336+
},
337+
Types = MemberDescriptionFactory.GetTypesMemberDescription(typeof(Domain), typeof(MinimalForwarder.ForwardRequest)),
338+
PrimaryType = nameof(MinimalForwarder.ForwardRequest),
339+
};
340+
}
292341
}
293342
}

Assets/Thirdweb/Core/Scripts/Storage.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public class Storage
2222

2323
public Storage(ThirdwebSDK.StorageOptions? storageOptions)
2424
{
25-
if (storageOptions.HasValue)
25+
if (storageOptions != null)
2626
{
2727
this.ipfsGatewayUrl = string.IsNullOrEmpty(storageOptions.Value.ipfsGatewayUrl) ? "https://gateway.ipfscdn.io/ipfs/" : storageOptions.Value.ipfsGatewayUrl;
2828
}

0 commit comments

Comments
 (0)