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.
Files changed (257) hide show
  1. package/dist/__tests__/card-instance.test.d.ts +2 -0
  2. package/dist/__tests__/card-instance.test.d.ts.map +1 -0
  3. package/dist/__tests__/card-instance.test.js +38 -0
  4. package/dist/__tests__/card-instance.test.js.map +1 -0
  5. package/dist/__tests__/crypto-parity.test.d.ts +2 -0
  6. package/dist/__tests__/crypto-parity.test.d.ts.map +1 -0
  7. package/dist/__tests__/crypto-parity.test.js +60 -0
  8. package/dist/__tests__/crypto-parity.test.js.map +1 -0
  9. package/dist/__tests__/low-s-normalization.test.d.ts +2 -0
  10. package/dist/__tests__/low-s-normalization.test.d.ts.map +1 -0
  11. package/dist/__tests__/low-s-normalization.test.js +44 -0
  12. package/dist/__tests__/low-s-normalization.test.js.map +1 -0
  13. package/dist/__tests__/metadata-limits.test.d.ts +2 -0
  14. package/dist/__tests__/metadata-limits.test.d.ts.map +1 -0
  15. package/dist/__tests__/metadata-limits.test.js +33 -0
  16. package/dist/__tests__/metadata-limits.test.js.map +1 -0
  17. package/dist/consts.d.ts +19 -0
  18. package/dist/consts.d.ts.map +1 -0
  19. package/dist/consts.js +19 -0
  20. package/dist/consts.js.map +1 -0
  21. package/dist/generated/accounts/asset.d.ts +28 -0
  22. package/dist/generated/accounts/asset.d.ts.map +1 -0
  23. package/dist/generated/accounts/asset.js +52 -0
  24. package/dist/generated/accounts/asset.js.map +1 -0
  25. package/dist/generated/accounts/cardInstance.d.ts +35 -0
  26. package/dist/generated/accounts/cardInstance.d.ts.map +1 -0
  27. package/dist/generated/accounts/cardInstance.js +61 -0
  28. package/dist/generated/accounts/cardInstance.js.map +1 -0
  29. package/dist/generated/accounts/domainConfig.d.ts +28 -0
  30. package/dist/generated/accounts/domainConfig.d.ts.map +1 -0
  31. package/dist/generated/accounts/domainConfig.js +58 -0
  32. package/dist/generated/accounts/domainConfig.js.map +1 -0
  33. package/dist/generated/accounts/index.d.ts +3 -0
  34. package/dist/generated/accounts/index.d.ts.map +1 -0
  35. package/dist/generated/accounts/index.js +3 -0
  36. package/dist/generated/accounts/index.js.map +1 -0
  37. package/dist/generated/errors/index.d.ts +2 -0
  38. package/dist/generated/errors/index.d.ts.map +1 -0
  39. package/dist/generated/errors/index.js +2 -0
  40. package/dist/generated/errors/index.js.map +1 -0
  41. package/dist/generated/errors/phygitalNfts.d.ts +62 -0
  42. package/dist/generated/errors/phygitalNfts.d.ts.map +1 -0
  43. package/dist/generated/errors/phygitalNfts.js +87 -0
  44. package/dist/generated/errors/phygitalNfts.js.map +1 -0
  45. package/dist/generated/errors/phygitalToken.d.ts +34 -0
  46. package/dist/generated/errors/phygitalToken.d.ts.map +1 -0
  47. package/dist/generated/errors/phygitalToken.js +59 -0
  48. package/dist/generated/errors/phygitalToken.js.map +1 -0
  49. package/dist/generated/index.d.ts +7 -0
  50. package/dist/generated/index.d.ts.map +1 -0
  51. package/dist/generated/index.js +7 -0
  52. package/dist/generated/index.js.map +1 -0
  53. package/dist/generated/instructions/createCollectionMint.d.ts +108 -0
  54. package/dist/generated/instructions/createCollectionMint.d.ts.map +1 -0
  55. package/dist/generated/instructions/createCollectionMint.js +175 -0
  56. package/dist/generated/instructions/createCollectionMint.js.map +1 -0
  57. package/dist/generated/instructions/createDesignMint.d.ts +97 -0
  58. package/dist/generated/instructions/createDesignMint.d.ts.map +1 -0
  59. package/dist/generated/instructions/createDesignMint.js +164 -0
  60. package/dist/generated/instructions/createDesignMint.js.map +1 -0
  61. package/dist/generated/instructions/createDomainConfig.d.ts +46 -0
  62. package/dist/generated/instructions/createDomainConfig.d.ts.map +1 -0
  63. package/dist/generated/instructions/createDomainConfig.js +83 -0
  64. package/dist/generated/instructions/createDomainConfig.js.map +1 -0
  65. package/dist/generated/instructions/createGroupToken.d.ts +94 -0
  66. package/dist/generated/instructions/createGroupToken.d.ts.map +1 -0
  67. package/dist/generated/instructions/createGroupToken.js +150 -0
  68. package/dist/generated/instructions/createGroupToken.js.map +1 -0
  69. package/dist/generated/instructions/createMint.d.ts +77 -0
  70. package/dist/generated/instructions/createMint.d.ts.map +1 -0
  71. package/dist/generated/instructions/createMint.js +149 -0
  72. package/dist/generated/instructions/createMint.js.map +1 -0
  73. package/dist/generated/instructions/createToken.d.ts +88 -0
  74. package/dist/generated/instructions/createToken.d.ts.map +1 -0
  75. package/dist/generated/instructions/createToken.js +182 -0
  76. package/dist/generated/instructions/createToken.js.map +1 -0
  77. package/dist/generated/instructions/editDomainConfig.d.ts +50 -0
  78. package/dist/generated/instructions/editDomainConfig.d.ts.map +1 -0
  79. package/dist/generated/instructions/editDomainConfig.js +90 -0
  80. package/dist/generated/instructions/editDomainConfig.js.map +1 -0
  81. package/dist/generated/instructions/executeTransfer.d.ts +109 -0
  82. package/dist/generated/instructions/executeTransfer.d.ts.map +1 -0
  83. package/dist/generated/instructions/executeTransfer.js +243 -0
  84. package/dist/generated/instructions/executeTransfer.js.map +1 -0
  85. package/dist/generated/instructions/index.d.ts +7 -0
  86. package/dist/generated/instructions/index.d.ts.map +1 -0
  87. package/dist/generated/instructions/index.js +7 -0
  88. package/dist/generated/instructions/index.js.map +1 -0
  89. package/dist/generated/instructions/mintToken.d.ts +78 -0
  90. package/dist/generated/instructions/mintToken.d.ts.map +1 -0
  91. package/dist/generated/instructions/mintToken.js +167 -0
  92. package/dist/generated/instructions/mintToken.js.map +1 -0
  93. package/dist/generated/instructions/setLockState.d.ts +37 -0
  94. package/dist/generated/instructions/setLockState.d.ts.map +1 -0
  95. package/dist/generated/instructions/setLockState.js +62 -0
  96. package/dist/generated/instructions/setLockState.js.map +1 -0
  97. package/dist/generated/instructions/setTransferConfig.d.ts +88 -0
  98. package/dist/generated/instructions/setTransferConfig.d.ts.map +1 -0
  99. package/dist/generated/instructions/setTransferConfig.js +188 -0
  100. package/dist/generated/instructions/setTransferConfig.js.map +1 -0
  101. package/dist/generated/instructions/updateCounter.d.ts +45 -0
  102. package/dist/generated/instructions/updateCounter.d.ts.map +1 -0
  103. package/dist/generated/instructions/updateCounter.js +84 -0
  104. package/dist/generated/instructions/updateCounter.js.map +1 -0
  105. package/dist/generated/instructions/updateDomainConfig.d.ts +43 -0
  106. package/dist/generated/instructions/updateDomainConfig.d.ts.map +1 -0
  107. package/dist/generated/instructions/updateDomainConfig.js +81 -0
  108. package/dist/generated/instructions/updateDomainConfig.js.map +1 -0
  109. package/dist/generated/pdas/index.d.ts +2 -0
  110. package/dist/generated/pdas/index.d.ts.map +1 -0
  111. package/dist/generated/pdas/index.js +2 -0
  112. package/dist/generated/pdas/index.js.map +1 -0
  113. package/dist/generated/pdas/programAuthority.d.ts +5 -0
  114. package/dist/generated/pdas/programAuthority.d.ts.map +1 -0
  115. package/dist/generated/pdas/programAuthority.js +14 -0
  116. package/dist/generated/pdas/programAuthority.js.map +1 -0
  117. package/dist/generated/programs/index.d.ts +2 -0
  118. package/dist/generated/programs/index.d.ts.map +1 -0
  119. package/dist/generated/programs/index.js +2 -0
  120. package/dist/generated/programs/index.js.map +1 -0
  121. package/dist/generated/programs/phygitalNfts.d.ts +72 -0
  122. package/dist/generated/programs/phygitalNfts.d.ts.map +1 -0
  123. package/dist/generated/programs/phygitalNfts.js +136 -0
  124. package/dist/generated/programs/phygitalNfts.js.map +1 -0
  125. package/dist/generated/programs/phygitalToken.d.ts +65 -0
  126. package/dist/generated/programs/phygitalToken.d.ts.map +1 -0
  127. package/dist/generated/programs/phygitalToken.js +129 -0
  128. package/dist/generated/programs/phygitalToken.js.map +1 -0
  129. package/dist/generated/types/index.d.ts +2 -0
  130. package/dist/generated/types/index.d.ts.map +1 -0
  131. package/dist/generated/types/index.js +2 -0
  132. package/dist/generated/types/index.js.map +1 -0
  133. package/dist/generated/types/secp256r1Pubkey.d.ts +7 -0
  134. package/dist/generated/types/secp256r1Pubkey.d.ts.map +1 -0
  135. package/dist/generated/types/secp256r1Pubkey.js +11 -0
  136. package/dist/generated/types/secp256r1Pubkey.js.map +1 -0
  137. package/dist/generated/types/secp256r1VerifyArgs.d.ts +27 -0
  138. package/dist/generated/types/secp256r1VerifyArgs.d.ts.map +1 -0
  139. package/dist/generated/types/secp256r1VerifyArgs.js +24 -0
  140. package/dist/generated/types/secp256r1VerifyArgs.js.map +1 -0
  141. package/dist/index.d.ts +7 -0
  142. package/dist/index.d.ts.map +1 -0
  143. package/dist/index.js +7 -0
  144. package/dist/index.js.map +1 -0
  145. package/dist/instructions/collection.d.ts +14 -0
  146. package/dist/instructions/collection.d.ts.map +1 -0
  147. package/dist/instructions/collection.js +59 -0
  148. package/dist/instructions/collection.js.map +1 -0
  149. package/dist/instructions/index.d.ts +2 -0
  150. package/dist/instructions/index.d.ts.map +1 -0
  151. package/dist/instructions/index.js +2 -0
  152. package/dist/instructions/index.js.map +1 -0
  153. package/dist/instructions/internal/secp256r1Verify.d.ts +29 -0
  154. package/dist/instructions/internal/secp256r1Verify.d.ts.map +1 -0
  155. package/dist/instructions/internal/secp256r1Verify.js +132 -0
  156. package/dist/instructions/internal/secp256r1Verify.js.map +1 -0
  157. package/dist/instructions/mint.d.ts +33 -0
  158. package/dist/instructions/mint.d.ts.map +1 -0
  159. package/dist/instructions/mint.js +74 -0
  160. package/dist/instructions/mint.js.map +1 -0
  161. package/dist/instructions/secp256r1Verify.d.ts +29 -0
  162. package/dist/instructions/secp256r1Verify.d.ts.map +1 -0
  163. package/dist/instructions/secp256r1Verify.js +132 -0
  164. package/dist/instructions/secp256r1Verify.js.map +1 -0
  165. package/dist/instructions/setLockState.d.ts +19 -0
  166. package/dist/instructions/setLockState.d.ts.map +1 -0
  167. package/dist/instructions/setLockState.js +17 -0
  168. package/dist/instructions/setLockState.js.map +1 -0
  169. package/dist/instructions/setTransferConfig.d.ts +25 -0
  170. package/dist/instructions/setTransferConfig.d.ts.map +1 -0
  171. package/dist/instructions/setTransferConfig.js +20 -0
  172. package/dist/instructions/setTransferConfig.js.map +1 -0
  173. package/dist/instructions/transfer.d.ts +17 -0
  174. package/dist/instructions/transfer.d.ts.map +1 -0
  175. package/dist/instructions/transfer.js +67 -0
  176. package/dist/instructions/transfer.js.map +1 -0
  177. package/dist/instructions/updateCounter.d.ts +15 -0
  178. package/dist/instructions/updateCounter.d.ts.map +1 -0
  179. package/dist/instructions/updateCounter.js +20 -0
  180. package/dist/instructions/updateCounter.js.map +1 -0
  181. package/dist/mint-metadata.d.ts +13 -0
  182. package/dist/mint-metadata.d.ts.map +1 -0
  183. package/dist/mint-metadata.js +127 -0
  184. package/dist/mint-metadata.js.map +1 -0
  185. package/dist/passkeys/index.d.ts +18 -0
  186. package/dist/passkeys/index.d.ts.map +1 -0
  187. package/dist/passkeys/index.js +30 -0
  188. package/dist/passkeys/index.js.map +1 -0
  189. package/dist/passkeys/internal.d.ts +15 -0
  190. package/dist/passkeys/internal.d.ts.map +1 -0
  191. package/dist/passkeys/internal.js +113 -0
  192. package/dist/passkeys/internal.js.map +1 -0
  193. package/dist/secp256r1.d.ts +24 -0
  194. package/dist/secp256r1.d.ts.map +1 -0
  195. package/dist/secp256r1.js +38 -0
  196. package/dist/secp256r1.js.map +1 -0
  197. package/dist/transfer.d.ts +28 -0
  198. package/dist/transfer.d.ts.map +1 -0
  199. package/dist/transfer.js +109 -0
  200. package/dist/transfer.js.map +1 -0
  201. package/dist/utils/associatedToken.d.ts +3 -0
  202. package/dist/utils/associatedToken.d.ts.map +1 -0
  203. package/dist/utils/associatedToken.js +14 -0
  204. package/dist/utils/associatedToken.js.map +1 -0
  205. package/dist/utils/consts.d.ts +8 -0
  206. package/dist/utils/consts.d.ts.map +1 -0
  207. package/dist/utils/consts.js +9 -0
  208. package/dist/utils/consts.js.map +1 -0
  209. package/dist/utils/encoding.d.ts +3 -0
  210. package/dist/utils/encoding.d.ts.map +1 -0
  211. package/dist/utils/encoding.js +14 -0
  212. package/dist/utils/encoding.js.map +1 -0
  213. package/dist/utils/metadata.d.ts +48 -0
  214. package/dist/utils/metadata.d.ts.map +1 -0
  215. package/dist/utils/metadata.js +110 -0
  216. package/dist/utils/metadata.js.map +1 -0
  217. package/dist/utils/passkey/index.d.ts +17 -0
  218. package/dist/utils/passkey/index.d.ts.map +1 -0
  219. package/dist/utils/passkey/index.js +21 -0
  220. package/dist/utils/passkey/index.js.map +1 -0
  221. package/dist/utils/passkey/internal.d.ts +11 -0
  222. package/dist/utils/passkey/internal.d.ts.map +1 -0
  223. package/dist/utils/passkey/internal.js +115 -0
  224. package/dist/utils/passkey/internal.js.map +1 -0
  225. package/dist/utils/passkey/secp256r1.d.ts +26 -0
  226. package/dist/utils/passkey/secp256r1.d.ts.map +1 -0
  227. package/dist/utils/passkey/secp256r1.js +59 -0
  228. package/dist/utils/passkey/secp256r1.js.map +1 -0
  229. package/dist/utils/pdas/asset.d.ts +4 -0
  230. package/dist/utils/pdas/asset.d.ts.map +1 -0
  231. package/dist/utils/pdas/asset.js +14 -0
  232. package/dist/utils/pdas/asset.js.map +1 -0
  233. package/dist/utils/pdas/domainConfig.d.ts +3 -0
  234. package/dist/utils/pdas/domainConfig.d.ts.map +1 -0
  235. package/dist/utils/pdas/domainConfig.js +15 -0
  236. package/dist/utils/pdas/domainConfig.js.map +1 -0
  237. package/dist/utils/pdas/index.d.ts +3 -0
  238. package/dist/utils/pdas/index.d.ts.map +1 -0
  239. package/dist/utils/pdas/index.js +3 -0
  240. package/dist/utils/pdas/index.js.map +1 -0
  241. package/dist/utils/slotHash.d.ts +9 -0
  242. package/dist/utils/slotHash.d.ts.map +1 -0
  243. package/dist/utils/slotHash.js +39 -0
  244. package/dist/utils/slotHash.js.map +1 -0
  245. package/dist/utils/tokenOwner.d.ts +7 -0
  246. package/dist/utils/tokenOwner.d.ts.map +1 -0
  247. package/dist/utils/tokenOwner.js +24 -0
  248. package/dist/utils/tokenOwner.js.map +1 -0
  249. package/dist/utils/verify.d.ts +8 -0
  250. package/dist/utils/verify.d.ts.map +1 -0
  251. package/dist/utils/verify.js +45 -0
  252. package/dist/utils/verify.js.map +1 -0
  253. package/dist/utils.d.ts +10 -0
  254. package/dist/utils.d.ts.map +1 -0
  255. package/dist/utils.js +42 -0
  256. package/dist/utils.js.map +1 -0
  257. 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"}
@@ -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,3 @@
1
+ import { type Address } from "@solana/kit";
2
+ export declare function findAssociatedTokenAddress(owner: Address, mint: Address, tokenProgram: Address): Promise<Address>;
3
+ //# sourceMappingURL=associatedToken.d.ts.map
@@ -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,3 @@
1
+ /** Decodes a base64url (or base64) string into raw bytes. */
2
+ export declare function base64URLStringToBuffer(base64URLString: string): Uint8Array;
3
+ //# sourceMappingURL=encoding.d.ts.map
@@ -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"}