@txfusion/txsync-viem
abstracts the functionalities of the txSync products and makes it easier to integrate in your project.
We currently support Tsuko, but we're planning to integrate all txSync functionalities.
The main power of @txfusion/txsync-viem
lies in the paymaster object and its methods.
-
getPaymaster
- a function which provides a way to get the Paymaster you created and then call methods on it -
sendPaymasterTransaction
- method that populates and sends a transaction using the Paymaster and provided parameters -
createExtension
- function that creates an extension which can be added to the Paymaster
-
node: >= 18
(installation guide) ethers: ^6.8.0
npm install @txfusion/txsync-viem
// or
yarn add @txfusion/txsync-viem
The complete examples with various use cases are available here.
async function getPaymaster(address: Address, walletClient: WalletClient, publicClient: PublicClient): Promise<Paymaster>
Creates a new instance of the Paymaster class based on the provided Paymaster contract address.
-
address
: Address: The address of the Paymaster contract. -
walletClient
:WalletClient
instance for signing and sending transactions. -
publicClient
:PublicClient
public client instance for getting public functions. -
Returns
: A newPaymaster
instance.
The Paymaster
class is a utility class that provides methods for interacting with Paymaster contracts on the ZKSync network. It supports two types of Paymasters: ERC20Paymaster and SponsoredPaymaster.
constructor(address: Address, walletClient: WalletClient, publicClient: PublicClient, paymasterType: PaymasterType, chainId: ChainId, token?: Address)
-
address
:Address
- The address of the Paymaster contract. -
walletClient
:WalletClient
- AWalletClient
instance for signing transactions. -
publicClient
:PublicClient
- APublicClient
instance for getting public functions. -
paymasterType
:PaymasterType
- type of Paymaster (ERC20Paymaster or SponsoredPaymaster). -
chainId
:ChainId
- The ID of the chain the Paymaster contract is deployed on. -
token
:Address
(optional) - The address of the ERC20 token used by the ERC20Paymaster.
getPaymasterCustomData(paymasterOptions?: PaymasterOptions): PaymasterParams
Generates the PaymasterParams
object that will be passed to the transaction that's using paymaster.
-
paymasterOptions
:PaymasterOptions
(optional) - An object containing options for the Paymaster (e.g., innerInput, minimalAllowance). -
Returns
: APaymasterParams
object.
async sendPaymasterTransaction(address: Address, abi: Abi | readonly unknown[], functionName: string, args: any[] = [], overrides?: PaymasterOverrides):
Populates and sends a transaction using the Paymaster.
-
address
:Address
- The address of the contract to call. -
abi
:Abi | readonly unknown[]
- The ABI of the contract to call. -
functionName
:string
- The name of the function to call. -
args
:any[]
(optional) - An array of arguments for the function call. -
overrides
:PaymasterOverrides
(optional)- An object containing overrides for the transaction (e.g., to, value, data, customData, gasLimit, maxFeePerGas, maxPriorityFeePerGas) -
Returns
: A hash of the transaction.
async getBalance(): Promise<bigint>
Gets the balance of the Paymaster contract.
-
Returns
: The balance of the Paymaster contract as abigint
value.
async estimateGas(address: Address, abi: Abi | readonly unknown[], functionName: string, args?: any[], overrides?: PaymasterOverrides): Promise<bigint>
Estimates the gas required for a transaction. Especially tailored for Paymaster paymaster needs.
-
address
:Address
- The address of the contract to call for which to estimate the gas. -
abi
:Abi | readonly unknown[]
- The ABI of the contract to call for which to estimate the gas. -
functionName
:string
- The name of the function to call for gas estimation. -
args
:any[]
(optional) - An array of arguments for the function call. -
overrides
:PaymasterOverrides
(optional)- An object containing overrides for the transaction (e.g., to, value, data, customData, gasLimit, maxFeePerGas, maxPriorityFeePerGas) -
Returns
: The estimated gas limit as abigint
value.
getPaymasterContract(): ERC20PaymasterContract | SponsoredPaymasterContract
Gets an instance of the ERC20Paymaster or SponsoredPaymaster contract, depending on the paymasterType.
-
Returns
: An instance of the paymaster contract inERC20PaymasterContract
orSponsoredPaymasterContract
type.
async addExtension(address: Address): Promise<ContractTransactionResponse>
Adds an extension to the Paymaster.
-
address
:Address
- The address of the extension contract to add. -
Returns
: A hash of the extension.
async getExtensions(): Promise<string[]>
Gets the list of extension contract addresses added to the Paymaster.
-
Returns
: An array of extension contract addresses.
async removeExtension(address: Address): Promise<ContractTransactionResponse>
Removes a extension contract from the Paymaster.
-
address
:Address
- The address of the extension contract to remove. -
Returns
: A hash of the transaction.
Extensions are external smart contracts that can be added to the Paymaster contract. These extensions are used to enforce specific conditions or rules that must be met for a transaction to be eligible for payment by the Paymaster. Currently, there are 3 extension types/methods: contract, user and function extensions.
async function createExtension(
name: string,
type: ExtensionMethod,
wallet: WalletClient,
client: unknown,
items?: ExtensionItems,
restrictionFactoryABI?: Abi,
restrictionFactoryContractAddress?: Address
): Promise<Address>
Deploys a new extension contract based on the provided parameters.
-
name
:string
- The name of the extension contract to be created. -
type
:ExtensionMethod
- The type of extension contract to be created. It can be one of the following:CONTRACT
,USER
, orFUNCTION
-
wallet
:WalletClient
: AWalletClient
instance used for signing transactions and interacting with the Restriction Factory contract. -
client
:PublicClient
: APublicClient
instance used for writing public transactions. -
items
:ExtensionItems
(optional) - An object containing the items (e.g., contract addresses, user addresses, function signatures with contract addresses) related to the extension being created. -
restrictionFactoryABI
:Abi
(optional) - The ABI of the Restriction Factory contract. If not provided, it will be retrieved based on the chain ID. -
restrictionFactoryContractAddress
:Address
(optional) - The address of the Restriction Factory contract. If not provided, it will be retrieved based on the chain ID. -
Returns
: Address: address of the deployed extension.
A tuple type representing the parameters for several methods of Paymaster instance, like sendPaymasterTransaction. Added for easier usage.
export type PaymasterParams = {
/** The address of the paymaster. */
paymaster: Address;
/** The bytestream input for the paymaster. */
paymasterInput: BytesLike;
};
export enum PaymasterType {
ERC20,
SPONSORED,
}
export enum ExtensionMethod {
CONTRACT,
USER,
FUNCTION,
}
export interface PaymasterOptions {
innerInput?: BytesLike;
minimalAllowance?: bigint;
}
export interface PaymasterOverrides
extends Omit<TransactionRequest, 'from' | 'type' | 'gasPrice'> {
paymasterOptions?: PaymasterOptions;
gasLimit?: bigint;
gasPrice?: bigint;
customData?: PaymasterParams;
}
export type BaseRestrictionItem = {
address: Address;
};
export type AddressOrBaseRestrictionItem = Address | BaseRestrictionItem;
export type ContractItems = AddressOrBaseRestrictionItem[];
export type UserItems = AddressOrBaseRestrictionItem[];
export type FunctionItems = (BaseRestrictionItem & {
functionSignature: string;
})[];
export type ExtensionItems = ContractItems | UserItems | FunctionItems;
## 🤝 Contributing
We welcome contributions from the community! If you're interested in contributing to the `@txfusion/txsync-viem` JavaScript SDK,
please take a look at our [CONTRIBUTING.md](./.github/CONTRIBUTING.md) for guidelines and details on the process.
Thank you for making `@txfusion/txsync-viem` JavaScript SDK better! 🙌