@unconfirmed/sui-effect 0.1.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/AGENTS.md +209 -0
- package/LICENSE +21 -0
- package/LLMS.md +6707 -0
- package/README.md +300 -0
- package/dist/domain/bcs.d.ts +101 -0
- package/dist/domain/bcs.d.ts.map +1 -0
- package/dist/domain/bcs.js +183 -0
- package/dist/domain/bcs.js.map +1 -0
- package/dist/domain/errors.d.ts +595 -0
- package/dist/domain/errors.d.ts.map +1 -0
- package/dist/domain/errors.js +476 -0
- package/dist/domain/errors.js.map +1 -0
- package/dist/domain/executed.d.ts +325 -0
- package/dist/domain/executed.d.ts.map +1 -0
- package/dist/domain/executed.js +253 -0
- package/dist/domain/executed.js.map +1 -0
- package/dist/domain/journal-entry.d.ts +468 -0
- package/dist/domain/journal-entry.d.ts.map +1 -0
- package/dist/domain/journal-entry.js +63 -0
- package/dist/domain/journal-entry.js.map +1 -0
- package/dist/domain/schemas.d.ts +950 -0
- package/dist/domain/schemas.d.ts.map +1 -0
- package/dist/domain/schemas.js +571 -0
- package/dist/domain/schemas.js.map +1 -0
- package/dist/domain/sui-schema.d.ts +12 -0
- package/dist/domain/sui-schema.d.ts.map +1 -0
- package/dist/domain/sui-schema.js +12 -0
- package/dist/domain/sui-schema.js.map +1 -0
- package/dist/extension.d.ts +7 -0
- package/dist/extension.d.ts.map +1 -0
- package/dist/extension.js +7 -0
- package/dist/extension.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/internal.d.ts +18 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +18 -0
- package/dist/internal.js.map +1 -0
- package/dist/journal.d.ts +51 -0
- package/dist/journal.d.ts.map +1 -0
- package/dist/journal.js +18 -0
- package/dist/journal.js.map +1 -0
- package/dist/script.d.ts +7 -0
- package/dist/script.d.ts.map +1 -0
- package/dist/script.js +7 -0
- package/dist/script.js.map +1 -0
- package/dist/services/Journal.d.ts +76 -0
- package/dist/services/Journal.d.ts.map +1 -0
- package/dist/services/Journal.js +70 -0
- package/dist/services/Journal.js.map +1 -0
- package/dist/services/JournalKeyValueStore.d.ts +73 -0
- package/dist/services/JournalKeyValueStore.d.ts.map +1 -0
- package/dist/services/JournalKeyValueStore.js +155 -0
- package/dist/services/JournalKeyValueStore.js.map +1 -0
- package/dist/services/Script.d.ts +210 -0
- package/dist/services/Script.d.ts.map +1 -0
- package/dist/services/Script.js +441 -0
- package/dist/services/Script.js.map +1 -0
- package/dist/services/Signer.d.ts +132 -0
- package/dist/services/Signer.d.ts.map +1 -0
- package/dist/services/Signer.js +158 -0
- package/dist/services/Signer.js.map +1 -0
- package/dist/services/SubmitConfig.d.ts +175 -0
- package/dist/services/SubmitConfig.d.ts.map +1 -0
- package/dist/services/SubmitConfig.js +52 -0
- package/dist/services/SubmitConfig.js.map +1 -0
- package/dist/services/Sui.d.ts +295 -0
- package/dist/services/Sui.d.ts.map +1 -0
- package/dist/services/Sui.js +414 -0
- package/dist/services/Sui.js.map +1 -0
- package/dist/services/SuiCore.d.ts +227 -0
- package/dist/services/SuiCore.d.ts.map +1 -0
- package/dist/services/SuiCore.js +400 -0
- package/dist/services/SuiCore.js.map +1 -0
- package/dist/services/SuiCoreFake.d.ts +278 -0
- package/dist/services/SuiCoreFake.d.ts.map +1 -0
- package/dist/services/SuiCoreFake.js +1003 -0
- package/dist/services/SuiCoreFake.js.map +1 -0
- package/dist/services/SuiExtension.d.ts +208 -0
- package/dist/services/SuiExtension.d.ts.map +1 -0
- package/dist/services/SuiExtension.js +355 -0
- package/dist/services/SuiExtension.js.map +1 -0
- package/dist/services/SuiGraphQL.d.ts +98 -0
- package/dist/services/SuiGraphQL.d.ts.map +1 -0
- package/dist/services/SuiGraphQL.js +118 -0
- package/dist/services/SuiGraphQL.js.map +1 -0
- package/dist/services/Tx.d.ts +687 -0
- package/dist/services/Tx.d.ts.map +1 -0
- package/dist/services/Tx.js +1224 -0
- package/dist/services/Tx.js.map +1 -0
- package/dist/testing.d.ts +88 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +163 -0
- package/dist/testing.js.map +1 -0
- package/dist/tx.d.ts +24 -0
- package/dist/tx.d.ts.map +1 -0
- package/dist/tx.js +24 -0
- package/dist/tx.js.map +1 -0
- package/docs/extensions.md +1685 -0
- package/examples/extension-template/README.md +170 -0
- package/examples/extension-template/package.json +44 -0
- package/examples/extension-template/scripts/check-package.ts +147 -0
- package/examples/extension-template/src/Escrow.ts +445 -0
- package/examples/extension-template/src/Platform.ts +136 -0
- package/examples/extension-template/src/errors.ts +61 -0
- package/examples/extension-template/src/extension.ts +63 -0
- package/examples/extension-template/src/index.ts +34 -0
- package/examples/extension-template/src/schema.ts +158 -0
- package/examples/extension-template/src/upstream.ts +66 -0
- package/examples/extension-template/test/escrow.test.ts +559 -0
- package/examples/extension-template/tsconfig.build.json +26 -0
- package/examples/extension-template/tsconfig.json +35 -0
- package/package.json +87 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Script.js","sourceRoot":"","sources":["../../src/services/Script.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `Signer`: a credential as a value, never a service.
|
|
3
|
+
*
|
|
4
|
+
* One process may legitimately hold two credentials at once (a sponsor signs
|
|
5
|
+
* as itself and verifies the sender's signature), and `R = Signer` cannot say
|
|
6
|
+
* which one a function meant. So a signer is always an explicit parameter, and
|
|
7
|
+
* nothing here ever exposes secret material: a `Signer` is an address, a
|
|
8
|
+
* scheme, and two functions that return signatures.
|
|
9
|
+
*
|
|
10
|
+
* @since 0.1.0
|
|
11
|
+
*/
|
|
12
|
+
import type { Keypair, Signer as SdkSigner } from "@mysten/sui/cryptography";
|
|
13
|
+
import { Config, Effect } from "effect";
|
|
14
|
+
import { SigningError } from "../domain/errors.ts";
|
|
15
|
+
import { Signature, SuiAddress } from "../domain/schemas.ts";
|
|
16
|
+
/** The signature schemes a {@link Signer} built by this module can carry. */
|
|
17
|
+
export type SignatureScheme = "ED25519" | "Secp256k1" | "Secp256r1" | "MultiSig" | "ZkLogin" | "Passkey";
|
|
18
|
+
/**
|
|
19
|
+
* A credential: who it signs as, how, and the two things it can sign.
|
|
20
|
+
*
|
|
21
|
+
* Both members fail with `SigningError` and nothing else: a signer that has to
|
|
22
|
+
* reach a KMS or a wallet wraps its own transport failure in the `cause`, so a
|
|
23
|
+
* caller's error union does not grow a branch per credential kind.
|
|
24
|
+
*/
|
|
25
|
+
export interface Signer {
|
|
26
|
+
/** The Sui address this signer signs as. */
|
|
27
|
+
readonly address: SuiAddress;
|
|
28
|
+
/** The signature scheme of the credential. */
|
|
29
|
+
readonly scheme: SignatureScheme;
|
|
30
|
+
/**
|
|
31
|
+
* Signs transaction bytes with the `TransactionData` intent.
|
|
32
|
+
*
|
|
33
|
+
* Fails with: `SigningError`.
|
|
34
|
+
*/
|
|
35
|
+
readonly signTransaction: (bytes: Uint8Array) => Effect.Effect<Signature, SigningError>;
|
|
36
|
+
/**
|
|
37
|
+
* Signs a personal message with the `PersonalMessage` intent.
|
|
38
|
+
*
|
|
39
|
+
* Fails with: `SigningError`.
|
|
40
|
+
*/
|
|
41
|
+
readonly signPersonalMessage: (bytes: Uint8Array) => Effect.Effect<Signature, SigningError>;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Wraps any `@mysten/sui/cryptography` `Signer`.
|
|
45
|
+
*
|
|
46
|
+
* The SDK's `Signer` is the base class every credential extends: `Keypair` and
|
|
47
|
+
* its three schemes, but also a Ledger signer, a wallet adapter's signer, a KMS
|
|
48
|
+
* signer — anything that can `toSuiAddress`, `getKeyScheme`, `signTransaction`
|
|
49
|
+
* and `signPersonalMessage`. Nothing here needs the secret, so nothing here
|
|
50
|
+
* needs a keypair, and the `Signer` this returns exposes no secret material
|
|
51
|
+
* either.
|
|
52
|
+
*
|
|
53
|
+
* For a credential that is not an SDK `Signer` at all — a remote service, a
|
|
54
|
+
* hardware device behind your own protocol — use {@link remote}, which takes
|
|
55
|
+
* Effects and the address to sign as.
|
|
56
|
+
*
|
|
57
|
+
* Never fails: a bad address or signature surfaces as a `SigningError` from the
|
|
58
|
+
* member that produced it, not from construction.
|
|
59
|
+
*/
|
|
60
|
+
export declare const fromSdkSigner: (keypair: SdkSigner) => Signer;
|
|
61
|
+
/**
|
|
62
|
+
* {@link fromSdkSigner} under the name the spec gave it when a keypair was the
|
|
63
|
+
* only thing it took. A `Keypair` **is** an SDK `Signer`, so this is a thin
|
|
64
|
+
* alias kept for callers who hold one. Never fails.
|
|
65
|
+
*/
|
|
66
|
+
export declare const fromKeypair: (keypair: Keypair) => Signer;
|
|
67
|
+
/**
|
|
68
|
+
* Reads a Bech32 `suiprivkey1…` secret key from configuration and builds the
|
|
69
|
+
* signer for whichever of the three schemes its flag names.
|
|
70
|
+
*
|
|
71
|
+
* The key is read with `Config.redacted`, and the decoded bytes never leave
|
|
72
|
+
* this function. Neither does anything derived from them: the failure carries
|
|
73
|
+
* one fixed sentence and no `cause`, because the decoder's own message quotes
|
|
74
|
+
* the input it rejected.
|
|
75
|
+
*
|
|
76
|
+
* Fails with: `ConfigError` when the variable is missing, is not a Bech32 Sui
|
|
77
|
+
* private key, or names a scheme that has no keypair class (`MultiSig`,
|
|
78
|
+
* `ZkLogin`, `Passkey` — use {@link remote} for those).
|
|
79
|
+
*/
|
|
80
|
+
export declare const fromConfig: (name?: string) => Effect.Effect<Signer, Config.ConfigError>;
|
|
81
|
+
/**
|
|
82
|
+
* A fresh Ed25519 credential that exists only for this process. For tests,
|
|
83
|
+
* localnet and throwaway addresses.
|
|
84
|
+
*
|
|
85
|
+
* This is the one place sui-effect does not take randomness from Effect's
|
|
86
|
+
* `Random`: key generation must come from a cryptographically secure source,
|
|
87
|
+
* and `Random` is a seeded, test-controllable PRNG whose whole purpose is to be
|
|
88
|
+
* reproducible. `new Ed25519Keypair()` uses the SDK's CSPRNG (`@noble/curves`
|
|
89
|
+
* over `crypto.getRandomValues`). A `TestClock`-style deterministic key would
|
|
90
|
+
* be a security bug, not a convenience.
|
|
91
|
+
*
|
|
92
|
+
* Never fails.
|
|
93
|
+
*/
|
|
94
|
+
export declare const ephemeral: Effect.Effect<Signer>;
|
|
95
|
+
/**
|
|
96
|
+
* What {@link remote} needs to know about a credential it does not hold.
|
|
97
|
+
*
|
|
98
|
+
* `address` is not optional and is not derived: a remote signer **must report
|
|
99
|
+
* the address it signs as**. `Tx.sign` and `Tx.cosign` compare it with the
|
|
100
|
+
* transaction's sender and gas owner and refuse a mismatch, which is the only
|
|
101
|
+
* thing standing between a misconfigured KMS key and an `INVALID_ARGUMENT`
|
|
102
|
+
* rejection that `Tx.submit` can only report as `SubmissionUnknown`.
|
|
103
|
+
*/
|
|
104
|
+
export interface RemoteSigner {
|
|
105
|
+
readonly address: SuiAddress;
|
|
106
|
+
readonly scheme: SignatureScheme;
|
|
107
|
+
readonly signTransaction: (bytes: Uint8Array) => Effect.Effect<string, SigningError>;
|
|
108
|
+
readonly signPersonalMessage?: (bytes: Uint8Array) => Effect.Effect<string, SigningError>;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Builds a signer around something that signs elsewhere: a KMS, a wallet, a
|
|
112
|
+
* hardware device, another process.
|
|
113
|
+
*
|
|
114
|
+
* The returned signer decodes whatever the remote produced, so a malformed
|
|
115
|
+
* signature is a `SigningError` rather than a surprise at execution. When
|
|
116
|
+
* `signPersonalMessage` is not given, asking for one fails with `SigningError`
|
|
117
|
+
* instead of pretending. Never fails.
|
|
118
|
+
*/
|
|
119
|
+
export declare const remote: (signer: RemoteSigner) => Signer;
|
|
120
|
+
/**
|
|
121
|
+
* The constructors, namespaced the way the spec spells them:
|
|
122
|
+
* `Signer.fromSdkSigner`, `Signer.fromKeypair`, `Signer.fromConfig`,
|
|
123
|
+
* `Signer.ephemeral`, `Signer.remote`. The type `Signer` is the interface above.
|
|
124
|
+
*/
|
|
125
|
+
export declare const Signer: {
|
|
126
|
+
readonly fromSdkSigner: (keypair: SdkSigner) => Signer;
|
|
127
|
+
readonly fromKeypair: (keypair: Keypair) => Signer;
|
|
128
|
+
readonly fromConfig: (name?: string) => Effect.Effect<Signer, Config.ConfigError>;
|
|
129
|
+
readonly ephemeral: Effect.Effect<Signer, never, never>;
|
|
130
|
+
readonly remote: (signer: RemoteSigner) => Signer;
|
|
131
|
+
};
|
|
132
|
+
//# sourceMappingURL=Signer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Signer.d.ts","sourceRoot":"","sources":["../../src/services/Signer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,IAAI,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAK5E,OAAO,EAAE,MAAM,EAAkB,MAAM,EAAoB,MAAM,QAAQ,CAAA;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAE5D,6EAA6E;AAC7E,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,WAAW,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,CAAA;AAExG;;;;;;GAMG;AACH,MAAM,WAAW,MAAM;IACrB,4CAA4C;IAC5C,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAA;IAC5B,8CAA8C;IAC9C,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAA;IAChC;;;;OAIG;IACH,QAAQ,CAAC,eAAe,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,CAAA;IACvF;;;;OAIG;IACH,QAAQ,CAAC,mBAAmB,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,CAAA;CAC5F;AASD;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,aAAa,GAAI,SAAS,SAAS,KAAG,MAuBlD,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,WAAW,GAAI,SAAS,OAAO,KAAG,MAAgC,CAAA;AA8B/E;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,UAAU,GACrB,aAAwB,KACvB,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,WAAW,CAoBxC,CAAA;AAEH;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAE3C,CAAA;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAA;IAC5B,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAA;IAChC,QAAQ,CAAC,eAAe,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;IACpF,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;CAC1F;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,MAAM,GAAI,QAAQ,YAAY,KAAG,MAa5C,CAAA;AAEF;;;;GAIG;AACH,eAAO,MAAM,MAAM;sCA/JoB,SAAS,KAAG,MAAM;oCA8BpB,OAAO,KAAG,MAAM;4CA6ClD,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC;;8BAgEb,YAAY,KAAG,MAAM;CA0B1C,CAAA"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { decodeSuiPrivateKey } from "@mysten/sui/cryptography";
|
|
2
|
+
import { Ed25519Keypair } from "@mysten/sui/keypairs/ed25519";
|
|
3
|
+
import { Secp256k1Keypair } from "@mysten/sui/keypairs/secp256k1";
|
|
4
|
+
import { Secp256r1Keypair } from "@mysten/sui/keypairs/secp256r1";
|
|
5
|
+
import { Config, ConfigProvider, Effect, Redacted, Schema } from "effect";
|
|
6
|
+
import { SigningError } from "../domain/errors.js";
|
|
7
|
+
import { Signature, SuiAddress } from "../domain/schemas.js";
|
|
8
|
+
const decodeSignature = Schema.decodeUnknownEffect(Signature);
|
|
9
|
+
const signatureOf = (signature) => decodeSignature(signature).pipe(Effect.mapError((issue) => new SigningError({ cause: `the signer returned a signature this version cannot read: ${issue.message}` })));
|
|
10
|
+
/**
|
|
11
|
+
* Wraps any `@mysten/sui/cryptography` `Signer`.
|
|
12
|
+
*
|
|
13
|
+
* The SDK's `Signer` is the base class every credential extends: `Keypair` and
|
|
14
|
+
* its three schemes, but also a Ledger signer, a wallet adapter's signer, a KMS
|
|
15
|
+
* signer — anything that can `toSuiAddress`, `getKeyScheme`, `signTransaction`
|
|
16
|
+
* and `signPersonalMessage`. Nothing here needs the secret, so nothing here
|
|
17
|
+
* needs a keypair, and the `Signer` this returns exposes no secret material
|
|
18
|
+
* either.
|
|
19
|
+
*
|
|
20
|
+
* For a credential that is not an SDK `Signer` at all — a remote service, a
|
|
21
|
+
* hardware device behind your own protocol — use {@link remote}, which takes
|
|
22
|
+
* Effects and the address to sign as.
|
|
23
|
+
*
|
|
24
|
+
* Never fails: a bad address or signature surfaces as a `SigningError` from the
|
|
25
|
+
* member that produced it, not from construction.
|
|
26
|
+
*/
|
|
27
|
+
export const fromSdkSigner = (keypair) => {
|
|
28
|
+
const address = keypair.toSuiAddress();
|
|
29
|
+
return {
|
|
30
|
+
// `toSuiAddress` returns the normalized form the SDK derived from the
|
|
31
|
+
// public key, so this never throws; the members still decode what the
|
|
32
|
+
// keypair hands back.
|
|
33
|
+
address: SuiAddress.make(address),
|
|
34
|
+
scheme: keypair.getKeyScheme(),
|
|
35
|
+
signTransaction: Effect.fn("Signer.signTransaction")(function* (bytes) {
|
|
36
|
+
const result = yield* Effect.tryPromise({
|
|
37
|
+
try: () => keypair.signTransaction(bytes),
|
|
38
|
+
catch: (cause) => new SigningError({ cause })
|
|
39
|
+
});
|
|
40
|
+
return yield* signatureOf(result.signature);
|
|
41
|
+
}),
|
|
42
|
+
signPersonalMessage: Effect.fn("Signer.signPersonalMessage")(function* (bytes) {
|
|
43
|
+
const result = yield* Effect.tryPromise({
|
|
44
|
+
try: () => keypair.signPersonalMessage(bytes),
|
|
45
|
+
catch: (cause) => new SigningError({ cause })
|
|
46
|
+
});
|
|
47
|
+
return yield* signatureOf(result.signature);
|
|
48
|
+
})
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* {@link fromSdkSigner} under the name the spec gave it when a keypair was the
|
|
53
|
+
* only thing it took. A `Keypair` **is** an SDK `Signer`, so this is a thin
|
|
54
|
+
* alias kept for callers who hold one. Never fails.
|
|
55
|
+
*/
|
|
56
|
+
export const fromKeypair = (keypair) => fromSdkSigner(keypair);
|
|
57
|
+
/** Builds the keypair class the scheme flag of a Bech32 secret key names. */
|
|
58
|
+
const keypairOf = (parsed) => {
|
|
59
|
+
switch (parsed.scheme) {
|
|
60
|
+
case "ED25519":
|
|
61
|
+
return Ed25519Keypair.fromSecretKey(parsed.secretKey);
|
|
62
|
+
case "Secp256k1":
|
|
63
|
+
return Secp256k1Keypair.fromSecretKey(parsed.secretKey);
|
|
64
|
+
case "Secp256r1":
|
|
65
|
+
return Secp256r1Keypair.fromSecretKey(parsed.secretKey);
|
|
66
|
+
default:
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* The only text a failure of {@link fromConfig} ever carries.
|
|
72
|
+
*
|
|
73
|
+
* It is fixed, and neither the key nor the thrown message is in it. The Bech32
|
|
74
|
+
* decoder reports a bad checksum as `Invalid checksum in suiprivkey1…` with the
|
|
75
|
+
* **whole input**, so a one-character typo in a live key would otherwise print
|
|
76
|
+
* a recoverable secret on stderr the moment `Script.run` describes the failure.
|
|
77
|
+
* There is nothing a caller can do with the decoder's wording that this
|
|
78
|
+
* sentence does not already tell them, so it is dropped rather than redacted:
|
|
79
|
+
* a `cause` on the error would serialize through `SuiError.toJson` too.
|
|
80
|
+
*/
|
|
81
|
+
const KEY_ERROR = "is not a Bech32 Sui private key (scheme or checksum), " +
|
|
82
|
+
"or names a scheme with no keypair class (MultiSig, ZkLogin, Passkey — use Signer.remote for those)";
|
|
83
|
+
/**
|
|
84
|
+
* Reads a Bech32 `suiprivkey1…` secret key from configuration and builds the
|
|
85
|
+
* signer for whichever of the three schemes its flag names.
|
|
86
|
+
*
|
|
87
|
+
* The key is read with `Config.redacted`, and the decoded bytes never leave
|
|
88
|
+
* this function. Neither does anything derived from them: the failure carries
|
|
89
|
+
* one fixed sentence and no `cause`, because the decoder's own message quotes
|
|
90
|
+
* the input it rejected.
|
|
91
|
+
*
|
|
92
|
+
* Fails with: `ConfigError` when the variable is missing, is not a Bech32 Sui
|
|
93
|
+
* private key, or names a scheme that has no keypair class (`MultiSig`,
|
|
94
|
+
* `ZkLogin`, `Passkey` — use {@link remote} for those).
|
|
95
|
+
*/
|
|
96
|
+
export const fromConfig = (name = "SUI_PRIVATE_KEY") => Config.redacted(name).pipe(Effect.flatMap((redacted) => Effect.try({
|
|
97
|
+
try: () => {
|
|
98
|
+
const parsed = decodeSuiPrivateKey(Redacted.value(redacted));
|
|
99
|
+
const keypair = keypairOf(parsed);
|
|
100
|
+
if (keypair === undefined) {
|
|
101
|
+
throw new Error("unsupported key scheme");
|
|
102
|
+
}
|
|
103
|
+
return fromKeypair(keypair);
|
|
104
|
+
},
|
|
105
|
+
// No `cause`: it would carry the decoder's message, and the decoder's
|
|
106
|
+
// message carries the key.
|
|
107
|
+
catch: () => new Config.ConfigError(new ConfigProvider.SourceError({ message: `${name} ${KEY_ERROR}` }))
|
|
108
|
+
})));
|
|
109
|
+
/**
|
|
110
|
+
* A fresh Ed25519 credential that exists only for this process. For tests,
|
|
111
|
+
* localnet and throwaway addresses.
|
|
112
|
+
*
|
|
113
|
+
* This is the one place sui-effect does not take randomness from Effect's
|
|
114
|
+
* `Random`: key generation must come from a cryptographically secure source,
|
|
115
|
+
* and `Random` is a seeded, test-controllable PRNG whose whole purpose is to be
|
|
116
|
+
* reproducible. `new Ed25519Keypair()` uses the SDK's CSPRNG (`@noble/curves`
|
|
117
|
+
* over `crypto.getRandomValues`). A `TestClock`-style deterministic key would
|
|
118
|
+
* be a security bug, not a convenience.
|
|
119
|
+
*
|
|
120
|
+
* Never fails.
|
|
121
|
+
*/
|
|
122
|
+
export const ephemeral = Effect.sync(() => fromKeypair(new Ed25519Keypair()));
|
|
123
|
+
/**
|
|
124
|
+
* Builds a signer around something that signs elsewhere: a KMS, a wallet, a
|
|
125
|
+
* hardware device, another process.
|
|
126
|
+
*
|
|
127
|
+
* The returned signer decodes whatever the remote produced, so a malformed
|
|
128
|
+
* signature is a `SigningError` rather than a surprise at execution. When
|
|
129
|
+
* `signPersonalMessage` is not given, asking for one fails with `SigningError`
|
|
130
|
+
* instead of pretending. Never fails.
|
|
131
|
+
*/
|
|
132
|
+
export const remote = (signer) => ({
|
|
133
|
+
address: signer.address,
|
|
134
|
+
scheme: signer.scheme,
|
|
135
|
+
signTransaction: Effect.fn("Signer.remote.signTransaction")(function* (bytes) {
|
|
136
|
+
return yield* signatureOf(yield* signer.signTransaction(bytes));
|
|
137
|
+
}),
|
|
138
|
+
signPersonalMessage: Effect.fn("Signer.remote.signPersonalMessage")(function* (bytes) {
|
|
139
|
+
const sign = signer.signPersonalMessage;
|
|
140
|
+
if (sign === undefined) {
|
|
141
|
+
return yield* new SigningError({ cause: "this remote signer cannot sign personal messages" });
|
|
142
|
+
}
|
|
143
|
+
return yield* signatureOf(yield* sign(bytes));
|
|
144
|
+
})
|
|
145
|
+
});
|
|
146
|
+
/**
|
|
147
|
+
* The constructors, namespaced the way the spec spells them:
|
|
148
|
+
* `Signer.fromSdkSigner`, `Signer.fromKeypair`, `Signer.fromConfig`,
|
|
149
|
+
* `Signer.ephemeral`, `Signer.remote`. The type `Signer` is the interface above.
|
|
150
|
+
*/
|
|
151
|
+
export const Signer = {
|
|
152
|
+
fromSdkSigner,
|
|
153
|
+
fromKeypair,
|
|
154
|
+
fromConfig,
|
|
155
|
+
ephemeral,
|
|
156
|
+
remote
|
|
157
|
+
};
|
|
158
|
+
//# sourceMappingURL=Signer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Signer.js","sourceRoot":"","sources":["../../src/services/Signer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `SubmitConfig`: the knobs of the transaction lifecycle, as a
|
|
3
|
+
* `Context.Reference` so every default is in force with no setup and any of
|
|
4
|
+
* them can be overridden for one fiber.
|
|
5
|
+
*
|
|
6
|
+
* @since 0.1.0
|
|
7
|
+
*/
|
|
8
|
+
import { Context, Duration, Schedule } from "effect";
|
|
9
|
+
import type { Effect } from "effect";
|
|
10
|
+
import type { PolicyDenied } from "../domain/errors.ts";
|
|
11
|
+
import type { Mist, Simulation } from "../domain/schemas.ts";
|
|
12
|
+
/** How `Tx.build` sets an expiration when the recipe left one unset. */
|
|
13
|
+
export type ExpirationPolicy = "validDuring" | "epoch" | "none";
|
|
14
|
+
/**
|
|
15
|
+
* Whether `Tx.reconcile` is allowed to conclude that an expiration window
|
|
16
|
+
* closed on a transaction the node does not know.
|
|
17
|
+
*
|
|
18
|
+
* `"epochThenMiss"` is the default and the only rule that produces
|
|
19
|
+
* `NotApplied { evidence: "expired" }`: the epoch (or timestamp) bound must be
|
|
20
|
+
* observed as passed, then `getTransaction` must miss, then — after
|
|
21
|
+
* `SubmitConfig.reconcileRecheck` — both must hold again. A single observation
|
|
22
|
+
* proves nothing, because a transaction can execute between the lookup and the
|
|
23
|
+
* expiry check, and a node behind a load balancer can serve an epoch from one
|
|
24
|
+
* replica and a transaction index from another.
|
|
25
|
+
*
|
|
26
|
+
* `"never"` disables the rule outright, so an expiration window is never
|
|
27
|
+
* evidence and an unknown transaction stays `SubmissionUnknown`. That is the
|
|
28
|
+
* setting for a deployment behind a mixed-node load balancer, where even the
|
|
29
|
+
* repeated observation can be answered by two different nodes.
|
|
30
|
+
*
|
|
31
|
+
* **Residual risk, even on `"epochThenMiss"`:** a node whose transaction index
|
|
32
|
+
* lags its epoch view can report the new epoch and miss a transaction it has in
|
|
33
|
+
* fact executed, twice in a row. The recheck delay makes that unlikely, not
|
|
34
|
+
* impossible; a deployment that cannot tolerate it sets `"never"` and settles
|
|
35
|
+
* unknown submissions by hand.
|
|
36
|
+
*/
|
|
37
|
+
export type ExpiryEvidencePolicy = "epochThenMiss" | "never";
|
|
38
|
+
/** Every decision `Tx.build`, `Tx.submit` and `Tx.reconcile` read from context. */
|
|
39
|
+
export interface SubmitConfigService {
|
|
40
|
+
/**
|
|
41
|
+
* The expiration `Tx.build` sets when the recipe set none.
|
|
42
|
+
*
|
|
43
|
+
* `"validDuring"` bounds the transaction to the current epoch and the next,
|
|
44
|
+
* and names the chain: it is the only one that both satisfies the validator
|
|
45
|
+
* rule (a transaction must have address-owned inputs *or* an expiration of at
|
|
46
|
+
* most two epochs) and stops bytes signed for one chain from landing on
|
|
47
|
+
* another. It costs one `getCurrentSystemState` read per build.
|
|
48
|
+
* `"epoch"` costs the same read and carries no chain guard. `"none"` leaves
|
|
49
|
+
* the transaction valid forever, which makes
|
|
50
|
+
* `NotApplied { evidence: "expired" }` unreachable.
|
|
51
|
+
*/
|
|
52
|
+
readonly expiration: ExpirationPolicy;
|
|
53
|
+
/**
|
|
54
|
+
* An **additional** wall-clock bound on a `"validDuring"` expiration, as
|
|
55
|
+
* `maxTimestamp`.
|
|
56
|
+
*
|
|
57
|
+
* Unset by default, because no Sui network accepts one yet: a devnet node on
|
|
58
|
+
* protocol 100 refuses any transaction carrying a timestamp bound with
|
|
59
|
+
* `Feature is not supported: Timestamp-based transaction expiration is not
|
|
60
|
+
* yet supported`, whether or not epochs are set alongside it. Setting this
|
|
61
|
+
* produces bytes the current protocol rejects at build time; it is here so
|
|
62
|
+
* that a network which does support them needs no new API, and so that
|
|
63
|
+
* `Tx.reconcile`'s wall-clock expiry rule has something to read.
|
|
64
|
+
*/
|
|
65
|
+
readonly validFor?: Duration.Duration;
|
|
66
|
+
/**
|
|
67
|
+
* The largest gas budget `Tx.build` will accept. The budget itself is chosen
|
|
68
|
+
* by the node's simulation during build; this is the ceiling above which
|
|
69
|
+
* building fails with `BuildError` rather than signing an expensive mistake.
|
|
70
|
+
*/
|
|
71
|
+
readonly maxGasBudget: Mist;
|
|
72
|
+
/**
|
|
73
|
+
* An extra simulate before signing, and the place spend limits and target
|
|
74
|
+
* policies plug in. It fails with `PolicyDenied` and nothing else, so
|
|
75
|
+
* `Tx.run` stays typed.
|
|
76
|
+
*/
|
|
77
|
+
readonly preflight?: (simulation: Simulation) => Effect.Effect<void, PolicyDenied>;
|
|
78
|
+
/** Whether `Tx.run` holds the sender lock from build through submit. */
|
|
79
|
+
readonly lockSender: boolean;
|
|
80
|
+
/**
|
|
81
|
+
* How `Tx.submit` re-sends the identical bytes after a retryable transport
|
|
82
|
+
* failure or a timeout. It never rebuilds, so a retry can only ever land the
|
|
83
|
+
* transaction the caller already signed.
|
|
84
|
+
*/
|
|
85
|
+
readonly resubmit: Schedule.Schedule<unknown>;
|
|
86
|
+
/** How many times `Tx.submit` sends the bytes in total, the first try included. */
|
|
87
|
+
readonly resubmitAttempts: number;
|
|
88
|
+
/**
|
|
89
|
+
* How long one `executeTransaction` may take before `Tx.submit` treats it as
|
|
90
|
+
* a retryable transport failure. A timeout is the case `Tx.submit` exists
|
|
91
|
+
* for: the bytes may well have reached the network.
|
|
92
|
+
*/
|
|
93
|
+
readonly executeTimeout: Duration.Duration;
|
|
94
|
+
/**
|
|
95
|
+
* How far `chainTime` must pass a transaction's recorded `maxTimestamp`
|
|
96
|
+
* before `Tx.reconcile` is willing to call it `NotApplied`. It covers the
|
|
97
|
+
* skew between the node's clock, the Clock object and the validators.
|
|
98
|
+
*
|
|
99
|
+
* It applies to the wall-clock rule only. The epoch rule needs no margin:
|
|
100
|
+
* an epoch is a consensus fact, not a reading of a clock, so once the
|
|
101
|
+
* current epoch is past a transaction's `maxEpoch` it is simply over.
|
|
102
|
+
*/
|
|
103
|
+
readonly expiryMargin: Duration.Duration;
|
|
104
|
+
/**
|
|
105
|
+
* Whether a closed expiration window may be evidence at all, and under which
|
|
106
|
+
* rule. See {@link ExpiryEvidencePolicy}. Defaults to `"epochThenMiss"`.
|
|
107
|
+
*/
|
|
108
|
+
readonly expiryEvidence: ExpiryEvidencePolicy;
|
|
109
|
+
/**
|
|
110
|
+
* How long `Tx.reconcile` waits between the first observation of a closed
|
|
111
|
+
* expiration window and the second one it needs before it will answer
|
|
112
|
+
* `NotApplied { evidence: "expired" }`.
|
|
113
|
+
*
|
|
114
|
+
* It is a `Clock` sleep, so a test drives it with `TestClock` and a test that
|
|
115
|
+
* does not care sets it to zero.
|
|
116
|
+
*/
|
|
117
|
+
readonly reconcileRecheck: Duration.Duration;
|
|
118
|
+
/**
|
|
119
|
+
* Whether `Tx.submit` waits for a successful execution to become visible to
|
|
120
|
+
* reads before it returns and releases the sender lock. Defaults to `true`.
|
|
121
|
+
*/
|
|
122
|
+
readonly awaitVisibility: boolean;
|
|
123
|
+
/**
|
|
124
|
+
* How long that wait may take. A wait that times out or fails **never**
|
|
125
|
+
* changes the outcome: the transaction executed, and `Tx.submit` returns the
|
|
126
|
+
* `Executed` it already has after logging the failure.
|
|
127
|
+
*/
|
|
128
|
+
readonly visibilityTimeout: Duration.Duration;
|
|
129
|
+
/**
|
|
130
|
+
* The nonce `Tx.build` stamps on a default `ValidDuring` expiration, which is
|
|
131
|
+
* what makes two otherwise identical transactions from one address in one
|
|
132
|
+
* epoch different bytes with different digests.
|
|
133
|
+
*
|
|
134
|
+
* The default draws a `u32` from Effect's `Random`, which is process-local
|
|
135
|
+
* and does not survive a restart: independent 32-bit draws collide with
|
|
136
|
+
* probability about 1.16% after ten thousand such transactions. **A collision
|
|
137
|
+
* is not a second execution.** Identical bytes have one digest and one
|
|
138
|
+
* journal key, so the second build is the same transaction as the first; the
|
|
139
|
+
* failure mode is a transaction that cannot be sent again because the first
|
|
140
|
+
* one already occupied its digest, not a duplicated intent.
|
|
141
|
+
*
|
|
142
|
+
* Supply a monotonic allocator when that matters — a counter in the same
|
|
143
|
+
* store the journal uses, an id service, anything that survives a restart:
|
|
144
|
+
* `nonce: Effect.map(counter.next, (n) => n % 4_294_967_296)`. The value must
|
|
145
|
+
* be an integer in `[0, 2^32)`; anything else fails the build with
|
|
146
|
+
* `BuildError`. A journal-backed allocator is deferred (DESIGN §15).
|
|
147
|
+
*/
|
|
148
|
+
readonly nonce: Effect.Effect<number>;
|
|
149
|
+
}
|
|
150
|
+
/** The spec's defaults, in force whenever nothing overrides them. */
|
|
151
|
+
export declare const defaults: SubmitConfigService;
|
|
152
|
+
/**
|
|
153
|
+
* The lifecycle settings.
|
|
154
|
+
*
|
|
155
|
+
* Because this is a `Context.Reference` and not a service, it never appears in
|
|
156
|
+
* an `R`: a one-shot script gets the defaults with no wiring, and an
|
|
157
|
+
* application overrides what it cares about with
|
|
158
|
+
* `Effect.provideService(effect, SubmitConfig, { ...SubmitConfig.defaults, validFor: "30 seconds" })`.
|
|
159
|
+
*
|
|
160
|
+
* @example
|
|
161
|
+
* ```ts
|
|
162
|
+
* import { Effect } from "effect"
|
|
163
|
+
* import { SubmitConfig } from "@unconfirmed/sui-effect/tx"
|
|
164
|
+
*
|
|
165
|
+
* const strict = <A, E, R>(effect: Effect.Effect<A, E, R>) =>
|
|
166
|
+
* Effect.provideService(effect, SubmitConfig, {
|
|
167
|
+
* ...SubmitConfig.defaults,
|
|
168
|
+
* maxGasBudget: 100_000_000n as typeof SubmitConfig.defaults.maxGasBudget
|
|
169
|
+
* })
|
|
170
|
+
* ```
|
|
171
|
+
*/
|
|
172
|
+
export declare const SubmitConfig: Context.Reference<SubmitConfigService> & {
|
|
173
|
+
defaults: SubmitConfigService;
|
|
174
|
+
};
|
|
175
|
+
//# sourceMappingURL=SubmitConfig.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SubmitConfig.d.ts","sourceRoot":"","sources":["../../src/services/SubmitConfig.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAU,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAC5D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACpC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAG5D,wEAAwE;AACxE,MAAM,MAAM,gBAAgB,GAAG,aAAa,GAAG,OAAO,GAAG,MAAM,CAAA;AAE/D;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,MAAM,oBAAoB,GAAG,eAAe,GAAG,OAAO,CAAA;AAE5D,mFAAmF;AACnF,MAAM,WAAW,mBAAmB;IAClC;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAA;IACrC;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAA;IACrC;;;;OAIG;IACH,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAA;IAC3B;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAA;IAClF,wEAAwE;IACxE,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAA;IAC5B;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;IAC7C,mFAAmF;IACnF,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;IACjC;;;;OAIG;IACH,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC,QAAQ,CAAA;IAC1C;;;;;;;;OAQG;IACH,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,QAAQ,CAAA;IACxC;;;OAGG;IACH,QAAQ,CAAC,cAAc,EAAE,oBAAoB,CAAA;IAC7C;;;;;;;OAOG;IACH,QAAQ,CAAC,gBAAgB,EAAE,QAAQ,CAAC,QAAQ,CAAA;IAC5C;;;OAGG;IACH,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAA;IACjC;;;;OAIG;IACH,QAAQ,CAAC,iBAAiB,EAAE,QAAQ,CAAC,QAAQ,CAAA;IAC7C;;;;;;;;;;;;;;;;;;OAkBG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;CACtC;AAED,qEAAqE;AACrE,eAAO,MAAM,QAAQ,EAAE,mBAiBtB,CAAA;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,YAAY;;CAKxB,CAAA"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `SubmitConfig`: the knobs of the transaction lifecycle, as a
|
|
3
|
+
* `Context.Reference` so every default is in force with no setup and any of
|
|
4
|
+
* them can be overridden for one fiber.
|
|
5
|
+
*
|
|
6
|
+
* @since 0.1.0
|
|
7
|
+
*/
|
|
8
|
+
import { Context, Duration, Random, Schedule } from "effect";
|
|
9
|
+
import { U32_MAX } from "../domain/schemas.js";
|
|
10
|
+
/** The spec's defaults, in force whenever nothing overrides them. */
|
|
11
|
+
export const defaults = {
|
|
12
|
+
expiration: "validDuring",
|
|
13
|
+
// The protocol's own maximum gas budget (50 SUI). Lower it to cap spend.
|
|
14
|
+
maxGasBudget: 50000000000n,
|
|
15
|
+
lockSender: true,
|
|
16
|
+
resubmit: Schedule.min([
|
|
17
|
+
Schedule.exponential("250 millis"),
|
|
18
|
+
Schedule.spaced("30 seconds")
|
|
19
|
+
]).pipe(Schedule.jittered),
|
|
20
|
+
resubmitAttempts: 5,
|
|
21
|
+
executeTimeout: Duration.seconds(60),
|
|
22
|
+
expiryMargin: Duration.seconds(30),
|
|
23
|
+
expiryEvidence: "epochThenMiss",
|
|
24
|
+
reconcileRecheck: Duration.seconds(2),
|
|
25
|
+
awaitVisibility: true,
|
|
26
|
+
visibilityTimeout: Duration.seconds(15),
|
|
27
|
+
nonce: Random.nextIntBetween(0, U32_MAX)
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* The lifecycle settings.
|
|
31
|
+
*
|
|
32
|
+
* Because this is a `Context.Reference` and not a service, it never appears in
|
|
33
|
+
* an `R`: a one-shot script gets the defaults with no wiring, and an
|
|
34
|
+
* application overrides what it cares about with
|
|
35
|
+
* `Effect.provideService(effect, SubmitConfig, { ...SubmitConfig.defaults, validFor: "30 seconds" })`.
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```ts
|
|
39
|
+
* import { Effect } from "effect"
|
|
40
|
+
* import { SubmitConfig } from "@unconfirmed/sui-effect/tx"
|
|
41
|
+
*
|
|
42
|
+
* const strict = <A, E, R>(effect: Effect.Effect<A, E, R>) =>
|
|
43
|
+
* Effect.provideService(effect, SubmitConfig, {
|
|
44
|
+
* ...SubmitConfig.defaults,
|
|
45
|
+
* maxGasBudget: 100_000_000n as typeof SubmitConfig.defaults.maxGasBudget
|
|
46
|
+
* })
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
export const SubmitConfig = Object.assign(Context.Reference("@unconfirmed/sui-effect/SubmitConfig", {
|
|
50
|
+
defaultValue: () => defaults
|
|
51
|
+
}), { defaults });
|
|
52
|
+
//# sourceMappingURL=SubmitConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SubmitConfig.js","sourceRoot":"","sources":["../../src/services/SubmitConfig.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAI5D,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AA+I9C,qEAAqE;AACrE,MAAM,CAAC,MAAM,QAAQ,GAAwB;IAC3C,UAAU,EAAE,aAAa;IACzB,yEAAyE;IACzE,YAAY,EAAE,YAAuB;IACrC,UAAU,EAAE,IAAI;IAChB,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC;QACrB,QAAQ,CAAC,WAAW,CAAC,YAAY,CAAC;QAClC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC;KAC9B,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAC1B,gBAAgB,EAAE,CAAC;IACnB,cAAc,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;IACpC,YAAY,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;IAClC,cAAc,EAAE,eAAe;IAC/B,gBAAgB,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IACrC,eAAe,EAAE,IAAI;IACrB,iBAAiB,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;IACvC,KAAK,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,OAAO,CAAC;CACzC,CAAA;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CACvC,OAAO,CAAC,SAAS,CAAsB,sCAAsC,EAAE;IAC7E,YAAY,EAAE,GAAG,EAAE,CAAC,QAAQ;CAC7B,CAAC,EACF,EAAE,QAAQ,EAAE,CACb,CAAA"}
|