Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bundler Package #163

Merged
merged 8 commits into from
May 23, 2023
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 37 additions & 0 deletions packages/bundler-rpc/package.json
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Rename bundler-rpc to bundler.

Same goes for paymaster folder as well.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

resolved

Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
{
"name": "@biconomy/bundler-rpc",
"version": "2.0.0",
"description": "Biconomy Bundler Rpc to interact with any bundler",
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Description should be

Biconomy Bundler package to interact with any bundler node as per ERC4337 standard.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

resolved

"main": "./dist/src/index.js",
"typings": "./dist/src/index.d.ts",
"keywords": [
"Ethereum",
"Gnosis",
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove Gnosis keyword from this list. and add Bundler, Relayer, ERC4337, Gasless Transactions to the list.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

resolved

"Biconomy",
"SDK"
],
"scripts": {
"unbuild": "rimraf dist *.tsbuildinfo",
"build": "rimraf dist && tsc",
"test": "yarn test:concurrently 'yarn test:run'",
"test:file": "TS_NODE_PROJECT=../../tsconfig.json mocha -r ts-node/register --timeout 30000",
"test:concurrently": "concurrently -k --success first 'yarn start:ganache > /dev/null'",
"test:run": "yarn test:file tests/**/*.spec.ts",
"start:ganache": "ganache -m 'direct buyer cliff train rice spirit census refuse glare expire innocent quote'",
"format": "prettier --write \"{src,tests}/**/*.ts\"",
"lint": "tslint -p tsconfig.json"
},
"author": "talhamalik883 <talha.malik@biconomy.io>",
"license": "MIT",
"files": [
"dist/*",
"README.md"
],
"publishConfig": {
"access": "public"
},
"devDependencies": {
"@biconomy/core-types": "*",
"@biconomy/common": "*"
}
}
66 changes: 66 additions & 0 deletions packages/bundler-rpc/src/Bundler.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
import { IBundler } from "./interfaces/IBundler.interface";
import { UserOperation, ChainId } from '@biconomy/core-types'
import { SendUserOpResponse, getUserOpGasPricesResponse } from "./types/Bundler.types"
import { resolveProperties } from 'ethers/lib/utils'
import { deepHexlify } from '@biconomy/common'
import { HttpMethod, sendRequest } from './utils/httpRequests'

export class Bundler implements IBundler {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add class level comments.

This class implements IBundler interface. Implementation sends UserOperation to a bundler URL as per ERC4337 standard. Checkout the proposal for more details on Bundlers.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

resolved


constructor(readonly bundlerUrl: string,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Convert the constructor params to a single object and add these parameters as property of that object.

Check all other constructors and do the same changes there.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

resolved

readonly entryPointAddress: string,
readonly chainId: ChainId,
readonly dappAPIKey: string) {
}

/**
*
* @param chainId
* @description This function will fetch gasPrices from bundler
* @returns
*/
async getUserOpGasPrices(chainId: ChainId): Promise<getUserOpGasPricesResponse> {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Check the returned response and throw exception in case any expected value is missing or in wrong format.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

inside function we are using sendRequest method and it throw exception whatever it gets from server

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Type name should be

UserOpGasPricesResponse

get, put, delete should be used in function names and not in Types.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

resolved

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This rpc method name should be

eth_getUserOpGasFields

as it return fields related to gas limit and gas price both.

Similarly method name should be getUserOpGasFields

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

resolved

const response: any = await sendRequest({
url: `${this.bundlerUrl}`,
method: HttpMethod.Post,
body: {
method: 'eth_getUserOpGasPrices',
params: [chainId],
id: 1234,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why id is hardcoded here? It should be a unique number. We can also send the current timestamp as ID to ensure its unique for each request.

Same goes for id used in sendUserOp method.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

not sure sachin. chirag wrote these calls before. I have added timestamp for it now

jsonrpc: '2.0'
}
})
return response
}
/**
*
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Method level comment can be a bit more descriptive. Add the return type and description about what its doing with dappAPIKey.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

have removed the dapp key as its going to be the part of url

* @param userOp
* @description This function will send userOp to bundler
* @returns
*/
async sendUserOp(userOp: UserOperation): Promise<SendUserOpResponse> {
const hexifiedUserOp = deepHexlify(await resolveProperties(userOp))
let params

if (this.dappAPIKey && this.dappAPIKey !== '') {
const metaData = {
dappAPIKey: this.dappAPIKey
}
params = [hexifiedUserOp, this.entryPointAddress, this.chainId, metaData]
} else {
params = [hexifiedUserOp, this.entryPointAddress, this.chainId]
}

const response: SendUserOpResponse = await sendRequest({
url: `${this.bundlerUrl}`,
method: HttpMethod.Post,
body: {
method: 'eth_sendUserOperation',
params: params,
id: 1234,
jsonrpc: '2.0'
}
})
return response
}
}
7 changes: 7 additions & 0 deletions packages/bundler-rpc/src/interfaces/IBundler.interface.ts
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Keep the interface name as IBundler.ts

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

resolved

Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import { SendUserOpResponse, getUserOpGasPricesResponse } from "../types/Bundler.types"
import { ChainId,UserOperation } from '@biconomy/core-types'
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Linting error. Give a space after ChainId,

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

resolved


export interface IBundler {
getUserOpGasPrices(chainId: ChainId): Promise<getUserOpGasPricesResponse>
sendUserOp(userOp: UserOperation): Promise<SendUserOpResponse>
}
21 changes: 21 additions & 0 deletions packages/bundler-rpc/src/types/Bundler.types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
export type SendUserOpResponse = {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These types should return only the object mentioned in data field. code and message are returned from the API call, and it should be handled inside the sdk methods.

If code is anything other than 2xx then sdk should throw an exception with proper message so dapps can handle it at their end.

Types name should be

UserOpResponse = {
userOpHash: string,
wait: <mention function type here that return Promise>
}

UserOpGasFieldsResponse = {
preVerificationGas: string,
verificationGasLimit: string,
callGasLimit: string,
maxPriorityFeePerGas: string,
maxFeePerGas: string
}

I removed the gasPrice field. Why there is need to gasPrice field? It's not used in creating UserOp

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

code and message are removed and types name are updated. gasPrice filed is just of type1 transaction as bundler just send gasPrice for non 1155 blockchain so we assign gasPrice value to maxFeePerGas and maxPriorityFeePerGas in userOP

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In case of type1 transaction, maxFeePerGas and maxPriorityFeePerGas should have same value of gasPrice. This is mentioned in ERC as well. In userOp there is not gasPrice field.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See the method in EntryPoint.sol as well

function getUserOpGasPrice(MemoryUserOp memory mUserOp) internal view returns (uint256) {
    unchecked {
        uint256 maxFeePerGas = mUserOp.maxFeePerGas;
        uint256 maxPriorityFeePerGas = mUserOp.maxPriorityFeePerGas;
        if (maxFeePerGas == maxPriorityFeePerGas) {
            //legacy mode (for networks that don't support basefee opcode)
            return maxFeePerGas;
        }
        return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);
    }

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See the method in EntryPoint.sol as well

function getUserOpGasPrice(MemoryUserOp memory mUserOp) internal view returns (uint256) {
    unchecked {
        uint256 maxFeePerGas = mUserOp.maxFeePerGas;
        uint256 maxPriorityFeePerGas = mUserOp.maxPriorityFeePerGas;
        if (maxFeePerGas == maxPriorityFeePerGas) {
            //legacy mode (for networks that don't support basefee opcode)
            return maxFeePerGas;
        }
        return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee);
    }

So bundler don't have to send gasPrice. Instead it should send same gasPrice value in both maxFeePerGas and maxPriorityFeePerGas

code: number,
message: string,
data: {
transactionOd: string,
connectionUrl: string
}
}

export type getUserOpGasPricesResponse = {
code: number,
message: string,
data: {
preVerificationGas: string,
verificationGasLimit: string,
callGasLimit: string,
maxPriorityFeePerGas: string,
maxFeePerGas: string,
gasPrice: string
}
}
Original file line number Diff line number Diff line change
@@ -1,18 +1,19 @@
import fetch from 'node-fetch'
import { Logger } from '@biconomy/common'

export enum HttpMethod {
Get = 'get',
Post = 'post',
Delete = 'delete'
}

/* eslint-disable @typescript-eslint/no-explicit-any */
interface HttpRequest {
url: string
method: HttpMethod
body?: Record<string, any>
headers?: object
}

export async function sendRequest<T>({ url, method, body, headers = {} }: HttpRequest): Promise<T> {
const response = await fetch(url, {
method,
Expand All @@ -23,16 +24,12 @@ export async function sendRequest<T>({ url, method, body, headers = {} }: HttpRe
},
body: JSON.stringify(body)
})
Logger.log('http response ', response)

let jsonResponse
try {
jsonResponse = await response.json()
} catch (error) {
Logger.log('error ', error)
if (!response.ok) {
Logger.error('http response ', response)

throw new Error(response.statusText)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@
"compilerOptions": {
"composite": true,
"outDir": "dist",
"baseUrl": "src"
"baseUrl": "src",
"resolveJsonModule": true,
"esModuleInterop": true,
},
"include": ["src"]
"include": ["src", "src/**/*.json"]
}
4 changes: 2 additions & 2 deletions packages/ethers-lib/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
"devDependencies": {
"@nomiclabs/hardhat-ethers": "^2.1.0",
"@nomiclabs/hardhat-waffle": "^2.0.3",
"@typechain/ethers-v5": "^9.0.0",
"@typechain/ethers-v5": "^10.2.0",
"@types/node": "^17.0.23",
"@typescript-eslint/eslint-plugin": "^5.17.0",
"@typescript-eslint/parser": "^5.17.0",
Expand All @@ -36,7 +36,7 @@
"hardhat": "^2.9.2",
"prettier": "^2.6.2",
"ts-node": "^10.7.0",
"typechain": "^7.0.0",
"typechain": "^8.1.1",
"typescript": "^4.6.3"
},
"publishConfig": {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { DefaultCallbackHandlerContract } from '@biconomy/core-types'
import { DefaultCallbackHandlerV100 as DefaultCallbackHandlerContract_TypeChain } from '../../../../typechain/src/ethers-v5/v1.0.0/DefaultCallbackHandlerV100'
import { DefaultCallbackHandler_v1_0_0 as DefaultCallbackHandlerContract_TypeChain } from '../../../../typechain/src/ethers-v5/v1.0.0/DefaultCallbackHandler_v1_0_0'
import { Contract } from '@ethersproject/contracts'
import { Interface } from 'ethers/lib/utils'
class DefaultCallbackHandlerEthersContract implements DefaultCallbackHandlerContract {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { EntryPointContract, UserOperation, ITransactionResult } from '@biconomy/core-types'
import { EntryPointContractV100 as EntryPointContract_TypeChain } from '../../../../typechain/src/ethers-v5/v1.0.0/EntryPointContractV100'
import { EntryPointContract_v1_0_0 as EntryPointContract_TypeChain } from '../../../../typechain/src/ethers-v5/v1.0.0/EntryPointContract_v1_0_0'
import { toTxResult } from '../../../utils'
import { Contract } from '@ethersproject/contracts'
import { BytesLike } from 'ethers'
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { BigNumber } from '@ethersproject/bignumber'
import { FallbackGasTankContract } from '@biconomy/core-types'
import {
FallbackGasTankContractV100 as Fallback_Type,
FallbackGasTankContract_v1_0_0 as Fallback_Type,
FallbackUserOperationStruct
} from '../../../../typechain/src/ethers-v5/v1.0.0/FallbackGasTankContractV100'
} from '../../../../typechain/src/ethers-v5/v1.0.0/FallbackGasTankContract_v1_0_0'
import { Contract } from '@ethersproject/contracts'
import { Interface } from '@ethersproject/abi'

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { MultiSendContract } from '@biconomy/core-types'
import {
MultiSendContractV100 as MultiSend_TypeChain,
MultiSendContractV100Interface
} from '../../../../typechain/src/ethers-v5/v1.0.0/MultiSendContractV100'
MultiSendContract_v1_0_0 as MultiSend_TypeChain,
MultiSendContract_v1_0_0Interface as MultiSendContractV100Interface
} from '../../../../typechain/src/ethers-v5/v1.0.0/MultiSendContract_v1_0_0'
import { Contract } from '@ethersproject/contracts'
import { Interface } from '@ethersproject/abi'

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { MultiSendCallOnlyContract } from '@biconomy/core-types'
import {
MultiSendCallOnlyContractV100 as MultiSendCallOnly_TypeChain,
MultiSendCallOnlyContractV100Interface
} from '../../../../typechain/src/ethers-v5/v1.0.0/MultiSendCallOnlyContractV100'
MultiSendCallOnlyContract_v1_0_0 as MultiSendCallOnly_TypeChain,
MultiSendCallOnlyContract_v1_0_0Interface as MultiSendCallOnlyContractV100Interface
} from '../../../../typechain/src/ethers-v5/v1.0.0/MultiSendCallOnlyContract_v1_0_0'
import { Contract } from '@ethersproject/contracts'
import { Interface } from '@ethersproject/abi'

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ import {
ITransactionResult
} from '@biconomy/core-types'
import { toTxResult } from '../../../utils'
import { SmartWalletContractV100 as SmartWalletContract_TypeChain } from '../../../../typechain/src/ethers-v5/v1.0.0/SmartWalletContractV100'
import { SmartWalletContractV100Interface } from '../../../../typechain/src/ethers-v5/v1.0.0/SmartWalletContractV100'
import { SmartWalletContract_v1_0_0 as SmartWalletContract_TypeChain } from '../../../../typechain/src/ethers-v5/v1.0.0/SmartWalletContract_v1_0_0'
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what is the reason for this change?

Also, are we not going to use typechain and not ethers lib anymore

two different questions ^

import { SmartWalletContract_v1_0_0Interface as SmartWalletContractV100Interface } from '../../../../typechain/src/ethers-v5/v1.0.0/SmartWalletContract_v1_0_0'
import { Interface } from 'ethers/lib/utils'
import { Contract } from '@ethersproject/contracts'
import { BytesLike } from 'ethers'
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { SmartWalletFactoryContract, ITransactionResult } from '@biconomy/core-types'
import { toTxResult } from '../../../utils'
import { SmartWalletFactoryContractV100 as SmartWalletFactoryContract_TypeChain } from '../../../../typechain/src/ethers-v5/v1.0.0/SmartWalletFactoryContractV100'
import { SmartWalletFactoryContract_v1_0_0 as SmartWalletFactoryContract_TypeChain } from '../../../../typechain/src/ethers-v5/v1.0.0/SmartWalletFactoryContract_v1_0_0'
import { Interface } from '@ethersproject/abi'
import { Contract } from '@ethersproject/contracts'

Expand Down
14 changes: 7 additions & 7 deletions packages/ethers-lib/src/contracts/contractInstancesEthers.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { SmartWalletContractV100__factory as SmartWalletContractV100 } from '../../typechain/src/ethers-v5/v1.0.0/factories/SmartWalletContractV100__factory'
import { SmartWalletContract_v1_0_0__factory as SmartWalletContractV100 } from '../../typechain/src/ethers-v5/v1.0.0/factories/SmartWalletContract_v1_0_0__factory'

import { MultiSendContractV100__factory as MultiSendContractV100 } from '../../typechain/src/ethers-v5/v1.0.0/factories/MultiSendContractV100__factory'
import { MultiSendCallOnlyContract_v1_0_0__factory as MultiSendContractV100 } from '../../typechain/src/ethers-v5/v1.0.0/factories/MultiSendCallOnlyContract_v1_0_0__factory'

import { MultiSendCallOnlyContractV100__factory as MultiSendCallOnlyContractV100 } from '../../typechain/src/ethers-v5/v1.0.0/factories/MultiSendCallOnlyContractV100__factory'
import { MultiSendCallOnlyContract_v1_0_0__factory as MultiSendCallOnlyContractV100 } from '../../typechain/src/ethers-v5/v1.0.0/factories/MultiSendCallOnlyContract_v1_0_0__factory'

import { SmartWalletFactoryContractV100__factory as SmartWalletContractFactoryV100 } from '../../typechain/src/ethers-v5/v1.0.0/factories/SmartWalletFactoryContractV100__factory'
import { SmartWalletFactoryContract_v1_0_0__factory as SmartWalletContractFactoryV100 } from '../../typechain/src/ethers-v5/v1.0.0/factories/SmartWalletFactoryContract_v1_0_0__factory'

import SmartWalletContractEthers_v1_0_0 from './SmartWallet/v1.0.0/SmartWalletContractEthers'

Expand All @@ -14,14 +14,14 @@ import MultiSendCallOnlyEthersContract_v1_0_0 from './MultiSendCallOnly/v1.0.0/M

import SmartWalletFacoryContractEthers_v1_0_0 from './SmartWalletFactory/v1.0.0/SmartWalletProxyFactoryEthersContract'

import { EntryPointContractV100__factory as EntryPointFactoryContractV100 } from '../../typechain/src/ethers-v5/v1.0.0/factories/EntryPointContractV100__factory'
import { EntryPointContract_v1_0_0__factory as EntryPointFactoryContractV100 } from '../../typechain/src/ethers-v5/v1.0.0/factories/EntryPointContract_v1_0_0__factory'

import EntryPointEthersContract_v1_0_0 from './EntryPointContract/v1.0.0/EntryPointEthersContract'

import { FallbackGasTankContractV100__factory as FallbackGasTankContractV100 } from '../../typechain/src/ethers-v5/v1.0.0/factories/FallbackGasTankContractV100__factory'
import { FallbackGasTankContract_v1_0_0__factory as FallbackGasTankContractV100 } from '../../typechain/src/ethers-v5/v1.0.0/factories/FallbackGasTankContract_v1_0_0__factory'
import FallbackGasTankEthersContract_v1_0_0 from './FallbackGasTank/v1.0.0/FallbackGasTankEthersContract'

import { DefaultCallbackHandlerV100__factory as DefaultCallbackHandlerContractV100 } from '../../typechain/src/ethers-v5/v1.0.0/factories/DefaultCallbackHandlerV100__factory'
import { DefaultCallbackHandler_v1_0_0__factory as DefaultCallbackHandlerContractV100 } from '../../typechain/src/ethers-v5/v1.0.0/factories/DefaultCallbackHandler_v1_0_0__factory'
import DefaultCallbackHandlerEthersContract_v1_0_0 from './DefaultCallbackHandlerContract/v1.0.0/DefaultCallbackHandlerEthersContract'

import { JsonRpcProvider } from '@ethersproject/providers'
Expand Down
20 changes: 10 additions & 10 deletions packages/ethers-lib/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,24 +1,24 @@
import EvmNetworkManager, { EthersAdapterConfig } from './EvmNetworkManager'
import { IEthersTransactionOptions, IEthersTransactionResult } from './Types'

export { SmartWalletContractV100__factory as SmartWalletFactoryV100 } from '../typechain/src/ethers-v5/v1.0.0/factories/SmartWalletContractV100__factory'
export { SmartWalletContract_v1_0_0__factory as SmartWalletFactoryV100 } from '../typechain/src/ethers-v5/v1.0.0/factories/SmartWalletContract_v1_0_0__factory'

export { MultiSendContractV100__factory as MultiSendContractV100 } from '../typechain/src/ethers-v5/v1.0.0/factories/MultiSendContractV100__factory'
export { MultiSendContract_v1_0_0__factory as MultiSendContractV100 } from '../typechain/src/ethers-v5/v1.0.0/factories/MultiSendContract_v1_0_0__factory'

export { MultiSendCallOnlyContractV100__factory as MultiSendCallOnlyContractV100 } from '../typechain/src/ethers-v5/v1.0.0/factories/MultiSendCallOnlyContractV100__factory'
export { MultiSendCallOnlyContract_v1_0_0__factory as MultiSendCallOnlyContractV100 } from '../typechain/src/ethers-v5/v1.0.0/factories/MultiSendCallOnlyContract_v1_0_0__factory'

export { SmartWalletFactoryContractV100__factory as SmartWalletContractFactoryV100 } from '../typechain/src/ethers-v5/v1.0.0/factories/SmartWalletFactoryContractV100__factory'
export { SmartWalletFactoryContract_v1_0_0__factory as SmartWalletContractFactoryV100 } from '../typechain/src/ethers-v5/v1.0.0/factories/SmartWalletFactoryContract_v1_0_0__factory'

export { EntryPointContractV100__factory as EntryPointFactoryContractV100 } from '../typechain/src/ethers-v5/v1.0.0/factories/EntryPointContractV100__factory'
export { EntryPointContract_v1_0_0__factory as EntryPointFactoryContractV100 } from '../typechain/src/ethers-v5/v1.0.0/factories/EntryPointContract_v1_0_0__factory'

export { EntryPointContractV100 } from '../typechain/src/ethers-v5/v1.0.0/EntryPointContractV100'
export { EntryPointContract_v1_0_0 as EntryPointContractV100 } from '../typechain/src/ethers-v5/v1.0.0/EntryPointContract_v1_0_0'

export { SmartWalletContractV100 } from '../typechain/src/ethers-v5/v1.0.0/SmartWalletContractV100'
export { SmartWalletContract_v1_0_0 as SmartWalletContractV100 } from '../typechain/src/ethers-v5/v1.0.0/SmartWalletContract_v1_0_0'

export {
SmartWalletFactoryContractV100,
SmartWalletFactoryContractV100Interface
} from '../typechain/src/ethers-v5/v1.0.0/SmartWalletFactoryContractV100'
SmartWalletFactoryContract_v1_0_0 as SmartWalletFactoryContractV100,
SmartWalletFactoryContract_v1_0_0Interface as SmartWalletFactoryContractV100Interface
} from '../typechain/src/ethers-v5/v1.0.0/SmartWalletFactoryContract_v1_0_0'

import EntryPointEthersContract_v1_0_0 from './contracts/EntryPointContract/v1.0.0/EntryPointEthersContract'

Expand Down
16 changes: 0 additions & 16 deletions packages/gas-estimator/CHANGELOG.md

This file was deleted.

11 changes: 0 additions & 11 deletions packages/gas-estimator/README.md

This file was deleted.

Loading