phygital-token-sdk 0.5.2 → 0.6.0
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 +94 -0
- package/dist/index.d.ts +6 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -8
- package/dist/index.js.map +1 -1
- package/dist/instructions/transfer.d.ts +3 -11
- package/dist/instructions/transfer.d.ts.map +1 -1
- package/dist/instructions/transfer.js +10 -32
- package/dist/instructions/transfer.js.map +1 -1
- package/dist/instructions/verifyAsset.d.ts +14 -9
- package/dist/instructions/verifyAsset.d.ts.map +1 -1
- package/dist/instructions/verifyAsset.js +44 -19
- package/dist/instructions/verifyAsset.js.map +1 -1
- package/dist/utils/assetCredential.d.ts +1 -1
- package/dist/utils/assetCredential.d.ts.map +1 -1
- package/dist/utils/assetCredential.js +2 -2
- package/dist/utils/assetCredential.js.map +1 -1
- package/dist/utils/consts.d.ts +1 -1
- package/dist/utils/consts.d.ts.map +1 -1
- package/dist/utils/consts.js +1 -1
- package/dist/utils/consts.js.map +1 -1
- package/dist/utils/gating.d.ts +195 -0
- package/dist/utils/gating.d.ts.map +1 -0
- package/dist/utils/gating.js +481 -0
- package/dist/utils/gating.js.map +1 -0
- package/dist/utils/passkey/nfc/authDataExtensions.d.ts.map +1 -1
- package/dist/utils/passkey/nfc/authDataExtensions.js +2 -2
- package/dist/utils/passkey/nfc/authDataExtensions.js.map +1 -1
- package/dist/utils/passkey/secp256r1.d.ts +9 -6
- package/dist/utils/passkey/secp256r1.d.ts.map +1 -1
- package/dist/utils/passkey/secp256r1.js +14 -23
- package/dist/utils/passkey/secp256r1.js.map +1 -1
- package/dist/utils/slotHash.d.ts +1 -2
- package/dist/utils/slotHash.d.ts.map +1 -1
- package/dist/utils/slotHash.js +0 -12
- package/dist/utils/slotHash.js.map +1 -1
- package/dist/utils/verify.d.ts +2 -9
- package/dist/utils/verify.d.ts.map +1 -1
- package/dist/utils/verify.js +12 -104
- package/dist/utils/verify.js.map +1 -1
- package/docs/gating/README.md +83 -0
- package/docs/gating/evaluation-and-errors.md +134 -0
- package/docs/gating/filters-and-composition.md +120 -0
- package/docs/gating/overview.md +84 -0
- package/docs/gating/predicates.md +122 -0
- package/docs/gating/recipes.md +199 -0
- package/docs/gating/tiers.md +158 -0
- package/package.json +11 -10
- package/dist/__tests__/card-instance.test.d.ts +0 -2
- package/dist/__tests__/card-instance.test.d.ts.map +0 -1
- package/dist/__tests__/card-instance.test.js +0 -38
- package/dist/__tests__/card-instance.test.js.map +0 -1
- package/dist/__tests__/crypto-parity.test.d.ts +0 -2
- package/dist/__tests__/crypto-parity.test.d.ts.map +0 -1
- package/dist/__tests__/crypto-parity.test.js +0 -60
- package/dist/__tests__/crypto-parity.test.js.map +0 -1
- package/dist/__tests__/low-s-normalization.test.d.ts +0 -2
- package/dist/__tests__/low-s-normalization.test.d.ts.map +0 -1
- package/dist/__tests__/low-s-normalization.test.js +0 -44
- package/dist/__tests__/low-s-normalization.test.js.map +0 -1
- package/dist/__tests__/metadata-limits.test.d.ts +0 -2
- package/dist/__tests__/metadata-limits.test.d.ts.map +0 -1
- package/dist/__tests__/metadata-limits.test.js +0 -33
- package/dist/__tests__/metadata-limits.test.js.map +0 -1
- package/dist/__tests__/nfc-cbor.test.d.ts +0 -2
- package/dist/__tests__/nfc-cbor.test.d.ts.map +0 -1
- package/dist/__tests__/nfc-cbor.test.js +0 -72
- package/dist/__tests__/nfc-cbor.test.js.map +0 -1
- package/dist/consts.d.ts +0 -19
- package/dist/consts.d.ts.map +0 -1
- package/dist/consts.js +0 -19
- package/dist/consts.js.map +0 -1
- package/dist/generated/accounts/cardInstance.d.ts +0 -35
- package/dist/generated/accounts/cardInstance.d.ts.map +0 -1
- package/dist/generated/accounts/cardInstance.js +0 -61
- package/dist/generated/accounts/cardInstance.js.map +0 -1
- package/dist/generated/accounts/domainConfig.d.ts +0 -28
- package/dist/generated/accounts/domainConfig.d.ts.map +0 -1
- package/dist/generated/accounts/domainConfig.js +0 -58
- package/dist/generated/accounts/domainConfig.js.map +0 -1
- package/dist/generated/errors/phygitalNfts.d.ts +0 -62
- package/dist/generated/errors/phygitalNfts.d.ts.map +0 -1
- package/dist/generated/errors/phygitalNfts.js +0 -87
- package/dist/generated/errors/phygitalNfts.js.map +0 -1
- package/dist/generated/instructions/createCollectionMint.d.ts +0 -108
- package/dist/generated/instructions/createCollectionMint.d.ts.map +0 -1
- package/dist/generated/instructions/createCollectionMint.js +0 -175
- package/dist/generated/instructions/createCollectionMint.js.map +0 -1
- package/dist/generated/instructions/createDesignMint.d.ts +0 -97
- package/dist/generated/instructions/createDesignMint.d.ts.map +0 -1
- package/dist/generated/instructions/createDesignMint.js +0 -164
- package/dist/generated/instructions/createDesignMint.js.map +0 -1
- package/dist/generated/instructions/createDomainConfig.d.ts +0 -46
- package/dist/generated/instructions/createDomainConfig.d.ts.map +0 -1
- package/dist/generated/instructions/createDomainConfig.js +0 -83
- package/dist/generated/instructions/createDomainConfig.js.map +0 -1
- package/dist/generated/instructions/createGroupToken.d.ts +0 -94
- package/dist/generated/instructions/createGroupToken.d.ts.map +0 -1
- package/dist/generated/instructions/createGroupToken.js +0 -150
- package/dist/generated/instructions/createGroupToken.js.map +0 -1
- package/dist/generated/instructions/createToken.d.ts +0 -88
- package/dist/generated/instructions/createToken.d.ts.map +0 -1
- package/dist/generated/instructions/createToken.js +0 -182
- package/dist/generated/instructions/createToken.js.map +0 -1
- package/dist/generated/instructions/editDomainConfig.d.ts +0 -50
- package/dist/generated/instructions/editDomainConfig.d.ts.map +0 -1
- package/dist/generated/instructions/editDomainConfig.js +0 -90
- package/dist/generated/instructions/editDomainConfig.js.map +0 -1
- package/dist/generated/instructions/executeSpend.d.ts +0 -86
- package/dist/generated/instructions/executeSpend.d.ts.map +0 -1
- package/dist/generated/instructions/executeSpend.js +0 -187
- package/dist/generated/instructions/executeSpend.js.map +0 -1
- package/dist/generated/instructions/setTransferConfig.d.ts +0 -88
- package/dist/generated/instructions/setTransferConfig.d.ts.map +0 -1
- package/dist/generated/instructions/setTransferConfig.js +0 -188
- package/dist/generated/instructions/setTransferConfig.js.map +0 -1
- package/dist/generated/instructions/updateCounter.d.ts +0 -45
- package/dist/generated/instructions/updateCounter.d.ts.map +0 -1
- package/dist/generated/instructions/updateCounter.js +0 -84
- package/dist/generated/instructions/updateCounter.js.map +0 -1
- package/dist/generated/instructions/updateDomainConfig.d.ts +0 -43
- package/dist/generated/instructions/updateDomainConfig.d.ts.map +0 -1
- package/dist/generated/instructions/updateDomainConfig.js +0 -81
- package/dist/generated/instructions/updateDomainConfig.js.map +0 -1
- package/dist/generated/pdas/spendAuthority.d.ts +0 -8
- package/dist/generated/pdas/spendAuthority.d.ts.map +0 -1
- package/dist/generated/pdas/spendAuthority.js +0 -15
- package/dist/generated/pdas/spendAuthority.js.map +0 -1
- package/dist/generated/programs/phygitalNfts.d.ts +0 -72
- package/dist/generated/programs/phygitalNfts.d.ts.map +0 -1
- package/dist/generated/programs/phygitalNfts.js +0 -136
- package/dist/generated/programs/phygitalNfts.js.map +0 -1
- package/dist/instructions/collection.d.ts +0 -14
- package/dist/instructions/collection.d.ts.map +0 -1
- package/dist/instructions/collection.js +0 -59
- package/dist/instructions/collection.js.map +0 -1
- package/dist/instructions/index.d.ts +0 -2
- package/dist/instructions/index.d.ts.map +0 -1
- package/dist/instructions/index.js +0 -2
- package/dist/instructions/index.js.map +0 -1
- package/dist/instructions/secp256r1Verify.d.ts +0 -29
- package/dist/instructions/secp256r1Verify.d.ts.map +0 -1
- package/dist/instructions/secp256r1Verify.js +0 -132
- package/dist/instructions/secp256r1Verify.js.map +0 -1
- package/dist/instructions/setLockState.d.ts +0 -19
- package/dist/instructions/setLockState.d.ts.map +0 -1
- package/dist/instructions/setLockState.js +0 -17
- package/dist/instructions/setLockState.js.map +0 -1
- package/dist/instructions/setTransferConfig.d.ts +0 -25
- package/dist/instructions/setTransferConfig.d.ts.map +0 -1
- package/dist/instructions/setTransferConfig.js +0 -20
- package/dist/instructions/setTransferConfig.js.map +0 -1
- package/dist/instructions/updateCounter.d.ts +0 -15
- package/dist/instructions/updateCounter.d.ts.map +0 -1
- package/dist/instructions/updateCounter.js +0 -20
- package/dist/instructions/updateCounter.js.map +0 -1
- package/dist/mint-metadata.d.ts +0 -13
- package/dist/mint-metadata.d.ts.map +0 -1
- package/dist/mint-metadata.js +0 -127
- package/dist/mint-metadata.js.map +0 -1
- package/dist/passkeys/index.d.ts +0 -18
- package/dist/passkeys/index.d.ts.map +0 -1
- package/dist/passkeys/index.js +0 -30
- package/dist/passkeys/index.js.map +0 -1
- package/dist/passkeys/internal.d.ts +0 -15
- package/dist/passkeys/internal.d.ts.map +0 -1
- package/dist/passkeys/internal.js +0 -113
- package/dist/passkeys/internal.js.map +0 -1
- package/dist/secp256r1.d.ts +0 -24
- package/dist/secp256r1.d.ts.map +0 -1
- package/dist/secp256r1.js +0 -38
- package/dist/secp256r1.js.map +0 -1
- package/dist/transfer.d.ts +0 -28
- package/dist/transfer.d.ts.map +0 -1
- package/dist/transfer.js +0 -109
- package/dist/transfer.js.map +0 -1
- package/dist/utils/encoding.d.ts +0 -3
- package/dist/utils/encoding.d.ts.map +0 -1
- package/dist/utils/encoding.js +0 -14
- package/dist/utils/encoding.js.map +0 -1
- package/dist/utils/passkey/index.d.ts +0 -17
- package/dist/utils/passkey/index.d.ts.map +0 -1
- package/dist/utils/passkey/index.js +0 -21
- package/dist/utils/passkey/index.js.map +0 -1
- package/dist/utils/passkey/nfc/base64url.d.ts +0 -2
- package/dist/utils/passkey/nfc/base64url.d.ts.map +0 -1
- package/dist/utils/passkey/nfc/base64url.js +0 -13
- package/dist/utils/passkey/nfc/base64url.js.map +0 -1
- package/dist/utils/pdas/domainConfig.d.ts +0 -3
- package/dist/utils/pdas/domainConfig.d.ts.map +0 -1
- package/dist/utils/pdas/domainConfig.js +0 -15
- package/dist/utils/pdas/domainConfig.js.map +0 -1
- package/dist/utils/sendInstructions.d.ts +0 -7
- package/dist/utils/sendInstructions.d.ts.map +0 -1
- package/dist/utils/sendInstructions.js +0 -13
- package/dist/utils/sendInstructions.js.map +0 -1
- package/dist/utils/tokenOwner.d.ts +0 -7
- package/dist/utils/tokenOwner.d.ts.map +0 -1
- package/dist/utils/tokenOwner.js +0 -24
- package/dist/utils/tokenOwner.js.map +0 -1
- package/dist/utils.d.ts +0 -10
- package/dist/utils.d.ts.map +0 -1
- package/dist/utils.js +0 -42
- package/dist/utils.js.map +0 -1
package/README.md
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# phygital-token-sdk
|
|
2
|
+
|
|
3
|
+
TypeScript client for the Phygital Token Solana program. Mint tokenized assets bound to passkeys, verify ownership via WebAuthn, transfer credentials, and gate experiences based on what the asset owner holds on-chain.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pnpm add phygital-token-sdk @solana/kit
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Requires a Solana RPC. Gating and rich asset metadata need a DAS-capable provider (e.g. [Helius](https://helius.dev)).
|
|
12
|
+
|
|
13
|
+
## Quick start
|
|
14
|
+
|
|
15
|
+
```ts
|
|
16
|
+
import { createSolanaRpc, createSolanaRpcSubscriptions } from "@solana/kit";
|
|
17
|
+
import {
|
|
18
|
+
evaluateAssetGating,
|
|
19
|
+
Gating,
|
|
20
|
+
GatingTraitValue,
|
|
21
|
+
verifyWithChallengeResponse,
|
|
22
|
+
} from "phygital-token-sdk";
|
|
23
|
+
|
|
24
|
+
const rpc = createSolanaRpc("https://mainnet.helius-rpc.com/?api-key=...");
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### Verify a phygital asset
|
|
28
|
+
|
|
29
|
+
```ts
|
|
30
|
+
const verified = await verifyWithChallengeResponse({
|
|
31
|
+
rpc,
|
|
32
|
+
assetPublicKey, // base64url secp256r1 public key
|
|
33
|
+
// ... WebAuthn options
|
|
34
|
+
});
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### Gate access by wallet holdings
|
|
38
|
+
|
|
39
|
+
```ts
|
|
40
|
+
const result = await evaluateAssetGating({
|
|
41
|
+
assetPublicKey,
|
|
42
|
+
rpc,
|
|
43
|
+
tiers: [
|
|
44
|
+
Gating.tier("bronze", Gating.count(1, {
|
|
45
|
+
collection: Gating.eq("CollectionMint..."),
|
|
46
|
+
})),
|
|
47
|
+
Gating.tier("gold", Gating.count(1, {
|
|
48
|
+
collection: Gating.eq("CollectionMint..."),
|
|
49
|
+
traits: Gating.traitsAll(
|
|
50
|
+
Gating.trait("Rarity", GatingTraitValue.eq("Gold")),
|
|
51
|
+
),
|
|
52
|
+
})),
|
|
53
|
+
],
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
if (result.passedTierIds.includes("gold")) {
|
|
57
|
+
// unlock premium experience
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Features
|
|
62
|
+
|
|
63
|
+
| Area | Exports |
|
|
64
|
+
|------|---------|
|
|
65
|
+
| **Mint** | `buildCreateMintInstructions`, `buildMintTokenInstructions`, `parseSecp256r1Pubkey` |
|
|
66
|
+
| **Verify** | `verifyWithChallengeResponse`, `verifyDynamicUrl`, `verifyWithChallengeResponseOverNfc` |
|
|
67
|
+
| **Transfer** | `beginTransfer`, `completeTransfer`, `authenticatePasskey` |
|
|
68
|
+
| **Metadata** | `fetchAssetDisplayInfo`, `resolveMedia` |
|
|
69
|
+
| **Gating** | `evaluateAssetGating`, `Gating`, `GatingTraitValue` |
|
|
70
|
+
| **Generated** | Program instructions, accounts, types (Codama) |
|
|
71
|
+
|
|
72
|
+
## Gating documentation
|
|
73
|
+
|
|
74
|
+
Wallet-based gating lets you segment users by collection, mint, NFT traits, and token balances. Full guides:
|
|
75
|
+
|
|
76
|
+
- **[Gating overview](./docs/gating/README.md)** — start here
|
|
77
|
+
- [Overview & mental model](./docs/gating/overview.md)
|
|
78
|
+
- [Predicates](./docs/gating/predicates.md) — `collection`, `mint`, `traits`, `balance`
|
|
79
|
+
- [Filters & composition](./docs/gating/filters-and-composition.md) — `count`, `totalBalance`, `and` / `or` / `not`
|
|
80
|
+
- [Tiers](./docs/gating/tiers.md) — bronze / silver / gold patterns
|
|
81
|
+
- [Evaluation & errors](./docs/gating/evaluation-and-errors.md) — debugging and failure messages
|
|
82
|
+
- [Recipes](./docs/gating/recipes.md) — copy-paste examples
|
|
83
|
+
|
|
84
|
+
## Development
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
pnpm install
|
|
88
|
+
pnpm build
|
|
89
|
+
pnpm test
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## License
|
|
93
|
+
|
|
94
|
+
ISC
|
package/dist/index.d.ts
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export {
|
|
3
|
-
export {
|
|
4
|
-
export { findAssociatedTokenAddress } from "./utils/associatedToken.js";
|
|
5
|
-
export { TOKEN_2022_PROGRAM_ADDRESS } from "./utils/consts.js";
|
|
6
|
-
export { buildCreateMintInstructions, buildMintTokenInstructions, MAX_METADATA_NAME_LEN, MAX_METADATA_SYMBOL_LEN, MAX_METADATA_URI_LEN, parseSecp256r1Pubkey, parseCredentialId, validateMetadataFields, type MetadataFields, } from "./instructions/mint.js";
|
|
1
|
+
export { beginTransfer, completeTransfer, authenticatePasskeyForTransfer, type TransferSession, } from "./instructions/transfer.js";
|
|
2
|
+
export { beginVerifyAsset, completeVerifyAsset, buildVerifyAssetArgs, authenticatePasskeyForVerifyAsset, type VerifyAssetSession, } from "./instructions/verifyAsset.js";
|
|
3
|
+
export { buildCreateMintInstructions, buildMintTokenInstructions, parseSecp256r1Pubkey, parseCredentialId, validateMetadataFields, type MetadataFields, } from "./instructions/mint.js";
|
|
7
4
|
export { fetchAssetDisplayInfo, resolveMedia, type AssetDisplayInfo, type MediaCategory, type ResolvedMedia, type Shortcut, type TokenJsonMetadata, type TokenMediaFile, } from "./utils/metadata.js";
|
|
8
|
-
export {
|
|
9
|
-
export {
|
|
5
|
+
export { fetchAssetFromCredentialId, fetchAllAssetsFromOwner, } from "./utils/assetCredential.js";
|
|
6
|
+
export { verifyDynamicUrl, verifyDynamicUrlWithoutCounterCheck, verifyWithChallengeResponse, verifyWithChallengeResponseOverNfc, type VerifyDynamicUrlCallback, type VerifyDynamicUrlResult, type VerifyWithChallengeResponseResult, type VerifyWithChallengeResponseOptions, type GetPublicKeyFromCredentialIdCallback, } from "./utils/verify.js";
|
|
10
7
|
export { findAssetPda } from "./utils/pdas/index.js";
|
|
8
|
+
export { evaluateAssetGating, evaluateGatingTiers, evaluateGatingFilter, assetMatchesPredicate, Gating, GatingTraitValue, formatGatingPredicate, summarizeGatingEvaluationFailure, summarizeGatingFailure, summarizeGatingTierFailure, type EvaluateAssetGatingOptions, type GatingAssetPredicate, type GatingEvaluationResult, type GatingFilter, type GatingFilterResult, type GatingTier, type GatingTierEvaluationResult, type GatingTiersEvaluationResult, } from "./utils/gating.js";
|
|
11
9
|
export * from "./generated/index.js";
|
|
12
10
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,8BAA8B,EAC9B,KAAK,eAAe,GACrB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EACpB,iCAAiC,EACjC,KAAK,kBAAkB,GACxB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EACL,2BAA2B,EAC3B,0BAA0B,EAC1B,oBAAoB,EACpB,iBAAiB,EACjB,sBAAsB,EACtB,KAAK,cAAc,GACpB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,qBAAqB,EACrB,YAAY,EACZ,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,QAAQ,EACb,KAAK,iBAAiB,EACtB,KAAK,cAAc,GACpB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,GACxB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACL,gBAAgB,EAChB,mCAAmC,EACnC,2BAA2B,EAC3B,kCAAkC,EAClC,KAAK,wBAAwB,EAC7B,KAAK,sBAAsB,EAC3B,KAAK,iCAAiC,EACtC,KAAK,kCAAkC,EACvC,KAAK,oCAAoC,GAC1C,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,EACrB,MAAM,EACN,gBAAgB,EAChB,qBAAqB,EACrB,gCAAgC,EAChC,sBAAsB,EACtB,0BAA0B,EAC1B,KAAK,0BAA0B,EAC/B,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAC3B,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,UAAU,EACf,KAAK,0BAA0B,EAC/B,KAAK,2BAA2B,GACjC,MAAM,mBAAmB,CAAC;AAE3B,cAAc,sBAAsB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export {
|
|
3
|
-
export {
|
|
4
|
-
export { findAssociatedTokenAddress } from "./utils/associatedToken.js";
|
|
5
|
-
export { TOKEN_2022_PROGRAM_ADDRESS } from "./utils/consts.js";
|
|
6
|
-
export { buildCreateMintInstructions, buildMintTokenInstructions, MAX_METADATA_NAME_LEN, MAX_METADATA_SYMBOL_LEN, MAX_METADATA_URI_LEN, parseSecp256r1Pubkey, parseCredentialId, validateMetadataFields, } from "./instructions/mint.js";
|
|
1
|
+
export { beginTransfer, completeTransfer, authenticatePasskeyForTransfer, } from "./instructions/transfer.js";
|
|
2
|
+
export { beginVerifyAsset, completeVerifyAsset, buildVerifyAssetArgs, authenticatePasskeyForVerifyAsset, } from "./instructions/verifyAsset.js";
|
|
3
|
+
export { buildCreateMintInstructions, buildMintTokenInstructions, parseSecp256r1Pubkey, parseCredentialId, validateMetadataFields, } from "./instructions/mint.js";
|
|
7
4
|
export { fetchAssetDisplayInfo, resolveMedia, } from "./utils/metadata.js";
|
|
8
|
-
export {
|
|
9
|
-
export {
|
|
5
|
+
export { fetchAssetFromCredentialId, fetchAllAssetsFromOwner, } from "./utils/assetCredential.js";
|
|
6
|
+
export { verifyDynamicUrl, verifyDynamicUrlWithoutCounterCheck, verifyWithChallengeResponse, verifyWithChallengeResponseOverNfc, } from "./utils/verify.js";
|
|
10
7
|
export { findAssetPda } from "./utils/pdas/index.js";
|
|
8
|
+
export { evaluateAssetGating, evaluateGatingTiers, evaluateGatingFilter, assetMatchesPredicate, Gating, GatingTraitValue, formatGatingPredicate, summarizeGatingEvaluationFailure, summarizeGatingFailure, summarizeGatingTierFailure, } from "./utils/gating.js";
|
|
11
9
|
export * from "./generated/index.js";
|
|
12
10
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,8BAA8B,GAE/B,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EACpB,iCAAiC,GAElC,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EACL,2BAA2B,EAC3B,0BAA0B,EAC1B,oBAAoB,EACpB,iBAAiB,EACjB,sBAAsB,GAEvB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,qBAAqB,EACrB,YAAY,GAOb,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,GACxB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACL,gBAAgB,EAChB,mCAAmC,EACnC,2BAA2B,EAC3B,kCAAkC,GAMnC,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,EACrB,MAAM,EACN,gBAAgB,EAChB,qBAAqB,EACrB,gCAAgC,EAChC,sBAAsB,EACtB,0BAA0B,GAS3B,MAAM,mBAAmB,CAAC;AAE3B,cAAc,sBAAsB,CAAC"}
|
|
@@ -1,26 +1,18 @@
|
|
|
1
1
|
import { type Instruction, type Rpc, type SolanaRpcApi, type TransactionSigner } from "@solana/kit";
|
|
2
2
|
import { type AuthenticationResponseJSON } from "@simplewebauthn/browser";
|
|
3
3
|
import { type AssetDisplayInfo } from "../utils/metadata.js";
|
|
4
|
+
import { type Secp256r1VerifyInput } from "../utils/passkey/secp256r1.js";
|
|
4
5
|
export type TransferSession = {
|
|
5
6
|
rpc: Rpc<SolanaRpcApi>;
|
|
6
7
|
displayInfo: AssetDisplayInfo;
|
|
7
8
|
slotHash: Uint8Array;
|
|
8
9
|
slotNumber: bigint;
|
|
9
10
|
challenge: Uint8Array;
|
|
10
|
-
recipient: TransactionSigner;
|
|
11
11
|
};
|
|
12
12
|
export declare function beginTransfer(input: {
|
|
13
13
|
rpc: Rpc<SolanaRpcApi>;
|
|
14
14
|
displayInfo: AssetDisplayInfo;
|
|
15
|
-
recipient: TransactionSigner;
|
|
16
15
|
}): Promise<TransferSession>;
|
|
17
|
-
export declare function
|
|
18
|
-
|
|
19
|
-
}): Promise<AuthenticationResponseJSON>;
|
|
20
|
-
export declare function authenticatePasskey(input: {
|
|
21
|
-
challenge: Uint8Array;
|
|
22
|
-
credentialId: string;
|
|
23
|
-
}): Promise<AuthenticationResponseJSON>;
|
|
24
|
-
export declare function authenticateToken(session: TransferSession): Promise<AuthenticationResponseJSON>;
|
|
25
|
-
export declare function completeTransfer(session: TransferSession, response: AuthenticationResponseJSON): Promise<Instruction[]>;
|
|
16
|
+
export declare function authenticatePasskeyForTransfer(session: TransferSession): Promise<AuthenticationResponseJSON>;
|
|
17
|
+
export declare function completeTransfer(session: TransferSession, response: AuthenticationResponseJSON, recipient: TransactionSigner, existingSecp256r1VerifyInputs?: Secp256r1VerifyInput[]): Promise<Instruction[]>;
|
|
26
18
|
//# sourceMappingURL=transfer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transfer.d.ts","sourceRoot":"","sources":["../../src/instructions/transfer.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,GAAG,EACR,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACvB,MAAM,aAAa,CAAC;AACrB,OAAO,EAGL,KAAK,0BAA0B,EAChC,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"transfer.d.ts","sourceRoot":"","sources":["../../src/instructions/transfer.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,GAAG,EACR,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACvB,MAAM,aAAa,CAAC;AACrB,OAAO,EAGL,KAAK,0BAA0B,EAChC,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAGL,KAAK,oBAAoB,EAC1B,MAAM,+BAA+B,CAAC;AAKvC,MAAM,MAAM,eAAe,GAAG;IAC5B,GAAG,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;IACvB,WAAW,EAAE,gBAAgB,CAAC;IAC9B,QAAQ,EAAE,UAAU,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,UAAU,CAAC;CACvB,CAAC;AAOF,wBAAsB,aAAa,CAAC,KAAK,EAAE;IACzC,GAAG,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;IACvB,WAAW,EAAE,gBAAgB,CAAC;CAC/B,GAAG,OAAO,CAAC,eAAe,CAAC,CAc3B;AAGD,wBAAsB,8BAA8B,CAClD,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,0BAA0B,CAAC,CAiBrC;AAGD,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,eAAe,EACxB,QAAQ,EAAE,0BAA0B,EACpC,SAAS,EAAE,iBAAiB,EAC5B,6BAA6B,CAAC,EAAE,oBAAoB,EAAE,GACrD,OAAO,CAAC,WAAW,EAAE,CAAC,CAqCxB"}
|
|
@@ -9,7 +9,7 @@ import { findAssociatedTokenAddress } from "../utils/associatedToken.js";
|
|
|
9
9
|
export async function beginTransfer(input) {
|
|
10
10
|
const { slotHash, slotNumber } = await getLatestSlotHash(input.rpc);
|
|
11
11
|
const challenge = await buildTransferChallenge({
|
|
12
|
-
|
|
12
|
+
asset: input.displayInfo.asset,
|
|
13
13
|
slotHash,
|
|
14
14
|
});
|
|
15
15
|
return {
|
|
@@ -18,18 +18,17 @@ export async function beginTransfer(input) {
|
|
|
18
18
|
slotHash,
|
|
19
19
|
slotNumber,
|
|
20
20
|
challenge,
|
|
21
|
-
recipient: input.recipient,
|
|
22
21
|
};
|
|
23
22
|
}
|
|
24
|
-
export async function
|
|
23
|
+
export async function authenticatePasskeyForTransfer(session) {
|
|
25
24
|
return startAuthentication({
|
|
26
25
|
optionsJSON: {
|
|
27
|
-
challenge: bufferToBase64URLString(new Uint8Array(
|
|
26
|
+
challenge: bufferToBase64URLString(new Uint8Array(session.challenge).buffer),
|
|
28
27
|
rpId: window.location.hostname,
|
|
29
28
|
userVerification: "preferred",
|
|
30
29
|
allowCredentials: [
|
|
31
30
|
{
|
|
32
|
-
id:
|
|
31
|
+
id: session.displayInfo.credentialId,
|
|
33
32
|
type: "public-key",
|
|
34
33
|
transports: ["nfc"],
|
|
35
34
|
},
|
|
@@ -37,38 +36,17 @@ export async function authenticateDiscoverablePasskey(input) {
|
|
|
37
36
|
},
|
|
38
37
|
});
|
|
39
38
|
}
|
|
40
|
-
export async function
|
|
41
|
-
return startAuthentication({
|
|
42
|
-
optionsJSON: {
|
|
43
|
-
challenge: bufferToBase64URLString(new Uint8Array(input.challenge).buffer),
|
|
44
|
-
rpId: window.location.hostname,
|
|
45
|
-
userVerification: "preferred",
|
|
46
|
-
allowCredentials: [
|
|
47
|
-
{
|
|
48
|
-
id: input.credentialId,
|
|
49
|
-
type: "public-key",
|
|
50
|
-
transports: ["nfc"],
|
|
51
|
-
},
|
|
52
|
-
],
|
|
53
|
-
},
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
export async function authenticateToken(session) {
|
|
57
|
-
return authenticatePasskey({
|
|
58
|
-
challenge: session.challenge,
|
|
59
|
-
credentialId: session.displayInfo.credentialId,
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
export async function completeTransfer(session, response) {
|
|
39
|
+
export async function completeTransfer(session, response, recipient, existingSecp256r1VerifyInputs) {
|
|
63
40
|
const tokenProgram = TOKEN_2022_PROGRAM_ADDRESS;
|
|
64
|
-
const { secp256r1Verify, clientDataJson } = await buildSecp256r1VerifyInstructionFromWebAuthnResponse({
|
|
41
|
+
const { secp256r1Verify, signedMessageIndex, clientDataJson } = await buildSecp256r1VerifyInstructionFromWebAuthnResponse({
|
|
65
42
|
response,
|
|
66
43
|
publicKey: session.displayInfo.publicKey,
|
|
44
|
+
existingSecp256r1VerifyInputs,
|
|
67
45
|
});
|
|
68
|
-
const recipientTokenAccount = await findAssociatedTokenAddress(
|
|
46
|
+
const recipientTokenAccount = await findAssociatedTokenAddress(recipient.address, session.displayInfo.mint, tokenProgram);
|
|
69
47
|
const senderTokenAccount = await findAssociatedTokenAddress(session.displayInfo.currentOwner, session.displayInfo.mint, tokenProgram);
|
|
70
48
|
const executeTransfer = await getExecuteTransferInstructionAsync({
|
|
71
|
-
recipient
|
|
49
|
+
recipient,
|
|
72
50
|
sender: session.displayInfo.currentOwner,
|
|
73
51
|
asset: session.displayInfo.asset,
|
|
74
52
|
mint: session.displayInfo.mint,
|
|
@@ -76,7 +54,7 @@ export async function completeTransfer(session, response) {
|
|
|
76
54
|
recipientTokenAccount,
|
|
77
55
|
tokenProgram,
|
|
78
56
|
secp256r1VerifyArgs: {
|
|
79
|
-
signedMessageIndex
|
|
57
|
+
signedMessageIndex,
|
|
80
58
|
slotNumber: session.slotNumber,
|
|
81
59
|
clientDataJson,
|
|
82
60
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transfer.js","sourceRoot":"","sources":["../../src/instructions/transfer.ts"],"names":[],"mappings":"AAAA,OAAO,EAKN,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,uBAAuB,EACvB,mBAAmB,GAEpB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAyB,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EACL,mDAAmD,EACnD,sBAAsB,
|
|
1
|
+
{"version":3,"file":"transfer.js","sourceRoot":"","sources":["../../src/instructions/transfer.ts"],"names":[],"mappings":"AAAA,OAAO,EAKN,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,uBAAuB,EACvB,mBAAmB,GAEpB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAyB,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EACL,mDAAmD,EACnD,sBAAsB,GAEvB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,kCAAkC,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AAezE,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAGnC;IACC,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACpE,MAAM,SAAS,GAAG,MAAM,sBAAsB,CAAC;QAC7C,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC,KAAK;QAC9B,QAAQ;KACT,CAAC,CAAC;IAEH,OAAO;QACL,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,QAAQ;QACR,UAAU;QACV,SAAS;KACV,CAAC;AACJ,CAAC;AAGD,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,OAAwB;IAExB,OAAO,mBAAmB,CAAC;QACzB,WAAW,EAAE;YACX,SAAS,EAAE,uBAAuB,CAChC,IAAI,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,MAAqB,CACxD;YACD,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ;YAC9B,gBAAgB,EAAE,WAAW;YAC7B,gBAAgB,EAAE;gBAChB;oBACE,EAAE,EAAE,OAAO,CAAC,WAAW,CAAC,YAAY;oBACpC,IAAI,EAAE,YAAY;oBAClB,UAAU,EAAE,CAAC,KAAK,CAAC;iBACpB;aACF;SACF;KACF,CAAC,CAAC;AACL,CAAC;AAGD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAAwB,EACxB,QAAoC,EACpC,SAA4B,EAC5B,6BAAsD;IAEtD,MAAM,YAAY,GAAG,0BAA0B,CAAC;IAEhD,MAAM,EAAE,eAAe,EAAE,kBAAkB,EAAE,cAAc,EAAE,GAC3D,MAAM,mDAAmD,CAAC;QACxD,QAAQ;QACR,SAAS,EAAE,OAAO,CAAC,WAAW,CAAC,SAAS;QACxC,6BAA6B;KAC9B,CAAC,CAAC;IAEL,MAAM,qBAAqB,GAAG,MAAM,0BAA0B,CAC5D,SAAS,CAAC,OAAO,EACjB,OAAO,CAAC,WAAW,CAAC,IAAI,EACxB,YAAY,CACb,CAAC;IACF,MAAM,kBAAkB,GAAG,MAAM,0BAA0B,CACzD,OAAO,CAAC,WAAW,CAAC,YAAY,EAChC,OAAO,CAAC,WAAW,CAAC,IAAI,EACxB,YAAY,CACb,CAAC;IAEF,MAAM,eAAe,GAAG,MAAM,kCAAkC,CAAC;QAC/D,SAAS;QACT,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,YAAY;QACxC,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC,KAAK;QAChC,IAAI,EAAE,OAAO,CAAC,WAAW,CAAC,IAAI;QAC9B,kBAAkB;QAClB,qBAAqB;QACrB,YAAY;QACZ,mBAAmB,EAAE;YACnB,kBAAkB;YAClB,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,cAAc;SACf;KACF,CAAC,CAAC;IAEH,OAAO,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -1,20 +1,25 @@
|
|
|
1
|
-
import { type Address, type Instruction, type Rpc, type SolanaRpcApi } from "@solana/kit";
|
|
2
1
|
import { type AuthenticationResponseJSON } from "@simplewebauthn/browser";
|
|
2
|
+
import type { Address, Instruction, Rpc, SolanaRpcApi } from "@solana/kit";
|
|
3
|
+
import { type Secp256r1VerifyInput } from "../utils/passkey/secp256r1.js";
|
|
4
|
+
import { type Asset } from "../generated/index.js";
|
|
3
5
|
export type VerifyAssetSession = {
|
|
4
6
|
rpc: Rpc<SolanaRpcApi>;
|
|
5
|
-
asset: Address;
|
|
6
|
-
publicKey: string;
|
|
7
|
-
message: string;
|
|
8
7
|
slotHash: Uint8Array;
|
|
9
8
|
slotNumber: bigint;
|
|
10
9
|
challenge: Uint8Array;
|
|
10
|
+
message: Uint8Array;
|
|
11
11
|
};
|
|
12
12
|
export declare function beginVerifyAsset(input: {
|
|
13
13
|
rpc: Rpc<SolanaRpcApi>;
|
|
14
|
-
|
|
15
|
-
publicKey: string;
|
|
16
|
-
message: string;
|
|
14
|
+
message: Uint8Array;
|
|
17
15
|
}): Promise<VerifyAssetSession>;
|
|
18
|
-
export declare function
|
|
19
|
-
export declare function
|
|
16
|
+
export declare function authenticatePasskeyForVerifyAsset(session: VerifyAssetSession): Promise<AuthenticationResponseJSON>;
|
|
17
|
+
export declare function buildVerifyAssetArgs(session: VerifyAssetSession, response: AuthenticationResponseJSON, existingSecp256r1VerifyInputs?: Secp256r1VerifyInput[]): Promise<{
|
|
18
|
+
asset: Asset;
|
|
19
|
+
assetPda: Address;
|
|
20
|
+
secp256r1Verify: Instruction;
|
|
21
|
+
signedMessageIndex: number;
|
|
22
|
+
clientDataJson: Uint8Array;
|
|
23
|
+
}>;
|
|
24
|
+
export declare function completeVerifyAsset(session: VerifyAssetSession, response: AuthenticationResponseJSON, existingSecp256r1VerifyInputs?: Secp256r1VerifyInput[]): Promise<Instruction[]>;
|
|
20
25
|
//# sourceMappingURL=verifyAsset.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verifyAsset.d.ts","sourceRoot":"","sources":["../../src/instructions/verifyAsset.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,
|
|
1
|
+
{"version":3,"file":"verifyAsset.d.ts","sourceRoot":"","sources":["../../src/instructions/verifyAsset.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,0BAA0B,EAGhC,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,EAGL,KAAK,oBAAoB,EAC1B,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAA6B,KAAK,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAK9E,MAAM,MAAM,kBAAkB,GAAG;IAC/B,GAAG,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;IACvB,QAAQ,EAAE,UAAU,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,UAAU,CAAC;IACtB,OAAO,EAAE,UAAU,CAAC;CACrB,CAAC;AAMF,wBAAsB,gBAAgB,CAAC,KAAK,EAAE;IAC5C,GAAG,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;IACvB,OAAO,EAAE,UAAU,CAAC;CACrB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAc9B;AAED,wBAAsB,iCAAiC,CACrD,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,0BAA0B,CAAC,CAiBrC;AAED,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,kBAAkB,EAC3B,QAAQ,EAAE,0BAA0B,EACpC,6BAA6B,CAAC,EAAE,oBAAoB,EAAE,GACrD,OAAO,CAAC;IACT,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,eAAe,EAAE,WAAW,CAAC;IAC7B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,UAAU,CAAC;CAC5B,CAAC,CAkBD;AAED,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,kBAAkB,EAC3B,QAAQ,EAAE,0BAA0B,EACpC,6BAA6B,CAAC,EAAE,oBAAoB,EAAE,GACrD,OAAO,CAAC,WAAW,EAAE,CAAC,CAmBxB"}
|
|
@@ -1,41 +1,66 @@
|
|
|
1
|
-
import {} from "@
|
|
2
|
-
import {
|
|
3
|
-
import { getVerifyAssetInstruction } from "../generated/index.js";
|
|
4
|
-
import { buildSecp256r1VerifyInstructionFromWebAuthnResponse, buildVerifyMessage, } from "../utils/passkey/secp256r1.js";
|
|
1
|
+
import { startAuthentication, bufferToBase64URLString, } from "@simplewebauthn/browser";
|
|
2
|
+
import { buildSecp256r1VerifyInstructionFromWebAuthnResponse, buildVerifyAssetChallenge, } from "../utils/passkey/secp256r1.js";
|
|
5
3
|
import { getLatestSlotHash } from "../utils/slotHash.js";
|
|
4
|
+
import { getVerifyAssetInstruction } from "../generated/index.js";
|
|
5
|
+
import { findAssetPda } from "../utils/pdas/index.js";
|
|
6
|
+
import { parseSecp256r1Pubkey } from "./mint.js";
|
|
7
|
+
import { fetchAssetFromCredentialId } from "../utils/assetCredential.js";
|
|
6
8
|
export async function beginVerifyAsset(input) {
|
|
7
9
|
const { slotHash, slotNumber } = await getLatestSlotHash(input.rpc);
|
|
8
|
-
const challenge = await
|
|
9
|
-
asset: input.asset,
|
|
10
|
+
const challenge = await buildVerifyAssetChallenge({
|
|
10
11
|
message: input.message,
|
|
11
12
|
slotHash,
|
|
12
13
|
});
|
|
13
14
|
return {
|
|
14
|
-
|
|
15
|
+
rpc: input.rpc,
|
|
15
16
|
slotHash,
|
|
16
17
|
slotNumber,
|
|
17
18
|
challenge,
|
|
19
|
+
message: input.message,
|
|
18
20
|
};
|
|
19
21
|
}
|
|
20
|
-
export function
|
|
21
|
-
return
|
|
22
|
+
export async function authenticatePasskeyForVerifyAsset(session) {
|
|
23
|
+
return startAuthentication({
|
|
24
|
+
optionsJSON: {
|
|
25
|
+
challenge: bufferToBase64URLString(new Uint8Array(session.challenge).buffer),
|
|
26
|
+
rpId: window.location.hostname,
|
|
27
|
+
userVerification: "preferred",
|
|
28
|
+
allowCredentials: [
|
|
29
|
+
{
|
|
30
|
+
id: "",
|
|
31
|
+
type: "public-key",
|
|
32
|
+
transports: ["nfc"],
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
},
|
|
36
|
+
});
|
|
22
37
|
}
|
|
23
|
-
export async function
|
|
24
|
-
const {
|
|
25
|
-
|
|
38
|
+
export async function buildVerifyAssetArgs(session, response, existingSecp256r1VerifyInputs) {
|
|
39
|
+
const { asset, publicKey } = await fetchAssetFromCredentialId(response.id, session.rpc);
|
|
40
|
+
const { secp256r1Verify, signedMessageIndex, clientDataJson } = await buildSecp256r1VerifyInstructionFromWebAuthnResponse({
|
|
41
|
+
publicKey,
|
|
26
42
|
response,
|
|
43
|
+
existingSecp256r1VerifyInputs,
|
|
27
44
|
});
|
|
28
|
-
|
|
29
|
-
asset
|
|
45
|
+
return {
|
|
46
|
+
asset,
|
|
47
|
+
assetPda: await findAssetPda(parseSecp256r1Pubkey(publicKey)),
|
|
48
|
+
secp256r1Verify,
|
|
49
|
+
signedMessageIndex,
|
|
50
|
+
clientDataJson,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
export async function completeVerifyAsset(session, response, existingSecp256r1VerifyInputs) {
|
|
54
|
+
const { assetPda, secp256r1Verify, signedMessageIndex, clientDataJson } = await buildVerifyAssetArgs(session, response, existingSecp256r1VerifyInputs);
|
|
55
|
+
const verifyAssetInstruction = getVerifyAssetInstruction({
|
|
56
|
+
asset: assetPda,
|
|
30
57
|
secp256r1VerifyArgs: {
|
|
31
|
-
signedMessageIndex
|
|
58
|
+
signedMessageIndex,
|
|
32
59
|
slotNumber: session.slotNumber,
|
|
33
|
-
|
|
34
|
-
crossOrigin,
|
|
35
|
-
truncatedClientDataJson,
|
|
60
|
+
clientDataJson,
|
|
36
61
|
},
|
|
37
62
|
message: session.message,
|
|
38
63
|
});
|
|
39
|
-
return [secp256r1Verify,
|
|
64
|
+
return [secp256r1Verify, verifyAssetInstruction];
|
|
40
65
|
}
|
|
41
66
|
//# sourceMappingURL=verifyAsset.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verifyAsset.js","sourceRoot":"","sources":["../../src/instructions/verifyAsset.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"verifyAsset.js","sourceRoot":"","sources":["../../src/instructions/verifyAsset.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,mDAAmD,EACnD,yBAAyB,GAE1B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAc,MAAM,uBAAuB,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AAczE,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAGtC;IACC,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACpE,MAAM,SAAS,GAAG,MAAM,yBAAyB,CAAC;QAChD,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,QAAQ;KACT,CAAC,CAAC;IAEH,OAAO;QACL,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,QAAQ;QACR,UAAU;QACV,SAAS;QACT,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iCAAiC,CACrD,OAA2B;IAE3B,OAAO,mBAAmB,CAAC;QACzB,WAAW,EAAE;YACX,SAAS,EAAE,uBAAuB,CAChC,IAAI,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,MAAqB,CACxD;YACD,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ;YAC9B,gBAAgB,EAAE,WAAW;YAC7B,gBAAgB,EAAE;gBAChB;oBACE,EAAE,EAAE,EAAE;oBACN,IAAI,EAAE,YAAY;oBAClB,UAAU,EAAE,CAAC,KAAK,CAAC;iBACpB;aACF;SACF;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,OAA2B,EAC3B,QAAoC,EACpC,6BAAsD;IAQtD,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,MAAM,0BAA0B,CAC3D,QAAQ,CAAC,EAAE,EACX,OAAO,CAAC,GAAG,CACZ,CAAC;IACF,MAAM,EAAE,eAAe,EAAE,kBAAkB,EAAE,cAAc,EAAE,GAC3D,MAAM,mDAAmD,CAAC;QACxD,SAAS;QACT,QAAQ;QACR,6BAA6B;KAC9B,CAAC,CAAC;IACL,OAAO;QACL,KAAK;QACL,QAAQ,EAAE,MAAM,YAAY,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;QAC7D,eAAe;QACf,kBAAkB;QAClB,cAAc;KACf,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAA2B,EAC3B,QAAoC,EACpC,6BAAsD;IAEtD,MAAM,EAAE,QAAQ,EAAE,eAAe,EAAE,kBAAkB,EAAE,cAAc,EAAE,GACrE,MAAM,oBAAoB,CACxB,OAAO,EACP,QAAQ,EACR,6BAA6B,CAC9B,CAAC;IAEJ,MAAM,sBAAsB,GAAG,yBAAyB,CAAC;QACvD,KAAK,EAAE,QAAQ;QACf,mBAAmB,EAAE;YACnB,kBAAkB;YAClB,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,cAAc;SACf;QACD,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC,CAAC;IAEH,OAAO,CAAC,eAAe,EAAE,sBAAsB,CAAC,CAAC;AACnD,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type Address, type Rpc, type SolanaRpcApi } from "@solana/kit";
|
|
2
2
|
import { type Base64URLString } from "@simplewebauthn/browser";
|
|
3
3
|
import { type Asset } from "../generated/index.js";
|
|
4
|
-
export declare function
|
|
4
|
+
export declare function fetchAssetFromCredentialId(credentialId: Base64URLString, rpc: Rpc<SolanaRpcApi>): Promise<{
|
|
5
5
|
publicKey: Base64URLString;
|
|
6
6
|
asset: Asset;
|
|
7
7
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assetCredential.d.ts","sourceRoot":"","sources":["../../src/utils/assetCredential.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"assetCredential.d.ts","sourceRoot":"","sources":["../../src/utils/assetCredential.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,OAAO,EAEZ,KAAK,GAAG,EACR,KAAK,YAAY,EAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAGL,KAAK,KAAK,EACX,MAAM,uBAAuB,CAAC;AAc/B,wBAAsB,0BAA0B,CAC9C,YAAY,EAAE,eAAe,EAC7B,GAAG,EAAE,GAAG,CAAC,YAAY,CAAC,GACrB,OAAO,CAAC;IAAE,SAAS,EAAE,eAAe,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,CAAC,CAgCvD;AAED,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,GAAG,CAAC,YAAY,CAAC,GACrB,OAAO,CAAC,KAAK,EAAE,CAAC,CA2BlB"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { getAddressEncoder, getBase64Decoder, getBase64Encoder, } from "@solana/kit";
|
|
2
2
|
import { bufferToBase64URLString, } from "@simplewebauthn/browser";
|
|
3
3
|
import { getAssetDecoder, PHYGITAL_TOKEN_PROGRAM_ADDRESS, } from "../generated/index.js";
|
|
4
4
|
import { base64URLStringToBuffer } from "./passkey/internal.js";
|
|
5
5
|
const ASSET_ACCOUNT_DATA_SIZE = 179;
|
|
6
6
|
const ASSET_CREDENTIAL_ID_OFFSET = 115;
|
|
7
7
|
const ASSET_OWNER_OFF_SET = 41;
|
|
8
|
-
export async function
|
|
8
|
+
export async function fetchAssetFromCredentialId(credentialId, rpc) {
|
|
9
9
|
const data = await rpc
|
|
10
10
|
.getProgramAccounts(PHYGITAL_TOKEN_PROGRAM_ADDRESS, {
|
|
11
11
|
encoding: "base64",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assetCredential.js","sourceRoot":"","sources":["../../src/utils/assetCredential.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,
|
|
1
|
+
{"version":3,"file":"assetCredential.js","sourceRoot":"","sources":["../../src/utils/assetCredential.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,GAKjB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,uBAAuB,GAExB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,eAAe,EACf,8BAA8B,GAE/B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAGhE,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAGpC,MAAM,0BAA0B,GAAG,GAAG,CAAC;AAEvC,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAK/B,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,YAA6B,EAC7B,GAAsB;IAEtB,MAAM,IAAI,GAAG,MAAM,GAAG;SACnB,kBAAkB,CAAC,8BAA8B,EAAE;QAClD,QAAQ,EAAE,QAAQ;QAClB,OAAO,EAAE;YACP,EAAE,QAAQ,EAAE,MAAM,CAAC,uBAAuB,CAAC,EAAE;YAC7C;gBACE,MAAM,EAAE;oBACN,QAAQ,EAAE,QAAiB;oBAC3B,MAAM,EAAE,MAAM,CAAC,0BAA0B,CAAC;oBAC1C,KAAK,EAAE,gBAAgB,EAAE,CAAC,MAAM,CAC9B,uBAAuB,CAAC,YAAY,CAAC,CAChB;iBACxB;aACF;SACF;KACF,CAAC;SACD,IAAI,EAAE,CAAC;IAEV,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC,MAAM,CACpC,gBAAgB,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CACnD,CAAC;IACF,OAAO;QACL,SAAS,EAAE,uBAAuB,CAChC,IAAI,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAC1C;QACD,KAAK;KACN,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,KAAc,EACd,GAAsB;IAEtB,MAAM,IAAI,GAAG,MAAM,GAAG;SACnB,kBAAkB,CAAC,8BAA8B,EAAE;QAClD,QAAQ,EAAE,QAAQ;QAClB,OAAO,EAAE;YACP,EAAE,QAAQ,EAAE,MAAM,CAAC,uBAAuB,CAAC,EAAE;YAC7C;gBACE,MAAM,EAAE;oBACN,QAAQ,EAAE,QAAiB;oBAC3B,MAAM,EAAE,MAAM,CAAC,mBAAmB,CAAC;oBACnC,KAAK,EAAE,gBAAgB,EAAE,CAAC,MAAM,CAC9B,iBAAiB,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CACZ;iBACxB;aACF;SACF;KACF,CAAC;SACD,IAAI,EAAE,CAAC;IAEV,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACjB,OAAO,EAAE,CAAA;IACX,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC5B,eAAe,EAAE,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CACvE,CAAC;IACF,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/utils/consts.d.ts
CHANGED
|
@@ -3,5 +3,5 @@ export declare const ASSOCIATED_TOKEN_PROGRAM_ADDRESS: import("@solana/kit").Add
|
|
|
3
3
|
export declare const SECP256R1_PROGRAM_ADDRESS: import("@solana/kit").Address<"Secp256r1SigVerify1111111111111111111111111">;
|
|
4
4
|
export declare const SLOT_HASHES_SYSVAR_ADDRESS: import("@solana/kit").Address<"SysvarS1otHashes111111111111111111111111111">;
|
|
5
5
|
export declare const TRANSFER_ACTION_BYTES: Uint8Array<ArrayBuffer>;
|
|
6
|
-
export declare const
|
|
6
|
+
export declare const VERIFY_ASSET_ACTION_BYTES: Uint8Array<ArrayBuffer>;
|
|
7
7
|
//# sourceMappingURL=consts.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consts.d.ts","sourceRoot":"","sources":["../../src/utils/consts.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,0BAA0B,8EAEtC,CAAC;AAEF,eAAO,MAAM,gCAAgC,+EAE5C,CAAC;AAEF,eAAO,MAAM,yBAAyB,8EAErC,CAAC;AAEF,eAAO,MAAM,0BAA0B,8EAEtC,CAAC;AAEF,eAAO,MAAM,qBAAqB,yBAAuC,CAAC;AAE1E,eAAO,MAAM,
|
|
1
|
+
{"version":3,"file":"consts.d.ts","sourceRoot":"","sources":["../../src/utils/consts.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,0BAA0B,8EAEtC,CAAC;AAEF,eAAO,MAAM,gCAAgC,+EAE5C,CAAC;AAEF,eAAO,MAAM,yBAAyB,8EAErC,CAAC;AAEF,eAAO,MAAM,0BAA0B,8EAEtC,CAAC;AAEF,eAAO,MAAM,qBAAqB,yBAAuC,CAAC;AAE1E,eAAO,MAAM,yBAAyB,yBAA2C,CAAC"}
|
package/dist/utils/consts.js
CHANGED
|
@@ -4,5 +4,5 @@ export const ASSOCIATED_TOKEN_PROGRAM_ADDRESS = address("ATokenGPvbdGVxr1b2hvZbs
|
|
|
4
4
|
export const SECP256R1_PROGRAM_ADDRESS = address("Secp256r1SigVerify1111111111111111111111111");
|
|
5
5
|
export const SLOT_HASHES_SYSVAR_ADDRESS = address("SysvarS1otHashes111111111111111111111111111");
|
|
6
6
|
export const TRANSFER_ACTION_BYTES = new TextEncoder().encode("transfer");
|
|
7
|
-
export const
|
|
7
|
+
export const VERIFY_ASSET_ACTION_BYTES = new TextEncoder().encode("verify_asset");
|
|
8
8
|
//# sourceMappingURL=consts.js.map
|
package/dist/utils/consts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consts.js","sourceRoot":"","sources":["../../src/utils/consts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,CAAC,MAAM,0BAA0B,GAAG,OAAO,CAC/C,6CAA6C,CAC9C,CAAC;AAEF,MAAM,CAAC,MAAM,gCAAgC,GAAG,OAAO,CACrD,8CAA8C,CAC/C,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG,OAAO,CAC9C,6CAA6C,CAC9C,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAG,OAAO,CAC/C,6CAA6C,CAC9C,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;AAE1E,MAAM,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"consts.js","sourceRoot":"","sources":["../../src/utils/consts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,CAAC,MAAM,0BAA0B,GAAG,OAAO,CAC/C,6CAA6C,CAC9C,CAAC;AAEF,MAAM,CAAC,MAAM,gCAAgC,GAAG,OAAO,CACrD,8CAA8C,CAC/C,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG,OAAO,CAC9C,6CAA6C,CAC9C,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAG,OAAO,CAC/C,6CAA6C,CAC9C,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;AAE1E,MAAM,CAAC,MAAM,yBAAyB,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC"}
|