UNPKG

gotake-contracts

Version:

TypeChain generated types and ABIs for GoTake contracts

370 lines (267 loc) 10.2 kB
# ERC6551 Token Bound Accounts (TBA) This project implements the [ERC6551 standard](https://eips.ethereum.org/EIPS/eip-6551) for token bound accounts, allowing NFTs to own and control their own smart contract accounts. *[中文版文档](README_CN.md)* ## Features - **ERC6551Registry**: Contract for creating and tracking token bound accounts - **ERC6551Account**: Implementation of a token bound account that can be controlled by the NFT owner - **IPNFT**: Sample NFT contract for intellectual property tokens ## Package Versions The project provides a framework-agnostic npm package for integration: - **gotake-contracts**: Pure TypeScript types and ABIs - works with any framework ### Installing the Package ```bash # Framework-agnostic package (recommended) npm install gotake-contracts ``` ### Using the Package The package provides pure TypeScript types and ABIs without any runtime dependencies: ```typescript // Import ABIs import { ERC6551REGISTRY_ABI, IPNFT_ABI, abis } from 'gotake-contracts'; // Import TypeScript types import { NetworkConfig, ContractABI } from 'gotake-contracts'; // Import contract addresses and helper functions import { CONTRACT_ADDRESSES, getContractAddress } from 'gotake-contracts'; // Example usage const registryAddress = getContractAddress('base_sepolia', 'registry'); const networkConfig = CONTRACT_ADDRESSES.base_sepolia; ``` ### Building the Package ```bash # Build the framework-agnostic package yarn build ``` ### Key Features - **Zero Dependencies**: No runtime dependencies, works with any ethers version - **Framework Agnostic**: Compatible with browser, Node.js, React, Vue, etc. - **TypeScript Support**: Full type safety with generated interfaces - **Static Assets**: Contract addresses compiled as TypeScript constants ## Setup 1. Clone this repository 2. Install dependencies: ```bash yarn install ``` 3. Copy `.env.example` to `.env` and fill in your values: ```bash cp .env.example .env ``` 4. Edit the `.env` file to add your private key and RPC URLs ## Deployment ### Deploying to Base Sepolia Testnet Run the following command to deploy all contracts to Base Sepolia Testnet: ```bash npx hardhat run scripts/deploy.ts --network base_sepolia ``` This will deploy: - ERC6551Registry - ERC6551Account implementation - IPNFT contract - Creates a sample Token Bound Account for demonstration ### Verifying Contracts After deployment, you can verify the contracts on BaseScan using our verification script: ```bash # Verify all contracts on current network npx hardhat run scripts/verify-contracts.ts --network base_sepolia # Verify a specific contract on a specific network npx hardhat run scripts/verify-contracts.ts --network base_sepolia --contract registry npx hardhat run scripts/verify-contracts.ts --network base_sepolia --contract accountImplementation npx hardhat run scripts/verify-contracts.ts --network base_sepolia --contract ipnft ``` Or manually: ```bash npx hardhat verify --network base_sepolia <CONTRACT_ADDRESS> [CONSTRUCTOR_ARGUMENTS] ``` Example for IPNFT: ```bash npx hardhat verify --network base_sepolia <IPNFT_ADDRESS> <OWNER_ADDRESS> ``` ### Batch Deployment (Recommended) For production deployments, use the batch deployment tool to deploy multiple contracts efficiently: ```bash # Deploy all contracts to Base mainnet npm run batch-deploy -- deploy --networks base # Deploy specific contracts npm run batch-deploy -- deploy --networks base --contracts SSG,VideoPayment # Deploy to multiple networks npm run batch-deploy -- deploy --networks base,base_sepolia # Preview deployment plan (dry run) npm run batch-deploy -- deploy --networks base --dry-run ``` The batch deployment tool automatically: - Deploys contracts efficiently - Verifies contracts on block explorers - Updates contract addresses in `contracts-addresses.json` - Provides detailed deployment reports For detailed usage instructions, see [Batch Deployment Guide](docs/batch-deployment-guide.md). ## Testing ### Local Testing Run the tests locally: ```bash npx hardhat test ``` ### Testing with Deployed Contracts Use the `test-tba.ts` script to interact with your deployed contracts: ```bash # Test on hardhat network (will deploy fresh contracts) npx hardhat run scripts/test-tba.ts # Test on Base Sepolia with deployed contracts npx hardhat run scripts/test-tba.ts --network base_sepolia ``` This script will: 1. Connect to the contracts using the compiled address constants 2. Auto-mint an NFT if none exist on the contract 3. Check NFT ownership and metadata 4. Calculate and create a Token Bound Account if needed 5. Verify token association 6. Send ETH to the TBA if balance is low 7. Execute a transaction from the TBA (requires the signer to be the NFT owner) Before running on Base Sepolia, make sure: - Your wallet has Base Sepolia ETH - Your private key in `.env` has the necessary permissions - The script will automatically mint an NFT if none exist ## Usage ### Creating a Token Bound Account 1. Mint an NFT using the IPNFT contract 2. Call the `createAccount` function on the registry contract: ```javascript // Example parameters const implementation = "<ACCOUNT_IMPLEMENTATION_ADDRESS>"; const salt = ethers.utils.formatBytes32String("SALT"); const chainId = 84532; // Base Sepolia const tokenContract = "<IPNFT_ADDRESS>"; const tokenId = 0; // The NFT ID // Create the account await registry.createAccount( implementation, salt, chainId, tokenContract, tokenId ); ``` ### Interacting with a Token Bound Account 1. Get the account address using the registry's `account` function 2. Connect to the account using the ERC6551Account ABI 3. Call functions on the account using the NFT owner's address ```javascript // Get the account address const accountAddress = await registry.account( implementation, salt, chainId, tokenContract, tokenId ); // Connect to the account const account = await ethers.getContractAt("ERC6551Account", accountAddress); // Execute a transaction from the account (must be called by the NFT owner) await account.execute( targetAddress, // The address to interact with value, // Amount of ETH to send data, // The calldata for the transaction operation // 0 for call, 1 for delegatecall ); ``` ## Running SDK Example Scripts The SDK provides several example scripts to demonstrate how to work with IPNFT and TBA functionality. These scripts are located in the `gotake-sdk/scripts` directory. ### Prerequisites 1. Install dependencies in the SDK directory: ```bash cd gotake-sdk yarn install ``` 2. Create an environment file: ```bash # In the gotake-sdk directory cp .env.example .env ``` 3. Edit the `.env` file to add your Ethereum private key: ``` PRIVATE_KEY=your_private_key_here ``` ### Example Scripts #### 1. Creating a TBA The `create-tba.ts` script demonstrates: - Creating an SDK instance - Minting an IPNFT - Creating a TBA linked to the IPNFT Run with: ```bash # In the gotake-sdk directory npx ts-node --transpile-only scripts/create-tba.ts ``` After successful execution, copy the TBA address to the `.env` file's `TBA_ADDRESS` field for use in subsequent scripts. #### 2. Sending ETH to a TBA The `send-eth-to-tba.ts` script demonstrates: - Sending ETH to a TBA - Executing transactions from the TBA (sending ETH back to the original account) Run with: ```bash # In the gotake-sdk directory npx ts-node --transpile-only scripts/send-eth-to-tba.ts ``` #### 3. Checking TBA Information The `check-tba.ts` script demonstrates: - Querying a TBA's balance - Getting the Token information associated with a TBA - Getting the TBA owner - Getting detailed information about the associated IPNFT Run with: ```bash # In the gotake-sdk directory npx ts-node --transpile-only scripts/check-tba.ts ``` ### Recommended Execution Order 1. First run `create-tba.ts` to create a TBA 2. Then run `check-tba.ts` to confirm the TBA was created successfully and check its information 3. Finally run `send-eth-to-tba.ts` to demonstrate interaction with the TBA ### Troubleshooting If scripts fail, check: 1. Your private key is correct 2. Your account has sufficient test ETH 3. Network connection is stable 4. TBA address is correct (for second and third scripts) ## Package Architecture This project generates a framework-agnostic npm package with zero runtime dependencies. ### Package Features - **Pure Static Exports**: Only TypeScript types, ABIs, and contract addresses - **Environment Universal**: Works in browser, Node.js, React Native, etc. - **Framework Agnostic**: Compatible with any ethers version (v5, v6) or Web3 library - **Frontend Safe**: No Node.js dependencies, can be bundled for browsers - **TypeScript First**: Full type safety with generated interfaces ### Development Workflow The development environment uses ethers v5 for consistency, while the published package remains framework-agnostic: ```bash # Development commands yarn compile # Compile contracts yarn typechain # Generate TypeChain types yarn build # Build the framework-agnostic package ``` ### Package Structure ``` gotake-contracts/ ├── abi/ # Pure JSON ABI files ├── types/ # Framework-agnostic TypeScript interfaces ├── constants/ # Contract addresses as TypeScript constants └── index.js # Main export with all types and ABIs ``` ### Integration Examples ```typescript // React + ethers v6 import { ERC6551REGISTRY_ABI, CONTRACT_ADDRESSES } from 'gotake-contracts'; import { ethers } from 'ethers'; const contract = new ethers.Contract( CONTRACT_ADDRESSES.base_sepolia.contracts.registry, ERC6551REGISTRY_ABI, provider ); // Node.js + ethers v5 import { IPNFT_ABI, getContractAddress } from 'gotake-contracts'; const address = getContractAddress('base_sepolia', 'ipnft'); // Vue + Web3.js import { abis } from 'gotake-contracts'; const web3Contract = new web3.eth.Contract(abis.ERC6551Registry, address); ``` ## License This project is licensed under the MIT License.