@solana/transactions 2.0.0-experimental.fc4e943 → 2.0.0-experimental.fd11bd1

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.
@@ -2,282 +2,201 @@ this.globalThis = this.globalThis || {};
2
2
  this.globalThis.solanaWeb3 = (function (exports) {
3
3
  'use strict';
4
4
 
5
- var __defProp = Object.defineProperty;
6
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
7
- var __publicField = (obj, key, value) => {
8
- __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
9
- return value;
10
- };
11
-
12
- // ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers-core@0.8.9/node_modules/@metaplex-foundation/umi-serializers-core/dist/esm/bytes.mjs
13
- var mergeBytes = (bytesArr) => {
14
- const totalLength = bytesArr.reduce((total, arr) => total + arr.length, 0);
5
+ // ../codecs-core/dist/index.browser.js
6
+ function assertByteArrayIsNotEmptyForCodec(codecDescription, bytes, offset = 0) {
7
+ if (bytes.length - offset <= 0) {
8
+ throw new Error(`Codec [${codecDescription}] cannot decode empty byte arrays.`);
9
+ }
10
+ }
11
+ function assertByteArrayHasEnoughBytesForCodec(codecDescription, expected, bytes, offset = 0) {
12
+ const bytesLength = bytes.length - offset;
13
+ if (bytesLength < expected) {
14
+ throw new Error(`Codec [${codecDescription}] expected ${expected} bytes, got ${bytesLength}.`);
15
+ }
16
+ }
17
+ var mergeBytes = (byteArrays) => {
18
+ const nonEmptyByteArrays = byteArrays.filter((arr) => arr.length);
19
+ if (nonEmptyByteArrays.length === 0) {
20
+ return byteArrays.length ? byteArrays[0] : new Uint8Array();
21
+ }
22
+ if (nonEmptyByteArrays.length === 1) {
23
+ return nonEmptyByteArrays[0];
24
+ }
25
+ const totalLength = nonEmptyByteArrays.reduce((total, arr) => total + arr.length, 0);
15
26
  const result = new Uint8Array(totalLength);
16
27
  let offset = 0;
17
- bytesArr.forEach((arr) => {
28
+ nonEmptyByteArrays.forEach((arr) => {
18
29
  result.set(arr, offset);
19
30
  offset += arr.length;
20
31
  });
21
32
  return result;
22
33
  };
23
- var padBytes = (bytes2, length) => {
24
- if (bytes2.length >= length)
25
- return bytes2;
34
+ var padBytes = (bytes, length) => {
35
+ if (bytes.length >= length)
36
+ return bytes;
26
37
  const paddedBytes = new Uint8Array(length).fill(0);
27
- paddedBytes.set(bytes2);
38
+ paddedBytes.set(bytes);
28
39
  return paddedBytes;
29
40
  };
30
- var fixBytes = (bytes2, length) => padBytes(bytes2.slice(0, length), length);
31
-
32
- // ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers-core@0.8.9/node_modules/@metaplex-foundation/umi-serializers-core/dist/esm/errors.mjs
33
- var DeserializingEmptyBufferError = class extends Error {
34
- constructor(serializer) {
35
- super(`Serializer [${serializer}] cannot deserialize empty buffers.`);
36
- __publicField(this, "name", "DeserializingEmptyBufferError");
41
+ var fixBytes = (bytes, length) => padBytes(bytes.length <= length ? bytes : bytes.slice(0, length), length);
42
+ function combineCodec(encoder, decoder, description) {
43
+ if (encoder.fixedSize !== decoder.fixedSize) {
44
+ throw new Error(
45
+ `Encoder and decoder must have the same fixed size, got [${encoder.fixedSize}] and [${decoder.fixedSize}].`
46
+ );
37
47
  }
38
- };
39
- var NotEnoughBytesError = class extends Error {
40
- constructor(serializer, expected, actual) {
41
- super(`Serializer [${serializer}] expected ${expected} bytes, got ${actual}.`);
42
- __publicField(this, "name", "NotEnoughBytesError");
48
+ if (encoder.maxSize !== decoder.maxSize) {
49
+ throw new Error(
50
+ `Encoder and decoder must have the same max size, got [${encoder.maxSize}] and [${decoder.maxSize}].`
51
+ );
43
52
  }
44
- };
45
- var ExpectedFixedSizeSerializerError = class extends Error {
46
- constructor(message) {
47
- message ?? (message = "Expected a fixed-size serializer, got a variable-size one.");
48
- super(message);
49
- __publicField(this, "name", "ExpectedFixedSizeSerializerError");
53
+ if (description === void 0 && encoder.description !== decoder.description) {
54
+ throw new Error(
55
+ `Encoder and decoder must have the same description, got [${encoder.description}] and [${decoder.description}]. Pass a custom description as a third argument if you want to override the description and bypass this error.`
56
+ );
50
57
  }
51
- };
52
-
53
- // ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers-core@0.8.9/node_modules/@metaplex-foundation/umi-serializers-core/dist/esm/fixSerializer.mjs
54
- function fixSerializer(serializer, fixedBytes, description) {
55
58
  return {
56
- description: description ?? `fixed(${fixedBytes}, ${serializer.description})`,
59
+ decode: decoder.decode,
60
+ description: description ?? encoder.description,
61
+ encode: encoder.encode,
62
+ fixedSize: encoder.fixedSize,
63
+ maxSize: encoder.maxSize
64
+ };
65
+ }
66
+ function fixCodecHelper(data, fixedBytes, description) {
67
+ return {
68
+ description: description ?? `fixed(${fixedBytes}, ${data.description})`,
57
69
  fixedSize: fixedBytes,
58
- maxSize: fixedBytes,
59
- serialize: (value) => fixBytes(serializer.serialize(value), fixedBytes),
60
- deserialize: (buffer, offset = 0) => {
61
- buffer = buffer.slice(offset, offset + fixedBytes);
62
- if (buffer.length < fixedBytes) {
63
- throw new NotEnoughBytesError("fixSerializer", fixedBytes, buffer.length);
70
+ maxSize: fixedBytes
71
+ };
72
+ }
73
+ function fixEncoder(encoder, fixedBytes, description) {
74
+ return {
75
+ ...fixCodecHelper(encoder, fixedBytes, description),
76
+ encode: (value) => fixBytes(encoder.encode(value), fixedBytes)
77
+ };
78
+ }
79
+ function fixDecoder(decoder, fixedBytes, description) {
80
+ return {
81
+ ...fixCodecHelper(decoder, fixedBytes, description),
82
+ decode: (bytes, offset = 0) => {
83
+ assertByteArrayHasEnoughBytesForCodec("fixCodec", fixedBytes, bytes, offset);
84
+ if (offset > 0 || bytes.length > fixedBytes) {
85
+ bytes = bytes.slice(offset, offset + fixedBytes);
64
86
  }
65
- if (serializer.fixedSize !== null) {
66
- buffer = fixBytes(buffer, serializer.fixedSize);
87
+ if (decoder.fixedSize !== null) {
88
+ bytes = fixBytes(bytes, decoder.fixedSize);
67
89
  }
68
- const [value] = serializer.deserialize(buffer, 0);
90
+ const [value] = decoder.decode(bytes, 0);
69
91
  return [value, offset + fixedBytes];
70
92
  }
71
93
  };
72
94
  }
73
-
74
- // ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers-core@0.8.9/node_modules/@metaplex-foundation/umi-serializers-core/dist/esm/mapSerializer.mjs
75
- function mapSerializer(serializer, unmap, map) {
95
+ function mapEncoder(encoder, unmap) {
76
96
  return {
77
- description: serializer.description,
78
- fixedSize: serializer.fixedSize,
79
- maxSize: serializer.maxSize,
80
- serialize: (value) => serializer.serialize(unmap(value)),
81
- deserialize: (buffer, offset = 0) => {
82
- const [value, length] = serializer.deserialize(buffer, offset);
83
- return map ? [map(value, buffer, offset), length] : [value, length];
84
- }
97
+ description: encoder.description,
98
+ encode: (value) => encoder.encode(unmap(value)),
99
+ fixedSize: encoder.fixedSize,
100
+ maxSize: encoder.maxSize
85
101
  };
86
102
  }
87
-
88
- // ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers-encodings@0.8.9/node_modules/@metaplex-foundation/umi-serializers-encodings/dist/esm/errors.mjs
89
- var InvalidBaseStringError = class extends Error {
90
- constructor(value, base, cause) {
91
- const message = `Expected a string of base ${base}, got [${value}].`;
92
- super(message);
93
- __publicField(this, "name", "InvalidBaseStringError");
94
- this.cause = cause;
95
- }
96
- };
97
-
98
- // ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers-encodings@0.8.9/node_modules/@metaplex-foundation/umi-serializers-encodings/dist/esm/baseX.mjs
99
- var baseX = (alphabet) => {
100
- const base = alphabet.length;
101
- const baseBigInt = BigInt(base);
103
+ function mapDecoder(decoder, map) {
102
104
  return {
103
- description: `base${base}`,
104
- fixedSize: null,
105
- maxSize: null,
106
- serialize(value) {
107
- if (!value.match(new RegExp(`^[${alphabet}]*$`))) {
108
- throw new InvalidBaseStringError(value, base);
109
- }
110
- if (value === "")
111
- return new Uint8Array();
112
- const chars = [...value];
113
- let trailIndex = chars.findIndex((c) => c !== alphabet[0]);
114
- trailIndex = trailIndex === -1 ? chars.length : trailIndex;
115
- const leadingZeroes = Array(trailIndex).fill(0);
116
- if (trailIndex === chars.length)
117
- return Uint8Array.from(leadingZeroes);
118
- const tailChars = chars.slice(trailIndex);
119
- let base10Number = 0n;
120
- let baseXPower = 1n;
121
- for (let i = tailChars.length - 1; i >= 0; i -= 1) {
122
- base10Number += baseXPower * BigInt(alphabet.indexOf(tailChars[i]));
123
- baseXPower *= baseBigInt;
124
- }
125
- const tailBytes = [];
126
- while (base10Number > 0n) {
127
- tailBytes.unshift(Number(base10Number % 256n));
128
- base10Number /= 256n;
129
- }
130
- return Uint8Array.from(leadingZeroes.concat(tailBytes));
105
+ decode: (bytes, offset = 0) => {
106
+ const [value, length] = decoder.decode(bytes, offset);
107
+ return [map(value, bytes, offset), length];
131
108
  },
132
- deserialize(buffer, offset = 0) {
133
- if (buffer.length === 0)
134
- return ["", 0];
135
- const bytes2 = buffer.slice(offset);
136
- let trailIndex = bytes2.findIndex((n) => n !== 0);
137
- trailIndex = trailIndex === -1 ? bytes2.length : trailIndex;
138
- const leadingZeroes = alphabet[0].repeat(trailIndex);
139
- if (trailIndex === bytes2.length)
140
- return [leadingZeroes, buffer.length];
141
- let base10Number = bytes2.slice(trailIndex).reduce((sum, byte) => sum * 256n + BigInt(byte), 0n);
142
- const tailChars = [];
143
- while (base10Number > 0n) {
144
- tailChars.unshift(alphabet[Number(base10Number % baseBigInt)]);
145
- base10Number /= baseBigInt;
146
- }
147
- return [leadingZeroes + tailChars.join(""), buffer.length];
148
- }
109
+ description: decoder.description,
110
+ fixedSize: decoder.fixedSize,
111
+ maxSize: decoder.maxSize
149
112
  };
150
- };
151
-
152
- // ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers-encodings@0.8.9/node_modules/@metaplex-foundation/umi-serializers-encodings/dist/esm/base58.mjs
153
- var base58 = baseX("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz");
154
-
155
- // ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers-encodings@0.8.9/node_modules/@metaplex-foundation/umi-serializers-encodings/dist/esm/nullCharacters.mjs
156
- var removeNullCharacters = (value) => (
157
- // eslint-disable-next-line no-control-regex
158
- value.replace(/\u0000/g, "")
159
- );
160
-
161
- // ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers-encodings@0.8.9/node_modules/@metaplex-foundation/umi-serializers-encodings/dist/esm/utf8.mjs
162
- var utf8 = {
163
- description: "utf8",
164
- fixedSize: null,
165
- maxSize: null,
166
- serialize(value) {
167
- return new TextEncoder().encode(value);
168
- },
169
- deserialize(buffer, offset = 0) {
170
- const value = new TextDecoder().decode(buffer.slice(offset));
171
- return [removeNullCharacters(value), buffer.length];
172
- }
173
- };
174
-
175
- // ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers-numbers@0.8.9/node_modules/@metaplex-foundation/umi-serializers-numbers/dist/esm/common.mjs
176
- var Endian;
177
- (function(Endian2) {
178
- Endian2["Little"] = "le";
179
- Endian2["Big"] = "be";
180
- })(Endian || (Endian = {}));
113
+ }
181
114
 
182
- // ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers-numbers@0.8.9/node_modules/@metaplex-foundation/umi-serializers-numbers/dist/esm/errors.mjs
183
- var NumberOutOfRangeError = class extends RangeError {
184
- constructor(serializer, min, max, actual) {
185
- super(`Serializer [${serializer}] expected number to be between ${min} and ${max}, got ${actual}.`);
186
- __publicField(this, "name", "NumberOutOfRangeError");
115
+ // ../codecs-numbers/dist/index.browser.js
116
+ function assertNumberIsBetweenForCodec(codecDescription, min, max, value) {
117
+ if (value < min || value > max) {
118
+ throw new Error(
119
+ `Codec [${codecDescription}] expected number to be in the range [${min}, ${max}], got ${value}.`
120
+ );
187
121
  }
188
- };
189
-
190
- // ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers-numbers@0.8.9/node_modules/@metaplex-foundation/umi-serializers-numbers/dist/esm/utils.mjs
191
- function numberFactory(input) {
122
+ }
123
+ function sharedNumberFactory(input) {
192
124
  let littleEndian;
193
125
  let defaultDescription = input.name;
194
126
  if (input.size > 1) {
195
- littleEndian = !("endian" in input.options) || input.options.endian === Endian.Little;
127
+ littleEndian = !("endian" in input.options) || input.options.endian === 0;
196
128
  defaultDescription += littleEndian ? "(le)" : "(be)";
197
129
  }
198
130
  return {
199
131
  description: input.options.description ?? defaultDescription,
200
132
  fixedSize: input.size,
201
- maxSize: input.size,
202
- serialize(value) {
133
+ littleEndian,
134
+ maxSize: input.size
135
+ };
136
+ }
137
+ function numberEncoderFactory(input) {
138
+ const codecData = sharedNumberFactory(input);
139
+ return {
140
+ description: codecData.description,
141
+ encode(value) {
203
142
  if (input.range) {
204
- assertRange(input.name, input.range[0], input.range[1], value);
143
+ assertNumberIsBetweenForCodec(input.name, input.range[0], input.range[1], value);
205
144
  }
206
- const buffer = new ArrayBuffer(input.size);
207
- input.set(new DataView(buffer), value, littleEndian);
208
- return new Uint8Array(buffer);
145
+ const arrayBuffer = new ArrayBuffer(input.size);
146
+ input.set(new DataView(arrayBuffer), value, codecData.littleEndian);
147
+ return new Uint8Array(arrayBuffer);
209
148
  },
210
- deserialize(bytes2, offset = 0) {
211
- const slice = bytes2.slice(offset, offset + input.size);
212
- assertEnoughBytes("i8", slice, input.size);
213
- const view = toDataView(slice);
214
- return [input.get(view, littleEndian), offset + input.size];
215
- }
149
+ fixedSize: codecData.fixedSize,
150
+ maxSize: codecData.maxSize
216
151
  };
217
152
  }
218
- var toArrayBuffer = (array2) => array2.buffer.slice(array2.byteOffset, array2.byteLength + array2.byteOffset);
219
- var toDataView = (array2) => new DataView(toArrayBuffer(array2));
220
- var assertRange = (serializer, min, max, value) => {
221
- if (value < min || value > max) {
222
- throw new NumberOutOfRangeError(serializer, min, max, value);
223
- }
224
- };
225
- var assertEnoughBytes = (serializer, bytes2, expected) => {
226
- if (bytes2.length === 0) {
227
- throw new DeserializingEmptyBufferError(serializer);
228
- }
229
- if (bytes2.length < expected) {
230
- throw new NotEnoughBytesError(serializer, expected, bytes2.length);
231
- }
232
- };
233
-
234
- // ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers-numbers@0.8.9/node_modules/@metaplex-foundation/umi-serializers-numbers/dist/esm/u8.mjs
235
- var u8 = (options = {}) => numberFactory({
236
- name: "u8",
237
- size: 1,
238
- range: [0, Number("0xff")],
239
- set: (view, value) => view.setUint8(0, Number(value)),
240
- get: (view) => view.getUint8(0),
241
- options
242
- });
243
-
244
- // ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers-numbers@0.8.9/node_modules/@metaplex-foundation/umi-serializers-numbers/dist/esm/u32.mjs
245
- var u32 = (options = {}) => numberFactory({
246
- name: "u32",
247
- size: 4,
248
- range: [0, Number("0xffffffff")],
249
- set: (view, value, le) => view.setUint32(0, Number(value), le),
250
- get: (view, le) => view.getUint32(0, le),
251
- options
252
- });
253
-
254
- // ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers-numbers@0.8.9/node_modules/@metaplex-foundation/umi-serializers-numbers/dist/esm/shortU16.mjs
255
- var shortU16 = (options = {}) => ({
153
+ function numberDecoderFactory(input) {
154
+ const codecData = sharedNumberFactory(input);
155
+ return {
156
+ decode(bytes, offset = 0) {
157
+ assertByteArrayIsNotEmptyForCodec(codecData.description, bytes, offset);
158
+ assertByteArrayHasEnoughBytesForCodec(codecData.description, input.size, bytes, offset);
159
+ const view = new DataView(toArrayBuffer(bytes, offset, input.size));
160
+ return [input.get(view, codecData.littleEndian), offset + input.size];
161
+ },
162
+ description: codecData.description,
163
+ fixedSize: codecData.fixedSize,
164
+ maxSize: codecData.maxSize
165
+ };
166
+ }
167
+ function toArrayBuffer(bytes, offset, length) {
168
+ const bytesOffset = bytes.byteOffset + (offset ?? 0);
169
+ const bytesLength = length ?? bytes.byteLength;
170
+ return bytes.buffer.slice(bytesOffset, bytesOffset + bytesLength);
171
+ }
172
+ var getShortU16Encoder = (options = {}) => ({
256
173
  description: options.description ?? "shortU16",
257
- fixedSize: null,
258
- maxSize: 3,
259
- serialize: (value) => {
260
- assertRange("shortU16", 0, 65535, value);
261
- const bytes2 = [0];
174
+ encode: (value) => {
175
+ assertNumberIsBetweenForCodec("shortU16", 0, 65535, value);
176
+ const bytes = [0];
262
177
  for (let ii = 0; ; ii += 1) {
263
178
  const alignedValue = value >> ii * 7;
264
179
  if (alignedValue === 0) {
265
180
  break;
266
181
  }
267
182
  const nextSevenBits = 127 & alignedValue;
268
- bytes2[ii] = nextSevenBits;
183
+ bytes[ii] = nextSevenBits;
269
184
  if (ii > 0) {
270
- bytes2[ii - 1] |= 128;
185
+ bytes[ii - 1] |= 128;
271
186
  }
272
187
  }
273
- return new Uint8Array(bytes2);
188
+ return new Uint8Array(bytes);
274
189
  },
275
- deserialize: (bytes2, offset = 0) => {
190
+ fixedSize: null,
191
+ maxSize: 3
192
+ });
193
+ var getShortU16Decoder = (options = {}) => ({
194
+ decode: (bytes, offset = 0) => {
276
195
  let value = 0;
277
196
  let byteCount = 0;
278
197
  while (++byteCount) {
279
198
  const byteIndex = byteCount - 1;
280
- const currentByte = bytes2[offset + byteIndex];
199
+ const currentByte = bytes[offset + byteIndex];
281
200
  const nextSevenBits = 127 & currentByte;
282
201
  value |= nextSevenBits << byteIndex * 7;
283
202
  if ((currentByte & 128) === 0) {
@@ -285,212 +204,183 @@ this.globalThis.solanaWeb3 = (function (exports) {
285
204
  }
286
205
  }
287
206
  return [value, offset + byteCount];
288
- }
207
+ },
208
+ description: options.description ?? "shortU16",
209
+ fixedSize: null,
210
+ maxSize: 3
211
+ });
212
+ var getU32Encoder = (options = {}) => numberEncoderFactory({
213
+ name: "u32",
214
+ options,
215
+ range: [0, Number("0xffffffff")],
216
+ set: (view, value, le) => view.setUint32(0, value, le),
217
+ size: 4
218
+ });
219
+ var getU32Decoder = (options = {}) => numberDecoderFactory({
220
+ get: (view, le) => view.getUint32(0, le),
221
+ name: "u32",
222
+ options,
223
+ size: 4
224
+ });
225
+ var getU8Encoder = (options = {}) => numberEncoderFactory({
226
+ name: "u8",
227
+ options,
228
+ range: [0, Number("0xff")],
229
+ set: (view, value) => view.setUint8(0, value),
230
+ size: 1
231
+ });
232
+ var getU8Decoder = (options = {}) => numberDecoderFactory({
233
+ get: (view) => view.getUint8(0),
234
+ name: "u8",
235
+ options,
236
+ size: 1
289
237
  });
290
238
 
291
- // ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers@0.8.9/node_modules/@metaplex-foundation/umi-serializers/dist/esm/errors.mjs
292
- var InvalidNumberOfItemsError = class extends Error {
293
- constructor(serializer, expected, actual) {
294
- super(`Expected [${serializer}] to have ${expected} items, got ${actual}.`);
295
- __publicField(this, "name", "InvalidNumberOfItemsError");
296
- }
297
- };
298
- var InvalidArrayLikeRemainderSizeError = class extends Error {
299
- constructor(remainderSize, itemSize) {
300
- super(`The remainder of the buffer (${remainderSize} bytes) cannot be split into chunks of ${itemSize} bytes. Serializers of "remainder" size must have a remainder that is a multiple of its item size. In other words, ${remainderSize} modulo ${itemSize} should be equal to zero.`);
301
- __publicField(this, "name", "InvalidArrayLikeRemainderSizeError");
302
- }
303
- };
304
- var UnrecognizedArrayLikeSerializerSizeError = class extends Error {
305
- constructor(size) {
306
- super(`Unrecognized array-like serializer size: ${JSON.stringify(size)}`);
307
- __publicField(this, "name", "UnrecognizedArrayLikeSerializerSizeError");
308
- }
309
- };
310
-
311
- // ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers@0.8.9/node_modules/@metaplex-foundation/umi-serializers/dist/esm/sumSerializerSizes.mjs
312
- function sumSerializerSizes(sizes) {
313
- return sizes.reduce((all, size) => all === null || size === null ? null : all + size, 0);
314
- }
315
-
316
- // ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers@0.8.9/node_modules/@metaplex-foundation/umi-serializers/dist/esm/utils.mjs
317
- function getResolvedSize(size, childrenSizes, bytes2, offset) {
318
- if (typeof size === "number") {
319
- return [size, offset];
320
- }
321
- if (typeof size === "object") {
322
- return size.deserialize(bytes2, offset);
323
- }
324
- if (size === "remainder") {
325
- const childrenSize = sumSerializerSizes(childrenSizes);
326
- if (childrenSize === null) {
327
- throw new ExpectedFixedSizeSerializerError('Serializers of "remainder" size must have fixed-size items.');
328
- }
329
- const remainder = bytes2.slice(offset).length;
330
- if (remainder % childrenSize !== 0) {
331
- throw new InvalidArrayLikeRemainderSizeError(remainder, childrenSize);
332
- }
333
- return [remainder / childrenSize, offset];
239
+ // ../codecs-strings/dist/index.browser.js
240
+ function assertValidBaseString(alphabet4, testValue, givenValue = testValue) {
241
+ if (!testValue.match(new RegExp(`^[${alphabet4}]*$`))) {
242
+ throw new Error(`Expected a string of base ${alphabet4.length}, got [${givenValue}].`);
334
243
  }
335
- throw new UnrecognizedArrayLikeSerializerSizeError(size);
336
- }
337
- function getSizeDescription(size) {
338
- return typeof size === "object" ? size.description : `${size}`;
339
- }
340
- function getSizeFromChildren(size, childrenSizes) {
341
- if (typeof size !== "number")
342
- return null;
343
- if (size === 0)
344
- return 0;
345
- const childrenSize = sumSerializerSizes(childrenSizes);
346
- return childrenSize === null ? null : childrenSize * size;
347
244
  }
348
- function getSizePrefix(size, realSize) {
349
- return typeof size === "object" ? size.serialize(realSize) : new Uint8Array();
350
- }
351
-
352
- // ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers@0.8.9/node_modules/@metaplex-foundation/umi-serializers/dist/esm/array.mjs
353
- function array(item, options = {}) {
354
- const size = options.size ?? u32();
355
- if (size === "remainder" && item.fixedSize === null) {
356
- throw new ExpectedFixedSizeSerializerError('Serializers of "remainder" size must have fixed-size items.');
357
- }
245
+ var getBaseXEncoder = (alphabet4) => {
246
+ const base = alphabet4.length;
247
+ const baseBigInt = BigInt(base);
358
248
  return {
359
- description: options.description ?? `array(${item.description}; ${getSizeDescription(size)})`,
360
- fixedSize: getSizeFromChildren(size, [item.fixedSize]),
361
- maxSize: getSizeFromChildren(size, [item.maxSize]),
362
- serialize: (value) => {
363
- if (typeof size === "number" && value.length !== size) {
364
- throw new InvalidNumberOfItemsError("array", size, value.length);
249
+ description: `base${base}`,
250
+ encode(value) {
251
+ assertValidBaseString(alphabet4, value);
252
+ if (value === "")
253
+ return new Uint8Array();
254
+ const chars = [...value];
255
+ let trailIndex = chars.findIndex((c) => c !== alphabet4[0]);
256
+ trailIndex = trailIndex === -1 ? chars.length : trailIndex;
257
+ const leadingZeroes = Array(trailIndex).fill(0);
258
+ if (trailIndex === chars.length)
259
+ return Uint8Array.from(leadingZeroes);
260
+ const tailChars = chars.slice(trailIndex);
261
+ let base10Number = 0n;
262
+ let baseXPower = 1n;
263
+ for (let i = tailChars.length - 1; i >= 0; i -= 1) {
264
+ base10Number += baseXPower * BigInt(alphabet4.indexOf(tailChars[i]));
265
+ baseXPower *= baseBigInt;
365
266
  }
366
- return mergeBytes([getSizePrefix(size, value.length), ...value.map((v) => item.serialize(v))]);
367
- },
368
- deserialize: (bytes2, offset = 0) => {
369
- if (typeof size === "object" && bytes2.slice(offset).length === 0) {
370
- return [[], offset];
267
+ const tailBytes = [];
268
+ while (base10Number > 0n) {
269
+ tailBytes.unshift(Number(base10Number % 256n));
270
+ base10Number /= 256n;
371
271
  }
372
- const [resolvedSize, newOffset] = getResolvedSize(size, [item.fixedSize], bytes2, offset);
373
- offset = newOffset;
374
- const values = [];
375
- for (let i = 0; i < resolvedSize; i += 1) {
376
- const [value, newOffset2] = item.deserialize(bytes2, offset);
377
- values.push(value);
378
- offset = newOffset2;
272
+ return Uint8Array.from(leadingZeroes.concat(tailBytes));
273
+ },
274
+ fixedSize: null,
275
+ maxSize: null
276
+ };
277
+ };
278
+ var getBaseXDecoder = (alphabet4) => {
279
+ const base = alphabet4.length;
280
+ const baseBigInt = BigInt(base);
281
+ return {
282
+ decode(rawBytes, offset = 0) {
283
+ const bytes = offset === 0 ? rawBytes : rawBytes.slice(offset);
284
+ if (bytes.length === 0)
285
+ return ["", 0];
286
+ let trailIndex = bytes.findIndex((n) => n !== 0);
287
+ trailIndex = trailIndex === -1 ? bytes.length : trailIndex;
288
+ const leadingZeroes = alphabet4[0].repeat(trailIndex);
289
+ if (trailIndex === bytes.length)
290
+ return [leadingZeroes, rawBytes.length];
291
+ let base10Number = bytes.slice(trailIndex).reduce((sum, byte) => sum * 256n + BigInt(byte), 0n);
292
+ const tailChars = [];
293
+ while (base10Number > 0n) {
294
+ tailChars.unshift(alphabet4[Number(base10Number % baseBigInt)]);
295
+ base10Number /= baseBigInt;
379
296
  }
380
- return [values, offset];
381
- }
297
+ return [leadingZeroes + tailChars.join(""), rawBytes.length];
298
+ },
299
+ description: `base${base}`,
300
+ fixedSize: null,
301
+ maxSize: null
382
302
  };
383
- }
384
-
385
- // ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers@0.8.9/node_modules/@metaplex-foundation/umi-serializers/dist/esm/bytes.mjs
386
- function bytes(options = {}) {
387
- const size = options.size ?? "variable";
388
- const description = options.description ?? `bytes(${getSizeDescription(size)})`;
389
- const byteSerializer = {
390
- description,
303
+ };
304
+ var alphabet2 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
305
+ var getBase58Encoder = () => getBaseXEncoder(alphabet2);
306
+ var getBase58Decoder = () => getBaseXDecoder(alphabet2);
307
+ var removeNullCharacters = (value) => (
308
+ // eslint-disable-next-line no-control-regex
309
+ value.replace(/\u0000/g, "")
310
+ );
311
+ var e = globalThis.TextDecoder;
312
+ var o = globalThis.TextEncoder;
313
+ var getUtf8Encoder = () => {
314
+ let textEncoder;
315
+ return {
316
+ description: "utf8",
317
+ encode: (value) => new Uint8Array((textEncoder || (textEncoder = new o())).encode(value)),
391
318
  fixedSize: null,
392
- maxSize: null,
393
- serialize: (value) => new Uint8Array(value),
394
- deserialize: (bytes2, offset = 0) => {
395
- const slice = bytes2.slice(offset);
396
- return [slice, offset + slice.length];
397
- }
319
+ maxSize: null
398
320
  };
321
+ };
322
+ var getUtf8Decoder = () => {
323
+ let textDecoder;
324
+ return {
325
+ decode(bytes, offset = 0) {
326
+ const value = (textDecoder || (textDecoder = new e())).decode(bytes.slice(offset));
327
+ return [removeNullCharacters(value), bytes.length];
328
+ },
329
+ description: "utf8",
330
+ fixedSize: null,
331
+ maxSize: null
332
+ };
333
+ };
334
+ var getStringEncoder = (options = {}) => {
335
+ const size = options.size ?? getU32Encoder();
336
+ const encoding = options.encoding ?? getUtf8Encoder();
337
+ const description = options.description ?? `string(${encoding.description}; ${getSizeDescription(size)})`;
399
338
  if (size === "variable") {
400
- return byteSerializer;
339
+ return { ...encoding, description };
401
340
  }
402
341
  if (typeof size === "number") {
403
- return fixSerializer(byteSerializer, size, description);
342
+ return fixEncoder(encoding, size, description);
404
343
  }
405
344
  return {
406
345
  description,
407
- fixedSize: null,
408
- maxSize: null,
409
- serialize: (value) => {
410
- const contentBytes = byteSerializer.serialize(value);
411
- const lengthBytes = size.serialize(contentBytes.length);
346
+ encode: (value) => {
347
+ const contentBytes = encoding.encode(value);
348
+ const lengthBytes = size.encode(contentBytes.length);
412
349
  return mergeBytes([lengthBytes, contentBytes]);
413
350
  },
414
- deserialize: (buffer, offset = 0) => {
415
- if (buffer.slice(offset).length === 0) {
416
- throw new DeserializingEmptyBufferError("bytes");
417
- }
418
- const [lengthBigInt, lengthOffset] = size.deserialize(buffer, offset);
419
- const length = Number(lengthBigInt);
420
- offset = lengthOffset;
421
- const contentBuffer = buffer.slice(offset, offset + length);
422
- if (contentBuffer.length < length) {
423
- throw new NotEnoughBytesError("bytes", length, contentBuffer.length);
424
- }
425
- const [value, contentOffset] = byteSerializer.deserialize(contentBuffer);
426
- offset += contentOffset;
427
- return [value, offset];
428
- }
351
+ fixedSize: null,
352
+ maxSize: null
429
353
  };
430
- }
431
-
432
- // ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers@0.8.9/node_modules/@metaplex-foundation/umi-serializers/dist/esm/string.mjs
433
- function string(options = {}) {
434
- const size = options.size ?? u32();
435
- const encoding = options.encoding ?? utf8;
354
+ };
355
+ var getStringDecoder = (options = {}) => {
356
+ const size = options.size ?? getU32Decoder();
357
+ const encoding = options.encoding ?? getUtf8Decoder();
436
358
  const description = options.description ?? `string(${encoding.description}; ${getSizeDescription(size)})`;
437
359
  if (size === "variable") {
438
- return {
439
- ...encoding,
440
- description
441
- };
360
+ return { ...encoding, description };
442
361
  }
443
362
  if (typeof size === "number") {
444
- return fixSerializer(encoding, size, description);
363
+ return fixDecoder(encoding, size, description);
445
364
  }
446
365
  return {
447
- description,
448
- fixedSize: null,
449
- maxSize: null,
450
- serialize: (value) => {
451
- const contentBytes = encoding.serialize(value);
452
- const lengthBytes = size.serialize(contentBytes.length);
453
- return mergeBytes([lengthBytes, contentBytes]);
454
- },
455
- deserialize: (buffer, offset = 0) => {
456
- if (buffer.slice(offset).length === 0) {
457
- throw new DeserializingEmptyBufferError("string");
458
- }
459
- const [lengthBigInt, lengthOffset] = size.deserialize(buffer, offset);
366
+ decode: (bytes, offset = 0) => {
367
+ assertByteArrayIsNotEmptyForCodec("string", bytes, offset);
368
+ const [lengthBigInt, lengthOffset] = size.decode(bytes, offset);
460
369
  const length = Number(lengthBigInt);
461
370
  offset = lengthOffset;
462
- const contentBuffer = buffer.slice(offset, offset + length);
463
- if (contentBuffer.length < length) {
464
- throw new NotEnoughBytesError("string", length, contentBuffer.length);
465
- }
466
- const [value, contentOffset] = encoding.deserialize(contentBuffer);
371
+ const contentBytes = bytes.slice(offset, offset + length);
372
+ assertByteArrayHasEnoughBytesForCodec("string", length, contentBytes);
373
+ const [value, contentOffset] = encoding.decode(contentBytes);
467
374
  offset += contentOffset;
468
- return [value, offset];
469
- }
470
- };
471
- }
472
-
473
- // ../../node_modules/.pnpm/@metaplex-foundation+umi-serializers@0.8.9/node_modules/@metaplex-foundation/umi-serializers/dist/esm/struct.mjs
474
- function struct(fields, options = {}) {
475
- const fieldDescriptions = fields.map(([name, serializer]) => `${String(name)}: ${serializer.description}`).join(", ");
476
- return {
477
- description: options.description ?? `struct(${fieldDescriptions})`,
478
- fixedSize: sumSerializerSizes(fields.map(([, field]) => field.fixedSize)),
479
- maxSize: sumSerializerSizes(fields.map(([, field]) => field.maxSize)),
480
- serialize: (struct2) => {
481
- const fieldBytes = fields.map(([key, serializer]) => serializer.serialize(struct2[key]));
482
- return mergeBytes(fieldBytes);
483
- },
484
- deserialize: (bytes2, offset = 0) => {
485
- const struct2 = {};
486
- fields.forEach(([key, serializer]) => {
487
- const [value, newOffset] = serializer.deserialize(bytes2, offset);
488
- offset = newOffset;
489
- struct2[key] = value;
490
- });
491
- return [struct2, offset];
492
- }
375
+ return [value, offset];
376
+ },
377
+ description,
378
+ fixedSize: null,
379
+ maxSize: null
493
380
  };
381
+ };
382
+ function getSizeDescription(size) {
383
+ return typeof size === "object" ? size.description : `${size}`;
494
384
  }
495
385
 
496
386
  // src/unsigned-transaction.ts
@@ -508,7 +398,10 @@ this.globalThis.solanaWeb3 = (function (exports) {
508
398
  }
509
399
 
510
400
  // src/blockhash.ts
401
+ var base58Encoder;
511
402
  function assertIsBlockhash(putativeBlockhash) {
403
+ if (!base58Encoder)
404
+ base58Encoder = getBase58Encoder();
512
405
  try {
513
406
  if (
514
407
  // Lowest value (32 bytes of zeroes)
@@ -517,8 +410,8 @@ this.globalThis.solanaWeb3 = (function (exports) {
517
410
  ) {
518
411
  throw new Error("Expected input string to decode to a byte array of length 32.");
519
412
  }
520
- const bytes2 = base58.serialize(putativeBlockhash);
521
- const numBytes = bytes2.byteLength;
413
+ const bytes = base58Encoder.encode(putativeBlockhash);
414
+ const numBytes = bytes.byteLength;
522
415
  if (numBytes !== 32) {
523
416
  throw new Error(`Expected input string to decode to a byte array of length 32. Actual length: ${numBytes}`);
524
417
  }
@@ -603,7 +496,7 @@ this.globalThis.solanaWeb3 = (function (exports) {
603
496
  instruction.accounts?.length === 3 && // First account is nonce account address
604
497
  instruction.accounts[0].address != null && instruction.accounts[0].role === AccountRole.WRITABLE && // Second account is recent blockhashes sysvar
605
498
  instruction.accounts[1].address === RECENT_BLOCKHASHES_SYSVAR_ADDRESS && instruction.accounts[1].role === AccountRole.READONLY && // Third account is nonce authority account
606
- instruction.accounts[2].address != null && instruction.accounts[2].role === AccountRole.READONLY_SIGNER;
499
+ instruction.accounts[2].address != null && isSignerRole(instruction.accounts[2].role);
607
500
  }
608
501
  function isAdvanceNonceAccountInstructionData(data) {
609
502
  return data.byteLength === 4 && data[0] === 4 && data[1] === 0 && data[2] === 0 && data[3] === 0;
@@ -611,21 +504,38 @@ this.globalThis.solanaWeb3 = (function (exports) {
611
504
  function isDurableNonceTransaction(transaction) {
612
505
  return "lifetimeConstraint" in transaction && typeof transaction.lifetimeConstraint.nonce === "string" && transaction.instructions[0] != null && isAdvanceNonceAccountInstruction(transaction.instructions[0]);
613
506
  }
507
+ function isAdvanceNonceAccountInstructionForNonce(instruction, nonceAccountAddress, nonceAuthorityAddress) {
508
+ return instruction.accounts[0].address === nonceAccountAddress && instruction.accounts[2].address === nonceAuthorityAddress;
509
+ }
614
510
  function setTransactionLifetimeUsingDurableNonce({
615
511
  nonce,
616
512
  nonceAccountAddress,
617
513
  nonceAuthorityAddress
618
514
  }, transaction) {
619
- const isAlreadyDurableNonceTransaction = isDurableNonceTransaction(transaction);
620
- if (isAlreadyDurableNonceTransaction && transaction.lifetimeConstraint.nonce === nonce && transaction.instructions[0].accounts[0].address === nonceAccountAddress && transaction.instructions[0].accounts[2].address === nonceAuthorityAddress) {
621
- return transaction;
515
+ let newInstructions;
516
+ const firstInstruction = transaction.instructions[0];
517
+ if (firstInstruction && isAdvanceNonceAccountInstruction(firstInstruction)) {
518
+ if (isAdvanceNonceAccountInstructionForNonce(firstInstruction, nonceAccountAddress, nonceAuthorityAddress)) {
519
+ if (isDurableNonceTransaction(transaction) && transaction.lifetimeConstraint.nonce === nonce) {
520
+ return transaction;
521
+ } else {
522
+ newInstructions = [firstInstruction, ...transaction.instructions.slice(1)];
523
+ }
524
+ } else {
525
+ newInstructions = [
526
+ createAdvanceNonceAccountInstruction(nonceAccountAddress, nonceAuthorityAddress),
527
+ ...transaction.instructions.slice(1)
528
+ ];
529
+ }
530
+ } else {
531
+ newInstructions = [
532
+ createAdvanceNonceAccountInstruction(nonceAccountAddress, nonceAuthorityAddress),
533
+ ...transaction.instructions
534
+ ];
622
535
  }
623
536
  const out = {
624
537
  ...getUnsignedTransaction(transaction),
625
- instructions: [
626
- createAdvanceNonceAccountInstruction(nonceAccountAddress, nonceAuthorityAddress),
627
- ...isAlreadyDurableNonceTransaction ? transaction.instructions.slice(1) : transaction.instructions
628
- ],
538
+ instructions: newInstructions,
629
539
  lifetimeConstraint: {
630
540
  nonce
631
541
  }
@@ -665,335 +575,182 @@ this.globalThis.solanaWeb3 = (function (exports) {
665
575
  return out;
666
576
  }
667
577
 
668
- // ../codecs-core/dist/index.browser.js
669
- function assertByteArrayIsNotEmptyForCodec(codecDescription, bytes2, offset = 0) {
670
- if (bytes2.length - offset <= 0) {
671
- throw new Error(`Codec [${codecDescription}] cannot decode empty byte arrays.`);
672
- }
673
- }
674
- function assertByteArrayHasEnoughBytesForCodec(codecDescription, expected, bytes2, offset = 0) {
675
- const bytesLength = bytes2.length - offset;
676
- if (bytesLength < expected) {
677
- throw new Error(`Codec [${codecDescription}] expected ${expected} bytes, got ${bytesLength}.`);
678
- }
578
+ // ../codecs-data-structures/dist/index.browser.js
579
+ function sumCodecSizes(sizes) {
580
+ return sizes.reduce((all, size) => all === null || size === null ? null : all + size, 0);
679
581
  }
680
- var mergeBytes2 = (byteArrays) => {
681
- const nonEmptyByteArrays = byteArrays.filter((arr) => arr.length);
682
- if (nonEmptyByteArrays.length === 0) {
683
- return byteArrays.length ? byteArrays[0] : new Uint8Array();
684
- }
685
- if (nonEmptyByteArrays.length === 1) {
686
- return nonEmptyByteArrays[0];
687
- }
688
- const totalLength = nonEmptyByteArrays.reduce((total, arr) => total + arr.length, 0);
689
- const result = new Uint8Array(totalLength);
690
- let offset = 0;
691
- nonEmptyByteArrays.forEach((arr) => {
692
- result.set(arr, offset);
693
- offset += arr.length;
694
- });
695
- return result;
696
- };
697
- var padBytes2 = (bytes2, length) => {
698
- if (bytes2.length >= length)
699
- return bytes2;
700
- const paddedBytes = new Uint8Array(length).fill(0);
701
- paddedBytes.set(bytes2);
702
- return paddedBytes;
703
- };
704
- var fixBytes2 = (bytes2, length) => padBytes2(bytes2.length <= length ? bytes2 : bytes2.slice(0, length), length);
705
- function combineCodec(encoder, decoder, description) {
706
- if (encoder.fixedSize !== decoder.fixedSize) {
707
- throw new Error(
708
- `Encoder and decoder must have the same fixed size, got [${encoder.fixedSize}] and [${decoder.fixedSize}].`
709
- );
582
+ function decodeArrayLikeCodecSize(size, childrenSizes, bytes, offset) {
583
+ if (typeof size === "number") {
584
+ return [size, offset];
710
585
  }
711
- if (encoder.maxSize !== decoder.maxSize) {
712
- throw new Error(
713
- `Encoder and decoder must have the same max size, got [${encoder.maxSize}] and [${decoder.maxSize}].`
714
- );
586
+ if (typeof size === "object") {
587
+ return size.decode(bytes, offset);
715
588
  }
716
- if (description === void 0 && encoder.description !== decoder.description) {
717
- throw new Error(
718
- `Encoder and decoder must have the same description, got [${encoder.description}] and [${decoder.description}]. Pass a custom description as a third argument if you want to override the description and bypass this error.`
719
- );
589
+ if (size === "remainder") {
590
+ const childrenSize = sumCodecSizes(childrenSizes);
591
+ if (childrenSize === null) {
592
+ throw new Error('Codecs of "remainder" size must have fixed-size items.');
593
+ }
594
+ const remainder = bytes.slice(offset).length;
595
+ if (remainder % childrenSize !== 0) {
596
+ throw new Error(
597
+ `The remainder of the byte array (${remainder} bytes) cannot be split into chunks of ${childrenSize} bytes. Codecs of "remainder" size must have a remainder that is a multiple of its item size. In other words, ${remainder} modulo ${childrenSize} should be equal to zero.`
598
+ );
599
+ }
600
+ return [remainder / childrenSize, offset];
720
601
  }
721
- return {
722
- decode: decoder.decode,
723
- description: description ?? encoder.description,
724
- encode: encoder.encode,
725
- fixedSize: encoder.fixedSize,
726
- maxSize: encoder.maxSize
727
- };
728
- }
729
- function fixCodecHelper(data, fixedBytes, description) {
730
- return {
731
- description: description ?? `fixed(${fixedBytes}, ${data.description})`,
732
- fixedSize: fixedBytes,
733
- maxSize: fixedBytes
734
- };
602
+ throw new Error(`Unrecognized array-like codec size: ${JSON.stringify(size)}`);
735
603
  }
736
- function fixEncoder(encoder, fixedBytes, description) {
737
- return {
738
- ...fixCodecHelper(encoder, fixedBytes, description),
739
- encode: (value) => fixBytes2(encoder.encode(value), fixedBytes)
740
- };
604
+ function getArrayLikeCodecSizeDescription(size) {
605
+ return typeof size === "object" ? size.description : `${size}`;
741
606
  }
742
- function fixDecoder(decoder, fixedBytes, description) {
743
- return {
744
- ...fixCodecHelper(decoder, fixedBytes, description),
745
- decode: (bytes2, offset = 0) => {
746
- assertByteArrayHasEnoughBytesForCodec("fixCodec", fixedBytes, bytes2, offset);
747
- if (offset > 0 || bytes2.length > fixedBytes) {
748
- bytes2 = bytes2.slice(offset, offset + fixedBytes);
749
- }
750
- if (decoder.fixedSize !== null) {
751
- bytes2 = fixBytes2(bytes2, decoder.fixedSize);
752
- }
753
- const [value] = decoder.decode(bytes2, 0);
754
- return [value, offset + fixedBytes];
755
- }
756
- };
607
+ function getArrayLikeCodecSizeFromChildren(size, childrenSizes) {
608
+ if (typeof size !== "number")
609
+ return null;
610
+ if (size === 0)
611
+ return 0;
612
+ const childrenSize = sumCodecSizes(childrenSizes);
613
+ return childrenSize === null ? null : childrenSize * size;
757
614
  }
758
- function mapEncoder(encoder, unmap) {
759
- return {
760
- description: encoder.description,
761
- encode: (value) => encoder.encode(unmap(value)),
762
- fixedSize: encoder.fixedSize,
763
- maxSize: encoder.maxSize
764
- };
615
+ function getArrayLikeCodecSizePrefix(size, realSize) {
616
+ return typeof size === "object" ? size.encode(realSize) : new Uint8Array();
765
617
  }
766
-
767
- // ../codecs-numbers/dist/index.browser.js
768
- function assertNumberIsBetweenForCodec(codecDescription, min, max, value) {
769
- if (value < min || value > max) {
770
- throw new Error(
771
- `Codec [${codecDescription}] expected number to be in the range [${min}, ${max}], got ${value}.`
772
- );
618
+ function assertValidNumberOfItemsForCodec(codecDescription, expected, actual) {
619
+ if (expected !== actual) {
620
+ throw new Error(`Expected [${codecDescription}] to have ${expected} items, got ${actual}.`);
773
621
  }
774
622
  }
775
- function sharedNumberFactory(input) {
776
- let littleEndian;
777
- let defaultDescription = input.name;
778
- if (input.size > 1) {
779
- littleEndian = !("endian" in input.options) || input.options.endian === 0;
780
- defaultDescription += littleEndian ? "(le)" : "(be)";
623
+ function arrayCodecHelper(item, size, description) {
624
+ if (size === "remainder" && item.fixedSize === null) {
625
+ throw new Error('Codecs of "remainder" size must have fixed-size items.');
781
626
  }
782
627
  return {
783
- description: input.options.description ?? defaultDescription,
784
- fixedSize: input.size,
785
- littleEndian,
786
- maxSize: input.size
628
+ description: description ?? `array(${item.description}; ${getArrayLikeCodecSizeDescription(size)})`,
629
+ fixedSize: getArrayLikeCodecSizeFromChildren(size, [item.fixedSize]),
630
+ maxSize: getArrayLikeCodecSizeFromChildren(size, [item.maxSize])
787
631
  };
788
632
  }
789
- function numberEncoderFactory(input) {
790
- const codecData = sharedNumberFactory(input);
633
+ function getArrayEncoder(item, options = {}) {
634
+ const size = options.size ?? getU32Encoder();
791
635
  return {
792
- description: codecData.description,
793
- encode(value) {
794
- if (input.range) {
795
- assertNumberIsBetweenForCodec(input.name, input.range[0], input.range[1], value);
636
+ ...arrayCodecHelper(item, size, options.description),
637
+ encode: (value) => {
638
+ if (typeof size === "number") {
639
+ assertValidNumberOfItemsForCodec("array", size, value.length);
796
640
  }
797
- const arrayBuffer = new ArrayBuffer(input.size);
798
- input.set(new DataView(arrayBuffer), value, codecData.littleEndian);
799
- return new Uint8Array(arrayBuffer);
800
- },
801
- fixedSize: codecData.fixedSize,
802
- maxSize: codecData.maxSize
803
- };
804
- }
805
- function numberDecoderFactory(input) {
806
- const codecData = sharedNumberFactory(input);
807
- return {
808
- decode(bytes2, offset = 0) {
809
- assertByteArrayIsNotEmptyForCodec(codecData.description, bytes2, offset);
810
- assertByteArrayHasEnoughBytesForCodec(codecData.description, input.size, bytes2, offset);
811
- const view = new DataView(toArrayBuffer2(bytes2, offset, input.size));
812
- return [input.get(view, codecData.littleEndian), offset + input.size];
813
- },
814
- description: codecData.description,
815
- fixedSize: codecData.fixedSize,
816
- maxSize: codecData.maxSize
641
+ return mergeBytes([getArrayLikeCodecSizePrefix(size, value.length), ...value.map((v) => item.encode(v))]);
642
+ }
817
643
  };
818
644
  }
819
- function toArrayBuffer2(bytes2, offset, length) {
820
- const bytesOffset = bytes2.byteOffset + (offset ?? 0);
821
- const bytesLength = length ?? bytes2.byteLength;
822
- return bytes2.buffer.slice(bytesOffset, bytesOffset + bytesLength);
823
- }
824
- var getU32Encoder = (options = {}) => numberEncoderFactory({
825
- name: "u32",
826
- options,
827
- range: [0, Number("0xffffffff")],
828
- set: (view, value, le) => view.setUint32(0, value, le),
829
- size: 4
830
- });
831
- var getU32Decoder = (options = {}) => numberDecoderFactory({
832
- get: (view, le) => view.getUint32(0, le),
833
- name: "u32",
834
- options,
835
- size: 4
836
- });
837
- var getU8Encoder = (options = {}) => numberEncoderFactory({
838
- name: "u8",
839
- options,
840
- range: [0, Number("0xff")],
841
- set: (view, value) => view.setUint8(0, value),
842
- size: 1
843
- });
844
- var getU8Decoder = (options = {}) => numberDecoderFactory({
845
- get: (view) => view.getUint8(0),
846
- name: "u8",
847
- options,
848
- size: 1
849
- });
850
- var getU8Codec = (options = {}) => combineCodec(getU8Encoder(options), getU8Decoder(options));
851
-
852
- // ../codecs-strings/dist/index.browser.js
853
- function assertValidBaseString(alphabet4, testValue, givenValue = testValue) {
854
- if (!testValue.match(new RegExp(`^[${alphabet4}]*$`))) {
855
- throw new Error(`Expected a string of base ${alphabet4.length}, got [${givenValue}].`);
856
- }
857
- }
858
- var getBaseXEncoder = (alphabet4) => {
859
- const base = alphabet4.length;
860
- const baseBigInt = BigInt(base);
861
- return {
862
- description: `base${base}`,
863
- encode(value) {
864
- assertValidBaseString(alphabet4, value);
865
- if (value === "")
866
- return new Uint8Array();
867
- const chars = [...value];
868
- let trailIndex = chars.findIndex((c) => c !== alphabet4[0]);
869
- trailIndex = trailIndex === -1 ? chars.length : trailIndex;
870
- const leadingZeroes = Array(trailIndex).fill(0);
871
- if (trailIndex === chars.length)
872
- return Uint8Array.from(leadingZeroes);
873
- const tailChars = chars.slice(trailIndex);
874
- let base10Number = 0n;
875
- let baseXPower = 1n;
876
- for (let i = tailChars.length - 1; i >= 0; i -= 1) {
877
- base10Number += baseXPower * BigInt(alphabet4.indexOf(tailChars[i]));
878
- baseXPower *= baseBigInt;
879
- }
880
- const tailBytes = [];
881
- while (base10Number > 0n) {
882
- tailBytes.unshift(Number(base10Number % 256n));
883
- base10Number /= 256n;
884
- }
885
- return Uint8Array.from(leadingZeroes.concat(tailBytes));
886
- },
887
- fixedSize: null,
888
- maxSize: null
889
- };
890
- };
891
- var getBaseXDecoder = (alphabet4) => {
892
- const base = alphabet4.length;
893
- const baseBigInt = BigInt(base);
645
+ function getArrayDecoder(item, options = {}) {
646
+ const size = options.size ?? getU32Decoder();
894
647
  return {
895
- decode(rawBytes, offset = 0) {
896
- const bytes2 = offset === 0 ? rawBytes : rawBytes.slice(offset);
897
- if (bytes2.length === 0)
898
- return ["", 0];
899
- let trailIndex = bytes2.findIndex((n) => n !== 0);
900
- trailIndex = trailIndex === -1 ? bytes2.length : trailIndex;
901
- const leadingZeroes = alphabet4[0].repeat(trailIndex);
902
- if (trailIndex === bytes2.length)
903
- return [leadingZeroes, rawBytes.length];
904
- let base10Number = bytes2.slice(trailIndex).reduce((sum, byte) => sum * 256n + BigInt(byte), 0n);
905
- const tailChars = [];
906
- while (base10Number > 0n) {
907
- tailChars.unshift(alphabet4[Number(base10Number % baseBigInt)]);
908
- base10Number /= baseBigInt;
648
+ ...arrayCodecHelper(item, size, options.description),
649
+ decode: (bytes, offset = 0) => {
650
+ if (typeof size === "object" && bytes.slice(offset).length === 0) {
651
+ return [[], offset];
909
652
  }
910
- return [leadingZeroes + tailChars.join(""), rawBytes.length];
911
- },
912
- description: `base${base}`,
913
- fixedSize: null,
914
- maxSize: null
915
- };
916
- };
917
- var alphabet2 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
918
- var getBase58Encoder = () => getBaseXEncoder(alphabet2);
919
- var getBase58Decoder = () => getBaseXDecoder(alphabet2);
920
- var removeNullCharacters2 = (value) => (
921
- // eslint-disable-next-line no-control-regex
922
- value.replace(/\u0000/g, "")
923
- );
924
- var e = globalThis.TextDecoder;
925
- var o = globalThis.TextEncoder;
926
- var getUtf8Encoder = () => {
927
- let textEncoder;
928
- return {
929
- description: "utf8",
930
- encode: (value) => new Uint8Array((textEncoder || (textEncoder = new o())).encode(value)),
931
- fixedSize: null,
932
- maxSize: null
653
+ const [resolvedSize, newOffset] = decodeArrayLikeCodecSize(size, [item.fixedSize], bytes, offset);
654
+ offset = newOffset;
655
+ const values = [];
656
+ for (let i = 0; i < resolvedSize; i += 1) {
657
+ const [value, newOffset2] = item.decode(bytes, offset);
658
+ values.push(value);
659
+ offset = newOffset2;
660
+ }
661
+ return [values, offset];
662
+ }
933
663
  };
934
- };
935
- var getUtf8Decoder = () => {
936
- let textDecoder;
937
- return {
938
- decode(bytes2, offset = 0) {
939
- const value = (textDecoder || (textDecoder = new e())).decode(bytes2.slice(offset));
940
- return [removeNullCharacters2(value), bytes2.length];
941
- },
942
- description: "utf8",
664
+ }
665
+ function getBytesEncoder(options = {}) {
666
+ const size = options.size ?? "variable";
667
+ const sizeDescription = typeof size === "object" ? size.description : `${size}`;
668
+ const description = options.description ?? `bytes(${sizeDescription})`;
669
+ const byteEncoder = {
670
+ description,
671
+ encode: (value) => value,
943
672
  fixedSize: null,
944
673
  maxSize: null
945
674
  };
946
- };
947
- var getStringEncoder = (options = {}) => {
948
- const size = options.size ?? getU32Encoder();
949
- const encoding = options.encoding ?? getUtf8Encoder();
950
- const description = options.description ?? `string(${encoding.description}; ${getSizeDescription2(size)})`;
951
675
  if (size === "variable") {
952
- return { ...encoding, description };
676
+ return byteEncoder;
953
677
  }
954
678
  if (typeof size === "number") {
955
- return fixEncoder(encoding, size, description);
679
+ return fixEncoder(byteEncoder, size, description);
956
680
  }
957
681
  return {
958
- description,
682
+ ...byteEncoder,
959
683
  encode: (value) => {
960
- const contentBytes = encoding.encode(value);
684
+ const contentBytes = byteEncoder.encode(value);
961
685
  const lengthBytes = size.encode(contentBytes.length);
962
- return mergeBytes2([lengthBytes, contentBytes]);
686
+ return mergeBytes([lengthBytes, contentBytes]);
687
+ }
688
+ };
689
+ }
690
+ function getBytesDecoder(options = {}) {
691
+ const size = options.size ?? "variable";
692
+ const sizeDescription = typeof size === "object" ? size.description : `${size}`;
693
+ const description = options.description ?? `bytes(${sizeDescription})`;
694
+ const byteDecoder = {
695
+ decode: (bytes, offset = 0) => {
696
+ const slice = bytes.slice(offset);
697
+ return [slice, offset + slice.length];
963
698
  },
699
+ description,
964
700
  fixedSize: null,
965
701
  maxSize: null
966
702
  };
967
- };
968
- var getStringDecoder = (options = {}) => {
969
- const size = options.size ?? getU32Decoder();
970
- const encoding = options.encoding ?? getUtf8Decoder();
971
- const description = options.description ?? `string(${encoding.description}; ${getSizeDescription2(size)})`;
972
703
  if (size === "variable") {
973
- return { ...encoding, description };
704
+ return byteDecoder;
974
705
  }
975
706
  if (typeof size === "number") {
976
- return fixDecoder(encoding, size, description);
707
+ return fixDecoder(byteDecoder, size, description);
977
708
  }
978
709
  return {
979
- decode: (bytes2, offset = 0) => {
980
- assertByteArrayIsNotEmptyForCodec("string", bytes2, offset);
981
- const [lengthBigInt, lengthOffset] = size.decode(bytes2, offset);
710
+ ...byteDecoder,
711
+ decode: (bytes, offset = 0) => {
712
+ assertByteArrayIsNotEmptyForCodec("bytes", bytes, offset);
713
+ const [lengthBigInt, lengthOffset] = size.decode(bytes, offset);
982
714
  const length = Number(lengthBigInt);
983
715
  offset = lengthOffset;
984
- const contentBytes = bytes2.slice(offset, offset + length);
985
- assertByteArrayHasEnoughBytesForCodec("string", length, contentBytes);
986
- const [value, contentOffset] = encoding.decode(contentBytes);
716
+ const contentBytes = bytes.slice(offset, offset + length);
717
+ assertByteArrayHasEnoughBytesForCodec("bytes", length, contentBytes);
718
+ const [value, contentOffset] = byteDecoder.decode(contentBytes);
987
719
  offset += contentOffset;
988
720
  return [value, offset];
989
- },
990
- description,
991
- fixedSize: null,
992
- maxSize: null
721
+ }
722
+ };
723
+ }
724
+ function structCodecHelper(fields, description) {
725
+ const fieldDescriptions = fields.map(([name, codec]) => `${String(name)}: ${codec.description}`).join(", ");
726
+ return {
727
+ description: description ?? `struct(${fieldDescriptions})`,
728
+ fixedSize: sumCodecSizes(fields.map(([, field]) => field.fixedSize)),
729
+ maxSize: sumCodecSizes(fields.map(([, field]) => field.maxSize))
730
+ };
731
+ }
732
+ function getStructEncoder(fields, options = {}) {
733
+ return {
734
+ ...structCodecHelper(fields, options.description),
735
+ encode: (struct) => {
736
+ const fieldBytes = fields.map(([key, codec]) => codec.encode(struct[key]));
737
+ return mergeBytes(fieldBytes);
738
+ }
739
+ };
740
+ }
741
+ function getStructDecoder(fields, options = {}) {
742
+ return {
743
+ ...structCodecHelper(fields, options.description),
744
+ decode: (bytes, offset = 0) => {
745
+ const struct = {};
746
+ fields.forEach(([key, codec]) => {
747
+ const [value, newOffset] = codec.decode(bytes, offset);
748
+ offset = newOffset;
749
+ struct[key] = value;
750
+ });
751
+ return [struct, offset];
752
+ }
993
753
  };
994
- };
995
- function getSizeDescription2(size) {
996
- return typeof size === "object" ? size.description : `${size}`;
997
754
  }
998
755
 
999
756
  // ../assertions/dist/index.browser.js
@@ -1039,9 +796,9 @@ this.globalThis.solanaWeb3 = (function (exports) {
1039
796
  ) {
1040
797
  throw new Error("Expected input string to decode to a byte array of length 32.");
1041
798
  }
1042
- const base58Encoder = getMemoizedBase58Encoder();
1043
- const bytes2 = base58Encoder.encode(putativeBase58EncodedAddress);
1044
- const numBytes = bytes2.byteLength;
799
+ const base58Encoder3 = getMemoizedBase58Encoder();
800
+ const bytes = base58Encoder3.encode(putativeBase58EncodedAddress);
801
+ const numBytes = bytes.byteLength;
1045
802
  if (numBytes !== 32) {
1046
803
  throw new Error(`Expected input string to decode to a byte array of length 32. Actual length: ${numBytes}`);
1047
804
  }
@@ -1072,9 +829,6 @@ this.globalThis.solanaWeb3 = (function (exports) {
1072
829
  size: 32
1073
830
  });
1074
831
  }
1075
- function getAddressCodec(config) {
1076
- return combineCodec(getAddressEncoder(config), getAddressDecoder(config));
1077
- }
1078
832
  function getAddressComparator() {
1079
833
  return new Intl.Collator("en", {
1080
834
  caseFirst: "lower",
@@ -1383,116 +1137,230 @@ this.globalThis.solanaWeb3 = (function (exports) {
1383
1137
  };
1384
1138
  }
1385
1139
 
1386
- // src/serializers/address-table-lookup.ts
1387
- function addressSerializerCompat(compat) {
1388
- const codec = getAddressCodec();
1140
+ // ../functional/dist/index.browser.js
1141
+ function pipe(init, ...fns) {
1142
+ return fns.reduce((acc, fn) => fn(acc), init);
1143
+ }
1144
+
1145
+ // src/decompile-transaction.ts
1146
+ function getAccountMetas(message) {
1147
+ const { header } = message;
1148
+ const numWritableSignerAccounts = header.numSignerAccounts - header.numReadonlySignerAccounts;
1149
+ const numWritableNonSignerAccounts = message.staticAccounts.length - header.numSignerAccounts - header.numReadonlyNonSignerAccounts;
1150
+ const accountMetas = [];
1151
+ let accountIndex = 0;
1152
+ for (let i = 0; i < numWritableSignerAccounts; i++) {
1153
+ accountMetas.push({
1154
+ address: message.staticAccounts[accountIndex],
1155
+ role: AccountRole.WRITABLE_SIGNER
1156
+ });
1157
+ accountIndex++;
1158
+ }
1159
+ for (let i = 0; i < header.numReadonlySignerAccounts; i++) {
1160
+ accountMetas.push({
1161
+ address: message.staticAccounts[accountIndex],
1162
+ role: AccountRole.READONLY_SIGNER
1163
+ });
1164
+ accountIndex++;
1165
+ }
1166
+ for (let i = 0; i < numWritableNonSignerAccounts; i++) {
1167
+ accountMetas.push({
1168
+ address: message.staticAccounts[accountIndex],
1169
+ role: AccountRole.WRITABLE
1170
+ });
1171
+ accountIndex++;
1172
+ }
1173
+ for (let i = 0; i < header.numReadonlyNonSignerAccounts; i++) {
1174
+ accountMetas.push({
1175
+ address: message.staticAccounts[accountIndex],
1176
+ role: AccountRole.READONLY
1177
+ });
1178
+ accountIndex++;
1179
+ }
1180
+ return accountMetas;
1181
+ }
1182
+ function convertInstruction(instruction, accountMetas) {
1183
+ const programAddress = accountMetas[instruction.programAddressIndex]?.address;
1184
+ if (!programAddress) {
1185
+ throw new Error(`Could not find program address at index ${instruction.programAddressIndex}`);
1186
+ }
1187
+ const accounts = instruction.accountIndices?.map((accountIndex) => accountMetas[accountIndex]);
1188
+ const { data } = instruction;
1389
1189
  return {
1390
- description: compat?.description ?? codec.description,
1391
- deserialize: codec.decode,
1392
- fixedSize: codec.fixedSize,
1393
- maxSize: codec.maxSize,
1394
- serialize: codec.encode
1190
+ programAddress,
1191
+ ...accounts && accounts.length ? { accounts } : {},
1192
+ ...data && data.length ? { data } : {}
1395
1193
  };
1396
1194
  }
1397
- function getAddressTableLookupCodec() {
1398
- return struct(
1399
- [
1195
+ function getLifetimeConstraint(messageLifetimeToken, firstInstruction, lastValidBlockHeight) {
1196
+ if (!firstInstruction || !isAdvanceNonceAccountInstruction(firstInstruction)) {
1197
+ return {
1198
+ blockhash: messageLifetimeToken,
1199
+ lastValidBlockHeight: lastValidBlockHeight ?? 2n ** 64n - 1n
1200
+ // U64 MAX
1201
+ };
1202
+ } else {
1203
+ const nonceAccountAddress = firstInstruction.accounts[0].address;
1204
+ assertIsAddress(nonceAccountAddress);
1205
+ const nonceAuthorityAddress = firstInstruction.accounts[2].address;
1206
+ assertIsAddress(nonceAuthorityAddress);
1207
+ return {
1208
+ nonce: messageLifetimeToken,
1209
+ nonceAccountAddress,
1210
+ nonceAuthorityAddress
1211
+ };
1212
+ }
1213
+ }
1214
+ function convertSignatures(compiledTransaction) {
1215
+ const {
1216
+ compiledMessage: { staticAccounts },
1217
+ signatures
1218
+ } = compiledTransaction;
1219
+ return signatures.reduce((acc, sig, index) => {
1220
+ const allZeros = sig.every((byte) => byte === 0);
1221
+ if (allZeros)
1222
+ return acc;
1223
+ const address2 = staticAccounts[index];
1224
+ return { ...acc, [address2]: sig };
1225
+ }, {});
1226
+ }
1227
+ function decompileTransaction(compiledTransaction, lastValidBlockHeight) {
1228
+ const { compiledMessage } = compiledTransaction;
1229
+ if ("addressTableLookups" in compiledMessage && compiledMessage.addressTableLookups.length > 0) {
1230
+ throw new Error("Cannot convert transaction with addressTableLookups");
1231
+ }
1232
+ const feePayer = compiledMessage.staticAccounts[0];
1233
+ if (!feePayer)
1234
+ throw new Error("No fee payer set in CompiledTransaction");
1235
+ const accountMetas = getAccountMetas(compiledMessage);
1236
+ const instructions = compiledMessage.instructions.map(
1237
+ (compiledInstruction) => convertInstruction(compiledInstruction, accountMetas)
1238
+ );
1239
+ const firstInstruction = instructions[0];
1240
+ const lifetimeConstraint = getLifetimeConstraint(
1241
+ compiledMessage.lifetimeToken,
1242
+ firstInstruction,
1243
+ lastValidBlockHeight
1244
+ );
1245
+ const signatures = convertSignatures(compiledTransaction);
1246
+ return pipe(
1247
+ createTransaction({ version: compiledMessage.version }),
1248
+ (tx) => setTransactionFeePayer(feePayer, tx),
1249
+ (tx) => instructions.reduce((acc, instruction) => {
1250
+ return appendTransactionInstruction(instruction, acc);
1251
+ }, tx),
1252
+ (tx) => "blockhash" in lifetimeConstraint ? setTransactionLifetimeUsingBlockhash(lifetimeConstraint, tx) : setTransactionLifetimeUsingDurableNonce(lifetimeConstraint, tx),
1253
+ (tx) => compiledTransaction.signatures.length ? { ...tx, signatures } : tx
1254
+ );
1255
+ }
1256
+
1257
+ // src/serializers/address-table-lookup.ts
1258
+ var lookupTableAddressDescription = "The address of the address lookup table account from which instruction addresses should be looked up" ;
1259
+ var writableIndicesDescription = "The indices of the accounts in the lookup table that should be loaded as writeable" ;
1260
+ var readableIndicesDescription = "The indices of the accounts in the lookup table that should be loaded as read-only" ;
1261
+ var addressTableLookupDescription = "A pointer to the address of an address lookup table, along with the readonly/writeable indices of the addresses that should be loaded from it" ;
1262
+ var memoizedAddressTableLookupEncoder;
1263
+ function getAddressTableLookupEncoder() {
1264
+ if (!memoizedAddressTableLookupEncoder) {
1265
+ memoizedAddressTableLookupEncoder = getStructEncoder(
1400
1266
  [
1401
- "lookupTableAddress",
1402
- addressSerializerCompat(
1403
- {
1404
- description: "The address of the address lookup table account from which instruction addresses should be looked up"
1405
- }
1406
- )
1267
+ ["lookupTableAddress", getAddressEncoder({ description: lookupTableAddressDescription })],
1268
+ [
1269
+ "writableIndices",
1270
+ getArrayEncoder(getU8Encoder(), {
1271
+ description: writableIndicesDescription,
1272
+ size: getShortU16Encoder()
1273
+ })
1274
+ ],
1275
+ [
1276
+ "readableIndices",
1277
+ getArrayEncoder(getU8Encoder(), {
1278
+ description: readableIndicesDescription,
1279
+ size: getShortU16Encoder()
1280
+ })
1281
+ ]
1407
1282
  ],
1283
+ { description: addressTableLookupDescription }
1284
+ );
1285
+ }
1286
+ return memoizedAddressTableLookupEncoder;
1287
+ }
1288
+ var memoizedAddressTableLookupDecoder;
1289
+ function getAddressTableLookupDecoder() {
1290
+ if (!memoizedAddressTableLookupDecoder) {
1291
+ memoizedAddressTableLookupDecoder = getStructDecoder(
1408
1292
  [
1409
- "writableIndices",
1410
- array(u8(), {
1411
- ...{
1412
- description: "The indices of the accounts in the lookup table that should be loaded as writeable"
1413
- } ,
1414
- size: shortU16()
1415
- })
1293
+ ["lookupTableAddress", getAddressDecoder({ description: lookupTableAddressDescription })],
1294
+ [
1295
+ "writableIndices",
1296
+ getArrayDecoder(getU8Decoder(), {
1297
+ description: writableIndicesDescription,
1298
+ size: getShortU16Decoder()
1299
+ })
1300
+ ],
1301
+ [
1302
+ "readableIndices",
1303
+ getArrayDecoder(getU8Decoder(), {
1304
+ description: readableIndicesDescription,
1305
+ size: getShortU16Decoder()
1306
+ })
1307
+ ]
1416
1308
  ],
1417
- [
1418
- "readableIndices",
1419
- array(u8(), {
1420
- ...{
1421
- description: "The indices of the accounts in the lookup table that should be loaded as read-only"
1422
- } ,
1423
- size: shortU16()
1424
- })
1425
- ]
1426
- ],
1427
- {
1428
- description: "A pointer to the address of an address lookup table, along with the readonly/writeable indices of the addresses that should be loaded from it"
1429
- }
1430
- );
1309
+ { description: addressTableLookupDescription }
1310
+ );
1311
+ }
1312
+ return memoizedAddressTableLookupDecoder;
1431
1313
  }
1432
1314
 
1433
- // ../codecs-data-structures/dist/index.browser.js
1434
- function sumCodecSizes(sizes) {
1435
- return sizes.reduce((all, size) => all === null || size === null ? null : all + size, 0);
1436
- }
1437
- function structCodecHelper(fields, description) {
1438
- const fieldDescriptions = fields.map(([name, codec]) => `${String(name)}: ${codec.description}`).join(", ");
1439
- return {
1440
- description: description ?? `struct(${fieldDescriptions})`,
1441
- fixedSize: sumCodecSizes(fields.map(([, field]) => field.fixedSize)),
1442
- maxSize: sumCodecSizes(fields.map(([, field]) => field.maxSize))
1443
- };
1444
- }
1445
- function getStructEncoder(fields, options = {}) {
1446
- return {
1447
- ...structCodecHelper(fields, options.description),
1448
- encode: (struct2) => {
1449
- const fieldBytes = fields.map(([key, codec]) => codec.encode(struct2[key]));
1450
- return mergeBytes2(fieldBytes);
1451
- }
1452
- };
1453
- }
1454
- function getStructDecoder(fields, options = {}) {
1315
+ // src/serializers/header.ts
1316
+ var memoizedU8Encoder;
1317
+ function getMemoizedU8Encoder() {
1318
+ if (!memoizedU8Encoder)
1319
+ memoizedU8Encoder = getU8Encoder();
1320
+ return memoizedU8Encoder;
1321
+ }
1322
+ function getMemoizedU8EncoderDescription(description) {
1323
+ const encoder = getMemoizedU8Encoder();
1455
1324
  return {
1456
- ...structCodecHelper(fields, options.description),
1457
- decode: (bytes2, offset = 0) => {
1458
- const struct2 = {};
1459
- fields.forEach(([key, codec]) => {
1460
- const [value, newOffset] = codec.decode(bytes2, offset);
1461
- offset = newOffset;
1462
- struct2[key] = value;
1463
- });
1464
- return [struct2, offset];
1465
- }
1325
+ ...encoder,
1326
+ description: description ?? encoder.description
1466
1327
  };
1467
1328
  }
1468
- function getStructCodec(fields, options = {}) {
1469
- return combineCodec(getStructEncoder(fields, options), getStructDecoder(fields, options));
1329
+ var memoizedU8Decoder;
1330
+ function getMemoizedU8Decoder() {
1331
+ if (!memoizedU8Decoder)
1332
+ memoizedU8Decoder = getU8Decoder();
1333
+ return memoizedU8Decoder;
1470
1334
  }
1471
-
1472
- // src/serializers/header.ts
1473
- var memoizedU8Codec;
1474
- function getMemoizedU8Codec() {
1475
- if (!memoizedU8Codec)
1476
- memoizedU8Codec = getU8Codec();
1477
- return memoizedU8Codec;
1478
- }
1479
- function getMemoizedU8CodecDescription(description) {
1480
- const codec = getMemoizedU8Codec();
1335
+ function getMemoizedU8DecoderDescription(description) {
1336
+ const decoder = getMemoizedU8Decoder();
1481
1337
  return {
1482
- ...codec,
1483
- description: description ?? codec.description
1338
+ ...decoder,
1339
+ description: description ?? decoder.description
1484
1340
  };
1485
1341
  }
1486
1342
  var numSignerAccountsDescription = "The expected number of addresses in the static address list belonging to accounts that are required to sign this transaction" ;
1487
1343
  var numReadonlySignerAccountsDescription = "The expected number of addresses in the static address list belonging to accounts that are required to sign this transaction, but may not be writable" ;
1488
1344
  var numReadonlyNonSignerAccountsDescription = "The expected number of addresses in the static address list belonging to accounts that are neither signers, nor writable" ;
1489
1345
  var messageHeaderDescription = "The transaction message header containing counts of the signer, readonly-signer, and readonly-nonsigner account addresses" ;
1490
- function getMessageHeaderCodec() {
1491
- return getStructCodec(
1346
+ function getMessageHeaderEncoder() {
1347
+ return getStructEncoder(
1492
1348
  [
1493
- ["numSignerAccounts", getMemoizedU8CodecDescription(numSignerAccountsDescription)],
1494
- ["numReadonlySignerAccounts", getMemoizedU8CodecDescription(numReadonlySignerAccountsDescription)],
1495
- ["numReadonlyNonSignerAccounts", getMemoizedU8CodecDescription(numReadonlyNonSignerAccountsDescription)]
1349
+ ["numSignerAccounts", getMemoizedU8EncoderDescription(numSignerAccountsDescription)],
1350
+ ["numReadonlySignerAccounts", getMemoizedU8EncoderDescription(numReadonlySignerAccountsDescription)],
1351
+ ["numReadonlyNonSignerAccounts", getMemoizedU8EncoderDescription(numReadonlyNonSignerAccountsDescription)]
1352
+ ],
1353
+ {
1354
+ description: messageHeaderDescription
1355
+ }
1356
+ );
1357
+ }
1358
+ function getMessageHeaderDecoder() {
1359
+ return getStructDecoder(
1360
+ [
1361
+ ["numSignerAccounts", getMemoizedU8DecoderDescription(numSignerAccountsDescription)],
1362
+ ["numReadonlySignerAccounts", getMemoizedU8DecoderDescription(numReadonlySignerAccountsDescription)],
1363
+ ["numReadonlyNonSignerAccounts", getMemoizedU8DecoderDescription(numReadonlyNonSignerAccountsDescription)]
1496
1364
  ],
1497
1365
  {
1498
1366
  description: messageHeaderDescription
@@ -1501,59 +1369,70 @@ this.globalThis.solanaWeb3 = (function (exports) {
1501
1369
  }
1502
1370
 
1503
1371
  // src/serializers/instruction.ts
1504
- function getInstructionCodec() {
1505
- return mapSerializer(
1506
- struct([
1507
- [
1508
- "programAddressIndex",
1509
- u8(
1510
- {
1511
- description: "The index of the program being called, according to the well-ordered accounts list for this transaction"
1512
- }
1513
- )
1514
- ],
1515
- [
1516
- "accountIndices",
1517
- array(
1518
- u8({
1519
- description: "The index of an account, according to the well-ordered accounts list for this transaction"
1520
- }),
1521
- {
1522
- description: "An optional list of account indices, according to the well-ordered accounts list for this transaction, in the order in which the program being called expects them" ,
1523
- size: shortU16()
1524
- }
1525
- )
1526
- ],
1527
- [
1528
- "data",
1529
- bytes({
1530
- description: "An optional buffer of data passed to the instruction" ,
1531
- size: shortU16()
1532
- })
1533
- ]
1534
- ]),
1535
- (value) => {
1536
- if (value.accountIndices !== void 0 && value.data !== void 0) {
1537
- return value;
1372
+ var programAddressIndexDescription = "The index of the program being called, according to the well-ordered accounts list for this transaction" ;
1373
+ var accountIndexDescription = "The index of an account, according to the well-ordered accounts list for this transaction" ;
1374
+ var accountIndicesDescription = "An optional list of account indices, according to the well-ordered accounts list for this transaction, in the order in which the program being called expects them" ;
1375
+ var dataDescription = "An optional buffer of data passed to the instruction" ;
1376
+ var memoizedGetInstructionEncoder;
1377
+ function getInstructionEncoder() {
1378
+ if (!memoizedGetInstructionEncoder) {
1379
+ memoizedGetInstructionEncoder = mapEncoder(
1380
+ getStructEncoder([
1381
+ ["programAddressIndex", getU8Encoder({ description: programAddressIndexDescription })],
1382
+ [
1383
+ "accountIndices",
1384
+ getArrayEncoder(getU8Encoder({ description: accountIndexDescription }), {
1385
+ description: accountIndicesDescription,
1386
+ size: getShortU16Encoder()
1387
+ })
1388
+ ],
1389
+ ["data", getBytesEncoder({ description: dataDescription, size: getShortU16Encoder() })]
1390
+ ]),
1391
+ // Convert an instruction to have all fields defined
1392
+ (instruction) => {
1393
+ if (instruction.accountIndices !== void 0 && instruction.data !== void 0) {
1394
+ return instruction;
1395
+ }
1396
+ return {
1397
+ ...instruction,
1398
+ accountIndices: instruction.accountIndices ?? [],
1399
+ data: instruction.data ?? new Uint8Array(0)
1400
+ };
1538
1401
  }
1539
- return {
1540
- ...value,
1541
- accountIndices: value.accountIndices ?? [],
1542
- data: value.data ?? new Uint8Array(0)
1543
- };
1544
- },
1545
- (value) => {
1546
- if (value.accountIndices.length && value.data.byteLength) {
1547
- return value;
1402
+ );
1403
+ }
1404
+ return memoizedGetInstructionEncoder;
1405
+ }
1406
+ var memoizedGetInstructionDecoder;
1407
+ function getInstructionDecoder() {
1408
+ if (!memoizedGetInstructionDecoder) {
1409
+ memoizedGetInstructionDecoder = mapDecoder(
1410
+ getStructDecoder([
1411
+ ["programAddressIndex", getU8Decoder({ description: programAddressIndexDescription })],
1412
+ [
1413
+ "accountIndices",
1414
+ getArrayDecoder(getU8Decoder({ description: accountIndexDescription }), {
1415
+ description: accountIndicesDescription,
1416
+ size: getShortU16Decoder()
1417
+ })
1418
+ ],
1419
+ ["data", getBytesDecoder({ description: dataDescription, size: getShortU16Decoder() })]
1420
+ ]),
1421
+ // Convert an instruction to exclude optional fields if they are empty
1422
+ (instruction) => {
1423
+ if (instruction.accountIndices.length && instruction.data.byteLength) {
1424
+ return instruction;
1425
+ }
1426
+ const { accountIndices, data, ...rest } = instruction;
1427
+ return {
1428
+ ...rest,
1429
+ ...accountIndices.length ? { accountIndices } : null,
1430
+ ...data.byteLength ? { data } : null
1431
+ };
1548
1432
  }
1549
- const { accountIndices, data, ...rest } = value;
1550
- return {
1551
- ...rest,
1552
- ...accountIndices.length ? { accountIndices } : null,
1553
- ...data.byteLength ? { data } : null
1554
- };
1555
- }
1556
- );
1433
+ );
1434
+ }
1435
+ return memoizedGetInstructionDecoder;
1557
1436
  }
1558
1437
 
1559
1438
  // src/serializers/transaction-version.ts
@@ -1563,8 +1442,8 @@ this.globalThis.solanaWeb3 = (function (exports) {
1563
1442
  fixedSize: null,
1564
1443
  maxSize: 1
1565
1444
  };
1566
- function decode(bytes2, offset = 0) {
1567
- const firstByte = bytes2[offset];
1445
+ function decode(bytes, offset = 0) {
1446
+ const firstByte = bytes[offset];
1568
1447
  if ((firstByte & VERSION_FLAG_MASK) === 0) {
1569
1448
  return ["legacy", offset];
1570
1449
  } else {
@@ -1593,126 +1472,181 @@ this.globalThis.solanaWeb3 = (function (exports) {
1593
1472
  encode
1594
1473
  };
1595
1474
  }
1596
- function getTransactionVersionCodec() {
1597
- return combineCodec(getTransactionVersionEncoder(), getTransactionVersionDecoder());
1598
- }
1599
-
1600
- // src/serializers/unimplemented.ts
1601
- function getError(type, name) {
1602
- const functionSuffix = name + type[0].toUpperCase() + type.slice(1);
1603
- return new Error(
1604
- `No ${type} exists for ${name}. Use \`get${functionSuffix}()\` if you need a ${type}, and \`get${name}Codec()\` if you need to both encode and decode ${name}`
1605
- );
1606
- }
1607
- function getUnimplementedDecoder(name) {
1608
- return () => {
1609
- throw getError("decoder", name);
1610
- };
1611
- }
1612
1475
 
1613
1476
  // src/serializers/message.ts
1614
- var BASE_CONFIG2 = {
1615
- description: "The wire format of a Solana transaction message" ,
1616
- fixedSize: null,
1617
- maxSize: null
1618
- };
1619
- function serialize(compiledMessage) {
1620
- if (compiledMessage.version === "legacy") {
1621
- return struct(getPreludeStructSerializerTuple()).serialize(compiledMessage);
1622
- } else {
1623
- return mapSerializer(
1624
- struct([
1625
- ...getPreludeStructSerializerTuple(),
1626
- ["addressTableLookups", getAddressTableLookupsSerializer()]
1627
- ]),
1628
- (value) => {
1629
- if (value.version === "legacy") {
1630
- return value;
1631
- }
1632
- return {
1633
- ...value,
1634
- addressTableLookups: value.addressTableLookups ?? []
1635
- };
1477
+ var staticAccountsDescription = "A compact-array of static account addresses belonging to this transaction" ;
1478
+ var lifetimeTokenDescription = "A 32-byte token that specifies the lifetime of this transaction (eg. a recent blockhash, or a durable nonce)" ;
1479
+ var instructionsDescription = "A compact-array of instructions belonging to this transaction" ;
1480
+ var addressTableLookupsDescription = "A compact array of address table lookups belonging to this transaction" ;
1481
+ function getCompiledMessageLegacyEncoder() {
1482
+ return getStructEncoder(getPreludeStructEncoderTuple());
1483
+ }
1484
+ function getCompiledMessageVersionedEncoder() {
1485
+ return mapEncoder(
1486
+ getStructEncoder([
1487
+ ...getPreludeStructEncoderTuple(),
1488
+ ["addressTableLookups", getAddressTableLookupArrayEncoder()]
1489
+ ]),
1490
+ (value) => {
1491
+ if (value.version === "legacy") {
1492
+ return value;
1636
1493
  }
1637
- ).serialize(compiledMessage);
1638
- }
1639
- }
1640
- function toSerializer(codec) {
1641
- return {
1642
- description: codec.description,
1643
- deserialize: codec.decode,
1644
- fixedSize: codec.fixedSize,
1645
- maxSize: codec.maxSize,
1646
- serialize: codec.encode
1647
- };
1494
+ return {
1495
+ ...value,
1496
+ addressTableLookups: value.addressTableLookups ?? []
1497
+ };
1498
+ }
1499
+ );
1648
1500
  }
1649
- function getPreludeStructSerializerTuple() {
1501
+ function getPreludeStructEncoderTuple() {
1650
1502
  return [
1651
- ["version", toSerializer(getTransactionVersionCodec())],
1652
- ["header", toSerializer(getMessageHeaderCodec())],
1503
+ ["version", getTransactionVersionEncoder()],
1504
+ ["header", getMessageHeaderEncoder()],
1653
1505
  [
1654
1506
  "staticAccounts",
1655
- array(toSerializer(getAddressCodec()), {
1656
- description: "A compact-array of static account addresses belonging to this transaction" ,
1657
- size: shortU16()
1507
+ getArrayEncoder(getAddressEncoder(), {
1508
+ description: staticAccountsDescription,
1509
+ size: getShortU16Encoder()
1658
1510
  })
1659
1511
  ],
1660
1512
  [
1661
1513
  "lifetimeToken",
1662
- string({
1663
- description: "A 32-byte token that specifies the lifetime of this transaction (eg. a recent blockhash, or a durable nonce)" ,
1664
- encoding: base58,
1514
+ getStringEncoder({
1515
+ description: lifetimeTokenDescription,
1516
+ encoding: getBase58Encoder(),
1665
1517
  size: 32
1666
1518
  })
1667
1519
  ],
1668
1520
  [
1669
1521
  "instructions",
1670
- array(getInstructionCodec(), {
1671
- description: "A compact-array of instructions belonging to this transaction" ,
1672
- size: shortU16()
1522
+ getArrayEncoder(getInstructionEncoder(), {
1523
+ description: instructionsDescription,
1524
+ size: getShortU16Encoder()
1673
1525
  })
1674
1526
  ]
1675
1527
  ];
1676
1528
  }
1677
- function getAddressTableLookupsSerializer() {
1678
- return array(getAddressTableLookupCodec(), {
1679
- ...{ description: "A compact array of address table lookups belonging to this transaction" } ,
1680
- size: shortU16()
1529
+ function getPreludeStructDecoderTuple() {
1530
+ return [
1531
+ ["version", getTransactionVersionDecoder()],
1532
+ ["header", getMessageHeaderDecoder()],
1533
+ [
1534
+ "staticAccounts",
1535
+ getArrayDecoder(getAddressDecoder(), {
1536
+ description: staticAccountsDescription,
1537
+ size: getShortU16Decoder()
1538
+ })
1539
+ ],
1540
+ [
1541
+ "lifetimeToken",
1542
+ getStringDecoder({
1543
+ description: lifetimeTokenDescription,
1544
+ encoding: getBase58Decoder(),
1545
+ size: 32
1546
+ })
1547
+ ],
1548
+ [
1549
+ "instructions",
1550
+ getArrayDecoder(getInstructionDecoder(), {
1551
+ description: instructionsDescription,
1552
+ size: getShortU16Decoder()
1553
+ })
1554
+ ],
1555
+ ["addressTableLookups", getAddressTableLookupArrayDecoder()]
1556
+ ];
1557
+ }
1558
+ function getAddressTableLookupArrayEncoder() {
1559
+ return getArrayEncoder(getAddressTableLookupEncoder(), {
1560
+ description: addressTableLookupsDescription,
1561
+ size: getShortU16Encoder()
1562
+ });
1563
+ }
1564
+ function getAddressTableLookupArrayDecoder() {
1565
+ return getArrayDecoder(getAddressTableLookupDecoder(), {
1566
+ description: addressTableLookupsDescription,
1567
+ size: getShortU16Decoder()
1681
1568
  });
1682
1569
  }
1570
+ var messageDescription = "The wire format of a Solana transaction message" ;
1683
1571
  function getCompiledMessageEncoder() {
1684
1572
  return {
1685
- ...BASE_CONFIG2,
1686
- deserialize: getUnimplementedDecoder("CompiledMessage"),
1687
- serialize
1573
+ description: messageDescription,
1574
+ encode: (compiledMessage) => {
1575
+ if (compiledMessage.version === "legacy") {
1576
+ return getCompiledMessageLegacyEncoder().encode(compiledMessage);
1577
+ } else {
1578
+ return getCompiledMessageVersionedEncoder().encode(compiledMessage);
1579
+ }
1580
+ },
1581
+ fixedSize: null,
1582
+ maxSize: null
1688
1583
  };
1689
1584
  }
1585
+ function getCompiledMessageDecoder() {
1586
+ return mapDecoder(
1587
+ getStructDecoder(getPreludeStructDecoderTuple(), {
1588
+ description: messageDescription
1589
+ }),
1590
+ ({ addressTableLookups, ...restOfMessage }) => {
1591
+ if (restOfMessage.version === "legacy" || !addressTableLookups?.length) {
1592
+ return restOfMessage;
1593
+ }
1594
+ return { ...restOfMessage, addressTableLookups };
1595
+ }
1596
+ );
1597
+ }
1690
1598
 
1691
1599
  // src/serializers/transaction.ts
1692
- var BASE_CONFIG3 = {
1693
- description: "The wire format of a Solana transaction" ,
1694
- fixedSize: null,
1695
- maxSize: null
1696
- };
1697
- function serialize2(transaction) {
1698
- const compiledTransaction = getCompiledTransaction(transaction);
1699
- return struct([
1600
+ var signaturesDescription = "A compact array of 64-byte, base-64 encoded Ed25519 signatures" ;
1601
+ var transactionDescription = "The wire format of a Solana transaction" ;
1602
+ function getCompiledTransactionEncoder() {
1603
+ return getStructEncoder(
1700
1604
  [
1701
- "signatures",
1702
- array(bytes({ size: 64 }), {
1703
- ...{ description: "A compact array of 64-byte, base-64 encoded Ed25519 signatures" } ,
1704
- size: shortU16()
1705
- })
1605
+ [
1606
+ "signatures",
1607
+ getArrayEncoder(getBytesEncoder({ size: 64 }), {
1608
+ description: signaturesDescription,
1609
+ size: getShortU16Encoder()
1610
+ })
1611
+ ],
1612
+ ["compiledMessage", getCompiledMessageEncoder()]
1613
+ ],
1614
+ {
1615
+ description: transactionDescription
1616
+ }
1617
+ );
1618
+ }
1619
+ function getSignatureDecoder() {
1620
+ return mapDecoder(getBytesDecoder({ size: 64 }), (bytes) => bytes);
1621
+ }
1622
+ function getCompiledTransactionDecoder() {
1623
+ return getStructDecoder(
1624
+ [
1625
+ [
1626
+ "signatures",
1627
+ getArrayDecoder(getSignatureDecoder(), {
1628
+ description: signaturesDescription,
1629
+ size: getShortU16Decoder()
1630
+ })
1631
+ ],
1632
+ ["compiledMessage", getCompiledMessageDecoder()]
1706
1633
  ],
1707
- ["compiledMessage", getCompiledMessageEncoder()]
1708
- ]).serialize(compiledTransaction);
1634
+ {
1635
+ description: transactionDescription
1636
+ }
1637
+ );
1709
1638
  }
1710
1639
  function getTransactionEncoder() {
1711
- return {
1712
- ...BASE_CONFIG3,
1713
- deserialize: getUnimplementedDecoder("CompiledMessage"),
1714
- serialize: serialize2
1715
- };
1640
+ return mapEncoder(getCompiledTransactionEncoder(), getCompiledTransaction);
1641
+ }
1642
+ function getTransactionDecoder(lastValidBlockHeight) {
1643
+ return mapDecoder(
1644
+ getCompiledTransactionDecoder(),
1645
+ (compiledTransaction) => decompileTransaction(compiledTransaction, lastValidBlockHeight)
1646
+ );
1647
+ }
1648
+ function getTransactionCodec(lastValidBlockHeight) {
1649
+ return combineCodec(getTransactionEncoder(), getTransactionDecoder(lastValidBlockHeight));
1716
1650
  }
1717
1651
 
1718
1652
  // ../keys/dist/index.browser.js
@@ -1723,7 +1657,11 @@ this.globalThis.solanaWeb3 = (function (exports) {
1723
1657
  }
1724
1658
 
1725
1659
  // src/signatures.ts
1660
+ var base58Encoder2;
1661
+ var base58Decoder;
1726
1662
  function assertIsTransactionSignature(putativeTransactionSignature) {
1663
+ if (!base58Encoder2)
1664
+ base58Encoder2 = getBase58Encoder();
1727
1665
  try {
1728
1666
  if (
1729
1667
  // Lowest value (64 bytes of zeroes)
@@ -1732,8 +1670,8 @@ this.globalThis.solanaWeb3 = (function (exports) {
1732
1670
  ) {
1733
1671
  throw new Error("Expected input string to decode to a byte array of length 64.");
1734
1672
  }
1735
- const bytes2 = base58.serialize(putativeTransactionSignature);
1736
- const numBytes = bytes2.byteLength;
1673
+ const bytes = base58Encoder2.encode(putativeTransactionSignature);
1674
+ const numBytes = bytes.byteLength;
1737
1675
  if (numBytes !== 64) {
1738
1676
  throw new Error(`Expected input string to decode to a byte array of length 64. Actual length: ${numBytes}`);
1739
1677
  }
@@ -1744,6 +1682,8 @@ this.globalThis.solanaWeb3 = (function (exports) {
1744
1682
  }
1745
1683
  }
1746
1684
  function isTransactionSignature(putativeTransactionSignature) {
1685
+ if (!base58Encoder2)
1686
+ base58Encoder2 = getBase58Encoder();
1747
1687
  if (
1748
1688
  // Lowest value (64 bytes of zeroes)
1749
1689
  putativeTransactionSignature.length < 64 || // Highest value (64 bytes of 255)
@@ -1751,36 +1691,32 @@ this.globalThis.solanaWeb3 = (function (exports) {
1751
1691
  ) {
1752
1692
  return false;
1753
1693
  }
1754
- const bytes2 = base58.serialize(putativeTransactionSignature);
1755
- const numBytes = bytes2.byteLength;
1694
+ const bytes = base58Encoder2.encode(putativeTransactionSignature);
1695
+ const numBytes = bytes.byteLength;
1756
1696
  if (numBytes !== 64) {
1757
1697
  return false;
1758
1698
  }
1759
1699
  return true;
1760
1700
  }
1761
- async function getCompiledMessageSignature(message, secretKey) {
1762
- const wireMessageBytes = getCompiledMessageEncoder().serialize(message);
1763
- const signature = await signBytes(secretKey, wireMessageBytes);
1764
- return signature;
1765
- }
1766
1701
  function getSignatureFromTransaction(transaction) {
1767
- const signature = transaction.signatures[transaction.feePayer];
1768
- if (!signature) {
1702
+ if (!base58Decoder)
1703
+ base58Decoder = getBase58Decoder();
1704
+ const signatureBytes = transaction.signatures[transaction.feePayer];
1705
+ if (!signatureBytes) {
1769
1706
  throw new Error(
1770
1707
  "Could not determine this transaction's signature. Make sure that the transaction has been signed by its fee payer."
1771
1708
  );
1772
1709
  }
1773
- return signature;
1710
+ const transactionSignature2 = base58Decoder.decode(signatureBytes)[0];
1711
+ return transactionSignature2;
1774
1712
  }
1775
1713
  async function signTransaction(keyPairs, transaction) {
1776
1714
  const compiledMessage = compileMessage(transaction);
1777
1715
  const nextSignatures = "signatures" in transaction ? { ...transaction.signatures } : {};
1716
+ const wireMessageBytes = getCompiledMessageEncoder().encode(compiledMessage);
1778
1717
  const publicKeySignaturePairs = await Promise.all(
1779
1718
  keyPairs.map(
1780
- (keyPair) => Promise.all([
1781
- getAddressFromPublicKey(keyPair.publicKey),
1782
- getCompiledMessageSignature(compiledMessage, keyPair.privateKey)
1783
- ])
1719
+ (keyPair) => Promise.all([getAddressFromPublicKey(keyPair.publicKey), signBytes(keyPair.privateKey, wireMessageBytes)])
1784
1720
  )
1785
1721
  );
1786
1722
  for (const [signerPublicKey, signature] of publicKeySignaturePairs) {
@@ -1797,10 +1733,19 @@ this.globalThis.solanaWeb3 = (function (exports) {
1797
1733
  assertIsTransactionSignature(putativeTransactionSignature);
1798
1734
  return putativeTransactionSignature;
1799
1735
  }
1736
+ function assertTransactionIsFullySigned(transaction) {
1737
+ const signerAddressesFromInstructions = transaction.instructions.flatMap((i) => i.accounts?.filter((a) => isSignerRole(a.role)) ?? []).map((a) => a.address);
1738
+ const requiredSigners = /* @__PURE__ */ new Set([transaction.feePayer, ...signerAddressesFromInstructions]);
1739
+ requiredSigners.forEach((address2) => {
1740
+ if (!transaction.signatures[address2]) {
1741
+ throw new Error(`Transaction is missing signature for address \`${address2}\``);
1742
+ }
1743
+ });
1744
+ }
1800
1745
 
1801
1746
  // src/wire-transaction.ts
1802
1747
  function getBase64EncodedWireTransaction(transaction) {
1803
- const wireTransactionBytes = getTransactionEncoder().serialize(transaction);
1748
+ const wireTransactionBytes = getTransactionEncoder().encode(transaction);
1804
1749
  {
1805
1750
  return btoa(String.fromCharCode(...wireTransactionBytes));
1806
1751
  }
@@ -1810,10 +1755,14 @@ this.globalThis.solanaWeb3 = (function (exports) {
1810
1755
  exports.assertIsBlockhash = assertIsBlockhash;
1811
1756
  exports.assertIsDurableNonceTransaction = assertIsDurableNonceTransaction;
1812
1757
  exports.assertIsTransactionSignature = assertIsTransactionSignature;
1758
+ exports.assertTransactionIsFullySigned = assertTransactionIsFullySigned;
1813
1759
  exports.createTransaction = createTransaction;
1814
1760
  exports.getBase64EncodedWireTransaction = getBase64EncodedWireTransaction;
1815
1761
  exports.getSignatureFromTransaction = getSignatureFromTransaction;
1762
+ exports.getTransactionCodec = getTransactionCodec;
1763
+ exports.getTransactionDecoder = getTransactionDecoder;
1816
1764
  exports.getTransactionEncoder = getTransactionEncoder;
1765
+ exports.isAdvanceNonceAccountInstruction = isAdvanceNonceAccountInstruction;
1817
1766
  exports.isTransactionSignature = isTransactionSignature;
1818
1767
  exports.prependTransactionInstruction = prependTransactionInstruction;
1819
1768
  exports.setTransactionFeePayer = setTransactionFeePayer;