Skip to content

Commit ef3e25e

Browse files
DevChain: Move hosting types from Server tool to library, add reusable web extensions
- Move Accounts, Configuration, Forking, Hosting, Rpc/Handlers from DevChain.Server to DevChain - Add WebApplicationExtensions (AddDevChainServer/MapDevChainEndpoints) for reusable endpoint setup - Add anvil_impersonateAccount/anvil_stopImpersonatingAccount aliases - Slim DevChain.Server to thin CLI wrapper - Update Aspire devchain, template, and test fixtures to use new namespaces - Add nugetPatch.bat for patch builds, template nuget.bat, and TemplatePack README - Remove dead ExplorerContractInteractionTests referencing deleted service
1 parent 5d391e3 commit ef3e25e

29 files changed

Lines changed: 342 additions & 739 deletions

aspire/devchain/Nethereum.Aspire.DevChain.sln

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nethereum.Aspire.DevChain",
99
EndProject
1010
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nethereum.Aspire.ServiceDefaults", "..\shared\Nethereum.Aspire.ServiceDefaults\Nethereum.Aspire.ServiceDefaults.csproj", "{F8A11547-04C5-45D1-B7D7-1E39E1B06E5D}"
1111
EndProject
12-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nethereum.DevChain.Server", "..\..\src\Nethereum.DevChain.Server\Nethereum.DevChain.Server.csproj", "{82A5F0D5-685A-4BDE-9280-F456D95CBAE2}"
13-
EndProject
1412
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nethereum.DevChain", "..\..\src\Nethereum.DevChain\Nethereum.DevChain.csproj", "{6DE9950C-83C1-49D1-94A5-273F522AA4E4}"
1513
EndProject
1614
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nethereum.CoreChain", "..\..\src\Nethereum.CoreChain\Nethereum.CoreChain.csproj", "{EBD46BE8-A165-41EE-B13D-9E52E2CDE961}"
@@ -153,18 +151,6 @@ Global
153151
{F8A11547-04C5-45D1-B7D7-1E39E1B06E5D}.Release|x64.Build.0 = Release|Any CPU
154152
{F8A11547-04C5-45D1-B7D7-1E39E1B06E5D}.Release|x86.ActiveCfg = Release|Any CPU
155153
{F8A11547-04C5-45D1-B7D7-1E39E1B06E5D}.Release|x86.Build.0 = Release|Any CPU
156-
{82A5F0D5-685A-4BDE-9280-F456D95CBAE2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
157-
{82A5F0D5-685A-4BDE-9280-F456D95CBAE2}.Debug|Any CPU.Build.0 = Debug|Any CPU
158-
{82A5F0D5-685A-4BDE-9280-F456D95CBAE2}.Debug|x64.ActiveCfg = Debug|Any CPU
159-
{82A5F0D5-685A-4BDE-9280-F456D95CBAE2}.Debug|x64.Build.0 = Debug|Any CPU
160-
{82A5F0D5-685A-4BDE-9280-F456D95CBAE2}.Debug|x86.ActiveCfg = Debug|Any CPU
161-
{82A5F0D5-685A-4BDE-9280-F456D95CBAE2}.Debug|x86.Build.0 = Debug|Any CPU
162-
{82A5F0D5-685A-4BDE-9280-F456D95CBAE2}.Release|Any CPU.ActiveCfg = Release|Any CPU
163-
{82A5F0D5-685A-4BDE-9280-F456D95CBAE2}.Release|Any CPU.Build.0 = Release|Any CPU
164-
{82A5F0D5-685A-4BDE-9280-F456D95CBAE2}.Release|x64.ActiveCfg = Release|Any CPU
165-
{82A5F0D5-685A-4BDE-9280-F456D95CBAE2}.Release|x64.Build.0 = Release|Any CPU
166-
{82A5F0D5-685A-4BDE-9280-F456D95CBAE2}.Release|x86.ActiveCfg = Release|Any CPU
167-
{82A5F0D5-685A-4BDE-9280-F456D95CBAE2}.Release|x86.Build.0 = Release|Any CPU
168154
{6DE9950C-83C1-49D1-94A5-273F522AA4E4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
169155
{6DE9950C-83C1-49D1-94A5-273F522AA4E4}.Debug|Any CPU.Build.0 = Debug|Any CPU
170156
{6DE9950C-83C1-49D1-94A5-273F522AA4E4}.Debug|x64.ActiveCfg = Debug|Any CPU

aspire/devchain/Nethereum.Aspire.DevChain/Nethereum.Aspire.DevChain.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@
1212
</ItemGroup>
1313

1414
<ItemGroup Condition="'$(UseProjectReferences)' == 'true'">
15-
<ProjectReference Include="..\..\..\src\Nethereum.DevChain.Server\Nethereum.DevChain.Server.csproj" />
15+
<ProjectReference Include="..\..\..\src\Nethereum.DevChain\Nethereum.DevChain.csproj" />
1616
</ItemGroup>
1717

1818
<ItemGroup Condition="'$(UseProjectReferences)' != 'true'">
19-
<PackageReference Include="Nethereum.DevChain.Server" Version="5.*" />
19+
<PackageReference Include="Nethereum.DevChain" Version="6.*" />
2020
</ItemGroup>
2121

2222
</Project>
Lines changed: 4 additions & 132 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,5 @@
1-
using System.Text.Json;
2-
using Microsoft.AspNetCore.Builder;
3-
using Microsoft.AspNetCore.Http;
4-
using Microsoft.Extensions.DependencyInjection;
5-
using Microsoft.Extensions.Logging;
6-
using Nethereum.CoreChain.Rpc;
7-
using Nethereum.DevChain;
8-
using Nethereum.DevChain.Server.Accounts;
9-
using Nethereum.DevChain.Server.Configuration;
10-
using Nethereum.DevChain.Server.Hosting;
11-
using Nethereum.DevChain.Server.Server;
12-
using Nethereum.JsonRpc.Client.RpcMessages;
1+
using Nethereum.DevChain.Configuration;
2+
using Nethereum.DevChain.Hosting;
133

144
var builder = WebApplication.CreateBuilder(args);
155

@@ -24,129 +14,11 @@
2414
if (config.ChainId == 0)
2515
config.ChainId = 31337;
2616

27-
builder.Services.AddDevChainServer(config);
28-
builder.Services.AddCors(options =>
29-
options.AddDefaultPolicy(policy =>
30-
policy.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod()));
31-
32-
builder.Services.AddHostedService(sp =>
33-
new DevChainHostedService(
34-
sp.GetRequiredService<DevChainNode>(),
35-
sp.GetRequiredService<DevAccountManager>(),
36-
sp,
37-
sp.GetService<ILoggerFactory>()?.CreateLogger<DevChainHostedService>()));
17+
builder.AddDevChainServer(config);
3818

3919
var app = builder.Build();
4020

41-
var dispatcher = app.Services.GetRequiredService<RpcDispatcher>();
42-
43-
app.UseCors();
44-
45-
app.MapPost("/", async (HttpContext httpContext) =>
46-
{
47-
try
48-
{
49-
using var reader = new StreamReader(httpContext.Request.Body);
50-
var json = await reader.ReadToEndAsync();
51-
52-
if (string.IsNullOrWhiteSpace(json))
53-
{
54-
httpContext.Response.StatusCode = 400;
55-
await httpContext.Response.WriteAsync("{\"error\":\"Empty request body\"}");
56-
return;
57-
}
58-
59-
httpContext.Response.ContentType = "application/json";
60-
61-
if (json.TrimStart().StartsWith('['))
62-
{
63-
var requests = JsonSerializer.Deserialize(json, CoreChainJsonContext.Default.JsonRpcRequestArray);
64-
if (requests != null)
65-
{
66-
var rpcRequests = requests.Select(ToRpcRequestMessage).ToArray();
67-
var responses = await dispatcher.DispatchBatchAsync(rpcRequests);
68-
var jsonResponses = responses.Select(ToJsonRpcResponse).ToArray();
69-
await httpContext.Response.WriteAsync(
70-
JsonSerializer.Serialize(jsonResponses, CoreChainJsonContext.Default.JsonRpcResponseArray));
71-
return;
72-
}
73-
}
74-
75-
var request = JsonSerializer.Deserialize(json, CoreChainJsonContext.Default.JsonRpcRequest);
76-
if (request == null)
77-
{
78-
httpContext.Response.StatusCode = 400;
79-
await httpContext.Response.WriteAsync("{\"error\":\"Invalid JSON-RPC request\"}");
80-
return;
81-
}
82-
83-
var rpcRequest = ToRpcRequestMessage(request);
84-
var response = await dispatcher.DispatchAsync(rpcRequest);
85-
var jsonResponse = ToJsonRpcResponse(response);
86-
await httpContext.Response.WriteAsync(
87-
JsonSerializer.Serialize(jsonResponse, CoreChainJsonContext.Default.JsonRpcResponse));
88-
}
89-
catch (JsonException)
90-
{
91-
httpContext.Response.StatusCode = 400;
92-
httpContext.Response.ContentType = "application/json";
93-
var errorResponse = new JsonRpcResponse
94-
{
95-
Id = null,
96-
Error = new JsonRpcError { Code = -32700, Message = "Parse error" }
97-
};
98-
await httpContext.Response.WriteAsync(
99-
JsonSerializer.Serialize(errorResponse, CoreChainJsonContext.Default.JsonRpcResponse));
100-
}
101-
catch (Exception ex)
102-
{
103-
httpContext.Response.ContentType = "application/json";
104-
var errorResponse = new JsonRpcResponse
105-
{
106-
Id = null,
107-
Error = new JsonRpcError { Code = -32603, Message = "Internal error: " + ex.Message }
108-
};
109-
await httpContext.Response.WriteAsync(
110-
JsonSerializer.Serialize(errorResponse, CoreChainJsonContext.Default.JsonRpcResponse));
111-
}
112-
});
113-
114-
app.MapGet("/", () => Results.Ok(new { status = "ok", service = "Nethereum.DevChain" }));
115-
21+
app.MapDevChainEndpoints();
11622
app.MapDefaultEndpoints();
11723

11824
app.Run();
119-
120-
static RpcRequestMessage ToRpcRequestMessage(JsonRpcRequest request)
121-
{
122-
return new RpcRequestMessage
123-
{
124-
Id = request.Id,
125-
Method = request.Method,
126-
JsonRpcVersion = request.Jsonrpc,
127-
RawParameters = request.Params.HasValue ? request.Params.Value : null
128-
};
129-
}
130-
131-
static JsonRpcResponse ToJsonRpcResponse(RpcResponseMessage response)
132-
{
133-
if (response.HasError)
134-
{
135-
return new JsonRpcResponse
136-
{
137-
Id = response.Id,
138-
Error = new JsonRpcError
139-
{
140-
Code = response.Error.Code,
141-
Message = response.Error.Message,
142-
Data = response.Error.Data
143-
}
144-
};
145-
}
146-
147-
return new JsonRpcResponse
148-
{
149-
Id = response.Id,
150-
Result = response.Result
151-
};
152-
}

0 commit comments

Comments
 (0)