UNPKG

@bananahq/banana-sdk

Version:

Smart contract wallet sdk package by Banana Wallet

123 lines 6.93 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Banana = void 0; const ethers_1 = require("ethers"); const contracts_1 = require("@account-abstraction/contracts"); const MyPayMasterApi_1 = require("./MyPayMasterApi"); const MyWalletApi_1 = require("./MyWalletApi"); const HttpRpcClient_1 = require("@account-abstraction/sdk/dist/src/HttpRpcClient"); const Constants_1 = require("./Constants"); const types_1 = require("./types"); const BananaWallet_1 = require("./BananaWallet"); const Banana4337Provider_1 = require("./Banana4337Provider"); const BananaCustomSigner_1 = require("./BananaCustomSigner"); class Banana { constructor(chain, signerOrProvider, _paymasterOptions) { this.chain = chain; this.signerOrProvider = signerOrProvider; this._paymasterOptions = _paymasterOptions; /** * @method getTouchIdSafeWalletContractProxyFactory * @params { Signer | JsonRpcProvider } signerOrProvider * @returns { BananaAccountProxyFactory } TouchIdSafeWalletContractProxyFactory * create factory contract instance for factory contract factory types. */ this.getTouchIdSafeWalletContractProxyFactory = (signerOrProvider) => { const TouchIdSafeWalletContractProxyFactory = types_1.BananaAccountProxyFactory__factory.connect(this.addresses.TouchIdSafeWalletContractProxyFactoryAddress, signerOrProvider); return TouchIdSafeWalletContractProxyFactory; }; /** * @method getBananaProvider * @params none * @returns { ERC4337EthersProvider } bananaProvider * create ERC4337Provider instance of user's smart contract wallet. Used as BananaProvider. */ this.getBananaProvider = async () => { if (this.bananaProvider) return this.bananaProvider; let network = await this.jsonRpcProvider.getNetwork(); const entryPoint = contracts_1.EntryPoint__factory.connect(this.Provider.entryPointAddress, this.jsonRpcProvider); const TouchIdSafeWalletContractProxyFactory = this.getTouchIdSafeWalletContractProxyFactory(this.jsonRpcProvider); const TouchIdSafeWalletContractProxyFactoryAddress = TouchIdSafeWalletContractProxyFactory.address; const myPaymasterApi = new MyPayMasterApi_1.MyPaymasterApi(); const smartWalletAPI = new MyWalletApi_1.MyWalletApi({ provider: this.jsonRpcProvider, entryPointAddress: this.Provider.entryPointAddress, accountAddress: this.walletAddress, owner: this.signer, factoryAddress: TouchIdSafeWalletContractProxyFactoryAddress, paymasterAPI: myPaymasterApi, _singletonTouchIdSafeAddress: this.addresses.TouchIdSafeWalletContractSingletonAddress, _ownerAddress: (await this.signer.getAddress()), _fallBackHandler: this.addresses.fallBackHandlerAddress, _saltNonce: '0', }); this.accountApi = smartWalletAPI; const httpRpcClient = new HttpRpcClient_1.HttpRpcClient(this.Provider.bundlerUrl, this.Provider.entryPointAddress, network.chainId); this.httpRpcClient = httpRpcClient; this.bananaProvider = await new Banana4337Provider_1.Banana4337Provider(network.chainId, this.Provider, this.signer, //@ts-ignore this.signer.provider, httpRpcClient, entryPoint, smartWalletAPI, this.jsonRpcProvider, this.currentPaymasterOption).init(); return this.bananaProvider; }; /** * @method getTouchIdSafeWalletContractInitializer * @params none * @returns { string } TouchIdSafeWalletContractInitializer * create initializer which is callData for setupWithEntrypoint function */ this.getTouchIdSafeWalletContractInitializer = async () => { const TouchIdSafeWalletContractSingleton = types_1.BananaAccount__factory.connect(this.addresses.TouchIdSafeWalletContractSingletonAddress, this.jsonRpcProvider); const ownerAddress = await this.signer.getAddress(); //@ts-ignore const TouchIdSafeWalletContractInitializer = TouchIdSafeWalletContractSingleton.interface.encodeFunctionData('setupWithEntrypoint', [ ownerAddress, 1, "0x0000000000000000000000000000000000000000", "0x", this.addresses.fallBackHandlerAddress, "0x0000000000000000000000000000000000000000", 0, "0x0000000000000000000000000000000000000000", this.Provider.entryPointAddress, // entrypoint ]); return TouchIdSafeWalletContractInitializer; }; /** * @method connectWallet * @param none * @returns * sucess: returns wallet: BananaWallet * error: returns error * setup signers and provider along with it create walletmetadata corresponding to the new wallet request. */ this.connectWallet = async () => { const TouchIdSafeWalletContractProxyFactory = this.getTouchIdSafeWalletContractProxyFactory(this.jsonRpcProvider); const TouchIdSafeWalletContractInitializer = await this.getTouchIdSafeWalletContractInitializer(); let saltNonce = 0; let TouchIdSafeWalletContractAddress; TouchIdSafeWalletContractAddress = await TouchIdSafeWalletContractProxyFactory.getAddress(this.addresses.TouchIdSafeWalletContractSingletonAddress, saltNonce.toString(), TouchIdSafeWalletContractInitializer); if (TouchIdSafeWalletContractAddress) { this.walletAddress = TouchIdSafeWalletContractAddress; } this.bananaProvider = await this.getBananaProvider(); return new BananaWallet_1.Wallet(this.walletAddress, this.bananaProvider, this.network); }; this.Provider = (0, Constants_1.getClientConfigInfo)(chain); this.addresses = (0, Constants_1.getChainSpecificAddress)(chain); this.jsonRpcProviderUrl = (0, Constants_1.getChainSpecificConfig)(chain).jsonRpcUrl; this.jsonRpcProvider = new ethers_1.ethers.providers.JsonRpcProvider(this.jsonRpcProviderUrl); this.network = chain; this.currentPaymasterOption = _paymasterOptions?.find(paymaster => paymaster.chainId === String(this.network)); if (!signerOrProvider) { throw new Error('Signer cannot be null'); } if (ethers_1.Signer.isSigner(signerOrProvider)) { this.signer = signerOrProvider; } else this.signer = new BananaCustomSigner_1.BananaCustomSigner(signerOrProvider); } } exports.Banana = Banana; //# sourceMappingURL=BananaProvider.js.map