@medialane/sdk 0.113.0 → 0.115.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.
@@ -11912,6 +11912,25 @@ async function deriveAesKey(prfSecret, hkdfInfo) {
11912
11912
  ["encrypt", "decrypt"]
11913
11913
  );
11914
11914
  }
11915
+ var STARK_KEY_INFO = new TextEncoder().encode("medialane/passkey/stark-key/v1");
11916
+ var DERIVE_BITS = 384;
11917
+ function bytesToBigInt(bytes) {
11918
+ let value = 0n;
11919
+ for (const byte of bytes) value = value << 8n | BigInt(byte);
11920
+ return value;
11921
+ }
11922
+ async function deriveStarkKeyPair(prfSecret) {
11923
+ const hkdf = await crypto.subtle.importKey("raw", prfSecret, "HKDF", false, ["deriveBits"]);
11924
+ const bits = await crypto.subtle.deriveBits(
11925
+ { name: "HKDF", hash: "SHA-256", salt: new Uint8Array(0), info: STARK_KEY_INFO },
11926
+ hkdf,
11927
+ DERIVE_BITS
11928
+ );
11929
+ const order = starknet.ec.starkCurve.CURVE.n;
11930
+ const value = bytesToBigInt(new Uint8Array(bits)) % (order - 1n) + 1n;
11931
+ const privateKeyHex = "0x" + value.toString(16).padStart(64, "0");
11932
+ return { privateKeyHex, publicKeyHex: starknet.ec.starkCurve.getStarkKey(privateKeyHex) };
11933
+ }
11915
11934
  function generateStarkKeyPair() {
11916
11935
  const privateKeyHex = "0x" + Array.from(starknet.ec.starkCurve.utils.randomPrivateKey()).map((b) => b.toString(16).padStart(2, "0")).join("");
11917
11936
  return { privateKeyHex, publicKeyHex: starknet.ec.starkCurve.getStarkKey(privateKeyHex) };
@@ -11950,8 +11969,73 @@ function signWithPrivateKey(privateKeyHex, msgHash) {
11950
11969
  return [starknet.num.toHex(sig.r), starknet.num.toHex(sig.s)];
11951
11970
  }
11952
11971
 
11972
+ // src/starknet/app-approval/approval.ts
11973
+ var MEDIALANE_SUFFIX = ".medialane.io";
11974
+ var STARK_ORDER2 = (1n << 251n) + 17n * (1n << 192n) + 1n;
11975
+ var APPROVAL_PATH = "/approve-app";
11976
+ var InvalidApprovalRequestError = class extends Error {
11977
+ constructor(message) {
11978
+ super(message);
11979
+ this.name = "InvalidApprovalRequestError";
11980
+ }
11981
+ };
11982
+ function isMedialaneOrigin(url) {
11983
+ let parsed;
11984
+ try {
11985
+ parsed = new URL(url);
11986
+ } catch {
11987
+ return false;
11988
+ }
11989
+ if (parsed.protocol !== "https:") return parsed.hostname === "localhost";
11990
+ return parsed.hostname === "medialane.io" || parsed.hostname.endsWith(MEDIALANE_SUFFIX);
11991
+ }
11992
+ function assertPublicKey(value) {
11993
+ if (!/^0x[0-9a-fA-F]{1,64}$/.test(value)) {
11994
+ throw new InvalidApprovalRequestError("That is not a wallet key.");
11995
+ }
11996
+ const scalar = BigInt(value);
11997
+ if (scalar === 0n || scalar >= STARK_ORDER2) {
11998
+ throw new InvalidApprovalRequestError("That is not a wallet key.");
11999
+ }
12000
+ return `0x${scalar.toString(16)}`;
12001
+ }
12002
+ function assertAppName(value) {
12003
+ const name = value.replace(/\s+/g, " ").trim().slice(0, 40);
12004
+ if (!name) throw new InvalidApprovalRequestError("The app asking has no name.");
12005
+ return name;
12006
+ }
12007
+ function assertReturnUrl(value) {
12008
+ if (!isMedialaneOrigin(value)) {
12009
+ throw new InvalidApprovalRequestError("That app is not part of Medialane.");
12010
+ }
12011
+ return value;
12012
+ }
12013
+ function buildApprovalUrl(approverOrigin, request) {
12014
+ if (!isMedialaneOrigin(approverOrigin)) {
12015
+ throw new InvalidApprovalRequestError("That app is not part of Medialane.");
12016
+ }
12017
+ const url = new URL(APPROVAL_PATH, approverOrigin);
12018
+ url.searchParams.set("key", assertPublicKey(request.publicKey));
12019
+ url.searchParams.set("app", assertAppName(request.appName));
12020
+ url.searchParams.set("return", assertReturnUrl(request.returnUrl));
12021
+ return url.toString();
12022
+ }
12023
+ function parseApprovalRequest(params) {
12024
+ return {
12025
+ publicKey: assertPublicKey(params.get("key") ?? ""),
12026
+ appName: assertAppName(params.get("app") ?? ""),
12027
+ returnUrl: assertReturnUrl(params.get("return") ?? "")
12028
+ };
12029
+ }
12030
+ function buildReturnUrl(returnUrl, outcome) {
12031
+ const url = new URL(assertReturnUrl(returnUrl));
12032
+ url.searchParams.set("approval", outcome);
12033
+ return url.toString();
12034
+ }
12035
+
11953
12036
  exports.ADMIN_HEADERS = ADMIN_HEADERS;
11954
12037
  exports.ADMIN_SCOPE = ADMIN_SCOPE;
12038
+ exports.APPROVAL_PATH = APPROVAL_PATH;
11955
12039
  exports.COIN_MAX_SUPPLY = MAX_SUPPLY;
11956
12040
  exports.COIN_MIN_SUPPLY = MIN_SUPPLY;
11957
12041
  exports.ClubService = ClubService;
@@ -11972,6 +12056,7 @@ exports.IPNftABI = IPNftABI;
11972
12056
  exports.IPSponsorshipABI = IPSponsorshipABI;
11973
12057
  exports.IPTicketCollectionABI = IPTicketCollectionABI;
11974
12058
  exports.IPTicketCollectionFactoryABI = IPTicketCollectionFactoryABI;
12059
+ exports.InvalidApprovalRequestError = InvalidApprovalRequestError;
11975
12060
  exports.InvalidStarkPrivateKeyError = InvalidStarkPrivateKeyError;
11976
12061
  exports.MAX_HOLDERS_AT_LAUNCH = MAX_HOLDERS_AT_LAUNCH;
11977
12062
  exports.MAX_TEAM_ALLOCATION_PERCENT = MAX_TEAM_ALLOCATION_PERCENT;
@@ -11993,6 +12078,7 @@ exports.build1155CancellationTypedData = build1155CancellationTypedData;
11993
12078
  exports.build1155OrderTypedData = build1155OrderTypedData;
11994
12079
  exports.buildAddOwnerCall = buildAddOwnerCall;
11995
12080
  exports.buildAdminSessionTypedData = buildAdminSessionTypedData;
12081
+ exports.buildApprovalUrl = buildApprovalUrl;
11996
12082
  exports.buildCancelEscapeCall = buildCancelEscapeCall;
11997
12083
  exports.buildCancellationTypedData = buildCancellationTypedData;
11998
12084
  exports.buildChangeOwnersCall = buildChangeOwnersCall;
@@ -12004,6 +12090,7 @@ exports.buildLaunchOnEkuboCalls = buildLaunchOnEkuboCalls;
12004
12090
  exports.buildOrderTypedData = buildOrderTypedData;
12005
12091
  exports.buildRemoveOwnerByGuidCall = buildRemoveOwnerByGuidCall;
12006
12092
  exports.buildRemoveOwnerCall = buildRemoveOwnerCall;
12093
+ exports.buildReturnUrl = buildReturnUrl;
12007
12094
  exports.buildSetFirstGuardianCall = buildSetFirstGuardianCall;
12008
12095
  exports.buildTriggerEscapeOwnerCall = buildTriggerEscapeOwnerCall;
12009
12096
  exports.buybackQuoteRaw = buybackQuoteRaw;
@@ -12016,6 +12103,7 @@ exports.decodeEscapeAndStatus = decodeEscapeAndStatus;
12016
12103
  exports.decodeGuardiansInfo = decodeGuardiansInfo;
12017
12104
  exports.deriveAesKey = deriveAesKey;
12018
12105
  exports.deriveOwnerKeyPair = deriveOwnerKeyPair;
12106
+ exports.deriveStarkKeyPair = deriveStarkKeyPair;
12019
12107
  exports.encodeAdminHeaders = encodeAdminHeaders;
12020
12108
  exports.encodeByteArray = encodeByteArray;
12021
12109
  exports.executeIntent = executeIntent;
@@ -12034,11 +12122,13 @@ exports.getOrderDetails1155 = getOrderDetails1155;
12034
12122
  exports.getOwners = getOwners;
12035
12123
  exports.getSiwsStorageKey = getSiwsStorageKey;
12036
12124
  exports.getStoredSiwsToken = getStoredSiwsToken;
12125
+ exports.isMedialaneOrigin = isMedialaneOrigin;
12037
12126
  exports.isSiwsTokenValid = isSiwsTokenValid;
12038
12127
  exports.normalizeSiwsSignature = normalizeSiwsSignature;
12039
12128
  exports.ownerAliveTypedData = ownerAliveTypedData;
12040
12129
  exports.ownerConstructorCalldata = ownerConstructorCalldata;
12041
12130
  exports.parseAdminHeaders = parseAdminHeaders;
12131
+ exports.parseApprovalRequest = parseApprovalRequest;
12042
12132
  exports.parseCreatorCoinCreated = parseCreatorCoinCreated;
12043
12133
  exports.priceToEkuboParams = priceToEkuboParams;
12044
12134
  exports.randomNonce = randomNonce;