{
    "version": "0.1.0",
    "name": "staking",
    "instructions": [
        {
            "name": "initLockup",
            "accounts": [
                {
                    "name": "creator",
                    "isMut": true,
                    "isSigner": true
                },
                {
                    "name": "lockup",
                    "isMut": true,
                    "isSigner": false
                },
                {
                    "name": "stakeVault",
                    "isMut": true,
                    "isSigner": false
                },
                {
                    "name": "stakeToken",
                    "isMut": false,
                    "isSigner": false
                },
                {
                    "name": "rewardToken",
                    "isMut": false,
                    "isSigner": false
                },
                {
                    "name": "stakeVaultTokenAccount",
                    "isMut": true,
                    "isSigner": false
                },
                {
                    "name": "stakeVaultRewardTokenAccount",
                    "isMut": true,
                    "isSigner": false
                },
                {
                    "name": "systemProgram",
                    "isMut": false,
                    "isSigner": false
                },
                {
                    "name": "tokenProgram",
                    "isMut": false,
                    "isSigner": false
                },
                {
                    "name": "associatedTokenProgram",
                    "isMut": false,
                    "isSigner": false
                }
            ],
            "args": [
                {
                    "name": "params",
                    "type": {
                        "defined": "InitLockupParams"
                    }
                }
            ]
        },
        {
            "name": "stake",
            "accounts": [
                {
                    "name": "staker",
                    "isMut": true,
                    "isSigner": true
                },
                {
                    "name": "lockup",
                    "isMut": true,
                    "isSigner": false
                },
                {
                    "name": "stakePda",
                    "isMut": true,
                    "isSigner": false
                },
                {
                    "name": "stakeToken",
                    "isMut": false,
                    "isSigner": false
                },
                {
                    "name": "stakerTokenAccount",
                    "isMut": true,
                    "isSigner": false
                },
                {
                    "name": "stakeVault",
                    "isMut": true,
                    "isSigner": false
                },
                {
                    "name": "stakeVaultTokenAccount",
                    "isMut": true,
                    "isSigner": false
                },
                {
                    "name": "systemProgram",
                    "isMut": false,
                    "isSigner": false
                },
                {
                    "name": "tokenProgram",
                    "isMut": false,
                    "isSigner": false
                },
                {
                    "name": "associatedTokenProgram",
                    "isMut": false,
                    "isSigner": false
                }
            ],
            "args": [
                {
                    "name": "params",
                    "type": {
                        "defined": "StakeParams"
                    }
                }
            ]
        },
        {
            "name": "unStake",
            "accounts": [
                {
                    "name": "staker",
                    "isMut": true,
                    "isSigner": true
                },
                {
                    "name": "lockup",
                    "isMut": true,
                    "isSigner": false
                },
                {
                    "name": "stakePda",
                    "isMut": true,
                    "isSigner": false
                },
                {
                    "name": "stakeToken",
                    "isMut": false,
                    "isSigner": false
                },
                {
                    "name": "stakerTokenAccount",
                    "isMut": true,
                    "isSigner": false
                },
                {
                    "name": "stakeVault",
                    "isMut": true,
                    "isSigner": false
                },
                {
                    "name": "stakeVaultTokenAccount",
                    "isMut": true,
                    "isSigner": false
                },
                {
                    "name": "tokenProgram",
                    "isMut": false,
                    "isSigner": false
                },
                {
                    "name": "systemProgram",
                    "isMut": false,
                    "isSigner": false
                },
                {
                    "name": "associatedTokenProgram",
                    "isMut": false,
                    "isSigner": false
                }
            ],
            "args": []
        },
        {
            "name": "claimRewardToken",
            "accounts": [
                {
                    "name": "staker",
                    "isMut": true,
                    "isSigner": true
                },
                {
                    "name": "lockup",
                    "isMut": true,
                    "isSigner": false
                },
                {
                    "name": "stakePda",
                    "isMut": true,
                    "isSigner": false
                },
                {
                    "name": "rewardToken",
                    "isMut": false,
                    "isSigner": false
                },
                {
                    "name": "stakeToken",
                    "isMut": false,
                    "isSigner": false
                },
                {
                    "name": "stakerRewardTokenAccount",
                    "isMut": true,
                    "isSigner": false
                },
                {
                    "name": "stakeVault",
                    "isMut": true,
                    "isSigner": false
                },
                {
                    "name": "stakeVaultRewardTokenAccount",
                    "isMut": true,
                    "isSigner": false
                },
                {
                    "name": "tokenProgram",
                    "isMut": false,
                    "isSigner": false
                },
                {
                    "name": "associatedTokenProgram",
                    "isMut": false,
                    "isSigner": false
                },
                {
                    "name": "systemProgram",
                    "isMut": false,
                    "isSigner": false
                }
            ],
            "args": []
        }
    ],
    "accounts": [
        {
            "name": "LockupInfo",
            "type": {
                "kind": "struct",
                "fields": [
                    {
                        "name": "name",
                        "type": "string"
                    },
                    {
                        "name": "creator",
                        "type": "publicKey"
                    },
                    {
                        "name": "lockupCreatedTime",
                        "type": "i64"
                    },
                    {
                        "name": "stakingStartTime",
                        "type": "i64"
                    },
                    {
                        "name": "stakingEndTime",
                        "type": "i64"
                    },
                    {
                        "name": "lockTimespan",
                        "type": "i64"
                    },
                    {
                        "name": "globalStaked",
                        "type": "u64"
                    },
                    {
                        "name": "totalAllocationReward",
                        "type": "u64"
                    },
                    {
                        "name": "stakedToken",
                        "type": "publicKey"
                    },
                    {
                        "name": "rewardToken",
                        "type": "publicKey"
                    }
                ]
            }
        },
        {
            "name": "StakeInfo",
            "type": {
                "kind": "struct",
                "fields": [
                    {
                        "name": "staker",
                        "type": "publicKey"
                    },
                    {
                        "name": "createdTime",
                        "type": "i64"
                    },
                    {
                        "name": "stakedAmount",
                        "type": "u64"
                    },
                    {
                        "name": "rewardAmount",
                        "type": "u64"
                    },
                    {
                        "name": "rewardClaimed",
                        "type": "bool"
                    },
                    {
                        "name": "stakeClaimed",
                        "type": "bool"
                    }
                ]
            }
        }
    ],
    "types": [
        {
            "name": "InitLockupParams",
            "type": {
                "kind": "struct",
                "fields": [
                    {
                        "name": "name",
                        "type": "string"
                    },
                    {
                        "name": "lockTimespan",
                        "type": "i64"
                    },
                    {
                        "name": "totalAllocationReward",
                        "type": "u64"
                    },
                    {
                        "name": "stakingEndTime",
                        "type": "i64"
                    },
                    {
                        "name": "stakingStartTime",
                        "type": "i64"
                    }
                ]
            }
        },
        {
            "name": "StakeParams",
            "type": {
                "kind": "struct",
                "fields": [
                    {
                        "name": "amount",
                        "type": "u64"
                    }
                ]
            }
        }
    ],
    "errors": [
        {
            "code": 6000,
            "name": "InvalidStakeToken",
            "msg": "The provided token mint is not usable for this operation"
        },
        {
            "code": 6001,
            "name": "InvalidStakeClaimTime",
            "msg": "You cannot claim your stake yet"
        },
        {
            "code": 6002,
            "name": "InvalidStaker",
            "msg": "Invalid Staker"
        },
        {
            "code": 6003,
            "name": "StakeAlreadyClaimed",
            "msg": "Already claimed"
        },
        {
            "code": 6004,
            "name": "RewardIsZero",
            "msg": "Reward is zero"
        },
        {
            "code": 6005,
            "name": "InvalidStakeAmount",
            "msg": "Invalid stake amount"
        },
        {
            "code": 6006,
            "name": "InvalidRewardToken",
            "msg": "Invalid reward token"
        },
        {
            "code": 6007,
            "name": "InvalidStakePeriod",
            "msg": "Invalid stake period"
        },
        {
            "code": 6008,
            "name": "InvalidUnstakeTime",
            "msg": "Invalid unstake time"
        },
        {
            "code": 6009,
            "name": "StakeRewardNotClaimable",
            "msg": "Stake reward not claimable yet"
        },
        {
            "code": 6010,
            "name": "StakeNotClaimable",
            "msg": "Stake not claimable yet"
        },
        {
            "code": 6011,
            "name": "RewardAlreadyClaimed",
            "msg": "Reward already claimed"
        }
    ]
}
