Skip to content

Integrate Ecosystem Signing Policies #149

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
3 changes: 2 additions & 1 deletion Thirdweb/Thirdweb.RPC/ThirdwebRPC.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ public class ThirdwebRPC : IDisposable
private readonly object _responseLock = new();
private readonly object _cacheLock = new();
private readonly CancellationTokenSource _cancellationTokenSource = new();
private readonly JsonSerializerSettings _jsonSerializerSettings = new() { NullValueHandling = NullValueHandling.Ignore, };

private int _requestIdCounter = 1;

Expand Down Expand Up @@ -167,7 +168,7 @@ private ThirdwebRPC(ThirdwebClient client, BigInteger chainId)

private async Task SendBatchAsync(List<RpcRequest> batch)
{
var batchJson = JsonConvert.SerializeObject(batch);
var batchJson = JsonConvert.SerializeObject(batch, this._jsonSerializerSettings);
var content = new StringContent(batchJson, Encoding.UTF8, "application/json");

try
Expand Down
4 changes: 2 additions & 2 deletions Thirdweb/Thirdweb.Wallets/EngineWallet/EngineWallet.cs
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,7 @@ public Task<string> EthSign(string message)
throw new NotImplementedException();
}

public async Task<string> PersonalSign(byte[] rawMessage)
public async Task<string> PersonalSign(byte[] rawMessage, object originalMessage = null, BigInteger? chainId = null)
{
if (rawMessage == null)
{
Expand All @@ -207,7 +207,7 @@ public async Task<string> PersonalSign(byte[] rawMessage)
return JObject.Parse(content)["result"].Value<string>();
}

public async Task<string> PersonalSign(string message)
public async Task<string> PersonalSign(string message, object originalMessage = null, BigInteger? chainId = null)
{
if (string.IsNullOrEmpty(message))
{
Expand Down
8 changes: 6 additions & 2 deletions Thirdweb/Thirdweb.Wallets/IThirdwebWallet.cs
Original file line number Diff line number Diff line change
Expand Up @@ -56,15 +56,19 @@ public interface IThirdwebWallet
/// Signs a raw message using personal signing.
/// </summary>
/// <param name="rawMessage">The raw message to sign.</param>
/// <param name="originalMessage">Used for Ecosystem signing policies purposes only.</param>
/// <param name="chainId">Used for Ecosystem signing policies purposes only.</param>
/// <returns>The signed message.</returns>
public Task<string> PersonalSign(byte[] rawMessage);
public Task<string> PersonalSign(byte[] rawMessage, object originalMessage = null, BigInteger? chainId = null);

/// <summary>
/// Signs a message using personal signing.
/// </summary>
/// <param name="message">The message to sign.</param>
/// <param name="originalMessage">Used for Ecosystem signing polciies purposes only.</param>
/// <param name="chainId">Used for Ecosystem signing polciies purposes only.</param>
/// <returns>The signed message.</returns>
public Task<string> PersonalSign(string message);
public Task<string> PersonalSign(string message, object originalMessage = null, BigInteger? chainId = null);

/// <summary>
/// Recovers the address from a signed message using personal signing.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ public partial class EcosystemWallet : IThirdwebWallet
private const string EMBEDDED_WALLET_PATH_V1 = $"{EMBEDDED_WALLET_BASE_PATH}/v1";
private const string ENCLAVE_PATH = $"{EMBEDDED_WALLET_PATH_V1}/enclave-wallet";

private readonly JsonSerializerSettings _jsonSerializerSettings = new() { NullValueHandling = NullValueHandling.Ignore, };

internal EcosystemWallet(
string ecosystemId,
string ecosystemPartnerId,
Expand Down Expand Up @@ -1001,17 +1003,26 @@ public Task<string> EthSign(string message)
throw new NotImplementedException();
}

public async Task<string> PersonalSign(byte[] rawMessage)
public async Task<string> PersonalSign(byte[] rawMessage, object originalMessage = null, BigInteger? chainId = null)
{
if (rawMessage == null)
{
throw new ArgumentNullException(nameof(rawMessage), "Message to sign cannot be null.");
}

var url = $"{ENCLAVE_PATH}/sign-message";
var payload = new { messagePayload = new { message = rawMessage.BytesToHex(), isRaw = true } };
var payload = new
{
messagePayload = new
{
message = rawMessage.BytesToHex(),
isRaw = true,
originalMessage,
chainId
}
};

var requestContent = new StringContent(JsonConvert.SerializeObject(payload), Encoding.UTF8, "application/json");
var requestContent = new StringContent(JsonConvert.SerializeObject(payload, this._jsonSerializerSettings), Encoding.UTF8, "application/json");

var response = await this.HttpClient.PostAsync(url, requestContent).ConfigureAwait(false);
_ = response.EnsureSuccessStatusCode();
Expand All @@ -1021,17 +1032,26 @@ public async Task<string> PersonalSign(byte[] rawMessage)
return res.Signature;
}

public async Task<string> PersonalSign(string message)
public async Task<string> PersonalSign(string message, object originalMessage = null, BigInteger? chainId = null)
{
if (string.IsNullOrEmpty(message))
{
throw new ArgumentNullException(nameof(message), "Message to sign cannot be null.");
}

var url = $"{ENCLAVE_PATH}/sign-message";
var payload = new { messagePayload = new { message, isRaw = false } };
var payload = new
{
messagePayload = new
{
message,
isRaw = false,
originalMessage,
chainId
}
};

var requestContent = new StringContent(JsonConvert.SerializeObject(payload), Encoding.UTF8, "application/json");
var requestContent = new StringContent(JsonConvert.SerializeObject(payload, this._jsonSerializerSettings), Encoding.UTF8, "application/json");

var response = await this.HttpClient.PostAsync(url, requestContent).ConfigureAwait(false);
_ = response.EnsureSuccessStatusCode();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ public virtual Task<string> RecoverAddressFromEthSign(string message, string sig
return Task.FromResult(address);
}

public virtual Task<string> PersonalSign(byte[] rawMessage)
public virtual Task<string> PersonalSign(byte[] rawMessage, object originalMessage = null, BigInteger? chainId = null)
{
if (rawMessage == null)
{
Expand All @@ -221,7 +221,7 @@ public virtual Task<string> PersonalSign(byte[] rawMessage)
return Task.FromResult(signature);
}

public virtual Task<string> PersonalSign(string message)
public virtual Task<string> PersonalSign(string message, object originalMessage = null, BigInteger? chainId = null)
{
if (string.IsNullOrEmpty(message))
{
Expand Down
16 changes: 8 additions & 8 deletions Thirdweb/Thirdweb.Wallets/SmartWallet/SmartWallet.cs
Original file line number Diff line number Diff line change
Expand Up @@ -873,11 +873,12 @@ private async Task<PMSponsorOperationResponse> GetPaymasterAndData(object reques

private async Task<byte[]> HashAndSignUserOp(UserOperationV6 userOp, ThirdwebContract entryPointContract)
{
var hexified = EncodeUserOperation(userOp);
var userOpHash = await ThirdwebContract.Read<byte[]>(entryPointContract, "getUserOpHash", userOp);
var sig =
this._personalAccount.AccountType == ThirdwebAccountType.ExternalAccount
? await this._personalAccount.PersonalSign(userOpHash.BytesToHex()).ConfigureAwait(false)
: await this._personalAccount.PersonalSign(userOpHash).ConfigureAwait(false);
? await this._personalAccount.PersonalSign(userOpHash.BytesToHex(), hexified, this.ActiveChainId).ConfigureAwait(false)
: await this._personalAccount.PersonalSign(userOpHash, hexified, this.ActiveChainId).ConfigureAwait(false);
return sig.HexToBytes();
}

Expand Down Expand Up @@ -945,10 +946,11 @@ private async Task<byte[]> HashAndSignUserOp(UserOperationV7 userOp, ThirdwebCon

var userOpHash = await ThirdwebContract.Read<byte[]>(entryPointContract, "getUserOpHash", packedOp).ConfigureAwait(false);

var hexified = EncodeUserOperation(userOp);
var sig =
this._personalAccount.AccountType == ThirdwebAccountType.ExternalAccount
? await this._personalAccount.PersonalSign(userOpHash.BytesToHex()).ConfigureAwait(false)
: await this._personalAccount.PersonalSign(userOpHash).ConfigureAwait(false);
? await this._personalAccount.PersonalSign(userOpHash.BytesToHex(), hexified, this.ActiveChainId).ConfigureAwait(false)
: await this._personalAccount.PersonalSign(userOpHash, hexified, this.ActiveChainId).ConfigureAwait(false);

return sig.HexToBytes();
}
Expand Down Expand Up @@ -1081,17 +1083,15 @@ public Task<string> RecoverAddressFromEthSign(string message, string signature)
throw new NotImplementedException();
}

public Task<string> PersonalSign(byte[] rawMessage)
public Task<string> PersonalSign(byte[] rawMessage, object originalMessage = null, BigInteger? chainId = null)
{
throw new NotImplementedException();
}

/// <summary>
/// Signs a message with the personal account. The message will be verified using EIPs 1271 and 6492 if applicable.
/// </summary>
/// <param name="message">The message to sign.</param>
/// <returns>The signature.</returns>
public async Task<string> PersonalSign(string message)
public async Task<string> PersonalSign(string message, object originalMessage = null, BigInteger? chainId = null)
{
if (await Utils.IsZkSync(this.Client, this.ActiveChainId).ConfigureAwait(false))
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,7 @@ public class PackedUserOperation
public virtual byte[] Signature { get; set; }
}

[JsonObject(ItemNullValueHandling = NullValueHandling.Ignore)]
public class UserOperationHexifiedV6
{
[JsonProperty("sender")]
Expand Down Expand Up @@ -155,6 +156,7 @@ public class UserOperationHexifiedV6
public string Signature { get; set; }
}

[JsonObject(ItemNullValueHandling = NullValueHandling.Ignore)]
public class UserOperationHexifiedV7
{
[JsonProperty("sender")]
Expand Down