@stellar/stellar-sdk 16.0.1 → 16.2.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/README.md +41 -2
- package/dist/stellar-sdk-axios.js +5401 -3690
- package/dist/stellar-sdk-axios.js.map +1 -1
- package/dist/stellar-sdk-axios.min.js +12 -11
- package/dist/stellar-sdk-axios.min.js.map +1 -1
- package/dist/stellar-sdk.js +4850 -3681
- package/dist/stellar-sdk.js.map +1 -1
- package/dist/stellar-sdk.min.js +17 -17
- package/dist/stellar-sdk.min.js.map +1 -1
- package/lib/axios/cjs/base/auth.js +147 -30
- package/lib/axios/cjs/base/auth.js.map +1 -1
- package/lib/axios/cjs/base/index.js +113 -0
- package/lib/axios/cjs/base/index.js.map +1 -0
- package/lib/axios/cjs/base/keypair.js +39 -0
- package/lib/axios/cjs/base/keypair.js.map +1 -1
- package/lib/axios/cjs/base/scval.js +34 -0
- package/lib/axios/cjs/base/scval.js.map +1 -1
- package/lib/axios/cjs/bindings/client.js +170 -0
- package/lib/axios/cjs/bindings/client.js.map +1 -1
- package/lib/axios/cjs/bindings/config.js +1 -1
- package/lib/axios/cjs/bindings/generator.js +45 -16
- package/lib/axios/cjs/bindings/generator.js.map +1 -1
- package/lib/axios/cjs/bindings/types.js +151 -1
- package/lib/axios/cjs/bindings/types.js.map +1 -1
- package/lib/axios/cjs/bindings/utils.js +10 -0
- package/lib/axios/cjs/bindings/utils.js.map +1 -1
- package/lib/axios/cjs/cli/index.js +19 -22
- package/lib/axios/cjs/cli/index.js.map +1 -1
- package/lib/axios/cjs/cli/util.js +1 -20
- package/lib/axios/cjs/cli/util.js.map +1 -1
- package/lib/axios/cjs/contract/assembled_transaction.js +39 -17
- package/lib/axios/cjs/contract/assembled_transaction.js.map +1 -1
- package/lib/axios/cjs/contract/basic_node_signer.js +8 -42
- package/lib/axios/cjs/contract/basic_node_signer.js.map +1 -1
- package/lib/axios/cjs/contract/client.js +56 -3
- package/lib/axios/cjs/contract/client.js.map +1 -1
- package/lib/axios/cjs/contract/event_spec.js +164 -0
- package/lib/axios/cjs/contract/event_spec.js.map +1 -0
- package/lib/axios/cjs/contract/index.js +2 -0
- package/lib/axios/cjs/contract/index.js.map +1 -1
- package/lib/axios/cjs/contract/sent_transaction.js +0 -20
- package/lib/axios/cjs/contract/sent_transaction.js.map +1 -1
- package/lib/axios/cjs/contract/signer.js +96 -0
- package/lib/axios/cjs/contract/signer.js.map +1 -0
- package/lib/axios/cjs/contract/spec.js +107 -3
- package/lib/axios/cjs/contract/spec.js.map +1 -1
- package/lib/axios/cjs/contract/types.js.map +1 -1
- package/lib/axios/cjs/errors/transaction_failed.js +62 -0
- package/lib/axios/cjs/errors/transaction_failed.js.map +1 -0
- package/lib/axios/cjs/errors/wrap_http_error.js +20 -0
- package/lib/axios/cjs/errors/wrap_http_error.js.map +1 -0
- package/lib/axios/cjs/federation/server.js +15 -35
- package/lib/axios/cjs/federation/server.js.map +1 -1
- package/lib/axios/cjs/horizon/account_response.js +0 -20
- package/lib/axios/cjs/horizon/account_response.js.map +1 -1
- package/lib/axios/cjs/horizon/horizon_api.js +5 -0
- package/lib/axios/cjs/horizon/horizon_api.js.map +1 -1
- package/lib/axios/cjs/horizon/horizon_axios_client.js +1 -1
- package/lib/axios/cjs/horizon/server.js +20 -26
- package/lib/axios/cjs/horizon/server.js.map +1 -1
- package/lib/axios/cjs/index.js +66 -65
- package/lib/axios/cjs/index.js.map +1 -1
- package/lib/axios/cjs/rpc/api.js.map +1 -1
- package/lib/axios/cjs/rpc/axios.js +1 -1
- package/lib/axios/cjs/rpc/server.js +181 -13
- package/lib/axios/cjs/rpc/server.js.map +1 -1
- package/lib/axios/cjs/rpc/transaction.js +2 -20
- package/lib/axios/cjs/rpc/transaction.js.map +1 -1
- package/lib/axios/cjs/webauth/challenge_transaction.js +7 -22
- package/lib/axios/cjs/webauth/challenge_transaction.js.map +1 -1
- package/lib/axios/cjs/webauth/utils.js +1 -20
- package/lib/axios/cjs/webauth/utils.js.map +1 -1
- package/lib/axios/esm/base/auth.d.ts +181 -13
- package/lib/axios/esm/base/auth.js +146 -31
- package/lib/axios/esm/base/auth.js.map +1 -1
- package/lib/axios/esm/base/index.d.ts +2 -2
- package/lib/axios/esm/base/index.js +44 -0
- package/lib/axios/esm/base/index.js.map +1 -0
- package/lib/axios/esm/base/keypair.d.ts +27 -0
- package/lib/axios/esm/base/keypair.js +39 -0
- package/lib/axios/esm/base/keypair.js.map +1 -1
- package/lib/axios/esm/base/scval.d.ts +4 -0
- package/lib/axios/esm/base/scval.js +34 -0
- package/lib/axios/esm/base/scval.js.map +1 -1
- package/lib/axios/esm/bindings/client.d.ts +39 -0
- package/lib/axios/esm/bindings/client.js +171 -1
- package/lib/axios/esm/bindings/client.js.map +1 -1
- package/lib/axios/esm/bindings/config.js +1 -1
- package/lib/axios/esm/bindings/generator.d.ts +34 -0
- package/lib/axios/esm/bindings/generator.js +45 -16
- package/lib/axios/esm/bindings/generator.js.map +1 -1
- package/lib/axios/esm/bindings/types.d.ts +42 -0
- package/lib/axios/esm/bindings/types.js +153 -3
- package/lib/axios/esm/bindings/types.js.map +1 -1
- package/lib/axios/esm/bindings/utils.d.ts +10 -0
- package/lib/axios/esm/bindings/utils.js +9 -1
- package/lib/axios/esm/bindings/utils.js.map +1 -1
- package/lib/axios/esm/cli/index.js +19 -22
- package/lib/axios/esm/cli/index.js.map +1 -1
- package/lib/axios/esm/cli/util.d.ts +1 -1
- package/lib/axios/esm/cli/util.js +1 -20
- package/lib/axios/esm/cli/util.js.map +1 -1
- package/lib/axios/esm/contract/assembled_transaction.d.ts +7 -5
- package/lib/axios/esm/contract/assembled_transaction.js +39 -17
- package/lib/axios/esm/contract/assembled_transaction.js.map +1 -1
- package/lib/axios/esm/contract/basic_node_signer.d.ts +3 -0
- package/lib/axios/esm/contract/basic_node_signer.js +8 -42
- package/lib/axios/esm/contract/basic_node_signer.js.map +1 -1
- package/lib/axios/esm/contract/client.d.ts +49 -3
- package/lib/axios/esm/contract/client.js +56 -3
- package/lib/axios/esm/contract/client.js.map +1 -1
- package/lib/axios/esm/contract/event_spec.d.ts +78 -0
- package/lib/axios/esm/contract/event_spec.js +159 -0
- package/lib/axios/esm/contract/event_spec.js.map +1 -0
- package/lib/axios/esm/contract/index.d.ts +3 -0
- package/lib/axios/esm/contract/index.js +1 -0
- package/lib/axios/esm/contract/index.js.map +1 -1
- package/lib/axios/esm/contract/sent_transaction.js +0 -20
- package/lib/axios/esm/contract/sent_transaction.js.map +1 -1
- package/lib/axios/esm/contract/signer.d.ts +104 -0
- package/lib/axios/esm/contract/signer.js +91 -0
- package/lib/axios/esm/contract/signer.js.map +1 -0
- package/lib/axios/esm/contract/spec.d.ts +84 -0
- package/lib/axios/esm/contract/spec.js +107 -3
- package/lib/axios/esm/contract/spec.js.map +1 -1
- package/lib/axios/esm/contract/types.d.ts +25 -8
- package/lib/axios/esm/contract/types.js.map +1 -1
- package/lib/axios/esm/errors/index.d.ts +1 -0
- package/lib/axios/esm/errors/transaction_failed.d.ts +55 -0
- package/lib/axios/esm/errors/transaction_failed.js +60 -0
- package/lib/axios/esm/errors/transaction_failed.js.map +1 -0
- package/lib/axios/esm/errors/wrap_http_error.d.ts +20 -0
- package/lib/axios/esm/errors/wrap_http_error.js +18 -0
- package/lib/axios/esm/errors/wrap_http_error.js.map +1 -0
- package/lib/axios/esm/federation/server.js +15 -35
- package/lib/axios/esm/federation/server.js.map +1 -1
- package/lib/axios/esm/horizon/account_response.js +0 -20
- package/lib/axios/esm/horizon/account_response.js.map +1 -1
- package/lib/axios/esm/horizon/horizon_api.d.ts +12 -1
- package/lib/axios/esm/horizon/horizon_api.js +5 -0
- package/lib/axios/esm/horizon/horizon_api.js.map +1 -1
- package/lib/axios/esm/horizon/horizon_axios_client.js +1 -1
- package/lib/axios/esm/horizon/server.d.ts +10 -4
- package/lib/axios/esm/horizon/server.js +20 -26
- package/lib/axios/esm/horizon/server.js.map +1 -1
- package/lib/axios/esm/index.js +27 -29
- package/lib/axios/esm/index.js.map +1 -1
- package/lib/axios/esm/rpc/api.d.ts +21 -0
- package/lib/axios/esm/rpc/api.js.map +1 -1
- package/lib/axios/esm/rpc/axios.js +1 -1
- package/lib/axios/esm/rpc/server.d.ts +115 -3
- package/lib/axios/esm/rpc/server.js +181 -13
- package/lib/axios/esm/rpc/server.js.map +1 -1
- package/lib/axios/esm/rpc/transaction.js +2 -20
- package/lib/axios/esm/rpc/transaction.js.map +1 -1
- package/lib/axios/esm/webauth/challenge_transaction.js +7 -22
- package/lib/axios/esm/webauth/challenge_transaction.js.map +1 -1
- package/lib/axios/esm/webauth/utils.js +1 -20
- package/lib/axios/esm/webauth/utils.js.map +1 -1
- package/lib/cjs/base/auth.js +147 -30
- package/lib/cjs/base/auth.js.map +1 -1
- package/lib/cjs/base/index.js +113 -0
- package/lib/cjs/base/index.js.map +1 -0
- package/lib/cjs/base/keypair.js +39 -0
- package/lib/cjs/base/keypair.js.map +1 -1
- package/lib/cjs/base/scval.js +34 -0
- package/lib/cjs/base/scval.js.map +1 -1
- package/lib/cjs/bindings/client.js +170 -0
- package/lib/cjs/bindings/client.js.map +1 -1
- package/lib/cjs/bindings/config.js +1 -1
- package/lib/cjs/bindings/generator.js +45 -16
- package/lib/cjs/bindings/generator.js.map +1 -1
- package/lib/cjs/bindings/types.js +151 -1
- package/lib/cjs/bindings/types.js.map +1 -1
- package/lib/cjs/bindings/utils.js +10 -0
- package/lib/cjs/bindings/utils.js.map +1 -1
- package/lib/cjs/cli/index.js +19 -22
- package/lib/cjs/cli/index.js.map +1 -1
- package/lib/cjs/cli/util.js +1 -20
- package/lib/cjs/cli/util.js.map +1 -1
- package/lib/cjs/contract/assembled_transaction.js +39 -17
- package/lib/cjs/contract/assembled_transaction.js.map +1 -1
- package/lib/cjs/contract/basic_node_signer.js +8 -42
- package/lib/cjs/contract/basic_node_signer.js.map +1 -1
- package/lib/cjs/contract/client.js +56 -3
- package/lib/cjs/contract/client.js.map +1 -1
- package/lib/cjs/contract/event_spec.js +164 -0
- package/lib/cjs/contract/event_spec.js.map +1 -0
- package/lib/cjs/contract/index.js +2 -0
- package/lib/cjs/contract/index.js.map +1 -1
- package/lib/cjs/contract/sent_transaction.js +0 -20
- package/lib/cjs/contract/sent_transaction.js.map +1 -1
- package/lib/cjs/contract/signer.js +96 -0
- package/lib/cjs/contract/signer.js.map +1 -0
- package/lib/cjs/contract/spec.js +107 -3
- package/lib/cjs/contract/spec.js.map +1 -1
- package/lib/cjs/contract/types.js.map +1 -1
- package/lib/cjs/errors/transaction_failed.js +62 -0
- package/lib/cjs/errors/transaction_failed.js.map +1 -0
- package/lib/cjs/errors/wrap_http_error.js +20 -0
- package/lib/cjs/errors/wrap_http_error.js.map +1 -0
- package/lib/cjs/federation/server.js +15 -35
- package/lib/cjs/federation/server.js.map +1 -1
- package/lib/cjs/horizon/account_response.js +0 -20
- package/lib/cjs/horizon/account_response.js.map +1 -1
- package/lib/cjs/horizon/horizon_api.js +5 -0
- package/lib/cjs/horizon/horizon_api.js.map +1 -1
- package/lib/cjs/horizon/horizon_axios_client.js +1 -1
- package/lib/cjs/horizon/server.js +20 -26
- package/lib/cjs/horizon/server.js.map +1 -1
- package/lib/cjs/index.js +66 -65
- package/lib/cjs/index.js.map +1 -1
- package/lib/cjs/rpc/api.js.map +1 -1
- package/lib/cjs/rpc/axios.js +1 -1
- package/lib/cjs/rpc/server.js +181 -13
- package/lib/cjs/rpc/server.js.map +1 -1
- package/lib/cjs/rpc/transaction.js +2 -20
- package/lib/cjs/rpc/transaction.js.map +1 -1
- package/lib/cjs/webauth/challenge_transaction.js +7 -22
- package/lib/cjs/webauth/challenge_transaction.js.map +1 -1
- package/lib/cjs/webauth/utils.js +1 -20
- package/lib/cjs/webauth/utils.js.map +1 -1
- package/lib/esm/base/auth.d.ts +181 -13
- package/lib/esm/base/auth.js +146 -31
- package/lib/esm/base/auth.js.map +1 -1
- package/lib/esm/base/index.d.ts +2 -2
- package/lib/esm/base/index.js +44 -0
- package/lib/esm/base/index.js.map +1 -0
- package/lib/esm/base/keypair.d.ts +27 -0
- package/lib/esm/base/keypair.js +39 -0
- package/lib/esm/base/keypair.js.map +1 -1
- package/lib/esm/base/scval.d.ts +4 -0
- package/lib/esm/base/scval.js +34 -0
- package/lib/esm/base/scval.js.map +1 -1
- package/lib/esm/bindings/client.d.ts +39 -0
- package/lib/esm/bindings/client.js +171 -1
- package/lib/esm/bindings/client.js.map +1 -1
- package/lib/esm/bindings/config.js +1 -1
- package/lib/esm/bindings/generator.d.ts +34 -0
- package/lib/esm/bindings/generator.js +45 -16
- package/lib/esm/bindings/generator.js.map +1 -1
- package/lib/esm/bindings/types.d.ts +42 -0
- package/lib/esm/bindings/types.js +153 -3
- package/lib/esm/bindings/types.js.map +1 -1
- package/lib/esm/bindings/utils.d.ts +10 -0
- package/lib/esm/bindings/utils.js +9 -1
- package/lib/esm/bindings/utils.js.map +1 -1
- package/lib/esm/cli/index.js +19 -22
- package/lib/esm/cli/index.js.map +1 -1
- package/lib/esm/cli/util.d.ts +1 -1
- package/lib/esm/cli/util.js +1 -20
- package/lib/esm/cli/util.js.map +1 -1
- package/lib/esm/contract/assembled_transaction.d.ts +7 -5
- package/lib/esm/contract/assembled_transaction.js +39 -17
- package/lib/esm/contract/assembled_transaction.js.map +1 -1
- package/lib/esm/contract/basic_node_signer.d.ts +3 -0
- package/lib/esm/contract/basic_node_signer.js +8 -42
- package/lib/esm/contract/basic_node_signer.js.map +1 -1
- package/lib/esm/contract/client.d.ts +49 -3
- package/lib/esm/contract/client.js +56 -3
- package/lib/esm/contract/client.js.map +1 -1
- package/lib/esm/contract/event_spec.d.ts +78 -0
- package/lib/esm/contract/event_spec.js +159 -0
- package/lib/esm/contract/event_spec.js.map +1 -0
- package/lib/esm/contract/index.d.ts +3 -0
- package/lib/esm/contract/index.js +1 -0
- package/lib/esm/contract/index.js.map +1 -1
- package/lib/esm/contract/sent_transaction.js +0 -20
- package/lib/esm/contract/sent_transaction.js.map +1 -1
- package/lib/esm/contract/signer.d.ts +104 -0
- package/lib/esm/contract/signer.js +91 -0
- package/lib/esm/contract/signer.js.map +1 -0
- package/lib/esm/contract/spec.d.ts +84 -0
- package/lib/esm/contract/spec.js +107 -3
- package/lib/esm/contract/spec.js.map +1 -1
- package/lib/esm/contract/types.d.ts +25 -8
- package/lib/esm/contract/types.js.map +1 -1
- package/lib/esm/errors/index.d.ts +1 -0
- package/lib/esm/errors/transaction_failed.d.ts +55 -0
- package/lib/esm/errors/transaction_failed.js +60 -0
- package/lib/esm/errors/transaction_failed.js.map +1 -0
- package/lib/esm/errors/wrap_http_error.d.ts +20 -0
- package/lib/esm/errors/wrap_http_error.js +18 -0
- package/lib/esm/errors/wrap_http_error.js.map +1 -0
- package/lib/esm/federation/server.js +15 -35
- package/lib/esm/federation/server.js.map +1 -1
- package/lib/esm/horizon/account_response.js +0 -20
- package/lib/esm/horizon/account_response.js.map +1 -1
- package/lib/esm/horizon/horizon_api.d.ts +12 -1
- package/lib/esm/horizon/horizon_api.js +5 -0
- package/lib/esm/horizon/horizon_api.js.map +1 -1
- package/lib/esm/horizon/horizon_axios_client.js +1 -1
- package/lib/esm/horizon/server.d.ts +10 -4
- package/lib/esm/horizon/server.js +20 -26
- package/lib/esm/horizon/server.js.map +1 -1
- package/lib/esm/index.js +27 -29
- package/lib/esm/index.js.map +1 -1
- package/lib/esm/rpc/api.d.ts +21 -0
- package/lib/esm/rpc/api.js.map +1 -1
- package/lib/esm/rpc/axios.js +1 -1
- package/lib/esm/rpc/server.d.ts +115 -3
- package/lib/esm/rpc/server.js +181 -13
- package/lib/esm/rpc/server.js.map +1 -1
- package/lib/esm/rpc/transaction.js +2 -20
- package/lib/esm/rpc/transaction.js.map +1 -1
- package/lib/esm/webauth/challenge_transaction.js +7 -22
- package/lib/esm/webauth/challenge_transaction.js.map +1 -1
- package/lib/esm/webauth/utils.js +1 -20
- package/lib/esm/webauth/utils.js.map +1 -1
- package/package.json +35 -30
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keypair.js","sources":["../../../../src/base/keypair.ts"],"sourcesContent":["import * as ed from \"@noble/ed25519\";\nimport { sha512 } from \"@noble/hashes/sha2.js\";\nimport { sign, verify, generate } from \"./signing.js\";\nimport { StrKey } from \"./strkey.js\";\nimport { hash } from \"./hashing.js\";\n\nimport xdr from \"./xdr.js\";\n\ned.hashes.sha512 = sha512;\n/**\n * `Keypair` represents public (and secret) keys of the account.\n *\n * Currently `Keypair` only supports ed25519 but in a future this class can be abstraction layer for other\n * public-key signature systems.\n *\n * Use more convenient methods to create `Keypair` object:\n * * `{@link Keypair.fromPublicKey}`\n * * `{@link Keypair.fromSecret}`\n * * `{@link Keypair.random}`\n */\nexport class Keypair {\n readonly type: \"ed25519\";\n private _publicKey: Buffer;\n private _secretSeed?: Buffer;\n private _secretKey?: Buffer;\n\n /**\n * @param keys - at least one of keys must be provided.\n * - `type`: public-key signature system name (currently only `ed25519` keys are supported)\n * - `publicKey`: raw public key\n * - `secretKey`: raw secret key (32-byte secret seed in ed25519)\n */\n constructor(\n keys:\n | {\n type: \"ed25519\";\n secretKey: Buffer | string;\n publicKey?: Buffer | string;\n }\n | { type: \"ed25519\"; publicKey: Buffer | string },\n ) {\n if (keys.type !== \"ed25519\") {\n throw new Error(\"Invalid keys type\");\n }\n\n this.type = keys.type;\n\n if (\"secretKey\" in keys) {\n keys.secretKey = Buffer.from(keys.secretKey);\n\n if (keys.secretKey.length !== 32) {\n throw new Error(\"secretKey length is invalid\");\n }\n\n this._secretSeed = keys.secretKey;\n this._publicKey = generate(keys.secretKey);\n this._secretKey = keys.secretKey;\n\n if (\n keys.publicKey &&\n !this._publicKey.equals(Buffer.from(keys.publicKey))\n ) {\n throw new Error(\"secretKey does not match publicKey\");\n }\n } else if (\"publicKey\" in keys) {\n this._publicKey = Buffer.from(keys.publicKey);\n\n if (this._publicKey.length !== 32) {\n throw new Error(\"publicKey length is invalid\");\n }\n } else {\n throw new Error(\n \"At least one of publicKey or secretKey must be provided\",\n );\n }\n }\n\n /**\n * Creates a new `Keypair` instance from secret. This can either be secret key or secret seed depending\n * on underlying public-key signature system. Currently `Keypair` only supports ed25519.\n * @param secret - secret key (ex. `SDAK....`)\n */\n static fromSecret(secret: string): Keypair {\n const rawSecret = StrKey.decodeEd25519SecretSeed(secret);\n return this.fromRawEd25519Seed(rawSecret);\n }\n\n /**\n * Creates a new `Keypair` object from ed25519 secret key seed raw bytes.\n *\n * @param rawSeed - raw 32-byte ed25519 secret key seed\n */\n static fromRawEd25519Seed(rawSeed: Buffer): Keypair {\n return new this({ type: \"ed25519\", secretKey: rawSeed });\n }\n\n /**\n * Returns `Keypair` object representing network master key.\n * @param networkPassphrase - passphrase of the target stellar network (e.g. \"Public Global Stellar Network ; September 2015\")\n */\n static master(networkPassphrase: string): Keypair {\n if (!networkPassphrase) {\n throw new Error(\n \"No network selected. Please pass a network argument, e.g. `Keypair.master(Networks.PUBLIC)`.\",\n );\n }\n\n return this.fromRawEd25519Seed(hash(networkPassphrase));\n }\n\n /**\n * Creates a new `Keypair` object from public key.\n * @param publicKey - public key (ex. `GB3KJPLFUYN5VL6R3GU3EGCGVCKFDSD7BEDX42HWG5BWFKB3KQGJJRMA`)\n */\n static fromPublicKey(publicKey: string): Keypair {\n const publicKeyBuffer = StrKey.decodeEd25519PublicKey(publicKey);\n if (publicKeyBuffer.length !== 32) {\n throw new Error(\"Invalid Stellar public key\");\n }\n\n return new this({ type: \"ed25519\", publicKey: publicKeyBuffer });\n }\n\n /**\n * Create a random `Keypair` object.\n */\n static random(): Keypair {\n const secretKey = ed.utils.randomSecretKey();\n return this.fromRawEd25519Seed(Buffer.from(secretKey));\n }\n\n /** Returns this public key as an xdr.AccountId. */\n xdrAccountId(): xdr.AccountId {\n return xdr.PublicKey.publicKeyTypeEd25519(this._publicKey);\n }\n\n /** Returns this public key as an xdr.PublicKey. */\n xdrPublicKey(): xdr.PublicKey {\n return xdr.PublicKey.publicKeyTypeEd25519(this._publicKey);\n }\n\n /**\n * Creates a {@link xdr.MuxedAccount} object from the public key.\n *\n * You will get a different type of muxed account depending on whether or not\n * you pass an ID.\n *\n * @param id - (optional) stringified integer indicating the underlying muxed\n * ID of the new account object\n */\n xdrMuxedAccount(id?: string): xdr.MuxedAccount {\n if (typeof id !== \"undefined\") {\n if (typeof id !== \"string\") {\n throw new TypeError(`expected string for ID, got ${typeof id}`);\n }\n\n return xdr.MuxedAccount.keyTypeMuxedEd25519(\n new xdr.MuxedAccountMed25519({\n id: xdr.Uint64.fromString(id),\n ed25519: this._publicKey,\n }),\n );\n }\n\n return xdr.MuxedAccount.keyTypeEd25519(this._publicKey);\n }\n\n /**\n * Returns raw public key bytes\n */\n rawPublicKey(): Buffer {\n return this._publicKey;\n }\n\n /**\n * Returns the signature hint for this keypair.\n * The hint is the last 4 bytes of the account ID XDR representation.\n */\n signatureHint(): Buffer {\n const a = this.xdrAccountId().toXDR();\n\n return a.subarray(a.length - 4);\n }\n\n /**\n * Returns public key associated with this `Keypair` object.\n */\n publicKey(): string {\n return StrKey.encodeEd25519PublicKey(this._publicKey);\n }\n\n /**\n * Returns secret key associated with this `Keypair` object.\n *\n * The secret key is encoded in Stellar format (e.g., `SDAK....`).\n *\n * @throws if no secret key is available\n */\n secret(): string {\n if (!this._secretSeed) {\n throw new Error(\"no secret key available\");\n }\n\n if (this.type === \"ed25519\") {\n return StrKey.encodeEd25519SecretSeed(this._secretSeed);\n }\n\n throw new Error(\"Invalid Keypair type\");\n }\n\n /**\n * Returns raw secret key bytes.\n *\n * @throws if no secret seed is available\n */\n rawSecretKey(): Buffer {\n if (!this._secretSeed) {\n throw new Error(\"no secret seed available\");\n }\n return this._secretSeed;\n }\n\n /**\n * Returns `true` if this `Keypair` object contains secret key and can sign.\n */\n canSign(): boolean {\n return !!this._secretKey;\n }\n\n /**\n * Signs data.\n *\n * @param data - data to sign\n * @throws if no secret key is available\n */\n sign(data: Buffer): Buffer {\n if (!this._secretKey) {\n throw new Error(\"cannot sign: no secret key available\");\n }\n\n return sign(data, this._secretKey);\n }\n\n /**\n * Verifies if `signature` for `data` is valid.\n *\n * @param data - signed data\n * @param signature - signature to verify\n */\n verify(data: Buffer, signature: Buffer): boolean {\n try {\n return verify(data, signature, this._publicKey);\n } catch {\n return false;\n }\n }\n\n /**\n * Returns the decorated signature (hint+sig) for arbitrary data.\n *\n * The returned structure can be added directly to a transaction envelope.\n *\n * @param data - arbitrary data to sign\n *\n * @see TransactionBase.addDecoratedSignature\n */\n signDecorated(data: Buffer): xdr.DecoratedSignature {\n const signature = this.sign(data);\n const hint = this.signatureHint();\n\n return new xdr.DecoratedSignature({ hint, signature });\n }\n\n /**\n * Returns the raw decorated signature (hint+sig) for a signed payload signer.\n *\n * The hint is defined as the last 4 bytes of the signer key XORed with last\n * 4 bytes of the payload (zero-left-padded if necessary).\n *\n * @param data - data to both sign and treat as the payload\n *\n * @see https://github.com/stellar/stellar-protocol/blob/master/core/cap-0040.md#signature-hint\n * @see TransactionBase.addDecoratedSignature\n */\n signPayloadDecorated(data: Buffer): xdr.DecoratedSignature {\n // Ensure data is a Buffer to support array-like inputs\n const dataBuffer = Buffer.isBuffer(data) ? data : Buffer.from(data);\n\n const signature = this.sign(dataBuffer);\n const keyHint = this.signatureHint();\n\n let hint = Buffer.from(dataBuffer.subarray(-4));\n if (hint.length < 4) {\n // append zeroes as needed\n hint = Buffer.concat([hint, Buffer.alloc(4 - hint.length, 0)]);\n }\n\n // XOR each byte of hint with corresponding byte of keyHint\n for (let i = 0; i < hint.length; i++) {\n hint[i] = (hint[i] as number) ^ (keyHint[i] as number);\n }\n\n return new xdr.DecoratedSignature({\n hint,\n signature,\n });\n }\n}\n"],"names":["ed","sha512","Buffer","generate","StrKey","hash","xdr","sign","verify"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"keypair.js","sources":["../../../../src/base/keypair.ts"],"sourcesContent":["import * as ed from \"@noble/ed25519\";\nimport { sha512 } from \"@noble/hashes/sha2.js\";\nimport { sign, verify, generate } from \"./signing.js\";\nimport { StrKey } from \"./strkey.js\";\nimport { hash } from \"./hashing.js\";\n\nimport xdr from \"./xdr.js\";\n\ned.hashes.sha512 = sha512;\n\n// SEP-53: fixed prefix prepended to a message before hashing and signing.\nconst MESSAGE_PREFIX = Buffer.from(\"Stellar Signed Message:\\n\", \"utf8\");\n\n/**\n * `Keypair` represents public (and secret) keys of the account.\n *\n * Currently `Keypair` only supports ed25519 but in a future this class can be abstraction layer for other\n * public-key signature systems.\n *\n * Use more convenient methods to create `Keypair` object:\n * * `{@link Keypair.fromPublicKey}`\n * * `{@link Keypair.fromSecret}`\n * * `{@link Keypair.random}`\n */\nexport class Keypair {\n readonly type: \"ed25519\";\n private _publicKey: Buffer;\n private _secretSeed?: Buffer;\n private _secretKey?: Buffer;\n\n /**\n * @param keys - at least one of keys must be provided.\n * - `type`: public-key signature system name (currently only `ed25519` keys are supported)\n * - `publicKey`: raw public key\n * - `secretKey`: raw secret key (32-byte secret seed in ed25519)\n */\n constructor(\n keys:\n | {\n type: \"ed25519\";\n secretKey: Buffer | string;\n publicKey?: Buffer | string;\n }\n | { type: \"ed25519\"; publicKey: Buffer | string },\n ) {\n if (keys.type !== \"ed25519\") {\n throw new Error(\"Invalid keys type\");\n }\n\n this.type = keys.type;\n\n if (\"secretKey\" in keys) {\n keys.secretKey = Buffer.from(keys.secretKey);\n\n if (keys.secretKey.length !== 32) {\n throw new Error(\"secretKey length is invalid\");\n }\n\n this._secretSeed = keys.secretKey;\n this._publicKey = generate(keys.secretKey);\n this._secretKey = keys.secretKey;\n\n if (\n keys.publicKey &&\n !this._publicKey.equals(Buffer.from(keys.publicKey))\n ) {\n throw new Error(\"secretKey does not match publicKey\");\n }\n } else if (\"publicKey\" in keys) {\n this._publicKey = Buffer.from(keys.publicKey);\n\n if (this._publicKey.length !== 32) {\n throw new Error(\"publicKey length is invalid\");\n }\n } else {\n throw new Error(\n \"At least one of publicKey or secretKey must be provided\",\n );\n }\n }\n\n /**\n * Creates a new `Keypair` instance from secret. This can either be secret key or secret seed depending\n * on underlying public-key signature system. Currently `Keypair` only supports ed25519.\n * @param secret - secret key (ex. `SDAK....`)\n */\n static fromSecret(secret: string): Keypair {\n const rawSecret = StrKey.decodeEd25519SecretSeed(secret);\n return this.fromRawEd25519Seed(rawSecret);\n }\n\n /**\n * Creates a new `Keypair` object from ed25519 secret key seed raw bytes.\n *\n * @param rawSeed - raw 32-byte ed25519 secret key seed\n */\n static fromRawEd25519Seed(rawSeed: Buffer): Keypair {\n return new this({ type: \"ed25519\", secretKey: rawSeed });\n }\n\n /**\n * Returns `Keypair` object representing network master key.\n * @param networkPassphrase - passphrase of the target stellar network (e.g. \"Public Global Stellar Network ; September 2015\")\n */\n static master(networkPassphrase: string): Keypair {\n if (!networkPassphrase) {\n throw new Error(\n \"No network selected. Please pass a network argument, e.g. `Keypair.master(Networks.PUBLIC)`.\",\n );\n }\n\n return this.fromRawEd25519Seed(hash(networkPassphrase));\n }\n\n /**\n * Creates a new `Keypair` object from public key.\n * @param publicKey - public key (ex. `GB3KJPLFUYN5VL6R3GU3EGCGVCKFDSD7BEDX42HWG5BWFKB3KQGJJRMA`)\n */\n static fromPublicKey(publicKey: string): Keypair {\n const publicKeyBuffer = StrKey.decodeEd25519PublicKey(publicKey);\n if (publicKeyBuffer.length !== 32) {\n throw new Error(\"Invalid Stellar public key\");\n }\n\n return new this({ type: \"ed25519\", publicKey: publicKeyBuffer });\n }\n\n /**\n * Create a random `Keypair` object.\n */\n static random(): Keypair {\n const secretKey = ed.utils.randomSecretKey();\n return this.fromRawEd25519Seed(Buffer.from(secretKey));\n }\n\n /** Returns this public key as an xdr.AccountId. */\n xdrAccountId(): xdr.AccountId {\n return xdr.PublicKey.publicKeyTypeEd25519(this._publicKey);\n }\n\n /** Returns this public key as an xdr.PublicKey. */\n xdrPublicKey(): xdr.PublicKey {\n return xdr.PublicKey.publicKeyTypeEd25519(this._publicKey);\n }\n\n /**\n * Creates a {@link xdr.MuxedAccount} object from the public key.\n *\n * You will get a different type of muxed account depending on whether or not\n * you pass an ID.\n *\n * @param id - (optional) stringified integer indicating the underlying muxed\n * ID of the new account object\n */\n xdrMuxedAccount(id?: string): xdr.MuxedAccount {\n if (typeof id !== \"undefined\") {\n if (typeof id !== \"string\") {\n throw new TypeError(`expected string for ID, got ${typeof id}`);\n }\n\n return xdr.MuxedAccount.keyTypeMuxedEd25519(\n new xdr.MuxedAccountMed25519({\n id: xdr.Uint64.fromString(id),\n ed25519: this._publicKey,\n }),\n );\n }\n\n return xdr.MuxedAccount.keyTypeEd25519(this._publicKey);\n }\n\n /**\n * Returns raw public key bytes\n */\n rawPublicKey(): Buffer {\n return this._publicKey;\n }\n\n /**\n * Returns the signature hint for this keypair.\n * The hint is the last 4 bytes of the account ID XDR representation.\n */\n signatureHint(): Buffer {\n const a = this.xdrAccountId().toXDR();\n\n return a.subarray(a.length - 4);\n }\n\n /**\n * Returns public key associated with this `Keypair` object.\n */\n publicKey(): string {\n return StrKey.encodeEd25519PublicKey(this._publicKey);\n }\n\n /**\n * Returns secret key associated with this `Keypair` object.\n *\n * The secret key is encoded in Stellar format (e.g., `SDAK....`).\n *\n * @throws if no secret key is available\n */\n secret(): string {\n if (!this._secretSeed) {\n throw new Error(\"no secret key available\");\n }\n\n if (this.type === \"ed25519\") {\n return StrKey.encodeEd25519SecretSeed(this._secretSeed);\n }\n\n throw new Error(\"Invalid Keypair type\");\n }\n\n /**\n * Returns raw secret key bytes.\n *\n * @throws if no secret seed is available\n */\n rawSecretKey(): Buffer {\n if (!this._secretSeed) {\n throw new Error(\"no secret seed available\");\n }\n return this._secretSeed;\n }\n\n /**\n * Returns `true` if this `Keypair` object contains secret key and can sign.\n */\n canSign(): boolean {\n return !!this._secretKey;\n }\n\n /**\n * Signs data.\n *\n * @param data - data to sign\n * @throws if no secret key is available\n */\n sign(data: Buffer): Buffer {\n if (!this._secretKey) {\n throw new Error(\"cannot sign: no secret key available\");\n }\n\n return sign(data, this._secretKey);\n }\n\n /**\n * Verifies if `signature` for `data` is valid.\n *\n * @param data - signed data\n * @param signature - signature to verify\n */\n verify(data: Buffer, signature: Buffer): boolean {\n try {\n return verify(data, signature, this._publicKey);\n } catch {\n return false;\n }\n }\n\n /**\n * Signs an arbitrary message per SEP-53.\n *\n * The message is UTF-8 encoded (if a string), prefixed with the fixed\n * `\"Stellar Signed Message:\\n\"` marker, hashed with SHA-256, and that hash is\n * signed with this keypair's ed25519 secret key.\n *\n * @param message - the message to sign (a UTF-8 string or raw bytes)\n * @returns the 64-byte ed25519 signature\n * @throws if no secret key is available\n * @see https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0053.md\n */\n signMessage(message: string | Buffer): Buffer {\n return this.sign(this._hashMessage(message));\n }\n\n /**\n * Verifies a SEP-53 signed message against this keypair's public key.\n *\n * @param message - the original message (a UTF-8 string or raw bytes)\n * @param signature - the 64-byte signature to verify\n * @returns `true` if `signature` is valid for `message` and this key\n * @see https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0053.md\n */\n verifyMessage(message: string | Buffer, signature: Buffer): boolean {\n try {\n return this.verify(this._hashMessage(message), signature);\n } catch {\n // Mirror `verify`: never throw on bad input, just report invalid.\n return false;\n }\n }\n\n /**\n * Computes the SEP-53 message hash:\n * `SHA-256(\"Stellar Signed Message:\\n\" + message)`.\n */\n private _hashMessage(message: string | Buffer): Buffer {\n const messageBytes =\n typeof message === \"string\" ? Buffer.from(message, \"utf8\") : message;\n return hash(Buffer.concat([MESSAGE_PREFIX, messageBytes]));\n }\n\n /**\n * Returns the decorated signature (hint+sig) for arbitrary data.\n *\n * The returned structure can be added directly to a transaction envelope.\n *\n * @param data - arbitrary data to sign\n *\n * @see TransactionBase.addDecoratedSignature\n */\n signDecorated(data: Buffer): xdr.DecoratedSignature {\n const signature = this.sign(data);\n const hint = this.signatureHint();\n\n return new xdr.DecoratedSignature({ hint, signature });\n }\n\n /**\n * Returns the raw decorated signature (hint+sig) for a signed payload signer.\n *\n * The hint is defined as the last 4 bytes of the signer key XORed with last\n * 4 bytes of the payload (zero-left-padded if necessary).\n *\n * @param data - data to both sign and treat as the payload\n *\n * @see https://github.com/stellar/stellar-protocol/blob/master/core/cap-0040.md#signature-hint\n * @see TransactionBase.addDecoratedSignature\n */\n signPayloadDecorated(data: Buffer): xdr.DecoratedSignature {\n // Ensure data is a Buffer to support array-like inputs\n const dataBuffer = Buffer.isBuffer(data) ? data : Buffer.from(data);\n\n const signature = this.sign(dataBuffer);\n const keyHint = this.signatureHint();\n\n let hint = Buffer.from(dataBuffer.subarray(-4));\n if (hint.length < 4) {\n // append zeroes as needed\n hint = Buffer.concat([hint, Buffer.alloc(4 - hint.length, 0)]);\n }\n\n // XOR each byte of hint with corresponding byte of keyHint\n for (let i = 0; i < hint.length; i++) {\n hint[i] = (hint[i] as number) ^ (keyHint[i] as number);\n }\n\n return new xdr.DecoratedSignature({\n hint,\n signature,\n });\n }\n}\n"],"names":["ed","sha512","Buffer","generate","StrKey","hash","xdr","sign","verify"],"mappings":"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"}
|
|
@@ -61,6 +61,40 @@ function nativeToScVal(val, opts = {}) {
|
|
|
61
61
|
})
|
|
62
62
|
);
|
|
63
63
|
}
|
|
64
|
+
if (val instanceof Map) {
|
|
65
|
+
let uniformKeyType = null;
|
|
66
|
+
let uniformValType = null;
|
|
67
|
+
let perKeySpec = null;
|
|
68
|
+
if (Array.isArray(opts.type)) {
|
|
69
|
+
if (opts.type.length > 2) {
|
|
70
|
+
throw new TypeError(
|
|
71
|
+
`expected a [keyType, valType] pair for a Map, got ${JSON.stringify(opts.type)}`
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
[uniformKeyType = null, uniformValType = null] = opts.type;
|
|
75
|
+
} else if (typeof opts.type === "object" && opts.type !== null) {
|
|
76
|
+
perKeySpec = opts.type;
|
|
77
|
+
} else if (opts.type !== void 0) {
|
|
78
|
+
throw new TypeError(
|
|
79
|
+
`invalid type (${JSON.stringify(opts.type)}) specified for a Map`
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
const entries = [];
|
|
83
|
+
for (const [k, v] of val) {
|
|
84
|
+
let keyType = uniformKeyType;
|
|
85
|
+
let valType = uniformValType;
|
|
86
|
+
if (perKeySpec && typeof k === "string" && Object.hasOwn(perKeySpec, k)) {
|
|
87
|
+
[keyType = null, valType = null] = perKeySpec[k] ?? [];
|
|
88
|
+
}
|
|
89
|
+
entries.push(
|
|
90
|
+
new curr_generated.default.ScMapEntry({
|
|
91
|
+
key: nativeToScVal(k, keyType ? { type: keyType } : {}),
|
|
92
|
+
val: nativeToScVal(v, valType ? { type: valType } : {})
|
|
93
|
+
})
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
return curr_generated.default.scvSortedMap(entries);
|
|
97
|
+
}
|
|
64
98
|
if (Object.getPrototypeOf(val) !== Object.prototype) {
|
|
65
99
|
throw new TypeError(
|
|
66
100
|
`cannot interpret ${val.constructor?.name} value as ScVal (${JSON.stringify(val)})`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scval.js","sources":["../../../../src/base/scval.ts"],"sourcesContent":["import xdr from \"./xdr.js\";\nimport { Keypair } from \"./keypair.js\";\nimport { Address } from \"./address.js\";\nimport { Contract } from \"./contract.js\";\nimport { ScInt, XdrLargeInt, scValToBigInt } from \"./numbers/index.js\";\nimport type { ScIntType } from \"./numbers/index.js\";\n\ntype ScValIntType = ScIntType | \"i32\" | \"u32\";\ntype ScValStringType = ScValIntType | \"address\" | \"string\" | \"symbol\";\ntype ScValBytesType = \"bytes\" | \"string\" | \"symbol\";\ntype ScValType = ScValBytesType | ScValIntType | ScValStringType;\n\ntype ScValMapTypeSpec = Record<\n string,\n [(ScValType | null)?, (ScValType | null)?]\n>;\n\nexport interface NativeToScValOpts {\n type?: (ScValType | null)[] | ScValMapTypeSpec | ScValType | undefined;\n}\n\n/**\n * Attempts to convert native types into smart contract values\n * ({@link xdr.ScVal}).\n *\n * Provides conversions from smart contract XDR values ({@link xdr.ScVal}) to\n * native JavaScript types.\n *\n * The conversions are as follows:\n *\n * - `xdr.ScVal` → passthrough\n * - `null` / `undefined` → `scvVoid`\n * - `string` → `scvString` (a copy is made)\n * - `UintArray8` → `scvBytes` (a copy is made)\n * - `boolean` → `scvBool`\n *\n * - `number` / `bigint` → the smallest possible XDR integer type that will fit\n * the input value (if you want a specific type, use {@link ScInt})\n *\n * - {@link Address} or {@link Contract} → `scvAddress` (for contracts and\n * public keys)\n *\n * - `Array<T>` → `scvVec` after attempting to convert each item of type `T` to\n * an `xdr.ScVal` (recursively). note that all values must be the same type!\n *\n * - `object` → `scvMap` after attempting to convert each key and value to an\n * `xdr.ScVal` (recursively). note that there is no restriction on types\n * matching anywhere (unlike arrays)\n *\n * When passing an integer-like native value, you can also optionally specify a\n * type which will force a particular interpretation of that value.\n *\n * Note that not all type specifications are compatible with all `ScVal`s, e.g.\n * `toScVal(\"a string\", {type: \"i256\"})` will throw.\n *\n * @param val - a native (or convertible) input value to wrap\n * @param opts - an optional set of hints around the type of\n * conversion you'd like to see\n * - `type`: there is different behavior for different input\n * types for `val`:\n *\n * - when `val` is an integer-like type (i.e. number|bigint), this will be\n * forwarded to {@link ScInt} or forced to be u32/i32.\n *\n * - when `val` is an array type, this is forwarded to the recursion\n *\n * - when `val` is an object type (key-value entries), this should be an\n * object in which each key has a pair of types (to represent forced types\n * for the key and the value), where `null` (or a missing entry) indicates\n * the default interpretation(s) (refer to the examples, below)\n *\n * - when `val` is a string type, this can be 'string' or 'symbol' to force\n * a particular interpretation of `val`.\n *\n * - when `val` is a bytes-like type, this can be 'string', 'symbol', or\n * 'bytes' to force a particular interpretation\n *\n * As a simple example, `nativeToScVal(\"hello\", {type: 'symbol'})` will\n * return an `scvSymbol`, whereas without the type it would have been an\n * `scvString`.\n *\n * @throws if...\n * - there are arrays with more than one type in them\n * - there are values that do not have a sensible conversion (e.g. random XDR\n * types, custom classes)\n * - the type of the input object (or some inner value of said object) cannot\n * be determined (via `typeof`)\n * - the type you specified (via `opts.type`) is incompatible with the value\n * you passed in (`val`), e.g. `nativeToScVal(\"a string\", { type: 'i128' })`,\n * though this does not apply for types that ignore `opts` (e.g. addresses).\n * @see scValToNative\n *\n * @example\n * ```ts\n * nativeToScVal(1000); // gives ScValType === scvU64\n * nativeToScVal(1000n); // gives ScValType === scvU64\n * nativeToScVal(1n << 100n); // gives ScValType === scvU128\n * nativeToScVal(1000, { type: 'u32' }); // gives ScValType === scvU32\n * nativeToScVal(1000, { type: 'i125' }); // gives ScValType === scvI256\n * nativeToScVal(\"a string\"); // gives ScValType === scvString\n * nativeToScVal(\"a string\", { type: 'symbol' }); // gives scvSymbol\n * nativeToScVal(new Uint8Array(5)); // scvBytes\n * nativeToScVal(new Uint8Array(5), { type: 'symbol' }); // scvSymbol\n * nativeToScVal(null); // scvVoid\n * nativeToScVal(true); // scvBool\n * nativeToScVal([1, 2, 3]); // gives scvVec with each element as scvU64\n * nativeToScVal([1, 2, 3], { type: 'i128' }); // scvVec<scvI128>\n * nativeToScVal([1, '2'], { type: ['i128', 'symbol'] }); // scvVec with diff types\n * nativeToScVal([1, '2', 3], { type: ['i128', 'symbol'] });\n * // scvVec with diff types, using the default when omitted\n * nativeToScVal({ 'hello': 1, 'world': [ true, false ] }, {\n * type: {\n * 'hello': [ 'symbol', 'i128' ],\n * }\n * })\n * // gives scvMap with entries: [\n * // [ scvSymbol, scvI128 ],\n * // [ scvString, scvArray<scvBool> ]\n * // ]\n * ```\n *\n * @example\n * ```ts\n * import {\n * nativeToScVal,\n * scValToNative,\n * ScInt,\n * xdr\n * } from '@stellar/stellar-base';\n *\n * let gigaMap = {\n * bool: true,\n * void: null,\n * u32: xdr.ScVal.scvU32(1),\n * i32: xdr.ScVal.scvI32(1),\n * u64: 1n,\n * i64: -1n,\n * u128: new ScInt(1).toU128(),\n * i128: new ScInt(1).toI128(),\n * u256: new ScInt(1).toU256(),\n * i256: new ScInt(1).toI256(),\n * map: {\n * arbitrary: 1n,\n * nested: 'values',\n * etc: false\n * },\n * vec: ['same', 'type', 'list'],\n * vec: ['diff', 1, 'type', 2, 'list'],\n * };\n *\n * // then, simply:\n * let scv = nativeToScVal(gigaMap); // scv.switch() == xdr.ScValType.scvMap()\n *\n * // then...\n * someContract.call(\"method\", scv);\n *\n * // Similarly, the inverse should work:\n * scValToNative(scv) == gigaMap; // true\n * ```\n */\nexport function nativeToScVal(\n val: unknown,\n opts: NativeToScValOpts = {},\n): xdr.ScVal {\n switch (typeof val) {\n case \"object\": {\n if (val === null) {\n return xdr.ScVal.scvVoid();\n }\n\n if (val instanceof xdr.ScVal) {\n return val; // should we copy?\n }\n\n if (val instanceof Address) {\n return val.toScVal();\n }\n\n if (val instanceof Keypair) {\n return nativeToScVal(val.publicKey(), { type: \"address\" });\n }\n\n if (val instanceof Contract) {\n return val.address().toScVal();\n }\n\n if (val instanceof Uint8Array || Buffer.isBuffer(val)) {\n const copy = Buffer.from(val);\n switch ((opts?.type as string) ?? \"bytes\") {\n case \"bytes\":\n return xdr.ScVal.scvBytes(copy);\n case \"symbol\":\n return xdr.ScVal.scvSymbol(copy);\n case \"string\":\n return xdr.ScVal.scvString(copy);\n default:\n throw new TypeError(\n `invalid type (${JSON.stringify(opts.type)}) specified for bytes-like value`,\n );\n }\n }\n\n if (Array.isArray(val)) {\n return xdr.ScVal.scvVec(\n val.map((v: unknown, idx: number) => {\n // There may be different type specifications for each element in\n // the array, so we need to apply those accordingly.\n if (Array.isArray(opts.type)) {\n return nativeToScVal(\n v,\n // only include a `{ type: ... }` if it's present (safer than\n // `{type: undefined}`)\n {\n ...(opts.type.length > idx && {\n type: opts.type[idx] as ScValType,\n }),\n },\n );\n }\n\n // Otherwise apply a generic (or missing) type specifier on it.\n return nativeToScVal(v, opts);\n }),\n );\n }\n\n if (Object.getPrototypeOf(val) !== Object.prototype) {\n throw new TypeError(\n `cannot interpret ${\n val.constructor?.name\n } value as ScVal (${JSON.stringify(val)})`,\n );\n }\n\n const mapTypeSpec = (opts?.type ?? {}) as ScValMapTypeSpec;\n\n return xdr.ScVal.scvMap(\n Object.entries(val as Record<string, unknown>)\n // The Soroban runtime expects maps to have their keys in sorted\n // order, so let's do that here as part of the conversion to prevent\n // confusing error messages on execution.\n .sort(([key1], [key2]) => (key1 < key2 ? -1 : key1 > key2 ? 1 : 0))\n .map(([k, v]) => {\n // the type can be specified with an entry for the key and the value,\n // e.g. val = { 'hello': 1 } and opts.type = { hello: [ 'symbol',\n // 'u128' ]} or you can use `null` for the default interpretation\n const [keyType, valType] = Object.hasOwn(mapTypeSpec, k)\n ? (mapTypeSpec[k] ?? [null, null])\n : [null, null];\n const keyOpts: NativeToScValOpts = keyType ? { type: keyType } : {};\n const valOpts: NativeToScValOpts = valType ? { type: valType } : {};\n\n return new xdr.ScMapEntry({\n key: nativeToScVal(k, keyOpts),\n val: nativeToScVal(v, valOpts),\n });\n }),\n );\n }\n\n case \"number\":\n case \"bigint\": {\n const bigintVal = BigInt(val);\n switch (opts?.type) {\n case \"u32\":\n if (\n bigintVal < BigInt(xdr.Uint32.MIN_VALUE) ||\n bigintVal > BigInt(xdr.Uint32.MAX_VALUE)\n ) {\n throw new TypeError(`invalid value (${val}) for type u32`);\n }\n return xdr.ScVal.scvU32(Number(val));\n case \"i32\":\n if (\n bigintVal < -BigInt(xdr.Int32.MIN_VALUE) ||\n bigintVal > BigInt(xdr.Int32.MAX_VALUE)\n ) {\n throw new TypeError(`invalid value (${val}) for type i32`);\n }\n return xdr.ScVal.scvI32(Number(val));\n\n default:\n break;\n }\n\n return new ScInt(val, { type: opts?.type as ScIntType }).toScVal();\n }\n case \"string\": {\n const optType = (opts?.type as string) ?? \"string\";\n switch (optType) {\n case \"string\":\n return xdr.ScVal.scvString(val);\n\n case \"symbol\":\n return xdr.ScVal.scvSymbol(val);\n\n case \"address\":\n return new Address(val).toScVal();\n\n case \"u32\": {\n const bigintVal = BigInt(val);\n if (\n bigintVal < BigInt(xdr.Uint32.MIN_VALUE) ||\n bigintVal > BigInt(xdr.Uint32.MAX_VALUE)\n ) {\n throw new TypeError(`invalid value (${val}) for type u32`);\n }\n return xdr.ScVal.scvU32(Number(bigintVal));\n }\n\n case \"i32\": {\n const bigintVal = BigInt(val);\n // TODO: Update this check once xdr.Int32.MIN_VALUE in XDR is properly\n // set to negative. Check this globally.\n if (\n bigintVal < -BigInt(xdr.Int32.MIN_VALUE) ||\n bigintVal > BigInt(xdr.Int32.MAX_VALUE)\n ) {\n throw new TypeError(`invalid value (${val}) for type i32`);\n }\n return xdr.ScVal.scvI32(Number(bigintVal));\n }\n\n default:\n if (XdrLargeInt.isType(optType)) {\n return new XdrLargeInt(optType, val).toScVal();\n }\n\n throw new TypeError(\n `invalid type (${JSON.stringify(opts.type)}) specified for string value`,\n );\n }\n }\n\n case \"boolean\":\n return xdr.ScVal.scvBool(val);\n\n case \"undefined\":\n return xdr.ScVal.scvVoid();\n\n case \"function\": // FIXME: Is this too helpful?\n return nativeToScVal((val as () => unknown)());\n\n default:\n throw new TypeError(\n `failed to convert typeof ${typeof val} (${JSON.stringify(val)})`,\n );\n }\n}\n\n/**\n * Given a smart contract value, attempt to convert it to a native type.\n * Possible conversions include:\n *\n * - `void` → `null`\n * - `u32`, `i32` → `number`\n * - `u64`, `i64`, `u128`, `i128`, `u256`, `i256`, `timepoint`, `duration` →\n * `bigint`\n * - `vec` → `Array` of any of the above (via recursion)\n * - `map` → key-value object of any of the above (via recursion)\n * - `bool` → `boolean`\n * - `bytes` → `Uint8Array`\n * - `symbol` → `string`\n * - `string` → `string` IF the underlying buffer can be decoded as ascii/utf8,\n * `Uint8Array` of the raw contents in any error case\n *\n * If no viable conversion can be determined, this just \"unwraps\" the smart\n * value to return its underlying XDR value.\n *\n * @param scv - the input smart contract value\n *\n * @see nativeToScVal\n */\n\nexport function scValToNative(scv: xdr.ScVal): any {\n // we use the verbose xdr.ScValType.<type>.value form here because it's faster\n // than string comparisons and the underlying constants never need to be\n // updated\n switch (scv.switch().value) {\n case xdr.ScValType.scvVoid().value:\n return null;\n\n // these can be converted to bigints directly\n case xdr.ScValType.scvU64().value:\n case xdr.ScValType.scvI64().value:\n return (scv.value() as xdr.Int64 | xdr.Uint64).toBigInt();\n\n // these can be parsed by internal abstractions note that this can also\n // handle the above two cases, but it's not as efficient (another\n // type-check, parsing, etc.)\n case xdr.ScValType.scvU128().value:\n case xdr.ScValType.scvI128().value:\n case xdr.ScValType.scvU256().value:\n case xdr.ScValType.scvI256().value:\n return scValToBigInt(scv);\n\n case xdr.ScValType.scvVec().value:\n return (scv.vec() ?? []).map(scValToNative);\n\n case xdr.ScValType.scvAddress().value:\n return Address.fromScVal(scv).toString();\n\n case xdr.ScValType.scvMap().value:\n return Object.fromEntries(\n (scv.map() ?? []).map((entry: xdr.ScMapEntry) => [\n scValToNative(entry.key()),\n scValToNative(entry.val()),\n ]),\n );\n\n // these return the primitive type directly\n case xdr.ScValType.scvBool().value:\n case xdr.ScValType.scvU32().value:\n case xdr.ScValType.scvI32().value:\n case xdr.ScValType.scvBytes().value:\n return scv.value();\n\n // Symbols are limited to [a-zA-Z0-9_]+, so we can safely make ascii strings\n //\n // Strings, however, are \"presented\" as strings and we treat them as such\n // (in other words, string = bytes with a hint that it's text). If the user\n // encoded non-printable bytes in their string value, that's on them.\n //\n // Note that we assume a utf8 encoding (ascii-compatible). For other\n // encodings, you should probably use bytes anyway. If it cannot be decoded,\n // the raw bytes are returned.\n case xdr.ScValType.scvSymbol().value: {\n const v = scv.sym();\n if (\n Buffer.isBuffer(v) ||\n (ArrayBuffer.isView(v) && typeof v !== \"string\")\n ) {\n try {\n return new TextDecoder().decode(v);\n } catch {\n return new Uint8Array((v as ArrayBufferView).buffer); // copy of bytes\n }\n }\n return v; // string already\n }\n case xdr.ScValType.scvString().value: {\n const v = scv.str();\n if (\n Buffer.isBuffer(v) ||\n (ArrayBuffer.isView(v) && typeof v !== \"string\")\n ) {\n try {\n return new TextDecoder().decode(v);\n } catch {\n return new Uint8Array((v as ArrayBufferView).buffer); // copy of bytes\n }\n }\n return v; // string already\n }\n\n // these can be converted to bigint\n case xdr.ScValType.scvTimepoint().value:\n case xdr.ScValType.scvDuration().value:\n return (scv.value() as xdr.Uint64).toBigInt();\n\n case xdr.ScValType.scvError().value:\n switch (scv.error().switch().value) {\n // Distinguish errors from the user contract.\n case xdr.ScErrorType.sceContract().value:\n return { type: \"contract\", code: scv.error().contractCode() };\n default: {\n const err = scv.error();\n return {\n type: \"system\",\n code: err.code().value,\n value: err.code().name,\n };\n }\n }\n\n // in the fallthrough case, just return the underlying value directly\n default:\n return scv.value();\n }\n}\n\n/**\n * Build a sorted ScVal map from unsorted entries, sorted by key.\n *\n * @param items - the unsorted map entries\n */\nexport function scvSortedMap(items: xdr.ScMapEntry[]): xdr.ScVal {\n const sorted = Array.from(items).sort((a, b) => {\n // Both a and b are `ScMapEntry`s, so we need to sort by underlying key.\n //\n // We couldn't possibly handle every combination of keys since Soroban\n // maps don't enforce consistent types, so we do a best-effort and try\n // sorting by \"number-like\" or \"string-like.\"\n const nativeA = scValToNative(a.key()) as bigint | number | string;\n const nativeB = scValToNative(b.key()) as bigint | number | string;\n\n switch (typeof nativeA) {\n case \"number\":\n case \"bigint\":\n if (nativeA === nativeB) return 0;\n return nativeA < (nativeB as bigint | number) ? -1 : 1;\n\n default: {\n const strA = nativeA.toString();\n const strB = nativeB.toString();\n return strA < strB ? -1 : strA > strB ? 1 : 0;\n }\n }\n });\n\n return xdr.ScVal.scvMap(sorted);\n}\n\n// Inject a sortable map builder into the xdr module for backwards compatibility.\nxdr.scvSortedMap = scvSortedMap;\n"],"names":["xdr","Address","Keypair","Contract","Buffer","ScInt","XdrLargeInt","scValToBigInt"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"scval.js","sources":["../../../../src/base/scval.ts"],"sourcesContent":["import xdr from \"./xdr.js\";\nimport { Keypair } from \"./keypair.js\";\nimport { Address } from \"./address.js\";\nimport { Contract } from \"./contract.js\";\nimport { ScInt, XdrLargeInt, scValToBigInt } from \"./numbers/index.js\";\nimport type { ScIntType } from \"./numbers/index.js\";\n\ntype ScValIntType = ScIntType | \"i32\" | \"u32\";\ntype ScValStringType = ScValIntType | \"address\" | \"string\" | \"symbol\";\ntype ScValBytesType = \"bytes\" | \"string\" | \"symbol\";\ntype ScValType = ScValBytesType | ScValIntType | ScValStringType;\n\ntype ScValMapTypeSpec = Record<\n string,\n [(ScValType | null)?, (ScValType | null)?]\n>;\n\nexport interface NativeToScValOpts {\n type?: (ScValType | null)[] | ScValMapTypeSpec | ScValType | undefined;\n}\n\n/**\n * Attempts to convert native types into smart contract values\n * ({@link xdr.ScVal}).\n *\n * Provides conversions from smart contract XDR values ({@link xdr.ScVal}) to\n * native JavaScript types.\n *\n * The conversions are as follows:\n *\n * - `xdr.ScVal` → passthrough\n * - `null` / `undefined` → `scvVoid`\n * - `string` → `scvString` (a copy is made)\n * - `UintArray8` → `scvBytes` (a copy is made)\n * - `boolean` → `scvBool`\n *\n * - `number` / `bigint` → the smallest possible XDR integer type that will fit\n * the input value (if you want a specific type, use {@link ScInt})\n *\n * - {@link Address} or {@link Contract} → `scvAddress` (for contracts and\n * public keys)\n *\n * - `Array<T>` → `scvVec` after attempting to convert each item of type `T` to\n * an `xdr.ScVal` (recursively). note that all values must be the same type!\n *\n * - `object` → `scvMap` after attempting to convert each key and value to an\n * `xdr.ScVal` (recursively). note that there is no restriction on types\n * matching anywhere (unlike arrays)\n *\n * When passing an integer-like native value, you can also optionally specify a\n * type which will force a particular interpretation of that value.\n *\n * Note that not all type specifications are compatible with all `ScVal`s, e.g.\n * `toScVal(\"a string\", {type: \"i256\"})` will throw.\n *\n * @param val - a native (or convertible) input value to wrap\n * @param opts - an optional set of hints around the type of\n * conversion you'd like to see\n * - `type`: there is different behavior for different input\n * types for `val`:\n *\n * - when `val` is an integer-like type (i.e. number|bigint), this will be\n * forwarded to {@link ScInt} or forced to be u32/i32.\n *\n * - when `val` is an array type, this is forwarded to the recursion\n *\n * - when `val` is an object type (key-value entries), this should be an\n * object in which each key has a pair of types (to represent forced types\n * for the key and the value), where `null` (or a missing entry) indicates\n * the default interpretation(s) (refer to the examples, below)\n *\n * - when `val` is a `Map`, this can be a `[keyType, valType]` pair applied\n * to every entry, or (when all keys are strings) the same per-key spec\n * object used for plain objects\n *\n * - when `val` is a string type, this can be 'string' or 'symbol' to force\n * a particular interpretation of `val`.\n *\n * - when `val` is a bytes-like type, this can be 'string', 'symbol', or\n * 'bytes' to force a particular interpretation\n *\n * As a simple example, `nativeToScVal(\"hello\", {type: 'symbol'})` will\n * return an `scvSymbol`, whereas without the type it would have been an\n * `scvString`.\n *\n * @throws if...\n * - there are arrays with more than one type in them\n * - there are values that do not have a sensible conversion (e.g. random XDR\n * types, custom classes)\n * - the type of the input object (or some inner value of said object) cannot\n * be determined (via `typeof`)\n * - the type you specified (via `opts.type`) is incompatible with the value\n * you passed in (`val`), e.g. `nativeToScVal(\"a string\", { type: 'i128' })`,\n * though this does not apply for types that ignore `opts` (e.g. addresses).\n * @see scValToNative\n *\n * @example\n * ```ts\n * nativeToScVal(1000); // gives ScValType === scvU64\n * nativeToScVal(1000n); // gives ScValType === scvU64\n * nativeToScVal(1n << 100n); // gives ScValType === scvU128\n * nativeToScVal(1000, { type: 'u32' }); // gives ScValType === scvU32\n * nativeToScVal(1000, { type: 'i125' }); // gives ScValType === scvI256\n * nativeToScVal(\"a string\"); // gives ScValType === scvString\n * nativeToScVal(\"a string\", { type: 'symbol' }); // gives scvSymbol\n * nativeToScVal(new Uint8Array(5)); // scvBytes\n * nativeToScVal(new Uint8Array(5), { type: 'symbol' }); // scvSymbol\n * nativeToScVal(null); // scvVoid\n * nativeToScVal(true); // scvBool\n * nativeToScVal([1, 2, 3]); // gives scvVec with each element as scvU64\n * nativeToScVal([1, 2, 3], { type: 'i128' }); // scvVec<scvI128>\n * nativeToScVal([1, '2'], { type: ['i128', 'symbol'] }); // scvVec with diff types\n * nativeToScVal([1, '2', 3], { type: ['i128', 'symbol'] });\n * // scvVec with diff types, using the default when omitted\n * nativeToScVal({ 'hello': 1, 'world': [ true, false ] }, {\n * type: {\n * 'hello': [ 'symbol', 'i128' ],\n * }\n * })\n * // gives scvMap with entries: [\n * // [ scvSymbol, scvI128 ],\n * // [ scvString, scvArray<scvBool> ]\n * // ]\n * ```\n *\n * @example\n * ```ts\n * import {\n * nativeToScVal,\n * scValToNative,\n * ScInt,\n * xdr\n * } from '@stellar/stellar-base';\n *\n * let gigaMap = {\n * bool: true,\n * void: null,\n * u32: xdr.ScVal.scvU32(1),\n * i32: xdr.ScVal.scvI32(1),\n * u64: 1n,\n * i64: -1n,\n * u128: new ScInt(1).toU128(),\n * i128: new ScInt(1).toI128(),\n * u256: new ScInt(1).toU256(),\n * i256: new ScInt(1).toI256(),\n * map: {\n * arbitrary: 1n,\n * nested: 'values',\n * etc: false\n * },\n * vec: ['same', 'type', 'list'],\n * vec: ['diff', 1, 'type', 2, 'list'],\n * };\n *\n * // then, simply:\n * let scv = nativeToScVal(gigaMap); // scv.switch() == xdr.ScValType.scvMap()\n *\n * // then...\n * someContract.call(\"method\", scv);\n *\n * // Similarly, the inverse should work:\n * scValToNative(scv) == gigaMap; // true\n * ```\n */\nexport function nativeToScVal(\n val: unknown,\n opts: NativeToScValOpts = {},\n): xdr.ScVal {\n switch (typeof val) {\n case \"object\": {\n if (val === null) {\n return xdr.ScVal.scvVoid();\n }\n\n if (val instanceof xdr.ScVal) {\n return val; // should we copy?\n }\n\n if (val instanceof Address) {\n return val.toScVal();\n }\n\n if (val instanceof Keypair) {\n return nativeToScVal(val.publicKey(), { type: \"address\" });\n }\n\n if (val instanceof Contract) {\n return val.address().toScVal();\n }\n\n if (val instanceof Uint8Array || Buffer.isBuffer(val)) {\n const copy = Buffer.from(val);\n switch ((opts?.type as string) ?? \"bytes\") {\n case \"bytes\":\n return xdr.ScVal.scvBytes(copy);\n case \"symbol\":\n return xdr.ScVal.scvSymbol(copy);\n case \"string\":\n return xdr.ScVal.scvString(copy);\n default:\n throw new TypeError(\n `invalid type (${JSON.stringify(opts.type)}) specified for bytes-like value`,\n );\n }\n }\n\n if (Array.isArray(val)) {\n return xdr.ScVal.scvVec(\n val.map((v: unknown, idx: number) => {\n // There may be different type specifications for each element in\n // the array, so we need to apply those accordingly.\n if (Array.isArray(opts.type)) {\n return nativeToScVal(\n v,\n // only include a `{ type: ... }` if it's present (safer than\n // `{type: undefined}`)\n {\n ...(opts.type.length > idx && {\n type: opts.type[idx] as ScValType,\n }),\n },\n );\n }\n\n // Otherwise apply a generic (or missing) type specifier on it.\n return nativeToScVal(v, opts);\n }),\n );\n }\n\n if (val instanceof Map) {\n // For Maps, `opts.type` can take two forms:\n // - a `[keyType, valType]` pair applied to every entry (keys need not\n // be strings, so a per-key spec can't address them), or\n // - a per-key spec object (like the plain-object form below), which\n // only makes sense when the Map's keys are strings.\n let uniformKeyType: ScValType | null = null;\n let uniformValType: ScValType | null = null;\n let perKeySpec: ScValMapTypeSpec | null = null;\n if (Array.isArray(opts.type)) {\n if (opts.type.length > 2) {\n throw new TypeError(\n `expected a [keyType, valType] pair for a Map, got ${JSON.stringify(opts.type)}`,\n );\n }\n [uniformKeyType = null, uniformValType = null] = opts.type;\n } else if (typeof opts.type === \"object\" && opts.type !== null) {\n perKeySpec = opts.type;\n } else if (opts.type !== undefined) {\n throw new TypeError(\n `invalid type (${JSON.stringify(opts.type)}) specified for a Map`,\n );\n }\n\n const entries: xdr.ScMapEntry[] = [];\n for (const [k, v] of val) {\n let keyType = uniformKeyType;\n let valType = uniformValType;\n if (\n perKeySpec &&\n typeof k === \"string\" &&\n Object.hasOwn(perKeySpec, k)\n ) {\n [keyType = null, valType = null] = perKeySpec[k] ?? [];\n }\n entries.push(\n new xdr.ScMapEntry({\n key: nativeToScVal(k, keyType ? { type: keyType } : {}),\n val: nativeToScVal(v, valType ? { type: valType } : {}),\n }),\n );\n }\n return xdr.scvSortedMap(entries);\n }\n\n if (Object.getPrototypeOf(val) !== Object.prototype) {\n throw new TypeError(\n `cannot interpret ${\n val.constructor?.name\n } value as ScVal (${JSON.stringify(val)})`,\n );\n }\n\n const mapTypeSpec = (opts?.type ?? {}) as ScValMapTypeSpec;\n\n return xdr.ScVal.scvMap(\n Object.entries(val as Record<string, unknown>)\n // The Soroban runtime expects maps to have their keys in sorted\n // order, so let's do that here as part of the conversion to prevent\n // confusing error messages on execution.\n .sort(([key1], [key2]) => (key1 < key2 ? -1 : key1 > key2 ? 1 : 0))\n .map(([k, v]) => {\n // the type can be specified with an entry for the key and the value,\n // e.g. val = { 'hello': 1 } and opts.type = { hello: [ 'symbol',\n // 'u128' ]} or you can use `null` for the default interpretation\n const [keyType, valType] = Object.hasOwn(mapTypeSpec, k)\n ? (mapTypeSpec[k] ?? [null, null])\n : [null, null];\n const keyOpts: NativeToScValOpts = keyType ? { type: keyType } : {};\n const valOpts: NativeToScValOpts = valType ? { type: valType } : {};\n\n return new xdr.ScMapEntry({\n key: nativeToScVal(k, keyOpts),\n val: nativeToScVal(v, valOpts),\n });\n }),\n );\n }\n\n case \"number\":\n case \"bigint\": {\n const bigintVal = BigInt(val);\n switch (opts?.type) {\n case \"u32\":\n if (\n bigintVal < BigInt(xdr.Uint32.MIN_VALUE) ||\n bigintVal > BigInt(xdr.Uint32.MAX_VALUE)\n ) {\n throw new TypeError(`invalid value (${val}) for type u32`);\n }\n return xdr.ScVal.scvU32(Number(val));\n case \"i32\":\n if (\n bigintVal < -BigInt(xdr.Int32.MIN_VALUE) ||\n bigintVal > BigInt(xdr.Int32.MAX_VALUE)\n ) {\n throw new TypeError(`invalid value (${val}) for type i32`);\n }\n return xdr.ScVal.scvI32(Number(val));\n\n default:\n break;\n }\n\n return new ScInt(val, { type: opts?.type as ScIntType }).toScVal();\n }\n case \"string\": {\n const optType = (opts?.type as string) ?? \"string\";\n switch (optType) {\n case \"string\":\n return xdr.ScVal.scvString(val);\n\n case \"symbol\":\n return xdr.ScVal.scvSymbol(val);\n\n case \"address\":\n return new Address(val).toScVal();\n\n case \"u32\": {\n const bigintVal = BigInt(val);\n if (\n bigintVal < BigInt(xdr.Uint32.MIN_VALUE) ||\n bigintVal > BigInt(xdr.Uint32.MAX_VALUE)\n ) {\n throw new TypeError(`invalid value (${val}) for type u32`);\n }\n return xdr.ScVal.scvU32(Number(bigintVal));\n }\n\n case \"i32\": {\n const bigintVal = BigInt(val);\n // TODO: Update this check once xdr.Int32.MIN_VALUE in XDR is properly\n // set to negative. Check this globally.\n if (\n bigintVal < -BigInt(xdr.Int32.MIN_VALUE) ||\n bigintVal > BigInt(xdr.Int32.MAX_VALUE)\n ) {\n throw new TypeError(`invalid value (${val}) for type i32`);\n }\n return xdr.ScVal.scvI32(Number(bigintVal));\n }\n\n default:\n if (XdrLargeInt.isType(optType)) {\n return new XdrLargeInt(optType, val).toScVal();\n }\n\n throw new TypeError(\n `invalid type (${JSON.stringify(opts.type)}) specified for string value`,\n );\n }\n }\n\n case \"boolean\":\n return xdr.ScVal.scvBool(val);\n\n case \"undefined\":\n return xdr.ScVal.scvVoid();\n\n case \"function\": // FIXME: Is this too helpful?\n return nativeToScVal((val as () => unknown)());\n\n default:\n throw new TypeError(\n `failed to convert typeof ${typeof val} (${JSON.stringify(val)})`,\n );\n }\n}\n\n/**\n * Given a smart contract value, attempt to convert it to a native type.\n * Possible conversions include:\n *\n * - `void` → `null`\n * - `u32`, `i32` → `number`\n * - `u64`, `i64`, `u128`, `i128`, `u256`, `i256`, `timepoint`, `duration` →\n * `bigint`\n * - `vec` → `Array` of any of the above (via recursion)\n * - `map` → key-value object of any of the above (via recursion)\n * - `bool` → `boolean`\n * - `bytes` → `Uint8Array`\n * - `symbol` → `string`\n * - `string` → `string` IF the underlying buffer can be decoded as ascii/utf8,\n * `Uint8Array` of the raw contents in any error case\n *\n * If no viable conversion can be determined, this just \"unwraps\" the smart\n * value to return its underlying XDR value.\n *\n * @param scv - the input smart contract value\n *\n * @see nativeToScVal\n */\n\nexport function scValToNative(scv: xdr.ScVal): any {\n // we use the verbose xdr.ScValType.<type>.value form here because it's faster\n // than string comparisons and the underlying constants never need to be\n // updated\n switch (scv.switch().value) {\n case xdr.ScValType.scvVoid().value:\n return null;\n\n // these can be converted to bigints directly\n case xdr.ScValType.scvU64().value:\n case xdr.ScValType.scvI64().value:\n return (scv.value() as xdr.Int64 | xdr.Uint64).toBigInt();\n\n // these can be parsed by internal abstractions note that this can also\n // handle the above two cases, but it's not as efficient (another\n // type-check, parsing, etc.)\n case xdr.ScValType.scvU128().value:\n case xdr.ScValType.scvI128().value:\n case xdr.ScValType.scvU256().value:\n case xdr.ScValType.scvI256().value:\n return scValToBigInt(scv);\n\n case xdr.ScValType.scvVec().value:\n return (scv.vec() ?? []).map(scValToNative);\n\n case xdr.ScValType.scvAddress().value:\n return Address.fromScVal(scv).toString();\n\n case xdr.ScValType.scvMap().value:\n return Object.fromEntries(\n (scv.map() ?? []).map((entry: xdr.ScMapEntry) => [\n scValToNative(entry.key()),\n scValToNative(entry.val()),\n ]),\n );\n\n // these return the primitive type directly\n case xdr.ScValType.scvBool().value:\n case xdr.ScValType.scvU32().value:\n case xdr.ScValType.scvI32().value:\n case xdr.ScValType.scvBytes().value:\n return scv.value();\n\n // Symbols are limited to [a-zA-Z0-9_]+, so we can safely make ascii strings\n //\n // Strings, however, are \"presented\" as strings and we treat them as such\n // (in other words, string = bytes with a hint that it's text). If the user\n // encoded non-printable bytes in their string value, that's on them.\n //\n // Note that we assume a utf8 encoding (ascii-compatible). For other\n // encodings, you should probably use bytes anyway. If it cannot be decoded,\n // the raw bytes are returned.\n case xdr.ScValType.scvSymbol().value: {\n const v = scv.sym();\n if (\n Buffer.isBuffer(v) ||\n (ArrayBuffer.isView(v) && typeof v !== \"string\")\n ) {\n try {\n return new TextDecoder().decode(v);\n } catch {\n return new Uint8Array((v as ArrayBufferView).buffer); // copy of bytes\n }\n }\n return v; // string already\n }\n case xdr.ScValType.scvString().value: {\n const v = scv.str();\n if (\n Buffer.isBuffer(v) ||\n (ArrayBuffer.isView(v) && typeof v !== \"string\")\n ) {\n try {\n return new TextDecoder().decode(v);\n } catch {\n return new Uint8Array((v as ArrayBufferView).buffer); // copy of bytes\n }\n }\n return v; // string already\n }\n\n // these can be converted to bigint\n case xdr.ScValType.scvTimepoint().value:\n case xdr.ScValType.scvDuration().value:\n return (scv.value() as xdr.Uint64).toBigInt();\n\n case xdr.ScValType.scvError().value:\n switch (scv.error().switch().value) {\n // Distinguish errors from the user contract.\n case xdr.ScErrorType.sceContract().value:\n return { type: \"contract\", code: scv.error().contractCode() };\n default: {\n const err = scv.error();\n return {\n type: \"system\",\n code: err.code().value,\n value: err.code().name,\n };\n }\n }\n\n // in the fallthrough case, just return the underlying value directly\n default:\n return scv.value();\n }\n}\n\n/**\n * Build a sorted ScVal map from unsorted entries, sorted by key.\n *\n * @param items - the unsorted map entries\n */\nexport function scvSortedMap(items: xdr.ScMapEntry[]): xdr.ScVal {\n const sorted = Array.from(items).sort((a, b) => {\n // Both a and b are `ScMapEntry`s, so we need to sort by underlying key.\n //\n // We couldn't possibly handle every combination of keys since Soroban\n // maps don't enforce consistent types, so we do a best-effort and try\n // sorting by \"number-like\" or \"string-like.\"\n const nativeA = scValToNative(a.key()) as bigint | number | string;\n const nativeB = scValToNative(b.key()) as bigint | number | string;\n\n switch (typeof nativeA) {\n case \"number\":\n case \"bigint\":\n if (nativeA === nativeB) return 0;\n return nativeA < (nativeB as bigint | number) ? -1 : 1;\n\n default: {\n const strA = nativeA.toString();\n const strB = nativeB.toString();\n return strA < strB ? -1 : strA > strB ? 1 : 0;\n }\n }\n });\n\n return xdr.ScVal.scvMap(sorted);\n}\n\n// Inject a sortable map builder into the xdr module for backwards compatibility.\nxdr.scvSortedMap = scvSortedMap;\n"],"names":["xdr","Address","Keypair","Contract","Buffer","ScInt","XdrLargeInt","scValToBigInt"],"mappings":";;;;;;;;;;;AAoKO,SAAS,aAAA,CACd,GAAA,EACA,IAAA,GAA0B,EAAC,EAChB;AACX,EAAA,QAAQ,OAAO,GAAA;AAAK,IAClB,KAAK,QAAA,EAAU;AACb,MAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,QAAA,OAAOA,sBAAA,CAAI,MAAM,OAAA,EAAQ;AAAA,MAC3B;AAEA,MAAA,IAAI,GAAA,YAAeA,uBAAI,KAAA,EAAO;AAC5B,QAAA,OAAO,GAAA;AAAA,MACT;AAEA,MAAA,IAAI,eAAeC,eAAA,EAAS;AAC1B,QAAA,OAAO,IAAI,OAAA,EAAQ;AAAA,MACrB;AAEA,MAAA,IAAI,eAAeC,eAAA,EAAS;AAC1B,QAAA,OAAO,cAAc,GAAA,CAAI,SAAA,IAAa,EAAE,IAAA,EAAM,WAAW,CAAA;AAAA,MAC3D;AAEA,MAAA,IAAI,eAAeC,iBAAA,EAAU;AAC3B,QAAA,OAAO,GAAA,CAAI,OAAA,EAAQ,CAAE,OAAA,EAAQ;AAAA,MAC/B;AAEA,MAAA,IAAI,GAAA,YAAe,UAAA,IAAcC,aAAA,CAAO,QAAA,CAAS,GAAG,CAAA,EAAG;AACrD,QAAA,MAAM,IAAA,GAAOA,aAAA,CAAO,IAAA,CAAK,GAAG,CAAA;AAC5B,QAAA,QAAS,IAAA,EAAM,QAAmB,OAAA;AAAS,UACzC,KAAK,OAAA;AACH,YAAA,OAAOJ,sBAAA,CAAI,KAAA,CAAM,QAAA,CAAS,IAAI,CAAA;AAAA,UAChC,KAAK,QAAA;AACH,YAAA,OAAOA,sBAAA,CAAI,KAAA,CAAM,SAAA,CAAU,IAAI,CAAA;AAAA,UACjC,KAAK,QAAA;AACH,YAAA,OAAOA,sBAAA,CAAI,KAAA,CAAM,SAAA,CAAU,IAAI,CAAA;AAAA,UACjC;AACE,YAAA,MAAM,IAAI,SAAA;AAAA,cACR,CAAA,cAAA,EAAiB,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAC,CAAA,gCAAA;AAAA,aAC5C;AAAA;AACJ,MACF;AAEA,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACtB,QAAA,OAAOA,uBAAI,KAAA,CAAM,MAAA;AAAA,UACf,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,EAAY,GAAA,KAAgB;AAGnC,YAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,EAAG;AAC5B,cAAA,OAAO,aAAA;AAAA,gBACL,CAAA;AAAA;AAAA;AAAA,gBAGA;AAAA,kBACE,GAAI,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,GAAA,IAAO;AAAA,oBAC5B,IAAA,EAAM,IAAA,CAAK,IAAA,CAAK,GAAG;AAAA;AACrB;AACF,eACF;AAAA,YACF;AAGA,YAAA,OAAO,aAAA,CAAc,GAAG,IAAI,CAAA;AAAA,UAC9B,CAAC;AAAA,SACH;AAAA,MACF;AAEA,MAAA,IAAI,eAAe,GAAA,EAAK;AAMtB,QAAA,IAAI,cAAA,GAAmC,IAAA;AACvC,QAAA,IAAI,cAAA,GAAmC,IAAA;AACvC,QAAA,IAAI,UAAA,GAAsC,IAAA;AAC1C,QAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,EAAG;AAC5B,UAAA,IAAI,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AACxB,YAAA,MAAM,IAAI,SAAA;AAAA,cACR,CAAA,kDAAA,EAAqD,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,aAChF;AAAA,UACF;AACA,UAAA,CAAC,cAAA,GAAiB,IAAA,EAAM,cAAA,GAAiB,IAAI,IAAI,IAAA,CAAK,IAAA;AAAA,QACxD,WAAW,OAAO,IAAA,CAAK,SAAS,QAAA,IAAY,IAAA,CAAK,SAAS,IAAA,EAAM;AAC9D,UAAA,UAAA,GAAa,IAAA,CAAK,IAAA;AAAA,QACpB,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,MAAA,EAAW;AAClC,UAAA,MAAM,IAAI,SAAA;AAAA,YACR,CAAA,cAAA,EAAiB,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAC,CAAA,qBAAA;AAAA,WAC5C;AAAA,QACF;AAEA,QAAA,MAAM,UAA4B,EAAC;AACnC,QAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,GAAA,EAAK;AACxB,UAAA,IAAI,OAAA,GAAU,cAAA;AACd,UAAA,IAAI,OAAA,GAAU,cAAA;AACd,UAAA,IACE,UAAA,IACA,OAAO,CAAA,KAAM,QAAA,IACb,OAAO,MAAA,CAAO,UAAA,EAAY,CAAC,CAAA,EAC3B;AACA,YAAA,CAAC,OAAA,GAAU,MAAM,OAAA,GAAU,IAAI,IAAI,UAAA,CAAW,CAAC,KAAK,EAAC;AAAA,UACvD;AACA,UAAA,OAAA,CAAQ,IAAA;AAAA,YACN,IAAIA,uBAAI,UAAA,CAAW;AAAA,cACjB,GAAA,EAAK,cAAc,CAAA,EAAG,OAAA,GAAU,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,EAAE,CAAA;AAAA,cACtD,GAAA,EAAK,cAAc,CAAA,EAAG,OAAA,GAAU,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,EAAE;AAAA,aACvD;AAAA,WACH;AAAA,QACF;AACA,QAAA,OAAOA,sBAAA,CAAI,aAAa,OAAO,CAAA;AAAA,MACjC;AAEA,MAAA,IAAI,MAAA,CAAO,cAAA,CAAe,GAAG,CAAA,KAAM,OAAO,SAAA,EAAW;AACnD,QAAA,MAAM,IAAI,SAAA;AAAA,UACR,CAAA,iBAAA,EACE,IAAI,WAAA,EAAa,IACnB,oBAAoB,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAA,CAAA;AAAA,SACzC;AAAA,MACF;AAEA,MAAA,MAAM,WAAA,GAAe,IAAA,EAAM,IAAA,IAAQ,EAAC;AAEpC,MAAA,OAAOA,uBAAI,KAAA,CAAM,MAAA;AAAA,QACf,MAAA,CAAO,OAAA,CAAQ,GAA8B,CAAA,CAI1C,IAAA,CAAK,CAAC,CAAC,IAAI,CAAA,EAAG,CAAC,IAAI,CAAA,KAAO,OAAO,IAAA,GAAO,EAAA,GAAK,IAAA,GAAO,IAAA,GAAO,CAAA,GAAI,CAAE,CAAA,CACjE,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM;AAIf,UAAA,MAAM,CAAC,OAAA,EAAS,OAAO,IAAI,MAAA,CAAO,MAAA,CAAO,aAAa,CAAC,CAAA,GAClD,WAAA,CAAY,CAAC,KAAK,CAAC,IAAA,EAAM,IAAI,CAAA,GAC9B,CAAC,MAAM,IAAI,CAAA;AACf,UAAA,MAAM,UAA6B,OAAA,GAAU,EAAE,IAAA,EAAM,OAAA,KAAY,EAAC;AAClE,UAAA,MAAM,UAA6B,OAAA,GAAU,EAAE,IAAA,EAAM,OAAA,KAAY,EAAC;AAElE,UAAA,OAAO,IAAIA,uBAAI,UAAA,CAAW;AAAA,YACxB,GAAA,EAAK,aAAA,CAAc,CAAA,EAAG,OAAO,CAAA;AAAA,YAC7B,GAAA,EAAK,aAAA,CAAc,CAAA,EAAG,OAAO;AAAA,WAC9B,CAAA;AAAA,QACH,CAAC;AAAA,OACL;AAAA,IACF;AAAA,IAEA,KAAK,QAAA;AAAA,IACL,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,SAAA,GAAY,OAAO,GAAG,CAAA;AAC5B,MAAA,QAAQ,MAAM,IAAA;AAAM,QAClB,KAAK,KAAA;AACH,UAAA,IACE,SAAA,GAAY,MAAA,CAAOA,sBAAA,CAAI,MAAA,CAAO,SAAS,CAAA,IACvC,SAAA,GAAY,MAAA,CAAOA,sBAAA,CAAI,MAAA,CAAO,SAAS,CAAA,EACvC;AACA,YAAA,MAAM,IAAI,SAAA,CAAU,CAAA,eAAA,EAAkB,GAAG,CAAA,cAAA,CAAgB,CAAA;AAAA,UAC3D;AACA,UAAA,OAAOA,sBAAA,CAAI,KAAA,CAAM,MAAA,CAAO,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,QACrC,KAAK,KAAA;AACH,UAAA,IACE,SAAA,GAAY,CAAC,MAAA,CAAOA,sBAAA,CAAI,KAAA,CAAM,SAAS,CAAA,IACvC,SAAA,GAAY,MAAA,CAAOA,sBAAA,CAAI,KAAA,CAAM,SAAS,CAAA,EACtC;AACA,YAAA,MAAM,IAAI,SAAA,CAAU,CAAA,eAAA,EAAkB,GAAG,CAAA,cAAA,CAAgB,CAAA;AAAA,UAC3D;AACA,UAAA,OAAOA,sBAAA,CAAI,KAAA,CAAM,MAAA,CAAO,MAAA,CAAO,GAAG,CAAC,CAAA;AAGnC;AAGJ,MAAA,OAAO,IAAIK,aAAM,GAAA,EAAK,EAAE,MAAM,IAAA,EAAM,IAAA,EAAmB,CAAA,CAAE,OAAA,EAAQ;AAAA,IACnE;AAAA,IACA,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,OAAA,GAAW,MAAM,IAAA,IAAmB,QAAA;AAC1C,MAAA,QAAQ,OAAA;AAAS,QACf,KAAK,QAAA;AACH,UAAA,OAAOL,sBAAA,CAAI,KAAA,CAAM,SAAA,CAAU,GAAG,CAAA;AAAA,QAEhC,KAAK,QAAA;AACH,UAAA,OAAOA,sBAAA,CAAI,KAAA,CAAM,SAAA,CAAU,GAAG,CAAA;AAAA,QAEhC,KAAK,SAAA;AACH,UAAA,OAAO,IAAIC,eAAA,CAAQ,GAAG,CAAA,CAAE,OAAA,EAAQ;AAAA,QAElC,KAAK,KAAA,EAAO;AACV,UAAA,MAAM,SAAA,GAAY,OAAO,GAAG,CAAA;AAC5B,UAAA,IACE,SAAA,GAAY,MAAA,CAAOD,sBAAA,CAAI,MAAA,CAAO,SAAS,CAAA,IACvC,SAAA,GAAY,MAAA,CAAOA,sBAAA,CAAI,MAAA,CAAO,SAAS,CAAA,EACvC;AACA,YAAA,MAAM,IAAI,SAAA,CAAU,CAAA,eAAA,EAAkB,GAAG,CAAA,cAAA,CAAgB,CAAA;AAAA,UAC3D;AACA,UAAA,OAAOA,sBAAA,CAAI,KAAA,CAAM,MAAA,CAAO,MAAA,CAAO,SAAS,CAAC,CAAA;AAAA,QAC3C;AAAA,QAEA,KAAK,KAAA,EAAO;AACV,UAAA,MAAM,SAAA,GAAY,OAAO,GAAG,CAAA;AAG5B,UAAA,IACE,SAAA,GAAY,CAAC,MAAA,CAAOA,sBAAA,CAAI,KAAA,CAAM,SAAS,CAAA,IACvC,SAAA,GAAY,MAAA,CAAOA,sBAAA,CAAI,KAAA,CAAM,SAAS,CAAA,EACtC;AACA,YAAA,MAAM,IAAI,SAAA,CAAU,CAAA,eAAA,EAAkB,GAAG,CAAA,cAAA,CAAgB,CAAA;AAAA,UAC3D;AACA,UAAA,OAAOA,sBAAA,CAAI,KAAA,CAAM,MAAA,CAAO,MAAA,CAAO,SAAS,CAAC,CAAA;AAAA,QAC3C;AAAA,QAEA;AACE,UAAA,IAAIM,yBAAA,CAAY,MAAA,CAAO,OAAO,CAAA,EAAG;AAC/B,YAAA,OAAO,IAAIA,yBAAA,CAAY,OAAA,EAAS,GAAG,EAAE,OAAA,EAAQ;AAAA,UAC/C;AAEA,UAAA,MAAM,IAAI,SAAA;AAAA,YACR,CAAA,cAAA,EAAiB,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAC,CAAA,4BAAA;AAAA,WAC5C;AAAA;AACJ,IACF;AAAA,IAEA,KAAK,SAAA;AACH,MAAA,OAAON,sBAAA,CAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA;AAAA,IAE9B,KAAK,WAAA;AACH,MAAA,OAAOA,sBAAA,CAAI,MAAM,OAAA,EAAQ;AAAA,IAE3B,KAAK,UAAA;AACH,MAAA,OAAO,aAAA,CAAe,KAAuB,CAAA;AAAA,IAE/C;AACE,MAAA,MAAM,IAAI,SAAA;AAAA,QACR,4BAA4B,OAAO,GAAG,KAAK,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAA,CAAA;AAAA,OAChE;AAAA;AAEN;AA0BO,SAAS,cAAc,GAAA,EAAqB;AAIjD,EAAA,QAAQ,GAAA,CAAI,MAAA,EAAO,CAAE,KAAA;AAAO,IAC1B,KAAKA,sBAAA,CAAI,SAAA,CAAU,OAAA,EAAQ,CAAE,KAAA;AAC3B,MAAA,OAAO,IAAA;AAAA;AAAA,IAGT,KAAKA,sBAAA,CAAI,SAAA,CAAU,MAAA,EAAO,CAAE,KAAA;AAAA,IAC5B,KAAKA,sBAAA,CAAI,SAAA,CAAU,MAAA,EAAO,CAAE,KAAA;AAC1B,MAAA,OAAQ,GAAA,CAAI,KAAA,EAAM,CAA6B,QAAA,EAAS;AAAA;AAAA;AAAA;AAAA,IAK1D,KAAKA,sBAAA,CAAI,SAAA,CAAU,OAAA,EAAQ,CAAE,KAAA;AAAA,IAC7B,KAAKA,sBAAA,CAAI,SAAA,CAAU,OAAA,EAAQ,CAAE,KAAA;AAAA,IAC7B,KAAKA,sBAAA,CAAI,SAAA,CAAU,OAAA,EAAQ,CAAE,KAAA;AAAA,IAC7B,KAAKA,sBAAA,CAAI,SAAA,CAAU,OAAA,EAAQ,CAAE,KAAA;AAC3B,MAAA,OAAOO,oBAAc,GAAG,CAAA;AAAA,IAE1B,KAAKP,sBAAA,CAAI,SAAA,CAAU,MAAA,EAAO,CAAE,KAAA;AAC1B,MAAA,OAAA,CAAQ,IAAI,GAAA,EAAI,IAAK,EAAC,EAAG,IAAI,aAAa,CAAA;AAAA,IAE5C,KAAKA,sBAAA,CAAI,SAAA,CAAU,UAAA,EAAW,CAAE,KAAA;AAC9B,MAAA,OAAOC,eAAA,CAAQ,SAAA,CAAU,GAAG,CAAA,CAAE,QAAA,EAAS;AAAA,IAEzC,KAAKD,sBAAA,CAAI,SAAA,CAAU,MAAA,EAAO,CAAE,KAAA;AAC1B,MAAA,OAAO,MAAA,CAAO,WAAA;AAAA,QAAA,CACX,IAAI,GAAA,EAAI,IAAK,EAAC,EAAG,GAAA,CAAI,CAAC,KAAA,KAA0B;AAAA,UAC/C,aAAA,CAAc,KAAA,CAAM,GAAA,EAAK,CAAA;AAAA,UACzB,aAAA,CAAc,KAAA,CAAM,GAAA,EAAK;AAAA,SAC1B;AAAA,OACH;AAAA;AAAA,IAGF,KAAKA,sBAAA,CAAI,SAAA,CAAU,OAAA,EAAQ,CAAE,KAAA;AAAA,IAC7B,KAAKA,sBAAA,CAAI,SAAA,CAAU,MAAA,EAAO,CAAE,KAAA;AAAA,IAC5B,KAAKA,sBAAA,CAAI,SAAA,CAAU,MAAA,EAAO,CAAE,KAAA;AAAA,IAC5B,KAAKA,sBAAA,CAAI,SAAA,CAAU,QAAA,EAAS,CAAE,KAAA;AAC5B,MAAA,OAAO,IAAI,KAAA,EAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAWnB,KAAKA,sBAAA,CAAI,SAAA,CAAU,SAAA,GAAY,KAAA,EAAO;AACpC,MAAA,MAAM,CAAA,GAAI,IAAI,GAAA,EAAI;AAClB,MAAA,IACEI,aAAA,CAAO,QAAA,CAAS,CAAC,CAAA,IAChB,WAAA,CAAY,OAAO,CAAC,CAAA,IAAK,OAAO,CAAA,KAAM,QAAA,EACvC;AACA,QAAA,IAAI;AACF,UAAA,OAAO,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,CAAC,CAAA;AAAA,QACnC,CAAA,CAAA,MAAQ;AACN,UAAA,OAAO,IAAI,UAAA,CAAY,CAAA,CAAsB,MAAM,CAAA;AAAA,QACrD;AAAA,MACF;AACA,MAAA,OAAO,CAAA;AAAA,IACT;AAAA,IACA,KAAKJ,sBAAA,CAAI,SAAA,CAAU,SAAA,GAAY,KAAA,EAAO;AACpC,MAAA,MAAM,CAAA,GAAI,IAAI,GAAA,EAAI;AAClB,MAAA,IACEI,aAAA,CAAO,QAAA,CAAS,CAAC,CAAA,IAChB,WAAA,CAAY,OAAO,CAAC,CAAA,IAAK,OAAO,CAAA,KAAM,QAAA,EACvC;AACA,QAAA,IAAI;AACF,UAAA,OAAO,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,CAAC,CAAA;AAAA,QACnC,CAAA,CAAA,MAAQ;AACN,UAAA,OAAO,IAAI,UAAA,CAAY,CAAA,CAAsB,MAAM,CAAA;AAAA,QACrD;AAAA,MACF;AACA,MAAA,OAAO,CAAA;AAAA,IACT;AAAA;AAAA,IAGA,KAAKJ,sBAAA,CAAI,SAAA,CAAU,YAAA,EAAa,CAAE,KAAA;AAAA,IAClC,KAAKA,sBAAA,CAAI,SAAA,CAAU,WAAA,EAAY,CAAE,KAAA;AAC/B,MAAA,OAAQ,GAAA,CAAI,KAAA,EAAM,CAAiB,QAAA,EAAS;AAAA,IAE9C,KAAKA,sBAAA,CAAI,SAAA,CAAU,QAAA,EAAS,CAAE,KAAA;AAC5B,MAAA,QAAQ,GAAA,CAAI,KAAA,EAAM,CAAE,MAAA,GAAS,KAAA;AAAO;AAAA,QAElC,KAAKA,sBAAA,CAAI,WAAA,CAAY,WAAA,EAAY,CAAE,KAAA;AACjC,UAAA,OAAO,EAAE,MAAM,UAAA,EAAY,IAAA,EAAM,IAAI,KAAA,EAAM,CAAE,cAAa,EAAE;AAAA,QAC9D,SAAS;AACP,UAAA,MAAM,GAAA,GAAM,IAAI,KAAA,EAAM;AACtB,UAAA,OAAO;AAAA,YACL,IAAA,EAAM,QAAA;AAAA,YACN,IAAA,EAAM,GAAA,CAAI,IAAA,EAAK,CAAE,KAAA;AAAA,YACjB,KAAA,EAAO,GAAA,CAAI,IAAA,EAAK,CAAE;AAAA,WACpB;AAAA,QACF;AAAA;AACF;AAAA,IAGF;AACE,MAAA,OAAO,IAAI,KAAA,EAAM;AAAA;AAEvB;AAOO,SAAS,aAAa,KAAA,EAAoC;AAC/D,EAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,KAAK,EAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AAM9C,IAAA,MAAM,OAAA,GAAU,aAAA,CAAc,CAAA,CAAE,GAAA,EAAK,CAAA;AACrC,IAAA,MAAM,OAAA,GAAU,aAAA,CAAc,CAAA,CAAE,GAAA,EAAK,CAAA;AAErC,IAAA,QAAQ,OAAO,OAAA;AAAS,MACtB,KAAK,QAAA;AAAA,MACL,KAAK,QAAA;AACH,QAAA,IAAI,OAAA,KAAY,SAAS,OAAO,CAAA;AAChC,QAAA,OAAO,OAAA,GAAW,UAA8B,EAAA,GAAK,CAAA;AAAA,MAEvD,SAAS;AACP,QAAA,MAAM,IAAA,GAAO,QAAQ,QAAA,EAAS;AAC9B,QAAA,MAAM,IAAA,GAAO,QAAQ,QAAA,EAAS;AAC9B,QAAA,OAAO,IAAA,GAAO,IAAA,GAAO,EAAA,GAAK,IAAA,GAAO,OAAO,CAAA,GAAI,CAAA;AAAA,MAC9C;AAAA;AACF,EACF,CAAC,CAAA;AAED,EAAA,OAAOA,sBAAA,CAAI,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA;AAChC;AAGAA,sBAAA,CAAI,YAAA,GAAe,YAAA;;;;;;"}
|
|
@@ -1,9 +1,34 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
require('../node_modules/.pnpm/@stellar_js-xdr@4.0.0/node_modules/@stellar/js-xdr/src/int.js');
|
|
4
|
+
require('../node_modules/.pnpm/@stellar_js-xdr@4.0.0/node_modules/@stellar/js-xdr/src/hyper.js');
|
|
5
|
+
require('../node_modules/.pnpm/@stellar_js-xdr@4.0.0/node_modules/@stellar/js-xdr/src/unsigned-int.js');
|
|
6
|
+
require('../node_modules/.pnpm/@stellar_js-xdr@4.0.0/node_modules/@stellar/js-xdr/src/unsigned-hyper.js');
|
|
7
|
+
require('../node_modules/.pnpm/@stellar_js-xdr@4.0.0/node_modules/@stellar/js-xdr/src/xdr-type.js');
|
|
8
|
+
require('buffer');
|
|
9
|
+
var curr_generated = require('../base/generated/curr_generated.js');
|
|
10
|
+
require('@noble/hashes/sha2.js');
|
|
11
|
+
require('../base/signing.js');
|
|
12
|
+
require('../base/keypair.js');
|
|
13
|
+
require('base32.js');
|
|
14
|
+
require('../base/util/continued_fraction.js');
|
|
15
|
+
require('../base/util/bignumber.js');
|
|
16
|
+
require('../base/transaction_builder.js');
|
|
17
|
+
require('../base/muxed_account.js');
|
|
18
|
+
require('../base/scval.js');
|
|
19
|
+
require('../base/numbers/uint128.js');
|
|
20
|
+
require('../base/numbers/uint256.js');
|
|
21
|
+
require('../base/numbers/int128.js');
|
|
22
|
+
require('../base/numbers/int256.js');
|
|
3
23
|
var utils = require('./utils.js');
|
|
4
24
|
|
|
5
25
|
class ClientGenerator {
|
|
6
26
|
spec;
|
|
27
|
+
// event index (in declaration order) -> resolved (possibly disambiguated)
|
|
28
|
+
// filter method name. Keyed by index rather than raw name because a
|
|
29
|
+
// contract may declare several events with the same name.
|
|
30
|
+
// Lazily computed on first use; see resolveEventFilterMethodNames().
|
|
31
|
+
eventFilterMethodNames = null;
|
|
7
32
|
constructor(spec) {
|
|
8
33
|
this.spec = spec;
|
|
9
34
|
}
|
|
@@ -24,6 +49,13 @@ class ClientGenerator {
|
|
|
24
49
|
(entry) => `"${entry.toXDR("base64")}"`
|
|
25
50
|
);
|
|
26
51
|
const fromJSON = this.spec.funcs().filter((func) => func.name().toString() !== "__constructor").map((func) => this.generateFromJSONMethod(func)).join(",");
|
|
52
|
+
const events = this.spec.events();
|
|
53
|
+
const parseEventMethodName = this.parseEventMethodName();
|
|
54
|
+
const eventMethods = events.length > 0 ? `
|
|
55
|
+
${this.generateParseEventMethod(parseEventMethodName)}
|
|
56
|
+
${events.map(
|
|
57
|
+
(event, eventIndex) => this.generateEventFilterMethod(event, eventIndex)
|
|
58
|
+
).join("\n")}` : "";
|
|
27
59
|
return `${imports}
|
|
28
60
|
|
|
29
61
|
export interface Client {
|
|
@@ -42,6 +74,7 @@ export class Client extends ContractClient {
|
|
|
42
74
|
public readonly fromJSON = {
|
|
43
75
|
${fromJSON}
|
|
44
76
|
};
|
|
77
|
+
${eventMethods}
|
|
45
78
|
}`;
|
|
46
79
|
}
|
|
47
80
|
generateImports() {
|
|
@@ -53,6 +86,25 @@ export class Client extends ContractClient {
|
|
|
53
86
|
return defs;
|
|
54
87
|
})
|
|
55
88
|
);
|
|
89
|
+
const events = this.spec.events();
|
|
90
|
+
if (events.length > 0) {
|
|
91
|
+
imports.typeFileImports.add("ContractEvent");
|
|
92
|
+
imports.stellarImports.add("xdr");
|
|
93
|
+
events.forEach((event) => {
|
|
94
|
+
const topicParams = event.params().filter(
|
|
95
|
+
(param) => param.location().value === curr_generated.default.ScSpecEventParamLocationV0.scSpecEventParamLocationTopicList().value
|
|
96
|
+
);
|
|
97
|
+
topicParams.forEach((param) => {
|
|
98
|
+
const nested = utils.generateTypeImports([param.type()]);
|
|
99
|
+
nested.typeFileImports.forEach((t) => imports.typeFileImports.add(t));
|
|
100
|
+
nested.stellarContractImports.forEach(
|
|
101
|
+
(t) => imports.stellarContractImports.add(t)
|
|
102
|
+
);
|
|
103
|
+
nested.stellarImports.forEach((t) => imports.stellarImports.add(t));
|
|
104
|
+
imports.needsBufferImport = imports.needsBufferImport || nested.needsBufferImport;
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
}
|
|
56
108
|
return utils.formatImports(imports, {
|
|
57
109
|
includeTypeFileImports: true,
|
|
58
110
|
// Client imports types
|
|
@@ -65,6 +117,124 @@ export class Client extends ContractClient {
|
|
|
65
117
|
]
|
|
66
118
|
});
|
|
67
119
|
}
|
|
120
|
+
/**
|
|
121
|
+
* Generate the parseEvent method, which delegates to the underlying Spec
|
|
122
|
+
* to decode a raw event's topics/data into a typed ContractEvent.
|
|
123
|
+
*/
|
|
124
|
+
generateParseEventMethod(methodName) {
|
|
125
|
+
return ` /**
|
|
126
|
+
* Parse a raw contract event (topics + data) into a typed {@link ContractEvent}.
|
|
127
|
+
*/
|
|
128
|
+
${methodName}(topics: xdr.ScVal[] | string[], data: xdr.ScVal | string): ContractEvent | undefined {
|
|
129
|
+
return this.spec.parseEvent(topics, data) as ContractEvent | undefined;
|
|
130
|
+
}`;
|
|
131
|
+
}
|
|
132
|
+
parseEventMethodName() {
|
|
133
|
+
const reserved = new Set(
|
|
134
|
+
this.spec.funcs().filter((func) => func.name().toString() !== "__constructor").map((func) => utils.sanitizeIdentifier(func.name().toString()))
|
|
135
|
+
);
|
|
136
|
+
let candidate = "parseEvent";
|
|
137
|
+
let suffix = 2;
|
|
138
|
+
while (reserved.has(candidate)) {
|
|
139
|
+
candidate = `parseEvent${suffix}`;
|
|
140
|
+
suffix += 1;
|
|
141
|
+
}
|
|
142
|
+
return candidate;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* The `<camelCase>EventFilter` method name derived from an event name is
|
|
146
|
+
* not injective (e.g. "FooBar" and "foo_bar" both produce
|
|
147
|
+
* "fooBarEventFilter"), a contract may declare several events with the
|
|
148
|
+
* very same name (composed modules each emitting their own "transfer"),
|
|
149
|
+
* and it can just as easily collide with a generated contract function
|
|
150
|
+
* name (e.g. an event "transfer" plus a function "transferEventFilter").
|
|
151
|
+
* Since function member names are load-bearing (called directly by
|
|
152
|
+
* users) and event filter names are already synthetic, function names
|
|
153
|
+
* always win: they are reserved first, in spec-entry order. Events are
|
|
154
|
+
* then resolved in spec-entry order, appending the smallest integer 2 or
|
|
155
|
+
* greater needed to make the name unique (and reserving whatever name
|
|
156
|
+
* results, so later events see it too). This is deterministic for a
|
|
157
|
+
* given spec.
|
|
158
|
+
*/
|
|
159
|
+
resolveEventFilterMethodNames() {
|
|
160
|
+
if (this.eventFilterMethodNames !== null) {
|
|
161
|
+
return this.eventFilterMethodNames;
|
|
162
|
+
}
|
|
163
|
+
const reserved = /* @__PURE__ */ new Set();
|
|
164
|
+
this.spec.funcs().filter((func) => func.name().toString() !== "__constructor").forEach((func) => {
|
|
165
|
+
reserved.add(utils.sanitizeIdentifier(func.name().toString()));
|
|
166
|
+
});
|
|
167
|
+
const resolved = /* @__PURE__ */ new Map();
|
|
168
|
+
this.spec.events().forEach((event, eventIndex) => {
|
|
169
|
+
const preferred = `${utils.toCamelCase(utils.sanitizeIdentifier(event.name().toString()))}EventFilter`;
|
|
170
|
+
let candidate = preferred;
|
|
171
|
+
let suffix = 2;
|
|
172
|
+
while (reserved.has(candidate)) {
|
|
173
|
+
candidate = `${preferred}${suffix}`;
|
|
174
|
+
suffix += 1;
|
|
175
|
+
}
|
|
176
|
+
reserved.add(candidate);
|
|
177
|
+
resolved.set(eventIndex, candidate);
|
|
178
|
+
});
|
|
179
|
+
this.eventFilterMethodNames = resolved;
|
|
180
|
+
return resolved;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Compute the resolved (possibly disambiguated) filter method name for an
|
|
184
|
+
* event; see {@link resolveEventFilterMethodNames}.
|
|
185
|
+
*/
|
|
186
|
+
eventFilterMethodName(event, eventIndex) {
|
|
187
|
+
const resolved = this.resolveEventFilterMethodNames().get(eventIndex);
|
|
188
|
+
if (resolved === void 0) {
|
|
189
|
+
return `${utils.toCamelCase(utils.sanitizeIdentifier(event.name().toString()))}EventFilter`;
|
|
190
|
+
}
|
|
191
|
+
return resolved;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* The resolved (possibly disambiguated) filter method name of every event
|
|
195
|
+
* in the spec, in declaration order. Exposed so callers (e.g. the bindings
|
|
196
|
+
* generator's diagnostics) can report renames and duplicates.
|
|
197
|
+
*/
|
|
198
|
+
eventFilterMethodNamesInOrder() {
|
|
199
|
+
return this.spec.events().map(
|
|
200
|
+
(event, eventIndex) => this.eventFilterMethodName(event, eventIndex)
|
|
201
|
+
);
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Generate a per-event helper that builds a topics-filter row for
|
|
205
|
+
* `Api.EventFilter.topics`, suitable for passing to server.getEvents.
|
|
206
|
+
*/
|
|
207
|
+
generateEventFilterMethod(event, eventIndex) {
|
|
208
|
+
const rawName = event.name().toString();
|
|
209
|
+
const methodName = this.eventFilterMethodName(event, eventIndex);
|
|
210
|
+
const preferredMethodName = `${utils.toCamelCase(utils.sanitizeIdentifier(rawName))}EventFilter`;
|
|
211
|
+
const occurrence = this.spec.events().slice(0, eventIndex).filter((e) => e.name().toString() === rawName).length;
|
|
212
|
+
const occurrenceNote = occurrence > 0 ? ` This targets declaration ${occurrence + 1} of the "${rawName}" event in the contract spec.` : "";
|
|
213
|
+
const renameNote = methodName !== preferredMethodName ? ` Note: renamed from "${preferredMethodName}" to avoid a collision with another generated name.` : "";
|
|
214
|
+
const topicParams = event.params().filter(
|
|
215
|
+
(param) => param.location().value === curr_generated.default.ScSpecEventParamLocationV0.scSpecEventParamLocationTopicList().value
|
|
216
|
+
);
|
|
217
|
+
const fields = topicParams.map((param) => {
|
|
218
|
+
const rawParamName = param.name().toString();
|
|
219
|
+
const fieldName = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(rawParamName) ? rawParamName : `"${utils.escapeStringLiteral(rawParamName)}"`;
|
|
220
|
+
const fieldType = utils.parseTypeFromTypeDef(param.type(), true);
|
|
221
|
+
return `${fieldName}?: ${fieldType}`;
|
|
222
|
+
}).join("; ");
|
|
223
|
+
const doc = utils.formatJSDocComment(
|
|
224
|
+
`Build a topics filter row for the "${rawName}" event, for use in \`Api.EventFilter.topics\` when calling \`server.getEvents\`. Omitted fields match any value.${occurrenceNote}${renameNote}`,
|
|
225
|
+
2
|
|
226
|
+
);
|
|
227
|
+
const escapedName = utils.escapeStringLiteral(rawName);
|
|
228
|
+
const occurrenceArg = occurrence > 0 ? `, ${occurrence}` : "";
|
|
229
|
+
if (topicParams.length === 0) {
|
|
230
|
+
return `${doc} ${methodName}(): string[] {
|
|
231
|
+
return this.spec.eventTopicFilter("${escapedName}"${occurrence > 0 ? `, undefined${occurrenceArg}` : ""});
|
|
232
|
+
}`;
|
|
233
|
+
}
|
|
234
|
+
return `${doc} ${methodName}(topicValues?: { ${fields} }): string[] {
|
|
235
|
+
return this.spec.eventTopicFilter("${escapedName}", topicValues${occurrenceArg});
|
|
236
|
+
}`;
|
|
237
|
+
}
|
|
68
238
|
/**
|
|
69
239
|
* Generate interface method signature
|
|
70
240
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sources":["../../../../src/bindings/client.ts"],"sourcesContent":["import { xdr } from \"../base/index.js\";\nimport { Spec } from \"../contract/index.js\";\nimport {\n parseTypeFromTypeDef,\n generateTypeImports,\n sanitizeIdentifier,\n formatJSDocComment,\n formatImports,\n} from \"./utils.js\";\n\n/**\n * Generates TypeScript client class for contract methods\n */\nexport class ClientGenerator {\n private spec: Spec;\n\n constructor(spec: Spec) {\n this.spec = spec;\n }\n\n /**\n * Generate client class\n */\n generate(): string {\n // Generate constructor method if it exists\n let deployMethod = \"\";\n try {\n const constructorFunc = this.spec.getFunc(\"__constructor\");\n deployMethod = this.generateDeployMethod(constructorFunc);\n } catch {\n // For specs without a constructor, generate a deploy method without params\n deployMethod = this.generateDeployMethod(undefined);\n }\n // Generate interface methods\n const interfaceMethods = this.spec\n .funcs()\n .filter((func) => func.name().toString() !== \"__constructor\")\n .map((func) => this.generateInterfaceMethod(func))\n .join(\"\\n\");\n\n const imports = this.generateImports();\n\n const specEntries = this.spec.entries.map(\n (entry) => `\"${entry.toXDR(\"base64\")}\"`,\n );\n\n const fromJSON = this.spec\n .funcs()\n .filter((func) => func.name().toString() !== \"__constructor\")\n .map((func) => this.generateFromJSONMethod(func))\n .join(\",\");\n\n return `${imports}\n\nexport interface Client {\n${interfaceMethods}\n}\n\nexport class Client extends ContractClient {\n constructor(public readonly options: ContractClientOptions) {\n super(\n new Spec([${specEntries.join(\", \")}]),\n options\n );\n }\n\n ${deployMethod}\n public readonly fromJSON = {\n ${fromJSON}\n };\n}`;\n }\n\n private generateImports(): string {\n const imports = generateTypeImports(\n this.spec.funcs().flatMap((func) => {\n const inputs = func.inputs();\n const outputs = func.outputs();\n const defs = inputs.map((input) => input.type()).concat(outputs);\n return defs;\n }),\n );\n\n return formatImports(imports, {\n includeTypeFileImports: true, // Client imports types\n additionalStellarContractImports: [\n \"Spec\",\n \"AssembledTransaction\",\n \"Client as ContractClient\",\n \"ClientOptions as ContractClientOptions\",\n \"MethodOptions\",\n ],\n });\n }\n\n /**\n * Generate interface method signature\n */\n private generateInterfaceMethod(func: xdr.ScSpecFunctionV0): string {\n const name = sanitizeIdentifier(func.name().toString());\n const inputs = func.inputs().map((input: any) => ({\n name: sanitizeIdentifier(input.name().toString()),\n type: parseTypeFromTypeDef(input.type(), true),\n }));\n const outputType =\n func.outputs().length > 0\n ? parseTypeFromTypeDef(func.outputs()[0])\n : \"void\";\n const docs = formatJSDocComment(func.doc().toString(), 2);\n const params = this.formatMethodParameters(inputs);\n\n return `${docs} ${name}(${params}): Promise<AssembledTransaction<${outputType}>>;`;\n }\n\n private generateFromJSONMethod(func: xdr.ScSpecFunctionV0): string {\n const name = sanitizeIdentifier(func.name().toString());\n const outputType =\n func.outputs().length > 0\n ? parseTypeFromTypeDef(func.outputs()[0])\n : \"void\";\n\n return ` ${name} : this.txFromJSON<${outputType}>`;\n }\n /**\n * Generate deploy method\n */\n private generateDeployMethod(\n constructorFunc: xdr.ScSpecFunctionV0 | undefined,\n ): string {\n // If no constructor, generate deploy with no params\n if (!constructorFunc) {\n const params = this.formatConstructorParameters([]);\n return ` static deploy<T = Client>(${params}): Promise<AssembledTransaction<T>> {\n return ContractClient.deploy(null, options);\n }`;\n }\n const inputs = constructorFunc.inputs().map((input) => ({\n name: sanitizeIdentifier(input.name().toString()),\n type: parseTypeFromTypeDef(input.type(), true),\n }));\n\n const params = this.formatConstructorParameters(inputs);\n const inputsDestructure =\n inputs.length > 0 ? `{ ${inputs.map((i) => i.name).join(\", \")} }, ` : \"\";\n\n return ` static deploy<T = Client>(${params}): Promise<AssembledTransaction<T>> {\n return ContractClient.deploy(${inputsDestructure}options);\n }`;\n }\n\n /**\n * Format method parameters\n */\n private formatMethodParameters(\n inputs: Array<{ name: string; type: string }>,\n ): string {\n const params: string[] = [];\n\n if (inputs.length > 0) {\n const inputsParam = `{ ${inputs.map((i) => `${i.name}: ${i.type}`).join(\"; \")} }`;\n params.push(\n `{ ${inputs.map((i) => i.name).join(\", \")} }: ${inputsParam}`,\n );\n }\n\n params.push(\"options?: MethodOptions\");\n\n return params.join(\", \");\n }\n\n /**\n * Format constructor parameters\n */\n private formatConstructorParameters(\n inputs: Array<{ name: string; type: string }>,\n ): string {\n const params: string[] = [];\n\n if (inputs.length > 0) {\n const inputsParam = `{ ${inputs.map((i) => `${i.name}: ${i.type}`).join(\"; \")} }`;\n params.push(\n `{ ${inputs.map((i) => i.name).join(\", \")} }: ${inputsParam}`,\n );\n }\n\n params.push(\n 'options: MethodOptions & Omit<ContractClientOptions, \\'contractId\\'> & { wasmHash: Buffer | string; salt?: Buffer | Uint8Array; format?: \"hex\" | \"base64\"; address?: string; }',\n );\n\n return params.join(\", \");\n }\n}\n"],"names":["generateTypeImports","formatImports","sanitizeIdentifier","parseTypeFromTypeDef","formatJSDocComment","params"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","sources":["../../../../src/bindings/client.ts"],"sourcesContent":["import { xdr } from \"../base/index.js\";\nimport { Spec } from \"../contract/index.js\";\nimport {\n parseTypeFromTypeDef,\n generateTypeImports,\n sanitizeIdentifier,\n escapeStringLiteral,\n formatJSDocComment,\n formatImports,\n toCamelCase,\n} from \"./utils.js\";\n\n/**\n * Generates TypeScript client class for contract methods\n */\nexport class ClientGenerator {\n private spec: Spec;\n\n // event index (in declaration order) -> resolved (possibly disambiguated)\n // filter method name. Keyed by index rather than raw name because a\n // contract may declare several events with the same name.\n // Lazily computed on first use; see resolveEventFilterMethodNames().\n private eventFilterMethodNames: Map<number, string> | null = null;\n\n constructor(spec: Spec) {\n this.spec = spec;\n }\n\n /**\n * Generate client class\n */\n generate(): string {\n // Generate constructor method if it exists\n let deployMethod = \"\";\n try {\n const constructorFunc = this.spec.getFunc(\"__constructor\");\n deployMethod = this.generateDeployMethod(constructorFunc);\n } catch {\n // For specs without a constructor, generate a deploy method without params\n deployMethod = this.generateDeployMethod(undefined);\n }\n // Generate interface methods\n const interfaceMethods = this.spec\n .funcs()\n .filter((func) => func.name().toString() !== \"__constructor\")\n .map((func) => this.generateInterfaceMethod(func))\n .join(\"\\n\");\n\n const imports = this.generateImports();\n\n const specEntries = this.spec.entries.map(\n (entry) => `\"${entry.toXDR(\"base64\")}\"`,\n );\n\n const fromJSON = this.spec\n .funcs()\n .filter((func) => func.name().toString() !== \"__constructor\")\n .map((func) => this.generateFromJSONMethod(func))\n .join(\",\");\n\n const events = this.spec.events();\n const parseEventMethodName = this.parseEventMethodName();\n const eventMethods =\n events.length > 0\n ? `\\n${this.generateParseEventMethod(parseEventMethodName)}\\n${events\n .map((event, eventIndex) =>\n this.generateEventFilterMethod(event, eventIndex),\n )\n .join(\"\\n\")}`\n : \"\";\n\n return `${imports}\n\nexport interface Client {\n${interfaceMethods}\n}\n\nexport class Client extends ContractClient {\n constructor(public readonly options: ContractClientOptions) {\n super(\n new Spec([${specEntries.join(\", \")}]),\n options\n );\n }\n\n ${deployMethod}\n public readonly fromJSON = {\n ${fromJSON}\n };\n${eventMethods}\n}`;\n }\n\n private generateImports(): string {\n const imports = generateTypeImports(\n this.spec.funcs().flatMap((func) => {\n const inputs = func.inputs();\n const outputs = func.outputs();\n const defs = inputs.map((input) => input.type()).concat(outputs);\n return defs;\n }),\n );\n\n const events = this.spec.events();\n if (events.length > 0) {\n // parseEvent()'s return type is the ContractEvent union\n imports.typeFileImports.add(\"ContractEvent\");\n // parseEvent()'s topics/data parameters are typed using xdr.ScVal\n imports.stellarImports.add(\"xdr\");\n // Event filter helpers reference topic-list param types only; data\n // param types appear only in types.ts\n events.forEach((event) => {\n const topicParams = event\n .params()\n .filter(\n (param) =>\n param.location().value ===\n xdr.ScSpecEventParamLocationV0.scSpecEventParamLocationTopicList()\n .value,\n );\n topicParams.forEach((param) => {\n const nested = generateTypeImports([param.type()]);\n nested.typeFileImports.forEach((t) => imports.typeFileImports.add(t));\n nested.stellarContractImports.forEach((t) =>\n imports.stellarContractImports.add(t),\n );\n nested.stellarImports.forEach((t) => imports.stellarImports.add(t));\n imports.needsBufferImport =\n imports.needsBufferImport || nested.needsBufferImport;\n });\n });\n }\n\n return formatImports(imports, {\n includeTypeFileImports: true, // Client imports types\n additionalStellarContractImports: [\n \"Spec\",\n \"AssembledTransaction\",\n \"Client as ContractClient\",\n \"ClientOptions as ContractClientOptions\",\n \"MethodOptions\",\n ],\n });\n }\n\n /**\n * Generate the parseEvent method, which delegates to the underlying Spec\n * to decode a raw event's topics/data into a typed ContractEvent.\n */\n private generateParseEventMethod(methodName: string): string {\n return ` /**\n * Parse a raw contract event (topics + data) into a typed {@link ContractEvent}.\n */\n ${methodName}(topics: xdr.ScVal[] | string[], data: xdr.ScVal | string): ContractEvent | undefined {\n return this.spec.parseEvent(topics, data) as ContractEvent | undefined;\n }`;\n }\n\n private parseEventMethodName(): string {\n const reserved = new Set(\n this.spec\n .funcs()\n .filter((func) => func.name().toString() !== \"__constructor\")\n .map((func) => sanitizeIdentifier(func.name().toString())),\n );\n let candidate = \"parseEvent\";\n let suffix = 2;\n while (reserved.has(candidate)) {\n candidate = `parseEvent${suffix}`;\n suffix += 1;\n }\n return candidate;\n }\n\n /**\n * The `<camelCase>EventFilter` method name derived from an event name is\n * not injective (e.g. \"FooBar\" and \"foo_bar\" both produce\n * \"fooBarEventFilter\"), a contract may declare several events with the\n * very same name (composed modules each emitting their own \"transfer\"),\n * and it can just as easily collide with a generated contract function\n * name (e.g. an event \"transfer\" plus a function \"transferEventFilter\").\n * Since function member names are load-bearing (called directly by\n * users) and event filter names are already synthetic, function names\n * always win: they are reserved first, in spec-entry order. Events are\n * then resolved in spec-entry order, appending the smallest integer 2 or\n * greater needed to make the name unique (and reserving whatever name\n * results, so later events see it too). This is deterministic for a\n * given spec.\n */\n private resolveEventFilterMethodNames(): Map<number, string> {\n if (this.eventFilterMethodNames !== null) {\n return this.eventFilterMethodNames;\n }\n\n const reserved = new Set<string>();\n\n this.spec\n .funcs()\n .filter((func) => func.name().toString() !== \"__constructor\")\n .forEach((func) => {\n reserved.add(sanitizeIdentifier(func.name().toString()));\n });\n\n const resolved = new Map<number, string>();\n\n this.spec.events().forEach((event, eventIndex) => {\n const preferred = `${toCamelCase(sanitizeIdentifier(event.name().toString()))}EventFilter`;\n\n let candidate = preferred;\n let suffix = 2;\n while (reserved.has(candidate)) {\n candidate = `${preferred}${suffix}`;\n suffix += 1;\n }\n\n reserved.add(candidate);\n resolved.set(eventIndex, candidate);\n });\n\n this.eventFilterMethodNames = resolved;\n return resolved;\n }\n\n /**\n * Compute the resolved (possibly disambiguated) filter method name for an\n * event; see {@link resolveEventFilterMethodNames}.\n */\n private eventFilterMethodName(\n event: xdr.ScSpecEventV0,\n eventIndex: number,\n ): string {\n const resolved = this.resolveEventFilterMethodNames().get(eventIndex);\n /* istanbul ignore next -- every event in the spec is reserved a name */\n if (resolved === undefined) {\n return `${toCamelCase(sanitizeIdentifier(event.name().toString()))}EventFilter`;\n }\n return resolved;\n }\n\n /**\n * The resolved (possibly disambiguated) filter method name of every event\n * in the spec, in declaration order. Exposed so callers (e.g. the bindings\n * generator's diagnostics) can report renames and duplicates.\n */\n eventFilterMethodNamesInOrder(): string[] {\n return this.spec\n .events()\n .map((event, eventIndex) =>\n this.eventFilterMethodName(event, eventIndex),\n );\n }\n\n /**\n * Generate a per-event helper that builds a topics-filter row for\n * `Api.EventFilter.topics`, suitable for passing to server.getEvents.\n */\n private generateEventFilterMethod(\n event: xdr.ScSpecEventV0,\n eventIndex: number,\n ): string {\n const rawName = event.name().toString();\n const methodName = this.eventFilterMethodName(event, eventIndex);\n const preferredMethodName = `${toCamelCase(sanitizeIdentifier(rawName))}EventFilter`;\n // Which same-named event this is (0-based, declaration order) — needed\n // so eventTopicFilter targets the right spec when names are duplicated.\n const occurrence = this.spec\n .events()\n .slice(0, eventIndex)\n .filter((e) => e.name().toString() === rawName).length;\n const occurrenceNote =\n occurrence > 0\n ? ` This targets declaration ${occurrence + 1} of the \"${rawName}\" event in the contract spec.`\n : \"\";\n const renameNote =\n methodName !== preferredMethodName\n ? ` Note: renamed from \"${preferredMethodName}\" to avoid a collision with another generated name.`\n : \"\";\n const topicParams = event\n .params()\n .filter(\n (param) =>\n param.location().value ===\n xdr.ScSpecEventParamLocationV0.scSpecEventParamLocationTopicList()\n .value,\n );\n\n // eventTopicFilter looks values up by the raw param names, so the\n // parameter type must use them too — quoted when they aren't valid\n // identifiers.\n const fields = topicParams\n .map((param) => {\n const rawParamName = param.name().toString();\n const fieldName = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(rawParamName)\n ? rawParamName\n : `\"${escapeStringLiteral(rawParamName)}\"`;\n const fieldType = parseTypeFromTypeDef(param.type(), true);\n return `${fieldName}?: ${fieldType}`;\n })\n .join(\"; \");\n\n const doc = formatJSDocComment(\n `Build a topics filter row for the \"${rawName}\" event, for use in ` +\n `\\`Api.EventFilter.topics\\` when calling \\`server.getEvents\\`. ` +\n `Omitted fields match any value.${occurrenceNote}${renameNote}`,\n 2,\n );\n\n const escapedName = escapeStringLiteral(rawName);\n const occurrenceArg = occurrence > 0 ? `, ${occurrence}` : \"\";\n\n if (topicParams.length === 0) {\n return `${doc} ${methodName}(): string[] {\n return this.spec.eventTopicFilter(\"${escapedName}\"${occurrence > 0 ? `, undefined${occurrenceArg}` : \"\"});\n }`;\n }\n\n return `${doc} ${methodName}(topicValues?: { ${fields} }): string[] {\n return this.spec.eventTopicFilter(\"${escapedName}\", topicValues${occurrenceArg});\n }`;\n }\n\n /**\n * Generate interface method signature\n */\n private generateInterfaceMethod(func: xdr.ScSpecFunctionV0): string {\n const name = sanitizeIdentifier(func.name().toString());\n const inputs = func.inputs().map((input: any) => ({\n name: sanitizeIdentifier(input.name().toString()),\n type: parseTypeFromTypeDef(input.type(), true),\n }));\n const outputType =\n func.outputs().length > 0\n ? parseTypeFromTypeDef(func.outputs()[0])\n : \"void\";\n const docs = formatJSDocComment(func.doc().toString(), 2);\n const params = this.formatMethodParameters(inputs);\n\n return `${docs} ${name}(${params}): Promise<AssembledTransaction<${outputType}>>;`;\n }\n\n private generateFromJSONMethod(func: xdr.ScSpecFunctionV0): string {\n const name = sanitizeIdentifier(func.name().toString());\n const outputType =\n func.outputs().length > 0\n ? parseTypeFromTypeDef(func.outputs()[0])\n : \"void\";\n\n return ` ${name} : this.txFromJSON<${outputType}>`;\n }\n /**\n * Generate deploy method\n */\n private generateDeployMethod(\n constructorFunc: xdr.ScSpecFunctionV0 | undefined,\n ): string {\n // If no constructor, generate deploy with no params\n if (!constructorFunc) {\n const params = this.formatConstructorParameters([]);\n return ` static deploy<T = Client>(${params}): Promise<AssembledTransaction<T>> {\n return ContractClient.deploy(null, options);\n }`;\n }\n const inputs = constructorFunc.inputs().map((input) => ({\n name: sanitizeIdentifier(input.name().toString()),\n type: parseTypeFromTypeDef(input.type(), true),\n }));\n\n const params = this.formatConstructorParameters(inputs);\n const inputsDestructure =\n inputs.length > 0 ? `{ ${inputs.map((i) => i.name).join(\", \")} }, ` : \"\";\n\n return ` static deploy<T = Client>(${params}): Promise<AssembledTransaction<T>> {\n return ContractClient.deploy(${inputsDestructure}options);\n }`;\n }\n\n /**\n * Format method parameters\n */\n private formatMethodParameters(\n inputs: Array<{ name: string; type: string }>,\n ): string {\n const params: string[] = [];\n\n if (inputs.length > 0) {\n const inputsParam = `{ ${inputs.map((i) => `${i.name}: ${i.type}`).join(\"; \")} }`;\n params.push(\n `{ ${inputs.map((i) => i.name).join(\", \")} }: ${inputsParam}`,\n );\n }\n\n params.push(\"options?: MethodOptions\");\n\n return params.join(\", \");\n }\n\n /**\n * Format constructor parameters\n */\n private formatConstructorParameters(\n inputs: Array<{ name: string; type: string }>,\n ): string {\n const params: string[] = [];\n\n if (inputs.length > 0) {\n const inputsParam = `{ ${inputs.map((i) => `${i.name}: ${i.type}`).join(\"; \")} }`;\n params.push(\n `{ ${inputs.map((i) => i.name).join(\", \")} }: ${inputsParam}`,\n );\n }\n\n params.push(\n 'options: MethodOptions & Omit<ContractClientOptions, \\'contractId\\'> & { wasmHash: Buffer | string; salt?: Buffer | Uint8Array; format?: \"hex\" | \"base64\"; address?: string; }',\n );\n\n return params.join(\", \");\n }\n}\n"],"names":["generateTypeImports","xdr","formatImports","sanitizeIdentifier","toCamelCase","escapeStringLiteral","parseTypeFromTypeDef","formatJSDocComment","params"],"mappings":"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"}
|