dash-platform-sdk 1.4.0-dev.9 → 1.5.0-dev.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +122 -0
- package/bundle.min.js +17 -17
- package/package.json +6 -2
- package/proto/generated/platform.client.d.ts +60 -0
- package/proto/generated/platform.client.js +42 -0
- package/proto/generated/platform.d.ts +783 -0
- package/proto/generated/platform.js +1582 -1
- package/src/DashPlatformSDK.d.ts +2 -0
- package/src/DashPlatformSDK.js +3 -0
- package/src/constants.d.ts +2 -1
- package/src/constants.js +3 -1
- package/src/documents/index.js +1 -1
- package/src/documents/query.js +4 -6
- package/src/keyPair/index.d.ts +25 -0
- package/src/keyPair/index.js +33 -0
- package/src/shielded/createStateTransition.d.ts +3 -0
- package/src/shielded/createStateTransition.js +55 -0
- package/src/shielded/getMostRecentShieldedAnchor.d.ts +2 -0
- package/src/shielded/getMostRecentShieldedAnchor.js +36 -0
- package/src/shielded/getShieldedAnchors.d.ts +2 -0
- package/src/shielded/getShieldedAnchors.js +36 -0
- package/src/shielded/getShieldedEncryptedNotes.d.ts +3 -0
- package/src/shielded/getShieldedEncryptedNotes.js +43 -0
- package/src/shielded/getShieldedNotesCount.d.ts +2 -0
- package/src/shielded/getShieldedNotesCount.js +36 -0
- package/src/shielded/getShieldedNullifiers.d.ts +3 -0
- package/src/shielded/getShieldedNullifiers.js +40 -0
- package/src/shielded/getShieldedPoolState.d.ts +2 -0
- package/src/shielded/getShieldedPoolState.js +36 -0
- package/src/shielded/index.d.ts +130 -0
- package/src/shielded/index.js +186 -0
- package/src/stateTransitions/broadcast.js +3 -2
- package/test/unit/DataContract.spec.js +1 -1
- package/test/unit/Document.spec.js +31 -2
- package/test/unit/Identity.spec.js +26 -26
- package/test/unit/KeyPair.spec.js +32 -0
- package/test/unit/PlatformAddress.spec.js +4 -4
- package/test/unit/Shielded.spec.d.ts +1 -0
- package/test/unit/Shielded.spec.js +236 -0
- package/test/unit/Tokens.spec.js +2 -2
- package/types.d.ts +86 -2
- package/types.js +1 -1
package/src/DashPlatformSDK.d.ts
CHANGED
|
@@ -12,6 +12,7 @@ import { TokensController } from './tokens/index.js';
|
|
|
12
12
|
import { VotingController } from './voting/index.js';
|
|
13
13
|
import { Network } from '../types.js';
|
|
14
14
|
import { PlatformAddressesController } from './platformAddresses/index.js';
|
|
15
|
+
import { ShieldedController } from './shielded/index.js';
|
|
15
16
|
export interface GRPCOptions {
|
|
16
17
|
poolLimit: 5;
|
|
17
18
|
dapiUrl?: string | string[];
|
|
@@ -33,6 +34,7 @@ export declare class DashPlatformSDK {
|
|
|
33
34
|
options?: SDKOptions;
|
|
34
35
|
contestedResources: ContestedResourcesController;
|
|
35
36
|
platformAddresses: PlatformAddressesController;
|
|
37
|
+
shielded: ShieldedController;
|
|
36
38
|
stateTransitions: StateTransitionsController;
|
|
37
39
|
dataContracts: DataContractsController;
|
|
38
40
|
identities: IdentitiesController;
|
package/src/DashPlatformSDK.js
CHANGED
|
@@ -11,6 +11,7 @@ import { ContestedResourcesController } from './contestedResources/index.js';
|
|
|
11
11
|
import { TokensController } from './tokens/index.js';
|
|
12
12
|
import { VotingController } from './voting/index.js';
|
|
13
13
|
import { PlatformAddressesController } from './platformAddresses/index.js';
|
|
14
|
+
import { ShieldedController } from './shielded/index.js';
|
|
14
15
|
/**
|
|
15
16
|
* Javascript SDK for that let you interact with a Dash Platform blockchain
|
|
16
17
|
*/
|
|
@@ -22,6 +23,7 @@ export class DashPlatformSDK {
|
|
|
22
23
|
options;
|
|
23
24
|
contestedResources;
|
|
24
25
|
platformAddresses;
|
|
26
|
+
shielded;
|
|
25
27
|
stateTransitions;
|
|
26
28
|
dataContracts;
|
|
27
29
|
identities;
|
|
@@ -65,6 +67,7 @@ export class DashPlatformSDK {
|
|
|
65
67
|
this.grpcPool = grpcPool;
|
|
66
68
|
this.contestedResources = new ContestedResourcesController(grpcPool);
|
|
67
69
|
this.platformAddresses = new PlatformAddressesController(grpcPool);
|
|
70
|
+
this.shielded = new ShieldedController(grpcPool);
|
|
68
71
|
this.stateTransitions = new StateTransitionsController(grpcPool);
|
|
69
72
|
this.dataContracts = new DataContractsController(grpcPool);
|
|
70
73
|
this.identities = new IdentitiesController(grpcPool);
|
package/src/constants.d.ts
CHANGED
|
@@ -3,10 +3,11 @@ import { PlatformVersionWASM } from 'pshenmic-dpp';
|
|
|
3
3
|
* Default amount of documents to retrieve from DAPI
|
|
4
4
|
*/
|
|
5
5
|
export declare const DAPI_DEFAULT_LIMIT = 100;
|
|
6
|
+
export declare const SHIELDED_MAX_NOTES_PER_QUERY = 8192;
|
|
6
7
|
export declare const HALVING_INTERVAL = 210240;
|
|
7
8
|
export declare const TESTNET_ACTIVATION_HEIGHT = 1066900;
|
|
8
9
|
export declare const MAINNET_ACTIVATION_HEIGHT = 2128896;
|
|
9
10
|
export declare const GRPC_DEFAULT_POOL_LIMIT = 5;
|
|
10
11
|
export declare const DPNS_DATA_CONTRACT_ID = "GWRSAVFMjXx8HpQFaNJMqBV7MBgMK4br5UESsB4S31Ec";
|
|
11
12
|
export declare const DPNS_DATA_CONTRACT_BYTES = "AeZoxlmvZq7h5ywYbd57W34KHXEqCcQNVyH2Ir9TxTFVAAAAAAABAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIGZG9tYWluFgsSEGRvY3VtZW50c011dGFibGUTABIMY2FuQmVEZWxldGVkEwESDHRyYW5zZmVyYWJsZQIBEgl0cmFkZU1vZGUCARIEdHlwZRIGb2JqZWN0EgdpbmRpY2VzFQIWBBIEbmFtZRIScGFyZW50TmFtZUFuZExhYmVsEgpwcm9wZXJ0aWVzFQIWARIabm9ybWFsaXplZFBhcmVudERvbWFpbk5hbWUSA2FzYxYBEg9ub3JtYWxpemVkTGFiZWwSA2FzYxIGdW5pcXVlEwESCWNvbnRlc3RlZBYDEgxmaWVsZE1hdGNoZXMVARYCEgVmaWVsZBIPbm9ybWFsaXplZExhYmVsEgxyZWdleFBhdHRlcm4SE15bYS16QS1aMDEtXXszLDE5fSQSCnJlc29sdXRpb24CABILZGVzY3JpcHRpb24SqklmIHRoZSBub3JtYWxpemVkIGxhYmVsIHBhcnQgb2YgdGhpcyBpbmRleCBpcyBsZXNzIHRoYW4gMjAgY2hhcmFjdGVycyAoYWxsIGFscGhhYmV0IGEteiwgQS1aLCAwLCAxLCBhbmQgLSkgdGhlbiBhIG1hc3Rlcm5vZGUgdm90ZSBjb250ZXN0IHRha2VzIHBsYWNlIHRvIGdpdmUgb3V0IHRoZSBuYW1lFgMSBG5hbWUSCmlkZW50aXR5SWQSDm51bGxTZWFyY2hhYmxlEwASCnByb3BlcnRpZXMVARYBEhByZWNvcmRzLmlkZW50aXR5EgNhc2MSCnByb3BlcnRpZXMWBxIFbGFiZWwWBhIEdHlwZRIGc3RyaW5nEgdwYXR0ZXJuEipeW2EtekEtWjAtOV1bYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSQSCW1pbkxlbmd0aAIDEgltYXhMZW5ndGgCPxIIcG9zaXRpb24CABILZGVzY3JpcHRpb24SGURvbWFpbiBsYWJlbC4gZS5nLiAnQm9iJy4SD25vcm1hbGl6ZWRMYWJlbBYGEgR0eXBlEgZzdHJpbmcSB3BhdHRlcm4SPF5bYS1oai1rbS1ucC16MC05XVthLWhqLWttLW5wLXowLTktXXswLDYxfVthLWhqLWttLW5wLXowLTldJBIJbWF4TGVuZ3RoAj8SCHBvc2l0aW9uAgESC2Rlc2NyaXB0aW9uEqNEb21haW4gbGFiZWwgY29udmVydGVkIHRvIGxvd2VyY2FzZSBmb3IgY2FzZS1pbnNlbnNpdGl2ZSB1bmlxdWVuZXNzIHZhbGlkYXRpb24uICJvIiwgImkiIGFuZCAibCIgcmVwbGFjZWQgd2l0aCAiMCIgYW5kICIxIiB0byBtaXRpZ2F0ZSBob21vZ3JhcGggYXR0YWNrLiBlLmcuICdiMGInEggkY29tbWVudBJcTXVzdCBiZSBlcXVhbCB0byB0aGUgbGFiZWwgaW4gbG93ZXJjYXNlLiAibyIsICJpIiBhbmQgImwiIG11c3QgYmUgcmVwbGFjZWQgd2l0aCAiMCIgYW5kICIxIi4SEHBhcmVudERvbWFpbk5hbWUWBhIEdHlwZRIGc3RyaW5nEgdwYXR0ZXJuEi1eJHxeW2EtekEtWjAtOV1bYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSQSCW1pbkxlbmd0aAIAEgltYXhMZW5ndGgCPxIIcG9zaXRpb24CAhILZGVzY3JpcHRpb24SJ0EgZnVsbCBwYXJlbnQgZG9tYWluIG5hbWUuIGUuZy4gJ2Rhc2gnLhIabm9ybWFsaXplZFBhcmVudERvbWFpbk5hbWUWBxIEdHlwZRIGc3RyaW5nEgdwYXR0ZXJuEkFeJHxeW2EtaGota20tbnAtejAtOV1bYS1oai1rbS1ucC16MC05LVwuXXswLDYxfVthLWhqLWttLW5wLXowLTldJBIJbWluTGVuZ3RoAgASCW1heExlbmd0aAI/Eghwb3NpdGlvbgIDEgtkZXNjcmlwdGlvbhKiQSBwYXJlbnQgZG9tYWluIG5hbWUgaW4gbG93ZXJjYXNlIGZvciBjYXNlLWluc2Vuc2l0aXZlIHVuaXF1ZW5lc3MgdmFsaWRhdGlvbi4gIm8iLCAiaSIgYW5kICJsIiByZXBsYWNlZCB3aXRoICIwIiBhbmQgIjEiIHRvIG1pdGlnYXRlIGhvbW9ncmFwaCBhdHRhY2suIGUuZy4gJ2Rhc2gnEggkY29tbWVudBLATXVzdCBlaXRoZXIgYmUgZXF1YWwgdG8gYW4gZXhpc3RpbmcgZG9tYWluIG9yIGVtcHR5IHRvIGNyZWF0ZSBhIHRvcCBsZXZlbCBkb21haW4uICJvIiwgImkiIGFuZCAibCIgbXVzdCBiZSByZXBsYWNlZCB3aXRoICIwIiBhbmQgIjEiLiBPbmx5IHRoZSBkYXRhIGNvbnRyYWN0IG93bmVyIGNhbiBjcmVhdGUgdG9wIGxldmVsIGRvbWFpbnMuEgxwcmVvcmRlclNhbHQWBhIEdHlwZRIFYXJyYXkSCWJ5dGVBcnJheRMBEghtaW5JdGVtcwIgEghtYXhJdGVtcwIgEghwb3NpdGlvbgIEEgtkZXNjcmlwdGlvbhIiU2FsdCB1c2VkIGluIHRoZSBwcmVvcmRlciBkb2N1bWVudBIHcmVjb3JkcxYFEgR0eXBlEgZvYmplY3QSCnByb3BlcnRpZXMWARIIaWRlbnRpdHkWBxIEdHlwZRIFYXJyYXkSCWJ5dGVBcnJheRMBEghtaW5JdGVtcwIgEghtYXhJdGVtcwIgEghwb3NpdGlvbgIBEhBjb250ZW50TWVkaWFUeXBlEiFhcHBsaWNhdGlvbi94LmRhc2guZHBwLmlkZW50aWZpZXISC2Rlc2NyaXB0aW9uEjFJZGVudGlmaWVyIG5hbWUgcmVjb3JkIHRoYXQgcmVmZXJzIHRvIGFuIElkZW50aXR5Eg1taW5Qcm9wZXJ0aWVzAgESCHBvc2l0aW9uAgUSFGFkZGl0aW9uYWxQcm9wZXJ0aWVzEwASDnN1YmRvbWFpblJ1bGVzFgYSBHR5cGUSBm9iamVjdBIKcHJvcGVydGllcxYBEg9hbGxvd1N1YmRvbWFpbnMWBBIEdHlwZRIHYm9vbGVhbhILZGVzY3JpcHRpb24SW1RoaXMgb3B0aW9uIGRlZmluZXMgd2hvIGNhbiBjcmVhdGUgc3ViZG9tYWluczogdHJ1ZSAtIGFueW9uZTsgZmFsc2UgLSBvbmx5IHRoZSBkb21haW4gb3duZXISCCRjb21tZW50Ek9Pbmx5IHRoZSBkb21haW4gb3duZXIgaXMgYWxsb3dlZCB0byBjcmVhdGUgc3ViZG9tYWlucyBmb3Igbm9uIHRvcC1sZXZlbCBkb21haW5zEghwb3NpdGlvbgIAEghwb3NpdGlvbgIGEgtkZXNjcmlwdGlvbhJCU3ViZG9tYWluIHJ1bGVzIGFsbG93IGRvbWFpbiBvd25lcnMgdG8gZGVmaW5lIHJ1bGVzIGZvciBzdWJkb21haW5zEhRhZGRpdGlvbmFsUHJvcGVydGllcxMAEghyZXF1aXJlZBUBEg9hbGxvd1N1YmRvbWFpbnMSCHJlcXVpcmVkFQkSCiRjcmVhdGVkQXQSCiR1cGRhdGVkQXQSDiR0cmFuc2ZlcnJlZEF0EgVsYWJlbBIPbm9ybWFsaXplZExhYmVsEhpub3JtYWxpemVkUGFyZW50RG9tYWluTmFtZRIMcHJlb3JkZXJTYWx0EgdyZWNvcmRzEg5zdWJkb21haW5SdWxlcxIJdHJhbnNpZW50FQESDHByZW9yZGVyU2FsdBIUYWRkaXRpb25hbFByb3BlcnRpZXMTABIIJGNvbW1lbnQS+wE3SW4gb3JkZXIgdG8gcmVnaXN0ZXIgYSBkb21haW4geW91IG5lZWQgdG8gY3JlYXRlIGEgcHJlb3JkZXIuIFRoZSBwcmVvcmRlciBzdGVwIGlzIG5lZWRlZCB0byBwcmV2ZW50IG1hbi1pbi10aGUtbWlkZGxlIGF0dGFja3MuIG5vcm1hbGl6ZWRMYWJlbCArICcuJyArIG5vcm1hbGl6ZWRQYXJlbnREb21haW4gbXVzdCBub3QgYmUgbG9uZ2VyIHRoYW4gMjUzIGNoYXJzIGxlbmd0aCBhcyBkZWZpbmVkIGJ5IFJGQyAxMDM1LiBEb21haW4gZG9jdW1lbnRzIGFyZSBpbW11dGFibGU6IG1vZGlmaWNhdGlvbiBhbmQgZGVsZXRpb24gYXJlIHJlc3RyaWN0ZWQIcHJlb3JkZXIWCBIQZG9jdW1lbnRzTXV0YWJsZRMAEgxjYW5CZURlbGV0ZWQTARIEdHlwZRIGb2JqZWN0EgdpbmRpY2VzFQEWAxIEbmFtZRIKc2FsdGVkSGFzaBIKcHJvcGVydGllcxUBFgESEHNhbHRlZERvbWFpbkhhc2gSA2FzYxIGdW5pcXVlEwESCnByb3BlcnRpZXMWARIQc2FsdGVkRG9tYWluSGFzaBYGEgR0eXBlEgVhcnJheRIJYnl0ZUFycmF5EwESCG1pbkl0ZW1zAiASCG1heEl0ZW1zAiASCHBvc2l0aW9uAgASC2Rlc2NyaXB0aW9uEllEb3VibGUgc2hhLTI1NiBvZiB0aGUgY29uY2F0ZW5hdGlvbiBvZiBhIDMyIGJ5dGUgcmFuZG9tIHNhbHQgYW5kIGEgbm9ybWFsaXplZCBkb21haW4gbmFtZRIIcmVxdWlyZWQVARIQc2FsdGVkRG9tYWluSGFzaBIUYWRkaXRpb25hbFByb3BlcnRpZXMTABIIJGNvbW1lbnQSSlByZW9yZGVyIGRvY3VtZW50cyBhcmUgaW1tdXRhYmxlOiBtb2RpZmljYXRpb24gYW5kIGRlbGV0aW9uIGFyZSByZXN0cmljdGVkAAAAAAAAAAAAAA==";
|
|
12
|
-
export declare const LATEST_PLATFORM_VERSION = PlatformVersionWASM.
|
|
13
|
+
export declare const LATEST_PLATFORM_VERSION = PlatformVersionWASM.PLATFORM_V12;
|
package/src/constants.js
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
|
+
import { PlatformVersionWASM } from 'pshenmic-dpp';
|
|
1
2
|
/**
|
|
2
3
|
* Default amount of documents to retrieve from DAPI
|
|
3
4
|
*/
|
|
4
5
|
export const DAPI_DEFAULT_LIMIT = 100;
|
|
6
|
+
export const SHIELDED_MAX_NOTES_PER_QUERY = 8192;
|
|
5
7
|
export const HALVING_INTERVAL = 210240;
|
|
6
8
|
export const TESTNET_ACTIVATION_HEIGHT = 1066900;
|
|
7
9
|
export const MAINNET_ACTIVATION_HEIGHT = 2128896;
|
|
8
10
|
export const GRPC_DEFAULT_POOL_LIMIT = 5;
|
|
9
11
|
export const DPNS_DATA_CONTRACT_ID = 'GWRSAVFMjXx8HpQFaNJMqBV7MBgMK4br5UESsB4S31Ec';
|
|
10
12
|
export const DPNS_DATA_CONTRACT_BYTES = 'AeZoxlmvZq7h5ywYbd57W34KHXEqCcQNVyH2Ir9TxTFVAAAAAAABAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIGZG9tYWluFgsSEGRvY3VtZW50c011dGFibGUTABIMY2FuQmVEZWxldGVkEwESDHRyYW5zZmVyYWJsZQIBEgl0cmFkZU1vZGUCARIEdHlwZRIGb2JqZWN0EgdpbmRpY2VzFQIWBBIEbmFtZRIScGFyZW50TmFtZUFuZExhYmVsEgpwcm9wZXJ0aWVzFQIWARIabm9ybWFsaXplZFBhcmVudERvbWFpbk5hbWUSA2FzYxYBEg9ub3JtYWxpemVkTGFiZWwSA2FzYxIGdW5pcXVlEwESCWNvbnRlc3RlZBYDEgxmaWVsZE1hdGNoZXMVARYCEgVmaWVsZBIPbm9ybWFsaXplZExhYmVsEgxyZWdleFBhdHRlcm4SE15bYS16QS1aMDEtXXszLDE5fSQSCnJlc29sdXRpb24CABILZGVzY3JpcHRpb24SqklmIHRoZSBub3JtYWxpemVkIGxhYmVsIHBhcnQgb2YgdGhpcyBpbmRleCBpcyBsZXNzIHRoYW4gMjAgY2hhcmFjdGVycyAoYWxsIGFscGhhYmV0IGEteiwgQS1aLCAwLCAxLCBhbmQgLSkgdGhlbiBhIG1hc3Rlcm5vZGUgdm90ZSBjb250ZXN0IHRha2VzIHBsYWNlIHRvIGdpdmUgb3V0IHRoZSBuYW1lFgMSBG5hbWUSCmlkZW50aXR5SWQSDm51bGxTZWFyY2hhYmxlEwASCnByb3BlcnRpZXMVARYBEhByZWNvcmRzLmlkZW50aXR5EgNhc2MSCnByb3BlcnRpZXMWBxIFbGFiZWwWBhIEdHlwZRIGc3RyaW5nEgdwYXR0ZXJuEipeW2EtekEtWjAtOV1bYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSQSCW1pbkxlbmd0aAIDEgltYXhMZW5ndGgCPxIIcG9zaXRpb24CABILZGVzY3JpcHRpb24SGURvbWFpbiBsYWJlbC4gZS5nLiAnQm9iJy4SD25vcm1hbGl6ZWRMYWJlbBYGEgR0eXBlEgZzdHJpbmcSB3BhdHRlcm4SPF5bYS1oai1rbS1ucC16MC05XVthLWhqLWttLW5wLXowLTktXXswLDYxfVthLWhqLWttLW5wLXowLTldJBIJbWF4TGVuZ3RoAj8SCHBvc2l0aW9uAgESC2Rlc2NyaXB0aW9uEqNEb21haW4gbGFiZWwgY29udmVydGVkIHRvIGxvd2VyY2FzZSBmb3IgY2FzZS1pbnNlbnNpdGl2ZSB1bmlxdWVuZXNzIHZhbGlkYXRpb24uICJvIiwgImkiIGFuZCAibCIgcmVwbGFjZWQgd2l0aCAiMCIgYW5kICIxIiB0byBtaXRpZ2F0ZSBob21vZ3JhcGggYXR0YWNrLiBlLmcuICdiMGInEggkY29tbWVudBJcTXVzdCBiZSBlcXVhbCB0byB0aGUgbGFiZWwgaW4gbG93ZXJjYXNlLiAibyIsICJpIiBhbmQgImwiIG11c3QgYmUgcmVwbGFjZWQgd2l0aCAiMCIgYW5kICIxIi4SEHBhcmVudERvbWFpbk5hbWUWBhIEdHlwZRIGc3RyaW5nEgdwYXR0ZXJuEi1eJHxeW2EtekEtWjAtOV1bYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSQSCW1pbkxlbmd0aAIAEgltYXhMZW5ndGgCPxIIcG9zaXRpb24CAhILZGVzY3JpcHRpb24SJ0EgZnVsbCBwYXJlbnQgZG9tYWluIG5hbWUuIGUuZy4gJ2Rhc2gnLhIabm9ybWFsaXplZFBhcmVudERvbWFpbk5hbWUWBxIEdHlwZRIGc3RyaW5nEgdwYXR0ZXJuEkFeJHxeW2EtaGota20tbnAtejAtOV1bYS1oai1rbS1ucC16MC05LVwuXXswLDYxfVthLWhqLWttLW5wLXowLTldJBIJbWluTGVuZ3RoAgASCW1heExlbmd0aAI/Eghwb3NpdGlvbgIDEgtkZXNjcmlwdGlvbhKiQSBwYXJlbnQgZG9tYWluIG5hbWUgaW4gbG93ZXJjYXNlIGZvciBjYXNlLWluc2Vuc2l0aXZlIHVuaXF1ZW5lc3MgdmFsaWRhdGlvbi4gIm8iLCAiaSIgYW5kICJsIiByZXBsYWNlZCB3aXRoICIwIiBhbmQgIjEiIHRvIG1pdGlnYXRlIGhvbW9ncmFwaCBhdHRhY2suIGUuZy4gJ2Rhc2gnEggkY29tbWVudBLATXVzdCBlaXRoZXIgYmUgZXF1YWwgdG8gYW4gZXhpc3RpbmcgZG9tYWluIG9yIGVtcHR5IHRvIGNyZWF0ZSBhIHRvcCBsZXZlbCBkb21haW4uICJvIiwgImkiIGFuZCAibCIgbXVzdCBiZSByZXBsYWNlZCB3aXRoICIwIiBhbmQgIjEiLiBPbmx5IHRoZSBkYXRhIGNvbnRyYWN0IG93bmVyIGNhbiBjcmVhdGUgdG9wIGxldmVsIGRvbWFpbnMuEgxwcmVvcmRlclNhbHQWBhIEdHlwZRIFYXJyYXkSCWJ5dGVBcnJheRMBEghtaW5JdGVtcwIgEghtYXhJdGVtcwIgEghwb3NpdGlvbgIEEgtkZXNjcmlwdGlvbhIiU2FsdCB1c2VkIGluIHRoZSBwcmVvcmRlciBkb2N1bWVudBIHcmVjb3JkcxYFEgR0eXBlEgZvYmplY3QSCnByb3BlcnRpZXMWARIIaWRlbnRpdHkWBxIEdHlwZRIFYXJyYXkSCWJ5dGVBcnJheRMBEghtaW5JdGVtcwIgEghtYXhJdGVtcwIgEghwb3NpdGlvbgIBEhBjb250ZW50TWVkaWFUeXBlEiFhcHBsaWNhdGlvbi94LmRhc2guZHBwLmlkZW50aWZpZXISC2Rlc2NyaXB0aW9uEjFJZGVudGlmaWVyIG5hbWUgcmVjb3JkIHRoYXQgcmVmZXJzIHRvIGFuIElkZW50aXR5Eg1taW5Qcm9wZXJ0aWVzAgESCHBvc2l0aW9uAgUSFGFkZGl0aW9uYWxQcm9wZXJ0aWVzEwASDnN1YmRvbWFpblJ1bGVzFgYSBHR5cGUSBm9iamVjdBIKcHJvcGVydGllcxYBEg9hbGxvd1N1YmRvbWFpbnMWBBIEdHlwZRIHYm9vbGVhbhILZGVzY3JpcHRpb24SW1RoaXMgb3B0aW9uIGRlZmluZXMgd2hvIGNhbiBjcmVhdGUgc3ViZG9tYWluczogdHJ1ZSAtIGFueW9uZTsgZmFsc2UgLSBvbmx5IHRoZSBkb21haW4gb3duZXISCCRjb21tZW50Ek9Pbmx5IHRoZSBkb21haW4gb3duZXIgaXMgYWxsb3dlZCB0byBjcmVhdGUgc3ViZG9tYWlucyBmb3Igbm9uIHRvcC1sZXZlbCBkb21haW5zEghwb3NpdGlvbgIAEghwb3NpdGlvbgIGEgtkZXNjcmlwdGlvbhJCU3ViZG9tYWluIHJ1bGVzIGFsbG93IGRvbWFpbiBvd25lcnMgdG8gZGVmaW5lIHJ1bGVzIGZvciBzdWJkb21haW5zEhRhZGRpdGlvbmFsUHJvcGVydGllcxMAEghyZXF1aXJlZBUBEg9hbGxvd1N1YmRvbWFpbnMSCHJlcXVpcmVkFQkSCiRjcmVhdGVkQXQSCiR1cGRhdGVkQXQSDiR0cmFuc2ZlcnJlZEF0EgVsYWJlbBIPbm9ybWFsaXplZExhYmVsEhpub3JtYWxpemVkUGFyZW50RG9tYWluTmFtZRIMcHJlb3JkZXJTYWx0EgdyZWNvcmRzEg5zdWJkb21haW5SdWxlcxIJdHJhbnNpZW50FQESDHByZW9yZGVyU2FsdBIUYWRkaXRpb25hbFByb3BlcnRpZXMTABIIJGNvbW1lbnQS+wE3SW4gb3JkZXIgdG8gcmVnaXN0ZXIgYSBkb21haW4geW91IG5lZWQgdG8gY3JlYXRlIGEgcHJlb3JkZXIuIFRoZSBwcmVvcmRlciBzdGVwIGlzIG5lZWRlZCB0byBwcmV2ZW50IG1hbi1pbi10aGUtbWlkZGxlIGF0dGFja3MuIG5vcm1hbGl6ZWRMYWJlbCArICcuJyArIG5vcm1hbGl6ZWRQYXJlbnREb21haW4gbXVzdCBub3QgYmUgbG9uZ2VyIHRoYW4gMjUzIGNoYXJzIGxlbmd0aCBhcyBkZWZpbmVkIGJ5IFJGQyAxMDM1LiBEb21haW4gZG9jdW1lbnRzIGFyZSBpbW11dGFibGU6IG1vZGlmaWNhdGlvbiBhbmQgZGVsZXRpb24gYXJlIHJlc3RyaWN0ZWQIcHJlb3JkZXIWCBIQZG9jdW1lbnRzTXV0YWJsZRMAEgxjYW5CZURlbGV0ZWQTARIEdHlwZRIGb2JqZWN0EgdpbmRpY2VzFQEWAxIEbmFtZRIKc2FsdGVkSGFzaBIKcHJvcGVydGllcxUBFgESEHNhbHRlZERvbWFpbkhhc2gSA2FzYxIGdW5pcXVlEwESCnByb3BlcnRpZXMWARIQc2FsdGVkRG9tYWluSGFzaBYGEgR0eXBlEgVhcnJheRIJYnl0ZUFycmF5EwESCG1pbkl0ZW1zAiASCG1heEl0ZW1zAiASCHBvc2l0aW9uAgASC2Rlc2NyaXB0aW9uEllEb3VibGUgc2hhLTI1NiBvZiB0aGUgY29uY2F0ZW5hdGlvbiBvZiBhIDMyIGJ5dGUgcmFuZG9tIHNhbHQgYW5kIGEgbm9ybWFsaXplZCBkb21haW4gbmFtZRIIcmVxdWlyZWQVARIQc2FsdGVkRG9tYWluSGFzaBIUYWRkaXRpb25hbFByb3BlcnRpZXMTABIIJGNvbW1lbnQSSlByZW9yZGVyIGRvY3VtZW50cyBhcmUgaW1tdXRhYmxlOiBtb2RpZmljYXRpb24gYW5kIGRlbGV0aW9uIGFyZSByZXN0cmljdGVkAAAAAAAAAAAAAA==';
|
|
11
|
-
export const LATEST_PLATFORM_VERSION =
|
|
13
|
+
export const LATEST_PLATFORM_VERSION = PlatformVersionWASM.PLATFORM_V12;
|
package/src/documents/index.js
CHANGED
|
@@ -39,7 +39,7 @@ export class DocumentsController {
|
|
|
39
39
|
* @param startAfter {IdentifierLike=} Same as previous, but with exclusion. Cannot be set if startAt already provided
|
|
40
40
|
*/
|
|
41
41
|
async query(dataContractId, documentType, where, orderBy, limit, startAt, startAfter) {
|
|
42
|
-
if (startAfter != null && startAt
|
|
42
|
+
if (startAfter != null && startAt != null) {
|
|
43
43
|
throw new Error('You may only set either startAfter or startAt at once');
|
|
44
44
|
}
|
|
45
45
|
return await query(this.grpcPool, new IdentifierWASM(dataContractId), documentType, where, orderBy, limit ?? 100, startAt, startAfter);
|
package/src/documents/query.js
CHANGED
|
@@ -7,20 +7,17 @@ import verifyTenderdashProof from '../utils/verifyTenderdashProof.js';
|
|
|
7
7
|
import { encode } from 'cbor-x';
|
|
8
8
|
import getDataContractByIdentifier from '../dataContracts/getDataContractByIdentifier.js';
|
|
9
9
|
export default async function query(grpcPool, dataContractId, documentTypeName, where, orderBy, limit = 100, startAt, startAfter) {
|
|
10
|
-
if ([startAt, startAfter].filter(e => e != null).length === 2) {
|
|
11
|
-
throw new Error('Only startAt or startAfter could be specified at one time');
|
|
12
|
-
}
|
|
13
10
|
let start;
|
|
14
11
|
if (startAt != null) {
|
|
15
12
|
start = {
|
|
16
13
|
oneofKind: 'startAt',
|
|
17
|
-
startAt: startAt.
|
|
14
|
+
startAt: startAt.bytes()
|
|
18
15
|
};
|
|
19
16
|
}
|
|
20
17
|
if (startAfter != null) {
|
|
21
18
|
start = {
|
|
22
19
|
oneofKind: 'startAfter',
|
|
23
|
-
|
|
20
|
+
startAfter: startAfter.bytes()
|
|
24
21
|
};
|
|
25
22
|
}
|
|
26
23
|
const getDocumentsRequest = GetDocumentsRequest.create({
|
|
@@ -52,7 +49,8 @@ export default async function query(grpcPool, dataContractId, documentTypeName,
|
|
|
52
49
|
throw new Error('Metadata not found');
|
|
53
50
|
}
|
|
54
51
|
const startAtIncluded = startAt != null;
|
|
55
|
-
const
|
|
52
|
+
const startIdentifier = startAt ?? startAfter;
|
|
53
|
+
const { rootHash, documents } = verifyDocumentsProof(proof.grovedbProof, dataContract, documentTypeName, where, orderBy, limit, startIdentifier?.bytes(), startAtIncluded, BigInt(metadata?.timeMs), LATEST_PLATFORM_VERSION);
|
|
56
54
|
const quorumPublicKey = await getQuorumPublicKey(grpcPool.network, proof.quorumType, bytesToHex(proof.quorumHash));
|
|
57
55
|
const verify = await verifyTenderdashProof(proof, metadata, rootHash, quorumPublicKey);
|
|
58
56
|
if (!verify) {
|
package/src/keyPair/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { HDKey } from '@scure/bip32';
|
|
2
2
|
import { Network } from '../../types.js';
|
|
3
|
+
import { OrchardAddressWASM } from 'pshenmic-dpp';
|
|
3
4
|
/**
|
|
4
5
|
* Collection of functions to work with private keys and seed phrases
|
|
5
6
|
*
|
|
@@ -64,4 +65,28 @@ export declare class KeyPairController {
|
|
|
64
65
|
* @returns {string}
|
|
65
66
|
*/
|
|
66
67
|
p2pkhAddress(publicKey: Uint8Array, network: Network): string;
|
|
68
|
+
/**
|
|
69
|
+
* Derives a shielded (Orchard) address from a BIP-39 seed via ZIP-32
|
|
70
|
+
* (m/32'/coinType'/account').
|
|
71
|
+
*
|
|
72
|
+
* @param seed {Uint8Array} - BIP-39 seed bytes
|
|
73
|
+
* @param network {Network} - network (selects the SLIP-44 coin type)
|
|
74
|
+
* @param account {number} - ZIP-32 account index
|
|
75
|
+
* @param diversifierIndex {number=} - optional diversifier index
|
|
76
|
+
*
|
|
77
|
+
* @returns {OrchardAddressWASM}
|
|
78
|
+
*/
|
|
79
|
+
deriveShieldedAddress(seed: Uint8Array, network: Network, account: number, diversifierIndex?: number): OrchardAddressWASM;
|
|
80
|
+
/**
|
|
81
|
+
* Derives the sender's Orchard outgoing viewing key (OVK, 32 bytes) from a
|
|
82
|
+
* BIP-39 seed via ZIP-32 (m/32'/coinType'/account'). Used to recover the
|
|
83
|
+
* outgoing notes a wallet sent.
|
|
84
|
+
*
|
|
85
|
+
* @param seed {Uint8Array} - BIP-39 seed bytes
|
|
86
|
+
* @param network {Network} - network (selects the SLIP-44 coin type)
|
|
87
|
+
* @param account {number} - ZIP-32 account index
|
|
88
|
+
*
|
|
89
|
+
* @returns {Uint8Array} 32-byte outgoing viewing key
|
|
90
|
+
*/
|
|
91
|
+
deriveShieldedOutgoingViewingKey(seed: Uint8Array, network: Network, account: number): Uint8Array;
|
|
67
92
|
}
|
package/src/keyPair/index.js
CHANGED
|
@@ -3,6 +3,7 @@ import mnemonicToSeed from './mnemonicToSeed.js';
|
|
|
3
3
|
import deriveChild from './deriveChild.js';
|
|
4
4
|
import derivePath from './derivePath.js';
|
|
5
5
|
import { p2pkh } from '@scure/btc-signer';
|
|
6
|
+
import { OrchardAddressWASM, orchardOvkFromSeed } from 'pshenmic-dpp';
|
|
6
7
|
const DASH_VERSIONS = {
|
|
7
8
|
mainnet: { pubKeyHash: 0x4c, scriptHash: 0x10, bech32: 'dc', wif: 0xcc, private: 0x0488ade4, public: 0x0488b21e },
|
|
8
9
|
testnet: { pubKeyHash: 0x8c, scriptHash: 0x13, bech32: 'dc', wif: 0xef, private: 0x04358394, public: 0x043587cf }
|
|
@@ -86,4 +87,36 @@ export class KeyPairController {
|
|
|
86
87
|
const P2PKH = p2pkh(publicKey, DASH_VERSIONS[network]);
|
|
87
88
|
return P2PKH.address;
|
|
88
89
|
}
|
|
90
|
+
/**
|
|
91
|
+
* Derives a shielded (Orchard) address from a BIP-39 seed via ZIP-32
|
|
92
|
+
* (m/32'/coinType'/account').
|
|
93
|
+
*
|
|
94
|
+
* @param seed {Uint8Array} - BIP-39 seed bytes
|
|
95
|
+
* @param network {Network} - network (selects the SLIP-44 coin type)
|
|
96
|
+
* @param account {number} - ZIP-32 account index
|
|
97
|
+
* @param diversifierIndex {number=} - optional diversifier index
|
|
98
|
+
*
|
|
99
|
+
* @returns {OrchardAddressWASM}
|
|
100
|
+
*/
|
|
101
|
+
deriveShieldedAddress(seed, network, account, diversifierIndex) {
|
|
102
|
+
// SLIP-44 coin type: 5 = Dash mainnet, 1 = testnets. Orchard derives via ZIP-32
|
|
103
|
+
const coinType = network === 'mainnet' ? 5 : 1;
|
|
104
|
+
return OrchardAddressWASM.fromSeed(seed, coinType, account, diversifierIndex);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Derives the sender's Orchard outgoing viewing key (OVK, 32 bytes) from a
|
|
108
|
+
* BIP-39 seed via ZIP-32 (m/32'/coinType'/account'). Used to recover the
|
|
109
|
+
* outgoing notes a wallet sent.
|
|
110
|
+
*
|
|
111
|
+
* @param seed {Uint8Array} - BIP-39 seed bytes
|
|
112
|
+
* @param network {Network} - network (selects the SLIP-44 coin type)
|
|
113
|
+
* @param account {number} - ZIP-32 account index
|
|
114
|
+
*
|
|
115
|
+
* @returns {Uint8Array} 32-byte outgoing viewing key
|
|
116
|
+
*/
|
|
117
|
+
deriveShieldedOutgoingViewingKey(seed, network, account) {
|
|
118
|
+
// SLIP-44 coin type: 5 = Dash mainnet, 1 = testnets. Orchard derives via ZIP-32
|
|
119
|
+
const coinType = network === 'mainnet' ? 5 : 1;
|
|
120
|
+
return orchardOvkFromSeed(seed, coinType, account);
|
|
121
|
+
}
|
|
89
122
|
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { ShieldedBuilderWASM, StateTransitionWASM } from 'pshenmic-dpp';
|
|
2
|
+
import { ShieldedTransitionParamsMap, ShieldedTransitionType } from '../../types.js';
|
|
3
|
+
export default function createStateTransition<K extends ShieldedTransitionType>(builder: ShieldedBuilderWASM, type: K, params: ShieldedTransitionParamsMap[K]): StateTransitionWASM;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { IdentityCreateFromShieldedPoolTransitionWASM, ShieldedBuilderWASM, ShieldedWithdrawalResultWASM, StateTransitionWASM } from 'pshenmic-dpp';
|
|
2
|
+
import { LATEST_PLATFORM_VERSION } from '../constants.js';
|
|
3
|
+
const shieldedTransitionsMap = {
|
|
4
|
+
shield: {
|
|
5
|
+
method: ShieldedBuilderWASM.prototype.shield,
|
|
6
|
+
arguments: ['recipient', 'shieldAmount', 'inputs', 'privateKeys', 'feeStrategy', 'userFeeIncrease', 'memo'],
|
|
7
|
+
optionalArguments: ['senderOvk']
|
|
8
|
+
},
|
|
9
|
+
shieldFromAssetLock: {
|
|
10
|
+
method: ShieldedBuilderWASM.prototype.shieldFromAssetLock,
|
|
11
|
+
arguments: ['recipient', 'shieldAmount', 'assetLockProof', 'privateKey', 'memo', 'dummyOutputs'],
|
|
12
|
+
optionalArguments: ['senderOvk', 'surplusOutput']
|
|
13
|
+
},
|
|
14
|
+
shieldedWithdrawal: {
|
|
15
|
+
method: ShieldedBuilderWASM.prototype.shieldedWithdrawal,
|
|
16
|
+
arguments: ['spends', 'withdrawalAmount', 'outputScript', 'coreFeePerByte', 'pooling', 'changeAddress', 'seed', 'coinType', 'account', 'anchor', 'memo'],
|
|
17
|
+
optionalArguments: []
|
|
18
|
+
},
|
|
19
|
+
unshield: {
|
|
20
|
+
method: ShieldedBuilderWASM.prototype.unshield,
|
|
21
|
+
arguments: ['spends', 'outputAddress', 'unshieldAmount', 'changeAddress', 'seed', 'coinType', 'account', 'anchor', 'memo'],
|
|
22
|
+
optionalArguments: []
|
|
23
|
+
},
|
|
24
|
+
shieldedTransfer: {
|
|
25
|
+
method: ShieldedBuilderWASM.prototype.shieldedTransfer,
|
|
26
|
+
arguments: ['spends', 'recipient', 'transferAmount', 'changeAddress', 'seed', 'coinType', 'account', 'anchor', 'memo'],
|
|
27
|
+
optionalArguments: []
|
|
28
|
+
},
|
|
29
|
+
identityCreateFromShieldedPool: {
|
|
30
|
+
method: ShieldedBuilderWASM.prototype.identityCreateFromShieldedPool,
|
|
31
|
+
arguments: ['publicKeys', 'privateKeys', 'denomination', 'sendToAddressOnCreationFailure', 'spends', 'changeAddress', 'seed', 'coinType', 'account', 'anchor', 'memo'],
|
|
32
|
+
optionalArguments: []
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
export default function createStateTransition(builder, type, params) {
|
|
36
|
+
const { method: builderMethod, arguments: classArguments, optionalArguments } = shieldedTransitionsMap[type];
|
|
37
|
+
if (builderMethod == null) {
|
|
38
|
+
throw new Error(`Unimplemented shielded transition type: ${type}`);
|
|
39
|
+
}
|
|
40
|
+
const [missingArgument] = classArguments
|
|
41
|
+
.filter((classArgument) => params[classArgument] == null);
|
|
42
|
+
if (missingArgument != null) {
|
|
43
|
+
throw new Error(`Shielded transition param "${missingArgument}" is missing`);
|
|
44
|
+
}
|
|
45
|
+
const transitionParams = classArguments.concat(optionalArguments).map((classArgument) => params[classArgument]);
|
|
46
|
+
const result = builderMethod.apply(builder, [...transitionParams, params.platformVersion ?? LATEST_PLATFORM_VERSION]);
|
|
47
|
+
if (result instanceof StateTransitionWASM) {
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
if (result instanceof ShieldedWithdrawalResultWASM) {
|
|
51
|
+
return result.stateTransition;
|
|
52
|
+
}
|
|
53
|
+
const { denomination, sendToAddressOnCreationFailure } = params;
|
|
54
|
+
return new IdentityCreateFromShieldedPoolTransitionWASM(result.publicKeys, denomination, result.actions, result.anchor, result.proof, result.bindingsSignature, sendToAddressOnCreationFailure, result.identityId).toStateTransition();
|
|
55
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { GetMostRecentShieldedAnchorRequest } from '../../proto/generated/platform.js';
|
|
2
|
+
import { verifyMostRecentShieldedAnchorProof } from "pshenmic-dpp";
|
|
3
|
+
import { LATEST_PLATFORM_VERSION } from "../constants.js";
|
|
4
|
+
import { getQuorumPublicKey } from "../utils/getQuorumPublicKey.js";
|
|
5
|
+
import bytesToHex from "../utils/bytesToHex.js";
|
|
6
|
+
import verifyTenderdashProof from "../utils/verifyTenderdashProof.js";
|
|
7
|
+
export default async function getMostRecentShieldedAnchor(grpcPool) {
|
|
8
|
+
const getMostRecentShieldedAnchorRequest = GetMostRecentShieldedAnchorRequest.create({
|
|
9
|
+
version: {
|
|
10
|
+
oneofKind: 'v0',
|
|
11
|
+
v0: {
|
|
12
|
+
prove: true
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
const { response } = await grpcPool.getClient().getMostRecentShieldedAnchor(getMostRecentShieldedAnchorRequest);
|
|
17
|
+
const { version } = response;
|
|
18
|
+
if (version.oneofKind !== 'v0') {
|
|
19
|
+
throw new Error('Unexpected oneOf type returned from DAPI (must be v0)');
|
|
20
|
+
}
|
|
21
|
+
const { v0 } = version;
|
|
22
|
+
if (v0.result.oneofKind !== 'proof') {
|
|
23
|
+
throw new Error('Unexpected oneOf type returned from DAPI (must be proof)');
|
|
24
|
+
}
|
|
25
|
+
const { result: { proof }, metadata } = v0;
|
|
26
|
+
if (metadata == null) {
|
|
27
|
+
throw new Error('Metadata not found');
|
|
28
|
+
}
|
|
29
|
+
const { rootHash, anchor } = verifyMostRecentShieldedAnchorProof(proof.grovedbProof, true, LATEST_PLATFORM_VERSION);
|
|
30
|
+
const quorumPublicKey = await getQuorumPublicKey(grpcPool.network, proof.quorumType, bytesToHex(proof.quorumHash));
|
|
31
|
+
const verify = await verifyTenderdashProof(proof, metadata, rootHash, quorumPublicKey);
|
|
32
|
+
if (!verify) {
|
|
33
|
+
throw new Error('Failed to verify query');
|
|
34
|
+
}
|
|
35
|
+
return anchor;
|
|
36
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { GetShieldedAnchorsRequest } from '../../proto/generated/platform.js';
|
|
2
|
+
import { verifyShieldedAnchorsProof } from "pshenmic-dpp";
|
|
3
|
+
import { LATEST_PLATFORM_VERSION } from "../constants.js";
|
|
4
|
+
import { getQuorumPublicKey } from "../utils/getQuorumPublicKey.js";
|
|
5
|
+
import bytesToHex from "../utils/bytesToHex.js";
|
|
6
|
+
import verifyTenderdashProof from "../utils/verifyTenderdashProof.js";
|
|
7
|
+
export default async function getShieldedAnchors(grpcPool) {
|
|
8
|
+
const getShieldedAnchorsRequest = GetShieldedAnchorsRequest.create({
|
|
9
|
+
version: {
|
|
10
|
+
oneofKind: 'v0',
|
|
11
|
+
v0: {
|
|
12
|
+
prove: true
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
const { response } = await grpcPool.getClient().getShieldedAnchors(getShieldedAnchorsRequest);
|
|
17
|
+
const { version } = response;
|
|
18
|
+
if (version.oneofKind !== 'v0') {
|
|
19
|
+
throw new Error('Unexpected oneOf type returned from DAPI (must be v0)');
|
|
20
|
+
}
|
|
21
|
+
const { v0 } = version;
|
|
22
|
+
if (v0.result.oneofKind !== 'proof') {
|
|
23
|
+
throw new Error('Unexpected oneOf type returned from DAPI (must be proof)');
|
|
24
|
+
}
|
|
25
|
+
const { result: { proof }, metadata } = v0;
|
|
26
|
+
if (metadata == null) {
|
|
27
|
+
throw new Error('Metadata not found');
|
|
28
|
+
}
|
|
29
|
+
const { rootHash, anchors } = verifyShieldedAnchorsProof(proof.grovedbProof, true, LATEST_PLATFORM_VERSION);
|
|
30
|
+
const quorumPublicKey = await getQuorumPublicKey(grpcPool.network, proof.quorumType, bytesToHex(proof.quorumHash));
|
|
31
|
+
const verify = await verifyTenderdashProof(proof, metadata, rootHash, quorumPublicKey);
|
|
32
|
+
if (!verify) {
|
|
33
|
+
throw new Error('Failed to verify query');
|
|
34
|
+
}
|
|
35
|
+
return anchors;
|
|
36
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { GetShieldedEncryptedNotesRequest } from '../../proto/generated/platform.js';
|
|
2
|
+
import { verifyShieldedEncryptedNotesProof } from "pshenmic-dpp";
|
|
3
|
+
import { LATEST_PLATFORM_VERSION, SHIELDED_MAX_NOTES_PER_QUERY } from "../constants.js";
|
|
4
|
+
import { getQuorumPublicKey } from "../utils/getQuorumPublicKey.js";
|
|
5
|
+
import bytesToHex from "../utils/bytesToHex.js";
|
|
6
|
+
import verifyTenderdashProof from "../utils/verifyTenderdashProof.js";
|
|
7
|
+
export default async function getShieldedEncryptedNotes(grpcPool, startIndex, count) {
|
|
8
|
+
const getShieldedEncryptedNotesRequest = GetShieldedEncryptedNotesRequest.create({
|
|
9
|
+
version: {
|
|
10
|
+
oneofKind: 'v0',
|
|
11
|
+
v0: {
|
|
12
|
+
startIndex: startIndex.toString(),
|
|
13
|
+
count,
|
|
14
|
+
prove: true
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
const { response } = await grpcPool.getClient().getShieldedEncryptedNotes(getShieldedEncryptedNotesRequest);
|
|
19
|
+
const { version } = response;
|
|
20
|
+
if (version.oneofKind !== 'v0') {
|
|
21
|
+
throw new Error('Unexpected oneOf type returned from DAPI (must be v0)');
|
|
22
|
+
}
|
|
23
|
+
const { v0 } = version;
|
|
24
|
+
if (v0.result.oneofKind !== 'proof') {
|
|
25
|
+
throw new Error('Unexpected oneOf type returned from DAPI (must be proof)');
|
|
26
|
+
}
|
|
27
|
+
const { result: { proof }, metadata } = v0;
|
|
28
|
+
if (metadata == null) {
|
|
29
|
+
throw new Error('Metadata not found');
|
|
30
|
+
}
|
|
31
|
+
const { rootHash, notes } = verifyShieldedEncryptedNotesProof(proof.grovedbProof, startIndex, count, SHIELDED_MAX_NOTES_PER_QUERY, true, LATEST_PLATFORM_VERSION);
|
|
32
|
+
const quorumPublicKey = await getQuorumPublicKey(grpcPool.network, proof.quorumType, bytesToHex(proof.quorumHash));
|
|
33
|
+
const verify = await verifyTenderdashProof(proof, metadata, rootHash, quorumPublicKey);
|
|
34
|
+
if (!verify) {
|
|
35
|
+
throw new Error('Failed to verify query');
|
|
36
|
+
}
|
|
37
|
+
return notes.map(note => ({
|
|
38
|
+
nullifier: note.nullifier,
|
|
39
|
+
cmx: note.cmx,
|
|
40
|
+
encryptedNote: note.encryptedNote,
|
|
41
|
+
cvNet: note.cvNet
|
|
42
|
+
}));
|
|
43
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { GetShieldedNotesCountRequest } from '../../proto/generated/platform.js';
|
|
2
|
+
import { verifyShieldedNotesCountProof } from "pshenmic-dpp";
|
|
3
|
+
import { LATEST_PLATFORM_VERSION } from "../constants.js";
|
|
4
|
+
import { getQuorumPublicKey } from "../utils/getQuorumPublicKey.js";
|
|
5
|
+
import bytesToHex from "../utils/bytesToHex.js";
|
|
6
|
+
import verifyTenderdashProof from "../utils/verifyTenderdashProof.js";
|
|
7
|
+
export default async function getShieldedNotesCount(grpcPool) {
|
|
8
|
+
const getShieldedNotesCountRequest = GetShieldedNotesCountRequest.create({
|
|
9
|
+
version: {
|
|
10
|
+
oneofKind: 'v0',
|
|
11
|
+
v0: {
|
|
12
|
+
prove: true
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
const { response } = await grpcPool.getClient().getShieldedNotesCount(getShieldedNotesCountRequest);
|
|
17
|
+
const { version } = response;
|
|
18
|
+
if (version.oneofKind !== 'v0') {
|
|
19
|
+
throw new Error('Unexpected oneOf type returned from DAPI (must be v0)');
|
|
20
|
+
}
|
|
21
|
+
const { v0 } = version;
|
|
22
|
+
if (v0.result.oneofKind !== 'proof') {
|
|
23
|
+
throw new Error('Unexpected oneOf type returned from DAPI (must be proof)');
|
|
24
|
+
}
|
|
25
|
+
const { result: { proof }, metadata } = v0;
|
|
26
|
+
if (metadata == null) {
|
|
27
|
+
throw new Error('Metadata not found');
|
|
28
|
+
}
|
|
29
|
+
const { rootHash, count } = verifyShieldedNotesCountProof(proof.grovedbProof, true, LATEST_PLATFORM_VERSION);
|
|
30
|
+
const quorumPublicKey = await getQuorumPublicKey(grpcPool.network, proof.quorumType, bytesToHex(proof.quorumHash));
|
|
31
|
+
const verify = await verifyTenderdashProof(proof, metadata, rootHash, quorumPublicKey);
|
|
32
|
+
if (!verify) {
|
|
33
|
+
throw new Error('Failed to verify query');
|
|
34
|
+
}
|
|
35
|
+
return count;
|
|
36
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { GetShieldedNullifiersRequest } from '../../proto/generated/platform.js';
|
|
2
|
+
import { verifyShieldedNullifiersProof } from "pshenmic-dpp";
|
|
3
|
+
import { LATEST_PLATFORM_VERSION } from "../constants.js";
|
|
4
|
+
import { getQuorumPublicKey } from "../utils/getQuorumPublicKey.js";
|
|
5
|
+
import bytesToHex from "../utils/bytesToHex.js";
|
|
6
|
+
import verifyTenderdashProof from "../utils/verifyTenderdashProof.js";
|
|
7
|
+
export default async function getShieldedNullifiers(grpcPool, nullifiers) {
|
|
8
|
+
const getShieldedNullifiersRequest = GetShieldedNullifiersRequest.create({
|
|
9
|
+
version: {
|
|
10
|
+
oneofKind: 'v0',
|
|
11
|
+
v0: {
|
|
12
|
+
nullifiers,
|
|
13
|
+
prove: true
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
const { response } = await grpcPool.getClient().getShieldedNullifiers(getShieldedNullifiersRequest);
|
|
18
|
+
const { version } = response;
|
|
19
|
+
if (version.oneofKind !== 'v0') {
|
|
20
|
+
throw new Error('Unexpected oneOf type returned from DAPI (must be v0)');
|
|
21
|
+
}
|
|
22
|
+
const { v0 } = version;
|
|
23
|
+
if (v0.result.oneofKind !== 'proof') {
|
|
24
|
+
throw new Error('Unexpected oneOf type returned from DAPI (must be proof)');
|
|
25
|
+
}
|
|
26
|
+
const { result: { proof }, metadata } = v0;
|
|
27
|
+
if (metadata == null) {
|
|
28
|
+
throw new Error('Metadata not found');
|
|
29
|
+
}
|
|
30
|
+
const { rootHash, nullifiers: nullifiersStatuses } = verifyShieldedNullifiersProof(proof.grovedbProof, nullifiers, true, LATEST_PLATFORM_VERSION);
|
|
31
|
+
const quorumPublicKey = await getQuorumPublicKey(grpcPool.network, proof.quorumType, bytesToHex(proof.quorumHash));
|
|
32
|
+
const verify = await verifyTenderdashProof(proof, metadata, rootHash, quorumPublicKey);
|
|
33
|
+
if (!verify) {
|
|
34
|
+
throw new Error('Failed to verify query');
|
|
35
|
+
}
|
|
36
|
+
return nullifiersStatuses.map(entry => ({
|
|
37
|
+
nullifier: entry.nullifier,
|
|
38
|
+
isSpent: entry.isSpent
|
|
39
|
+
}));
|
|
40
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { GetShieldedPoolStateRequest } from '../../proto/generated/platform.js';
|
|
2
|
+
import { getQuorumPublicKey } from "../utils/getQuorumPublicKey.js";
|
|
3
|
+
import bytesToHex from "../utils/bytesToHex.js";
|
|
4
|
+
import verifyTenderdashProof from "../utils/verifyTenderdashProof.js";
|
|
5
|
+
import { verifyShieldedPoolStateProof } from "pshenmic-dpp";
|
|
6
|
+
import { LATEST_PLATFORM_VERSION } from "../constants.js";
|
|
7
|
+
export default async function getShieldedPoolState(grpcPool) {
|
|
8
|
+
const getShieldedPoolStateRequest = GetShieldedPoolStateRequest.create({
|
|
9
|
+
version: {
|
|
10
|
+
oneofKind: 'v0',
|
|
11
|
+
v0: {
|
|
12
|
+
prove: true
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
const { response } = await grpcPool.getClient().getShieldedPoolState(getShieldedPoolStateRequest);
|
|
17
|
+
const { version } = response;
|
|
18
|
+
if (version.oneofKind !== 'v0') {
|
|
19
|
+
throw new Error('Unexpected oneOf type returned from DAPI (must be v0)');
|
|
20
|
+
}
|
|
21
|
+
const { v0 } = version;
|
|
22
|
+
if (v0.result.oneofKind !== 'proof') {
|
|
23
|
+
throw new Error('Unexpected oneOf type returned from DAPI (must be proof)');
|
|
24
|
+
}
|
|
25
|
+
const { result: { proof }, metadata } = v0;
|
|
26
|
+
if (metadata == null) {
|
|
27
|
+
throw new Error('Metadata not found');
|
|
28
|
+
}
|
|
29
|
+
const { rootHash, totalBalance } = verifyShieldedPoolStateProof(proof.grovedbProof, true, LATEST_PLATFORM_VERSION);
|
|
30
|
+
const quorumPublicKey = await getQuorumPublicKey(grpcPool.network, proof.quorumType, bytesToHex(proof.quorumHash));
|
|
31
|
+
const verify = await verifyTenderdashProof(proof, metadata, rootHash, quorumPublicKey);
|
|
32
|
+
if (!verify) {
|
|
33
|
+
throw new Error('Failed to verify query');
|
|
34
|
+
}
|
|
35
|
+
return totalBalance;
|
|
36
|
+
}
|