@bananahq/banana-sdk
Version:
Smart contract wallet sdk package by Banana Wallet
123 lines • 6.93 kB
JavaScript
"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