@solana/transactions 2.0.0-experimental.b313ba0 → 2.0.0-experimental.b755749
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/LICENSE +1 -1
- package/README.md +314 -5
- package/dist/index.browser.cjs +492 -220
- package/dist/index.browser.cjs.map +1 -1
- package/dist/index.browser.js +490 -224
- package/dist/index.browser.js.map +1 -1
- package/dist/index.development.js +1054 -660
- package/dist/index.development.js.map +1 -1
- package/dist/index.native.js +490 -222
- package/dist/index.native.js.map +1 -1
- package/dist/index.node.cjs +492 -220
- package/dist/index.node.cjs.map +1 -1
- package/dist/index.node.js +490 -222
- package/dist/index.node.js.map +1 -1
- package/dist/index.production.min.js +20 -16
- package/dist/types/compilable-transaction.d.ts +6 -0
- package/dist/types/compile-transaction.d.ts +3 -4
- package/dist/types/decompile-transaction.d.ts +5 -0
- package/dist/types/durable-nonce.d.ts +3 -3
- package/dist/types/index.d.ts +1 -0
- package/dist/types/message.d.ts +1 -5
- package/dist/types/serializers/address-table-lookup.d.ts +5 -3
- package/dist/types/serializers/header.d.ts +4 -2
- package/dist/types/serializers/instruction.d.ts +4 -2
- package/dist/types/serializers/message.d.ts +4 -4
- package/dist/types/serializers/transaction-version.d.ts +4 -4
- package/dist/types/serializers/transaction.d.ts +6 -5
- package/dist/types/signatures.d.ts +3 -2
- package/dist/types/wire-transaction.d.ts +1 -1
- package/package.json +13 -9
- package/dist/types/accounts.d.ts.map +0 -1
- package/dist/types/blockhash.d.ts.map +0 -1
- package/dist/types/compile-address-table-lookups.d.ts.map +0 -1
- package/dist/types/compile-header.d.ts.map +0 -1
- package/dist/types/compile-instructions.d.ts.map +0 -1
- package/dist/types/compile-lifetime-token.d.ts.map +0 -1
- package/dist/types/compile-static-accounts.d.ts.map +0 -1
- package/dist/types/compile-transaction.d.ts.map +0 -1
- package/dist/types/create-transaction.d.ts.map +0 -1
- package/dist/types/durable-nonce.d.ts.map +0 -1
- package/dist/types/fee-payer.d.ts.map +0 -1
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/instructions.d.ts.map +0 -1
- package/dist/types/message.d.ts.map +0 -1
- package/dist/types/serializers/address-table-lookup.d.ts.map +0 -1
- package/dist/types/serializers/header.d.ts.map +0 -1
- package/dist/types/serializers/index.d.ts.map +0 -1
- package/dist/types/serializers/instruction.d.ts.map +0 -1
- package/dist/types/serializers/message.d.ts.map +0 -1
- package/dist/types/serializers/transaction-version.d.ts.map +0 -1
- package/dist/types/serializers/transaction.d.ts.map +0 -1
- package/dist/types/serializers/unimplemented.d.ts +0 -3
- package/dist/types/serializers/unimplemented.d.ts.map +0 -1
- package/dist/types/signatures.d.ts.map +0 -1
- package/dist/types/types.d.ts.map +0 -1
- package/dist/types/unsigned-transaction.d.ts.map +0 -1
- package/dist/types/wire-transaction.d.ts.map +0 -1
|
@@ -2,282 +2,201 @@ this.globalThis = this.globalThis || {};
|
|
|
2
2
|
this.globalThis.solanaWeb3 = (function (exports) {
|
|
3
3
|
'use strict';
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
-
|
|
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 = (
|
|
24
|
-
if (
|
|
25
|
-
return
|
|
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(
|
|
38
|
+
paddedBytes.set(bytes);
|
|
28
39
|
return paddedBytes;
|
|
29
40
|
};
|
|
30
|
-
var fixBytes = (
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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
|
-
|
|
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
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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 (
|
|
66
|
-
|
|
87
|
+
if (decoder.fixedSize !== null) {
|
|
88
|
+
bytes = fixBytes(bytes, decoder.fixedSize);
|
|
67
89
|
}
|
|
68
|
-
const [value] =
|
|
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:
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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
|
-
|
|
104
|
-
|
|
105
|
-
|
|
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
|
-
|
|
133
|
-
|
|
134
|
-
|
|
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
|
-
//
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
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 ===
|
|
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
|
-
|
|
202
|
-
|
|
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
|
-
|
|
143
|
+
assertNumberIsBetweenForCodec(input.name, input.range[0], input.range[1], value);
|
|
205
144
|
}
|
|
206
|
-
const
|
|
207
|
-
input.set(new DataView(
|
|
208
|
-
return new Uint8Array(
|
|
145
|
+
const arrayBuffer = new ArrayBuffer(input.size);
|
|
146
|
+
input.set(new DataView(arrayBuffer), value, codecData.littleEndian);
|
|
147
|
+
return new Uint8Array(arrayBuffer);
|
|
209
148
|
},
|
|
210
|
-
|
|
211
|
-
|
|
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
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
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
|
-
|
|
258
|
-
|
|
259
|
-
|
|
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
|
-
|
|
183
|
+
bytes[ii] = nextSevenBits;
|
|
269
184
|
if (ii > 0) {
|
|
270
|
-
|
|
185
|
+
bytes[ii - 1] |= 128;
|
|
271
186
|
}
|
|
272
187
|
}
|
|
273
|
-
return new Uint8Array(
|
|
188
|
+
return new Uint8Array(bytes);
|
|
274
189
|
},
|
|
275
|
-
|
|
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 =
|
|
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
|
-
//
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
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
|
-
}
|
|
348
|
-
function getSizePrefix(size, realSize) {
|
|
349
|
-
return typeof size === "object" ? size.serialize(realSize) : new Uint8Array();
|
|
350
244
|
}
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
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:
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
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
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
return [[], offset];
|
|
267
|
+
const tailBytes = [];
|
|
268
|
+
while (base10Number > 0n) {
|
|
269
|
+
tailBytes.unshift(Number(base10Number % 256n));
|
|
270
|
+
base10Number /= 256n;
|
|
371
271
|
}
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
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 [
|
|
381
|
-
}
|
|
297
|
+
return [leadingZeroes + tailChars.join(""), rawBytes.length];
|
|
298
|
+
},
|
|
299
|
+
description: `base${base}`,
|
|
300
|
+
fixedSize: null,
|
|
301
|
+
maxSize: null
|
|
382
302
|
};
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
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
|
|
339
|
+
return { ...encoding, description };
|
|
401
340
|
}
|
|
402
341
|
if (typeof size === "number") {
|
|
403
|
-
return
|
|
342
|
+
return fixEncoder(encoding, size, description);
|
|
404
343
|
}
|
|
405
344
|
return {
|
|
406
345
|
description,
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
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
|
-
|
|
415
|
-
|
|
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
|
-
|
|
433
|
-
|
|
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
|
|
363
|
+
return fixDecoder(encoding, size, description);
|
|
445
364
|
}
|
|
446
365
|
return {
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
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
|
|
463
|
-
|
|
464
|
-
|
|
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
375
|
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
376
|
},
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
const [value, newOffset] = serializer.deserialize(bytes2, offset);
|
|
488
|
-
offset = newOffset;
|
|
489
|
-
struct2[key] = value;
|
|
490
|
-
});
|
|
491
|
-
return [struct2, offset];
|
|
492
|
-
}
|
|
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,14 +410,14 @@ 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
|
|
521
|
-
const numBytes =
|
|
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
|
}
|
|
525
|
-
} catch (
|
|
418
|
+
} catch (e2) {
|
|
526
419
|
throw new Error(`\`${putativeBlockhash}\` is not a blockhash`, {
|
|
527
|
-
cause:
|
|
420
|
+
cause: e2
|
|
528
421
|
});
|
|
529
422
|
}
|
|
530
423
|
}
|
|
@@ -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
|
|
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,58 +504,253 @@ 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
|
}
|
|
614
|
-
function
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
507
|
+
function isAdvanceNonceAccountInstructionForNonce(instruction, nonceAccountAddress, nonceAuthorityAddress) {
|
|
508
|
+
return instruction.accounts[0].address === nonceAccountAddress && instruction.accounts[2].address === nonceAuthorityAddress;
|
|
509
|
+
}
|
|
510
|
+
function setTransactionLifetimeUsingDurableNonce({
|
|
511
|
+
nonce,
|
|
512
|
+
nonceAccountAddress,
|
|
513
|
+
nonceAuthorityAddress
|
|
514
|
+
}, 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
|
+
];
|
|
535
|
+
}
|
|
536
|
+
const out = {
|
|
537
|
+
...getUnsignedTransaction(transaction),
|
|
538
|
+
instructions: newInstructions,
|
|
539
|
+
lifetimeConstraint: {
|
|
540
|
+
nonce
|
|
541
|
+
}
|
|
542
|
+
};
|
|
543
|
+
Object.freeze(out);
|
|
544
|
+
return out;
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
// src/fee-payer.ts
|
|
548
|
+
function setTransactionFeePayer(feePayer, transaction) {
|
|
549
|
+
if ("feePayer" in transaction && feePayer === transaction.feePayer) {
|
|
550
|
+
return transaction;
|
|
551
|
+
}
|
|
552
|
+
const out = {
|
|
553
|
+
...getUnsignedTransaction(transaction),
|
|
554
|
+
feePayer
|
|
555
|
+
};
|
|
556
|
+
Object.freeze(out);
|
|
557
|
+
return out;
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
// src/instructions.ts
|
|
561
|
+
function appendTransactionInstruction(instruction, transaction) {
|
|
562
|
+
const out = {
|
|
563
|
+
...getUnsignedTransaction(transaction),
|
|
564
|
+
instructions: [...transaction.instructions, instruction]
|
|
565
|
+
};
|
|
566
|
+
Object.freeze(out);
|
|
567
|
+
return out;
|
|
568
|
+
}
|
|
569
|
+
function prependTransactionInstruction(instruction, transaction) {
|
|
570
|
+
const out = {
|
|
571
|
+
...getUnsignedTransaction(transaction),
|
|
572
|
+
instructions: [instruction, ...transaction.instructions]
|
|
573
|
+
};
|
|
574
|
+
Object.freeze(out);
|
|
575
|
+
return out;
|
|
576
|
+
}
|
|
577
|
+
|
|
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);
|
|
581
|
+
}
|
|
582
|
+
function decodeArrayLikeCodecSize(size, childrenSizes, bytes, offset) {
|
|
583
|
+
if (typeof size === "number") {
|
|
584
|
+
return [size, offset];
|
|
585
|
+
}
|
|
586
|
+
if (typeof size === "object") {
|
|
587
|
+
return size.decode(bytes, offset);
|
|
588
|
+
}
|
|
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];
|
|
601
|
+
}
|
|
602
|
+
throw new Error(`Unrecognized array-like codec size: ${JSON.stringify(size)}`);
|
|
603
|
+
}
|
|
604
|
+
function getArrayLikeCodecSizeDescription(size) {
|
|
605
|
+
return typeof size === "object" ? size.description : `${size}`;
|
|
606
|
+
}
|
|
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;
|
|
614
|
+
}
|
|
615
|
+
function getArrayLikeCodecSizePrefix(size, realSize) {
|
|
616
|
+
return typeof size === "object" ? size.encode(realSize) : new Uint8Array();
|
|
617
|
+
}
|
|
618
|
+
function assertValidNumberOfItemsForCodec(codecDescription, expected, actual) {
|
|
619
|
+
if (expected !== actual) {
|
|
620
|
+
throw new Error(`Expected [${codecDescription}] to have ${expected} items, got ${actual}.`);
|
|
621
|
+
}
|
|
622
|
+
}
|
|
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.');
|
|
626
|
+
}
|
|
627
|
+
return {
|
|
628
|
+
description: description ?? `array(${item.description}; ${getArrayLikeCodecSizeDescription(size)})`,
|
|
629
|
+
fixedSize: getArrayLikeCodecSizeFromChildren(size, [item.fixedSize]),
|
|
630
|
+
maxSize: getArrayLikeCodecSizeFromChildren(size, [item.maxSize])
|
|
631
|
+
};
|
|
632
|
+
}
|
|
633
|
+
function getArrayEncoder(item, options = {}) {
|
|
634
|
+
const size = options.size ?? getU32Encoder();
|
|
635
|
+
return {
|
|
636
|
+
...arrayCodecHelper(item, size, options.description),
|
|
637
|
+
encode: (value) => {
|
|
638
|
+
if (typeof size === "number") {
|
|
639
|
+
assertValidNumberOfItemsForCodec("array", size, value.length);
|
|
640
|
+
}
|
|
641
|
+
return mergeBytes([getArrayLikeCodecSizePrefix(size, value.length), ...value.map((v) => item.encode(v))]);
|
|
642
|
+
}
|
|
643
|
+
};
|
|
644
|
+
}
|
|
645
|
+
function getArrayDecoder(item, options = {}) {
|
|
646
|
+
const size = options.size ?? getU32Decoder();
|
|
647
|
+
return {
|
|
648
|
+
...arrayCodecHelper(item, size, options.description),
|
|
649
|
+
decode: (bytes, offset = 0) => {
|
|
650
|
+
if (typeof size === "object" && bytes.slice(offset).length === 0) {
|
|
651
|
+
return [[], offset];
|
|
652
|
+
}
|
|
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
|
+
}
|
|
663
|
+
};
|
|
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,
|
|
672
|
+
fixedSize: null,
|
|
673
|
+
maxSize: null
|
|
674
|
+
};
|
|
675
|
+
if (size === "variable") {
|
|
676
|
+
return byteEncoder;
|
|
622
677
|
}
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
678
|
+
if (typeof size === "number") {
|
|
679
|
+
return fixEncoder(byteEncoder, size, description);
|
|
680
|
+
}
|
|
681
|
+
return {
|
|
682
|
+
...byteEncoder,
|
|
683
|
+
encode: (value) => {
|
|
684
|
+
const contentBytes = byteEncoder.encode(value);
|
|
685
|
+
const lengthBytes = size.encode(contentBytes.length);
|
|
686
|
+
return mergeBytes([lengthBytes, contentBytes]);
|
|
631
687
|
}
|
|
632
688
|
};
|
|
633
|
-
Object.freeze(out);
|
|
634
|
-
return out;
|
|
635
689
|
}
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
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];
|
|
698
|
+
},
|
|
699
|
+
description,
|
|
700
|
+
fixedSize: null,
|
|
701
|
+
maxSize: null
|
|
702
|
+
};
|
|
703
|
+
if (size === "variable") {
|
|
704
|
+
return byteDecoder;
|
|
641
705
|
}
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
706
|
+
if (typeof size === "number") {
|
|
707
|
+
return fixDecoder(byteDecoder, size, description);
|
|
708
|
+
}
|
|
709
|
+
return {
|
|
710
|
+
...byteDecoder,
|
|
711
|
+
decode: (bytes, offset = 0) => {
|
|
712
|
+
assertByteArrayIsNotEmptyForCodec("bytes", bytes, offset);
|
|
713
|
+
const [lengthBigInt, lengthOffset] = size.decode(bytes, offset);
|
|
714
|
+
const length = Number(lengthBigInt);
|
|
715
|
+
offset = lengthOffset;
|
|
716
|
+
const contentBytes = bytes.slice(offset, offset + length);
|
|
717
|
+
assertByteArrayHasEnoughBytesForCodec("bytes", length, contentBytes);
|
|
718
|
+
const [value, contentOffset] = byteDecoder.decode(contentBytes);
|
|
719
|
+
offset += contentOffset;
|
|
720
|
+
return [value, offset];
|
|
721
|
+
}
|
|
645
722
|
};
|
|
646
|
-
Object.freeze(out);
|
|
647
|
-
return out;
|
|
648
723
|
}
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
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))
|
|
655
730
|
};
|
|
656
|
-
Object.freeze(out);
|
|
657
|
-
return out;
|
|
658
731
|
}
|
|
659
|
-
function
|
|
660
|
-
|
|
661
|
-
...
|
|
662
|
-
|
|
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
|
+
}
|
|
663
753
|
};
|
|
664
|
-
Object.freeze(out);
|
|
665
|
-
return out;
|
|
666
754
|
}
|
|
667
755
|
|
|
668
756
|
// ../assertions/dist/index.browser.js
|
|
@@ -685,10 +773,59 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
685
773
|
throw new Error("No signing implementation could be found");
|
|
686
774
|
}
|
|
687
775
|
}
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
776
|
+
|
|
777
|
+
// ../addresses/dist/index.browser.js
|
|
778
|
+
var memoizedBase58Encoder;
|
|
779
|
+
var memoizedBase58Decoder;
|
|
780
|
+
function getMemoizedBase58Encoder() {
|
|
781
|
+
if (!memoizedBase58Encoder)
|
|
782
|
+
memoizedBase58Encoder = getBase58Encoder();
|
|
783
|
+
return memoizedBase58Encoder;
|
|
784
|
+
}
|
|
785
|
+
function getMemoizedBase58Decoder() {
|
|
786
|
+
if (!memoizedBase58Decoder)
|
|
787
|
+
memoizedBase58Decoder = getBase58Decoder();
|
|
788
|
+
return memoizedBase58Decoder;
|
|
789
|
+
}
|
|
790
|
+
function assertIsAddress(putativeBase58EncodedAddress) {
|
|
791
|
+
try {
|
|
792
|
+
if (
|
|
793
|
+
// Lowest address (32 bytes of zeroes)
|
|
794
|
+
putativeBase58EncodedAddress.length < 32 || // Highest address (32 bytes of 255)
|
|
795
|
+
putativeBase58EncodedAddress.length > 44
|
|
796
|
+
) {
|
|
797
|
+
throw new Error("Expected input string to decode to a byte array of length 32.");
|
|
798
|
+
}
|
|
799
|
+
const base58Encoder3 = getMemoizedBase58Encoder();
|
|
800
|
+
const bytes = base58Encoder3.encode(putativeBase58EncodedAddress);
|
|
801
|
+
const numBytes = bytes.byteLength;
|
|
802
|
+
if (numBytes !== 32) {
|
|
803
|
+
throw new Error(`Expected input string to decode to a byte array of length 32. Actual length: ${numBytes}`);
|
|
804
|
+
}
|
|
805
|
+
} catch (e2) {
|
|
806
|
+
throw new Error(`\`${putativeBase58EncodedAddress}\` is not a base-58 encoded address`, {
|
|
807
|
+
cause: e2
|
|
808
|
+
});
|
|
809
|
+
}
|
|
810
|
+
}
|
|
811
|
+
function address(putativeBase58EncodedAddress) {
|
|
812
|
+
assertIsAddress(putativeBase58EncodedAddress);
|
|
813
|
+
return putativeBase58EncodedAddress;
|
|
814
|
+
}
|
|
815
|
+
function getAddressEncoder(config) {
|
|
816
|
+
return mapEncoder(
|
|
817
|
+
getStringEncoder({
|
|
818
|
+
description: config?.description ?? "Base58EncodedAddress",
|
|
819
|
+
encoding: getMemoizedBase58Encoder(),
|
|
820
|
+
size: 32
|
|
821
|
+
}),
|
|
822
|
+
(putativeAddress) => address(putativeAddress)
|
|
823
|
+
);
|
|
824
|
+
}
|
|
825
|
+
function getAddressDecoder(config) {
|
|
826
|
+
return getStringDecoder({
|
|
827
|
+
description: config?.description ?? "Base58EncodedAddress",
|
|
828
|
+
encoding: getMemoizedBase58Decoder(),
|
|
692
829
|
size: 32
|
|
693
830
|
});
|
|
694
831
|
}
|
|
@@ -708,13 +845,13 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
708
845
|
throw new Error("The `CryptoKey` must be an `Ed25519` public key");
|
|
709
846
|
}
|
|
710
847
|
const publicKeyBytes = await crypto.subtle.exportKey("raw", publicKey);
|
|
711
|
-
const [base58EncodedAddress] =
|
|
848
|
+
const [base58EncodedAddress] = getAddressDecoder().decode(new Uint8Array(publicKeyBytes));
|
|
712
849
|
return base58EncodedAddress;
|
|
713
850
|
}
|
|
714
851
|
|
|
715
852
|
// src/accounts.ts
|
|
716
|
-
function upsert(addressMap,
|
|
717
|
-
addressMap[
|
|
853
|
+
function upsert(addressMap, address2, update) {
|
|
854
|
+
addressMap[address2] = update(addressMap[address2] ?? { role: AccountRole.READONLY });
|
|
718
855
|
}
|
|
719
856
|
var TYPE = Symbol("AddressMapTypeProperty");
|
|
720
857
|
function getAddressMapFromInstructions(feePayer, instructions) {
|
|
@@ -877,8 +1014,8 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
877
1014
|
} else {
|
|
878
1015
|
return addressComparator(leftAddress, rightAddress);
|
|
879
1016
|
}
|
|
880
|
-
}).map(([
|
|
881
|
-
address,
|
|
1017
|
+
}).map(([address2, addressMeta]) => ({
|
|
1018
|
+
address: address2,
|
|
882
1019
|
...addressMeta
|
|
883
1020
|
}));
|
|
884
1021
|
return orderedAccounts;
|
|
@@ -947,7 +1084,7 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
947
1084
|
return instructions.map(({ accounts, data, programAddress }) => {
|
|
948
1085
|
return {
|
|
949
1086
|
programAddressIndex: accountIndex[programAddress],
|
|
950
|
-
...accounts ? { accountIndices: accounts.map(({ address }) => accountIndex[
|
|
1087
|
+
...accounts ? { accountIndices: accounts.map(({ address: address2 }) => accountIndex[address2]) } : null,
|
|
951
1088
|
...data ? { data } : null
|
|
952
1089
|
};
|
|
953
1090
|
});
|
|
@@ -965,7 +1102,7 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
965
1102
|
function getCompiledStaticAccounts(orderedAccounts) {
|
|
966
1103
|
const firstLookupTableAccountIndex = orderedAccounts.findIndex((account) => "lookupTableAddress" in account);
|
|
967
1104
|
const orderedStaticAccounts = firstLookupTableAccountIndex === -1 ? orderedAccounts : orderedAccounts.slice(0, firstLookupTableAccountIndex);
|
|
968
|
-
return orderedStaticAccounts.map(({ address }) =>
|
|
1105
|
+
return orderedStaticAccounts.map(({ address: address2 }) => address2);
|
|
969
1106
|
}
|
|
970
1107
|
|
|
971
1108
|
// src/message.ts
|
|
@@ -1000,145 +1137,302 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
1000
1137
|
};
|
|
1001
1138
|
}
|
|
1002
1139
|
|
|
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;
|
|
1189
|
+
return {
|
|
1190
|
+
programAddress,
|
|
1191
|
+
...accounts && accounts.length ? { accounts } : {},
|
|
1192
|
+
...data && data.length ? { data } : {}
|
|
1193
|
+
};
|
|
1194
|
+
}
|
|
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
|
+
|
|
1003
1257
|
// src/serializers/address-table-lookup.ts
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
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(
|
|
1007
1266
|
[
|
|
1008
|
-
"lookupTableAddress",
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
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
|
+
]
|
|
1014
1282
|
],
|
|
1283
|
+
{ description: addressTableLookupDescription }
|
|
1284
|
+
);
|
|
1285
|
+
}
|
|
1286
|
+
return memoizedAddressTableLookupEncoder;
|
|
1287
|
+
}
|
|
1288
|
+
var memoizedAddressTableLookupDecoder;
|
|
1289
|
+
function getAddressTableLookupDecoder() {
|
|
1290
|
+
if (!memoizedAddressTableLookupDecoder) {
|
|
1291
|
+
memoizedAddressTableLookupDecoder = getStructDecoder(
|
|
1015
1292
|
[
|
|
1016
|
-
"
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
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
|
+
]
|
|
1023
1308
|
],
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1309
|
+
{ description: addressTableLookupDescription }
|
|
1310
|
+
);
|
|
1311
|
+
}
|
|
1312
|
+
return memoizedAddressTableLookupDecoder;
|
|
1313
|
+
}
|
|
1314
|
+
|
|
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();
|
|
1324
|
+
return {
|
|
1325
|
+
...encoder,
|
|
1326
|
+
description: description ?? encoder.description
|
|
1327
|
+
};
|
|
1328
|
+
}
|
|
1329
|
+
var memoizedU8Decoder;
|
|
1330
|
+
function getMemoizedU8Decoder() {
|
|
1331
|
+
if (!memoizedU8Decoder)
|
|
1332
|
+
memoizedU8Decoder = getU8Decoder();
|
|
1333
|
+
return memoizedU8Decoder;
|
|
1334
|
+
}
|
|
1335
|
+
function getMemoizedU8DecoderDescription(description) {
|
|
1336
|
+
const decoder = getMemoizedU8Decoder();
|
|
1337
|
+
return {
|
|
1338
|
+
...decoder,
|
|
1339
|
+
description: description ?? decoder.description
|
|
1340
|
+
};
|
|
1341
|
+
}
|
|
1342
|
+
var numSignerAccountsDescription = "The expected number of addresses in the static address list belonging to accounts that are required to sign this transaction" ;
|
|
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" ;
|
|
1344
|
+
var numReadonlyNonSignerAccountsDescription = "The expected number of addresses in the static address list belonging to accounts that are neither signers, nor writable" ;
|
|
1345
|
+
var messageHeaderDescription = "The transaction message header containing counts of the signer, readonly-signer, and readonly-nonsigner account addresses" ;
|
|
1346
|
+
function getMessageHeaderEncoder() {
|
|
1347
|
+
return getStructEncoder(
|
|
1348
|
+
[
|
|
1349
|
+
["numSignerAccounts", getMemoizedU8EncoderDescription(numSignerAccountsDescription)],
|
|
1350
|
+
["numReadonlySignerAccounts", getMemoizedU8EncoderDescription(numReadonlySignerAccountsDescription)],
|
|
1351
|
+
["numReadonlyNonSignerAccounts", getMemoizedU8EncoderDescription(numReadonlyNonSignerAccountsDescription)]
|
|
1033
1352
|
],
|
|
1034
1353
|
{
|
|
1035
|
-
description:
|
|
1036
|
-
}
|
|
1354
|
+
description: messageHeaderDescription
|
|
1355
|
+
}
|
|
1037
1356
|
);
|
|
1038
1357
|
}
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
function getMessageHeaderCodec() {
|
|
1042
|
-
return struct(
|
|
1358
|
+
function getMessageHeaderDecoder() {
|
|
1359
|
+
return getStructDecoder(
|
|
1043
1360
|
[
|
|
1044
|
-
[
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
{
|
|
1048
|
-
description: "The expected number of addresses in the static address list belonging to accounts that are required to sign this transaction"
|
|
1049
|
-
}
|
|
1050
|
-
)
|
|
1051
|
-
],
|
|
1052
|
-
[
|
|
1053
|
-
"numReadonlySignerAccounts",
|
|
1054
|
-
u8(
|
|
1055
|
-
{
|
|
1056
|
-
description: "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"
|
|
1057
|
-
}
|
|
1058
|
-
)
|
|
1059
|
-
],
|
|
1060
|
-
[
|
|
1061
|
-
"numReadonlyNonSignerAccounts",
|
|
1062
|
-
u8(
|
|
1063
|
-
{
|
|
1064
|
-
description: "The expected number of addresses in the static address list belonging to accounts that are neither signers, nor writable"
|
|
1065
|
-
}
|
|
1066
|
-
)
|
|
1067
|
-
]
|
|
1361
|
+
["numSignerAccounts", getMemoizedU8DecoderDescription(numSignerAccountsDescription)],
|
|
1362
|
+
["numReadonlySignerAccounts", getMemoizedU8DecoderDescription(numReadonlySignerAccountsDescription)],
|
|
1363
|
+
["numReadonlyNonSignerAccounts", getMemoizedU8DecoderDescription(numReadonlyNonSignerAccountsDescription)]
|
|
1068
1364
|
],
|
|
1069
1365
|
{
|
|
1070
|
-
description:
|
|
1071
|
-
}
|
|
1366
|
+
description: messageHeaderDescription
|
|
1367
|
+
}
|
|
1072
1368
|
);
|
|
1073
1369
|
}
|
|
1074
1370
|
|
|
1075
1371
|
// src/serializers/instruction.ts
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
)
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
)
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
}
|
|
1105
|
-
]
|
|
1106
|
-
]),
|
|
1107
|
-
(value) => {
|
|
1108
|
-
if (value.accountIndices !== void 0 && value.data !== void 0) {
|
|
1109
|
-
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
|
+
};
|
|
1110
1401
|
}
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
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
|
+
};
|
|
1120
1432
|
}
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
...accountIndices.length ? { accountIndices } : null,
|
|
1125
|
-
...data.byteLength ? { data } : null
|
|
1126
|
-
};
|
|
1127
|
-
}
|
|
1128
|
-
);
|
|
1129
|
-
}
|
|
1130
|
-
|
|
1131
|
-
// src/serializers/unimplemented.ts
|
|
1132
|
-
function getError(type, name) {
|
|
1133
|
-
const functionSuffix = name + type[0].toUpperCase() + type.slice(1);
|
|
1134
|
-
return new Error(
|
|
1135
|
-
`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}`
|
|
1136
|
-
);
|
|
1137
|
-
}
|
|
1138
|
-
function getUnimplementedDecoder(name) {
|
|
1139
|
-
return () => {
|
|
1140
|
-
throw getError("decoder", name);
|
|
1141
|
-
};
|
|
1433
|
+
);
|
|
1434
|
+
}
|
|
1435
|
+
return memoizedGetInstructionDecoder;
|
|
1142
1436
|
}
|
|
1143
1437
|
|
|
1144
1438
|
// src/serializers/transaction-version.ts
|
|
@@ -1148,8 +1442,8 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
1148
1442
|
fixedSize: null,
|
|
1149
1443
|
maxSize: 1
|
|
1150
1444
|
};
|
|
1151
|
-
function
|
|
1152
|
-
const firstByte =
|
|
1445
|
+
function decode(bytes, offset = 0) {
|
|
1446
|
+
const firstByte = bytes[offset];
|
|
1153
1447
|
if ((firstByte & VERSION_FLAG_MASK) === 0) {
|
|
1154
1448
|
return ["legacy", offset];
|
|
1155
1449
|
} else {
|
|
@@ -1157,7 +1451,7 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
1157
1451
|
return [version, offset + 1];
|
|
1158
1452
|
}
|
|
1159
1453
|
}
|
|
1160
|
-
function
|
|
1454
|
+
function encode(value) {
|
|
1161
1455
|
if (value === "legacy") {
|
|
1162
1456
|
return new Uint8Array();
|
|
1163
1457
|
}
|
|
@@ -1166,108 +1460,193 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
1166
1460
|
}
|
|
1167
1461
|
return new Uint8Array([value | VERSION_FLAG_MASK]);
|
|
1168
1462
|
}
|
|
1169
|
-
function
|
|
1463
|
+
function getTransactionVersionDecoder() {
|
|
1464
|
+
return {
|
|
1465
|
+
...BASE_CONFIG,
|
|
1466
|
+
decode
|
|
1467
|
+
};
|
|
1468
|
+
}
|
|
1469
|
+
function getTransactionVersionEncoder() {
|
|
1170
1470
|
return {
|
|
1171
1471
|
...BASE_CONFIG,
|
|
1172
|
-
|
|
1173
|
-
serialize
|
|
1472
|
+
encode
|
|
1174
1473
|
};
|
|
1175
1474
|
}
|
|
1176
1475
|
|
|
1177
1476
|
// src/serializers/message.ts
|
|
1178
|
-
var
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
(value)
|
|
1193
|
-
|
|
1194
|
-
return value;
|
|
1195
|
-
}
|
|
1196
|
-
return {
|
|
1197
|
-
...value,
|
|
1198
|
-
addressTableLookups: value.addressTableLookups ?? []
|
|
1199
|
-
};
|
|
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;
|
|
1200
1493
|
}
|
|
1201
|
-
|
|
1202
|
-
|
|
1494
|
+
return {
|
|
1495
|
+
...value,
|
|
1496
|
+
addressTableLookups: value.addressTableLookups ?? []
|
|
1497
|
+
};
|
|
1498
|
+
}
|
|
1499
|
+
);
|
|
1203
1500
|
}
|
|
1204
|
-
function
|
|
1501
|
+
function getPreludeStructEncoderTuple() {
|
|
1205
1502
|
return [
|
|
1206
|
-
["version",
|
|
1207
|
-
["header",
|
|
1503
|
+
["version", getTransactionVersionEncoder()],
|
|
1504
|
+
["header", getMessageHeaderEncoder()],
|
|
1208
1505
|
[
|
|
1209
1506
|
"staticAccounts",
|
|
1210
|
-
|
|
1211
|
-
description:
|
|
1212
|
-
size:
|
|
1507
|
+
getArrayEncoder(getAddressEncoder(), {
|
|
1508
|
+
description: staticAccountsDescription,
|
|
1509
|
+
size: getShortU16Encoder()
|
|
1213
1510
|
})
|
|
1214
1511
|
],
|
|
1215
1512
|
[
|
|
1216
1513
|
"lifetimeToken",
|
|
1217
|
-
|
|
1218
|
-
description:
|
|
1219
|
-
encoding:
|
|
1514
|
+
getStringEncoder({
|
|
1515
|
+
description: lifetimeTokenDescription,
|
|
1516
|
+
encoding: getBase58Encoder(),
|
|
1220
1517
|
size: 32
|
|
1221
1518
|
})
|
|
1222
1519
|
],
|
|
1223
1520
|
[
|
|
1224
1521
|
"instructions",
|
|
1225
|
-
|
|
1226
|
-
description:
|
|
1227
|
-
size:
|
|
1522
|
+
getArrayEncoder(getInstructionEncoder(), {
|
|
1523
|
+
description: instructionsDescription,
|
|
1524
|
+
size: getShortU16Encoder()
|
|
1228
1525
|
})
|
|
1229
1526
|
]
|
|
1230
1527
|
];
|
|
1231
1528
|
}
|
|
1232
|
-
function
|
|
1233
|
-
return
|
|
1234
|
-
|
|
1235
|
-
|
|
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()
|
|
1236
1568
|
});
|
|
1237
1569
|
}
|
|
1570
|
+
var messageDescription = "The wire format of a Solana transaction message" ;
|
|
1238
1571
|
function getCompiledMessageEncoder() {
|
|
1239
1572
|
return {
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
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
|
|
1243
1583
|
};
|
|
1244
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
|
+
}
|
|
1245
1598
|
|
|
1246
1599
|
// src/serializers/transaction.ts
|
|
1247
|
-
var
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
};
|
|
1252
|
-
function serialize3(transaction) {
|
|
1253
|
-
const compiledTransaction = getCompiledTransaction(transaction);
|
|
1254
|
-
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(
|
|
1255
1604
|
[
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
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()]
|
|
1261
1633
|
],
|
|
1262
|
-
|
|
1263
|
-
|
|
1634
|
+
{
|
|
1635
|
+
description: transactionDescription
|
|
1636
|
+
}
|
|
1637
|
+
);
|
|
1264
1638
|
}
|
|
1265
1639
|
function getTransactionEncoder() {
|
|
1266
|
-
return
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
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));
|
|
1271
1650
|
}
|
|
1272
1651
|
|
|
1273
1652
|
// ../keys/dist/index.browser.js
|
|
@@ -1278,7 +1657,11 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
1278
1657
|
}
|
|
1279
1658
|
|
|
1280
1659
|
// src/signatures.ts
|
|
1660
|
+
var base58Encoder2;
|
|
1661
|
+
var base58Decoder;
|
|
1281
1662
|
function assertIsTransactionSignature(putativeTransactionSignature) {
|
|
1663
|
+
if (!base58Encoder2)
|
|
1664
|
+
base58Encoder2 = getBase58Encoder();
|
|
1282
1665
|
try {
|
|
1283
1666
|
if (
|
|
1284
1667
|
// Lowest value (64 bytes of zeroes)
|
|
@@ -1287,18 +1670,20 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
1287
1670
|
) {
|
|
1288
1671
|
throw new Error("Expected input string to decode to a byte array of length 64.");
|
|
1289
1672
|
}
|
|
1290
|
-
const
|
|
1291
|
-
const numBytes =
|
|
1673
|
+
const bytes = base58Encoder2.encode(putativeTransactionSignature);
|
|
1674
|
+
const numBytes = bytes.byteLength;
|
|
1292
1675
|
if (numBytes !== 64) {
|
|
1293
1676
|
throw new Error(`Expected input string to decode to a byte array of length 64. Actual length: ${numBytes}`);
|
|
1294
1677
|
}
|
|
1295
|
-
} catch (
|
|
1678
|
+
} catch (e2) {
|
|
1296
1679
|
throw new Error(`\`${putativeTransactionSignature}\` is not a transaction signature`, {
|
|
1297
|
-
cause:
|
|
1680
|
+
cause: e2
|
|
1298
1681
|
});
|
|
1299
1682
|
}
|
|
1300
1683
|
}
|
|
1301
1684
|
function isTransactionSignature(putativeTransactionSignature) {
|
|
1685
|
+
if (!base58Encoder2)
|
|
1686
|
+
base58Encoder2 = getBase58Encoder();
|
|
1302
1687
|
if (
|
|
1303
1688
|
// Lowest value (64 bytes of zeroes)
|
|
1304
1689
|
putativeTransactionSignature.length < 64 || // Highest value (64 bytes of 255)
|
|
@@ -1306,36 +1691,32 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
1306
1691
|
) {
|
|
1307
1692
|
return false;
|
|
1308
1693
|
}
|
|
1309
|
-
const
|
|
1310
|
-
const numBytes =
|
|
1694
|
+
const bytes = base58Encoder2.encode(putativeTransactionSignature);
|
|
1695
|
+
const numBytes = bytes.byteLength;
|
|
1311
1696
|
if (numBytes !== 64) {
|
|
1312
1697
|
return false;
|
|
1313
1698
|
}
|
|
1314
1699
|
return true;
|
|
1315
1700
|
}
|
|
1316
|
-
async function getCompiledMessageSignature(message, secretKey) {
|
|
1317
|
-
const wireMessageBytes = getCompiledMessageEncoder().serialize(message);
|
|
1318
|
-
const signature = await signBytes(secretKey, wireMessageBytes);
|
|
1319
|
-
return signature;
|
|
1320
|
-
}
|
|
1321
1701
|
function getSignatureFromTransaction(transaction) {
|
|
1322
|
-
|
|
1323
|
-
|
|
1702
|
+
if (!base58Decoder)
|
|
1703
|
+
base58Decoder = getBase58Decoder();
|
|
1704
|
+
const signatureBytes = transaction.signatures[transaction.feePayer];
|
|
1705
|
+
if (!signatureBytes) {
|
|
1324
1706
|
throw new Error(
|
|
1325
1707
|
"Could not determine this transaction's signature. Make sure that the transaction has been signed by its fee payer."
|
|
1326
1708
|
);
|
|
1327
1709
|
}
|
|
1328
|
-
|
|
1710
|
+
const transactionSignature2 = base58Decoder.decode(signatureBytes)[0];
|
|
1711
|
+
return transactionSignature2;
|
|
1329
1712
|
}
|
|
1330
1713
|
async function signTransaction(keyPairs, transaction) {
|
|
1331
1714
|
const compiledMessage = compileMessage(transaction);
|
|
1332
1715
|
const nextSignatures = "signatures" in transaction ? { ...transaction.signatures } : {};
|
|
1716
|
+
const wireMessageBytes = getCompiledMessageEncoder().encode(compiledMessage);
|
|
1333
1717
|
const publicKeySignaturePairs = await Promise.all(
|
|
1334
1718
|
keyPairs.map(
|
|
1335
|
-
(keyPair) => Promise.all([
|
|
1336
|
-
getAddressFromPublicKey(keyPair.publicKey),
|
|
1337
|
-
getCompiledMessageSignature(compiledMessage, keyPair.privateKey)
|
|
1338
|
-
])
|
|
1719
|
+
(keyPair) => Promise.all([getAddressFromPublicKey(keyPair.publicKey), signBytes(keyPair.privateKey, wireMessageBytes)])
|
|
1339
1720
|
)
|
|
1340
1721
|
);
|
|
1341
1722
|
for (const [signerPublicKey, signature] of publicKeySignaturePairs) {
|
|
@@ -1352,10 +1733,19 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
1352
1733
|
assertIsTransactionSignature(putativeTransactionSignature);
|
|
1353
1734
|
return putativeTransactionSignature;
|
|
1354
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
|
+
}
|
|
1355
1745
|
|
|
1356
1746
|
// src/wire-transaction.ts
|
|
1357
1747
|
function getBase64EncodedWireTransaction(transaction) {
|
|
1358
|
-
const wireTransactionBytes = getTransactionEncoder().
|
|
1748
|
+
const wireTransactionBytes = getTransactionEncoder().encode(transaction);
|
|
1359
1749
|
{
|
|
1360
1750
|
return btoa(String.fromCharCode(...wireTransactionBytes));
|
|
1361
1751
|
}
|
|
@@ -1365,10 +1755,14 @@ this.globalThis.solanaWeb3 = (function (exports) {
|
|
|
1365
1755
|
exports.assertIsBlockhash = assertIsBlockhash;
|
|
1366
1756
|
exports.assertIsDurableNonceTransaction = assertIsDurableNonceTransaction;
|
|
1367
1757
|
exports.assertIsTransactionSignature = assertIsTransactionSignature;
|
|
1758
|
+
exports.assertTransactionIsFullySigned = assertTransactionIsFullySigned;
|
|
1368
1759
|
exports.createTransaction = createTransaction;
|
|
1369
1760
|
exports.getBase64EncodedWireTransaction = getBase64EncodedWireTransaction;
|
|
1370
1761
|
exports.getSignatureFromTransaction = getSignatureFromTransaction;
|
|
1762
|
+
exports.getTransactionCodec = getTransactionCodec;
|
|
1763
|
+
exports.getTransactionDecoder = getTransactionDecoder;
|
|
1371
1764
|
exports.getTransactionEncoder = getTransactionEncoder;
|
|
1765
|
+
exports.isAdvanceNonceAccountInstruction = isAdvanceNonceAccountInstruction;
|
|
1372
1766
|
exports.isTransactionSignature = isTransactionSignature;
|
|
1373
1767
|
exports.prependTransactionInstruction = prependTransactionInstruction;
|
|
1374
1768
|
exports.setTransactionFeePayer = setTransactionFeePayer;
|