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,21 @@
1
+ import { base64URLStringToBuffer, convertSignatureDERtoRS, getSecp256r1Message, parseWebAuthnClientData, } from "./internal.js";
2
+ export { base64URLStringToBuffer, convertSignatureDERtoRS, extractAdditionalFields, getSecp256r1Message, parseWebAuthnClientData, } from "./internal.js";
3
+ export { buildTransferChallenge, buildTransferMessageHash, } from "./secp256r1.js";
4
+ export function buildSecp256r1VerifyInputFromWebAuthn(input) {
5
+ const clientData = parseWebAuthnClientData(input.response.response.clientDataJSON);
6
+ const signature = convertSignatureDERtoRS(base64URLStringToBuffer(input.response.response.signature));
7
+ const message = getSecp256r1Message(input.response);
8
+ return {
9
+ verifyInput: [
10
+ {
11
+ publicKey: input.compressedPubkey,
12
+ signature,
13
+ message,
14
+ },
15
+ ],
16
+ crossOrigin: clientData.crossOrigin,
17
+ truncatedClientDataJson: clientData.truncatedClientDataJson,
18
+ origin: clientData.origin,
19
+ };
20
+ }
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/passkey/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,YAAY,CAAC;AAEpB,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,MAAM,UAAU,qCAAqC,CAAC,KAGrD;IACC,MAAM,UAAU,GAAG,uBAAuB,CACxC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,cAAc,CACvC,CAAC;IACF,MAAM,SAAS,GAAG,uBAAuB,CACvC,uBAAuB,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAC3D,CAAC;IACF,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAEpD,OAAO;QACL,WAAW,EAAE;YACX;gBACE,SAAS,EAAE,KAAK,CAAC,gBAAgB;gBACjC,SAAS;gBACT,OAAO;aACR;SACF;QACD,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,uBAAuB,EAAE,UAAU,CAAC,uBAAuB;QAC3D,MAAM,EAAE,UAAU,CAAC,MAAM;KAC1B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { type AuthenticationResponseJSON } from "@simplewebauthn/browser";
2
+ export declare function base64URLStringToBuffer(base64URLString: string): Uint8Array;
3
+ export declare function normalizeSignatureToLowS(signature: Uint8Array): Uint8Array;
4
+ export declare function convertSignatureDERtoRS(signature: Uint8Array): Uint8Array;
5
+ export declare function getSecp256r1Message(authResponse: AuthenticationResponseJSON): Uint8Array;
6
+ export declare function parseWebAuthnClientData(clientDataJSON: string): {
7
+ origin: string;
8
+ crossOrigin: boolean;
9
+ truncatedClientDataJson: Uint8Array<ArrayBuffer>;
10
+ };
11
+ //# sourceMappingURL=internal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../../../src/utils/passkey/internal.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,0BAA0B,EAChC,MAAM,yBAAyB,CAAC;AA0BjC,wBAAgB,uBAAuB,CAAC,eAAe,EAAE,MAAM,GAAG,UAAU,CAW3E;AA8BD,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,UAAU,GAAG,UAAU,CAoB1E;AAED,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,UAAU,GAAG,UAAU,CA4CzE;AAED,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,0BAA0B,GACvC,UAAU,CASZ;AAED,wBAAgB,uBAAuB,CAAC,cAAc,EAAE,MAAM;;;;EAS7D"}
@@ -0,0 +1,115 @@
1
+ import { p256 } from "@noble/curves/nist.js";
2
+ import { sha256 } from "@noble/hashes/sha2.js";
3
+ import { bufferToBase64URLString, startAuthentication, } from "@simplewebauthn/browser";
4
+ import {} from "@solana/kit";
5
+ import { findAssociatedTokenAddress } from "../associatedToken.js";
6
+ import { RP_ID, TOKEN_2022_PROGRAM_ADDRESS, TRANSFER_HOOK_PROGRAM_ADDRESS, } from "../consts.js";
7
+ import { getExecuteTransferInstructionAsync } from "../../generated/index.js";
8
+ import {} from "../../instructions/transfer.js";
9
+ import { buildSecp256r1VerifyInstructionFromWebAuthn } from "./secp256r1.js";
10
+ function uint8ArrayToHex(bytes) {
11
+ return Array.from(bytes)
12
+ .map((b) => b.toString(16).padStart(2, "0"))
13
+ .join("");
14
+ }
15
+ function hexToUint8Array(hex) {
16
+ const bytes = new Uint8Array(hex.length / 2);
17
+ for (let i = 0; i < bytes.length; i += 1) {
18
+ bytes[i] = Number.parseInt(hex.slice(i * 2, i * 2 + 2), 16);
19
+ }
20
+ return bytes;
21
+ }
22
+ export function base64URLStringToBuffer(base64URLString) {
23
+ const base64 = base64URLString.replace(/-/g, "+").replace(/_/g, "/");
24
+ const padLength = (4 - (base64.length % 4)) % 4;
25
+ const padded = base64.padEnd(base64.length + padLength, "=");
26
+ const binary = atob(padded);
27
+ const buffer = new ArrayBuffer(binary.length);
28
+ const bytes = new Uint8Array(buffer);
29
+ for (let i = 0; i < binary.length; i += 1) {
30
+ bytes[i] = binary.charCodeAt(i);
31
+ }
32
+ return bytes;
33
+ }
34
+ function extractAdditionalFields(clientData) {
35
+ const knownKeys = new Set(["type", "challenge", "origin", "crossOrigin"]);
36
+ const remaining = {};
37
+ for (const key in clientData) {
38
+ if (!knownKeys.has(key)) {
39
+ remaining[key] = clientData[key];
40
+ }
41
+ }
42
+ if (Object.keys(remaining).length === 0) {
43
+ return new Uint8Array();
44
+ }
45
+ const serialized = JSON.stringify(remaining);
46
+ return new Uint8Array(new TextEncoder().encode(serialized.slice(1, -1)));
47
+ }
48
+ export function normalizeSignatureToLowS(signature) {
49
+ if (signature.length !== 64) {
50
+ throw new Error(`expected 64-byte raw r||s signature, got ${signature.length} bytes`);
51
+ }
52
+ const order = p256.Point.CURVE().n;
53
+ const halfOrder = order >> 1n;
54
+ const sBig = BigInt(`0x${uint8ArrayToHex(signature.slice(32, 64))}`);
55
+ if (sBig <= halfOrder) {
56
+ return signature;
57
+ }
58
+ const sLow = order - sBig;
59
+ const sPad = hexToUint8Array(sLow.toString(16).padStart(64, "0"));
60
+ const normalized = new Uint8Array(64);
61
+ normalized.set(signature.slice(0, 32), 0);
62
+ normalized.set(sPad, 32);
63
+ return normalized;
64
+ }
65
+ export function convertSignatureDERtoRS(signature) {
66
+ if (signature.length === 64) {
67
+ return normalizeSignatureToLowS(signature);
68
+ }
69
+ if (signature[0] !== 0x30) {
70
+ throw new Error("Invalid DER sequence");
71
+ }
72
+ const totalLength = signature[1];
73
+ let offset = 2;
74
+ if (totalLength > 0x80) {
75
+ const lengthBytes = totalLength & 0x7f;
76
+ offset += lengthBytes;
77
+ }
78
+ if (signature[offset] !== 0x02) {
79
+ throw new Error("Expected INTEGER for r");
80
+ }
81
+ const rLen = signature[offset + 1];
82
+ const rStart = offset + 2;
83
+ const r = signature.slice(rStart, rStart + rLen);
84
+ offset = rStart + rLen;
85
+ if (signature[offset] !== 0x02) {
86
+ throw new Error("Expected INTEGER for s");
87
+ }
88
+ const sLen = signature[offset + 1];
89
+ const sStart = offset + 2;
90
+ const s = signature.slice(sStart, sStart + sLen);
91
+ const rStripped = r[0] === 0x00 && r.length > 32 ? r.slice(1) : r;
92
+ const sStripped = s[0] === 0x00 && s.length > 32 ? s.slice(1) : s;
93
+ if (rStripped.length > 32 || sStripped.length > 32) {
94
+ throw new Error("r or s length > 32 bytes");
95
+ }
96
+ const rawSig = new Uint8Array(64);
97
+ rawSig.set(rStripped, 32 - rStripped.length);
98
+ rawSig.set(sStripped, 64 - sStripped.length);
99
+ return normalizeSignatureToLowS(rawSig);
100
+ }
101
+ export function getSecp256r1Message(authResponse) {
102
+ const clientDataJSON = base64URLStringToBuffer(authResponse.response.clientDataJSON);
103
+ const authenticatorData = base64URLStringToBuffer(authResponse.response.authenticatorData);
104
+ const clientDataHash = sha256(clientDataJSON);
105
+ return new Uint8Array([...authenticatorData, ...clientDataHash]);
106
+ }
107
+ export function parseWebAuthnClientData(clientDataJSON) {
108
+ const parsed = JSON.parse(new TextDecoder().decode(base64URLStringToBuffer(clientDataJSON)));
109
+ return {
110
+ origin: String(parsed.origin),
111
+ crossOrigin: Boolean(parsed.crossOrigin),
112
+ truncatedClientDataJson: extractAdditionalFields(parsed),
113
+ };
114
+ }
115
+ //# sourceMappingURL=internal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal.js","sourceRoot":"","sources":["../../../src/utils/passkey/internal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EACL,uBAAuB,EACvB,mBAAmB,GAEpB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAA4C,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EACL,KAAK,EACL,0BAA0B,EAC1B,6BAA6B,GAC9B,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,kCAAkC,EAAE,MAAM,0BAA0B,CAAC;AAC9E,OAAO,EAAwB,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,2CAA2C,EAAE,MAAM,gBAAgB,CAAC;AAE7E,SAAS,eAAe,CAAC,KAAiB;IACxC,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;SACrB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;SAC3C,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED,SAAS,eAAe,CAAC,GAAW;IAClC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,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;AAED,SAAS,uBAAuB,CAAC,UAAmC;IAClE,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;IAE1E,MAAM,SAAS,GAA4B,EAAE,CAAC;IAC9C,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,SAAS,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxC,OAAO,IAAI,UAAU,EAAE,CAAC;IAC1B,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7C,OAAO,IAAI,UAAU,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3E,CAAC;AAYD,MAAM,UAAU,wBAAwB,CAAC,SAAqB;IAC5D,IAAI,SAAS,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CACb,4CAA4C,SAAS,CAAC,MAAM,QAAQ,CACrE,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACnC,MAAM,SAAS,GAAG,KAAK,IAAI,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,eAAe,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IACrE,IAAI,IAAI,IAAI,SAAS,EAAE,CAAC;QACtB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC;IAC1B,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;IAClE,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IACtC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1C,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACzB,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,SAAqB;IAC3D,IAAI,SAAS,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QAC5B,OAAO,wBAAwB,CAAC,SAAS,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IACjC,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,IAAI,WAAW,GAAG,IAAI,EAAE,CAAC;QACvB,MAAM,WAAW,GAAG,WAAW,GAAG,IAAI,CAAC;QACvC,MAAM,IAAI,WAAW,CAAC;IACxB,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;IACD,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC;IAC1B,MAAM,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;IAEjD,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,SAAS,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;IACD,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC;IAC1B,MAAM,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;IAEjD,MAAM,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClE,MAAM,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAElE,IAAI,SAAS,CAAC,MAAM,GAAG,EAAE,IAAI,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACnD,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IAClC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAC7C,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAE7C,OAAO,wBAAwB,CAAC,MAAM,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,YAAwC;IAExC,MAAM,cAAc,GAAG,uBAAuB,CAC5C,YAAY,CAAC,QAAQ,CAAC,cAAc,CACrC,CAAC;IACF,MAAM,iBAAiB,GAAG,uBAAuB,CAC/C,YAAY,CAAC,QAAQ,CAAC,iBAAiB,CACxC,CAAC;IACF,MAAM,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;IAC9C,OAAO,IAAI,UAAU,CAAC,CAAC,GAAG,iBAAiB,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,cAAsB;IAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CACvB,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,uBAAuB,CAAC,cAAc,CAAC,CAAC,CACvC,CAAC;IAC7B,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;QAC7B,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC;QACxC,uBAAuB,EAAE,uBAAuB,CAAC,MAAM,CAAC;KACzD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { AuthenticationResponseJSON } from "@simplewebauthn/browser";
2
+ import { type Address, type Instruction } from "@solana/kit";
3
+ import { SECP256R1_PROGRAM_ADDRESS } from "../consts.js";
4
+ import { type TransferSession } from "../../instructions/transfer.js";
5
+ export declare function buildTransferMessageHash(input: {
6
+ asset: Address;
7
+ sender: Address;
8
+ }): Promise<Uint8Array>;
9
+ export declare function buildTransferChallenge(input: {
10
+ tokenProgram: Address;
11
+ asset: Address;
12
+ sender: Address;
13
+ slotHash: Uint8Array;
14
+ }): Promise<Uint8Array>;
15
+ export type WebAuthnSecp256r1Verification = {
16
+ secp256r1Verify: Instruction<typeof SECP256R1_PROGRAM_ADDRESS>;
17
+ origin: string;
18
+ crossOrigin: boolean;
19
+ truncatedClientDataJson: Uint8Array;
20
+ domainConfig: Address;
21
+ };
22
+ export declare function buildSecp256r1VerifyInstructionFromWebAuthn(input: {
23
+ session: TransferSession;
24
+ response: AuthenticationResponseJSON;
25
+ }): Promise<WebAuthnSecp256r1Verification>;
26
+ //# sourceMappingURL=secp256r1.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secp256r1.d.ts","sourceRoot":"","sources":["../../../src/utils/passkey/secp256r1.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAqB,KAAK,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAEhF,OAAO,EAAE,yBAAyB,EAAyB,MAAM,cAAc,CAAC;AAOhF,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,gCAAgC,CAAC;AA8CtE,wBAAsB,wBAAwB,CAAC,KAAK,EAAE;IACpD,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;CACjB,GAAG,OAAO,CAAC,UAAU,CAAC,CAItB;AAED,wBAAsB,sBAAsB,CAAC,KAAK,EAAE;IAClD,YAAY,EAAE,OAAO,CAAC;IACtB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,UAAU,CAAC;CACtB,GAAG,OAAO,CAAC,UAAU,CAAC,CActB;AAED,MAAM,MAAM,6BAA6B,GAAG;IAC1C,eAAe,EAAE,WAAW,CAAC,OAAO,yBAAyB,CAAC,CAAC;IAC/D,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,OAAO,CAAC;IACrB,uBAAuB,EAAE,UAAU,CAAC;IACpC,YAAY,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,wBAAsB,2CAA2C,CAAC,KAAK,EAAE;IACvE,OAAO,EAAE,eAAe,CAAC;IACzB,QAAQ,EAAE,0BAA0B,CAAC;CACtC,GAAG,OAAO,CAAC,6BAA6B,CAAC,CAUzC"}
@@ -0,0 +1,59 @@
1
+ import { getAddressEncoder } from "@solana/kit";
2
+ import { getSecp256r1VerifyInstruction } from "../../instructions/internal/secp256r1Verify.js";
3
+ import { SECP256R1_PROGRAM_ADDRESS, TRANSFER_ACTION_BYTES } from "../consts.js";
4
+ import { base64URLStringToBuffer, convertSignatureDERtoRS, getSecp256r1Message, parseWebAuthnClientData, } from "./internal.js";
5
+ import {} from "../../instructions/transfer.js";
6
+ import { findDomainConfigPda } from "../pdas/domainConfig.js";
7
+ import { sha256 } from "@noble/hashes/sha2.js";
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
+ function buildSecp256r1VerifyInputFromWebAuthn(input) {
22
+ const clientData = parseWebAuthnClientData(input.response.response.clientDataJSON);
23
+ const signature = convertSignatureDERtoRS(base64URLStringToBuffer(input.response.response.signature));
24
+ const message = getSecp256r1Message(input.response);
25
+ return {
26
+ verifyInput: [
27
+ {
28
+ publicKey: base64URLStringToBuffer(input.session.displayInfo.publicKey),
29
+ signature,
30
+ message,
31
+ },
32
+ ],
33
+ crossOrigin: clientData.crossOrigin,
34
+ truncatedClientDataJson: clientData.truncatedClientDataJson,
35
+ origin: clientData.origin,
36
+ rpIdHash: message.subarray(0, 32),
37
+ };
38
+ }
39
+ export async function buildTransferMessageHash(input) {
40
+ return sha256(concatBytes(encodeAddress(input.asset), encodeAddress(input.sender)));
41
+ }
42
+ export async function buildTransferChallenge(input) {
43
+ const messageHash = await buildTransferMessageHash({
44
+ asset: input.asset,
45
+ sender: input.sender,
46
+ });
47
+ return sha256(concatBytes(TRANSFER_ACTION_BYTES, encodeAddress(input.tokenProgram), messageHash, new Uint8Array(input.slotHash)));
48
+ }
49
+ export async function buildSecp256r1VerifyInstructionFromWebAuthn(input) {
50
+ const parsed = buildSecp256r1VerifyInputFromWebAuthn(input);
51
+ return {
52
+ secp256r1Verify: getSecp256r1VerifyInstruction(parsed.verifyInput),
53
+ origin: parsed.origin,
54
+ crossOrigin: parsed.crossOrigin,
55
+ truncatedClientDataJson: parsed.truncatedClientDataJson,
56
+ domainConfig: await findDomainConfigPda(undefined, parsed.rpIdHash),
57
+ };
58
+ }
59
+ //# sourceMappingURL=secp256r1.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secp256r1.js","sourceRoot":"","sources":["../../../src/utils/passkey/secp256r1.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { type Address } from "@solana/kit";
2
+ import { type Secp256r1Pubkey } from "../../generated/index.js";
3
+ export declare function findAssetPda(secp256r1Pubkey: Secp256r1Pubkey): Promise<Address>;
4
+ //# sourceMappingURL=asset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asset.d.ts","sourceRoot":"","sources":["../../../src/utils/pdas/asset.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EAGb,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,KAAK,eAAe,EAAkC,MAAM,0BAA0B,CAAC;AAGhG,wBAAsB,YAAY,CAChC,eAAe,EAAE,eAAe,GAC/B,OAAO,CAAC,OAAO,CAAC,CAUlB"}
@@ -0,0 +1,14 @@
1
+ import { getProgramDerivedAddress, getBytesEncoder, } from "@solana/kit";
2
+ import { PHYGITAL_TOKEN_PROGRAM_ADDRESS } from "../../generated/index.js";
3
+ const ASSET_SEED = new TextEncoder().encode("asset");
4
+ export async function findAssetPda(secp256r1Pubkey) {
5
+ const [asset] = await getProgramDerivedAddress({
6
+ programAddress: PHYGITAL_TOKEN_PROGRAM_ADDRESS,
7
+ seeds: [
8
+ getBytesEncoder().encode(ASSET_SEED),
9
+ getBytesEncoder().encode(secp256r1Pubkey[0].slice(1)),
10
+ ],
11
+ });
12
+ return asset;
13
+ }
14
+ //# sourceMappingURL=asset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asset.js","sourceRoot":"","sources":["../../../src/utils/pdas/asset.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,wBAAwB,EACxB,eAAe,GAChB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAwB,8BAA8B,EAAE,MAAM,0BAA0B,CAAC;AAEhG,MAAM,UAAU,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACrD,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,eAAgC;IAEhC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,wBAAwB,CAAC;QAC7C,cAAc,EAAE,8BAA8B;QAC9C,KAAK,EAAE;YACL,eAAe,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC;YACpC,eAAe,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SACtD;KACF,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type Address } from "@solana/kit";
2
+ export declare function findDomainConfigPda(rpId?: string, rpIdHash?: Uint8Array): Promise<Address>;
3
+ //# sourceMappingURL=domainConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domainConfig.d.ts","sourceRoot":"","sources":["../../../src/utils/pdas/domainConfig.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,OAAO,EAGb,MAAM,aAAa,CAAC;AAIrB,wBAAsB,mBAAmB,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAC,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAU/F"}
@@ -0,0 +1,15 @@
1
+ import { sha256 } from "@noble/hashes/sha2.js";
2
+ import { getProgramDerivedAddress, getBytesEncoder, } from "@solana/kit";
3
+ import { PHYGITAL_TOKEN_PROGRAM_ADDRESS } from "../../generated/index.js";
4
+ const DOMAIN_CONFIG_SEED = new TextEncoder().encode("domain_config");
5
+ export async function findDomainConfigPda(rpId, rpIdHash) {
6
+ const [domainConfig] = await getProgramDerivedAddress({
7
+ programAddress: PHYGITAL_TOKEN_PROGRAM_ADDRESS,
8
+ seeds: [
9
+ getBytesEncoder().encode(DOMAIN_CONFIG_SEED),
10
+ getBytesEncoder().encode(rpIdHash ?? sha256(new TextEncoder().encode(rpId))),
11
+ ],
12
+ });
13
+ return domainConfig;
14
+ }
15
+ //# sourceMappingURL=domainConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domainConfig.js","sourceRoot":"","sources":["../../../src/utils/pdas/domainConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAEL,wBAAwB,EACxB,eAAe,GAChB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAC;AAC1E,MAAM,kBAAkB,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;AAErE,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAa,EAAE,QAAoB;IAC3E,MAAM,CAAC,YAAY,CAAC,GAAG,MAAM,wBAAwB,CAAC;QACpD,cAAc,EAAE,8BAA8B;QAC9C,KAAK,EAAE;YACL,eAAe,EAAE,CAAC,MAAM,CAAC,kBAAkB,CAAC;YAC5C,eAAe,EAAE,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;SAC7E;KACF,CAAC,CAAC;IAEH,OAAO,YAAY,CAAC;AACtB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from "./asset.js";
2
+ export * from "./domainConfig.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/pdas/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,mBAAmB,CAAA"}
@@ -0,0 +1,3 @@
1
+ export * from "./asset.js";
2
+ export * from "./domainConfig.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/pdas/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,mBAAmB,CAAA"}
@@ -0,0 +1,9 @@
1
+ import { type Address, type Rpc, type SolanaRpcApi } from "@solana/kit";
2
+ export declare function decodeBase64AccountData(data: string | [string, string] | Uint8Array): Uint8Array;
3
+ export declare function getLatestSlotHash(rpc: Rpc<SolanaRpcApi>): Promise<{
4
+ slotHash: Uint8Array<ArrayBufferLike>;
5
+ slotNumber: bigint;
6
+ estimatedSlotHashExpiry: number;
7
+ }>;
8
+ export declare function fetchAccountData(rpc: Rpc<SolanaRpcApi>, account: Address): Promise<Uint8Array>;
9
+ //# sourceMappingURL=slotHash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slotHash.d.ts","sourceRoot":"","sources":["../../src/utils/slotHash.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,OAAO,EACZ,KAAK,GAAG,EACR,KAAK,YAAY,EAClB,MAAM,aAAa,CAAC;AAGrB,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,UAAU,GAC3C,UAAU,CAMZ;AAED,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,YAAY,CAAC;;;;GAqB7D;AAED,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,GAAG,CAAC,YAAY,CAAC,EACtB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,UAAU,CAAC,CAarB"}
@@ -0,0 +1,39 @@
1
+ import { getBase64Encoder, getU64Decoder, } from "@solana/kit";
2
+ import { SLOT_HASHES_SYSVAR_ADDRESS } from "./consts.js";
3
+ export function decodeBase64AccountData(data) {
4
+ if (data instanceof Uint8Array) {
5
+ return data;
6
+ }
7
+ const base64 = Array.isArray(data) ? data[0] : data;
8
+ return new Uint8Array(getBase64Encoder().encode(base64));
9
+ }
10
+ export async function getLatestSlotHash(rpc) {
11
+ const slotSysvarData = (await rpc
12
+ .getAccountInfo(SLOT_HASHES_SYSVAR_ADDRESS, {
13
+ encoding: "base64",
14
+ commitment: "confirmed",
15
+ dataSlice: { offset: 8, length: 40 },
16
+ })
17
+ .send()).value?.data;
18
+ if (!slotSysvarData) {
19
+ throw new Error("Unable to fetch slot hashes sysvar");
20
+ }
21
+ const slotHashData = decodeBase64AccountData(slotSysvarData);
22
+ const slotNumber = getU64Decoder().decode(slotHashData.subarray(0, 8));
23
+ const slotHash = slotHashData.subarray(8, 40);
24
+ const estimatedSlotHashExpiry = Date.now() + 512 * 400;
25
+ return { slotHash, slotNumber, estimatedSlotHashExpiry };
26
+ }
27
+ export async function fetchAccountData(rpc, account) {
28
+ const response = await rpc
29
+ .getAccountInfo(account, {
30
+ encoding: "base64",
31
+ commitment: "confirmed",
32
+ })
33
+ .send();
34
+ if (!response.value?.data) {
35
+ throw new Error(`Account not found: ${account}`);
36
+ }
37
+ return decodeBase64AccountData(response.value.data);
38
+ }
39
+ //# sourceMappingURL=slotHash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slotHash.js","sourceRoot":"","sources":["../../src/utils/slotHash.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,aAAa,GAId,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AAEzD,MAAM,UAAU,uBAAuB,CACrC,IAA4C;IAE5C,IAAI,IAAI,YAAY,UAAU,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACpD,OAAO,IAAI,UAAU,CAAC,gBAAgB,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAsB;IAC5D,MAAM,cAAc,GAAG,CACrB,MAAM,GAAG;SACN,cAAc,CAAC,0BAA0B,EAAE;QAC1C,QAAQ,EAAE,QAAQ;QAClB,UAAU,EAAE,WAAW;QACvB,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;KACrC,CAAC;SACD,IAAI,EAAE,CACV,CAAC,KAAK,EAAE,IAAI,CAAC;IAEd,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,YAAY,GAAG,uBAAuB,CAAC,cAAc,CAAC,CAAC;IAC7D,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACvE,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9C,MAAM,uBAAuB,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC;IAEvD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,uBAAuB,EAAE,CAAC;AAC3D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,GAAsB,EACtB,OAAgB;IAEhB,MAAM,QAAQ,GAAG,MAAM,GAAG;SACvB,cAAc,CAAC,OAAO,EAAE;QACvB,QAAQ,EAAE,QAAQ;QAClB,UAAU,EAAE,WAAW;KACxB,CAAC;SACD,IAAI,EAAE,CAAC;IAEV,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,sBAAsB,OAAO,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,OAAO,uBAAuB,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACtD,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { type Address, type Rpc, type SolanaRpcApi } from "@solana/kit";
2
+ /**
3
+ * Returns the wallet that currently holds the NFT (amount === 1).
4
+ * Uses `getTokenLargestAccounts` then reads the owner field from the token account.
5
+ */
6
+ export declare function getCurrentOwner(rpc: Rpc<SolanaRpcApi>, mint: Address): Promise<Address>;
7
+ //# sourceMappingURL=tokenOwner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenOwner.d.ts","sourceRoot":"","sources":["../../src/utils/tokenOwner.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,OAAO,EACZ,KAAK,GAAG,EACR,KAAK,YAAY,EAClB,MAAM,aAAa,CAAC;AAMrB;;;GAGG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,GAAG,CAAC,YAAY,CAAC,EACtB,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC,OAAO,CAAC,CA0BlB"}
@@ -0,0 +1,24 @@
1
+ import { getAddressDecoder, } from "@solana/kit";
2
+ import { fetchAccountData } from "./slotHash.js";
3
+ const TOKEN_ACCOUNT_OWNER_OFFSET = 32;
4
+ const TOKEN_ACCOUNT_OWNER_SIZE = 32;
5
+ /**
6
+ * Returns the wallet that currently holds the NFT (amount === 1).
7
+ * Uses `getTokenLargestAccounts` then reads the owner field from the token account.
8
+ */
9
+ export async function getCurrentOwner(rpc, mint) {
10
+ const largestAccounts = (await rpc
11
+ .getTokenLargestAccounts(mint, { commitment: "confirmed" })
12
+ .send()).value;
13
+ if (!largestAccounts?.length) {
14
+ throw new Error(`No token accounts found for mint ${mint}`);
15
+ }
16
+ const holderEntry = largestAccounts.find((entry) => entry.amount === "1") ??
17
+ largestAccounts.find((entry) => entry.amount !== "0");
18
+ if (!holderEntry) {
19
+ throw new Error(`No current holder found for mint ${mint}`);
20
+ }
21
+ const tokenAccountData = await fetchAccountData(rpc, holderEntry.address);
22
+ return getAddressDecoder().decode(tokenAccountData.subarray(TOKEN_ACCOUNT_OWNER_OFFSET, TOKEN_ACCOUNT_OWNER_OFFSET + TOKEN_ACCOUNT_OWNER_SIZE));
23
+ }
24
+ //# sourceMappingURL=tokenOwner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenOwner.js","sourceRoot":"","sources":["../../src/utils/tokenOwner.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,GAIlB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,0BAA0B,GAAG,EAAE,CAAC;AACtC,MAAM,wBAAwB,GAAG,EAAE,CAAC;AAEpC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,GAAsB,EACtB,IAAa;IAEb,MAAM,eAAe,GAAG,CACtB,MAAM,GAAG;SACN,uBAAuB,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC;SAC1D,IAAI,EAAE,CACV,CAAC,KAAK,CAAC;IAER,IAAI,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,oCAAoC,IAAI,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,WAAW,GACf,eAAe,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,GAAG,CAAC;QACrD,eAAe,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC;IAExD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,oCAAoC,IAAI,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,gBAAgB,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAC1E,OAAO,iBAAiB,EAAE,CAAC,MAAM,CAC/B,gBAAgB,CAAC,QAAQ,CACvB,0BAA0B,EAC1B,0BAA0B,GAAG,wBAAwB,CACtD,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { type VerifyMetadataCallback } from "./metadata.js";
2
+ export declare function verifyWithServerCheck(params: URLSearchParams, verifyMetadataCallback?: VerifyMetadataCallback): Promise<import("./metadata.js").VerifyMetadataResult>;
3
+ export declare function verifyLocal(params: URLSearchParams): {
4
+ isVerified: boolean;
5
+ publicKey: string;
6
+ counter: number;
7
+ };
8
+ //# sourceMappingURL=verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/utils/verify.ts"],"names":[],"mappings":"AASA,OAAO,EAGL,KAAK,sBAAsB,EAC5B,MAAM,eAAe,CAAC;AASvB,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,eAAe,EACvB,sBAAsB,GAAE,sBACuC,yDAGhE;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,eAAe;;;;EAoDlD"}
@@ -0,0 +1,45 @@
1
+ import { Endian, getU32Encoder, } from "@solana/kit";
2
+ import { base64URLStringToBuffer, normalizeSignatureToLowS, } from "./passkey/internal.js";
3
+ import { p256 } from "@noble/curves/nist.js";
4
+ import { DEFAULT_VERIFY_METADATA_ENDPOINT, verifyMetadata, } from "./metadata.js";
5
+ export async function verifyWithServerCheck(params, verifyMetadataCallback = (queryParams) => verifyMetadata(DEFAULT_VERIFY_METADATA_ENDPOINT, queryParams)) {
6
+ return verifyMetadataCallback(params);
7
+ }
8
+ export function verifyLocal(params) {
9
+ const publicKey = params.get("pk");
10
+ const signature = params.get("s");
11
+ const counter = params.get("c");
12
+ const nonce = params.get("n");
13
+ if (!publicKey || !signature || !counter || !nonce)
14
+ throw new Error("Missing query params");
15
+ const compressedPk = base64URLStringToBuffer(publicKey);
16
+ if (compressedPk.length !== 33) {
17
+ throw new Error(`pk must be 33-byte compressed P-256 key, got ${compressedPk.length} bytes`);
18
+ }
19
+ const randomBytes = base64URLStringToBuffer(nonce);
20
+ if (randomBytes.length !== 8) {
21
+ throw new Error(`n must be 8 bytes, got ${randomBytes.length} bytes`);
22
+ }
23
+ const rawSig = base64URLStringToBuffer(signature);
24
+ if (rawSig.length !== 64) {
25
+ throw new Error(`s must be 64-byte raw ECDSA signature, got ${rawSig.length} bytes`);
26
+ }
27
+ const currentCounter = Number.parseInt(counter, 10);
28
+ if (!Number.isInteger(currentCounter) ||
29
+ currentCounter < 0 ||
30
+ currentCounter > 0xffffffff) {
31
+ throw new Error(`counter out of uint32 range: ${currentCounter}`);
32
+ }
33
+ const counterBytes = getU32Encoder({ endian: Endian.Big }).encode(currentCounter);
34
+ const message = new Uint8Array(12);
35
+ message.set(counterBytes, 0);
36
+ message.set(randomBytes, 4);
37
+ const normalizedSig = normalizeSignatureToLowS(rawSig);
38
+ const isVerified = p256.verify(normalizedSig, message, compressedPk);
39
+ return {
40
+ isVerified,
41
+ publicKey,
42
+ counter: currentCounter
43
+ };
44
+ }
45
+ //# sourceMappingURL=verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/utils/verify.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,aAAa,GACd,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAC7C,OAAO,EACL,gCAAgC,EAChC,cAAc,GAEf,MAAM,eAAe,CAAC;AASvB,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,MAAuB,EACvB,yBAAiD,CAAC,WAAW,EAAE,EAAE,CAC/D,cAAc,CAAC,gCAAgC,EAAE,WAAW,CAAC;IAE/D,OAAO,sBAAsB,CAAC,MAAM,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAuB;IACjD,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK;QAChD,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAE1C,MAAM,YAAY,GAAG,uBAAuB,CAAC,SAAS,CAAC,CAAC;IACxD,IAAI,YAAY,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CACb,gDAAgD,YAAY,CAAC,MAAM,QAAQ,CAC5E,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;IACnD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,0BAA0B,WAAW,CAAC,MAAM,QAAQ,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,MAAM,GAAG,uBAAuB,CAAC,SAAS,CAAC,CAAC;IAClD,IAAI,MAAM,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb,8CAA8C,MAAM,CAAC,MAAM,QAAQ,CACpE,CAAC;IACJ,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACpD,IACE,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC;QACjC,cAAc,GAAG,CAAC;QAClB,cAAc,GAAG,UAAU,EAC3B,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,gCAAgC,cAAc,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,YAAY,GAAG,aAAa,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,CAC/D,cAAc,CACf,CAAC;IAEF,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;IAC7B,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAE5B,MAAM,aAAa,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACvD,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;IAErE,OAAO;QACL,UAAU;QACV,SAAS;QACT,OAAO,EAAE,cAAc;KACxB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { type Address, type Rpc, type SolanaRpcApi } from "@solana/kit";
2
+ export declare function decodeBase64AccountData(data: string | [string, string] | Uint8Array): Uint8Array;
3
+ export declare function getLatestSlotHash(rpc: Rpc<SolanaRpcApi>): Promise<{
4
+ slotHash: Uint8Array<ArrayBufferLike>;
5
+ slotNumber: bigint;
6
+ estimatedSlotHashExpiry: number;
7
+ }>;
8
+ export declare function fetchAccountData(rpc: Rpc<SolanaRpcApi>, account: Address): Promise<Uint8Array>;
9
+ export declare function encodeAddress(addressValue: Address): Uint8Array;
10
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,OAAO,EACZ,KAAK,GAAG,EACR,KAAK,YAAY,EAClB,MAAM,aAAa,CAAC;AAGrB,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,UAAU,GAC3C,UAAU,CAMZ;AAED,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,YAAY,CAAC;;;;GAqB7D;AAED,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,GAAG,CAAC,YAAY,CAAC,EACtB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,UAAU,CAAC,CAarB;AAED,wBAAgB,aAAa,CAAC,YAAY,EAAE,OAAO,GAAG,UAAU,CAE/D"}
package/dist/utils.js ADDED
@@ -0,0 +1,42 @@
1
+ import { getAddressEncoder, getBase64Encoder, getU64Decoder, } from "@solana/kit";
2
+ import { SLOT_HASHES_SYSVAR_ADDRESS } from "././consts.js";
3
+ export function decodeBase64AccountData(data) {
4
+ if (data instanceof Uint8Array) {
5
+ return data;
6
+ }
7
+ const base64 = Array.isArray(data) ? data[0] : data;
8
+ return new Uint8Array(getBase64Encoder().encode(base64));
9
+ }
10
+ export async function getLatestSlotHash(rpc) {
11
+ const slotSysvarData = (await rpc
12
+ .getAccountInfo(SLOT_HASHES_SYSVAR_ADDRESS, {
13
+ encoding: "base64",
14
+ commitment: "confirmed",
15
+ dataSlice: { offset: 8, length: 40 },
16
+ })
17
+ .send()).value?.data;
18
+ if (!slotSysvarData) {
19
+ throw new Error("Unable to fetch slot hashes sysvar");
20
+ }
21
+ const slotHashData = decodeBase64AccountData(slotSysvarData);
22
+ const slotNumber = getU64Decoder().decode(slotHashData.subarray(0, 8));
23
+ const slotHash = slotHashData.subarray(8, 40);
24
+ const estimatedSlotHashExpiry = Date.now() + 512 * 400;
25
+ return { slotHash, slotNumber, estimatedSlotHashExpiry };
26
+ }
27
+ export async function fetchAccountData(rpc, account) {
28
+ const response = await rpc
29
+ .getAccountInfo(account, {
30
+ encoding: "base64",
31
+ commitment: "confirmed",
32
+ })
33
+ .send();
34
+ if (!response.value?.data) {
35
+ throw new Error(`Account not found: ${account}`);
36
+ }
37
+ return decodeBase64AccountData(response.value.data);
38
+ }
39
+ export function encodeAddress(addressValue) {
40
+ return new Uint8Array(getAddressEncoder().encode(addressValue));
41
+ }
42
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,GAId,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,0BAA0B,EAAE,MAAM,UAAU,CAAC;AAEtD,MAAM,UAAU,uBAAuB,CACrC,IAA4C;IAE5C,IAAI,IAAI,YAAY,UAAU,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACpD,OAAO,IAAI,UAAU,CAAC,gBAAgB,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAsB;IAC5D,MAAM,cAAc,GAAG,CACrB,MAAM,GAAG;SACN,cAAc,CAAC,0BAA0B,EAAE;QAC1C,QAAQ,EAAE,QAAQ;QAClB,UAAU,EAAE,WAAW;QACvB,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;KACrC,CAAC;SACD,IAAI,EAAE,CACV,CAAC,KAAK,EAAE,IAAI,CAAC;IAEd,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,YAAY,GAAG,uBAAuB,CAAC,cAAc,CAAC,CAAC;IAC7D,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACvE,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9C,MAAM,uBAAuB,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC;IAEvD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,uBAAuB,EAAE,CAAC;AAC3D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,GAAsB,EACtB,OAAgB;IAEhB,MAAM,QAAQ,GAAG,MAAM,GAAG;SACvB,cAAc,CAAC,OAAO,EAAE;QACvB,QAAQ,EAAE,QAAQ;QAClB,UAAU,EAAE,WAAW;KACxB,CAAC;SACD,IAAI,EAAE,CAAC;IAEV,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,sBAAsB,OAAO,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,OAAO,uBAAuB,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,YAAqB;IACjD,OAAO,IAAI,UAAU,CAAC,iBAAiB,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;AAClE,CAAC"}
package/package.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "phygital-token-sdk",
3
+ "version": "0.1.0",
4
+ "description": "TypeScript client for the Phygital Token Solana program (generated via Codama)",
5
+ "license": "ISC",
6
+ "type": "module",
7
+ "main": "./dist/index.js",
8
+ "module": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.js"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist"
18
+ ],
19
+ "scripts": {
20
+ "build": "tsc -p tsconfig.json",
21
+ "test": "vitest run",
22
+ "prepublishOnly": "yarn build"
23
+ },
24
+ "peerDependencies": {
25
+ "@solana/kit": "^6.4.0"
26
+ },
27
+ "devDependencies": {
28
+ "@solana/kit": "^6.4.0",
29
+ "typescript": "^5.7.3",
30
+ "vitest": "^3.2.4"
31
+ },
32
+ "dependencies": {
33
+ "@noble/curves": "^2.0.1",
34
+ "@noble/hashes": "^2.0.1",
35
+ "@simplewebauthn/browser": "^13.3.0",
36
+ "@solana-program/system": "^0.12.2",
37
+ "@solana-program/token-2022": "^0.11.0",
38
+ "@solana/program-client-core": "^6.4.0",
39
+ "@solana/signers": "^6.4.0"
40
+ }
41
+ }