A library for interfacing with a Service Nervous System (SNS) project.
You can use sns-js
by installing it in your project.
The bundle needs peer dependencies, be sure that following resources are available in your project as well.
npm i @dfinity/agent @dfinity/candid @dfinity/principal @dfinity/utils @dfinity/ledger
sns-js
can be utilized with two distinct approaches. The first approach is explorative, where you only need to provide the SNS root canister ID of your project to initialize a wrapper that handles routing the calls to the appropriate canister. This means having a single entry point for all functions. The second approach, which is more common, involves instantiating the specific canisters you require.
The explorative
approach has the advantage to simplify the code but, implies more costs as it queries the root
canister for the list of canister IDs of the Sns project upon initialization.
import { createAgent } from "@dfinity/utils";
import { initSnsWrapper } from "@dfinity/sns";
const agent = await createAgent({
identity,
host: HOST,
});
const snsWrapper = await initSnsWrapper({
rootOptions: {
canisterId: rootCanisterId,
},
agent,
certified,
});
const { metadata, swapState } = wrapper;
const [data, token] = await metadata({});
console.log("Sns:", data, token, swapState);
The descriptive approach limits the scope of the features but, is more verbose.
import { createAgent } from "@dfinity/utils";
import { SnsGovernanceCanister } from "@dfinity/sns";
const agent = await createAgent({
identity,
host: HOST,
});
const { metadata } = SnsGovernanceCanister.create({
agent,
canisterId: rootCanisterId,
});
const data = await metadata({ certified: true });
console.log("Summary data:", data);
sns-js
implements following features:
Lookup for the canister ids of a Sns and initialize the wrapper to access its features.
Function |
Type |
initSnsWrapper |
InitSnsWrapper |
🔗 Source
🔗 Source
Instantiate a canister to interact with the governance of a Sns project.
Method |
Type |
create |
(options: SnsCanisterOptions<_SERVICE>) => SnsGovernanceCanister |
Parameters:
-
options
: Miscellaneous options to initialize the canister. Its ID being the only mandatory parammeter.
🔗 Source
List the neurons of the Sns
Method |
Type |
listNeurons |
(params: SnsListNeuronsParams) => Promise<Neuron[]> |
🔗 Source
List the proposals of the Sns
Method |
Type |
listProposals |
(params: SnsListProposalsParams) => Promise<ListProposalsResponse> |
🔗 Source
Get the proposal of the Sns
Method |
Type |
getProposal |
(params: SnsGetProposalParams) => Promise<ProposalData> |
🔗 Source
⚙️ listNervousSystemFunctions
List Nervous System Functions
Neurons can follow other neurons in specific Nervous System Functions.
Method |
Type |
listNervousSystemFunctions |
(params: QueryParams) => Promise<ListNervousSystemFunctionsResponse> |
🔗 Source
Get the Sns metadata (title, description, etc.)
Method |
Type |
metadata |
(params: QueryParams) => Promise<GetMetadataResponse> |
🔗 Source
⚙️ nervousSystemParameters
Get the Sns nervous system parameters (default followees, max dissolve delay, max number of neurons, etc.)
Method |
Type |
nervousSystemParameters |
(params: QueryParams) => Promise<NervousSystemParameters> |
🔗 Source
Get the neuron of the Sns
Method |
Type |
getNeuron |
(params: SnsGetNeuronParams) => Promise<Neuron> |
🔗 Source
Same as getNeuron
but returns undefined instead of raising error when not found.
Method |
Type |
queryNeuron |
(params: SnsGetNeuronParams) => Promise<Neuron or undefined> |
🔗 Source
Manage neuron. For advanced users.
Method |
Type |
manageNeuron |
(request: ManageNeuron) => Promise<ManageNeuronResponse> |
🔗 Source
Add permissions to a neuron for a specific principal
Method |
Type |
addNeuronPermissions |
(params: SnsNeuronPermissionsParams) => Promise<void> |
🔗 Source
⚙️ removeNeuronPermissions
Remove permissions to a neuron for a specific principal
Method |
Type |
removeNeuronPermissions |
(params: SnsNeuronPermissionsParams) => Promise<void> |
🔗 Source
Split neuron
Method |
Type |
splitNeuron |
(params: SnsSplitNeuronParams) => Promise<NeuronId or undefined> |
🔗 Source
Disburse neuron on Account
Method |
Type |
disburse |
(params: SnsDisburseNeuronParams) => Promise<void> |
🔗 Source
Start dissolving process of a neuron
Method |
Type |
startDissolving |
(neuronId: NeuronId) => Promise<void> |
🔗 Source
Stop dissolving process of a neuron
Method |
Type |
stopDissolving |
(neuronId: NeuronId) => Promise<void> |
🔗 Source
Stake the maturity of a neuron.
Method |
Type |
stakeMaturity |
({ neuronId, percentageToStake, }: SnsNeuronStakeMaturityParams) => Promise<void> |
Parameters:
-
neuronId
: The id of the neuron for which to stake the maturity
-
percentageToStake
: Optional. Percentage of the current maturity to stake. If not provided, all of the neuron's current maturity will be staked.
🔗 Source
Disburse the maturity of a neuron.
Method |
Type |
disburseMaturity |
(params: SnsNeuronDisburseMaturityParams) => Promise<void> |
Parameters:
-
toAccount. Account
: to disburse maturity.
-
neuronId
: The id of the neuron for which to disburse the maturity
-
percentageToDisburse
: What percentage of the available maturity to disburse.
🔗 Source
Changes auto-stake maturity for a Neuron.
Method |
Type |
autoStakeMaturity |
(params: SnsNeuronAutoStakeMaturityParams) => Promise<void> |
Parameters:
-
neuronId
: The id of the neuron for which to request a change of the auto stake feature
-
autoStake
: true
to enable the auto-stake maturity for this neuron, false
to turn it off
🔗 Source
Increase dissolve delay of a neuron
Method |
Type |
setDissolveTimestamp |
(params: SnsSetDissolveTimestampParams) => Promise<void> |
🔗 Source
Increase dissolve delay of a neuron
Method |
Type |
increaseDissolveDelay |
(params: SnsIncreaseDissolveDelayParams) => Promise<void> |
🔗 Source
Sets followees of a neuron for a specific Nervous System Function (topic)
Method |
Type |
setTopicFollowees |
(params: SnsSetTopicFollowees) => Promise<void> |
🔗 Source
Registers vote for a proposal from the neuron passed.
Method |
Type |
registerVote |
(params: SnsRegisterVoteParams) => Promise<void> |
🔗 Source
Refresh neuron
Method |
Type |
refreshNeuron |
(neuronId: NeuronId) => Promise<void> |
🔗 Source
Claim neuron
Method |
Type |
claimNeuron |
({ memo, controller, subaccount, }: SnsClaimNeuronParams) => Promise<NeuronId> |
🔗 Source
🔗 Source
Method |
Type |
create |
(options: SnsCanisterOptions<_SERVICE>) => SnsRootCanister |
🔗 Source
List the canisters that are part of the Sns.
Source code: https://github.com/dfinity/ic/blob/master/rs/sns/root/src/lib.rs
Method |
Type |
listSnsCanisters |
({ certified, }: { certified?: boolean or undefined; }) => Promise<ListSnsCanistersResponse> |
Parameters:
-
params.certified
: - Query or update calls
🔗 Source
🔗 Source
Method |
Type |
create |
(options: SnsCanisterOptions<_SERVICE>) => SnsSwapCanister |
🔗 Source
Get the state of the swap
Method |
Type |
state |
(params: QueryParams) => Promise<GetStateResponse> |
🔗 Source
Notify of the payment failure to remove the ticket
Method |
Type |
notifyPaymentFailure |
() => Promise<Ticket or undefined> |
🔗 Source
Notify of the user participating in the swap
Method |
Type |
notifyParticipation |
(params: RefreshBuyerTokensRequest) => Promise<RefreshBuyerTokensResponse> |
🔗 Source
Get user commitment
Method |
Type |
getUserCommitment |
(params: GetBuyerStateRequest and QueryParams) => Promise<BuyerState or undefined> |
🔗 Source
Get sale buyers state
Method |
Type |
getDerivedState |
({ certified, }: QueryParams) => Promise<GetDerivedStateResponse> |
🔗 Source
Get sale parameters
Method |
Type |
getSaleParameters |
({ certified, }: QueryParams) => Promise<GetSaleParametersResponse> |
🔗 Source
Return a sale ticket if created and not yet removed (payment flow)
Method |
Type |
getOpenTicket |
(params: QueryParams) => Promise<Ticket or undefined> |
🔗 Source
Create a sale ticket (payment flow)
Method |
Type |
newSaleTicket |
(params: NewSaleTicketParams) => Promise<Ticket> |
🔗 Source
Get sale lifecycle state
Method |
Type |
getLifecycle |
(params: QueryParams) => Promise<GetLifecycleResponse> |
🔗 Source
Get sale lifecycle state
Method |
Type |
getFinalizationStatus |
(params: QueryParams) => Promise<GetAutoFinalizationStatusResponse> |
🔗 Source
Sns wrapper - notably used by NNS-dapp - ease the access to a particular Sns.
It knows all the Sns' canisters, wrap and enhance their available features.
A wrapper either performs query or update calls.
🔗 Source
public
: Constructor to instantiate a Sns
Parameters:
Method |
Type |
listNeurons |
(params: Omit<SnsListNeuronsParams, "certified">) => Promise<Neuron[]> |
🔗 Source
Method |
Type |
listProposals |
(params: Omit<SnsListProposalsParams, "certified">) => Promise<ListProposalsResponse> |
🔗 Source
Method |
Type |
getProposal |
(params: Omit<SnsGetProposalParams, "certified">) => Promise<ProposalData> |
🔗 Source
⚙️ listNervousSystemFunctions
Method |
Type |
listNervousSystemFunctions |
(params: Omit<QueryParams, "certified">) => Promise<ListNervousSystemFunctionsResponse> |
🔗 Source
Method |
Type |
metadata |
(params: Omit<QueryParams, "certified">) => Promise<[GetMetadataResponse, IcrcTokenMetadataResponse]> |
🔗 Source
⚙️ nervousSystemParameters
Method |
Type |
nervousSystemParameters |
(params: Omit<QueryParams, "certified">) => Promise<NervousSystemParameters> |
🔗 Source
Method |
Type |
ledgerMetadata |
(params: Omit<QueryParams, "certified">) => Promise<IcrcTokenMetadataResponse> |
🔗 Source
Method |
Type |
transactionFee |
(params: Omit<QueryParams, "certified">) => Promise<bigint> |
🔗 Source
Method |
Type |
totalTokensSupply |
(params: Omit<QueryParams, "certified">) => Promise<bigint> |
🔗 Source
Method |
Type |
balance |
(params: Omit<BalanceParams, "certified">) => Promise<bigint> |
🔗 Source
Method |
Type |
transfer |
(params: TransferParams) => Promise<bigint> |
🔗 Source
Method |
Type |
getNeuron |
(params: Omit<SnsGetNeuronParams, "certified">) => Promise<Neuron> |
🔗 Source
Method |
Type |
queryNeuron |
(params: Omit<SnsGetNeuronParams, "certified">) => Promise<Neuron or undefined> |
🔗 Source
Returns the subaccount of the next neuron to be created.
The neuron account is a subaccount of the governance canister.
The subaccount is derived from the controller and an ascending index.
‼️ The id of the neuron is the subaccount (neuron ID = subaccount) ‼️.
If the neuron does not exist for that subaccount, then we use it for the next neuron.
The index is used in the memo of the transfer and when claiming the neuron.
This is how the backend can identify which neuron is being claimed.
Method |
Type |
nextNeuronAccount |
(controller: Principal) => Promise<{ account: IcrcAccount; index: bigint; }> |
🔗 Source
Stakes a neuron.
This is a convenient method that transfers the stake to the neuron subaccount and then claims the neuron.
⚠️ This feature is provided as it without warranty. It does not implement any additional checks of the validity of the payment flow - e.g. it does not handle refund nor retries claiming the neuron in case of errors.
Method |
Type |
stakeNeuron |
({ stakeE8s, source, controller, createdAt, fee, }: SnsStakeNeuronParams) => Promise<NeuronId> |
🔗 Source
Increase the stake of a neuron.
This is a convenient method that transfers the stake to the neuron subaccount and then refresh the neuron.
⚠️ This feature is provided as it without warranty. It does not implement any additional checks of the validity of the payment flow - e.g. it does not handle refund nor calls refresh again in case of errors.
Method |
Type |
increaseStakeNeuron |
({ stakeE8s, source, neuronId, }: SnsIncreaseStakeNeuronParams) => Promise<void> |
🔗 Source
Method |
Type |
getNeuronBalance |
(neuronId: NeuronId) => Promise<bigint> |
🔗 Source
Method |
Type |
addNeuronPermissions |
(params: SnsNeuronPermissionsParams) => Promise<void> |
🔗 Source
Method |
Type |
refreshNeuron |
(neuronId: NeuronId) => Promise<void> |
🔗 Source
Method |
Type |
claimNeuron |
(params: SnsClaimNeuronParams) => Promise<NeuronId> |
🔗 Source
⚙️ removeNeuronPermissions
Method |
Type |
removeNeuronPermissions |
(params: SnsNeuronPermissionsParams) => Promise<void> |
🔗 Source
Method |
Type |
splitNeuron |
(params: SnsSplitNeuronParams) => Promise<NeuronId or undefined> |
🔗 Source
Method |
Type |
disburse |
(params: SnsDisburseNeuronParams) => Promise<void> |
🔗 Source
Method |
Type |
startDissolving |
(neuronId: NeuronId) => Promise<void> |
🔗 Source
Method |
Type |
stopDissolving |
(neuronId: NeuronId) => Promise<void> |
🔗 Source
Method |
Type |
setDissolveTimestamp |
(params: SnsSetDissolveTimestampParams) => Promise<void> |
🔗 Source
Method |
Type |
increaseDissolveDelay |
(params: SnsIncreaseDissolveDelayParams) => Promise<void> |
🔗 Source
Method |
Type |
setTopicFollowees |
(params: SnsSetTopicFollowees) => Promise<void> |
🔗 Source
Method |
Type |
registerVote |
(params: SnsRegisterVoteParams) => Promise<void> |
🔗 Source
Method |
Type |
swapState |
(params: Omit<QueryParams, "certified">) => Promise<GetStateResponse> |
🔗 Source
Returns the ticket if a ticket was found for the caller and the ticket
was removed successfully. Returns None if no ticket was found for the caller.
Only the owner of a ticket can remove it.
Always certified
Method |
Type |
notifyPaymentFailure |
() => Promise<Ticket or undefined> |
🔗 Source
Method |
Type |
notifyParticipation |
(params: RefreshBuyerTokensRequest) => Promise<RefreshBuyerTokensResponse> |
🔗 Source
Method |
Type |
getUserCommitment |
(params: GetBuyerStateRequest) => Promise<BuyerState or undefined> |
🔗 Source
Method |
Type |
getOpenTicket |
(params: Omit<QueryParams, "certified">) => Promise<Ticket or undefined> |
🔗 Source
Method |
Type |
newSaleTicket |
(params: NewSaleTicketParams) => Promise<Ticket> |
🔗 Source
Method |
Type |
getLifecycle |
(params: Omit<QueryParams, "certified">) => Promise<GetLifecycleResponse or undefined> |
🔗 Source
Method |
Type |
getFinalizationStatus |
(params: Omit<QueryParams, "certified">) => Promise<GetAutoFinalizationStatusResponse or undefined> |
🔗 Source
Method |
Type |
getSaleParameters |
(params: Omit<QueryParams, "certified">) => Promise<GetSaleParametersResponse or undefined> |
🔗 Source
Method |
Type |
getDerivedState |
(params: Omit<QueryParams, "certified">) => Promise<GetDerivedStateResponse or undefined> |
🔗 Source
Method |
Type |
getTransactions |
(params: GetAccountTransactionsParams) => Promise<GetTransactions> |
🔗 Source
Method |
Type |
stakeMaturity |
(params: SnsNeuronStakeMaturityParams) => Promise<void> |
🔗 Source
Method |
Type |
disburseMaturity |
(params: SnsNeuronDisburseMaturityParams) => Promise<void> |
🔗 Source
Method |
Type |
autoStakeMaturity |
(params: SnsNeuronAutoStakeMaturityParams) => Promise<void> |
🔗 Source