@monolythium/core-sdk 0.4.9 → 0.4.11

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/index.cjs CHANGED
@@ -2842,8 +2842,8 @@ var TESTNET_69420 = {
2842
2842
  network: "testnet-69420",
2843
2843
  display_name: "Monolythium Testnet",
2844
2844
  description: "Public Monolythium testnet. Testnet state may reset without notice; do not store value on this network.",
2845
- genesis_hash: "0x4327b7e8d1c06eed00194152f8235acaec5ba84a01487c885d9933840dc36fa5",
2846
- binary_sha: "898cf29081ec",
2845
+ genesis_hash: "0x78e9773372156285cd4a26db73b61f3ab4865e9e29cd3489e27beb030d9f1eca",
2846
+ binary_sha: "d4306a4163e0",
2847
2847
  rpc: [
2848
2848
  {
2849
2849
  url: "http://178.105.12.9:8545",
@@ -9582,6 +9582,162 @@ function bigintBytes(value, len) {
9582
9582
  }
9583
9583
  return out;
9584
9584
  }
9585
+ var TX_EXTENSION_KIND_MULTISIG = 64;
9586
+ var TX_EXTENSION_MULTISIG_V1 = 1;
9587
+ var MULTISIG_WITNESS_DOMAIN = "MONO_MULTISIG_WITNESS_V1";
9588
+ var MULTISIG_ADDRESS_DERIVATION_DOMAIN2 = "MONO_MULTISIG_BLAKE3_20_V1";
9589
+ var MIN_MULTISIG_MEMBERS = 1;
9590
+ var MAX_MULTISIG_MEMBERS = 64;
9591
+ var WITNESS_DOMAIN_BYTES = new TextEncoder().encode(MULTISIG_WITNESS_DOMAIN);
9592
+ var ADDRESS_DOMAIN_BYTES = new TextEncoder().encode(MULTISIG_ADDRESS_DERIVATION_DOMAIN2);
9593
+ var MultisigError = class extends Error {
9594
+ constructor(message) {
9595
+ super(message);
9596
+ this.name = "MultisigError";
9597
+ }
9598
+ };
9599
+ function toPubkeyBytes(value, label) {
9600
+ return expectBytes(value, ML_DSA_65_PUBLIC_KEY_LEN, label);
9601
+ }
9602
+ function compareBytes2(a, b) {
9603
+ const len = Math.min(a.length, b.length);
9604
+ for (let i = 0; i < len; i++) {
9605
+ if (a[i] !== b[i]) return a[i] - b[i];
9606
+ }
9607
+ return a.length - b.length;
9608
+ }
9609
+ function u64BeBytes2(value) {
9610
+ const out = new Uint8Array(8);
9611
+ let n = value;
9612
+ for (let i = 7; i >= 0; i--) {
9613
+ out[i] = Number(n & 0xffn);
9614
+ n >>= 8n;
9615
+ }
9616
+ return out;
9617
+ }
9618
+ function expectThreshold(threshold) {
9619
+ if (!Number.isInteger(threshold) || threshold < 0 || threshold > 65535) {
9620
+ throw new MultisigError("threshold must be a uint16");
9621
+ }
9622
+ return threshold;
9623
+ }
9624
+ function sortMultisigMembers(members) {
9625
+ return members.map((m, i) => toPubkeyBytes(m, `members[${i}]`)).sort(compareBytes2);
9626
+ }
9627
+ function deriveMultisigAddressBytes(threshold, members) {
9628
+ expectThreshold(threshold);
9629
+ const sorted = sortMultisigMembers(members);
9630
+ const parts = [
9631
+ ADDRESS_DOMAIN_BYTES,
9632
+ Uint8Array.from([threshold >> 8 & 255, threshold & 255])
9633
+ ];
9634
+ for (const member of sorted) {
9635
+ parts.push(u64BeBytes2(BigInt(member.length)));
9636
+ parts.push(member);
9637
+ }
9638
+ return blake3_js.blake3(concatBytes2(...parts)).slice(0, 20);
9639
+ }
9640
+ function deriveMultisigAddress(threshold, members) {
9641
+ return addressToTypedBech32("multisig", deriveMultisigAddressBytes(threshold, members));
9642
+ }
9643
+ function validateMultisigRoster(witness) {
9644
+ const n = witness.members.length;
9645
+ if (n < MIN_MULTISIG_MEMBERS || n > MAX_MULTISIG_MEMBERS) {
9646
+ throw new MultisigError("roster size out of range");
9647
+ }
9648
+ if (witness.threshold === 0 || witness.threshold > n) {
9649
+ throw new MultisigError("threshold out of range");
9650
+ }
9651
+ if (witness.signatures.length > n) {
9652
+ throw new MultisigError("more signatures than members");
9653
+ }
9654
+ let prev;
9655
+ for (const member of witness.members) {
9656
+ if (member.algoId !== STANDARD_ALGO_NUMBER_ML_DSA_65) {
9657
+ throw new MultisigError("non-ml-dsa-65 member");
9658
+ }
9659
+ if (member.pubkey.length !== ML_DSA_65_PUBLIC_KEY_LEN) {
9660
+ throw new MultisigError("member pubkey length");
9661
+ }
9662
+ if (prev !== void 0 && compareBytes2(member.pubkey, prev) <= 0) {
9663
+ throw new MultisigError("roster not sorted / duplicate");
9664
+ }
9665
+ prev = member.pubkey;
9666
+ }
9667
+ }
9668
+ function assembleMultisigWitness(threshold, members, signatures = []) {
9669
+ expectThreshold(threshold);
9670
+ const sortedPubkeys = sortMultisigMembers(members);
9671
+ const witness = {
9672
+ threshold,
9673
+ members: sortedPubkeys.map((pubkey) => ({
9674
+ algoId: STANDARD_ALGO_NUMBER_ML_DSA_65,
9675
+ pubkey
9676
+ })),
9677
+ signatures: signatures.map((s, i) => ({
9678
+ memberIndex: expectMemberIndex(s.memberIndex, `signatures[${i}].memberIndex`),
9679
+ signature: expectBytes(s.signature, ML_DSA_65_SIGNATURE_LEN, `signatures[${i}].signature`)
9680
+ }))
9681
+ };
9682
+ validateMultisigRoster(witness);
9683
+ return witness;
9684
+ }
9685
+ function expectMemberIndex(value, label) {
9686
+ if (!Number.isInteger(value) || value < 0 || value > 65535) {
9687
+ throw new MultisigError(`${label} must be a uint16`);
9688
+ }
9689
+ return value;
9690
+ }
9691
+ function multisigMemberIndex(members, pubkey) {
9692
+ const target = toPubkeyBytes(pubkey, "pubkey");
9693
+ const sorted = sortMultisigMembers(members);
9694
+ return sorted.findIndex((m) => compareBytes2(m, target) === 0);
9695
+ }
9696
+ function encodeMultisigWitnessBody(witness) {
9697
+ validateMultisigRoster(witness);
9698
+ const w = new BincodeWriter();
9699
+ w.u16(witness.threshold);
9700
+ w.u64(BigInt(witness.members.length));
9701
+ for (const member of witness.members) {
9702
+ w.u16(member.algoId);
9703
+ w.bytes(member.pubkey);
9704
+ }
9705
+ w.u64(BigInt(witness.signatures.length));
9706
+ for (const sig of witness.signatures) {
9707
+ w.u16(sig.memberIndex);
9708
+ w.bytes(sig.signature);
9709
+ }
9710
+ return concatBytes2(
9711
+ Uint8Array.of(TX_EXTENSION_MULTISIG_V1),
9712
+ WITNESS_DOMAIN_BYTES,
9713
+ w.toBytes()
9714
+ );
9715
+ }
9716
+ function hasMultisigExtension(fields) {
9717
+ return (fields.extensions ?? []).some((ext) => ext.kind === TX_EXTENSION_KIND_MULTISIG);
9718
+ }
9719
+ function stripMultisigExtensions(fields) {
9720
+ if (!hasMultisigExtension(fields)) return fields;
9721
+ return {
9722
+ ...fields,
9723
+ extensions: (fields.extensions ?? []).filter((ext) => ext.kind !== TX_EXTENSION_KIND_MULTISIG)
9724
+ };
9725
+ }
9726
+ function multisigBaseSighash(fields) {
9727
+ const base = stripMultisigExtensions(fields);
9728
+ return sha3_js.keccak_256(encodeTransactionForHash(base, 1));
9729
+ }
9730
+ function assembleMultisigSigned(fields, witness) {
9731
+ if (hasMultisigExtension(fields)) {
9732
+ throw new MultisigError("transaction already carries a multisig witness extension");
9733
+ }
9734
+ const body = encodeMultisigWitnessBody(witness);
9735
+ const extensions = [
9736
+ ...fields.extensions ?? [],
9737
+ { kind: TX_EXTENSION_KIND_MULTISIG, body }
9738
+ ];
9739
+ return { ...fields, extensions };
9740
+ }
9585
9741
 
9586
9742
  // src/delegation.ts
9587
9743
  var DELEGATION_SELECTORS = {
@@ -11523,9 +11679,11 @@ exports.EXECUTION_UNIT_PRICE_SAFETY_MULTIPLIER = EXECUTION_UNIT_PRICE_SAFETY_MUL
11523
11679
  exports.FEED_ID_DOMAIN_TAG = FEED_ID_DOMAIN_TAG;
11524
11680
  exports.LYTHOSHI_PER_LYTH = LYTHOSHI_PER_LYTH;
11525
11681
  exports.LYTH_DECIMALS = LYTH_DECIMALS;
11682
+ exports.MAX_MULTISIG_MEMBERS = MAX_MULTISIG_MEMBERS;
11526
11683
  exports.MAX_NATIVE_CALL_FORWARDER_REQUEST_BYTES = MAX_NATIVE_CALL_FORWARDER_REQUEST_BYTES;
11527
11684
  exports.MAX_NATIVE_RECEIPT_EVENTS = MAX_NATIVE_RECEIPT_EVENTS;
11528
11685
  exports.MIN_EXECUTION_UNIT_PRICE_LYTHOSHI = MIN_EXECUTION_UNIT_PRICE_LYTHOSHI;
11686
+ exports.MIN_MULTISIG_MEMBERS = MIN_MULTISIG_MEMBERS;
11529
11687
  exports.ML_DSA_65_PUBLIC_KEY_LEN = ML_DSA_65_PUBLIC_KEY_LEN2;
11530
11688
  exports.ML_DSA_65_SIGNATURE_LEN = ML_DSA_65_SIGNATURE_LEN2;
11531
11689
  exports.MONOLYTHIUM_NETWORKS = MONOLYTHIUM_NETWORKS;
@@ -11544,8 +11702,11 @@ exports.MRV_STRUCTURED_FEE_FIELDS = MRV_STRUCTURED_FEE_FIELDS;
11544
11702
  exports.MRV_TX_EXTENSION_KIND = MRV_TX_EXTENSION_KIND;
11545
11703
  exports.MRV_TX_EXTENSION_V1 = MRV_TX_EXTENSION_V1;
11546
11704
  exports.MULTISIG_ADDRESS_DERIVATION_DOMAIN = MULTISIG_ADDRESS_DERIVATION_DOMAIN;
11705
+ exports.MULTISIG_WITNESS_ADDRESS_DERIVATION_DOMAIN = MULTISIG_ADDRESS_DERIVATION_DOMAIN2;
11706
+ exports.MULTISIG_WITNESS_DOMAIN = MULTISIG_WITNESS_DOMAIN;
11547
11707
  exports.MarketActionError = MarketActionError;
11548
11708
  exports.MrvValidationError = MrvValidationError;
11709
+ exports.MultisigError = MultisigError;
11549
11710
  exports.NAME_BASE_MULTIPLIER = NAME_BASE_MULTIPLIER;
11550
11711
  exports.NAME_FALLBACK_FEE_UNIT_LYTHOSHI = NAME_FALLBACK_FEE_UNIT_LYTHOSHI;
11551
11712
  exports.NAME_LABEL_MAX_LEN = NAME_LABEL_MAX_LEN;
@@ -11642,6 +11803,8 @@ exports.TOKEN_FACTORY_SIGS = TOKEN_FACTORY_SIGS;
11642
11803
  exports.TOKEN_FACTORY_SYMBOL_MAX_BYTES = TOKEN_FACTORY_SYMBOL_MAX_BYTES;
11643
11804
  exports.TOKEN_FACTORY_TOKEN_ID_DOMAIN_TAG = TOKEN_FACTORY_TOKEN_ID_DOMAIN_TAG;
11644
11805
  exports.TRANSFER_DEFAULT_EXECUTION_UNIT_LIMIT = TRANSFER_DEFAULT_EXECUTION_UNIT_LIMIT;
11806
+ exports.TX_EXTENSION_KIND_MULTISIG = TX_EXTENSION_KIND_MULTISIG;
11807
+ exports.TX_EXTENSION_MULTISIG_V1 = TX_EXTENSION_MULTISIG_V1;
11645
11808
  exports.TokenFactoryError = TokenFactoryError;
11646
11809
  exports.V1_BRIDGE_ALLOWED_FEE_TOKEN = V1_BRIDGE_ALLOWED_FEE_TOKEN;
11647
11810
  exports.V1_BRIDGE_ALLOWED_PROTOCOL = V1_BRIDGE_ALLOWED_PROTOCOL;
@@ -11654,6 +11817,8 @@ exports.addressToBech32 = addressToBech32;
11654
11817
  exports.addressToTypedBech32 = addressToTypedBech32;
11655
11818
  exports.allowRootFor = allowRootFor;
11656
11819
  exports.apiEndpointFromRpcEndpoint = apiEndpointFromRpcEndpoint;
11820
+ exports.assembleMultisigSigned = assembleMultisigSigned;
11821
+ exports.assembleMultisigWitness = assembleMultisigWitness;
11657
11822
  exports.assertMrvCallNativeSubmissionPlan = assertMrvCallNativeSubmissionPlan;
11658
11823
  exports.assertMrvDeployNativeSubmissionPlan = assertMrvDeployNativeSubmissionPlan;
11659
11824
  exports.assertMrvFeeDisplayConformance = assertMrvFeeDisplayConformance;
@@ -11761,6 +11926,8 @@ exports.deriveClusterAnchorAddress = deriveClusterAnchorAddress;
11761
11926
  exports.deriveClusterJoinOperatorId = deriveClusterJoinOperatorId;
11762
11927
  exports.deriveFeedId = deriveFeedId;
11763
11928
  exports.deriveMrvContractAddress = deriveMrvContractAddress;
11929
+ exports.deriveMultisigAddress = deriveMultisigAddress;
11930
+ exports.deriveMultisigAddressBytes = deriveMultisigAddressBytes;
11764
11931
  exports.deriveNativeSpotMarketId = deriveNativeSpotMarketId;
11765
11932
  exports.deriveNativeSpotOrderId = deriveNativeSpotOrderId;
11766
11933
  exports.deriveTokenFactoryTokenId = deriveTokenFactoryTokenId;
@@ -11790,6 +11957,7 @@ exports.encodeHasPubkeyCalldata = encodeHasPubkeyCalldata;
11790
11957
  exports.encodeLockBridgeConfigCalldata = encodeLockBridgeConfigCalldata;
11791
11958
  exports.encodeLookupPubkeyCalldata = encodeLookupPubkeyCalldata;
11792
11959
  exports.encodeMrvDeployPayload = encodeMrvDeployPayload;
11960
+ exports.encodeMultisigWitnessBody = encodeMultisigWitnessBody;
11793
11961
  exports.encodeNameAcceptTransferCall = encodeNameAcceptTransferCall;
11794
11962
  exports.encodeNameProposeTransferCall = encodeNameProposeTransferCall;
11795
11963
  exports.encodeNameRegisterCall = encodeNameRegisterCall;
@@ -11905,6 +12073,8 @@ exports.mrvAddressToBech32 = mrvAddressToBech32;
11905
12073
  exports.mrvBech32ToAddress = mrvBech32ToAddress;
11906
12074
  exports.mrvCodeHashHex = mrvCodeHashHex;
11907
12075
  exports.mrvV1TransactionExtension = mrvV1TransactionExtension;
12076
+ exports.multisigBaseSighash = multisigBaseSighash;
12077
+ exports.multisigMemberIndex = multisigMemberIndex;
11908
12078
  exports.nameLengthModifierX10 = nameLengthModifierX10;
11909
12079
  exports.nameRegistrationCost = nameRegistrationCost;
11910
12080
  exports.nameRegistryAddressHex = nameRegistryAddressHex;
@@ -11957,6 +12127,7 @@ exports.resolveStudioHostStatus = resolveStudioHostStatus;
11957
12127
  exports.selectBridgeTransferRoute = selectBridgeTransferRoute;
11958
12128
  exports.serviceProbeStatusLabel = serviceProbeStatusLabel;
11959
12129
  exports.setDestinationRoot = setDestinationRoot;
12130
+ exports.sortMultisigMembers = sortMultisigMembers;
11960
12131
  exports.spendingPolicyAddressHex = spendingPolicyAddressHex;
11961
12132
  exports.submitMrvCallNativeTx = submitMrvCallNativeTx;
11962
12133
  exports.submitMrvDeployNativeTx = submitMrvDeployNativeTx;
@@ -11973,6 +12144,7 @@ exports.validateBridgeRouteCatalogue = validateBridgeRouteCatalogue;
11973
12144
  exports.validateMrvArtifactMetadata = validateMrvArtifactMetadata;
11974
12145
  exports.validateMrvCallRequest = validateMrvCallRequest;
11975
12146
  exports.validateMrvDeployRequest = validateMrvDeployRequest;
12147
+ exports.validateMultisigRoster = validateMultisigRoster;
11976
12148
  exports.validateTokenFactoryFlags = validateTokenFactoryFlags;
11977
12149
  exports.verifyNoEvmArchiveProofSignatures = verifyNoEvmArchiveProofSignatures;
11978
12150
  exports.verifyNoEvmBlockFinalityEvidenceMultisig = verifyNoEvmBlockFinalityEvidenceMultisig;