{"id":26060672,"url":"https://github.com/uraniumcorporation/solana-payout-action","last_synced_at":"2026-05-06T00:02:51.314Z","repository":{"id":281135156,"uuid":"944315279","full_name":"UraniumCorporation/solana-payout-action","owner":"UraniumCorporation","description":"Automatically pay SOL/SPL tokens to a specified recipient wallet address in Solana","archived":false,"fork":false,"pushed_at":"2025-03-07T06:49:57.000Z","size":586,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-07T07:26:38.212Z","etag":null,"topics":["blockchain","lamports","payments","sol","solana","spl-token"],"latest_commit_sha":null,"homepage":"https://uraniumcube.com","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/UraniumCorporation.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-03-07T06:15:58.000Z","updated_at":"2025-03-07T06:48:12.000Z","dependencies_parsed_at":"2025-03-07T07:36:52.073Z","dependency_job_id":null,"html_url":"https://github.com/UraniumCorporation/solana-payout-action","commit_stats":null,"previous_names":["uraniumcorporation/solana-payout-action"],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/UraniumCorporation%2Fsolana-payout-action","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/UraniumCorporation%2Fsolana-payout-action/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/UraniumCorporation%2Fsolana-payout-action/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/UraniumCorporation%2Fsolana-payout-action/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/UraniumCorporation","download_url":"https://codeload.github.com/UraniumCorporation/solana-payout-action/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":242565244,"owners_count":20150475,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["blockchain","lamports","payments","sol","solana","spl-token"],"created_at":"2025-03-08T14:30:00.289Z","updated_at":"2026-05-06T00:02:51.298Z","avatar_url":"https://github.com/UraniumCorporation.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Solana Payout Action\n\nA GitHub Action to automatically pay SOL/SPL tokens to a specified recipient wallet address in Solana.\n\n## Features\n\n- Send SOL or SPL tokens to any valid Solana wallet address\n- Support for multiple Solana networks (mainnet-beta, devnet, testnet)\n- Validates wallet addresses and balances before transactions\n  - Checks for sufficient SOL balance to cover transaction fees\n  - Verifies sufficient token balance for token transfers\n  - Automatically creates token account for recipient if it doesn't exist\n  - Ensures sender has enough SOL to create token account for the recipient if needed\n- Comprehensive error handling and validation\n\n## Usage\n\n```yaml\n# Send SOL\n- name: Solana Payout Action - Send SOL\n  uses: UraniumCorporation/solana-payout-action@v0.0.3\n  with:\n    recipient-wallet-address: \"RECIPIENT_WALLET_ADDRESS\"\n    amount: \"1.5\" # Amount in SOL\n    token: \"SOL\"\n    network: \"mainnet-beta\" # Optional (default: mainnet-beta)\n    timeout: 300000 # Optional (default: 300000ms = 5 minutes)\n  env:\n    SENDER_WALLET_SECRET: ${{ secrets.SENDER_WALLET_SECRET }}\n\n# Send SPL Token(s)\n- name: Solana Payout Action - Send SPL Token(s)\n  uses: UraniumCorporation/solana-payout-action@v0.0.3\n  with:\n    recipient-wallet-address: \"RECIPIENT_WALLET_ADDRESS\"\n    amount: \"10\" # Amount in tokens\n    token: \"TOKEN_ADDRESS\" # SPL token address\n    network: \"mainnet-beta\" # Optional (default: mainnet-beta)\n    timeout: 300000 # Optional (default: 300000ms = 5 minutes)\n  env:\n    SENDER_WALLET_SECRET: ${{ secrets.SENDER_WALLET_SECRET }}\n```\n\n## Inputs\n\n| Input                      | Description                                           | Type   | Required | Default      |\n| -------------------------- | ----------------------------------------------------- | ------ | -------- | ------------ |\n| `recipient-wallet-address` | Solana wallet address to receive the payment          | string | Yes      | -            |\n| `amount`                   | Amount to send (in SOL or tokens)                     | string | Yes      | -            |\n| `token`                    | Token to send - either 'SOL' or an SPL token address  | string | Yes      | -            |\n| `network`                  | Solana network to use (mainnet-beta, devnet, testnet) | string | No       | mainnet-beta |\n| `timeout`                  | Timeout to confirm the transaction in milliseconds    | number | No       | 300000       |\n\n## Outputs\n\n| Output        | Description                                         | Type             | Possible Values                                                            |\n| ------------- | --------------------------------------------------- | ---------------- | -------------------------------------------------------------------------- |\n| `success`     | Whether the payment was successful                  | string (boolean) | `\"true\"`, `\"false\"`                                                        |\n| `error`       | The error that occurred during the payment (if any) | string           | `\"\u003cerror-message\u003e\"`, `\"\"` (empty string if `success` == `\"true\"`)          |\n| `transaction` | The transaction signature for successful payments   | string           | `\"\u003ctransaction-signature\u003e\"`, `\"\"` (empty string if `success` == `\"false\"`) |\n\n## Environment Variables\n\n| Variable               | Description                                         | Type   | Required |\n| ---------------------- | --------------------------------------------------- | ------ | -------- |\n| `SENDER_WALLET_SECRET` | Private key of the sender's wallet in base58 format | string | Yes      |\n\n## Setup\n\n1. Create a Solana wallet to use as the sender\n2. Add the wallet's private key as a repository secret named `SENDER_WALLET_SECRET`\n   - The private key must be in base58 format (the standard format used by all Solana wallets)\n     - Example: `4wBqpZM9xkVJc8j7Z3gVxmBpMpRxLsQpiUbLaZCziaKAcXdwdKxRvKoRZGYXvEQZUNk5UJUZyeLHz1vHvfnzHYbN`\n       - You can typically export the private key from wallets providers\n       - No other formats are supported\n3. Ensure the sender wallet has sufficient SOL for the amount of SOL to send plus transaction fees\n   - The action will check the sender's SOL balance before sending the payment\n   - If the sender wallet does not have enough SOL, the action will fail with an error message\n4. If sending SPL tokens, ensure the sender wallet has the tokens and SOL for transaction fees\n   - The action will check the sender's token balance and SOL balance before sending the payment\n   - If the sender wallet does not have enough tokens or SOL, the action will fail with an error message\n\n## Example Workflow\n\n### Basic SOL/SPL Token Payment Example (Manual Trigger)\n\n```yaml\nname: Send SOL/SPL Token Payment\non:\n  # Manual trigger with inputs\n  workflow_dispatch:\n    inputs:\n      recipient:\n        description: \"Recipient wallet address\"\n        required: true\n      amount:\n        description: \"Amount to send (in SOL or tokens)\"\n        required: true\n        default: \"0.1\"\n      token:\n        description: \"Token to send - either 'SOL' or an SPL token address\"\n        required: true\n        default: \"SOL\"\n      network:\n        description: \"Solana network (mainnet-beta, devnet, testnet)\"\n        required: true\n        default: \"devnet\"\n        type: choice\n        options:\n          - mainnet-beta\n          - devnet\n          - testnet\n      timeout:\n        description: \"Timeout to confirm the transaction in milliseconds\"\n        required: false\n        default: 300000\n        type: number\n\njobs:\n  send-payment:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Solana Payout Action\n        uses: UraniumCorporation/solana-payout-action@v0.0.3\n          id: payout\n          continue-on-error: true\n          with:\n            recipient-wallet-address: ${{ inputs.recipient }}\n            amount: ${{ inputs.amount }}\n            token: ${{ inputs.token }}\n            network: ${{ inputs.network }}\n            timeout: ${{ inputs.timeout }}\n          env:\n            SENDER_WALLET_SECRET: ${{ secrets.SENDER_WALLET_SECRET }}\n\n      # Example of using the transaction output\n      - name: Print Successful Payment Details\n        if: steps.payout.outputs.success == 'true'\n        run: |\n          echo \"Payment successful!\"\n          echo \"Transaction signature: ${{ steps.payout.outputs.transaction }}\"\n          echo \"View on Solana Explorer: https://explorer.solana.com/tx/${{ steps.payout.outputs.transaction }}\"\n          echo \"View on Solscan: https://solscan.io/tx/${{ steps.payout.outputs.transaction }}\"\n\n      # Example of handling payment failure\n      - name: Print Failed Payment Details\n        if: steps.payout.outputs.success == 'false'\n        run: |\n          echo \"Payment failed!\"\n          echo \"Error message: ${{ steps.payout.outputs.error }}\"\n          exit 1\n```\n\n### Use Case: Simple Automated PR Reward System\n\nThis example below shows how to automatically pay contributors in SOL/SPL Tokens when their PR is merged.\n\n\u003e [!CAUTION]\n\u003e This is a simplified example below and does not have any security guardrails in place. Please ensure you have the appropriate security measures applied in your workflow for your use case. DO NOT simply copy this example and use it as is in a production environment.\n\n\u003e [!TIP]\n\u003e For a more production-ready example of an automated PR reward system, please refer to [Uranium Corporation's Maiar AI repo's Bounty Payment Workflow](https://github.com/UraniumCorporation/maiar-ai/blob/main/.github/workflows/bounty.yaml).\n\n#### Pull Request Format Requirements\n\nContributors must include their Solana wallet address in the PR description using this format:\n\n```\n## Wallet Address\nsolana:ABC123...XYZ\n```\n\nExample PR description:\n\n```markdown\nFixed bug\n\n## Wallet Address\n\nsolana:HN7cABqLq46Es1jh92dQQisAq662SmxELLLsHHe4YWrH\n```\n\n#### Workflow Configuration\n\n```yaml\nname: Pay Contributor\non:\n  pull_request_target:\n    types: [closed]\n\nenv:\n  SOLANA_NETWORK: \"mainnet-beta\" # or devnet, testnet, etc.\n  TOKEN: \"SOL\" # Pay in SOL/SPL Tokens - Valid values are 'SOL' or an SPL token address\n\njobs:\n  pay-contributor:\n    if: github.event.pull_request_target.merged == true\n    runs-on: ubuntu-latest\n    steps:\n      # Extract wallet address from PR description\n      - name: Extract wallet address\n        id: extract-wallet\n        run: |\n          DESCRIPTION=\"${{ github.event.pull_request_target.body }}\"\n          WALLET=$(echo \"$DESCRIPTION\" | grep -o 'solana:[A-Za-z0-9]\\{32,\\}' | cut -d':' -f2)\n          echo \"wallet=$WALLET\" \u003e\u003e $GITHUB_OUTPUT\n\n      - uses: UraniumCorporation/solana-payout-action@v0.0.3\n        with:\n          recipient-wallet-address: ${{ steps.extract-wallet.outputs.wallet }}\n          amount: \"1.0\"\n          token: ${{ env.TOKEN }}\n          network: ${{ env.SOLANA_NETWORK }}\n          timeout: 300000 # Optional, default is 300000ms (5 minutes)\n        env:\n          SENDER_WALLET_SECRET: ${{ secrets.SENDER_WALLET_SECRET }}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Furaniumcorporation%2Fsolana-payout-action","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Furaniumcorporation%2Fsolana-payout-action","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Furaniumcorporation%2Fsolana-payout-action/lists"}