phygital-token-sdk 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/card-instance.test.d.ts +2 -0
- package/dist/__tests__/card-instance.test.d.ts.map +1 -0
- package/dist/__tests__/card-instance.test.js +38 -0
- package/dist/__tests__/card-instance.test.js.map +1 -0
- package/dist/__tests__/crypto-parity.test.d.ts +2 -0
- package/dist/__tests__/crypto-parity.test.d.ts.map +1 -0
- package/dist/__tests__/crypto-parity.test.js +60 -0
- package/dist/__tests__/crypto-parity.test.js.map +1 -0
- package/dist/__tests__/low-s-normalization.test.d.ts +2 -0
- package/dist/__tests__/low-s-normalization.test.d.ts.map +1 -0
- package/dist/__tests__/low-s-normalization.test.js +44 -0
- package/dist/__tests__/low-s-normalization.test.js.map +1 -0
- package/dist/__tests__/metadata-limits.test.d.ts +2 -0
- package/dist/__tests__/metadata-limits.test.d.ts.map +1 -0
- package/dist/__tests__/metadata-limits.test.js +33 -0
- package/dist/__tests__/metadata-limits.test.js.map +1 -0
- package/dist/consts.d.ts +19 -0
- package/dist/consts.d.ts.map +1 -0
- package/dist/consts.js +19 -0
- package/dist/consts.js.map +1 -0
- package/dist/generated/accounts/asset.d.ts +28 -0
- package/dist/generated/accounts/asset.d.ts.map +1 -0
- package/dist/generated/accounts/asset.js +52 -0
- package/dist/generated/accounts/asset.js.map +1 -0
- package/dist/generated/accounts/cardInstance.d.ts +35 -0
- package/dist/generated/accounts/cardInstance.d.ts.map +1 -0
- package/dist/generated/accounts/cardInstance.js +61 -0
- package/dist/generated/accounts/cardInstance.js.map +1 -0
- package/dist/generated/accounts/domainConfig.d.ts +28 -0
- package/dist/generated/accounts/domainConfig.d.ts.map +1 -0
- package/dist/generated/accounts/domainConfig.js +58 -0
- package/dist/generated/accounts/domainConfig.js.map +1 -0
- package/dist/generated/accounts/index.d.ts +3 -0
- package/dist/generated/accounts/index.d.ts.map +1 -0
- package/dist/generated/accounts/index.js +3 -0
- package/dist/generated/accounts/index.js.map +1 -0
- package/dist/generated/errors/index.d.ts +2 -0
- package/dist/generated/errors/index.d.ts.map +1 -0
- package/dist/generated/errors/index.js +2 -0
- package/dist/generated/errors/index.js.map +1 -0
- package/dist/generated/errors/phygitalNfts.d.ts +62 -0
- package/dist/generated/errors/phygitalNfts.d.ts.map +1 -0
- package/dist/generated/errors/phygitalNfts.js +87 -0
- package/dist/generated/errors/phygitalNfts.js.map +1 -0
- package/dist/generated/errors/phygitalToken.d.ts +34 -0
- package/dist/generated/errors/phygitalToken.d.ts.map +1 -0
- package/dist/generated/errors/phygitalToken.js +59 -0
- package/dist/generated/errors/phygitalToken.js.map +1 -0
- package/dist/generated/index.d.ts +7 -0
- package/dist/generated/index.d.ts.map +1 -0
- package/dist/generated/index.js +7 -0
- package/dist/generated/index.js.map +1 -0
- package/dist/generated/instructions/createCollectionMint.d.ts +108 -0
- package/dist/generated/instructions/createCollectionMint.d.ts.map +1 -0
- package/dist/generated/instructions/createCollectionMint.js +175 -0
- package/dist/generated/instructions/createCollectionMint.js.map +1 -0
- package/dist/generated/instructions/createDesignMint.d.ts +97 -0
- package/dist/generated/instructions/createDesignMint.d.ts.map +1 -0
- package/dist/generated/instructions/createDesignMint.js +164 -0
- package/dist/generated/instructions/createDesignMint.js.map +1 -0
- package/dist/generated/instructions/createDomainConfig.d.ts +46 -0
- package/dist/generated/instructions/createDomainConfig.d.ts.map +1 -0
- package/dist/generated/instructions/createDomainConfig.js +83 -0
- package/dist/generated/instructions/createDomainConfig.js.map +1 -0
- package/dist/generated/instructions/createGroupToken.d.ts +94 -0
- package/dist/generated/instructions/createGroupToken.d.ts.map +1 -0
- package/dist/generated/instructions/createGroupToken.js +150 -0
- package/dist/generated/instructions/createGroupToken.js.map +1 -0
- package/dist/generated/instructions/createMint.d.ts +77 -0
- package/dist/generated/instructions/createMint.d.ts.map +1 -0
- package/dist/generated/instructions/createMint.js +149 -0
- package/dist/generated/instructions/createMint.js.map +1 -0
- package/dist/generated/instructions/createToken.d.ts +88 -0
- package/dist/generated/instructions/createToken.d.ts.map +1 -0
- package/dist/generated/instructions/createToken.js +182 -0
- package/dist/generated/instructions/createToken.js.map +1 -0
- package/dist/generated/instructions/editDomainConfig.d.ts +50 -0
- package/dist/generated/instructions/editDomainConfig.d.ts.map +1 -0
- package/dist/generated/instructions/editDomainConfig.js +90 -0
- package/dist/generated/instructions/editDomainConfig.js.map +1 -0
- package/dist/generated/instructions/executeTransfer.d.ts +109 -0
- package/dist/generated/instructions/executeTransfer.d.ts.map +1 -0
- package/dist/generated/instructions/executeTransfer.js +243 -0
- package/dist/generated/instructions/executeTransfer.js.map +1 -0
- package/dist/generated/instructions/index.d.ts +7 -0
- package/dist/generated/instructions/index.d.ts.map +1 -0
- package/dist/generated/instructions/index.js +7 -0
- package/dist/generated/instructions/index.js.map +1 -0
- package/dist/generated/instructions/mintToken.d.ts +78 -0
- package/dist/generated/instructions/mintToken.d.ts.map +1 -0
- package/dist/generated/instructions/mintToken.js +167 -0
- package/dist/generated/instructions/mintToken.js.map +1 -0
- package/dist/generated/instructions/setLockState.d.ts +37 -0
- package/dist/generated/instructions/setLockState.d.ts.map +1 -0
- package/dist/generated/instructions/setLockState.js +62 -0
- package/dist/generated/instructions/setLockState.js.map +1 -0
- package/dist/generated/instructions/setTransferConfig.d.ts +88 -0
- package/dist/generated/instructions/setTransferConfig.d.ts.map +1 -0
- package/dist/generated/instructions/setTransferConfig.js +188 -0
- package/dist/generated/instructions/setTransferConfig.js.map +1 -0
- package/dist/generated/instructions/updateCounter.d.ts +45 -0
- package/dist/generated/instructions/updateCounter.d.ts.map +1 -0
- package/dist/generated/instructions/updateCounter.js +84 -0
- package/dist/generated/instructions/updateCounter.js.map +1 -0
- package/dist/generated/instructions/updateDomainConfig.d.ts +43 -0
- package/dist/generated/instructions/updateDomainConfig.d.ts.map +1 -0
- package/dist/generated/instructions/updateDomainConfig.js +81 -0
- package/dist/generated/instructions/updateDomainConfig.js.map +1 -0
- package/dist/generated/pdas/index.d.ts +2 -0
- package/dist/generated/pdas/index.d.ts.map +1 -0
- package/dist/generated/pdas/index.js +2 -0
- package/dist/generated/pdas/index.js.map +1 -0
- package/dist/generated/pdas/programAuthority.d.ts +5 -0
- package/dist/generated/pdas/programAuthority.d.ts.map +1 -0
- package/dist/generated/pdas/programAuthority.js +14 -0
- package/dist/generated/pdas/programAuthority.js.map +1 -0
- package/dist/generated/programs/index.d.ts +2 -0
- package/dist/generated/programs/index.d.ts.map +1 -0
- package/dist/generated/programs/index.js +2 -0
- package/dist/generated/programs/index.js.map +1 -0
- package/dist/generated/programs/phygitalNfts.d.ts +72 -0
- package/dist/generated/programs/phygitalNfts.d.ts.map +1 -0
- package/dist/generated/programs/phygitalNfts.js +136 -0
- package/dist/generated/programs/phygitalNfts.js.map +1 -0
- package/dist/generated/programs/phygitalToken.d.ts +65 -0
- package/dist/generated/programs/phygitalToken.d.ts.map +1 -0
- package/dist/generated/programs/phygitalToken.js +129 -0
- package/dist/generated/programs/phygitalToken.js.map +1 -0
- package/dist/generated/types/index.d.ts +2 -0
- package/dist/generated/types/index.d.ts.map +1 -0
- package/dist/generated/types/index.js +2 -0
- package/dist/generated/types/index.js.map +1 -0
- package/dist/generated/types/secp256r1Pubkey.d.ts +7 -0
- package/dist/generated/types/secp256r1Pubkey.d.ts.map +1 -0
- package/dist/generated/types/secp256r1Pubkey.js +11 -0
- package/dist/generated/types/secp256r1Pubkey.js.map +1 -0
- package/dist/generated/types/secp256r1VerifyArgs.d.ts +27 -0
- package/dist/generated/types/secp256r1VerifyArgs.d.ts.map +1 -0
- package/dist/generated/types/secp256r1VerifyArgs.js +24 -0
- package/dist/generated/types/secp256r1VerifyArgs.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/instructions/collection.d.ts +14 -0
- package/dist/instructions/collection.d.ts.map +1 -0
- package/dist/instructions/collection.js +59 -0
- package/dist/instructions/collection.js.map +1 -0
- package/dist/instructions/index.d.ts +2 -0
- package/dist/instructions/index.d.ts.map +1 -0
- package/dist/instructions/index.js +2 -0
- package/dist/instructions/index.js.map +1 -0
- package/dist/instructions/internal/secp256r1Verify.d.ts +29 -0
- package/dist/instructions/internal/secp256r1Verify.d.ts.map +1 -0
- package/dist/instructions/internal/secp256r1Verify.js +132 -0
- package/dist/instructions/internal/secp256r1Verify.js.map +1 -0
- package/dist/instructions/mint.d.ts +33 -0
- package/dist/instructions/mint.d.ts.map +1 -0
- package/dist/instructions/mint.js +74 -0
- package/dist/instructions/mint.js.map +1 -0
- package/dist/instructions/secp256r1Verify.d.ts +29 -0
- package/dist/instructions/secp256r1Verify.d.ts.map +1 -0
- package/dist/instructions/secp256r1Verify.js +132 -0
- package/dist/instructions/secp256r1Verify.js.map +1 -0
- package/dist/instructions/setLockState.d.ts +19 -0
- package/dist/instructions/setLockState.d.ts.map +1 -0
- package/dist/instructions/setLockState.js +17 -0
- package/dist/instructions/setLockState.js.map +1 -0
- package/dist/instructions/setTransferConfig.d.ts +25 -0
- package/dist/instructions/setTransferConfig.d.ts.map +1 -0
- package/dist/instructions/setTransferConfig.js +20 -0
- package/dist/instructions/setTransferConfig.js.map +1 -0
- package/dist/instructions/transfer.d.ts +17 -0
- package/dist/instructions/transfer.d.ts.map +1 -0
- package/dist/instructions/transfer.js +67 -0
- package/dist/instructions/transfer.js.map +1 -0
- package/dist/instructions/updateCounter.d.ts +15 -0
- package/dist/instructions/updateCounter.d.ts.map +1 -0
- package/dist/instructions/updateCounter.js +20 -0
- package/dist/instructions/updateCounter.js.map +1 -0
- package/dist/mint-metadata.d.ts +13 -0
- package/dist/mint-metadata.d.ts.map +1 -0
- package/dist/mint-metadata.js +127 -0
- package/dist/mint-metadata.js.map +1 -0
- package/dist/passkeys/index.d.ts +18 -0
- package/dist/passkeys/index.d.ts.map +1 -0
- package/dist/passkeys/index.js +30 -0
- package/dist/passkeys/index.js.map +1 -0
- package/dist/passkeys/internal.d.ts +15 -0
- package/dist/passkeys/internal.d.ts.map +1 -0
- package/dist/passkeys/internal.js +113 -0
- package/dist/passkeys/internal.js.map +1 -0
- package/dist/secp256r1.d.ts +24 -0
- package/dist/secp256r1.d.ts.map +1 -0
- package/dist/secp256r1.js +38 -0
- package/dist/secp256r1.js.map +1 -0
- package/dist/transfer.d.ts +28 -0
- package/dist/transfer.d.ts.map +1 -0
- package/dist/transfer.js +109 -0
- package/dist/transfer.js.map +1 -0
- package/dist/utils/associatedToken.d.ts +3 -0
- package/dist/utils/associatedToken.d.ts.map +1 -0
- package/dist/utils/associatedToken.js +14 -0
- package/dist/utils/associatedToken.js.map +1 -0
- package/dist/utils/consts.d.ts +8 -0
- package/dist/utils/consts.d.ts.map +1 -0
- package/dist/utils/consts.js +9 -0
- package/dist/utils/consts.js.map +1 -0
- package/dist/utils/encoding.d.ts +3 -0
- package/dist/utils/encoding.d.ts.map +1 -0
- package/dist/utils/encoding.js +14 -0
- package/dist/utils/encoding.js.map +1 -0
- package/dist/utils/metadata.d.ts +48 -0
- package/dist/utils/metadata.d.ts.map +1 -0
- package/dist/utils/metadata.js +110 -0
- package/dist/utils/metadata.js.map +1 -0
- package/dist/utils/passkey/index.d.ts +17 -0
- package/dist/utils/passkey/index.d.ts.map +1 -0
- package/dist/utils/passkey/index.js +21 -0
- package/dist/utils/passkey/index.js.map +1 -0
- package/dist/utils/passkey/internal.d.ts +11 -0
- package/dist/utils/passkey/internal.d.ts.map +1 -0
- package/dist/utils/passkey/internal.js +115 -0
- package/dist/utils/passkey/internal.js.map +1 -0
- package/dist/utils/passkey/secp256r1.d.ts +26 -0
- package/dist/utils/passkey/secp256r1.d.ts.map +1 -0
- package/dist/utils/passkey/secp256r1.js +59 -0
- package/dist/utils/passkey/secp256r1.js.map +1 -0
- package/dist/utils/pdas/asset.d.ts +4 -0
- package/dist/utils/pdas/asset.d.ts.map +1 -0
- package/dist/utils/pdas/asset.js +14 -0
- package/dist/utils/pdas/asset.js.map +1 -0
- package/dist/utils/pdas/domainConfig.d.ts +3 -0
- package/dist/utils/pdas/domainConfig.d.ts.map +1 -0
- package/dist/utils/pdas/domainConfig.js +15 -0
- package/dist/utils/pdas/domainConfig.js.map +1 -0
- package/dist/utils/pdas/index.d.ts +3 -0
- package/dist/utils/pdas/index.d.ts.map +1 -0
- package/dist/utils/pdas/index.js +3 -0
- package/dist/utils/pdas/index.js.map +1 -0
- package/dist/utils/slotHash.d.ts +9 -0
- package/dist/utils/slotHash.d.ts.map +1 -0
- package/dist/utils/slotHash.js +39 -0
- package/dist/utils/slotHash.js.map +1 -0
- package/dist/utils/tokenOwner.d.ts +7 -0
- package/dist/utils/tokenOwner.d.ts.map +1 -0
- package/dist/utils/tokenOwner.js +24 -0
- package/dist/utils/tokenOwner.js.map +1 -0
- package/dist/utils/verify.d.ts +8 -0
- package/dist/utils/verify.d.ts.map +1 -0
- package/dist/utils/verify.js +45 -0
- package/dist/utils/verify.js.map +1 -0
- package/dist/utils.d.ts +10 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +42 -0
- package/dist/utils.js.map +1 -0
- package/package.json +41 -0
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { combineCodec, createDecoder, createEncoder, fixDecoderSize, fixEncoderSize, getBytesDecoder, getBytesEncoder, getStructDecoder, getStructEncoder, getU16Decoder, getU16Encoder, getU8Decoder, getU8Encoder, } from "@solana/kit";
|
|
2
|
+
import { SECP256R1_PROGRAM_ADDRESS } from "../consts.js";
|
|
3
|
+
const COMPRESSED_PUBKEY_SERIALIZED_SIZE = 33;
|
|
4
|
+
const SIGNATURE_SERIALIZED_SIZE = 64;
|
|
5
|
+
const SIGNATURE_OFFSETS_SERIALIZED_SIZE = 14;
|
|
6
|
+
const SIGNATURE_OFFSETS_START = 2;
|
|
7
|
+
function getSecp256r1SignatureOffsetsDataEncoder() {
|
|
8
|
+
return getStructEncoder([
|
|
9
|
+
["signatureOffset", getU16Encoder()],
|
|
10
|
+
["signatureInstructionIndex", getU16Encoder()],
|
|
11
|
+
["publicKeyOffset", getU16Encoder()],
|
|
12
|
+
["publicKeyInstructionIndex", getU16Encoder()],
|
|
13
|
+
["messageDataOffset", getU16Encoder()],
|
|
14
|
+
["messageDataSize", getU16Encoder()],
|
|
15
|
+
["messageInstructionIndex", getU16Encoder()],
|
|
16
|
+
]);
|
|
17
|
+
}
|
|
18
|
+
function getSecp256r1SignatureOffsetsDataDecoder() {
|
|
19
|
+
return getStructDecoder([
|
|
20
|
+
["signatureOffset", getU16Decoder()],
|
|
21
|
+
["signatureInstructionIndex", getU16Decoder()],
|
|
22
|
+
["publicKeyOffset", getU16Decoder()],
|
|
23
|
+
["publicKeyInstructionIndex", getU16Decoder()],
|
|
24
|
+
["messageDataOffset", getU16Decoder()],
|
|
25
|
+
["messageDataSize", getU16Decoder()],
|
|
26
|
+
["messageInstructionIndex", getU16Decoder()],
|
|
27
|
+
]);
|
|
28
|
+
}
|
|
29
|
+
function getSecp256r1VerifyInstructionDataEncoder() {
|
|
30
|
+
return createEncoder({
|
|
31
|
+
getSizeFromValue: (value) => {
|
|
32
|
+
const offsetSize = SIGNATURE_OFFSETS_SERIALIZED_SIZE * value.offsets.length;
|
|
33
|
+
const payloadSize = value.payload.reduce((sum, entry) => {
|
|
34
|
+
return (sum +
|
|
35
|
+
COMPRESSED_PUBKEY_SERIALIZED_SIZE +
|
|
36
|
+
SIGNATURE_SERIALIZED_SIZE +
|
|
37
|
+
entry.message.length);
|
|
38
|
+
}, 0);
|
|
39
|
+
return 2 + offsetSize + payloadSize;
|
|
40
|
+
},
|
|
41
|
+
write: (value, bytes, offset = 0) => {
|
|
42
|
+
offset = getU8Encoder().write(value.numSignatures, bytes, offset);
|
|
43
|
+
offset = getU8Encoder().write(value.padding, bytes, offset);
|
|
44
|
+
const offsetEncoder = getSecp256r1SignatureOffsetsDataEncoder();
|
|
45
|
+
for (const offsetEntry of value.offsets) {
|
|
46
|
+
offset = offsetEncoder.write(offsetEntry, bytes, offset);
|
|
47
|
+
}
|
|
48
|
+
for (const entry of value.payload) {
|
|
49
|
+
offset = fixEncoderSize(getBytesEncoder(), COMPRESSED_PUBKEY_SERIALIZED_SIZE).write(entry.publicKey, bytes, offset);
|
|
50
|
+
offset = fixEncoderSize(getBytesEncoder(), SIGNATURE_SERIALIZED_SIZE).write(entry.signature, bytes, offset);
|
|
51
|
+
offset = getBytesEncoder().write(entry.message, bytes, offset);
|
|
52
|
+
}
|
|
53
|
+
return offset;
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
function getSecp256r1VerifyInstructionDataDecoder() {
|
|
58
|
+
return createDecoder({
|
|
59
|
+
read: (bytes, offset = 0) => {
|
|
60
|
+
const numSignatures = getU8Decoder().decode(bytes, offset);
|
|
61
|
+
offset += 1;
|
|
62
|
+
const padding = getU8Decoder().decode(bytes, offset);
|
|
63
|
+
offset += 1;
|
|
64
|
+
const offsets = [];
|
|
65
|
+
const offsetDecoder = getSecp256r1SignatureOffsetsDataDecoder();
|
|
66
|
+
for (let i = 0; i < numSignatures; i += 1) {
|
|
67
|
+
offsets.push(offsetDecoder.decode(bytes, offset));
|
|
68
|
+
offset += SIGNATURE_OFFSETS_SERIALIZED_SIZE;
|
|
69
|
+
}
|
|
70
|
+
const payload = [];
|
|
71
|
+
for (let i = 0; i < numSignatures; i += 1) {
|
|
72
|
+
const publicKey = fixDecoderSize(getBytesDecoder(), COMPRESSED_PUBKEY_SERIALIZED_SIZE).decode(bytes, offset);
|
|
73
|
+
offset += COMPRESSED_PUBKEY_SERIALIZED_SIZE;
|
|
74
|
+
const signature = fixDecoderSize(getBytesDecoder(), SIGNATURE_SERIALIZED_SIZE).decode(bytes, offset);
|
|
75
|
+
offset += SIGNATURE_SERIALIZED_SIZE;
|
|
76
|
+
const messageSize = offsets[i].messageDataSize;
|
|
77
|
+
const message = fixDecoderSize(getBytesDecoder(), messageSize).decode(bytes, offset);
|
|
78
|
+
offset += messageSize;
|
|
79
|
+
payload.push({ publicKey, signature, message });
|
|
80
|
+
}
|
|
81
|
+
return [
|
|
82
|
+
{
|
|
83
|
+
numSignatures,
|
|
84
|
+
padding,
|
|
85
|
+
offsets,
|
|
86
|
+
payload,
|
|
87
|
+
},
|
|
88
|
+
offset,
|
|
89
|
+
];
|
|
90
|
+
},
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
export function getSecp256r1VerifyInstructionDataCodec() {
|
|
94
|
+
return combineCodec(getSecp256r1VerifyInstructionDataEncoder(), getSecp256r1VerifyInstructionDataDecoder());
|
|
95
|
+
}
|
|
96
|
+
export function getSecp256r1VerifyInstruction(input, config) {
|
|
97
|
+
const numSignatures = input.length;
|
|
98
|
+
let currentOffset = SIGNATURE_OFFSETS_START + numSignatures * SIGNATURE_OFFSETS_SERIALIZED_SIZE;
|
|
99
|
+
const offsets = [];
|
|
100
|
+
for (let i = 0; i < numSignatures; i += 1) {
|
|
101
|
+
const { message } = input[i];
|
|
102
|
+
const publicKeyOffset = currentOffset;
|
|
103
|
+
const signatureOffset = publicKeyOffset + COMPRESSED_PUBKEY_SERIALIZED_SIZE;
|
|
104
|
+
const messageDataOffset = signatureOffset + SIGNATURE_SERIALIZED_SIZE;
|
|
105
|
+
offsets.push({
|
|
106
|
+
publicKeyOffset,
|
|
107
|
+
publicKeyInstructionIndex: 0xffff,
|
|
108
|
+
signatureOffset,
|
|
109
|
+
signatureInstructionIndex: 0xffff,
|
|
110
|
+
messageDataOffset,
|
|
111
|
+
messageDataSize: message.length,
|
|
112
|
+
messageInstructionIndex: 0xffff,
|
|
113
|
+
});
|
|
114
|
+
currentOffset +=
|
|
115
|
+
COMPRESSED_PUBKEY_SERIALIZED_SIZE +
|
|
116
|
+
SIGNATURE_SERIALIZED_SIZE +
|
|
117
|
+
message.length;
|
|
118
|
+
}
|
|
119
|
+
const programAddress = config?.programAddress ?? SECP256R1_PROGRAM_ADDRESS;
|
|
120
|
+
const args = {
|
|
121
|
+
numSignatures,
|
|
122
|
+
padding: 0,
|
|
123
|
+
offsets,
|
|
124
|
+
payload: input,
|
|
125
|
+
};
|
|
126
|
+
return {
|
|
127
|
+
accounts: [],
|
|
128
|
+
programAddress,
|
|
129
|
+
data: getSecp256r1VerifyInstructionDataEncoder().encode(args),
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=secp256r1Verify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secp256r1Verify.js","sourceRoot":"","sources":["../../src/instructions/secp256r1Verify.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type Address, type Instruction, type Rpc, type SolanaRpcApi, type TransactionSigner } from "@solana/kit";
|
|
2
|
+
export type SetLockStateParams = {
|
|
3
|
+
locked: boolean;
|
|
4
|
+
/** When unlocked, optionally restrict the claim to this wallet. */
|
|
5
|
+
unlockRecipient?: Address | null;
|
|
6
|
+
};
|
|
7
|
+
export type ConfigureLockInput = {
|
|
8
|
+
rpc: Rpc<SolanaRpcApi>;
|
|
9
|
+
mint: Address;
|
|
10
|
+
/** Must be the wallet that currently holds the NFT. */
|
|
11
|
+
owner: TransactionSigner;
|
|
12
|
+
/** Pays rent if the mint account must grow. Defaults to `owner`. */
|
|
13
|
+
payer?: TransactionSigner;
|
|
14
|
+
} & SetLockStateParams;
|
|
15
|
+
/**
|
|
16
|
+
* Builds a `set_lock_state` instruction for an NFT the owner currently holds.
|
|
17
|
+
*/
|
|
18
|
+
export declare function setLockState(input: ConfigureLockInput): Promise<Instruction>;
|
|
19
|
+
//# sourceMappingURL=setLockState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setLockState.d.ts","sourceRoot":"","sources":["../../src/instructions/setLockState.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,WAAW,EAChB,KAAK,GAAG,EACR,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACvB,MAAM,aAAa,CAAC;AAIrB,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,OAAO,CAAC;IAChB,mEAAmE;IACnE,eAAe,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,GAAG,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;IACvB,IAAI,EAAE,OAAO,CAAC;IACd,uDAAuD;IACvD,KAAK,EAAE,iBAAiB,CAAC;IACzB,oEAAoE;IACpE,KAAK,CAAC,EAAE,iBAAiB,CAAC;CAC3B,GAAG,kBAAkB,CAAC;AAEvB;;GAEG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC,WAAW,CAAC,CAWtB"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { getSetLockStateInstructionAsync } from "../generated/index.js";
|
|
2
|
+
import { TOKEN_2022_PROGRAM_ADDRESS } from "../utils/consts.js";
|
|
3
|
+
/**
|
|
4
|
+
* Builds a `set_lock_state` instruction for an NFT the owner currently holds.
|
|
5
|
+
*/
|
|
6
|
+
export async function setLockState(input) {
|
|
7
|
+
const payer = input.payer ?? input.owner;
|
|
8
|
+
return getSetLockStateInstructionAsync({
|
|
9
|
+
payer,
|
|
10
|
+
owner: input.owner,
|
|
11
|
+
tokenMint: input.mint,
|
|
12
|
+
tokenProgram: TOKEN_2022_PROGRAM_ADDRESS,
|
|
13
|
+
locked: input.locked,
|
|
14
|
+
unlockRecipient: input.unlockRecipient ?? null,
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=setLockState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setLockState.js","sourceRoot":"","sources":["../../src/instructions/setLockState.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,+BAA+B,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAiB7D;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,KAAyB;IAEzB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC;IAEzC,OAAO,+BAA+B,CAAC;QACrC,KAAK;QACL,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,SAAS,EAAE,KAAK,CAAC,IAAI;QACrB,YAAY,EAAE,0BAA0B;QACxC,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,eAAe,EAAE,KAAK,CAAC,eAAe,IAAI,IAAI;KAC/C,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type Address, type Instruction, type Rpc, type SolanaRpcApi, type TransactionSigner } from "@solana/kit";
|
|
2
|
+
export type SetTransferConfigParams = {
|
|
3
|
+
/** Sale price in lamports (native SOL) or smallest units of `paymentTokenMint`. */
|
|
4
|
+
price: bigint | number;
|
|
5
|
+
/** SPL mint used for payment. Required when `price > 0`. */
|
|
6
|
+
paymentTokenMint?: Address | null;
|
|
7
|
+
/** Token program for `paymentTokenMint`. Required when `paymentTokenMint` is set. */
|
|
8
|
+
paymentTokenProgram?: Address | null;
|
|
9
|
+
/** Restrict transfers to this wallet. Omit or `null` to allow any recipient. */
|
|
10
|
+
allowedRecipient?: Address | null;
|
|
11
|
+
};
|
|
12
|
+
export type ConfigureTransferInput = {
|
|
13
|
+
rpc: Rpc<SolanaRpcApi>;
|
|
14
|
+
mint: Address;
|
|
15
|
+
/** Must be the wallet that currently holds the NFT. */
|
|
16
|
+
owner: TransactionSigner;
|
|
17
|
+
/** Pays rent if the mint account must grow. Defaults to `owner`. */
|
|
18
|
+
payer?: TransactionSigner;
|
|
19
|
+
} & SetTransferConfigParams;
|
|
20
|
+
/**
|
|
21
|
+
* Builds a `set_transfer_config` instruction for an NFT the owner currently holds.
|
|
22
|
+
* Resolves the owner token ATA and program authority automatically.
|
|
23
|
+
*/
|
|
24
|
+
export declare function setTransferConfig(input: ConfigureTransferInput): Promise<Instruction>;
|
|
25
|
+
//# sourceMappingURL=setTransferConfig.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setTransferConfig.d.ts","sourceRoot":"","sources":["../../src/instructions/setTransferConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,WAAW,EAChB,KAAK,GAAG,EACR,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACvB,MAAM,aAAa,CAAC;AAIrB,MAAM,MAAM,uBAAuB,GAAG;IACpC,mFAAmF;IACnF,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,4DAA4D;IAC5D,gBAAgB,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAClC,qFAAqF;IACrF,mBAAmB,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACrC,gFAAgF;IAChF,gBAAgB,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,GAAG,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;IACvB,IAAI,EAAE,OAAO,CAAC;IACd,uDAAuD;IACvD,KAAK,EAAE,iBAAiB,CAAC;IACzB,oEAAoE;IACpE,KAAK,CAAC,EAAE,iBAAiB,CAAC;CAC3B,GAAG,uBAAuB,CAAC;AAE5B;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,sBAAsB,GAC5B,OAAO,CAAC,WAAW,CAAC,CActB"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { getSetTransferConfigInstructionAsync } from "../generated/index.js";
|
|
2
|
+
import { TOKEN_2022_PROGRAM_ADDRESS } from "../utils/consts.js";
|
|
3
|
+
/**
|
|
4
|
+
* Builds a `set_transfer_config` instruction for an NFT the owner currently holds.
|
|
5
|
+
* Resolves the owner token ATA and program authority automatically.
|
|
6
|
+
*/
|
|
7
|
+
export async function setTransferConfig(input) {
|
|
8
|
+
const payer = input.payer ?? input.owner;
|
|
9
|
+
return getSetTransferConfigInstructionAsync({
|
|
10
|
+
payer,
|
|
11
|
+
owner: input.owner,
|
|
12
|
+
tokenMint: input.mint,
|
|
13
|
+
tokenProgram: TOKEN_2022_PROGRAM_ADDRESS,
|
|
14
|
+
price: input.price,
|
|
15
|
+
paymentTokenMint: input.paymentTokenMint ?? null,
|
|
16
|
+
paymentTokenProgram: input.paymentTokenProgram ?? null,
|
|
17
|
+
allowedRecipient: input.allowedRecipient ?? null,
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=setTransferConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setTransferConfig.js","sourceRoot":"","sources":["../../src/instructions/setTransferConfig.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,oCAAoC,EAAE,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAsB7D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,KAA6B;IAG7B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC;IAEzC,OAAO,oCAAoC,CAAC;QAC1C,KAAK;QACL,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,SAAS,EAAE,KAAK,CAAC,IAAI;QACrB,YAAY,EAAE,0BAA0B;QACxC,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,IAAI,IAAI;QAChD,mBAAmB,EAAE,KAAK,CAAC,mBAAmB,IAAI,IAAI;QACtD,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,IAAI,IAAI;KACjD,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type Instruction, type Rpc, type SolanaRpcApi, type TransactionSigner } from "@solana/kit";
|
|
2
|
+
import { type AuthenticationResponseJSON } from "@simplewebauthn/browser";
|
|
3
|
+
import { type AssetDisplayInfo } from "../utils/metadata.js";
|
|
4
|
+
export type TransferSession = {
|
|
5
|
+
rpc: Rpc<SolanaRpcApi>;
|
|
6
|
+
displayInfo: AssetDisplayInfo;
|
|
7
|
+
slotHash: Uint8Array;
|
|
8
|
+
slotNumber: bigint;
|
|
9
|
+
challenge: Uint8Array;
|
|
10
|
+
};
|
|
11
|
+
export declare function beginTransfer(input: {
|
|
12
|
+
rpc: Rpc<SolanaRpcApi>;
|
|
13
|
+
displayInfo: AssetDisplayInfo;
|
|
14
|
+
}): Promise<TransferSession>;
|
|
15
|
+
export declare function authenticateToken(session: TransferSession): Promise<AuthenticationResponseJSON>;
|
|
16
|
+
export declare function completeTransfer(session: TransferSession, response: AuthenticationResponseJSON, recipient: TransactionSigner): Promise<Instruction[]>;
|
|
17
|
+
//# sourceMappingURL=transfer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transfer.d.ts","sourceRoot":"","sources":["../../src/instructions/transfer.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,GAAG,EACR,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACvB,MAAM,aAAa,CAAC;AACrB,OAAO,EAGL,KAAK,0BAA0B,EAChC,MAAM,yBAAyB,CAAC;AAMjC,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAS7D,MAAM,MAAM,eAAe,GAAG;IAC5B,GAAG,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;IACvB,WAAW,EAAE,gBAAgB,CAAC;IAC9B,QAAQ,EAAE,UAAU,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,UAAU,CAAC;CACvB,CAAC;AAOF,wBAAsB,aAAa,CAAC,KAAK,EAAE;IACzC,GAAG,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;IACvB,WAAW,EAAE,gBAAgB,CAAC;CAC/B,GAAG,OAAO,CAAC,eAAe,CAAC,CAgB3B;AAGD,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,0BAA0B,CAAC,CAmBrC;AAGD,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,eAAe,EACxB,QAAQ,EAAE,0BAA0B,EACpC,SAAS,EAAE,iBAAiB,GAC3B,OAAO,CAAC,WAAW,EAAE,CAAC,CA2CxB"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import {} from "@solana/kit";
|
|
2
|
+
import { bufferToBase64URLString, startAuthentication, } from "@simplewebauthn/browser";
|
|
3
|
+
import { RP_ID, TOKEN_2022_PROGRAM_ADDRESS, TRANSFER_HOOK_PROGRAM_ADDRESS, } from "../utils/consts.js";
|
|
4
|
+
import {} from "../utils/metadata.js";
|
|
5
|
+
import { buildSecp256r1VerifyInstructionFromWebAuthn, buildTransferChallenge, } from "../utils/passkey/secp256r1.js";
|
|
6
|
+
import { getLatestSlotHash } from "../utils/slotHash.js";
|
|
7
|
+
import { getExecuteTransferInstructionAsync } from "../generated/index.js";
|
|
8
|
+
import { findAssociatedTokenAddress } from "../utils/associatedToken.js";
|
|
9
|
+
export async function beginTransfer(input) {
|
|
10
|
+
const { slotHash, slotNumber } = await getLatestSlotHash(input.rpc);
|
|
11
|
+
const challenge = await buildTransferChallenge({
|
|
12
|
+
tokenProgram: TOKEN_2022_PROGRAM_ADDRESS,
|
|
13
|
+
asset: input.displayInfo.asset,
|
|
14
|
+
sender: input.displayInfo.currentOwner,
|
|
15
|
+
slotHash,
|
|
16
|
+
});
|
|
17
|
+
return {
|
|
18
|
+
rpc: input.rpc,
|
|
19
|
+
displayInfo: input.displayInfo,
|
|
20
|
+
slotHash,
|
|
21
|
+
slotNumber,
|
|
22
|
+
challenge,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export async function authenticateToken(session) {
|
|
26
|
+
return startAuthentication({
|
|
27
|
+
optionsJSON: {
|
|
28
|
+
challenge: bufferToBase64URLString(new Uint8Array(session.challenge).buffer),
|
|
29
|
+
rpId: RP_ID,
|
|
30
|
+
userVerification: "preferred",
|
|
31
|
+
allowCredentials: [
|
|
32
|
+
{
|
|
33
|
+
id: bufferToBase64URLString(crypto.getRandomValues(new Uint8Array(32)).buffer),
|
|
34
|
+
type: "public-key",
|
|
35
|
+
transports: ["nfc"],
|
|
36
|
+
},
|
|
37
|
+
],
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
export async function completeTransfer(session, response, recipient) {
|
|
42
|
+
const tokenProgram = TOKEN_2022_PROGRAM_ADDRESS;
|
|
43
|
+
const { secp256r1Verify, origin, crossOrigin, truncatedClientDataJson, domainConfig, } = await buildSecp256r1VerifyInstructionFromWebAuthn({
|
|
44
|
+
response,
|
|
45
|
+
session,
|
|
46
|
+
});
|
|
47
|
+
const recipientTokenAccount = await findAssociatedTokenAddress(recipient.address, session.displayInfo.mint, tokenProgram);
|
|
48
|
+
const senderTokenAccount = await findAssociatedTokenAddress(session.displayInfo.currentOwner, session.displayInfo.mint, tokenProgram);
|
|
49
|
+
const executeTransfer = await getExecuteTransferInstructionAsync({
|
|
50
|
+
domainConfig,
|
|
51
|
+
recipient,
|
|
52
|
+
sender: session.displayInfo.currentOwner,
|
|
53
|
+
asset: session.displayInfo.asset,
|
|
54
|
+
mint: session.displayInfo.mint,
|
|
55
|
+
senderTokenAccount,
|
|
56
|
+
recipientTokenAccount,
|
|
57
|
+
transferHookProgram: TRANSFER_HOOK_PROGRAM_ADDRESS,
|
|
58
|
+
tokenProgram,
|
|
59
|
+
signedMessageIndex: 0,
|
|
60
|
+
slotNumber: session.slotNumber,
|
|
61
|
+
origin,
|
|
62
|
+
crossOrigin,
|
|
63
|
+
truncatedClientDataJson,
|
|
64
|
+
});
|
|
65
|
+
return [secp256r1Verify, executeTransfer];
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=transfer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transfer.js","sourceRoot":"","sources":["../../src/instructions/transfer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Address, Instruction } from "@solana/kit";
|
|
2
|
+
/**
|
|
3
|
+
* Builds the `[secp256r1Verify, updateCounter]` instruction pair that syncs the card's
|
|
4
|
+
* on-chain counter to a freshly tapped URL, without transferring the card.
|
|
5
|
+
*
|
|
6
|
+
* Off-chain verification advances the physical tag counter while the chain stays put, so
|
|
7
|
+
* the on-chain counter drifts behind and old captured taps could still be replayed. Call
|
|
8
|
+
* this with the latest tap to close that gap and invalidate every earlier URL. It is
|
|
9
|
+
* permissionless — whoever submits the transaction pays the fee.
|
|
10
|
+
*/
|
|
11
|
+
export declare function buildUpdateCounterInstructions(input: {
|
|
12
|
+
params: URLSearchParams;
|
|
13
|
+
cardInstance: Address;
|
|
14
|
+
}): Promise<Instruction[]>;
|
|
15
|
+
//# sourceMappingURL=updateCounter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updateCounter.d.ts","sourceRoot":"","sources":["../../src/instructions/updateCounter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAIxD;;;;;;;;GAQG;AAEH,wBAAsB,8BAA8B,CAAC,KAAK,EAAE;IAC1D,MAAM,EAAE,eAAe,CAAC;IACxB,YAAY,EAAE,OAAO,CAAC;CACvB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAYzB"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { getUpdateCounterInstruction } from "../generated/index.js";
|
|
2
|
+
import { buildTapVerifyInstruction } from "./transfer.js";
|
|
3
|
+
/**
|
|
4
|
+
* Builds the `[secp256r1Verify, updateCounter]` instruction pair that syncs the card's
|
|
5
|
+
* on-chain counter to a freshly tapped URL, without transferring the card.
|
|
6
|
+
*
|
|
7
|
+
* Off-chain verification advances the physical tag counter while the chain stays put, so
|
|
8
|
+
* the on-chain counter drifts behind and old captured taps could still be replayed. Call
|
|
9
|
+
* this with the latest tap to close that gap and invalidate every earlier URL. It is
|
|
10
|
+
* permissionless — whoever submits the transaction pays the fee.
|
|
11
|
+
*/
|
|
12
|
+
export async function buildUpdateCounterInstructions(input) {
|
|
13
|
+
const secp256r1Verify = await buildTapVerifyInstruction(input.params, input.cardInstance);
|
|
14
|
+
const updateCounter = getUpdateCounterInstruction({
|
|
15
|
+
cardInstance: input.cardInstance,
|
|
16
|
+
secp256r1VerifyArgs: { instructionIndex: 0, signedMessageIndex: 0 },
|
|
17
|
+
});
|
|
18
|
+
return [secp256r1Verify, updateCounter];
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=updateCounter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updateCounter.js","sourceRoot":"","sources":["../../src/instructions/updateCounter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAEvD;;;;;;;;GAQG;AAEH,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAAC,KAGpD;IACC,MAAM,eAAe,GAAG,MAAM,yBAAyB,CACrD,KAAK,CAAC,MAAM,EACZ,KAAK,CAAC,YAAY,CACnB,CAAC;IAEF,MAAM,aAAa,GAAG,2BAA2B,CAAC;QAChD,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,mBAAmB,EAAE,EAAE,gBAAgB,EAAE,CAAC,EAAE,kBAAkB,EAAE,CAAC,EAAE;KACpE,CAAC,CAAC;IAEH,OAAO,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type Address, type Rpc, type SolanaRpcApi } from "@solana/kit";
|
|
2
|
+
export type TransferMintContext = {
|
|
3
|
+
tokenMint: Address;
|
|
4
|
+
groupMint: Address;
|
|
5
|
+
domainConfig: Address;
|
|
6
|
+
groupOwner: Address;
|
|
7
|
+
domainAuthority: Address;
|
|
8
|
+
secp256r1Pubkey: Uint8Array;
|
|
9
|
+
transferPrice: bigint;
|
|
10
|
+
paymentTokenMint: Address | null;
|
|
11
|
+
};
|
|
12
|
+
export declare function resolveTransferMintContext(rpc: Rpc<SolanaRpcApi>, tokenMint: Address): Promise<TransferMintContext>;
|
|
13
|
+
//# sourceMappingURL=mint-metadata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mint-metadata.d.ts","sourceRoot":"","sources":["../src/mint-metadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,OAAO,EACZ,KAAK,GAAG,EACR,KAAK,YAAY,EAClB,MAAM,aAAa,CAAC;AAerB,MAAM,MAAM,mBAAmB,GAAG;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;IACzB,eAAe,EAAE,UAAU,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,OAAO,GAAG,IAAI,CAAC;CAClC,CAAC;AAyHF,wBAAsB,0BAA0B,CAC9C,GAAG,EAAE,GAAG,CAAC,YAAY,CAAC,EACtB,SAAS,EAAE,OAAO,GACjB,OAAO,CAAC,mBAAmB,CAAC,CA6C9B"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { address, getAddressDecoder, } from "@solana/kit";
|
|
2
|
+
import { METADATA_KEY_DOMAIN_CONFIG, METADATA_KEY_PAYMENT_TOKEN_MINT, METADATA_KEY_ROYALTY_OWNER, METADATA_KEY_SECP256R1, METADATA_KEY_TRANSFER_PRICE, TOKEN_GROUP_MEMBER_EXTENSION_TYPE, TOKEN_METADATA_EXTENSION_TYPE, } from "././consts.js";
|
|
3
|
+
import { fetchDomainConfig } from "././generated/index.js";
|
|
4
|
+
import { fetchAccountData } from "././utils/index.js";
|
|
5
|
+
const MINT_ACCOUNT_SIZE = 82;
|
|
6
|
+
function readU16LE(data, offset) {
|
|
7
|
+
return data[offset] | (data[offset + 1] << 8);
|
|
8
|
+
}
|
|
9
|
+
function readU32LE(data, offset) {
|
|
10
|
+
return (data[offset] |
|
|
11
|
+
(data[offset + 1] << 8) |
|
|
12
|
+
(data[offset + 2] << 16) |
|
|
13
|
+
(data[offset + 3] << 24));
|
|
14
|
+
}
|
|
15
|
+
function readBorshString(data, offset) {
|
|
16
|
+
const length = readU32LE(data, offset);
|
|
17
|
+
const start = offset + 4;
|
|
18
|
+
const end = start + length;
|
|
19
|
+
const value = new TextDecoder().decode(data.subarray(start, end));
|
|
20
|
+
return { value, offset: end };
|
|
21
|
+
}
|
|
22
|
+
function readOptionalPubkey(data, offset) {
|
|
23
|
+
const tag = data[offset];
|
|
24
|
+
return { offset: tag === 0 ? offset + 1 : offset + 33 };
|
|
25
|
+
}
|
|
26
|
+
function parseTokenMetadataExtension(data) {
|
|
27
|
+
const fields = new Map();
|
|
28
|
+
let offset = 0;
|
|
29
|
+
({ offset } = readOptionalPubkey(data, offset));
|
|
30
|
+
offset += 32;
|
|
31
|
+
for (let i = 0; i < 3; i += 1) {
|
|
32
|
+
const parsed = readBorshString(data, offset);
|
|
33
|
+
offset = parsed.offset;
|
|
34
|
+
}
|
|
35
|
+
const additionalCount = readU32LE(data, offset);
|
|
36
|
+
offset += 4;
|
|
37
|
+
for (let i = 0; i < additionalCount; i += 1) {
|
|
38
|
+
const key = readBorshString(data, offset);
|
|
39
|
+
const value = readBorshString(data, key.offset);
|
|
40
|
+
fields.set(key.value, value.value);
|
|
41
|
+
offset = value.offset;
|
|
42
|
+
}
|
|
43
|
+
return fields;
|
|
44
|
+
}
|
|
45
|
+
function parseGroupMint(data) {
|
|
46
|
+
if (data.length < 64) {
|
|
47
|
+
throw new Error("TokenGroupMember extension is too short");
|
|
48
|
+
}
|
|
49
|
+
return getAddressDecoder().decode(data.subarray(32, 64));
|
|
50
|
+
}
|
|
51
|
+
function walkMintExtensions(data) {
|
|
52
|
+
let groupMint = null;
|
|
53
|
+
let metadata = new Map();
|
|
54
|
+
let offset = MINT_ACCOUNT_SIZE;
|
|
55
|
+
while (offset + 4 <= data.length) {
|
|
56
|
+
const extensionType = readU16LE(data, offset);
|
|
57
|
+
const extensionLength = readU16LE(data, offset + 2);
|
|
58
|
+
const extensionStart = offset + 4;
|
|
59
|
+
const extensionEnd = extensionStart + extensionLength;
|
|
60
|
+
if (extensionEnd > data.length) {
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
const extensionData = data.subarray(extensionStart, extensionEnd);
|
|
64
|
+
if (extensionType === TOKEN_GROUP_MEMBER_EXTENSION_TYPE) {
|
|
65
|
+
groupMint = parseGroupMint(extensionData);
|
|
66
|
+
}
|
|
67
|
+
if (extensionType === TOKEN_METADATA_EXTENSION_TYPE) {
|
|
68
|
+
metadata = parseTokenMetadataExtension(extensionData);
|
|
69
|
+
}
|
|
70
|
+
offset = extensionEnd;
|
|
71
|
+
}
|
|
72
|
+
return { groupMint, metadata };
|
|
73
|
+
}
|
|
74
|
+
function parseOptionalAddress(value) {
|
|
75
|
+
if (!value || value.length === 0) {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
return address(value);
|
|
79
|
+
}
|
|
80
|
+
function parseTransferPrice(value) {
|
|
81
|
+
if (!value || value.length === 0) {
|
|
82
|
+
return 0n;
|
|
83
|
+
}
|
|
84
|
+
return BigInt(value);
|
|
85
|
+
}
|
|
86
|
+
function decodeSecp256r1Pubkey(encoded) {
|
|
87
|
+
const binary = atob(encoded);
|
|
88
|
+
const bytes = Uint8Array.from(binary, (char) => char.charCodeAt(0));
|
|
89
|
+
if (bytes.length !== 33) {
|
|
90
|
+
throw new Error("Expected a 33-byte compressed secp256r1 public key");
|
|
91
|
+
}
|
|
92
|
+
return bytes;
|
|
93
|
+
}
|
|
94
|
+
export async function resolveTransferMintContext(rpc, tokenMint) {
|
|
95
|
+
const tokenMintData = await fetchAccountData(rpc, tokenMint);
|
|
96
|
+
const tokenExtensions = walkMintExtensions(tokenMintData);
|
|
97
|
+
if (!tokenExtensions.groupMint) {
|
|
98
|
+
throw new Error("Token mint is missing a TokenGroupMember extension");
|
|
99
|
+
}
|
|
100
|
+
const groupMintData = await fetchAccountData(rpc, tokenExtensions.groupMint);
|
|
101
|
+
const groupExtensions = walkMintExtensions(groupMintData);
|
|
102
|
+
const domainConfigValue = groupExtensions.metadata.get(METADATA_KEY_DOMAIN_CONFIG);
|
|
103
|
+
if (!domainConfigValue) {
|
|
104
|
+
throw new Error("Collection mint is missing domain config metadata");
|
|
105
|
+
}
|
|
106
|
+
const royaltyOwnerValue = groupExtensions.metadata.get(METADATA_KEY_ROYALTY_OWNER);
|
|
107
|
+
if (!royaltyOwnerValue) {
|
|
108
|
+
throw new Error("Collection mint is missing royalty owner metadata");
|
|
109
|
+
}
|
|
110
|
+
const secp256r1Value = tokenExtensions.metadata.get(METADATA_KEY_SECP256R1);
|
|
111
|
+
if (!secp256r1Value) {
|
|
112
|
+
throw new Error("Token mint is missing secp256r1 passkey metadata");
|
|
113
|
+
}
|
|
114
|
+
const domainConfig = address(domainConfigValue);
|
|
115
|
+
const domainConfigAccount = await fetchDomainConfig(rpc, domainConfig);
|
|
116
|
+
return {
|
|
117
|
+
tokenMint,
|
|
118
|
+
groupMint: tokenExtensions.groupMint,
|
|
119
|
+
domainConfig,
|
|
120
|
+
groupOwner: address(royaltyOwnerValue),
|
|
121
|
+
domainAuthority: domainConfigAccount.data.authority,
|
|
122
|
+
secp256r1Pubkey: decodeSecp256r1Pubkey(secp256r1Value),
|
|
123
|
+
transferPrice: parseTransferPrice(tokenExtensions.metadata.get(METADATA_KEY_TRANSFER_PRICE)),
|
|
124
|
+
paymentTokenMint: parseOptionalAddress(tokenExtensions.metadata.get(METADATA_KEY_PAYMENT_TOKEN_MINT)),
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=mint-metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mint-metadata.js","sourceRoot":"","sources":["../src/mint-metadata.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { AuthenticationResponseJSON } from "@simplewebauthn/browser";
|
|
2
|
+
import type { Address, Rpc, SolanaRpcApi } from "@solana/kit";
|
|
3
|
+
export { base64URLStringToBuffer, convertSignatureDERtoRS, extractAdditionalFields, getSecp256r1Message, parseOrigins, parseWebAuthnClientData, } from "./internal";
|
|
4
|
+
export declare function getOriginIndex(rpc: Rpc<SolanaRpcApi>, domainConfig: Address, origin: string): Promise<number>;
|
|
5
|
+
export declare function buildSecp256r1VerifyInputFromWebAuthn(input: {
|
|
6
|
+
response: AuthenticationResponseJSON;
|
|
7
|
+
compressedPubkey: Uint8Array;
|
|
8
|
+
}): {
|
|
9
|
+
verifyInput: {
|
|
10
|
+
publicKey: Uint8Array<ArrayBufferLike>;
|
|
11
|
+
signature: Uint8Array<ArrayBufferLike>;
|
|
12
|
+
message: Uint8Array<ArrayBufferLike>;
|
|
13
|
+
}[];
|
|
14
|
+
crossOrigin: boolean;
|
|
15
|
+
truncatedClientDataJson: Uint8Array<ArrayBuffer>;
|
|
16
|
+
origin: string;
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/passkeys/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAU9D,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,uBAAuB,EACvB,mBAAmB,EACnB,YAAY,EACZ,uBAAuB,GACxB,MAAM,YAAY,CAAC;AAEpB,wBAAsB,cAAc,CAClC,GAAG,EAAE,GAAG,CAAC,YAAY,CAAC,EACtB,YAAY,EAAE,OAAO,EACrB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAQjB;AAED,wBAAgB,qCAAqC,CAAC,KAAK,EAAE;IAC3D,QAAQ,EAAE,0BAA0B,CAAC;IACrC,gBAAgB,EAAE,UAAU,CAAC;CAC9B;;;;;;;;;EAqBA"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { fetchDomainConfig } from "../generated/index.js";
|
|
2
|
+
import { base64URLStringToBuffer, convertSignatureDERtoRS, getSecp256r1Message, parseOrigins, parseWebAuthnClientData, } from "././internal.js";
|
|
3
|
+
export { base64URLStringToBuffer, convertSignatureDERtoRS, extractAdditionalFields, getSecp256r1Message, parseOrigins, parseWebAuthnClientData, } from "././internal.js";
|
|
4
|
+
export async function getOriginIndex(rpc, domainConfig, origin) {
|
|
5
|
+
const { data } = await fetchDomainConfig(rpc, domainConfig);
|
|
6
|
+
const origins = parseOrigins(data.origins, data.numOrigins);
|
|
7
|
+
const index = origins.findIndex((entry) => entry === origin);
|
|
8
|
+
if (index === -1) {
|
|
9
|
+
throw new Error(`Origin not found in domain config: ${origin}`);
|
|
10
|
+
}
|
|
11
|
+
return index;
|
|
12
|
+
}
|
|
13
|
+
export function buildSecp256r1VerifyInputFromWebAuthn(input) {
|
|
14
|
+
const clientData = parseWebAuthnClientData(input.response.response.clientDataJSON);
|
|
15
|
+
const signature = convertSignatureDERtoRS(base64URLStringToBuffer(input.response.response.signature));
|
|
16
|
+
const message = getSecp256r1Message(input.response);
|
|
17
|
+
return {
|
|
18
|
+
verifyInput: [
|
|
19
|
+
{
|
|
20
|
+
publicKey: input.compressedPubkey,
|
|
21
|
+
signature,
|
|
22
|
+
message,
|
|
23
|
+
},
|
|
24
|
+
],
|
|
25
|
+
crossOrigin: clientData.crossOrigin,
|
|
26
|
+
truncatedClientDataJson: clientData.truncatedClientDataJson,
|
|
27
|
+
origin: clientData.origin,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/passkeys/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,mBAAmB,EACnB,YAAY,EACZ,uBAAuB,GACxB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,uBAAuB,EACvB,mBAAmB,EACnB,YAAY,EACZ,uBAAuB,GACxB,MAAM,YAAY,CAAC;AAEpB,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,GAAsB,EACtB,YAAqB,EACrB,MAAc;IAEd,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,iBAAiB,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAC5D,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAC5D,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC;IAC7D,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,sCAAsC,MAAM,EAAE,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,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,15 @@
|
|
|
1
|
+
import type { AuthenticationResponseJSON } from "@simplewebauthn/browser";
|
|
2
|
+
import type { ReadonlyUint8Array } from "@solana/kit";
|
|
3
|
+
export declare function uint8ArrayToHex(bytes: Uint8Array): string;
|
|
4
|
+
export declare function hexToUint8Array(hex: string): Uint8Array;
|
|
5
|
+
export declare function base64URLStringToBuffer(base64URLString: string): Uint8Array;
|
|
6
|
+
export declare function extractAdditionalFields(clientData: Record<string, unknown>): Uint8Array<ArrayBuffer>;
|
|
7
|
+
export declare function parseOrigins(originsBytes: ReadonlyUint8Array, numOrigins: number): string[];
|
|
8
|
+
export declare function convertSignatureDERtoRS(signature: Uint8Array): Uint8Array;
|
|
9
|
+
export declare function getSecp256r1Message(authResponse: AuthenticationResponseJSON): Uint8Array;
|
|
10
|
+
export declare function parseWebAuthnClientData(clientDataJSON: string): {
|
|
11
|
+
origin: string;
|
|
12
|
+
crossOrigin: boolean;
|
|
13
|
+
truncatedClientDataJson: Uint8Array<ArrayBuffer>;
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=internal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../../src/passkeys/internal.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtD,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAIzD;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAMvD;AAED,wBAAgB,uBAAuB,CAAC,eAAe,EAAE,MAAM,GAAG,UAAU,CAW3E;AAED,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,2BAgB1E;AAED,wBAAgB,YAAY,CAC1B,YAAY,EAAE,kBAAkB,EAChC,UAAU,EAAE,MAAM,GACjB,MAAM,EAAE,CAuBV;AAED,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,UAAU,GAAG,UAAU,CAgDzE;AAED,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,0BAA0B,GACvC,UAAU,CASZ;AAED,wBAAgB,uBAAuB,CAAC,cAAc,EAAE,MAAM;;;;EAO7D"}
|