@crossmint/client-sdk-smart-wallet 0.1.21 → 0.1.23
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/dist/SmartWalletSDK.cjs +34 -1
- package/dist/SmartWalletSDK.cjs.map +1 -0
- package/dist/SmartWalletSDK.js +34 -1
- package/dist/SmartWalletSDK.js.map +1 -0
- package/dist/api/CrossmintWalletService.cjs +13 -1
- package/dist/api/CrossmintWalletService.cjs.map +1 -0
- package/dist/api/CrossmintWalletService.js +13 -1
- package/dist/api/CrossmintWalletService.js.map +1 -0
- package/dist/blockchain/chains.cjs +23 -1
- package/dist/blockchain/chains.cjs.map +1 -0
- package/dist/blockchain/chains.js +23 -1
- package/dist/blockchain/chains.js.map +1 -0
- package/dist/blockchain/rpc.cjs +11 -1
- package/dist/blockchain/rpc.cjs.map +1 -0
- package/dist/blockchain/rpc.js +11 -1
- package/dist/blockchain/rpc.js.map +1 -0
- package/dist/blockchain/transfer.cjs +7 -1
- package/dist/blockchain/transfer.cjs.map +1 -0
- package/dist/blockchain/transfer.js +7 -1
- package/dist/blockchain/transfer.js.map +1 -0
- package/dist/blockchain/wallets/EVMSmartWallet.cjs +10 -1
- package/dist/blockchain/wallets/EVMSmartWallet.cjs.map +1 -0
- package/dist/blockchain/wallets/EVMSmartWallet.js +10 -1
- package/dist/blockchain/wallets/EVMSmartWallet.js.map +1 -0
- package/dist/blockchain/wallets/SendTransactionService.cjs +11 -1
- package/dist/blockchain/wallets/SendTransactionService.cjs.map +1 -0
- package/dist/blockchain/wallets/SendTransactionService.js +11 -1
- package/dist/blockchain/wallets/SendTransactionService.js.map +1 -0
- package/dist/blockchain/wallets/account/cache.cjs +9 -1
- package/dist/blockchain/wallets/account/cache.cjs.map +1 -0
- package/dist/blockchain/wallets/account/cache.js +9 -1
- package/dist/blockchain/wallets/account/cache.js.map +1 -0
- package/dist/blockchain/wallets/account/config.cjs +9 -1
- package/dist/blockchain/wallets/account/config.cjs.map +1 -0
- package/dist/blockchain/wallets/account/config.js +9 -1
- package/dist/blockchain/wallets/account/config.js.map +1 -0
- package/dist/blockchain/wallets/account/creator.cjs +10 -1
- package/dist/blockchain/wallets/account/creator.cjs.map +1 -0
- package/dist/blockchain/wallets/account/creator.js +10 -1
- package/dist/blockchain/wallets/account/creator.js.map +1 -0
- package/dist/blockchain/wallets/account/eoa.cjs +11 -1
- package/dist/blockchain/wallets/account/eoa.cjs.map +1 -0
- package/dist/blockchain/wallets/account/eoa.js +11 -1
- package/dist/blockchain/wallets/account/eoa.js.map +1 -0
- package/dist/blockchain/wallets/account/passkey.cjs +9 -1
- package/dist/blockchain/wallets/account/passkey.cjs.map +1 -0
- package/dist/blockchain/wallets/account/passkey.js +9 -1
- package/dist/blockchain/wallets/account/passkey.js.map +1 -0
- package/dist/blockchain/wallets/account/signer.cjs +9 -1
- package/dist/blockchain/wallets/account/signer.cjs.map +1 -0
- package/dist/blockchain/wallets/account/signer.js +9 -1
- package/dist/blockchain/wallets/account/signer.js.map +1 -0
- package/dist/blockchain/wallets/account/strategy.cjs +1 -1
- package/dist/blockchain/wallets/account/strategy.cjs.map +1 -0
- package/dist/blockchain/wallets/account/strategy.js +1 -0
- package/dist/blockchain/wallets/account/strategy.js.map +1 -0
- package/dist/blockchain/wallets/clientDecorator.cjs +12 -1
- package/dist/blockchain/wallets/clientDecorator.cjs.map +1 -0
- package/dist/blockchain/wallets/clientDecorator.js +12 -1
- package/dist/blockchain/wallets/clientDecorator.js.map +1 -0
- package/dist/blockchain/wallets/index.cjs +10 -1
- package/dist/blockchain/wallets/index.cjs.map +1 -0
- package/dist/blockchain/wallets/index.js +10 -1
- package/dist/blockchain/wallets/index.js.map +1 -0
- package/dist/blockchain/wallets/paymaster.cjs +10 -1
- package/dist/blockchain/wallets/paymaster.cjs.map +1 -0
- package/dist/blockchain/wallets/paymaster.js +10 -1
- package/dist/blockchain/wallets/paymaster.js.map +1 -0
- package/dist/blockchain/wallets/service.cjs +16 -1
- package/dist/blockchain/wallets/service.cjs.map +1 -0
- package/dist/blockchain/wallets/service.js +16 -1
- package/dist/blockchain/wallets/service.js.map +1 -0
- package/dist/chunk-2HB65Y7D.js +79 -0
- package/dist/chunk-2HB65Y7D.js.map +1 -0
- package/dist/chunk-3EQHAQXO.js +112 -0
- package/dist/chunk-3EQHAQXO.js.map +1 -0
- package/dist/chunk-3R6PW6HY.js +30 -0
- package/dist/chunk-3R6PW6HY.js.map +1 -0
- package/dist/{chunk-XJGFG3RT.cjs → chunk-5MG5CIEX.cjs} +13 -1
- package/dist/chunk-5MG5CIEX.cjs.map +1 -0
- package/dist/chunk-5URMCCO6.js +9 -0
- package/dist/chunk-5URMCCO6.js.map +1 -0
- package/dist/chunk-5VHMVO22.js +39 -0
- package/dist/chunk-5VHMVO22.js.map +1 -0
- package/dist/chunk-5W4NYW72.js +44 -0
- package/dist/chunk-5W4NYW72.js.map +1 -0
- package/dist/chunk-5WVQ7J3E.cjs +369 -0
- package/dist/chunk-5WVQ7J3E.cjs.map +1 -0
- package/dist/chunk-6NJVFL2X.js +60 -0
- package/dist/chunk-6NJVFL2X.js.map +1 -0
- package/dist/chunk-77GT6B5L.cjs +79 -0
- package/dist/chunk-77GT6B5L.cjs.map +1 -0
- package/dist/chunk-7AT3QDQV.js +36 -0
- package/dist/chunk-7AT3QDQV.js.map +1 -0
- package/dist/chunk-7B2CZEJG.cjs +66 -0
- package/dist/chunk-7B2CZEJG.cjs.map +1 -0
- package/dist/chunk-7G2SBZTE.js +93 -0
- package/dist/chunk-7G2SBZTE.js.map +1 -0
- package/dist/chunk-7KTQNIAZ.cjs +112 -0
- package/dist/chunk-7KTQNIAZ.cjs.map +1 -0
- package/dist/chunk-ASIPMVRQ.js +90 -0
- package/dist/chunk-ASIPMVRQ.js.map +1 -0
- package/dist/chunk-BARW756O.js +27 -0
- package/dist/chunk-BARW756O.js.map +1 -0
- package/dist/chunk-BSFIJZ5X.js +41 -0
- package/dist/chunk-BSFIJZ5X.js.map +1 -0
- package/dist/chunk-BXSAJOIV.cjs +90 -0
- package/dist/chunk-BXSAJOIV.cjs.map +1 -0
- package/dist/chunk-C5ZRYSCP.cjs +14 -0
- package/dist/chunk-C5ZRYSCP.cjs.map +1 -0
- package/dist/chunk-DTEA33DF.cjs +59 -0
- package/dist/chunk-DTEA33DF.cjs.map +1 -0
- package/dist/chunk-DYO4HODM.cjs +36 -0
- package/dist/chunk-DYO4HODM.cjs.map +1 -0
- package/dist/chunk-EPEGJY6N.cjs +9 -0
- package/dist/chunk-EPEGJY6N.cjs.map +1 -0
- package/dist/chunk-EQSMHR77.js +30 -0
- package/dist/chunk-EQSMHR77.js.map +1 -0
- package/dist/chunk-EUQLY4SC.cjs +82 -0
- package/dist/chunk-EUQLY4SC.cjs.map +1 -0
- package/dist/chunk-FSIMJYXR.js +36 -0
- package/dist/chunk-FSIMJYXR.js.map +1 -0
- package/dist/chunk-FXGOVLZW.cjs +9 -0
- package/dist/chunk-FXGOVLZW.cjs.map +1 -0
- package/dist/chunk-GLHQIT4Q.cjs +36 -0
- package/dist/chunk-GLHQIT4Q.cjs.map +1 -0
- package/dist/chunk-IDNF4BNP.cjs +44 -0
- package/dist/chunk-IDNF4BNP.cjs.map +1 -0
- package/dist/chunk-JOB7STIS.js +9 -0
- package/dist/chunk-JOB7STIS.js.map +1 -0
- package/dist/chunk-KEY2LM72.cjs +93 -0
- package/dist/chunk-KEY2LM72.cjs.map +1 -0
- package/dist/chunk-KHROQTVY.js +1 -0
- package/dist/chunk-KHROQTVY.js.map +1 -0
- package/dist/chunk-MAID7XYG.js +14 -0
- package/dist/chunk-MAID7XYG.js.map +1 -0
- package/dist/chunk-MJZ2DXMN.cjs +123 -0
- package/dist/chunk-MJZ2DXMN.cjs.map +1 -0
- package/dist/chunk-N6DG5EZG.cjs +156 -0
- package/dist/chunk-N6DG5EZG.cjs.map +1 -0
- package/dist/chunk-NXDZHR5C.js +99 -0
- package/dist/chunk-NXDZHR5C.js.map +1 -0
- package/dist/chunk-O6IFYHDP.cjs +36 -0
- package/dist/chunk-O6IFYHDP.cjs.map +1 -0
- package/dist/chunk-OCG67QSU.cjs +41 -0
- package/dist/chunk-OCG67QSU.cjs.map +1 -0
- package/dist/chunk-OGA3YDWS.cjs +112 -0
- package/dist/chunk-OGA3YDWS.cjs.map +1 -0
- package/dist/chunk-ON4DOYVD.js +369 -0
- package/dist/chunk-ON4DOYVD.js.map +1 -0
- package/dist/chunk-OYKL3RNL.js +66 -0
- package/dist/chunk-OYKL3RNL.js.map +1 -0
- package/dist/chunk-PVFA6PBX.cjs +60 -0
- package/dist/chunk-PVFA6PBX.cjs.map +1 -0
- package/dist/chunk-QJ3BSVGV.js +36 -0
- package/dist/chunk-QJ3BSVGV.js.map +1 -0
- package/dist/chunk-RB4JSPZH.cjs +99 -0
- package/dist/chunk-RB4JSPZH.cjs.map +1 -0
- package/dist/chunk-SMDX2MXU.js +13 -0
- package/dist/chunk-SMDX2MXU.js.map +1 -0
- package/dist/chunk-TDJDKTRS.js +156 -0
- package/dist/chunk-TDJDKTRS.js.map +1 -0
- package/dist/chunk-TK3ZLI22.cjs +39 -0
- package/dist/chunk-TK3ZLI22.cjs.map +1 -0
- package/dist/chunk-TUVECZA7.cjs +22 -0
- package/dist/chunk-TUVECZA7.cjs.map +1 -0
- package/dist/chunk-U4OBHCIP.js +59 -0
- package/dist/chunk-U4OBHCIP.js.map +1 -0
- package/dist/chunk-UDDYHPSW.js +22 -0
- package/dist/chunk-UDDYHPSW.js.map +1 -0
- package/dist/chunk-UNP5V2AB.js +82 -0
- package/dist/chunk-UNP5V2AB.js.map +1 -0
- package/dist/chunk-UQKE6R5W.cjs +27 -0
- package/dist/chunk-UQKE6R5W.cjs.map +1 -0
- package/dist/chunk-UZGHOTKZ.js +112 -0
- package/dist/chunk-UZGHOTKZ.js.map +1 -0
- package/dist/chunk-XZTGDSSL.js +123 -0
- package/dist/chunk-XZTGDSSL.js.map +1 -0
- package/dist/chunk-YWCXHOSD.cjs +30 -0
- package/dist/chunk-YWCXHOSD.cjs.map +1 -0
- package/dist/chunk-ZN42AA2G.cjs +1 -0
- package/dist/chunk-ZN42AA2G.cjs.map +1 -0
- package/dist/chunk-ZOXKITU4.cjs +30 -0
- package/dist/chunk-ZOXKITU4.cjs.map +1 -0
- package/dist/error/index.cjs +25 -1
- package/dist/error/index.cjs.map +1 -0
- package/dist/error/index.js +25 -1
- package/dist/error/index.js.map +1 -0
- package/dist/error/processor.cjs +9 -1
- package/dist/error/processor.cjs.map +1 -0
- package/dist/error/processor.js +9 -1
- package/dist/error/processor.js.map +1 -0
- package/dist/index.cjs +86 -1
- package/dist/index.cjs.map +1 -0
- package/dist/index.js +86 -1
- package/dist/index.js.map +1 -0
- package/dist/services/index.cjs +11 -1
- package/dist/services/index.cjs.map +1 -0
- package/dist/services/index.js +11 -1
- package/dist/services/index.js.map +1 -0
- package/dist/services/logger.cjs +10 -1
- package/dist/services/logger.cjs.map +1 -0
- package/dist/services/logger.js +10 -1
- package/dist/services/logger.js.map +1 -0
- package/dist/types/internal.cjs +18 -1
- package/dist/types/internal.cjs.map +1 -0
- package/dist/types/internal.js +18 -1
- package/dist/types/internal.js.map +1 -0
- package/dist/types/params.cjs +1 -1
- package/dist/types/params.cjs.map +1 -0
- package/dist/types/params.js +1 -0
- package/dist/types/params.js.map +1 -0
- package/dist/types/schema.cjs +16 -1
- package/dist/types/schema.cjs.map +1 -0
- package/dist/types/schema.js +16 -1
- package/dist/types/schema.js.map +1 -0
- package/dist/types/service.cjs +1 -1
- package/dist/types/service.cjs.map +1 -0
- package/dist/types/service.js +1 -0
- package/dist/types/service.js.map +1 -0
- package/dist/types/token.cjs +1 -1
- package/dist/types/token.cjs.map +1 -0
- package/dist/types/token.js +1 -0
- package/dist/types/token.js.map +1 -0
- package/dist/utils/api.cjs +9 -1
- package/dist/utils/api.cjs.map +1 -0
- package/dist/utils/api.js +9 -1
- package/dist/utils/api.js.map +1 -0
- package/dist/utils/blockchain.cjs +7 -1
- package/dist/utils/blockchain.cjs.map +1 -0
- package/dist/utils/blockchain.js +7 -1
- package/dist/utils/blockchain.js.map +1 -0
- package/dist/utils/constants.cjs +19 -1
- package/dist/utils/constants.cjs.map +1 -0
- package/dist/utils/constants.js +19 -1
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/environment.cjs +7 -1
- package/dist/utils/environment.cjs.map +1 -0
- package/dist/utils/environment.js +7 -1
- package/dist/utils/environment.js.map +1 -0
- package/dist/utils/helpers.cjs +9 -1
- package/dist/utils/helpers.cjs.map +1 -0
- package/dist/utils/helpers.js +9 -1
- package/dist/utils/helpers.js.map +1 -0
- package/dist/utils/signer.cjs +10 -1
- package/dist/utils/signer.cjs.map +1 -0
- package/dist/utils/signer.js +10 -1
- package/dist/utils/signer.js.map +1 -0
- package/dist/utils/test.cjs +27 -1
- package/dist/utils/test.cjs.map +1 -0
- package/dist/utils/test.js +27 -1
- package/dist/utils/test.js.map +1 -0
- package/package.json +4 -4
- package/dist/chunk-27US7ZBX.js +0 -1
- package/dist/chunk-2GS5TXEY.cjs +0 -1
- package/dist/chunk-2R6HK64N.cjs +0 -1
- package/dist/chunk-3F6P4HUZ.js +0 -1
- package/dist/chunk-4SPA557P.js +0 -0
- package/dist/chunk-5M3MSPHK.cjs +0 -1
- package/dist/chunk-6DE5YEO5.cjs +0 -1
- package/dist/chunk-7AVDZZGD.cjs +0 -1
- package/dist/chunk-7FXFOOQU.cjs +0 -1
- package/dist/chunk-7JAT6GQU.js +0 -1
- package/dist/chunk-ATQ4WGCW.js +0 -1
- package/dist/chunk-B3LJJZXD.cjs +0 -2
- package/dist/chunk-BJZQA5VC.js +0 -1
- package/dist/chunk-BXXREMNR.cjs +0 -1
- package/dist/chunk-C3VZY7VJ.js +0 -1
- package/dist/chunk-CPYNP4XI.js +0 -1
- package/dist/chunk-CUTQYF3F.js +0 -1
- package/dist/chunk-D4NDUT36.js +0 -1
- package/dist/chunk-DIDKPOO2.cjs +0 -1
- package/dist/chunk-ETVJGLNY.js +0 -1
- package/dist/chunk-FHNNZVNU.js +0 -1
- package/dist/chunk-FIJ3CBJ4.js +0 -3
- package/dist/chunk-G57LROTD.js +0 -1
- package/dist/chunk-GB35YMN4.cjs +0 -1
- package/dist/chunk-H4CMXNVK.js +0 -1
- package/dist/chunk-IQTGPM2U.cjs +0 -1
- package/dist/chunk-KYPTGHC6.cjs +0 -1
- package/dist/chunk-LMVY4C4Y.js +0 -1
- package/dist/chunk-M4K3IZTT.cjs +0 -1
- package/dist/chunk-NLGILHJS.js +0 -1
- package/dist/chunk-O2ACORII.cjs +0 -1
- package/dist/chunk-OCJYX5QF.cjs +0 -1
- package/dist/chunk-ODAUWGUU.cjs +0 -1
- package/dist/chunk-PBUJXVQT.js +0 -1
- package/dist/chunk-PLRQBDYS.cjs +0 -1
- package/dist/chunk-PPTSNCSQ.cjs +0 -1
- package/dist/chunk-PZ6Q22YJ.js +0 -1
- package/dist/chunk-Q44P7MO7.cjs +0 -1
- package/dist/chunk-QVB3HE6Q.js +0 -2
- package/dist/chunk-S2XBSAGM.js +0 -1
- package/dist/chunk-SCXFZMLR.cjs +0 -1
- package/dist/chunk-STH2LE35.cjs +0 -1
- package/dist/chunk-SWWOVT47.cjs +0 -1
- package/dist/chunk-TZG6MROQ.js +0 -1
- package/dist/chunk-UG47CBKR.js +0 -1
- package/dist/chunk-UPURFW46.js +0 -1
- package/dist/chunk-WDM7PN4O.js +0 -1
- package/dist/chunk-WJ6XJMRD.cjs +0 -1
- package/dist/chunk-WTPE2I2Q.cjs +0 -1
- package/dist/chunk-XHSA4YTO.cjs +0 -3
- package/dist/chunk-XP6ESWVJ.js +0 -1
- package/dist/chunk-XQ2K2K23.cjs +0 -1
- package/dist/chunk-YBHSEZMB.js +0 -1
- package/dist/chunk-YZQJV2KA.cjs +0 -1
- package/dist/chunk-Z22H3MJS.js +0 -1
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
2
|
+
|
|
3
|
+
var _chunkZOXKITU4cjs = require('./chunk-ZOXKITU4.cjs');
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
var _chunkBXSAJOIVcjs = require('./chunk-BXSAJOIV.cjs');
|
|
10
|
+
|
|
11
|
+
// src/blockchain/wallets/account/passkey.ts
|
|
12
|
+
var _passkeyvalidator = require('@zerodev/passkey-validator');
|
|
13
|
+
var _sdk = require('@zerodev/sdk');
|
|
14
|
+
var _webauthnkey = require('@zerodev/webauthn-key');
|
|
15
|
+
var PasskeyCreationStrategy = class {
|
|
16
|
+
constructor(passkeyServerUrl, apiKey) {
|
|
17
|
+
this.passkeyServerUrl = passkeyServerUrl;
|
|
18
|
+
this.apiKey = apiKey;
|
|
19
|
+
}
|
|
20
|
+
async create({
|
|
21
|
+
user,
|
|
22
|
+
publicClient,
|
|
23
|
+
walletParams,
|
|
24
|
+
entryPoint,
|
|
25
|
+
kernelVersion,
|
|
26
|
+
existing
|
|
27
|
+
}) {
|
|
28
|
+
const inputPasskeyName = _nullishCoalesce(walletParams.signer.passkeyName, () => ( user.id));
|
|
29
|
+
if (existing != null && existing.signerConfig.data.passkeyName !== inputPasskeyName) {
|
|
30
|
+
throw new (0, _chunkBXSAJOIVcjs.PasskeyMismatchError)(
|
|
31
|
+
`User '${user.id}' has an existing wallet created with a passkey named '${existing.signerConfig.data.passkeyName}', this does match input passkey name '${inputPasskeyName}'.`,
|
|
32
|
+
existing.signerConfig.display()
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
try {
|
|
36
|
+
if (existing == null && walletParams.signer.onPrePasskeyRegistration != null) {
|
|
37
|
+
await walletParams.signer.onPrePasskeyRegistration();
|
|
38
|
+
}
|
|
39
|
+
const passkey = await this.getPasskey(user, inputPasskeyName, _optionalChain([existing, 'optionalAccess', _ => _.signerConfig, 'access', _2 => _2.data]));
|
|
40
|
+
const latestValidatorVersion = _passkeyvalidator.PasskeyValidatorContractVersion.V0_0_2;
|
|
41
|
+
const validatorContractVersion = existing == null ? latestValidatorVersion : existing.signerConfig.data.validatorContractVersion;
|
|
42
|
+
const validator = await _passkeyvalidator.toPasskeyValidator.call(void 0, publicClient, {
|
|
43
|
+
webAuthnKey: passkey,
|
|
44
|
+
entryPoint,
|
|
45
|
+
validatorContractVersion,
|
|
46
|
+
kernelVersion
|
|
47
|
+
});
|
|
48
|
+
const kernelAccount = await _sdk.createKernelAccount.call(void 0, publicClient, {
|
|
49
|
+
plugins: { sudo: validator },
|
|
50
|
+
entryPoint,
|
|
51
|
+
kernelVersion,
|
|
52
|
+
deployedAccountAddress: _optionalChain([existing, 'optionalAccess', _3 => _3.address])
|
|
53
|
+
});
|
|
54
|
+
return {
|
|
55
|
+
signerConfig: this.getSignerConfig(validator, validatorContractVersion, inputPasskeyName),
|
|
56
|
+
account: this.decorate(kernelAccount, inputPasskeyName, walletParams)
|
|
57
|
+
};
|
|
58
|
+
} catch (error) {
|
|
59
|
+
if (walletParams.signer.onPasskeyRegistrationError != null) {
|
|
60
|
+
walletParams.signer.onPasskeyRegistrationError(error);
|
|
61
|
+
}
|
|
62
|
+
throw this.mapError(error, inputPasskeyName);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
async getPasskey(user, passkeyName, existing) {
|
|
66
|
+
if (existing != null) {
|
|
67
|
+
return {
|
|
68
|
+
pubX: BigInt(existing.pubKeyX),
|
|
69
|
+
pubY: BigInt(existing.pubKeyY),
|
|
70
|
+
authenticatorId: existing.authenticatorId,
|
|
71
|
+
authenticatorIdHash: existing.authenticatorIdHash
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
return _webauthnkey.toWebAuthnKey.call(void 0, {
|
|
75
|
+
passkeyName,
|
|
76
|
+
passkeyServerUrl: this.passkeyServerUrl,
|
|
77
|
+
mode: _passkeyvalidator.WebAuthnMode.Register,
|
|
78
|
+
passkeyServerHeaders: this.createPasskeysServerHeaders(user)
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
getSignerConfig(validator, validatorContractVersion, passkeyName) {
|
|
82
|
+
return new (0, _chunkZOXKITU4cjs.PasskeySignerConfig)({
|
|
83
|
+
...deserializePasskeyValidatorData(validator.getSerializedData()),
|
|
84
|
+
passkeyName,
|
|
85
|
+
validatorContractVersion,
|
|
86
|
+
domain: window.location.hostname,
|
|
87
|
+
type: "passkeys"
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
createPasskeysServerHeaders(user) {
|
|
91
|
+
return {
|
|
92
|
+
"x-api-key": this.apiKey,
|
|
93
|
+
Authorization: `Bearer ${user.jwt}`
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
mapError(error, passkeyName) {
|
|
97
|
+
if (error.code === 0 && error.name === "DataError") {
|
|
98
|
+
return new (0, _chunkBXSAJOIVcjs.PasskeyIncompatibleAuthenticatorError)(passkeyName);
|
|
99
|
+
}
|
|
100
|
+
if (error.message === "Registration not verified") {
|
|
101
|
+
return new (0, _chunkBXSAJOIVcjs.PasskeyRegistrationError)(passkeyName);
|
|
102
|
+
}
|
|
103
|
+
if (error.code === "ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY" && error.name === "NotAllowedError") {
|
|
104
|
+
return new (0, _chunkBXSAJOIVcjs.PasskeyPromptError)(passkeyName);
|
|
105
|
+
}
|
|
106
|
+
return error;
|
|
107
|
+
}
|
|
108
|
+
decorate(account, passkeyName, walletParams) {
|
|
109
|
+
return new Proxy(account, {
|
|
110
|
+
get: (target, prop, receiver) => {
|
|
111
|
+
const original = Reflect.get(target, prop, receiver);
|
|
112
|
+
if (typeof original !== "function" || typeof prop !== "string" || !isAccountSigningMethod(prop)) {
|
|
113
|
+
return original;
|
|
114
|
+
}
|
|
115
|
+
const signer = walletParams.signer;
|
|
116
|
+
return async (...args) => {
|
|
117
|
+
const isFirstTransaction = _optionalChain([args, 'optionalAccess', _4 => _4[0], 'optionalAccess', _5 => _5.factoryData]) != null;
|
|
118
|
+
if (isFirstTransaction && prop === "signUserOperation" && signer.type === "PASSKEY" && signer.onFirstTimePasskeySigning != null) {
|
|
119
|
+
await signer.onFirstTimePasskeySigning();
|
|
120
|
+
}
|
|
121
|
+
try {
|
|
122
|
+
return await original.call(target, ...args);
|
|
123
|
+
} catch (error) {
|
|
124
|
+
if (signer.onFirstTimePasskeySigningError != null) {
|
|
125
|
+
await signer.onFirstTimePasskeySigningError(error);
|
|
126
|
+
}
|
|
127
|
+
throw this.mapError(error, passkeyName);
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
var accountSigningMethods = [
|
|
135
|
+
"signMessage",
|
|
136
|
+
"signTypedData",
|
|
137
|
+
"signUserOperation",
|
|
138
|
+
"signTransaction"
|
|
139
|
+
];
|
|
140
|
+
function isAccountSigningMethod(method) {
|
|
141
|
+
return accountSigningMethods.includes(method);
|
|
142
|
+
}
|
|
143
|
+
var deserializePasskeyValidatorData = (params) => {
|
|
144
|
+
const uint8Array = base64ToBytes(params);
|
|
145
|
+
const jsonString = new TextDecoder().decode(uint8Array);
|
|
146
|
+
return JSON.parse(jsonString);
|
|
147
|
+
};
|
|
148
|
+
function base64ToBytes(base64) {
|
|
149
|
+
const binString = atob(base64);
|
|
150
|
+
return Uint8Array.from(binString, (m) => m.codePointAt(0));
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
exports.PasskeyCreationStrategy = PasskeyCreationStrategy;
|
|
156
|
+
//# sourceMappingURL=chunk-N6DG5EZG.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/blockchain/wallets/account/passkey.ts"],"names":[],"mappings":"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","sourcesContent":["import { PasskeyValidatorContractVersion, WebAuthnMode, toPasskeyValidator } from \"@zerodev/passkey-validator\";\nimport { type KernelSmartAccount, type KernelValidator, createKernelAccount } from \"@zerodev/sdk\";\nimport { type WebAuthnKey, toWebAuthnKey } from \"@zerodev/webauthn-key\";\nimport type { SmartAccount } from \"permissionless/accounts\";\nimport type { EntryPoint } from \"permissionless/types/entrypoint\";\n\nimport {\n PasskeyIncompatibleAuthenticatorError,\n PasskeyMismatchError,\n PasskeyPromptError,\n PasskeyRegistrationError,\n} from \"../../../error\";\nimport type { AccountAndSigner, PasskeyCreationContext } from \"../../../types/internal\";\nimport type { PasskeySigner, UserParams, WalletParams } from \"../../../types/params\";\nimport type { PasskeySignerData, PasskeyValidatorSerializedData } from \"../../../types/service\";\nimport { PasskeySignerConfig } from \"./signer\";\nimport type { AccountCreationStrategy } from \"./strategy\";\n\ntype PasskeyValidator = KernelValidator<EntryPoint, \"WebAuthnValidator\"> & {\n getSerializedData: () => string;\n};\nexport class PasskeyCreationStrategy implements AccountCreationStrategy {\n constructor(\n private readonly passkeyServerUrl: string,\n private readonly apiKey: string\n ) {}\n\n public async create({\n user,\n publicClient,\n walletParams,\n entryPoint,\n kernelVersion,\n existing,\n }: PasskeyCreationContext): Promise<AccountAndSigner> {\n const inputPasskeyName = walletParams.signer.passkeyName ?? user.id;\n if (existing != null && existing.signerConfig.data.passkeyName !== inputPasskeyName) {\n throw new PasskeyMismatchError(\n `User '${user.id}' has an existing wallet created with a passkey named '${existing.signerConfig.data.passkeyName}', this does match input passkey name '${inputPasskeyName}'.`,\n existing.signerConfig.display()\n );\n }\n\n try {\n if (existing == null && walletParams.signer.onPrePasskeyRegistration != null) {\n await walletParams.signer.onPrePasskeyRegistration();\n }\n\n const passkey = await this.getPasskey(user, inputPasskeyName, existing?.signerConfig.data);\n\n const latestValidatorVersion = PasskeyValidatorContractVersion.V0_0_2;\n const validatorContractVersion =\n existing == null ? latestValidatorVersion : existing.signerConfig.data.validatorContractVersion;\n\n const validator = await toPasskeyValidator(publicClient, {\n webAuthnKey: passkey,\n entryPoint,\n validatorContractVersion,\n kernelVersion,\n });\n\n const kernelAccount = await createKernelAccount(publicClient, {\n plugins: { sudo: validator },\n entryPoint,\n kernelVersion,\n deployedAccountAddress: existing?.address,\n });\n\n return {\n signerConfig: this.getSignerConfig(validator, validatorContractVersion, inputPasskeyName),\n account: this.decorate(kernelAccount, inputPasskeyName, walletParams),\n };\n } catch (error) {\n if (walletParams.signer.onPasskeyRegistrationError != null) {\n walletParams.signer.onPasskeyRegistrationError(error);\n }\n throw this.mapError(error, inputPasskeyName);\n }\n }\n\n private async getPasskey(\n user: UserParams,\n passkeyName: string,\n existing?: PasskeySignerData\n ): Promise<WebAuthnKey> {\n if (existing != null) {\n return {\n pubX: BigInt(existing.pubKeyX),\n pubY: BigInt(existing.pubKeyY),\n authenticatorId: existing.authenticatorId,\n authenticatorIdHash: existing.authenticatorIdHash,\n };\n }\n\n return toWebAuthnKey({\n passkeyName,\n passkeyServerUrl: this.passkeyServerUrl,\n mode: WebAuthnMode.Register,\n passkeyServerHeaders: this.createPasskeysServerHeaders(user),\n });\n }\n\n private getSignerConfig(\n validator: PasskeyValidator,\n validatorContractVersion: PasskeyValidatorContractVersion,\n passkeyName: string\n ): PasskeySignerConfig {\n return new PasskeySignerConfig({\n ...deserializePasskeyValidatorData(validator.getSerializedData()),\n passkeyName,\n validatorContractVersion,\n domain: window.location.hostname,\n type: \"passkeys\",\n });\n }\n\n private createPasskeysServerHeaders(user: UserParams) {\n return {\n \"x-api-key\": this.apiKey,\n Authorization: `Bearer ${user.jwt}`,\n };\n }\n\n private mapError(error: any, passkeyName: string) {\n if (error.code === 0 && error.name === \"DataError\") {\n return new PasskeyIncompatibleAuthenticatorError(passkeyName);\n }\n\n if (error.message === \"Registration not verified\") {\n return new PasskeyRegistrationError(passkeyName);\n }\n\n if (error.code === \"ERROR_PASSTHROUGH_SEE_CAUSE_PROPERTY\" && error.name === \"NotAllowedError\") {\n return new PasskeyPromptError(passkeyName);\n }\n\n return error;\n }\n\n private decorate<Account extends KernelSmartAccount<EntryPoint>>(\n account: Account,\n passkeyName: string,\n walletParams: WalletParams\n ): Account {\n return new Proxy(account, {\n get: (target, prop, receiver) => {\n const original = Reflect.get(target, prop, receiver);\n if (typeof original !== \"function\" || typeof prop !== \"string\" || !isAccountSigningMethod(prop)) {\n return original;\n }\n\n const signer = walletParams.signer as PasskeySigner;\n return async (...args: any[]) => {\n const isFirstTransaction = args?.[0]?.factoryData != null;\n if (\n isFirstTransaction &&\n prop === \"signUserOperation\" &&\n signer.type === \"PASSKEY\" &&\n signer.onFirstTimePasskeySigning != null\n ) {\n await signer.onFirstTimePasskeySigning();\n }\n try {\n return await original.call(target, ...args);\n } catch (error) {\n if (signer.onFirstTimePasskeySigningError != null) {\n await signer.onFirstTimePasskeySigningError(error);\n }\n throw this.mapError(error, passkeyName);\n }\n };\n },\n });\n }\n}\n\nconst accountSigningMethods = [\n \"signMessage\",\n \"signTypedData\",\n \"signUserOperation\",\n \"signTransaction\",\n] as const satisfies readonly (keyof SmartAccount<EntryPoint>)[];\n\nfunction isAccountSigningMethod(method: string): method is (typeof accountSigningMethods)[number] {\n return accountSigningMethods.includes(method as any);\n}\n\nconst deserializePasskeyValidatorData = (params: string) => {\n const uint8Array = base64ToBytes(params);\n const jsonString = new TextDecoder().decode(uint8Array);\n\n return JSON.parse(jsonString) as PasskeyValidatorSerializedData;\n};\n\nfunction base64ToBytes(base64: string) {\n const binString = atob(base64);\n return Uint8Array.from(binString, (m) => m.codePointAt(0) as number);\n}\n"]}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import {
|
|
2
|
+
paymasterMiddleware,
|
|
3
|
+
usePaymaster
|
|
4
|
+
} from "./chunk-QJ3BSVGV.js";
|
|
5
|
+
import {
|
|
6
|
+
EVMSmartWallet
|
|
7
|
+
} from "./chunk-UZGHOTKZ.js";
|
|
8
|
+
import {
|
|
9
|
+
viemNetworks
|
|
10
|
+
} from "./chunk-6NJVFL2X.js";
|
|
11
|
+
import {
|
|
12
|
+
getAlchemyRPC,
|
|
13
|
+
getPimlicoBundlerRPC
|
|
14
|
+
} from "./chunk-BARW756O.js";
|
|
15
|
+
import {
|
|
16
|
+
CURRENT_VERSION,
|
|
17
|
+
ZERO_DEV_TYPE
|
|
18
|
+
} from "./chunk-UDDYHPSW.js";
|
|
19
|
+
|
|
20
|
+
// src/blockchain/wallets/service.ts
|
|
21
|
+
import { ENTRYPOINT_ADDRESS_V06, ENTRYPOINT_ADDRESS_V07, createSmartAccountClient } from "permissionless";
|
|
22
|
+
import { createPimlicoBundlerClient } from "permissionless/clients/pimlico";
|
|
23
|
+
import { createPublicClient, http } from "viem";
|
|
24
|
+
import { blockchainToChainId } from "@crossmint/common-sdk-base";
|
|
25
|
+
var SmartWalletService = class {
|
|
26
|
+
constructor(crossmintService, accountConfigService, accountCreator, clientDecorator) {
|
|
27
|
+
this.crossmintService = crossmintService;
|
|
28
|
+
this.accountConfigService = accountConfigService;
|
|
29
|
+
this.accountCreator = accountCreator;
|
|
30
|
+
this.clientDecorator = clientDecorator;
|
|
31
|
+
}
|
|
32
|
+
async getOrCreate(user, chain, walletParams) {
|
|
33
|
+
const {
|
|
34
|
+
config: { entryPointVersion, kernelVersion, existing, userWithId },
|
|
35
|
+
cached
|
|
36
|
+
} = await this.accountConfigService.get(user, chain);
|
|
37
|
+
const publicClient = createPublicClient({ transport: http(getAlchemyRPC(chain)) });
|
|
38
|
+
const { account, signerConfig } = await this.accountCreator.get({
|
|
39
|
+
chain,
|
|
40
|
+
walletParams,
|
|
41
|
+
publicClient,
|
|
42
|
+
user: userWithId,
|
|
43
|
+
entryPoint: entryPointVersion === "v0.6" ? ENTRYPOINT_ADDRESS_V06 : ENTRYPOINT_ADDRESS_V07,
|
|
44
|
+
kernelVersion,
|
|
45
|
+
existing
|
|
46
|
+
});
|
|
47
|
+
if (existing == null) {
|
|
48
|
+
await this.crossmintService.idempotentCreateSmartWallet(user, {
|
|
49
|
+
type: ZERO_DEV_TYPE,
|
|
50
|
+
smartContractWalletAddress: account.address,
|
|
51
|
+
signerData: signerConfig.data,
|
|
52
|
+
version: CURRENT_VERSION,
|
|
53
|
+
baseLayer: "evm",
|
|
54
|
+
chainId: blockchainToChainId(chain),
|
|
55
|
+
entryPointVersion,
|
|
56
|
+
kernelVersion
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
if (!cached) {
|
|
60
|
+
this.accountConfigService.cache({
|
|
61
|
+
entryPointVersion,
|
|
62
|
+
kernelVersion,
|
|
63
|
+
user: userWithId,
|
|
64
|
+
existing: { address: account.address, signerConfig }
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
return new EVMSmartWallet(
|
|
68
|
+
{ wallet: this.smartAccountClient(chain, account, user), public: publicClient },
|
|
69
|
+
chain,
|
|
70
|
+
this.crossmintService
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
smartAccountClient(chain, account, user) {
|
|
74
|
+
const transport = http(getPimlicoBundlerRPC(chain));
|
|
75
|
+
const bundlerConfig = { chain: viemNetworks[chain], entryPoint: account.entryPoint };
|
|
76
|
+
const bundlerClient = createPimlicoBundlerClient({ ...bundlerConfig, transport });
|
|
77
|
+
const smartAccountClient = createSmartAccountClient({
|
|
78
|
+
account,
|
|
79
|
+
bundlerTransport: transport,
|
|
80
|
+
...bundlerConfig,
|
|
81
|
+
...usePaymaster(chain) && paymasterMiddleware({
|
|
82
|
+
bundlerClient,
|
|
83
|
+
entryPoint: account.entryPoint,
|
|
84
|
+
chain,
|
|
85
|
+
walletService: this.crossmintService,
|
|
86
|
+
user
|
|
87
|
+
})
|
|
88
|
+
});
|
|
89
|
+
return this.clientDecorator.decorate({
|
|
90
|
+
crossmintChain: chain,
|
|
91
|
+
smartAccountClient
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
export {
|
|
97
|
+
SmartWalletService
|
|
98
|
+
};
|
|
99
|
+
//# sourceMappingURL=chunk-NXDZHR5C.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/blockchain/wallets/service.ts"],"sourcesContent":["import type { KernelSmartAccount } from \"@zerodev/sdk\";\nimport { ENTRYPOINT_ADDRESS_V06, ENTRYPOINT_ADDRESS_V07, createSmartAccountClient } from \"permissionless\";\nimport { createPimlicoBundlerClient } from \"permissionless/clients/pimlico\";\nimport type { EntryPoint } from \"permissionless/types/entrypoint\";\nimport { type HttpTransport, createPublicClient, http } from \"viem\";\n\nimport { blockchainToChainId } from \"@crossmint/common-sdk-base\";\n\nimport type { CrossmintWalletService } from \"../../api/CrossmintWalletService\";\nimport type { SmartWalletClient } from \"../../types/internal\";\nimport type { UserParams, WalletParams } from \"../../types/params\";\nimport { CURRENT_VERSION, ZERO_DEV_TYPE } from \"../../utils/constants\";\nimport { type SmartWalletChain, viemNetworks } from \"../chains\";\nimport { getAlchemyRPC, getPimlicoBundlerRPC } from \"../rpc\";\nimport { EVMSmartWallet } from \"./EVMSmartWallet\";\nimport type { AccountConfigService } from \"./account/config\";\nimport type { AccountCreator } from \"./account/creator\";\nimport type { ClientDecorator } from \"./clientDecorator\";\nimport { paymasterMiddleware, usePaymaster } from \"./paymaster\";\n\nexport class SmartWalletService {\n constructor(\n private readonly crossmintService: CrossmintWalletService,\n private readonly accountConfigService: AccountConfigService,\n private readonly accountCreator: AccountCreator,\n private readonly clientDecorator: ClientDecorator\n ) {}\n\n public async getOrCreate(\n user: UserParams,\n chain: SmartWalletChain,\n walletParams: WalletParams\n ): Promise<EVMSmartWallet> {\n const {\n config: { entryPointVersion, kernelVersion, existing, userWithId },\n cached,\n } = await this.accountConfigService.get(user, chain);\n\n const publicClient = createPublicClient({ transport: http(getAlchemyRPC(chain)) });\n\n const { account, signerConfig } = await this.accountCreator.get({\n chain,\n walletParams,\n publicClient,\n user: userWithId,\n entryPoint: entryPointVersion === \"v0.6\" ? ENTRYPOINT_ADDRESS_V06 : ENTRYPOINT_ADDRESS_V07,\n kernelVersion,\n existing,\n });\n\n if (existing == null) {\n await this.crossmintService.idempotentCreateSmartWallet(user, {\n type: ZERO_DEV_TYPE,\n smartContractWalletAddress: account.address,\n signerData: signerConfig.data,\n version: CURRENT_VERSION,\n baseLayer: \"evm\",\n chainId: blockchainToChainId(chain),\n entryPointVersion,\n kernelVersion,\n });\n }\n\n if (!cached) {\n this.accountConfigService.cache({\n entryPointVersion,\n kernelVersion,\n user: userWithId,\n existing: { address: account.address, signerConfig },\n });\n }\n\n return new EVMSmartWallet(\n { wallet: this.smartAccountClient(chain, account, user), public: publicClient },\n chain,\n this.crossmintService\n );\n }\n\n private smartAccountClient(\n chain: SmartWalletChain,\n account: KernelSmartAccount<EntryPoint, HttpTransport>,\n user: UserParams\n ): SmartWalletClient {\n const transport = http(getPimlicoBundlerRPC(chain));\n const bundlerConfig = { chain: viemNetworks[chain], entryPoint: account.entryPoint };\n const bundlerClient = createPimlicoBundlerClient({ ...bundlerConfig, transport });\n const smartAccountClient: SmartWalletClient = createSmartAccountClient({\n account,\n bundlerTransport: transport,\n ...bundlerConfig,\n ...(usePaymaster(chain) &&\n paymasterMiddleware({\n bundlerClient,\n entryPoint: account.entryPoint,\n chain,\n walletService: this.crossmintService,\n user,\n })),\n });\n\n return this.clientDecorator.decorate({\n crossmintChain: chain,\n smartAccountClient,\n });\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AACA,SAAS,wBAAwB,wBAAwB,gCAAgC;AACzF,SAAS,kCAAkC;AAE3C,SAA6B,oBAAoB,YAAY;AAE7D,SAAS,2BAA2B;AAc7B,IAAM,qBAAN,MAAyB;AAAA,EAC5B,YACqB,kBACA,sBACA,gBACA,iBACnB;AAJmB;AACA;AACA;AACA;AAAA,EAClB;AAAA,EAEH,MAAa,YACT,MACA,OACA,cACuB;AACvB,UAAM;AAAA,MACF,QAAQ,EAAE,mBAAmB,eAAe,UAAU,WAAW;AAAA,MACjE;AAAA,IACJ,IAAI,MAAM,KAAK,qBAAqB,IAAI,MAAM,KAAK;AAEnD,UAAM,eAAe,mBAAmB,EAAE,WAAW,KAAK,cAAc,KAAK,CAAC,EAAE,CAAC;AAEjF,UAAM,EAAE,SAAS,aAAa,IAAI,MAAM,KAAK,eAAe,IAAI;AAAA,MAC5D;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,YAAY,sBAAsB,SAAS,yBAAyB;AAAA,MACpE;AAAA,MACA;AAAA,IACJ,CAAC;AAED,QAAI,YAAY,MAAM;AAClB,YAAM,KAAK,iBAAiB,4BAA4B,MAAM;AAAA,QAC1D,MAAM;AAAA,QACN,4BAA4B,QAAQ;AAAA,QACpC,YAAY,aAAa;AAAA,QACzB,SAAS;AAAA,QACT,WAAW;AAAA,QACX,SAAS,oBAAoB,KAAK;AAAA,QAClC;AAAA,QACA;AAAA,MACJ,CAAC;AAAA,IACL;AAEA,QAAI,CAAC,QAAQ;AACT,WAAK,qBAAqB,MAAM;AAAA,QAC5B;AAAA,QACA;AAAA,QACA,MAAM;AAAA,QACN,UAAU,EAAE,SAAS,QAAQ,SAAS,aAAa;AAAA,MACvD,CAAC;AAAA,IACL;AAEA,WAAO,IAAI;AAAA,MACP,EAAE,QAAQ,KAAK,mBAAmB,OAAO,SAAS,IAAI,GAAG,QAAQ,aAAa;AAAA,MAC9E;AAAA,MACA,KAAK;AAAA,IACT;AAAA,EACJ;AAAA,EAEQ,mBACJ,OACA,SACA,MACiB;AACjB,UAAM,YAAY,KAAK,qBAAqB,KAAK,CAAC;AAClD,UAAM,gBAAgB,EAAE,OAAO,aAAa,KAAK,GAAG,YAAY,QAAQ,WAAW;AACnF,UAAM,gBAAgB,2BAA2B,EAAE,GAAG,eAAe,UAAU,CAAC;AAChF,UAAM,qBAAwC,yBAAyB;AAAA,MACnE;AAAA,MACA,kBAAkB;AAAA,MAClB,GAAG;AAAA,MACH,GAAI,aAAa,KAAK,KAClB,oBAAoB;AAAA,QAChB;AAAA,QACA,YAAY,QAAQ;AAAA,QACpB;AAAA,QACA,eAAe,KAAK;AAAA,QACpB;AAAA,MACJ,CAAC;AAAA,IACT,CAAC;AAED,WAAO,KAAK,gBAAgB,SAAS;AAAA,MACjC,gBAAgB;AAAA,MAChB;AAAA,IACJ,CAAC;AAAA,EACL;AACJ;","names":[]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/utils/api.ts
|
|
2
|
+
var _viem = require('viem');
|
|
3
|
+
function mapObject(data, fn) {
|
|
4
|
+
const result = fn(data);
|
|
5
|
+
if (result.replace) {
|
|
6
|
+
return result.value;
|
|
7
|
+
}
|
|
8
|
+
if (Array.isArray(data)) {
|
|
9
|
+
return data.map((item) => mapObject(item, fn));
|
|
10
|
+
} else if (data !== null && typeof data === "object") {
|
|
11
|
+
return Object.fromEntries(Object.entries(data).map(([key, value]) => [key, mapObject(value, fn)]));
|
|
12
|
+
}
|
|
13
|
+
return result.value;
|
|
14
|
+
}
|
|
15
|
+
function bigintsToHex(data) {
|
|
16
|
+
return mapObject(data, (value) => {
|
|
17
|
+
if (typeof value === "bigint") {
|
|
18
|
+
return { value: _viem.toHex.call(void 0, value), replace: true };
|
|
19
|
+
}
|
|
20
|
+
return { value, replace: false };
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
function parseBigintAPIResponse(data) {
|
|
24
|
+
return mapObject(data, (value) => {
|
|
25
|
+
if (value != null && typeof value == "object" && "__xm_serializedType" in value && "value" in value && value.__xm_serializedType === "bigint" && typeof value.value === "string") {
|
|
26
|
+
return { value: BigInt(value.value), replace: true };
|
|
27
|
+
}
|
|
28
|
+
return { value, replace: false };
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
exports.bigintsToHex = bigintsToHex; exports.parseBigintAPIResponse = parseBigintAPIResponse;
|
|
36
|
+
//# sourceMappingURL=chunk-O6IFYHDP.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/api.ts"],"names":[],"mappings":";AAAA,SAAS,aAAa;AAEtB,SAAS,UAAU,MAAW,IAAmE;AAC7F,QAAM,SAAS,GAAG,IAAI;AACtB,MAAI,OAAO,SAAS;AAChB,WAAO,OAAO;AAAA,EAClB;AACA,MAAI,MAAM,QAAQ,IAAI,GAAG;AACrB,WAAO,KAAK,IAAI,CAAC,SAAS,UAAU,MAAM,EAAE,CAAC;AAAA,EACjD,WAAW,SAAS,QAAQ,OAAO,SAAS,UAAU;AAClD,WAAO,OAAO,YAAY,OAAO,QAAQ,IAAI,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,EAAE,CAAC,CAAC,CAAC;AAAA,EACrG;AACA,SAAO,OAAO;AAClB;AAEO,SAAS,aAAa,MAAgB;AACzC,SAAO,UAAU,MAAM,CAAC,UAAU;AAC9B,QAAI,OAAO,UAAU,UAAU;AAC3B,aAAO,EAAE,OAAO,MAAM,KAAK,GAAG,SAAS,KAAK;AAAA,IAChD;AACA,WAAO,EAAE,OAAO,SAAS,MAAM;AAAA,EACnC,CAAC;AACL;AAEO,SAAS,uBAAuB,MAAgB;AACnD,SAAO,UAAU,MAAM,CAAC,UAAU;AAC9B,QACI,SAAS,QACT,OAAO,SAAS,YAChB,yBAAyB,SACzB,WAAW,SACX,MAAM,wBAAwB,YAC9B,OAAO,MAAM,UAAU,UACzB;AACE,aAAO,EAAE,OAAO,OAAO,MAAM,KAAK,GAAG,SAAS,KAAK;AAAA,IACvD;AACA,WAAO,EAAE,OAAO,SAAS,MAAM;AAAA,EACnC,CAAC;AACL","sourcesContent":["import { toHex } from \"viem\";\n\nfunction mapObject(data: any, fn: (value: unknown) => { value: unknown; replace: boolean }): any {\n const result = fn(data);\n if (result.replace) {\n return result.value;\n }\n if (Array.isArray(data)) {\n return data.map((item) => mapObject(item, fn));\n } else if (data !== null && typeof data === \"object\") {\n return Object.fromEntries(Object.entries(data).map(([key, value]) => [key, mapObject(value, fn)]));\n }\n return result.value;\n}\n\nexport function bigintsToHex(data: any): any {\n return mapObject(data, (value) => {\n if (typeof value === \"bigint\") {\n return { value: toHex(value), replace: true };\n }\n return { value, replace: false };\n });\n}\n\nexport function parseBigintAPIResponse(data: any): any {\n return mapObject(data, (value) => {\n if (\n value != null &&\n typeof value == \"object\" &&\n \"__xm_serializedType\" in value &&\n \"value\" in value &&\n value.__xm_serializedType === \"bigint\" &&\n typeof value.value === \"string\"\n ) {\n return { value: BigInt(value.value), replace: true };\n }\n return { value, replace: false };\n });\n}\n"]}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
var _chunkGLHQIT4Qcjs = require('./chunk-GLHQIT4Q.cjs');
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
var _chunkBXSAJOIVcjs = require('./chunk-BXSAJOIV.cjs');
|
|
10
|
+
|
|
11
|
+
// src/blockchain/wallets/account/creator.ts
|
|
12
|
+
var AccountCreator = class {
|
|
13
|
+
constructor(eoaStrategy, passkeyStrategy) {
|
|
14
|
+
this.eoaStrategy = eoaStrategy;
|
|
15
|
+
this.passkeyStrategy = passkeyStrategy;
|
|
16
|
+
}
|
|
17
|
+
get(context) {
|
|
18
|
+
if (_chunkGLHQIT4Qcjs.isPasskeyCreationContext.call(void 0, context)) {
|
|
19
|
+
return this.passkeyStrategy.create(context);
|
|
20
|
+
}
|
|
21
|
+
if (_chunkGLHQIT4Qcjs.isEOACreationContext.call(void 0, context)) {
|
|
22
|
+
return this.eoaStrategy.create(context);
|
|
23
|
+
}
|
|
24
|
+
if (context.existing == null) {
|
|
25
|
+
throw new (0, _chunkBXSAJOIVcjs.ConfigError)(`Unsupported wallet params:
|
|
26
|
+
${context.walletParams}`);
|
|
27
|
+
}
|
|
28
|
+
const display = context.existing.signerConfig.display();
|
|
29
|
+
const inputSignerType = _chunkGLHQIT4Qcjs.isPasskeyWalletParams.call(void 0, context.walletParams) ? "passkey" : "eoa";
|
|
30
|
+
throw new (0, _chunkBXSAJOIVcjs.AdminMismatchError)(
|
|
31
|
+
`Cannot create wallet with ${inputSignerType} signer for user ${context.user.id}', they already have a wallet with signer:
|
|
32
|
+
'${JSON.stringify(display, null, 2)}'`,
|
|
33
|
+
display
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
exports.AccountCreator = AccountCreator;
|
|
41
|
+
//# sourceMappingURL=chunk-OCG67QSU.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/blockchain/wallets/account/creator.ts"],"names":[],"mappings":";;;;;;;;;;;AAWO,IAAM,iBAAN,MAAqB;AAAA,EACxB,YACqB,aACA,iBACnB;AAFmB;AACA;AAAA,EAClB;AAAA,EAEI,IAAI,SAA2D;AAClE,QAAI,yBAAyB,OAAO,GAAG;AACnC,aAAO,KAAK,gBAAgB,OAAO,OAAO;AAAA,IAC9C;AAEA,QAAI,qBAAqB,OAAO,GAAG;AAC/B,aAAO,KAAK,YAAY,OAAO,OAAO;AAAA,IAC1C;AAEA,QAAI,QAAQ,YAAY,MAAM;AAC1B,YAAM,IAAI,YAAY;AAAA,EAA+B,QAAQ,YAAY,EAAE;AAAA,IAC/E;AAEA,UAAM,UAAU,QAAQ,SAAS,aAAa,QAAQ;AACtD,UAAM,kBAAkB,sBAAsB,QAAQ,YAAY,IAAI,YAAY;AAClF,UAAM,IAAI;AAAA,MACN,6BAA6B,eAAe,oBACxC,QAAQ,KAAK,EACjB;AAAA,GAAgD,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAAA,MAChF;AAAA,IACJ;AAAA,EACJ;AACJ","sourcesContent":["import { AdminMismatchError, ConfigError } from \"../../../error\";\nimport {\n type AccountAndSigner,\n type WalletCreationContext,\n isEOACreationContext,\n isPasskeyCreationContext,\n isPasskeyWalletParams,\n} from \"../../../types/internal\";\nimport type { EOACreationStrategy } from \"./eoa\";\nimport type { PasskeyCreationStrategy } from \"./passkey\";\n\nexport class AccountCreator {\n constructor(\n private readonly eoaStrategy: EOACreationStrategy,\n private readonly passkeyStrategy: PasskeyCreationStrategy\n ) {}\n\n public get(context: WalletCreationContext): Promise<AccountAndSigner> {\n if (isPasskeyCreationContext(context)) {\n return this.passkeyStrategy.create(context);\n }\n\n if (isEOACreationContext(context)) {\n return this.eoaStrategy.create(context);\n }\n\n if (context.existing == null) {\n throw new ConfigError(`Unsupported wallet params:\\n${context.walletParams}`);\n }\n\n const display = context.existing.signerConfig.display();\n const inputSignerType = isPasskeyWalletParams(context.walletParams) ? \"passkey\" : \"eoa\";\n throw new AdminMismatchError(\n `Cannot create wallet with ${inputSignerType} signer for user ${\n context.user.id\n }', they already have a wallet with signer:\\n'${JSON.stringify(display, null, 2)}'`,\n display\n );\n }\n}\n"]}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
|
+
|
|
3
|
+
var _chunk7KTQNIAZcjs = require('./chunk-7KTQNIAZ.cjs');
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
var _chunk5WVQ7J3Ecjs = require('./chunk-5WVQ7J3E.cjs');
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
var _chunkBXSAJOIVcjs = require('./chunk-BXSAJOIV.cjs');
|
|
10
|
+
|
|
11
|
+
// src/blockchain/wallets/EVMSmartWallet.ts
|
|
12
|
+
var EVMSmartWallet = class {
|
|
13
|
+
constructor(client, chain, crossmintService, sendTransactionService = new (0, _chunk7KTQNIAZcjs.SendTransactionService)(client)) {
|
|
14
|
+
this.crossmintService = crossmintService;
|
|
15
|
+
this.sendTransactionService = sendTransactionService;
|
|
16
|
+
this.chain = chain;
|
|
17
|
+
this.client = client;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* The address of the smart wallet.
|
|
21
|
+
*/
|
|
22
|
+
get address() {
|
|
23
|
+
return this.client.wallet.account.address;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Transfers tokens from the smart wallet to a specified address.
|
|
27
|
+
* @param toAddress The recipient's address.
|
|
28
|
+
* @param config The transfer configuration, including token details and amount.
|
|
29
|
+
* @returns The transaction hash.
|
|
30
|
+
* @throws {SmartWalletError} If there's a chain mismatch between this wallet and the input configuration.
|
|
31
|
+
* @throws {SendTransactionError} If the transaction fails to send. Contains the error thrown by the viem client.
|
|
32
|
+
* @throws {SendTransactionExecutionRevertedError} A subclass of SendTransactionError if the transaction fails due to a contract execution error.
|
|
33
|
+
*/
|
|
34
|
+
async transferToken(toAddress, config) {
|
|
35
|
+
if (this.chain !== config.token.chain) {
|
|
36
|
+
throw new (0, _chunkBXSAJOIVcjs.SmartWalletError)(
|
|
37
|
+
`Chain mismatch: Expected ${config.token.chain}, but got ${this.chain}. Ensure you are interacting with the correct blockchain.`
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
return this.executeContract(
|
|
41
|
+
_chunk5WVQ7J3Ecjs.transferParams.call(void 0, {
|
|
42
|
+
contract: config.token.contractAddress,
|
|
43
|
+
to: toAddress,
|
|
44
|
+
from: this.client.wallet.account,
|
|
45
|
+
config
|
|
46
|
+
})
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* @returns A list of NFTs owned by the wallet.
|
|
51
|
+
*/
|
|
52
|
+
async nfts() {
|
|
53
|
+
return this.crossmintService.fetchNFTs(this.address, this.chain);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Sends a contract call transaction and returns the hash of a confirmed transaction.
|
|
57
|
+
* @param address the address of the contract to be called
|
|
58
|
+
* @param abi the ABI of the contract - ***should be defined as a typed variable*** to enable type checking of the contract arguments, see https://viem.sh/docs/typescript#type-inference for guidance
|
|
59
|
+
* @param functionName the name of the smart contract function to be called
|
|
60
|
+
* @param args the arguments to be passed to the function
|
|
61
|
+
* @returns The transaction hash.
|
|
62
|
+
* @throws `SendTransactionError` if the transaction fails to send. Contains the error thrown by the viem client.
|
|
63
|
+
* @throws `SendTransactionExecutionRevertedError`, a subclass of `SendTransactionError` if the transaction fails due to a contract execution error.
|
|
64
|
+
*
|
|
65
|
+
* **Passing a typed ABI:**
|
|
66
|
+
* @example
|
|
67
|
+
* const abi = [{
|
|
68
|
+
* "inputs": [
|
|
69
|
+
* {
|
|
70
|
+
* "internalType": "address",
|
|
71
|
+
* "name": "recipient",
|
|
72
|
+
* "type": "address"
|
|
73
|
+
* },
|
|
74
|
+
* ],
|
|
75
|
+
* "name": "mintNFT",
|
|
76
|
+
* "outputs": [],
|
|
77
|
+
* "stateMutability": "nonpayable",
|
|
78
|
+
* "type": "function"
|
|
79
|
+
* }] as const;
|
|
80
|
+
*
|
|
81
|
+
* await wallet.executeContract({
|
|
82
|
+
* address: contractAddress,
|
|
83
|
+
* abi,
|
|
84
|
+
* functionName: "mintNFT",
|
|
85
|
+
* args: [recipientAddress],
|
|
86
|
+
* });
|
|
87
|
+
*/
|
|
88
|
+
async executeContract({
|
|
89
|
+
address,
|
|
90
|
+
abi,
|
|
91
|
+
functionName,
|
|
92
|
+
args,
|
|
93
|
+
value,
|
|
94
|
+
config
|
|
95
|
+
}) {
|
|
96
|
+
return this.sendTransactionService.sendTransaction(
|
|
97
|
+
{
|
|
98
|
+
address,
|
|
99
|
+
abi,
|
|
100
|
+
functionName,
|
|
101
|
+
args,
|
|
102
|
+
value
|
|
103
|
+
},
|
|
104
|
+
config
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
exports.EVMSmartWallet = EVMSmartWallet;
|
|
112
|
+
//# sourceMappingURL=chunk-OGA3YDWS.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/blockchain/wallets/EVMSmartWallet.ts"],"names":[],"mappings":";;;;;;;;;;;AAuBO,IAAM,iBAAN,MAAqB;AAAA,EAkBxB,YACI,QACA,OACiB,kBACA,yBAAyB,IAAI,uBAAuB,MAAM,GAC7E;AAFmB;AACA;AAEjB,SAAK,QAAQ;AACb,SAAK,SAAS;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAW,UAAU;AACjB,WAAO,KAAK,OAAO,OAAO,QAAQ;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAa,cAAc,WAAoB,QAAuC;AAClF,QAAI,KAAK,UAAU,OAAO,MAAM,OAAO;AACnC,YAAM,IAAI;AAAA,QACN,4BAA4B,OAAO,MAAM,KAAK,aAAa,KAAK,KAAK;AAAA,MACzE;AAAA,IACJ;AAEA,WAAO,KAAK;AAAA,MACR,eAAe;AAAA,QACX,UAAU,OAAO,MAAM;AAAA,QACvB,IAAI;AAAA,QACJ,MAAM,KAAK,OAAO,OAAO;AAAA,QACzB;AAAA,MACJ,CAAC;AAAA,IACL;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,OAAO;AAChB,WAAO,KAAK,iBAAiB,UAAU,KAAK,SAAS,KAAK,KAAK;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmCA,MAAa,gBAWX;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,GAEiB;AACb,WAAO,KAAK,uBAAuB;AAAA,MAC/B;AAAA,QACI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAAA,MACA;AAAA,IACJ;AAAA,EACJ;AACJ","sourcesContent":["import type {\n Abi,\n Address,\n ContractFunctionArgs,\n ContractFunctionName,\n Hex,\n HttpTransport,\n PublicClient,\n WriteContractParameters,\n} from \"viem\";\n\nimport type { CrossmintWalletService } from \"../../api/CrossmintWalletService\";\nimport { SmartWalletError } from \"../../error\";\nimport type { SmartWalletClient } from \"../../types/internal\";\nimport type { TransferType } from \"../../types/token\";\nimport type { SmartWalletChain } from \"../chains\";\nimport { transferParams } from \"../transfer\";\nimport { type SendTransactionOptions, SendTransactionService } from \"./SendTransactionService\";\n\n/**\n * Smart wallet interface for EVM chains enhanced with Crossmint capabilities.\n * Core functionality is exposed via [viem](https://viem.sh/) clients within the `client` property of the class.\n */\nexport class EVMSmartWallet {\n public readonly chain: SmartWalletChain;\n\n /**\n * [viem](https://viem.sh/) clients that provide an interface for core wallet functionality.\n */\n public readonly client: {\n /**\n * An interface to interact with the smart wallet, execute transactions, sign messages, etc.\n */\n wallet: SmartWalletClient;\n\n /**\n * An interface to read onchain data, fetch transactions, retrieve account balances, etc. Corresponds to public [JSON-RPC API](https://ethereum.org/en/developers/docs/apis/json-rpc/) methods.\n */\n public: PublicClient;\n };\n\n constructor(\n client: { public: PublicClient<HttpTransport>; wallet: SmartWalletClient },\n chain: SmartWalletChain,\n private readonly crossmintService: CrossmintWalletService,\n private readonly sendTransactionService = new SendTransactionService(client)\n ) {\n this.chain = chain;\n this.client = client;\n }\n\n /**\n * The address of the smart wallet.\n */\n public get address() {\n return this.client.wallet.account.address;\n }\n\n /**\n * Transfers tokens from the smart wallet to a specified address.\n * @param toAddress The recipient's address.\n * @param config The transfer configuration, including token details and amount.\n * @returns The transaction hash.\n * @throws {SmartWalletError} If there's a chain mismatch between this wallet and the input configuration.\n * @throws {SendTransactionError} If the transaction fails to send. Contains the error thrown by the viem client.\n * @throws {SendTransactionExecutionRevertedError} A subclass of SendTransactionError if the transaction fails due to a contract execution error.\n */\n public async transferToken(toAddress: Address, config: TransferType): Promise<string> {\n if (this.chain !== config.token.chain) {\n throw new SmartWalletError(\n `Chain mismatch: Expected ${config.token.chain}, but got ${this.chain}. Ensure you are interacting with the correct blockchain.`\n );\n }\n\n return this.executeContract(\n transferParams({\n contract: config.token.contractAddress,\n to: toAddress,\n from: this.client.wallet.account,\n config,\n })\n );\n }\n\n /**\n * @returns A list of NFTs owned by the wallet.\n */\n public async nfts() {\n return this.crossmintService.fetchNFTs(this.address, this.chain);\n }\n\n /**\n * Sends a contract call transaction and returns the hash of a confirmed transaction.\n * @param address the address of the contract to be called\n * @param abi the ABI of the contract - ***should be defined as a typed variable*** to enable type checking of the contract arguments, see https://viem.sh/docs/typescript#type-inference for guidance\n * @param functionName the name of the smart contract function to be called\n * @param args the arguments to be passed to the function\n * @returns The transaction hash.\n * @throws `SendTransactionError` if the transaction fails to send. Contains the error thrown by the viem client.\n * @throws `SendTransactionExecutionRevertedError`, a subclass of `SendTransactionError` if the transaction fails due to a contract execution error.\n *\n * **Passing a typed ABI:**\n * @example\n * const abi = [{\n * \"inputs\": [\n * {\n * \"internalType\": \"address\",\n * \"name\": \"recipient\",\n * \"type\": \"address\"\n * },\n * ],\n * \"name\": \"mintNFT\",\n * \"outputs\": [],\n * \"stateMutability\": \"nonpayable\",\n * \"type\": \"function\"\n * }] as const;\n *\n * await wallet.executeContract({\n * address: contractAddress,\n * abi,\n * functionName: \"mintNFT\",\n * args: [recipientAddress],\n * });\n */\n public async executeContract<\n const TAbi extends Abi | readonly unknown[],\n TFunctionName extends ContractFunctionName<TAbi, \"nonpayable\" | \"payable\"> = ContractFunctionName<\n TAbi,\n \"nonpayable\" | \"payable\"\n >,\n TArgs extends ContractFunctionArgs<TAbi, \"nonpayable\" | \"payable\", TFunctionName> = ContractFunctionArgs<\n TAbi,\n \"nonpayable\" | \"payable\",\n TFunctionName\n >,\n >({\n address,\n abi,\n functionName,\n args,\n value,\n config,\n }: Omit<WriteContractParameters<TAbi, TFunctionName, TArgs>, \"chain\" | \"account\"> & {\n config?: Partial<SendTransactionOptions>;\n }): Promise<Hex> {\n return this.sendTransactionService.sendTransaction(\n {\n address,\n abi: abi as Abi,\n functionName,\n args,\n value,\n },\n config\n );\n }\n}\n"]}
|