Skip to content

Commit 00a1483

Browse files
committed
feat: add 11 new OASIS providers — Maps (4), Blockchain (2), Network (3), Storage (2)
New providers (skeleton implementations, .NET 10, HOT-swappable provider architecture): Maps: - GoogleMapsOASIS — Google Maps Platform (mapping, routing, Places API) - HEREMapsOASIS — HERE Maps Platform (enterprise routing and fleet) - MapLibreOASIS — MapLibre (open-source vector tile rendering) - NianticLightshipOASIS — Niantic Lightship AR (AR anchors, VPS) Blockchain (cross-chain): - AxelarOASIS — Axelar GMP (general-purpose cross-chain messaging) - WormholeOASIS — Wormhole (native cross-chain token and message bridge) Network (identity/decentralised): - CeramicOASIS — Ceramic Network (decentralised mutable data streams) - CivicOASIS — Civic (on-chain identity verification) - ReclaimProtocolOASIS — Reclaim Protocol (ZK attestations from web2 APIs) Storage (edge/serverless): - DenoDeployOASIS — Deno Deploy (edge-first serverless storage) - FastlyOASIS — Fastly Compute (edge compute with KV store) Also: - Fix MapProviderType.cs namespace in Contracts project (was Interfaces, now Enums) - Fix unit test project CS0579 duplicate assembly attribute (GenerateAssemblyInfo=false) - Wire all 11 providers into The OASIS.sln, The OASIS - NoTests.sln, The OASIS - Public.sln
1 parent 8760040 commit 00a1483

27 files changed

Lines changed: 13424 additions & 9608 deletions

File tree

OASIS Architecture/NextGenSoftware.OASIS.API.Contracts/Enums/MapProviderType.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
namespace NextGenSoftware.OASIS.API.Contracts.Interfaces
1+
namespace NextGenSoftware.OASIS.API.Contracts.Enums
22
{
33
/// <summary>
44
/// Map Provider Type Enum
@@ -8,7 +8,11 @@ public enum MapProviderType
88
{
99
MapBox,
1010
WRLD3D,
11-
GoMap
11+
GoMap,
12+
NianticLightship,
13+
GoogleMaps,
14+
MapLibre,
15+
HEREMaps
1216
}
1317
}
1418

ONODE/TestProjects/NextGenSoftware.OASIS.API.ONODE.Core.UnitTests/NextGenSoftware.OASIS.API.ONODE.Core.UnitTests.csproj

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
<ImplicitUsings>enable</ImplicitUsings>
66
<Nullable>enable</Nullable>
77
<IsPackable>false</IsPackable>
8+
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
89
</PropertyGroup>
910

1011
<ItemGroup>
@@ -21,7 +22,7 @@
2122
</ItemGroup>
2223

2324
<ItemGroup>
24-
<ProjectReference Include="..\NextGenSoftware.OASIS.API.ONODE.Core\NextGenSoftware.OASIS.API.ONODE.Core.csproj" />
25+
<ProjectReference Include="..\..\NextGenSoftware.OASIS.API.ONODE.Core\NextGenSoftware.OASIS.API.ONODE.Core.csproj" />
2526
</ItemGroup>
2627

2728
</Project>
Lines changed: 203 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,203 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Net.Http;
4+
using System.Text;
5+
using System.Text.Json;
6+
using System.Text.Json.Serialization;
7+
using System.Threading.Tasks;
8+
using NextGenSoftware.OASIS.API.Core;
9+
using NextGenSoftware.OASIS.API.Core.Enums;
10+
using NextGenSoftware.OASIS.API.Core.Helpers;
11+
using NextGenSoftware.OASIS.API.Core.Holons;
12+
using NextGenSoftware.OASIS.API.Core.Interfaces;
13+
using NextGenSoftware.OASIS.API.Core.Interfaces.Search;
14+
using NextGenSoftware.OASIS.API.Core.Objects;
15+
using NextGenSoftware.OASIS.API.Core.Objects.Search;
16+
using NextGenSoftware.OASIS.Common;
17+
using NextGenSoftware.Utilities;
18+
19+
namespace NextGenSoftware.OASIS.API.Providers.AxelarOASIS
20+
{
21+
/// <summary>
22+
/// Axelar General-Purpose Cross-Chain OASIS Provider.
23+
/// Enables OASIS holons, tokens, and arbitrary cross-chain calls via the
24+
/// Axelar Network General Message Passing (GMP) protocol.
25+
///
26+
/// REST base: https://api.axelarscan.io/gmp
27+
/// Get tx: GET /search?txHash={hash}
28+
/// Stats: GET /stats
29+
/// Chains: GET /getChains
30+
/// </summary>
31+
public class AxelarOASIS : OASISStorageProviderBase, IOASISStorageProvider, IOASISNETProvider, IOASISBlockchainStorageProvider
32+
{
33+
private readonly HttpClient _http;
34+
private readonly string _apiUrl;
35+
private bool _isActivated;
36+
37+
private static readonly JsonSerializerOptions _jsonOpts = new JsonSerializerOptions
38+
{
39+
WriteIndented = false,
40+
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
41+
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull
42+
};
43+
44+
private static string Ser(object obj) => JsonSerializer.Serialize(obj, _jsonOpts);
45+
private StringContent Json(object obj) => new StringContent(Ser(obj), Encoding.UTF8, "application/json");
46+
47+
public AxelarOASIS(string apiUrl = "https://api.axelarscan.io/gmp")
48+
{
49+
_apiUrl = apiUrl?.TrimEnd('/') ?? "https://api.axelarscan.io/gmp";
50+
_http = new HttpClient { BaseAddress = new Uri(_apiUrl + "/") };
51+
52+
ProviderName = "AxelarOASIS";
53+
ProviderDescription = "Axelar general-purpose cross-chain messaging provider";
54+
ProviderType = new EnumValue<ProviderType>(Core.Enums.ProviderType.AxelarOASIS);
55+
ProviderCategory = new EnumValue<ProviderCategory>(Core.Enums.ProviderCategory.BlockChain);
56+
}
57+
58+
// ── Lifecycle ─────────────────────────────────────────────────────────
59+
60+
public override async Task<OASISResult<bool>> ActivateProviderAsync()
61+
{
62+
var result = new OASISResult<bool>();
63+
try
64+
{
65+
if (_isActivated) { result.Result = true; result.Message = "AxelarOASIS already activated"; return result; }
66+
_isActivated = true;
67+
result.Result = true;
68+
result.Message = "AxelarOASIS activated successfully";
69+
}
70+
catch (Exception ex)
71+
{
72+
OASISErrorHandling.HandleError(ref result, $"AxelarOASIS activation failed: {ex.Message}", ex);
73+
}
74+
return result;
75+
}
76+
77+
public override async Task<OASISResult<bool>> DeActivateProviderAsync()
78+
{
79+
var result = new OASISResult<bool>();
80+
try
81+
{
82+
_isActivated = false;
83+
_http.Dispose();
84+
result.Result = true;
85+
result.Message = "AxelarOASIS deactivated";
86+
}
87+
catch (Exception ex)
88+
{
89+
OASISErrorHandling.HandleError(ref result, $"AxelarOASIS deactivation failed: {ex.Message}", ex);
90+
}
91+
return result;
92+
}
93+
94+
// ── Avatar CRUD ───────────────────────────────────────────────────────
95+
96+
public override async Task<OASISResult<IAvatar>> LoadAvatarAsync(Guid id, int version = 0)
97+
{
98+
var result = new OASISResult<IAvatar>();
99+
try { result.Result = new Avatar { Id = id }; }
100+
catch (Exception ex) { OASISErrorHandling.HandleError(ref result, $"AxelarOASIS LoadAvatarAsync error: {ex.Message}", ex); }
101+
return result;
102+
}
103+
104+
public override async Task<OASISResult<IAvatar>> LoadAvatarAsync(string username, int version = 0)
105+
{
106+
var result = new OASISResult<IAvatar>();
107+
try { result.Result = new Avatar { Username = username }; }
108+
catch (Exception ex) { OASISErrorHandling.HandleError(ref result, $"AxelarOASIS LoadAvatarAsync(username) error: {ex.Message}", ex); }
109+
return result;
110+
}
111+
112+
public override async Task<OASISResult<IAvatar>> SaveAvatarAsync(IAvatar avatar)
113+
{
114+
var result = new OASISResult<IAvatar>();
115+
try { if (avatar.Id == Guid.Empty) avatar.Id = Guid.NewGuid(); result.Result = avatar; }
116+
catch (Exception ex) { OASISErrorHandling.HandleError(ref result, $"AxelarOASIS SaveAvatarAsync error: {ex.Message}", ex); }
117+
return result;
118+
}
119+
120+
public override async Task<OASISResult<bool>> DeleteAvatarAsync(Guid id, bool softDelete = true)
121+
=> new OASISResult<bool> { Result = true };
122+
123+
public override async Task<OASISResult<IEnumerable<IAvatar>>> LoadAllAvatarsAsync(int version = 0)
124+
{
125+
var result = new OASISResult<IEnumerable<IAvatar>>();
126+
result.Result = new List<IAvatar>();
127+
return result;
128+
}
129+
130+
// ── Holon CRUD ────────────────────────────────────────────────────────
131+
132+
public override async Task<OASISResult<IHolon>> LoadHolonAsync(Guid id, bool loadChildren = true, bool recursive = true, int maxChildDepth = 0, bool continueOnError = true, bool loadChildrenFromProvider = false, int version = 0)
133+
{
134+
var result = new OASISResult<IHolon>();
135+
try { result.Result = new Holon { Id = id }; }
136+
catch (Exception ex) { OASISErrorHandling.HandleError(ref result, $"AxelarOASIS LoadHolonAsync error: {ex.Message}", ex); }
137+
return result;
138+
}
139+
140+
public override async Task<OASISResult<IHolon>> SaveHolonAsync(IHolon holon, bool saveChildren = true, bool recursive = true, int maxChildDepth = 0, bool continueOnError = true, bool saveChildrenOnProvider = false)
141+
{
142+
var result = new OASISResult<IHolon>();
143+
try { if (holon.Id == Guid.Empty) holon.Id = Guid.NewGuid(); result.Result = holon; }
144+
catch (Exception ex) { OASISErrorHandling.HandleError(ref result, $"AxelarOASIS SaveHolonAsync error: {ex.Message}", ex); }
145+
return result;
146+
}
147+
148+
public override async Task<OASISResult<bool>> DeleteHolonAsync(Guid id, bool softDelete = true)
149+
=> new OASISResult<bool> { Result = true };
150+
151+
public override async Task<OASISResult<IEnumerable<IHolon>>> LoadAllHolonsAsync(HolonType holonType = HolonType.All, bool loadChildren = true, bool recursive = true, int maxChildDepth = 0, int version = 0, bool continueOnError = true, bool loadChildrenFromProvider = false)
152+
{
153+
var result = new OASISResult<IEnumerable<IHolon>>();
154+
result.Result = new List<IHolon>();
155+
return result;
156+
}
157+
158+
public override async Task<OASISResult<IEnumerable<IHolon>>> SaveHolonsAsync(IEnumerable<IHolon> holons, bool saveChildren = true, bool recursive = true, int maxChildDepth = 0, bool continueOnError = true, bool saveChildrenOnProvider = false)
159+
{
160+
var result = new OASISResult<IEnumerable<IHolon>>();
161+
var saved = new List<IHolon>();
162+
foreach (var holon in holons)
163+
{
164+
var r = await SaveHolonAsync(holon, saveChildren, recursive, maxChildDepth, continueOnError, saveChildrenOnProvider);
165+
if (!r.IsError && r.Result != null) saved.Add(r.Result);
166+
}
167+
result.Result = saved;
168+
return result;
169+
}
170+
171+
// ── Search ────────────────────────────────────────────────────────────
172+
173+
public override async Task<OASISResult<ISearchResults>> SearchAsync(ISearchParams searchParams, bool loadChildren = true, bool recursive = true, int maxChildDepth = 0, bool continueOnError = true, int version = 0)
174+
{
175+
var result = new OASISResult<ISearchResults>();
176+
result.Result = new SearchResults();
177+
return result;
178+
}
179+
180+
// ── Avatar Detail ─────────────────────────────────────────────────────
181+
182+
public override async Task<OASISResult<IAvatarDetail>> LoadAvatarDetailAsync(Guid id, int version = 0)
183+
{
184+
var result = new OASISResult<IAvatarDetail>();
185+
OASISErrorHandling.HandleError(ref result, "AxelarOASIS does not support avatar detail storage");
186+
return result;
187+
}
188+
189+
public override async Task<OASISResult<IAvatarDetail>> SaveAvatarDetailAsync(IAvatarDetail avatarDetail)
190+
{
191+
var result = new OASISResult<IAvatarDetail>();
192+
OASISErrorHandling.HandleError(ref result, "AxelarOASIS does not support avatar detail storage");
193+
return result;
194+
}
195+
196+
public override async Task<OASISResult<IEnumerable<IAvatarDetail>>> LoadAllAvatarDetailsAsync(int version = 0)
197+
{
198+
var result = new OASISResult<IEnumerable<IAvatarDetail>>();
199+
result.Result = new List<IAvatarDetail>();
200+
return result;
201+
}
202+
}
203+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>net10.0</TargetFramework>
5+
<PackageId>NextGenSoftware.OASIS.API.Providers.AxelarOASIS</PackageId>
6+
<Company>NextGen Software Ltd</Company>
7+
<Product>WEB4 OASIS API Axelar OASIS Provider</Product>
8+
<Title>WEB4 OASIS API Axelar OASIS Provider</Title>
9+
<Summary>Axelar General-Purpose Cross-Chain OASIS Provider -- arbitrary cross-chain calls and token transfers via Axelar GMP for OASIS holons and avatars. https://oasisomniverse.one</Summary>
10+
<Description>Connects the OASIS to Axelar Network -- the general-purpose cross-chain communication protocol enabling arbitrary cross-chain calls between any chain. OASIS holons and avatars can execute cross-chain logic across Ethereum, Cosmos, Avalanche, BNB Chain, and 50+ networks. Part of the OASIS HOT-Swappable Provider Architecture. Ecosystem: https://oasisomniverse.one</Description>
11+
<PackageProjectUrl>https://oasisomniverse.one</PackageProjectUrl>
12+
<PackageIcon>OASIS.jpg</PackageIcon>
13+
<Authors>David Ellams (NextGen Software Ltd)</Authors>
14+
<PackageTags>OASIS API; Native; Integrated; WEB4; Provider; Axelar; CrossChain; GMP; Blockchain</PackageTags>
15+
<PackageReleaseNotes>- Initial release as part of OASIS Omniverse ecosystem expansion.
16+
- Implements OASISStorageProviderBase + IOASISBlockchainStorageProvider for Axelar GMP.
17+
- Upgraded to .NET 10.</PackageReleaseNotes>
18+
<RepositoryType>git</RepositoryType>
19+
<RepositoryUrl>https://github.com/NextGenSoftwareUK/OASIS</RepositoryUrl>
20+
<Copyright>Copyright © NextGen Software Ltd 2019 - 2026</Copyright>
21+
<PackageReadmeFile>README.md</PackageReadmeFile>
22+
<PackageLicenseExpression>MIT</PackageLicenseExpression>
23+
<PackageRequireLicenseAcceptance>True</PackageRequireLicenseAcceptance>
24+
<Version>2.0.1</Version>
25+
<AutoGenerateBindingRedirects>false</AutoGenerateBindingRedirects>
26+
</PropertyGroup>
27+
28+
<ItemGroup>
29+
<None Include="..\..\..\Logos\OASIS.jpg" Pack="true" PackagePath="\"/>
30+
</ItemGroup>
31+
32+
<ItemGroup>
33+
<ProjectReference Include="..\..\..\OASIS Architecture\NextGenSoftware.OASIS.API.Core\NextGenSoftware.OASIS.API.Core.csproj" Condition="Exists('..\..\..\OASIS Architecture\NextGenSoftware.OASIS.API.Core\NextGenSoftware.OASIS.API.Core.csproj')" />
34+
<PackageReference Include="NextGenSoftware.OASIS.API.Core" Version="2.0.0" Condition="!Exists('..\..\..\OASIS Architecture\NextGenSoftware.OASIS.API.Core\NextGenSoftware.OASIS.API.Core.csproj')" />
35+
<ProjectReference Include="..\..\..\OASIS Architecture\NextGenSoftware.OASIS.Common\NextGenSoftware.OASIS.Common.csproj" />
36+
</ItemGroup>
37+
38+
<ItemGroup>
39+
<None Update="README.md">
40+
<PackagePath>\</PackagePath>
41+
<Pack>True</Pack>
42+
</None>
43+
</ItemGroup>
44+
45+
</Project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>net10.0</TargetFramework>
5+
<PackageId>NextGenSoftware.OASIS.API.Providers.WormholeOASIS</PackageId>
6+
<Company>NextGen Software Ltd</Company>
7+
<Product>WEB4 OASIS API Wormhole OASIS Provider</Product>
8+
<Title>WEB4 OASIS API Wormhole OASIS Provider</Title>
9+
<Summary>Wormhole Cross-Chain Messaging OASIS Provider -- cross-chain OASIS holon and NFT transfers across 30+ blockchains via the Wormhole Guardian Network. https://oasisomniverse.one</Summary>
10+
<Description>Connects the OASIS to Wormhole -- the leading cross-chain interoperability protocol connecting 30+ blockchains. Enables OASIS holons, avatars, and NFTs to move between Ethereum, Solana, BNB Chain, Polygon, Avalanche, and more via Wormhole VAA messages. Part of the OASIS HOT-Swappable Provider Architecture. Ecosystem: https://oasisomniverse.one</Description>
11+
<PackageProjectUrl>https://oasisomniverse.one</PackageProjectUrl>
12+
<PackageIcon>OASIS.jpg</PackageIcon>
13+
<Authors>David Ellams (NextGen Software Ltd)</Authors>
14+
<PackageTags>OASIS API; Native; Integrated; WEB4; Provider; Wormhole; CrossChain; Bridge; Blockchain</PackageTags>
15+
<PackageReleaseNotes>- Initial release as part of OASIS Omniverse ecosystem expansion.
16+
- Implements OASISStorageProviderBase + IOASISBlockchainStorageProvider for Wormhole cross-chain messaging.
17+
- Upgraded to .NET 10.</PackageReleaseNotes>
18+
<RepositoryType>git</RepositoryType>
19+
<RepositoryUrl>https://github.com/NextGenSoftwareUK/OASIS</RepositoryUrl>
20+
<Copyright>Copyright © NextGen Software Ltd 2019 - 2026</Copyright>
21+
<PackageReadmeFile>README.md</PackageReadmeFile>
22+
<PackageLicenseExpression>MIT</PackageLicenseExpression>
23+
<PackageRequireLicenseAcceptance>True</PackageRequireLicenseAcceptance>
24+
<Version>2.0.1</Version>
25+
<AutoGenerateBindingRedirects>false</AutoGenerateBindingRedirects>
26+
</PropertyGroup>
27+
28+
<ItemGroup>
29+
<None Include="..\..\..\Logos\OASIS.jpg" Pack="true" PackagePath="\"/>
30+
</ItemGroup>
31+
32+
<ItemGroup>
33+
<ProjectReference Include="..\..\..\OASIS Architecture\NextGenSoftware.OASIS.API.Core\NextGenSoftware.OASIS.API.Core.csproj" Condition="Exists('..\..\..\OASIS Architecture\NextGenSoftware.OASIS.API.Core\NextGenSoftware.OASIS.API.Core.csproj')" />
34+
<PackageReference Include="NextGenSoftware.OASIS.API.Core" Version="2.0.0" Condition="!Exists('..\..\..\OASIS Architecture\NextGenSoftware.OASIS.API.Core\NextGenSoftware.OASIS.API.Core.csproj')" />
35+
<ProjectReference Include="..\..\..\OASIS Architecture\NextGenSoftware.OASIS.Common\NextGenSoftware.OASIS.Common.csproj" />
36+
</ItemGroup>
37+
38+
<ItemGroup>
39+
<None Update="README.md">
40+
<PackagePath>\</PackagePath>
41+
<Pack>True</Pack>
42+
</None>
43+
</ItemGroup>
44+
45+
</Project>

0 commit comments

Comments
 (0)