import { generateErrorMap } from "@saberhq/anchor-contrib";

export type YiIDL = {
  version: "0.4.0";
  name: "yi";
  instructions: [
    {
      name: "createYiToken";
      accounts: [
        {
          name: "mint";
          isMut: false;
          isSigner: false;
        },
        {
          name: "yiToken";
          isMut: true;
          isSigner: false;
          pda: {
            seeds: [
              {
                kind: "const";
                type: "string";
                value: "YiToken";
              },
              {
                kind: "account";
                type: "publicKey";
                account: "Mint";
                path: "mint";
              }
            ];
          };
        },
        {
          name: "underlyingTokenMint";
          isMut: false;
          isSigner: false;
        },
        {
          name: "underlyingTokens";
          isMut: false;
          isSigner: false;
        },
        {
          name: "payer";
          isMut: true;
          isSigner: true;
        },
        {
          name: "systemProgram";
          isMut: false;
          isSigner: false;
        }
      ];
      args: [];
    },
    {
      name: "createYiTokenWithFees";
      accounts: [
        {
          name: "mint";
          isMut: false;
          isSigner: false;
        },
        {
          name: "yiToken";
          isMut: true;
          isSigner: false;
          pda: {
            seeds: [
              {
                kind: "const";
                type: "string";
                value: "YiToken";
              },
              {
                kind: "account";
                type: "publicKey";
                account: "Mint";
                path: "mint";
              }
            ];
          };
        },
        {
          name: "underlyingTokenMint";
          isMut: false;
          isSigner: false;
        },
        {
          name: "underlyingTokens";
          isMut: false;
          isSigner: false;
        },
        {
          name: "payer";
          isMut: true;
          isSigner: true;
        },
        {
          name: "systemProgram";
          isMut: false;
          isSigner: false;
        }
      ];
      args: [
        {
          name: "stakeFeeMillibps";
          type: "u32";
        },
        {
          name: "unstakeFeeMillibps";
          type: "u32";
        }
      ];
    },
    {
      name: "stake";
      accounts: [
        {
          name: "yiToken";
          isMut: false;
          isSigner: false;
        },
        {
          name: "yiMint";
          isMut: true;
          isSigner: false;
        },
        {
          name: "sourceTokens";
          isMut: true;
          isSigner: false;
        },
        {
          name: "sourceAuthority";
          isMut: false;
          isSigner: true;
        },
        {
          name: "yiUnderlyingTokens";
          isMut: true;
          isSigner: false;
        },
        {
          name: "destinationYiTokens";
          isMut: true;
          isSigner: false;
        },
        {
          name: "tokenProgram";
          isMut: false;
          isSigner: false;
        }
      ];
      args: [
        {
          name: "amount";
          type: "u64";
        }
      ];
    },
    {
      name: "unstake";
      accounts: [
        {
          name: "yiToken";
          isMut: false;
          isSigner: false;
        },
        {
          name: "yiMint";
          isMut: true;
          isSigner: false;
        },
        {
          name: "sourceYiTokens";
          isMut: true;
          isSigner: false;
        },
        {
          name: "sourceAuthority";
          isMut: false;
          isSigner: true;
        },
        {
          name: "yiUnderlyingTokens";
          isMut: true;
          isSigner: false;
        },
        {
          name: "destinationUnderlyingTokens";
          isMut: true;
          isSigner: false;
        },
        {
          name: "tokenProgram";
          isMut: false;
          isSigner: false;
        }
      ];
      args: [
        {
          name: "amount";
          type: "u64";
        }
      ];
    }
  ];
  accounts: [
    {
      name: "YiToken";
      type: {
        kind: "struct";
        fields: [
          {
            name: "mint";
            type: "publicKey";
          },
          {
            name: "bump";
            type: "u8";
          },
          {
            name: "padding";
            type: {
              array: ["u8", 7];
            };
          },
          {
            name: "underlyingTokenMint";
            type: "publicKey";
          },
          {
            name: "underlyingTokens";
            type: "publicKey";
          },
          {
            name: "stakeFeeMillibps";
            type: "u32";
          },
          {
            name: "unstakeFeeMillibps";
            type: "u32";
          }
        ];
      };
    }
  ];
  errors: [
    {
      code: 6000;
      name: "DecimalMismatch";
      msg: "Decimal mismatch.";
    },
    {
      code: 6001;
      name: "InvalidStakeFee";
      msg: "Stake fee cannot exceed 100%.";
    },
    {
      code: 6002;
      name: "InvalidUnstakeFee";
      msg: "Unstake fee cannot exceed 100%.";
    }
  ];
};
export const YiJSON: YiIDL = {
  version: "0.4.0",
  name: "yi",
  instructions: [
    {
      name: "createYiToken",
      accounts: [
        {
          name: "mint",
          isMut: false,
          isSigner: false,
        },
        {
          name: "yiToken",
          isMut: true,
          isSigner: false,
          pda: {
            seeds: [
              {
                kind: "const",
                type: "string",
                value: "YiToken",
              },
              {
                kind: "account",
                type: "publicKey",
                account: "Mint",
                path: "mint",
              },
            ],
          },
        },
        {
          name: "underlyingTokenMint",
          isMut: false,
          isSigner: false,
        },
        {
          name: "underlyingTokens",
          isMut: false,
          isSigner: false,
        },
        {
          name: "payer",
          isMut: true,
          isSigner: true,
        },
        {
          name: "systemProgram",
          isMut: false,
          isSigner: false,
        },
      ],
      args: [],
    },
    {
      name: "createYiTokenWithFees",
      accounts: [
        {
          name: "mint",
          isMut: false,
          isSigner: false,
        },
        {
          name: "yiToken",
          isMut: true,
          isSigner: false,
          pda: {
            seeds: [
              {
                kind: "const",
                type: "string",
                value: "YiToken",
              },
              {
                kind: "account",
                type: "publicKey",
                account: "Mint",
                path: "mint",
              },
            ],
          },
        },
        {
          name: "underlyingTokenMint",
          isMut: false,
          isSigner: false,
        },
        {
          name: "underlyingTokens",
          isMut: false,
          isSigner: false,
        },
        {
          name: "payer",
          isMut: true,
          isSigner: true,
        },
        {
          name: "systemProgram",
          isMut: false,
          isSigner: false,
        },
      ],
      args: [
        {
          name: "stakeFeeMillibps",
          type: "u32",
        },
        {
          name: "unstakeFeeMillibps",
          type: "u32",
        },
      ],
    },
    {
      name: "stake",
      accounts: [
        {
          name: "yiToken",
          isMut: false,
          isSigner: false,
        },
        {
          name: "yiMint",
          isMut: true,
          isSigner: false,
        },
        {
          name: "sourceTokens",
          isMut: true,
          isSigner: false,
        },
        {
          name: "sourceAuthority",
          isMut: false,
          isSigner: true,
        },
        {
          name: "yiUnderlyingTokens",
          isMut: true,
          isSigner: false,
        },
        {
          name: "destinationYiTokens",
          isMut: true,
          isSigner: false,
        },
        {
          name: "tokenProgram",
          isMut: false,
          isSigner: false,
        },
      ],
      args: [
        {
          name: "amount",
          type: "u64",
        },
      ],
    },
    {
      name: "unstake",
      accounts: [
        {
          name: "yiToken",
          isMut: false,
          isSigner: false,
        },
        {
          name: "yiMint",
          isMut: true,
          isSigner: false,
        },
        {
          name: "sourceYiTokens",
          isMut: true,
          isSigner: false,
        },
        {
          name: "sourceAuthority",
          isMut: false,
          isSigner: true,
        },
        {
          name: "yiUnderlyingTokens",
          isMut: true,
          isSigner: false,
        },
        {
          name: "destinationUnderlyingTokens",
          isMut: true,
          isSigner: false,
        },
        {
          name: "tokenProgram",
          isMut: false,
          isSigner: false,
        },
      ],
      args: [
        {
          name: "amount",
          type: "u64",
        },
      ],
    },
  ],
  accounts: [
    {
      name: "YiToken",
      type: {
        kind: "struct",
        fields: [
          {
            name: "mint",
            type: "publicKey",
          },
          {
            name: "bump",
            type: "u8",
          },
          {
            name: "padding",
            type: {
              array: ["u8", 7],
            },
          },
          {
            name: "underlyingTokenMint",
            type: "publicKey",
          },
          {
            name: "underlyingTokens",
            type: "publicKey",
          },
          {
            name: "stakeFeeMillibps",
            type: "u32",
          },
          {
            name: "unstakeFeeMillibps",
            type: "u32",
          },
        ],
      },
    },
  ],
  errors: [
    {
      code: 6000,
      name: "DecimalMismatch",
      msg: "Decimal mismatch.",
    },
    {
      code: 6001,
      name: "InvalidStakeFee",
      msg: "Stake fee cannot exceed 100%.",
    },
    {
      code: 6002,
      name: "InvalidUnstakeFee",
      msg: "Unstake fee cannot exceed 100%.",
    },
  ],
};
export const YiErrors = generateErrorMap(YiJSON);
