From 8eb2d1fbbd0cf29bef13d1b4e5ff80efc07967f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lloren=C3=A7?= Date: Fri, 23 Sep 2022 16:22:06 +0200 Subject: [PATCH 01/31] Test Vectors --- scripts/test-vectors/index-20220923.ts | 114 +++++++++++++++++++++++++ scripts/test-vectors/utils.ts | 14 +++ 2 files changed, 128 insertions(+) create mode 100644 scripts/test-vectors/index-20220923.ts diff --git a/scripts/test-vectors/index-20220923.ts b/scripts/test-vectors/index-20220923.ts new file mode 100644 index 000000000..95e161dc9 --- /dev/null +++ b/scripts/test-vectors/index-20220923.ts @@ -0,0 +1,114 @@ +// Date represents the date of the issue with the test vectors sent to Zondax: +// https://github.com/Zondax/ledger-icp/issues/166 +// We'll keep each script for reproducibility. +import { IDL } from "@dfinity/candid"; +import { Principal } from "@dfinity/principal"; +import { NeuronId } from "../../packages/nns/src"; +import { toSpawnNeuronRequest } from "../../packages/nns/src/canisters/governance/request.converters"; +import { ManageNeuronFn } from "./governance.idl"; +import { createBlob, splitPrincipal, writeToJson } from "./utils"; + +const mockNeuronId = BigInt(15374508381553347371); +const mockNeuronId2 = BigInt(8836564053576662908); +const mockPrincipal = Principal.fromText( + "xlmdg-vkosz-ceopx-7wtgu-g3xmd-koiyc-awqaq-7modz-zf6r6-364rh-oqe" +); + +const createCandidSpawnNeuron = ({ + neuronId, + percentageToSpawn, + newController, + nonce, +}: { + neuronId: NeuronId; + percentageToSpawn?: number; + newController?: Principal; + nonce?: bigint; +}) => { + const rawRequestBody = toSpawnNeuronRequest({ + neuronId, + percentageToSpawn, + newController, + nonce, + }); + + const outputs = [ + "Transaction type : Spawn Neuron", + `Neuron ID : ${neuronId}`, + ]; + + if (percentageToSpawn !== undefined) { + outputs.push(`Percentage to spawn : ${percentageToSpawn}`); + } + + const controllerMessages = + newController === undefined + ? ["Controller : Self"] + : splitPrincipal(newController).map( + (data, i, elements) => + `Controller [${i + 1}/${elements.length}] : ${data}` + ); + + outputs.push(...controllerMessages); + + if (nonce !== undefined) { + outputs.push(`Nonce : ${nonce}`); + } + return { + blob_candid: createBlob({ + arg: IDL.encode(ManageNeuronFn.argTypes, [rawRequestBody]), + methodName: "manage_neuron", + }), + name: "Spawn Neuron", + candid_request: rawRequestBody, + output: outputs.map((data, index) => `${index + 1} | ${data}`), + }; +}; + +const main = () => { + try { + const vectors = [ + createCandidSpawnNeuron({ + neuronId: mockNeuronId, + }), + createCandidSpawnNeuron({ + neuronId: mockNeuronId2, + }), + createCandidSpawnNeuron({ + neuronId: mockNeuronId2, + percentageToSpawn: 50, + }), + createCandidSpawnNeuron({ + neuronId: mockNeuronId2, + newController: mockPrincipal, + }), + createCandidSpawnNeuron({ + neuronId: mockNeuronId2, + percentageToSpawn: 50, + newController: mockPrincipal, + }), + createCandidSpawnNeuron({ + neuronId: mockNeuronId, + percentageToSpawn: 50, + nonce: BigInt(12345), + }), + createCandidSpawnNeuron({ + neuronId: mockNeuronId2, + percentageToSpawn: 30, + newController: mockPrincipal, + nonce: BigInt(12345), + }), + ]; + + writeToJson({ + data: vectors, + fileName: "test-vectors-20220817.json", + }); + console.log("File created successfully"); + } catch (error) { + console.log("There was an error"); + console.log(error); + } +}; + +main(); diff --git a/scripts/test-vectors/utils.ts b/scripts/test-vectors/utils.ts index 74195d250..fdd6b75a5 100644 --- a/scripts/test-vectors/utils.ts +++ b/scripts/test-vectors/utils.ts @@ -98,3 +98,17 @@ export const writeToJson = ({ console.log(error); } }; + +export const splitPrincipal = (principal: Principal): string[] => { + const text = principal.toText(); + const split = text.split("-"); + const groupedInThrees = []; + for (let i = 0; i < split.length; i += 3) { + groupedInThrees.push(split.slice(i, i + 3).join("-")); + } + const lines = []; + for (let i = 0; i < groupedInThrees.length; i += 2) { + lines.push(groupedInThrees.slice(i, i + 2).join(" : ")); + } + return lines; +}; From a92d7afefdeffe41e5d7c1ca319a876b41b4cc2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lloren=C3=A7?= Date: Fri, 23 Sep 2022 16:38:57 +0200 Subject: [PATCH 02/31] Test Vectors: Add list_neurons --- scripts/test-vectors/governance.idl.ts | 5 +++ scripts/test-vectors/list-neurons-20220923.ts | 42 +++++++++++++++++++ ...x-20220923.ts => spawn-neuron-20220923.ts} | 0 3 files changed, 47 insertions(+) create mode 100644 scripts/test-vectors/list-neurons-20220923.ts rename scripts/test-vectors/{index-20220923.ts => spawn-neuron-20220923.ts} (100%) diff --git a/scripts/test-vectors/governance.idl.ts b/scripts/test-vectors/governance.idl.ts index b65279e21..122c41749 100644 --- a/scripts/test-vectors/governance.idl.ts +++ b/scripts/test-vectors/governance.idl.ts @@ -411,3 +411,8 @@ export const ManageNeuronFn = IDL.Func( [ManageNeuronResponse], [], ); +export const ListNeuronsFn = IDL.Func( + [ListNeurons], + [ListNeuronsResponse], + ["query"] +); diff --git a/scripts/test-vectors/list-neurons-20220923.ts b/scripts/test-vectors/list-neurons-20220923.ts new file mode 100644 index 000000000..061ef02ce --- /dev/null +++ b/scripts/test-vectors/list-neurons-20220923.ts @@ -0,0 +1,42 @@ +// Date represents the date of the issue with the test vectors sent to Zondax: +// https://github.com/Zondax/ledger-icp/issues/166 +// We'll keep each script for reproducibility. +import { IDL } from "@dfinity/candid"; +import { NeuronId } from "../../packages/nns/src"; +import { fromListNeurons } from "../../packages/nns/src/canisters/governance/request.converters"; +import { ListNeuronsFn } from "./governance.idl"; +import { createBlob, writeToJson } from "./utils"; + +const mockNeuronId = BigInt(15374508381553347371); +const mockNeuronId2 = BigInt(8836564053576662908); + +const createListNeurons = (neuronIds?: NeuronId[]) => { + const rawRequestBody = fromListNeurons(neuronIds); + + return { + blob_candid: createBlob({ + arg: IDL.encode(ListNeuronsFn.argTypes, [rawRequestBody]), + methodName: "list_neurons", + }), + name: "List Neurons", + candid_request: rawRequestBody, + output: ["0 | Transaction type : List Own Neurons"], + }; +}; + +const main = () => { + try { + const vectors = [createListNeurons()]; + + writeToJson({ + data: vectors, + fileName: "test-vectors.json", + }); + console.log("File created successfully"); + } catch (error) { + console.log("There was an error"); + console.log(error); + } +}; + +main(); diff --git a/scripts/test-vectors/index-20220923.ts b/scripts/test-vectors/spawn-neuron-20220923.ts similarity index 100% rename from scripts/test-vectors/index-20220923.ts rename to scripts/test-vectors/spawn-neuron-20220923.ts From 95276bceebedffd7c068dae2d92a10a77c9d661e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lloren=C3=A7?= Date: Wed, 5 Oct 2022 10:02:17 +0200 Subject: [PATCH 03/31] Stake Maturity Test Vectors --- .../auto-stake-maturity-20221005.ts | 71 +++++++++++++++++ scripts/test-vectors/governance.idl.ts | 58 +++++++++++++- .../test-vectors/stake-maturity-20221005.ts | 77 +++++++++++++++++++ 3 files changed, 204 insertions(+), 2 deletions(-) create mode 100644 scripts/test-vectors/auto-stake-maturity-20221005.ts create mode 100644 scripts/test-vectors/stake-maturity-20221005.ts diff --git a/scripts/test-vectors/auto-stake-maturity-20221005.ts b/scripts/test-vectors/auto-stake-maturity-20221005.ts new file mode 100644 index 000000000..5764b7fef --- /dev/null +++ b/scripts/test-vectors/auto-stake-maturity-20221005.ts @@ -0,0 +1,71 @@ +import { IDL } from "@dfinity/candid"; +import { NeuronId } from "../../packages/nns/src"; +import { toAutoStakeMaturityRequest } from "../../packages/nns/src/canisters/governance/request.converters"; +import { ManageNeuronFn } from "./governance.idl"; +import { createBlob, writeToJson } from "./utils"; + +const mockNeuronId = BigInt(15374508381553347371); +const mockNeuronId2 = BigInt(8836564053576662908); + +const createCandidAutoStakeMaturity = ({ + neuronId, + autoStake: autoStake, +}: { + neuronId: NeuronId; + autoStake: boolean; +}) => { + const rawRequestBody = toAutoStakeMaturityRequest({ + neuronId, + autoStake, + }); + + const outputs = [ + "Transaction type : Set Auto Stake Maturity", + `Neuron ID : ${neuronId}`, + `Auto stake : ${autoStake}`, + ]; + + return { + blob_candid: createBlob({ + arg: IDL.encode(ManageNeuronFn.argTypes, [rawRequestBody]), + methodName: "manage_neuron", + }), + name: "Auto Stake Maturity", + candid_request: rawRequestBody, + output: outputs.map((data, index) => `${index + 1} | ${data}`), + }; +}; + +const main = () => { + try { + const vectors = [ + createCandidAutoStakeMaturity({ + neuronId: mockNeuronId, + autoStake: true, + }), + createCandidAutoStakeMaturity({ + neuronId: mockNeuronId2, + autoStake: true, + }), + createCandidAutoStakeMaturity({ + neuronId: mockNeuronId2, + autoStake: false, + }), + createCandidAutoStakeMaturity({ + neuronId: mockNeuronId, + autoStake: false, + }), + ]; + + writeToJson({ + data: vectors, + fileName: "auto-stake-maturity.json", + }); + console.log("File created successfully"); + } catch (error) { + console.log("There was an error"); + console.log(error); + } +}; + +main(); diff --git a/scripts/test-vectors/governance.idl.ts b/scripts/test-vectors/governance.idl.ts index 122c41749..e17d0d5ec 100644 --- a/scripts/test-vectors/governance.idl.ts +++ b/scripts/test-vectors/governance.idl.ts @@ -76,6 +76,14 @@ const GovernanceError = IDL.Record({ error_message: IDL.Text, error_type: IDL.Int32, }); +const CfNeuron = IDL.Record({ + nns_neuron_id: IDL.Nat64, + amount_icp_e8s: IDL.Nat64, +}); +const CfParticipant = IDL.Record({ + hotkey_principal: IDL.Text, + cf_neurons: IDL.Vec(CfNeuron), +}); const Ballot = IDL.Record({ vote: IDL.Int32, voting_power: IDL.Nat64 }); const Tally = IDL.Record({ no: IDL.Nat64, @@ -115,6 +123,9 @@ const RemoveHotKey = IDL.Record({ hot_key_to_remove: IDL.Opt(IDL.Principal), }); const AddHotKey = IDL.Record({ new_hot_key: IDL.Opt(IDL.Principal) }); +const ChangeAutoStakeMaturity = IDL.Record({ + requested_setting_for_auto_stake_maturity: IDL.Bool, +}); const IncreaseDissolveDelay = IDL.Record({ additional_dissolve_delay_seconds: IDL.Nat32, }); @@ -124,6 +135,7 @@ const SetDissolveTimestamp = IDL.Record({ const Operation = IDL.Variant({ RemoveHotKey: RemoveHotKey, AddHotKey: AddHotKey, + ChangeAutoStakeMaturity: ChangeAutoStakeMaturity, StopDissolving: IDL.Record({}), StartDissolving: IDL.Record({}), IncreaseDissolveDelay: IncreaseDissolveDelay, @@ -144,6 +156,9 @@ const DisburseToNeuron = IDL.Record({ new_controller: IDL.Opt(IDL.Principal), nonce: IDL.Nat64, }); +const StakeMaturity = IDL.Record({ + percentage_to_stake: IDL.Opt(IDL.Nat32), +}); const MergeMaturity = IDL.Record({ percentage_to_merge: IDL.Nat32 }); const Amount = IDL.Record({ e8s: IDL.Nat64 }); const Disburse = IDL.Record({ @@ -160,6 +175,7 @@ const Command = IDL.Variant({ Merge: Merge, DisburseToNeuron: DisburseToNeuron, MakeProposal: Proposal, + StakeMaturity: StakeMaturity, MergeMaturity: MergeMaturity, Disburse: Disburse, }); @@ -176,6 +192,20 @@ const ExecuteNnsFunction = IDL.Record({ nns_function: IDL.Int32, payload: IDL.Vec(IDL.Nat8), }); +const Params = IDL.Record({ + min_participant_icp_e8s: IDL.Nat64, + max_icp_e8s: IDL.Nat64, + swap_due_timestamp_seconds: IDL.Nat64, + min_participants: IDL.Nat32, + sns_token_e8s: IDL.Nat64, + max_participant_icp_e8s: IDL.Nat64, + min_icp_e8s: IDL.Nat64, +}); +const OpenSnsTokenSwap = IDL.Record({ + community_fund_investment_e8s: IDL.Opt(IDL.Nat64), + target_swap_canister_id: IDL.Opt(IDL.Principal), + params: IDL.Opt(Params), +}); const TimeWindow = IDL.Record({ start_timestamp_seconds: IDL.Nat64, end_timestamp_seconds: IDL.Nat64, @@ -208,6 +238,7 @@ const Action = IDL.Variant({ ManageNeuron: ManageNeuron, ExecuteNnsFunction: ExecuteNnsFunction, RewardNodeProvider: RewardNodeProvider, + OpenSnsTokenSwap: OpenSnsTokenSwap, SetSnsTokenSwapOpenTimeWindow: SetSnsTokenSwapOpenTimeWindow, SetDefaultFollowees: SetDefaultFollowees, RewardNodeProviders: RewardNodeProviders, @@ -230,17 +261,20 @@ const WaitForQuietState = IDL.Record({ const ProposalData = IDL.Record({ id: IDL.Opt(NeuronId), failure_reason: IDL.Opt(GovernanceError), + cf_participants: IDL.Vec(CfParticipant), ballots: IDL.Vec(IDL.Tuple(IDL.Nat64, Ballot)), proposal_timestamp_seconds: IDL.Nat64, reward_event_round: IDL.Nat64, failed_timestamp_seconds: IDL.Nat64, reject_cost_e8s: IDL.Nat64, latest_tally: IDL.Opt(Tally), + sns_token_swap_lifecycle: IDL.Opt(IDL.Int32), decided_timestamp_seconds: IDL.Nat64, proposal: IDL.Opt(Proposal), proposer: IDL.Opt(NeuronId), wait_for_quiet_state: IDL.Opt(WaitForQuietState), executed_timestamp_seconds: IDL.Nat64, + original_total_community_fund_maturity_e8s_equivalent: IDL.Opt(IDL.Nat64), }); const Command_2 = IDL.Variant({ Spawn: NeuronId, @@ -248,6 +282,7 @@ const Command_2 = IDL.Variant({ Configure: Configure, Merge: Merge, DisburseToNeuron: DisburseToNeuron, + SyncCommand: IDL.Record({}), ClaimOrRefreshNeuron: ClaimOrRefresh, MergeMaturity: MergeMaturity, Disburse: Disburse, @@ -266,6 +301,7 @@ const DissolveState = IDL.Variant({ }); const Neuron = IDL.Record({ id: IDL.Opt(NeuronId), + staked_maturity_e8s_equivalent: IDL.Opt(IDL.Nat64), controller: IDL.Opt(IDL.Principal), recent_ballots: IDL.Vec(BallotInfo), kyc_verified: IDL.Bool, @@ -273,6 +309,7 @@ const Neuron = IDL.Record({ maturity_e8s_equivalent: IDL.Nat64, cached_neuron_stake_e8s: IDL.Nat64, created_timestamp_seconds: IDL.Nat64, + auto_stake_maturity: IDL.Opt(IDL.Bool), aging_since_timestamp_seconds: IDL.Nat64, hot_keys: IDL.Vec(IDL.Principal), account: IDL.Vec(IDL.Nat8), @@ -289,10 +326,11 @@ const Governance = IDL.Record({ most_recent_monthly_node_provider_rewards: IDL.Opt( MostRecentMonthlyNodeProviderRewards, ), + maturity_modulation_last_updated_at_timestamp_seconds: IDL.Opt(IDL.Nat64), wait_for_quiet_threshold_seconds: IDL.Nat64, metrics: IDL.Opt(GovernanceCachedMetrics), - cached_daily_maturity_modulation: IDL.Opt(IDL.Float64), node_providers: IDL.Vec(NodeProvider), + cached_daily_maturity_modulation_basis_points: IDL.Opt(IDL.Int32), economics: IDL.Opt(NetworkEconomics), spawning_neurons: IDL.Opt(IDL.Bool), latest_reward_event: IDL.Opt(RewardEvent), @@ -301,7 +339,6 @@ const Governance = IDL.Record({ proposals: IDL.Vec(IDL.Tuple(IDL.Nat64, ProposalData)), in_flight_commands: IDL.Vec(IDL.Tuple(IDL.Nat64, NeuronInFlightCommand)), neurons: IDL.Vec(IDL.Tuple(IDL.Nat64, Neuron)), - last_updated_maturity_modulation_cache: IDL.Opt(IDL.Nat64), genesis_timestamp_seconds: IDL.Nat64, }); const Result = IDL.Variant({ Ok: IDL.Null, Err: GovernanceError }); @@ -383,6 +420,10 @@ const ClaimOrRefreshResponse = IDL.Record({ const MakeProposalResponse = IDL.Record({ proposal_id: IDL.Opt(NeuronId), }); +const StakeMaturityResponse = IDL.Record({ + maturity_e8s: IDL.Nat64, + staked_maturity_e8s: IDL.Nat64, +}); const MergeMaturityResponse = IDL.Record({ merged_maturity_e8s: IDL.Nat64, new_stake_e8s: IDL.Nat64, @@ -399,13 +440,26 @@ const Command_1 = IDL.Variant({ Merge: IDL.Record({}), DisburseToNeuron: SpawnResponse, MakeProposal: MakeProposalResponse, + StakeMaturity: StakeMaturityResponse, MergeMaturity: MergeMaturityResponse, Disburse: DisburseResponse, }); const ManageNeuronResponse = IDL.Record({ command: IDL.Opt(Command_1) }); +const Committed = IDL.Record({ + sns_governance_canister_id: IDL.Opt(IDL.Principal), +}); +const Result_6 = IDL.Variant({ + Committed: Committed, + Aborted: IDL.Record({}), +}); +const SettleCommunityFundParticipation = IDL.Record({ + result: IDL.Opt(Result_6), + open_sns_token_swap_proposal_id: IDL.Opt(IDL.Nat64), +}); const UpdateNodeProvider = IDL.Record({ reward_account: IDL.Opt(AccountIdentifier), }); + export const ManageNeuronFn = IDL.Func( [ManageNeuron], [ManageNeuronResponse], diff --git a/scripts/test-vectors/stake-maturity-20221005.ts b/scripts/test-vectors/stake-maturity-20221005.ts new file mode 100644 index 000000000..2445a8c40 --- /dev/null +++ b/scripts/test-vectors/stake-maturity-20221005.ts @@ -0,0 +1,77 @@ +import { IDL } from "@dfinity/candid"; +import { NeuronId } from "../../packages/nns/src"; +import { toStakeMaturityRequest } from "../../packages/nns/src/canisters/governance/request.converters"; +import { ManageNeuronFn } from "./governance.idl"; +import { createBlob, writeToJson } from "./utils"; + +const mockNeuronId = BigInt(15374508381553347371); +const mockNeuronId2 = BigInt(8836564053576662908); + +const createCandidStakeMaturity = ({ + neuronId, + percentageToStake, +}: { + neuronId: NeuronId; + percentageToStake?: number; +}) => { + const rawRequestBody = toStakeMaturityRequest({ + neuronId, + percentageToStake, + }); + + const outputs = [ + "Transaction type : Stake Maturity Neuron", + `Neuron ID : ${neuronId}`, + `Percentage to stake : ${percentageToStake}`, + ]; + + return { + blob_candid: createBlob({ + arg: IDL.encode(ManageNeuronFn.argTypes, [rawRequestBody]), + methodName: "manage_neuron", + }), + name: "Stake Maturity", + candid_request: rawRequestBody, + output: outputs.map((data, index) => `${index + 1} | ${data}`), + }; +}; + +const main = () => { + try { + const vectors = [ + createCandidStakeMaturity({ + neuronId: mockNeuronId, + }), + createCandidStakeMaturity({ + neuronId: mockNeuronId2, + }), + createCandidStakeMaturity({ + neuronId: mockNeuronId2, + percentageToStake: 50, + }), + createCandidStakeMaturity({ + neuronId: mockNeuronId, + percentageToStake: 50, + }), + createCandidStakeMaturity({ + neuronId: mockNeuronId, + percentageToStake: 15, + }), + createCandidStakeMaturity({ + neuronId: mockNeuronId2, + percentageToStake: 30, + }), + ]; + + writeToJson({ + data: vectors, + fileName: "stake-maturity.json", + }); + console.log("File created successfully"); + } catch (error) { + console.log("There was an error"); + console.log(error); + } +}; + +main(); From ea365cf4d95aca47352ae89fd47f079eda71938c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lloren=C3=A7?= Date: Fri, 28 Oct 2022 15:14:27 +0200 Subject: [PATCH 04/31] Set principal sender used by Zondax --- scripts/test-vectors/utils.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/scripts/test-vectors/utils.ts b/scripts/test-vectors/utils.ts index fdd6b75a5..0697a5988 100644 --- a/scripts/test-vectors/utils.ts +++ b/scripts/test-vectors/utils.ts @@ -1,5 +1,4 @@ import { - AnonymousIdentity, CallRequest, Cbor, Expiry, @@ -51,10 +50,11 @@ const createCallRequest = ({ canister_id: MAINNET_GOVERNANCE_CANISTER_ID, method_name: methodName, arg, - sender: new AnonymousIdentity().getPrincipal(), - // sender: Principal.fromText( - // "q2fbu-chrgb-o7dmd-u5cfn-xgo4f-5lpcl-ldeca-wl4sn-5j7gb-ltm63-hqe" - // ), + // sender: new AnonymousIdentity().getPrincipal(), + // Use this principal to match the principal used in Zondax integration tests. + sender: Principal.fromText( + "5upke-tazvi-6ufqc-i3v6r-j4gpu-dpwti-obhal-yb5xj-ue32x-ktkql-rqe" + ), ingress_expiry: new Expiry(DEFAULT_INGRESS_EXPIRY_DELTA_IN_MSECS), }); From ba03d443f94a3643b1edf2769c4d3bf7105bfae5 Mon Sep 17 00:00:00 2001 From: Carlo Date: Mon, 5 Dec 2022 08:20:01 +0100 Subject: [PATCH 05/31] Update List Neurons script (#243) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Llorenç --- scripts/test-vectors/list-neurons-20221202.ts | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 scripts/test-vectors/list-neurons-20221202.ts diff --git a/scripts/test-vectors/list-neurons-20221202.ts b/scripts/test-vectors/list-neurons-20221202.ts new file mode 100644 index 000000000..a20189ebc --- /dev/null +++ b/scripts/test-vectors/list-neurons-20221202.ts @@ -0,0 +1,49 @@ +// Date represents the date of the issue with the test vectors sent to Zondax: +// https://github.com/Zondax/ledger-icp/issues/166 +// We'll keep each script for reproducibility. +import { IDL } from "@dfinity/candid"; +import { NeuronId } from "../../packages/nns/src"; +import { fromListNeurons } from "../../packages/nns/src/canisters/governance/request.converters"; +import { ListNeuronsFn } from "./governance.idl"; +import { createBlob, writeToJson } from "./utils"; + +const mockNeuronId = BigInt(15374508381553347371); +const mockNeuronId2 = BigInt(8836564053576662908); + +const createListNeurons = (neuronIds?: NeuronId[]) => { + const rawRequestBody = fromListNeurons(neuronIds); + + const test = { + blob_candid: createBlob({ + arg: IDL.encode(ListNeuronsFn.argTypes, [rawRequestBody]), + methodName: "list_neurons", + }), + name: "List Neurons", + candid_request: rawRequestBody, + output: ["0 | Transaction type : List Own Neurons"], + }; + neuronIds?.forEach((id, idx) => { + test.output.push(`${idx + 1} | Neuron ID ${idx + 1} : ${id}`); + }); + return test; +}; + +const main = () => { + try { + const vectors = [ + createListNeurons(), + createListNeurons([mockNeuronId, mockNeuronId2]), + ]; + + writeToJson({ + data: vectors, + fileName: "list-neurons.json", + }); + console.log("File created successfully"); + } catch (error) { + console.log("There was an error"); + console.log(error); + } +}; + +main(); From b180bd4d036042acff9fefa174c6e6af6e6c462c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lloren=C3=A7?= Date: Wed, 7 Dec 2022 18:27:29 +0100 Subject: [PATCH 06/31] Test Vectors: Increase DD, start and stop dissolving --- scripts/test-vectors/increase-dd-20221206.ts | 51 +++++++++++++++++++ .../test-vectors/start-dissolving-20221206.ts | 40 +++++++++++++++ .../test-vectors/stop-dissolving-20221206.ts | 40 +++++++++++++++ 3 files changed, 131 insertions(+) create mode 100644 scripts/test-vectors/increase-dd-20221206.ts create mode 100644 scripts/test-vectors/start-dissolving-20221206.ts create mode 100644 scripts/test-vectors/stop-dissolving-20221206.ts diff --git a/scripts/test-vectors/increase-dd-20221206.ts b/scripts/test-vectors/increase-dd-20221206.ts new file mode 100644 index 000000000..0d00477cc --- /dev/null +++ b/scripts/test-vectors/increase-dd-20221206.ts @@ -0,0 +1,51 @@ +import { IDL } from "@dfinity/candid"; +import { NeuronId } from "../../packages/nns/src"; +import { toIncreaseDissolveDelayRequest } from "../../packages/nns/src/canisters/governance/request.converters"; +import { ManageNeuronFn } from "./governance.idl"; +import { createBlob, writeToJson } from "./utils"; + +const mockNeuronId = BigInt(15374508381553347371); +const mockNeuronId2 = BigInt(8836564053576662908); + +const createIncreaseDissolveDelayVector = ( + neuronId: NeuronId, + additionalDissolveDelaySeconds: number +) => { + const params = { + neuronId, + additionalDissolveDelaySeconds, + }; + const rawRequestBody = toIncreaseDissolveDelayRequest(params); + + return { + blob_candid: createBlob({ + arg: IDL.encode(ManageNeuronFn.argTypes, [rawRequestBody]), + methodName: "manage_neuron", + }), + name: "Increase Dissolve Delay", + candid_request: rawRequestBody, + }; +}; + +const main = () => { + try { + const vectors = [ + createIncreaseDissolveDelayVector(mockNeuronId, 3600), + createIncreaseDissolveDelayVector(mockNeuronId, 3600 * 24), + createIncreaseDissolveDelayVector(mockNeuronId2, 3600 * 24 * 7), + createIncreaseDissolveDelayVector(mockNeuronId2, 3600 * 24 * 7 * 4), + createIncreaseDissolveDelayVector(mockNeuronId2, 3600), + ]; + + writeToJson({ + data: vectors, + fileName: "increase-dissolve-delay.json", + }); + console.log("File created successfully"); + } catch (error) { + console.log("There was an error"); + console.log(error); + } +}; + +main(); diff --git a/scripts/test-vectors/start-dissolving-20221206.ts b/scripts/test-vectors/start-dissolving-20221206.ts new file mode 100644 index 000000000..80a291327 --- /dev/null +++ b/scripts/test-vectors/start-dissolving-20221206.ts @@ -0,0 +1,40 @@ +import { IDL } from "@dfinity/candid"; +import { NeuronId } from "../../packages/nns/src"; +import { toStartDissolvingRequest } from "../../packages/nns/src/canisters/governance/request.converters"; +import { ManageNeuronFn } from "./governance.idl"; +import { createBlob, writeToJson } from "./utils"; + +const mockNeuronId = BigInt(15374508381553347371); +const mockNeuronId2 = BigInt(8836564053576662908); + +const createStartDissolvingVector = (neuronId: NeuronId) => { + const rawRequestBody = toStartDissolvingRequest(neuronId); + return { + blob_candid: createBlob({ + arg: IDL.encode(ManageNeuronFn.argTypes, [rawRequestBody]), + methodName: "manage_neuron", + }), + name: "Start Dissolving", + candid_request: rawRequestBody, + }; +}; + +const main = () => { + try { + const vectors = [ + createStartDissolvingVector(mockNeuronId), + createStartDissolvingVector(mockNeuronId2), + ]; + + writeToJson({ + data: vectors, + fileName: "start-dissolving.json", + }); + console.log("File created successfully"); + } catch (error) { + console.log("There was an error"); + console.log(error); + } +}; + +main(); diff --git a/scripts/test-vectors/stop-dissolving-20221206.ts b/scripts/test-vectors/stop-dissolving-20221206.ts new file mode 100644 index 000000000..0ac739fdd --- /dev/null +++ b/scripts/test-vectors/stop-dissolving-20221206.ts @@ -0,0 +1,40 @@ +import { IDL } from "@dfinity/candid"; +import { NeuronId } from "../../packages/nns/src"; +import { toStopDissolvingRequest } from "../../packages/nns/src/canisters/governance/request.converters"; +import { ManageNeuronFn } from "./governance.idl"; +import { createBlob, writeToJson } from "./utils"; + +const mockNeuronId = BigInt(15374508381553347371); +const mockNeuronId2 = BigInt(8836564053576662908); + +const createStopDissolvingVector = (neuronId: NeuronId) => { + const rawRequestBody = toStopDissolvingRequest(neuronId); + return { + blob_candid: createBlob({ + arg: IDL.encode(ManageNeuronFn.argTypes, [rawRequestBody]), + methodName: "manage_neuron", + }), + name: "Stop Dissolving", + candid_request: rawRequestBody, + }; +}; + +const main = () => { + try { + const vectors = [ + createStopDissolvingVector(mockNeuronId), + createStopDissolvingVector(mockNeuronId2), + ]; + + writeToJson({ + data: vectors, + fileName: "stop-dissolving.json", + }); + console.log("File created successfully"); + } catch (error) { + console.log("There was an error"); + console.log(error); + } +}; + +main(); From acdc5c66ff6b81d98873e91280b107e79d39caed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lloren=C3=A7?= Date: Wed, 11 Jan 2023 11:03:16 +0100 Subject: [PATCH 07/31] Test Vectors: SNS add neuron permissions --- .../{index-20220613.ts => 20220613-index.ts} | 0 .../{index-20220617.ts => 20220617-index.ts} | 0 .../{index-20220817.ts => 20220817-index.ts} | 2 +- ...s-20220923.ts => 20220923-list-neurons.ts} | 4 +- ...n-20220923.ts => 20220923-spawn-neuron.ts} | 4 +- ...005.ts => 20221005-auto-stake-maturity.ts} | 4 +- ...20221005.ts => 20221005-stake-maturity.ts} | 4 +- ...s-20221202.ts => 20221202-list-neurons.ts} | 4 +- ...dd-20221206.ts => 20221206-increase-dd.ts} | 4 +- ...221206.ts => 20221206-start-dissolving.ts} | 4 +- ...0221206.ts => 20221206-stop-dissolving.ts} | 4 +- .../test-vectors/20230110-sns-add-hotkey.ts | 186 +++++++ scripts/test-vectors/sns-governance.idl.ts | 473 ++++++++++++++++++ scripts/test-vectors/utils.ts | 6 +- 14 files changed, 681 insertions(+), 18 deletions(-) rename scripts/test-vectors/{index-20220613.ts => 20220613-index.ts} (100%) rename scripts/test-vectors/{index-20220617.ts => 20220617-index.ts} (100%) rename scripts/test-vectors/{index-20220817.ts => 20220817-index.ts} (91%) rename scripts/test-vectors/{list-neurons-20220923.ts => 20220923-list-neurons.ts} (88%) rename scripts/test-vectors/{spawn-neuron-20220923.ts => 20220923-spawn-neuron.ts} (94%) rename scripts/test-vectors/{auto-stake-maturity-20221005.ts => 20221005-auto-stake-maturity.ts} (91%) rename scripts/test-vectors/{stake-maturity-20221005.ts => 20221005-stake-maturity.ts} (91%) rename scripts/test-vectors/{list-neurons-20221202.ts => 20221202-list-neurons.ts} (89%) rename scripts/test-vectors/{increase-dd-20221206.ts => 20221206-increase-dd.ts} (89%) rename scripts/test-vectors/{start-dissolving-20221206.ts => 20221206-start-dissolving.ts} (86%) rename scripts/test-vectors/{stop-dissolving-20221206.ts => 20221206-stop-dissolving.ts} (86%) create mode 100644 scripts/test-vectors/20230110-sns-add-hotkey.ts create mode 100644 scripts/test-vectors/sns-governance.idl.ts diff --git a/scripts/test-vectors/index-20220613.ts b/scripts/test-vectors/20220613-index.ts similarity index 100% rename from scripts/test-vectors/index-20220613.ts rename to scripts/test-vectors/20220613-index.ts diff --git a/scripts/test-vectors/index-20220617.ts b/scripts/test-vectors/20220617-index.ts similarity index 100% rename from scripts/test-vectors/index-20220617.ts rename to scripts/test-vectors/20220617-index.ts diff --git a/scripts/test-vectors/index-20220817.ts b/scripts/test-vectors/20220817-index.ts similarity index 91% rename from scripts/test-vectors/index-20220817.ts rename to scripts/test-vectors/20220817-index.ts index a264caeb6..5c4039bf2 100644 --- a/scripts/test-vectors/index-20220817.ts +++ b/scripts/test-vectors/20220817-index.ts @@ -2,7 +2,7 @@ // https://github.com/Zondax/ledger-icp/issues/166 // We'll keep each script for reproducibility. import { IDL } from "@dfinity/candid"; -import { toLeaveCommunityFundRequest } from "../../packages/nns/src/canisters/governance/request.converters"; +import { toLeaveCommunityFundRequest } from "@dfinity/nns/src/canisters/governance/request.converters"; import { ManageNeuronFn } from "./governance.idl"; import { createBlob, writeToJson } from "./utils"; diff --git a/scripts/test-vectors/list-neurons-20220923.ts b/scripts/test-vectors/20220923-list-neurons.ts similarity index 88% rename from scripts/test-vectors/list-neurons-20220923.ts rename to scripts/test-vectors/20220923-list-neurons.ts index 061ef02ce..ad9e03b7d 100644 --- a/scripts/test-vectors/list-neurons-20220923.ts +++ b/scripts/test-vectors/20220923-list-neurons.ts @@ -2,8 +2,8 @@ // https://github.com/Zondax/ledger-icp/issues/166 // We'll keep each script for reproducibility. import { IDL } from "@dfinity/candid"; -import { NeuronId } from "../../packages/nns/src"; -import { fromListNeurons } from "../../packages/nns/src/canisters/governance/request.converters"; +import { NeuronId } from "@dfinity/nns/src"; +import { fromListNeurons } from "@dfinity/nns/src/canisters/governance/request.converters"; import { ListNeuronsFn } from "./governance.idl"; import { createBlob, writeToJson } from "./utils"; diff --git a/scripts/test-vectors/spawn-neuron-20220923.ts b/scripts/test-vectors/20220923-spawn-neuron.ts similarity index 94% rename from scripts/test-vectors/spawn-neuron-20220923.ts rename to scripts/test-vectors/20220923-spawn-neuron.ts index 95e161dc9..4f67eba3a 100644 --- a/scripts/test-vectors/spawn-neuron-20220923.ts +++ b/scripts/test-vectors/20220923-spawn-neuron.ts @@ -2,9 +2,9 @@ // https://github.com/Zondax/ledger-icp/issues/166 // We'll keep each script for reproducibility. import { IDL } from "@dfinity/candid"; +import { NeuronId } from "@dfinity/nns/src"; +import { toSpawnNeuronRequest } from "@dfinity/nns/src/canisters/governance/request.converters"; import { Principal } from "@dfinity/principal"; -import { NeuronId } from "../../packages/nns/src"; -import { toSpawnNeuronRequest } from "../../packages/nns/src/canisters/governance/request.converters"; import { ManageNeuronFn } from "./governance.idl"; import { createBlob, splitPrincipal, writeToJson } from "./utils"; diff --git a/scripts/test-vectors/auto-stake-maturity-20221005.ts b/scripts/test-vectors/20221005-auto-stake-maturity.ts similarity index 91% rename from scripts/test-vectors/auto-stake-maturity-20221005.ts rename to scripts/test-vectors/20221005-auto-stake-maturity.ts index 5764b7fef..c15b09492 100644 --- a/scripts/test-vectors/auto-stake-maturity-20221005.ts +++ b/scripts/test-vectors/20221005-auto-stake-maturity.ts @@ -1,6 +1,6 @@ import { IDL } from "@dfinity/candid"; -import { NeuronId } from "../../packages/nns/src"; -import { toAutoStakeMaturityRequest } from "../../packages/nns/src/canisters/governance/request.converters"; +import { NeuronId } from "@dfinity/nns/src"; +import { toAutoStakeMaturityRequest } from "@dfinity/nns/src/canisters/governance/request.converters"; import { ManageNeuronFn } from "./governance.idl"; import { createBlob, writeToJson } from "./utils"; diff --git a/scripts/test-vectors/stake-maturity-20221005.ts b/scripts/test-vectors/20221005-stake-maturity.ts similarity index 91% rename from scripts/test-vectors/stake-maturity-20221005.ts rename to scripts/test-vectors/20221005-stake-maturity.ts index 2445a8c40..943e6ebe9 100644 --- a/scripts/test-vectors/stake-maturity-20221005.ts +++ b/scripts/test-vectors/20221005-stake-maturity.ts @@ -1,6 +1,6 @@ import { IDL } from "@dfinity/candid"; -import { NeuronId } from "../../packages/nns/src"; -import { toStakeMaturityRequest } from "../../packages/nns/src/canisters/governance/request.converters"; +import { NeuronId } from "@dfinity/nns/src"; +import { toStakeMaturityRequest } from "@dfinity/nns/src/canisters/governance/request.converters"; import { ManageNeuronFn } from "./governance.idl"; import { createBlob, writeToJson } from "./utils"; diff --git a/scripts/test-vectors/list-neurons-20221202.ts b/scripts/test-vectors/20221202-list-neurons.ts similarity index 89% rename from scripts/test-vectors/list-neurons-20221202.ts rename to scripts/test-vectors/20221202-list-neurons.ts index a20189ebc..f0053b7b9 100644 --- a/scripts/test-vectors/list-neurons-20221202.ts +++ b/scripts/test-vectors/20221202-list-neurons.ts @@ -2,8 +2,8 @@ // https://github.com/Zondax/ledger-icp/issues/166 // We'll keep each script for reproducibility. import { IDL } from "@dfinity/candid"; -import { NeuronId } from "../../packages/nns/src"; -import { fromListNeurons } from "../../packages/nns/src/canisters/governance/request.converters"; +import { NeuronId } from "@dfinity/nns/src"; +import { fromListNeurons } from "@dfinity/nns/src/canisters/governance/request.converters"; import { ListNeuronsFn } from "./governance.idl"; import { createBlob, writeToJson } from "./utils"; diff --git a/scripts/test-vectors/increase-dd-20221206.ts b/scripts/test-vectors/20221206-increase-dd.ts similarity index 89% rename from scripts/test-vectors/increase-dd-20221206.ts rename to scripts/test-vectors/20221206-increase-dd.ts index 0d00477cc..3c8d75082 100644 --- a/scripts/test-vectors/increase-dd-20221206.ts +++ b/scripts/test-vectors/20221206-increase-dd.ts @@ -1,6 +1,6 @@ import { IDL } from "@dfinity/candid"; -import { NeuronId } from "../../packages/nns/src"; -import { toIncreaseDissolveDelayRequest } from "../../packages/nns/src/canisters/governance/request.converters"; +import { NeuronId } from "@dfinity/nns/src"; +import { toIncreaseDissolveDelayRequest } from "@dfinity/nns/src/canisters/governance/request.converters"; import { ManageNeuronFn } from "./governance.idl"; import { createBlob, writeToJson } from "./utils"; diff --git a/scripts/test-vectors/start-dissolving-20221206.ts b/scripts/test-vectors/20221206-start-dissolving.ts similarity index 86% rename from scripts/test-vectors/start-dissolving-20221206.ts rename to scripts/test-vectors/20221206-start-dissolving.ts index 80a291327..2fd3358e2 100644 --- a/scripts/test-vectors/start-dissolving-20221206.ts +++ b/scripts/test-vectors/20221206-start-dissolving.ts @@ -1,6 +1,6 @@ import { IDL } from "@dfinity/candid"; -import { NeuronId } from "../../packages/nns/src"; -import { toStartDissolvingRequest } from "../../packages/nns/src/canisters/governance/request.converters"; +import { NeuronId } from "@dfinity/nns/src"; +import { toStartDissolvingRequest } from "@dfinity/nns/src/canisters/governance/request.converters"; import { ManageNeuronFn } from "./governance.idl"; import { createBlob, writeToJson } from "./utils"; diff --git a/scripts/test-vectors/stop-dissolving-20221206.ts b/scripts/test-vectors/20221206-stop-dissolving.ts similarity index 86% rename from scripts/test-vectors/stop-dissolving-20221206.ts rename to scripts/test-vectors/20221206-stop-dissolving.ts index 0ac739fdd..14769a07a 100644 --- a/scripts/test-vectors/stop-dissolving-20221206.ts +++ b/scripts/test-vectors/20221206-stop-dissolving.ts @@ -1,6 +1,6 @@ import { IDL } from "@dfinity/candid"; -import { NeuronId } from "../../packages/nns/src"; -import { toStopDissolvingRequest } from "../../packages/nns/src/canisters/governance/request.converters"; +import { NeuronId } from "@dfinity/nns/src"; +import { toStopDissolvingRequest } from "@dfinity/nns/src/canisters/governance/request.converters"; import { ManageNeuronFn } from "./governance.idl"; import { createBlob, writeToJson } from "./utils"; diff --git a/scripts/test-vectors/20230110-sns-add-hotkey.ts b/scripts/test-vectors/20230110-sns-add-hotkey.ts new file mode 100644 index 000000000..054444c9e --- /dev/null +++ b/scripts/test-vectors/20230110-sns-add-hotkey.ts @@ -0,0 +1,186 @@ +import { IDL } from "@dfinity/candid"; +import { Principal } from "@dfinity/principal"; +import { SnsNeuronPermissionsParams } from "@dfinity/sns/src"; +import { toAddPermissionsRequest } from "@dfinity/sns/src/converters/governance.converters"; +import { SnsNeuronPermissionType } from "@dfinity/sns/src/enums/governance.enums"; +import { arrayOfNumberToUint8Array } from "@dfinity/utils"; +import { ManageNeuronFn } from "./sns-governance.idl"; +import { createBlob, splitPrincipal, writeToJson } from "./utils"; + +/** + * ISSUE: https://github.com/Zondax/ledger-icp/issues/187 + */ + +interface Params extends SnsNeuronPermissionsParams { + canisterId: Principal; +} + +const permissionMapper: Record = { + [SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_VOTE]: "Vote", + [SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_SUBMIT_PROPOSAL]: + "Submit Proposal", + [SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_CONFIGURE_DISSOLVE_STATE]: + "Configure Dissolve State", + [SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_DISBURSE]: "Disburse Neuron", + [SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_DISBURSE_MATURITY]: + "Disburse Maturity", + [SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_MANAGE_PRINCIPALS]: + "Manage Principals", + [SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_MANAGE_VOTING_PERMISSION]: + "Manage Voting Permission", + [SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_SPLIT]: "Split Neuron", + [SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_STAKE_MATURITY]: + "Stake Maturity", + [SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_UNSPECIFIED]: "Unspecified", + [SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_MERGE_MATURITY]: + "Merge Maturity", +}; + +export const bytesToHexString = (bytes: number[]): string => + bytes.reduce( + (str, byte) => `${str}${byte.toString(16).padStart(2, "0")}`, + "" + ); + +const createTestVector = (params: Params) => { + const rawRequestBody = toAddPermissionsRequest(params); + const canisterIdOutputs = splitPrincipal(params.canisterId).map( + (data, i, elements) => `Canister Id [${i + 1}/${elements.length}] : ${data}` + ); + const neuronIdString = bytesToHexString(Array.from(params.neuronId.id)); + const neuronIdOutputs = + neuronIdString + .match(/.{1,6}/g) + ?.reduce((acc, curr) => { + if (acc.length === 0) { + return [curr]; + } + const lastItem = acc[acc.length - 1]; + if (lastItem.length > 18) { + return [...acc, curr]; + } else if (lastItem.length < 18) { + return [...acc.slice(0, -1), `${lastItem} : ${curr}`]; + } + return acc; + }, [] as string[]) + ?.map( + (data, i, elements) => + `Neuron Id [${i + 1}/${elements.length}] : ${data}` + ) || []; + const principalOutputs = splitPrincipal(params.principal).map( + (data, i, elements) => + `Principal Id [${i + 1}/${elements.length}] : ${data}` + ); + const permissionOutputs = params.permissions.map( + (p) => `Add Permission : ${permissionMapper[p]}` + ); + const output = [ + "Transaction type : Add Neuron Permissions", + ...canisterIdOutputs, + ...neuronIdOutputs, + ...principalOutputs, + ...permissionOutputs, + ]; + return { + blob_candid: createBlob({ + arg: IDL.encode(ManageNeuronFn.argTypes, [rawRequestBody]), + methodName: "manage_neuron", + canisterId: params.canisterId, + }), + output: output.map((element, index) => `${index + 1} | ${element}`), + neuronIdString: neuronIdString, + name: "Add Neuron Permissions", + canisterId: params.canisterId.toText(), + candid_request: rawRequestBody, + }; +}; + +const main = () => { + try { + const id1 = arrayOfNumberToUint8Array([ + 215, 232, 81, 101, 44, 208, 50, 186, 94, 215, 107, 23, 246, 38, 170, 71, + 130, 159, 6, 229, 35, 90, 13, 88, 14, 150, 211, 114, 119, 41, 234, 36, + ]); + const id2 = arrayOfNumberToUint8Array([ + 163, 110, 20, 60, 134, 231, 228, 113, 231, 199, 25, 80, 100, 135, 207, + 122, 108, 244, 13, 167, 99, 97, 174, 175, 238, 81, 51, 225, 217, 172, 234, + 61, + ]); + const principal1 = Principal.fromText( + "krpzt-buecq-u3umg-7kb7r-j5jpx-twqwa-3ykc4-y3cnk-7kwvw-5bq6z-mae" + ); + const principal2 = Principal.fromText( + "2dfd6-abjpf-eihu7-pwv6m-qnlbt-oszmg-kb26q-rvqms-onmuh-mwiq3-uqe" + ); + const canisterId1 = Principal.fromText("ppmzm-3aaaa-aaaaa-aacpq-cai"); + const canisterId2 = Principal.fromText("s24we-diaaa-aaaaa-aaaka-cai"); + const vectors = [ + createTestVector({ + neuronId: { id: id1 }, + principal: principal1, + permissions: [ + SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_VOTE, + SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_SUBMIT_PROPOSAL, + ], + canisterId: canisterId1, + }), + createTestVector({ + neuronId: { id: id1 }, + principal: principal2, + permissions: [ + SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_VOTE, + SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_SUBMIT_PROPOSAL, + ], + canisterId: canisterId1, + }), + createTestVector({ + neuronId: { id: id2 }, + principal: principal2, + permissions: [ + SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_VOTE, + SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_SUBMIT_PROPOSAL, + SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_CONFIGURE_DISSOLVE_STATE, + ], + canisterId: canisterId2, + }), + createTestVector({ + neuronId: { id: id1 }, + principal: principal1, + permissions: [ + SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_VOTE, + SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_DISBURSE, + ], + canisterId: canisterId2, + }), + createTestVector({ + neuronId: { id: id1 }, + principal: principal2, + permissions: [ + SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_DISBURSE, + SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_CONFIGURE_DISSOLVE_STATE, + ], + canisterId: canisterId2, + }), + createTestVector({ + neuronId: { id: id2 }, + principal: principal2, + permissions: [ + SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_MANAGE_VOTING_PERMISSION, + SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_DISBURSE, + ], + canisterId: canisterId1, + }), + ]; + + writeToJson({ + data: vectors, + fileName: "sns-add-neuron-permissions.json", + }); + console.log("File created successfully"); + } catch (error) { + console.log("There was an error"); + console.log(error); + } +}; + +main(); diff --git a/scripts/test-vectors/sns-governance.idl.ts b/scripts/test-vectors/sns-governance.idl.ts new file mode 100644 index 000000000..ca15931db --- /dev/null +++ b/scripts/test-vectors/sns-governance.idl.ts @@ -0,0 +1,473 @@ +import { IDL } from "@dfinity/candid"; + +const GenericNervousSystemFunction = IDL.Record({ + validator_canister_id: IDL.Opt(IDL.Principal), + target_canister_id: IDL.Opt(IDL.Principal), + validator_method_name: IDL.Opt(IDL.Text), + target_method_name: IDL.Opt(IDL.Text), +}); +const FunctionType = IDL.Variant({ + NativeNervousSystemFunction: IDL.Record({}), + GenericNervousSystemFunction: GenericNervousSystemFunction, +}); +const NervousSystemFunction = IDL.Record({ + id: IDL.Nat64, + name: IDL.Text, + description: IDL.Opt(IDL.Text), + function_type: IDL.Opt(FunctionType), +}); +const GovernanceCachedMetrics = IDL.Record({ + not_dissolving_neurons_e8s_buckets: IDL.Vec( + IDL.Tuple(IDL.Nat64, IDL.Float64) + ), + garbage_collectable_neurons_count: IDL.Nat64, + neurons_with_invalid_stake_count: IDL.Nat64, + not_dissolving_neurons_count_buckets: IDL.Vec( + IDL.Tuple(IDL.Nat64, IDL.Nat64) + ), + neurons_with_less_than_6_months_dissolve_delay_count: IDL.Nat64, + dissolved_neurons_count: IDL.Nat64, + total_staked_e8s: IDL.Nat64, + total_supply_governance_tokens: IDL.Nat64, + not_dissolving_neurons_count: IDL.Nat64, + dissolved_neurons_e8s: IDL.Nat64, + neurons_with_less_than_6_months_dissolve_delay_e8s: IDL.Nat64, + dissolving_neurons_count_buckets: IDL.Vec(IDL.Tuple(IDL.Nat64, IDL.Nat64)), + dissolving_neurons_count: IDL.Nat64, + dissolving_neurons_e8s_buckets: IDL.Vec(IDL.Tuple(IDL.Nat64, IDL.Float64)), + timestamp_seconds: IDL.Nat64, +}); +const NeuronId = IDL.Record({ id: IDL.Vec(IDL.Nat8) }); +const Followees = IDL.Record({ followees: IDL.Vec(NeuronId) }); +const DefaultFollowees = IDL.Record({ + followees: IDL.Vec(IDL.Tuple(IDL.Nat64, Followees)), +}); +const NeuronPermissionList = IDL.Record({ + permissions: IDL.Vec(IDL.Int32), +}); +const VotingRewardsParameters = IDL.Record({ + final_reward_rate_basis_points: IDL.Opt(IDL.Nat64), + initial_reward_rate_basis_points: IDL.Opt(IDL.Nat64), + reward_rate_transition_duration_seconds: IDL.Opt(IDL.Nat64), + round_duration_seconds: IDL.Opt(IDL.Nat64), +}); +const NervousSystemParameters = IDL.Record({ + default_followees: IDL.Opt(DefaultFollowees), + max_dissolve_delay_seconds: IDL.Opt(IDL.Nat64), + max_dissolve_delay_bonus_percentage: IDL.Opt(IDL.Nat64), + max_followees_per_function: IDL.Opt(IDL.Nat64), + neuron_claimer_permissions: IDL.Opt(NeuronPermissionList), + neuron_minimum_stake_e8s: IDL.Opt(IDL.Nat64), + max_neuron_age_for_age_bonus: IDL.Opt(IDL.Nat64), + initial_voting_period_seconds: IDL.Opt(IDL.Nat64), + neuron_minimum_dissolve_delay_to_vote_seconds: IDL.Opt(IDL.Nat64), + reject_cost_e8s: IDL.Opt(IDL.Nat64), + max_proposals_to_keep_per_action: IDL.Opt(IDL.Nat32), + wait_for_quiet_deadline_increase_seconds: IDL.Opt(IDL.Nat64), + max_number_of_neurons: IDL.Opt(IDL.Nat64), + transaction_fee_e8s: IDL.Opt(IDL.Nat64), + max_number_of_proposals_with_ballots: IDL.Opt(IDL.Nat64), + max_age_bonus_percentage: IDL.Opt(IDL.Nat64), + neuron_grantable_permissions: IDL.Opt(NeuronPermissionList), + voting_rewards_parameters: IDL.Opt(VotingRewardsParameters), + max_number_of_principals_per_neuron: IDL.Opt(IDL.Nat64), +}); +const Version = IDL.Record({ + archive_wasm_hash: IDL.Vec(IDL.Nat8), + root_wasm_hash: IDL.Vec(IDL.Nat8), + swap_wasm_hash: IDL.Vec(IDL.Nat8), + ledger_wasm_hash: IDL.Vec(IDL.Nat8), + governance_wasm_hash: IDL.Vec(IDL.Nat8), + index_wasm_hash: IDL.Vec(IDL.Nat8), +}); +const ProposalId = IDL.Record({ id: IDL.Nat64 }); +const RewardEvent = IDL.Record({ + actual_timestamp_seconds: IDL.Nat64, + distributed_e8s_equivalent: IDL.Nat64, + round: IDL.Nat64, + settled_proposals: IDL.Vec(ProposalId), +}); +const UpgradeInProgress = IDL.Record({ + mark_failed_at_seconds: IDL.Nat64, + checking_upgrade_lock: IDL.Nat64, + proposal_id: IDL.Nat64, + target_version: IDL.Opt(Version), +}); +const GovernanceError = IDL.Record({ + error_message: IDL.Text, + error_type: IDL.Int32, +}); +const Ballot = IDL.Record({ + vote: IDL.Int32, + cast_timestamp_seconds: IDL.Nat64, + voting_power: IDL.Nat64, +}); +const Tally = IDL.Record({ + no: IDL.Nat64, + yes: IDL.Nat64, + total: IDL.Nat64, + timestamp_seconds: IDL.Nat64, +}); +const Subaccount = IDL.Record({ subaccount: IDL.Vec(IDL.Nat8) }); +const TransferSnsTreasuryFunds = IDL.Record({ + from_treasury: IDL.Int32, + to_principal: IDL.Opt(IDL.Principal), + to_subaccount: IDL.Opt(Subaccount), + memo: IDL.Opt(IDL.Nat64), + amount_e8s: IDL.Nat64, +}); +const UpgradeSnsControlledCanister = IDL.Record({ + new_canister_wasm: IDL.Vec(IDL.Nat8), + canister_id: IDL.Opt(IDL.Principal), +}); +const ManageSnsMetadata = IDL.Record({ + url: IDL.Opt(IDL.Text), + logo: IDL.Opt(IDL.Text), + name: IDL.Opt(IDL.Text), + description: IDL.Opt(IDL.Text), +}); +const ExecuteGenericNervousSystemFunction = IDL.Record({ + function_id: IDL.Nat64, + payload: IDL.Vec(IDL.Nat8), +}); +const Motion = IDL.Record({ motion_text: IDL.Text }); +const Action = IDL.Variant({ + ManageNervousSystemParameters: NervousSystemParameters, + AddGenericNervousSystemFunction: NervousSystemFunction, + RemoveGenericNervousSystemFunction: IDL.Nat64, + UpgradeSnsToNextVersion: IDL.Record({}), + TransferSnsTreasuryFunds: TransferSnsTreasuryFunds, + UpgradeSnsControlledCanister: UpgradeSnsControlledCanister, + Unspecified: IDL.Record({}), + ManageSnsMetadata: ManageSnsMetadata, + ExecuteGenericNervousSystemFunction: ExecuteGenericNervousSystemFunction, + Motion: Motion, +}); +const Proposal = IDL.Record({ + url: IDL.Text, + title: IDL.Text, + action: IDL.Opt(Action), + summary: IDL.Text, +}); +const WaitForQuietState = IDL.Record({ + current_deadline_timestamp_seconds: IDL.Nat64, +}); +const ProposalData = IDL.Record({ + id: IDL.Opt(ProposalId), + payload_text_rendering: IDL.Opt(IDL.Text), + action: IDL.Nat64, + failure_reason: IDL.Opt(GovernanceError), + ballots: IDL.Vec(IDL.Tuple(IDL.Text, Ballot)), + reward_event_round: IDL.Nat64, + failed_timestamp_seconds: IDL.Nat64, + proposal_creation_timestamp_seconds: IDL.Nat64, + initial_voting_period_seconds: IDL.Nat64, + reject_cost_e8s: IDL.Nat64, + latest_tally: IDL.Opt(Tally), + wait_for_quiet_deadline_increase_seconds: IDL.Nat64, + decided_timestamp_seconds: IDL.Nat64, + proposal: IDL.Opt(Proposal), + proposer: IDL.Opt(NeuronId), + wait_for_quiet_state: IDL.Opt(WaitForQuietState), + is_eligible_for_rewards: IDL.Bool, + executed_timestamp_seconds: IDL.Nat64, +}); +const Split = IDL.Record({ memo: IDL.Nat64, amount_e8s: IDL.Nat64 }); +const Follow = IDL.Record({ + function_id: IDL.Nat64, + followees: IDL.Vec(NeuronId), +}); +const Account = IDL.Record({ + owner: IDL.Opt(IDL.Principal), + subaccount: IDL.Opt(Subaccount), +}); +const DisburseMaturity = IDL.Record({ + to_account: IDL.Opt(Account), + percentage_to_disburse: IDL.Nat32, +}); +const ChangeAutoStakeMaturity = IDL.Record({ + requested_setting_for_auto_stake_maturity: IDL.Bool, +}); +const IncreaseDissolveDelay = IDL.Record({ + additional_dissolve_delay_seconds: IDL.Nat32, +}); +const SetDissolveTimestamp = IDL.Record({ + dissolve_timestamp_seconds: IDL.Nat64, +}); +const Operation = IDL.Variant({ + ChangeAutoStakeMaturity: ChangeAutoStakeMaturity, + StopDissolving: IDL.Record({}), + StartDissolving: IDL.Record({}), + IncreaseDissolveDelay: IncreaseDissolveDelay, + SetDissolveTimestamp: SetDissolveTimestamp, +}); +const Configure = IDL.Record({ operation: IDL.Opt(Operation) }); +const RegisterVote = IDL.Record({ + vote: IDL.Int32, + proposal: IDL.Opt(ProposalId), +}); +const MemoAndController = IDL.Record({ + controller: IDL.Opt(IDL.Principal), + memo: IDL.Nat64, +}); +const By = IDL.Variant({ + MemoAndController: MemoAndController, + NeuronId: IDL.Record({}), +}); +const ClaimOrRefresh = IDL.Record({ by: IDL.Opt(By) }); +const RemoveNeuronPermissions = IDL.Record({ + permissions_to_remove: IDL.Opt(NeuronPermissionList), + principal_id: IDL.Opt(IDL.Principal), +}); +const AddNeuronPermissions = IDL.Record({ + permissions_to_add: IDL.Opt(NeuronPermissionList), + principal_id: IDL.Opt(IDL.Principal), +}); +const MergeMaturity = IDL.Record({ percentage_to_merge: IDL.Nat32 }); +const Amount = IDL.Record({ e8s: IDL.Nat64 }); +const Disburse = IDL.Record({ + to_account: IDL.Opt(Account), + amount: IDL.Opt(Amount), +}); +const Command_2 = IDL.Variant({ + Split: Split, + Follow: Follow, + DisburseMaturity: DisburseMaturity, + Configure: Configure, + RegisterVote: RegisterVote, + SyncCommand: IDL.Record({}), + MakeProposal: Proposal, + ClaimOrRefreshNeuron: ClaimOrRefresh, + RemoveNeuronPermissions: RemoveNeuronPermissions, + AddNeuronPermissions: AddNeuronPermissions, + MergeMaturity: MergeMaturity, + Disburse: Disburse, +}); +const NeuronInFlightCommand = IDL.Record({ + command: IDL.Opt(Command_2), + timestamp: IDL.Nat64, +}); +const NeuronPermission = IDL.Record({ + principal: IDL.Opt(IDL.Principal), + permission_type: IDL.Vec(IDL.Int32), +}); +const DissolveState = IDL.Variant({ + DissolveDelaySeconds: IDL.Nat64, + WhenDissolvedTimestampSeconds: IDL.Nat64, +}); +const Neuron = IDL.Record({ + id: IDL.Opt(NeuronId), + staked_maturity_e8s_equivalent: IDL.Opt(IDL.Nat64), + permissions: IDL.Vec(NeuronPermission), + maturity_e8s_equivalent: IDL.Nat64, + cached_neuron_stake_e8s: IDL.Nat64, + created_timestamp_seconds: IDL.Nat64, + source_nns_neuron_id: IDL.Opt(IDL.Nat64), + auto_stake_maturity: IDL.Opt(IDL.Bool), + aging_since_timestamp_seconds: IDL.Nat64, + dissolve_state: IDL.Opt(DissolveState), + voting_power_percentage_multiplier: IDL.Nat64, + followees: IDL.Vec(IDL.Tuple(IDL.Nat64, Followees)), + neuron_fees_e8s: IDL.Nat64, +}); +const Governance = IDL.Record({ + root_canister_id: IDL.Opt(IDL.Principal), + id_to_nervous_system_functions: IDL.Vec( + IDL.Tuple(IDL.Nat64, NervousSystemFunction) + ), + metrics: IDL.Opt(GovernanceCachedMetrics), + mode: IDL.Int32, + parameters: IDL.Opt(NervousSystemParameters), + deployed_version: IDL.Opt(Version), + sns_initialization_parameters: IDL.Text, + latest_reward_event: IDL.Opt(RewardEvent), + pending_version: IDL.Opt(UpgradeInProgress), + swap_canister_id: IDL.Opt(IDL.Principal), + ledger_canister_id: IDL.Opt(IDL.Principal), + proposals: IDL.Vec(IDL.Tuple(IDL.Nat64, ProposalData)), + in_flight_commands: IDL.Vec(IDL.Tuple(IDL.Text, NeuronInFlightCommand)), + sns_metadata: IDL.Opt(ManageSnsMetadata), + neurons: IDL.Vec(IDL.Tuple(IDL.Text, Neuron)), + genesis_timestamp_seconds: IDL.Nat64, +}); +const NeuronParameters = IDL.Record({ + controller: IDL.Opt(IDL.Principal), + dissolve_delay_seconds: IDL.Opt(IDL.Nat64), + memo: IDL.Opt(IDL.Nat64), + source_nns_neuron_id: IDL.Opt(IDL.Nat64), + stake_e8s: IDL.Opt(IDL.Nat64), + hotkey: IDL.Opt(IDL.Principal), +}); +const ClaimSwapNeuronsRequest = IDL.Record({ + neuron_parameters: IDL.Vec(NeuronParameters), +}); +const ClaimSwapNeuronsResponse = IDL.Record({ + skipped_claims: IDL.Nat32, + successful_claims: IDL.Nat32, + failed_claims: IDL.Nat32, +}); +const GetMetadataResponse = IDL.Record({ + url: IDL.Opt(IDL.Text), + logo: IDL.Opt(IDL.Text), + name: IDL.Opt(IDL.Text), + description: IDL.Opt(IDL.Text), +}); +const GetNeuron = IDL.Record({ neuron_id: IDL.Opt(NeuronId) }); +const Result = IDL.Variant({ Error: GovernanceError, Neuron: Neuron }); +const GetNeuronResponse = IDL.Record({ result: IDL.Opt(Result) }); +const GetProposal = IDL.Record({ proposal_id: IDL.Opt(ProposalId) }); +const Result_1 = IDL.Variant({ + Error: GovernanceError, + Proposal: ProposalData, +}); +const GetProposalResponse = IDL.Record({ result: IDL.Opt(Result_1) }); +const CanisterStatusType = IDL.Variant({ + stopped: IDL.Null, + stopping: IDL.Null, + running: IDL.Null, +}); +const DefiniteCanisterSettingsArgs = IDL.Record({ + controller: IDL.Principal, + freezing_threshold: IDL.Nat, + controllers: IDL.Vec(IDL.Principal), + memory_allocation: IDL.Nat, + compute_allocation: IDL.Nat, +}); +const CanisterStatusResultV2 = IDL.Record({ + controller: IDL.Principal, + status: CanisterStatusType, + freezing_threshold: IDL.Nat, + balance: IDL.Vec(IDL.Tuple(IDL.Vec(IDL.Nat8), IDL.Nat)), + memory_size: IDL.Nat, + cycles: IDL.Nat, + settings: DefiniteCanisterSettingsArgs, + idle_cycles_burned_per_day: IDL.Nat, + module_hash: IDL.Opt(IDL.Vec(IDL.Nat8)), +}); +const GetRunningSnsVersionResponse = IDL.Record({ + deployed_version: IDL.Opt(Version), + pending_version: IDL.Opt(UpgradeInProgress), +}); +const GetSnsInitializationParametersResponse = IDL.Record({ + sns_initialization_parameters: IDL.Text, +}); +const ListNervousSystemFunctionsResponse = IDL.Record({ + reserved_ids: IDL.Vec(IDL.Nat64), + functions: IDL.Vec(NervousSystemFunction), +}); +const ListNeurons = IDL.Record({ + of_principal: IDL.Opt(IDL.Principal), + limit: IDL.Nat32, + start_page_at: IDL.Opt(NeuronId), +}); +const ListNeuronsResponse = IDL.Record({ neurons: IDL.Vec(Neuron) }); +const ListProposals = IDL.Record({ + include_reward_status: IDL.Vec(IDL.Int32), + before_proposal: IDL.Opt(ProposalId), + limit: IDL.Nat32, + exclude_type: IDL.Vec(IDL.Nat64), + include_status: IDL.Vec(IDL.Int32), +}); +const ListProposalsResponse = IDL.Record({ + proposals: IDL.Vec(ProposalData), +}); +const StakeMaturity = IDL.Record({ + percentage_to_stake: IDL.Opt(IDL.Nat32), +}); +const Command = IDL.Variant({ + Split: Split, + Follow: Follow, + DisburseMaturity: DisburseMaturity, + ClaimOrRefresh: ClaimOrRefresh, + Configure: Configure, + RegisterVote: RegisterVote, + MakeProposal: Proposal, + StakeMaturity: StakeMaturity, + RemoveNeuronPermissions: RemoveNeuronPermissions, + AddNeuronPermissions: AddNeuronPermissions, + MergeMaturity: MergeMaturity, + Disburse: Disburse, +}); +const ManageNeuron = IDL.Record({ + subaccount: IDL.Vec(IDL.Nat8), + command: IDL.Opt(Command), +}); +const SplitResponse = IDL.Record({ created_neuron_id: IDL.Opt(NeuronId) }); +const DisburseMaturityResponse = IDL.Record({ + transfer_block_height: IDL.Nat64, + amount_disbursed_e8s: IDL.Nat64, +}); +const ClaimOrRefreshResponse = IDL.Record({ + refreshed_neuron_id: IDL.Opt(NeuronId), +}); +const StakeMaturityResponse = IDL.Record({ + maturity_e8s: IDL.Nat64, + staked_maturity_e8s: IDL.Nat64, +}); +const MergeMaturityResponse = IDL.Record({ + merged_maturity_e8s: IDL.Nat64, + new_stake_e8s: IDL.Nat64, +}); +const DisburseResponse = IDL.Record({ transfer_block_height: IDL.Nat64 }); +const Command_1 = IDL.Variant({ + Error: GovernanceError, + Split: SplitResponse, + Follow: IDL.Record({}), + DisburseMaturity: DisburseMaturityResponse, + ClaimOrRefresh: ClaimOrRefreshResponse, + Configure: IDL.Record({}), + RegisterVote: IDL.Record({}), + MakeProposal: GetProposal, + RemoveNeuronPermission: IDL.Record({}), + StakeMaturity: StakeMaturityResponse, + MergeMaturity: MergeMaturityResponse, + Disburse: DisburseResponse, + AddNeuronPermission: IDL.Record({}), +}); +const ManageNeuronResponse = IDL.Record({ command: IDL.Opt(Command_1) }); +const SetMode = IDL.Record({ mode: IDL.Int32 }); + +// SNS Neuron transactions are always of this type +export const ManageNeuronFn = IDL.Func( + [ManageNeuron], + [ManageNeuronResponse], + [] +); + +// List of endpoints +IDL.Service({ + claim_swap_neurons: IDL.Func( + [ClaimSwapNeuronsRequest], + [ClaimSwapNeuronsResponse], + [] + ), + get_build_metadata: IDL.Func([], [IDL.Text], ["query"]), + get_metadata: IDL.Func([IDL.Record({})], [GetMetadataResponse], ["query"]), + get_nervous_system_parameters: IDL.Func( + [IDL.Null], + [NervousSystemParameters], + ["query"] + ), + get_neuron: IDL.Func([GetNeuron], [GetNeuronResponse], ["query"]), + get_proposal: IDL.Func([GetProposal], [GetProposalResponse], ["query"]), + get_root_canister_status: IDL.Func([IDL.Null], [CanisterStatusResultV2], []), + get_running_sns_version: IDL.Func( + [IDL.Record({})], + [GetRunningSnsVersionResponse], + ["query"] + ), + get_sns_initialization_parameters: IDL.Func( + [IDL.Record({})], + [GetSnsInitializationParametersResponse], + ["query"] + ), + list_nervous_system_functions: IDL.Func( + [], + [ListNervousSystemFunctionsResponse], + ["query"] + ), + list_neurons: IDL.Func([ListNeurons], [ListNeuronsResponse], ["query"]), + list_proposals: IDL.Func([ListProposals], [ListProposalsResponse], ["query"]), + manage_neuron: IDL.Func([ManageNeuron], [ManageNeuronResponse], []), + set_mode: IDL.Func([SetMode], [IDL.Record({})], []), +}); diff --git a/scripts/test-vectors/utils.ts b/scripts/test-vectors/utils.ts index 0697a5988..d2a53a01b 100644 --- a/scripts/test-vectors/utils.ts +++ b/scripts/test-vectors/utils.ts @@ -42,12 +42,14 @@ const DEFAULT_INGRESS_EXPIRY_DELTA_IN_MSECS = 5 * 60 * 1000; const createCallRequest = ({ arg, methodName, + canisterId, }: { arg: ArrayBuffer; methodName: string; + canisterId?: Principal; }): CallRequest => ({ request_type: SubmitRequestType.Call, - canister_id: MAINNET_GOVERNANCE_CANISTER_ID, + canister_id: canisterId ?? MAINNET_GOVERNANCE_CANISTER_ID, method_name: methodName, arg, // sender: new AnonymousIdentity().getPrincipal(), @@ -61,9 +63,11 @@ const createCallRequest = ({ export const createBlob = ({ arg, methodName, + canisterId, }: { arg: ArrayBuffer; methodName: string; + canisterId?: Principal; }): string => { const callRequestCandid = createCallRequest({ arg, From 9d64fd272a7c6e7be71316b5cfbd5ade7a6673e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lloren=C3=A7?= Date: Wed, 18 Jan 2023 13:52:25 +0100 Subject: [PATCH 08/31] 20230118: Setup --- .../test-vectors/20230110-sns-add-hotkey.ts | 35 +- .../20230118-sns-manage-neuron.ts | 105 +++++ .../20230118-sns-remove-hotkey.ts | 148 +++++++ .../sns-manage-neuron-actions.json | 174 ++++++++ .../sns-remove-neuron-permissions.json | 389 ++++++++++++++++++ scripts/test-vectors/utils.ts | 62 ++- 6 files changed, 882 insertions(+), 31 deletions(-) create mode 100644 scripts/test-vectors/20230118-sns-manage-neuron.ts create mode 100644 scripts/test-vectors/20230118-sns-remove-hotkey.ts create mode 100644 scripts/test-vectors/sns-manage-neuron-actions.json create mode 100644 scripts/test-vectors/sns-remove-neuron-permissions.json diff --git a/scripts/test-vectors/20230110-sns-add-hotkey.ts b/scripts/test-vectors/20230110-sns-add-hotkey.ts index 054444c9e..855face6a 100644 --- a/scripts/test-vectors/20230110-sns-add-hotkey.ts +++ b/scripts/test-vectors/20230110-sns-add-hotkey.ts @@ -5,7 +5,13 @@ import { toAddPermissionsRequest } from "@dfinity/sns/src/converters/governance. import { SnsNeuronPermissionType } from "@dfinity/sns/src/enums/governance.enums"; import { arrayOfNumberToUint8Array } from "@dfinity/utils"; import { ManageNeuronFn } from "./sns-governance.idl"; -import { createBlob, splitPrincipal, writeToJson } from "./utils"; +import { + bytesToHexString, + createBlob, + permissionMapper, + splitPrincipal, + writeToJson, +} from "./utils"; /** * ISSUE: https://github.com/Zondax/ledger-icp/issues/187 @@ -15,33 +21,6 @@ interface Params extends SnsNeuronPermissionsParams { canisterId: Principal; } -const permissionMapper: Record = { - [SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_VOTE]: "Vote", - [SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_SUBMIT_PROPOSAL]: - "Submit Proposal", - [SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_CONFIGURE_DISSOLVE_STATE]: - "Configure Dissolve State", - [SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_DISBURSE]: "Disburse Neuron", - [SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_DISBURSE_MATURITY]: - "Disburse Maturity", - [SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_MANAGE_PRINCIPALS]: - "Manage Principals", - [SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_MANAGE_VOTING_PERMISSION]: - "Manage Voting Permission", - [SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_SPLIT]: "Split Neuron", - [SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_STAKE_MATURITY]: - "Stake Maturity", - [SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_UNSPECIFIED]: "Unspecified", - [SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_MERGE_MATURITY]: - "Merge Maturity", -}; - -export const bytesToHexString = (bytes: number[]): string => - bytes.reduce( - (str, byte) => `${str}${byte.toString(16).padStart(2, "0")}`, - "" - ); - const createTestVector = (params: Params) => { const rawRequestBody = toAddPermissionsRequest(params); const canisterIdOutputs = splitPrincipal(params.canisterId).map( diff --git a/scripts/test-vectors/20230118-sns-manage-neuron.ts b/scripts/test-vectors/20230118-sns-manage-neuron.ts new file mode 100644 index 000000000..80231fb57 --- /dev/null +++ b/scripts/test-vectors/20230118-sns-manage-neuron.ts @@ -0,0 +1,105 @@ +import { IDL } from "@dfinity/candid"; +import { Principal } from "@dfinity/principal"; +import { SnsDisburseNeuronParams } from "@dfinity/sns/src"; +import { toDisburseNeuronRequest } from "@dfinity/sns/src/converters/governance.converters"; +import { encodeSnsAccount } from "@dfinity/sns/src/utils/ledger.utils"; +import { arrayOfNumberToUint8Array } from "@dfinity/utils"; +import { ManageNeuronFn } from "./sns-governance.idl"; +import { + bytesToHexString, + caller, + createBlob, + splitPrincipal, + splitString, + writeToJson, +} from "./utils"; + +/** + * ISSUE: https://github.com/Zondax/ledger-icp/issues/187 + */ + +interface Params extends SnsDisburseNeuronParams { + canisterId: Principal; +} + +const createDisburseVector = (params: Params) => { + const rawRequestBody = toDisburseNeuronRequest(params); + const canisterIdOutputs = splitPrincipal(params.canisterId).map( + (data, i, elements) => `Canister Id [${i + 1}/${elements.length}] : ${data}` + ); + const neuronIdString = bytesToHexString(Array.from(params.neuronId.id)); + const neuronIdOutputs = splitString(neuronIdString, "Neuron Id"); + const disburseToAccountStr = encodeSnsAccount({ + owner: caller, + }); + const disburseToOutputs = splitString(disburseToAccountStr, "Disburse to"); + const amountOutputs = ["Amount : " + (params.amount?.toString() ?? "All")]; + const output = [ + "Transaction type : Remove Neuron Permissions", + ...canisterIdOutputs, + ...neuronIdOutputs, + ...disburseToOutputs, + ...amountOutputs, + ]; + return { + blob_candid: createBlob({ + arg: IDL.encode(ManageNeuronFn.argTypes, [rawRequestBody]), + methodName: "manage_neuron", + canisterId: params.canisterId, + }), + output: output.map((element, index) => `${index + 1} | ${element}`), + neuronIdString: neuronIdString, + name: "Disburse Neuron", + canisterId: params.canisterId.toText(), + candid_request: rawRequestBody, + }; +}; + +const main = () => { + try { + const id1 = arrayOfNumberToUint8Array([ + 215, 232, 81, 101, 44, 208, 50, 186, 94, 215, 107, 23, 246, 38, 170, 71, + 130, 159, 6, 229, 35, 90, 13, 88, 14, 150, 211, 114, 119, 41, 234, 36, + ]); + const id2 = arrayOfNumberToUint8Array([ + 163, 110, 20, 60, 134, 231, 228, 113, 231, 199, 25, 80, 100, 135, 207, + 122, 108, 244, 13, 167, 99, 97, 174, 175, 238, 81, 51, 225, 217, 172, 234, + 61, + ]); + const principal1 = Principal.fromText( + "krpzt-buecq-u3umg-7kb7r-j5jpx-twqwa-3ykc4-y3cnk-7kwvw-5bq6z-mae" + ); + const principal2 = Principal.fromText( + "2dfd6-abjpf-eihu7-pwv6m-qnlbt-oszmg-kb26q-rvqms-onmuh-mwiq3-uqe" + ); + const canisterId1 = Principal.fromText("ppmzm-3aaaa-aaaaa-aacpq-cai"); + const canisterId2 = Principal.fromText("s24we-diaaa-aaaaa-aaaka-cai"); + const vectors = [ + createDisburseVector({ + neuronId: { id: id1 }, + amount: BigInt(50_000_000), + canisterId: canisterId1, + }), + createDisburseVector({ + neuronId: { id: id1 }, + canisterId: canisterId1, + }), + createDisburseVector({ + neuronId: { id: id2 }, + amount: BigInt(200_000_000), + canisterId: canisterId2, + }), + ]; + + writeToJson({ + data: vectors, + fileName: "sns-manage-neuron-actions.json", + }); + console.log("File created successfully"); + } catch (error) { + console.log("There was an error"); + console.log(error); + } +}; + +main(); diff --git a/scripts/test-vectors/20230118-sns-remove-hotkey.ts b/scripts/test-vectors/20230118-sns-remove-hotkey.ts new file mode 100644 index 000000000..100cc28ed --- /dev/null +++ b/scripts/test-vectors/20230118-sns-remove-hotkey.ts @@ -0,0 +1,148 @@ +import { IDL } from "@dfinity/candid"; +import { Principal } from "@dfinity/principal"; +import { SnsNeuronPermissionsParams } from "@dfinity/sns/src"; +import { toRemovePermissionsRequest } from "@dfinity/sns/src/converters/governance.converters"; +import { SnsNeuronPermissionType } from "@dfinity/sns/src/enums/governance.enums"; +import { arrayOfNumberToUint8Array } from "@dfinity/utils"; +import { ManageNeuronFn } from "./sns-governance.idl"; +import { + bytesToHexString, + createBlob, + permissionMapper, + splitPrincipal, + splitString, + writeToJson, +} from "./utils"; + +/** + * ISSUE: https://github.com/Zondax/ledger-icp/issues/187 + */ + +interface Params extends SnsNeuronPermissionsParams { + canisterId: Principal; +} + +const createTestVector = (params: Params) => { + const rawRequestBody = toRemovePermissionsRequest(params); + const canisterIdOutputs = splitPrincipal(params.canisterId).map( + (data, i, elements) => `Canister Id [${i + 1}/${elements.length}] : ${data}` + ); + const neuronIdString = bytesToHexString(Array.from(params.neuronId.id)); + const neuronIdOutputs = splitString(neuronIdString, "Neuron Id"); + const principalOutputs = splitPrincipal(params.principal).map( + (data, i, elements) => + `Principal Id [${i + 1}/${elements.length}] : ${data}` + ); + const permissionOutputs = params.permissions.map( + (p) => `Remove Permission : ${permissionMapper[p]}` + ); + const output = [ + "Transaction type : Remove Neuron Permissions", + ...canisterIdOutputs, + ...neuronIdOutputs, + ...principalOutputs, + ...permissionOutputs, + ]; + return { + blob_candid: createBlob({ + arg: IDL.encode(ManageNeuronFn.argTypes, [rawRequestBody]), + methodName: "manage_neuron", + canisterId: params.canisterId, + }), + output: output.map((element, index) => `${index + 1} | ${element}`), + neuronIdString: neuronIdString, + name: "Remove Neuron Permissions", + canisterId: params.canisterId.toText(), + candid_request: rawRequestBody, + }; +}; + +const main = () => { + try { + const id1 = arrayOfNumberToUint8Array([ + 215, 232, 81, 101, 44, 208, 50, 186, 94, 215, 107, 23, 246, 38, 170, 71, + 130, 159, 6, 229, 35, 90, 13, 88, 14, 150, 211, 114, 119, 41, 234, 36, + ]); + const id2 = arrayOfNumberToUint8Array([ + 163, 110, 20, 60, 134, 231, 228, 113, 231, 199, 25, 80, 100, 135, 207, + 122, 108, 244, 13, 167, 99, 97, 174, 175, 238, 81, 51, 225, 217, 172, 234, + 61, + ]); + const principal1 = Principal.fromText( + "krpzt-buecq-u3umg-7kb7r-j5jpx-twqwa-3ykc4-y3cnk-7kwvw-5bq6z-mae" + ); + const principal2 = Principal.fromText( + "2dfd6-abjpf-eihu7-pwv6m-qnlbt-oszmg-kb26q-rvqms-onmuh-mwiq3-uqe" + ); + const canisterId1 = Principal.fromText("ppmzm-3aaaa-aaaaa-aacpq-cai"); + const canisterId2 = Principal.fromText("s24we-diaaa-aaaaa-aaaka-cai"); + const vectors = [ + createTestVector({ + neuronId: { id: id1 }, + principal: principal1, + permissions: [ + SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_VOTE, + SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_SUBMIT_PROPOSAL, + ], + canisterId: canisterId1, + }), + createTestVector({ + neuronId: { id: id1 }, + principal: principal2, + permissions: [ + SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_VOTE, + SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_SUBMIT_PROPOSAL, + ], + canisterId: canisterId1, + }), + createTestVector({ + neuronId: { id: id2 }, + principal: principal2, + permissions: [ + SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_VOTE, + SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_SUBMIT_PROPOSAL, + SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_CONFIGURE_DISSOLVE_STATE, + ], + canisterId: canisterId2, + }), + createTestVector({ + neuronId: { id: id1 }, + principal: principal1, + permissions: [ + SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_VOTE, + SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_DISBURSE, + ], + canisterId: canisterId2, + }), + createTestVector({ + neuronId: { id: id1 }, + principal: principal2, + permissions: [ + SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_DISBURSE, + SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_CONFIGURE_DISSOLVE_STATE, + ], + canisterId: canisterId2, + }), + createTestVector({ + neuronId: { id: id2 }, + principal: principal2, + permissions: [ + SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_MANAGE_VOTING_PERMISSION, + SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_DISBURSE, + ], + canisterId: canisterId1, + }), + ]; + + writeToJson({ + data: vectors, + fileName: "sns-remove-neuron-permissions.json", + }); + console.log("File created successfully"); + } catch (error) { + console.log("There was an error"); + console.log(error); + } +}; + +main(); diff --git a/scripts/test-vectors/sns-manage-neuron-actions.json b/scripts/test-vectors/sns-manage-neuron-actions.json new file mode 100644 index 000000000..dfc1d6555 --- /dev/null +++ b/scripts/test-vectors/sns-manage-neuron-actions.json @@ -0,0 +1,174 @@ +[ + { + "blob_candid": "d9d9f7a167636f6e74656e74a66361726759034a4449444c3d6d7b6c02ba89e5c20478b9ef938008786c01dbb701006d026c02e28bbf1478c2cee0d80c036e686c01ad86ca8305006e066c02b3b0dac30305ad86ca8305076e086c02a9ddf49b0709a290ead30a796c029cb1fa2505ba89e5c204786c006b029992ccd0010bcebee1d3080c6e0d6c01d7ab010e6c01d0e1e9f60c7e6c018dc3b2b303796c01c88ecad50a786b058cb2f18c0710b09b9ba4070cd0fb87af070c90f29afe0711c3a2f6c90e126e136c01a78882820a146c01dbb701786e166c02ea99cff20475b2b8d4960b176c01c2cee0d80c036c02007801196d1a6c01c2cee0d80c1b6e1c6e786d756c0184f9d1761f6e206e796c04dc87d3aa031e8e8ab6f3081eefca8bdf0d1ea5a389b40f1e6e236c1384aead331df0cefc351ee9f1b4471ed2bbc8ef021ee28b959c03219eb493cf031ed8aa8f8f051e9ebddfd6051e81a6cee6051ece89be97061ec7dae0cc0622feeaf491091e93dfe6aa091e86f998bc091ec182ad960a1ef5cedb9b0b1eaf899aba0d21fde7b1fd0d24c2b0c4aa0f1e6e716c0486fef0ea0a0585f2acb20b05fcc8d7e40e26fbbc93ac0f266b02c2a2dd88070c829aa4b40e276e286c04dbb70178cbe4fdc70471fc91f4f8052681d9b08e0a296c05f8aff58a0175aaeff3c60105b1edd6810407ba89e5c2041eb9ef938008786c029db0f1b80200b3c4b1f204056c04efd6e40226ebbedebd0426cbe4fdc70426fc91f4f805266c02e28bbf14788effd6e90e006c0196bdb4e904716b0ac6c0d51025838db4492ae6d6e4ab0678aedd92a2070c9eb481da0b2bd1a8b0ae0c2c97f7e1c30e0c82a1cfcd0e2d97899f8d0f2ed6f4c7ff0f2f6e306c04efd6e4027198abec810171b6f798b20131a696a48708716c01bbb4b09703226c028d86f0fa0b218c8890fb0b056c02b8c789cb01218c8890fb0b056c01b99d9da50b796c01e0a9b302786e376c02a9ddf49b0709d8a38ca80d386b0cbab5f1a40101918bacf10204948c9eb4030afc9fc683050fc6b3bb9106158db2d5920918e0f8fffd0b328bf3afac0d33cde3c8d30d3490efabef0d3589b8b3b30e36a3f3c0ad0f396e3a6c02ad86ca830500cbe2b58b083b013c20d7e851652cd032ba5ed76b17f626aa47829f06e5235a0d580e96d3727729ea24010b000180f0fa02000000006b63616e69737465725f69644a000000000000000101016e696e67726573735f6578706972791b173b68794cdaa4006b6d6574686f645f6e616d656d6d616e6167655f6e6575726f6e6c726571756573745f747970656463616c6c6673656e646572581d19aa3d42c048dd7d14f0cfa0df69a1c1381780f6e9a137abaa6a82e302", + "output": [ + "1 | Transaction type : Remove Neuron Permissions", + "2 | Canister Id [1/1] : ppmzm-3aaaa-aaaaa : aacpq-cai", + "3 | Neuron Id [1/4] : d7e851 : 652cd0 : 32ba5e", + "4 | Neuron Id [2/4] : d76b17 : f626aa : 47829f", + "5 | Neuron Id [3/4] : 06e523 : 5a0d58 : 0e96d3", + "6 | Neuron Id [4/4] : 727729 : ea24", + "7 | Disburse to [1/4] : 5upke- : tazvi- : 6ufqc-", + "8 | Disburse to [2/4] : i3v6r- : j4gpu- : dpwti-", + "9 | Disburse to [3/4] : obhal- : yb5xj- : ue32x-", + "10 | Disburse to [4/4] : ktkql- : rqe", + "11 | Amount : 50000000" + ], + "neuronIdString": "d7e851652cd032ba5ed76b17f626aa47829f06e5235a0d580e96d3727729ea24", + "name": "Disburse Neuron", + "canisterId": "ppmzm-3aaaa-aaaaa-aacpq-cai", + "candid_request": { + "subaccount": { + "0": 215, + "1": 232, + "2": 81, + "3": 101, + "4": 44, + "5": 208, + "6": 50, + "7": 186, + "8": 94, + "9": 215, + "10": 107, + "11": 23, + "12": 246, + "13": 38, + "14": 170, + "15": 71, + "16": 130, + "17": 159, + "18": 6, + "19": 229, + "20": 35, + "21": 90, + "22": 13, + "23": 88, + "24": 14, + "25": 150, + "26": 211, + "27": 114, + "28": 119, + "29": 41, + "30": 234, + "31": 36 + }, + "command": [ + { "Disburse": { "to_account": [], "amount": [{ "e8s": "50000000" }] } } + ] + } + }, + { + "blob_candid": "d9d9f7a167636f6e74656e74a6636172675903424449444c3d6d7b6c02ba89e5c20478b9ef938008786c01dbb701006d026c02e28bbf1478c2cee0d80c036e686c01ad86ca8305006e066c02b3b0dac30305ad86ca8305076e086c02a9ddf49b0709a290ead30a796c029cb1fa2505ba89e5c204786c006b029992ccd0010bcebee1d3080c6e0d6c01d7ab010e6c01d0e1e9f60c7e6c018dc3b2b303796c01c88ecad50a786b058cb2f18c0710b09b9ba4070cd0fb87af070c90f29afe0711c3a2f6c90e126e136c01a78882820a146c01dbb701786e166c02ea99cff20475b2b8d4960b176c01c2cee0d80c036c02007801196d1a6c01c2cee0d80c1b6e1c6e786d756c0184f9d1761f6e206e796c04dc87d3aa031e8e8ab6f3081eefca8bdf0d1ea5a389b40f1e6e236c1384aead331df0cefc351ee9f1b4471ed2bbc8ef021ee28b959c03219eb493cf031ed8aa8f8f051e9ebddfd6051e81a6cee6051ece89be97061ec7dae0cc0622feeaf491091e93dfe6aa091e86f998bc091ec182ad960a1ef5cedb9b0b1eaf899aba0d21fde7b1fd0d24c2b0c4aa0f1e6e716c0486fef0ea0a0585f2acb20b05fcc8d7e40e26fbbc93ac0f266b02c2a2dd88070c829aa4b40e276e286c04dbb70178cbe4fdc70471fc91f4f8052681d9b08e0a296c05f8aff58a0175aaeff3c60105b1edd6810407ba89e5c2041eb9ef938008786c029db0f1b80200b3c4b1f204056c04efd6e40226ebbedebd0426cbe4fdc70426fc91f4f805266c02e28bbf14788effd6e90e006c0196bdb4e904716b0ac6c0d51025838db4492ae6d6e4ab0678aedd92a2070c9eb481da0b2bd1a8b0ae0c2c97f7e1c30e0c82a1cfcd0e2d97899f8d0f2ed6f4c7ff0f2f6e306c04efd6e4027198abec810171b6f798b20131a696a48708716c01bbb4b09703226c028d86f0fa0b218c8890fb0b056c02b8c789cb01218c8890fb0b056c01b99d9da50b796c01e0a9b302786e376c02a9ddf49b0709d8a38ca80d386b0cbab5f1a40101918bacf10204948c9eb4030afc9fc683050fc6b3bb9106158db2d5920918e0f8fffd0b328bf3afac0d33cde3c8d30d3490efabef0d3589b8b3b30e36a3f3c0ad0f396e3a6c02ad86ca830500cbe2b58b083b013c20d7e851652cd032ba5ed76b17f626aa47829f06e5235a0d580e96d3727729ea24010b00006b63616e69737465725f69644a000000000000000101016e696e67726573735f6578706972791b173b68794d63f8406b6d6574686f645f6e616d656d6d616e6167655f6e6575726f6e6c726571756573745f747970656463616c6c6673656e646572581d19aa3d42c048dd7d14f0cfa0df69a1c1381780f6e9a137abaa6a82e302", + "output": [ + "1 | Transaction type : Remove Neuron Permissions", + "2 | Canister Id [1/1] : ppmzm-3aaaa-aaaaa : aacpq-cai", + "3 | Neuron Id [1/4] : d7e851 : 652cd0 : 32ba5e", + "4 | Neuron Id [2/4] : d76b17 : f626aa : 47829f", + "5 | Neuron Id [3/4] : 06e523 : 5a0d58 : 0e96d3", + "6 | Neuron Id [4/4] : 727729 : ea24", + "7 | Disburse to [1/4] : 5upke- : tazvi- : 6ufqc-", + "8 | Disburse to [2/4] : i3v6r- : j4gpu- : dpwti-", + "9 | Disburse to [3/4] : obhal- : yb5xj- : ue32x-", + "10 | Disburse to [4/4] : ktkql- : rqe", + "11 | Amount : All" + ], + "neuronIdString": "d7e851652cd032ba5ed76b17f626aa47829f06e5235a0d580e96d3727729ea24", + "name": "Disburse Neuron", + "canisterId": "ppmzm-3aaaa-aaaaa-aacpq-cai", + "candid_request": { + "subaccount": { + "0": 215, + "1": 232, + "2": 81, + "3": 101, + "4": 44, + "5": 208, + "6": 50, + "7": 186, + "8": 94, + "9": 215, + "10": 107, + "11": 23, + "12": 246, + "13": 38, + "14": 170, + "15": 71, + "16": 130, + "17": 159, + "18": 6, + "19": 229, + "20": 35, + "21": 90, + "22": 13, + "23": 88, + "24": 14, + "25": 150, + "26": 211, + "27": 114, + "28": 119, + "29": 41, + "30": 234, + "31": 36 + }, + "command": [{ "Disburse": { "to_account": [], "amount": [] } }] + } + }, + { + "blob_candid": "d9d9f7a167636f6e74656e74a66361726759034a4449444c3d6d7b6c02ba89e5c20478b9ef938008786c01dbb701006d026c02e28bbf1478c2cee0d80c036e686c01ad86ca8305006e066c02b3b0dac30305ad86ca8305076e086c02a9ddf49b0709a290ead30a796c029cb1fa2505ba89e5c204786c006b029992ccd0010bcebee1d3080c6e0d6c01d7ab010e6c01d0e1e9f60c7e6c018dc3b2b303796c01c88ecad50a786b058cb2f18c0710b09b9ba4070cd0fb87af070c90f29afe0711c3a2f6c90e126e136c01a78882820a146c01dbb701786e166c02ea99cff20475b2b8d4960b176c01c2cee0d80c036c02007801196d1a6c01c2cee0d80c1b6e1c6e786d756c0184f9d1761f6e206e796c04dc87d3aa031e8e8ab6f3081eefca8bdf0d1ea5a389b40f1e6e236c1384aead331df0cefc351ee9f1b4471ed2bbc8ef021ee28b959c03219eb493cf031ed8aa8f8f051e9ebddfd6051e81a6cee6051ece89be97061ec7dae0cc0622feeaf491091e93dfe6aa091e86f998bc091ec182ad960a1ef5cedb9b0b1eaf899aba0d21fde7b1fd0d24c2b0c4aa0f1e6e716c0486fef0ea0a0585f2acb20b05fcc8d7e40e26fbbc93ac0f266b02c2a2dd88070c829aa4b40e276e286c04dbb70178cbe4fdc70471fc91f4f8052681d9b08e0a296c05f8aff58a0175aaeff3c60105b1edd6810407ba89e5c2041eb9ef938008786c029db0f1b80200b3c4b1f204056c04efd6e40226ebbedebd0426cbe4fdc70426fc91f4f805266c02e28bbf14788effd6e90e006c0196bdb4e904716b0ac6c0d51025838db4492ae6d6e4ab0678aedd92a2070c9eb481da0b2bd1a8b0ae0c2c97f7e1c30e0c82a1cfcd0e2d97899f8d0f2ed6f4c7ff0f2f6e306c04efd6e4027198abec810171b6f798b20131a696a48708716c01bbb4b09703226c028d86f0fa0b218c8890fb0b056c02b8c789cb01218c8890fb0b056c01b99d9da50b796c01e0a9b302786e376c02a9ddf49b0709d8a38ca80d386b0cbab5f1a40101918bacf10204948c9eb4030afc9fc683050fc6b3bb9106158db2d5920918e0f8fffd0b328bf3afac0d33cde3c8d30d3490efabef0d3589b8b3b30e36a3f3c0ad0f396e3a6c02ad86ca830500cbe2b58b083b013c20a36e143c86e7e471e7c719506487cf7a6cf40da76361aeafee5133e1d9acea3d010b000100c2eb0b000000006b63616e69737465725f69644a000000000000000101016e696e67726573735f6578706972791b173b68794d827cc06b6d6574686f645f6e616d656d6d616e6167655f6e6575726f6e6c726571756573745f747970656463616c6c6673656e646572581d19aa3d42c048dd7d14f0cfa0df69a1c1381780f6e9a137abaa6a82e302", + "output": [ + "1 | Transaction type : Remove Neuron Permissions", + "2 | Canister Id [1/1] : s24we-diaaa-aaaaa : aaaka-cai", + "3 | Neuron Id [1/4] : a36e14 : 3c86e7 : e471e7", + "4 | Neuron Id [2/4] : c71950 : 6487cf : 7a6cf4", + "5 | Neuron Id [3/4] : 0da763 : 61aeaf : ee5133", + "6 | Neuron Id [4/4] : e1d9ac : ea3d", + "7 | Disburse to [1/4] : 5upke- : tazvi- : 6ufqc-", + "8 | Disburse to [2/4] : i3v6r- : j4gpu- : dpwti-", + "9 | Disburse to [3/4] : obhal- : yb5xj- : ue32x-", + "10 | Disburse to [4/4] : ktkql- : rqe", + "11 | Amount : 200000000" + ], + "neuronIdString": "a36e143c86e7e471e7c719506487cf7a6cf40da76361aeafee5133e1d9acea3d", + "name": "Disburse Neuron", + "canisterId": "s24we-diaaa-aaaaa-aaaka-cai", + "candid_request": { + "subaccount": { + "0": 163, + "1": 110, + "2": 20, + "3": 60, + "4": 134, + "5": 231, + "6": 228, + "7": 113, + "8": 231, + "9": 199, + "10": 25, + "11": 80, + "12": 100, + "13": 135, + "14": 207, + "15": 122, + "16": 108, + "17": 244, + "18": 13, + "19": 167, + "20": 99, + "21": 97, + "22": 174, + "23": 175, + "24": 238, + "25": 81, + "26": 51, + "27": 225, + "28": 217, + "29": 172, + "30": 234, + "31": 61 + }, + "command": [ + { "Disburse": { "to_account": [], "amount": [{ "e8s": "200000000" }] } } + ] + } + } +] diff --git a/scripts/test-vectors/sns-remove-neuron-permissions.json b/scripts/test-vectors/sns-remove-neuron-permissions.json new file mode 100644 index 000000000..231e27202 --- /dev/null +++ b/scripts/test-vectors/sns-remove-neuron-permissions.json @@ -0,0 +1,389 @@ +[ + { + "blob_candid": "d9d9f7a167636f6e74656e74a66361726759036a4449444c3d6d7b6c02ba89e5c20478b9ef938008786c01dbb701006d026c02e28bbf1478c2cee0d80c036e686c01ad86ca8305006e066c02b3b0dac30305ad86ca8305076e086c02a9ddf49b0709a290ead30a796c029cb1fa2505ba89e5c204786c006b029992ccd0010bcebee1d3080c6e0d6c01d7ab010e6c01d0e1e9f60c7e6c018dc3b2b303796c01c88ecad50a786b058cb2f18c0710b09b9ba4070cd0fb87af070c90f29afe0711c3a2f6c90e126e136c01a78882820a146c01dbb701786e166c02ea99cff20475b2b8d4960b176c01c2cee0d80c036c02007801196d1a6c01c2cee0d80c1b6e1c6e786d756c0184f9d1761f6e206e796c04dc87d3aa031e8e8ab6f3081eefca8bdf0d1ea5a389b40f1e6e236c1384aead331df0cefc351ee9f1b4471ed2bbc8ef021ee28b959c03219eb493cf031ed8aa8f8f051e9ebddfd6051e81a6cee6051ece89be97061ec7dae0cc0622feeaf491091e93dfe6aa091e86f998bc091ec182ad960a1ef5cedb9b0b1eaf899aba0d21fde7b1fd0d24c2b0c4aa0f1e6e716c0486fef0ea0a0585f2acb20b05fcc8d7e40e26fbbc93ac0f266b02c2a2dd88070c829aa4b40e276e286c04dbb70178cbe4fdc70471fc91f4f8052681d9b08e0a296c05f8aff58a0175aaeff3c60105b1edd6810407ba89e5c2041eb9ef938008786c029db0f1b80200b3c4b1f204056c04efd6e40226ebbedebd0426cbe4fdc70426fc91f4f805266c02e28bbf14788effd6e90e006c0196bdb4e904716b0ac6c0d51025838db4492ae6d6e4ab0678aedd92a2070c9eb481da0b2bd1a8b0ae0c2c97f7e1c30e0c82a1cfcd0e2d97899f8d0f2ed6f4c7ff0f2f6e306c04efd6e4027198abec810171b6f798b20131a696a48708716c01bbb4b09703226c028d86f0fa0b218c8890fb0b056c02b8c789cb01218c8890fb0b056c01b99d9da50b796c01e0a9b302786e376c02a9ddf49b0709d8a38ca80d386b0cbab5f1a40101918bacf10204948c9eb4030afc9fc683050fc6b3bb9106158db2d5920918e0f8fffd0b328bf3afac0d33cde3c8d30d3490efabef0d3589b8b3b30e36a3f3c0ad0f396e3a6c02ad86ca830500cbe2b58b083b013c20d7e851652cd032ba5ed76b17f626aa47829f06e5235a0d580e96d3727729ea2401080102040000000300000001011d841429ba30df507f14f52fbced0b037850b98d89aafaad5b7430f658026b63616e69737465725f69644a000000000000000101016e696e67726573735f6578706972791b173b6519d68688806b6d6574686f645f6e616d656d6d616e6167655f6e6575726f6e6c726571756573745f747970656463616c6c6673656e646572581d19aa3d42c048dd7d14f0cfa0df69a1c1381780f6e9a137abaa6a82e302", + "output": [ + "1 | Transaction type : Remove Neuron Permissions", + "2 | Canister Id [1/1] : ppmzm-3aaaa-aaaaa : aacpq-cai", + "3 | Neuron Id [1/4] : d7e851 : 652cd0 : 32ba5e", + "4 | Neuron Id [2/4] : d76b17 : f626aa : 47829f", + "5 | Neuron Id [3/4] : 06e523 : 5a0d58 : 0e96d3", + "6 | Neuron Id [4/4] : 727729 : ea24", + "7 | Principal Id [1/2] : krpzt-buecq-u3umg : 7kb7r-j5jpx-twqwa", + "8 | Principal Id [2/2] : 3ykc4-y3cnk-7kwvw : 5bq6z-mae", + "9 | Remove Permission : Vote", + "10 | Remove Permission : Submit Proposal" + ], + "neuronIdString": "d7e851652cd032ba5ed76b17f626aa47829f06e5235a0d580e96d3727729ea24", + "name": "Remove Neuron Permissions", + "canisterId": "ppmzm-3aaaa-aaaaa-aacpq-cai", + "candid_request": { + "subaccount": { + "0": 215, + "1": 232, + "2": 81, + "3": 101, + "4": 44, + "5": 208, + "6": 50, + "7": 186, + "8": 94, + "9": 215, + "10": 107, + "11": 23, + "12": 246, + "13": 38, + "14": 170, + "15": 71, + "16": 130, + "17": 159, + "18": 6, + "19": 229, + "20": 35, + "21": 90, + "22": 13, + "23": 88, + "24": 14, + "25": 150, + "26": 211, + "27": 114, + "28": 119, + "29": 41, + "30": 234, + "31": 36 + }, + "command": [ + { + "RemoveNeuronPermissions": { + "permissions_to_remove": [{ "permissions": { "0": 4, "1": 3 } }], + "principal_id": [ + "krpzt-buecq-u3umg-7kb7r-j5jpx-twqwa-3ykc4-y3cnk-7kwvw-5bq6z-mae" + ] + } + } + ] + } + }, + { + "blob_candid": "d9d9f7a167636f6e74656e74a66361726759036a4449444c3d6d7b6c02ba89e5c20478b9ef938008786c01dbb701006d026c02e28bbf1478c2cee0d80c036e686c01ad86ca8305006e066c02b3b0dac30305ad86ca8305076e086c02a9ddf49b0709a290ead30a796c029cb1fa2505ba89e5c204786c006b029992ccd0010bcebee1d3080c6e0d6c01d7ab010e6c01d0e1e9f60c7e6c018dc3b2b303796c01c88ecad50a786b058cb2f18c0710b09b9ba4070cd0fb87af070c90f29afe0711c3a2f6c90e126e136c01a78882820a146c01dbb701786e166c02ea99cff20475b2b8d4960b176c01c2cee0d80c036c02007801196d1a6c01c2cee0d80c1b6e1c6e786d756c0184f9d1761f6e206e796c04dc87d3aa031e8e8ab6f3081eefca8bdf0d1ea5a389b40f1e6e236c1384aead331df0cefc351ee9f1b4471ed2bbc8ef021ee28b959c03219eb493cf031ed8aa8f8f051e9ebddfd6051e81a6cee6051ece89be97061ec7dae0cc0622feeaf491091e93dfe6aa091e86f998bc091ec182ad960a1ef5cedb9b0b1eaf899aba0d21fde7b1fd0d24c2b0c4aa0f1e6e716c0486fef0ea0a0585f2acb20b05fcc8d7e40e26fbbc93ac0f266b02c2a2dd88070c829aa4b40e276e286c04dbb70178cbe4fdc70471fc91f4f8052681d9b08e0a296c05f8aff58a0175aaeff3c60105b1edd6810407ba89e5c2041eb9ef938008786c029db0f1b80200b3c4b1f204056c04efd6e40226ebbedebd0426cbe4fdc70426fc91f4f805266c02e28bbf14788effd6e90e006c0196bdb4e904716b0ac6c0d51025838db4492ae6d6e4ab0678aedd92a2070c9eb481da0b2bd1a8b0ae0c2c97f7e1c30e0c82a1cfcd0e2d97899f8d0f2ed6f4c7ff0f2f6e306c04efd6e4027198abec810171b6f798b20131a696a48708716c01bbb4b09703226c028d86f0fa0b218c8890fb0b056c02b8c789cb01218c8890fb0b056c01b99d9da50b796c01e0a9b302786e376c02a9ddf49b0709d8a38ca80d386b0cbab5f1a40101918bacf10204948c9eb4030afc9fc683050fc6b3bb9106158db2d5920918e0f8fffd0b328bf3afac0d33cde3c8d30d3490efabef0d3589b8b3b30e36a3f3c0ad0f396e3a6c02ad86ca830500cbe2b58b083b013c20d7e851652cd032ba5ed76b17f626aa47829f06e5235a0d580e96d3727729ea2401080102040000000300000001011d29794883d3efb57cc835619ba5961941d7a11ac192735943b2c886e9026b63616e69737465725f69644a000000000000000101016e696e67726573735f6578706972791b173b6519d7009a806b6d6574686f645f6e616d656d6d616e6167655f6e6575726f6e6c726571756573745f747970656463616c6c6673656e646572581d19aa3d42c048dd7d14f0cfa0df69a1c1381780f6e9a137abaa6a82e302", + "output": [ + "1 | Transaction type : Remove Neuron Permissions", + "2 | Canister Id [1/1] : ppmzm-3aaaa-aaaaa : aacpq-cai", + "3 | Neuron Id [1/4] : d7e851 : 652cd0 : 32ba5e", + "4 | Neuron Id [2/4] : d76b17 : f626aa : 47829f", + "5 | Neuron Id [3/4] : 06e523 : 5a0d58 : 0e96d3", + "6 | Neuron Id [4/4] : 727729 : ea24", + "7 | Principal Id [1/2] : 2dfd6-abjpf-eihu7 : pwv6m-qnlbt-oszmg", + "8 | Principal Id [2/2] : kb26q-rvqms-onmuh : mwiq3-uqe", + "9 | Remove Permission : Vote", + "10 | Remove Permission : Submit Proposal" + ], + "neuronIdString": "d7e851652cd032ba5ed76b17f626aa47829f06e5235a0d580e96d3727729ea24", + "name": "Remove Neuron Permissions", + "canisterId": "ppmzm-3aaaa-aaaaa-aacpq-cai", + "candid_request": { + "subaccount": { + "0": 215, + "1": 232, + "2": 81, + "3": 101, + "4": 44, + "5": 208, + "6": 50, + "7": 186, + "8": 94, + "9": 215, + "10": 107, + "11": 23, + "12": 246, + "13": 38, + "14": 170, + "15": 71, + "16": 130, + "17": 159, + "18": 6, + "19": 229, + "20": 35, + "21": 90, + "22": 13, + "23": 88, + "24": 14, + "25": 150, + "26": 211, + "27": 114, + "28": 119, + "29": 41, + "30": 234, + "31": 36 + }, + "command": [ + { + "RemoveNeuronPermissions": { + "permissions_to_remove": [{ "permissions": { "0": 4, "1": 3 } }], + "principal_id": [ + "2dfd6-abjpf-eihu7-pwv6m-qnlbt-oszmg-kb26q-rvqms-onmuh-mwiq3-uqe" + ] + } + } + ] + } + }, + { + "blob_candid": "d9d9f7a167636f6e74656e74a66361726759036e4449444c3d6d7b6c02ba89e5c20478b9ef938008786c01dbb701006d026c02e28bbf1478c2cee0d80c036e686c01ad86ca8305006e066c02b3b0dac30305ad86ca8305076e086c02a9ddf49b0709a290ead30a796c029cb1fa2505ba89e5c204786c006b029992ccd0010bcebee1d3080c6e0d6c01d7ab010e6c01d0e1e9f60c7e6c018dc3b2b303796c01c88ecad50a786b058cb2f18c0710b09b9ba4070cd0fb87af070c90f29afe0711c3a2f6c90e126e136c01a78882820a146c01dbb701786e166c02ea99cff20475b2b8d4960b176c01c2cee0d80c036c02007801196d1a6c01c2cee0d80c1b6e1c6e786d756c0184f9d1761f6e206e796c04dc87d3aa031e8e8ab6f3081eefca8bdf0d1ea5a389b40f1e6e236c1384aead331df0cefc351ee9f1b4471ed2bbc8ef021ee28b959c03219eb493cf031ed8aa8f8f051e9ebddfd6051e81a6cee6051ece89be97061ec7dae0cc0622feeaf491091e93dfe6aa091e86f998bc091ec182ad960a1ef5cedb9b0b1eaf899aba0d21fde7b1fd0d24c2b0c4aa0f1e6e716c0486fef0ea0a0585f2acb20b05fcc8d7e40e26fbbc93ac0f266b02c2a2dd88070c829aa4b40e276e286c04dbb70178cbe4fdc70471fc91f4f8052681d9b08e0a296c05f8aff58a0175aaeff3c60105b1edd6810407ba89e5c2041eb9ef938008786c029db0f1b80200b3c4b1f204056c04efd6e40226ebbedebd0426cbe4fdc70426fc91f4f805266c02e28bbf14788effd6e90e006c0196bdb4e904716b0ac6c0d51025838db4492ae6d6e4ab0678aedd92a2070c9eb481da0b2bd1a8b0ae0c2c97f7e1c30e0c82a1cfcd0e2d97899f8d0f2ed6f4c7ff0f2f6e306c04efd6e4027198abec810171b6f798b20131a696a48708716c01bbb4b09703226c028d86f0fa0b218c8890fb0b056c02b8c789cb01218c8890fb0b056c01b99d9da50b796c01e0a9b302786e376c02a9ddf49b0709d8a38ca80d386b0cbab5f1a40101918bacf10204948c9eb4030afc9fc683050fc6b3bb9106158db2d5920918e0f8fffd0b328bf3afac0d33cde3c8d30d3490efabef0d3589b8b3b30e36a3f3c0ad0f396e3a6c02ad86ca830500cbe2b58b083b013c20a36e143c86e7e471e7c719506487cf7a6cf40da76361aeafee5133e1d9acea3d0108010304000000030000000100000001011d29794883d3efb57cc835619ba5961941d7a11ac192735943b2c886e9026b63616e69737465725f69644a000000000000000101016e696e67726573735f6578706972791b173b6519d71f1f006b6d6574686f645f6e616d656d6d616e6167655f6e6575726f6e6c726571756573745f747970656463616c6c6673656e646572581d19aa3d42c048dd7d14f0cfa0df69a1c1381780f6e9a137abaa6a82e302", + "output": [ + "1 | Transaction type : Remove Neuron Permissions", + "2 | Canister Id [1/1] : s24we-diaaa-aaaaa : aaaka-cai", + "3 | Neuron Id [1/4] : a36e14 : 3c86e7 : e471e7", + "4 | Neuron Id [2/4] : c71950 : 6487cf : 7a6cf4", + "5 | Neuron Id [3/4] : 0da763 : 61aeaf : ee5133", + "6 | Neuron Id [4/4] : e1d9ac : ea3d", + "7 | Principal Id [1/2] : 2dfd6-abjpf-eihu7 : pwv6m-qnlbt-oszmg", + "8 | Principal Id [2/2] : kb26q-rvqms-onmuh : mwiq3-uqe", + "9 | Remove Permission : Vote", + "10 | Remove Permission : Submit Proposal", + "11 | Remove Permission : Configure Dissolve State" + ], + "neuronIdString": "a36e143c86e7e471e7c719506487cf7a6cf40da76361aeafee5133e1d9acea3d", + "name": "Remove Neuron Permissions", + "canisterId": "s24we-diaaa-aaaaa-aaaka-cai", + "candid_request": { + "subaccount": { + "0": 163, + "1": 110, + "2": 20, + "3": 60, + "4": 134, + "5": 231, + "6": 228, + "7": 113, + "8": 231, + "9": 199, + "10": 25, + "11": 80, + "12": 100, + "13": 135, + "14": 207, + "15": 122, + "16": 108, + "17": 244, + "18": 13, + "19": 167, + "20": 99, + "21": 97, + "22": 174, + "23": 175, + "24": 238, + "25": 81, + "26": 51, + "27": 225, + "28": 217, + "29": 172, + "30": 234, + "31": 61 + }, + "command": [ + { + "RemoveNeuronPermissions": { + "permissions_to_remove": [ + { "permissions": { "0": 4, "1": 3, "2": 1 } } + ], + "principal_id": [ + "2dfd6-abjpf-eihu7-pwv6m-qnlbt-oszmg-kb26q-rvqms-onmuh-mwiq3-uqe" + ] + } + } + ] + } + }, + { + "blob_candid": "d9d9f7a167636f6e74656e74a66361726759036a4449444c3d6d7b6c02ba89e5c20478b9ef938008786c01dbb701006d026c02e28bbf1478c2cee0d80c036e686c01ad86ca8305006e066c02b3b0dac30305ad86ca8305076e086c02a9ddf49b0709a290ead30a796c029cb1fa2505ba89e5c204786c006b029992ccd0010bcebee1d3080c6e0d6c01d7ab010e6c01d0e1e9f60c7e6c018dc3b2b303796c01c88ecad50a786b058cb2f18c0710b09b9ba4070cd0fb87af070c90f29afe0711c3a2f6c90e126e136c01a78882820a146c01dbb701786e166c02ea99cff20475b2b8d4960b176c01c2cee0d80c036c02007801196d1a6c01c2cee0d80c1b6e1c6e786d756c0184f9d1761f6e206e796c04dc87d3aa031e8e8ab6f3081eefca8bdf0d1ea5a389b40f1e6e236c1384aead331df0cefc351ee9f1b4471ed2bbc8ef021ee28b959c03219eb493cf031ed8aa8f8f051e9ebddfd6051e81a6cee6051ece89be97061ec7dae0cc0622feeaf491091e93dfe6aa091e86f998bc091ec182ad960a1ef5cedb9b0b1eaf899aba0d21fde7b1fd0d24c2b0c4aa0f1e6e716c0486fef0ea0a0585f2acb20b05fcc8d7e40e26fbbc93ac0f266b02c2a2dd88070c829aa4b40e276e286c04dbb70178cbe4fdc70471fc91f4f8052681d9b08e0a296c05f8aff58a0175aaeff3c60105b1edd6810407ba89e5c2041eb9ef938008786c029db0f1b80200b3c4b1f204056c04efd6e40226ebbedebd0426cbe4fdc70426fc91f4f805266c02e28bbf14788effd6e90e006c0196bdb4e904716b0ac6c0d51025838db4492ae6d6e4ab0678aedd92a2070c9eb481da0b2bd1a8b0ae0c2c97f7e1c30e0c82a1cfcd0e2d97899f8d0f2ed6f4c7ff0f2f6e306c04efd6e4027198abec810171b6f798b20131a696a48708716c01bbb4b09703226c028d86f0fa0b218c8890fb0b056c02b8c789cb01218c8890fb0b056c01b99d9da50b796c01e0a9b302786e376c02a9ddf49b0709d8a38ca80d386b0cbab5f1a40101918bacf10204948c9eb4030afc9fc683050fc6b3bb9106158db2d5920918e0f8fffd0b328bf3afac0d33cde3c8d30d3490efabef0d3589b8b3b30e36a3f3c0ad0f396e3a6c02ad86ca830500cbe2b58b083b013c20d7e851652cd032ba5ed76b17f626aa47829f06e5235a0d580e96d3727729ea2401080102040000000500000001011d841429ba30df507f14f52fbced0b037850b98d89aafaad5b7430f658026b63616e69737465725f69644a000000000000000101016e696e67726573735f6578706972791b173b6519d72e61406b6d6574686f645f6e616d656d6d616e6167655f6e6575726f6e6c726571756573745f747970656463616c6c6673656e646572581d19aa3d42c048dd7d14f0cfa0df69a1c1381780f6e9a137abaa6a82e302", + "output": [ + "1 | Transaction type : Remove Neuron Permissions", + "2 | Canister Id [1/1] : s24we-diaaa-aaaaa : aaaka-cai", + "3 | Neuron Id [1/4] : d7e851 : 652cd0 : 32ba5e", + "4 | Neuron Id [2/4] : d76b17 : f626aa : 47829f", + "5 | Neuron Id [3/4] : 06e523 : 5a0d58 : 0e96d3", + "6 | Neuron Id [4/4] : 727729 : ea24", + "7 | Principal Id [1/2] : krpzt-buecq-u3umg : 7kb7r-j5jpx-twqwa", + "8 | Principal Id [2/2] : 3ykc4-y3cnk-7kwvw : 5bq6z-mae", + "9 | Remove Permission : Vote", + "10 | Remove Permission : Disburse Neuron" + ], + "neuronIdString": "d7e851652cd032ba5ed76b17f626aa47829f06e5235a0d580e96d3727729ea24", + "name": "Remove Neuron Permissions", + "canisterId": "s24we-diaaa-aaaaa-aaaka-cai", + "candid_request": { + "subaccount": { + "0": 215, + "1": 232, + "2": 81, + "3": 101, + "4": 44, + "5": 208, + "6": 50, + "7": 186, + "8": 94, + "9": 215, + "10": 107, + "11": 23, + "12": 246, + "13": 38, + "14": 170, + "15": 71, + "16": 130, + "17": 159, + "18": 6, + "19": 229, + "20": 35, + "21": 90, + "22": 13, + "23": 88, + "24": 14, + "25": 150, + "26": 211, + "27": 114, + "28": 119, + "29": 41, + "30": 234, + "31": 36 + }, + "command": [ + { + "RemoveNeuronPermissions": { + "permissions_to_remove": [{ "permissions": { "0": 4, "1": 5 } }], + "principal_id": [ + "krpzt-buecq-u3umg-7kb7r-j5jpx-twqwa-3ykc4-y3cnk-7kwvw-5bq6z-mae" + ] + } + } + ] + } + }, + { + "blob_candid": "d9d9f7a167636f6e74656e74a66361726759036a4449444c3d6d7b6c02ba89e5c20478b9ef938008786c01dbb701006d026c02e28bbf1478c2cee0d80c036e686c01ad86ca8305006e066c02b3b0dac30305ad86ca8305076e086c02a9ddf49b0709a290ead30a796c029cb1fa2505ba89e5c204786c006b029992ccd0010bcebee1d3080c6e0d6c01d7ab010e6c01d0e1e9f60c7e6c018dc3b2b303796c01c88ecad50a786b058cb2f18c0710b09b9ba4070cd0fb87af070c90f29afe0711c3a2f6c90e126e136c01a78882820a146c01dbb701786e166c02ea99cff20475b2b8d4960b176c01c2cee0d80c036c02007801196d1a6c01c2cee0d80c1b6e1c6e786d756c0184f9d1761f6e206e796c04dc87d3aa031e8e8ab6f3081eefca8bdf0d1ea5a389b40f1e6e236c1384aead331df0cefc351ee9f1b4471ed2bbc8ef021ee28b959c03219eb493cf031ed8aa8f8f051e9ebddfd6051e81a6cee6051ece89be97061ec7dae0cc0622feeaf491091e93dfe6aa091e86f998bc091ec182ad960a1ef5cedb9b0b1eaf899aba0d21fde7b1fd0d24c2b0c4aa0f1e6e716c0486fef0ea0a0585f2acb20b05fcc8d7e40e26fbbc93ac0f266b02c2a2dd88070c829aa4b40e276e286c04dbb70178cbe4fdc70471fc91f4f8052681d9b08e0a296c05f8aff58a0175aaeff3c60105b1edd6810407ba89e5c2041eb9ef938008786c029db0f1b80200b3c4b1f204056c04efd6e40226ebbedebd0426cbe4fdc70426fc91f4f805266c02e28bbf14788effd6e90e006c0196bdb4e904716b0ac6c0d51025838db4492ae6d6e4ab0678aedd92a2070c9eb481da0b2bd1a8b0ae0c2c97f7e1c30e0c82a1cfcd0e2d97899f8d0f2ed6f4c7ff0f2f6e306c04efd6e4027198abec810171b6f798b20131a696a48708716c01bbb4b09703226c028d86f0fa0b218c8890fb0b056c02b8c789cb01218c8890fb0b056c01b99d9da50b796c01e0a9b302786e376c02a9ddf49b0709d8a38ca80d386b0cbab5f1a40101918bacf10204948c9eb4030afc9fc683050fc6b3bb9106158db2d5920918e0f8fffd0b328bf3afac0d33cde3c8d30d3490efabef0d3589b8b3b30e36a3f3c0ad0f396e3a6c02ad86ca830500cbe2b58b083b013c20d7e851652cd032ba5ed76b17f626aa47829f06e5235a0d580e96d3727729ea2401080102050000000100000001011d29794883d3efb57cc835619ba5961941d7a11ac192735943b2c886e9026b63616e69737465725f69644a000000000000000101016e696e67726573735f6578706972791b173b6519d73da3806b6d6574686f645f6e616d656d6d616e6167655f6e6575726f6e6c726571756573745f747970656463616c6c6673656e646572581d19aa3d42c048dd7d14f0cfa0df69a1c1381780f6e9a137abaa6a82e302", + "output": [ + "1 | Transaction type : Remove Neuron Permissions", + "2 | Canister Id [1/1] : s24we-diaaa-aaaaa : aaaka-cai", + "3 | Neuron Id [1/4] : d7e851 : 652cd0 : 32ba5e", + "4 | Neuron Id [2/4] : d76b17 : f626aa : 47829f", + "5 | Neuron Id [3/4] : 06e523 : 5a0d58 : 0e96d3", + "6 | Neuron Id [4/4] : 727729 : ea24", + "7 | Principal Id [1/2] : 2dfd6-abjpf-eihu7 : pwv6m-qnlbt-oszmg", + "8 | Principal Id [2/2] : kb26q-rvqms-onmuh : mwiq3-uqe", + "9 | Remove Permission : Disburse Neuron", + "10 | Remove Permission : Configure Dissolve State" + ], + "neuronIdString": "d7e851652cd032ba5ed76b17f626aa47829f06e5235a0d580e96d3727729ea24", + "name": "Remove Neuron Permissions", + "canisterId": "s24we-diaaa-aaaaa-aaaka-cai", + "candid_request": { + "subaccount": { + "0": 215, + "1": 232, + "2": 81, + "3": 101, + "4": 44, + "5": 208, + "6": 50, + "7": 186, + "8": 94, + "9": 215, + "10": 107, + "11": 23, + "12": 246, + "13": 38, + "14": 170, + "15": 71, + "16": 130, + "17": 159, + "18": 6, + "19": 229, + "20": 35, + "21": 90, + "22": 13, + "23": 88, + "24": 14, + "25": 150, + "26": 211, + "27": 114, + "28": 119, + "29": 41, + "30": 234, + "31": 36 + }, + "command": [ + { + "RemoveNeuronPermissions": { + "permissions_to_remove": [{ "permissions": { "0": 5, "1": 1 } }], + "principal_id": [ + "2dfd6-abjpf-eihu7-pwv6m-qnlbt-oszmg-kb26q-rvqms-onmuh-mwiq3-uqe" + ] + } + } + ] + } + }, + { + "blob_candid": "d9d9f7a167636f6e74656e74a66361726759036a4449444c3d6d7b6c02ba89e5c20478b9ef938008786c01dbb701006d026c02e28bbf1478c2cee0d80c036e686c01ad86ca8305006e066c02b3b0dac30305ad86ca8305076e086c02a9ddf49b0709a290ead30a796c029cb1fa2505ba89e5c204786c006b029992ccd0010bcebee1d3080c6e0d6c01d7ab010e6c01d0e1e9f60c7e6c018dc3b2b303796c01c88ecad50a786b058cb2f18c0710b09b9ba4070cd0fb87af070c90f29afe0711c3a2f6c90e126e136c01a78882820a146c01dbb701786e166c02ea99cff20475b2b8d4960b176c01c2cee0d80c036c02007801196d1a6c01c2cee0d80c1b6e1c6e786d756c0184f9d1761f6e206e796c04dc87d3aa031e8e8ab6f3081eefca8bdf0d1ea5a389b40f1e6e236c1384aead331df0cefc351ee9f1b4471ed2bbc8ef021ee28b959c03219eb493cf031ed8aa8f8f051e9ebddfd6051e81a6cee6051ece89be97061ec7dae0cc0622feeaf491091e93dfe6aa091e86f998bc091ec182ad960a1ef5cedb9b0b1eaf899aba0d21fde7b1fd0d24c2b0c4aa0f1e6e716c0486fef0ea0a0585f2acb20b05fcc8d7e40e26fbbc93ac0f266b02c2a2dd88070c829aa4b40e276e286c04dbb70178cbe4fdc70471fc91f4f8052681d9b08e0a296c05f8aff58a0175aaeff3c60105b1edd6810407ba89e5c2041eb9ef938008786c029db0f1b80200b3c4b1f204056c04efd6e40226ebbedebd0426cbe4fdc70426fc91f4f805266c02e28bbf14788effd6e90e006c0196bdb4e904716b0ac6c0d51025838db4492ae6d6e4ab0678aedd92a2070c9eb481da0b2bd1a8b0ae0c2c97f7e1c30e0c82a1cfcd0e2d97899f8d0f2ed6f4c7ff0f2f6e306c04efd6e4027198abec810171b6f798b20131a696a48708716c01bbb4b09703226c028d86f0fa0b218c8890fb0b056c02b8c789cb01218c8890fb0b056c01b99d9da50b796c01e0a9b302786e376c02a9ddf49b0709d8a38ca80d386b0cbab5f1a40101918bacf10204948c9eb4030afc9fc683050fc6b3bb9106158db2d5920918e0f8fffd0b328bf3afac0d33cde3c8d30d3490efabef0d3589b8b3b30e36a3f3c0ad0f396e3a6c02ad86ca830500cbe2b58b083b013c20a36e143c86e7e471e7c719506487cf7a6cf40da76361aeafee5133e1d9acea3d010801020a0000000500000001011d29794883d3efb57cc835619ba5961941d7a11ac192735943b2c886e9026b63616e69737465725f69644a000000000000000101016e696e67726573735f6578706972791b173b6519d75c28006b6d6574686f645f6e616d656d6d616e6167655f6e6575726f6e6c726571756573745f747970656463616c6c6673656e646572581d19aa3d42c048dd7d14f0cfa0df69a1c1381780f6e9a137abaa6a82e302", + "output": [ + "1 | Transaction type : Remove Neuron Permissions", + "2 | Canister Id [1/1] : ppmzm-3aaaa-aaaaa : aacpq-cai", + "3 | Neuron Id [1/4] : a36e14 : 3c86e7 : e471e7", + "4 | Neuron Id [2/4] : c71950 : 6487cf : 7a6cf4", + "5 | Neuron Id [3/4] : 0da763 : 61aeaf : ee5133", + "6 | Neuron Id [4/4] : e1d9ac : ea3d", + "7 | Principal Id [1/2] : 2dfd6-abjpf-eihu7 : pwv6m-qnlbt-oszmg", + "8 | Principal Id [2/2] : kb26q-rvqms-onmuh : mwiq3-uqe", + "9 | Remove Permission : Manage Voting Permission", + "10 | Remove Permission : Disburse Neuron" + ], + "neuronIdString": "a36e143c86e7e471e7c719506487cf7a6cf40da76361aeafee5133e1d9acea3d", + "name": "Remove Neuron Permissions", + "canisterId": "ppmzm-3aaaa-aaaaa-aacpq-cai", + "candid_request": { + "subaccount": { + "0": 163, + "1": 110, + "2": 20, + "3": 60, + "4": 134, + "5": 231, + "6": 228, + "7": 113, + "8": 231, + "9": 199, + "10": 25, + "11": 80, + "12": 100, + "13": 135, + "14": 207, + "15": 122, + "16": 108, + "17": 244, + "18": 13, + "19": 167, + "20": 99, + "21": 97, + "22": 174, + "23": 175, + "24": 238, + "25": 81, + "26": 51, + "27": 225, + "28": 217, + "29": 172, + "30": 234, + "31": 61 + }, + "command": [ + { + "RemoveNeuronPermissions": { + "permissions_to_remove": [{ "permissions": { "0": 10, "1": 5 } }], + "principal_id": [ + "2dfd6-abjpf-eihu7-pwv6m-qnlbt-oszmg-kb26q-rvqms-onmuh-mwiq3-uqe" + ] + } + } + ] + } + } +] diff --git a/scripts/test-vectors/utils.ts b/scripts/test-vectors/utils.ts index d2a53a01b..c57021d1b 100644 --- a/scripts/test-vectors/utils.ts +++ b/scripts/test-vectors/utils.ts @@ -8,6 +8,7 @@ import { import { Principal } from "@dfinity/principal"; import { writeFileSync } from "fs"; import { MAINNET_GOVERNANCE_CANISTER_ID } from "../../packages/nns/src/constants/canister_ids"; +import { SnsNeuronPermissionType } from "../../packages/sns/src/enums/governance.enums"; /** * Changes needed to match the `arg` inside the blob_proto with the Hardware Wallet CLI blob. @@ -39,6 +40,10 @@ function _prepareCborForLedger( // Default delta for ingress expiry is 5 minutes. const DEFAULT_INGRESS_EXPIRY_DELTA_IN_MSECS = 5 * 60 * 1000; +export const caller = Principal.fromText( + "5upke-tazvi-6ufqc-i3v6r-j4gpu-dpwti-obhal-yb5xj-ue32x-ktkql-rqe" +); + const createCallRequest = ({ arg, methodName, @@ -54,9 +59,7 @@ const createCallRequest = ({ arg, // sender: new AnonymousIdentity().getPrincipal(), // Use this principal to match the principal used in Zondax integration tests. - sender: Principal.fromText( - "5upke-tazvi-6ufqc-i3v6r-j4gpu-dpwti-obhal-yb5xj-ue32x-ktkql-rqe" - ), + sender: caller, ingress_expiry: new Expiry(DEFAULT_INGRESS_EXPIRY_DELTA_IN_MSECS), }); @@ -116,3 +119,56 @@ export const splitPrincipal = (principal: Principal): string[] => { } return lines; }; + +export const splitString = ( + textToSplit: string, + screenText: string +): string[] => { + return ( + textToSplit + .match(/.{1,6}/g) + ?.reduce((acc, curr) => { + if (acc.length === 0) { + return [curr]; + } + const lastItem = acc[acc.length - 1]; + if (lastItem.length > 18) { + return [...acc, curr]; + } else if (lastItem.length < 18) { + return [...acc.slice(0, -1), `${lastItem} : ${curr}`]; + } + return acc; + }, [] as string[]) + ?.map( + (data, i, elements) => + `${screenText} [${i + 1}/${elements.length}] : ${data}` + ) || [] + ); +}; + +export const permissionMapper: Record = { + [SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_VOTE]: "Vote", + [SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_SUBMIT_PROPOSAL]: + "Submit Proposal", + [SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_CONFIGURE_DISSOLVE_STATE]: + "Configure Dissolve State", + [SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_DISBURSE]: "Disburse Neuron", + [SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_DISBURSE_MATURITY]: + "Disburse Maturity", + [SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_MANAGE_PRINCIPALS]: + "Manage Principals", + [SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_MANAGE_VOTING_PERMISSION]: + "Manage Voting Permission", + [SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_SPLIT]: "Split Neuron", + [SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_STAKE_MATURITY]: + "Stake Maturity", + [SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_UNSPECIFIED]: "Unspecified", + [SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_MERGE_MATURITY]: + "Merge Maturity", +}; + +export const bytesToHexString = (bytes: number[]): string => + bytes.reduce( + (str, byte) => `${str}${byte.toString(16).padStart(2, "0")}`, + "" + ); From 314215d9bbce90487f99f9987ace2da2f97f1eb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lloren=C3=A7?= Date: Wed, 18 Jan 2023 17:19:35 +0100 Subject: [PATCH 09/31] 20230118: Issues #188 and #189 --- .../20230118-sns-manage-neuron.ts | 131 +++++++++++++++++- .../20230118-sns-remove-hotkey.ts | 2 +- 2 files changed, 125 insertions(+), 8 deletions(-) diff --git a/scripts/test-vectors/20230118-sns-manage-neuron.ts b/scripts/test-vectors/20230118-sns-manage-neuron.ts index 80231fb57..48bee310d 100644 --- a/scripts/test-vectors/20230118-sns-manage-neuron.ts +++ b/scripts/test-vectors/20230118-sns-manage-neuron.ts @@ -1,7 +1,12 @@ import { IDL } from "@dfinity/candid"; +import { E8S_PER_TOKEN } from "@dfinity/nns/src/constants/constants"; import { Principal } from "@dfinity/principal"; -import { SnsDisburseNeuronParams } from "@dfinity/sns/src"; -import { toDisburseNeuronRequest } from "@dfinity/sns/src/converters/governance.converters"; +import { SnsDisburseNeuronParams, SnsNeuronId } from "@dfinity/sns/src"; +import { + toDisburseNeuronRequest, + toStartDissolvingNeuronRequest, + toStopDissolvingNeuronRequest, +} from "@dfinity/sns/src/converters/governance.converters"; import { encodeSnsAccount } from "@dfinity/sns/src/utils/ledger.utils"; import { arrayOfNumberToUint8Array } from "@dfinity/utils"; import { ManageNeuronFn } from "./sns-governance.idl"; @@ -15,14 +20,14 @@ import { } from "./utils"; /** - * ISSUE: https://github.com/Zondax/ledger-icp/issues/187 + * Issue: https://github.com/Zondax/ledger-icp/issues/189 */ -interface Params extends SnsDisburseNeuronParams { +interface DisburseParams extends SnsDisburseNeuronParams { canisterId: Principal; } -const createDisburseVector = (params: Params) => { +const createDisburseVector = (params: DisburseParams) => { const rawRequestBody = toDisburseNeuronRequest(params); const canisterIdOutputs = splitPrincipal(params.canisterId).map( (data, i, elements) => `Canister Id [${i + 1}/${elements.length}] : ${data}` @@ -33,9 +38,12 @@ const createDisburseVector = (params: Params) => { owner: caller, }); const disburseToOutputs = splitString(disburseToAccountStr, "Disburse to"); - const amountOutputs = ["Amount : " + (params.amount?.toString() ?? "All")]; + const amount = params.amount + ? Number(params.amount) / Number(E8S_PER_TOKEN) + : "All"; + const amountOutputs = [`Amount : ${amount}`]; const output = [ - "Transaction type : Remove Neuron Permissions", + "Transaction type : Disburse Neuron", ...canisterIdOutputs, ...neuronIdOutputs, ...disburseToOutputs, @@ -55,6 +63,63 @@ const createDisburseVector = (params: Params) => { }; }; +interface SetDissolveParams { + canisterId: Principal; + neuronId: SnsNeuronId; +} + +const createStopDissolveVector = (params: SetDissolveParams) => { + const rawRequestBody = toStopDissolvingNeuronRequest(params.neuronId); + const canisterIdOutputs = splitPrincipal(params.canisterId).map( + (data, i, elements) => `Canister Id [${i + 1}/${elements.length}] : ${data}` + ); + const neuronIdString = bytesToHexString(Array.from(params.neuronId.id)); + const neuronIdOutputs = splitString(neuronIdString, "Neuron Id"); + const output = [ + "Transaction type : Stop Dissolve Neuron", + ...canisterIdOutputs, + ...neuronIdOutputs, + ]; + return { + blob_candid: createBlob({ + arg: IDL.encode(ManageNeuronFn.argTypes, [rawRequestBody]), + methodName: "manage_neuron", + canisterId: params.canisterId, + }), + output: output.map((element, index) => `${index + 1} | ${element}`), + neuronIdString: neuronIdString, + name: "Stop Dissolve Neuron", + canisterId: params.canisterId.toText(), + candid_request: rawRequestBody, + }; +}; + +const createStartDissolveVector = (params: SetDissolveParams) => { + const rawRequestBody = toStartDissolvingNeuronRequest(params.neuronId); + const canisterIdOutputs = splitPrincipal(params.canisterId).map( + (data, i, elements) => `Canister Id [${i + 1}/${elements.length}] : ${data}` + ); + const neuronIdString = bytesToHexString(Array.from(params.neuronId.id)); + const neuronIdOutputs = splitString(neuronIdString, "Neuron Id"); + const output = [ + "Transaction type : Start Dissolve Neuron", + ...canisterIdOutputs, + ...neuronIdOutputs, + ]; + return { + blob_candid: createBlob({ + arg: IDL.encode(ManageNeuronFn.argTypes, [rawRequestBody]), + methodName: "manage_neuron", + canisterId: params.canisterId, + }), + output: output.map((element, index) => `${index + 1} | ${element}`), + neuronIdString: neuronIdString, + name: "Start Dissolve Neuron", + canisterId: params.canisterId.toText(), + candid_request: rawRequestBody, + }; +}; + const main = () => { try { const id1 = arrayOfNumberToUint8Array([ @@ -72,6 +137,14 @@ const main = () => { const principal2 = Principal.fromText( "2dfd6-abjpf-eihu7-pwv6m-qnlbt-oszmg-kb26q-rvqms-onmuh-mwiq3-uqe" ); + const snsAccount1 = { + owner: principal1, + subaccount: id1, + }; + const snsAccount2 = { + owner: principal2, + subaccount: id2, + }; const canisterId1 = Principal.fromText("ppmzm-3aaaa-aaaaa-aacpq-cai"); const canisterId2 = Principal.fromText("s24we-diaaa-aaaaa-aaaka-cai"); const vectors = [ @@ -89,6 +162,50 @@ const main = () => { amount: BigInt(200_000_000), canisterId: canisterId2, }), + createDisburseVector({ + neuronId: { id: id2 }, + amount: BigInt(200_000_000), + toAccount: snsAccount1, + canisterId: canisterId2, + }), + createDisburseVector({ + neuronId: { id: id1 }, + amount: BigInt(2870_000_000), + toAccount: snsAccount2, + canisterId: canisterId1, + }), + createStartDissolveVector({ + neuronId: { id: id1 }, + canisterId: canisterId1, + }), + createStartDissolveVector({ + neuronId: { id: id2 }, + canisterId: canisterId1, + }), + createStartDissolveVector({ + neuronId: { id: id1 }, + canisterId: canisterId2, + }), + createStartDissolveVector({ + neuronId: { id: id2 }, + canisterId: canisterId2, + }), + createStopDissolveVector({ + neuronId: { id: id1 }, + canisterId: canisterId1, + }), + createStopDissolveVector({ + neuronId: { id: id2 }, + canisterId: canisterId1, + }), + createStopDissolveVector({ + neuronId: { id: id1 }, + canisterId: canisterId2, + }), + createStopDissolveVector({ + neuronId: { id: id2 }, + canisterId: canisterId2, + }), ]; writeToJson({ diff --git a/scripts/test-vectors/20230118-sns-remove-hotkey.ts b/scripts/test-vectors/20230118-sns-remove-hotkey.ts index 100cc28ed..4d5fd125e 100644 --- a/scripts/test-vectors/20230118-sns-remove-hotkey.ts +++ b/scripts/test-vectors/20230118-sns-remove-hotkey.ts @@ -15,7 +15,7 @@ import { } from "./utils"; /** - * ISSUE: https://github.com/Zondax/ledger-icp/issues/187 + * Issue: https://github.com/Zondax/ledger-icp/issues/188 */ interface Params extends SnsNeuronPermissionsParams { From c0e398664a171577de1e637433d0925e8f2e4006 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lloren=C3=A7?= Date: Mon, 23 Jan 2023 11:12:08 +0100 Subject: [PATCH 10/31] 20230118: ICRC-1 Test Vectors --- .../20230118-sns-manage-neuron.ts | 4 +- scripts/test-vectors/20230123-icrc-1.ts | 258 ++++++++++++++++++ scripts/test-vectors/sns-ledger.idl.ts | 79 ++++++ scripts/test-vectors/utils.ts | 25 +- 4 files changed, 360 insertions(+), 6 deletions(-) create mode 100644 scripts/test-vectors/20230123-icrc-1.ts create mode 100644 scripts/test-vectors/sns-ledger.idl.ts diff --git a/scripts/test-vectors/20230118-sns-manage-neuron.ts b/scripts/test-vectors/20230118-sns-manage-neuron.ts index 48bee310d..e8d4d44cf 100644 --- a/scripts/test-vectors/20230118-sns-manage-neuron.ts +++ b/scripts/test-vectors/20230118-sns-manage-neuron.ts @@ -12,8 +12,8 @@ import { arrayOfNumberToUint8Array } from "@dfinity/utils"; import { ManageNeuronFn } from "./sns-governance.idl"; import { bytesToHexString, - caller, createBlob, + defaultCaller, splitPrincipal, splitString, writeToJson, @@ -35,7 +35,7 @@ const createDisburseVector = (params: DisburseParams) => { const neuronIdString = bytesToHexString(Array.from(params.neuronId.id)); const neuronIdOutputs = splitString(neuronIdString, "Neuron Id"); const disburseToAccountStr = encodeSnsAccount({ - owner: caller, + owner: defaultCaller, }); const disburseToOutputs = splitString(disburseToAccountStr, "Disburse to"); const amount = params.amount diff --git a/scripts/test-vectors/20230123-icrc-1.ts b/scripts/test-vectors/20230123-icrc-1.ts new file mode 100644 index 000000000..5c79da9a3 --- /dev/null +++ b/scripts/test-vectors/20230123-icrc-1.ts @@ -0,0 +1,258 @@ +import { IDL } from "@dfinity/candid"; +import { E8S_PER_TOKEN } from "@dfinity/nns/src/constants/constants"; +import { Principal } from "@dfinity/principal"; +import { toTransferArg } from "@dfinity/sns/src/converters/ledger.converters"; +import { TransferParams } from "@dfinity/sns/src/types/ledger.params"; +import { + arrayOfNumberToUint8Array, + fromNullable, + numberToUint8Array, + uint8ArrayToBigInt, +} from "@dfinity/utils"; +import { MAINNET_LEDGER_CANISTER_ID } from "../../packages/nns/src/constants/canister_ids"; +import { transferFn } from "./sns-ledger.idl"; +import { + createBlob, + defaultCaller, + splitAccount, + splitPrincipal, + writeToJson, +} from "./utils"; + +/** + * Issue: PENDING + */ + +interface Params extends TransferParams { + canisterId: Principal; + owner: Principal; +} + +// Fee is optional, if not provided, it will be set to 10000 which is the ICP fee +const icpFeeE8s = 10000; + +const createTestVector = (params: Params) => { + const rawRequestBody = toTransferArg(params); + const isICP = + params.canisterId.toText() === MAINNET_LEDGER_CANISTER_ID.toText(); + + let outputTxType = isICP ? "Send ICP" : "Send Tokens"; + const canisterIdOutputs = splitPrincipal(params.canisterId).map( + (data, i, elements) => `Canister Id [${i + 1}/${elements.length}] : ${data}` + ); + + const fromOutputs = splitAccount( + { + owner: params.owner, + subaccount: params.from_subaccount, + }, + "From account" + ); + const toOutputs = splitAccount( + { + owner: params.to.owner, + subaccount: fromNullable(params.to.subaccount), + }, + "To account" + ); + + const amountToken = Number(params.amount) / Number(E8S_PER_TOKEN); + const paymentOutput = isICP + ? `Payment (ICP) : ${amountToken}` + : `Payment (Tokens) : ${amountToken}`; + const feeToken = Number(params.fee ?? icpFeeE8s) / Number(E8S_PER_TOKEN); + const feeOutput = isICP + ? `Maximum fee (ICP) : ${feeToken}` + : `Maximum fee (Tokens) : ${feeToken}`; + const memoOutput = + params.memo !== undefined + ? `Memo : ${uint8ArrayToBigInt(params.memo).toString()}` + : "Memo : 0"; + + const output = [ + outputTxType, + ...(isICP ? [] : canisterIdOutputs), + ...fromOutputs, + ...toOutputs, + paymentOutput, + feeOutput, + memoOutput, + ]; + return { + blob_candid: createBlob({ + arg: IDL.encode(transferFn.argTypes, [rawRequestBody]), + methodName: "icrc1_transfer", + canisterId: params.canisterId, + caller: params.owner, + }), + output: output.map((element, index) => `${index + 1} | ${element}`), + isICP, + name: "ICRC1 Transfer", + canisterId: params.canisterId.toText(), + caller: params.owner.toText() ?? defaultCaller.toText(), + candid_request: rawRequestBody, + }; +}; + +const main = () => { + try { + const subaccount1 = arrayOfNumberToUint8Array([ + 215, 232, 81, 101, 44, 208, 50, 186, 94, 215, 107, 23, 246, 38, 170, 71, + 130, 159, 6, 229, 35, 90, 13, 88, 14, 150, 211, 114, 119, 41, 234, 36, + ]); + const subaccount2 = arrayOfNumberToUint8Array([ + 163, 110, 20, 60, 134, 231, 228, 113, 231, 199, 25, 80, 100, 135, 207, + 122, 108, 244, 13, 167, 99, 97, 174, 175, 238, 81, 51, 225, 217, 172, 234, + 61, + ]); + const principal1 = Principal.fromText( + "krpzt-buecq-u3umg-7kb7r-j5jpx-twqwa-3ykc4-y3cnk-7kwvw-5bq6z-mae" + ); + const principal2 = Principal.fromText( + "2dfd6-abjpf-eihu7-pwv6m-qnlbt-oszmg-kb26q-rvqms-onmuh-mwiq3-uqe" + ); + const canisterId1 = Principal.fromText("ppmzm-3aaaa-aaaaa-aacpq-cai"); + const canisterId2 = Principal.fromText("s24we-diaaa-aaaaa-aaaka-cai"); + const vectors = [ + createTestVector({ + owner: principal1, + to: { + owner: principal2, + subaccount: [], + }, + amount: BigInt(100_000_000), + canisterId: canisterId1, + }), + createTestVector({ + owner: principal1, + to: { + owner: principal2, + subaccount: [], + }, + amount: BigInt(100_000_000), + from_subaccount: subaccount1, + fee: BigInt(10_000), + canisterId: canisterId1, + created_at_time: BigInt(1629200000000000000), + }), + createTestVector({ + owner: principal1, + to: { + owner: principal2, + subaccount: [subaccount2], + }, + amount: BigInt(330_000_000), + from_subaccount: subaccount1, + fee: BigInt(10_000), + canisterId: canisterId1, + created_at_time: BigInt(1629200000000000000), + }), + createTestVector({ + owner: principal1, + to: { + owner: principal2, + subaccount: [subaccount2], + }, + amount: BigInt(330_000_000), + memo: numberToUint8Array(11223312), + fee: BigInt(30_000), + canisterId: canisterId2, + }), + createTestVector({ + owner: principal2, + to: { + owner: principal1, + subaccount: [], + }, + amount: BigInt(314_000_000), + memo: numberToUint8Array(11223312), + canisterId: canisterId1, + }), + createTestVector({ + owner: principal2, + to: { + owner: principal1, + subaccount: [subaccount1], + }, + amount: BigInt(1331_400_000), + memo: numberToUint8Array(11223312), + from_subaccount: subaccount2, + fee: BigInt(20_000), + canisterId: canisterId1, + }), + createTestVector({ + owner: principal1, + to: { + owner: principal2, + subaccount: [], + }, + amount: BigInt(100_000_000), + canisterId: MAINNET_LEDGER_CANISTER_ID, + }), + createTestVector({ + owner: principal2, + to: { + owner: principal1, + subaccount: [subaccount1], + }, + amount: BigInt(31_400_000), + canisterId: MAINNET_LEDGER_CANISTER_ID, + }), + createTestVector({ + owner: principal2, + to: { + owner: principal1, + subaccount: [subaccount1], + }, + amount: BigInt(31_400_000), + from_subaccount: subaccount2, + canisterId: MAINNET_LEDGER_CANISTER_ID, + }), + createTestVector({ + owner: principal2, + to: { + owner: principal1, + subaccount: [subaccount1], + }, + amount: BigInt(31_400_000), + memo: numberToUint8Array(11223312), + canisterId: MAINNET_LEDGER_CANISTER_ID, + }), + createTestVector({ + owner: principal2, + to: { + owner: principal1, + subaccount: [subaccount1], + }, + amount: BigInt(31_400_000), + fee: BigInt(100_000), + canisterId: MAINNET_LEDGER_CANISTER_ID, + created_at_time: BigInt(1629200000000000000), + }), + createTestVector({ + owner: principal2, + to: { + owner: principal1, + subaccount: [subaccount1], + }, + amount: BigInt(131_400_000), + fee: BigInt(30_000), + from_subaccount: subaccount2, + memo: numberToUint8Array(11223312), + canisterId: MAINNET_LEDGER_CANISTER_ID, + created_at_time: BigInt(1629200000000000000), + }), + ]; + + writeToJson({ + data: vectors, + fileName: "icrc-1.json", + }); + console.log("File created successfully"); + } catch (error) { + console.log("There was an error"); + console.log(error); + } +}; + +main(); diff --git a/scripts/test-vectors/sns-ledger.idl.ts b/scripts/test-vectors/sns-ledger.idl.ts new file mode 100644 index 000000000..fa98f2eaf --- /dev/null +++ b/scripts/test-vectors/sns-ledger.idl.ts @@ -0,0 +1,79 @@ +import { IDL } from "@dfinity/candid"; + +const Value = IDL.Variant({ + Int: IDL.Int, + Nat: IDL.Nat, + Blob: IDL.Vec(IDL.Nat8), + Text: IDL.Text, +}); +const Subaccount = IDL.Vec(IDL.Nat8); +const Account = IDL.Record({ + owner: IDL.Principal, + subaccount: IDL.Opt(Subaccount), +}); +const InitArgs = IDL.Record({ + token_symbol: IDL.Text, + transfer_fee: IDL.Nat64, + metadata: IDL.Vec(IDL.Tuple(IDL.Text, Value)), + minting_account: Account, + initial_balances: IDL.Vec(IDL.Tuple(Account, IDL.Nat64)), + archive_options: IDL.Record({ + num_blocks_to_archive: IDL.Nat64, + trigger_threshold: IDL.Nat64, + max_message_size_bytes: IDL.Opt(IDL.Nat64), + cycles_for_archive_creation: IDL.Opt(IDL.Nat64), + node_max_memory_size_bytes: IDL.Opt(IDL.Nat64), + controller_id: IDL.Principal, + }), + token_name: IDL.Text, +}); +const Tokens = IDL.Nat; +const Timestamp = IDL.Nat64; +const TransferArg = IDL.Record({ + to: Account, + fee: IDL.Opt(Tokens), + memo: IDL.Opt(IDL.Vec(IDL.Nat8)), + from_subaccount: IDL.Opt(Subaccount), + created_at_time: IDL.Opt(Timestamp), + amount: Tokens, +}); +const BlockIndex = IDL.Nat; +const TransferError = IDL.Variant({ + GenericError: IDL.Record({ + message: IDL.Text, + error_code: IDL.Nat, + }), + TemporarilyUnavailable: IDL.Null, + BadBurn: IDL.Record({ min_burn_amount: Tokens }), + Duplicate: IDL.Record({ duplicate_of: BlockIndex }), + BadFee: IDL.Record({ expected_fee: Tokens }), + CreatedInFuture: IDL.Record({ ledger_time: IDL.Nat64 }), + TooOld: IDL.Null, + InsufficientFunds: IDL.Record({ balance: Tokens }), +}); +const TransferResult = IDL.Variant({ + Ok: BlockIndex, + Err: TransferError, +}); +const service = IDL.Service({ + icrc1_balance_of: IDL.Func([Account], [Tokens], ["query"]), + icrc1_decimals: IDL.Func([], [IDL.Nat8], ["query"]), + icrc1_fee: IDL.Func([], [Tokens], ["query"]), + icrc1_metadata: IDL.Func( + [], + [IDL.Vec(IDL.Tuple(IDL.Text, Value))], + ["query"] + ), + icrc1_minting_account: IDL.Func([], [IDL.Opt(Account)], ["query"]), + icrc1_name: IDL.Func([], [IDL.Text], ["query"]), + icrc1_supported_standards: IDL.Func( + [], + [IDL.Vec(IDL.Record({ url: IDL.Text, name: IDL.Text }))], + ["query"] + ), + icrc1_symbol: IDL.Func([], [IDL.Text], ["query"]), + icrc1_total_supply: IDL.Func([], [Tokens], ["query"]), + icrc1_transfer: IDL.Func([TransferArg], [TransferResult], []), +}); + +export const transferFn = IDL.Func([TransferArg], [TransferResult], []); diff --git a/scripts/test-vectors/utils.ts b/scripts/test-vectors/utils.ts index c57021d1b..4a7110590 100644 --- a/scripts/test-vectors/utils.ts +++ b/scripts/test-vectors/utils.ts @@ -6,6 +6,8 @@ import { SubmitRequestType, } from "@dfinity/agent"; import { Principal } from "@dfinity/principal"; +import type { SnsAccount } from "@dfinity/sns/src"; +import { encodeSnsAccount } from "@dfinity/sns/src/utils/ledger.utils"; import { writeFileSync } from "fs"; import { MAINNET_GOVERNANCE_CANISTER_ID } from "../../packages/nns/src/constants/canister_ids"; import { SnsNeuronPermissionType } from "../../packages/sns/src/enums/governance.enums"; @@ -40,7 +42,7 @@ function _prepareCborForLedger( // Default delta for ingress expiry is 5 minutes. const DEFAULT_INGRESS_EXPIRY_DELTA_IN_MSECS = 5 * 60 * 1000; -export const caller = Principal.fromText( +export const defaultCaller = Principal.fromText( "5upke-tazvi-6ufqc-i3v6r-j4gpu-dpwti-obhal-yb5xj-ue32x-ktkql-rqe" ); @@ -48,18 +50,19 @@ const createCallRequest = ({ arg, methodName, canisterId, + caller, }: { arg: ArrayBuffer; methodName: string; canisterId?: Principal; + caller?: Principal; }): CallRequest => ({ request_type: SubmitRequestType.Call, canister_id: canisterId ?? MAINNET_GOVERNANCE_CANISTER_ID, method_name: methodName, arg, - // sender: new AnonymousIdentity().getPrincipal(), // Use this principal to match the principal used in Zondax integration tests. - sender: caller, + sender: caller ?? defaultCaller, ingress_expiry: new Expiry(DEFAULT_INGRESS_EXPIRY_DELTA_IN_MSECS), }); @@ -67,14 +70,18 @@ export const createBlob = ({ arg, methodName, canisterId, + caller, }: { arg: ArrayBuffer; methodName: string; canisterId?: Principal; + caller?: Principal; }): string => { const callRequestCandid = createCallRequest({ arg, methodName, + caller, + canisterId, }); const candidBlob = _prepareCborForLedger(callRequestCandid); return Buffer.from(candidBlob).toString("hex"); @@ -126,7 +133,7 @@ export const splitString = ( ): string[] => { return ( textToSplit - .match(/.{1,6}/g) + .match(/.{1,8}/g) ?.reduce((acc, curr) => { if (acc.length === 0) { return [curr]; @@ -146,6 +153,16 @@ export const splitString = ( ); }; +export const splitAccount = ( + account: SnsAccount, + screenText: string +): string[] => { + return splitPrincipal(Principal.fromText(encodeSnsAccount(account))).map( + (data, i, elements) => + `${screenText} [${i + 1}/${elements.length}] : ${data}` + ); +}; + export const permissionMapper: Record = { [SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_VOTE]: "Vote", [SnsNeuronPermissionType.NEURON_PERMISSION_TYPE_SUBMIT_PROPOSAL]: From 7f74a60b24db837701d4ed175b71c142e671032b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lloren=C3=A7?= Date: Tue, 24 Jan 2023 09:35:28 +0100 Subject: [PATCH 11/31] Test vectors 20231223 --- scripts/test-vectors/20230123-icrc-1.ts | 34 ++++++++++++++++++++----- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/scripts/test-vectors/20230123-icrc-1.ts b/scripts/test-vectors/20230123-icrc-1.ts index 5c79da9a3..1fcde95f9 100644 --- a/scripts/test-vectors/20230123-icrc-1.ts +++ b/scripts/test-vectors/20230123-icrc-1.ts @@ -20,7 +20,19 @@ import { } from "./utils"; /** - * Issue: PENDING + * Issue: https://github.com/Zondax/ledger-icp/issues/190 + */ + +/** + * Specific business logic. + * + * - When is ICP and when not. + * - Convert memo to bigint. + * - When to show fee and when not. + * - Default fee for ICP. + * - Textual representation of accounts. + * - How to create the "source" account. + * - When to show "ICP" and when "Tokens". */ interface Params extends TransferParams { @@ -29,7 +41,7 @@ interface Params extends TransferParams { } // Fee is optional, if not provided, it will be set to 10000 which is the ICP fee -const icpFeeE8s = 10000; +const ICP_DEFAULT_FEE_E8S = 10_000; const createTestVector = (params: Params) => { const rawRequestBody = toTransferArg(params); @@ -60,10 +72,18 @@ const createTestVector = (params: Params) => { const paymentOutput = isICP ? `Payment (ICP) : ${amountToken}` : `Payment (Tokens) : ${amountToken}`; - const feeToken = Number(params.fee ?? icpFeeE8s) / Number(E8S_PER_TOKEN); - const feeOutput = isICP - ? `Maximum fee (ICP) : ${feeToken}` - : `Maximum fee (Tokens) : ${feeToken}`; + + // Do not show fee if it's not present in the request body. + // Except if it's ICP, in which case we always show the fee. + let feeOutput: string | undefined; + if (isICP || params.fee !== undefined) { + const feeToken = + Number(params.fee ?? ICP_DEFAULT_FEE_E8S) / Number(E8S_PER_TOKEN); + feeOutput = isICP + ? `Maximum fee (ICP) : ${feeToken}` + : `Maximum fee (Tokens) : ${feeToken}`; + } + const memoOutput = params.memo !== undefined ? `Memo : ${uint8ArrayToBigInt(params.memo).toString()}` @@ -75,7 +95,7 @@ const createTestVector = (params: Params) => { ...fromOutputs, ...toOutputs, paymentOutput, - feeOutput, + ...(feeOutput !== undefined ? [feeOutput] : []), memoOutput, ]; return { From f3b1859dcc6c516016ef8fb7681c1e3e2eb105b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lloren=C3=A7?= Date: Wed, 25 Jan 2023 09:24:22 +0100 Subject: [PATCH 12/31] Test Vectors: 20230125 SNS Stake Maturity --- .../20230125-sns-stake-maturity.ts | 103 +++++ .../sns-manage-neuron-actions.json | 174 -------- .../sns-remove-neuron-permissions.json | 389 ------------------ 3 files changed, 103 insertions(+), 563 deletions(-) create mode 100644 scripts/test-vectors/20230125-sns-stake-maturity.ts delete mode 100644 scripts/test-vectors/sns-manage-neuron-actions.json delete mode 100644 scripts/test-vectors/sns-remove-neuron-permissions.json diff --git a/scripts/test-vectors/20230125-sns-stake-maturity.ts b/scripts/test-vectors/20230125-sns-stake-maturity.ts new file mode 100644 index 000000000..1018d75d1 --- /dev/null +++ b/scripts/test-vectors/20230125-sns-stake-maturity.ts @@ -0,0 +1,103 @@ +import { IDL } from "@dfinity/candid"; +import { Principal } from "@dfinity/principal"; +import { SnsNeuronStakeMaturityParams } from "@dfinity/sns/src"; +import { toStakeMaturityRequest } from "@dfinity/sns/src/converters/governance.converters"; +import { arrayOfNumberToUint8Array } from "@dfinity/utils"; +import { ManageNeuronFn } from "./sns-governance.idl"; +import { + bytesToHexString, + createBlob, + splitPrincipal, + splitString, + writeToJson, +} from "./utils"; + +/** + * Issue: https://github.com/Zondax/ledger-icp/issues/192 + */ + +interface StakeMaturityParams extends SnsNeuronStakeMaturityParams { + canisterId: Principal; +} + +const createStakeMaturityVector = (params: StakeMaturityParams) => { + const rawRequestBody = toStakeMaturityRequest(params); + const canisterIdOutputs = splitPrincipal(params.canisterId).map( + (data, i, elements) => `Canister Id [${i + 1}/${elements.length}] : ${data}` + ); + const neuronIdString = bytesToHexString(Array.from(params.neuronId.id)); + const neuronIdOutputs = splitString(neuronIdString, "Neuron Id"); + const percentageOutput = `Percentage to stake : ${ + params.percentageToStake ?? 100 + }`; + const output = [ + "Transaction type : Stake Maturity Neuron", + ...canisterIdOutputs, + ...neuronIdOutputs, + percentageOutput, + ]; + return { + blob_candid: createBlob({ + arg: IDL.encode(ManageNeuronFn.argTypes, [rawRequestBody]), + methodName: "manage_neuron", + canisterId: params.canisterId, + }), + output: output.map((element, index) => `${index + 1} | ${element}`), + neuronIdString: neuronIdString, + name: "Stake Maturity Neuron", + canisterId: params.canisterId.toText(), + candid_request: rawRequestBody, + }; +}; + +const main = () => { + try { + const id1 = arrayOfNumberToUint8Array([ + 215, 232, 81, 101, 44, 208, 50, 186, 94, 215, 107, 23, 246, 38, 170, 71, + 130, 159, 6, 229, 35, 90, 13, 88, 14, 150, 211, 114, 119, 41, 234, 36, + ]); + const id2 = arrayOfNumberToUint8Array([ + 163, 110, 20, 60, 134, 231, 228, 113, 231, 199, 25, 80, 100, 135, 207, + 122, 108, 244, 13, 167, 99, 97, 174, 175, 238, 81, 51, 225, 217, 172, 234, + 61, + ]); + const canisterId1 = Principal.fromText("ppmzm-3aaaa-aaaaa-aacpq-cai"); + const canisterId2 = Principal.fromText("s24we-diaaa-aaaaa-aaaka-cai"); + const vectors = [ + createStakeMaturityVector({ + neuronId: { id: id1 }, + canisterId: canisterId1, + }), + createStakeMaturityVector({ + neuronId: { id: id2 }, + canisterId: canisterId1, + }), + createStakeMaturityVector({ + neuronId: { id: id1 }, + canisterId: canisterId2, + percentageToStake: 50, + }), + createStakeMaturityVector({ + neuronId: { id: id2 }, + canisterId: canisterId2, + percentageToStake: 100, + }), + createStakeMaturityVector({ + neuronId: { id: id1 }, + canisterId: canisterId1, + percentageToStake: 33, + }), + ]; + + writeToJson({ + data: vectors, + fileName: "sns-stake-maturity.json", + }); + console.log("File created successfully"); + } catch (error) { + console.log("There was an error"); + console.log(error); + } +}; + +main(); diff --git a/scripts/test-vectors/sns-manage-neuron-actions.json b/scripts/test-vectors/sns-manage-neuron-actions.json deleted file mode 100644 index dfc1d6555..000000000 --- a/scripts/test-vectors/sns-manage-neuron-actions.json +++ /dev/null @@ -1,174 +0,0 @@ -[ - { - "blob_candid": "d9d9f7a167636f6e74656e74a66361726759034a4449444c3d6d7b6c02ba89e5c20478b9ef938008786c01dbb701006d026c02e28bbf1478c2cee0d80c036e686c01ad86ca8305006e066c02b3b0dac30305ad86ca8305076e086c02a9ddf49b0709a290ead30a796c029cb1fa2505ba89e5c204786c006b029992ccd0010bcebee1d3080c6e0d6c01d7ab010e6c01d0e1e9f60c7e6c018dc3b2b303796c01c88ecad50a786b058cb2f18c0710b09b9ba4070cd0fb87af070c90f29afe0711c3a2f6c90e126e136c01a78882820a146c01dbb701786e166c02ea99cff20475b2b8d4960b176c01c2cee0d80c036c02007801196d1a6c01c2cee0d80c1b6e1c6e786d756c0184f9d1761f6e206e796c04dc87d3aa031e8e8ab6f3081eefca8bdf0d1ea5a389b40f1e6e236c1384aead331df0cefc351ee9f1b4471ed2bbc8ef021ee28b959c03219eb493cf031ed8aa8f8f051e9ebddfd6051e81a6cee6051ece89be97061ec7dae0cc0622feeaf491091e93dfe6aa091e86f998bc091ec182ad960a1ef5cedb9b0b1eaf899aba0d21fde7b1fd0d24c2b0c4aa0f1e6e716c0486fef0ea0a0585f2acb20b05fcc8d7e40e26fbbc93ac0f266b02c2a2dd88070c829aa4b40e276e286c04dbb70178cbe4fdc70471fc91f4f8052681d9b08e0a296c05f8aff58a0175aaeff3c60105b1edd6810407ba89e5c2041eb9ef938008786c029db0f1b80200b3c4b1f204056c04efd6e40226ebbedebd0426cbe4fdc70426fc91f4f805266c02e28bbf14788effd6e90e006c0196bdb4e904716b0ac6c0d51025838db4492ae6d6e4ab0678aedd92a2070c9eb481da0b2bd1a8b0ae0c2c97f7e1c30e0c82a1cfcd0e2d97899f8d0f2ed6f4c7ff0f2f6e306c04efd6e4027198abec810171b6f798b20131a696a48708716c01bbb4b09703226c028d86f0fa0b218c8890fb0b056c02b8c789cb01218c8890fb0b056c01b99d9da50b796c01e0a9b302786e376c02a9ddf49b0709d8a38ca80d386b0cbab5f1a40101918bacf10204948c9eb4030afc9fc683050fc6b3bb9106158db2d5920918e0f8fffd0b328bf3afac0d33cde3c8d30d3490efabef0d3589b8b3b30e36a3f3c0ad0f396e3a6c02ad86ca830500cbe2b58b083b013c20d7e851652cd032ba5ed76b17f626aa47829f06e5235a0d580e96d3727729ea24010b000180f0fa02000000006b63616e69737465725f69644a000000000000000101016e696e67726573735f6578706972791b173b68794cdaa4006b6d6574686f645f6e616d656d6d616e6167655f6e6575726f6e6c726571756573745f747970656463616c6c6673656e646572581d19aa3d42c048dd7d14f0cfa0df69a1c1381780f6e9a137abaa6a82e302", - "output": [ - "1 | Transaction type : Remove Neuron Permissions", - "2 | Canister Id [1/1] : ppmzm-3aaaa-aaaaa : aacpq-cai", - "3 | Neuron Id [1/4] : d7e851 : 652cd0 : 32ba5e", - "4 | Neuron Id [2/4] : d76b17 : f626aa : 47829f", - "5 | Neuron Id [3/4] : 06e523 : 5a0d58 : 0e96d3", - "6 | Neuron Id [4/4] : 727729 : ea24", - "7 | Disburse to [1/4] : 5upke- : tazvi- : 6ufqc-", - "8 | Disburse to [2/4] : i3v6r- : j4gpu- : dpwti-", - "9 | Disburse to [3/4] : obhal- : yb5xj- : ue32x-", - "10 | Disburse to [4/4] : ktkql- : rqe", - "11 | Amount : 50000000" - ], - "neuronIdString": "d7e851652cd032ba5ed76b17f626aa47829f06e5235a0d580e96d3727729ea24", - "name": "Disburse Neuron", - "canisterId": "ppmzm-3aaaa-aaaaa-aacpq-cai", - "candid_request": { - "subaccount": { - "0": 215, - "1": 232, - "2": 81, - "3": 101, - "4": 44, - "5": 208, - "6": 50, - "7": 186, - "8": 94, - "9": 215, - "10": 107, - "11": 23, - "12": 246, - "13": 38, - "14": 170, - "15": 71, - "16": 130, - "17": 159, - "18": 6, - "19": 229, - "20": 35, - "21": 90, - "22": 13, - "23": 88, - "24": 14, - "25": 150, - "26": 211, - "27": 114, - "28": 119, - "29": 41, - "30": 234, - "31": 36 - }, - "command": [ - { "Disburse": { "to_account": [], "amount": [{ "e8s": "50000000" }] } } - ] - } - }, - { - "blob_candid": "d9d9f7a167636f6e74656e74a6636172675903424449444c3d6d7b6c02ba89e5c20478b9ef938008786c01dbb701006d026c02e28bbf1478c2cee0d80c036e686c01ad86ca8305006e066c02b3b0dac30305ad86ca8305076e086c02a9ddf49b0709a290ead30a796c029cb1fa2505ba89e5c204786c006b029992ccd0010bcebee1d3080c6e0d6c01d7ab010e6c01d0e1e9f60c7e6c018dc3b2b303796c01c88ecad50a786b058cb2f18c0710b09b9ba4070cd0fb87af070c90f29afe0711c3a2f6c90e126e136c01a78882820a146c01dbb701786e166c02ea99cff20475b2b8d4960b176c01c2cee0d80c036c02007801196d1a6c01c2cee0d80c1b6e1c6e786d756c0184f9d1761f6e206e796c04dc87d3aa031e8e8ab6f3081eefca8bdf0d1ea5a389b40f1e6e236c1384aead331df0cefc351ee9f1b4471ed2bbc8ef021ee28b959c03219eb493cf031ed8aa8f8f051e9ebddfd6051e81a6cee6051ece89be97061ec7dae0cc0622feeaf491091e93dfe6aa091e86f998bc091ec182ad960a1ef5cedb9b0b1eaf899aba0d21fde7b1fd0d24c2b0c4aa0f1e6e716c0486fef0ea0a0585f2acb20b05fcc8d7e40e26fbbc93ac0f266b02c2a2dd88070c829aa4b40e276e286c04dbb70178cbe4fdc70471fc91f4f8052681d9b08e0a296c05f8aff58a0175aaeff3c60105b1edd6810407ba89e5c2041eb9ef938008786c029db0f1b80200b3c4b1f204056c04efd6e40226ebbedebd0426cbe4fdc70426fc91f4f805266c02e28bbf14788effd6e90e006c0196bdb4e904716b0ac6c0d51025838db4492ae6d6e4ab0678aedd92a2070c9eb481da0b2bd1a8b0ae0c2c97f7e1c30e0c82a1cfcd0e2d97899f8d0f2ed6f4c7ff0f2f6e306c04efd6e4027198abec810171b6f798b20131a696a48708716c01bbb4b09703226c028d86f0fa0b218c8890fb0b056c02b8c789cb01218c8890fb0b056c01b99d9da50b796c01e0a9b302786e376c02a9ddf49b0709d8a38ca80d386b0cbab5f1a40101918bacf10204948c9eb4030afc9fc683050fc6b3bb9106158db2d5920918e0f8fffd0b328bf3afac0d33cde3c8d30d3490efabef0d3589b8b3b30e36a3f3c0ad0f396e3a6c02ad86ca830500cbe2b58b083b013c20d7e851652cd032ba5ed76b17f626aa47829f06e5235a0d580e96d3727729ea24010b00006b63616e69737465725f69644a000000000000000101016e696e67726573735f6578706972791b173b68794d63f8406b6d6574686f645f6e616d656d6d616e6167655f6e6575726f6e6c726571756573745f747970656463616c6c6673656e646572581d19aa3d42c048dd7d14f0cfa0df69a1c1381780f6e9a137abaa6a82e302", - "output": [ - "1 | Transaction type : Remove Neuron Permissions", - "2 | Canister Id [1/1] : ppmzm-3aaaa-aaaaa : aacpq-cai", - "3 | Neuron Id [1/4] : d7e851 : 652cd0 : 32ba5e", - "4 | Neuron Id [2/4] : d76b17 : f626aa : 47829f", - "5 | Neuron Id [3/4] : 06e523 : 5a0d58 : 0e96d3", - "6 | Neuron Id [4/4] : 727729 : ea24", - "7 | Disburse to [1/4] : 5upke- : tazvi- : 6ufqc-", - "8 | Disburse to [2/4] : i3v6r- : j4gpu- : dpwti-", - "9 | Disburse to [3/4] : obhal- : yb5xj- : ue32x-", - "10 | Disburse to [4/4] : ktkql- : rqe", - "11 | Amount : All" - ], - "neuronIdString": "d7e851652cd032ba5ed76b17f626aa47829f06e5235a0d580e96d3727729ea24", - "name": "Disburse Neuron", - "canisterId": "ppmzm-3aaaa-aaaaa-aacpq-cai", - "candid_request": { - "subaccount": { - "0": 215, - "1": 232, - "2": 81, - "3": 101, - "4": 44, - "5": 208, - "6": 50, - "7": 186, - "8": 94, - "9": 215, - "10": 107, - "11": 23, - "12": 246, - "13": 38, - "14": 170, - "15": 71, - "16": 130, - "17": 159, - "18": 6, - "19": 229, - "20": 35, - "21": 90, - "22": 13, - "23": 88, - "24": 14, - "25": 150, - "26": 211, - "27": 114, - "28": 119, - "29": 41, - "30": 234, - "31": 36 - }, - "command": [{ "Disburse": { "to_account": [], "amount": [] } }] - } - }, - { - "blob_candid": "d9d9f7a167636f6e74656e74a66361726759034a4449444c3d6d7b6c02ba89e5c20478b9ef938008786c01dbb701006d026c02e28bbf1478c2cee0d80c036e686c01ad86ca8305006e066c02b3b0dac30305ad86ca8305076e086c02a9ddf49b0709a290ead30a796c029cb1fa2505ba89e5c204786c006b029992ccd0010bcebee1d3080c6e0d6c01d7ab010e6c01d0e1e9f60c7e6c018dc3b2b303796c01c88ecad50a786b058cb2f18c0710b09b9ba4070cd0fb87af070c90f29afe0711c3a2f6c90e126e136c01a78882820a146c01dbb701786e166c02ea99cff20475b2b8d4960b176c01c2cee0d80c036c02007801196d1a6c01c2cee0d80c1b6e1c6e786d756c0184f9d1761f6e206e796c04dc87d3aa031e8e8ab6f3081eefca8bdf0d1ea5a389b40f1e6e236c1384aead331df0cefc351ee9f1b4471ed2bbc8ef021ee28b959c03219eb493cf031ed8aa8f8f051e9ebddfd6051e81a6cee6051ece89be97061ec7dae0cc0622feeaf491091e93dfe6aa091e86f998bc091ec182ad960a1ef5cedb9b0b1eaf899aba0d21fde7b1fd0d24c2b0c4aa0f1e6e716c0486fef0ea0a0585f2acb20b05fcc8d7e40e26fbbc93ac0f266b02c2a2dd88070c829aa4b40e276e286c04dbb70178cbe4fdc70471fc91f4f8052681d9b08e0a296c05f8aff58a0175aaeff3c60105b1edd6810407ba89e5c2041eb9ef938008786c029db0f1b80200b3c4b1f204056c04efd6e40226ebbedebd0426cbe4fdc70426fc91f4f805266c02e28bbf14788effd6e90e006c0196bdb4e904716b0ac6c0d51025838db4492ae6d6e4ab0678aedd92a2070c9eb481da0b2bd1a8b0ae0c2c97f7e1c30e0c82a1cfcd0e2d97899f8d0f2ed6f4c7ff0f2f6e306c04efd6e4027198abec810171b6f798b20131a696a48708716c01bbb4b09703226c028d86f0fa0b218c8890fb0b056c02b8c789cb01218c8890fb0b056c01b99d9da50b796c01e0a9b302786e376c02a9ddf49b0709d8a38ca80d386b0cbab5f1a40101918bacf10204948c9eb4030afc9fc683050fc6b3bb9106158db2d5920918e0f8fffd0b328bf3afac0d33cde3c8d30d3490efabef0d3589b8b3b30e36a3f3c0ad0f396e3a6c02ad86ca830500cbe2b58b083b013c20a36e143c86e7e471e7c719506487cf7a6cf40da76361aeafee5133e1d9acea3d010b000100c2eb0b000000006b63616e69737465725f69644a000000000000000101016e696e67726573735f6578706972791b173b68794d827cc06b6d6574686f645f6e616d656d6d616e6167655f6e6575726f6e6c726571756573745f747970656463616c6c6673656e646572581d19aa3d42c048dd7d14f0cfa0df69a1c1381780f6e9a137abaa6a82e302", - "output": [ - "1 | Transaction type : Remove Neuron Permissions", - "2 | Canister Id [1/1] : s24we-diaaa-aaaaa : aaaka-cai", - "3 | Neuron Id [1/4] : a36e14 : 3c86e7 : e471e7", - "4 | Neuron Id [2/4] : c71950 : 6487cf : 7a6cf4", - "5 | Neuron Id [3/4] : 0da763 : 61aeaf : ee5133", - "6 | Neuron Id [4/4] : e1d9ac : ea3d", - "7 | Disburse to [1/4] : 5upke- : tazvi- : 6ufqc-", - "8 | Disburse to [2/4] : i3v6r- : j4gpu- : dpwti-", - "9 | Disburse to [3/4] : obhal- : yb5xj- : ue32x-", - "10 | Disburse to [4/4] : ktkql- : rqe", - "11 | Amount : 200000000" - ], - "neuronIdString": "a36e143c86e7e471e7c719506487cf7a6cf40da76361aeafee5133e1d9acea3d", - "name": "Disburse Neuron", - "canisterId": "s24we-diaaa-aaaaa-aaaka-cai", - "candid_request": { - "subaccount": { - "0": 163, - "1": 110, - "2": 20, - "3": 60, - "4": 134, - "5": 231, - "6": 228, - "7": 113, - "8": 231, - "9": 199, - "10": 25, - "11": 80, - "12": 100, - "13": 135, - "14": 207, - "15": 122, - "16": 108, - "17": 244, - "18": 13, - "19": 167, - "20": 99, - "21": 97, - "22": 174, - "23": 175, - "24": 238, - "25": 81, - "26": 51, - "27": 225, - "28": 217, - "29": 172, - "30": 234, - "31": 61 - }, - "command": [ - { "Disburse": { "to_account": [], "amount": [{ "e8s": "200000000" }] } } - ] - } - } -] diff --git a/scripts/test-vectors/sns-remove-neuron-permissions.json b/scripts/test-vectors/sns-remove-neuron-permissions.json deleted file mode 100644 index 231e27202..000000000 --- a/scripts/test-vectors/sns-remove-neuron-permissions.json +++ /dev/null @@ -1,389 +0,0 @@ -[ - { - "blob_candid": "d9d9f7a167636f6e74656e74a66361726759036a4449444c3d6d7b6c02ba89e5c20478b9ef938008786c01dbb701006d026c02e28bbf1478c2cee0d80c036e686c01ad86ca8305006e066c02b3b0dac30305ad86ca8305076e086c02a9ddf49b0709a290ead30a796c029cb1fa2505ba89e5c204786c006b029992ccd0010bcebee1d3080c6e0d6c01d7ab010e6c01d0e1e9f60c7e6c018dc3b2b303796c01c88ecad50a786b058cb2f18c0710b09b9ba4070cd0fb87af070c90f29afe0711c3a2f6c90e126e136c01a78882820a146c01dbb701786e166c02ea99cff20475b2b8d4960b176c01c2cee0d80c036c02007801196d1a6c01c2cee0d80c1b6e1c6e786d756c0184f9d1761f6e206e796c04dc87d3aa031e8e8ab6f3081eefca8bdf0d1ea5a389b40f1e6e236c1384aead331df0cefc351ee9f1b4471ed2bbc8ef021ee28b959c03219eb493cf031ed8aa8f8f051e9ebddfd6051e81a6cee6051ece89be97061ec7dae0cc0622feeaf491091e93dfe6aa091e86f998bc091ec182ad960a1ef5cedb9b0b1eaf899aba0d21fde7b1fd0d24c2b0c4aa0f1e6e716c0486fef0ea0a0585f2acb20b05fcc8d7e40e26fbbc93ac0f266b02c2a2dd88070c829aa4b40e276e286c04dbb70178cbe4fdc70471fc91f4f8052681d9b08e0a296c05f8aff58a0175aaeff3c60105b1edd6810407ba89e5c2041eb9ef938008786c029db0f1b80200b3c4b1f204056c04efd6e40226ebbedebd0426cbe4fdc70426fc91f4f805266c02e28bbf14788effd6e90e006c0196bdb4e904716b0ac6c0d51025838db4492ae6d6e4ab0678aedd92a2070c9eb481da0b2bd1a8b0ae0c2c97f7e1c30e0c82a1cfcd0e2d97899f8d0f2ed6f4c7ff0f2f6e306c04efd6e4027198abec810171b6f798b20131a696a48708716c01bbb4b09703226c028d86f0fa0b218c8890fb0b056c02b8c789cb01218c8890fb0b056c01b99d9da50b796c01e0a9b302786e376c02a9ddf49b0709d8a38ca80d386b0cbab5f1a40101918bacf10204948c9eb4030afc9fc683050fc6b3bb9106158db2d5920918e0f8fffd0b328bf3afac0d33cde3c8d30d3490efabef0d3589b8b3b30e36a3f3c0ad0f396e3a6c02ad86ca830500cbe2b58b083b013c20d7e851652cd032ba5ed76b17f626aa47829f06e5235a0d580e96d3727729ea2401080102040000000300000001011d841429ba30df507f14f52fbced0b037850b98d89aafaad5b7430f658026b63616e69737465725f69644a000000000000000101016e696e67726573735f6578706972791b173b6519d68688806b6d6574686f645f6e616d656d6d616e6167655f6e6575726f6e6c726571756573745f747970656463616c6c6673656e646572581d19aa3d42c048dd7d14f0cfa0df69a1c1381780f6e9a137abaa6a82e302", - "output": [ - "1 | Transaction type : Remove Neuron Permissions", - "2 | Canister Id [1/1] : ppmzm-3aaaa-aaaaa : aacpq-cai", - "3 | Neuron Id [1/4] : d7e851 : 652cd0 : 32ba5e", - "4 | Neuron Id [2/4] : d76b17 : f626aa : 47829f", - "5 | Neuron Id [3/4] : 06e523 : 5a0d58 : 0e96d3", - "6 | Neuron Id [4/4] : 727729 : ea24", - "7 | Principal Id [1/2] : krpzt-buecq-u3umg : 7kb7r-j5jpx-twqwa", - "8 | Principal Id [2/2] : 3ykc4-y3cnk-7kwvw : 5bq6z-mae", - "9 | Remove Permission : Vote", - "10 | Remove Permission : Submit Proposal" - ], - "neuronIdString": "d7e851652cd032ba5ed76b17f626aa47829f06e5235a0d580e96d3727729ea24", - "name": "Remove Neuron Permissions", - "canisterId": "ppmzm-3aaaa-aaaaa-aacpq-cai", - "candid_request": { - "subaccount": { - "0": 215, - "1": 232, - "2": 81, - "3": 101, - "4": 44, - "5": 208, - "6": 50, - "7": 186, - "8": 94, - "9": 215, - "10": 107, - "11": 23, - "12": 246, - "13": 38, - "14": 170, - "15": 71, - "16": 130, - "17": 159, - "18": 6, - "19": 229, - "20": 35, - "21": 90, - "22": 13, - "23": 88, - "24": 14, - "25": 150, - "26": 211, - "27": 114, - "28": 119, - "29": 41, - "30": 234, - "31": 36 - }, - "command": [ - { - "RemoveNeuronPermissions": { - "permissions_to_remove": [{ "permissions": { "0": 4, "1": 3 } }], - "principal_id": [ - "krpzt-buecq-u3umg-7kb7r-j5jpx-twqwa-3ykc4-y3cnk-7kwvw-5bq6z-mae" - ] - } - } - ] - } - }, - { - "blob_candid": "d9d9f7a167636f6e74656e74a66361726759036a4449444c3d6d7b6c02ba89e5c20478b9ef938008786c01dbb701006d026c02e28bbf1478c2cee0d80c036e686c01ad86ca8305006e066c02b3b0dac30305ad86ca8305076e086c02a9ddf49b0709a290ead30a796c029cb1fa2505ba89e5c204786c006b029992ccd0010bcebee1d3080c6e0d6c01d7ab010e6c01d0e1e9f60c7e6c018dc3b2b303796c01c88ecad50a786b058cb2f18c0710b09b9ba4070cd0fb87af070c90f29afe0711c3a2f6c90e126e136c01a78882820a146c01dbb701786e166c02ea99cff20475b2b8d4960b176c01c2cee0d80c036c02007801196d1a6c01c2cee0d80c1b6e1c6e786d756c0184f9d1761f6e206e796c04dc87d3aa031e8e8ab6f3081eefca8bdf0d1ea5a389b40f1e6e236c1384aead331df0cefc351ee9f1b4471ed2bbc8ef021ee28b959c03219eb493cf031ed8aa8f8f051e9ebddfd6051e81a6cee6051ece89be97061ec7dae0cc0622feeaf491091e93dfe6aa091e86f998bc091ec182ad960a1ef5cedb9b0b1eaf899aba0d21fde7b1fd0d24c2b0c4aa0f1e6e716c0486fef0ea0a0585f2acb20b05fcc8d7e40e26fbbc93ac0f266b02c2a2dd88070c829aa4b40e276e286c04dbb70178cbe4fdc70471fc91f4f8052681d9b08e0a296c05f8aff58a0175aaeff3c60105b1edd6810407ba89e5c2041eb9ef938008786c029db0f1b80200b3c4b1f204056c04efd6e40226ebbedebd0426cbe4fdc70426fc91f4f805266c02e28bbf14788effd6e90e006c0196bdb4e904716b0ac6c0d51025838db4492ae6d6e4ab0678aedd92a2070c9eb481da0b2bd1a8b0ae0c2c97f7e1c30e0c82a1cfcd0e2d97899f8d0f2ed6f4c7ff0f2f6e306c04efd6e4027198abec810171b6f798b20131a696a48708716c01bbb4b09703226c028d86f0fa0b218c8890fb0b056c02b8c789cb01218c8890fb0b056c01b99d9da50b796c01e0a9b302786e376c02a9ddf49b0709d8a38ca80d386b0cbab5f1a40101918bacf10204948c9eb4030afc9fc683050fc6b3bb9106158db2d5920918e0f8fffd0b328bf3afac0d33cde3c8d30d3490efabef0d3589b8b3b30e36a3f3c0ad0f396e3a6c02ad86ca830500cbe2b58b083b013c20d7e851652cd032ba5ed76b17f626aa47829f06e5235a0d580e96d3727729ea2401080102040000000300000001011d29794883d3efb57cc835619ba5961941d7a11ac192735943b2c886e9026b63616e69737465725f69644a000000000000000101016e696e67726573735f6578706972791b173b6519d7009a806b6d6574686f645f6e616d656d6d616e6167655f6e6575726f6e6c726571756573745f747970656463616c6c6673656e646572581d19aa3d42c048dd7d14f0cfa0df69a1c1381780f6e9a137abaa6a82e302", - "output": [ - "1 | Transaction type : Remove Neuron Permissions", - "2 | Canister Id [1/1] : ppmzm-3aaaa-aaaaa : aacpq-cai", - "3 | Neuron Id [1/4] : d7e851 : 652cd0 : 32ba5e", - "4 | Neuron Id [2/4] : d76b17 : f626aa : 47829f", - "5 | Neuron Id [3/4] : 06e523 : 5a0d58 : 0e96d3", - "6 | Neuron Id [4/4] : 727729 : ea24", - "7 | Principal Id [1/2] : 2dfd6-abjpf-eihu7 : pwv6m-qnlbt-oszmg", - "8 | Principal Id [2/2] : kb26q-rvqms-onmuh : mwiq3-uqe", - "9 | Remove Permission : Vote", - "10 | Remove Permission : Submit Proposal" - ], - "neuronIdString": "d7e851652cd032ba5ed76b17f626aa47829f06e5235a0d580e96d3727729ea24", - "name": "Remove Neuron Permissions", - "canisterId": "ppmzm-3aaaa-aaaaa-aacpq-cai", - "candid_request": { - "subaccount": { - "0": 215, - "1": 232, - "2": 81, - "3": 101, - "4": 44, - "5": 208, - "6": 50, - "7": 186, - "8": 94, - "9": 215, - "10": 107, - "11": 23, - "12": 246, - "13": 38, - "14": 170, - "15": 71, - "16": 130, - "17": 159, - "18": 6, - "19": 229, - "20": 35, - "21": 90, - "22": 13, - "23": 88, - "24": 14, - "25": 150, - "26": 211, - "27": 114, - "28": 119, - "29": 41, - "30": 234, - "31": 36 - }, - "command": [ - { - "RemoveNeuronPermissions": { - "permissions_to_remove": [{ "permissions": { "0": 4, "1": 3 } }], - "principal_id": [ - "2dfd6-abjpf-eihu7-pwv6m-qnlbt-oszmg-kb26q-rvqms-onmuh-mwiq3-uqe" - ] - } - } - ] - } - }, - { - "blob_candid": "d9d9f7a167636f6e74656e74a66361726759036e4449444c3d6d7b6c02ba89e5c20478b9ef938008786c01dbb701006d026c02e28bbf1478c2cee0d80c036e686c01ad86ca8305006e066c02b3b0dac30305ad86ca8305076e086c02a9ddf49b0709a290ead30a796c029cb1fa2505ba89e5c204786c006b029992ccd0010bcebee1d3080c6e0d6c01d7ab010e6c01d0e1e9f60c7e6c018dc3b2b303796c01c88ecad50a786b058cb2f18c0710b09b9ba4070cd0fb87af070c90f29afe0711c3a2f6c90e126e136c01a78882820a146c01dbb701786e166c02ea99cff20475b2b8d4960b176c01c2cee0d80c036c02007801196d1a6c01c2cee0d80c1b6e1c6e786d756c0184f9d1761f6e206e796c04dc87d3aa031e8e8ab6f3081eefca8bdf0d1ea5a389b40f1e6e236c1384aead331df0cefc351ee9f1b4471ed2bbc8ef021ee28b959c03219eb493cf031ed8aa8f8f051e9ebddfd6051e81a6cee6051ece89be97061ec7dae0cc0622feeaf491091e93dfe6aa091e86f998bc091ec182ad960a1ef5cedb9b0b1eaf899aba0d21fde7b1fd0d24c2b0c4aa0f1e6e716c0486fef0ea0a0585f2acb20b05fcc8d7e40e26fbbc93ac0f266b02c2a2dd88070c829aa4b40e276e286c04dbb70178cbe4fdc70471fc91f4f8052681d9b08e0a296c05f8aff58a0175aaeff3c60105b1edd6810407ba89e5c2041eb9ef938008786c029db0f1b80200b3c4b1f204056c04efd6e40226ebbedebd0426cbe4fdc70426fc91f4f805266c02e28bbf14788effd6e90e006c0196bdb4e904716b0ac6c0d51025838db4492ae6d6e4ab0678aedd92a2070c9eb481da0b2bd1a8b0ae0c2c97f7e1c30e0c82a1cfcd0e2d97899f8d0f2ed6f4c7ff0f2f6e306c04efd6e4027198abec810171b6f798b20131a696a48708716c01bbb4b09703226c028d86f0fa0b218c8890fb0b056c02b8c789cb01218c8890fb0b056c01b99d9da50b796c01e0a9b302786e376c02a9ddf49b0709d8a38ca80d386b0cbab5f1a40101918bacf10204948c9eb4030afc9fc683050fc6b3bb9106158db2d5920918e0f8fffd0b328bf3afac0d33cde3c8d30d3490efabef0d3589b8b3b30e36a3f3c0ad0f396e3a6c02ad86ca830500cbe2b58b083b013c20a36e143c86e7e471e7c719506487cf7a6cf40da76361aeafee5133e1d9acea3d0108010304000000030000000100000001011d29794883d3efb57cc835619ba5961941d7a11ac192735943b2c886e9026b63616e69737465725f69644a000000000000000101016e696e67726573735f6578706972791b173b6519d71f1f006b6d6574686f645f6e616d656d6d616e6167655f6e6575726f6e6c726571756573745f747970656463616c6c6673656e646572581d19aa3d42c048dd7d14f0cfa0df69a1c1381780f6e9a137abaa6a82e302", - "output": [ - "1 | Transaction type : Remove Neuron Permissions", - "2 | Canister Id [1/1] : s24we-diaaa-aaaaa : aaaka-cai", - "3 | Neuron Id [1/4] : a36e14 : 3c86e7 : e471e7", - "4 | Neuron Id [2/4] : c71950 : 6487cf : 7a6cf4", - "5 | Neuron Id [3/4] : 0da763 : 61aeaf : ee5133", - "6 | Neuron Id [4/4] : e1d9ac : ea3d", - "7 | Principal Id [1/2] : 2dfd6-abjpf-eihu7 : pwv6m-qnlbt-oszmg", - "8 | Principal Id [2/2] : kb26q-rvqms-onmuh : mwiq3-uqe", - "9 | Remove Permission : Vote", - "10 | Remove Permission : Submit Proposal", - "11 | Remove Permission : Configure Dissolve State" - ], - "neuronIdString": "a36e143c86e7e471e7c719506487cf7a6cf40da76361aeafee5133e1d9acea3d", - "name": "Remove Neuron Permissions", - "canisterId": "s24we-diaaa-aaaaa-aaaka-cai", - "candid_request": { - "subaccount": { - "0": 163, - "1": 110, - "2": 20, - "3": 60, - "4": 134, - "5": 231, - "6": 228, - "7": 113, - "8": 231, - "9": 199, - "10": 25, - "11": 80, - "12": 100, - "13": 135, - "14": 207, - "15": 122, - "16": 108, - "17": 244, - "18": 13, - "19": 167, - "20": 99, - "21": 97, - "22": 174, - "23": 175, - "24": 238, - "25": 81, - "26": 51, - "27": 225, - "28": 217, - "29": 172, - "30": 234, - "31": 61 - }, - "command": [ - { - "RemoveNeuronPermissions": { - "permissions_to_remove": [ - { "permissions": { "0": 4, "1": 3, "2": 1 } } - ], - "principal_id": [ - "2dfd6-abjpf-eihu7-pwv6m-qnlbt-oszmg-kb26q-rvqms-onmuh-mwiq3-uqe" - ] - } - } - ] - } - }, - { - "blob_candid": "d9d9f7a167636f6e74656e74a66361726759036a4449444c3d6d7b6c02ba89e5c20478b9ef938008786c01dbb701006d026c02e28bbf1478c2cee0d80c036e686c01ad86ca8305006e066c02b3b0dac30305ad86ca8305076e086c02a9ddf49b0709a290ead30a796c029cb1fa2505ba89e5c204786c006b029992ccd0010bcebee1d3080c6e0d6c01d7ab010e6c01d0e1e9f60c7e6c018dc3b2b303796c01c88ecad50a786b058cb2f18c0710b09b9ba4070cd0fb87af070c90f29afe0711c3a2f6c90e126e136c01a78882820a146c01dbb701786e166c02ea99cff20475b2b8d4960b176c01c2cee0d80c036c02007801196d1a6c01c2cee0d80c1b6e1c6e786d756c0184f9d1761f6e206e796c04dc87d3aa031e8e8ab6f3081eefca8bdf0d1ea5a389b40f1e6e236c1384aead331df0cefc351ee9f1b4471ed2bbc8ef021ee28b959c03219eb493cf031ed8aa8f8f051e9ebddfd6051e81a6cee6051ece89be97061ec7dae0cc0622feeaf491091e93dfe6aa091e86f998bc091ec182ad960a1ef5cedb9b0b1eaf899aba0d21fde7b1fd0d24c2b0c4aa0f1e6e716c0486fef0ea0a0585f2acb20b05fcc8d7e40e26fbbc93ac0f266b02c2a2dd88070c829aa4b40e276e286c04dbb70178cbe4fdc70471fc91f4f8052681d9b08e0a296c05f8aff58a0175aaeff3c60105b1edd6810407ba89e5c2041eb9ef938008786c029db0f1b80200b3c4b1f204056c04efd6e40226ebbedebd0426cbe4fdc70426fc91f4f805266c02e28bbf14788effd6e90e006c0196bdb4e904716b0ac6c0d51025838db4492ae6d6e4ab0678aedd92a2070c9eb481da0b2bd1a8b0ae0c2c97f7e1c30e0c82a1cfcd0e2d97899f8d0f2ed6f4c7ff0f2f6e306c04efd6e4027198abec810171b6f798b20131a696a48708716c01bbb4b09703226c028d86f0fa0b218c8890fb0b056c02b8c789cb01218c8890fb0b056c01b99d9da50b796c01e0a9b302786e376c02a9ddf49b0709d8a38ca80d386b0cbab5f1a40101918bacf10204948c9eb4030afc9fc683050fc6b3bb9106158db2d5920918e0f8fffd0b328bf3afac0d33cde3c8d30d3490efabef0d3589b8b3b30e36a3f3c0ad0f396e3a6c02ad86ca830500cbe2b58b083b013c20d7e851652cd032ba5ed76b17f626aa47829f06e5235a0d580e96d3727729ea2401080102040000000500000001011d841429ba30df507f14f52fbced0b037850b98d89aafaad5b7430f658026b63616e69737465725f69644a000000000000000101016e696e67726573735f6578706972791b173b6519d72e61406b6d6574686f645f6e616d656d6d616e6167655f6e6575726f6e6c726571756573745f747970656463616c6c6673656e646572581d19aa3d42c048dd7d14f0cfa0df69a1c1381780f6e9a137abaa6a82e302", - "output": [ - "1 | Transaction type : Remove Neuron Permissions", - "2 | Canister Id [1/1] : s24we-diaaa-aaaaa : aaaka-cai", - "3 | Neuron Id [1/4] : d7e851 : 652cd0 : 32ba5e", - "4 | Neuron Id [2/4] : d76b17 : f626aa : 47829f", - "5 | Neuron Id [3/4] : 06e523 : 5a0d58 : 0e96d3", - "6 | Neuron Id [4/4] : 727729 : ea24", - "7 | Principal Id [1/2] : krpzt-buecq-u3umg : 7kb7r-j5jpx-twqwa", - "8 | Principal Id [2/2] : 3ykc4-y3cnk-7kwvw : 5bq6z-mae", - "9 | Remove Permission : Vote", - "10 | Remove Permission : Disburse Neuron" - ], - "neuronIdString": "d7e851652cd032ba5ed76b17f626aa47829f06e5235a0d580e96d3727729ea24", - "name": "Remove Neuron Permissions", - "canisterId": "s24we-diaaa-aaaaa-aaaka-cai", - "candid_request": { - "subaccount": { - "0": 215, - "1": 232, - "2": 81, - "3": 101, - "4": 44, - "5": 208, - "6": 50, - "7": 186, - "8": 94, - "9": 215, - "10": 107, - "11": 23, - "12": 246, - "13": 38, - "14": 170, - "15": 71, - "16": 130, - "17": 159, - "18": 6, - "19": 229, - "20": 35, - "21": 90, - "22": 13, - "23": 88, - "24": 14, - "25": 150, - "26": 211, - "27": 114, - "28": 119, - "29": 41, - "30": 234, - "31": 36 - }, - "command": [ - { - "RemoveNeuronPermissions": { - "permissions_to_remove": [{ "permissions": { "0": 4, "1": 5 } }], - "principal_id": [ - "krpzt-buecq-u3umg-7kb7r-j5jpx-twqwa-3ykc4-y3cnk-7kwvw-5bq6z-mae" - ] - } - } - ] - } - }, - { - "blob_candid": "d9d9f7a167636f6e74656e74a66361726759036a4449444c3d6d7b6c02ba89e5c20478b9ef938008786c01dbb701006d026c02e28bbf1478c2cee0d80c036e686c01ad86ca8305006e066c02b3b0dac30305ad86ca8305076e086c02a9ddf49b0709a290ead30a796c029cb1fa2505ba89e5c204786c006b029992ccd0010bcebee1d3080c6e0d6c01d7ab010e6c01d0e1e9f60c7e6c018dc3b2b303796c01c88ecad50a786b058cb2f18c0710b09b9ba4070cd0fb87af070c90f29afe0711c3a2f6c90e126e136c01a78882820a146c01dbb701786e166c02ea99cff20475b2b8d4960b176c01c2cee0d80c036c02007801196d1a6c01c2cee0d80c1b6e1c6e786d756c0184f9d1761f6e206e796c04dc87d3aa031e8e8ab6f3081eefca8bdf0d1ea5a389b40f1e6e236c1384aead331df0cefc351ee9f1b4471ed2bbc8ef021ee28b959c03219eb493cf031ed8aa8f8f051e9ebddfd6051e81a6cee6051ece89be97061ec7dae0cc0622feeaf491091e93dfe6aa091e86f998bc091ec182ad960a1ef5cedb9b0b1eaf899aba0d21fde7b1fd0d24c2b0c4aa0f1e6e716c0486fef0ea0a0585f2acb20b05fcc8d7e40e26fbbc93ac0f266b02c2a2dd88070c829aa4b40e276e286c04dbb70178cbe4fdc70471fc91f4f8052681d9b08e0a296c05f8aff58a0175aaeff3c60105b1edd6810407ba89e5c2041eb9ef938008786c029db0f1b80200b3c4b1f204056c04efd6e40226ebbedebd0426cbe4fdc70426fc91f4f805266c02e28bbf14788effd6e90e006c0196bdb4e904716b0ac6c0d51025838db4492ae6d6e4ab0678aedd92a2070c9eb481da0b2bd1a8b0ae0c2c97f7e1c30e0c82a1cfcd0e2d97899f8d0f2ed6f4c7ff0f2f6e306c04efd6e4027198abec810171b6f798b20131a696a48708716c01bbb4b09703226c028d86f0fa0b218c8890fb0b056c02b8c789cb01218c8890fb0b056c01b99d9da50b796c01e0a9b302786e376c02a9ddf49b0709d8a38ca80d386b0cbab5f1a40101918bacf10204948c9eb4030afc9fc683050fc6b3bb9106158db2d5920918e0f8fffd0b328bf3afac0d33cde3c8d30d3490efabef0d3589b8b3b30e36a3f3c0ad0f396e3a6c02ad86ca830500cbe2b58b083b013c20d7e851652cd032ba5ed76b17f626aa47829f06e5235a0d580e96d3727729ea2401080102050000000100000001011d29794883d3efb57cc835619ba5961941d7a11ac192735943b2c886e9026b63616e69737465725f69644a000000000000000101016e696e67726573735f6578706972791b173b6519d73da3806b6d6574686f645f6e616d656d6d616e6167655f6e6575726f6e6c726571756573745f747970656463616c6c6673656e646572581d19aa3d42c048dd7d14f0cfa0df69a1c1381780f6e9a137abaa6a82e302", - "output": [ - "1 | Transaction type : Remove Neuron Permissions", - "2 | Canister Id [1/1] : s24we-diaaa-aaaaa : aaaka-cai", - "3 | Neuron Id [1/4] : d7e851 : 652cd0 : 32ba5e", - "4 | Neuron Id [2/4] : d76b17 : f626aa : 47829f", - "5 | Neuron Id [3/4] : 06e523 : 5a0d58 : 0e96d3", - "6 | Neuron Id [4/4] : 727729 : ea24", - "7 | Principal Id [1/2] : 2dfd6-abjpf-eihu7 : pwv6m-qnlbt-oszmg", - "8 | Principal Id [2/2] : kb26q-rvqms-onmuh : mwiq3-uqe", - "9 | Remove Permission : Disburse Neuron", - "10 | Remove Permission : Configure Dissolve State" - ], - "neuronIdString": "d7e851652cd032ba5ed76b17f626aa47829f06e5235a0d580e96d3727729ea24", - "name": "Remove Neuron Permissions", - "canisterId": "s24we-diaaa-aaaaa-aaaka-cai", - "candid_request": { - "subaccount": { - "0": 215, - "1": 232, - "2": 81, - "3": 101, - "4": 44, - "5": 208, - "6": 50, - "7": 186, - "8": 94, - "9": 215, - "10": 107, - "11": 23, - "12": 246, - "13": 38, - "14": 170, - "15": 71, - "16": 130, - "17": 159, - "18": 6, - "19": 229, - "20": 35, - "21": 90, - "22": 13, - "23": 88, - "24": 14, - "25": 150, - "26": 211, - "27": 114, - "28": 119, - "29": 41, - "30": 234, - "31": 36 - }, - "command": [ - { - "RemoveNeuronPermissions": { - "permissions_to_remove": [{ "permissions": { "0": 5, "1": 1 } }], - "principal_id": [ - "2dfd6-abjpf-eihu7-pwv6m-qnlbt-oszmg-kb26q-rvqms-onmuh-mwiq3-uqe" - ] - } - } - ] - } - }, - { - "blob_candid": "d9d9f7a167636f6e74656e74a66361726759036a4449444c3d6d7b6c02ba89e5c20478b9ef938008786c01dbb701006d026c02e28bbf1478c2cee0d80c036e686c01ad86ca8305006e066c02b3b0dac30305ad86ca8305076e086c02a9ddf49b0709a290ead30a796c029cb1fa2505ba89e5c204786c006b029992ccd0010bcebee1d3080c6e0d6c01d7ab010e6c01d0e1e9f60c7e6c018dc3b2b303796c01c88ecad50a786b058cb2f18c0710b09b9ba4070cd0fb87af070c90f29afe0711c3a2f6c90e126e136c01a78882820a146c01dbb701786e166c02ea99cff20475b2b8d4960b176c01c2cee0d80c036c02007801196d1a6c01c2cee0d80c1b6e1c6e786d756c0184f9d1761f6e206e796c04dc87d3aa031e8e8ab6f3081eefca8bdf0d1ea5a389b40f1e6e236c1384aead331df0cefc351ee9f1b4471ed2bbc8ef021ee28b959c03219eb493cf031ed8aa8f8f051e9ebddfd6051e81a6cee6051ece89be97061ec7dae0cc0622feeaf491091e93dfe6aa091e86f998bc091ec182ad960a1ef5cedb9b0b1eaf899aba0d21fde7b1fd0d24c2b0c4aa0f1e6e716c0486fef0ea0a0585f2acb20b05fcc8d7e40e26fbbc93ac0f266b02c2a2dd88070c829aa4b40e276e286c04dbb70178cbe4fdc70471fc91f4f8052681d9b08e0a296c05f8aff58a0175aaeff3c60105b1edd6810407ba89e5c2041eb9ef938008786c029db0f1b80200b3c4b1f204056c04efd6e40226ebbedebd0426cbe4fdc70426fc91f4f805266c02e28bbf14788effd6e90e006c0196bdb4e904716b0ac6c0d51025838db4492ae6d6e4ab0678aedd92a2070c9eb481da0b2bd1a8b0ae0c2c97f7e1c30e0c82a1cfcd0e2d97899f8d0f2ed6f4c7ff0f2f6e306c04efd6e4027198abec810171b6f798b20131a696a48708716c01bbb4b09703226c028d86f0fa0b218c8890fb0b056c02b8c789cb01218c8890fb0b056c01b99d9da50b796c01e0a9b302786e376c02a9ddf49b0709d8a38ca80d386b0cbab5f1a40101918bacf10204948c9eb4030afc9fc683050fc6b3bb9106158db2d5920918e0f8fffd0b328bf3afac0d33cde3c8d30d3490efabef0d3589b8b3b30e36a3f3c0ad0f396e3a6c02ad86ca830500cbe2b58b083b013c20a36e143c86e7e471e7c719506487cf7a6cf40da76361aeafee5133e1d9acea3d010801020a0000000500000001011d29794883d3efb57cc835619ba5961941d7a11ac192735943b2c886e9026b63616e69737465725f69644a000000000000000101016e696e67726573735f6578706972791b173b6519d75c28006b6d6574686f645f6e616d656d6d616e6167655f6e6575726f6e6c726571756573745f747970656463616c6c6673656e646572581d19aa3d42c048dd7d14f0cfa0df69a1c1381780f6e9a137abaa6a82e302", - "output": [ - "1 | Transaction type : Remove Neuron Permissions", - "2 | Canister Id [1/1] : ppmzm-3aaaa-aaaaa : aacpq-cai", - "3 | Neuron Id [1/4] : a36e14 : 3c86e7 : e471e7", - "4 | Neuron Id [2/4] : c71950 : 6487cf : 7a6cf4", - "5 | Neuron Id [3/4] : 0da763 : 61aeaf : ee5133", - "6 | Neuron Id [4/4] : e1d9ac : ea3d", - "7 | Principal Id [1/2] : 2dfd6-abjpf-eihu7 : pwv6m-qnlbt-oszmg", - "8 | Principal Id [2/2] : kb26q-rvqms-onmuh : mwiq3-uqe", - "9 | Remove Permission : Manage Voting Permission", - "10 | Remove Permission : Disburse Neuron" - ], - "neuronIdString": "a36e143c86e7e471e7c719506487cf7a6cf40da76361aeafee5133e1d9acea3d", - "name": "Remove Neuron Permissions", - "canisterId": "ppmzm-3aaaa-aaaaa-aacpq-cai", - "candid_request": { - "subaccount": { - "0": 163, - "1": 110, - "2": 20, - "3": 60, - "4": 134, - "5": 231, - "6": 228, - "7": 113, - "8": 231, - "9": 199, - "10": 25, - "11": 80, - "12": 100, - "13": 135, - "14": 207, - "15": 122, - "16": 108, - "17": 244, - "18": 13, - "19": 167, - "20": 99, - "21": 97, - "22": 174, - "23": 175, - "24": 238, - "25": 81, - "26": 51, - "27": 225, - "28": 217, - "29": 172, - "30": 234, - "31": 61 - }, - "command": [ - { - "RemoveNeuronPermissions": { - "permissions_to_remove": [{ "permissions": { "0": 10, "1": 5 } }], - "principal_id": [ - "2dfd6-abjpf-eihu7-pwv6m-qnlbt-oszmg-kb26q-rvqms-onmuh-mwiq3-uqe" - ] - } - } - ] - } - } -] From 754719cd320a58d30f0783eee0b7566cc6b8c001 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lloren=C3=A7?= Date: Fri, 27 Jan 2023 09:10:14 +0100 Subject: [PATCH 13/31] Test Vectors: Fix 20230118 sns disburse vector --- scripts/test-vectors/20230118-sns-manage-neuron.ts | 10 ++++++---- scripts/test-vectors/utils.ts | 8 ++++---- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/scripts/test-vectors/20230118-sns-manage-neuron.ts b/scripts/test-vectors/20230118-sns-manage-neuron.ts index e8d4d44cf..f919dd5f2 100644 --- a/scripts/test-vectors/20230118-sns-manage-neuron.ts +++ b/scripts/test-vectors/20230118-sns-manage-neuron.ts @@ -1,4 +1,5 @@ import { IDL } from "@dfinity/candid"; +import { encodeIcrcAccount } from "@dfinity/ledger/src/utils/ledger.utils"; import { E8S_PER_TOKEN } from "@dfinity/nns/src/constants/constants"; import { Principal } from "@dfinity/principal"; import { SnsDisburseNeuronParams, SnsNeuronId } from "@dfinity/sns/src"; @@ -7,7 +8,6 @@ import { toStartDissolvingNeuronRequest, toStopDissolvingNeuronRequest, } from "@dfinity/sns/src/converters/governance.converters"; -import { encodeSnsAccount } from "@dfinity/sns/src/utils/ledger.utils"; import { arrayOfNumberToUint8Array } from "@dfinity/utils"; import { ManageNeuronFn } from "./sns-governance.idl"; import { @@ -34,9 +34,11 @@ const createDisburseVector = (params: DisburseParams) => { ); const neuronIdString = bytesToHexString(Array.from(params.neuronId.id)); const neuronIdOutputs = splitString(neuronIdString, "Neuron Id"); - const disburseToAccountStr = encodeSnsAccount({ - owner: defaultCaller, - }); + const disburseToAccountStr = encodeIcrcAccount( + params.toAccount ?? { + owner: defaultCaller, + } + ); const disburseToOutputs = splitString(disburseToAccountStr, "Disburse to"); const amount = params.amount ? Number(params.amount) / Number(E8S_PER_TOKEN) diff --git a/scripts/test-vectors/utils.ts b/scripts/test-vectors/utils.ts index 4a7110590..e1a540cd7 100644 --- a/scripts/test-vectors/utils.ts +++ b/scripts/test-vectors/utils.ts @@ -5,9 +5,9 @@ import { ReadRequest, SubmitRequestType, } from "@dfinity/agent"; +import { IcrcAccount } from "@dfinity/ledger/src/types/ledger.responses"; +import { encodeIcrcAccount } from "@dfinity/ledger/src/utils/ledger.utils"; import { Principal } from "@dfinity/principal"; -import type { SnsAccount } from "@dfinity/sns/src"; -import { encodeSnsAccount } from "@dfinity/sns/src/utils/ledger.utils"; import { writeFileSync } from "fs"; import { MAINNET_GOVERNANCE_CANISTER_ID } from "../../packages/nns/src/constants/canister_ids"; import { SnsNeuronPermissionType } from "../../packages/sns/src/enums/governance.enums"; @@ -154,10 +154,10 @@ export const splitString = ( }; export const splitAccount = ( - account: SnsAccount, + account: IcrcAccount, screenText: string ): string[] => { - return splitPrincipal(Principal.fromText(encodeSnsAccount(account))).map( + return splitPrincipal(Principal.fromText(encodeIcrcAccount(account))).map( (data, i, elements) => `${screenText} [${i + 1}/${elements.length}] : ${data}` ); From 708434a5029116ef2101505ba7dd0e547c320ead Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lloren=C3=A7?= Date: Mon, 30 Jan 2023 11:13:24 +0100 Subject: [PATCH 14/31] Test Vector: Fix icrc-1 import --- scripts/test-vectors/20230123-icrc-1.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/test-vectors/20230123-icrc-1.ts b/scripts/test-vectors/20230123-icrc-1.ts index 1fcde95f9..0a121962d 100644 --- a/scripts/test-vectors/20230123-icrc-1.ts +++ b/scripts/test-vectors/20230123-icrc-1.ts @@ -1,8 +1,8 @@ import { IDL } from "@dfinity/candid"; +import { toTransferArg } from "@dfinity/ledger/src/converters/ledger.converters"; +import { TransferParams } from "@dfinity/ledger/src/types/ledger.params"; import { E8S_PER_TOKEN } from "@dfinity/nns/src/constants/constants"; import { Principal } from "@dfinity/principal"; -import { toTransferArg } from "@dfinity/sns/src/converters/ledger.converters"; -import { TransferParams } from "@dfinity/sns/src/types/ledger.params"; import { arrayOfNumberToUint8Array, fromNullable, From b096baafc4bc4c98c9d3b9802ce39707b7b378b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lloren=C3=A7?= Date: Wed, 1 Feb 2023 12:09:54 +0100 Subject: [PATCH 15/31] Test vectors: ICRC1 most with created_at set --- scripts/test-vectors/20230123-icrc-1.ts | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/scripts/test-vectors/20230123-icrc-1.ts b/scripts/test-vectors/20230123-icrc-1.ts index 0a121962d..80489f76d 100644 --- a/scripts/test-vectors/20230123-icrc-1.ts +++ b/scripts/test-vectors/20230123-icrc-1.ts @@ -177,6 +177,7 @@ const main = () => { memo: numberToUint8Array(11223312), fee: BigInt(30_000), canisterId: canisterId2, + created_at_time: BigInt(1675249266635000000), }), createTestVector({ owner: principal2, @@ -187,6 +188,7 @@ const main = () => { amount: BigInt(314_000_000), memo: numberToUint8Array(11223312), canisterId: canisterId1, + created_at_time: BigInt(1675249266635000000), }), createTestVector({ owner: principal2, @@ -199,6 +201,7 @@ const main = () => { from_subaccount: subaccount2, fee: BigInt(20_000), canisterId: canisterId1, + created_at_time: BigInt(1675249266635000000), }), createTestVector({ owner: principal1, @@ -227,6 +230,7 @@ const main = () => { amount: BigInt(31_400_000), from_subaccount: subaccount2, canisterId: MAINNET_LEDGER_CANISTER_ID, + created_at_time: BigInt(1675249266635000000), }), createTestVector({ owner: principal2, @@ -237,6 +241,7 @@ const main = () => { amount: BigInt(31_400_000), memo: numberToUint8Array(11223312), canisterId: MAINNET_LEDGER_CANISTER_ID, + created_at_time: BigInt(1675249266635000000), }), createTestVector({ owner: principal2, @@ -262,6 +267,19 @@ const main = () => { canisterId: MAINNET_LEDGER_CANISTER_ID, created_at_time: BigInt(1629200000000000000), }), + createTestVector({ + owner: principal2, + to: { + owner: principal1, + subaccount: [subaccount1], + }, + amount: BigInt(131_400_000), + fee: BigInt(30_000), + from_subaccount: subaccount2, + memo: numberToUint8Array(11223312), + canisterId: MAINNET_LEDGER_CANISTER_ID, + created_at_time: BigInt(1675249266635000000), + }), ]; writeToJson({ From dde608788b464feee1aceaafd74f48f86b8670f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lloren=C3=A7?= Date: Tue, 21 Mar 2023 17:47:14 +0100 Subject: [PATCH 16/31] Test vectors: Disburse and Join CF for candid --- scripts/test-vectors/20230321-disburse.ts | 90 +++++++++++++++++++++++ scripts/test-vectors/20230321-join-cf.ts | 40 ++++++++++ 2 files changed, 130 insertions(+) create mode 100644 scripts/test-vectors/20230321-disburse.ts create mode 100644 scripts/test-vectors/20230321-join-cf.ts diff --git a/scripts/test-vectors/20230321-disburse.ts b/scripts/test-vectors/20230321-disburse.ts new file mode 100644 index 000000000..b2cd13ed5 --- /dev/null +++ b/scripts/test-vectors/20230321-disburse.ts @@ -0,0 +1,90 @@ +import { IDL } from "@dfinity/candid"; +import { NeuronId } from "@dfinity/nns/src"; +import { AccountIdentifier } from "@dfinity/nns/src/account_identifier"; +import { toDisburseNeuronRequest } from "@dfinity/nns/src/canisters/governance/request.converters"; +import { ManageNeuronFn } from "./governance.idl"; +import { createBlob, writeToJson } from "./utils"; + +const mockNeuronId = BigInt(15374508381553347371); +const mockNeuronId2 = BigInt(8836564053576662908); +const amount1 = BigInt(20_000_000); +const amount2 = BigInt(25_000_000); +const account1 = AccountIdentifier.fromHex( + "d4685b31b51450508aff0331584df7692a84467b680326f5c5f7d30ae711682f" +); +const account2 = AccountIdentifier.fromHex( + "b1cebc8480a0afc91198a87ddf52c6ca7eb7ccddb0cb398064f71d2bbaf2f72b" +); + +const createDisburseVector = ({ + neuronId, + toAccountIdentifier, + amount, +}: { + neuronId: NeuronId; + toAccountIdentifier?: AccountIdentifier; + amount?: bigint; +}) => { + const rawRequestBody = toDisburseNeuronRequest({ + neuronId, + toAccountIdentifier, + amount, + }); + return { + blob_candid: createBlob({ + arg: IDL.encode(ManageNeuronFn.argTypes, [rawRequestBody]), + methodName: "manage_neuron", + }), + name: "Join Community Fund", + candid_request: rawRequestBody, + }; +}; + +const main = () => { + try { + const vectors = [ + createDisburseVector({ neuronId: mockNeuronId }), + createDisburseVector({ neuronId: mockNeuronId2 }), + createDisburseVector({ neuronId: mockNeuronId2, amount: amount1 }), + createDisburseVector({ + neuronId: mockNeuronId2, + amount: amount1, + toAccountIdentifier: account1, + }), + createDisburseVector({ + neuronId: mockNeuronId, + toAccountIdentifier: account1, + }), + createDisburseVector({ + neuronId: mockNeuronId, + amount: amount2, + toAccountIdentifier: account1, + }), + createDisburseVector({ + neuronId: mockNeuronId2, + amount: amount1, + toAccountIdentifier: account2, + }), + createDisburseVector({ + neuronId: mockNeuronId, + toAccountIdentifier: account2, + }), + createDisburseVector({ + neuronId: mockNeuronId, + amount: amount2, + toAccountIdentifier: account2, + }), + ]; + + writeToJson({ + data: vectors, + fileName: "disburse.json", + }); + console.log("File created successfully"); + } catch (error) { + console.log("There was an error"); + console.log(error); + } +}; + +main(); diff --git a/scripts/test-vectors/20230321-join-cf.ts b/scripts/test-vectors/20230321-join-cf.ts new file mode 100644 index 000000000..2addc3333 --- /dev/null +++ b/scripts/test-vectors/20230321-join-cf.ts @@ -0,0 +1,40 @@ +import { IDL } from "@dfinity/candid"; +import { NeuronId } from "@dfinity/nns/src"; +import { toJoinCommunityFundRequest } from "@dfinity/nns/src/canisters/governance/request.converters"; +import { ManageNeuronFn } from "./governance.idl"; +import { createBlob, writeToJson } from "./utils"; + +const mockNeuronId = BigInt(15374508381553347371); +const mockNeuronId2 = BigInt(8836564053576662908); + +const createJoinCFVector = (neuronId: NeuronId) => { + const rawRequestBody = toJoinCommunityFundRequest(neuronId); + return { + blob_candid: createBlob({ + arg: IDL.encode(ManageNeuronFn.argTypes, [rawRequestBody]), + methodName: "manage_neuron", + }), + name: "Join Community Fund", + candid_request: rawRequestBody, + }; +}; + +const main = () => { + try { + const vectors = [ + createJoinCFVector(mockNeuronId), + createJoinCFVector(mockNeuronId2), + ]; + + writeToJson({ + data: vectors, + fileName: "join-cf.json", + }); + console.log("File created successfully"); + } catch (error) { + console.log("There was an error"); + console.log(error); + } +}; + +main(); From cafbefa5ca419d9f16b02342b234c12d85723dd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lloren=C3=A7?= Date: Thu, 11 May 2023 10:52:49 +0200 Subject: [PATCH 17/31] Test Vectors: 2023-05-11 --- scripts/test-vectors/20230511-add-hotkey.ts | 70 ++++++++++++++ scripts/test-vectors/20230511-follow.ts | 92 +++++++++++++++++++ .../test-vectors/20230511-register-vote.ts | 86 +++++++++++++++++ .../test-vectors/20230511-remove-hotkey.ts | 70 ++++++++++++++ 4 files changed, 318 insertions(+) create mode 100644 scripts/test-vectors/20230511-add-hotkey.ts create mode 100644 scripts/test-vectors/20230511-follow.ts create mode 100644 scripts/test-vectors/20230511-register-vote.ts create mode 100644 scripts/test-vectors/20230511-remove-hotkey.ts diff --git a/scripts/test-vectors/20230511-add-hotkey.ts b/scripts/test-vectors/20230511-add-hotkey.ts new file mode 100644 index 000000000..b7931cf3c --- /dev/null +++ b/scripts/test-vectors/20230511-add-hotkey.ts @@ -0,0 +1,70 @@ +import { IDL } from "@dfinity/candid"; +import { NeuronId } from "@dfinity/nns/src"; +import { toAddHotkeyRequest } from "@dfinity/nns/src/canisters/governance/request.converters"; +import { Principal } from "@dfinity/principal"; +import { ManageNeuronFn } from "./governance.idl"; +import { createBlob, writeToJson } from "./utils"; + +const mockNeuronId = BigInt(15374508381553347371); +const mockNeuronId2 = BigInt(8836564053576662908); +const principal1 = Principal.fromText( + "krpzt-buecq-u3umg-7kb7r-j5jpx-twqwa-3ykc4-y3cnk-7kwvw-5bq6z-mae" +); +const principal2 = Principal.fromText( + "2dfd6-abjpf-eihu7-pwv6m-qnlbt-oszmg-kb26q-rvqms-onmuh-mwiq3-uqe" +); + +const createAddHotkeyVector = ({ + neuronId, + principal, +}: { + neuronId: NeuronId; + principal: Principal; +}) => { + const rawRequestBody = toAddHotkeyRequest({ + neuronId, + principal, + }); + return { + blob_candid: createBlob({ + arg: IDL.encode(ManageNeuronFn.argTypes, [rawRequestBody]), + methodName: "manage_neuron", + }), + name: "Add Hotkey", + candid_request: rawRequestBody, + }; +}; + +const main = () => { + try { + const vectors = [ + createAddHotkeyVector({ + neuronId: mockNeuronId, + principal: principal1, + }), + createAddHotkeyVector({ + neuronId: mockNeuronId, + principal: principal2, + }), + createAddHotkeyVector({ + neuronId: mockNeuronId2, + principal: principal1, + }), + createAddHotkeyVector({ + neuronId: mockNeuronId2, + principal: principal2, + }), + ]; + + writeToJson({ + data: vectors, + fileName: "add-hotkey.json", + }); + console.log("File created successfully"); + } catch (error) { + console.log("There was an error"); + console.log(error); + } +}; + +main(); diff --git a/scripts/test-vectors/20230511-follow.ts b/scripts/test-vectors/20230511-follow.ts new file mode 100644 index 000000000..f919fe567 --- /dev/null +++ b/scripts/test-vectors/20230511-follow.ts @@ -0,0 +1,92 @@ +import { IDL } from "@dfinity/candid"; +import { NeuronId } from "@dfinity/nns/src"; +import { toManageNeuronsFollowRequest } from "@dfinity/nns/src/canisters/governance/request.converters"; +import { Topic } from "@dfinity/nns/src/enums/governance.enums"; +import { ManageNeuronFn } from "./governance.idl"; +import { createBlob, writeToJson } from "./utils"; + +const mockNeuronId = BigInt(15374508381553347371); +const mockNeuronId2 = BigInt(8836564053576662908); +const mockNeuronId3 = BigInt(4053576662908); +const mockNeuronId4 = BigInt(999888123); +const mockNeuronId5 = BigInt(3141242222); +const topic1 = Topic.ExchangeRate; +const topic2 = Topic.Governance; +const topic3 = Topic.SnsAndCommunityFund; + +const createFollowVector = ({ + neuronId, + topic, + followees, +}: { + neuronId: NeuronId; + topic: Topic; + followees: Array; +}) => { + const rawRequestBody = toManageNeuronsFollowRequest({ + neuronId, + topic, + followees, + }); + return { + blob_candid: createBlob({ + arg: IDL.encode(ManageNeuronFn.argTypes, [rawRequestBody]), + methodName: "manage_neuron", + }), + name: "Follow", + candid_request: rawRequestBody, + }; +}; + +const main = () => { + try { + const vectors = [ + createFollowVector({ + neuronId: mockNeuronId, + topic: topic1, + followees: [mockNeuronId2, mockNeuronId3], + }), + createFollowVector({ + neuronId: mockNeuronId2, + topic: topic2, + followees: [mockNeuronId3, mockNeuronId4], + }), + createFollowVector({ + neuronId: mockNeuronId3, + topic: topic3, + followees: [mockNeuronId4, mockNeuronId5], + }), + createFollowVector({ + neuronId: mockNeuronId3, + topic: topic3, + followees: [mockNeuronId4, mockNeuronId5], + }), + createFollowVector({ + neuronId: mockNeuronId4, + topic: topic1, + followees: [mockNeuronId, mockNeuronId2, mockNeuronId4, mockNeuronId5], + }), + createFollowVector({ + neuronId: mockNeuronId4, + topic: topic2, + followees: [mockNeuronId5], + }), + createFollowVector({ + neuronId: mockNeuronId4, + topic: topic3, + followees: [mockNeuronId3, mockNeuronId5, mockNeuronId2], + }), + ]; + + writeToJson({ + data: vectors, + fileName: "follow.json", + }); + console.log("File created successfully"); + } catch (error) { + console.log("There was an error"); + console.log(error); + } +}; + +main(); diff --git a/scripts/test-vectors/20230511-register-vote.ts b/scripts/test-vectors/20230511-register-vote.ts new file mode 100644 index 000000000..ae53dd001 --- /dev/null +++ b/scripts/test-vectors/20230511-register-vote.ts @@ -0,0 +1,86 @@ +import { IDL } from "@dfinity/candid"; +import { NeuronId, ProposalId } from "@dfinity/nns/src"; +import { toRegisterVoteRequest } from "@dfinity/nns/src/canisters/governance/request.converters"; +import { Vote } from "@dfinity/nns/src/enums/governance.enums"; +import { ManageNeuronFn } from "./governance.idl"; +import { createBlob, writeToJson } from "./utils"; + +const mockNeuronId = BigInt(15374508381553347371); +const mockNeuronId2 = BigInt(8836564053576662908); +const proposalId1 = BigInt(1223); +const proposalId2 = BigInt(442233); +const proposalId3 = BigInt(233); +const vote1 = Vote.Yes; +const vote2 = Vote.No; + +const createRegisterVoteVector = ({ + neuronId, + proposalId, + vote, +}: { + neuronId: NeuronId; + proposalId: ProposalId; + vote: Vote; +}) => { + const rawRequestBody = toRegisterVoteRequest({ + neuronId, + proposalId, + vote, + }); + return { + blob_candid: createBlob({ + arg: IDL.encode(ManageNeuronFn.argTypes, [rawRequestBody]), + methodName: "manage_neuron", + }), + name: "Register Vote", + candid_request: rawRequestBody, + }; +}; + +const main = () => { + try { + const vectors = [ + createRegisterVoteVector({ + neuronId: mockNeuronId, + vote: vote1, + proposalId: proposalId1, + }), + createRegisterVoteVector({ + neuronId: mockNeuronId2, + vote: vote1, + proposalId: proposalId1, + }), + createRegisterVoteVector({ + neuronId: mockNeuronId, + vote: vote2, + proposalId: proposalId3, + }), + createRegisterVoteVector({ + neuronId: mockNeuronId, + vote: vote1, + proposalId: proposalId2, + }), + createRegisterVoteVector({ + neuronId: mockNeuronId2, + vote: vote2, + proposalId: proposalId1, + }), + createRegisterVoteVector({ + neuronId: mockNeuronId2, + vote: vote1, + proposalId: proposalId3, + }), + ]; + + writeToJson({ + data: vectors, + fileName: "register-vote.json", + }); + console.log("File created successfully"); + } catch (error) { + console.log("There was an error"); + console.log(error); + } +}; + +main(); diff --git a/scripts/test-vectors/20230511-remove-hotkey.ts b/scripts/test-vectors/20230511-remove-hotkey.ts new file mode 100644 index 000000000..9764970f5 --- /dev/null +++ b/scripts/test-vectors/20230511-remove-hotkey.ts @@ -0,0 +1,70 @@ +import { IDL } from "@dfinity/candid"; +import { NeuronId } from "@dfinity/nns/src"; +import { toRemoveHotkeyRequest } from "@dfinity/nns/src/canisters/governance/request.converters"; +import { Principal } from "@dfinity/principal"; +import { ManageNeuronFn } from "./governance.idl"; +import { createBlob, writeToJson } from "./utils"; + +const mockNeuronId = BigInt(15374508381553347371); +const mockNeuronId2 = BigInt(8836564053576662908); +const principal1 = Principal.fromText( + "krpzt-buecq-u3umg-7kb7r-j5jpx-twqwa-3ykc4-y3cnk-7kwvw-5bq6z-mae" +); +const principal2 = Principal.fromText( + "2dfd6-abjpf-eihu7-pwv6m-qnlbt-oszmg-kb26q-rvqms-onmuh-mwiq3-uqe" +); + +const createRemoveHotkeyVector = ({ + neuronId, + principal, +}: { + neuronId: NeuronId; + principal: Principal; +}) => { + const rawRequestBody = toRemoveHotkeyRequest({ + neuronId, + principal, + }); + return { + blob_candid: createBlob({ + arg: IDL.encode(ManageNeuronFn.argTypes, [rawRequestBody]), + methodName: "manage_neuron", + }), + name: "Remove Hotkey", + candid_request: rawRequestBody, + }; +}; + +const main = () => { + try { + const vectors = [ + createRemoveHotkeyVector({ + neuronId: mockNeuronId, + principal: principal1, + }), + createRemoveHotkeyVector({ + neuronId: mockNeuronId, + principal: principal2, + }), + createRemoveHotkeyVector({ + neuronId: mockNeuronId2, + principal: principal1, + }), + createRemoveHotkeyVector({ + neuronId: mockNeuronId2, + principal: principal2, + }), + ]; + + writeToJson({ + data: vectors, + fileName: "remove-hotkey.json", + }); + console.log("File created successfully"); + } catch (error) { + console.log("There was an error"); + console.log(error); + } +}; + +main(); From 99d44aad21efb9393c937fcecb42372ab191c37f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lloren=C3=A7?= Date: Mon, 22 May 2023 07:06:09 +0200 Subject: [PATCH 18/31] Test Vectors: 20230516 --- .../test-vectors/20230516-merge-maturity.ts | 63 ++++++++ .../20230516-send-icp-stake-neuron.ts | 151 ++++++++++++++++++ scripts/test-vectors/20230516-spawn-neuron.ts | 89 +++++++++++ 3 files changed, 303 insertions(+) create mode 100644 scripts/test-vectors/20230516-merge-maturity.ts create mode 100644 scripts/test-vectors/20230516-send-icp-stake-neuron.ts create mode 100644 scripts/test-vectors/20230516-spawn-neuron.ts diff --git a/scripts/test-vectors/20230516-merge-maturity.ts b/scripts/test-vectors/20230516-merge-maturity.ts new file mode 100644 index 000000000..b64bc51a3 --- /dev/null +++ b/scripts/test-vectors/20230516-merge-maturity.ts @@ -0,0 +1,63 @@ +import { IDL } from "@dfinity/candid"; +import { NeuronId } from "@dfinity/nns/src"; +import { toMergeMaturityRequest } from "@dfinity/nns/src/canisters/governance/request.converters"; +import { ManageNeuronFn } from "./governance.idl"; +import { createBlob, writeToJson } from "./utils"; + +const mockNeuronId = BigInt(15374508381553347371); +const mockNeuronId2 = BigInt(8836564053576662908); + +const createMergeMaturityVector = ({ + neuronId, + percentageToMerge, +}: { + neuronId: NeuronId; + percentageToMerge: number; +}) => { + const rawRequestBody = toMergeMaturityRequest({ + neuronId, + percentageToMerge, + }); + return { + blob_candid: createBlob({ + arg: IDL.encode(ManageNeuronFn.argTypes, [rawRequestBody]), + methodName: "manage_neuron", + }), + name: "Merge Maturity", + candid_request: rawRequestBody, + }; +}; + +const main = () => { + try { + const vectors = [ + createMergeMaturityVector({ + neuronId: mockNeuronId, + percentageToMerge: 100, + }), + createMergeMaturityVector({ + neuronId: mockNeuronId, + percentageToMerge: 10, + }), + createMergeMaturityVector({ + neuronId: mockNeuronId2, + percentageToMerge: 50, + }), + createMergeMaturityVector({ + neuronId: mockNeuronId2, + percentageToMerge: 84, + }), + ]; + + writeToJson({ + data: vectors, + fileName: "merge-maturity.json", + }); + console.log("File created successfully"); + } catch (error) { + console.log("There was an error"); + console.log(error); + } +}; + +main(); diff --git a/scripts/test-vectors/20230516-send-icp-stake-neuron.ts b/scripts/test-vectors/20230516-send-icp-stake-neuron.ts new file mode 100644 index 000000000..e3b332cd6 --- /dev/null +++ b/scripts/test-vectors/20230516-send-icp-stake-neuron.ts @@ -0,0 +1,151 @@ +import { IDL } from "@dfinity/candid"; +import { AccountIdentifier } from "@dfinity/nns/src/account_identifier"; +import { toTransferRawRequest } from "@dfinity/nns/src/canisters/ledger/ledger.request.converts"; +import { MAINNET_LEDGER_CANISTER_ID } from "@dfinity/nns/src/constants/canister_ids"; +import { Principal } from "@dfinity/principal"; +import { TransferFn } from "./ledger.idl"; +import { createBlob, writeToJson } from "./utils"; + +const account1 = AccountIdentifier.fromHex( + "d3e13d4777e22367532053190b6c6ccf57444a61337e996242b1abfb52cf92c8" +); +const account2 = AccountIdentifier.fromPrincipal({ + principal: Principal.fromText( + "bwz3t-ercuj-owo6s-4adfr-sbu4o-l72hg-kfhc5-5sapm-tj6bn-3scho-uqe" + ), +}); +const subaccount1 = [ + 10, 0, 0, 0, 0, 0, 48, 0, 75, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, +]; +const subaccount2 = [ + 29, 2, 220, 105, 83, 29, 110, 131, 117, 207, 8, 232, 14, 110, 205, 215, 59, + 147, 176, 255, 96, 204, 41, 123, 138, 63, 234, 83, 28, 2, 0, 0, +]; +const createdAt1 = + BigInt(new Date("05-20-1992 21:33:00").getTime()) * BigInt(1e6); +const createdAt2 = + BigInt(new Date("05-28-2011 22:33:00").getTime()) * BigInt(1e6); + +const createSendIcpVector = ({ + to, + amount, + memo, + fee, + fromSubAccount, + createdAt, +}: { + to: AccountIdentifier; + amount: bigint; + memo: bigint; + fee: bigint; + fromSubAccount?: number[]; + createdAt?: bigint; +}) => { + const rawRequestBody = toTransferRawRequest({ + to, + amount, + // Used in HW + memo: memo || BigInt(0), + fee, + fromSubAccount, + createdAt, + }); + return { + blob_candid: createBlob({ + arg: IDL.encode(TransferFn.argTypes, [rawRequestBody]), + methodName: "transfer", + canisterId: MAINNET_LEDGER_CANISTER_ID, + }), + name: memo === BigInt(0) ? "Send ICP" : "Stake Neuron", + candid_request: rawRequestBody, + }; +}; + +const main = () => { + try { + const vectors = [ + createSendIcpVector({ + to: account1, + amount: BigInt(1_000_000_000), + fee: BigInt(10_000), + memo: BigInt(0), + }), + createSendIcpVector({ + to: account2, + amount: BigInt(333_000_000_000), + fee: BigInt(10_000), + memo: BigInt(0), + fromSubAccount: subaccount1, + }), + createSendIcpVector({ + to: account2, + amount: BigInt(1_432_222_000), + fee: BigInt(10_000), + memo: BigInt(0), + createdAt: createdAt1, + }), + createSendIcpVector({ + to: account1, + amount: BigInt(2_000_000_000), + fee: BigInt(10_000), + memo: BigInt(0), + createdAt: createdAt2, + }), + createSendIcpVector({ + to: account1, + amount: BigInt(1_222_000_345), + fee: BigInt(10_000), + memo: BigInt(0), + fromSubAccount: subaccount2, + }), + createSendIcpVector({ + to: account1, + amount: BigInt(1_000_000_000), + fee: BigInt(10_000), + memo: BigInt(0), + fromSubAccount: subaccount1, + createdAt: createdAt1, + }), + createSendIcpVector({ + to: account2, + amount: BigInt(100_000_000_000), + fee: BigInt(20_000), + memo: BigInt(0), + }), + // Stake Neuron + createSendIcpVector({ + to: account2, + amount: BigInt(100_000_000_000), + fee: BigInt(10_000), + memo: BigInt(123132444422), + fromSubAccount: subaccount1, + }), + createSendIcpVector({ + to: account2, + amount: BigInt(100_000_000_000), + fee: BigInt(10_000), + memo: BigInt(1231236788755), + fromSubAccount: subaccount2, + }), + createSendIcpVector({ + to: account2, + amount: BigInt(230_000_000_000), + fee: BigInt(10_000), + memo: BigInt(123123521677), + createdAt: createdAt1, + }), + ]; + + writeToJson({ + data: vectors, + fileName: "send-icp-stake-neuron.json", + }); + console.log("File created successfully"); + } catch (error) { + console.log("There was an error"); + console.log(error); + } +}; + +main(); diff --git a/scripts/test-vectors/20230516-spawn-neuron.ts b/scripts/test-vectors/20230516-spawn-neuron.ts new file mode 100644 index 000000000..a48fca35f --- /dev/null +++ b/scripts/test-vectors/20230516-spawn-neuron.ts @@ -0,0 +1,89 @@ +import { IDL } from "@dfinity/candid"; +import { NeuronId } from "@dfinity/nns/src"; +import { toSpawnNeuronRequest } from "@dfinity/nns/src/canisters/governance/request.converters"; +import { Principal } from "@dfinity/principal"; +import { ManageNeuronFn } from "./governance.idl"; +import { createBlob, writeToJson } from "./utils"; + +const mockNeuronId = BigInt(15374508381553347371); +const mockNeuronId2 = BigInt(8836564053576662908); +const principal1 = Principal.fromText( + "krpzt-buecq-u3umg-7kb7r-j5jpx-twqwa-3ykc4-y3cnk-7kwvw-5bq6z-mae" +); +const principal2 = Principal.fromText( + "2dfd6-abjpf-eihu7-pwv6m-qnlbt-oszmg-kb26q-rvqms-onmuh-mwiq3-uqe" +); + +const createSpawnNeuronVector = ({ + neuronId, + percentageToSpawn, + newController, + nonce, +}: { + neuronId: NeuronId; + percentageToSpawn?: number; + newController?: Principal; + nonce?: bigint; +}) => { + const rawRequestBody = toSpawnNeuronRequest({ + neuronId, + percentageToSpawn, + newController, + nonce, + }); + return { + blob_candid: createBlob({ + arg: IDL.encode(ManageNeuronFn.argTypes, [rawRequestBody]), + methodName: "manage_neuron", + }), + name: "Spawn Neuron", + candid_request: rawRequestBody, + }; +}; + +const main = () => { + try { + const vectors = [ + createSpawnNeuronVector({ + neuronId: mockNeuronId, + }), + createSpawnNeuronVector({ + neuronId: mockNeuronId, + percentageToSpawn: 100, + }), + createSpawnNeuronVector({ + neuronId: mockNeuronId, + percentageToSpawn: 10, + newController: principal1, + }), + createSpawnNeuronVector({ + neuronId: mockNeuronId, + percentageToSpawn: 33, + newController: principal2, + nonce: BigInt(1444), + }), + createSpawnNeuronVector({ + neuronId: mockNeuronId2, + percentageToSpawn: 50, + newController: principal2, + nonce: BigInt(1444), + }), + createSpawnNeuronVector({ + neuronId: mockNeuronId2, + percentageToSpawn: 84, + nonce: BigInt(1444), + }), + ]; + + writeToJson({ + data: vectors, + fileName: "spawn-neuron.json", + }); + console.log("File created successfully"); + } catch (error) { + console.log("There was an error"); + console.log(error); + } +}; + +main(); From af9763cfbf21dade19c0626cdbab974bbe72dd74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lloren=C3=A7?= Date: Wed, 24 May 2023 11:23:47 +0200 Subject: [PATCH 19/31] Test Vectors: 20230524 --- .../20230516-send-icp-stake-neuron.ts | 46 +++++++++++++++++-- 1 file changed, 41 insertions(+), 5 deletions(-) diff --git a/scripts/test-vectors/20230516-send-icp-stake-neuron.ts b/scripts/test-vectors/20230516-send-icp-stake-neuron.ts index e3b332cd6..8225bc04a 100644 --- a/scripts/test-vectors/20230516-send-icp-stake-neuron.ts +++ b/scripts/test-vectors/20230516-send-icp-stake-neuron.ts @@ -1,8 +1,12 @@ import { IDL } from "@dfinity/candid"; -import { AccountIdentifier } from "@dfinity/nns/src/account_identifier"; +import { + AccountIdentifier, + SubAccount, +} from "@dfinity/nns/src/account_identifier"; import { toTransferRawRequest } from "@dfinity/nns/src/canisters/ledger/ledger.request.converts"; import { MAINNET_LEDGER_CANISTER_ID } from "@dfinity/nns/src/constants/canister_ids"; import { Principal } from "@dfinity/principal"; +import { arrayOfNumberToUint8Array } from "@dfinity/utils/src"; import { TransferFn } from "./ledger.idl"; import { createBlob, writeToJson } from "./utils"; @@ -14,6 +18,14 @@ const account2 = AccountIdentifier.fromPrincipal({ "bwz3t-ercuj-owo6s-4adfr-sbu4o-l72hg-kfhc5-5sapm-tj6bn-3scho-uqe" ), }); + +const defaultCaller = Principal.fromText( + "5upke-tazvi-6ufqc-i3v6r-j4gpu-dpwti-obhal-yb5xj-ue32x-ktkql-rqe" +); +const caller1 = Principal.fromText( + "bwz3t-ercuj-owo6s-4adfr-sbu4o-l72hg-kfhc5-5sapm-tj6bn-3scho-uqe" +); + const subaccount1 = [ 10, 0, 0, 0, 0, 0, 48, 0, 75, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -34,6 +46,8 @@ const createSendIcpVector = ({ fee, fromSubAccount, createdAt, + isStakeNeuron = false, + caller = defaultCaller, }: { to: AccountIdentifier; amount: bigint; @@ -41,6 +55,8 @@ const createSendIcpVector = ({ fee: bigint; fromSubAccount?: number[]; createdAt?: bigint; + isStakeNeuron?: boolean; + caller?: Principal; }) => { const rawRequestBody = toTransferRawRequest({ to, @@ -51,13 +67,28 @@ const createSendIcpVector = ({ fromSubAccount, createdAt, }); + + const subAccount = + fromSubAccount === undefined + ? undefined + : (SubAccount.fromBytes( + arrayOfNumberToUint8Array(fromSubAccount) + ) as SubAccount); + return { blob_candid: createBlob({ arg: IDL.encode(TransferFn.argTypes, [rawRequestBody]), methodName: "transfer", canisterId: MAINNET_LEDGER_CANISTER_ID, }), - name: memo === BigInt(0) ? "Send ICP" : "Stake Neuron", + name: isStakeNeuron ? "Send ICP" : "Stake Neuron", + screen: { + fromAccount: AccountIdentifier.fromPrincipal({ + principal: caller, + subAccount, + }).toHex(), + toAccount: to.toHex(), + }, candid_request: rawRequestBody, }; }; @@ -89,8 +120,9 @@ const main = () => { to: account1, amount: BigInt(2_000_000_000), fee: BigInt(10_000), - memo: BigInt(0), + memo: BigInt(128371233), createdAt: createdAt2, + caller: caller1, }), createSendIcpVector({ to: account1, @@ -98,12 +130,13 @@ const main = () => { fee: BigInt(10_000), memo: BigInt(0), fromSubAccount: subaccount2, + caller: caller1, }), createSendIcpVector({ to: account1, amount: BigInt(1_000_000_000), fee: BigInt(10_000), - memo: BigInt(0), + memo: BigInt(12123242222), fromSubAccount: subaccount1, createdAt: createdAt1, }), @@ -111,7 +144,7 @@ const main = () => { to: account2, amount: BigInt(100_000_000_000), fee: BigInt(20_000), - memo: BigInt(0), + memo: BigInt(9984628273), }), // Stake Neuron createSendIcpVector({ @@ -120,6 +153,7 @@ const main = () => { fee: BigInt(10_000), memo: BigInt(123132444422), fromSubAccount: subaccount1, + isStakeNeuron: true, }), createSendIcpVector({ to: account2, @@ -127,6 +161,7 @@ const main = () => { fee: BigInt(10_000), memo: BigInt(1231236788755), fromSubAccount: subaccount2, + isStakeNeuron: true, }), createSendIcpVector({ to: account2, @@ -134,6 +169,7 @@ const main = () => { fee: BigInt(10_000), memo: BigInt(123123521677), createdAt: createdAt1, + isStakeNeuron: true, }), ]; From 6170bcc2b845a073545240c574b30434bf95537b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lloren=C3=A7?= Date: Wed, 24 May 2023 13:49:59 +0200 Subject: [PATCH 20/31] Test Vectors: 20230524 --- scripts/test-vectors/20230524-icrc-1.ts | 296 ++++++++++++++++++++++++ scripts/test-vectors/utils.ts | 5 +- 2 files changed, 297 insertions(+), 4 deletions(-) create mode 100644 scripts/test-vectors/20230524-icrc-1.ts diff --git a/scripts/test-vectors/20230524-icrc-1.ts b/scripts/test-vectors/20230524-icrc-1.ts new file mode 100644 index 000000000..80489f76d --- /dev/null +++ b/scripts/test-vectors/20230524-icrc-1.ts @@ -0,0 +1,296 @@ +import { IDL } from "@dfinity/candid"; +import { toTransferArg } from "@dfinity/ledger/src/converters/ledger.converters"; +import { TransferParams } from "@dfinity/ledger/src/types/ledger.params"; +import { E8S_PER_TOKEN } from "@dfinity/nns/src/constants/constants"; +import { Principal } from "@dfinity/principal"; +import { + arrayOfNumberToUint8Array, + fromNullable, + numberToUint8Array, + uint8ArrayToBigInt, +} from "@dfinity/utils"; +import { MAINNET_LEDGER_CANISTER_ID } from "../../packages/nns/src/constants/canister_ids"; +import { transferFn } from "./sns-ledger.idl"; +import { + createBlob, + defaultCaller, + splitAccount, + splitPrincipal, + writeToJson, +} from "./utils"; + +/** + * Issue: https://github.com/Zondax/ledger-icp/issues/190 + */ + +/** + * Specific business logic. + * + * - When is ICP and when not. + * - Convert memo to bigint. + * - When to show fee and when not. + * - Default fee for ICP. + * - Textual representation of accounts. + * - How to create the "source" account. + * - When to show "ICP" and when "Tokens". + */ + +interface Params extends TransferParams { + canisterId: Principal; + owner: Principal; +} + +// Fee is optional, if not provided, it will be set to 10000 which is the ICP fee +const ICP_DEFAULT_FEE_E8S = 10_000; + +const createTestVector = (params: Params) => { + const rawRequestBody = toTransferArg(params); + const isICP = + params.canisterId.toText() === MAINNET_LEDGER_CANISTER_ID.toText(); + + let outputTxType = isICP ? "Send ICP" : "Send Tokens"; + const canisterIdOutputs = splitPrincipal(params.canisterId).map( + (data, i, elements) => `Canister Id [${i + 1}/${elements.length}] : ${data}` + ); + + const fromOutputs = splitAccount( + { + owner: params.owner, + subaccount: params.from_subaccount, + }, + "From account" + ); + const toOutputs = splitAccount( + { + owner: params.to.owner, + subaccount: fromNullable(params.to.subaccount), + }, + "To account" + ); + + const amountToken = Number(params.amount) / Number(E8S_PER_TOKEN); + const paymentOutput = isICP + ? `Payment (ICP) : ${amountToken}` + : `Payment (Tokens) : ${amountToken}`; + + // Do not show fee if it's not present in the request body. + // Except if it's ICP, in which case we always show the fee. + let feeOutput: string | undefined; + if (isICP || params.fee !== undefined) { + const feeToken = + Number(params.fee ?? ICP_DEFAULT_FEE_E8S) / Number(E8S_PER_TOKEN); + feeOutput = isICP + ? `Maximum fee (ICP) : ${feeToken}` + : `Maximum fee (Tokens) : ${feeToken}`; + } + + const memoOutput = + params.memo !== undefined + ? `Memo : ${uint8ArrayToBigInt(params.memo).toString()}` + : "Memo : 0"; + + const output = [ + outputTxType, + ...(isICP ? [] : canisterIdOutputs), + ...fromOutputs, + ...toOutputs, + paymentOutput, + ...(feeOutput !== undefined ? [feeOutput] : []), + memoOutput, + ]; + return { + blob_candid: createBlob({ + arg: IDL.encode(transferFn.argTypes, [rawRequestBody]), + methodName: "icrc1_transfer", + canisterId: params.canisterId, + caller: params.owner, + }), + output: output.map((element, index) => `${index + 1} | ${element}`), + isICP, + name: "ICRC1 Transfer", + canisterId: params.canisterId.toText(), + caller: params.owner.toText() ?? defaultCaller.toText(), + candid_request: rawRequestBody, + }; +}; + +const main = () => { + try { + const subaccount1 = arrayOfNumberToUint8Array([ + 215, 232, 81, 101, 44, 208, 50, 186, 94, 215, 107, 23, 246, 38, 170, 71, + 130, 159, 6, 229, 35, 90, 13, 88, 14, 150, 211, 114, 119, 41, 234, 36, + ]); + const subaccount2 = arrayOfNumberToUint8Array([ + 163, 110, 20, 60, 134, 231, 228, 113, 231, 199, 25, 80, 100, 135, 207, + 122, 108, 244, 13, 167, 99, 97, 174, 175, 238, 81, 51, 225, 217, 172, 234, + 61, + ]); + const principal1 = Principal.fromText( + "krpzt-buecq-u3umg-7kb7r-j5jpx-twqwa-3ykc4-y3cnk-7kwvw-5bq6z-mae" + ); + const principal2 = Principal.fromText( + "2dfd6-abjpf-eihu7-pwv6m-qnlbt-oszmg-kb26q-rvqms-onmuh-mwiq3-uqe" + ); + const canisterId1 = Principal.fromText("ppmzm-3aaaa-aaaaa-aacpq-cai"); + const canisterId2 = Principal.fromText("s24we-diaaa-aaaaa-aaaka-cai"); + const vectors = [ + createTestVector({ + owner: principal1, + to: { + owner: principal2, + subaccount: [], + }, + amount: BigInt(100_000_000), + canisterId: canisterId1, + }), + createTestVector({ + owner: principal1, + to: { + owner: principal2, + subaccount: [], + }, + amount: BigInt(100_000_000), + from_subaccount: subaccount1, + fee: BigInt(10_000), + canisterId: canisterId1, + created_at_time: BigInt(1629200000000000000), + }), + createTestVector({ + owner: principal1, + to: { + owner: principal2, + subaccount: [subaccount2], + }, + amount: BigInt(330_000_000), + from_subaccount: subaccount1, + fee: BigInt(10_000), + canisterId: canisterId1, + created_at_time: BigInt(1629200000000000000), + }), + createTestVector({ + owner: principal1, + to: { + owner: principal2, + subaccount: [subaccount2], + }, + amount: BigInt(330_000_000), + memo: numberToUint8Array(11223312), + fee: BigInt(30_000), + canisterId: canisterId2, + created_at_time: BigInt(1675249266635000000), + }), + createTestVector({ + owner: principal2, + to: { + owner: principal1, + subaccount: [], + }, + amount: BigInt(314_000_000), + memo: numberToUint8Array(11223312), + canisterId: canisterId1, + created_at_time: BigInt(1675249266635000000), + }), + createTestVector({ + owner: principal2, + to: { + owner: principal1, + subaccount: [subaccount1], + }, + amount: BigInt(1331_400_000), + memo: numberToUint8Array(11223312), + from_subaccount: subaccount2, + fee: BigInt(20_000), + canisterId: canisterId1, + created_at_time: BigInt(1675249266635000000), + }), + createTestVector({ + owner: principal1, + to: { + owner: principal2, + subaccount: [], + }, + amount: BigInt(100_000_000), + canisterId: MAINNET_LEDGER_CANISTER_ID, + }), + createTestVector({ + owner: principal2, + to: { + owner: principal1, + subaccount: [subaccount1], + }, + amount: BigInt(31_400_000), + canisterId: MAINNET_LEDGER_CANISTER_ID, + }), + createTestVector({ + owner: principal2, + to: { + owner: principal1, + subaccount: [subaccount1], + }, + amount: BigInt(31_400_000), + from_subaccount: subaccount2, + canisterId: MAINNET_LEDGER_CANISTER_ID, + created_at_time: BigInt(1675249266635000000), + }), + createTestVector({ + owner: principal2, + to: { + owner: principal1, + subaccount: [subaccount1], + }, + amount: BigInt(31_400_000), + memo: numberToUint8Array(11223312), + canisterId: MAINNET_LEDGER_CANISTER_ID, + created_at_time: BigInt(1675249266635000000), + }), + createTestVector({ + owner: principal2, + to: { + owner: principal1, + subaccount: [subaccount1], + }, + amount: BigInt(31_400_000), + fee: BigInt(100_000), + canisterId: MAINNET_LEDGER_CANISTER_ID, + created_at_time: BigInt(1629200000000000000), + }), + createTestVector({ + owner: principal2, + to: { + owner: principal1, + subaccount: [subaccount1], + }, + amount: BigInt(131_400_000), + fee: BigInt(30_000), + from_subaccount: subaccount2, + memo: numberToUint8Array(11223312), + canisterId: MAINNET_LEDGER_CANISTER_ID, + created_at_time: BigInt(1629200000000000000), + }), + createTestVector({ + owner: principal2, + to: { + owner: principal1, + subaccount: [subaccount1], + }, + amount: BigInt(131_400_000), + fee: BigInt(30_000), + from_subaccount: subaccount2, + memo: numberToUint8Array(11223312), + canisterId: MAINNET_LEDGER_CANISTER_ID, + created_at_time: BigInt(1675249266635000000), + }), + ]; + + writeToJson({ + data: vectors, + fileName: "icrc-1.json", + }); + console.log("File created successfully"); + } catch (error) { + console.log("There was an error"); + console.log(error); + } +}; + +main(); diff --git a/scripts/test-vectors/utils.ts b/scripts/test-vectors/utils.ts index e1a540cd7..2b0fbcf97 100644 --- a/scripts/test-vectors/utils.ts +++ b/scripts/test-vectors/utils.ts @@ -157,10 +157,7 @@ export const splitAccount = ( account: IcrcAccount, screenText: string ): string[] => { - return splitPrincipal(Principal.fromText(encodeIcrcAccount(account))).map( - (data, i, elements) => - `${screenText} [${i + 1}/${elements.length}] : ${data}` - ); + return splitString(encodeIcrcAccount(account), screenText); }; export const permissionMapper: Record = { From ddf7ddd28c21bee088cff14e2cb75224ad8d0a4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lloren=C3=A7?= Date: Thu, 25 May 2023 08:27:48 +0200 Subject: [PATCH 21/31] Test Vectors: Change in stake neuron from 20230516 --- .../20230516-send-icp-stake-neuron.ts | 65 ++++++++++++++----- 1 file changed, 47 insertions(+), 18 deletions(-) diff --git a/scripts/test-vectors/20230516-send-icp-stake-neuron.ts b/scripts/test-vectors/20230516-send-icp-stake-neuron.ts index 8225bc04a..bc5481e0a 100644 --- a/scripts/test-vectors/20230516-send-icp-stake-neuron.ts +++ b/scripts/test-vectors/20230516-send-icp-stake-neuron.ts @@ -4,9 +4,14 @@ import { SubAccount, } from "@dfinity/nns/src/account_identifier"; import { toTransferRawRequest } from "@dfinity/nns/src/canisters/ledger/ledger.request.converts"; -import { MAINNET_LEDGER_CANISTER_ID } from "@dfinity/nns/src/constants/canister_ids"; +import { + MAINNET_GOVERNANCE_CANISTER_ID, + MAINNET_LEDGER_CANISTER_ID, +} from "@dfinity/nns/src/constants/canister_ids"; import { Principal } from "@dfinity/principal"; +import { asciiStringToByteArray, uint8ArrayToBigInt } from "@dfinity/utils"; import { arrayOfNumberToUint8Array } from "@dfinity/utils/src"; +import { sha256 } from "js-sha256"; import { TransferFn } from "./ledger.idl"; import { createBlob, writeToJson } from "./utils"; @@ -39,6 +44,20 @@ const createdAt1 = const createdAt2 = BigInt(new Date("05-28-2011 22:33:00").getTime()) * BigInt(1e6); +const randomBytes1 = new Uint8Array([136, 67, 218, 72, 46, 254, 79, 124]); +const randomBytes2 = new Uint8Array([202, 204, 126, 241, 130, 112, 8, 122]); +const randomBytes3 = new Uint8Array([178, 247, 215, 62, 199, 137, 175, 189]); + +const buildNeuronStakeSubAccount = ( + nonce: Uint8Array, + principal: Principal +): SubAccount => { + const padding = asciiStringToByteArray("neuron-stake"); + const shaObj = sha256.create(); + shaObj.update([0x0c, ...padding, ...principal.toUint8Array(), ...nonce]); + return SubAccount.fromBytes(new Uint8Array(shaObj.array())) as SubAccount; +}; + const createSendIcpVector = ({ to, amount, @@ -46,23 +65,39 @@ const createSendIcpVector = ({ fee, fromSubAccount, createdAt, - isStakeNeuron = false, caller = defaultCaller, + randomBytes, }: { - to: AccountIdentifier; + to?: AccountIdentifier; amount: bigint; - memo: bigint; + memo?: bigint; fee: bigint; fromSubAccount?: number[]; createdAt?: bigint; - isStakeNeuron?: boolean; caller?: Principal; + randomBytes?: Uint8Array; }) => { + const isStakeNeuron = to === undefined; + let accountIdentifier; + let nonce; + if (randomBytes !== undefined) { + nonce = uint8ArrayToBigInt(randomBytes); + const toSubAccount = buildNeuronStakeSubAccount( + randomBytes, + MAINNET_GOVERNANCE_CANISTER_ID + ); + accountIdentifier = AccountIdentifier.fromPrincipal({ + principal: MAINNET_GOVERNANCE_CANISTER_ID, + subAccount: toSubAccount, + }); + } + const toAccount = to ?? accountIdentifier; + const rawRequestBody = toTransferRawRequest({ - to, + to: toAccount as AccountIdentifier, amount, // Used in HW - memo: memo || BigInt(0), + memo: memo ?? nonce ?? BigInt(0), fee, fromSubAccount, createdAt, @@ -81,13 +116,13 @@ const createSendIcpVector = ({ methodName: "transfer", canisterId: MAINNET_LEDGER_CANISTER_ID, }), - name: isStakeNeuron ? "Send ICP" : "Stake Neuron", + name: isStakeNeuron ? "Stake Neuron" : "Send ICP", screen: { fromAccount: AccountIdentifier.fromPrincipal({ principal: caller, subAccount, }).toHex(), - toAccount: to.toHex(), + toAccount: isStakeNeuron ? "Stake Neuron" : to?.toHex(), }, candid_request: rawRequestBody, }; @@ -148,28 +183,22 @@ const main = () => { }), // Stake Neuron createSendIcpVector({ - to: account2, amount: BigInt(100_000_000_000), fee: BigInt(10_000), - memo: BigInt(123132444422), fromSubAccount: subaccount1, - isStakeNeuron: true, + randomBytes: randomBytes1, }), createSendIcpVector({ - to: account2, amount: BigInt(100_000_000_000), fee: BigInt(10_000), - memo: BigInt(1231236788755), fromSubAccount: subaccount2, - isStakeNeuron: true, + randomBytes: randomBytes2, }), createSendIcpVector({ - to: account2, amount: BigInt(230_000_000_000), fee: BigInt(10_000), - memo: BigInt(123123521677), createdAt: createdAt1, - isStakeNeuron: true, + randomBytes: randomBytes3, }), ]; From 79dedb17fedcff4517e9765cb995d539cc1a6742 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lloren=C3=A7?= Date: Thu, 25 May 2023 10:24:43 +0200 Subject: [PATCH 22/31] Test Vectors: Fix neuron stake vector 20230516 --- .../20230516-send-icp-stake-neuron.ts | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/scripts/test-vectors/20230516-send-icp-stake-neuron.ts b/scripts/test-vectors/20230516-send-icp-stake-neuron.ts index bc5481e0a..9296aca56 100644 --- a/scripts/test-vectors/20230516-send-icp-stake-neuron.ts +++ b/scripts/test-vectors/20230516-send-icp-stake-neuron.ts @@ -74,7 +74,7 @@ const createSendIcpVector = ({ fee: bigint; fromSubAccount?: number[]; createdAt?: bigint; - caller?: Principal; + caller: Principal; randomBytes?: Uint8Array; }) => { const isStakeNeuron = to === undefined; @@ -82,10 +82,7 @@ const createSendIcpVector = ({ let nonce; if (randomBytes !== undefined) { nonce = uint8ArrayToBigInt(randomBytes); - const toSubAccount = buildNeuronStakeSubAccount( - randomBytes, - MAINNET_GOVERNANCE_CANISTER_ID - ); + const toSubAccount = buildNeuronStakeSubAccount(randomBytes, caller); accountIdentifier = AccountIdentifier.fromPrincipal({ principal: MAINNET_GOVERNANCE_CANISTER_ID, subAccount: toSubAccount, @@ -133,12 +130,14 @@ const main = () => { const vectors = [ createSendIcpVector({ to: account1, + caller: defaultCaller, amount: BigInt(1_000_000_000), fee: BigInt(10_000), memo: BigInt(0), }), createSendIcpVector({ to: account2, + caller: defaultCaller, amount: BigInt(333_000_000_000), fee: BigInt(10_000), memo: BigInt(0), @@ -146,6 +145,7 @@ const main = () => { }), createSendIcpVector({ to: account2, + caller: defaultCaller, amount: BigInt(1_432_222_000), fee: BigInt(10_000), memo: BigInt(0), @@ -169,6 +169,7 @@ const main = () => { }), createSendIcpVector({ to: account1, + caller: defaultCaller, amount: BigInt(1_000_000_000), fee: BigInt(10_000), memo: BigInt(12123242222), @@ -177,6 +178,7 @@ const main = () => { }), createSendIcpVector({ to: account2, + caller: defaultCaller, amount: BigInt(100_000_000_000), fee: BigInt(20_000), memo: BigInt(9984628273), @@ -185,18 +187,21 @@ const main = () => { createSendIcpVector({ amount: BigInt(100_000_000_000), fee: BigInt(10_000), + caller: defaultCaller, fromSubAccount: subaccount1, randomBytes: randomBytes1, }), createSendIcpVector({ amount: BigInt(100_000_000_000), fee: BigInt(10_000), + caller: defaultCaller, fromSubAccount: subaccount2, randomBytes: randomBytes2, }), createSendIcpVector({ amount: BigInt(230_000_000_000), fee: BigInt(10_000), + caller: defaultCaller, createdAt: createdAt1, randomBytes: randomBytes3, }), From f8484d3053185b8d84f70f431eae302e2bd6470d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lloren=C3=A7?= Date: Wed, 12 Jul 2023 10:23:25 +0200 Subject: [PATCH 23/31] 20230712: SNS Set Dissolve Timestamp --- .../20230712-sns-set-dissolve-timestamp.ts | 128 ++++++++++++++++++ scripts/test-vectors/date-utils.ts | 60 ++++++++ 2 files changed, 188 insertions(+) create mode 100644 scripts/test-vectors/20230712-sns-set-dissolve-timestamp.ts create mode 100644 scripts/test-vectors/date-utils.ts diff --git a/scripts/test-vectors/20230712-sns-set-dissolve-timestamp.ts b/scripts/test-vectors/20230712-sns-set-dissolve-timestamp.ts new file mode 100644 index 000000000..1c6d59d10 --- /dev/null +++ b/scripts/test-vectors/20230712-sns-set-dissolve-timestamp.ts @@ -0,0 +1,128 @@ +import { IDL } from "@dfinity/candid"; +import { Principal } from "@dfinity/principal"; +import { SnsSetDissolveTimestampParams } from "@dfinity/sns/src"; +import { toSetDissolveTimestampRequest } from "@dfinity/sns/src/converters/governance.converters"; +import { arrayOfNumberToUint8Array } from "@dfinity/utils"; +import { + secondsToDissolveDelayDuration, + SECONDS_IN_DAY, + SECONDS_IN_MONTH, + SECONDS_IN_YEAR, +} from "./date-utils"; +import { ManageNeuronFn } from "./sns-governance.idl"; +import { bytesToHexString, createBlob, writeToJson } from "./utils"; + +/** + * Issue: https://github.com/Zondax/ledger-icp/issues/212 + */ + +interface Params extends SnsSetDissolveTimestampParams { + canisterId: Principal; +} +const nowInSeconds = Math.round(Date.now() / 1000); + +const createTestVector = (params: Params) => { + const rawRequestBody = toSetDissolveTimestampRequest(params); + const neuronIdString = bytesToHexString(Array.from(params.neuronId.id)); + const timestampLabel = secondsToDissolveDelayDuration( + params.dissolveTimestampSeconds - BigInt(nowInSeconds) + ); + console.log("in da test vector", params.dissolveTimestampSeconds); + return { + blob_candid: createBlob({ + arg: IDL.encode(ManageNeuronFn.argTypes, [rawRequestBody]), + methodName: "manage_neuron", + canisterId: params.canisterId, + }), + nowInSeconds, + timestampLabel, + neuronIdString: neuronIdString, + name: "Set Dissolve Delay Timestamp", + canisterId: params.canisterId.toText(), + candid_request: rawRequestBody, + }; +}; + +const main = () => { + try { + const id1 = arrayOfNumberToUint8Array([ + 215, 232, 81, 101, 44, 208, 50, 186, 94, 215, 107, 23, 246, 38, 170, 71, + 130, 159, 6, 229, 35, 90, 13, 88, 14, 150, 211, 114, 119, 41, 234, 36, + ]); + const id2 = arrayOfNumberToUint8Array([ + 163, 110, 20, 60, 134, 231, 228, 113, 231, 199, 25, 80, 100, 135, 207, + 122, 108, 244, 13, 167, 99, 97, 174, 175, 238, 81, 51, 225, 217, 172, 234, + 61, + ]); + const canisterId1 = Principal.fromText("ppmzm-3aaaa-aaaaa-aacpq-cai"); + const canisterId2 = Principal.fromText("s24we-diaaa-aaaaa-aaaka-cai"); + const inOneYear = BigInt(nowInSeconds + SECONDS_IN_YEAR); + const nextYearAndAHalf = BigInt( + Math.round(nowInSeconds + SECONDS_IN_YEAR + SECONDS_IN_MONTH * 6) + ); + const inOneYearMonthsAndDays = BigInt( + Math.round( + nowInSeconds + + SECONDS_IN_YEAR + + SECONDS_IN_MONTH * 3 + + SECONDS_IN_DAY * 18 + ) + ); + const inSixMonths = BigInt(Math.round(nowInSeconds + SECONDS_IN_MONTH * 6)); + const inEightYears = BigInt(Math.round(nowInSeconds + SECONDS_IN_YEAR * 8)); + + const vectors = [ + createTestVector({ + neuronId: { id: id1 }, + dissolveTimestampSeconds: inOneYear, + canisterId: canisterId1, + }), + createTestVector({ + neuronId: { id: id1 }, + dissolveTimestampSeconds: inSixMonths, + canisterId: canisterId1, + }), + createTestVector({ + neuronId: { id: id1 }, + dissolveTimestampSeconds: inOneYearMonthsAndDays, + canisterId: canisterId2, + }), + createTestVector({ + neuronId: { id: id1 }, + dissolveTimestampSeconds: nextYearAndAHalf, + canisterId: canisterId2, + }), + createTestVector({ + neuronId: { id: id2 }, + dissolveTimestampSeconds: inOneYearMonthsAndDays, + canisterId: canisterId2, + }), + createTestVector({ + neuronId: { id: id2 }, + dissolveTimestampSeconds: inSixMonths, + canisterId: canisterId2, + }), + createTestVector({ + neuronId: { id: id2 }, + dissolveTimestampSeconds: inEightYears, + canisterId: canisterId1, + }), + createTestVector({ + neuronId: { id: id2 }, + dissolveTimestampSeconds: nextYearAndAHalf, + canisterId: canisterId1, + }), + ]; + + writeToJson({ + data: vectors, + fileName: "sns-set-dissolve-delay-timestamp.json", + }); + console.log("File created successfully"); + } catch (error) { + console.log("There was an error"); + console.log(error); + } +}; + +main(); diff --git a/scripts/test-vectors/date-utils.ts b/scripts/test-vectors/date-utils.ts new file mode 100644 index 000000000..9df55b1ea --- /dev/null +++ b/scripts/test-vectors/date-utils.ts @@ -0,0 +1,60 @@ +const SECONDS_IN_MINUTE = 60; +const SECONDS_IN_HOUR = SECONDS_IN_MINUTE * 60; +export const SECONDS_IN_DAY = SECONDS_IN_HOUR * 24; +// Taking into account 1/4 of leap year +export const SECONDS_IN_YEAR = ((4 * 365 + 1) * SECONDS_IN_DAY) / 4; +export const SECONDS_IN_MONTH = SECONDS_IN_YEAR / 12; + +type LabelKey = "year" | "month" | "day" | "hour" | "minute" | "second"; +type LabelInfo = { + labelKey: LabelKey; + amount: number; +}; +const createLabel = (labelKey: LabelKey, amount: bigint): LabelInfo => ({ + labelKey, + amount: Number(amount), +}); + +const labels: { [key: string]: string } = { + year: "year", + year_plural: "years", + month: "month", + month_plural: "months", + day: "day", + day_plural: "days", +}; + +/** + * Displays years, months and days. + * + * Uses constants for `year` and `month`: + * - a year = 365.25 * 24 * 60 * 60 + * - a month = 1 year / 12 + * - rounds up days + * + * @param seconds + */ +export const secondsToDissolveDelayDuration = (seconds: bigint): string => { + const years = seconds / BigInt(SECONDS_IN_YEAR); + const months = (seconds % BigInt(SECONDS_IN_YEAR)) / BigInt(SECONDS_IN_MONTH); + const days = BigInt( + Math.ceil((Number(seconds) % SECONDS_IN_MONTH) / SECONDS_IN_DAY) + ); + const periods = [ + createLabel("year", years), + createLabel("month", months), + createLabel("day", days), + ]; + + return periods + .filter(({ amount }) => amount > 0) + .map( + (labelInfo) => + `${labelInfo.amount} ${ + labelInfo.amount === 1 + ? labels[labelInfo.labelKey] + : labels[`${labelInfo.labelKey}_plural`] + }` + ) + .join(", "); +}; From 4f4ee616d2aa008b3c10b2577be382664761b70b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lloren=C3=A7?= Date: Thu, 21 Sep 2023 11:29:15 +0200 Subject: [PATCH 24/31] Test vector: 20239121 --- scripts/test-vectors/20230921-icrc-1-issue.ts | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 scripts/test-vectors/20230921-icrc-1-issue.ts diff --git a/scripts/test-vectors/20230921-icrc-1-issue.ts b/scripts/test-vectors/20230921-icrc-1-issue.ts new file mode 100644 index 000000000..a6cb1bd2f --- /dev/null +++ b/scripts/test-vectors/20230921-icrc-1-issue.ts @@ -0,0 +1,98 @@ +import { IDL } from "@dfinity/candid"; +import { toTransferArg } from "@dfinity/ledger/src/converters/ledger.converters"; +import { TransferParams } from "@dfinity/ledger/src/types/ledger.params"; +import { Principal } from "@dfinity/principal"; +import { uint8ArrayToBigInt } from "@dfinity/utils"; +import { transferFn } from "./sns-ledger.idl"; +import { createBlob, defaultCaller, writeToJson } from "./utils"; + +/** + * Issue: https://github.com/Zondax/ledger-icp/issues/218 + */ + +/** + * Principals can be up to 29 bytes long. + * + * Source: https://wiki.internetcomputer.org/wiki/Principal + */ + +interface Params extends TransferParams { + canisterId: Principal; + owner: Principal; + isWorking: boolean; +} + +// Fee is optional, if not provided, it will be set to 10000 which is the ICP fee +const ICP_DEFAULT_FEE_E8S = 10_000; + +const createTestVector = (params: Params) => { + const rawRequestBody = toTransferArg(params); + + const memoOutput = + params.memo !== undefined + ? `Memo : ${uint8ArrayToBigInt(params.memo).toString()}` + : "Memo : 0"; + + return { + blob_candid: createBlob({ + arg: IDL.encode(transferFn.argTypes, [rawRequestBody]), + methodName: "icrc1_transfer", + canisterId: params.canisterId, + caller: params.owner, + }), + isWorking: params.isWorking, + name: "ICRC1 ICP Transfer", + canisterId: params.canisterId.toText(), + caller: params.owner.toText() ?? defaultCaller.toText(), + candid_request: rawRequestBody, + }; +}; + +const main = () => { + try { + const notWorkingPrincipalDestination = Principal.fromText( + "ttwhn-ittl6-fnuml-tqdgz-tbyhu-f7jti-ft2cr-znzsu-biv4l-gpvg4-ba", + ); + const workingPrincipalDestination = Principal.fromText( + "mhfqd-kvmfi-k6dts-lgdui-wgyrn-5o4uv-jiokz-dk4v3-meds4-j4umt-vae", + ); + const fromPrincipal = Principal.from( + "q2fbu-chrgb-o7dmd-u5cfn-xgo4f-5lpcl-ldeca-wl4sn-5j7gb-ltm63-hqe", + ); + const ledgerCanister = Principal.fromText("ryjl3-tyaaa-aaaaa-aaaba-cai"); + const workingTransfer: Params = { + owner: fromPrincipal, + to: { + owner: workingPrincipalDestination, + subaccount: [], + }, + isWorking: true, + fee: BigInt(10_000), + amount: BigInt(100_000_000), + canisterId: ledgerCanister, + created_at_time: BigInt(1629200000000000000), + }; + const vectors = [ + createTestVector(workingTransfer), + createTestVector({ + ...workingTransfer, + to: { + owner: notWorkingPrincipalDestination, + subaccount: [], + }, + isWorking: false, + }), + ]; + + writeToJson({ + data: vectors, + fileName: "icrc-1-issue.json", + }); + console.log("File created successfully"); + } catch (error) { + console.log("There was an error"); + console.log(error); + } +}; + +main(); From 7b4ad68392d9acbeb98b7bcec0b0f86f632c3ac6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lloren=C3=A7?= Date: Wed, 27 Sep 2023 15:14:52 +0200 Subject: [PATCH 25/31] Test Vector: 20230927 --- .../20230927-icrc-stake-neuron.ts | 349 ++++++++++++++++++ 1 file changed, 349 insertions(+) create mode 100644 scripts/test-vectors/20230927-icrc-stake-neuron.ts diff --git a/scripts/test-vectors/20230927-icrc-stake-neuron.ts b/scripts/test-vectors/20230927-icrc-stake-neuron.ts new file mode 100644 index 000000000..3f57b4997 --- /dev/null +++ b/scripts/test-vectors/20230927-icrc-stake-neuron.ts @@ -0,0 +1,349 @@ +import { IDL } from "@dfinity/candid"; +import { toTransferArg } from "@dfinity/ledger/src/converters/ledger.converters"; +import { TransferParams } from "@dfinity/ledger/src/types/ledger.params"; +import { + MAINNET_GOVERNANCE_CANISTER_ID, + MAINNET_LEDGER_CANISTER_ID, +} from "@dfinity/nns/src/constants/canister_ids"; +import { E8S_PER_TOKEN } from "@dfinity/nns/src/constants/constants"; +import { Principal } from "@dfinity/principal"; +import { + arrayOfNumberToUint8Array, + fromNullable, + numberToUint8Array, + uint8ArrayToBigInt, +} from "@dfinity/utils"; +import { transferFn } from "./sns-ledger.idl"; +import { + createBlob, + defaultCaller, + splitAccount, + splitPrincipal, + writeToJson, +} from "./utils"; + +/** + * Issue: https://github.com/Zondax/ledger-icp/issues/223 + */ + +interface Params extends TransferParams { + canisterId: Principal; + owner: Principal; +} + +// Fee is optional, if not provided, it will be set to 10000 which is the ICP fee +const ICP_DEFAULT_FEE_E8S = 10_000; + +const createTestVector = (params: Params) => { + const rawRequestBody = toTransferArg(params); + const isICP = + params.canisterId.toText() === MAINNET_LEDGER_CANISTER_ID.toText(); + + const isStakeNeuron = + isICP && + params.to.owner.toText() === MAINNET_GOVERNANCE_CANISTER_ID.toText(); + + let outputTxType = isStakeNeuron + ? "Stake Neuron" + : isICP + ? "Send ICP" + : "Send Tokens"; + const canisterIdOutputs = splitPrincipal(params.canisterId).map( + (data, i, elements) => + `Canister Id [${i + 1}/${elements.length}] : ${data}`, + ); + + const fromOutputs = splitAccount( + { + owner: params.owner, + subaccount: params.from_subaccount, + }, + "From account", + ); + const toOutputs = splitAccount( + { + owner: params.to.owner, + subaccount: fromNullable(params.to.subaccount), + }, + "To account", + ); + + const amountToken = Number(params.amount) / Number(E8S_PER_TOKEN); + const paymentOutput = isICP + ? `Payment (ICP) : ${amountToken}` + : `Payment (Tokens) : ${amountToken}`; + + // Do not show fee if it's not present in the request body. + // Except if it's ICP, in which case we always show the fee. + let feeOutput: string | undefined; + if (isICP || params.fee !== undefined) { + const feeToken = + Number(params.fee ?? ICP_DEFAULT_FEE_E8S) / Number(E8S_PER_TOKEN); + feeOutput = isICP + ? `Maximum fee (ICP) : ${feeToken}` + : `Maximum fee (Tokens) : ${feeToken}`; + } + + const memoOutput = + params.memo !== undefined + ? `Memo : ${uint8ArrayToBigInt(params.memo).toString()}` + : "Memo : 0"; + + const output = [ + outputTxType, + ...(isICP ? [] : canisterIdOutputs), + ...fromOutputs, + ...(isStakeNeuron ? [] : toOutputs), + paymentOutput, + ...(feeOutput !== undefined ? [feeOutput] : []), + memoOutput, + ]; + return { + blob_candid: createBlob({ + arg: IDL.encode(transferFn.argTypes, [rawRequestBody]), + methodName: "icrc1_transfer", + canisterId: params.canisterId, + caller: params.owner, + }), + output: output.map((element, index) => `${index + 1} | ${element}`), + isICP, + isStakeNeuron, + name: "ICRC1 Transfer", + canisterId: params.canisterId.toText(), + caller: params.owner.toText() ?? defaultCaller.toText(), + candid_request: rawRequestBody, + }; +}; + +const main = () => { + try { + const subaccount1 = arrayOfNumberToUint8Array([ + 215, 232, 81, 101, 44, 208, 50, 186, 94, 215, 107, 23, 246, 38, 170, 71, + 130, 159, 6, 229, 35, 90, 13, 88, 14, 150, 211, 114, 119, 41, 234, 36, + ]); + const subaccount2 = arrayOfNumberToUint8Array([ + 163, 110, 20, 60, 134, 231, 228, 113, 231, 199, 25, 80, 100, 135, 207, + 122, 108, 244, 13, 167, 99, 97, 174, 175, 238, 81, 51, 225, 217, 172, 234, + 61, + ]); + const principal1 = Principal.fromText( + "krpzt-buecq-u3umg-7kb7r-j5jpx-twqwa-3ykc4-y3cnk-7kwvw-5bq6z-mae", + ); + const principal2 = Principal.fromText( + "2dfd6-abjpf-eihu7-pwv6m-qnlbt-oszmg-kb26q-rvqms-onmuh-mwiq3-uqe", + ); + const shortPrincipal = Principal.fromText( + "ttwhn-ittl6-fnuml-tqdgz-tbyhu-f7jti-ft2cr-znzsu-biv4l-gpvg4-ba", + ); + const canisterId1 = Principal.fromText("ppmzm-3aaaa-aaaaa-aacpq-cai"); + const canisterId2 = Principal.fromText("s24we-diaaa-aaaaa-aaaka-cai"); + const vectors = [ + createTestVector({ + owner: principal2, + to: { + owner: MAINNET_GOVERNANCE_CANISTER_ID, + subaccount: [subaccount1], + }, + amount: BigInt(131_400_000), + fee: BigInt(30_000), + from_subaccount: subaccount2, + memo: numberToUint8Array(11223312), + canisterId: MAINNET_LEDGER_CANISTER_ID, + created_at_time: BigInt(1675249266635000000), + }), + createTestVector({ + owner: shortPrincipal, + to: { + owner: MAINNET_GOVERNANCE_CANISTER_ID, + subaccount: [subaccount1], + }, + amount: BigInt(131_400_000), + fee: BigInt(30_000), + memo: numberToUint8Array(11223312), + canisterId: MAINNET_LEDGER_CANISTER_ID, + created_at_time: BigInt(1675249216635000000), + }), + createTestVector({ + owner: shortPrincipal, + to: { + owner: MAINNET_GOVERNANCE_CANISTER_ID, + subaccount: [subaccount2], + }, + amount: BigInt(131_400_000), + fee: BigInt(30_000), + memo: numberToUint8Array(11221312), + canisterId: MAINNET_LEDGER_CANISTER_ID, + created_at_time: BigInt(1675249219635000000), + }), + createTestVector({ + owner: principal2, + to: { + owner: MAINNET_GOVERNANCE_CANISTER_ID, + subaccount: [subaccount2], + }, + amount: BigInt(131_400_000), + fee: BigInt(30_000), + memo: numberToUint8Array(11221312), + canisterId: MAINNET_LEDGER_CANISTER_ID, + created_at_time: BigInt(1675249219635000000), + }), + createTestVector({ + owner: principal1, + to: { + owner: principal2, + subaccount: [], + }, + amount: BigInt(100_000_000), + canisterId: canisterId1, + }), + createTestVector({ + owner: principal1, + to: { + owner: principal2, + subaccount: [], + }, + amount: BigInt(100_000_000), + from_subaccount: subaccount1, + fee: BigInt(10_000), + canisterId: canisterId1, + created_at_time: BigInt(1629200000000000000), + }), + createTestVector({ + owner: principal1, + to: { + owner: principal2, + subaccount: [subaccount2], + }, + amount: BigInt(330_000_000), + from_subaccount: subaccount1, + fee: BigInt(10_000), + canisterId: canisterId1, + created_at_time: BigInt(1629200000000000000), + }), + createTestVector({ + owner: principal1, + to: { + owner: principal2, + subaccount: [subaccount2], + }, + amount: BigInt(330_000_000), + memo: numberToUint8Array(11223312), + fee: BigInt(30_000), + canisterId: canisterId2, + created_at_time: BigInt(1675249266635000000), + }), + createTestVector({ + owner: principal2, + to: { + owner: principal1, + subaccount: [], + }, + amount: BigInt(314_000_000), + memo: numberToUint8Array(11223312), + canisterId: canisterId1, + created_at_time: BigInt(1675249266635000000), + }), + createTestVector({ + owner: principal2, + to: { + owner: principal1, + subaccount: [subaccount1], + }, + amount: BigInt(1331_400_000), + memo: numberToUint8Array(11223312), + from_subaccount: subaccount2, + fee: BigInt(20_000), + canisterId: canisterId1, + created_at_time: BigInt(1675249266635000000), + }), + createTestVector({ + owner: principal1, + to: { + owner: principal2, + subaccount: [], + }, + amount: BigInt(100_000_000), + canisterId: MAINNET_LEDGER_CANISTER_ID, + }), + createTestVector({ + owner: principal2, + to: { + owner: principal1, + subaccount: [subaccount1], + }, + amount: BigInt(31_400_000), + canisterId: MAINNET_LEDGER_CANISTER_ID, + }), + createTestVector({ + owner: principal2, + to: { + owner: principal1, + subaccount: [subaccount1], + }, + amount: BigInt(31_400_000), + from_subaccount: subaccount2, + canisterId: MAINNET_LEDGER_CANISTER_ID, + created_at_time: BigInt(1675249266635000000), + }), + createTestVector({ + owner: principal2, + to: { + owner: principal1, + subaccount: [subaccount1], + }, + amount: BigInt(31_400_000), + memo: numberToUint8Array(11223312), + canisterId: MAINNET_LEDGER_CANISTER_ID, + created_at_time: BigInt(1675249266635000000), + }), + createTestVector({ + owner: principal2, + to: { + owner: principal1, + subaccount: [subaccount1], + }, + amount: BigInt(31_400_000), + fee: BigInt(100_000), + canisterId: MAINNET_LEDGER_CANISTER_ID, + created_at_time: BigInt(1629200000000000000), + }), + createTestVector({ + owner: principal2, + to: { + owner: principal1, + subaccount: [subaccount1], + }, + amount: BigInt(131_400_000), + fee: BigInt(30_000), + from_subaccount: subaccount2, + memo: numberToUint8Array(11223312), + canisterId: MAINNET_LEDGER_CANISTER_ID, + created_at_time: BigInt(1629200000000000000), + }), + createTestVector({ + owner: principal2, + to: { + owner: principal1, + subaccount: [subaccount1], + }, + amount: BigInt(131_400_000), + fee: BigInt(30_000), + from_subaccount: subaccount2, + memo: numberToUint8Array(11223312), + canisterId: MAINNET_LEDGER_CANISTER_ID, + created_at_time: BigInt(1675249266635000000), + }), + ]; + + writeToJson({ + data: vectors, + fileName: "icrc-stake-neuron.json", + }); + console.log("File created successfully"); + } catch (error) { + console.log("There was an error"); + console.log(error); + } +}; + +main(); From 2bff21aca3eb39cf2b0ddd5529005b651387502d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lloren=C3=A7?= Date: Tue, 3 Oct 2023 10:29:41 +0200 Subject: [PATCH 26/31] Test Vectors: Stake neuron tx --- .../20230927-icrc-stake-neuron.ts | 86 +++++++++++++++---- scripts/test-vectors/utils.ts | 14 +-- 2 files changed, 75 insertions(+), 25 deletions(-) diff --git a/scripts/test-vectors/20230927-icrc-stake-neuron.ts b/scripts/test-vectors/20230927-icrc-stake-neuron.ts index 3f57b4997..ebde6d0fc 100644 --- a/scripts/test-vectors/20230927-icrc-stake-neuron.ts +++ b/scripts/test-vectors/20230927-icrc-stake-neuron.ts @@ -1,18 +1,19 @@ import { IDL } from "@dfinity/candid"; -import { toTransferArg } from "@dfinity/ledger/src/converters/ledger.converters"; -import { TransferParams } from "@dfinity/ledger/src/types/ledger.params"; -import { - MAINNET_GOVERNANCE_CANISTER_ID, - MAINNET_LEDGER_CANISTER_ID, -} from "@dfinity/nns/src/constants/canister_ids"; +import { MAINNET_LEDGER_CANISTER_ID } from "@dfinity/ledger-icp/src/constants/canister_ids"; +import { toTransferArg } from "@dfinity/ledger-icrc/src/converters/ledger.converters"; +import { TransferParams } from "@dfinity/ledger-icrc/src/types/ledger.params"; +import { MAINNET_GOVERNANCE_CANISTER_ID } from "@dfinity/nns/src/constants/canister_ids"; import { E8S_PER_TOKEN } from "@dfinity/nns/src/constants/constants"; import { Principal } from "@dfinity/principal"; import { arrayOfNumberToUint8Array, + asciiStringToByteArray, fromNullable, numberToUint8Array, uint8ArrayToBigInt, } from "@dfinity/utils"; +import { sha256 } from "@noble/hashes/sha256"; +import randomBytes from "randombytes"; import { transferFn } from "./sns-ledger.idl"; import { createBlob, @@ -29,6 +30,7 @@ import { interface Params extends TransferParams { canisterId: Principal; owner: Principal; + nonce?: bigint; } // Fee is optional, if not provided, it will be set to 10000 which is the ICP fee @@ -109,12 +111,31 @@ const createTestVector = (params: Params) => { isICP, isStakeNeuron, name: "ICRC1 Transfer", + nonce: params.nonce, canisterId: params.canisterId.toText(), caller: params.owner.toText() ?? defaultCaller.toText(), candid_request: rawRequestBody, }; }; +// Reference: Governance Canister `getNeuronStakeSubAccountBytes` private method. +const getNeuronStakeSubAccountBytes = ( + nonceBytes: Uint8Array, + principal: Principal, +): Uint8Array => { + const padding = asciiStringToByteArray("neuron-stake"); + const shaObj = sha256.create(); + shaObj.update( + arrayOfNumberToUint8Array([ + 0x0c, + ...padding, + ...principal.toUint8Array(), + ...nonceBytes, + ]), + ); + return shaObj.digest(); +}; + const main = () => { try { const subaccount1 = arrayOfNumberToUint8Array([ @@ -135,6 +156,31 @@ const main = () => { const shortPrincipal = Principal.fromText( "ttwhn-ittl6-fnuml-tqdgz-tbyhu-f7jti-ft2cr-znzsu-biv4l-gpvg4-ba", ); + + const nonceBytes1 = new Uint8Array(randomBytes(8)); + const nonce1 = uint8ArrayToBigInt(nonceBytes1); + const toSubAccount1 = getNeuronStakeSubAccountBytes( + nonceBytes1, + principal1, + ); + const nonceBytes1_2 = new Uint8Array(randomBytes(8)); + const nonce1_2 = uint8ArrayToBigInt(nonceBytes1_2); + const toSubAccount1_2 = getNeuronStakeSubAccountBytes( + nonceBytes1_2, + principal1, + ); + const nonceBytes2 = new Uint8Array(randomBytes(8)); + const nonce2 = uint8ArrayToBigInt(nonceBytes2); + const toSubAccount2 = getNeuronStakeSubAccountBytes( + nonceBytes2, + principal2, + ); + const nonceBytesShort = new Uint8Array(randomBytes(8)); + const nonceShort = uint8ArrayToBigInt(nonceBytesShort); + const toSubAccountShort = getNeuronStakeSubAccountBytes( + nonceBytesShort, + shortPrincipal, + ); const canisterId1 = Principal.fromText("ppmzm-3aaaa-aaaaa-aacpq-cai"); const canisterId2 = Principal.fromText("s24we-diaaa-aaaaa-aaaka-cai"); const vectors = [ @@ -142,48 +188,52 @@ const main = () => { owner: principal2, to: { owner: MAINNET_GOVERNANCE_CANISTER_ID, - subaccount: [subaccount1], + subaccount: [toSubAccount1], }, amount: BigInt(131_400_000), - fee: BigInt(30_000), + fee: BigInt(10_000), from_subaccount: subaccount2, - memo: numberToUint8Array(11223312), + memo: nonceBytes1, + nonce: nonce1, canisterId: MAINNET_LEDGER_CANISTER_ID, created_at_time: BigInt(1675249266635000000), }), createTestVector({ - owner: shortPrincipal, + owner: principal1, to: { owner: MAINNET_GOVERNANCE_CANISTER_ID, - subaccount: [subaccount1], + subaccount: [toSubAccount1_2], }, amount: BigInt(131_400_000), fee: BigInt(30_000), - memo: numberToUint8Array(11223312), + memo: nonceBytes1_2, + nonce: nonce1_2, canisterId: MAINNET_LEDGER_CANISTER_ID, - created_at_time: BigInt(1675249216635000000), + created_at_time: BigInt(1675249219635000000), }), createTestVector({ owner: shortPrincipal, to: { owner: MAINNET_GOVERNANCE_CANISTER_ID, - subaccount: [subaccount2], + subaccount: [toSubAccountShort], }, amount: BigInt(131_400_000), fee: BigInt(30_000), - memo: numberToUint8Array(11221312), + memo: nonceBytesShort, + nonce: nonceShort, canisterId: MAINNET_LEDGER_CANISTER_ID, - created_at_time: BigInt(1675249219635000000), + created_at_time: BigInt(1675249216635000000), }), createTestVector({ owner: principal2, to: { owner: MAINNET_GOVERNANCE_CANISTER_ID, - subaccount: [subaccount2], + subaccount: [toSubAccount2], }, amount: BigInt(131_400_000), fee: BigInt(30_000), - memo: numberToUint8Array(11221312), + memo: nonceBytes2, + nonce: nonce2, canisterId: MAINNET_LEDGER_CANISTER_ID, created_at_time: BigInt(1675249219635000000), }), diff --git a/scripts/test-vectors/utils.ts b/scripts/test-vectors/utils.ts index 2b0fbcf97..fbf72564e 100644 --- a/scripts/test-vectors/utils.ts +++ b/scripts/test-vectors/utils.ts @@ -5,8 +5,8 @@ import { ReadRequest, SubmitRequestType, } from "@dfinity/agent"; -import { IcrcAccount } from "@dfinity/ledger/src/types/ledger.responses"; -import { encodeIcrcAccount } from "@dfinity/ledger/src/utils/ledger.utils"; +import { IcrcAccount } from "@dfinity/ledger-icrc/src/types/ledger.responses"; +import { encodeIcrcAccount } from "@dfinity/ledger-icrc/src/utils/ledger.utils"; import { Principal } from "@dfinity/principal"; import { writeFileSync } from "fs"; import { MAINNET_GOVERNANCE_CANISTER_ID } from "../../packages/nns/src/constants/canister_ids"; @@ -43,7 +43,7 @@ function _prepareCborForLedger( const DEFAULT_INGRESS_EXPIRY_DELTA_IN_MSECS = 5 * 60 * 1000; export const defaultCaller = Principal.fromText( - "5upke-tazvi-6ufqc-i3v6r-j4gpu-dpwti-obhal-yb5xj-ue32x-ktkql-rqe" + "5upke-tazvi-6ufqc-i3v6r-j4gpu-dpwti-obhal-yb5xj-ue32x-ktkql-rqe", ); const createCallRequest = ({ @@ -129,7 +129,7 @@ export const splitPrincipal = (principal: Principal): string[] => { export const splitString = ( textToSplit: string, - screenText: string + screenText: string, ): string[] => { return ( textToSplit @@ -148,14 +148,14 @@ export const splitString = ( }, [] as string[]) ?.map( (data, i, elements) => - `${screenText} [${i + 1}/${elements.length}] : ${data}` + `${screenText} [${i + 1}/${elements.length}] : ${data}`, ) || [] ); }; export const splitAccount = ( account: IcrcAccount, - screenText: string + screenText: string, ): string[] => { return splitString(encodeIcrcAccount(account), screenText); }; @@ -184,5 +184,5 @@ export const permissionMapper: Record = { export const bytesToHexString = (bytes: number[]): string => bytes.reduce( (str, byte) => `${str}${byte.toString(16).padStart(2, "0")}`, - "" + "", ); From f7a3e50886cd543a8629ce2d9fa28a4c3455c848 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lloren=C3=A7?= Date: Tue, 23 Jul 2024 10:53:42 +0200 Subject: [PATCH 27/31] Test vector list_neurons new param --- scripts/test-vectors/20240722-list-neurons.ts | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 scripts/test-vectors/20240722-list-neurons.ts diff --git a/scripts/test-vectors/20240722-list-neurons.ts b/scripts/test-vectors/20240722-list-neurons.ts new file mode 100644 index 000000000..355a0f59d --- /dev/null +++ b/scripts/test-vectors/20240722-list-neurons.ts @@ -0,0 +1,81 @@ +// Date represents the date of the issue with the test vectors sent to Zondax: +// https://github.com/Zondax/ledger-icp/issues/166 +// We'll keep each script for reproducibility. +import { IDL } from "@dfinity/candid"; +import { NeuronId } from "@dfinity/nns/src"; +import { toNullable } from "@dfinity/utils/src"; +import { ListNeuronsFn } from "./governance.idl"; +import { createBlob, writeToJson } from "./utils"; + +const mockNeuronId = BigInt(15374508381553347371); +const mockNeuronId2 = BigInt(8836564053576662908); + +const createListNeurons = ({ + neuronIds, + includeEmptyNeurons, +}: { + neuronIds?: NeuronId[]; + includeEmptyNeurons?: boolean | null; +}) => { + const rawRequestBody = { + neuron_ids: neuronIds ?? [], + include_neurons_readable_by_caller: neuronIds ? false : true, + ...(includeEmptyNeurons === null + ? {} + : { + include_empty_neurons_readable_by_caller: + toNullable(includeEmptyNeurons), + }), + }; + + const test = { + blob_candid: createBlob({ + arg: IDL.encode(ListNeuronsFn.argTypes, [rawRequestBody]), + methodName: "list_neurons", + }), + name: `List Neurons ${ + includeEmptyNeurons === null ? "- no new `includeEmptyNeurons` param" : "" + }`, + candid_request: rawRequestBody, + output: ["0 | Transaction type : List Own Neurons"], + }; + neuronIds?.forEach((id, idx) => { + test.output.push(`${idx + 1} | Neuron ID ${idx + 1} : ${id}`); + }); + return test; +}; + +const main = () => { + try { + const vectors = [ + createListNeurons({}), + createListNeurons({ includeEmptyNeurons: true }), + createListNeurons({ includeEmptyNeurons: false }), + createListNeurons({ includeEmptyNeurons: null }), + createListNeurons({ neuronIds: [mockNeuronId, mockNeuronId2] }), + createListNeurons({ + neuronIds: [mockNeuronId, mockNeuronId2], + includeEmptyNeurons: true, + }), + createListNeurons({ + neuronIds: [mockNeuronId], + includeEmptyNeurons: false, + }), + createListNeurons({ + neuronIds: [mockNeuronId], + includeEmptyNeurons: null, + }), + ]; + + writeToJson({ + data: vectors, + fileName: "list-neurons.json", + }); + console.log("File created successfully"); + } catch (error) { + console.log("There was an error"); + console.log(error); + } +}; + +main(); From 8581a16ff289d1f4ebbcae76ab29e9a284904f78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lloren=C3=A7?= Date: Tue, 23 Jul 2024 16:15:45 +0200 Subject: [PATCH 28/31] Test vectors - fix 20240722 list_neurons --- scripts/test-vectors/20240722-list-neurons.ts | 8 +- ...vernance-without-empty-neurons-flag.idl.ts | 472 ++++++++++++++++++ scripts/test-vectors/governance.idl.ts | 3 +- 3 files changed, 481 insertions(+), 2 deletions(-) create mode 100644 scripts/test-vectors/governance-without-empty-neurons-flag.idl.ts diff --git a/scripts/test-vectors/20240722-list-neurons.ts b/scripts/test-vectors/20240722-list-neurons.ts index 355a0f59d..d93778677 100644 --- a/scripts/test-vectors/20240722-list-neurons.ts +++ b/scripts/test-vectors/20240722-list-neurons.ts @@ -4,6 +4,7 @@ import { IDL } from "@dfinity/candid"; import { NeuronId } from "@dfinity/nns/src"; import { toNullable } from "@dfinity/utils/src"; +import { ListNeuronsFn as ListNeuronsFnWithoutFlag } from "./governance-without-empty-neurons-flag.idl"; import { ListNeuronsFn } from "./governance.idl"; import { createBlob, writeToJson } from "./utils"; @@ -30,7 +31,12 @@ const createListNeurons = ({ const test = { blob_candid: createBlob({ - arg: IDL.encode(ListNeuronsFn.argTypes, [rawRequestBody]), + arg: IDL.encode( + includeEmptyNeurons === null + ? ListNeuronsFnWithoutFlag.argTypes + : ListNeuronsFn.argTypes, + [rawRequestBody], + ), methodName: "list_neurons", }), name: `List Neurons ${ diff --git a/scripts/test-vectors/governance-without-empty-neurons-flag.idl.ts b/scripts/test-vectors/governance-without-empty-neurons-flag.idl.ts new file mode 100644 index 000000000..2499a4a83 --- /dev/null +++ b/scripts/test-vectors/governance-without-empty-neurons-flag.idl.ts @@ -0,0 +1,472 @@ +import { IDL } from "@dfinity/candid"; + +const Proposal = IDL.Rec(); +const NeuronId = IDL.Record({ id: IDL.Nat64 }); +const Followees = IDL.Record({ followees: IDL.Vec(NeuronId) }); +const AccountIdentifier = IDL.Record({ hash: IDL.Vec(IDL.Nat8) }); +const NodeProvider = IDL.Record({ + id: IDL.Opt(IDL.Principal), + reward_account: IDL.Opt(AccountIdentifier), +}); +const RewardToNeuron = IDL.Record({ dissolve_delay_seconds: IDL.Nat64 }); +const RewardToAccount = IDL.Record({ + to_account: IDL.Opt(AccountIdentifier), +}); +const RewardMode = IDL.Variant({ + RewardToNeuron: RewardToNeuron, + RewardToAccount: RewardToAccount, +}); +const RewardNodeProvider = IDL.Record({ + node_provider: IDL.Opt(NodeProvider), + reward_mode: IDL.Opt(RewardMode), + amount_e8s: IDL.Nat64, +}); +const MostRecentMonthlyNodeProviderRewards = IDL.Record({ + timestamp: IDL.Nat64, + rewards: IDL.Vec(RewardNodeProvider), +}); +const GovernanceCachedMetrics = IDL.Record({ + not_dissolving_neurons_e8s_buckets: IDL.Vec( + IDL.Tuple(IDL.Nat64, IDL.Float64), + ), + garbage_collectable_neurons_count: IDL.Nat64, + neurons_with_invalid_stake_count: IDL.Nat64, + not_dissolving_neurons_count_buckets: IDL.Vec( + IDL.Tuple(IDL.Nat64, IDL.Nat64), + ), + total_supply_icp: IDL.Nat64, + neurons_with_less_than_6_months_dissolve_delay_count: IDL.Nat64, + dissolved_neurons_count: IDL.Nat64, + total_staked_e8s: IDL.Nat64, + not_dissolving_neurons_count: IDL.Nat64, + dissolved_neurons_e8s: IDL.Nat64, + neurons_with_less_than_6_months_dissolve_delay_e8s: IDL.Nat64, + dissolving_neurons_count_buckets: IDL.Vec(IDL.Tuple(IDL.Nat64, IDL.Nat64)), + dissolving_neurons_count: IDL.Nat64, + dissolving_neurons_e8s_buckets: IDL.Vec(IDL.Tuple(IDL.Nat64, IDL.Float64)), + community_fund_total_staked_e8s: IDL.Nat64, + timestamp_seconds: IDL.Nat64, +}); +const NetworkEconomics = IDL.Record({ + neuron_minimum_stake_e8s: IDL.Nat64, + max_proposals_to_keep_per_topic: IDL.Nat32, + neuron_management_fee_per_proposal_e8s: IDL.Nat64, + reject_cost_e8s: IDL.Nat64, + transaction_fee_e8s: IDL.Nat64, + neuron_spawn_dissolve_delay_seconds: IDL.Nat64, + minimum_icp_xdr_rate: IDL.Nat64, + maximum_node_provider_rewards_e8s: IDL.Nat64, +}); +const RewardEvent = IDL.Record({ + day_after_genesis: IDL.Nat64, + actual_timestamp_seconds: IDL.Nat64, + distributed_e8s_equivalent: IDL.Nat64, + settled_proposals: IDL.Vec(NeuronId), +}); +const NeuronStakeTransfer = IDL.Record({ + to_subaccount: IDL.Vec(IDL.Nat8), + neuron_stake_e8s: IDL.Nat64, + from: IDL.Opt(IDL.Principal), + memo: IDL.Nat64, + from_subaccount: IDL.Vec(IDL.Nat8), + transfer_timestamp: IDL.Nat64, + block_height: IDL.Nat64, +}); +const GovernanceError = IDL.Record({ + error_message: IDL.Text, + error_type: IDL.Int32, +}); +const CfNeuron = IDL.Record({ + nns_neuron_id: IDL.Nat64, + amount_icp_e8s: IDL.Nat64, +}); +const CfParticipant = IDL.Record({ + hotkey_principal: IDL.Text, + cf_neurons: IDL.Vec(CfNeuron), +}); +const Ballot = IDL.Record({ vote: IDL.Int32, voting_power: IDL.Nat64 }); +const Tally = IDL.Record({ + no: IDL.Nat64, + yes: IDL.Nat64, + total: IDL.Nat64, + timestamp_seconds: IDL.Nat64, +}); +const KnownNeuronData = IDL.Record({ + name: IDL.Text, + description: IDL.Opt(IDL.Text), +}); +const KnownNeuron = IDL.Record({ + id: IDL.Opt(NeuronId), + known_neuron_data: IDL.Opt(KnownNeuronData), +}); +const Spawn = IDL.Record({ + percentage_to_spawn: IDL.Opt(IDL.Nat32), + new_controller: IDL.Opt(IDL.Principal), + nonce: IDL.Opt(IDL.Nat64), +}); +const Split = IDL.Record({ amount_e8s: IDL.Nat64 }); +const Follow = IDL.Record({ + topic: IDL.Int32, + followees: IDL.Vec(NeuronId), +}); +const ClaimOrRefreshNeuronFromAccount = IDL.Record({ + controller: IDL.Opt(IDL.Principal), + memo: IDL.Nat64, +}); +const By = IDL.Variant({ + NeuronIdOrSubaccount: IDL.Record({}), + MemoAndController: ClaimOrRefreshNeuronFromAccount, + Memo: IDL.Nat64, +}); +const ClaimOrRefresh = IDL.Record({ by: IDL.Opt(By) }); +const RemoveHotKey = IDL.Record({ + hot_key_to_remove: IDL.Opt(IDL.Principal), +}); +const AddHotKey = IDL.Record({ new_hot_key: IDL.Opt(IDL.Principal) }); +const ChangeAutoStakeMaturity = IDL.Record({ + requested_setting_for_auto_stake_maturity: IDL.Bool, +}); +const IncreaseDissolveDelay = IDL.Record({ + additional_dissolve_delay_seconds: IDL.Nat32, +}); +const SetDissolveTimestamp = IDL.Record({ + dissolve_timestamp_seconds: IDL.Nat64, +}); +const Operation = IDL.Variant({ + RemoveHotKey: RemoveHotKey, + AddHotKey: AddHotKey, + ChangeAutoStakeMaturity: ChangeAutoStakeMaturity, + StopDissolving: IDL.Record({}), + StartDissolving: IDL.Record({}), + IncreaseDissolveDelay: IncreaseDissolveDelay, + JoinCommunityFund: IDL.Record({}), + LeaveCommunityFund: IDL.Record({}), + SetDissolveTimestamp: SetDissolveTimestamp, +}); +const Configure = IDL.Record({ operation: IDL.Opt(Operation) }); +const RegisterVote = IDL.Record({ + vote: IDL.Int32, + proposal: IDL.Opt(NeuronId), +}); +const Merge = IDL.Record({ source_neuron_id: IDL.Opt(NeuronId) }); +const DisburseToNeuron = IDL.Record({ + dissolve_delay_seconds: IDL.Nat64, + kyc_verified: IDL.Bool, + amount_e8s: IDL.Nat64, + new_controller: IDL.Opt(IDL.Principal), + nonce: IDL.Nat64, +}); +const StakeMaturity = IDL.Record({ + percentage_to_stake: IDL.Opt(IDL.Nat32), +}); +const MergeMaturity = IDL.Record({ percentage_to_merge: IDL.Nat32 }); +const Amount = IDL.Record({ e8s: IDL.Nat64 }); +const Disburse = IDL.Record({ + to_account: IDL.Opt(AccountIdentifier), + amount: IDL.Opt(Amount), +}); +const Command = IDL.Variant({ + Spawn: Spawn, + Split: Split, + Follow: Follow, + ClaimOrRefresh: ClaimOrRefresh, + Configure: Configure, + RegisterVote: RegisterVote, + Merge: Merge, + DisburseToNeuron: DisburseToNeuron, + MakeProposal: Proposal, + StakeMaturity: StakeMaturity, + MergeMaturity: MergeMaturity, + Disburse: Disburse, +}); +const NeuronIdOrSubaccount = IDL.Variant({ + Subaccount: IDL.Vec(IDL.Nat8), + NeuronId: NeuronId, +}); +const ManageNeuron = IDL.Record({ + id: IDL.Opt(NeuronId), + command: IDL.Opt(Command), + neuron_id_or_subaccount: IDL.Opt(NeuronIdOrSubaccount), +}); +const ExecuteNnsFunction = IDL.Record({ + nns_function: IDL.Int32, + payload: IDL.Vec(IDL.Nat8), +}); +const Params = IDL.Record({ + min_participant_icp_e8s: IDL.Nat64, + max_icp_e8s: IDL.Nat64, + swap_due_timestamp_seconds: IDL.Nat64, + min_participants: IDL.Nat32, + sns_token_e8s: IDL.Nat64, + max_participant_icp_e8s: IDL.Nat64, + min_icp_e8s: IDL.Nat64, +}); +const OpenSnsTokenSwap = IDL.Record({ + community_fund_investment_e8s: IDL.Opt(IDL.Nat64), + target_swap_canister_id: IDL.Opt(IDL.Principal), + params: IDL.Opt(Params), +}); +const TimeWindow = IDL.Record({ + start_timestamp_seconds: IDL.Nat64, + end_timestamp_seconds: IDL.Nat64, +}); +const SetOpenTimeWindowRequest = IDL.Record({ + open_time_window: IDL.Opt(TimeWindow), +}); +const SetSnsTokenSwapOpenTimeWindow = IDL.Record({ + request: IDL.Opt(SetOpenTimeWindowRequest), + swap_canister_id: IDL.Opt(IDL.Principal), +}); +const SetDefaultFollowees = IDL.Record({ + default_followees: IDL.Vec(IDL.Tuple(IDL.Int32, Followees)), +}); +const RewardNodeProviders = IDL.Record({ + use_registry_derived_rewards: IDL.Opt(IDL.Bool), + rewards: IDL.Vec(RewardNodeProvider), +}); +const ApproveGenesisKyc = IDL.Record({ + principals: IDL.Vec(IDL.Principal), +}); +const Change = IDL.Variant({ + ToRemove: NodeProvider, + ToAdd: NodeProvider, +}); +const AddOrRemoveNodeProvider = IDL.Record({ change: IDL.Opt(Change) }); +const Motion = IDL.Record({ motion_text: IDL.Text }); +const Action = IDL.Variant({ + RegisterKnownNeuron: KnownNeuron, + ManageNeuron: ManageNeuron, + ExecuteNnsFunction: ExecuteNnsFunction, + RewardNodeProvider: RewardNodeProvider, + OpenSnsTokenSwap: OpenSnsTokenSwap, + SetSnsTokenSwapOpenTimeWindow: SetSnsTokenSwapOpenTimeWindow, + SetDefaultFollowees: SetDefaultFollowees, + RewardNodeProviders: RewardNodeProviders, + ManageNetworkEconomics: NetworkEconomics, + ApproveGenesisKyc: ApproveGenesisKyc, + AddOrRemoveNodeProvider: AddOrRemoveNodeProvider, + Motion: Motion, +}); +Proposal.fill( + IDL.Record({ + url: IDL.Text, + title: IDL.Opt(IDL.Text), + action: IDL.Opt(Action), + summary: IDL.Text, + }), +); +const WaitForQuietState = IDL.Record({ + current_deadline_timestamp_seconds: IDL.Nat64, +}); +const ProposalData = IDL.Record({ + id: IDL.Opt(NeuronId), + failure_reason: IDL.Opt(GovernanceError), + cf_participants: IDL.Vec(CfParticipant), + ballots: IDL.Vec(IDL.Tuple(IDL.Nat64, Ballot)), + proposal_timestamp_seconds: IDL.Nat64, + reward_event_round: IDL.Nat64, + failed_timestamp_seconds: IDL.Nat64, + reject_cost_e8s: IDL.Nat64, + latest_tally: IDL.Opt(Tally), + sns_token_swap_lifecycle: IDL.Opt(IDL.Int32), + decided_timestamp_seconds: IDL.Nat64, + proposal: IDL.Opt(Proposal), + proposer: IDL.Opt(NeuronId), + wait_for_quiet_state: IDL.Opt(WaitForQuietState), + executed_timestamp_seconds: IDL.Nat64, + original_total_community_fund_maturity_e8s_equivalent: IDL.Opt(IDL.Nat64), +}); +const Command_2 = IDL.Variant({ + Spawn: NeuronId, + Split: Split, + Configure: Configure, + Merge: Merge, + DisburseToNeuron: DisburseToNeuron, + SyncCommand: IDL.Record({}), + ClaimOrRefreshNeuron: ClaimOrRefresh, + MergeMaturity: MergeMaturity, + Disburse: Disburse, +}); +const NeuronInFlightCommand = IDL.Record({ + command: IDL.Opt(Command_2), + timestamp: IDL.Nat64, +}); +const BallotInfo = IDL.Record({ + vote: IDL.Int32, + proposal_id: IDL.Opt(NeuronId), +}); +const DissolveState = IDL.Variant({ + DissolveDelaySeconds: IDL.Nat64, + WhenDissolvedTimestampSeconds: IDL.Nat64, +}); +const Neuron = IDL.Record({ + id: IDL.Opt(NeuronId), + staked_maturity_e8s_equivalent: IDL.Opt(IDL.Nat64), + controller: IDL.Opt(IDL.Principal), + recent_ballots: IDL.Vec(BallotInfo), + kyc_verified: IDL.Bool, + not_for_profit: IDL.Bool, + maturity_e8s_equivalent: IDL.Nat64, + cached_neuron_stake_e8s: IDL.Nat64, + created_timestamp_seconds: IDL.Nat64, + auto_stake_maturity: IDL.Opt(IDL.Bool), + aging_since_timestamp_seconds: IDL.Nat64, + hot_keys: IDL.Vec(IDL.Principal), + account: IDL.Vec(IDL.Nat8), + joined_community_fund_timestamp_seconds: IDL.Opt(IDL.Nat64), + dissolve_state: IDL.Opt(DissolveState), + followees: IDL.Vec(IDL.Tuple(IDL.Int32, Followees)), + neuron_fees_e8s: IDL.Nat64, + transfer: IDL.Opt(NeuronStakeTransfer), + known_neuron_data: IDL.Opt(KnownNeuronData), + spawn_at_timestamp_seconds: IDL.Opt(IDL.Nat64), +}); +const Governance = IDL.Record({ + default_followees: IDL.Vec(IDL.Tuple(IDL.Int32, Followees)), + most_recent_monthly_node_provider_rewards: IDL.Opt( + MostRecentMonthlyNodeProviderRewards, + ), + maturity_modulation_last_updated_at_timestamp_seconds: IDL.Opt(IDL.Nat64), + wait_for_quiet_threshold_seconds: IDL.Nat64, + metrics: IDL.Opt(GovernanceCachedMetrics), + node_providers: IDL.Vec(NodeProvider), + cached_daily_maturity_modulation_basis_points: IDL.Opt(IDL.Int32), + economics: IDL.Opt(NetworkEconomics), + spawning_neurons: IDL.Opt(IDL.Bool), + latest_reward_event: IDL.Opt(RewardEvent), + to_claim_transfers: IDL.Vec(NeuronStakeTransfer), + short_voting_period_seconds: IDL.Nat64, + proposals: IDL.Vec(IDL.Tuple(IDL.Nat64, ProposalData)), + in_flight_commands: IDL.Vec(IDL.Tuple(IDL.Nat64, NeuronInFlightCommand)), + neurons: IDL.Vec(IDL.Tuple(IDL.Nat64, Neuron)), + genesis_timestamp_seconds: IDL.Nat64, +}); +const Result = IDL.Variant({ Ok: IDL.Null, Err: GovernanceError }); +const Result_1 = IDL.Variant({ + Error: GovernanceError, + NeuronId: NeuronId, +}); +const ClaimOrRefreshNeuronFromAccountResponse = IDL.Record({ + result: IDL.Opt(Result_1), +}); +const Result_2 = IDL.Variant({ Ok: Neuron, Err: GovernanceError }); +const Result_3 = IDL.Variant({ + Ok: RewardNodeProviders, + Err: GovernanceError, +}); +const NeuronInfo = IDL.Record({ + dissolve_delay_seconds: IDL.Nat64, + recent_ballots: IDL.Vec(BallotInfo), + created_timestamp_seconds: IDL.Nat64, + state: IDL.Int32, + stake_e8s: IDL.Nat64, + joined_community_fund_timestamp_seconds: IDL.Opt(IDL.Nat64), + retrieved_at_timestamp_seconds: IDL.Nat64, + known_neuron_data: IDL.Opt(KnownNeuronData), + voting_power: IDL.Nat64, + age_seconds: IDL.Nat64, +}); +const Result_4 = IDL.Variant({ Ok: NeuronInfo, Err: GovernanceError }); +const Result_5 = IDL.Variant({ + Ok: NodeProvider, + Err: GovernanceError, +}); +const ProposalInfo = IDL.Record({ + id: IDL.Opt(NeuronId), + status: IDL.Int32, + topic: IDL.Int32, + failure_reason: IDL.Opt(GovernanceError), + ballots: IDL.Vec(IDL.Tuple(IDL.Nat64, Ballot)), + proposal_timestamp_seconds: IDL.Nat64, + reward_event_round: IDL.Nat64, + deadline_timestamp_seconds: IDL.Opt(IDL.Nat64), + failed_timestamp_seconds: IDL.Nat64, + reject_cost_e8s: IDL.Nat64, + latest_tally: IDL.Opt(Tally), + reward_status: IDL.Int32, + decided_timestamp_seconds: IDL.Nat64, + proposal: IDL.Opt(Proposal), + proposer: IDL.Opt(NeuronId), + executed_timestamp_seconds: IDL.Nat64, +}); +const ListKnownNeuronsResponse = IDL.Record({ + known_neurons: IDL.Vec(KnownNeuron), +}); +const ListNeurons = IDL.Record({ + neuron_ids: IDL.Vec(IDL.Nat64), + include_neurons_readable_by_caller: IDL.Bool, +}); +const ListNeuronsResponse = IDL.Record({ + neuron_infos: IDL.Vec(IDL.Tuple(IDL.Nat64, NeuronInfo)), + full_neurons: IDL.Vec(Neuron), +}); +const ListNodeProvidersResponse = IDL.Record({ + node_providers: IDL.Vec(NodeProvider), +}); +const ListProposalInfo = IDL.Record({ + include_reward_status: IDL.Vec(IDL.Int32), + before_proposal: IDL.Opt(NeuronId), + limit: IDL.Nat32, + exclude_topic: IDL.Vec(IDL.Int32), + include_status: IDL.Vec(IDL.Int32), +}); +const ListProposalInfoResponse = IDL.Record({ + proposal_info: IDL.Vec(ProposalInfo), +}); +const SpawnResponse = IDL.Record({ created_neuron_id: IDL.Opt(NeuronId) }); +const ClaimOrRefreshResponse = IDL.Record({ + refreshed_neuron_id: IDL.Opt(NeuronId), +}); +const MakeProposalResponse = IDL.Record({ + proposal_id: IDL.Opt(NeuronId), +}); +const StakeMaturityResponse = IDL.Record({ + maturity_e8s: IDL.Nat64, + staked_maturity_e8s: IDL.Nat64, +}); +const MergeMaturityResponse = IDL.Record({ + merged_maturity_e8s: IDL.Nat64, + new_stake_e8s: IDL.Nat64, +}); +const DisburseResponse = IDL.Record({ transfer_block_height: IDL.Nat64 }); +const Command_1 = IDL.Variant({ + Error: GovernanceError, + Spawn: SpawnResponse, + Split: SpawnResponse, + Follow: IDL.Record({}), + ClaimOrRefresh: ClaimOrRefreshResponse, + Configure: IDL.Record({}), + RegisterVote: IDL.Record({}), + Merge: IDL.Record({}), + DisburseToNeuron: SpawnResponse, + MakeProposal: MakeProposalResponse, + StakeMaturity: StakeMaturityResponse, + MergeMaturity: MergeMaturityResponse, + Disburse: DisburseResponse, +}); +const ManageNeuronResponse = IDL.Record({ command: IDL.Opt(Command_1) }); +const Committed = IDL.Record({ + sns_governance_canister_id: IDL.Opt(IDL.Principal), +}); +const Result_6 = IDL.Variant({ + Committed: Committed, + Aborted: IDL.Record({}), +}); +const SettleCommunityFundParticipation = IDL.Record({ + result: IDL.Opt(Result_6), + open_sns_token_swap_proposal_id: IDL.Opt(IDL.Nat64), +}); +const UpdateNodeProvider = IDL.Record({ + reward_account: IDL.Opt(AccountIdentifier), +}); + +export const ManageNeuronFn = IDL.Func( + [ManageNeuron], + [ManageNeuronResponse], + [], +); +export const ListNeuronsFn = IDL.Func( + [ListNeurons], + [ListNeuronsResponse], + ["query"], +); diff --git a/scripts/test-vectors/governance.idl.ts b/scripts/test-vectors/governance.idl.ts index e17d0d5ec..81b353508 100644 --- a/scripts/test-vectors/governance.idl.ts +++ b/scripts/test-vectors/governance.idl.ts @@ -395,6 +395,7 @@ const ListKnownNeuronsResponse = IDL.Record({ const ListNeurons = IDL.Record({ neuron_ids: IDL.Vec(IDL.Nat64), include_neurons_readable_by_caller: IDL.Bool, + include_empty_neurons_readable_by_caller: IDL.Opt(IDL.Bool), }); const ListNeuronsResponse = IDL.Record({ neuron_infos: IDL.Vec(IDL.Tuple(IDL.Nat64, NeuronInfo)), @@ -468,5 +469,5 @@ export const ManageNeuronFn = IDL.Func( export const ListNeuronsFn = IDL.Func( [ListNeurons], [ListNeuronsResponse], - ["query"] + ["query"], ); From a055d71f357570918f87b8abc2fa454a9b339ce9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lloren=C3=A7?= Date: Tue, 30 Jul 2024 17:06:35 +0200 Subject: [PATCH 29/31] Test vectors - 20240730 icrc-29 --- scripts/test-vectors/20240730-icrc29.ts | 61 +++++++++++++++++++++++++ scripts/test-vectors/utils.ts | 2 +- 2 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 scripts/test-vectors/20240730-icrc29.ts diff --git a/scripts/test-vectors/20240730-icrc29.ts b/scripts/test-vectors/20240730-icrc29.ts new file mode 100644 index 000000000..2a3f48f08 --- /dev/null +++ b/scripts/test-vectors/20240730-icrc29.ts @@ -0,0 +1,61 @@ +import { Expiry, SubmitRequestType } from "@dfinity/agent"; +import { Principal } from "@dfinity/principal"; +import { _prepareCborForLedger, writeToJson } from "./utils"; + +function hexStringToArrayBuffer(hexString: string): ArrayBuffer { + // Remove any non-hexadecimal characters (e.g., spaces) + hexString = hexString.replace(/[^a-fA-F0-9]/g, ""); + + // Ensure the string has an even length + if (hexString.length % 2 !== 0) { + throw new Error("Invalid hex string"); + } + + // Create an ArrayBuffer with the appropriate length + var arrayBuffer = new ArrayBuffer(hexString.length / 2); + var uint8Array = new Uint8Array(arrayBuffer); + + // Convert each pair of hex characters to a byte + for (var i = 0; i < hexString.length; i += 2) { + uint8Array[i / 2] = parseInt(hexString.substr(i, 2), 16); + } + + return arrayBuffer; +} + +const callRequest = { + arg: hexStringToArrayBuffer("4449444C00017104746F6269"), + canister_id: Principal.fromHex("00000000006000FD0101"), + ingress_expiry: new Expiry(1712667140606000000), + method_name: "greet", + request_type: "query" as SubmitRequestType, + sender: Principal.fromHex("04"), +}; + +const consentMessageRequest = { + arg: hexStringToArrayBuffer( + "4449444C076D7B6C01D880C6D007716C02CBAEB581017AB183E7F1077A6B028BEABFC2067F8EF1C1EE0D026E036C02EFCEE7800401C4FBF2DB05046C03D6FCA70200E1EDEB4A7184F7FEE80A0501060C4449444C00017104746F626905677265657402656E01011E000300", + ), + canister_id: Principal.fromHex("00000000006000FD0101"), + ingress_expiry: new Expiry(1712666698482000000), + method_name: "icrc21_canister_call_consent_message", + nonce: hexStringToArrayBuffer("A3788C1805553FB69B20F08E87E23B13"), + request_type: "call" as SubmitRequestType, + sender: Principal.fromHex("04"), +}; + +const createCandidBlobs = () => { + const callRequestBlob = Buffer.from( + _prepareCborForLedger(callRequest), + ).toString("hex"); + const consentMessageRequestBlob = Buffer.from( + _prepareCborForLedger(consentMessageRequest), + ).toString("hex"); + + writeToJson({ + data: { callRequestBlob, consentMessageRequestBlob }, + fileName: "icrc29.json", + }); +}; + +createCandidBlobs(); diff --git a/scripts/test-vectors/utils.ts b/scripts/test-vectors/utils.ts index fbf72564e..368c29533 100644 --- a/scripts/test-vectors/utils.ts +++ b/scripts/test-vectors/utils.ts @@ -33,7 +33,7 @@ import { SnsNeuronPermissionType } from "../../packages/sns/src/enums/governance * - `hardwareWallet: false` in the method. */ -function _prepareCborForLedger( +export function _prepareCborForLedger( request: ReadRequest | CallRequest, ): ArrayBuffer { return Cbor.encode({ content: request }); From 31aac8ac1412e250c224e9ef2b43c876e64da300 Mon Sep 17 00:00:00 2001 From: Frederik Rothenberger Date: Fri, 23 Aug 2024 16:08:29 +0200 Subject: [PATCH 30/31] Fix expiry in test-vector (#698) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Motivation Expiry takes as a constructor argument the time _delta_ in millis. Supplied was the absolute timestamp as a number (but too large to use accurate integer representation). This fixes the bug. In addition, the test vector should be called ICRC-21 rather then ICRC-29. --------- Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Llorenç --- scripts/test-vectors/20220923-spawn-neuron.ts | 4 ++-- scripts/test-vectors/20221206-increase-dd.ts | 2 +- .../test-vectors/20230110-sns-add-hotkey.ts | 13 +++++++------ .../test-vectors/20230118-sns-manage-neuron.ts | 15 +++++++++------ .../test-vectors/20230118-sns-remove-hotkey.ts | 11 ++++++----- scripts/test-vectors/20230123-icrc-1.ts | 11 ++++++----- .../20230125-sns-stake-maturity.ts | 3 ++- scripts/test-vectors/20230321-disburse.ts | 4 ++-- scripts/test-vectors/20230511-add-hotkey.ts | 4 ++-- scripts/test-vectors/20230511-remove-hotkey.ts | 4 ++-- .../20230516-send-icp-stake-neuron.ts | 12 ++++++------ scripts/test-vectors/20230516-spawn-neuron.ts | 4 ++-- scripts/test-vectors/20230524-icrc-1.ts | 11 ++++++----- .../20230712-sns-set-dissolve-timestamp.ts | 10 +++++----- .../test-vectors/20230927-icrc-stake-neuron.ts | 4 ++-- .../{20240730-icrc29.ts => 20240730-icrc21.ts} | 18 +++++++++--------- scripts/test-vectors/date-utils.ts | 4 ++-- scripts/test-vectors/sns-governance.idl.ts | 18 +++++++++--------- scripts/test-vectors/sns-ledger.idl.ts | 4 ++-- 19 files changed, 82 insertions(+), 74 deletions(-) rename scripts/test-vectors/{20240730-icrc29.ts => 20240730-icrc21.ts} (79%) diff --git a/scripts/test-vectors/20220923-spawn-neuron.ts b/scripts/test-vectors/20220923-spawn-neuron.ts index 4f67eba3a..ddec324f2 100644 --- a/scripts/test-vectors/20220923-spawn-neuron.ts +++ b/scripts/test-vectors/20220923-spawn-neuron.ts @@ -11,7 +11,7 @@ import { createBlob, splitPrincipal, writeToJson } from "./utils"; const mockNeuronId = BigInt(15374508381553347371); const mockNeuronId2 = BigInt(8836564053576662908); const mockPrincipal = Principal.fromText( - "xlmdg-vkosz-ceopx-7wtgu-g3xmd-koiyc-awqaq-7modz-zf6r6-364rh-oqe" + "xlmdg-vkosz-ceopx-7wtgu-g3xmd-koiyc-awqaq-7modz-zf6r6-364rh-oqe", ); const createCandidSpawnNeuron = ({ @@ -46,7 +46,7 @@ const createCandidSpawnNeuron = ({ ? ["Controller : Self"] : splitPrincipal(newController).map( (data, i, elements) => - `Controller [${i + 1}/${elements.length}] : ${data}` + `Controller [${i + 1}/${elements.length}] : ${data}`, ); outputs.push(...controllerMessages); diff --git a/scripts/test-vectors/20221206-increase-dd.ts b/scripts/test-vectors/20221206-increase-dd.ts index 3c8d75082..449e41b27 100644 --- a/scripts/test-vectors/20221206-increase-dd.ts +++ b/scripts/test-vectors/20221206-increase-dd.ts @@ -9,7 +9,7 @@ const mockNeuronId2 = BigInt(8836564053576662908); const createIncreaseDissolveDelayVector = ( neuronId: NeuronId, - additionalDissolveDelaySeconds: number + additionalDissolveDelaySeconds: number, ) => { const params = { neuronId, diff --git a/scripts/test-vectors/20230110-sns-add-hotkey.ts b/scripts/test-vectors/20230110-sns-add-hotkey.ts index 855face6a..67b305064 100644 --- a/scripts/test-vectors/20230110-sns-add-hotkey.ts +++ b/scripts/test-vectors/20230110-sns-add-hotkey.ts @@ -24,7 +24,8 @@ interface Params extends SnsNeuronPermissionsParams { const createTestVector = (params: Params) => { const rawRequestBody = toAddPermissionsRequest(params); const canisterIdOutputs = splitPrincipal(params.canisterId).map( - (data, i, elements) => `Canister Id [${i + 1}/${elements.length}] : ${data}` + (data, i, elements) => + `Canister Id [${i + 1}/${elements.length}] : ${data}`, ); const neuronIdString = bytesToHexString(Array.from(params.neuronId.id)); const neuronIdOutputs = @@ -44,14 +45,14 @@ const createTestVector = (params: Params) => { }, [] as string[]) ?.map( (data, i, elements) => - `Neuron Id [${i + 1}/${elements.length}] : ${data}` + `Neuron Id [${i + 1}/${elements.length}] : ${data}`, ) || []; const principalOutputs = splitPrincipal(params.principal).map( (data, i, elements) => - `Principal Id [${i + 1}/${elements.length}] : ${data}` + `Principal Id [${i + 1}/${elements.length}] : ${data}`, ); const permissionOutputs = params.permissions.map( - (p) => `Add Permission : ${permissionMapper[p]}` + (p) => `Add Permission : ${permissionMapper[p]}`, ); const output = [ "Transaction type : Add Neuron Permissions", @@ -86,10 +87,10 @@ const main = () => { 61, ]); const principal1 = Principal.fromText( - "krpzt-buecq-u3umg-7kb7r-j5jpx-twqwa-3ykc4-y3cnk-7kwvw-5bq6z-mae" + "krpzt-buecq-u3umg-7kb7r-j5jpx-twqwa-3ykc4-y3cnk-7kwvw-5bq6z-mae", ); const principal2 = Principal.fromText( - "2dfd6-abjpf-eihu7-pwv6m-qnlbt-oszmg-kb26q-rvqms-onmuh-mwiq3-uqe" + "2dfd6-abjpf-eihu7-pwv6m-qnlbt-oszmg-kb26q-rvqms-onmuh-mwiq3-uqe", ); const canisterId1 = Principal.fromText("ppmzm-3aaaa-aaaaa-aacpq-cai"); const canisterId2 = Principal.fromText("s24we-diaaa-aaaaa-aaaka-cai"); diff --git a/scripts/test-vectors/20230118-sns-manage-neuron.ts b/scripts/test-vectors/20230118-sns-manage-neuron.ts index f919dd5f2..14936d11c 100644 --- a/scripts/test-vectors/20230118-sns-manage-neuron.ts +++ b/scripts/test-vectors/20230118-sns-manage-neuron.ts @@ -30,14 +30,15 @@ interface DisburseParams extends SnsDisburseNeuronParams { const createDisburseVector = (params: DisburseParams) => { const rawRequestBody = toDisburseNeuronRequest(params); const canisterIdOutputs = splitPrincipal(params.canisterId).map( - (data, i, elements) => `Canister Id [${i + 1}/${elements.length}] : ${data}` + (data, i, elements) => + `Canister Id [${i + 1}/${elements.length}] : ${data}`, ); const neuronIdString = bytesToHexString(Array.from(params.neuronId.id)); const neuronIdOutputs = splitString(neuronIdString, "Neuron Id"); const disburseToAccountStr = encodeIcrcAccount( params.toAccount ?? { owner: defaultCaller, - } + }, ); const disburseToOutputs = splitString(disburseToAccountStr, "Disburse to"); const amount = params.amount @@ -73,7 +74,8 @@ interface SetDissolveParams { const createStopDissolveVector = (params: SetDissolveParams) => { const rawRequestBody = toStopDissolvingNeuronRequest(params.neuronId); const canisterIdOutputs = splitPrincipal(params.canisterId).map( - (data, i, elements) => `Canister Id [${i + 1}/${elements.length}] : ${data}` + (data, i, elements) => + `Canister Id [${i + 1}/${elements.length}] : ${data}`, ); const neuronIdString = bytesToHexString(Array.from(params.neuronId.id)); const neuronIdOutputs = splitString(neuronIdString, "Neuron Id"); @@ -99,7 +101,8 @@ const createStopDissolveVector = (params: SetDissolveParams) => { const createStartDissolveVector = (params: SetDissolveParams) => { const rawRequestBody = toStartDissolvingNeuronRequest(params.neuronId); const canisterIdOutputs = splitPrincipal(params.canisterId).map( - (data, i, elements) => `Canister Id [${i + 1}/${elements.length}] : ${data}` + (data, i, elements) => + `Canister Id [${i + 1}/${elements.length}] : ${data}`, ); const neuronIdString = bytesToHexString(Array.from(params.neuronId.id)); const neuronIdOutputs = splitString(neuronIdString, "Neuron Id"); @@ -134,10 +137,10 @@ const main = () => { 61, ]); const principal1 = Principal.fromText( - "krpzt-buecq-u3umg-7kb7r-j5jpx-twqwa-3ykc4-y3cnk-7kwvw-5bq6z-mae" + "krpzt-buecq-u3umg-7kb7r-j5jpx-twqwa-3ykc4-y3cnk-7kwvw-5bq6z-mae", ); const principal2 = Principal.fromText( - "2dfd6-abjpf-eihu7-pwv6m-qnlbt-oszmg-kb26q-rvqms-onmuh-mwiq3-uqe" + "2dfd6-abjpf-eihu7-pwv6m-qnlbt-oszmg-kb26q-rvqms-onmuh-mwiq3-uqe", ); const snsAccount1 = { owner: principal1, diff --git a/scripts/test-vectors/20230118-sns-remove-hotkey.ts b/scripts/test-vectors/20230118-sns-remove-hotkey.ts index 4d5fd125e..e7550528b 100644 --- a/scripts/test-vectors/20230118-sns-remove-hotkey.ts +++ b/scripts/test-vectors/20230118-sns-remove-hotkey.ts @@ -25,16 +25,17 @@ interface Params extends SnsNeuronPermissionsParams { const createTestVector = (params: Params) => { const rawRequestBody = toRemovePermissionsRequest(params); const canisterIdOutputs = splitPrincipal(params.canisterId).map( - (data, i, elements) => `Canister Id [${i + 1}/${elements.length}] : ${data}` + (data, i, elements) => + `Canister Id [${i + 1}/${elements.length}] : ${data}`, ); const neuronIdString = bytesToHexString(Array.from(params.neuronId.id)); const neuronIdOutputs = splitString(neuronIdString, "Neuron Id"); const principalOutputs = splitPrincipal(params.principal).map( (data, i, elements) => - `Principal Id [${i + 1}/${elements.length}] : ${data}` + `Principal Id [${i + 1}/${elements.length}] : ${data}`, ); const permissionOutputs = params.permissions.map( - (p) => `Remove Permission : ${permissionMapper[p]}` + (p) => `Remove Permission : ${permissionMapper[p]}`, ); const output = [ "Transaction type : Remove Neuron Permissions", @@ -69,10 +70,10 @@ const main = () => { 61, ]); const principal1 = Principal.fromText( - "krpzt-buecq-u3umg-7kb7r-j5jpx-twqwa-3ykc4-y3cnk-7kwvw-5bq6z-mae" + "krpzt-buecq-u3umg-7kb7r-j5jpx-twqwa-3ykc4-y3cnk-7kwvw-5bq6z-mae", ); const principal2 = Principal.fromText( - "2dfd6-abjpf-eihu7-pwv6m-qnlbt-oszmg-kb26q-rvqms-onmuh-mwiq3-uqe" + "2dfd6-abjpf-eihu7-pwv6m-qnlbt-oszmg-kb26q-rvqms-onmuh-mwiq3-uqe", ); const canisterId1 = Principal.fromText("ppmzm-3aaaa-aaaaa-aacpq-cai"); const canisterId2 = Principal.fromText("s24we-diaaa-aaaaa-aaaka-cai"); diff --git a/scripts/test-vectors/20230123-icrc-1.ts b/scripts/test-vectors/20230123-icrc-1.ts index 80489f76d..9a8afbb77 100644 --- a/scripts/test-vectors/20230123-icrc-1.ts +++ b/scripts/test-vectors/20230123-icrc-1.ts @@ -50,7 +50,8 @@ const createTestVector = (params: Params) => { let outputTxType = isICP ? "Send ICP" : "Send Tokens"; const canisterIdOutputs = splitPrincipal(params.canisterId).map( - (data, i, elements) => `Canister Id [${i + 1}/${elements.length}] : ${data}` + (data, i, elements) => + `Canister Id [${i + 1}/${elements.length}] : ${data}`, ); const fromOutputs = splitAccount( @@ -58,14 +59,14 @@ const createTestVector = (params: Params) => { owner: params.owner, subaccount: params.from_subaccount, }, - "From account" + "From account", ); const toOutputs = splitAccount( { owner: params.to.owner, subaccount: fromNullable(params.to.subaccount), }, - "To account" + "To account", ); const amountToken = Number(params.amount) / Number(E8S_PER_TOKEN); @@ -126,10 +127,10 @@ const main = () => { 61, ]); const principal1 = Principal.fromText( - "krpzt-buecq-u3umg-7kb7r-j5jpx-twqwa-3ykc4-y3cnk-7kwvw-5bq6z-mae" + "krpzt-buecq-u3umg-7kb7r-j5jpx-twqwa-3ykc4-y3cnk-7kwvw-5bq6z-mae", ); const principal2 = Principal.fromText( - "2dfd6-abjpf-eihu7-pwv6m-qnlbt-oszmg-kb26q-rvqms-onmuh-mwiq3-uqe" + "2dfd6-abjpf-eihu7-pwv6m-qnlbt-oszmg-kb26q-rvqms-onmuh-mwiq3-uqe", ); const canisterId1 = Principal.fromText("ppmzm-3aaaa-aaaaa-aacpq-cai"); const canisterId2 = Principal.fromText("s24we-diaaa-aaaaa-aaaka-cai"); diff --git a/scripts/test-vectors/20230125-sns-stake-maturity.ts b/scripts/test-vectors/20230125-sns-stake-maturity.ts index 1018d75d1..525b4770e 100644 --- a/scripts/test-vectors/20230125-sns-stake-maturity.ts +++ b/scripts/test-vectors/20230125-sns-stake-maturity.ts @@ -23,7 +23,8 @@ interface StakeMaturityParams extends SnsNeuronStakeMaturityParams { const createStakeMaturityVector = (params: StakeMaturityParams) => { const rawRequestBody = toStakeMaturityRequest(params); const canisterIdOutputs = splitPrincipal(params.canisterId).map( - (data, i, elements) => `Canister Id [${i + 1}/${elements.length}] : ${data}` + (data, i, elements) => + `Canister Id [${i + 1}/${elements.length}] : ${data}`, ); const neuronIdString = bytesToHexString(Array.from(params.neuronId.id)); const neuronIdOutputs = splitString(neuronIdString, "Neuron Id"); diff --git a/scripts/test-vectors/20230321-disburse.ts b/scripts/test-vectors/20230321-disburse.ts index b2cd13ed5..d3978775d 100644 --- a/scripts/test-vectors/20230321-disburse.ts +++ b/scripts/test-vectors/20230321-disburse.ts @@ -10,10 +10,10 @@ const mockNeuronId2 = BigInt(8836564053576662908); const amount1 = BigInt(20_000_000); const amount2 = BigInt(25_000_000); const account1 = AccountIdentifier.fromHex( - "d4685b31b51450508aff0331584df7692a84467b680326f5c5f7d30ae711682f" + "d4685b31b51450508aff0331584df7692a84467b680326f5c5f7d30ae711682f", ); const account2 = AccountIdentifier.fromHex( - "b1cebc8480a0afc91198a87ddf52c6ca7eb7ccddb0cb398064f71d2bbaf2f72b" + "b1cebc8480a0afc91198a87ddf52c6ca7eb7ccddb0cb398064f71d2bbaf2f72b", ); const createDisburseVector = ({ diff --git a/scripts/test-vectors/20230511-add-hotkey.ts b/scripts/test-vectors/20230511-add-hotkey.ts index b7931cf3c..7b0a5f82a 100644 --- a/scripts/test-vectors/20230511-add-hotkey.ts +++ b/scripts/test-vectors/20230511-add-hotkey.ts @@ -8,10 +8,10 @@ import { createBlob, writeToJson } from "./utils"; const mockNeuronId = BigInt(15374508381553347371); const mockNeuronId2 = BigInt(8836564053576662908); const principal1 = Principal.fromText( - "krpzt-buecq-u3umg-7kb7r-j5jpx-twqwa-3ykc4-y3cnk-7kwvw-5bq6z-mae" + "krpzt-buecq-u3umg-7kb7r-j5jpx-twqwa-3ykc4-y3cnk-7kwvw-5bq6z-mae", ); const principal2 = Principal.fromText( - "2dfd6-abjpf-eihu7-pwv6m-qnlbt-oszmg-kb26q-rvqms-onmuh-mwiq3-uqe" + "2dfd6-abjpf-eihu7-pwv6m-qnlbt-oszmg-kb26q-rvqms-onmuh-mwiq3-uqe", ); const createAddHotkeyVector = ({ diff --git a/scripts/test-vectors/20230511-remove-hotkey.ts b/scripts/test-vectors/20230511-remove-hotkey.ts index 9764970f5..aa6885d2c 100644 --- a/scripts/test-vectors/20230511-remove-hotkey.ts +++ b/scripts/test-vectors/20230511-remove-hotkey.ts @@ -8,10 +8,10 @@ import { createBlob, writeToJson } from "./utils"; const mockNeuronId = BigInt(15374508381553347371); const mockNeuronId2 = BigInt(8836564053576662908); const principal1 = Principal.fromText( - "krpzt-buecq-u3umg-7kb7r-j5jpx-twqwa-3ykc4-y3cnk-7kwvw-5bq6z-mae" + "krpzt-buecq-u3umg-7kb7r-j5jpx-twqwa-3ykc4-y3cnk-7kwvw-5bq6z-mae", ); const principal2 = Principal.fromText( - "2dfd6-abjpf-eihu7-pwv6m-qnlbt-oszmg-kb26q-rvqms-onmuh-mwiq3-uqe" + "2dfd6-abjpf-eihu7-pwv6m-qnlbt-oszmg-kb26q-rvqms-onmuh-mwiq3-uqe", ); const createRemoveHotkeyVector = ({ diff --git a/scripts/test-vectors/20230516-send-icp-stake-neuron.ts b/scripts/test-vectors/20230516-send-icp-stake-neuron.ts index 9296aca56..f92a1635e 100644 --- a/scripts/test-vectors/20230516-send-icp-stake-neuron.ts +++ b/scripts/test-vectors/20230516-send-icp-stake-neuron.ts @@ -16,19 +16,19 @@ import { TransferFn } from "./ledger.idl"; import { createBlob, writeToJson } from "./utils"; const account1 = AccountIdentifier.fromHex( - "d3e13d4777e22367532053190b6c6ccf57444a61337e996242b1abfb52cf92c8" + "d3e13d4777e22367532053190b6c6ccf57444a61337e996242b1abfb52cf92c8", ); const account2 = AccountIdentifier.fromPrincipal({ principal: Principal.fromText( - "bwz3t-ercuj-owo6s-4adfr-sbu4o-l72hg-kfhc5-5sapm-tj6bn-3scho-uqe" + "bwz3t-ercuj-owo6s-4adfr-sbu4o-l72hg-kfhc5-5sapm-tj6bn-3scho-uqe", ), }); const defaultCaller = Principal.fromText( - "5upke-tazvi-6ufqc-i3v6r-j4gpu-dpwti-obhal-yb5xj-ue32x-ktkql-rqe" + "5upke-tazvi-6ufqc-i3v6r-j4gpu-dpwti-obhal-yb5xj-ue32x-ktkql-rqe", ); const caller1 = Principal.fromText( - "bwz3t-ercuj-owo6s-4adfr-sbu4o-l72hg-kfhc5-5sapm-tj6bn-3scho-uqe" + "bwz3t-ercuj-owo6s-4adfr-sbu4o-l72hg-kfhc5-5sapm-tj6bn-3scho-uqe", ); const subaccount1 = [ @@ -50,7 +50,7 @@ const randomBytes3 = new Uint8Array([178, 247, 215, 62, 199, 137, 175, 189]); const buildNeuronStakeSubAccount = ( nonce: Uint8Array, - principal: Principal + principal: Principal, ): SubAccount => { const padding = asciiStringToByteArray("neuron-stake"); const shaObj = sha256.create(); @@ -104,7 +104,7 @@ const createSendIcpVector = ({ fromSubAccount === undefined ? undefined : (SubAccount.fromBytes( - arrayOfNumberToUint8Array(fromSubAccount) + arrayOfNumberToUint8Array(fromSubAccount), ) as SubAccount); return { diff --git a/scripts/test-vectors/20230516-spawn-neuron.ts b/scripts/test-vectors/20230516-spawn-neuron.ts index a48fca35f..6733d0764 100644 --- a/scripts/test-vectors/20230516-spawn-neuron.ts +++ b/scripts/test-vectors/20230516-spawn-neuron.ts @@ -8,10 +8,10 @@ import { createBlob, writeToJson } from "./utils"; const mockNeuronId = BigInt(15374508381553347371); const mockNeuronId2 = BigInt(8836564053576662908); const principal1 = Principal.fromText( - "krpzt-buecq-u3umg-7kb7r-j5jpx-twqwa-3ykc4-y3cnk-7kwvw-5bq6z-mae" + "krpzt-buecq-u3umg-7kb7r-j5jpx-twqwa-3ykc4-y3cnk-7kwvw-5bq6z-mae", ); const principal2 = Principal.fromText( - "2dfd6-abjpf-eihu7-pwv6m-qnlbt-oszmg-kb26q-rvqms-onmuh-mwiq3-uqe" + "2dfd6-abjpf-eihu7-pwv6m-qnlbt-oszmg-kb26q-rvqms-onmuh-mwiq3-uqe", ); const createSpawnNeuronVector = ({ diff --git a/scripts/test-vectors/20230524-icrc-1.ts b/scripts/test-vectors/20230524-icrc-1.ts index 80489f76d..9a8afbb77 100644 --- a/scripts/test-vectors/20230524-icrc-1.ts +++ b/scripts/test-vectors/20230524-icrc-1.ts @@ -50,7 +50,8 @@ const createTestVector = (params: Params) => { let outputTxType = isICP ? "Send ICP" : "Send Tokens"; const canisterIdOutputs = splitPrincipal(params.canisterId).map( - (data, i, elements) => `Canister Id [${i + 1}/${elements.length}] : ${data}` + (data, i, elements) => + `Canister Id [${i + 1}/${elements.length}] : ${data}`, ); const fromOutputs = splitAccount( @@ -58,14 +59,14 @@ const createTestVector = (params: Params) => { owner: params.owner, subaccount: params.from_subaccount, }, - "From account" + "From account", ); const toOutputs = splitAccount( { owner: params.to.owner, subaccount: fromNullable(params.to.subaccount), }, - "To account" + "To account", ); const amountToken = Number(params.amount) / Number(E8S_PER_TOKEN); @@ -126,10 +127,10 @@ const main = () => { 61, ]); const principal1 = Principal.fromText( - "krpzt-buecq-u3umg-7kb7r-j5jpx-twqwa-3ykc4-y3cnk-7kwvw-5bq6z-mae" + "krpzt-buecq-u3umg-7kb7r-j5jpx-twqwa-3ykc4-y3cnk-7kwvw-5bq6z-mae", ); const principal2 = Principal.fromText( - "2dfd6-abjpf-eihu7-pwv6m-qnlbt-oszmg-kb26q-rvqms-onmuh-mwiq3-uqe" + "2dfd6-abjpf-eihu7-pwv6m-qnlbt-oszmg-kb26q-rvqms-onmuh-mwiq3-uqe", ); const canisterId1 = Principal.fromText("ppmzm-3aaaa-aaaaa-aacpq-cai"); const canisterId2 = Principal.fromText("s24we-diaaa-aaaaa-aaaka-cai"); diff --git a/scripts/test-vectors/20230712-sns-set-dissolve-timestamp.ts b/scripts/test-vectors/20230712-sns-set-dissolve-timestamp.ts index 1c6d59d10..1f94bed2b 100644 --- a/scripts/test-vectors/20230712-sns-set-dissolve-timestamp.ts +++ b/scripts/test-vectors/20230712-sns-set-dissolve-timestamp.ts @@ -4,10 +4,10 @@ import { SnsSetDissolveTimestampParams } from "@dfinity/sns/src"; import { toSetDissolveTimestampRequest } from "@dfinity/sns/src/converters/governance.converters"; import { arrayOfNumberToUint8Array } from "@dfinity/utils"; import { - secondsToDissolveDelayDuration, SECONDS_IN_DAY, SECONDS_IN_MONTH, SECONDS_IN_YEAR, + secondsToDissolveDelayDuration, } from "./date-utils"; import { ManageNeuronFn } from "./sns-governance.idl"; import { bytesToHexString, createBlob, writeToJson } from "./utils"; @@ -25,7 +25,7 @@ const createTestVector = (params: Params) => { const rawRequestBody = toSetDissolveTimestampRequest(params); const neuronIdString = bytesToHexString(Array.from(params.neuronId.id)); const timestampLabel = secondsToDissolveDelayDuration( - params.dissolveTimestampSeconds - BigInt(nowInSeconds) + params.dissolveTimestampSeconds - BigInt(nowInSeconds), ); console.log("in da test vector", params.dissolveTimestampSeconds); return { @@ -58,15 +58,15 @@ const main = () => { const canisterId2 = Principal.fromText("s24we-diaaa-aaaaa-aaaka-cai"); const inOneYear = BigInt(nowInSeconds + SECONDS_IN_YEAR); const nextYearAndAHalf = BigInt( - Math.round(nowInSeconds + SECONDS_IN_YEAR + SECONDS_IN_MONTH * 6) + Math.round(nowInSeconds + SECONDS_IN_YEAR + SECONDS_IN_MONTH * 6), ); const inOneYearMonthsAndDays = BigInt( Math.round( nowInSeconds + SECONDS_IN_YEAR + SECONDS_IN_MONTH * 3 + - SECONDS_IN_DAY * 18 - ) + SECONDS_IN_DAY * 18, + ), ); const inSixMonths = BigInt(Math.round(nowInSeconds + SECONDS_IN_MONTH * 6)); const inEightYears = BigInt(Math.round(nowInSeconds + SECONDS_IN_YEAR * 8)); diff --git a/scripts/test-vectors/20230927-icrc-stake-neuron.ts b/scripts/test-vectors/20230927-icrc-stake-neuron.ts index ebde6d0fc..0d678e985 100644 --- a/scripts/test-vectors/20230927-icrc-stake-neuron.ts +++ b/scripts/test-vectors/20230927-icrc-stake-neuron.ts @@ -48,8 +48,8 @@ const createTestVector = (params: Params) => { let outputTxType = isStakeNeuron ? "Stake Neuron" : isICP - ? "Send ICP" - : "Send Tokens"; + ? "Send ICP" + : "Send Tokens"; const canisterIdOutputs = splitPrincipal(params.canisterId).map( (data, i, elements) => `Canister Id [${i + 1}/${elements.length}] : ${data}`, diff --git a/scripts/test-vectors/20240730-icrc29.ts b/scripts/test-vectors/20240730-icrc21.ts similarity index 79% rename from scripts/test-vectors/20240730-icrc29.ts rename to scripts/test-vectors/20240730-icrc21.ts index 2a3f48f08..f8d2a2082 100644 --- a/scripts/test-vectors/20240730-icrc29.ts +++ b/scripts/test-vectors/20240730-icrc21.ts @@ -1,6 +1,6 @@ -import { Expiry, SubmitRequestType } from "@dfinity/agent"; +import { Cbor } from "@dfinity/agent"; import { Principal } from "@dfinity/principal"; -import { _prepareCborForLedger, writeToJson } from "./utils"; +import { writeToJson } from "./utils"; function hexStringToArrayBuffer(hexString: string): ArrayBuffer { // Remove any non-hexadecimal characters (e.g., spaces) @@ -26,9 +26,9 @@ function hexStringToArrayBuffer(hexString: string): ArrayBuffer { const callRequest = { arg: hexStringToArrayBuffer("4449444C00017104746F6269"), canister_id: Principal.fromHex("00000000006000FD0101"), - ingress_expiry: new Expiry(1712667140606000000), + ingress_expiry: BigInt("1712667140606000000"), method_name: "greet", - request_type: "query" as SubmitRequestType, + request_type: "query", sender: Principal.fromHex("04"), }; @@ -37,24 +37,24 @@ const consentMessageRequest = { "4449444C076D7B6C01D880C6D007716C02CBAEB581017AB183E7F1077A6B028BEABFC2067F8EF1C1EE0D026E036C02EFCEE7800401C4FBF2DB05046C03D6FCA70200E1EDEB4A7184F7FEE80A0501060C4449444C00017104746F626905677265657402656E01011E000300", ), canister_id: Principal.fromHex("00000000006000FD0101"), - ingress_expiry: new Expiry(1712666698482000000), + ingress_expiry: BigInt("1712666698482000000"), method_name: "icrc21_canister_call_consent_message", nonce: hexStringToArrayBuffer("A3788C1805553FB69B20F08E87E23B13"), - request_type: "call" as SubmitRequestType, + request_type: "call", sender: Principal.fromHex("04"), }; const createCandidBlobs = () => { const callRequestBlob = Buffer.from( - _prepareCborForLedger(callRequest), + Cbor.encode({ content: callRequest }), ).toString("hex"); const consentMessageRequestBlob = Buffer.from( - _prepareCborForLedger(consentMessageRequest), + Cbor.encode({ content: consentMessageRequest }), ).toString("hex"); writeToJson({ data: { callRequestBlob, consentMessageRequestBlob }, - fileName: "icrc29.json", + fileName: "icrc21.json", }); }; diff --git a/scripts/test-vectors/date-utils.ts b/scripts/test-vectors/date-utils.ts index 9df55b1ea..5c980800a 100644 --- a/scripts/test-vectors/date-utils.ts +++ b/scripts/test-vectors/date-utils.ts @@ -38,7 +38,7 @@ export const secondsToDissolveDelayDuration = (seconds: bigint): string => { const years = seconds / BigInt(SECONDS_IN_YEAR); const months = (seconds % BigInt(SECONDS_IN_YEAR)) / BigInt(SECONDS_IN_MONTH); const days = BigInt( - Math.ceil((Number(seconds) % SECONDS_IN_MONTH) / SECONDS_IN_DAY) + Math.ceil((Number(seconds) % SECONDS_IN_MONTH) / SECONDS_IN_DAY), ); const periods = [ createLabel("year", years), @@ -54,7 +54,7 @@ export const secondsToDissolveDelayDuration = (seconds: bigint): string => { labelInfo.amount === 1 ? labels[labelInfo.labelKey] : labels[`${labelInfo.labelKey}_plural`] - }` + }`, ) .join(", "); }; diff --git a/scripts/test-vectors/sns-governance.idl.ts b/scripts/test-vectors/sns-governance.idl.ts index ca15931db..452c7b4ef 100644 --- a/scripts/test-vectors/sns-governance.idl.ts +++ b/scripts/test-vectors/sns-governance.idl.ts @@ -18,12 +18,12 @@ const NervousSystemFunction = IDL.Record({ }); const GovernanceCachedMetrics = IDL.Record({ not_dissolving_neurons_e8s_buckets: IDL.Vec( - IDL.Tuple(IDL.Nat64, IDL.Float64) + IDL.Tuple(IDL.Nat64, IDL.Float64), ), garbage_collectable_neurons_count: IDL.Nat64, neurons_with_invalid_stake_count: IDL.Nat64, not_dissolving_neurons_count_buckets: IDL.Vec( - IDL.Tuple(IDL.Nat64, IDL.Nat64) + IDL.Tuple(IDL.Nat64, IDL.Nat64), ), neurons_with_less_than_6_months_dissolve_delay_count: IDL.Nat64, dissolved_neurons_count: IDL.Nat64, @@ -273,7 +273,7 @@ const Neuron = IDL.Record({ const Governance = IDL.Record({ root_canister_id: IDL.Opt(IDL.Principal), id_to_nervous_system_functions: IDL.Vec( - IDL.Tuple(IDL.Nat64, NervousSystemFunction) + IDL.Tuple(IDL.Nat64, NervousSystemFunction), ), metrics: IDL.Opt(GovernanceCachedMetrics), mode: IDL.Int32, @@ -431,7 +431,7 @@ const SetMode = IDL.Record({ mode: IDL.Int32 }); export const ManageNeuronFn = IDL.Func( [ManageNeuron], [ManageNeuronResponse], - [] + [], ); // List of endpoints @@ -439,14 +439,14 @@ IDL.Service({ claim_swap_neurons: IDL.Func( [ClaimSwapNeuronsRequest], [ClaimSwapNeuronsResponse], - [] + [], ), get_build_metadata: IDL.Func([], [IDL.Text], ["query"]), get_metadata: IDL.Func([IDL.Record({})], [GetMetadataResponse], ["query"]), get_nervous_system_parameters: IDL.Func( [IDL.Null], [NervousSystemParameters], - ["query"] + ["query"], ), get_neuron: IDL.Func([GetNeuron], [GetNeuronResponse], ["query"]), get_proposal: IDL.Func([GetProposal], [GetProposalResponse], ["query"]), @@ -454,17 +454,17 @@ IDL.Service({ get_running_sns_version: IDL.Func( [IDL.Record({})], [GetRunningSnsVersionResponse], - ["query"] + ["query"], ), get_sns_initialization_parameters: IDL.Func( [IDL.Record({})], [GetSnsInitializationParametersResponse], - ["query"] + ["query"], ), list_nervous_system_functions: IDL.Func( [], [ListNervousSystemFunctionsResponse], - ["query"] + ["query"], ), list_neurons: IDL.Func([ListNeurons], [ListNeuronsResponse], ["query"]), list_proposals: IDL.Func([ListProposals], [ListProposalsResponse], ["query"]), diff --git a/scripts/test-vectors/sns-ledger.idl.ts b/scripts/test-vectors/sns-ledger.idl.ts index fa98f2eaf..a6a2f6c03 100644 --- a/scripts/test-vectors/sns-ledger.idl.ts +++ b/scripts/test-vectors/sns-ledger.idl.ts @@ -62,14 +62,14 @@ const service = IDL.Service({ icrc1_metadata: IDL.Func( [], [IDL.Vec(IDL.Tuple(IDL.Text, Value))], - ["query"] + ["query"], ), icrc1_minting_account: IDL.Func([], [IDL.Opt(Account)], ["query"]), icrc1_name: IDL.Func([], [IDL.Text], ["query"]), icrc1_supported_standards: IDL.Func( [], [IDL.Vec(IDL.Record({ url: IDL.Text, name: IDL.Text }))], - ["query"] + ["query"], ), icrc1_symbol: IDL.Func([], [IDL.Text], ["query"]), icrc1_total_supply: IDL.Func([], [Tokens], ["query"]), From 980970e9db52c15b278556df939e417285143e3c Mon Sep 17 00:00:00 2001 From: Frederik Rothenberger Date: Fri, 30 Aug 2024 16:17:48 +0200 Subject: [PATCH 31/31] Adjust ingress expiry to not be more than 5 min after the consent message The previous value was too far into the future, such that the consent message would be considered stale. --- scripts/test-vectors/20240730-icrc21.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/test-vectors/20240730-icrc21.ts b/scripts/test-vectors/20240730-icrc21.ts index f8d2a2082..b96110035 100644 --- a/scripts/test-vectors/20240730-icrc21.ts +++ b/scripts/test-vectors/20240730-icrc21.ts @@ -26,7 +26,7 @@ function hexStringToArrayBuffer(hexString: string): ArrayBuffer { const callRequest = { arg: hexStringToArrayBuffer("4449444C00017104746F6269"), canister_id: Principal.fromHex("00000000006000FD0101"), - ingress_expiry: BigInt("1712667140606000000"), + ingress_expiry: BigInt("1712666798482000000"), method_name: "greet", request_type: "query", sender: Principal.fromHex("04"),