@paulstinchcombe/kami721c-sdk
Version:
SDK for interacting with KAMI721C NFT contracts
238 lines (182 loc) • 8.48 kB
Markdown
# KAMI721C SDK
A TypeScript SDK for interacting with KAMI721C NFT contracts on Ethereum and EVM-compatible chains.
## Installation
```bash
npm install kami721c-sdk
```
## Features
- Deploy and interact with KAMI721C NFT contracts
- Mint NFTs with USDC payment
- Handle royalties for both minting and transfers
- Platform commission support
- Role-based access control
- Token sales with automatic royalty distribution
- Transaction queue management for sequential operations
- Enhanced error handling and logging
## Usage
This SDK provides a wrapper for interacting with KAMI721C NFT contracts.
### Deploying a New Contract
```typescript
import { ethers } from 'ethers';
import { KAMI721CFactory } from 'kami721c-sdk';
// Connect to an Ethereum provider with a signer
const provider = new ethers.JsonRpcProvider('https://ethereum-goerli.publicnode.com');
const wallet = new ethers.Wallet('YOUR_PRIVATE_KEY', provider);
// Create a factory instance
const factory = new KAMI721CFactory(wallet);
// Deploy a new KAMI721C contract
const usdcAddress = '0x...'; // USDC token address
const name = 'My NFT Collection';
const symbol = 'MYNFT';
const baseURI = 'ipfs://bafkreid4xrk5mxq4t3ilfhwmvpn5scy2kmsra7gm7a3kscnudsyb4dtsqq/';
const initialMintPrice = 1000000n; // 1 USDC (6 decimals)
const platformAddress = wallet.address; // Address to receive platform commission
const platformCommission = 500; // 5% commission in basis points
const nftContract = await factory.deploy(usdcAddress, name, symbol, baseURI, initialMintPrice, platformAddress, platformCommission);
const contractAddress = nftContract.getAddress();
console.log(`Contract deployed at: ${contractAddress}`);
```
### Connecting to an Existing Contract
```typescript
import { ethers } from 'ethers';
import { KAMI721C } from 'kami721c-sdk';
// Connect to an Ethereum provider
const provider = new ethers.JsonRpcProvider('https://ethereum-goerli.publicnode.com');
// If you need to use a signer for write operations
const wallet = new ethers.Wallet('YOUR_PRIVATE_KEY', provider);
// Connect to an existing KAMI721C contract
const contractAddress = '0x...'; // Your contract address
const nftContract = new KAMI721C(wallet, contractAddress);
// Or connect using just a provider for read-only operations
const readOnlyContract = new KAMI721C(provider, contractAddress);
```
### Reading Contract Information
```typescript
// Get basic contract information
const name = await nftContract.name();
const symbol = await nftContract.symbol();
const totalSupply = await nftContract.totalSupply();
const mintPrice = await nftContract.mintPrice();
const platformCommission = await nftContract.getPlatformCommission();
const royaltyPercentage = await nftContract.royaltyPercentage();
// Get token information
const tokenId = 0; // Token IDs are 0-based
const owner = await nftContract.ownerOf(tokenId);
const tokenURI = await nftContract.tokenURI(tokenId);
const balance = await nftContract.balanceOf(owner);
```
### Minting Tokens
```typescript
// Get current mint price
const mintPrice = await nftContract.mintPrice();
console.log(`Mint price: ${ethers.formatUnits(mintPrice, 6)} USDC`);
// Approve USDC for the contract (required before minting)
const usdcAbi = ['function approve(address spender, uint256 amount) returns (bool)'];
const usdcContract = new ethers.Contract(usdcAddress, usdcAbi, wallet);
await usdcContract.approve(nftContract.getAddress(), mintPrice);
// Mint a new token
const mintTx = await nftContract.mint();
const receipt = await mintTx.wait();
console.log(`Token minted in block ${receipt?.blockNumber}`);
```
### Managing Mint Price
```typescript
// Get current mint price
const currentPrice = await nftContract.mintPrice();
console.log(`Current mint price: ${ethers.formatUnits(currentPrice, 6)} USDC`);
// Set a new mint price (requires OWNER_ROLE)
const newPrice = 2000000n; // 2 USDC (6 decimals)
await nftContract.setMintPrice(newPrice);
```
### Managing Platform Commission
```typescript
// Get current platform commission details
const commission = await nftContract.getPlatformCommission();
console.log(`Platform commission: ${commission.percentage / 100}% to ${commission.address}`);
// Update platform commission (requires OWNER_ROLE)
const newCommission = 300; // 3% in basis points
const newPlatformAddress = '0x...';
await nftContract.setPlatformCommission(newCommission, newPlatformAddress);
```
### Setting Royalties
The KAMI721C contract supports royalties for both minting and transfers:
```typescript
import { KAMI721C, RoyaltyData } from 'kami721c-sdk';
// Set the overall royalty percentage for transfers (requires OWNER_ROLE)
const royaltyPercentage = 1000; // 10% in basis points
await nftContract.setRoyaltyPercentage(royaltyPercentage);
// Create royalty data where receivers split 100% of the royalties
// In the new contract, the feeNumerator values must total to 10000 (100%)
const royalties: RoyaltyData[] = [
{
receiver: '0x...', // Primary receiver (80%)
feeNumerator: 8000,
},
{
receiver: '0x...', // Secondary receiver (20%)
feeNumerator: 2000,
},
];
// Set global mint royalties (for all newly minted tokens)
await nftContract.setMintRoyalties(royalties);
// Set global transfer royalties (distribution of the royaltyPercentage)
await nftContract.setTransferRoyalties(royalties);
// Set token-specific royalties (optional)
const tokenId = 0;
await nftContract.setTokenMintRoyalties(tokenId, royalties);
await nftContract.setTokenTransferRoyalties(tokenId, royalties);
// Get royalty information for a token sale
const salePrice = ethers.parseEther('1.0'); // 1 ETH
const royaltyInfo = await nftContract.royaltyInfo(tokenId, salePrice);
console.log(`Royalty receiver: ${royaltyInfo.receiver}`);
console.log(`Royalty amount: ${ethers.formatEther(royaltyInfo.royaltyAmount)} ETH`);
```
### Token Sales
The SDK supports token sales with automatic royalty payments:
```typescript
// Sell a token with royalties
const tokenId = 0; // Token ID to sell
const buyer = '0x...'; // Buyer's address
const salePrice = 5000000n; // 5 USDC (6 decimals)
// The buyer must approve USDC for the contract before the sale
const usdcAbi = ['function approve(address spender, uint256 amount) returns (bool)'];
const buyerWallet = new ethers.Wallet('BUYER_PRIVATE_KEY', provider);
const buyerUsdcContract = new ethers.Contract(usdcAddress, usdcAbi, buyerWallet);
await buyerUsdcContract.approve(nftContract.getAddress(), salePrice);
// Execute the sale (must be called by the token owner)
await nftContract.sellToken(buyer, tokenId, salePrice);
```
## Examples
The SDK includes complete examples in the `src/examples` directory.
### Running the Basic Usage Example
1. Clone this repository
2. Install dependencies:
```bash
npm install
```
3. Create a `.env` file in the root directory using the `.env.example` template
4. Set your environment variables in the `.env` file:
- `DEPLOY_NEW_CONTRACT`: Set to 'true' to deploy a new contract, 'false' to use existing
- `CONTRACT_NAME`, `CONTRACT_SYMBOL`, `BASE_URI`: Used when deploying a new contract
- `MINT_PRICE`: Initial mint price in USDC (with 6 decimals), defaults to 1000000 (1 USDC)
- `PLATFORM_ADDRESS`: Address to receive platform commission (optional)
- `PLATFORM_COMMISSION`: Platform commission in basis points (optional, default 500 or 5%)
- `CONTRACT_ADDRESS`: Address of existing KAMI721C contract (when not deploying)
- `PRIVATE_KEY`: Your Ethereum wallet private key
- `RPC_URL`: URL for the Ethereum RPC node (defaults to SKALE testnet)
- `MINT_TOKEN`: Set to 'true' to attempt minting a token
- `UPDATE_MINT_PRICE`: Set to 'true' to update the mint price
- `NEW_MINT_PRICE`: New mint price in USDC (with 6 decimals)
- `ROYALTY_RECEIVER`: Address to receive royalties (optional)
- `BUYER_ADDRESS`: Address for simulating a token sale (optional)
5. Run the example:
```bash
npx ts-node src/examples/basic-usage.ts
```
## Important Notes
1. **Gas Fees**: When creating new wallets for testing, ensure they have enough native tokens (ETH/MATIC) for gas fees in addition to USDC for purchases.
2. **Transaction Queue**: The SDK includes a transaction queue system to manage sequential operations and prevent nonce conflicts.
3. **Error Handling**: The SDK provides detailed error messages and transaction information for better debugging.
## License
MIT
# kami-contract-sdk