Skip to content

Commit

Permalink
Merge pull request #327 from NextGenSoftwareUK/feature/minting-nft-ar…
Browse files Browse the repository at this point in the history
…bitrum

Minting NFT in Arbitrum
  • Loading branch information
dellams authored Sep 1, 2024
2 parents 6d751cf + 1eafc76 commit db6f251
Show file tree
Hide file tree
Showing 288 changed files with 60,360 additions and 25 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ namespace NextGenSoftware.OASIS.API.Core.Interfaces.NFT.Request
public interface INFTWalletTransactionRequest : IWalletTransactionRequest
{
public string MintWalletAddress { get; set; }
public int TokenId { get; set; }
//public string FromWalletAddress { get; set; }
//public string ToWalletAddress { get; set; }
////public string FromToken { get; set; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ namespace NextGenSoftware.OASIS.API.Core.Objects.NFT.Request
public class NFTWalletTransactionRequest : WalletTransactionRequest, INFTWalletTransactionRequest
{
public string MintWalletAddress { get; set; }
public int TokenId { get; set; }
//public string FromWalletAddress { get; set; }
//public string ToWalletAddress { get; set; }
////public string FromToken { get; set; }
Expand Down
1 change: 0 additions & 1 deletion NextGenSoftware.OASIS.API.DNA/OASISDNA.cs
Original file line number Diff line number Diff line change
Expand Up @@ -311,7 +311,6 @@ public class ArbitrumOASISProviderSettings : ProviderSettingsBase
public string ChainPrivateKey { get; set; }
public long ChainId { get; set; }
public string ContractAddress { get; set; }
public string Abi { get; set; }
}

public class PolygonOASISProviderSettings : ProviderSettingsBase
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
using System.Numerics;
using NextGenSoftware.OASIS.API.Core.Enums;
using NextGenSoftware.OASIS.API.Core.Interfaces;
using NextGenSoftware.OASIS.API.Core.Interfaces.NFT.Response;
using NextGenSoftware.OASIS.API.Core.Objects.NFT.Request;
using NextGenSoftware.OASIS.Common;
using NextGenSoftware.Utilities;
using Avatar = NextGenSoftware.OASIS.API.Core.Holons.Avatar;
using AvatarDetail = NextGenSoftware.OASIS.API.Core.Holons.AvatarDetail;
using Holon = NextGenSoftware.OASIS.API.Core.Holons.Holon;
Expand All @@ -9,18 +13,18 @@ namespace NextGenSoftware.OASIS.API.Providers.ArbitrumOASIS.TestHarness
{
internal static class Program
{
private static readonly string _chainUrl = "https://sepolia-rollup.arbitrum.io/rpc";
private static readonly string _chainPrivateKey = "d3c80ec102d5fe42beadcb7346f74df529a0a10a1906f6ecc5fe3770eb65fb1a";
private static readonly BigInteger _chainId = 421614;
private static string _contractAddress = "0x06a2dabf7fec27d27f9283cb2de1cd328685510c";
private static string _abi = "";
private const string _chainUrl = "https://sepolia-rollup.arbitrum.io/rpc";
private const string _chainPrivateKey = "d3c80ec102d5fe42beadcb7346f74df529a0a10a1906f6ecc5fe3770eb65fb1a";
private const string _contractAddress = "0x730bc1E3e064178F9BB1ABe20ad15af25D811B6f";
private const string _accountAddress = "0x604b88BECeD9d6a02113fE1A0129f67fbD565D38";

/// <summary>
/// Execute that example to see, how does Avatar CRUD works via arbitrum provider
/// </summary>
private static async Task ExecuteAvatarProviderExample(string contractAddress)
{
ArbitrumOASIS arbitrumOASIS = new(_chainUrl, _chainPrivateKey, _chainId, contractAddress, _abi);
ArbitrumOASIS arbitrumOASIS = new(_chainUrl, _chainPrivateKey, _chainId, contractAddress);

#region Create Avatar

Expand Down Expand Up @@ -87,7 +91,7 @@ private static async Task ExecuteAvatarProviderExample(string contractAddress)
/// </summary>
private static async Task ExecuteAvatarDetailProviderExample(string contractAddress)
{
ArbitrumOASIS arbitrumOASIS = new(_chainUrl, _chainPrivateKey, _chainId, contractAddress, _abi);
ArbitrumOASIS arbitrumOASIS = new(_chainUrl, _chainPrivateKey, _chainId, contractAddress);

#region Create Avatar Detail

Expand Down Expand Up @@ -136,7 +140,8 @@ private static async Task ExecuteAvatarDetailProviderExample(string contractAddr
/// </summary>
private static async Task ExecuteHolonProviderExample(string contractAddress)
{
ArbitrumOASIS arbitrumOASIS = new(_chainUrl, _chainPrivateKey, _chainId, contractAddress, _abi);
ArbitrumOASIS arbitrumOASIS = new(_chainUrl, _chainPrivateKey, _chainId, contractAddress);
arbitrumOASIS.ActivateProvider();

#region Create Holon

Expand All @@ -153,7 +158,7 @@ private static async Task ExecuteHolonProviderExample(string contractAddress)

if (saveHolonResult.IsError && !saveHolonResult.IsSaved)
{
Console.WriteLine($"Saving holon failed! Error message: {saveHolonResult}");
Console.WriteLine($"Saving holon failed! Error message: {saveHolonResult.Message}");
return;
}
else
Expand Down Expand Up @@ -197,14 +202,77 @@ private static async Task ExecuteHolonProviderExample(string contractAddress)
#endregion
}

private static async Task ExecuteSendNFTExample()
{
ArbitrumOASIS arbitrumOASIS = new(_chainUrl, _chainPrivateKey, _chainId, _contractAddress);
arbitrumOASIS.ActivateProvider();

OASISResult<INFTTransactionRespone> result = await arbitrumOASIS.SendNFTAsync(new NFTWalletTransactionRequest()
{
MintWalletAddress = _contractAddress,
FromWalletAddress = _contractAddress,
ToWalletAddress = _contractAddress,
FromProviderType = ProviderType.IPFSOASIS, // Example provider type
ToProviderType = ProviderType.EthereumOASIS, // Example provider type
Amount = 1m, // Example amount
MemoText = "Sending NFT to a new owner.",
TokenId = 10
});

Console.WriteLine($"Is NFT Sent: {result.IsSaved}, {result.Message}");
Console.WriteLine($"NFT Sending Transaction Hash: {result.Result?.TransactionResult}");
}

private static async Task ExecuteMintNftExample()
{
ArbitrumOASIS arbitrumOASIS = new(_chainUrl, _chainPrivateKey, _chainId, _contractAddress);
arbitrumOASIS.ActivateProvider();

OASISResult<INFTTransactionRespone> result = await arbitrumOASIS.MintNFTAsync(
new MintNFTTransactionRequest()
{
MintWalletAddress = _accountAddress,
MintedByAvatarId = Guid.NewGuid(),
Title = "Sample NFT Title",
Description = "This is a description of the sample NFT. It includes all the unique attributes and features.",
Image = [0x01, 0x02, 0x03, 0x04], // Mock byte array for the image
ImageUrl = "https://example.com/images/sample-nft.jpg",
Thumbnail = [0x05, 0x06, 0x07, 0x08], // Mock byte array for the thumbnail
ThumbnailUrl = "https://example.com/thumbnails/sample-nft-thumb.jpg",
Price = 1m, // Price in whatever currency the system uses, e.g., Ether
Discount = 1m, // 5% discount
MemoText = "Thank you for purchasing this NFT!",
NumberToMint = 100,
StoreNFTMetaDataOnChain = true,
MetaData = new Dictionary<string, object>
{
{ "Creator", "John Doe" },
{ "Attributes", new Dictionary<string, string>
{
{ "BackgroundColor", "Blue" },
{ "Rarity", "Rare" }
}
},
{ "Edition", "First Edition" }
},
OffChainProvider = new EnumValue<ProviderType>(ProviderType.IPFSOASIS),
OnChainProvider = new EnumValue<ProviderType>(ProviderType.EthereumOASIS)
}
);

Console.WriteLine($"Is NFT Minted: {result.IsSaved}, {result.Message}");
Console.WriteLine($"NFT Minting Transaction Hash: {result.Result?.TransactionResult}");
}

private static async Task Main(string[] args)
{
Console.WriteLine("NextGenSoftware.OASIS.API.Providers.ArbitrumOASIS - TEST HARNESS");

// TODO: Uncomment one of example method to start testing ethereum provider CRUD
await ExecuteAvatarProviderExample(_contractAddress);
// await ExecuteAvatarProviderExample(_contractAddress);
//await ExecuteHolonProviderExample(_contractAddress);
await ExecuteMintNftExample();
await ExecuteSendNFTExample();
}
}
}
182 changes: 177 additions & 5 deletions NextGenSoftware.OASIS.API.Providers.ArbitrumOASIS/ArbitrumOASIS.cs

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
# <img src="logo.svg" alt="OpenZeppelin" height="40px">

[![NPM Package](https://img.shields.io/npm/v/@openzeppelin/contracts.svg)](https://www.npmjs.org/package/@openzeppelin/contracts)
[![Coverage Status](https://codecov.io/gh/OpenZeppelin/openzeppelin-contracts/graph/badge.svg)](https://codecov.io/gh/OpenZeppelin/openzeppelin-contracts)
[![GitPOAPs](https://public-api.gitpoap.io/v1/repo/OpenZeppelin/openzeppelin-contracts/badge)](https://www.gitpoap.io/gh/OpenZeppelin/openzeppelin-contracts)
[![Docs](https://img.shields.io/badge/docs-%F0%9F%93%84-yellow)](https://docs.openzeppelin.com/contracts)
[![Forum](https://img.shields.io/badge/forum-%F0%9F%92%AC-yellow)](https://docs.openzeppelin.com/contracts)

**A library for secure smart contract development.** Build on a solid foundation of community-vetted code.

* Implementations of standards like [ERC20](https://docs.openzeppelin.com/contracts/erc20) and [ERC721](https://docs.openzeppelin.com/contracts/erc721).
* Flexible [role-based permissioning](https://docs.openzeppelin.com/contracts/access-control) scheme.
* Reusable [Solidity components](https://docs.openzeppelin.com/contracts/utilities) to build custom contracts and complex decentralized systems.

:mage: **Not sure how to get started?** Check out [Contracts Wizard](https://wizard.openzeppelin.com/) — an interactive smart contract generator.

:building_construction: **Want to scale your decentralized application?** Check out [OpenZeppelin Defender](https://openzeppelin.com/defender) — a mission-critical developer security platform to code, audit, deploy, monitor, and operate with confidence.

> [!IMPORTANT]
> OpenZeppelin Contracts uses semantic versioning to communicate backwards compatibility of its API and storage layout. For upgradeable contracts, the storage layout of different major versions should be assumed incompatible, for example, it is unsafe to upgrade from 4.9.3 to 5.0.0. Learn more at [Backwards Compatibility](https://docs.openzeppelin.com/contracts/backwards-compatibility).
## Overview

### Installation

#### Hardhat, Truffle (npm)

```
$ npm install @openzeppelin/contracts
```

#### Foundry (git)

> [!WARNING]
> When installing via git, it is a common error to use the `master` branch. This is a development branch that should be avoided in favor of tagged releases. The release process involves security measures that the `master` branch does not guarantee.
> [!WARNING]
> Foundry installs the latest version initially, but subsequent `forge update` commands will use the `master` branch.
```
$ forge install OpenZeppelin/openzeppelin-contracts
```

Add `@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/` in `remappings.txt.`

### Usage

Once installed, you can use the contracts in the library by importing them:

```solidity
pragma solidity ^0.8.20;
import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";
contract MyCollectible is ERC721 {
constructor() ERC721("MyCollectible", "MCO") {
}
}
```

_If you're new to smart contract development, head to [Developing Smart Contracts](https://docs.openzeppelin.com/learn/developing-smart-contracts) to learn about creating a new project and compiling your contracts._

To keep your system secure, you should **always** use the installed code as-is, and neither copy-paste it from online sources nor modify it yourself. The library is designed so that only the contracts and functions you use are deployed, so you don't need to worry about it needlessly increasing gas costs.

## Learn More

The guides in the [documentation site](https://docs.openzeppelin.com/contracts) will teach about different concepts, and how to use the related contracts that OpenZeppelin Contracts provides:

* [Access Control](https://docs.openzeppelin.com/contracts/access-control): decide who can perform each of the actions on your system.
* [Tokens](https://docs.openzeppelin.com/contracts/tokens): create tradeable assets or collectives, and distribute them via [Crowdsales](https://docs.openzeppelin.com/contracts/crowdsales).
* [Utilities](https://docs.openzeppelin.com/contracts/utilities): generic useful tools including non-overflowing math, signature verification, and trustless paying systems.

The [full API](https://docs.openzeppelin.com/contracts/api/token/ERC20) is also thoroughly documented, and serves as a great reference when developing your smart contract application. You can also ask for help or follow Contracts's development in the [community forum](https://forum.openzeppelin.com).

Finally, you may want to take a look at the [guides on our blog](https://blog.openzeppelin.com/), which cover several common use cases and good practices. The following articles provide great background reading, though please note that some of the referenced tools have changed, as the tooling in the ecosystem continues to rapidly evolve.

* [The Hitchhiker’s Guide to Smart Contracts in Ethereum](https://blog.openzeppelin.com/the-hitchhikers-guide-to-smart-contracts-in-ethereum-848f08001f05) will help you get an overview of the various tools available for smart contract development, and help you set up your environment.
* [A Gentle Introduction to Ethereum Programming, Part 1](https://blog.openzeppelin.com/a-gentle-introduction-to-ethereum-programming-part-1-783cc7796094) provides very useful information on an introductory level, including many basic concepts from the Ethereum platform.
* For a more in-depth dive, you may read the guide [Designing the Architecture for Your Ethereum Application](https://blog.openzeppelin.com/designing-the-architecture-for-your-ethereum-application-9cec086f8317), which discusses how to better structure your application and its relationship to the real world.

## Security

This project is maintained by [OpenZeppelin](https://openzeppelin.com) with the goal of providing a secure and reliable library of smart contract components for the ecosystem. We address security through risk management in various areas such as engineering and open source best practices, scoping and API design, multi-layered review processes, and incident response preparedness.

The [OpenZeppelin Contracts Security Center](https://contracts.openzeppelin.com/security) contains more details about the secure development process.

The security policy is detailed in [`SECURITY.md`](./SECURITY.md) as well, and specifies how you can report security vulnerabilities, which versions will receive security patches, and how to stay informed about them. We run a [bug bounty program on Immunefi](https://immunefi.com/bounty/openzeppelin) to reward the responsible disclosure of vulnerabilities.

The engineering guidelines we follow to promote project quality can be found in [`GUIDELINES.md`](./GUIDELINES.md).

Past audits can be found in [`audits/`](./audits).

Smart contracts are a nascent technology and carry a high level of technical risk and uncertainty. Although OpenZeppelin is well known for its security audits, using OpenZeppelin Contracts is not a substitute for a security audit.

OpenZeppelin Contracts is made available under the MIT License, which disclaims all warranties in relation to the project and which limits the liability of those that contribute and maintain the project, including OpenZeppelin. As set out further in the Terms, you acknowledge that you are solely responsible for any use of OpenZeppelin Contracts and you assume all risks associated with any such use.

## Contribute

OpenZeppelin Contracts exists thanks to its contributors. There are many ways you can participate and help build high quality software. Check out the [contribution guide](CONTRIBUTING.md)!

## License

OpenZeppelin Contracts is released under the [MIT License](LICENSE).

## Legal

Your use of this Project is governed by the terms found at www.openzeppelin.com/tos (the "Terms").
Loading

0 comments on commit db6f251

Please sign in to comment.