@solana/addresses 2.0.0-experimental.7d54c2d → 2.0.0-experimental.7d67615
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/index.browser.cjs +41 -38
- package/dist/index.browser.cjs.map +1 -1
- package/dist/index.browser.js +41 -38
- package/dist/index.browser.js.map +1 -1
- package/dist/index.native.js +41 -38
- package/dist/index.native.js.map +1 -1
- package/dist/index.node.cjs +41 -38
- package/dist/index.node.cjs.map +1 -1
- package/dist/index.node.js +41 -38
- package/dist/index.node.js.map +1 -1
- package/dist/types/address.d.ts +4 -10
- package/dist/types/address.d.ts.map +1 -1
- package/dist/types/index.d.ts +3 -3
- package/dist/types/program-derived-address.d.ts +1 -1
- package/dist/types/program-derived-address.d.ts.map +1 -1
- package/dist/types/public-key.d.ts +1 -1
- package/dist/types/public-key.d.ts.map +1 -1
- package/package.json +14 -34
- package/dist/index.development.js +0 -656
- package/dist/index.development.js.map +0 -1
- package/dist/index.production.min.js +0 -22
package/README.md
CHANGED
|
@@ -82,7 +82,7 @@ function handleSubmit() {
|
|
|
82
82
|
|
|
83
83
|
### `assertIsProgramDerivedAddress()`
|
|
84
84
|
|
|
85
|
-
In the event that you receive an address/bump-seed tuple from some untrusted source, you can assert that such
|
|
85
|
+
In the event that you receive an address/bump-seed tuple from some untrusted source, you can assert that such a tuple conforms to the `ProgramDerivedAddress` type using this function.
|
|
86
86
|
|
|
87
87
|
See [`assertIsAddress()`](#assertisaddress) for an example of how to use an assertion function.
|
|
88
88
|
|
|
@@ -114,7 +114,7 @@ const addressBytes = new Uint8Array([
|
|
|
114
114
|
179, 178, 232, 220, 89, 53, 127,
|
|
115
115
|
]);
|
|
116
116
|
const addressDecoder = getAddressDecoder();
|
|
117
|
-
const
|
|
117
|
+
const address = addressDecoder.decode(address); // B9Lf9z5BfNPT4d5KMeaBFx8x1G4CULZYR1jA2kmxRDka
|
|
118
118
|
```
|
|
119
119
|
|
|
120
120
|
### `getAddressEncoder()`
|
package/dist/index.browser.cjs
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
var codecsCore = require('@solana/codecs-core');
|
|
4
4
|
var codecsStrings = require('@solana/codecs-strings');
|
|
5
|
+
var errors = require('@solana/errors');
|
|
5
6
|
var assertions = require('@solana/assertions');
|
|
6
7
|
|
|
7
8
|
// src/address.ts
|
|
@@ -40,43 +41,37 @@ function assertIsAddress(putativeAddress) {
|
|
|
40
41
|
putativeAddress.length < 32 || // Highest address (32 bytes of 255)
|
|
41
42
|
putativeAddress.length > 44
|
|
42
43
|
) {
|
|
43
|
-
throw new
|
|
44
|
+
throw new errors.SolanaError(errors.SOLANA_ERROR__INCORRECT_BASE58_ADDRESS_LENGTH, {
|
|
45
|
+
actualLength: putativeAddress.length
|
|
46
|
+
});
|
|
44
47
|
}
|
|
45
48
|
const base58Encoder = getMemoizedBase58Encoder();
|
|
46
49
|
const bytes = base58Encoder.encode(putativeAddress);
|
|
47
50
|
const numBytes = bytes.byteLength;
|
|
48
51
|
if (numBytes !== 32) {
|
|
49
|
-
throw new
|
|
52
|
+
throw new errors.SolanaError(errors.SOLANA_ERROR__INCORRECT_BASE58_ADDRESS_BYTE_LENGTH, {
|
|
53
|
+
actualLength: numBytes
|
|
54
|
+
});
|
|
50
55
|
}
|
|
51
56
|
} catch (e) {
|
|
52
|
-
throw new
|
|
53
|
-
cause: e
|
|
54
|
-
});
|
|
57
|
+
throw new errors.SolanaError(errors.SOLANA_ERROR__NOT_A_BASE58_ENCODED_ADDRESS, { putativeAddress });
|
|
55
58
|
}
|
|
56
59
|
}
|
|
57
60
|
function address(putativeAddress) {
|
|
58
61
|
assertIsAddress(putativeAddress);
|
|
59
62
|
return putativeAddress;
|
|
60
63
|
}
|
|
61
|
-
function getAddressEncoder(
|
|
64
|
+
function getAddressEncoder() {
|
|
62
65
|
return codecsCore.mapEncoder(
|
|
63
|
-
codecsStrings.getStringEncoder({
|
|
64
|
-
description: config?.description ?? "Address",
|
|
65
|
-
encoding: getMemoizedBase58Encoder(),
|
|
66
|
-
size: 32
|
|
67
|
-
}),
|
|
66
|
+
codecsStrings.getStringEncoder({ encoding: getMemoizedBase58Encoder(), size: 32 }),
|
|
68
67
|
(putativeAddress) => address(putativeAddress)
|
|
69
68
|
);
|
|
70
69
|
}
|
|
71
|
-
function getAddressDecoder(
|
|
72
|
-
return codecsStrings.getStringDecoder({
|
|
73
|
-
description: config?.description ?? "Address",
|
|
74
|
-
encoding: getMemoizedBase58Decoder(),
|
|
75
|
-
size: 32
|
|
76
|
-
});
|
|
70
|
+
function getAddressDecoder() {
|
|
71
|
+
return codecsStrings.getStringDecoder({ encoding: getMemoizedBase58Decoder(), size: 32 });
|
|
77
72
|
}
|
|
78
|
-
function getAddressCodec(
|
|
79
|
-
return codecsCore.combineCodec(getAddressEncoder(
|
|
73
|
+
function getAddressCodec() {
|
|
74
|
+
return codecsCore.combineCodec(getAddressEncoder(), getAddressDecoder());
|
|
80
75
|
}
|
|
81
76
|
function getAddressComparator() {
|
|
82
77
|
return new Intl.Collator("en", {
|
|
@@ -186,12 +181,12 @@ function isProgramDerivedAddress(value) {
|
|
|
186
181
|
function assertIsProgramDerivedAddress(value) {
|
|
187
182
|
const validFormat = Array.isArray(value) && value.length === 2 && typeof value[0] === "string" && typeof value[1] === "number";
|
|
188
183
|
if (!validFormat) {
|
|
189
|
-
throw new
|
|
190
|
-
`Expected given program derived address to have the following format: [Address, ProgramDerivedAddressBump].`
|
|
191
|
-
);
|
|
184
|
+
throw new errors.SolanaError(errors.SOLANA_ERROR__MALFORMED_PROGRAM_DERIVED_ADDRESS);
|
|
192
185
|
}
|
|
193
186
|
if (value[1] < 0 || value[1] > 255) {
|
|
194
|
-
throw new
|
|
187
|
+
throw new errors.SolanaError(errors.SOLANA_ERROR__PROGRAM_DERIVED_ADDRESS_BUMP_SEED_OUT_OF_RANGE, {
|
|
188
|
+
bump: value[1]
|
|
189
|
+
});
|
|
195
190
|
}
|
|
196
191
|
assertIsAddress(value[0]);
|
|
197
192
|
}
|
|
@@ -221,18 +216,23 @@ var PDA_MARKER_BYTES = [
|
|
|
221
216
|
115,
|
|
222
217
|
115
|
|
223
218
|
];
|
|
224
|
-
var PointOnCurveError = class extends Error {
|
|
225
|
-
};
|
|
226
219
|
async function createProgramDerivedAddress({ programAddress, seeds }) {
|
|
227
220
|
await assertions.assertDigestCapabilityIsAvailable();
|
|
228
221
|
if (seeds.length > MAX_SEEDS) {
|
|
229
|
-
throw new
|
|
222
|
+
throw new errors.SolanaError(errors.SOLANA_ERROR__MAX_NUMBER_OF_PDA_SEEDS_EXCEEDED, {
|
|
223
|
+
actual: seeds.length,
|
|
224
|
+
maxSeeds: MAX_SEEDS
|
|
225
|
+
});
|
|
230
226
|
}
|
|
231
227
|
let textEncoder;
|
|
232
228
|
const seedBytes = seeds.reduce((acc, seed, ii) => {
|
|
233
|
-
const bytes = typeof seed === "string" ? (textEncoder
|
|
229
|
+
const bytes = typeof seed === "string" ? (textEncoder ||= new TextEncoder()).encode(seed) : seed;
|
|
234
230
|
if (bytes.byteLength > MAX_SEED_LENGTH) {
|
|
235
|
-
throw new
|
|
231
|
+
throw new errors.SolanaError(errors.SOLANA_ERROR__MAX_PDA_SEED_LENGTH_EXCEEDED, {
|
|
232
|
+
actual: bytes.byteLength,
|
|
233
|
+
index: ii,
|
|
234
|
+
maxSeedLength: MAX_SEED_LENGTH
|
|
235
|
+
});
|
|
236
236
|
}
|
|
237
237
|
acc.push(...bytes);
|
|
238
238
|
return acc;
|
|
@@ -245,9 +245,9 @@ async function createProgramDerivedAddress({ programAddress, seeds }) {
|
|
|
245
245
|
);
|
|
246
246
|
const addressBytes = new Uint8Array(addressBytesBuffer);
|
|
247
247
|
if (await compressedPointBytesAreOnCurve(addressBytes)) {
|
|
248
|
-
throw new
|
|
248
|
+
throw new errors.SolanaError(errors.SOLANA_ERROR__INVALID_SEEDS_POINT_ON_CURVE);
|
|
249
249
|
}
|
|
250
|
-
return base58EncodedAddressCodec.decode(addressBytes)
|
|
250
|
+
return base58EncodedAddressCodec.decode(addressBytes);
|
|
251
251
|
}
|
|
252
252
|
async function getProgramDerivedAddress({
|
|
253
253
|
programAddress,
|
|
@@ -262,40 +262,43 @@ async function getProgramDerivedAddress({
|
|
|
262
262
|
});
|
|
263
263
|
return [address2, bumpSeed];
|
|
264
264
|
} catch (e) {
|
|
265
|
-
if (e
|
|
265
|
+
if (errors.isSolanaError(e, errors.SOLANA_ERROR__INVALID_SEEDS_POINT_ON_CURVE)) {
|
|
266
266
|
bumpSeed--;
|
|
267
267
|
} else {
|
|
268
268
|
throw e;
|
|
269
269
|
}
|
|
270
270
|
}
|
|
271
271
|
}
|
|
272
|
-
throw new
|
|
272
|
+
throw new errors.SolanaError(errors.SOLANA_ERROR__COULD_NOT_FIND_VIABLE_PDA_BUMP_SEED);
|
|
273
273
|
}
|
|
274
274
|
async function createAddressWithSeed({ baseAddress, programAddress, seed }) {
|
|
275
275
|
const { encode, decode } = getAddressCodec();
|
|
276
276
|
const seedBytes = typeof seed === "string" ? new TextEncoder().encode(seed) : seed;
|
|
277
277
|
if (seedBytes.byteLength > MAX_SEED_LENGTH) {
|
|
278
|
-
throw new
|
|
278
|
+
throw new errors.SolanaError(errors.SOLANA_ERROR__MAX_PDA_SEED_LENGTH_EXCEEDED, {
|
|
279
|
+
actual: seedBytes.byteLength,
|
|
280
|
+
index: 0,
|
|
281
|
+
maxSeedLength: MAX_SEED_LENGTH
|
|
282
|
+
});
|
|
279
283
|
}
|
|
280
284
|
const programAddressBytes = encode(programAddress);
|
|
281
285
|
if (programAddressBytes.length >= PDA_MARKER_BYTES.length && programAddressBytes.slice(-PDA_MARKER_BYTES.length).every((byte, index) => byte === PDA_MARKER_BYTES[index])) {
|
|
282
|
-
throw new
|
|
286
|
+
throw new errors.SolanaError(errors.SOLANA_ERROR__PROGRAM_ADDRESS_ENDS_WITH_PDA_MARKER);
|
|
283
287
|
}
|
|
284
288
|
const addressBytesBuffer = await crypto.subtle.digest(
|
|
285
289
|
"SHA-256",
|
|
286
290
|
new Uint8Array([...encode(baseAddress), ...seedBytes, ...programAddressBytes])
|
|
287
291
|
);
|
|
288
292
|
const addressBytes = new Uint8Array(addressBytesBuffer);
|
|
289
|
-
return decode(addressBytes)
|
|
293
|
+
return decode(addressBytes);
|
|
290
294
|
}
|
|
291
295
|
async function getAddressFromPublicKey(publicKey) {
|
|
292
296
|
await assertions.assertKeyExporterIsAvailable();
|
|
293
297
|
if (publicKey.type !== "public" || publicKey.algorithm.name !== "Ed25519") {
|
|
294
|
-
throw new
|
|
298
|
+
throw new errors.SolanaError(errors.SOLANA_ERROR__NOT_AN_ED25519_PUBLIC_KEY);
|
|
295
299
|
}
|
|
296
300
|
const publicKeyBytes = await crypto.subtle.exportKey("raw", publicKey);
|
|
297
|
-
|
|
298
|
-
return base58EncodedAddress;
|
|
301
|
+
return getAddressDecoder().decode(new Uint8Array(publicKeyBytes));
|
|
299
302
|
}
|
|
300
303
|
|
|
301
304
|
exports.address = address;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/address.ts","../src/program-derived-address.ts","../src/vendor/noble/ed25519.ts","../src/curve.ts","../src/public-key.ts"],"names":["address"],"mappings":"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","sourcesContent":["import { Codec, combineCodec, Decoder, Encoder, mapEncoder } from '@solana/codecs-core';\nimport { getBase58Decoder, getBase58Encoder, getStringDecoder, getStringEncoder } from '@solana/codecs-strings';\n\nexport type Address<TAddress extends string = string> = TAddress & {\n readonly __brand: unique symbol;\n};\n\nlet memoizedBase58Encoder: Encoder<string> | undefined;\nlet memoizedBase58Decoder: Decoder<string> | undefined;\n\nfunction getMemoizedBase58Encoder(): Encoder<string> {\n if (!memoizedBase58Encoder) memoizedBase58Encoder = getBase58Encoder();\n return memoizedBase58Encoder;\n}\n\nfunction getMemoizedBase58Decoder(): Decoder<string> {\n if (!memoizedBase58Decoder) memoizedBase58Decoder = getBase58Decoder();\n return memoizedBase58Decoder;\n}\n\nexport function isAddress(putativeAddress: string): putativeAddress is Address<typeof putativeAddress> {\n // Fast-path; see if the input string is of an acceptable length.\n if (\n // Lowest address (32 bytes of zeroes)\n putativeAddress.length < 32 ||\n // Highest address (32 bytes of 255)\n putativeAddress.length > 44\n ) {\n return false;\n }\n // Slow-path; actually attempt to decode the input string.\n const base58Encoder = getMemoizedBase58Encoder();\n const bytes = base58Encoder.encode(putativeAddress);\n const numBytes = bytes.byteLength;\n if (numBytes !== 32) {\n return false;\n }\n return true;\n}\n\nexport function assertIsAddress(putativeAddress: string): asserts putativeAddress is Address<typeof putativeAddress> {\n try {\n // Fast-path; see if the input string is of an acceptable length.\n if (\n // Lowest address (32 bytes of zeroes)\n putativeAddress.length < 32 ||\n // Highest address (32 bytes of 255)\n putativeAddress.length > 44\n ) {\n throw new Error('Expected input string to decode to a byte array of length 32.');\n }\n // Slow-path; actually attempt to decode the input string.\n const base58Encoder = getMemoizedBase58Encoder();\n const bytes = base58Encoder.encode(putativeAddress);\n const numBytes = bytes.byteLength;\n if (numBytes !== 32) {\n throw new Error(`Expected input string to decode to a byte array of length 32. Actual length: ${numBytes}`);\n }\n } catch (e) {\n throw new Error(`\\`${putativeAddress}\\` is not a base-58 encoded address`, {\n cause: e,\n });\n }\n}\n\nexport function address<TAddress extends string = string>(putativeAddress: TAddress): Address<TAddress> {\n assertIsAddress(putativeAddress);\n return putativeAddress as Address<TAddress>;\n}\n\nexport function getAddressEncoder(config?: Readonly<{ description: string }>): Encoder<Address> {\n return mapEncoder(\n getStringEncoder({\n description: config?.description ?? 'Address',\n encoding: getMemoizedBase58Encoder(),\n size: 32,\n }),\n putativeAddress => address(putativeAddress)\n );\n}\n\nexport function getAddressDecoder(config?: Readonly<{ description: string }>): Decoder<Address> {\n return getStringDecoder({\n description: config?.description ?? 'Address',\n encoding: getMemoizedBase58Decoder(),\n size: 32,\n }) as Decoder<Address>;\n}\n\nexport function getAddressCodec(config?: Readonly<{ description: string }>): Codec<Address> {\n return combineCodec(getAddressEncoder(config), getAddressDecoder(config));\n}\n\nexport function getAddressComparator(): (x: string, y: string) => number {\n return new Intl.Collator('en', {\n caseFirst: 'lower',\n ignorePunctuation: false,\n localeMatcher: 'best fit',\n numeric: false,\n sensitivity: 'variant',\n usage: 'sort',\n }).compare;\n}\n","import { assertDigestCapabilityIsAvailable } from '@solana/assertions';\n\nimport { Address, assertIsAddress, getAddressCodec, isAddress } from './address';\nimport { compressedPointBytesAreOnCurve } from './curve';\n\n/**\n * An address derived from a program address and a set of seeds.\n * It includes the bump seed used to derive the address and\n * ensure the address is not on the Ed25519 curve.\n */\nexport type ProgramDerivedAddress<TAddress extends string = string> = Readonly<\n [Address<TAddress>, ProgramDerivedAddressBump]\n>;\n\n/**\n * A number between 0 and 255, inclusive.\n */\nexport type ProgramDerivedAddressBump = number & {\n readonly __brand: unique symbol;\n};\n\n/**\n * Returns true if the input value is a program derived address.\n */\nexport function isProgramDerivedAddress<TAddress extends string = string>(\n value: unknown\n): value is ProgramDerivedAddress<TAddress> {\n return (\n Array.isArray(value) &&\n value.length === 2 &&\n typeof value[0] === 'string' &&\n typeof value[1] === 'number' &&\n value[1] >= 0 &&\n value[1] <= 255 &&\n isAddress(value[0])\n );\n}\n\n/**\n * Fails if the input value is not a program derived address.\n */\nexport function assertIsProgramDerivedAddress<TAddress extends string = string>(\n value: unknown\n): asserts value is ProgramDerivedAddress<TAddress> {\n const validFormat =\n Array.isArray(value) && value.length === 2 && typeof value[0] === 'string' && typeof value[1] === 'number';\n if (!validFormat) {\n // TODO: Coded error.\n throw new Error(\n `Expected given program derived address to have the following format: [Address, ProgramDerivedAddressBump].`\n );\n }\n if (value[1] < 0 || value[1] > 255) {\n // TODO: Coded error.\n throw new Error(`Expected program derived address bump to be in the range [0, 255], got: ${value[1]}.`);\n }\n assertIsAddress(value[0]);\n}\n\ntype ProgramDerivedAddressInput = Readonly<{\n programAddress: Address;\n seeds: Seed[];\n}>;\n\ntype SeedInput = Readonly<{\n baseAddress: Address;\n programAddress: Address;\n seed: Seed;\n}>;\n\ntype Seed = string | Uint8Array;\n\nconst MAX_SEED_LENGTH = 32;\nconst MAX_SEEDS = 16;\nconst PDA_MARKER_BYTES = [\n // The string 'ProgramDerivedAddress'\n 80, 114, 111, 103, 114, 97, 109, 68, 101, 114, 105, 118, 101, 100, 65, 100, 100, 114, 101, 115, 115,\n] as const;\n\n// TODO: Coded error.\nclass PointOnCurveError extends Error {}\n\nasync function createProgramDerivedAddress({ programAddress, seeds }: ProgramDerivedAddressInput): Promise<Address> {\n await assertDigestCapabilityIsAvailable();\n if (seeds.length > MAX_SEEDS) {\n // TODO: Coded error.\n throw new Error(`A maximum of ${MAX_SEEDS} seeds may be supplied when creating an address`);\n }\n let textEncoder: TextEncoder;\n const seedBytes = seeds.reduce((acc, seed, ii) => {\n const bytes = typeof seed === 'string' ? (textEncoder ||= new TextEncoder()).encode(seed) : seed;\n if (bytes.byteLength > MAX_SEED_LENGTH) {\n // TODO: Coded error.\n throw new Error(`The seed at index ${ii} exceeds the maximum length of 32 bytes`);\n }\n acc.push(...bytes);\n return acc;\n }, [] as number[]);\n const base58EncodedAddressCodec = getAddressCodec();\n const programAddressBytes = base58EncodedAddressCodec.encode(programAddress);\n const addressBytesBuffer = await crypto.subtle.digest(\n 'SHA-256',\n new Uint8Array([...seedBytes, ...programAddressBytes, ...PDA_MARKER_BYTES])\n );\n const addressBytes = new Uint8Array(addressBytesBuffer);\n if (await compressedPointBytesAreOnCurve(addressBytes)) {\n // TODO: Coded error.\n throw new PointOnCurveError('Invalid seeds; point must fall off the Ed25519 curve');\n }\n return base58EncodedAddressCodec.decode(addressBytes)[0];\n}\n\nexport async function getProgramDerivedAddress({\n programAddress,\n seeds,\n}: ProgramDerivedAddressInput): Promise<ProgramDerivedAddress> {\n let bumpSeed = 255;\n while (bumpSeed > 0) {\n try {\n const address = await createProgramDerivedAddress({\n programAddress,\n seeds: [...seeds, new Uint8Array([bumpSeed])],\n });\n return [address, bumpSeed as ProgramDerivedAddressBump];\n } catch (e) {\n if (e instanceof PointOnCurveError) {\n bumpSeed--;\n } else {\n throw e;\n }\n }\n }\n // TODO: Coded error.\n throw new Error('Unable to find a viable program address bump seed');\n}\n\nexport async function createAddressWithSeed({ baseAddress, programAddress, seed }: SeedInput): Promise<Address> {\n const { encode, decode } = getAddressCodec();\n\n const seedBytes = typeof seed === 'string' ? new TextEncoder().encode(seed) : seed;\n if (seedBytes.byteLength > MAX_SEED_LENGTH) {\n // TODO: Coded error.\n throw new Error(`The seed exceeds the maximum length of 32 bytes`);\n }\n\n const programAddressBytes = encode(programAddress);\n if (\n programAddressBytes.length >= PDA_MARKER_BYTES.length &&\n programAddressBytes.slice(-PDA_MARKER_BYTES.length).every((byte, index) => byte === PDA_MARKER_BYTES[index])\n ) {\n // TODO: Coded error.\n throw new Error(`programAddress cannot end with the PDA marker`);\n }\n\n const addressBytesBuffer = await crypto.subtle.digest(\n 'SHA-256',\n new Uint8Array([...encode(baseAddress), ...seedBytes, ...programAddressBytes])\n );\n const addressBytes = new Uint8Array(addressBytesBuffer);\n\n return decode(addressBytes)[0];\n}\n","/**!\n * noble-ed25519\n *\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Paul Miller (https://paulmillr.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the “Software”), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nconst D = 37095705934669439343138083508754565189542113879843219016388785533085940283555n;\nconst P = 57896044618658097711785492504343953926634992332820282019728792003956564819949n; // 2n ** 255n - 19n; ed25519 is twisted edwards curve\nconst RM1 = 19681161376707505956807079304988542015446066515923890162744021073123829784752n; // √-1\n\n// mod division\nfunction mod(a: bigint): bigint {\n const r = a % P;\n return r >= 0n ? r : P + r;\n}\nfunction pow2(x: bigint, power: bigint): bigint {\n // pow2(x, 4) == x^(2^4)\n let r = x;\n while (power-- > 0n) {\n r *= r;\n r %= P;\n }\n return r;\n}\nfunction pow_2_252_3(x: bigint): bigint {\n // x^(2^252-3) unrolled util for square root\n const x2 = (x * x) % P; // x^2, bits 1\n const b2 = (x2 * x) % P; // x^3, bits 11\n const b4 = (pow2(b2, 2n) * b2) % P; // x^(2^4-1), bits 1111\n const b5 = (pow2(b4, 1n) * x) % P; // x^(2^5-1), bits 11111\n const b10 = (pow2(b5, 5n) * b5) % P; // x^(2^10)\n const b20 = (pow2(b10, 10n) * b10) % P; // x^(2^20)\n const b40 = (pow2(b20, 20n) * b20) % P; // x^(2^40)\n const b80 = (pow2(b40, 40n) * b40) % P; // x^(2^80)\n const b160 = (pow2(b80, 80n) * b80) % P; // x^(2^160)\n const b240 = (pow2(b160, 80n) * b80) % P; // x^(2^240)\n const b250 = (pow2(b240, 10n) * b10) % P; // x^(2^250)\n const pow_p_5_8 = (pow2(b250, 2n) * x) % P; // < To pow to (p+3)/8, multiply it by x.\n return pow_p_5_8;\n}\nfunction uvRatio(u: bigint, v: bigint): bigint | null {\n // for sqrt comp\n const v3 = mod(v * v * v); // v³\n const v7 = mod(v3 * v3 * v); // v⁷\n const pow = pow_2_252_3(u * v7); // (uv⁷)^(p-5)/8\n let x = mod(u * v3 * pow); // (uv³)(uv⁷)^(p-5)/8\n const vx2 = mod(v * x * x); // vx²\n const root1 = x; // First root candidate\n const root2 = mod(x * RM1); // Second root candidate; RM1 is √-1\n const useRoot1 = vx2 === u; // If vx² = u (mod p), x is a square root\n const useRoot2 = vx2 === mod(-u); // If vx² = -u, set x <-- x * 2^((p-1)/4)\n const noRoot = vx2 === mod(-u * RM1); // There is no valid root, vx² = -u√-1\n if (useRoot1) x = root1;\n if (useRoot2 || noRoot) x = root2; // We return root2 anyway, for const-time\n if ((mod(x) & 1n) === 1n) x = mod(-x); // edIsNegative\n if (!useRoot1 && !useRoot2) {\n return null;\n }\n return x;\n}\n// https://datatracker.ietf.org/doc/html/rfc8032#section-5.1.3\nexport function pointIsOnCurve(y: bigint, lastByte: number): boolean {\n const y2 = mod(y * y); // y²\n const u = mod(y2 - 1n); // u=y²-1\n const v = mod(D * y2 + 1n);\n const x = uvRatio(u, v); // (uv³)(uv⁷)^(p-5)/8; square root\n if (x === null) {\n return false;\n }\n const isLastByteOdd = (lastByte & 0x80) !== 0; // x_0, last bit\n if (x === 0n && isLastByteOdd) {\n return false;\n }\n return true;\n}\n","import { pointIsOnCurve } from './vendor/noble/ed25519';\n\nfunction byteToHex(byte: number): string {\n const hexString = byte.toString(16);\n if (hexString.length === 1) {\n return `0${hexString}`;\n } else {\n return hexString;\n }\n}\n\nfunction decompressPointBytes(bytes: Uint8Array): bigint {\n const hexString = bytes.reduce((acc, byte, ii) => `${byteToHex(ii === 31 ? byte & ~0x80 : byte)}${acc}`, '');\n const integerLiteralString = `0x${hexString}`;\n return BigInt(integerLiteralString);\n}\n\nexport async function compressedPointBytesAreOnCurve(bytes: Uint8Array): Promise<boolean> {\n if (bytes.byteLength !== 32) {\n return false;\n }\n const y = decompressPointBytes(bytes);\n return pointIsOnCurve(y, bytes[31]);\n}\n","import { assertKeyExporterIsAvailable } from '@solana/assertions';\n\nimport { Address, getAddressDecoder } from './address';\n\nexport async function getAddressFromPublicKey(publicKey: CryptoKey): Promise<Address> {\n await assertKeyExporterIsAvailable();\n if (publicKey.type !== 'public' || publicKey.algorithm.name !== 'Ed25519') {\n // TODO: Coded error.\n throw new Error('The `CryptoKey` must be an `Ed25519` public key');\n }\n const publicKeyBytes = await crypto.subtle.exportKey('raw', publicKey);\n const [base58EncodedAddress] = getAddressDecoder().decode(new Uint8Array(publicKeyBytes));\n return base58EncodedAddress;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/address.ts","../src/program-derived-address.ts","../src/vendor/noble/ed25519.ts","../src/curve.ts","../src/public-key.ts"],"names":["SolanaError","address"],"mappings":"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","sourcesContent":["import {\n combineCodec,\n Decoder,\n Encoder,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n mapEncoder,\n} from '@solana/codecs-core';\nimport { getBase58Decoder, getBase58Encoder, getStringDecoder, getStringEncoder } from '@solana/codecs-strings';\nimport {\n SOLANA_ERROR__INCORRECT_BASE58_ADDRESS_BYTE_LENGTH,\n SOLANA_ERROR__INCORRECT_BASE58_ADDRESS_LENGTH,\n SOLANA_ERROR__NOT_A_BASE58_ENCODED_ADDRESS,\n SolanaError,\n} from '@solana/errors';\n\nexport type Address<TAddress extends string = string> = TAddress & {\n readonly __brand: unique symbol;\n};\n\nlet memoizedBase58Encoder: Encoder<string> | undefined;\nlet memoizedBase58Decoder: Decoder<string> | undefined;\n\nfunction getMemoizedBase58Encoder(): Encoder<string> {\n if (!memoizedBase58Encoder) memoizedBase58Encoder = getBase58Encoder();\n return memoizedBase58Encoder;\n}\n\nfunction getMemoizedBase58Decoder(): Decoder<string> {\n if (!memoizedBase58Decoder) memoizedBase58Decoder = getBase58Decoder();\n return memoizedBase58Decoder;\n}\n\nexport function isAddress(putativeAddress: string): putativeAddress is Address<typeof putativeAddress> {\n // Fast-path; see if the input string is of an acceptable length.\n if (\n // Lowest address (32 bytes of zeroes)\n putativeAddress.length < 32 ||\n // Highest address (32 bytes of 255)\n putativeAddress.length > 44\n ) {\n return false;\n }\n // Slow-path; actually attempt to decode the input string.\n const base58Encoder = getMemoizedBase58Encoder();\n const bytes = base58Encoder.encode(putativeAddress);\n const numBytes = bytes.byteLength;\n if (numBytes !== 32) {\n return false;\n }\n return true;\n}\n\nexport function assertIsAddress(putativeAddress: string): asserts putativeAddress is Address<typeof putativeAddress> {\n try {\n // Fast-path; see if the input string is of an acceptable length.\n if (\n // Lowest address (32 bytes of zeroes)\n putativeAddress.length < 32 ||\n // Highest address (32 bytes of 255)\n putativeAddress.length > 44\n ) {\n throw new SolanaError(SOLANA_ERROR__INCORRECT_BASE58_ADDRESS_LENGTH, {\n actualLength: putativeAddress.length,\n });\n }\n // Slow-path; actually attempt to decode the input string.\n const base58Encoder = getMemoizedBase58Encoder();\n const bytes = base58Encoder.encode(putativeAddress);\n const numBytes = bytes.byteLength;\n if (numBytes !== 32) {\n throw new SolanaError(SOLANA_ERROR__INCORRECT_BASE58_ADDRESS_BYTE_LENGTH, {\n actualLength: numBytes,\n });\n }\n } catch (e) {\n throw new SolanaError(SOLANA_ERROR__NOT_A_BASE58_ENCODED_ADDRESS, { putativeAddress });\n }\n}\n\nexport function address<TAddress extends string = string>(putativeAddress: TAddress): Address<TAddress> {\n assertIsAddress(putativeAddress);\n return putativeAddress as Address<TAddress>;\n}\n\nexport function getAddressEncoder(): FixedSizeEncoder<Address, 32> {\n return mapEncoder(getStringEncoder({ encoding: getMemoizedBase58Encoder(), size: 32 }), putativeAddress =>\n address(putativeAddress),\n );\n}\n\nexport function getAddressDecoder(): FixedSizeDecoder<Address, 32> {\n return getStringDecoder({ encoding: getMemoizedBase58Decoder(), size: 32 }) as FixedSizeDecoder<Address, 32>;\n}\n\nexport function getAddressCodec(): FixedSizeCodec<Address, Address, 32> {\n return combineCodec(getAddressEncoder(), getAddressDecoder());\n}\n\nexport function getAddressComparator(): (x: string, y: string) => number {\n return new Intl.Collator('en', {\n caseFirst: 'lower',\n ignorePunctuation: false,\n localeMatcher: 'best fit',\n numeric: false,\n sensitivity: 'variant',\n usage: 'sort',\n }).compare;\n}\n","import { assertDigestCapabilityIsAvailable } from '@solana/assertions';\nimport {\n isSolanaError,\n SOLANA_ERROR__COULD_NOT_FIND_VIABLE_PDA_BUMP_SEED,\n SOLANA_ERROR__INVALID_SEEDS_POINT_ON_CURVE,\n SOLANA_ERROR__MALFORMED_PROGRAM_DERIVED_ADDRESS,\n SOLANA_ERROR__MAX_NUMBER_OF_PDA_SEEDS_EXCEEDED,\n SOLANA_ERROR__MAX_PDA_SEED_LENGTH_EXCEEDED,\n SOLANA_ERROR__PROGRAM_ADDRESS_ENDS_WITH_PDA_MARKER,\n SOLANA_ERROR__PROGRAM_DERIVED_ADDRESS_BUMP_SEED_OUT_OF_RANGE,\n SolanaError,\n} from '@solana/errors';\n\nimport { Address, assertIsAddress, getAddressCodec, isAddress } from './address';\nimport { compressedPointBytesAreOnCurve } from './curve';\n\n/**\n * An address derived from a program address and a set of seeds.\n * It includes the bump seed used to derive the address and\n * ensure the address is not on the Ed25519 curve.\n */\nexport type ProgramDerivedAddress<TAddress extends string = string> = Readonly<\n [Address<TAddress>, ProgramDerivedAddressBump]\n>;\n\n/**\n * A number between 0 and 255, inclusive.\n */\nexport type ProgramDerivedAddressBump = number & {\n readonly __brand: unique symbol;\n};\n\n/**\n * Returns true if the input value is a program derived address.\n */\nexport function isProgramDerivedAddress<TAddress extends string = string>(\n value: unknown,\n): value is ProgramDerivedAddress<TAddress> {\n return (\n Array.isArray(value) &&\n value.length === 2 &&\n typeof value[0] === 'string' &&\n typeof value[1] === 'number' &&\n value[1] >= 0 &&\n value[1] <= 255 &&\n isAddress(value[0])\n );\n}\n\n/**\n * Fails if the input value is not a program derived address.\n */\nexport function assertIsProgramDerivedAddress<TAddress extends string = string>(\n value: unknown,\n): asserts value is ProgramDerivedAddress<TAddress> {\n const validFormat =\n Array.isArray(value) && value.length === 2 && typeof value[0] === 'string' && typeof value[1] === 'number';\n if (!validFormat) {\n throw new SolanaError(SOLANA_ERROR__MALFORMED_PROGRAM_DERIVED_ADDRESS);\n }\n if (value[1] < 0 || value[1] > 255) {\n throw new SolanaError(SOLANA_ERROR__PROGRAM_DERIVED_ADDRESS_BUMP_SEED_OUT_OF_RANGE, {\n bump: value[1],\n });\n }\n assertIsAddress(value[0]);\n}\n\ntype ProgramDerivedAddressInput = Readonly<{\n programAddress: Address;\n seeds: Seed[];\n}>;\n\ntype SeedInput = Readonly<{\n baseAddress: Address;\n programAddress: Address;\n seed: Seed;\n}>;\n\ntype Seed = string | Uint8Array;\n\nconst MAX_SEED_LENGTH = 32;\nconst MAX_SEEDS = 16;\nconst PDA_MARKER_BYTES = [\n // The string 'ProgramDerivedAddress'\n 80, 114, 111, 103, 114, 97, 109, 68, 101, 114, 105, 118, 101, 100, 65, 100, 100, 114, 101, 115, 115,\n] as const;\n\nasync function createProgramDerivedAddress({ programAddress, seeds }: ProgramDerivedAddressInput): Promise<Address> {\n await assertDigestCapabilityIsAvailable();\n if (seeds.length > MAX_SEEDS) {\n throw new SolanaError(SOLANA_ERROR__MAX_NUMBER_OF_PDA_SEEDS_EXCEEDED, {\n actual: seeds.length,\n maxSeeds: MAX_SEEDS,\n });\n }\n let textEncoder: TextEncoder;\n const seedBytes = seeds.reduce((acc, seed, ii) => {\n const bytes = typeof seed === 'string' ? (textEncoder ||= new TextEncoder()).encode(seed) : seed;\n if (bytes.byteLength > MAX_SEED_LENGTH) {\n throw new SolanaError(SOLANA_ERROR__MAX_PDA_SEED_LENGTH_EXCEEDED, {\n actual: bytes.byteLength,\n index: ii,\n maxSeedLength: MAX_SEED_LENGTH,\n });\n }\n acc.push(...bytes);\n return acc;\n }, [] as number[]);\n const base58EncodedAddressCodec = getAddressCodec();\n const programAddressBytes = base58EncodedAddressCodec.encode(programAddress);\n const addressBytesBuffer = await crypto.subtle.digest(\n 'SHA-256',\n new Uint8Array([...seedBytes, ...programAddressBytes, ...PDA_MARKER_BYTES]),\n );\n const addressBytes = new Uint8Array(addressBytesBuffer);\n if (await compressedPointBytesAreOnCurve(addressBytes)) {\n throw new SolanaError(SOLANA_ERROR__INVALID_SEEDS_POINT_ON_CURVE);\n }\n return base58EncodedAddressCodec.decode(addressBytes);\n}\n\nexport async function getProgramDerivedAddress({\n programAddress,\n seeds,\n}: ProgramDerivedAddressInput): Promise<ProgramDerivedAddress> {\n let bumpSeed = 255;\n while (bumpSeed > 0) {\n try {\n const address = await createProgramDerivedAddress({\n programAddress,\n seeds: [...seeds, new Uint8Array([bumpSeed])],\n });\n return [address, bumpSeed as ProgramDerivedAddressBump];\n } catch (e) {\n if (isSolanaError(e, SOLANA_ERROR__INVALID_SEEDS_POINT_ON_CURVE)) {\n bumpSeed--;\n } else {\n throw e;\n }\n }\n }\n throw new SolanaError(SOLANA_ERROR__COULD_NOT_FIND_VIABLE_PDA_BUMP_SEED);\n}\n\nexport async function createAddressWithSeed({ baseAddress, programAddress, seed }: SeedInput): Promise<Address> {\n const { encode, decode } = getAddressCodec();\n\n const seedBytes = typeof seed === 'string' ? new TextEncoder().encode(seed) : seed;\n if (seedBytes.byteLength > MAX_SEED_LENGTH) {\n throw new SolanaError(SOLANA_ERROR__MAX_PDA_SEED_LENGTH_EXCEEDED, {\n actual: seedBytes.byteLength,\n index: 0,\n maxSeedLength: MAX_SEED_LENGTH,\n });\n }\n\n const programAddressBytes = encode(programAddress);\n if (\n programAddressBytes.length >= PDA_MARKER_BYTES.length &&\n programAddressBytes.slice(-PDA_MARKER_BYTES.length).every((byte, index) => byte === PDA_MARKER_BYTES[index])\n ) {\n throw new SolanaError(SOLANA_ERROR__PROGRAM_ADDRESS_ENDS_WITH_PDA_MARKER);\n }\n\n const addressBytesBuffer = await crypto.subtle.digest(\n 'SHA-256',\n new Uint8Array([...encode(baseAddress), ...seedBytes, ...programAddressBytes]),\n );\n const addressBytes = new Uint8Array(addressBytesBuffer);\n\n return decode(addressBytes);\n}\n","/**!\n * noble-ed25519\n *\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Paul Miller (https://paulmillr.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the “Software”), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nconst D = 37095705934669439343138083508754565189542113879843219016388785533085940283555n;\nconst P = 57896044618658097711785492504343953926634992332820282019728792003956564819949n; // 2n ** 255n - 19n; ed25519 is twisted edwards curve\nconst RM1 = 19681161376707505956807079304988542015446066515923890162744021073123829784752n; // √-1\n\n// mod division\nfunction mod(a: bigint): bigint {\n const r = a % P;\n return r >= 0n ? r : P + r;\n}\nfunction pow2(x: bigint, power: bigint): bigint {\n // pow2(x, 4) == x^(2^4)\n let r = x;\n while (power-- > 0n) {\n r *= r;\n r %= P;\n }\n return r;\n}\nfunction pow_2_252_3(x: bigint): bigint {\n // x^(2^252-3) unrolled util for square root\n const x2 = (x * x) % P; // x^2, bits 1\n const b2 = (x2 * x) % P; // x^3, bits 11\n const b4 = (pow2(b2, 2n) * b2) % P; // x^(2^4-1), bits 1111\n const b5 = (pow2(b4, 1n) * x) % P; // x^(2^5-1), bits 11111\n const b10 = (pow2(b5, 5n) * b5) % P; // x^(2^10)\n const b20 = (pow2(b10, 10n) * b10) % P; // x^(2^20)\n const b40 = (pow2(b20, 20n) * b20) % P; // x^(2^40)\n const b80 = (pow2(b40, 40n) * b40) % P; // x^(2^80)\n const b160 = (pow2(b80, 80n) * b80) % P; // x^(2^160)\n const b240 = (pow2(b160, 80n) * b80) % P; // x^(2^240)\n const b250 = (pow2(b240, 10n) * b10) % P; // x^(2^250)\n const pow_p_5_8 = (pow2(b250, 2n) * x) % P; // < To pow to (p+3)/8, multiply it by x.\n return pow_p_5_8;\n}\nfunction uvRatio(u: bigint, v: bigint): bigint | null {\n // for sqrt comp\n const v3 = mod(v * v * v); // v³\n const v7 = mod(v3 * v3 * v); // v⁷\n const pow = pow_2_252_3(u * v7); // (uv⁷)^(p-5)/8\n let x = mod(u * v3 * pow); // (uv³)(uv⁷)^(p-5)/8\n const vx2 = mod(v * x * x); // vx²\n const root1 = x; // First root candidate\n const root2 = mod(x * RM1); // Second root candidate; RM1 is √-1\n const useRoot1 = vx2 === u; // If vx² = u (mod p), x is a square root\n const useRoot2 = vx2 === mod(-u); // If vx² = -u, set x <-- x * 2^((p-1)/4)\n const noRoot = vx2 === mod(-u * RM1); // There is no valid root, vx² = -u√-1\n if (useRoot1) x = root1;\n if (useRoot2 || noRoot) x = root2; // We return root2 anyway, for const-time\n if ((mod(x) & 1n) === 1n) x = mod(-x); // edIsNegative\n if (!useRoot1 && !useRoot2) {\n return null;\n }\n return x;\n}\n// https://datatracker.ietf.org/doc/html/rfc8032#section-5.1.3\nexport function pointIsOnCurve(y: bigint, lastByte: number): boolean {\n const y2 = mod(y * y); // y²\n const u = mod(y2 - 1n); // u=y²-1\n const v = mod(D * y2 + 1n);\n const x = uvRatio(u, v); // (uv³)(uv⁷)^(p-5)/8; square root\n if (x === null) {\n return false;\n }\n const isLastByteOdd = (lastByte & 0x80) !== 0; // x_0, last bit\n if (x === 0n && isLastByteOdd) {\n return false;\n }\n return true;\n}\n","import { pointIsOnCurve } from './vendor/noble/ed25519';\n\nfunction byteToHex(byte: number): string {\n const hexString = byte.toString(16);\n if (hexString.length === 1) {\n return `0${hexString}`;\n } else {\n return hexString;\n }\n}\n\nfunction decompressPointBytes(bytes: Uint8Array): bigint {\n const hexString = bytes.reduce((acc, byte, ii) => `${byteToHex(ii === 31 ? byte & ~0x80 : byte)}${acc}`, '');\n const integerLiteralString = `0x${hexString}`;\n return BigInt(integerLiteralString);\n}\n\nexport async function compressedPointBytesAreOnCurve(bytes: Uint8Array): Promise<boolean> {\n if (bytes.byteLength !== 32) {\n return false;\n }\n const y = decompressPointBytes(bytes);\n return pointIsOnCurve(y, bytes[31]);\n}\n","import { assertKeyExporterIsAvailable } from '@solana/assertions';\nimport { SOLANA_ERROR__NOT_AN_ED25519_PUBLIC_KEY, SolanaError } from '@solana/errors';\n\nimport { Address, getAddressDecoder } from './address';\n\nexport async function getAddressFromPublicKey(publicKey: CryptoKey): Promise<Address> {\n await assertKeyExporterIsAvailable();\n if (publicKey.type !== 'public' || publicKey.algorithm.name !== 'Ed25519') {\n throw new SolanaError(SOLANA_ERROR__NOT_AN_ED25519_PUBLIC_KEY);\n }\n const publicKeyBytes = await crypto.subtle.exportKey('raw', publicKey);\n return getAddressDecoder().decode(new Uint8Array(publicKeyBytes));\n}\n"]}
|
package/dist/index.browser.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { mapEncoder, combineCodec } from '@solana/codecs-core';
|
|
2
2
|
import { getStringEncoder, getStringDecoder, getBase58Encoder, getBase58Decoder } from '@solana/codecs-strings';
|
|
3
|
+
import { SOLANA_ERROR__INCORRECT_BASE58_ADDRESS_LENGTH, SolanaError, SOLANA_ERROR__INCORRECT_BASE58_ADDRESS_BYTE_LENGTH, SOLANA_ERROR__NOT_A_BASE58_ENCODED_ADDRESS, SOLANA_ERROR__MALFORMED_PROGRAM_DERIVED_ADDRESS, SOLANA_ERROR__PROGRAM_DERIVED_ADDRESS_BUMP_SEED_OUT_OF_RANGE, isSolanaError, SOLANA_ERROR__INVALID_SEEDS_POINT_ON_CURVE, SOLANA_ERROR__COULD_NOT_FIND_VIABLE_PDA_BUMP_SEED, SOLANA_ERROR__MAX_PDA_SEED_LENGTH_EXCEEDED, SOLANA_ERROR__PROGRAM_ADDRESS_ENDS_WITH_PDA_MARKER, SOLANA_ERROR__NOT_AN_ED25519_PUBLIC_KEY, SOLANA_ERROR__MAX_NUMBER_OF_PDA_SEEDS_EXCEEDED } from '@solana/errors';
|
|
3
4
|
import { assertKeyExporterIsAvailable, assertDigestCapabilityIsAvailable } from '@solana/assertions';
|
|
4
5
|
|
|
5
6
|
// src/address.ts
|
|
@@ -38,43 +39,37 @@ function assertIsAddress(putativeAddress) {
|
|
|
38
39
|
putativeAddress.length < 32 || // Highest address (32 bytes of 255)
|
|
39
40
|
putativeAddress.length > 44
|
|
40
41
|
) {
|
|
41
|
-
throw new
|
|
42
|
+
throw new SolanaError(SOLANA_ERROR__INCORRECT_BASE58_ADDRESS_LENGTH, {
|
|
43
|
+
actualLength: putativeAddress.length
|
|
44
|
+
});
|
|
42
45
|
}
|
|
43
46
|
const base58Encoder = getMemoizedBase58Encoder();
|
|
44
47
|
const bytes = base58Encoder.encode(putativeAddress);
|
|
45
48
|
const numBytes = bytes.byteLength;
|
|
46
49
|
if (numBytes !== 32) {
|
|
47
|
-
throw new
|
|
50
|
+
throw new SolanaError(SOLANA_ERROR__INCORRECT_BASE58_ADDRESS_BYTE_LENGTH, {
|
|
51
|
+
actualLength: numBytes
|
|
52
|
+
});
|
|
48
53
|
}
|
|
49
54
|
} catch (e) {
|
|
50
|
-
throw new
|
|
51
|
-
cause: e
|
|
52
|
-
});
|
|
55
|
+
throw new SolanaError(SOLANA_ERROR__NOT_A_BASE58_ENCODED_ADDRESS, { putativeAddress });
|
|
53
56
|
}
|
|
54
57
|
}
|
|
55
58
|
function address(putativeAddress) {
|
|
56
59
|
assertIsAddress(putativeAddress);
|
|
57
60
|
return putativeAddress;
|
|
58
61
|
}
|
|
59
|
-
function getAddressEncoder(
|
|
62
|
+
function getAddressEncoder() {
|
|
60
63
|
return mapEncoder(
|
|
61
|
-
getStringEncoder({
|
|
62
|
-
description: config?.description ?? "Address",
|
|
63
|
-
encoding: getMemoizedBase58Encoder(),
|
|
64
|
-
size: 32
|
|
65
|
-
}),
|
|
64
|
+
getStringEncoder({ encoding: getMemoizedBase58Encoder(), size: 32 }),
|
|
66
65
|
(putativeAddress) => address(putativeAddress)
|
|
67
66
|
);
|
|
68
67
|
}
|
|
69
|
-
function getAddressDecoder(
|
|
70
|
-
return getStringDecoder({
|
|
71
|
-
description: config?.description ?? "Address",
|
|
72
|
-
encoding: getMemoizedBase58Decoder(),
|
|
73
|
-
size: 32
|
|
74
|
-
});
|
|
68
|
+
function getAddressDecoder() {
|
|
69
|
+
return getStringDecoder({ encoding: getMemoizedBase58Decoder(), size: 32 });
|
|
75
70
|
}
|
|
76
|
-
function getAddressCodec(
|
|
77
|
-
return combineCodec(getAddressEncoder(
|
|
71
|
+
function getAddressCodec() {
|
|
72
|
+
return combineCodec(getAddressEncoder(), getAddressDecoder());
|
|
78
73
|
}
|
|
79
74
|
function getAddressComparator() {
|
|
80
75
|
return new Intl.Collator("en", {
|
|
@@ -184,12 +179,12 @@ function isProgramDerivedAddress(value) {
|
|
|
184
179
|
function assertIsProgramDerivedAddress(value) {
|
|
185
180
|
const validFormat = Array.isArray(value) && value.length === 2 && typeof value[0] === "string" && typeof value[1] === "number";
|
|
186
181
|
if (!validFormat) {
|
|
187
|
-
throw new
|
|
188
|
-
`Expected given program derived address to have the following format: [Address, ProgramDerivedAddressBump].`
|
|
189
|
-
);
|
|
182
|
+
throw new SolanaError(SOLANA_ERROR__MALFORMED_PROGRAM_DERIVED_ADDRESS);
|
|
190
183
|
}
|
|
191
184
|
if (value[1] < 0 || value[1] > 255) {
|
|
192
|
-
throw new
|
|
185
|
+
throw new SolanaError(SOLANA_ERROR__PROGRAM_DERIVED_ADDRESS_BUMP_SEED_OUT_OF_RANGE, {
|
|
186
|
+
bump: value[1]
|
|
187
|
+
});
|
|
193
188
|
}
|
|
194
189
|
assertIsAddress(value[0]);
|
|
195
190
|
}
|
|
@@ -219,18 +214,23 @@ var PDA_MARKER_BYTES = [
|
|
|
219
214
|
115,
|
|
220
215
|
115
|
|
221
216
|
];
|
|
222
|
-
var PointOnCurveError = class extends Error {
|
|
223
|
-
};
|
|
224
217
|
async function createProgramDerivedAddress({ programAddress, seeds }) {
|
|
225
218
|
await assertDigestCapabilityIsAvailable();
|
|
226
219
|
if (seeds.length > MAX_SEEDS) {
|
|
227
|
-
throw new
|
|
220
|
+
throw new SolanaError(SOLANA_ERROR__MAX_NUMBER_OF_PDA_SEEDS_EXCEEDED, {
|
|
221
|
+
actual: seeds.length,
|
|
222
|
+
maxSeeds: MAX_SEEDS
|
|
223
|
+
});
|
|
228
224
|
}
|
|
229
225
|
let textEncoder;
|
|
230
226
|
const seedBytes = seeds.reduce((acc, seed, ii) => {
|
|
231
|
-
const bytes = typeof seed === "string" ? (textEncoder
|
|
227
|
+
const bytes = typeof seed === "string" ? (textEncoder ||= new TextEncoder()).encode(seed) : seed;
|
|
232
228
|
if (bytes.byteLength > MAX_SEED_LENGTH) {
|
|
233
|
-
throw new
|
|
229
|
+
throw new SolanaError(SOLANA_ERROR__MAX_PDA_SEED_LENGTH_EXCEEDED, {
|
|
230
|
+
actual: bytes.byteLength,
|
|
231
|
+
index: ii,
|
|
232
|
+
maxSeedLength: MAX_SEED_LENGTH
|
|
233
|
+
});
|
|
234
234
|
}
|
|
235
235
|
acc.push(...bytes);
|
|
236
236
|
return acc;
|
|
@@ -243,9 +243,9 @@ async function createProgramDerivedAddress({ programAddress, seeds }) {
|
|
|
243
243
|
);
|
|
244
244
|
const addressBytes = new Uint8Array(addressBytesBuffer);
|
|
245
245
|
if (await compressedPointBytesAreOnCurve(addressBytes)) {
|
|
246
|
-
throw new
|
|
246
|
+
throw new SolanaError(SOLANA_ERROR__INVALID_SEEDS_POINT_ON_CURVE);
|
|
247
247
|
}
|
|
248
|
-
return base58EncodedAddressCodec.decode(addressBytes)
|
|
248
|
+
return base58EncodedAddressCodec.decode(addressBytes);
|
|
249
249
|
}
|
|
250
250
|
async function getProgramDerivedAddress({
|
|
251
251
|
programAddress,
|
|
@@ -260,40 +260,43 @@ async function getProgramDerivedAddress({
|
|
|
260
260
|
});
|
|
261
261
|
return [address2, bumpSeed];
|
|
262
262
|
} catch (e) {
|
|
263
|
-
if (e
|
|
263
|
+
if (isSolanaError(e, SOLANA_ERROR__INVALID_SEEDS_POINT_ON_CURVE)) {
|
|
264
264
|
bumpSeed--;
|
|
265
265
|
} else {
|
|
266
266
|
throw e;
|
|
267
267
|
}
|
|
268
268
|
}
|
|
269
269
|
}
|
|
270
|
-
throw new
|
|
270
|
+
throw new SolanaError(SOLANA_ERROR__COULD_NOT_FIND_VIABLE_PDA_BUMP_SEED);
|
|
271
271
|
}
|
|
272
272
|
async function createAddressWithSeed({ baseAddress, programAddress, seed }) {
|
|
273
273
|
const { encode, decode } = getAddressCodec();
|
|
274
274
|
const seedBytes = typeof seed === "string" ? new TextEncoder().encode(seed) : seed;
|
|
275
275
|
if (seedBytes.byteLength > MAX_SEED_LENGTH) {
|
|
276
|
-
throw new
|
|
276
|
+
throw new SolanaError(SOLANA_ERROR__MAX_PDA_SEED_LENGTH_EXCEEDED, {
|
|
277
|
+
actual: seedBytes.byteLength,
|
|
278
|
+
index: 0,
|
|
279
|
+
maxSeedLength: MAX_SEED_LENGTH
|
|
280
|
+
});
|
|
277
281
|
}
|
|
278
282
|
const programAddressBytes = encode(programAddress);
|
|
279
283
|
if (programAddressBytes.length >= PDA_MARKER_BYTES.length && programAddressBytes.slice(-PDA_MARKER_BYTES.length).every((byte, index) => byte === PDA_MARKER_BYTES[index])) {
|
|
280
|
-
throw new
|
|
284
|
+
throw new SolanaError(SOLANA_ERROR__PROGRAM_ADDRESS_ENDS_WITH_PDA_MARKER);
|
|
281
285
|
}
|
|
282
286
|
const addressBytesBuffer = await crypto.subtle.digest(
|
|
283
287
|
"SHA-256",
|
|
284
288
|
new Uint8Array([...encode(baseAddress), ...seedBytes, ...programAddressBytes])
|
|
285
289
|
);
|
|
286
290
|
const addressBytes = new Uint8Array(addressBytesBuffer);
|
|
287
|
-
return decode(addressBytes)
|
|
291
|
+
return decode(addressBytes);
|
|
288
292
|
}
|
|
289
293
|
async function getAddressFromPublicKey(publicKey) {
|
|
290
294
|
await assertKeyExporterIsAvailable();
|
|
291
295
|
if (publicKey.type !== "public" || publicKey.algorithm.name !== "Ed25519") {
|
|
292
|
-
throw new
|
|
296
|
+
throw new SolanaError(SOLANA_ERROR__NOT_AN_ED25519_PUBLIC_KEY);
|
|
293
297
|
}
|
|
294
298
|
const publicKeyBytes = await crypto.subtle.exportKey("raw", publicKey);
|
|
295
|
-
|
|
296
|
-
return base58EncodedAddress;
|
|
299
|
+
return getAddressDecoder().decode(new Uint8Array(publicKeyBytes));
|
|
297
300
|
}
|
|
298
301
|
|
|
299
302
|
export { address, assertIsAddress, assertIsProgramDerivedAddress, createAddressWithSeed, getAddressCodec, getAddressComparator, getAddressDecoder, getAddressEncoder, getAddressFromPublicKey, getProgramDerivedAddress, isAddress, isProgramDerivedAddress };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/address.ts","../src/program-derived-address.ts","../src/vendor/noble/ed25519.ts","../src/curve.ts","../src/public-key.ts"],"names":["address"],"mappings":"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","sourcesContent":["import { Codec, combineCodec, Decoder, Encoder, mapEncoder } from '@solana/codecs-core';\nimport { getBase58Decoder, getBase58Encoder, getStringDecoder, getStringEncoder } from '@solana/codecs-strings';\n\nexport type Address<TAddress extends string = string> = TAddress & {\n readonly __brand: unique symbol;\n};\n\nlet memoizedBase58Encoder: Encoder<string> | undefined;\nlet memoizedBase58Decoder: Decoder<string> | undefined;\n\nfunction getMemoizedBase58Encoder(): Encoder<string> {\n if (!memoizedBase58Encoder) memoizedBase58Encoder = getBase58Encoder();\n return memoizedBase58Encoder;\n}\n\nfunction getMemoizedBase58Decoder(): Decoder<string> {\n if (!memoizedBase58Decoder) memoizedBase58Decoder = getBase58Decoder();\n return memoizedBase58Decoder;\n}\n\nexport function isAddress(putativeAddress: string): putativeAddress is Address<typeof putativeAddress> {\n // Fast-path; see if the input string is of an acceptable length.\n if (\n // Lowest address (32 bytes of zeroes)\n putativeAddress.length < 32 ||\n // Highest address (32 bytes of 255)\n putativeAddress.length > 44\n ) {\n return false;\n }\n // Slow-path; actually attempt to decode the input string.\n const base58Encoder = getMemoizedBase58Encoder();\n const bytes = base58Encoder.encode(putativeAddress);\n const numBytes = bytes.byteLength;\n if (numBytes !== 32) {\n return false;\n }\n return true;\n}\n\nexport function assertIsAddress(putativeAddress: string): asserts putativeAddress is Address<typeof putativeAddress> {\n try {\n // Fast-path; see if the input string is of an acceptable length.\n if (\n // Lowest address (32 bytes of zeroes)\n putativeAddress.length < 32 ||\n // Highest address (32 bytes of 255)\n putativeAddress.length > 44\n ) {\n throw new Error('Expected input string to decode to a byte array of length 32.');\n }\n // Slow-path; actually attempt to decode the input string.\n const base58Encoder = getMemoizedBase58Encoder();\n const bytes = base58Encoder.encode(putativeAddress);\n const numBytes = bytes.byteLength;\n if (numBytes !== 32) {\n throw new Error(`Expected input string to decode to a byte array of length 32. Actual length: ${numBytes}`);\n }\n } catch (e) {\n throw new Error(`\\`${putativeAddress}\\` is not a base-58 encoded address`, {\n cause: e,\n });\n }\n}\n\nexport function address<TAddress extends string = string>(putativeAddress: TAddress): Address<TAddress> {\n assertIsAddress(putativeAddress);\n return putativeAddress as Address<TAddress>;\n}\n\nexport function getAddressEncoder(config?: Readonly<{ description: string }>): Encoder<Address> {\n return mapEncoder(\n getStringEncoder({\n description: config?.description ?? 'Address',\n encoding: getMemoizedBase58Encoder(),\n size: 32,\n }),\n putativeAddress => address(putativeAddress)\n );\n}\n\nexport function getAddressDecoder(config?: Readonly<{ description: string }>): Decoder<Address> {\n return getStringDecoder({\n description: config?.description ?? 'Address',\n encoding: getMemoizedBase58Decoder(),\n size: 32,\n }) as Decoder<Address>;\n}\n\nexport function getAddressCodec(config?: Readonly<{ description: string }>): Codec<Address> {\n return combineCodec(getAddressEncoder(config), getAddressDecoder(config));\n}\n\nexport function getAddressComparator(): (x: string, y: string) => number {\n return new Intl.Collator('en', {\n caseFirst: 'lower',\n ignorePunctuation: false,\n localeMatcher: 'best fit',\n numeric: false,\n sensitivity: 'variant',\n usage: 'sort',\n }).compare;\n}\n","import { assertDigestCapabilityIsAvailable } from '@solana/assertions';\n\nimport { Address, assertIsAddress, getAddressCodec, isAddress } from './address';\nimport { compressedPointBytesAreOnCurve } from './curve';\n\n/**\n * An address derived from a program address and a set of seeds.\n * It includes the bump seed used to derive the address and\n * ensure the address is not on the Ed25519 curve.\n */\nexport type ProgramDerivedAddress<TAddress extends string = string> = Readonly<\n [Address<TAddress>, ProgramDerivedAddressBump]\n>;\n\n/**\n * A number between 0 and 255, inclusive.\n */\nexport type ProgramDerivedAddressBump = number & {\n readonly __brand: unique symbol;\n};\n\n/**\n * Returns true if the input value is a program derived address.\n */\nexport function isProgramDerivedAddress<TAddress extends string = string>(\n value: unknown\n): value is ProgramDerivedAddress<TAddress> {\n return (\n Array.isArray(value) &&\n value.length === 2 &&\n typeof value[0] === 'string' &&\n typeof value[1] === 'number' &&\n value[1] >= 0 &&\n value[1] <= 255 &&\n isAddress(value[0])\n );\n}\n\n/**\n * Fails if the input value is not a program derived address.\n */\nexport function assertIsProgramDerivedAddress<TAddress extends string = string>(\n value: unknown\n): asserts value is ProgramDerivedAddress<TAddress> {\n const validFormat =\n Array.isArray(value) && value.length === 2 && typeof value[0] === 'string' && typeof value[1] === 'number';\n if (!validFormat) {\n // TODO: Coded error.\n throw new Error(\n `Expected given program derived address to have the following format: [Address, ProgramDerivedAddressBump].`\n );\n }\n if (value[1] < 0 || value[1] > 255) {\n // TODO: Coded error.\n throw new Error(`Expected program derived address bump to be in the range [0, 255], got: ${value[1]}.`);\n }\n assertIsAddress(value[0]);\n}\n\ntype ProgramDerivedAddressInput = Readonly<{\n programAddress: Address;\n seeds: Seed[];\n}>;\n\ntype SeedInput = Readonly<{\n baseAddress: Address;\n programAddress: Address;\n seed: Seed;\n}>;\n\ntype Seed = string | Uint8Array;\n\nconst MAX_SEED_LENGTH = 32;\nconst MAX_SEEDS = 16;\nconst PDA_MARKER_BYTES = [\n // The string 'ProgramDerivedAddress'\n 80, 114, 111, 103, 114, 97, 109, 68, 101, 114, 105, 118, 101, 100, 65, 100, 100, 114, 101, 115, 115,\n] as const;\n\n// TODO: Coded error.\nclass PointOnCurveError extends Error {}\n\nasync function createProgramDerivedAddress({ programAddress, seeds }: ProgramDerivedAddressInput): Promise<Address> {\n await assertDigestCapabilityIsAvailable();\n if (seeds.length > MAX_SEEDS) {\n // TODO: Coded error.\n throw new Error(`A maximum of ${MAX_SEEDS} seeds may be supplied when creating an address`);\n }\n let textEncoder: TextEncoder;\n const seedBytes = seeds.reduce((acc, seed, ii) => {\n const bytes = typeof seed === 'string' ? (textEncoder ||= new TextEncoder()).encode(seed) : seed;\n if (bytes.byteLength > MAX_SEED_LENGTH) {\n // TODO: Coded error.\n throw new Error(`The seed at index ${ii} exceeds the maximum length of 32 bytes`);\n }\n acc.push(...bytes);\n return acc;\n }, [] as number[]);\n const base58EncodedAddressCodec = getAddressCodec();\n const programAddressBytes = base58EncodedAddressCodec.encode(programAddress);\n const addressBytesBuffer = await crypto.subtle.digest(\n 'SHA-256',\n new Uint8Array([...seedBytes, ...programAddressBytes, ...PDA_MARKER_BYTES])\n );\n const addressBytes = new Uint8Array(addressBytesBuffer);\n if (await compressedPointBytesAreOnCurve(addressBytes)) {\n // TODO: Coded error.\n throw new PointOnCurveError('Invalid seeds; point must fall off the Ed25519 curve');\n }\n return base58EncodedAddressCodec.decode(addressBytes)[0];\n}\n\nexport async function getProgramDerivedAddress({\n programAddress,\n seeds,\n}: ProgramDerivedAddressInput): Promise<ProgramDerivedAddress> {\n let bumpSeed = 255;\n while (bumpSeed > 0) {\n try {\n const address = await createProgramDerivedAddress({\n programAddress,\n seeds: [...seeds, new Uint8Array([bumpSeed])],\n });\n return [address, bumpSeed as ProgramDerivedAddressBump];\n } catch (e) {\n if (e instanceof PointOnCurveError) {\n bumpSeed--;\n } else {\n throw e;\n }\n }\n }\n // TODO: Coded error.\n throw new Error('Unable to find a viable program address bump seed');\n}\n\nexport async function createAddressWithSeed({ baseAddress, programAddress, seed }: SeedInput): Promise<Address> {\n const { encode, decode } = getAddressCodec();\n\n const seedBytes = typeof seed === 'string' ? new TextEncoder().encode(seed) : seed;\n if (seedBytes.byteLength > MAX_SEED_LENGTH) {\n // TODO: Coded error.\n throw new Error(`The seed exceeds the maximum length of 32 bytes`);\n }\n\n const programAddressBytes = encode(programAddress);\n if (\n programAddressBytes.length >= PDA_MARKER_BYTES.length &&\n programAddressBytes.slice(-PDA_MARKER_BYTES.length).every((byte, index) => byte === PDA_MARKER_BYTES[index])\n ) {\n // TODO: Coded error.\n throw new Error(`programAddress cannot end with the PDA marker`);\n }\n\n const addressBytesBuffer = await crypto.subtle.digest(\n 'SHA-256',\n new Uint8Array([...encode(baseAddress), ...seedBytes, ...programAddressBytes])\n );\n const addressBytes = new Uint8Array(addressBytesBuffer);\n\n return decode(addressBytes)[0];\n}\n","/**!\n * noble-ed25519\n *\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Paul Miller (https://paulmillr.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the “Software”), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nconst D = 37095705934669439343138083508754565189542113879843219016388785533085940283555n;\nconst P = 57896044618658097711785492504343953926634992332820282019728792003956564819949n; // 2n ** 255n - 19n; ed25519 is twisted edwards curve\nconst RM1 = 19681161376707505956807079304988542015446066515923890162744021073123829784752n; // √-1\n\n// mod division\nfunction mod(a: bigint): bigint {\n const r = a % P;\n return r >= 0n ? r : P + r;\n}\nfunction pow2(x: bigint, power: bigint): bigint {\n // pow2(x, 4) == x^(2^4)\n let r = x;\n while (power-- > 0n) {\n r *= r;\n r %= P;\n }\n return r;\n}\nfunction pow_2_252_3(x: bigint): bigint {\n // x^(2^252-3) unrolled util for square root\n const x2 = (x * x) % P; // x^2, bits 1\n const b2 = (x2 * x) % P; // x^3, bits 11\n const b4 = (pow2(b2, 2n) * b2) % P; // x^(2^4-1), bits 1111\n const b5 = (pow2(b4, 1n) * x) % P; // x^(2^5-1), bits 11111\n const b10 = (pow2(b5, 5n) * b5) % P; // x^(2^10)\n const b20 = (pow2(b10, 10n) * b10) % P; // x^(2^20)\n const b40 = (pow2(b20, 20n) * b20) % P; // x^(2^40)\n const b80 = (pow2(b40, 40n) * b40) % P; // x^(2^80)\n const b160 = (pow2(b80, 80n) * b80) % P; // x^(2^160)\n const b240 = (pow2(b160, 80n) * b80) % P; // x^(2^240)\n const b250 = (pow2(b240, 10n) * b10) % P; // x^(2^250)\n const pow_p_5_8 = (pow2(b250, 2n) * x) % P; // < To pow to (p+3)/8, multiply it by x.\n return pow_p_5_8;\n}\nfunction uvRatio(u: bigint, v: bigint): bigint | null {\n // for sqrt comp\n const v3 = mod(v * v * v); // v³\n const v7 = mod(v3 * v3 * v); // v⁷\n const pow = pow_2_252_3(u * v7); // (uv⁷)^(p-5)/8\n let x = mod(u * v3 * pow); // (uv³)(uv⁷)^(p-5)/8\n const vx2 = mod(v * x * x); // vx²\n const root1 = x; // First root candidate\n const root2 = mod(x * RM1); // Second root candidate; RM1 is √-1\n const useRoot1 = vx2 === u; // If vx² = u (mod p), x is a square root\n const useRoot2 = vx2 === mod(-u); // If vx² = -u, set x <-- x * 2^((p-1)/4)\n const noRoot = vx2 === mod(-u * RM1); // There is no valid root, vx² = -u√-1\n if (useRoot1) x = root1;\n if (useRoot2 || noRoot) x = root2; // We return root2 anyway, for const-time\n if ((mod(x) & 1n) === 1n) x = mod(-x); // edIsNegative\n if (!useRoot1 && !useRoot2) {\n return null;\n }\n return x;\n}\n// https://datatracker.ietf.org/doc/html/rfc8032#section-5.1.3\nexport function pointIsOnCurve(y: bigint, lastByte: number): boolean {\n const y2 = mod(y * y); // y²\n const u = mod(y2 - 1n); // u=y²-1\n const v = mod(D * y2 + 1n);\n const x = uvRatio(u, v); // (uv³)(uv⁷)^(p-5)/8; square root\n if (x === null) {\n return false;\n }\n const isLastByteOdd = (lastByte & 0x80) !== 0; // x_0, last bit\n if (x === 0n && isLastByteOdd) {\n return false;\n }\n return true;\n}\n","import { pointIsOnCurve } from './vendor/noble/ed25519';\n\nfunction byteToHex(byte: number): string {\n const hexString = byte.toString(16);\n if (hexString.length === 1) {\n return `0${hexString}`;\n } else {\n return hexString;\n }\n}\n\nfunction decompressPointBytes(bytes: Uint8Array): bigint {\n const hexString = bytes.reduce((acc, byte, ii) => `${byteToHex(ii === 31 ? byte & ~0x80 : byte)}${acc}`, '');\n const integerLiteralString = `0x${hexString}`;\n return BigInt(integerLiteralString);\n}\n\nexport async function compressedPointBytesAreOnCurve(bytes: Uint8Array): Promise<boolean> {\n if (bytes.byteLength !== 32) {\n return false;\n }\n const y = decompressPointBytes(bytes);\n return pointIsOnCurve(y, bytes[31]);\n}\n","import { assertKeyExporterIsAvailable } from '@solana/assertions';\n\nimport { Address, getAddressDecoder } from './address';\n\nexport async function getAddressFromPublicKey(publicKey: CryptoKey): Promise<Address> {\n await assertKeyExporterIsAvailable();\n if (publicKey.type !== 'public' || publicKey.algorithm.name !== 'Ed25519') {\n // TODO: Coded error.\n throw new Error('The `CryptoKey` must be an `Ed25519` public key');\n }\n const publicKeyBytes = await crypto.subtle.exportKey('raw', publicKey);\n const [base58EncodedAddress] = getAddressDecoder().decode(new Uint8Array(publicKeyBytes));\n return base58EncodedAddress;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/address.ts","../src/program-derived-address.ts","../src/vendor/noble/ed25519.ts","../src/curve.ts","../src/public-key.ts"],"names":["SolanaError","address"],"mappings":"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","sourcesContent":["import {\n combineCodec,\n Decoder,\n Encoder,\n FixedSizeCodec,\n FixedSizeDecoder,\n FixedSizeEncoder,\n mapEncoder,\n} from '@solana/codecs-core';\nimport { getBase58Decoder, getBase58Encoder, getStringDecoder, getStringEncoder } from '@solana/codecs-strings';\nimport {\n SOLANA_ERROR__INCORRECT_BASE58_ADDRESS_BYTE_LENGTH,\n SOLANA_ERROR__INCORRECT_BASE58_ADDRESS_LENGTH,\n SOLANA_ERROR__NOT_A_BASE58_ENCODED_ADDRESS,\n SolanaError,\n} from '@solana/errors';\n\nexport type Address<TAddress extends string = string> = TAddress & {\n readonly __brand: unique symbol;\n};\n\nlet memoizedBase58Encoder: Encoder<string> | undefined;\nlet memoizedBase58Decoder: Decoder<string> | undefined;\n\nfunction getMemoizedBase58Encoder(): Encoder<string> {\n if (!memoizedBase58Encoder) memoizedBase58Encoder = getBase58Encoder();\n return memoizedBase58Encoder;\n}\n\nfunction getMemoizedBase58Decoder(): Decoder<string> {\n if (!memoizedBase58Decoder) memoizedBase58Decoder = getBase58Decoder();\n return memoizedBase58Decoder;\n}\n\nexport function isAddress(putativeAddress: string): putativeAddress is Address<typeof putativeAddress> {\n // Fast-path; see if the input string is of an acceptable length.\n if (\n // Lowest address (32 bytes of zeroes)\n putativeAddress.length < 32 ||\n // Highest address (32 bytes of 255)\n putativeAddress.length > 44\n ) {\n return false;\n }\n // Slow-path; actually attempt to decode the input string.\n const base58Encoder = getMemoizedBase58Encoder();\n const bytes = base58Encoder.encode(putativeAddress);\n const numBytes = bytes.byteLength;\n if (numBytes !== 32) {\n return false;\n }\n return true;\n}\n\nexport function assertIsAddress(putativeAddress: string): asserts putativeAddress is Address<typeof putativeAddress> {\n try {\n // Fast-path; see if the input string is of an acceptable length.\n if (\n // Lowest address (32 bytes of zeroes)\n putativeAddress.length < 32 ||\n // Highest address (32 bytes of 255)\n putativeAddress.length > 44\n ) {\n throw new SolanaError(SOLANA_ERROR__INCORRECT_BASE58_ADDRESS_LENGTH, {\n actualLength: putativeAddress.length,\n });\n }\n // Slow-path; actually attempt to decode the input string.\n const base58Encoder = getMemoizedBase58Encoder();\n const bytes = base58Encoder.encode(putativeAddress);\n const numBytes = bytes.byteLength;\n if (numBytes !== 32) {\n throw new SolanaError(SOLANA_ERROR__INCORRECT_BASE58_ADDRESS_BYTE_LENGTH, {\n actualLength: numBytes,\n });\n }\n } catch (e) {\n throw new SolanaError(SOLANA_ERROR__NOT_A_BASE58_ENCODED_ADDRESS, { putativeAddress });\n }\n}\n\nexport function address<TAddress extends string = string>(putativeAddress: TAddress): Address<TAddress> {\n assertIsAddress(putativeAddress);\n return putativeAddress as Address<TAddress>;\n}\n\nexport function getAddressEncoder(): FixedSizeEncoder<Address, 32> {\n return mapEncoder(getStringEncoder({ encoding: getMemoizedBase58Encoder(), size: 32 }), putativeAddress =>\n address(putativeAddress),\n );\n}\n\nexport function getAddressDecoder(): FixedSizeDecoder<Address, 32> {\n return getStringDecoder({ encoding: getMemoizedBase58Decoder(), size: 32 }) as FixedSizeDecoder<Address, 32>;\n}\n\nexport function getAddressCodec(): FixedSizeCodec<Address, Address, 32> {\n return combineCodec(getAddressEncoder(), getAddressDecoder());\n}\n\nexport function getAddressComparator(): (x: string, y: string) => number {\n return new Intl.Collator('en', {\n caseFirst: 'lower',\n ignorePunctuation: false,\n localeMatcher: 'best fit',\n numeric: false,\n sensitivity: 'variant',\n usage: 'sort',\n }).compare;\n}\n","import { assertDigestCapabilityIsAvailable } from '@solana/assertions';\nimport {\n isSolanaError,\n SOLANA_ERROR__COULD_NOT_FIND_VIABLE_PDA_BUMP_SEED,\n SOLANA_ERROR__INVALID_SEEDS_POINT_ON_CURVE,\n SOLANA_ERROR__MALFORMED_PROGRAM_DERIVED_ADDRESS,\n SOLANA_ERROR__MAX_NUMBER_OF_PDA_SEEDS_EXCEEDED,\n SOLANA_ERROR__MAX_PDA_SEED_LENGTH_EXCEEDED,\n SOLANA_ERROR__PROGRAM_ADDRESS_ENDS_WITH_PDA_MARKER,\n SOLANA_ERROR__PROGRAM_DERIVED_ADDRESS_BUMP_SEED_OUT_OF_RANGE,\n SolanaError,\n} from '@solana/errors';\n\nimport { Address, assertIsAddress, getAddressCodec, isAddress } from './address';\nimport { compressedPointBytesAreOnCurve } from './curve';\n\n/**\n * An address derived from a program address and a set of seeds.\n * It includes the bump seed used to derive the address and\n * ensure the address is not on the Ed25519 curve.\n */\nexport type ProgramDerivedAddress<TAddress extends string = string> = Readonly<\n [Address<TAddress>, ProgramDerivedAddressBump]\n>;\n\n/**\n * A number between 0 and 255, inclusive.\n */\nexport type ProgramDerivedAddressBump = number & {\n readonly __brand: unique symbol;\n};\n\n/**\n * Returns true if the input value is a program derived address.\n */\nexport function isProgramDerivedAddress<TAddress extends string = string>(\n value: unknown,\n): value is ProgramDerivedAddress<TAddress> {\n return (\n Array.isArray(value) &&\n value.length === 2 &&\n typeof value[0] === 'string' &&\n typeof value[1] === 'number' &&\n value[1] >= 0 &&\n value[1] <= 255 &&\n isAddress(value[0])\n );\n}\n\n/**\n * Fails if the input value is not a program derived address.\n */\nexport function assertIsProgramDerivedAddress<TAddress extends string = string>(\n value: unknown,\n): asserts value is ProgramDerivedAddress<TAddress> {\n const validFormat =\n Array.isArray(value) && value.length === 2 && typeof value[0] === 'string' && typeof value[1] === 'number';\n if (!validFormat) {\n throw new SolanaError(SOLANA_ERROR__MALFORMED_PROGRAM_DERIVED_ADDRESS);\n }\n if (value[1] < 0 || value[1] > 255) {\n throw new SolanaError(SOLANA_ERROR__PROGRAM_DERIVED_ADDRESS_BUMP_SEED_OUT_OF_RANGE, {\n bump: value[1],\n });\n }\n assertIsAddress(value[0]);\n}\n\ntype ProgramDerivedAddressInput = Readonly<{\n programAddress: Address;\n seeds: Seed[];\n}>;\n\ntype SeedInput = Readonly<{\n baseAddress: Address;\n programAddress: Address;\n seed: Seed;\n}>;\n\ntype Seed = string | Uint8Array;\n\nconst MAX_SEED_LENGTH = 32;\nconst MAX_SEEDS = 16;\nconst PDA_MARKER_BYTES = [\n // The string 'ProgramDerivedAddress'\n 80, 114, 111, 103, 114, 97, 109, 68, 101, 114, 105, 118, 101, 100, 65, 100, 100, 114, 101, 115, 115,\n] as const;\n\nasync function createProgramDerivedAddress({ programAddress, seeds }: ProgramDerivedAddressInput): Promise<Address> {\n await assertDigestCapabilityIsAvailable();\n if (seeds.length > MAX_SEEDS) {\n throw new SolanaError(SOLANA_ERROR__MAX_NUMBER_OF_PDA_SEEDS_EXCEEDED, {\n actual: seeds.length,\n maxSeeds: MAX_SEEDS,\n });\n }\n let textEncoder: TextEncoder;\n const seedBytes = seeds.reduce((acc, seed, ii) => {\n const bytes = typeof seed === 'string' ? (textEncoder ||= new TextEncoder()).encode(seed) : seed;\n if (bytes.byteLength > MAX_SEED_LENGTH) {\n throw new SolanaError(SOLANA_ERROR__MAX_PDA_SEED_LENGTH_EXCEEDED, {\n actual: bytes.byteLength,\n index: ii,\n maxSeedLength: MAX_SEED_LENGTH,\n });\n }\n acc.push(...bytes);\n return acc;\n }, [] as number[]);\n const base58EncodedAddressCodec = getAddressCodec();\n const programAddressBytes = base58EncodedAddressCodec.encode(programAddress);\n const addressBytesBuffer = await crypto.subtle.digest(\n 'SHA-256',\n new Uint8Array([...seedBytes, ...programAddressBytes, ...PDA_MARKER_BYTES]),\n );\n const addressBytes = new Uint8Array(addressBytesBuffer);\n if (await compressedPointBytesAreOnCurve(addressBytes)) {\n throw new SolanaError(SOLANA_ERROR__INVALID_SEEDS_POINT_ON_CURVE);\n }\n return base58EncodedAddressCodec.decode(addressBytes);\n}\n\nexport async function getProgramDerivedAddress({\n programAddress,\n seeds,\n}: ProgramDerivedAddressInput): Promise<ProgramDerivedAddress> {\n let bumpSeed = 255;\n while (bumpSeed > 0) {\n try {\n const address = await createProgramDerivedAddress({\n programAddress,\n seeds: [...seeds, new Uint8Array([bumpSeed])],\n });\n return [address, bumpSeed as ProgramDerivedAddressBump];\n } catch (e) {\n if (isSolanaError(e, SOLANA_ERROR__INVALID_SEEDS_POINT_ON_CURVE)) {\n bumpSeed--;\n } else {\n throw e;\n }\n }\n }\n throw new SolanaError(SOLANA_ERROR__COULD_NOT_FIND_VIABLE_PDA_BUMP_SEED);\n}\n\nexport async function createAddressWithSeed({ baseAddress, programAddress, seed }: SeedInput): Promise<Address> {\n const { encode, decode } = getAddressCodec();\n\n const seedBytes = typeof seed === 'string' ? new TextEncoder().encode(seed) : seed;\n if (seedBytes.byteLength > MAX_SEED_LENGTH) {\n throw new SolanaError(SOLANA_ERROR__MAX_PDA_SEED_LENGTH_EXCEEDED, {\n actual: seedBytes.byteLength,\n index: 0,\n maxSeedLength: MAX_SEED_LENGTH,\n });\n }\n\n const programAddressBytes = encode(programAddress);\n if (\n programAddressBytes.length >= PDA_MARKER_BYTES.length &&\n programAddressBytes.slice(-PDA_MARKER_BYTES.length).every((byte, index) => byte === PDA_MARKER_BYTES[index])\n ) {\n throw new SolanaError(SOLANA_ERROR__PROGRAM_ADDRESS_ENDS_WITH_PDA_MARKER);\n }\n\n const addressBytesBuffer = await crypto.subtle.digest(\n 'SHA-256',\n new Uint8Array([...encode(baseAddress), ...seedBytes, ...programAddressBytes]),\n );\n const addressBytes = new Uint8Array(addressBytesBuffer);\n\n return decode(addressBytes);\n}\n","/**!\n * noble-ed25519\n *\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Paul Miller (https://paulmillr.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the “Software”), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\nconst D = 37095705934669439343138083508754565189542113879843219016388785533085940283555n;\nconst P = 57896044618658097711785492504343953926634992332820282019728792003956564819949n; // 2n ** 255n - 19n; ed25519 is twisted edwards curve\nconst RM1 = 19681161376707505956807079304988542015446066515923890162744021073123829784752n; // √-1\n\n// mod division\nfunction mod(a: bigint): bigint {\n const r = a % P;\n return r >= 0n ? r : P + r;\n}\nfunction pow2(x: bigint, power: bigint): bigint {\n // pow2(x, 4) == x^(2^4)\n let r = x;\n while (power-- > 0n) {\n r *= r;\n r %= P;\n }\n return r;\n}\nfunction pow_2_252_3(x: bigint): bigint {\n // x^(2^252-3) unrolled util for square root\n const x2 = (x * x) % P; // x^2, bits 1\n const b2 = (x2 * x) % P; // x^3, bits 11\n const b4 = (pow2(b2, 2n) * b2) % P; // x^(2^4-1), bits 1111\n const b5 = (pow2(b4, 1n) * x) % P; // x^(2^5-1), bits 11111\n const b10 = (pow2(b5, 5n) * b5) % P; // x^(2^10)\n const b20 = (pow2(b10, 10n) * b10) % P; // x^(2^20)\n const b40 = (pow2(b20, 20n) * b20) % P; // x^(2^40)\n const b80 = (pow2(b40, 40n) * b40) % P; // x^(2^80)\n const b160 = (pow2(b80, 80n) * b80) % P; // x^(2^160)\n const b240 = (pow2(b160, 80n) * b80) % P; // x^(2^240)\n const b250 = (pow2(b240, 10n) * b10) % P; // x^(2^250)\n const pow_p_5_8 = (pow2(b250, 2n) * x) % P; // < To pow to (p+3)/8, multiply it by x.\n return pow_p_5_8;\n}\nfunction uvRatio(u: bigint, v: bigint): bigint | null {\n // for sqrt comp\n const v3 = mod(v * v * v); // v³\n const v7 = mod(v3 * v3 * v); // v⁷\n const pow = pow_2_252_3(u * v7); // (uv⁷)^(p-5)/8\n let x = mod(u * v3 * pow); // (uv³)(uv⁷)^(p-5)/8\n const vx2 = mod(v * x * x); // vx²\n const root1 = x; // First root candidate\n const root2 = mod(x * RM1); // Second root candidate; RM1 is √-1\n const useRoot1 = vx2 === u; // If vx² = u (mod p), x is a square root\n const useRoot2 = vx2 === mod(-u); // If vx² = -u, set x <-- x * 2^((p-1)/4)\n const noRoot = vx2 === mod(-u * RM1); // There is no valid root, vx² = -u√-1\n if (useRoot1) x = root1;\n if (useRoot2 || noRoot) x = root2; // We return root2 anyway, for const-time\n if ((mod(x) & 1n) === 1n) x = mod(-x); // edIsNegative\n if (!useRoot1 && !useRoot2) {\n return null;\n }\n return x;\n}\n// https://datatracker.ietf.org/doc/html/rfc8032#section-5.1.3\nexport function pointIsOnCurve(y: bigint, lastByte: number): boolean {\n const y2 = mod(y * y); // y²\n const u = mod(y2 - 1n); // u=y²-1\n const v = mod(D * y2 + 1n);\n const x = uvRatio(u, v); // (uv³)(uv⁷)^(p-5)/8; square root\n if (x === null) {\n return false;\n }\n const isLastByteOdd = (lastByte & 0x80) !== 0; // x_0, last bit\n if (x === 0n && isLastByteOdd) {\n return false;\n }\n return true;\n}\n","import { pointIsOnCurve } from './vendor/noble/ed25519';\n\nfunction byteToHex(byte: number): string {\n const hexString = byte.toString(16);\n if (hexString.length === 1) {\n return `0${hexString}`;\n } else {\n return hexString;\n }\n}\n\nfunction decompressPointBytes(bytes: Uint8Array): bigint {\n const hexString = bytes.reduce((acc, byte, ii) => `${byteToHex(ii === 31 ? byte & ~0x80 : byte)}${acc}`, '');\n const integerLiteralString = `0x${hexString}`;\n return BigInt(integerLiteralString);\n}\n\nexport async function compressedPointBytesAreOnCurve(bytes: Uint8Array): Promise<boolean> {\n if (bytes.byteLength !== 32) {\n return false;\n }\n const y = decompressPointBytes(bytes);\n return pointIsOnCurve(y, bytes[31]);\n}\n","import { assertKeyExporterIsAvailable } from '@solana/assertions';\nimport { SOLANA_ERROR__NOT_AN_ED25519_PUBLIC_KEY, SolanaError } from '@solana/errors';\n\nimport { Address, getAddressDecoder } from './address';\n\nexport async function getAddressFromPublicKey(publicKey: CryptoKey): Promise<Address> {\n await assertKeyExporterIsAvailable();\n if (publicKey.type !== 'public' || publicKey.algorithm.name !== 'Ed25519') {\n throw new SolanaError(SOLANA_ERROR__NOT_AN_ED25519_PUBLIC_KEY);\n }\n const publicKeyBytes = await crypto.subtle.exportKey('raw', publicKey);\n return getAddressDecoder().decode(new Uint8Array(publicKeyBytes));\n}\n"]}
|