{
  "schemaVersion": "1.0",
  "item": {
    "slug": "potato-tipper",
    "name": "Potato Tipper",
    "source": "tencent",
    "type": "skill",
    "category": "AI 智能",
    "sourceUrl": "https://clawhub.ai/CJ42/potato-tipper",
    "canonicalUrl": "https://clawhub.ai/CJ42/potato-tipper",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/potato-tipper",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=potato-tipper",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "README.md",
      "SKILL.md",
      "assets/abis/PotatoTipper.abi.json",
      "assets/abis/UniversalProfile.abi.json",
      "assets/abis/KeyManager.abi.json",
      "assets/abis/LSP7DigitalAsset.abi.json"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Then review README.md for any prerequisites, environment setup, or post-install checks. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Then review README.md for any prerequisites, environment setup, or post-install checks. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/potato-tipper"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/potato-tipper",
    "agentPageUrl": "https://openagent3.xyz/skills/potato-tipper/agent",
    "manifestUrl": "https://openagent3.xyz/skills/potato-tipper/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/potato-tipper/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Then review README.md for any prerequisites, environment setup, or post-install checks. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Then review README.md for any prerequisites, environment setup, or post-install checks. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Potato Tipper - OpenClaw Skill",
        "body": "Use this skill for anything technical around the Potato Tipper contracts repo:\n\n📖 reading/understanding the Potato Tipper protocol\n⚙️ setup + configure the Potato Tipper on your Universal Profile on LUKSO UP configuration\n❓ permissions troubleshooting when setting up\n💡building new tipping systems using ideas from the Potato Tipper"
      },
      {
        "title": "What it is (1-paragraph mental model)",
        "body": "The Potato Tipper protocol is an LSP1 Universal Receiver Delegate on LUKSO that automatically tips $POTATO tokens to new followers.\n\nPotatoTipper is an LSP1 Universal Receiver Delegate that reacts to LSP26 follow/unfollow notifications and transfers LSP7 $POTATO tokens from the followed user's 🆙 to the new follower 🆙 (when eligible). Per-user settings live in ERC725Y storage under a dedicated data key, and the contract provides self-documenting helper views for config keys."
      },
      {
        "title": "What this skill provides",
        "body": "Understand architecture and LUKSO/LSP integrations (LSP1, LSP7, LSP26, ERC725Y) similar to the Potato Tipper\nBe aware of security and known limitations with this pattern\nConfigure a Universal Profile with the required permissions and data keys\nLearn to build innovative integrations using the tip-on-follow pattern.\nIncludes TypeScript (wagmi/viem/ethers + erc725.js) and Solidity code examples."
      },
      {
        "title": "Deployed addresses",
        "body": "See references/addresses.md for all contract addresses on LUKSO Mainnet and Testnet (PotatoTipper, $POTATO token, LSP26 registry, RPC endpoints, explorers)."
      },
      {
        "title": "1) Get oriented (repo map)",
        "body": "Read references/repo-overview.md for the file map + contract responsibilities."
      },
      {
        "title": "2) Configure a user's 🆙 to use PotatoTipper (one-click)",
        "body": "This uses a Foundry script that performs the full setup in a single batchCalls transaction.\n\nStep 1: Create the file script/SetupPotatoTipper.s.sol inside the Potato Tipper contracts repo:\n\n// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.28;\n\nimport {Script} from \"forge-std/Script.sol\";\nimport {console2} from \"forge-std/console2.sol\";\n\ninterface ILSP0 {\n    function batchCalls(uint256[] calldata values, bytes[] calldata payloads) external returns (bytes[] memory);\n}\n\ninterface IERC725Y {\n    function setDataBatch(bytes32[] calldata keys, bytes[] calldata values) external;\n}\n\ninterface ILSP7 {\n    function authorizeOperator(address operator, uint256 amount, bytes calldata data) external;\n}\n\n/// @title Setup PotatoTipper via LSP0 batchCalls\n/// @notice One-click setup: connect PotatoTipper + set settings + authorize budget\n/// @dev Run with: forge script script/SetupPotatoTipper.s.sol:SetupPotatoTipper --rpc-url <rpc> --broadcast\n///\n/// Required env vars:\n/// - PRIVATE_KEY: EOA controller key (must have ADDUNIVERSALRECEIVERDELEGATE + CALL permissions on UP)\n/// - UP_ADDRESS: Universal Profile address to configure\n/// - POTATO_TIPPER_ADDRESS: PotatoTipper contract address\n/// - POTATO_TOKEN_ADDRESS: $POTATO LSP7 token address\n/// - TIP_AMOUNT: Amount to tip per follower (in wei, e.g., \"1000000000000000000\" = 1 POTATO)\n/// - MIN_FOLLOWERS: Minimum follower count for eligibility (e.g., \"5\")\n/// - MIN_POTATO_BALANCE: Minimum POTATO balance for eligibility (in wei, e.g., \"100000000000000000000\" = 100 POTATO)\n/// - TIPPING_BUDGET: Total POTATO authorized for tipping (in wei, e.g., \"1000000000000000000000\" = 1000 POTATO)\ncontract SetupPotatoTipper is Script {\n    bytes32 constant LSP1DELEGATE_ON_FOLLOW_DATA_KEY = 0x0cfc51aec37c55a4d0b1000071e02f9f05bcd5816ec4f3134aa2e5a916669537;\n    bytes32 constant LSP1DELEGATE_ON_UNFOLLOW_DATA_KEY = 0x0cfc51aec37c55a4d0b100009d3c0b4012b69658977b099bdaa51eff0f0460f4;\n    bytes32 constant POTATO_TIPPER_SETTINGS_KEY = 0xd1d57abed02d4c2d7ce00000e8211998bb257be214c7b0997830cd295066cc6a;\n\n    function run() external {\n        address upAddress = vm.envAddress(\"UP_ADDRESS\");\n        address potatoTipperAddress = vm.envAddress(\"POTATO_TIPPER_ADDRESS\");\n        address potatoTokenAddress = vm.envAddress(\"POTATO_TOKEN_ADDRESS\");\n        uint256 tipAmount = vm.envUint(\"TIP_AMOUNT\");\n        uint256 minFollowers = vm.envUint(\"MIN_FOLLOWERS\");\n        uint256 minPotatoBalance = vm.envUint(\"MIN_POTATO_BALANCE\");\n        uint256 tippingBudget = vm.envUint(\"TIPPING_BUDGET\");\n\n        console2.log(\"=== PotatoTipper Setup ===\");\n        console2.log(\"UP Address:\", upAddress);\n        console2.log(\"PotatoTipper:\", potatoTipperAddress);\n        console2.log(\"POTATO Token:\", potatoTokenAddress);\n        console2.log(\"Tip Amount (wei):\", tipAmount);\n        console2.log(\"Min Followers:\", minFollowers);\n        console2.log(\"Min POTATO Balance (wei):\", minPotatoBalance);\n        console2.log(\"Tipping Budget (wei):\", tippingBudget);\n        console2.log(\"\");\n\n        bytes32[] memory dataKeys = new bytes32[](3);\n        dataKeys[0] = POTATO_TIPPER_SETTINGS_KEY;\n        dataKeys[1] = LSP1DELEGATE_ON_FOLLOW_DATA_KEY;\n        dataKeys[2] = LSP1DELEGATE_ON_UNFOLLOW_DATA_KEY;\n\n        bytes[] memory dataValues = new bytes[](3);\n        dataValues[0] = abi.encode(tipAmount, minFollowers, minPotatoBalance);\n        dataValues[1] = abi.encodePacked(potatoTipperAddress);\n        dataValues[2] = abi.encodePacked(potatoTipperAddress);\n\n        bytes[] memory payloads = new bytes[](2);\n        payloads[0] = abi.encodeCall(IERC725Y.setDataBatch, (dataKeys, dataValues));\n\n        bytes memory authorizeCalldata = abi.encodeCall(\n            ILSP7.authorizeOperator, (potatoTipperAddress, tippingBudget, \"\")\n        );\n        payloads[1] = abi.encodeWithSignature(\n            \"execute(uint256,address,uint256,bytes)\", 0, potatoTokenAddress, 0, authorizeCalldata\n        );\n\n        uint256[] memory values = new uint256[](2);\n        values[0] = 0;\n        values[1] = 0;\n\n        vm.startBroadcast(vm.envUint(\"PRIVATE_KEY\"));\n\n        console2.log(\"Broadcasting batchCalls to UP...\");\n        ILSP0(upAddress).batchCalls(values, payloads);\n\n        vm.stopBroadcast();\n\n        console2.log(\"\");\n        console2.log(\"=== Setup Complete ===\");\n        console2.log(\"PotatoTipper is now connected to the UP!\");\n        console2.log(\"Settings configured:\");\n        console2.log(\"  - Tip amount:\", tipAmount, \"wei\");\n        console2.log(\"  - Min followers:\", minFollowers);\n        console2.log(\"  - Min POTATO balance:\", minPotatoBalance, \"wei\");\n        console2.log(\"Tipping budget authorized:\", tippingBudget, \"wei\");\n    }\n}\n\nStep 2: Run the setup via the shell wrapper:\n\nTIP_AMOUNT=42000000000000000000 \\\nMIN_FOLLOWERS=5 \\\nMIN_POTATO_BALANCE=100000000000000000000 \\\nTIPPING_BUDGET=1000000000000000000000 \\\nPRIVATE_KEY=0x... \\\n./skills/potato-tipper/scripts/setup_potato_tipper.sh luksoTestnet 0xYourUPAddress\n\nThis single transaction:\n\nConnects LSP1 delegates (follow + unfollow)\nSets tip settings\nAuthorizes tipping budget\n\nManual setup details: references/config-and-data-keys.md\nScript implementation: references/foundry-batch-setup.md"
      },
      {
        "title": "5) Permissions (connect / disconnect)",
        "body": "To connect: controller needs ADDUNIVERSALRECEIVERDELEGATE permission\nTo disconnect: controller needs CHANGEUNIVERSALRECEIVERDELEGATE permission\nIf setup fails with a permission error, this is the most likely cause\n\nFull troubleshooting + UP Browser Extension steps: references/permissions.md"
      },
      {
        "title": "6) LSP1 implementation requirement",
        "body": "A smart contract MUST implement the LSP1UniversalReceiver interface (and report _INTERFACEID_LSP0 via ERC165) to be eligible to receive tips. The PotatoTipper checks supportsInterface(_INTERFACEID_LSP0) on the follower address and rejects EOAs.\n\nWhen the $POTATO token transfer happens, it calls universalReceiver(...) on both sender and recipient 🆙. If the recipient contract does not implement LSP1, the transfer reverts (caught by the PotatoTipper's try/catch)."
      },
      {
        "title": "TypeScript (wagmi / viem / ethers + erc725.js)",
        "body": "Full examples for encoding data keys, connecting/disconnecting from a dApp, and setting tip settings:\n→ references/typescript-examples.md"
      },
      {
        "title": "Solidity",
        "body": "Setting up PotatoTipper for a 🆙 from a smart contract\nImplementing LSP1 to receive tips in a custom contract\nUsing loadTipSettingsRaw + decodeTipSettings free functions from any contract\n→ references/solidity-examples.md"
      },
      {
        "title": "Guardrails / gotchas",
        "body": "Only 🆙 (LSP0) followers are eligible (EOAs rejected).\nFollow/unfollow calls MUST come from the LSP26 Follower Registry — contract re-validates registry state.\nUses try/catch around LSP7 transfers → returns user-friendly status messages, never reverts.\n\"Existing followers\" (before installation) are deliberately excluded from tips.\nSettings values (tipAmount, minimumPotatoBalance) are in wei (18 decimals)."
      },
      {
        "title": "Design patterns + innovative integrations",
        "body": "Tip-on-Follow hook pattern + self-documenting ERC725Y config: references/learn-notes.md\nExpansion ideas (NFT badges, tiered rewards, cross-protocol composability, marketing primitives): references/innovative-integrations.md\nFollow→tip event order (debugging): references/event-flow.md\nOne-click setup / batching notes: references/foundry-batch-setup.md\nSecurity posture + known limitations: references/security-and-limitations.md"
      },
      {
        "title": "references/",
        "body": "repo-overview.md — file map + contract responsibilities\naddresses.md — deployed addresses on Mainnet + Testnet\nconfig-and-data-keys.md — the 3 config keys + encoding/decoding\npermissions.md — required LSP6 permissions (ADD/CHANGE UNIVERSALRECEIVERDELEGATE)\ntypescript-examples.md — wagmi, viem, ethers + erc725.js code\nsolidity-examples.md — setup contract, LSP1 receiver, settings reader\nlearn-notes.md — design patterns (Tip-on-Follow + self-documenting config)\ninnovative-integrations.md — expansion ideas for new integrations\nevent-flow.md — follow→tip event emission order (debug)\nfoundry-batch-setup.md — batching / one-click setup notes\nsecurity-and-limitations.md — known limitations + security design"
      },
      {
        "title": "scripts/",
        "body": "setup_potato_tipper.sh — shell wrapper that clones the repo + runs the Foundry setup script"
      },
      {
        "title": "assets/",
        "body": "assets/abis/UniversalProfile.abi.json — minimal UP ABI for setData/setDataBatch + reads\nassets/abis/LSP7DigitalAsset.abi.json — minimal LSP7 ABI incl. authorizeOperator\nassets/abis/PotatoTipper.abi.json — minimal PotatoTipper ABI (events + a few views)\nassets/abis/KeyManager.abi.json — minimal KeyManager ABI (execute/executeBatch)"
      }
    ],
    "body": "Potato Tipper - OpenClaw Skill\n\nUse this skill for anything technical around the Potato Tipper contracts repo:\n\n📖 reading/understanding the Potato Tipper protocol\n⚙️ setup + configure the Potato Tipper on your Universal Profile on LUKSO UP configuration\n❓ permissions troubleshooting when setting up\n💡building new tipping systems using ideas from the Potato Tipper\nWhat it is (1-paragraph mental model)\n\nThe Potato Tipper protocol is an LSP1 Universal Receiver Delegate on LUKSO that automatically tips $POTATO tokens to new followers.\n\nPotatoTipper is an LSP1 Universal Receiver Delegate that reacts to LSP26 follow/unfollow notifications and transfers LSP7 $POTATO tokens from the followed user's 🆙 to the new follower 🆙 (when eligible). Per-user settings live in ERC725Y storage under a dedicated data key, and the contract provides self-documenting helper views for config keys.\n\nWhat this skill provides\nUnderstand architecture and LUKSO/LSP integrations (LSP1, LSP7, LSP26, ERC725Y) similar to the Potato Tipper\nBe aware of security and known limitations with this pattern\nConfigure a Universal Profile with the required permissions and data keys\nLearn to build innovative integrations using the tip-on-follow pattern.\nIncludes TypeScript (wagmi/viem/ethers + erc725.js) and Solidity code examples.\nDeployed addresses\n\nSee references/addresses.md for all contract addresses on LUKSO Mainnet and Testnet (PotatoTipper, $POTATO token, LSP26 registry, RPC endpoints, explorers).\n\nQuick workflows\n1) Get oriented (repo map)\n\nRead references/repo-overview.md for the file map + contract responsibilities.\n\n2) Configure a user's 🆙 to use PotatoTipper (one-click)\n\nThis uses a Foundry script that performs the full setup in a single batchCalls transaction.\n\nStep 1: Create the file script/SetupPotatoTipper.s.sol inside the Potato Tipper contracts repo:\n\n// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.28;\n\nimport {Script} from \"forge-std/Script.sol\";\nimport {console2} from \"forge-std/console2.sol\";\n\ninterface ILSP0 {\n    function batchCalls(uint256[] calldata values, bytes[] calldata payloads) external returns (bytes[] memory);\n}\n\ninterface IERC725Y {\n    function setDataBatch(bytes32[] calldata keys, bytes[] calldata values) external;\n}\n\ninterface ILSP7 {\n    function authorizeOperator(address operator, uint256 amount, bytes calldata data) external;\n}\n\n/// @title Setup PotatoTipper via LSP0 batchCalls\n/// @notice One-click setup: connect PotatoTipper + set settings + authorize budget\n/// @dev Run with: forge script script/SetupPotatoTipper.s.sol:SetupPotatoTipper --rpc-url <rpc> --broadcast\n///\n/// Required env vars:\n/// - PRIVATE_KEY: EOA controller key (must have ADDUNIVERSALRECEIVERDELEGATE + CALL permissions on UP)\n/// - UP_ADDRESS: Universal Profile address to configure\n/// - POTATO_TIPPER_ADDRESS: PotatoTipper contract address\n/// - POTATO_TOKEN_ADDRESS: $POTATO LSP7 token address\n/// - TIP_AMOUNT: Amount to tip per follower (in wei, e.g., \"1000000000000000000\" = 1 POTATO)\n/// - MIN_FOLLOWERS: Minimum follower count for eligibility (e.g., \"5\")\n/// - MIN_POTATO_BALANCE: Minimum POTATO balance for eligibility (in wei, e.g., \"100000000000000000000\" = 100 POTATO)\n/// - TIPPING_BUDGET: Total POTATO authorized for tipping (in wei, e.g., \"1000000000000000000000\" = 1000 POTATO)\ncontract SetupPotatoTipper is Script {\n    bytes32 constant LSP1DELEGATE_ON_FOLLOW_DATA_KEY = 0x0cfc51aec37c55a4d0b1000071e02f9f05bcd5816ec4f3134aa2e5a916669537;\n    bytes32 constant LSP1DELEGATE_ON_UNFOLLOW_DATA_KEY = 0x0cfc51aec37c55a4d0b100009d3c0b4012b69658977b099bdaa51eff0f0460f4;\n    bytes32 constant POTATO_TIPPER_SETTINGS_KEY = 0xd1d57abed02d4c2d7ce00000e8211998bb257be214c7b0997830cd295066cc6a;\n\n    function run() external {\n        address upAddress = vm.envAddress(\"UP_ADDRESS\");\n        address potatoTipperAddress = vm.envAddress(\"POTATO_TIPPER_ADDRESS\");\n        address potatoTokenAddress = vm.envAddress(\"POTATO_TOKEN_ADDRESS\");\n        uint256 tipAmount = vm.envUint(\"TIP_AMOUNT\");\n        uint256 minFollowers = vm.envUint(\"MIN_FOLLOWERS\");\n        uint256 minPotatoBalance = vm.envUint(\"MIN_POTATO_BALANCE\");\n        uint256 tippingBudget = vm.envUint(\"TIPPING_BUDGET\");\n\n        console2.log(\"=== PotatoTipper Setup ===\");\n        console2.log(\"UP Address:\", upAddress);\n        console2.log(\"PotatoTipper:\", potatoTipperAddress);\n        console2.log(\"POTATO Token:\", potatoTokenAddress);\n        console2.log(\"Tip Amount (wei):\", tipAmount);\n        console2.log(\"Min Followers:\", minFollowers);\n        console2.log(\"Min POTATO Balance (wei):\", minPotatoBalance);\n        console2.log(\"Tipping Budget (wei):\", tippingBudget);\n        console2.log(\"\");\n\n        bytes32[] memory dataKeys = new bytes32[](3);\n        dataKeys[0] = POTATO_TIPPER_SETTINGS_KEY;\n        dataKeys[1] = LSP1DELEGATE_ON_FOLLOW_DATA_KEY;\n        dataKeys[2] = LSP1DELEGATE_ON_UNFOLLOW_DATA_KEY;\n\n        bytes[] memory dataValues = new bytes[](3);\n        dataValues[0] = abi.encode(tipAmount, minFollowers, minPotatoBalance);\n        dataValues[1] = abi.encodePacked(potatoTipperAddress);\n        dataValues[2] = abi.encodePacked(potatoTipperAddress);\n\n        bytes[] memory payloads = new bytes[](2);\n        payloads[0] = abi.encodeCall(IERC725Y.setDataBatch, (dataKeys, dataValues));\n\n        bytes memory authorizeCalldata = abi.encodeCall(\n            ILSP7.authorizeOperator, (potatoTipperAddress, tippingBudget, \"\")\n        );\n        payloads[1] = abi.encodeWithSignature(\n            \"execute(uint256,address,uint256,bytes)\", 0, potatoTokenAddress, 0, authorizeCalldata\n        );\n\n        uint256[] memory values = new uint256[](2);\n        values[0] = 0;\n        values[1] = 0;\n\n        vm.startBroadcast(vm.envUint(\"PRIVATE_KEY\"));\n\n        console2.log(\"Broadcasting batchCalls to UP...\");\n        ILSP0(upAddress).batchCalls(values, payloads);\n\n        vm.stopBroadcast();\n\n        console2.log(\"\");\n        console2.log(\"=== Setup Complete ===\");\n        console2.log(\"PotatoTipper is now connected to the UP!\");\n        console2.log(\"Settings configured:\");\n        console2.log(\"  - Tip amount:\", tipAmount, \"wei\");\n        console2.log(\"  - Min followers:\", minFollowers);\n        console2.log(\"  - Min POTATO balance:\", minPotatoBalance, \"wei\");\n        console2.log(\"Tipping budget authorized:\", tippingBudget, \"wei\");\n    }\n}\n\n\nStep 2: Run the setup via the shell wrapper:\n\nTIP_AMOUNT=42000000000000000000 \\\nMIN_FOLLOWERS=5 \\\nMIN_POTATO_BALANCE=100000000000000000000 \\\nTIPPING_BUDGET=1000000000000000000000 \\\nPRIVATE_KEY=0x... \\\n./skills/potato-tipper/scripts/setup_potato_tipper.sh luksoTestnet 0xYourUPAddress\n\n\nThis single transaction:\n\nConnects LSP1 delegates (follow + unfollow)\nSets tip settings\nAuthorizes tipping budget\n\nManual setup details: references/config-and-data-keys.md\nScript implementation: references/foundry-batch-setup.md\n\n5) Permissions (connect / disconnect)\nTo connect: controller needs ADDUNIVERSALRECEIVERDELEGATE permission\nTo disconnect: controller needs CHANGEUNIVERSALRECEIVERDELEGATE permission\nIf setup fails with a permission error, this is the most likely cause\n\nFull troubleshooting + UP Browser Extension steps: references/permissions.md\n\n6) LSP1 implementation requirement\n\nA smart contract MUST implement the LSP1UniversalReceiver interface (and report _INTERFACEID_LSP0 via ERC165) to be eligible to receive tips. The PotatoTipper checks supportsInterface(_INTERFACEID_LSP0) on the follower address and rejects EOAs.\n\nWhen the $POTATO token transfer happens, it calls universalReceiver(...) on both sender and recipient 🆙. If the recipient contract does not implement LSP1, the transfer reverts (caught by the PotatoTipper's try/catch).\n\nCode examples\nTypeScript (wagmi / viem / ethers + erc725.js)\n\nFull examples for encoding data keys, connecting/disconnecting from a dApp, and setting tip settings: → references/typescript-examples.md\n\nSolidity\nSetting up PotatoTipper for a 🆙 from a smart contract\nImplementing LSP1 to receive tips in a custom contract\nUsing loadTipSettingsRaw + decodeTipSettings free functions from any contract → references/solidity-examples.md\nGuardrails / gotchas\nOnly 🆙 (LSP0) followers are eligible (EOAs rejected).\nFollow/unfollow calls MUST come from the LSP26 Follower Registry — contract re-validates registry state.\nUses try/catch around LSP7 transfers → returns user-friendly status messages, never reverts.\n\"Existing followers\" (before installation) are deliberately excluded from tips.\nSettings values (tipAmount, minimumPotatoBalance) are in wei (18 decimals).\nDesign patterns + innovative integrations\nTip-on-Follow hook pattern + self-documenting ERC725Y config: references/learn-notes.md\nExpansion ideas (NFT badges, tiered rewards, cross-protocol composability, marketing primitives): references/innovative-integrations.md\nFollow→tip event order (debugging): references/event-flow.md\nOne-click setup / batching notes: references/foundry-batch-setup.md\nSecurity posture + known limitations: references/security-and-limitations.md\nBundled resources\nreferences/\nrepo-overview.md — file map + contract responsibilities\naddresses.md — deployed addresses on Mainnet + Testnet\nconfig-and-data-keys.md — the 3 config keys + encoding/decoding\npermissions.md — required LSP6 permissions (ADD/CHANGE UNIVERSALRECEIVERDELEGATE)\ntypescript-examples.md — wagmi, viem, ethers + erc725.js code\nsolidity-examples.md — setup contract, LSP1 receiver, settings reader\nlearn-notes.md — design patterns (Tip-on-Follow + self-documenting config)\ninnovative-integrations.md — expansion ideas for new integrations\nevent-flow.md — follow→tip event emission order (debug)\nfoundry-batch-setup.md — batching / one-click setup notes\nsecurity-and-limitations.md — known limitations + security design\nscripts/\nsetup_potato_tipper.sh — shell wrapper that clones the repo + runs the Foundry setup script\nassets/\nassets/abis/UniversalProfile.abi.json — minimal UP ABI for setData/setDataBatch + reads\nassets/abis/LSP7DigitalAsset.abi.json — minimal LSP7 ABI incl. authorizeOperator\nassets/abis/PotatoTipper.abi.json — minimal PotatoTipper ABI (events + a few views)\nassets/abis/KeyManager.abi.json — minimal KeyManager ABI (execute/executeBatch)"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/CJ42/potato-tipper",
    "publisherUrl": "https://clawhub.ai/CJ42/potato-tipper",
    "owner": "CJ42",
    "version": "1.0.2",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/potato-tipper",
    "downloadUrl": "https://openagent3.xyz/downloads/potato-tipper",
    "agentUrl": "https://openagent3.xyz/skills/potato-tipper/agent",
    "manifestUrl": "https://openagent3.xyz/skills/potato-tipper/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/potato-tipper/agent.md"
  }
}