@gotake/gotake-sdk
Version:
SDK for interacting with GoTake blockchain contracts
132 lines (113 loc) • 5.23 kB
text/typescript
/**
* Create Token Bound Account (TBA) Script
*
* This script creates a Token Bound Account (ERC-6551 account) for a specific NFT
*
* Usage:
* 1. Create a .env file and set the following environment variables:
* - PRIVATE_KEY: Private key of the NFT holder
*
* 2. Run the script:
* npm run create-tba
* or
* yarn create-tba
*/
import { GoTakeSDK, NetworkId } from "../src";
import { getContractAddress } from 'gotake-contracts';
import * as dotenv from 'dotenv';
import { ethers } from 'ethers';
dotenv.config();
async function main() {
// Check required environment variables
if (!process.env.PRIVATE_KEY) {
throw new Error("PRIVATE_KEY is not defined in environment variables. Please set it in your .env file");
}
try {
// Get network ID - using Base Sepolia testnet
const networkId = NetworkId.BASE_SEPOLIA;
console.log(`Using network: Base Sepolia (ID: ${networkId})`);
// Create Provider and Signer
const rpcUrl = "https://sepolia.base.org";
const ethersProvider = new ethers.providers.JsonRpcProvider(rpcUrl);
const ethersSigner = new ethers.Wallet(process.env.PRIVATE_KEY, ethersProvider);
console.log(`Using address: ${await ethersSigner.getAddress()}`);
// Initialize SDK
const sdk = new GoTakeSDK({
network: networkId,
provider: ethersProvider,
signer: ethersSigner,
});
console.log("SDK initialized successfully");
// Get contract addresses and Token ID from config
const tokenContract = getContractAddress('base_sepolia', 'ipnft');
const implementation = getContractAddress('base_sepolia', 'accountImplementation');
const tokenId = 0;
console.log(`NFT contract address: ${tokenContract}`);
console.log(`Account implementation address: ${implementation}`);
console.log(`Token ID: ${tokenId}`);
// Optional parameters
const salt = "0x0000000000000000000000000000000000000000000000000000000000000000"; // Optional: Salt for account creation
// Get current gas price recommendations
console.log("Getting current gas price recommendations...");
const gasPrices = await sdk.getGasPrice({
multiplier: 1.5, // Increase base fee by 50%
priorityMultiplier: 1.0 // Same as base priority fee
});
console.log("Current gas prices:");
if (gasPrices.baseFeePerGas) {
console.log(`Base fee: ${ethers.utils.formatUnits(gasPrices.baseFeePerGas, "gwei")} gwei`);
}
console.log(`Max fee per gas: ${ethers.utils.formatUnits(gasPrices.maxFeePerGas, "gwei")} gwei`);
if (gasPrices.maxPriorityFeePerGas) {
console.log(`Max priority fee: ${ethers.utils.formatUnits(gasPrices.maxPriorityFeePerGas, "gwei")} gwei`);
}
// Business parameters - separate from transaction options
const businessParams = {
tokenContract: tokenContract,
tokenId: tokenId,
salt: salt, // Optional: Salt for deterministic address generation
};
// Transaction options including gas configuration
const transactionOptions = {
gasConfig: {
gasLimit: 500000, // Manual gas limit to prevent estimation issues
maxFeePerGas: gasPrices.maxFeePerGas, // Use recommended values
maxPriorityFeePerGas: gasPrices.maxPriorityFeePerGas // Use recommended values
}
};
console.log("Using transaction options with recommended gas values");
console.log(`Gas Limit: ${transactionOptions.gasConfig.gasLimit}`);
// Create TBA account with separate business params and options
console.log("Creating TBA account...");
const tba = await sdk.account.createTBA(businessParams, transactionOptions);
console.log("TBA created successfully!");
console.log(`TBA address: ${tba.tbaAddress}`);
console.log(`Transaction hash: ${tba.tx.hash}`);
// Wait for transaction confirmation
console.log("Waiting for transaction confirmation...");
await tba.tx.wait();
console.log("Transaction confirmed");
// Example of executing a transaction from TBA
/*
const executeParams = {
accountAddress: tba.tbaAddress,
to: "0x1234567890123456789012345678901234567890", // Example recipient address
value: ethers.utils.parseEther("0.01"), // Send 0.01 ETH
data: "0x" // Empty data for a simple ETH transfer
};
// Use the same transaction options
console.log("Executing transaction from TBA...");
const executeResult = await sdk.account.executeTBATransaction(executeParams, transactionOptions);
console.log(`Execution transaction hash: ${executeResult.tx.hash}`);
*/
} catch (error) {
console.error("Error creating TBA:");
console.error(error);
process.exitCode = 1;
}
}
main().catch(error => {
console.error("Error executing script:");
console.error(error);
process.exitCode = 1;
});