EdjCase.ICP.Agent 4.0.0-pre.4

This is a prerelease version of EdjCase.ICP.Agent.
There is a newer version of this package available.
See the version list below for details.
dotnet add package EdjCase.ICP.Agent --version 4.0.0-pre.4                
NuGet\Install-Package EdjCase.ICP.Agent -Version 4.0.0-pre.4                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="EdjCase.ICP.Agent" Version="4.0.0-pre.4" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add EdjCase.ICP.Agent --version 4.0.0-pre.4                
#r "nuget: EdjCase.ICP.Agent, 4.0.0-pre.4"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install EdjCase.ICP.Agent as a Cake Addin
#addin nuget:?package=EdjCase.ICP.Agent&version=4.0.0-pre.4&prerelease

// Install EdjCase.ICP.Agent as a Cake Tool
#tool nuget:?package=EdjCase.ICP.Agent&version=4.0.0-pre.4&prerelease                

ICP.NET Agent

  • Library to communicate to and from the Internet Computer
  • PreGenerated ICRC1 Client
  • Nuget: EdjCase.ICP.Agent

Usage (Manual)

  • Dont define any types and use CandidValue and CandidType
  • Call functions using Candid objects
// Create http agent with anonymous identity
IAgent agent = new HttpAgent();

// Create Candid arg to send in request
ulong proposalId = 1234;
CandidArg arg = CandidArg.FromCandid(
	CandidTypedValue.Nat64(proposalId) // Candid type with no conversion
);

// Make request to IC
string method = "get_proposal_info";
Principal governanceCanisterId = Principal.FromText("rrkah-fqaaa-aaaaa-aaaaq-cai");
QueryResponse response = await agent.QueryAsync(governanceCanisterId, method, arg);

CandidArg reply = response.ThrowOrGetReply();
List<CandidTypedValue> values = reply.Values;

Usage (Self Defined Types)

  • Declare types of api models
  • Call functions and use custom object converters
// Create http agent with anonymous identity
IAgent agent = new HttpAgent();

// Create Candid arg to send in request
ulong proposalId = 1234;
CandidArg arg = CandidArg.FromCandid(
    CandidTypedValue.FromObject(proposalId) // Conversion can be C# or custom types
);

// Make request to IC
string method = "get_proposal_info";
Principal governanceCanisterId = Principal.FromText("rrkah-fqaaa-aaaaa-aaaaq-cai");
QueryResponse response = await agent.QueryAsync(governanceCanisterId, method, arg);

CandidArg reply = response.ThrowOrGetReply();
// Convert to custom class
OptionalValue<ProposalInfo> info = reply.ToObjects<OptionalValue<ProposalInfo>>(); // Conversion to custom or C# types

Usage (w/ Client Generator)

  • Run Client Generator on *.did file (see Client Generator below)
  • Use generated client and models to call function
// Create http agent with anonymous identity
IAgent agent = new HttpAgent();

Principal governanceCanisterId = Principal.FromText("rrkah-fqaaa-aaaaa-aaaaq-cai");
// Create new instance of client generated by `Client Generator` (this is using Governance.did for the NNS)
var client = new GovernanceApiClient(agent, governanceCanisterId);

// Make request
OptionalValue<ProposalInfo> info = await client.GetProposalInfoAsync(62143);

Using the ICRC1 PreGenerated Client

Instantiate an ICRC1Client by passing the HttpAgent instance and the canister ID of the ICRC1 canister as parameters:

IAgent agent = new HttpAgent(identity);
Principal canisterId = Principal.FromText("<canister_id>");
ICRC1Client client = new ICRC1Client(agent, canisterId);

Use the methods of the ICRC1Client to communicate with the ICRC1 canister:

// Get the name of the token
string name = await client.Name();

// Get the balance of a specific account
Account account = new Account
{
    Id = Principal.FromText("<account_id>")
};
UnboundedUInt balance = await client.BalanceOf(account);

// Transfer tokens from one account to another
TransferArgs transferArgs = new TransferArgs
{
    To = new Account
    {
        Id = Principal.FromText("<to_account_id>")
    },
    Amount = 1,
    Memo = "<memo>"
};
TransferResult transferResult = await client.Transfer(transferArgs);

Identities

Supported identity types:

  • Ed25519/EdDSA
  • Secp256k1/ECDSA
  • Delegated

From PEM file

IIdentity identity;
using (StreamReader pemFile = File.OpenText("C:\\identity.pem"))
{
	identity = IdentityUtil.FromPemFile(pemFile);
}
IAgent agent = new HttpAgent(identity);
...

From private key

Ed25519

byte[] privateKey = ...;
Ed25519Identity identity = IdentityUtil.FromEd25519PrivateKey(privateKey);

Secp256k1

byte[] privateKey = ...;
Secp256k1Identity identity = IdentityUtil.FromSecp256k1PrivateKey(privateKey);

Generate new keys

Ed25519

Ed25519Identity identity = IdentityUtil.GenerateEd25519Identity();

Secp256k1

Secp256k1Identity identity = IdentityUtil.GenerateSecp256k1Identity();

From public/private key pair

Ed25519

Ed25519Identity identity = new Ed25519Identity(publicKey, privateKey);

Secp256k1

Secp256k1Identity identity = new Secp256k1Identity(publicKey, privateKey);

Delegation

This is most commonly used with things like Internet Identity where another identity is delegated to sign requests by the inner identity.

byte[] publicKeyBytes = ...;
byte[] privateKey = ...;
DelegationChain chain = ...;
var innerIdentity = new Ed25519Identity(publicKeyBytes, privateKey);
var delegatedIdentity = new DelegationIdentity(innerIdentity, chain);

WebGL Builds

Due to how WebGL works by converting C# to JS/WASM using IL2CPP there are a few additional steps to avoid incompatibilities.

  • UnityHttpClient - The .NET HttpClient does not work in many cases, so UnityHttpClient is added via Unity C# script.

    var client = new UnityHttpClient();
    var agent = new HttpAgent(client);
    
  • WebGlBlsCryptography - The BLS signature verification relies on a 3rd party library and due to that library not being directly compatible with the WebGL builds, WebGlBlsCryptography needs to be used instead of the default WasmBlsCryptography class.

    var bls = new WebGlBlsCrytography();
    var agent = new HttpAgent(client, bls: bls);
    

    In addition, the noble-curves.js file located HERE needs to be included in the Unity project and referenced by the HTML page

    <script src="{path_to_dir}/noble-curves.js"/>
    

    That will load in the JS bls library that will be referenced by the Bls.jslib that is included in the ICP.NET unity package

Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
.NET Core netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.1 is compatible. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (3)

Showing the top 3 NuGet packages that depend on EdjCase.ICP.Agent:

Package Downloads
EdjCase.ICP.InternetIdentity

Package Description

EdjCase.ICP.WebSockets

Package Description

Qwer.Chains.Dfinity.Clients

Package Description

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
7.0.0-pre.1 122 10/27/2024
6.2.1 121 10/23/2024
6.2.0 129 10/21/2024
6.1.2 1,611 4/30/2024
6.1.1 156 4/17/2024
6.1.0 151 4/15/2024
6.0.0 178 3/21/2024
5.1.0 261 1/25/2024
5.0.0 1,195 1/12/2024
5.0.0-pre.2 120 12/13/2023
5.0.0-pre.1 82 12/11/2023
4.1.0 462 11/10/2023
4.0.1 248 11/1/2023
4.0.0 370 10/12/2023
4.0.0-pre.10 83 10/10/2023
4.0.0-pre.9 80 10/10/2023
4.0.0-pre.8 75 10/9/2023
4.0.0-pre.7 79 10/9/2023
4.0.0-pre.6 75 10/9/2023
4.0.0-pre.5 83 10/8/2023
4.0.0-pre.4 83 10/6/2023
4.0.0-pre.3 80 10/5/2023
4.0.0-pre.2 80 9/27/2023
4.0.0-pre.1 80 9/25/2023
3.2.2 485 9/22/2023
3.2.1 179 9/22/2023
3.2.0 679 8/2/2023
3.1.5 194 9/27/2023
3.1.4 297 7/20/2023
3.1.3 387 6/12/2023
3.1.2 470 5/11/2023
3.1.1 255 5/9/2023
3.1.0 241 5/9/2023
3.0.1 254 5/2/2023
3.0.0 267 5/1/2023
3.0.0-beta.1 124 4/17/2023
2.3.9 240 5/1/2023
2.3.8 269 4/28/2023
2.3.7 281 4/28/2023
2.3.6 288 4/28/2023
2.3.5 297 4/27/2023
2.3.4 275 4/27/2023
2.3.3 320 4/26/2023
2.3.2 295 4/26/2023
2.3.1 356 4/26/2023
2.3.0 305 4/25/2023
2.2.10 309 4/24/2023
2.2.9 272 4/24/2023
2.2.8 327 4/24/2023
2.2.7 372 4/17/2023
2.2.6 413 4/12/2023
2.2.5 306 4/12/2023
2.2.4 341 4/11/2023
2.2.3 330 4/11/2023
2.2.2 348 4/7/2023
2.2.1 303 4/7/2023
2.2.0 361 4/6/2023
2.1.1 417 3/30/2023
2.1.0 535 3/23/2023
2.0.8 425 3/20/2023
2.0.7 490 3/12/2023
2.0.2 421 3/10/2023
2.0.1 402 3/10/2023
2.0.0 419 3/8/2023
2.0.0-beta.26 117 3/8/2023
2.0.0-beta.25 123 3/8/2023
2.0.0-beta.24 122 3/7/2023
2.0.0-beta.23 121 3/6/2023
2.0.0-beta.22 123 3/1/2023
2.0.0-beta.21 138 2/28/2023
2.0.0-beta.20 126 2/20/2023
2.0.0-beta.19 130 2/14/2023
2.0.0-beta.18 128 2/14/2023
2.0.0-beta.17 121 2/14/2023
2.0.0-beta.16 123 2/11/2023
2.0.0-beta.15 125 2/10/2023
2.0.0-beta.14 135 2/6/2023
2.0.0-beta.13 148 2/3/2023
2.0.0-beta.12 142 2/2/2023
2.0.0-beta.11 140 1/30/2023
2.0.0-beta.10 137 1/23/2023
2.0.0-beta.9 147 1/19/2023
2.0.0-beta.8 145 1/19/2023
2.0.0-beta.7 143 1/12/2023
2.0.0-beta.6 144 12/31/2022
2.0.0-beta.5 135 12/30/2022
2.0.0-beta.4 138 12/21/2022
2.0.0-beta.3 142 12/19/2022
2.0.0-beta.2 142 12/10/2022
2.0.0-beta.1 136 12/2/2022
1.2.1 460 11/29/2022
1.2.0 426 11/28/2022
1.1.0 445 11/28/2022
1.0.3 423 11/25/2022
1.0.2 532 6/8/2022
1.0.1 532 6/7/2022
0.0.1-beta.20 160 6/1/2022
0.0.1-beta.19 164 5/20/2022
0.0.1-beta.18 165 5/20/2022
0.0.1-beta.14 163 5/19/2022
0.0.1-beta.13 164 5/18/2022
0.0.1-beta.3 188 5/16/2022
0.0.1-beta.2 186 5/11/2022
0.0.1-beta.1 157 5/11/2022