phygital-token-sdk 0.1.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/dist/__tests__/card-instance.test.d.ts +2 -0
- package/dist/__tests__/card-instance.test.d.ts.map +1 -0
- package/dist/__tests__/card-instance.test.js +38 -0
- package/dist/__tests__/card-instance.test.js.map +1 -0
- package/dist/__tests__/crypto-parity.test.d.ts +2 -0
- package/dist/__tests__/crypto-parity.test.d.ts.map +1 -0
- package/dist/__tests__/crypto-parity.test.js +60 -0
- package/dist/__tests__/crypto-parity.test.js.map +1 -0
- package/dist/__tests__/low-s-normalization.test.d.ts +2 -0
- package/dist/__tests__/low-s-normalization.test.d.ts.map +1 -0
- package/dist/__tests__/low-s-normalization.test.js +44 -0
- package/dist/__tests__/low-s-normalization.test.js.map +1 -0
- package/dist/__tests__/metadata-limits.test.d.ts +2 -0
- package/dist/__tests__/metadata-limits.test.d.ts.map +1 -0
- package/dist/__tests__/metadata-limits.test.js +33 -0
- package/dist/__tests__/metadata-limits.test.js.map +1 -0
- package/dist/consts.d.ts +19 -0
- package/dist/consts.d.ts.map +1 -0
- package/dist/consts.js +19 -0
- package/dist/consts.js.map +1 -0
- package/dist/generated/accounts/asset.d.ts +28 -0
- package/dist/generated/accounts/asset.d.ts.map +1 -0
- package/dist/generated/accounts/asset.js +52 -0
- package/dist/generated/accounts/asset.js.map +1 -0
- package/dist/generated/accounts/cardInstance.d.ts +35 -0
- package/dist/generated/accounts/cardInstance.d.ts.map +1 -0
- package/dist/generated/accounts/cardInstance.js +61 -0
- package/dist/generated/accounts/cardInstance.js.map +1 -0
- package/dist/generated/accounts/domainConfig.d.ts +28 -0
- package/dist/generated/accounts/domainConfig.d.ts.map +1 -0
- package/dist/generated/accounts/domainConfig.js +58 -0
- package/dist/generated/accounts/domainConfig.js.map +1 -0
- package/dist/generated/accounts/index.d.ts +3 -0
- package/dist/generated/accounts/index.d.ts.map +1 -0
- package/dist/generated/accounts/index.js +3 -0
- package/dist/generated/accounts/index.js.map +1 -0
- package/dist/generated/errors/index.d.ts +2 -0
- package/dist/generated/errors/index.d.ts.map +1 -0
- package/dist/generated/errors/index.js +2 -0
- package/dist/generated/errors/index.js.map +1 -0
- package/dist/generated/errors/phygitalNfts.d.ts +62 -0
- package/dist/generated/errors/phygitalNfts.d.ts.map +1 -0
- package/dist/generated/errors/phygitalNfts.js +87 -0
- package/dist/generated/errors/phygitalNfts.js.map +1 -0
- package/dist/generated/errors/phygitalToken.d.ts +34 -0
- package/dist/generated/errors/phygitalToken.d.ts.map +1 -0
- package/dist/generated/errors/phygitalToken.js +59 -0
- package/dist/generated/errors/phygitalToken.js.map +1 -0
- package/dist/generated/index.d.ts +7 -0
- package/dist/generated/index.d.ts.map +1 -0
- package/dist/generated/index.js +7 -0
- package/dist/generated/index.js.map +1 -0
- package/dist/generated/instructions/createCollectionMint.d.ts +108 -0
- package/dist/generated/instructions/createCollectionMint.d.ts.map +1 -0
- package/dist/generated/instructions/createCollectionMint.js +175 -0
- package/dist/generated/instructions/createCollectionMint.js.map +1 -0
- package/dist/generated/instructions/createDesignMint.d.ts +97 -0
- package/dist/generated/instructions/createDesignMint.d.ts.map +1 -0
- package/dist/generated/instructions/createDesignMint.js +164 -0
- package/dist/generated/instructions/createDesignMint.js.map +1 -0
- package/dist/generated/instructions/createDomainConfig.d.ts +46 -0
- package/dist/generated/instructions/createDomainConfig.d.ts.map +1 -0
- package/dist/generated/instructions/createDomainConfig.js +83 -0
- package/dist/generated/instructions/createDomainConfig.js.map +1 -0
- package/dist/generated/instructions/createGroupToken.d.ts +94 -0
- package/dist/generated/instructions/createGroupToken.d.ts.map +1 -0
- package/dist/generated/instructions/createGroupToken.js +150 -0
- package/dist/generated/instructions/createGroupToken.js.map +1 -0
- package/dist/generated/instructions/createMint.d.ts +77 -0
- package/dist/generated/instructions/createMint.d.ts.map +1 -0
- package/dist/generated/instructions/createMint.js +149 -0
- package/dist/generated/instructions/createMint.js.map +1 -0
- package/dist/generated/instructions/createToken.d.ts +88 -0
- package/dist/generated/instructions/createToken.d.ts.map +1 -0
- package/dist/generated/instructions/createToken.js +182 -0
- package/dist/generated/instructions/createToken.js.map +1 -0
- package/dist/generated/instructions/editDomainConfig.d.ts +50 -0
- package/dist/generated/instructions/editDomainConfig.d.ts.map +1 -0
- package/dist/generated/instructions/editDomainConfig.js +90 -0
- package/dist/generated/instructions/editDomainConfig.js.map +1 -0
- package/dist/generated/instructions/executeTransfer.d.ts +109 -0
- package/dist/generated/instructions/executeTransfer.d.ts.map +1 -0
- package/dist/generated/instructions/executeTransfer.js +243 -0
- package/dist/generated/instructions/executeTransfer.js.map +1 -0
- package/dist/generated/instructions/index.d.ts +7 -0
- package/dist/generated/instructions/index.d.ts.map +1 -0
- package/dist/generated/instructions/index.js +7 -0
- package/dist/generated/instructions/index.js.map +1 -0
- package/dist/generated/instructions/mintToken.d.ts +78 -0
- package/dist/generated/instructions/mintToken.d.ts.map +1 -0
- package/dist/generated/instructions/mintToken.js +167 -0
- package/dist/generated/instructions/mintToken.js.map +1 -0
- package/dist/generated/instructions/setLockState.d.ts +37 -0
- package/dist/generated/instructions/setLockState.d.ts.map +1 -0
- package/dist/generated/instructions/setLockState.js +62 -0
- package/dist/generated/instructions/setLockState.js.map +1 -0
- package/dist/generated/instructions/setTransferConfig.d.ts +88 -0
- package/dist/generated/instructions/setTransferConfig.d.ts.map +1 -0
- package/dist/generated/instructions/setTransferConfig.js +188 -0
- package/dist/generated/instructions/setTransferConfig.js.map +1 -0
- package/dist/generated/instructions/updateCounter.d.ts +45 -0
- package/dist/generated/instructions/updateCounter.d.ts.map +1 -0
- package/dist/generated/instructions/updateCounter.js +84 -0
- package/dist/generated/instructions/updateCounter.js.map +1 -0
- package/dist/generated/instructions/updateDomainConfig.d.ts +43 -0
- package/dist/generated/instructions/updateDomainConfig.d.ts.map +1 -0
- package/dist/generated/instructions/updateDomainConfig.js +81 -0
- package/dist/generated/instructions/updateDomainConfig.js.map +1 -0
- package/dist/generated/pdas/index.d.ts +2 -0
- package/dist/generated/pdas/index.d.ts.map +1 -0
- package/dist/generated/pdas/index.js +2 -0
- package/dist/generated/pdas/index.js.map +1 -0
- package/dist/generated/pdas/programAuthority.d.ts +5 -0
- package/dist/generated/pdas/programAuthority.d.ts.map +1 -0
- package/dist/generated/pdas/programAuthority.js +14 -0
- package/dist/generated/pdas/programAuthority.js.map +1 -0
- package/dist/generated/programs/index.d.ts +2 -0
- package/dist/generated/programs/index.d.ts.map +1 -0
- package/dist/generated/programs/index.js +2 -0
- package/dist/generated/programs/index.js.map +1 -0
- package/dist/generated/programs/phygitalNfts.d.ts +72 -0
- package/dist/generated/programs/phygitalNfts.d.ts.map +1 -0
- package/dist/generated/programs/phygitalNfts.js +136 -0
- package/dist/generated/programs/phygitalNfts.js.map +1 -0
- package/dist/generated/programs/phygitalToken.d.ts +65 -0
- package/dist/generated/programs/phygitalToken.d.ts.map +1 -0
- package/dist/generated/programs/phygitalToken.js +129 -0
- package/dist/generated/programs/phygitalToken.js.map +1 -0
- package/dist/generated/types/index.d.ts +2 -0
- package/dist/generated/types/index.d.ts.map +1 -0
- package/dist/generated/types/index.js +2 -0
- package/dist/generated/types/index.js.map +1 -0
- package/dist/generated/types/secp256r1Pubkey.d.ts +7 -0
- package/dist/generated/types/secp256r1Pubkey.d.ts.map +1 -0
- package/dist/generated/types/secp256r1Pubkey.js +11 -0
- package/dist/generated/types/secp256r1Pubkey.js.map +1 -0
- package/dist/generated/types/secp256r1VerifyArgs.d.ts +27 -0
- package/dist/generated/types/secp256r1VerifyArgs.d.ts.map +1 -0
- package/dist/generated/types/secp256r1VerifyArgs.js +24 -0
- package/dist/generated/types/secp256r1VerifyArgs.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/instructions/collection.d.ts +14 -0
- package/dist/instructions/collection.d.ts.map +1 -0
- package/dist/instructions/collection.js +59 -0
- package/dist/instructions/collection.js.map +1 -0
- package/dist/instructions/index.d.ts +2 -0
- package/dist/instructions/index.d.ts.map +1 -0
- package/dist/instructions/index.js +2 -0
- package/dist/instructions/index.js.map +1 -0
- package/dist/instructions/internal/secp256r1Verify.d.ts +29 -0
- package/dist/instructions/internal/secp256r1Verify.d.ts.map +1 -0
- package/dist/instructions/internal/secp256r1Verify.js +132 -0
- package/dist/instructions/internal/secp256r1Verify.js.map +1 -0
- package/dist/instructions/mint.d.ts +33 -0
- package/dist/instructions/mint.d.ts.map +1 -0
- package/dist/instructions/mint.js +74 -0
- package/dist/instructions/mint.js.map +1 -0
- package/dist/instructions/secp256r1Verify.d.ts +29 -0
- package/dist/instructions/secp256r1Verify.d.ts.map +1 -0
- package/dist/instructions/secp256r1Verify.js +132 -0
- package/dist/instructions/secp256r1Verify.js.map +1 -0
- package/dist/instructions/setLockState.d.ts +19 -0
- package/dist/instructions/setLockState.d.ts.map +1 -0
- package/dist/instructions/setLockState.js +17 -0
- package/dist/instructions/setLockState.js.map +1 -0
- package/dist/instructions/setTransferConfig.d.ts +25 -0
- package/dist/instructions/setTransferConfig.d.ts.map +1 -0
- package/dist/instructions/setTransferConfig.js +20 -0
- package/dist/instructions/setTransferConfig.js.map +1 -0
- package/dist/instructions/transfer.d.ts +17 -0
- package/dist/instructions/transfer.d.ts.map +1 -0
- package/dist/instructions/transfer.js +67 -0
- package/dist/instructions/transfer.js.map +1 -0
- package/dist/instructions/updateCounter.d.ts +15 -0
- package/dist/instructions/updateCounter.d.ts.map +1 -0
- package/dist/instructions/updateCounter.js +20 -0
- package/dist/instructions/updateCounter.js.map +1 -0
- package/dist/mint-metadata.d.ts +13 -0
- package/dist/mint-metadata.d.ts.map +1 -0
- package/dist/mint-metadata.js +127 -0
- package/dist/mint-metadata.js.map +1 -0
- package/dist/passkeys/index.d.ts +18 -0
- package/dist/passkeys/index.d.ts.map +1 -0
- package/dist/passkeys/index.js +30 -0
- package/dist/passkeys/index.js.map +1 -0
- package/dist/passkeys/internal.d.ts +15 -0
- package/dist/passkeys/internal.d.ts.map +1 -0
- package/dist/passkeys/internal.js +113 -0
- package/dist/passkeys/internal.js.map +1 -0
- package/dist/secp256r1.d.ts +24 -0
- package/dist/secp256r1.d.ts.map +1 -0
- package/dist/secp256r1.js +38 -0
- package/dist/secp256r1.js.map +1 -0
- package/dist/transfer.d.ts +28 -0
- package/dist/transfer.d.ts.map +1 -0
- package/dist/transfer.js +109 -0
- package/dist/transfer.js.map +1 -0
- package/dist/utils/associatedToken.d.ts +3 -0
- package/dist/utils/associatedToken.d.ts.map +1 -0
- package/dist/utils/associatedToken.js +14 -0
- package/dist/utils/associatedToken.js.map +1 -0
- package/dist/utils/consts.d.ts +8 -0
- package/dist/utils/consts.d.ts.map +1 -0
- package/dist/utils/consts.js +9 -0
- package/dist/utils/consts.js.map +1 -0
- package/dist/utils/encoding.d.ts +3 -0
- package/dist/utils/encoding.d.ts.map +1 -0
- package/dist/utils/encoding.js +14 -0
- package/dist/utils/encoding.js.map +1 -0
- package/dist/utils/metadata.d.ts +48 -0
- package/dist/utils/metadata.d.ts.map +1 -0
- package/dist/utils/metadata.js +110 -0
- package/dist/utils/metadata.js.map +1 -0
- package/dist/utils/passkey/index.d.ts +17 -0
- package/dist/utils/passkey/index.d.ts.map +1 -0
- package/dist/utils/passkey/index.js +21 -0
- package/dist/utils/passkey/index.js.map +1 -0
- package/dist/utils/passkey/internal.d.ts +11 -0
- package/dist/utils/passkey/internal.d.ts.map +1 -0
- package/dist/utils/passkey/internal.js +115 -0
- package/dist/utils/passkey/internal.js.map +1 -0
- package/dist/utils/passkey/secp256r1.d.ts +26 -0
- package/dist/utils/passkey/secp256r1.d.ts.map +1 -0
- package/dist/utils/passkey/secp256r1.js +59 -0
- package/dist/utils/passkey/secp256r1.js.map +1 -0
- package/dist/utils/pdas/asset.d.ts +4 -0
- package/dist/utils/pdas/asset.d.ts.map +1 -0
- package/dist/utils/pdas/asset.js +14 -0
- package/dist/utils/pdas/asset.js.map +1 -0
- package/dist/utils/pdas/domainConfig.d.ts +3 -0
- package/dist/utils/pdas/domainConfig.d.ts.map +1 -0
- package/dist/utils/pdas/domainConfig.js +15 -0
- package/dist/utils/pdas/domainConfig.js.map +1 -0
- package/dist/utils/pdas/index.d.ts +3 -0
- package/dist/utils/pdas/index.d.ts.map +1 -0
- package/dist/utils/pdas/index.js +3 -0
- package/dist/utils/pdas/index.js.map +1 -0
- package/dist/utils/slotHash.d.ts +9 -0
- package/dist/utils/slotHash.d.ts.map +1 -0
- package/dist/utils/slotHash.js +39 -0
- package/dist/utils/slotHash.js.map +1 -0
- package/dist/utils/tokenOwner.d.ts +7 -0
- package/dist/utils/tokenOwner.d.ts.map +1 -0
- package/dist/utils/tokenOwner.js +24 -0
- package/dist/utils/tokenOwner.js.map +1 -0
- package/dist/utils/verify.d.ts +8 -0
- package/dist/utils/verify.d.ts.map +1 -0
- package/dist/utils/verify.js +45 -0
- package/dist/utils/verify.js.map +1 -0
- package/dist/utils.d.ts +10 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +42 -0
- package/dist/utils.js.map +1 -0
- package/package.json +41 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { p256 } from "@noble/curves/nist.js";
|
|
2
|
+
import { sha256 } from "@noble/hashes/sha2.js";
|
|
3
|
+
export function uint8ArrayToHex(bytes) {
|
|
4
|
+
return Array.from(bytes)
|
|
5
|
+
.map((b) => b.toString(16).padStart(2, "0"))
|
|
6
|
+
.join("");
|
|
7
|
+
}
|
|
8
|
+
export function hexToUint8Array(hex) {
|
|
9
|
+
const bytes = new Uint8Array(hex.length / 2);
|
|
10
|
+
for (let i = 0; i < bytes.length; i += 1) {
|
|
11
|
+
bytes[i] = Number.parseInt(hex.slice(i * 2, i * 2 + 2), 16);
|
|
12
|
+
}
|
|
13
|
+
return bytes;
|
|
14
|
+
}
|
|
15
|
+
export function base64URLStringToBuffer(base64URLString) {
|
|
16
|
+
const base64 = base64URLString.replace(/-/g, "+").replace(/_/g, "/");
|
|
17
|
+
const padLength = (4 - (base64.length % 4)) % 4;
|
|
18
|
+
const padded = base64.padEnd(base64.length + padLength, "=");
|
|
19
|
+
const binary = atob(padded);
|
|
20
|
+
const buffer = new ArrayBuffer(binary.length);
|
|
21
|
+
const bytes = new Uint8Array(buffer);
|
|
22
|
+
for (let i = 0; i < binary.length; i += 1) {
|
|
23
|
+
bytes[i] = binary.charCodeAt(i);
|
|
24
|
+
}
|
|
25
|
+
return bytes;
|
|
26
|
+
}
|
|
27
|
+
export function extractAdditionalFields(clientData) {
|
|
28
|
+
const knownKeys = new Set(["type", "challenge", "origin", "crossOrigin"]);
|
|
29
|
+
const remaining = {};
|
|
30
|
+
for (const key in clientData) {
|
|
31
|
+
if (!knownKeys.has(key)) {
|
|
32
|
+
remaining[key] = clientData[key];
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
if (Object.keys(remaining).length === 0) {
|
|
36
|
+
return new Uint8Array();
|
|
37
|
+
}
|
|
38
|
+
const serialized = JSON.stringify(remaining);
|
|
39
|
+
return new Uint8Array(new TextEncoder().encode(serialized.slice(1, -1)));
|
|
40
|
+
}
|
|
41
|
+
export function parseOrigins(originsBytes, numOrigins) {
|
|
42
|
+
const origins = [];
|
|
43
|
+
let cursor = 0;
|
|
44
|
+
const decoder = new TextDecoder();
|
|
45
|
+
for (let i = 0; i < numOrigins; i += 1) {
|
|
46
|
+
if (cursor + 2 > originsBytes.length) {
|
|
47
|
+
throw new Error("MaxLengthExceeded");
|
|
48
|
+
}
|
|
49
|
+
const strLen = originsBytes[cursor] | (originsBytes[cursor + 1] << 8);
|
|
50
|
+
cursor += 2;
|
|
51
|
+
if (cursor + strLen > originsBytes.length) {
|
|
52
|
+
throw new Error("MaxLengthExceeded");
|
|
53
|
+
}
|
|
54
|
+
const strBytes = originsBytes.slice(cursor, cursor + strLen);
|
|
55
|
+
origins.push(decoder.decode(strBytes));
|
|
56
|
+
cursor += strLen;
|
|
57
|
+
}
|
|
58
|
+
return origins;
|
|
59
|
+
}
|
|
60
|
+
export function convertSignatureDERtoRS(signature) {
|
|
61
|
+
if (signature.length === 64) {
|
|
62
|
+
return signature;
|
|
63
|
+
}
|
|
64
|
+
if (signature[0] !== 0x30) {
|
|
65
|
+
throw new Error("Invalid DER sequence");
|
|
66
|
+
}
|
|
67
|
+
const totalLength = signature[1];
|
|
68
|
+
let offset = 2;
|
|
69
|
+
if (totalLength > 0x80) {
|
|
70
|
+
const lengthBytes = totalLength & 0x7f;
|
|
71
|
+
offset += lengthBytes;
|
|
72
|
+
}
|
|
73
|
+
if (signature[offset] !== 0x02) {
|
|
74
|
+
throw new Error("Expected INTEGER for r");
|
|
75
|
+
}
|
|
76
|
+
const rLen = signature[offset + 1];
|
|
77
|
+
const rStart = offset + 2;
|
|
78
|
+
const r = signature.slice(rStart, rStart + rLen);
|
|
79
|
+
offset = rStart + rLen;
|
|
80
|
+
if (signature[offset] !== 0x02) {
|
|
81
|
+
throw new Error("Expected INTEGER for s");
|
|
82
|
+
}
|
|
83
|
+
const sLen = signature[offset + 1];
|
|
84
|
+
const sStart = offset + 2;
|
|
85
|
+
const s = signature.slice(sStart, sStart + sLen);
|
|
86
|
+
const rStripped = r[0] === 0x00 && r.length > 32 ? r.slice(1) : r;
|
|
87
|
+
const sStripped = s[0] === 0x00 && s.length > 32 ? s.slice(1) : s;
|
|
88
|
+
if (rStripped.length > 32 || sStripped.length > 32) {
|
|
89
|
+
throw new Error("r or s length > 32 bytes");
|
|
90
|
+
}
|
|
91
|
+
const rPad = new Uint8Array(32);
|
|
92
|
+
rPad.set(rStripped, 32 - rStripped.length);
|
|
93
|
+
const HALF_ORDER = p256.Point.CURVE().n >> 1n;
|
|
94
|
+
const sBig = BigInt(`0x${uint8ArrayToHex(sStripped)}`);
|
|
95
|
+
const sLow = sBig > HALF_ORDER ? p256.Point.CURVE().n - sBig : sBig;
|
|
96
|
+
const sPad = hexToUint8Array(sLow.toString(16).padStart(64, "0"));
|
|
97
|
+
return new Uint8Array([...rPad, ...sPad]);
|
|
98
|
+
}
|
|
99
|
+
export function getSecp256r1Message(authResponse) {
|
|
100
|
+
const clientDataJSON = base64URLStringToBuffer(authResponse.response.clientDataJSON);
|
|
101
|
+
const authenticatorData = base64URLStringToBuffer(authResponse.response.authenticatorData);
|
|
102
|
+
const clientDataHash = sha256(clientDataJSON);
|
|
103
|
+
return new Uint8Array([...authenticatorData, ...clientDataHash]);
|
|
104
|
+
}
|
|
105
|
+
export function parseWebAuthnClientData(clientDataJSON) {
|
|
106
|
+
const parsed = JSON.parse(clientDataJSON);
|
|
107
|
+
return {
|
|
108
|
+
origin: String(parsed.origin),
|
|
109
|
+
crossOrigin: Boolean(parsed.crossOrigin),
|
|
110
|
+
truncatedClientDataJson: extractAdditionalFields(parsed),
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=internal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internal.js","sourceRoot":"","sources":["../../src/passkeys/internal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type Address, type Instruction } from "@solana/kit";
|
|
2
|
+
import { SECP256R1_PROGRAM_ADDRESS } from "./consts";
|
|
3
|
+
import type { AuthenticationResponseJSON } from "@simplewebauthn/browser";
|
|
4
|
+
import type { Rpc, SolanaRpcApi } from "@solana/kit";
|
|
5
|
+
export declare function buildTransferChallenge(input: {
|
|
6
|
+
tokenProgram: Address;
|
|
7
|
+
tokenMint: Address;
|
|
8
|
+
sender: Address;
|
|
9
|
+
recipient: Address;
|
|
10
|
+
slotHash: Uint8Array;
|
|
11
|
+
}): Promise<Uint8Array>;
|
|
12
|
+
export type WebAuthnSecp256r1Verification = {
|
|
13
|
+
secp256r1Verify: Instruction<typeof SECP256R1_PROGRAM_ADDRESS>;
|
|
14
|
+
originIndex: number;
|
|
15
|
+
crossOrigin: boolean;
|
|
16
|
+
truncatedClientDataJson: Uint8Array;
|
|
17
|
+
};
|
|
18
|
+
export declare function buildSecp256r1VerifyInstructionFromWebAuthn(input: {
|
|
19
|
+
rpc: Rpc<SolanaRpcApi>;
|
|
20
|
+
domainConfig: Address;
|
|
21
|
+
response: AuthenticationResponseJSON;
|
|
22
|
+
compressedPubkey: Uint8Array;
|
|
23
|
+
}): Promise<WebAuthnSecp256r1Verification>;
|
|
24
|
+
//# sourceMappingURL=secp256r1.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secp256r1.d.ts","sourceRoot":"","sources":["../src/secp256r1.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,OAAO,EACZ,KAAK,WAAW,EACjB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAC;AAMrD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAsBrD,wBAAsB,sBAAsB,CAAC,KAAK,EAAE;IAClD,YAAY,EAAE,OAAO,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,UAAU,CAAC;CACtB,GAAG,OAAO,CAAC,UAAU,CAAC,CAiBtB;AAED,MAAM,MAAM,6BAA6B,GAAG;IAC1C,eAAe,EAAE,WAAW,CAAC,OAAO,yBAAyB,CAAC,CAAC;IAC/D,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,uBAAuB,EAAE,UAAU,CAAC;CACrC,CAAC;AAEF,wBAAsB,2CAA2C,CAAC,KAAK,EAAE;IACvE,GAAG,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;IACvB,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,0BAA0B,CAAC;IACrC,gBAAgB,EAAE,UAAU,CAAC;CAC9B,GAAG,OAAO,CAAC,6BAA6B,CAAC,CAiBzC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { getAddressEncoder, getUtf8Encoder, } from "@solana/kit";
|
|
2
|
+
import { getSecp256r1VerifyInstruction } from "././instructions/secp256r1Verify.js";
|
|
3
|
+
import { buildSecp256r1VerifyInputFromWebAuthn, getOriginIndex, } from "././passkeys/index.js";
|
|
4
|
+
async function sha256(data) {
|
|
5
|
+
const copy = new Uint8Array(data);
|
|
6
|
+
return new Uint8Array(await crypto.subtle.digest("SHA-256", copy));
|
|
7
|
+
}
|
|
8
|
+
function concatBytes(...parts) {
|
|
9
|
+
const total = parts.reduce((sum, part) => sum + part.length, 0);
|
|
10
|
+
const out = new Uint8Array(total);
|
|
11
|
+
let offset = 0;
|
|
12
|
+
for (const part of parts) {
|
|
13
|
+
out.set(part, offset);
|
|
14
|
+
offset += part.length;
|
|
15
|
+
}
|
|
16
|
+
return out;
|
|
17
|
+
}
|
|
18
|
+
function encodeAddress(addressValue) {
|
|
19
|
+
return new Uint8Array(getAddressEncoder().encode(addressValue));
|
|
20
|
+
}
|
|
21
|
+
export async function buildTransferChallenge(input) {
|
|
22
|
+
const messageHash = await sha256(concatBytes(encodeAddress(input.tokenMint), encodeAddress(input.sender), encodeAddress(input.recipient)));
|
|
23
|
+
return sha256(concatBytes(new Uint8Array(getUtf8Encoder().encode("transfer")), encodeAddress(input.tokenProgram), messageHash, new Uint8Array(input.slotHash)));
|
|
24
|
+
}
|
|
25
|
+
export async function buildSecp256r1VerifyInstructionFromWebAuthn(input) {
|
|
26
|
+
const parsed = buildSecp256r1VerifyInputFromWebAuthn({
|
|
27
|
+
response: input.response,
|
|
28
|
+
compressedPubkey: input.compressedPubkey,
|
|
29
|
+
});
|
|
30
|
+
const originIndex = await getOriginIndex(input.rpc, input.domainConfig, parsed.origin);
|
|
31
|
+
return {
|
|
32
|
+
secp256r1Verify: getSecp256r1VerifyInstruction(parsed.verifyInput),
|
|
33
|
+
originIndex,
|
|
34
|
+
crossOrigin: parsed.crossOrigin,
|
|
35
|
+
truncatedClientDataJson: parsed.truncatedClientDataJson,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=secp256r1.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secp256r1.js","sourceRoot":"","sources":["../src/secp256r1.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,cAAc,GAGf,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,6BAA6B,EAAE,MAAM,gCAAgC,CAAC;AAC/E,OAAO,EACL,qCAAqC,EACrC,cAAc,GACf,MAAM,YAAY,CAAC;AAIpB,KAAK,UAAU,MAAM,CAAC,IAAgB;IACpC,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;IAClC,OAAO,IAAI,UAAU,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,WAAW,CAAC,GAAG,KAAmB;IACzC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAChE,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACtB,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC;IACxB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,aAAa,CAAC,YAAqB;IAC1C,OAAO,IAAI,UAAU,CAAC,iBAAiB,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,KAM5C;IACC,MAAM,WAAW,GAAG,MAAM,MAAM,CAC9B,WAAW,CACT,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,EAC9B,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,EAC3B,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,CAC/B,CACF,CAAC;IAEF,OAAO,MAAM,CACX,WAAW,CACT,IAAI,UAAU,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,EACnD,aAAa,CAAC,KAAK,CAAC,YAAY,CAAC,EACjC,WAAW,EACX,IAAI,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAC/B,CACF,CAAC;AACJ,CAAC;AASD,MAAM,CAAC,KAAK,UAAU,2CAA2C,CAAC,KAKjE;IACC,MAAM,MAAM,GAAG,qCAAqC,CAAC;QACnD,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;KACzC,CAAC,CAAC;IACH,MAAM,WAAW,GAAG,MAAM,cAAc,CACtC,KAAK,CAAC,GAAG,EACT,KAAK,CAAC,YAAY,EAClB,MAAM,CAAC,MAAM,CACd,CAAC;IAEF,OAAO;QACL,eAAe,EAAE,6BAA6B,CAAC,MAAM,CAAC,WAAW,CAAC;QAClE,WAAW;QACX,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,uBAAuB,EAAE,MAAM,CAAC,uBAAuB;KACxD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type AuthenticationResponseJSON } from "@simplewebauthn/browser";
|
|
2
|
+
import { type Address, type Instruction, type Rpc, type SolanaRpcApi, type TransactionSigner } from "@solana/kit";
|
|
3
|
+
import { type TransferMintContext } from "./mint-metadata";
|
|
4
|
+
export type TransferInput = {
|
|
5
|
+
rpc: Rpc<SolanaRpcApi>;
|
|
6
|
+
tokenMint: Address;
|
|
7
|
+
sender: Address;
|
|
8
|
+
recipient: TransactionSigner;
|
|
9
|
+
/** WebAuthn credential id from passkey registration. Defaults to the mint pubkey bytes. */
|
|
10
|
+
credentialId?: Uint8Array;
|
|
11
|
+
rpId?: string;
|
|
12
|
+
};
|
|
13
|
+
export declare function authenticateTransferPasskey(input: {
|
|
14
|
+
challenge: Uint8Array;
|
|
15
|
+
credentialId: Uint8Array;
|
|
16
|
+
rpId?: string;
|
|
17
|
+
}): Promise<AuthenticationResponseJSON>;
|
|
18
|
+
export declare function buildTransferInstructions(input: TransferInput & {
|
|
19
|
+
webauthnResponse: AuthenticationResponseJSON;
|
|
20
|
+
slotNumber: bigint;
|
|
21
|
+
mintContext: TransferMintContext;
|
|
22
|
+
}): Promise<Instruction[]>;
|
|
23
|
+
/**
|
|
24
|
+
* Prompts the NFT owner's passkey and returns the two instructions required for
|
|
25
|
+
* a transfer: secp256r1 verification followed by `execute_transfer`.
|
|
26
|
+
*/
|
|
27
|
+
export declare function transfer(input: TransferInput): Promise<Instruction[]>;
|
|
28
|
+
//# sourceMappingURL=transfer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transfer.d.ts","sourceRoot":"","sources":["../src/transfer.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,0BAA0B,EAChC,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAIL,KAAK,OAAO,EACZ,KAAK,WAAW,EAChB,KAAK,GAAG,EACR,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACvB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAEL,KAAK,mBAAmB,EACzB,MAAM,iBAAiB,CAAC;AAQzB,MAAM,MAAM,aAAa,GAAG;IAC1B,GAAG,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,iBAAiB,CAAC;IAC7B,2FAA2F;IAC3F,YAAY,CAAC,EAAE,UAAU,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAkBF,wBAAsB,2BAA2B,CAAC,KAAK,EAAE;IACvD,SAAS,EAAE,UAAU,CAAC;IACtB,YAAY,EAAE,UAAU,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAmBtC;AAED,wBAAsB,yBAAyB,CAC7C,KAAK,EAAE,aAAa,GAAG;IACrB,gBAAgB,EAAE,0BAA0B,CAAC;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,mBAAmB,CAAC;CAClC,GACA,OAAO,CAAC,WAAW,EAAE,CAAC,CA8ExB;AAED;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CA4B3E"}
|
package/dist/transfer.js
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { bufferToBase64URLString, startAuthentication, } from "@simplewebauthn/browser";
|
|
2
|
+
import { address, getAddressEncoder, getProgramDerivedAddress, } from "@solana/kit";
|
|
3
|
+
import { RP_ID, TOKEN_2022_PROGRAM_ADDRESS } from "././consts.js";
|
|
4
|
+
import { getExecuteTransferInstructionAsync } from "././generated/index.js";
|
|
5
|
+
import { resolveTransferMintContext, } from "././mint-metadata.js";
|
|
6
|
+
import { buildSecp256r1VerifyInstructionFromWebAuthn, buildTransferChallenge } from "././secp256r1.js";
|
|
7
|
+
import { getLatestSlotHash } from "././utils/index.js";
|
|
8
|
+
const ASSOCIATED_TOKEN_PROGRAM_ADDRESS = address("ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL");
|
|
9
|
+
async function findAssociatedTokenAddress(owner, mint, tokenProgram) {
|
|
10
|
+
const [ata] = await getProgramDerivedAddress({
|
|
11
|
+
programAddress: ASSOCIATED_TOKEN_PROGRAM_ADDRESS,
|
|
12
|
+
seeds: [
|
|
13
|
+
getAddressEncoder().encode(owner),
|
|
14
|
+
getAddressEncoder().encode(tokenProgram),
|
|
15
|
+
getAddressEncoder().encode(mint),
|
|
16
|
+
],
|
|
17
|
+
});
|
|
18
|
+
return ata;
|
|
19
|
+
}
|
|
20
|
+
export async function authenticateTransferPasskey(input) {
|
|
21
|
+
return startAuthentication({
|
|
22
|
+
optionsJSON: {
|
|
23
|
+
challenge: bufferToBase64URLString(new Uint8Array(input.challenge).buffer),
|
|
24
|
+
rpId: input.rpId ?? RP_ID,
|
|
25
|
+
userVerification: "preferred",
|
|
26
|
+
allowCredentials: [
|
|
27
|
+
{
|
|
28
|
+
id: bufferToBase64URLString(new Uint8Array(input.credentialId).buffer),
|
|
29
|
+
type: "public-key",
|
|
30
|
+
transports: ["nfc", "usb", "ble", "internal"],
|
|
31
|
+
},
|
|
32
|
+
],
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
export async function buildTransferInstructions(input) {
|
|
37
|
+
const tokenProgram = TOKEN_2022_PROGRAM_ADDRESS;
|
|
38
|
+
const recipientAddress = input.recipient.address;
|
|
39
|
+
const { secp256r1Verify, originIndex, crossOrigin, truncatedClientDataJson, } = await buildSecp256r1VerifyInstructionFromWebAuthn({
|
|
40
|
+
rpc: input.rpc,
|
|
41
|
+
domainConfig: input.mintContext.domainConfig,
|
|
42
|
+
response: input.webauthnResponse,
|
|
43
|
+
compressedPubkey: input.mintContext.secp256r1Pubkey,
|
|
44
|
+
});
|
|
45
|
+
const recipientTokenAccount = await findAssociatedTokenAddress(recipientAddress, input.tokenMint, tokenProgram);
|
|
46
|
+
let recipientPaymentTokenAccount;
|
|
47
|
+
let senderPaymentTokenAccount;
|
|
48
|
+
let groupOwnerPaymentTokenAccount;
|
|
49
|
+
let domainAuthorityPaymentTokenAccount;
|
|
50
|
+
let paymentTokenMint;
|
|
51
|
+
if (input.mintContext.transferPrice > 0n &&
|
|
52
|
+
input.mintContext.paymentTokenMint) {
|
|
53
|
+
paymentTokenMint = input.mintContext.paymentTokenMint;
|
|
54
|
+
recipientPaymentTokenAccount = await findAssociatedTokenAddress(recipientAddress, paymentTokenMint, tokenProgram);
|
|
55
|
+
senderPaymentTokenAccount = await findAssociatedTokenAddress(input.sender, paymentTokenMint, tokenProgram);
|
|
56
|
+
groupOwnerPaymentTokenAccount = await findAssociatedTokenAddress(input.mintContext.groupOwner, paymentTokenMint, tokenProgram);
|
|
57
|
+
domainAuthorityPaymentTokenAccount = await findAssociatedTokenAddress(input.mintContext.domainAuthority, paymentTokenMint, tokenProgram);
|
|
58
|
+
}
|
|
59
|
+
const executeTransfer = await getExecuteTransferInstructionAsync({
|
|
60
|
+
recipient: input.recipient,
|
|
61
|
+
sender: input.sender,
|
|
62
|
+
tokenMint: input.tokenMint,
|
|
63
|
+
groupMint: input.mintContext.groupMint,
|
|
64
|
+
domainConfig: input.mintContext.domainConfig,
|
|
65
|
+
recipientTokenAccount,
|
|
66
|
+
groupOwner: input.mintContext.groupOwner,
|
|
67
|
+
domainAuthority: input.mintContext.domainAuthority,
|
|
68
|
+
recipientPaymentTokenAccount,
|
|
69
|
+
senderPaymentTokenAccount,
|
|
70
|
+
groupOwnerPaymentTokenAccount,
|
|
71
|
+
domainAuthorityPaymentTokenAccount,
|
|
72
|
+
paymentTokenMint,
|
|
73
|
+
tokenProgram,
|
|
74
|
+
signedMessageIndex: 0,
|
|
75
|
+
slotNumber: input.slotNumber,
|
|
76
|
+
originIndex,
|
|
77
|
+
crossOrigin,
|
|
78
|
+
truncatedClientDataJson,
|
|
79
|
+
});
|
|
80
|
+
return [secp256r1Verify, executeTransfer];
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Prompts the NFT owner's passkey and returns the two instructions required for
|
|
84
|
+
* a transfer: secp256r1 verification followed by `execute_transfer`.
|
|
85
|
+
*/
|
|
86
|
+
export async function transfer(input) {
|
|
87
|
+
const tokenProgram = TOKEN_2022_PROGRAM_ADDRESS;
|
|
88
|
+
const mintContext = await resolveTransferMintContext(input.rpc, input.tokenMint);
|
|
89
|
+
const { slotHash, slotNumber } = await getLatestSlotHash(input.rpc);
|
|
90
|
+
const challenge = await buildTransferChallenge({
|
|
91
|
+
tokenProgram,
|
|
92
|
+
tokenMint: input.tokenMint,
|
|
93
|
+
sender: input.sender,
|
|
94
|
+
recipient: input.recipient.address,
|
|
95
|
+
slotHash,
|
|
96
|
+
});
|
|
97
|
+
const webauthnResponse = await authenticateTransferPasskey({
|
|
98
|
+
challenge,
|
|
99
|
+
credentialId: input.credentialId ?? mintContext.secp256r1Pubkey,
|
|
100
|
+
rpId: input.rpId ?? RP_ID,
|
|
101
|
+
});
|
|
102
|
+
return buildTransferInstructions({
|
|
103
|
+
...input,
|
|
104
|
+
mintContext,
|
|
105
|
+
webauthnResponse,
|
|
106
|
+
slotNumber,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=transfer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transfer.js","sourceRoot":"","sources":["../src/transfer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"associatedToken.d.ts","sourceRoot":"","sources":["../../src/utils/associatedToken.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,OAAO,EACb,MAAM,aAAa,CAAC;AAGrB,wBAAsB,0BAA0B,CAC9C,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,OAAO,EACb,YAAY,EAAE,OAAO,GACpB,OAAO,CAAC,OAAO,CAAC,CAUlB"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { getAddressEncoder, getProgramDerivedAddress, } from "@solana/kit";
|
|
2
|
+
import { ASSOCIATED_TOKEN_PROGRAM_ADDRESS } from "./consts.js";
|
|
3
|
+
export async function findAssociatedTokenAddress(owner, mint, tokenProgram) {
|
|
4
|
+
const [ata] = await getProgramDerivedAddress({
|
|
5
|
+
programAddress: ASSOCIATED_TOKEN_PROGRAM_ADDRESS,
|
|
6
|
+
seeds: [
|
|
7
|
+
getAddressEncoder().encode(owner),
|
|
8
|
+
getAddressEncoder().encode(tokenProgram),
|
|
9
|
+
getAddressEncoder().encode(mint),
|
|
10
|
+
],
|
|
11
|
+
});
|
|
12
|
+
return ata;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=associatedToken.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"associatedToken.js","sourceRoot":"","sources":["../../src/utils/associatedToken.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,wBAAwB,GAEzB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,gCAAgC,EAAE,MAAM,aAAa,CAAC;AAE/D,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,KAAc,EACd,IAAa,EACb,YAAqB;IAErB,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,wBAAwB,CAAC;QAC3C,cAAc,EAAE,gCAAgC;QAChD,KAAK,EAAE;YACL,iBAAiB,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC;YACjC,iBAAiB,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC;YACxC,iBAAiB,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC;SACjC;KACF,CAAC,CAAC;IACH,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare const RP_ID = "revibase.com";
|
|
2
|
+
export declare const TOKEN_2022_PROGRAM_ADDRESS: import("@solana/kit").Address<"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb">;
|
|
3
|
+
export declare const ASSOCIATED_TOKEN_PROGRAM_ADDRESS: import("@solana/kit").Address<"ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL">;
|
|
4
|
+
export declare const SECP256R1_PROGRAM_ADDRESS: import("@solana/kit").Address<"Secp256r1SigVerify1111111111111111111111111">;
|
|
5
|
+
export declare const TRANSFER_HOOK_PROGRAM_ADDRESS: import("@solana/kit").Address<"FCBG7gTThZ9hg4axra4UqWBerBhdjhdBLqxD1jicg84G">;
|
|
6
|
+
export declare const SLOT_HASHES_SYSVAR_ADDRESS: import("@solana/kit").Address<"SysvarS1otHashes111111111111111111111111111">;
|
|
7
|
+
export declare const TRANSFER_ACTION_BYTES: Uint8Array<ArrayBuffer>;
|
|
8
|
+
//# sourceMappingURL=consts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consts.d.ts","sourceRoot":"","sources":["../../src/utils/consts.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,KAAK,iBAAiB,CAAC;AAEpC,eAAO,MAAM,0BAA0B,8EAEtC,CAAC;AAEF,eAAO,MAAM,gCAAgC,+EAE5C,CAAC;AAEF,eAAO,MAAM,yBAAyB,8EAErC,CAAC;AAEF,eAAO,MAAM,6BAA6B,+EAEzC,CAAC;AAEF,eAAO,MAAM,0BAA0B,8EAEtC,CAAC;AAEF,eAAO,MAAM,qBAAqB,yBAAuC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { address } from "@solana/kit";
|
|
2
|
+
export const RP_ID = "revibase.com";
|
|
3
|
+
export const TOKEN_2022_PROGRAM_ADDRESS = address("TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb");
|
|
4
|
+
export const ASSOCIATED_TOKEN_PROGRAM_ADDRESS = address("ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL");
|
|
5
|
+
export const SECP256R1_PROGRAM_ADDRESS = address("Secp256r1SigVerify1111111111111111111111111");
|
|
6
|
+
export const TRANSFER_HOOK_PROGRAM_ADDRESS = address("FCBG7gTThZ9hg4axra4UqWBerBhdjhdBLqxD1jicg84G");
|
|
7
|
+
export const SLOT_HASHES_SYSVAR_ADDRESS = address("SysvarS1otHashes111111111111111111111111111");
|
|
8
|
+
export const TRANSFER_ACTION_BYTES = new TextEncoder().encode("transfer");
|
|
9
|
+
//# sourceMappingURL=consts.js.map
|
|
@@ -0,0 +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,KAAK,GAAG,cAAc,CAAC;AAEpC,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,6BAA6B,GAAG,OAAO,CAClD,8CAA8C,CAC/C,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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encoding.d.ts","sourceRoot":"","sources":["../../src/utils/encoding.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,wBAAgB,uBAAuB,CAAC,eAAe,EAAE,MAAM,GAAG,UAAU,CAW3E"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** Decodes a base64url (or base64) string into raw bytes. */
|
|
2
|
+
export function base64URLStringToBuffer(base64URLString) {
|
|
3
|
+
const base64 = base64URLString.replace(/-/g, "+").replace(/_/g, "/");
|
|
4
|
+
const padLength = (4 - (base64.length % 4)) % 4;
|
|
5
|
+
const padded = base64.padEnd(base64.length + padLength, "=");
|
|
6
|
+
const binary = atob(padded);
|
|
7
|
+
const buffer = new ArrayBuffer(binary.length);
|
|
8
|
+
const bytes = new Uint8Array(buffer);
|
|
9
|
+
for (let i = 0; i < binary.length; i += 1) {
|
|
10
|
+
bytes[i] = binary.charCodeAt(i);
|
|
11
|
+
}
|
|
12
|
+
return bytes;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=encoding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encoding.js","sourceRoot":"","sources":["../../src/utils/encoding.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,MAAM,UAAU,uBAAuB,CAAC,eAAuB;IAC7D,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACrE,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,SAAS,EAAE,GAAG,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { type Address, type Rpc, type SolanaRpcApi } from "@solana/kit";
|
|
2
|
+
export declare const DEFAULT_VERIFY_METADATA_ENDPOINT = "https://revibase.com/api/metadata";
|
|
3
|
+
export type VerifyMetadataResult = {
|
|
4
|
+
publicKey: string;
|
|
5
|
+
isVerified: boolean;
|
|
6
|
+
counter: number;
|
|
7
|
+
};
|
|
8
|
+
export type VerifyMetadataCallback = (params: URLSearchParams) => Promise<VerifyMetadataResult>;
|
|
9
|
+
type AssetAttribute = {
|
|
10
|
+
traitType: string;
|
|
11
|
+
value: string;
|
|
12
|
+
};
|
|
13
|
+
export type TokenJsonMetadata = {
|
|
14
|
+
name?: string;
|
|
15
|
+
symbol?: string;
|
|
16
|
+
image?: string;
|
|
17
|
+
description?: string;
|
|
18
|
+
mint?: string;
|
|
19
|
+
attributes?: Array<{
|
|
20
|
+
trait_type?: string;
|
|
21
|
+
traitType?: string;
|
|
22
|
+
value?: string | number;
|
|
23
|
+
}>;
|
|
24
|
+
};
|
|
25
|
+
export declare function verifyMetadata(uri: string, params: URLSearchParams): Promise<VerifyMetadataResult>;
|
|
26
|
+
export type AssetDisplayInfo = {
|
|
27
|
+
publicKey: string;
|
|
28
|
+
asset: Address;
|
|
29
|
+
domainConfig: Address;
|
|
30
|
+
isLocked: boolean | null;
|
|
31
|
+
mint: Address;
|
|
32
|
+
name: string;
|
|
33
|
+
symbol: string;
|
|
34
|
+
uri: string;
|
|
35
|
+
image: string | null;
|
|
36
|
+
description: string | null;
|
|
37
|
+
attributes: AssetAttribute[];
|
|
38
|
+
collectionMint: Address | null;
|
|
39
|
+
collectionName: string | null;
|
|
40
|
+
collectionSymbol: string | null;
|
|
41
|
+
collectionImage: string | null;
|
|
42
|
+
collectionUri: string | null;
|
|
43
|
+
currentOwner: Address;
|
|
44
|
+
lastTransferSlot: bigint;
|
|
45
|
+
};
|
|
46
|
+
export declare function fetchAssetDisplayInfo(rpc: Rpc<SolanaRpcApi>, publicKey: string): Promise<AssetDisplayInfo>;
|
|
47
|
+
export {};
|
|
48
|
+
//# sourceMappingURL=metadata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/utils/metadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,OAAO,EACZ,KAAK,GAAG,EACR,KAAK,YAAY,EAClB,MAAM,aAAa,CAAC;AAWrB,eAAO,MAAM,gCAAgC,sCAAkC,CAAC;AAEhF,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,CACnC,MAAM,EAAE,eAAe,KACpB,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAsBnC,KAAK,cAAc,GAAG;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,KAAK,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;KACzB,CAAC,CAAC;CACJ,CAAC;AA2BF,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,oBAAoB,CAAC,CAe/B;AAmBD,MAAM,MAAM,gBAAgB,GAAG;IAE7B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;IACf,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IAEzB,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IAEf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,cAAc,EAAE,CAAC;IAE7B,cAAc,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,OAAO,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,GAAG,CAAC,YAAY,CAAC,EACtB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,gBAAgB,CAAC,CAkD3B"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { unwrapOption, } from "@solana/kit";
|
|
2
|
+
import { fetchMint, isExtension, } from "@solana-program/token-2022";
|
|
3
|
+
import { parseSecp256r1Pubkey } from "../instructions/mint.js";
|
|
4
|
+
import { findAssetPda } from "./pdas/asset.js";
|
|
5
|
+
import { RP_ID } from "./consts.js";
|
|
6
|
+
import { fetchAsset } from "../generated/index.js";
|
|
7
|
+
export const DEFAULT_VERIFY_METADATA_ENDPOINT = `https://${RP_ID}/api/metadata`;
|
|
8
|
+
function findMintExtension(extensions, kind) {
|
|
9
|
+
for (const extension of extensions) {
|
|
10
|
+
if (isExtension(kind, extension)) {
|
|
11
|
+
return extension;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
function parseAssetAttributes(raw) {
|
|
17
|
+
if (!raw?.length) {
|
|
18
|
+
return [];
|
|
19
|
+
}
|
|
20
|
+
return raw
|
|
21
|
+
.map((attribute) => {
|
|
22
|
+
const traitType = attribute.trait_type ?? attribute.traitType;
|
|
23
|
+
if (!traitType ||
|
|
24
|
+
attribute.value === undefined ||
|
|
25
|
+
attribute.value === null) {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
traitType,
|
|
30
|
+
value: String(attribute.value),
|
|
31
|
+
};
|
|
32
|
+
})
|
|
33
|
+
.filter((attribute) => attribute !== null);
|
|
34
|
+
}
|
|
35
|
+
export async function verifyMetadata(uri, params) {
|
|
36
|
+
try {
|
|
37
|
+
const url = new URL(uri);
|
|
38
|
+
for (const [key, value] of params.entries()) {
|
|
39
|
+
url.searchParams.set(key, value);
|
|
40
|
+
}
|
|
41
|
+
const response = await fetch(`${url.toString()}`);
|
|
42
|
+
if (!response.ok) {
|
|
43
|
+
const error = (await response.json());
|
|
44
|
+
throw new Error(error.error);
|
|
45
|
+
}
|
|
46
|
+
return (await response.json());
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
throw error;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
async function fetchJsonMetadata(uri) {
|
|
53
|
+
if (!uri) {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
const response = await fetch(uri);
|
|
58
|
+
if (!response.ok) {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
return (await response.json());
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
export async function fetchAssetDisplayInfo(rpc, publicKey) {
|
|
68
|
+
const asset = await findAssetPda(parseSecp256r1Pubkey(publicKey));
|
|
69
|
+
const instance = await fetchAsset(rpc, asset);
|
|
70
|
+
const mintAccount = await fetchMint(rpc, instance.data.mint);
|
|
71
|
+
const designExtensions = unwrapOption(mintAccount.data.extensions) ?? [];
|
|
72
|
+
const designMeta = findMintExtension(designExtensions, "TokenMetadata");
|
|
73
|
+
const groupMember = findMintExtension(designExtensions, "TokenGroupMember");
|
|
74
|
+
const collectionMint = groupMember?.group ?? null;
|
|
75
|
+
let collectionMeta = null;
|
|
76
|
+
if (collectionMint) {
|
|
77
|
+
const collectionMintAccount = await fetchMint(rpc, collectionMint);
|
|
78
|
+
const collectionExtensions = unwrapOption(collectionMintAccount.data.extensions) ?? [];
|
|
79
|
+
collectionMeta = findMintExtension(collectionExtensions, "TokenMetadata");
|
|
80
|
+
}
|
|
81
|
+
const [designJsonMeta, collectionJsonMeta] = await Promise.all([
|
|
82
|
+
designMeta?.uri ? fetchJsonMetadata(designMeta.uri) : Promise.resolve(null),
|
|
83
|
+
collectionMeta?.uri
|
|
84
|
+
? fetchJsonMetadata(collectionMeta.uri)
|
|
85
|
+
: Promise.resolve(null),
|
|
86
|
+
]);
|
|
87
|
+
return {
|
|
88
|
+
publicKey,
|
|
89
|
+
asset: asset,
|
|
90
|
+
domainConfig: instance.data.domainConfig,
|
|
91
|
+
isLocked: instance.data.isLocked.__option === "Some"
|
|
92
|
+
? instance.data.isLocked.value
|
|
93
|
+
: null,
|
|
94
|
+
mint: instance.data.mint,
|
|
95
|
+
name: designMeta?.name ?? designJsonMeta?.name ?? "Unknown asset",
|
|
96
|
+
symbol: designMeta?.symbol ?? designJsonMeta?.symbol ?? "",
|
|
97
|
+
uri: designMeta?.uri ?? "",
|
|
98
|
+
image: designJsonMeta?.image ?? null,
|
|
99
|
+
description: designJsonMeta?.description ?? null,
|
|
100
|
+
attributes: parseAssetAttributes(designJsonMeta?.attributes),
|
|
101
|
+
collectionMint,
|
|
102
|
+
collectionName: collectionMeta?.name ?? collectionJsonMeta?.name ?? null,
|
|
103
|
+
collectionSymbol: collectionMeta?.symbol ?? collectionJsonMeta?.symbol ?? null,
|
|
104
|
+
collectionImage: collectionJsonMeta?.image ?? null,
|
|
105
|
+
collectionUri: collectionMeta?.uri ?? null,
|
|
106
|
+
currentOwner: instance.data.owner,
|
|
107
|
+
lastTransferSlot: instance.data.lastTransferSlot,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/utils/metadata.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { AuthenticationResponseJSON } from "@simplewebauthn/browser";
|
|
2
|
+
export { base64URLStringToBuffer, convertSignatureDERtoRS, extractAdditionalFields, getSecp256r1Message, parseWebAuthnClientData, } from "./internal";
|
|
3
|
+
export { buildTransferChallenge, buildTransferMessageHash, } from "./secp256r1";
|
|
4
|
+
export declare function buildSecp256r1VerifyInputFromWebAuthn(input: {
|
|
5
|
+
response: AuthenticationResponseJSON;
|
|
6
|
+
compressedPubkey: Uint8Array;
|
|
7
|
+
}): {
|
|
8
|
+
verifyInput: {
|
|
9
|
+
publicKey: Uint8Array<ArrayBufferLike>;
|
|
10
|
+
signature: Uint8Array<ArrayBufferLike>;
|
|
11
|
+
message: Uint8Array<ArrayBufferLike>;
|
|
12
|
+
}[];
|
|
13
|
+
crossOrigin: boolean;
|
|
14
|
+
truncatedClientDataJson: Uint8Array<ArrayBuffer>;
|
|
15
|
+
origin: string;
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/passkey/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAS1E,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,uBAAuB,EACvB,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,aAAa,CAAC;AAGrB,wBAAgB,qCAAqC,CAAC,KAAK,EAAE;IAC3D,QAAQ,EAAE,0BAA0B,CAAC;IACrC,gBAAgB,EAAE,UAAU,CAAC;CAC9B;;;;;;;;;EAqBA"}
|