@mysten/signers 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/dist/cjs/ledger/index.d.ts +2 -0
- package/dist/cjs/ledger/index.js +13 -45
- package/dist/cjs/ledger/index.js.map +3 -3
- package/dist/cjs/ledger/objects.d.ts +5 -0
- package/dist/cjs/ledger/objects.js +60 -0
- package/dist/cjs/ledger/objects.js.map +7 -0
- package/dist/esm/ledger/index.d.ts +2 -0
- package/dist/esm/ledger/index.js +11 -43
- package/dist/esm/ledger/index.js.map +3 -3
- package/dist/esm/ledger/objects.d.ts +5 -0
- package/dist/esm/ledger/objects.js +40 -0
- package/dist/esm/ledger/objects.js.map +7 -0
- package/dist/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/ledger/index.ts +8 -53
- package/src/ledger/objects.ts +56 -0
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,8 @@ import type { SuiClient } from '@mysten/sui/client';
|
|
|
3
3
|
import type { SignatureWithBytes } from '@mysten/sui/cryptography';
|
|
4
4
|
import { Signer } from '@mysten/sui/cryptography';
|
|
5
5
|
import { Ed25519PublicKey } from '@mysten/sui/keypairs/ed25519';
|
|
6
|
+
export { SuiMoveObject } from './bcs.js';
|
|
7
|
+
export { getInputObjects } from './objects.js';
|
|
6
8
|
/**
|
|
7
9
|
* Configuration options for initializing the LedgerSigner.
|
|
8
10
|
*/
|
package/dist/cjs/ledger/index.js
CHANGED
|
@@ -23,19 +23,22 @@ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot
|
|
|
23
23
|
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
24
24
|
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
25
25
|
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
|
|
26
|
-
var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
|
|
27
26
|
var ledger_exports = {};
|
|
28
27
|
__export(ledger_exports, {
|
|
29
|
-
LedgerSigner: () => LedgerSigner
|
|
28
|
+
LedgerSigner: () => LedgerSigner,
|
|
29
|
+
SuiMoveObject: () => import_bcs2.SuiMoveObject,
|
|
30
|
+
getInputObjects: () => import_objects2.getInputObjects
|
|
30
31
|
});
|
|
31
32
|
module.exports = __toCommonJS(ledger_exports);
|
|
32
33
|
var import_cryptography = require("@mysten/sui/cryptography");
|
|
33
34
|
var import_ed25519 = require("@mysten/sui/keypairs/ed25519");
|
|
34
35
|
var import_transactions = require("@mysten/sui/transactions");
|
|
35
36
|
var import_utils = require("@mysten/sui/utils");
|
|
36
|
-
var import_bcs = require("
|
|
37
|
-
var
|
|
38
|
-
var
|
|
37
|
+
var import_bcs = require("@mysten/sui/bcs");
|
|
38
|
+
var import_objects = require("./objects.js");
|
|
39
|
+
var import_bcs2 = require("./bcs.js");
|
|
40
|
+
var import_objects2 = require("./objects.js");
|
|
41
|
+
var _derivationPath, _publicKey, _ledgerClient, _suiClient;
|
|
39
42
|
const _LedgerSigner = class _LedgerSigner extends import_cryptography.Signer {
|
|
40
43
|
/**
|
|
41
44
|
* Creates an instance of LedgerSigner. It's expected to call the static `fromDerivationPath` method to create an instance.
|
|
@@ -46,7 +49,6 @@ const _LedgerSigner = class _LedgerSigner extends import_cryptography.Signer {
|
|
|
46
49
|
*/
|
|
47
50
|
constructor({ publicKey, derivationPath, ledgerClient, suiClient }) {
|
|
48
51
|
super();
|
|
49
|
-
__privateAdd(this, _LedgerSigner_instances);
|
|
50
52
|
__privateAdd(this, _derivationPath);
|
|
51
53
|
__privateAdd(this, _publicKey);
|
|
52
54
|
__privateAdd(this, _ledgerClient);
|
|
@@ -74,7 +76,10 @@ const _LedgerSigner = class _LedgerSigner extends import_cryptography.Signer {
|
|
|
74
76
|
* @returns The signed transaction bytes and signature.
|
|
75
77
|
*/
|
|
76
78
|
async signTransaction(bytes) {
|
|
77
|
-
const transactionOptions = await
|
|
79
|
+
const transactionOptions = await (0, import_objects.getInputObjects)(
|
|
80
|
+
import_transactions.Transaction.from(bytes),
|
|
81
|
+
__privateGet(this, _suiClient)
|
|
82
|
+
).catch(() => ({
|
|
78
83
|
// Fail gracefully so network errors or serialization issues don't break transaction signing:
|
|
79
84
|
bcsObjects: []
|
|
80
85
|
}));
|
|
@@ -100,7 +105,7 @@ const _LedgerSigner = class _LedgerSigner extends import_cryptography.Signer {
|
|
|
100
105
|
async signPersonalMessage(bytes) {
|
|
101
106
|
const intentMessage = (0, import_cryptography.messageWithIntent)(
|
|
102
107
|
"PersonalMessage",
|
|
103
|
-
|
|
108
|
+
import_bcs.bcs.byteVector().serialize(bytes).toBytes()
|
|
104
109
|
);
|
|
105
110
|
const { signature } = await __privateGet(this, _ledgerClient).signTransaction(
|
|
106
111
|
__privateGet(this, _derivationPath),
|
|
@@ -151,42 +156,5 @@ _derivationPath = new WeakMap();
|
|
|
151
156
|
_publicKey = new WeakMap();
|
|
152
157
|
_ledgerClient = new WeakMap();
|
|
153
158
|
_suiClient = new WeakMap();
|
|
154
|
-
_LedgerSigner_instances = new WeakSet();
|
|
155
|
-
getClearSigningOptions_fn = async function(transactionBytes) {
|
|
156
|
-
const transaction = import_transactions.Transaction.from(transactionBytes);
|
|
157
|
-
const data = transaction.getData();
|
|
158
|
-
const gasObjectIds = data.gasData.payment?.map((object) => object.objectId) ?? [];
|
|
159
|
-
const inputObjectIds = data.inputs.map((input) => {
|
|
160
|
-
return input.$kind === "Object" && input.Object.$kind === "ImmOrOwnedObject" ? input.Object.ImmOrOwnedObject.objectId : null;
|
|
161
|
-
}).filter((objectId) => !!objectId);
|
|
162
|
-
const objects = await __privateGet(this, _suiClient).multiGetObjects({
|
|
163
|
-
ids: [...gasObjectIds, ...inputObjectIds],
|
|
164
|
-
options: {
|
|
165
|
-
showBcs: true,
|
|
166
|
-
showPreviousTransaction: true,
|
|
167
|
-
showStorageRebate: true,
|
|
168
|
-
showOwner: true
|
|
169
|
-
}
|
|
170
|
-
});
|
|
171
|
-
const bcsObjects = objects.map((object) => {
|
|
172
|
-
if (object.error || !object.data || object.data.bcs?.dataType !== "moveObject") {
|
|
173
|
-
return null;
|
|
174
|
-
}
|
|
175
|
-
return import_bcs.SuiMoveObject.serialize({
|
|
176
|
-
data: {
|
|
177
|
-
MoveObject: {
|
|
178
|
-
type: object.data.bcs.type,
|
|
179
|
-
hasPublicTransfer: object.data.bcs.hasPublicTransfer,
|
|
180
|
-
version: object.data.bcs.version,
|
|
181
|
-
contents: object.data.bcs.bcsBytes
|
|
182
|
-
}
|
|
183
|
-
},
|
|
184
|
-
owner: object.data.owner,
|
|
185
|
-
previousTransaction: object.data.previousTransaction,
|
|
186
|
-
storageRebate: object.data.storageRebate
|
|
187
|
-
}).toBytes();
|
|
188
|
-
}).filter((bcsBytes) => !!bcsBytes);
|
|
189
|
-
return { bcsObjects };
|
|
190
|
-
};
|
|
191
159
|
let LedgerSigner = _LedgerSigner;
|
|
192
160
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/ledger/index.ts"],
|
|
4
|
-
"sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type SuiLedgerClient from '@mysten/ledgerjs-hw-app-sui';\nimport type { SuiClient } from '@mysten/sui/client';\nimport type { SignatureWithBytes } from '@mysten/sui/cryptography';\nimport { messageWithIntent, Signer, toSerializedSignature } from '@mysten/sui/cryptography';\nimport { Ed25519PublicKey } from '@mysten/sui/keypairs/ed25519';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { toBase64 } from '@mysten/sui/utils';\n\nimport { SuiMoveObject } from './bcs.js';\
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": ["import_bcs"]
|
|
4
|
+
"sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type SuiLedgerClient from '@mysten/ledgerjs-hw-app-sui';\nimport type { SuiClient } from '@mysten/sui/client';\nimport type { SignatureWithBytes } from '@mysten/sui/cryptography';\nimport { messageWithIntent, Signer, toSerializedSignature } from '@mysten/sui/cryptography';\nimport { Ed25519PublicKey } from '@mysten/sui/keypairs/ed25519';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { toBase64 } from '@mysten/sui/utils';\n\nimport { bcs } from '@mysten/sui/bcs';\nimport { getInputObjects } from './objects.js';\n\nexport { SuiMoveObject } from './bcs.js';\nexport { getInputObjects } from './objects.js';\n\n/**\n * Configuration options for initializing the LedgerSigner.\n */\nexport interface LedgerSignerOptions {\n\tpublicKey: Ed25519PublicKey;\n\tderivationPath: string;\n\tledgerClient: SuiLedgerClient;\n\tsuiClient: SuiClient;\n}\n\n/**\n * Ledger integrates with the Sui blockchain to provide signing capabilities using Ledger devices.\n */\nexport class LedgerSigner extends Signer {\n\t#derivationPath: string;\n\t#publicKey: Ed25519PublicKey;\n\t#ledgerClient: SuiLedgerClient;\n\t#suiClient: SuiClient;\n\n\t/**\n\t * Creates an instance of LedgerSigner. It's expected to call the static `fromDerivationPath` method to create an instance.\n\t * @example\n\t * ```\n\t * const signer = await LedgerSigner.fromDerivationPath(derivationPath, options);\n\t * ```\n\t */\n\tconstructor({ publicKey, derivationPath, ledgerClient, suiClient }: LedgerSignerOptions) {\n\t\tsuper();\n\t\tthis.#publicKey = publicKey;\n\t\tthis.#derivationPath = derivationPath;\n\t\tthis.#ledgerClient = ledgerClient;\n\t\tthis.#suiClient = suiClient;\n\t}\n\n\t/**\n\t * Retrieves the key scheme used by this signer.\n\t */\n\toverride getKeyScheme() {\n\t\treturn 'ED25519' as const;\n\t}\n\n\t/**\n\t * Retrieves the public key associated with this signer.\n\t * @returns The Ed25519PublicKey instance.\n\t */\n\toverride getPublicKey() {\n\t\treturn this.#publicKey;\n\t}\n\n\t/**\n\t * Signs the provided transaction bytes.\n\t * @returns The signed transaction bytes and signature.\n\t */\n\toverride async signTransaction(bytes: Uint8Array): Promise<SignatureWithBytes> {\n\t\tconst transactionOptions = await getInputObjects(\n\t\t\tTransaction.from(bytes),\n\t\t\tthis.#suiClient,\n\t\t).catch(() => ({\n\t\t\t// Fail gracefully so network errors or serialization issues don't break transaction signing:\n\t\t\tbcsObjects: [],\n\t\t}));\n\n\t\tconst intentMessage = messageWithIntent('TransactionData', bytes);\n\t\tconst { signature } = await this.#ledgerClient.signTransaction(\n\t\t\tthis.#derivationPath,\n\t\t\tintentMessage,\n\t\t\ttransactionOptions,\n\t\t);\n\n\t\treturn {\n\t\t\tbytes: toBase64(bytes),\n\t\t\tsignature: toSerializedSignature({\n\t\t\t\tsignature,\n\t\t\t\tsignatureScheme: this.getKeyScheme(),\n\t\t\t\tpublicKey: this.#publicKey,\n\t\t\t}),\n\t\t};\n\t}\n\n\t/**\n\t * Signs the provided personal message.\n\t * @returns The signed message bytes and signature.\n\t */\n\toverride async signPersonalMessage(bytes: Uint8Array): Promise<SignatureWithBytes> {\n\t\tconst intentMessage = messageWithIntent(\n\t\t\t'PersonalMessage',\n\t\t\tbcs.byteVector().serialize(bytes).toBytes(),\n\t\t);\n\t\tconst { signature } = await this.#ledgerClient.signTransaction(\n\t\t\tthis.#derivationPath,\n\t\t\tintentMessage,\n\t\t);\n\n\t\treturn {\n\t\t\tbytes: toBase64(bytes),\n\t\t\tsignature: toSerializedSignature({\n\t\t\t\tsignature,\n\t\t\t\tsignatureScheme: this.getKeyScheme(),\n\t\t\t\tpublicKey: this.#publicKey,\n\t\t\t}),\n\t\t};\n\t}\n\n\t/**\n\t * Prepares the signer by fetching and setting the public key from a Ledger device.\n\t * It is recommended to initialize an `LedgerSigner` instance using this function.\n\t * @returns A promise that resolves once a `LedgerSigner` instance is prepared (public key is set).\n\t */\n\tstatic async fromDerivationPath(\n\t\tderivationPath: string,\n\t\tledgerClient: SuiLedgerClient,\n\t\tsuiClient: SuiClient,\n\t) {\n\t\tconst { publicKey } = await ledgerClient.getPublicKey(derivationPath);\n\t\tif (!publicKey) {\n\t\t\tthrow new Error('Failed to get public key from Ledger.');\n\t\t}\n\n\t\treturn new LedgerSigner({\n\t\t\tderivationPath,\n\t\t\tpublicKey: new Ed25519PublicKey(publicKey),\n\t\t\tledgerClient,\n\t\t\tsuiClient,\n\t\t});\n\t}\n\n\t/**\n\t * Generic signing is not supported by Ledger.\n\t * @throws Always throws an error indicating generic signing is unsupported.\n\t */\n\toverride sign(): never {\n\t\tthrow new Error('Ledger Signer does not support generic signing.');\n\t}\n\n\t/**\n\t * Generic signing is not supported by Ledger.\n\t * @throws Always throws an error indicating generic signing is unsupported.\n\t */\n\toverride signWithIntent(): never {\n\t\tthrow new Error('Ledger Signer does not support generic signing.');\n\t}\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,0BAAiE;AACjE,qBAAiC;AACjC,0BAA4B;AAC5B,mBAAyB;AAEzB,iBAAoB;AACpB,qBAAgC;AAEhC,IAAAA,cAA8B;AAC9B,IAAAC,kBAAgC;AAfhC;AA8BO,MAAM,gBAAN,MAAM,sBAAqB,2BAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaxC,YAAY,EAAE,WAAW,gBAAgB,cAAc,UAAU,GAAwB;AACxF,UAAM;AAbP;AACA;AACA;AACA;AAWC,uBAAK,YAAa;AAClB,uBAAK,iBAAkB;AACvB,uBAAK,eAAgB;AACrB,uBAAK,YAAa;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKS,eAAe;AACvB,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMS,eAAe;AACvB,WAAO,mBAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAe,gBAAgB,OAAgD;AAC9E,UAAM,qBAAqB,UAAM;AAAA,MAChC,gCAAY,KAAK,KAAK;AAAA,MACtB,mBAAK;AAAA,IACN,EAAE,MAAM,OAAO;AAAA;AAAA,MAEd,YAAY,CAAC;AAAA,IACd,EAAE;AAEF,UAAM,oBAAgB,uCAAkB,mBAAmB,KAAK;AAChE,UAAM,EAAE,UAAU,IAAI,MAAM,mBAAK,eAAc;AAAA,MAC9C,mBAAK;AAAA,MACL;AAAA,MACA;AAAA,IACD;AAEA,WAAO;AAAA,MACN,WAAO,uBAAS,KAAK;AAAA,MACrB,eAAW,2CAAsB;AAAA,QAChC;AAAA,QACA,iBAAiB,KAAK,aAAa;AAAA,QACnC,WAAW,mBAAK;AAAA,MACjB,CAAC;AAAA,IACF;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAe,oBAAoB,OAAgD;AAClF,UAAM,oBAAgB;AAAA,MACrB;AAAA,MACA,eAAI,WAAW,EAAE,UAAU,KAAK,EAAE,QAAQ;AAAA,IAC3C;AACA,UAAM,EAAE,UAAU,IAAI,MAAM,mBAAK,eAAc;AAAA,MAC9C,mBAAK;AAAA,MACL;AAAA,IACD;AAEA,WAAO;AAAA,MACN,WAAO,uBAAS,KAAK;AAAA,MACrB,eAAW,2CAAsB;AAAA,QAChC;AAAA,QACA,iBAAiB,KAAK,aAAa;AAAA,QACnC,WAAW,mBAAK;AAAA,MACjB,CAAC;AAAA,IACF;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAa,mBACZ,gBACA,cACA,WACC;AACD,UAAM,EAAE,UAAU,IAAI,MAAM,aAAa,aAAa,cAAc;AACpE,QAAI,CAAC,WAAW;AACf,YAAM,IAAI,MAAM,uCAAuC;AAAA,IACxD;AAEA,WAAO,IAAI,cAAa;AAAA,MACvB;AAAA,MACA,WAAW,IAAI,gCAAiB,SAAS;AAAA,MACzC;AAAA,MACA;AAAA,IACD,CAAC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMS,OAAc;AACtB,UAAM,IAAI,MAAM,iDAAiD;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMS,iBAAwB;AAChC,UAAM,IAAI,MAAM,iDAAiD;AAAA,EAClE;AACD;AA/HC;AACA;AACA;AACA;AAJM,IAAM,eAAN;",
|
|
6
|
+
"names": ["import_bcs", "import_objects"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var objects_exports = {};
|
|
20
|
+
__export(objects_exports, {
|
|
21
|
+
getInputObjects: () => getInputObjects
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(objects_exports);
|
|
24
|
+
var import_bcs = require("./bcs.js");
|
|
25
|
+
const getInputObjects = async (transaction, client) => {
|
|
26
|
+
const data = transaction.getData();
|
|
27
|
+
const gasObjectIds = data.gasData.payment?.map((object) => object.objectId) ?? [];
|
|
28
|
+
const inputObjectIds = data.inputs.map((input) => {
|
|
29
|
+
return input.$kind === "Object" && input.Object.$kind === "ImmOrOwnedObject" ? input.Object.ImmOrOwnedObject.objectId : null;
|
|
30
|
+
}).filter((objectId) => !!objectId);
|
|
31
|
+
const objects = await client.multiGetObjects({
|
|
32
|
+
ids: [...gasObjectIds, ...inputObjectIds],
|
|
33
|
+
options: {
|
|
34
|
+
showBcs: true,
|
|
35
|
+
showPreviousTransaction: true,
|
|
36
|
+
showStorageRebate: true,
|
|
37
|
+
showOwner: true
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
const bcsObjects = objects.map((object) => {
|
|
41
|
+
if (object.error || !object.data || object.data.bcs?.dataType !== "moveObject") {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
return import_bcs.SuiMoveObject.serialize({
|
|
45
|
+
data: {
|
|
46
|
+
MoveObject: {
|
|
47
|
+
type: object.data.bcs.type,
|
|
48
|
+
hasPublicTransfer: object.data.bcs.hasPublicTransfer,
|
|
49
|
+
version: object.data.bcs.version,
|
|
50
|
+
contents: object.data.bcs.bcsBytes
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
owner: object.data.owner,
|
|
54
|
+
previousTransaction: object.data.previousTransaction,
|
|
55
|
+
storageRebate: object.data.storageRebate
|
|
56
|
+
}).toBytes();
|
|
57
|
+
}).filter((bcsBytes) => !!bcsBytes);
|
|
58
|
+
return { bcsObjects };
|
|
59
|
+
};
|
|
60
|
+
//# sourceMappingURL=objects.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/ledger/objects.ts"],
|
|
4
|
+
"sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { Transaction } from '@mysten/sui/transactions';\nimport type { SuiClient } from '@mysten/sui/client';\nimport { SuiMoveObject } from './bcs.js';\n\nexport const getInputObjects = async (transaction: Transaction, client: SuiClient) => {\n\tconst data = transaction.getData();\n\n\tconst gasObjectIds = data.gasData.payment?.map((object) => object.objectId) ?? [];\n\tconst inputObjectIds = data.inputs\n\t\t.map((input) => {\n\t\t\treturn input.$kind === 'Object' && input.Object.$kind === 'ImmOrOwnedObject'\n\t\t\t\t? input.Object.ImmOrOwnedObject.objectId\n\t\t\t\t: null;\n\t\t})\n\t\t.filter((objectId): objectId is string => !!objectId);\n\n\tconst objects = await client.multiGetObjects({\n\t\tids: [...gasObjectIds, ...inputObjectIds],\n\t\toptions: {\n\t\t\tshowBcs: true,\n\t\t\tshowPreviousTransaction: true,\n\t\t\tshowStorageRebate: true,\n\t\t\tshowOwner: true,\n\t\t},\n\t});\n\n\t// NOTE: We should probably get rid of this manual serialization logic in favor of using the\n\t// already serialized object bytes from the GraphQL API once there is more mainstream support\n\t// for it + we can enforce the transport type on the Sui client.\n\tconst bcsObjects = objects\n\t\t.map((object) => {\n\t\t\tif (object.error || !object.data || object.data.bcs?.dataType !== 'moveObject') {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn SuiMoveObject.serialize({\n\t\t\t\tdata: {\n\t\t\t\t\tMoveObject: {\n\t\t\t\t\t\ttype: object.data.bcs.type,\n\t\t\t\t\t\thasPublicTransfer: object.data.bcs.hasPublicTransfer,\n\t\t\t\t\t\tversion: object.data.bcs.version,\n\t\t\t\t\t\tcontents: object.data.bcs.bcsBytes,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\towner: object.data.owner!,\n\t\t\t\tpreviousTransaction: object.data.previousTransaction!,\n\t\t\t\tstorageRebate: object.data.storageRebate!,\n\t\t\t}).toBytes();\n\t\t})\n\t\t.filter((bcsBytes): bcsBytes is Uint8Array<ArrayBuffer> => !!bcsBytes);\n\n\treturn { bcsObjects };\n};\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA,iBAA8B;AAEvB,MAAM,kBAAkB,OAAO,aAA0B,WAAsB;AACrF,QAAM,OAAO,YAAY,QAAQ;AAEjC,QAAM,eAAe,KAAK,QAAQ,SAAS,IAAI,CAAC,WAAW,OAAO,QAAQ,KAAK,CAAC;AAChF,QAAM,iBAAiB,KAAK,OAC1B,IAAI,CAAC,UAAU;AACf,WAAO,MAAM,UAAU,YAAY,MAAM,OAAO,UAAU,qBACvD,MAAM,OAAO,iBAAiB,WAC9B;AAAA,EACJ,CAAC,EACA,OAAO,CAAC,aAAiC,CAAC,CAAC,QAAQ;AAErD,QAAM,UAAU,MAAM,OAAO,gBAAgB;AAAA,IAC5C,KAAK,CAAC,GAAG,cAAc,GAAG,cAAc;AAAA,IACxC,SAAS;AAAA,MACR,SAAS;AAAA,MACT,yBAAyB;AAAA,MACzB,mBAAmB;AAAA,MACnB,WAAW;AAAA,IACZ;AAAA,EACD,CAAC;AAKD,QAAM,aAAa,QACjB,IAAI,CAAC,WAAW;AAChB,QAAI,OAAO,SAAS,CAAC,OAAO,QAAQ,OAAO,KAAK,KAAK,aAAa,cAAc;AAC/E,aAAO;AAAA,IACR;AAEA,WAAO,yBAAc,UAAU;AAAA,MAC9B,MAAM;AAAA,QACL,YAAY;AAAA,UACX,MAAM,OAAO,KAAK,IAAI;AAAA,UACtB,mBAAmB,OAAO,KAAK,IAAI;AAAA,UACnC,SAAS,OAAO,KAAK,IAAI;AAAA,UACzB,UAAU,OAAO,KAAK,IAAI;AAAA,QAC3B;AAAA,MACD;AAAA,MACA,OAAO,OAAO,KAAK;AAAA,MACnB,qBAAqB,OAAO,KAAK;AAAA,MACjC,eAAe,OAAO,KAAK;AAAA,IAC5B,CAAC,EAAE,QAAQ;AAAA,EACZ,CAAC,EACA,OAAO,CAAC,aAAkD,CAAC,CAAC,QAAQ;AAEtE,SAAO,EAAE,WAAW;AACrB;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -3,6 +3,8 @@ import type { SuiClient } from '@mysten/sui/client';
|
|
|
3
3
|
import type { SignatureWithBytes } from '@mysten/sui/cryptography';
|
|
4
4
|
import { Signer } from '@mysten/sui/cryptography';
|
|
5
5
|
import { Ed25519PublicKey } from '@mysten/sui/keypairs/ed25519';
|
|
6
|
+
export { SuiMoveObject } from './bcs.js';
|
|
7
|
+
export { getInputObjects } from './objects.js';
|
|
6
8
|
/**
|
|
7
9
|
* Configuration options for initializing the LedgerSigner.
|
|
8
10
|
*/
|
package/dist/esm/ledger/index.js
CHANGED
|
@@ -5,14 +5,15 @@ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot
|
|
|
5
5
|
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
6
6
|
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
7
7
|
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
|
|
8
|
-
var
|
|
9
|
-
var _derivationPath, _publicKey, _ledgerClient, _suiClient, _LedgerSigner_instances, getClearSigningOptions_fn;
|
|
8
|
+
var _derivationPath, _publicKey, _ledgerClient, _suiClient;
|
|
10
9
|
import { messageWithIntent, Signer, toSerializedSignature } from "@mysten/sui/cryptography";
|
|
11
10
|
import { Ed25519PublicKey } from "@mysten/sui/keypairs/ed25519";
|
|
12
11
|
import { Transaction } from "@mysten/sui/transactions";
|
|
13
12
|
import { toBase64 } from "@mysten/sui/utils";
|
|
14
|
-
import { SuiMoveObject } from "./bcs.js";
|
|
15
13
|
import { bcs } from "@mysten/sui/bcs";
|
|
14
|
+
import { getInputObjects } from "./objects.js";
|
|
15
|
+
import { SuiMoveObject } from "./bcs.js";
|
|
16
|
+
import { getInputObjects as getInputObjects2 } from "./objects.js";
|
|
16
17
|
const _LedgerSigner = class _LedgerSigner extends Signer {
|
|
17
18
|
/**
|
|
18
19
|
* Creates an instance of LedgerSigner. It's expected to call the static `fromDerivationPath` method to create an instance.
|
|
@@ -23,7 +24,6 @@ const _LedgerSigner = class _LedgerSigner extends Signer {
|
|
|
23
24
|
*/
|
|
24
25
|
constructor({ publicKey, derivationPath, ledgerClient, suiClient }) {
|
|
25
26
|
super();
|
|
26
|
-
__privateAdd(this, _LedgerSigner_instances);
|
|
27
27
|
__privateAdd(this, _derivationPath);
|
|
28
28
|
__privateAdd(this, _publicKey);
|
|
29
29
|
__privateAdd(this, _ledgerClient);
|
|
@@ -51,7 +51,10 @@ const _LedgerSigner = class _LedgerSigner extends Signer {
|
|
|
51
51
|
* @returns The signed transaction bytes and signature.
|
|
52
52
|
*/
|
|
53
53
|
async signTransaction(bytes) {
|
|
54
|
-
const transactionOptions = await
|
|
54
|
+
const transactionOptions = await getInputObjects(
|
|
55
|
+
Transaction.from(bytes),
|
|
56
|
+
__privateGet(this, _suiClient)
|
|
57
|
+
).catch(() => ({
|
|
55
58
|
// Fail gracefully so network errors or serialization issues don't break transaction signing:
|
|
56
59
|
bcsObjects: []
|
|
57
60
|
}));
|
|
@@ -128,45 +131,10 @@ _derivationPath = new WeakMap();
|
|
|
128
131
|
_publicKey = new WeakMap();
|
|
129
132
|
_ledgerClient = new WeakMap();
|
|
130
133
|
_suiClient = new WeakMap();
|
|
131
|
-
_LedgerSigner_instances = new WeakSet();
|
|
132
|
-
getClearSigningOptions_fn = async function(transactionBytes) {
|
|
133
|
-
const transaction = Transaction.from(transactionBytes);
|
|
134
|
-
const data = transaction.getData();
|
|
135
|
-
const gasObjectIds = data.gasData.payment?.map((object) => object.objectId) ?? [];
|
|
136
|
-
const inputObjectIds = data.inputs.map((input) => {
|
|
137
|
-
return input.$kind === "Object" && input.Object.$kind === "ImmOrOwnedObject" ? input.Object.ImmOrOwnedObject.objectId : null;
|
|
138
|
-
}).filter((objectId) => !!objectId);
|
|
139
|
-
const objects = await __privateGet(this, _suiClient).multiGetObjects({
|
|
140
|
-
ids: [...gasObjectIds, ...inputObjectIds],
|
|
141
|
-
options: {
|
|
142
|
-
showBcs: true,
|
|
143
|
-
showPreviousTransaction: true,
|
|
144
|
-
showStorageRebate: true,
|
|
145
|
-
showOwner: true
|
|
146
|
-
}
|
|
147
|
-
});
|
|
148
|
-
const bcsObjects = objects.map((object) => {
|
|
149
|
-
if (object.error || !object.data || object.data.bcs?.dataType !== "moveObject") {
|
|
150
|
-
return null;
|
|
151
|
-
}
|
|
152
|
-
return SuiMoveObject.serialize({
|
|
153
|
-
data: {
|
|
154
|
-
MoveObject: {
|
|
155
|
-
type: object.data.bcs.type,
|
|
156
|
-
hasPublicTransfer: object.data.bcs.hasPublicTransfer,
|
|
157
|
-
version: object.data.bcs.version,
|
|
158
|
-
contents: object.data.bcs.bcsBytes
|
|
159
|
-
}
|
|
160
|
-
},
|
|
161
|
-
owner: object.data.owner,
|
|
162
|
-
previousTransaction: object.data.previousTransaction,
|
|
163
|
-
storageRebate: object.data.storageRebate
|
|
164
|
-
}).toBytes();
|
|
165
|
-
}).filter((bcsBytes) => !!bcsBytes);
|
|
166
|
-
return { bcsObjects };
|
|
167
|
-
};
|
|
168
134
|
let LedgerSigner = _LedgerSigner;
|
|
169
135
|
export {
|
|
170
|
-
LedgerSigner
|
|
136
|
+
LedgerSigner,
|
|
137
|
+
SuiMoveObject,
|
|
138
|
+
getInputObjects2 as getInputObjects
|
|
171
139
|
};
|
|
172
140
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/ledger/index.ts"],
|
|
4
|
-
"sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type SuiLedgerClient from '@mysten/ledgerjs-hw-app-sui';\nimport type { SuiClient } from '@mysten/sui/client';\nimport type { SignatureWithBytes } from '@mysten/sui/cryptography';\nimport { messageWithIntent, Signer, toSerializedSignature } from '@mysten/sui/cryptography';\nimport { Ed25519PublicKey } from '@mysten/sui/keypairs/ed25519';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { toBase64 } from '@mysten/sui/utils';\n\nimport { SuiMoveObject } from './bcs.js';\
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": []
|
|
4
|
+
"sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type SuiLedgerClient from '@mysten/ledgerjs-hw-app-sui';\nimport type { SuiClient } from '@mysten/sui/client';\nimport type { SignatureWithBytes } from '@mysten/sui/cryptography';\nimport { messageWithIntent, Signer, toSerializedSignature } from '@mysten/sui/cryptography';\nimport { Ed25519PublicKey } from '@mysten/sui/keypairs/ed25519';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { toBase64 } from '@mysten/sui/utils';\n\nimport { bcs } from '@mysten/sui/bcs';\nimport { getInputObjects } from './objects.js';\n\nexport { SuiMoveObject } from './bcs.js';\nexport { getInputObjects } from './objects.js';\n\n/**\n * Configuration options for initializing the LedgerSigner.\n */\nexport interface LedgerSignerOptions {\n\tpublicKey: Ed25519PublicKey;\n\tderivationPath: string;\n\tledgerClient: SuiLedgerClient;\n\tsuiClient: SuiClient;\n}\n\n/**\n * Ledger integrates with the Sui blockchain to provide signing capabilities using Ledger devices.\n */\nexport class LedgerSigner extends Signer {\n\t#derivationPath: string;\n\t#publicKey: Ed25519PublicKey;\n\t#ledgerClient: SuiLedgerClient;\n\t#suiClient: SuiClient;\n\n\t/**\n\t * Creates an instance of LedgerSigner. It's expected to call the static `fromDerivationPath` method to create an instance.\n\t * @example\n\t * ```\n\t * const signer = await LedgerSigner.fromDerivationPath(derivationPath, options);\n\t * ```\n\t */\n\tconstructor({ publicKey, derivationPath, ledgerClient, suiClient }: LedgerSignerOptions) {\n\t\tsuper();\n\t\tthis.#publicKey = publicKey;\n\t\tthis.#derivationPath = derivationPath;\n\t\tthis.#ledgerClient = ledgerClient;\n\t\tthis.#suiClient = suiClient;\n\t}\n\n\t/**\n\t * Retrieves the key scheme used by this signer.\n\t */\n\toverride getKeyScheme() {\n\t\treturn 'ED25519' as const;\n\t}\n\n\t/**\n\t * Retrieves the public key associated with this signer.\n\t * @returns The Ed25519PublicKey instance.\n\t */\n\toverride getPublicKey() {\n\t\treturn this.#publicKey;\n\t}\n\n\t/**\n\t * Signs the provided transaction bytes.\n\t * @returns The signed transaction bytes and signature.\n\t */\n\toverride async signTransaction(bytes: Uint8Array): Promise<SignatureWithBytes> {\n\t\tconst transactionOptions = await getInputObjects(\n\t\t\tTransaction.from(bytes),\n\t\t\tthis.#suiClient,\n\t\t).catch(() => ({\n\t\t\t// Fail gracefully so network errors or serialization issues don't break transaction signing:\n\t\t\tbcsObjects: [],\n\t\t}));\n\n\t\tconst intentMessage = messageWithIntent('TransactionData', bytes);\n\t\tconst { signature } = await this.#ledgerClient.signTransaction(\n\t\t\tthis.#derivationPath,\n\t\t\tintentMessage,\n\t\t\ttransactionOptions,\n\t\t);\n\n\t\treturn {\n\t\t\tbytes: toBase64(bytes),\n\t\t\tsignature: toSerializedSignature({\n\t\t\t\tsignature,\n\t\t\t\tsignatureScheme: this.getKeyScheme(),\n\t\t\t\tpublicKey: this.#publicKey,\n\t\t\t}),\n\t\t};\n\t}\n\n\t/**\n\t * Signs the provided personal message.\n\t * @returns The signed message bytes and signature.\n\t */\n\toverride async signPersonalMessage(bytes: Uint8Array): Promise<SignatureWithBytes> {\n\t\tconst intentMessage = messageWithIntent(\n\t\t\t'PersonalMessage',\n\t\t\tbcs.byteVector().serialize(bytes).toBytes(),\n\t\t);\n\t\tconst { signature } = await this.#ledgerClient.signTransaction(\n\t\t\tthis.#derivationPath,\n\t\t\tintentMessage,\n\t\t);\n\n\t\treturn {\n\t\t\tbytes: toBase64(bytes),\n\t\t\tsignature: toSerializedSignature({\n\t\t\t\tsignature,\n\t\t\t\tsignatureScheme: this.getKeyScheme(),\n\t\t\t\tpublicKey: this.#publicKey,\n\t\t\t}),\n\t\t};\n\t}\n\n\t/**\n\t * Prepares the signer by fetching and setting the public key from a Ledger device.\n\t * It is recommended to initialize an `LedgerSigner` instance using this function.\n\t * @returns A promise that resolves once a `LedgerSigner` instance is prepared (public key is set).\n\t */\n\tstatic async fromDerivationPath(\n\t\tderivationPath: string,\n\t\tledgerClient: SuiLedgerClient,\n\t\tsuiClient: SuiClient,\n\t) {\n\t\tconst { publicKey } = await ledgerClient.getPublicKey(derivationPath);\n\t\tif (!publicKey) {\n\t\t\tthrow new Error('Failed to get public key from Ledger.');\n\t\t}\n\n\t\treturn new LedgerSigner({\n\t\t\tderivationPath,\n\t\t\tpublicKey: new Ed25519PublicKey(publicKey),\n\t\t\tledgerClient,\n\t\t\tsuiClient,\n\t\t});\n\t}\n\n\t/**\n\t * Generic signing is not supported by Ledger.\n\t * @throws Always throws an error indicating generic signing is unsupported.\n\t */\n\toverride sign(): never {\n\t\tthrow new Error('Ledger Signer does not support generic signing.');\n\t}\n\n\t/**\n\t * Generic signing is not supported by Ledger.\n\t * @throws Always throws an error indicating generic signing is unsupported.\n\t */\n\toverride signWithIntent(): never {\n\t\tthrow new Error('Ledger Signer does not support generic signing.');\n\t}\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;AAAA;AAMA,SAAS,mBAAmB,QAAQ,6BAA6B;AACjE,SAAS,wBAAwB;AACjC,SAAS,mBAAmB;AAC5B,SAAS,gBAAgB;AAEzB,SAAS,WAAW;AACpB,SAAS,uBAAuB;AAEhC,SAAS,qBAAqB;AAC9B,SAAS,mBAAAA,wBAAuB;AAezB,MAAM,gBAAN,MAAM,sBAAqB,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaxC,YAAY,EAAE,WAAW,gBAAgB,cAAc,UAAU,GAAwB;AACxF,UAAM;AAbP;AACA;AACA;AACA;AAWC,uBAAK,YAAa;AAClB,uBAAK,iBAAkB;AACvB,uBAAK,eAAgB;AACrB,uBAAK,YAAa;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKS,eAAe;AACvB,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMS,eAAe;AACvB,WAAO,mBAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAe,gBAAgB,OAAgD;AAC9E,UAAM,qBAAqB,MAAM;AAAA,MAChC,YAAY,KAAK,KAAK;AAAA,MACtB,mBAAK;AAAA,IACN,EAAE,MAAM,OAAO;AAAA;AAAA,MAEd,YAAY,CAAC;AAAA,IACd,EAAE;AAEF,UAAM,gBAAgB,kBAAkB,mBAAmB,KAAK;AAChE,UAAM,EAAE,UAAU,IAAI,MAAM,mBAAK,eAAc;AAAA,MAC9C,mBAAK;AAAA,MACL;AAAA,MACA;AAAA,IACD;AAEA,WAAO;AAAA,MACN,OAAO,SAAS,KAAK;AAAA,MACrB,WAAW,sBAAsB;AAAA,QAChC;AAAA,QACA,iBAAiB,KAAK,aAAa;AAAA,QACnC,WAAW,mBAAK;AAAA,MACjB,CAAC;AAAA,IACF;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAe,oBAAoB,OAAgD;AAClF,UAAM,gBAAgB;AAAA,MACrB;AAAA,MACA,IAAI,WAAW,EAAE,UAAU,KAAK,EAAE,QAAQ;AAAA,IAC3C;AACA,UAAM,EAAE,UAAU,IAAI,MAAM,mBAAK,eAAc;AAAA,MAC9C,mBAAK;AAAA,MACL;AAAA,IACD;AAEA,WAAO;AAAA,MACN,OAAO,SAAS,KAAK;AAAA,MACrB,WAAW,sBAAsB;AAAA,QAChC;AAAA,QACA,iBAAiB,KAAK,aAAa;AAAA,QACnC,WAAW,mBAAK;AAAA,MACjB,CAAC;AAAA,IACF;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAa,mBACZ,gBACA,cACA,WACC;AACD,UAAM,EAAE,UAAU,IAAI,MAAM,aAAa,aAAa,cAAc;AACpE,QAAI,CAAC,WAAW;AACf,YAAM,IAAI,MAAM,uCAAuC;AAAA,IACxD;AAEA,WAAO,IAAI,cAAa;AAAA,MACvB;AAAA,MACA,WAAW,IAAI,iBAAiB,SAAS;AAAA,MACzC;AAAA,MACA;AAAA,IACD,CAAC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMS,OAAc;AACtB,UAAM,IAAI,MAAM,iDAAiD;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMS,iBAAwB;AAChC,UAAM,IAAI,MAAM,iDAAiD;AAAA,EAClE;AACD;AA/HC;AACA;AACA;AACA;AAJM,IAAM,eAAN;",
|
|
6
|
+
"names": ["getInputObjects"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { SuiMoveObject } from "./bcs.js";
|
|
2
|
+
const getInputObjects = async (transaction, client) => {
|
|
3
|
+
const data = transaction.getData();
|
|
4
|
+
const gasObjectIds = data.gasData.payment?.map((object) => object.objectId) ?? [];
|
|
5
|
+
const inputObjectIds = data.inputs.map((input) => {
|
|
6
|
+
return input.$kind === "Object" && input.Object.$kind === "ImmOrOwnedObject" ? input.Object.ImmOrOwnedObject.objectId : null;
|
|
7
|
+
}).filter((objectId) => !!objectId);
|
|
8
|
+
const objects = await client.multiGetObjects({
|
|
9
|
+
ids: [...gasObjectIds, ...inputObjectIds],
|
|
10
|
+
options: {
|
|
11
|
+
showBcs: true,
|
|
12
|
+
showPreviousTransaction: true,
|
|
13
|
+
showStorageRebate: true,
|
|
14
|
+
showOwner: true
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
const bcsObjects = objects.map((object) => {
|
|
18
|
+
if (object.error || !object.data || object.data.bcs?.dataType !== "moveObject") {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
return SuiMoveObject.serialize({
|
|
22
|
+
data: {
|
|
23
|
+
MoveObject: {
|
|
24
|
+
type: object.data.bcs.type,
|
|
25
|
+
hasPublicTransfer: object.data.bcs.hasPublicTransfer,
|
|
26
|
+
version: object.data.bcs.version,
|
|
27
|
+
contents: object.data.bcs.bcsBytes
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
owner: object.data.owner,
|
|
31
|
+
previousTransaction: object.data.previousTransaction,
|
|
32
|
+
storageRebate: object.data.storageRebate
|
|
33
|
+
}).toBytes();
|
|
34
|
+
}).filter((bcsBytes) => !!bcsBytes);
|
|
35
|
+
return { bcsObjects };
|
|
36
|
+
};
|
|
37
|
+
export {
|
|
38
|
+
getInputObjects
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=objects.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/ledger/objects.ts"],
|
|
4
|
+
"sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { Transaction } from '@mysten/sui/transactions';\nimport type { SuiClient } from '@mysten/sui/client';\nimport { SuiMoveObject } from './bcs.js';\n\nexport const getInputObjects = async (transaction: Transaction, client: SuiClient) => {\n\tconst data = transaction.getData();\n\n\tconst gasObjectIds = data.gasData.payment?.map((object) => object.objectId) ?? [];\n\tconst inputObjectIds = data.inputs\n\t\t.map((input) => {\n\t\t\treturn input.$kind === 'Object' && input.Object.$kind === 'ImmOrOwnedObject'\n\t\t\t\t? input.Object.ImmOrOwnedObject.objectId\n\t\t\t\t: null;\n\t\t})\n\t\t.filter((objectId): objectId is string => !!objectId);\n\n\tconst objects = await client.multiGetObjects({\n\t\tids: [...gasObjectIds, ...inputObjectIds],\n\t\toptions: {\n\t\t\tshowBcs: true,\n\t\t\tshowPreviousTransaction: true,\n\t\t\tshowStorageRebate: true,\n\t\t\tshowOwner: true,\n\t\t},\n\t});\n\n\t// NOTE: We should probably get rid of this manual serialization logic in favor of using the\n\t// already serialized object bytes from the GraphQL API once there is more mainstream support\n\t// for it + we can enforce the transport type on the Sui client.\n\tconst bcsObjects = objects\n\t\t.map((object) => {\n\t\t\tif (object.error || !object.data || object.data.bcs?.dataType !== 'moveObject') {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn SuiMoveObject.serialize({\n\t\t\t\tdata: {\n\t\t\t\t\tMoveObject: {\n\t\t\t\t\t\ttype: object.data.bcs.type,\n\t\t\t\t\t\thasPublicTransfer: object.data.bcs.hasPublicTransfer,\n\t\t\t\t\t\tversion: object.data.bcs.version,\n\t\t\t\t\t\tcontents: object.data.bcs.bcsBytes,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\towner: object.data.owner!,\n\t\t\t\tpreviousTransaction: object.data.previousTransaction!,\n\t\t\t\tstorageRebate: object.data.storageRebate!,\n\t\t\t}).toBytes();\n\t\t})\n\t\t.filter((bcsBytes): bcsBytes is Uint8Array<ArrayBuffer> => !!bcsBytes);\n\n\treturn { bcsObjects };\n};\n"],
|
|
5
|
+
"mappings": "AAKA,SAAS,qBAAqB;AAEvB,MAAM,kBAAkB,OAAO,aAA0B,WAAsB;AACrF,QAAM,OAAO,YAAY,QAAQ;AAEjC,QAAM,eAAe,KAAK,QAAQ,SAAS,IAAI,CAAC,WAAW,OAAO,QAAQ,KAAK,CAAC;AAChF,QAAM,iBAAiB,KAAK,OAC1B,IAAI,CAAC,UAAU;AACf,WAAO,MAAM,UAAU,YAAY,MAAM,OAAO,UAAU,qBACvD,MAAM,OAAO,iBAAiB,WAC9B;AAAA,EACJ,CAAC,EACA,OAAO,CAAC,aAAiC,CAAC,CAAC,QAAQ;AAErD,QAAM,UAAU,MAAM,OAAO,gBAAgB;AAAA,IAC5C,KAAK,CAAC,GAAG,cAAc,GAAG,cAAc;AAAA,IACxC,SAAS;AAAA,MACR,SAAS;AAAA,MACT,yBAAyB;AAAA,MACzB,mBAAmB;AAAA,MACnB,WAAW;AAAA,IACZ;AAAA,EACD,CAAC;AAKD,QAAM,aAAa,QACjB,IAAI,CAAC,WAAW;AAChB,QAAI,OAAO,SAAS,CAAC,OAAO,QAAQ,OAAO,KAAK,KAAK,aAAa,cAAc;AAC/E,aAAO;AAAA,IACR;AAEA,WAAO,cAAc,UAAU;AAAA,MAC9B,MAAM;AAAA,QACL,YAAY;AAAA,UACX,MAAM,OAAO,KAAK,IAAI;AAAA,UACtB,mBAAmB,OAAO,KAAK,IAAI;AAAA,UACnC,SAAS,OAAO,KAAK,IAAI;AAAA,UACzB,UAAU,OAAO,KAAK,IAAI;AAAA,QAC3B;AAAA,MACD;AAAA,MACA,OAAO,OAAO,KAAK;AAAA,MACnB,qBAAqB,OAAO,KAAK;AAAA,MACjC,eAAe,OAAO,KAAK;AAAA,IAC5B,CAAC,EAAE,QAAQ;AAAA,EACZ,CAAC,EACA,OAAO,CAAC,aAAkD,CAAC,CAAC,QAAQ;AAEtE,SAAO,EAAE,WAAW;AACrB;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|