Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
3df3fac
- Can now search holons by parentId and filter by meta data.
dellams Dec 21, 2025
5aee40a
Multiple bug fixes for NFTs in STAR CLI.
dellams Dec 22, 2025
39a00f0
Merge branch 'Experimental' into master
dellams Dec 22, 2025
6e06bdd
Fixing build errors
dellams Dec 23, 2025
c6fe6cf
Fixing build issues
dellams Dec 23, 2025
c5bab2e
build fixed
dellams Dec 23, 2025
7cf7bab
Lots more done! :)
dellams Dec 25, 2025
3770957
Added STAR Demo Series Summary Doc
dellams Dec 25, 2025
b2425d4
Updated Docs & fixing more issues in providers.
dellams Dec 26, 2025
434d0c9
Merge pull request #352 from NextGenSoftwareUK/Experimental
dellams Dec 26, 2025
59e54d8
More fixes to the providers and STAR CLI & NFTs
dellams Dec 26, 2025
b6cf8d8
Got STAR building again.
dellams Dec 29, 2025
9a2f5a6
STAR CLI Improvements
dellams Dec 30, 2025
572c684
- Added support welcome message for donations etc to STAR CLI.
dellams Jan 2, 2026
82f1cf4
- Fixed bugs in ShowMetaData, GetMetaData & ManageMetaData methods in…
dellams Jan 5, 2026
6f8563f
Update Grants & Case Studies with OpenServ entry
dellams Jan 6, 2026
91aa340
Update README to remove completion indicators
dellams Jan 6, 2026
8fc57c1
Update README to streamline architecture content
dellams Jan 6, 2026
18cd81e
Add files via upload
dellams Jan 6, 2026
c529063
Add link to OASIS Torus architecture diagram
dellams Jan 6, 2026
7a048ce
Add image tag for OASIS Torus architecture
dellams Jan 6, 2026
e38e039
Add OASIS Architecture diagram to README
dellams Jan 6, 2026
da0fe3a
Fix OASIS Architecture image link
dellams Jan 6, 2026
9b4d295
Add STAR ODK/CLI to Phase 1 features
dellams Jan 6, 2026
01429ab
Changed the STARNETCategory to STARHolonType for STARHolonManager.
dellams Jan 6, 2026
449cfd1
Merge branch 'master' of https://github.com/NextGenSoftwareUK/OASIS
dellams Jan 6, 2026
2ad3bd4
- Removed IGetWeb3WalletBalanceRequest request param from GenerateKey…
dellams Jan 7, 2026
ab964b7
- Fixed a bug in CreateWalletWithoutSaving method in WalletManager i…
dellams Jan 9, 2026
a79cbcb
- Fixed a bug in LoadProviderWalletsForAvatarByIdAsync & SaveProvider…
dellams Jan 12, 2026
58ce198
LOTS of bugs fixed mostly in the Wallet API/Manager but also in ONODE…
dellams Jan 15, 2026
37aa201
- Added AvatarId back into IProviderWallet in OASIS.API.Core.
dellams Jan 17, 2026
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
Binary file added Docs/OASIS Torus.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
994 changes: 994 additions & 0 deletions Docs/OASIS_COMPREHENSIVE_SUMMARY_WITH_MEETING_NOTES.md

Large diffs are not rendered by default.

569 changes: 569 additions & 0 deletions Docs/OASIS_TECHNOLOGY_SUMMARY_AND_USE_CASES.md

Large diffs are not rendered by default.

850 changes: 850 additions & 0 deletions Docs/OASIS_ZOOM_MEETINGS_SUMMARY_AND_USE_CASES.md

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,15 @@
using NextGenSoftware.OASIS.API.DNA;
using NextGenSoftware.OASIS.API.Core.Managers;
using NextGenSoftware.OASIS.API.Core.Enums;
//using NextGenSoftware.OASIS.API.Providers.AcitvityPubOASIS;
using NextGenSoftware.OASIS.API.Providers.ActivityPubOASIS;
using NextGenSoftware.OASIS.API.Providers.EOSIOOASIS;
using NextGenSoftware.OASIS.API.Providers.ThreeFoldOASIS;
using NextGenSoftware.OASIS.API.Providers.EthereumOASIS;
using NextGenSoftware.OASIS.API.Providers.HoloOASIS;
using NextGenSoftware.OASIS.API.Providers.IPFSOASIS;
using NextGenSoftware.OASIS.API.Providers.MongoDBOASIS;
//using NextGenSoftware.OASIS.API.Providers.SEEDSOASIS;
//using NextGenSoftware.OASIS.API.Providers.TelosOASIS;
using NextGenSoftware.OASIS.API.Providers.SEEDSOASIS;
using NextGenSoftware.OASIS.API.Providers.TelosOASIS;
using NextGenSoftware.OASIS.API.Providers.SOLANAOASIS;
using NextGenSoftware.OASIS.API.Providers.SQLLiteDBOASIS;
using NextGenSoftware.OASIS.API.Providers.Neo4jOASIS.Aura;
Expand All @@ -24,49 +24,49 @@ namespace NextGenSoftware.OASIS.API.Native.EndPoint
{
public class OASISProviders
{
//EthereumOASIS _ethereum;
EthereumOASIS _ethereum;
ArbitrumOASIS _arbitrum;
RootstockOASIS _rootstock;
PolygonOASIS _polygon;
SolanaOASIS _solana;
//EOSIOOASIS _EOSIO;
//TelosOASIS _telos;
//SEEDSOASIS _SEEDS;
EOSIOOASIS _EOSIO;
TelosOASIS _telos;
SEEDSOASIS _SEEDS;
IPFSOASIS _IPFS;
HoloOASIS _holochain;
MongoDBOASIS _mongoDB;
Neo4jOASIS _neo4j;
SQLLiteDBOASIS _sqlLiteDb;
ThreeFoldOASIS _threeFold;
//AcitvityPubOASIS _activityPub;
ActivityPubOASIS _activityPub;
OASISDNA _OASISDNA;

//public SEEDSOASIS SEEDS
//{
// get
// {
// if (_SEEDS == null)
// {
// if (ProviderManager.Instance.IsProviderRegistered(ProviderType.SEEDSOASIS))
// _SEEDS = (SEEDSOASIS)ProviderManager.Instance.GetStorageProvider(ProviderType.SEEDSOASIS);
// else
// {
// // We could re-use the TelosOASIS Provider but it could have a different connection string to SEEDSOASIS so they need to be seperate.
// // TODO: The only other way is to share it and have to keep disconnecting and re-connecting with the different connections (SEEDS or EOSIO may even work with any EOSIO node end point? NEED TO TEST... if so then we can use the commented out line below).
// //_SEEDS = new SEEDSOASIS(Telos);
// _SEEDS = new SEEDSOASIS(new TelosOASIS(
// _OASISDNA.OASIS.StorageProviders.EOSIOOASIS.ConnectionString,
// _OASISDNA.OASIS.StorageProviders.EOSIOOASIS.AccountName,
// _OASISDNA.OASIS.StorageProviders.EOSIOOASIS.ChainId,
// _OASISDNA.OASIS.StorageProviders.EOSIOOASIS.AccountPrivateKey
// ));
// ProviderManager.Instance.RegisterProvider(_SEEDS);
// }
// }

// return _SEEDS;
// }
//}
public SEEDSOASIS SEEDS
{
get
{
if (_SEEDS == null)
{
if (ProviderManager.Instance.IsProviderRegistered(ProviderType.SEEDSOASIS))
_SEEDS = (SEEDSOASIS)ProviderManager.Instance.GetStorageProvider(ProviderType.SEEDSOASIS);
else
{
// We could re-use the TelosOASIS Provider but it could have a different connection string to SEEDSOASIS so they need to be seperate.
// TODO: The only other way is to share it and have to keep disconnecting and re-connecting with the different connections (SEEDS or EOSIO may even work with any EOSIO node end point? NEED TO TEST... if so then we can use the commented out line below).
//_SEEDS = new SEEDSOASIS(Telos);
_SEEDS = new SEEDSOASIS(new TelosOASIS(
_OASISDNA.OASIS.StorageProviders.EOSIOOASIS.ConnectionString,
_OASISDNA.OASIS.StorageProviders.EOSIOOASIS.AccountName,
_OASISDNA.OASIS.StorageProviders.EOSIOOASIS.ChainId,
_OASISDNA.OASIS.StorageProviders.EOSIOOASIS.AccountPrivateKey
));
ProviderManager.Instance.RegisterProvider(_SEEDS);
}
}

return _SEEDS;
}
}

public IPFSOASIS IPFS
{
Expand All @@ -89,26 +89,26 @@ public IPFSOASIS IPFS
}
}

//public EOSIOOASIS EOSIO
//{
// get
// {
// if (_EOSIO == null)
// {
// Task.Run(async () =>
// {
// OASISResult<IOASISStorageProvider> result = await OASISBootLoader.OASISBootLoader.RegisterProviderAsync(ProviderType.EOSIOOASIS);

// if (result != null && !result.IsError)
// _EOSIO = (EOSIOOASIS)result.Result;
// else
// OASISErrorHandling.HandleError(ref result, $"Error Occured In OASISAPIProviders In EOSIO Property Getter. Reason: {result.Message}");
// });
// }

// return _EOSIO;
// }
//}
public EOSIOOASIS EOSIO
{
get
{
if (_EOSIO == null)
{
Task.Run(async () =>
{
OASISResult<IOASISStorageProvider> result = await OASISBootLoader.OASISBootLoader.RegisterProviderAsync(ProviderType.EOSIOOASIS);

if (result != null && !result.IsError)
_EOSIO = (EOSIOOASIS)result.Result;
else
OASISErrorHandling.HandleError(ref result, $"Error Occured In OASISAPIProviders In EOSIO Property Getter. Reason: {result.Message}");
});
}

return _EOSIO;
}
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Race condition in lazy-initialized provider properties returns null

The newly uncommented provider properties (EOSIO, Ethereum, Telos, ActivityPub) use Task.Run to asynchronously initialize the backing field but immediately return the field value without awaiting completion. On first access, this returns null because the async registration hasn't finished yet. The fire-and-forget pattern means callers receive null and subsequent accesses may still race with the ongoing initialization.

Additional Locations (2)

Fix in Cursor Fix in Web


public SolanaOASIS Solana
{
Expand All @@ -131,26 +131,26 @@ public SolanaOASIS Solana
}
}

//public EthereumOASIS Ethereum
//{
// get
// {
// if (_ethereum == null)
// {
// Task.Run(async () =>
// {
// OASISResult<IOASISStorageProvider> result = await OASISBootLoader.OASISBootLoader.RegisterProviderAsync(ProviderType.EthereumOASIS);

// if (result != null && !result.IsError)
// _ethereum = (EthereumOASIS)result.Result;
// else
// OASISErrorHandling.HandleError(ref result, $"Error Occured In OASISAPIProviders In Ethereum Property Getter. Reason: {result.Message}");
// });
// }

// return _ethereum;
// }
//}
public EthereumOASIS Ethereum
{
get
{
if (_ethereum == null)
{
Task.Run(async () =>
{
OASISResult<IOASISStorageProvider> result = await OASISBootLoader.OASISBootLoader.RegisterProviderAsync(ProviderType.EthereumOASIS);

if (result != null && !result.IsError)
_ethereum = (EthereumOASIS)result.Result;
else
OASISErrorHandling.HandleError(ref result, $"Error Occured In OASISAPIProviders In Ethereum Property Getter. Reason: {result.Message}");
});
}

return _ethereum;
}
}

public ArbitrumOASIS Arbitrum
{
Expand Down Expand Up @@ -215,26 +215,26 @@ public RootstockOASIS Rootstock
}
}

//public TelosOASIS Telos
//{
// get
// {
// if (_telos == null)
// {
// Task.Run(async () =>
// {
// OASISResult<IOASISStorageProvider> result = await OASISBootLoader.OASISBootLoader.RegisterProviderAsync(ProviderType.TelosOASIS);

// if (result != null && !result.IsError)
// _telos = (TelosOASIS)result.Result;
// else
// OASISErrorHandling.HandleError(ref result, $"Error Occured In OASISAPIProviders In Telos Property Getter. Reason: {result.Message}");
// });
// }

// return _telos;
// }
//}
public TelosOASIS Telos
{
get
{
if (_telos == null)
{
Task.Run(async () =>
{
OASISResult<IOASISStorageProvider> result = await OASISBootLoader.OASISBootLoader.RegisterProviderAsync(ProviderType.TelosOASIS);

if (result != null && !result.IsError)
_telos = (TelosOASIS)result.Result;
else
OASISErrorHandling.HandleError(ref result, $"Error Occured In OASISAPIProviders In Telos Property Getter. Reason: {result.Message}");
});
}

return _telos;
}
}

public HoloOASIS Holochain
{
Expand Down Expand Up @@ -341,26 +341,26 @@ public ThreeFoldOASIS ThreeFold
}
}

//public AcitvityPubOASIS ActivityPub
//{
// get
// {
// if (_activityPub == null)
// {
// Task.Run(async () =>
// {
// OASISResult<IOASISStorageProvider> result = await OASISBootLoader.OASISBootLoader.RegisterProviderAsync(ProviderType.ActivityPubOASIS);

// if (result != null && !result.IsError)
// _activityPub = (AcitvityPubOASIS)result.Result;
// else
// OASISErrorHandling.HandleError(ref result, $"Error Occured In OASISAPIProviders In ActivityPub Property Getter. Reason: {result.Message}");
// });
// }

// return _activityPub;
// }
//}
public ActivityPubOASIS ActivityPub
{
get
{
if (_activityPub == null)
{
Task.Run(async () =>
{
OASISResult<IOASISStorageProvider> result = await OASISBootLoader.OASISBootLoader.RegisterProviderAsync(ProviderType.ActivityPubOASIS);

if (result != null && !result.IsError)
_activityPub = (ActivityPubOASIS)result.Result;
else
OASISErrorHandling.HandleError(ref result, $"Error Occured In OASISAPIProviders In ActivityPub Property Getter. Reason: {result.Message}");
});
}

return _activityPub;
}
}

public OASISProviders(OASISDNA OASISDNA)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,10 @@ public static void ShowMetaData(Dictionary<string, object> metaData, int display
CLIEngine.ShowMessage($"MetaData:", false);

foreach (string key in metaData.Keys)
CLIEngine.ShowMessage(string.Concat("".PadRight(displayFieldLength), key, " = ", GetMetaValue(metaData[key])), false);
{
if (key != "WEB5STARNFTId" && key != "{{{newnft}}}")
CLIEngine.ShowMessage(string.Concat("".PadRight(displayFieldLength), key, " = ", GetMetaValue(metaData[key])), false);
}
//CLIEngine.ShowMessage(string.Concat(" ", key, " = ", GetMetaValue(metaData[key])), false);
}
else
Expand All @@ -29,7 +32,10 @@ public static string GetMetaData(Dictionary<string, object> metaData)
if (metaData != null && metaData.Keys.Count > 0)
{
foreach (string key in metaData.Keys)
metaDataString = string.Concat(metaDataString, key, " = ", GetMetaValue(metaData[key]), ",");
{
if (key != "WEB5STARNFTId" && key != "{{{newnft}}}")
metaDataString = string.Concat(metaDataString, key, " = ", GetMetaValue(metaData[key]), ",");
}

if (metaDataString.Length > 2)
metaDataString = metaDataString.Substring(0, metaDataString.Length - 2);
Expand All @@ -51,17 +57,17 @@ public static bool IsBinary(object data)
if (data is byte[])
return true;

try
{
byte[] binaryData = Convert.FromBase64String(data.ToString());
//try
//{
// byte[] binaryData = Convert.FromBase64String(data.ToString());

for (int i = 0; i < binaryData.Length; i++)
{
if (binaryData[i] > 127)
return true;
}
}
catch { }
// for (int i = 0; i < binaryData.Length; i++)
// {
// if (binaryData[i] > 127)
// return true;
// }
//}
//catch { }

return false;
}
Expand Down Expand Up @@ -134,8 +140,11 @@ public static Dictionary<string, object> ManageMetaData(Dictionary<string, objec
int i = 1;
foreach (var kv in metaData)
{
CLIEngine.ShowMessage($" {i}. {kv.Key} = {GetMetaValue(kv.Value)}");
i++;
if (kv.Key != "WEB5STARNFTId" && kv.Key != "{{{newnft}}}")
{
CLIEngine.ShowMessage($" {i}. {kv.Key} = {GetMetaValue(kv.Value)}");
i++;
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Filtered display causes wrong metadata entries to be edited

The ManageMetaData method displays metadata entries with numbered indices while filtering out hidden keys ("WEB5STARNFTId" and "{{{newnft}}}"). However, when the user selects an entry to edit or remove, the code uses metaData.Keys.ElementAt(index - 1) on the unfiltered dictionary. This mismatch causes users to edit/remove the wrong entry, or accidentally modify hidden internal keys. The index validation also uses unfiltered metaData.Count, allowing selection of indices that don't correspond to visible items.

Additional Locations (1)

Fix in Cursor Fix in Web

}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -250,7 +250,7 @@ private static async Task<OASISResult<string>> GetWalletFromWalletManagerAsync(W
try
{
// Use the correct WalletManager method: LoadProviderWalletsForAvatarByIdAsync
var walletsResult = await walletManager.LoadProviderWalletsForAvatarByIdAsync(avatarId, false, false, providerType);
var walletsResult = await walletManager.LoadProviderWalletsForAvatarByIdAsync(avatarId, false, false, false, providerType);

if (!walletsResult.IsError && walletsResult.Result != null && walletsResult.Result.ContainsKey(providerType))
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,9 +57,9 @@ public Holon()
public event EventDelegates.HolonRemoved OnHolonRemoved;
public event EventDelegates.HolonsLoaded OnChildrenLoaded;
public event EventDelegates.HolonsError OnChildrenLoadError;






//TODO: TEMP MOVED TO HOLONBASE TILL REFACTOR CODEBASE.
//public Dictionary<ProviderType, string> ProviderUniqueStorageKey { get; set; } = new Dictionary<ProviderType, string>(); //Unique key used by each provider (e.g. hashaddress in hc, accountname for Telos, id in MongoDB etc).
Expand All @@ -77,7 +77,7 @@ public Holon()


//FROM CELESTIALHOLON - TODO: NEED TO REFFACTOR CODEBASE LATER TO USE ICELESTIALHOLON INSTEAD OF IHolon WHERE APPROPRIATE.
public IList<INode> Nodes { get; set; }
public IList<INode> Nodes { get; set; } = new List<INode>();
public Guid ParentOmniverseId { get; set; } //The Omniverse this Holon belongs to.
public IOmiverse ParentOmniverse { get; set; } //The Omniverse this Holon belongs to.
public Guid ParentMultiverseId { get; set; } //The Multiverse this Holon belongs to.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@

using System;

namespace NextGenSoftware.OASIS.API.Core.Interfaces.NFT
{
public interface IWeb3NFT : INFTBase
{
Guid ParentWeb4NFTId { get; set; }
string MintTransactionHash { get; set; }
string SendNFTTransactionHash { get; set; }
string NFTMintedUsingWalletAddress { get; set; }
Expand Down
Loading
Loading