diff --git a/docs/n3/Advances/Oracles.md b/docs/n3/Advances/Oracles.md
index 3487298..ca45aab 100644
--- a/docs/n3/Advances/Oracles.md
+++ b/docs/n3/Advances/Oracles.md
@@ -78,9 +78,9 @@ using System.ComponentModel;
namespace demo
{
[DisplayName("Oracle Demo")]
- [ManifestExtra("Author", "Neo")]
- [ManifestExtra("Email", "dev@neo.org")]
- [ManifestExtra("Description", "This is a Oracle using template")]
+ [ContractAuthor("core-dev", "dev@neo.org")]
+ [ContractEmail("dev@neo.org")]
+ [ContractDescription("This is a Oracle contract example")]
public class OracleDemo : SmartContract
{
static readonly string PreData = "RequstData";
diff --git a/docs/n3/Advances/_category_.json b/docs/n3/Advances/_category_.json
index 032f85c..2b82da5 100644
--- a/docs/n3/Advances/_category_.json
+++ b/docs/n3/Advances/_category_.json
@@ -1,4 +1,4 @@
{
"label": "Advances",
- "position": 5
+ "position": 4
}
\ No newline at end of file
diff --git a/docs/n3/develop/_category_.json b/docs/n3/develop/_category_.json
index 5dd28b7..d587674 100644
--- a/docs/n3/develop/_category_.json
+++ b/docs/n3/develop/_category_.json
@@ -1,4 +1,4 @@
{
"label": "Development Guide",
- "position": 6
+ "position": 5
}
\ No newline at end of file
diff --git a/docs/n3/develop/deploy/invoke.md b/docs/n3/develop/deploy/invoke.md
index 634038f..9d1530e 100644
--- a/docs/n3/develop/deploy/invoke.md
+++ b/docs/n3/develop/deploy/invoke.md
@@ -17,7 +17,7 @@ Use the RPC API [getcontractstate method](../../reference/rpc/latest-version/api
The detailed contract information is displayed in Neo-GUI. You can also view the manifest and nef files.
-## Invoking a contract
+## Invoking a contract with Neo Node Clients
### Invoking a contract using Neo-CLI
@@ -128,3 +128,32 @@ Assuming that the contract A calls the contract B, the following table details t
| The contract defined in the Permissions of contract A is wildcard * and the method is m
{"contract":"\*", "method": "m"} | Prompts that contract A will call the method m of any contract and asks whether to authorize the signature to contract B. | Default or Global according to the user's decision | Determined by the user |
| The contract defined in the Permissions of contract A is wildcard * and the method is wildcard \*
{"contract":"\*", "method": "\*"} | Prompts that contract A will call any method of any contract and asks whether to set the signature to Global. | Default or Global according to the user's decision | Determined by the user |
+## Invoking a contract with wallets/dAPIs
+
+You can use browser wallets to invoke a smart contract, which is helpful for creating a front-end interface on Neo.
+
+### Available Wallets
+
+Below is a list of several wallets that allow users to invoke smart contracts on front-end interfaces across different platforms. While additional wallets may also be available, the ones listed here operate with slight variations in invocation.
+
+- [Neoline](https://neoline.io/en/)
+ - [Neoline Dapi Doc](https://neoline.io/dapi/N3.html)
+
+#### Desktop
+
+- [Neon](https://neon.coz.io/)
+ - [WalletConnect SDK](https://github.com/CityOfZion/wallet-connect-sdk)
+ - [WalletConnect SDK Guide](https://github.com/CityOfZion/wallet-connect-sdk/blob/main/README.md)
+- [O3 Wallet](https://o3.network/#/wallet)
+
+#### Mobile
+
+- [OneGate](https://onegate.space/)
+- [Neoline Mobile](https://neoline.io/en/)
+
+OneGate & Neoline Mobile support the [Neo Dapi](https://github.com/neo-ngd/neo-dapi-monorepo). Here you can learn more about [Neo dapi demo](https://github.com/neo-ngd/neo-dapi-demo).
+
+### Usage Example
+
+Here is an [example](https://neo-dapp-demo.vercel.app/) that is applicable to all of the wallets listed above. In this example, you can learn how to connect to a wallet and call methods supported by these wallets. Corresponding source code can be found at [dAPP Demo](https://github.com/ShaySong99/neo-dapp-demo).
+
diff --git a/docs/n3/develop/write/1_dotnet.md b/docs/n3/develop/write/1_dotnet.md
index 612069a..4913402 100644
--- a/docs/n3/develop/write/1_dotnet.md
+++ b/docs/n3/develop/write/1_dotnet.md
@@ -36,6 +36,20 @@ dotnet new install Neo.SmartContract.Template
dotnet new list
```
+ There are three default templates available after installing Neo.SmartContract:
+
+- neocontractowner - Standard contract template with Owner, including GetOwner and SetOwner methods)
+
+- neocontractoracle - A contract template using OracleRequest)
+
+- neocontractnep17 - NEP-17 Contract Template, including Mint and Burn methods)
+
+:::note
+
+The `neocontract` template used before has been renamed to `neocontractowner`.
+
+:::
+
### Uninstall the template
```
@@ -51,10 +65,10 @@ dotnet new update Neo.SmartContract.Template
### Create a project using templates with Terminal
```
-dotnet new neocontract
+dotnet new neocontractowner
```
-The project name defaults to the name of the current directory, you can also specify the project name with `-n, --name `, e.g. `dotnet new neocontract -n MyFirstContract`.
+The project name defaults to the name of the current directory, you can also specify the project name with `-n, --name `, e.g. `dotnet new neocontractowner -n MyFirstContract`.
### Create a project using templates with Visual Studio
@@ -64,8 +78,6 @@ In the Visual Studio interface, create a new project, Neo.SmartContract.Template
![](../assets/neo-devpack-dotnet-2.png)
-
-
## Neo.Compiler.CSharp
Neo.Compiler.CSharp (nccs) is the Neo smart contract compiler that compiles the C# language into NeoVM executable OpCodes.
diff --git a/docs/n3/develop/write/basics.md b/docs/n3/develop/write/basics.md
index c5ecdcb..abdd9f3 100644
--- a/docs/n3/develop/write/basics.md
+++ b/docs/n3/develop/write/basics.md
@@ -5,18 +5,19 @@ In this tutorial, you will learn the basics of developing a smart contract.
Let's have a look at our basic hello world contract.
```cs
-using Neo;
-using Neo.SmartContract;
using Neo.SmartContract.Framework;
+using Neo.SmartContract.Framework.Attributes;
using Neo.SmartContract.Framework.Native;
using Neo.SmartContract.Framework.Services;
using System;
+using System.ComponentModel;
namespace Helloworld
{
- [ManifestExtra("Author", "Neo")]
- [ManifestExtra("Email", "dev@neo.org")]
- [ManifestExtra("Description", "This is a contract example")]
+ [DisplayName("MyContract")]
+ [ContractAuthor("core-dev", "dev@neo.org")]
+ [ContractVersion("0.0.1")]
+ [ContractDescription("This is a contract example")]
public class Contract1 : SmartContract
{
//TODO: Replace it with your own address.
@@ -80,6 +81,14 @@ In addition, developer can define static method in contract and return a consta
public static string Name() => "name of the token";
```
+You can also use the get only property to accomplish the same thing.
+
+```cs
+public string Name { [Safe] get => "name of the token"; }
+```
+
+`[Safe]` represents that this method does not modify the contract data and is safe to access.
+
## Storage property
When you develop the smart contract, you have to store your application data on the blockchain. When a Smart Contract is created or when a transaction awakens it, the Contract’s code can read and write to its storage space. All data stored in the storage of the smart contract are automatically persisted between invocations of the smart contract. Full nodes in the blockchain store the state of every smart contract on the chain.
@@ -134,9 +143,8 @@ The basic types of C# are:
After analyzing the basic hello world contract, let us move to your first real-world smart contract. Here we provide a very simple DNS system which was written in C#. The main function of the DNS is store the domain for users. It contains all the points above except the events. We can investigate this smart contract to learn how to make a basic smart contract. The source code is here:
```cs
-using Neo.SmartContract;
using Neo.SmartContract.Framework;
-using Neo.SmartContract.Framework.Native;
+using Neo.SmartContract.Framework.Attributes;
using Neo.SmartContract.Framework.Services;
using System.ComponentModel;
@@ -145,18 +153,19 @@ namespace Domain
public class Contract1 : SmartContract
{
+ [Safe]
[DisplayName("query")]
public static byte[] Query(string domain)
{
- return Storage.Get(Storage.CurrentContext, domain);
+ return (byte[])Storage.Get(Storage.CurrentContext, domain);
}
[DisplayName("register")]
- publilc static bool Register(string domain, byte[] owner)
+ public static bool Register(string domain, UInt160 owner)
{
// Check if the contract owner is the same as the one who invokes the contract
if (!Runtime.CheckWitness(owner)) return false;
- byte[] value = Storage.Get(Storage.CurrentContext, domain);
+ byte[] value = (byte[])Storage.Get(Storage.CurrentContext, domain);
if (value != null) return false;
Storage.Put(Storage.CurrentContext, domain, owner);
return true;
@@ -178,12 +187,16 @@ Let's slice it and learn it step by step.
You can declare more features:
```cs
-[ManifestExtra("Author", "Neo")]
-[ManifestExtra("Email", "dev@neo.org")]
-[ManifestExtra("Description", "This is a contract example")]
+[ContractAuthor("core-dev", "dev@neo.org")]
+[ContractDescription("A sample NEP-17 token")]
+[ContractEmail("dev@neo.org")]
+[ContractSourceCode("https://github.com/neo-project/neo-devpack-dotnet/tree/master/examples/")]
+[ContractVersion("0.0.1")]
+[DisplayName("SampleNep17Token")]
[SupportedStandards("NEP-17")]
[ContractPermission("*", "onNEP17Payment")]
[ContractTrust("0x0a0b00ff00ff00ff00ff00ff00ff00ff00ff00a4")]
+[ManifestExtra("WebSite", "https://neo.org")]
public class Contract1 : SmartContract
{
public static bool Main(string operation, object[] args)
@@ -193,39 +206,57 @@ public class Contract1 : SmartContract
}
```
-`ManifestExtra` represents the extra fields in the Manifest file, where you can add `Author`, `Email`, `Description` and etc.
-
-`SupportedStandards` represents the NEP standards the contract conform to, such as NEP-17, a token standard on Neo.
+- `DisplayName`: The name of the nef and manifest.json files generated by the compiler, and the DisplayName is also written to the name field of manifest.json.
+- `SupportedStandards`: The NEP standards the contract conform to, such as NEP-17, a token standard on Neo.
+- `ContractPermission` : The permission requested by the contract, and `ContractTrust` indicates which contracts trust the contract to call itself. See [invocation-permission](... /deploy/invoke.html#invocation-permission).
+- `ContractAuthor`: The author field, which can be filled with the author's name and email address. It will output to the extra json object in manifest.json.
+- `ContractEmail`: The email field. It will be output to the extra json object in manifest.json.
+- `ContractSourceCode`: The URL of the contract source code. It will be output to the extra json object in manifest.json.
+- `ContractVersion`: The version of the contract. It will be output to the extra json object in manifest.json.
+- `ContractDescription`: The description of the contract. It will be output to the extra json object in manifest.json.
+- `ManifestExtra`: The extra fields in the Manifest file, where you can add `WebSite`, `Docs` and etc. It will be output to the extra json object in manifest.json.
-`ContractPermission` indicates the permission requested by the contract, and `ContractTrust` indicates which contracts trust the contract to call itself. See [invocation-permission](... /deploy/invoke.html#invocation-permission).
+The generated manifest is as follows:
-You can also add other fields, such as:
-
-```cs
-[ManifestExtra("Name", "sample contract")]
-[ManifestExtra("Version", "1.0.0")]
+```json
+{
+ "name": "SampleNep17Token",
+ "supportedstandards": [],
+ "abi": {
+ },
+ "permissions": [
+ {
+ "contract": "*",
+ "methods": "*"
+ }
+ ],
+ "trusts": [],
+ "extra": {
+ "Author": "core-dev",
+ "E-mail": "dev@neo.org",
+ "Version": "0.0.1",
+ "Description": "A sample NEP-17 token",
+ "Sourcecode": "https://github.com/neo-project/neo-devpack-dotnet/tree/master/examples/",
+ "WebSite": "https://neo.org"
+ }
+}
```
### Entry function
-Theoretically, smart contracts can have any entry points. Methods of the public static type in the contract can be used as an entry function to be invoked externally, for example:
+Theoretically, smart contracts can have any entry points. Methods of the public static type in the contract can be used as an entry function to be invoked externally, properties in the contract can be used as an entry function to be invoked externally, for example:
```cs
using Neo.SmartContract;
using Neo.SmartContract.Framework;
-namespace Neo.Compiler.MSIL.UnitTests.TestClasses
+namespace MyContract
{
- class Contract_a : SmartContract.Framework.SmartContract
+ class Contract_a : SmartContract
{
- public static object First(string method, object[] args)
- {
- return 'a';
- }
- public static object Second(string method, object[] args)
- {
- return 'b';
- }
+ public static string First() => "hello";
+
+ public int Second { get; set; }
}
}
```
@@ -258,10 +289,10 @@ Usually this method is used to check whether an specified address is the the con
Inside our `DNS smart contract`, the `Register` function is firstly check if the owner is the same as the one who invoke the contract. Here we use the `Runtime.CheckWitness` function. Then we try to fetch the domain owner first to see if the domain is already exists in the storage. If not, we can store our domain->owner pair using the `Storage.Put`method.
```cs
-private static bool Register(string domain, byte[] owner)
+private static bool Register(string domain, UInt160 owner)
{
if (!Runtime.CheckWitness(owner)) return false;
- byte[] value = Storage.Get(Storage.CurrentContext, domain);
+ byte[] value = (byte[])Storage.Get(Storage.CurrentContext, domain);
if (value != null) return false;
Storage.Put(Storage.CurrentContext, domain, owner);
return true;
@@ -282,28 +313,3 @@ public static event Action OnTransfer;
Transfer is the event name.
-### Json serialization
-
-In Neo N3 smart contract, the Json serialization/deserialization feature is added:
-
-```cs
-using Neo.SmartContract.Framework.Native;
-using Neo.SmartContract.Framework.Services;
-
-namespace Neo.Compiler.MSIL.TestClasses
-{
- public class Contract_Json : SmartContract.Framework.SmartContract
- {
- public static string Serialize(object obj)
- {
- return Json.Serialize(obj);
- }
-
- public static object Deserialize(string json)
- {
- return Json.Deserialize(json);
- }
- }
-}
-```
-
diff --git a/docs/n3/develop/write/nep11.md b/docs/n3/develop/write/nep11.md
index 087cba8..6a5b4a4 100644
--- a/docs/n3/develop/write/nep11.md
+++ b/docs/n3/develop/write/nep11.md
@@ -37,7 +37,7 @@ public class MyTokenState : Nep11TokenState
After inheriting `Nep11Token` you need to rewrite the Symbol method, as follows:
```cs
-public override string Symbol() => "MNFT";
+public override string Symbol { [Safe] get => "MNFT"; }
```
## Distribution Method
@@ -80,7 +80,7 @@ namespace Contract1
private static bool IsOwner() => Runtime.CheckWitness(Owner);
- public override string Symbol() => "MNFT";
+ public override string Symbol { [Safe] get => "MNFT"; }
public static bool Airdrop(UInt160 to, string name)
{
@@ -150,6 +150,11 @@ The base class `Nep11Token` also provides the following methods and events:
| -------- | ------------------------------------------------------------ | --------------- | ------------------------------------------------------------ |
| transfer | Hash160(from) Hash160(to) Integer(amount) ByteArray(tokenId) | Transfer event | When the `from` address is set to `null` tokens are created; When the `to` address set to `null`tokens are burned. |
+#### Compatibility check
+
+Compatibility checks will be activated for any contract that includes the `[SupportedStandards("NEP-17")]` or `[SupportedStandards("NEP-11")]` attribute.
+The Compatibility Check reviews method names, parameters, return values, events, and similar elements to ensure they comply with the standard, and alerts about any failures in the check.
+
## See also
[NEP-11 Proposal](https://github.com/neo-project/proposals/blob/master/nep-11.mediawiki)
diff --git a/docs/n3/develop/write/nep17.md b/docs/n3/develop/write/nep17.md
index 1d1b056..87098ca 100644
--- a/docs/n3/develop/write/nep17.md
+++ b/docs/n3/develop/write/nep17.md
@@ -128,46 +128,136 @@ A token contract which creates new tokens MUST trigger a `Transfer` event with t
A token contract which burns tokens MUST trigger a `Transfer` event with the `to` address set to `null` when tokens are burned.
-NEP17 methods are as follows. For the complete code refer to [NEP-17 contract code](https://github.com/neo-project/examples/tree/master/csharp/NEP17).
+NEP17 methods are as follows. For the complete code refer to [NEP-17 contract code](https://github.com/neo-project/neo-devpack-dotnet/tree/master/examples/Example.SmartContract.NEP17).
```cs
-using Neo;
-using Neo.SmartContract;
using Neo.SmartContract.Framework;
+using Neo.SmartContract.Framework.Attributes;
using Neo.SmartContract.Framework.Native;
using Neo.SmartContract.Framework.Services;
using System;
+using System.ComponentModel;
using System.Numerics;
-namespace Template.NEP17.CSharp
+namespace NEP17
{
- public partial class NEP17 : SmartContract
+ ///
+ [DisplayName("SampleNep17Token")]
+ [ContractAuthor("core-dev", "dev@neo.org")]
+ [ContractVersion("0.0.1")]
+ [ContractDescription("A sample NEP-17 token")]
+ [ContractSourceCode("https://github.com/neo-project/neo-devpack-dotnet/tree/master/examples/")]
+ [ContractPermission(Permission.WildCard, Method.WildCard)]
+ [SupportedStandards(NepStandard.Nep17)]
+ public class SampleNep17Token : Nep17Token
{
- public static BigInteger TotalSupply() => TotalSupplyStorage.Get();
+ #region Owner
- public static BigInteger BalanceOf(UInt160 account)
+ private const byte PrefixOwner = 0xff;
+
+ private static readonly UInt160 InitialOwner = "NUuJw4C4XJFzxAvSZnFTfsNoWZytmQKXQP";
+
+ [Safe]
+ public static UInt160 GetOwner()
+ {
+ var currentOwner = Storage.Get(new[] { PrefixOwner });
+
+ if (currentOwner == null)
+ return InitialOwner;
+
+ return (UInt160)currentOwner;
+ }
+
+ private static bool IsOwner() => Runtime.CheckWitness(GetOwner());
+
+ public delegate void OnSetOwnerDelegate(UInt160 newOwner);
+
+ [DisplayName("SetOwner")]
+ public static event OnSetOwnerDelegate OnSetOwner;
+
+ public static void SetOwner(UInt160? newOwner)
+ {
+ if (IsOwner() == false)
+ throw new InvalidOperationException("No Authorization!");
+ if (newOwner != null && newOwner.IsValid)
+ {
+ Storage.Put(new[] { PrefixOwner }, newOwner);
+ OnSetOwner(newOwner);
+ }
+ }
+
+ #endregion
+
+ #region Minter
+
+ private const byte PrefixMinter = 0xfd;
+
+ private static readonly UInt160 InitialMinter = "NUuJw4C4XJFzxAvSZnFTfsNoWZytmQKXQP";
+
+ [Safe]
+ public static UInt160 GetMinter()
+ {
+ var currentMinter = Storage.Get(new[] { PrefixMinter });
+
+ if (currentMinter == null)
+ return InitialMinter;
+
+ return (UInt160)currentMinter;
+ }
+
+ private static bool IsMinter() => Runtime.CheckWitness(GetMinter());
+
+ public delegate void OnSetMinterDelegate(UInt160 newMinter);
+
+ [DisplayName("SetMinter")]
+ public static event OnSetMinterDelegate OnSetMinter;
+
+ public static void SetMinter(UInt160 newMinter)
{
- if (!ValidateAddress(account)) throw new Exception("The parameters account SHOULD be a 20-byte non-zero address.");
- return AssetStorage.Get(account);
+ if (IsOwner() == false)
+ throw new InvalidOperationException("No Authorization!");
+ if (!newMinter.IsValid) return;
+ Storage.Put(new[] { PrefixMinter }, newMinter);
+ OnSetMinter(newMinter);
}
- public static bool Transfer(UInt160 from, UInt160 to, BigInteger amount, object data)
+ public new static void Mint(UInt160 to, BigInteger amount)
{
- if (!ValidateAddress(from) || !ValidateAddress(to)) throw new Exception("The parameters from and to SHOULD be 20-byte non-zero addresses.");
- if (amount <= 0) throw new Exception("The parameter amount MUST be greater than 0.");
- if (!Runtime.CheckWitness(from) && !from.Equals(ExecutionEngine.CallingScriptHash)) throw new Exception("No authorization.");
- if (AssetStorage.Get(from) < amount) throw new Exception("Insufficient balance.");
- if (from == to) return true;
+ if (IsOwner() == false && IsMinter() == false)
+ throw new InvalidOperationException("No Authorization!");
+ Nep17Token.Mint(to, amount);
+ }
+
+ #endregion
- AssetStorage.Reduce(from, amount);
- AssetStorage.Increase(to, amount);
+ #region Example.SmartContract.NEP17
- OnTransfer(from, to, amount);
+ public override string Symbol { [Safe] get => "SampleNep17Token"; }
+ public override byte Decimals { [Safe] get => 8; }
- // Validate payable
- if (IsDeployed(to)) Contract.Call(to, "onNEP17Payment", new object[] { from, amount, data });
+ public new static void Burn(UInt160 account, BigInteger amount)
+ {
+ if (IsOwner() == false && IsMinter() == false)
+ throw new InvalidOperationException("No Authorization!");
+ Nep17Token.Burn(account, amount);
+ }
+
+ #endregion
+
+ #region Basic
+
+ [Safe]
+ public static bool Verify() => IsOwner();
+
+ public static bool Update(ByteString nefFile, string manifest)
+ {
+ if (IsOwner() == false)
+ throw new InvalidOperationException("No Authorization!");
+ ContractManagement.Update(nefFile, manifest);
return true;
}
+
+ #endregion
}
}
```
@@ -191,20 +281,15 @@ The name method is moved to the manifest file, and you need to add `[DisplayName
```cs
[DisplayName("Token Name")]
-[ManifestExtra("Author", "Neo")]
-[ManifestExtra("Email", "dev@neo.org")]
-[ManifestExtra("Description", "This is a NEP17 example")]
+[ContractAuthor("core-dev", "dev@neo.org")]
+[ContractEmail("dev@neo.org")]
+[ContractDescription("This is a NEP17 example")]
[SupportedStandards("NEP-17")]
-public partial class NEP17 : SmartContract
+public class NEP17 : Nep17Token
{
- [DisplayName("Transfer")]
- public static event Action OnTransfer;
-
- public static string Symbol() => "TokenSymbol";
+ public override string Symbol { [Safe] get => "EXAMPLE"; }
- public static ulong Decimals() => 8;
-
- //……
+ public override byte Decimals { [Safe] get => 8; }
}
```
@@ -218,4 +303,9 @@ In Neo Legacy, you should check the IsPayable checkbox when deploying contracts
In Neo N3.x, the payable check has been removed and the corresponding logic has been placed in the `onNEP17Payment` method.
-The ability of the contract to receive assets has been changed from a fixed constant to the code logic within the contract.
\ No newline at end of file
+The ability of the contract to receive assets has been changed from a fixed constant to the code logic within the contract.
+
+### Compatibility check
+
+Compatibility checks will be activated for any contract that includes the `[SupportedStandards("NEP-17")]` or `[SupportedStandards("NEP-11")]` attribute.
+The Compatibility Check reviews method names, parameters, return values, events, and similar elements to ensure they comply with the standard, and alerts about any failures in the check.
\ No newline at end of file
diff --git a/docs/n3/exchange/_category_.json b/docs/n3/exchange/_category_.json
index 993ca53..5a2f066 100644
--- a/docs/n3/exchange/_category_.json
+++ b/docs/n3/exchange/_category_.json
@@ -1,5 +1,5 @@
{
"label": "Exchange",
- "position": 8
+ "position": 7
}
\ No newline at end of file
diff --git a/docs/n3/exchange/transaction.md b/docs/n3/exchange/transaction.md
index 88bbf31..b4aabee 100644
--- a/docs/n3/exchange/transaction.md
+++ b/docs/n3/exchange/transaction.md
@@ -140,12 +140,12 @@ You need to replace these strings when querying the user's balance:
**decimals**
- - Syntax: `public static byte decimals()`
+ - Syntax: `public override byte Decimals { [Safe] get => 8; }`
- Remarks: "decimals" returns the number of decimals used by the token.
**symbol**
- - Syntax: `public static string symbol()`
+ - Syntax: `public override string Symbol { [Safe] get => "EXAMPLE"; }`
- Remarks: "symbol" returns the token symbol.
diff --git a/docs/n3/foundation/_category_.json b/docs/n3/foundation/_category_.json
index 7a7677a..b631c3c 100644
--- a/docs/n3/foundation/_category_.json
+++ b/docs/n3/foundation/_category_.json
@@ -1,4 +1,4 @@
{
"label": "Foundational topics",
- "position": 1
+ "position": 2
}
\ No newline at end of file
diff --git a/docs/n3/gettingstarted/_category_.json b/docs/n3/gettingstarted/_category_.json
new file mode 100644
index 0000000..0397288
--- /dev/null
+++ b/docs/n3/gettingstarted/_category_.json
@@ -0,0 +1,4 @@
+{
+ "label": "Getting Started (C#)",
+ "position": 1
+ }
\ No newline at end of file
diff --git a/docs/n3/gettingstarted/assets/2_privatechain_demo.png b/docs/n3/gettingstarted/assets/2_privatechain_demo.png
new file mode 100644
index 0000000..9988aea
Binary files /dev/null and b/docs/n3/gettingstarted/assets/2_privatechain_demo.png differ
diff --git a/docs/n3/gettingstarted/assets/3_1545037391347.png b/docs/n3/gettingstarted/assets/3_1545037391347.png
new file mode 100644
index 0000000..290a5ba
Binary files /dev/null and b/docs/n3/gettingstarted/assets/3_1545037391347.png differ
diff --git a/docs/n3/gettingstarted/assets/3_2017-06-07_12-07-03.png b/docs/n3/gettingstarted/assets/3_2017-06-07_12-07-03.png
new file mode 100644
index 0000000..02553df
Binary files /dev/null and b/docs/n3/gettingstarted/assets/3_2017-06-07_12-07-03.png differ
diff --git a/docs/n3/gettingstarted/assets/3_download_and_install_smart_contract_plugin.jpg b/docs/n3/gettingstarted/assets/3_download_and_install_smart_contract_plugin.jpg
new file mode 100644
index 0000000..10aab7f
Binary files /dev/null and b/docs/n3/gettingstarted/assets/3_download_and_install_smart_contract_plugin.jpg differ
diff --git a/docs/n3/gettingstarted/assets/3_edit_environment_variable.png b/docs/n3/gettingstarted/assets/3_edit_environment_variable.png
new file mode 100644
index 0000000..1630f1e
Binary files /dev/null and b/docs/n3/gettingstarted/assets/3_edit_environment_variable.png differ
diff --git a/docs/n3/gettingstarted/assets/3_environment_variable.png b/docs/n3/gettingstarted/assets/3_environment_variable.png
new file mode 100644
index 0000000..4382bdf
Binary files /dev/null and b/docs/n3/gettingstarted/assets/3_environment_variable.png differ
diff --git a/docs/n3/gettingstarted/assets/3_install_core_cross_platform_development_toolset.jpg b/docs/n3/gettingstarted/assets/3_install_core_cross_platform_development_toolset.jpg
new file mode 100644
index 0000000..4feeade
Binary files /dev/null and b/docs/n3/gettingstarted/assets/3_install_core_cross_platform_development_toolset.jpg differ
diff --git a/docs/n3/gettingstarted/assets/3_new_smart_contract_project.png b/docs/n3/gettingstarted/assets/3_new_smart_contract_project.png
new file mode 100644
index 0000000..dc0831a
Binary files /dev/null and b/docs/n3/gettingstarted/assets/3_new_smart_contract_project.png differ
diff --git a/docs/n3/gettingstarted/assets/3_publish_and_profile_settings.jpg b/docs/n3/gettingstarted/assets/3_publish_and_profile_settings.jpg
new file mode 100644
index 0000000..b162aa1
Binary files /dev/null and b/docs/n3/gettingstarted/assets/3_publish_and_profile_settings.jpg differ
diff --git a/docs/n3/gettingstarted/assets/3_publish_and_profile_settings.png b/docs/n3/gettingstarted/assets/3_publish_and_profile_settings.png
new file mode 100644
index 0000000..7c00170
Binary files /dev/null and b/docs/n3/gettingstarted/assets/3_publish_and_profile_settings.png differ
diff --git a/docs/n3/gettingstarted/assets/3_publish_neo_compiler_msil_project.jpg b/docs/n3/gettingstarted/assets/3_publish_neo_compiler_msil_project.jpg
new file mode 100644
index 0000000..23e9fd0
Binary files /dev/null and b/docs/n3/gettingstarted/assets/3_publish_neo_compiler_msil_project.jpg differ
diff --git a/docs/n3/gettingstarted/assets/3_smart_contract_function_code.png b/docs/n3/gettingstarted/assets/3_smart_contract_function_code.png
new file mode 100644
index 0000000..15c46cd
Binary files /dev/null and b/docs/n3/gettingstarted/assets/3_smart_contract_function_code.png differ
diff --git a/docs/n3/gettingstarted/assets/compile.png b/docs/n3/gettingstarted/assets/compile.png
new file mode 100644
index 0000000..be47545
Binary files /dev/null and b/docs/n3/gettingstarted/assets/compile.png differ
diff --git a/docs/n3/gettingstarted/assets/contractfile.png b/docs/n3/gettingstarted/assets/contractfile.png
new file mode 100644
index 0000000..3e28e17
Binary files /dev/null and b/docs/n3/gettingstarted/assets/contractfile.png differ
diff --git a/docs/n3/gettingstarted/assets/extension.png b/docs/n3/gettingstarted/assets/extension.png
new file mode 100644
index 0000000..773dd12
Binary files /dev/null and b/docs/n3/gettingstarted/assets/extension.png differ
diff --git a/docs/n3/gettingstarted/assets/neocontract.png b/docs/n3/gettingstarted/assets/neocontract.png
new file mode 100644
index 0000000..1a43a7f
Binary files /dev/null and b/docs/n3/gettingstarted/assets/neocontract.png differ
diff --git a/docs/n3/gettingstarted/assets/nuget.png b/docs/n3/gettingstarted/assets/nuget.png
new file mode 100644
index 0000000..43d762c
Binary files /dev/null and b/docs/n3/gettingstarted/assets/nuget.png differ
diff --git a/docs/n3/gettingstarted/deploy.md b/docs/n3/gettingstarted/deploy.md
new file mode 100644
index 0000000..5bf1cf8
--- /dev/null
+++ b/docs/n3/gettingstarted/deploy.md
@@ -0,0 +1,62 @@
+# Deploying and invoking contract
+
+In the previous section we have compiled an NEP17 contract file (NEP17.nef) and contract descriptive file (NEP17.manifest.json), next we will move on to deployment and invocation of the contract with Neo-CLI.
+
+## Deploying contract
+
+In Neo-CLI, input the deploy command `deploy [manifestFile]` , for example:
+
+```bash
+deploy NEP17.nef
+```
+
+Or
+
+```bash
+deploy NEP17.nef NEP17.manifest.json
+```
+
+After the command is executed, the NEP17 contract is deployed and the related fee is charged by the system automatically.
+
+```bash
+neo> deploy NEP17.nef
+Script hash: 0xb7f4d011241ec13db16c0e3484bdd5dd9a536f26
+Gas: 10.1477624
+
+Signed and relayed transaction with hash=0xe03aade81fb96c44e115a1cc9cfe984a9df4a283bd10aa0aefa7ebf3e296f757
+```
+
+For more information, refer to [Deploying Smart Contracts](../develop/deploy/deploy.md).
+
+## Invoking contract
+
+Now we can invoke the contract using the Neo-CLI command `invoke`:
+
+```bash
+invoke [contractParameters=null] [witnessAddress=null]
+```
+
+For example:
+
+```bash
+invoke 0xb7f4d011241ec13db16c0e3484bdd5dd9a536f26 symbol
+```
+
+After executed successfully, the following information is printed:
+
+```bash
+Invoking script with: '10c00c046e616d650c14f9f81497c3f9b62ba93f73c711d41b1eeff50c2341627d5b52'
+VM State: HALT
+Gas Consumed: 0.0103609
+Evaluation Stack: [{"type":"ByteArray","value":"VG9rZW5TeW1ib2w="}]
+
+relay tx(no|yes):
+```
+
+Where:
+
+- VM State: `HALT` indicates the vm executed successfully; `FAULT` indicates the vm exited during execution due to an exception.
+- Evaluation Stack: the result of contract execution, where the value is encoded with Base64 when it is a string or ByteArray.
+- You can do the data format conversion [here](https://neo.org/converter/) `VG9rZW5TeW1ib2w=` => `TokenSymbol`
+
+For more information, refer to [Invoking Smart Contracts](../develop/deploy/invoke.md).
diff --git a/docs/n3/gettingstarted/develop.md b/docs/n3/gettingstarted/develop.md
new file mode 100644
index 0000000..4e086f2
--- /dev/null
+++ b/docs/n3/gettingstarted/develop.md
@@ -0,0 +1,103 @@
+# Developing a contract
+
+We have completed setting up the private chain and configuring the node. In this section we will walk you through configuring the environment, writing, and compiling an NEP17 contract using C#.
+
+The following steps are applicable to multiple system platforms, such as Windows, macOS, and Ubuntu.
+
+## Installing tools
+
+1. Download and install [Visual Studio Code](https://code.visualstudio.com/Download)
+
+2. Download and install [.NET 6.0 SDK](https://dotnet.microsoft.com/download)
+
+3. Run the command line and enter the following command to check if you have installed SDK successfully.
+
+ ```powershell
+ dotnet --list-sdks
+ ```
+
+ If there is no issue the SDK version number is displayed.
+
+## Installing contract template
+
+[Neo3.SmartContract.Templates](https://www.nuget.org/packages/Neo3.SmartContract.Templates/) contains the latest contract compiler and a hello contract template. The latest version is recommended:
+
+```powershell
+dotnet new -i Neo3.SmartContract.Templates
+```
+
+## Creating a contract project
+
+1. Create a folder named `Nep17` as the contract project。
+
+2. In the command line go to the `Nep17` path and then enter the command to generate code files based on the template.
+
+ ```powershell
+ dotnet new neo3-contract
+ ```
+
+ You can find the files named by the folder name under `Nep17` directory: Nep17.cs and Nep17.csproj.
+
+ If you want to specify the file name, add the option -n, for example, `dotnet new neo3-contract -n tokenA`.
+
+## Editing NEP17 code
+
+Since many developers are concerned about how to publish their own contract assets on the Neo block chain, now let's proceed with the NEP17 contract development on private chain.
+
+1. Download all the .cs files from [NEP17 Template](https://github.com/neo-project/examples/tree/master/csharp/NEP17) and place them under the `Nep17` directory.
+
+2. Remove the original Nep17.cs generated by the HelloContract template.
+
+3. Run VS Code and install the C# extension as prompted.
+
+ ![](assets/extension.png)
+
+4. Open the `Nep17` folder to edit the Nep17 template。
+
+In comparison with Neo Legacy, the Neo N3 NEP17 sample has the following changes:
+
+- Added the customized attributes above the smart contract class
+
+ ```
+ [DisplayName("Token Name")]
+ [ManifestExtra("Author", "Neo")]
+ [ManifestExtra("Email", "dev@neo.org")]
+ [ManifestExtra("Description", "This is a NEP17 example")]
+ [SupportedStandards("NEP-17")]
+ [ContractPermission("*", "onNEP17Payment")]
+ public class NEP17 : SmartContract
+ ……
+ ```
+
+- Removed the Name method
+
+- Added _deploy method, which will be executed immediately after the contract is deployed
+
+- Added the Update and Destroy methods
+
+- All the Crowdsale methods are in the NEP17.Crowdsale.cs file. Developers can choose to use this file if need be.
+
+- Called the onNEP17Payment method of the recipient in the Transfer method
+
+- Implemented onNEP17Payment to automatically execute the smart contract when NEP17 assets are received.
+
+- Major changes occurred in smart contract framework. For details refer to [Smart Contract API](https://docs.neo.org/docs/en-us/reference/scapi/interop.html)
+
+For more information refer to [NEP-17](https://docs.neo.org/docs/en-us/develop/write/nep17.html) .
+
+## Compiling contract file
+
+Run the following command to build your contract:
+
+```powershell
+dotnet build
+```
+
+Related contract files are outputted under `bin\sc` path in the contract project directory.
+
+## See also
+
+For more information about writing contracts, refer to [Basics](../develop/write/basics.md).
+
+For information about differences between Neo N3 and Neo Legacy contracts, refer to [Differences than Neo Legacy](../develop/write/difference.md)
+
diff --git a/docs/n3/gettingstarted/enviroment.md b/docs/n3/gettingstarted/enviroment.md
new file mode 100644
index 0000000..3e33209
--- /dev/null
+++ b/docs/n3/gettingstarted/enviroment.md
@@ -0,0 +1,19 @@
+# Setting up local network
+
+## Setting up a private chain
+
+Neo provides a test net for development, debugging and testing purposes. Besides, you can also choose to set up your own private chain where you can get more flexibility with plenty of test tokens. You can pick one of the following options:
+
+- [Set up a private chain with one node](../develop/network/private-chain/solo.md)
+- [Set up a private chain with multiple nodes](../develop/network/private-chain/private-chain2.md)
+
+Refer to the instructions from above links to set up your private chain and withdraw NEO and GAS from genesis block.
+
+## Preparing a wallet file
+
+Now let's create a new wallet file used for deploying smart contracts:
+
+1. Create a new wallet file named 0.json and copy the default address for later use.
+2. Open the wallet where you have withdrawn NEO and GAS from genesis block, transfer all the assets in the wallet to 0.json and wait for the transaction to be confirmed.
+3. Open 0.json to check if the assets are received.
+
diff --git a/docs/n3/gettingstarted/prerequisites.md b/docs/n3/gettingstarted/prerequisites.md
new file mode 100644
index 0000000..38a3782
--- /dev/null
+++ b/docs/n3/gettingstarted/prerequisites.md
@@ -0,0 +1,15 @@
+# Before You Begin
+
+In this tutorial, we will work you through an example of how to release an NEP17 asset on Neo blockchain, which includes the tasks of setting up and configuring the development environment, compiling, deploying and invoking the smart contract on a private Neo chain.
+
+## System environment
+
+You are recommended to run Neo-CLI in the following environments that we have tested:
+
+- Windows 10
+- Ubuntu 20.04
+- macOS Big Sur/version 11.1
+
+### Download Neo-CLI
+
+Refer to [Neo-CLI Setup](../node/cli/setup.md) to download and install Neo-CLI package from GitHub.
\ No newline at end of file
diff --git a/docs/n3/migration/_category_.json b/docs/n3/migration/_category_.json
new file mode 100644
index 0000000..f0dd6df
--- /dev/null
+++ b/docs/n3/migration/_category_.json
@@ -0,0 +1,5 @@
+{
+ "label": "Cross-chain Migration",
+ "position": 10
+ }
+
\ No newline at end of file
diff --git a/docs/n3/migration/assets/Picture1.png b/docs/n3/migration/assets/Picture1.png
new file mode 100644
index 0000000..be68305
Binary files /dev/null and b/docs/n3/migration/assets/Picture1.png differ
diff --git a/docs/n3/migration/assets/Picture10.png b/docs/n3/migration/assets/Picture10.png
new file mode 100644
index 0000000..a3735a6
Binary files /dev/null and b/docs/n3/migration/assets/Picture10.png differ
diff --git a/docs/n3/migration/assets/Picture11.png b/docs/n3/migration/assets/Picture11.png
new file mode 100644
index 0000000..bcc4197
Binary files /dev/null and b/docs/n3/migration/assets/Picture11.png differ
diff --git a/docs/n3/migration/assets/Picture2.png b/docs/n3/migration/assets/Picture2.png
new file mode 100644
index 0000000..2c7638e
Binary files /dev/null and b/docs/n3/migration/assets/Picture2.png differ
diff --git a/docs/n3/migration/assets/Picture3.png b/docs/n3/migration/assets/Picture3.png
new file mode 100644
index 0000000..e09ef82
Binary files /dev/null and b/docs/n3/migration/assets/Picture3.png differ
diff --git a/docs/n3/migration/assets/Picture4.png b/docs/n3/migration/assets/Picture4.png
new file mode 100644
index 0000000..3ba1dbf
Binary files /dev/null and b/docs/n3/migration/assets/Picture4.png differ
diff --git a/docs/n3/migration/assets/Picture5.png b/docs/n3/migration/assets/Picture5.png
new file mode 100644
index 0000000..696ccd1
Binary files /dev/null and b/docs/n3/migration/assets/Picture5.png differ
diff --git a/docs/n3/migration/assets/Picture6.png b/docs/n3/migration/assets/Picture6.png
new file mode 100644
index 0000000..d215dd3
Binary files /dev/null and b/docs/n3/migration/assets/Picture6.png differ
diff --git a/docs/n3/migration/assets/Picture7.png b/docs/n3/migration/assets/Picture7.png
new file mode 100644
index 0000000..b82b3a8
Binary files /dev/null and b/docs/n3/migration/assets/Picture7.png differ
diff --git a/docs/n3/migration/assets/Picture8.png b/docs/n3/migration/assets/Picture8.png
new file mode 100644
index 0000000..a9d28c2
Binary files /dev/null and b/docs/n3/migration/assets/Picture8.png differ
diff --git a/docs/n3/migration/assets/Picture9.png b/docs/n3/migration/assets/Picture9.png
new file mode 100644
index 0000000..f86aa84
Binary files /dev/null and b/docs/n3/migration/assets/Picture9.png differ
diff --git a/docs/n3/migration/assets/history.png b/docs/n3/migration/assets/history.png
new file mode 100644
index 0000000..1c18254
Binary files /dev/null and b/docs/n3/migration/assets/history.png differ
diff --git a/docs/n3/migration/assets/iShot2021-08-09174013.png b/docs/n3/migration/assets/iShot2021-08-09174013.png
new file mode 100644
index 0000000..09cdc8f
Binary files /dev/null and b/docs/n3/migration/assets/iShot2021-08-09174013.png differ
diff --git a/docs/n3/migration/assets/iShot2021-08-09174132.png b/docs/n3/migration/assets/iShot2021-08-09174132.png
new file mode 100644
index 0000000..be54a95
Binary files /dev/null and b/docs/n3/migration/assets/iShot2021-08-09174132.png differ
diff --git a/docs/n3/migration/assets/iShot2021-08-09174301.png b/docs/n3/migration/assets/iShot2021-08-09174301.png
new file mode 100644
index 0000000..1423955
Binary files /dev/null and b/docs/n3/migration/assets/iShot2021-08-09174301.png differ
diff --git a/docs/n3/migration/assets/iShot2021-08-09174320.png b/docs/n3/migration/assets/iShot2021-08-09174320.png
new file mode 100644
index 0000000..0c0851b
Binary files /dev/null and b/docs/n3/migration/assets/iShot2021-08-09174320.png differ
diff --git a/docs/n3/migration/assets/iShot2021-08-09174340.png b/docs/n3/migration/assets/iShot2021-08-09174340.png
new file mode 100644
index 0000000..24ea283
Binary files /dev/null and b/docs/n3/migration/assets/iShot2021-08-09174340.png differ
diff --git a/docs/n3/migration/assets/iShot2021-08-09174411.png b/docs/n3/migration/assets/iShot2021-08-09174411.png
new file mode 100644
index 0000000..05abd61
Binary files /dev/null and b/docs/n3/migration/assets/iShot2021-08-09174411.png differ
diff --git a/docs/n3/migration/assets/iShot2021-08-09175211.png b/docs/n3/migration/assets/iShot2021-08-09175211.png
new file mode 100644
index 0000000..d215dd3
Binary files /dev/null and b/docs/n3/migration/assets/iShot2021-08-09175211.png differ
diff --git a/docs/n3/migration/assets/iShot2021-08-09175750.png b/docs/n3/migration/assets/iShot2021-08-09175750.png
new file mode 100644
index 0000000..bdd8a3a
Binary files /dev/null and b/docs/n3/migration/assets/iShot2021-08-09175750.png differ
diff --git a/docs/n3/migration/assets/iShot2021-08-09180551.png b/docs/n3/migration/assets/iShot2021-08-09180551.png
new file mode 100644
index 0000000..5a6448b
Binary files /dev/null and b/docs/n3/migration/assets/iShot2021-08-09180551.png differ
diff --git a/docs/n3/migration/migration-guide.md b/docs/n3/migration/migration-guide.md
new file mode 100644
index 0000000..09b1d43
--- /dev/null
+++ b/docs/n3/migration/migration-guide.md
@@ -0,0 +1,124 @@
+# Neo N3 Migration Guideline on Migration Page
+
+This tutorial will guide you through the process of migrating Neo and GAS tokens from Neo legacy to Neo N3 on the Migration website using N3 compatible wallets.
+
+## Migration with NeoLine Wallet
+
+1. Click the icon in the upper right corner and click `Create wallet`.
+
+ ![](assets/picture1.png)
+
+2. Select `Neo N3` to create a Neo N3 wallet.
+
+ ![](assets/picture2.png)
+
+3. Input your wallet name and password and click `Create` . A new Neo N3 wallet is successfully created.
+
+ > [!Note]
+ >
+ > Please follow the prompt to back up your private key carefully.
+
+ ![](assets/picture3.png)
+
+4. Go to the [Migration To N3](https://migration.neo.org/) website. Click `CONNECT WALLET`.
+
+ ![](assets/Picture4.png)
+
+5. Click `Connect NeoLine` to connect a NeoLine wallet.
+
+ ![](assets/Picture5.png)
+
+6. Click `Connect`.
+
+ ![](assets/Picture6.png)
+
+7. Select an asset you want to migrate.
+
+ ![](assets/Picture7.png)
+
+8. Input the amount you want to migrate.
+
+ > [!Note]
+ >
+ > A 1 GAS fee is required if you are migrating less than 10 NEO or 20 GAS. This is because fees are now required on all Neo N3 transactions. Allowing users to migrate small quantities of tokens with no fee opens up an exploit where users could potentially spam transactions to burn Neo Foundation GAS inefficiently.
+
+ ![](assets/Picture8.png)
+
+9. Click `Select an N3 address` to select an N3 wallet address that you want to migrate to and then click `Done`.
+
+ ![](assets/Picture9.png)
+
+10. Click `NEXT` to start the migration.
+
+ ![](assets/Picture10.png)
+
+11. Confirm the migration information. If the information is correct, click `NEXT`. Otherwise, click the `BACK` button to revise the information.
+
+ ![](assets/iShot2021-08-09174013.png)
+
+12. Click `Yes` to approve the migration.
+
+ ![](assets/iShot2021-08-09174132.png)
+
+13. Wait for the migration process to complete. You can click `Migration history` to check the migration status.
+
+ ![](assets/iShot2021-08-09174340.png)
+
+ ![](assets/history.png)
+
+
+
+
+## Migration with O3 Wallet
+
+1. Open the O3 wallet app. Click the wallet account and click `Create`.
+
+2. Select `NEO N3` and click `Next` to create a Neo N3 wallet.
+
+ ![](assets/Picture11.png)
+
+3. Input your wallet name and password and click `Create`. A new Neo N3 wallet is successfully created.
+
+4. Go to the [Migrate To N3](https://migration.neo.org/) website. Click `CONNECT WALLET` to connect a wallet.
+
+ ![](assets/Picture4.png)
+
+5. Click `Connect O3` to connect an O3 wallet.
+
+6. Select an account and click `Connect`.
+
+ ![](assets/Picture6.png)
+
+7. Select an asset you want to migrate.
+
+ ![](assets/Picture7.png)
+
+8. Input the amount you want to migrate.
+
+ > [!Note]
+ >
+ > A 1 GAS fee is required if you are migrating less than 10 NEO or 20 GAS. This is because fees are now required on all Neo N3 transactions. Allowing users to migrate small quantities of tokens with no fee opens up an exploit where users could potentially spam transactions to burn Neo Foundation GAS inefficiently.
+
+ ![](assets/Picture8.png)
+
+9. Click `Select an N3 address` to select an address that you want to migrate to, and then click `Select`.
+
+ ![](assets/iShot2021-08-09175750.png)
+
+10. Click `NEXT` to start the migration.
+
+ ![](assets/Picture10.png)
+
+11. Confirm the migration information. If the information is correct, click `NEXT`. Otherwise, click `BACK` to revise the information.
+
+ ![](assets/iShot2021-08-09174013.png)
+
+12. Click `Approve`.
+
+ ![](assets/iShot2021-08-09180551.png)
+
+13. Wait for the migration process to complete. You can click `Migration history` to check the migration status.
+
+ ![](assets/iShot2021-08-09174340.png)
+
+ ![](assets/history.png)
diff --git a/docs/n3/migration/migration.md b/docs/n3/migration/migration.md
new file mode 100644
index 0000000..3cb9f04
--- /dev/null
+++ b/docs/n3/migration/migration.md
@@ -0,0 +1,28 @@
+# Migration from Neo Legacy to Neo N3
+
+This tutorial is intended to guide exchange developers in migrating the global assets NEO/GAS/nNEO/cGAS on the Neo Legacy chain to the Neo N3 chain via transfer transactions.
+
+## Migration process flow
+
+1. On Neo Legacy side, the user sends a transfer transaction (Invocation Transaction/Contracttransaction) to the specific address `ANeo2toNeo3MigrationAddressxwPB2Hz` (`AJ36ZCpMhiHYMdMAUaP7i1i9pJz4jMdiQV` for test net) placing the N3 standard address in `attribute` of the transaction using the key **Remark14**.
+
+ The code demos in multi-languages are provided for your reference: [Demos](https://github.com/neo-ngd/sdkDemo)
+
+ > [!Caution]
+ >
+ > Before sending the transaction, ensure that your transaction meets all the following requirements, otherwise it would not be processed and your assets sent out would be lost!
+ >
+ > - The N3 address in the transaction is valid and only one Remark14 in `attribute`.
+ > - For migration asset amount equal to or more than 10 NEO or 20 GAS it is free. If you are migrating less than that amount, you have to attach **1 GAS as network fee**.
+ > - One transaction can only include one kind of asset for migration except GAS for network fee payment.
+
+ > [!Note]
+ >
+ > Migrating the decimal part of nNEO is not supported. The migration amount will be rounded down when distributing nNEO on N3 blockchain.
+
+2. We will scan all the Neo legacy transactions sent to the specific address and sends the corresponding amount of NEO/GAS token to the N3 address at regular intervals (up to one business day) only if the transaction is valid.
+
+## See also
+
+- [Asset Contract Hashes](https://github.com/neo-ngd/sdkDemo/blob/master/contracthash.md)
+- [Guideline on Migration Page](migration-guide.md)
diff --git a/docs/n3/node/Introduction.md b/docs/n3/node/Introduction.md
index 7d32e5f..2e4400c 100644
--- a/docs/n3/node/Introduction.md
+++ b/docs/n3/node/Introduction.md
@@ -16,7 +16,7 @@ There are two full-node programs:
| | Neo-GUI | Neo-CLI |
| ---- | ---------------------------------------- | ---------------------------------------- |
| Releases | [Download](https://github.com/neo-ngd/Neo3-GUI/releases) | [Download](https://github.com/neo-project/neo-cli/releases) |
-| Source code | [Github](https://github.com/neo-ngd/Neo3-GUI) | [Github](https://github.com/neo-project/neo-cli) |
+| Source code | [GitHub](https://github.com/neo-ngd/Neo3-GUI) | [GitHub](https://github.com/neo-project/neo-cli) |
## Neo-GUI and Neo-CLI comparison
diff --git a/docs/n3/node/_category_.json b/docs/n3/node/_category_.json
index 0624bcd..aa98ac8 100644
--- a/docs/n3/node/_category_.json
+++ b/docs/n3/node/_category_.json
@@ -1,5 +1,5 @@
{
"label": "Neo Nodes & Clients",
- "position": 2
+ "position": 3
}
\ No newline at end of file
diff --git a/docs/n3/node/cli/cli.md b/docs/n3/node/cli/cli.md
index efa680f..97ad929 100644
--- a/docs/n3/node/cli/cli.md
+++ b/docs/n3/node/cli/cli.md
@@ -23,7 +23,7 @@ All the commands described in this document conform with these conventions:
| ------- | --------- |
| version | Shows the current Neo-CLI version |
| help [plugin-name] | Help menu, which can also show plugin related commands. |
-| [parse](#parse) `` | Convert the input string into various supported data format |
+| [parse](#parse) \ | Convert the input string into various supported data format |
| clear | Clear screen |
| exit | Exit program |
@@ -31,10 +31,11 @@ All the commands described in this document conform with these conventions:
| Command | Parameters | Description |
| ------------------------------------------------- | -------------------------------------- | ------------------------------------------------------------ |
-| [create wallet](#create-wallet) | `` | Creates a wallet file. |
-| [open wallet](#open-wallet) | `` | Opens a wallet file. |
+| [create wallet](#create-wallet) | \ | Creates a wallet file. |
+| [delete address](#delete-address) | \ | Delete an address from wallet. |
+| [open wallet](#open-wallet) | \ | Opens a wallet file. |
| close wallet | | Closes the current wallet. |
-| [upgrade wallet](#upgrade-wallet) | `` | Upgrades old wallet files. |
+| [upgrade wallet](#upgrade-wallet) | \ | Upgrades old wallet files. |
The commands listed in the table below requires you to open the wallet before invoking.
@@ -46,20 +47,21 @@ The commands listed in the table below requires you to open the wallet before in
| list key | | Lists all public keys in your wallet. |
| [show gas](#show-gas) | | Lists all the GAS in your wallet. |
| [create address](#create-address) | [count=1] | Creates address / batch create address |
-| [import key](#import-key) | `` | Imports a private key / bulk import of private keys. |
+| [import key](#import-key) | \ | Imports a private key / bulk import of private keys. |
| [export key](#export-key) | \[path=null] \[scriptHash=null] | Exports private keys. |
-| [import multisigaddress](#import-multisigaddress) | `` `` | Creates a multi-signature contract. |
-| [import watchonly](#import-watchonly) | `` | Imports the watch-only address (e.g. contract address)|
-| [send](#send) | ` `` `` \[from=null] \[data=null] \[signerAccounts=null] | Sends assets to the specified address. |
-| [sign](#sign) | `` | Signs the transaction. The parameter is the json string that records the transaction information. |
+| [import multisigaddress](#import-multisigaddress) | \ \ | Creates a multi-signature contract. |
+| [import watchonly](#import-watchonly) | \ | Imports the watch-only address (e.g. contract address)|
+| [send](#send) | \ \ \ \[from=null] \[data=null] \[signerAccounts=null] | Sends assets to the specified address. |
+| [sign](#sign) | \ | Signs the transaction. The parameter is the json string that records the transaction information. |
+| [cancel](#cancel) | \ [sender=null] [signerAccounts=null] | Cancel unconfirmed transactions (in memory pool) |
#### Contract commands
| Command | Parameters | Description |
| ----------------- | ------------------------------------------------------------ | ------------------ |
-| [deploy](#deploy) | `` [manifestFile] | Deploys a contract |
-| [invoke](#invoke) | `` `` \[contractParameters=null] \[sender=null] \[signerAccounts=null] \[maxGas=20] | Invokes a contract |
-| [update](#update) | `` `` `` `` \[signerAccounts=null] | Upgrade a contract |
+| [deploy](#deploy) | \ [manifestFile] | Deploys a contract |
+| [invoke](#invoke) | \ \ \[contractParameters=null] \[sender=null] \[signerAccounts=null] \[maxGas=20] | Invokes a contract |
+| [update](#update) | \ \ \ \ \[signerAccounts=null] | Upgrade a contract |
#### Node commands
@@ -73,10 +75,11 @@ The commands listed in the table below requires you to open the wallet before in
| Command | Parameters | Description |
| ----------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
-| [balanceof](#balanceof) | `` `` | Queries the balance of specified token at the specified address |
-| [decimals](#decimals) | `` | Queries the precision of specified token |
-| [name](#name) | `` | Queries the specified token name |
-| [transfer](#transfer) | `` `` `` \[from=null] \[data=null] \[signersAccounts=null] | Invokes the transfer method to transfer the specified token |
+| [balanceof](#balanceof) | \ \ | Queries the balance of specified token at the specified address |
+| [decimals](#decimals) | \ | Queries the precision of specified token |
+| [name](#name) | \ | Queries the name of specified token |
+| [totalsupply](#totalsupply) | \ | Queries the total supply of specified token |
+| [transfer](#transfer) | \ \ \ \[from=null] \[data=null] \[signersAccounts=null] | Invokes the transfer method to transfer the specified token |
#### Native contract commands
@@ -88,14 +91,14 @@ The commands listed in the table below requires you to open the wallet before in
| Command | Parameters | Description |
| --------------- | ------------------- | ------------------------------------------------------------ |
-| [relay](#relay) | `` | Broadcasts the transaction. The parameter is the json string that records the transaction information. |
-| [broadcast addr](#broadcast-addr) | `` `` | Broadcasts the IP address of the node |
-| [broadcast block](#broadcast-block) | `` | Broadcasts a block |
-| [broadcast getblocks](#broadcast-getblocks) | `` | Broadcasts the getblocks request |
-| [broadcast getdata](#broadcast-getdata) | `` `` | Broadcasts the getdata request |
-| [broadcast getheaders](#broadcast-getheaders) | `` | Broadcasts the getheaders request |
-| [broadcast inv](#broadcast-inv) | `` `` | Broadcasts the inventory data |
-| [broadcast transaction](#broadcast-transaction) | ` | Broadcasts a transaction |
+| [relay](#relay) | \ | Broadcasts the transaction. The parameter is the json string that records the transaction information. |
+| [broadcast addr](#broadcast-addr) | \ \ | Broadcasts the IP address of the node |
+| [broadcast block](#broadcast-block) | \ | Broadcasts a block |
+| [broadcast getblocks](#broadcast-getblocks) | \ | Broadcasts the getblocks request |
+| [broadcast getdata](#broadcast-getdata) | \ \ | Broadcasts the getdata request |
+| [broadcast getheaders](#broadcast-getheaders) | \ | Broadcasts the getheaders request |
+| [broadcast inv](#broadcast-inv) | \ \ | Broadcasts the inventory data |
+| [broadcast transaction](#broadcast-transaction) | \ | Broadcasts a transaction |
#### Plugin commands
@@ -104,33 +107,43 @@ The commands listed in the table below requires you to open the wallet before in
| [plugins](#plugins) | | Lists loaded plugins |
| [install](#install) | [Plugin name] | Installs the specified plugin |
| uninstall | [Plugin name] | Uninstalls the specified plugin |
-| [dump storage](#dump-storage) | `` | Exports all or the specified state data. This command requires installation of the StatesDumper plugin. |
+| [dump storage](#dump-storage) | \ | Exports all or the specified state data. This command requires installation of the StatesDumper plugin. |
| [start consensus](#start-consensus) | | Starts consensus. This command requires installation of the DBFTPlugin plugin. |
| [start oracle](#start-oracle) | | Starts Oracle. This command requires installation of the OracleService plugin. |
| [stop oracle](#stop-oracle) | | Stops Oracle. This command requires installation of the OracleService plugin. |
-| [state root](#state-root) | `` | Queries the state root with index. This command requires installation of the StateService plugin. |
+| [state root](#state-root) | \ | Queries the state root with index. This command requires installation of the StateService plugin. |
| state height | | Queries the state height. This command requires installation of the StateService plugin. |
-| [get proof](#get-proof) | `` `` `` | Gets proof with root hash, contract hash, and storage key. |
-| [verify proof](#verify-proof) | `` `` | Verifies with root hash and proof. |
+| [get proof](#get-proof) | \ \ \ | Gets proof with root hash, contract hash, and storage key. |
+| [verify proof](#verify-proof) | \ \ | Verifies with root hash and proof. |
#### Voting commands
| Command | Parameters | Description |
| --------------------------------------------- | ----------------------------- | ----------------------------------------------------------- |
-| [get accountstate](#get-accountstate) | `` | Gets the latest voting information of the specified account |
+| [get accountstate](#get-accountstate) | \ | Gets the latest voting information of the specified account |
| [get candidates](#get-candidates) | | Gets candidates' public keys and votes |
| [get committee](#get-committee) | | Gets the committee member's public key |
| [get next validators](#get-next-validators) | | Gets the next validator's public key |
-| [register candidate](#register-candidate) | `` [maxGas=1010] | Registers the candidate |
-| [unregister candidate](#unregister-candidate) | `` | Unregisters the candidate |
-| [vote](#vote) | `` `` | Votes for candidates |
-| [unvote](#unvote) | `` | Cancel the voting |
+| [register candidate](#register-candidate) | \ [maxGas=1010] | Registers the candidate |
+| [unregister candidate](#unregister-candidate) | \ | Unregisters the candidate |
+| [vote](#vote) | \ \ | Votes for candidates |
+| [unvote](#unvote) | \ | Cancel the voting |
#### Block Commands
| Command | Parameters | Description |
| ------------------------------- | -------------------------------------- | ------------------------------------------------------------ |
-| [export blocks](#export-blocks) | `` \[block count] \[export path] | Exports the blockchain data from the specified block height. The exported data can be used for offline synchronization. |
+| [export blocks](#export-blocks) | \ \[block count] \[export path] | Exports the blockchain data from the specified block height. The exported data can be used for offline synchronization. |
+| [show block](#show-blocks) | \ | Output block details via block height or block hash. |
+| [show contract](#show-contract) | \ | Output contract details by contract name or contract hash. |
+| [show tx](#show-tx) | \ | Output transaction details via transaction hash. |
+
+#### Log Commands
+
+| Command | Description |
+| ------------------- | -------------------------------------- |
+| console log on | Turn on consensus logging output |
+| console log off | Turn off consensus logging output |
## Command Description
@@ -161,7 +174,7 @@ String to Hex String 307835356466386434393530656261356165663964346434
String to Base64 MHg1NWRmOGQ0OTUwZWJhNWFlZjlkNGQ0ZDI2MTBmODI3ZmNkNGE3YmI5
```
-If you see messy codes that is because some data types cannot be converted.
+If you see messy codes that is because some data types cannot be converted. You can also use https://neo.org/converter to convert.
### create wallet
@@ -184,6 +197,23 @@ ScriptHash: 0x19d69593a368ba01b2aac8dc0a67d7b675e1e640
The wallet file is generated under the neo-cli root directory. If you want to set other path, you need to create the folder in advance.
+### delete address
+
+Delete an address from wallet.
+
+##### Syntax
+
+ `delete address `
+
+##### Example
+
+```
+neo> delete address NL4zw2c1MdaXYmGt4NWTPXFcyuNjCQrpNL
+Warning: Irrevocable operation!
+Are you sure to delete account NL4zw2c1MdaXYmGt4NWTPXFcyuNjCQrpNL? (no|yes): yes
+Address 0xde6b70cbd0989167094b60b474e8f6658233b501 deleted.
+```
+
### open wallet
Opens the wallet file at the specified path. The wallet password is required to be entered when opening the wallet.
@@ -323,6 +353,58 @@ Result Stack: [{"type":"Integer","value":"8"}]
Result : 8
```
+### name
+
+Queries the name of specified token
+
+##### Syntax
+
+ `name `
+
+##### Parameters
+
+`tokenHash`: The token hash
+
+##### Example
+
+```
+neo> name 0xd2a4cff31913016155e38e474a2c06d08be276cf
+Result: GasToken
+
+neo> name gas
+Result: GasToken
+```
+
+### totalsupply
+
+Queries the total supply of specified token
+
+##### Syntax
+
+ `totalsupply `
+
+##### Parameters
+
+`tokenHash`: The token hash
+
+##### Example
+
+```
+neo> totalsupply 0xd2a4cff31913016155e38e474a2c06d08be276cf
+Invoking script with: 'wh8MC3RvdGFsU3VwcGx5DBTPduKL0AYsSkeO41VhARMZ88+k0kFifVtS'
+VM State: HALT
+Gas Consumed: 0.019671
+Result Stack: [{"type":"Integer","value":"5200017313646450"}]
+Result: 52000173.1364645
+
+neo> totalsupply neo
+Invoking script with: 'wh8MC3RvdGFsU3VwcGx5DBT1Y+pAvCg9TQ4FxI6jBbPyoHNA70FifVtS'
+VM State: HALT
+Gas Consumed: 0.019671
+Result Stack: [{"type":"Integer","value":"100000000"}]
+Result: 100000000
+```
+
### transfer
Invokes the transfer method to transfer the specified token.
@@ -739,6 +821,25 @@ Signed Output:
The signed json string is returned. If the signature is complete, you can broadcast the transaction using the command `relay`.
+### cancel
+
+Cancel unconfirmed transactions (in memory pool).
+Only transactions in the memory pool can be canceled, e.g. if you send two identical transactions, you can cancel one of them in a short time (before the consensus node confirms it).
+
+##### Syntax
+
+`cancel [sender=null] [signerAccounts=null]`
+
+##### Example
+
+```
+neo> cancel 0x38d11429a6d34d2ed86213a2a020eece795f48e569b5d05a0ef3616778b03a78
+Network fee: 0.01232521 Total fee: 0.01232521 GAS
+Relay tx? (no|yes): yes
+Signed and relayed transaction with hash:
+0x26bb0b2c052aa545500e4e982028c0ca782f7e66e256908637f506c8c740e1c0
+```
+
### deploy
Deploys a contract on the blockchain.
@@ -1099,6 +1200,181 @@ Exports the block data from the specified block height. The output can be used f
` `: The height of the starting block from which the data is exported.
+### show blocks
+
+Output block details via block height or block hash.
+
+##### Syntax
+
+`show block `
+
+##### Parameters
+
+` `: The index or height of the block.
+
+##### Example
+
+```
+neo> show block 332
+-------------Block-------------
+
+ Timestamp: 2024/5/9 16:28:42
+ Index: 332
+ Hash: 0x988bf98f6487af8d77f25bedf48961c4a445360324e60b1f487e02bc25998c67
+ Nonce: 14527164885255458229
+ MerkleRoot: 0xf5a0bc050795ae0cf2bea36655d65585dc72246464ec27f79e919ed6f301a843
+ PrevHash: 0x9412af2c3601b0c962fef14f32329a1b8488327a2fe42f62e33ff27954de4b22
+ NextConsensus: 0x94b96e41baab7eb8b6d78d688c34b912ec76dd38
+ PrimaryIndex: 0
+ PrimaryPubKey: 027b8e84897dcdfe7cbdf7e6d7b69ddb6edd6323cbe732ea68dd2b3d44a80e80f0
+ Version: 0
+ Size: 470 Byte(s)
+
+-------------Witness-------------
+
+ Invocation Script: DECZt8XaJ34W4PIQXjs5oD/uAwa7RxzQ4T7760os7vStFLHq7bcpomdsqpSSDrf1lY/KDEYPjP2F5M/PJcKuVHfv
+ Verification Script: EQwhAnuOhIl9zf58vffm17ad227dYyPL5zLqaN0rPUSoDoDwEUGe0Nw6
+ ScriptHash: 0x94b96e41baab7eb8b6d78d688c34b912ec76dd38
+ Size: 110 Byte(s)
+
+-------------Transactions-------------
+
+ 0xf5a0bc050795ae0cf2bea36655d65585dc72246464ec27f79e919ed6f301a843
+
+--------------------------------------
+```
+
+### show contract
+
+Output contract details by contract name or contract hash.
+
+##### Syntax
+
+`show contract `
+
+##### Parameters
+
+` `: The name or hash of the contract.
+
+##### Example
+
+```
+neo> show contract 0xd2a4cff31913016155e38e474a2c06d08be276cf
+-------------Contract-------------
+
+ Name: GasToken
+ Hash: 0xd2a4cff31913016155e38e474a2c06d08be276cf
+ Id: -6
+ UpdateCounter: 0
+ SupportedStandards: NEP-17
+ Checksum: 2663858513
+ Compiler: neo-core-v3.0
+ SourceCode:
+ Trusts: []
+
+-------------Groups-------------
+
+ No Group(s).
+
+-------------Permissions-------------
+
+ Contract: *
+ Methods: *
+
+-------------Methods-------------
+
+ Name: balanceOf
+ Safe: True
+ Offset: 0
+ Parameters: [Hash160]
+ ReturnType: Integer
+
+ Name: decimals
+ Safe: True
+ Offset: 7
+ Parameters: []
+ ReturnType: Integer
+
+ Name: symbol
+ Safe: True
+ Offset: 14
+ Parameters: []
+ ReturnType: String
+
+ Name: totalSupply
+ Safe: True
+ Offset: 21
+ Parameters: []
+ ReturnType: Integer
+
+ Name: transfer
+ Safe: False
+ Offset: 28
+ Parameters: [Hash160, Hash160, Integer, Any]
+ ReturnType: Boolean
+
+-------------Script-------------
+
+ EEEa93tnQBBBGvd7Z0AQQRr3e2dAEEEa93tnQBBBGvd7Z0A=
+
+--------------------------------
+```
+
+### show tx
+
+Output transaction details via transaction hash.
+
+##### Syntax
+
+`show tx `
+
+##### Parameters
+
+` `: The transaction hash of transaction.
+
+##### Example
+
+```
+neo> show tx 0xf5a0bc050795ae0cf2bea36655d65585dc72246464ec27f79e919ed6f301a843
+-------------Transaction-------------
+
+ Timestamp: 2024/5/9 16:28:42
+ Hash: 0xf5a0bc050795ae0cf2bea36655d65585dc72246464ec27f79e919ed6f301a843
+ Nonce: 1904785219
+ Sender: 0x4578060c29f4c03f1e16c84312429d991952c94c
+ ValidUntilBlock: 17611
+ FeePerByte: 4949
+ NetworkFee: 1232520
+ SystemFee: 9977780
+ Script: CwIA4fUFDBRMyVIZmZ1CEkPIFh4/wPQpDAZ4RQwUTMlSGZmdQhJDyBYeP8D0KQwGeEUUwB8MCHRyYW5zZmVyDBTPduKL0AYsSkeO41VhARMZ88+k0kFifVtSOQ==
+ Version: 0
+ BlockIndex: 332
+ BlockHash: 0x988bf98f6487af8d77f25bedf48961c4a445360324e60b1f487e02bc25998c67
+ Size: 249 Byte(s)
+
+-------------Signers-------------
+
+ Rules: []
+ Account: 0x4578060c29f4c03f1e16c84312429d991952c94c
+ Scopes: CalledByEntry
+ AllowedContracts: []
+ AllowedGroups: []
+ Size: 21 Byte(s)
+
+-------------Witnesses-------------
+
+ InvocationScript: DEChKE7tm85XZkBDpLkYeryTMc+NBSga2Y0mJrm02i6yoSIsn4i5Ri3NcFfsvnltg28s3fqjxjoqgXYRg/ODqM10
+ VerificationScript: DCECe46EiX3N/ny99+bXtp3bbt1jI8vnMupo3Ss9RKgOgPBBVuezJw==
+ ScriptHash: 0x4578060c29f4c03f1e16c84312429d991952c94c
+ Size: 108 Byte(s)
+
+-------------Attributes-------------
+
+ No Attribute(s).
+
+--------------------------------------
+```
+
### start consensus
Starts the consensus on the premise that the wallet has a consensus authority, allows consensus authority to be obtained on the main net through voting. This command requires installation of the DBFTPlugin. If a private chain is deployed, public key of the consensus can be set up in the `protocol.json`. For more information refer to [Setting up Private Chain](../../develop/network/private-chain/private-chain2.md).
@@ -1163,5 +1439,4 @@ Verifies with root hash and proof.
```
neo> verify proof 0x7bf925dbd33af0e00d392b92313da59369ed86c82494d0e02040b24faac0a3ca Bfv///8XBiQBAQ8DRzb6Vkdw0r5nxMBp6Z5nvbyXiupMvffwm0v5GdB6jHvyAAQEBAQEBAQEA7l84HFtRI5V11s58vA+8CZ5GArFLkGUYLO98RLaMaYmA5MEnx0upnVI45XTpoUDRvwrlPD59uWy9aIrdS4T0D2cA6Rwv/l3GmrctRzL1me+iTUFdDgooaz+esFHFXJdDANfA2bdshZMp5ox2goVAOMjvoxNIWWOqjJoRPu6ZOw2kdj6A8xovEK1Mp6cAG9z/jfFDrSEM60kuo97MNaVOP/cDZ1wA1nf4WdI+jksYz0EJgzBukK8rEzz8jE2cb2Zx2fytVyQBANC7v2RaLMCRF1XgLpSri12L2IwL9Zcjz5LZiaB5nHKNgQpAQYPDw8PDw8DggFffnsVMyqAfZjg+4gu97N/gKpOsAK8Q27s56tijRlSAAMm26DYxOdf/IjEgkE/u/CoRL6dDnzvs1dxCg/00esMvgPGioeOqQCkDOTfliOnCxYjbY/0XvVUOXkceuDm1W0FzQQEBAQEBAQEBAQEBAQEBJIABAPH1PnX/P8NOgV4KHnogwD7xIsD8KvNhkTcDxgCo7Ec6gPQs1zD4igSJB4M9jTREq+7lQ5PbTH/6d138yUVvtM8bQP9Df1kh7asXrYjZolKhLcQ1NoClQgEzbcJfYkCHXv6DQQEBAOUw9zNl/7FJrWD7rCv0mbOoy6nLlHWiWuyGsA12ohRuAQEBAQEBAQEBAYCBAIAAgA=
AAI=
-```
-
+```
\ No newline at end of file
diff --git a/docs/n3/node/cli/setup.md b/docs/n3/node/cli/setup.md
index 418e3b1..2bed430 100644
--- a/docs/n3/node/cli/setup.md
+++ b/docs/n3/node/cli/setup.md
@@ -11,61 +11,63 @@ This document will describe both ways.
The following table lists the minimum and recommended hardware requirements for the computer running Neo-CLI.
-| | Minimum | Recommended |
-| --------- | ---------------------------------------------------- | ---------------------------------------------------- |
-| System | Windows 10/11
Ubuntu 16.04/18.04/20.04
CentOS 7.4/7.6/7.7 | Windows 10/11
Ubuntu 16.04/18.04/20.04
CentOS 7.4/7.6/7.7 |
-| CPU | Dual core | Quad core |
-| Memory | 8G | 16G |
-| Hard Disk | 50G SSD hard drive | 100G SSD hard drive |
+| | Minimum | Recommended |
+| --------- | ----------------------------------- | ----------------------------------- |
+| System | Windows 10/11
Ubuntu 20.04
| Windows 10/11
Ubuntu 20.04
|
+| CPU | Dual core | Quad core |
+| Memory | 8G | 16G |
+| Hard Disk | 50G SSD hard drive | 100G SSD hard drive |
## Installing Neo-CLI package
-1. Download the latest [Neo-CLI](https://github.com/neo-project/neo-cli/releases) package according to your operating system on Github and unzip it.
+1. Download the latest [Neo-CLI](https://github.com/neo-project/neo-cli/releases) package according to your operating system on GitHub and unzip it.
2. On Linux, install the LevelDB and SQLite3 dev packages.
- **Ubuntu:**
+ **Ubuntu:**
- ```
- sudo apt-get install libleveldb-dev sqlite3 libsqlite3-dev libunwind8-dev
- ```
+ ```
+ sudo apt-get install libleveldb-dev sqlite3 libsqlite3-dev libunwind8-dev
+ ```
- **CentOS:**
+ **CentOS:**
- ```
- sudo wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm
- sudo yum -y install epel-release-latest-9.noarch.rpm
- sudo yum -y install leveldb-devel libunwind-devel libsqlite3x-devel sqlite3*
- ```
+ ```
+ sudo wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch. rpm
+ sudo yum -y install epel-release-latest-9.noarch.rpm
+ sudo yum -y install leveldb-devel libunwind-devel libsqlite3x-devel sqlite3*
+ ```
- If you use RocksDB as the storage, modify config.json, as shown below:
+ If you use RocksDB as the storage, modify config.json, as shown below:
- ```
- "Storage": {
- "Engine": "RocksDBStore",
- "Path": "Data_RocksDB_{0}"
- },
- ```
+ ```
+ "Storage": {
+ "Engine": "RocksDBStore",
+ "Path": "Data_RocksDB_{0}"
+ },
+ ```
- and then enter the following command on ubuntu 18.04:
+ and then enter the following command on ubuntu 18.04:
- ```
- sudo apt-get install librocksdb-dev
- ```
+ ```
+ sudo apt-get install librocksdb-dev
+ ```
- If using Windows, you can skip this step as those files are already included in the installation package.
+3. On some versions of Windows Server, install [Microsoft Visual C++ Redistributable for Visual Studio 2015, 2017 and 2019 (x64)](https://aka.ms/vs/16/release/vc_redist.x64.exe) first.
+
+ If using Windows10/11, skip this step as those files are already included in the installation package.
## Publishing from Neo-CLI source code
-You can download and compile the Neo-CLI source directly from Github.
+You can download and compile the Neo-CLI source directly from GitHub.
### Installing required files
-1. Git clone Neo-CLI source code from [Github](https://github.com/neo-project/neo-node) or using the following command:
+1. Git clone Neo-CLI source code from [GitHub](https://github.com/neo-project/neo-node) or using the following command:
- ```
- $ git clone https://github.com/neo-project/neo-node.git
- ```
+ ```
+ $ git clone https://github.com/neo-project/neo-node.git
+ ```
2. Download [LevelDB](https://github.com/neo-ngd/leveldb/releases) and unzip the package for later use.
diff --git a/docs/n3/reference/_category_.json b/docs/n3/reference/_category_.json
index 655a2ac..f2d7127 100644
--- a/docs/n3/reference/_category_.json
+++ b/docs/n3/reference/_category_.json
@@ -1,5 +1,5 @@
{
"label": "Reference",
- "position": 3
+ "position": 6
}
\ No newline at end of file
diff --git a/docs/n3/reference/rpc/latest-version/api.md b/docs/n3/reference/rpc/latest-version/api.md
index 52baf39..bce4c78 100644
--- a/docs/n3/reference/rpc/latest-version/api.md
+++ b/docs/n3/reference/rpc/latest-version/api.md
@@ -59,6 +59,7 @@ You can modify the port in config.json in the RpcServer folder.
| [getunclaimedgas](api/getunclaimedgas.md) | | Get unclaimed gas of the specified address. |
| [invokefunction](api/invokefunction.md) | \[params] \[sender] \[signers] | Invokes a smart contract with the specified script hash, passing in the method name and its params. |
| [invokescript](api/invokescript.md) |