{
    "version": "0.1.0",
    "name": "solana_payment_contract",
    "instructions": [
        {
            "name": "initialize",
            "docs": [
                "Initialize the vault with admin and SPL token mint"
            ],
            "accounts": [
                {
                    "name": "config",
                    "isMut": true,
                    "isSigner": false
                },
                {
                    "name": "vault",
                    "isMut": false,
                    "isSigner": false
                },
                {
                    "name": "vaultTokenAccount",
                    "isMut": true,
                    "isSigner": false
                },
                {
                    "name": "mint",
                    "isMut": false,
                    "isSigner": false
                },
                {
                    "name": "payer",
                    "isMut": true,
                    "isSigner": true
                },
                {
                    "name": "tokenProgram",
                    "isMut": false,
                    "isSigner": false
                },
                {
                    "name": "associatedTokenProgram",
                    "isMut": false,
                    "isSigner": false
                },
                {
                    "name": "systemProgram",
                    "isMut": false,
                    "isSigner": false
                },
                {
                    "name": "rent",
                    "isMut": false,
                    "isSigner": false
                }
            ],
            "args": [
                {
                    "name": "admin",
                    "type": "publicKey"
                },
                {
                    "name": "mint",
                    "type": "publicKey"
                }
            ]
        },
        {
            "name": "deposit",
            "docs": [
                "Deposit SPL tokens into the vault"
            ],
            "accounts": [
                {
                    "name": "config",
                    "isMut": false,
                    "isSigner": false
                },
                {
                    "name": "vault",
                    "isMut": false,
                    "isSigner": false
                },
                {
                    "name": "vaultTokenAccount",
                    "isMut": true,
                    "isSigner": false
                },
                {
                    "name": "userTokenAccount",
                    "isMut": true,
                    "isSigner": false
                },
                {
                    "name": "user",
                    "isMut": true,
                    "isSigner": true
                },
                {
                    "name": "tokenProgram",
                    "isMut": false,
                    "isSigner": false
                }
            ],
            "args": [
                {
                    "name": "amount",
                    "type": "u64"
                }
            ]
        },
        {
            "name": "withdraw",
            "docs": [
                "Withdraw SPL tokens from the vault (admin only)"
            ],
            "accounts": [
                {
                    "name": "config",
                    "isMut": false,
                    "isSigner": false
                },
                {
                    "name": "vault",
                    "isMut": false,
                    "isSigner": false
                },
                {
                    "name": "vaultTokenAccount",
                    "isMut": true,
                    "isSigner": false
                },
                {
                    "name": "recipientTokenAccount",
                    "isMut": true,
                    "isSigner": false
                },
                {
                    "name": "admin",
                    "isMut": false,
                    "isSigner": true
                },
                {
                    "name": "tokenProgram",
                    "isMut": false,
                    "isSigner": false
                }
            ],
            "args": [
                {
                    "name": "amount",
                    "type": "u64"
                }
            ]
        },
        {
            "name": "updateAdmin",
            "docs": [
                "Update admin (only current admin can update)"
            ],
            "accounts": [
                {
                    "name": "config",
                    "isMut": true,
                    "isSigner": false
                },
                {
                    "name": "admin",
                    "isMut": false,
                    "isSigner": true
                }
            ],
            "args": [
                {
                    "name": "newAdmin",
                    "type": "publicKey"
                }
            ]
        }
    ],
    "accounts": [
        {
            "name": "Config",
            "type": {
                "kind": "struct",
                "fields": [
                    {
                        "name": "admin",
                        "type": "publicKey"
                    },
                    {
                        "name": "mint",
                        "type": "publicKey"
                    }
                ]
            }
        }
    ],
    "events": [
        {
            "name": "DepositEvent",
            "fields": [
                {
                    "name": "user",
                    "type": "publicKey",
                    "index": false
                },
                {
                    "name": "amount",
                    "type": "u64",
                    "index": false
                }
            ]
        },
        {
            "name": "WithdrawEvent",
            "fields": [
                {
                    "name": "admin",
                    "type": "publicKey",
                    "index": false
                },
                {
                    "name": "recipient",
                    "type": "publicKey",
                    "index": false
                },
                {
                    "name": "amount",
                    "type": "u64",
                    "index": false
                }
            ]
        },
        {
            "name": "UpdateAdminEvent",
            "fields": [
                {
                    "name": "oldAdmin",
                    "type": "publicKey",
                    "index": false
                },
                {
                    "name": "newAdmin",
                    "type": "publicKey",
                    "index": false
                }
            ]
        }
    ],
    "errors": [
        {
            "code": 6000,
            "name": "Unauthorized",
            "msg": "Unauthorized: Only admin can perform this action"
        },
        {
            "code": 6001,
            "name": "InvalidAmount",
            "msg": "Invalid amount: Amount must be greater than 0"
        },
        {
            "code": 6002,
            "name": "InvalidMint",
            "msg": "Invalid mint: Token account must be for the configured mint"
        },
        {
            "code": 6003,
            "name": "SameAdmin",
            "msg": "Same admin: New admin must be different from current admin"
        }
    ]
}
