export type PythSolanaReceiver = {
  version: '0.1.0';
  name: 'pyth_solana_receiver';
  instructions: [
    {
      name: 'initialize';
      accounts: [
        {
          name: 'payer';
          isMut: true;
          isSigner: true;
        },
        {
          name: 'config';
          isMut: true;
          isSigner: false;
        },
        {
          name: 'systemProgram';
          isMut: false;
          isSigner: false;
        },
      ];
      args: [
        {
          name: 'initialConfig';
          type: {
            defined: 'Config';
          };
        },
      ];
    },
    {
      name: 'requestGovernanceAuthorityTransfer';
      accounts: [
        {
          name: 'payer';
          isMut: false;
          isSigner: true;
        },
        {
          name: 'config';
          isMut: true;
          isSigner: false;
        },
      ];
      args: [
        {
          name: 'targetGovernanceAuthority';
          type: 'publicKey';
        },
      ];
    },
    {
      name: 'acceptGovernanceAuthorityTransfer';
      accounts: [
        {
          name: 'payer';
          isMut: false;
          isSigner: true;
        },
        {
          name: 'config';
          isMut: true;
          isSigner: false;
        },
      ];
      args: [];
    },
    {
      name: 'setDataSources';
      accounts: [
        {
          name: 'payer';
          isMut: false;
          isSigner: true;
        },
        {
          name: 'config';
          isMut: true;
          isSigner: false;
        },
      ];
      args: [
        {
          name: 'validDataSources';
          type: {
            vec: {
              defined: 'DataSource';
            };
          };
        },
      ];
    },
    {
      name: 'setFee';
      accounts: [
        {
          name: 'payer';
          isMut: false;
          isSigner: true;
        },
        {
          name: 'config';
          isMut: true;
          isSigner: false;
        },
      ];
      args: [
        {
          name: 'singleUpdateFeeInLamports';
          type: 'u64';
        },
      ];
    },
    {
      name: 'setWormholeAddress';
      accounts: [
        {
          name: 'payer';
          isMut: false;
          isSigner: true;
        },
        {
          name: 'config';
          isMut: true;
          isSigner: false;
        },
      ];
      args: [
        {
          name: 'wormhole';
          type: 'publicKey';
        },
      ];
    },
    {
      name: 'setMinimumSignatures';
      accounts: [
        {
          name: 'payer';
          isMut: false;
          isSigner: true;
        },
        {
          name: 'config';
          isMut: true;
          isSigner: false;
        },
      ];
      args: [
        {
          name: 'minimumSignatures';
          type: 'u8';
        },
      ];
    },
    {
      name: 'postUpdateAtomic';
      docs: [
        'Post a price update using a VAA and a MerklePriceUpdate.',
        'This function allows you to post a price update in a single transaction.',
        "Compared to post_update, it is less secure since you won't be able to verify all guardian signatures if you use this function because of transaction size limitations.",
        'Typically, you can fit 5 guardian signatures in a transaction that uses this.',
      ];
      accounts: [
        {
          name: 'payer';
          isMut: true;
          isSigner: true;
        },
        {
          name: 'guardianSet';
          isMut: false;
          isSigner: false;
          docs: [
            'Instead we do the same steps in deserialize_guardian_set_checked.',
          ];
        },
        {
          name: 'config';
          isMut: false;
          isSigner: false;
        },
        {
          name: 'treasury';
          isMut: true;
          isSigner: false;
        },
        {
          name: 'priceUpdateAccount';
          isMut: true;
          isSigner: true;
          docs: [
            'The contraint is such that either the price_update_account is uninitialized or the payer is the write_authority.',
            "Pubkey::default() is the SystemProgram on Solana and it can't sign so it's impossible that price_update_account.write_authority == Pubkey::default() once the account is initialized",
          ];
        },
        {
          name: 'systemProgram';
          isMut: false;
          isSigner: false;
        },
        {
          name: 'writeAuthority';
          isMut: false;
          isSigner: true;
        },
      ];
      args: [
        {
          name: 'params';
          type: {
            defined: 'PostUpdateAtomicParams';
          };
        },
      ];
    },
    {
      name: 'postUpdate';
      docs: [
        'Post a price update using an encoded_vaa account and a MerklePriceUpdate calldata.',
        'This should be called after the client has already verified the Vaa via the Wormhole contract.',
        'Check out target_chains/solana/cli/src/main.rs for an example of how to do this.',
      ];
      accounts: [
        {
          name: 'payer';
          isMut: true;
          isSigner: true;
        },
        {
          name: 'encodedVaa';
          isMut: false;
          isSigner: false;
        },
        {
          name: 'config';
          isMut: false;
          isSigner: false;
        },
        {
          name: 'treasury';
          isMut: true;
          isSigner: false;
        },
        {
          name: 'priceUpdateAccount';
          isMut: true;
          isSigner: true;
          docs: [
            'The contraint is such that either the price_update_account is uninitialized or the payer is the write_authority.',
            "Pubkey::default() is the SystemProgram on Solana and it can't sign so it's impossible that price_update_account.write_authority == Pubkey::default() once the account is initialized",
          ];
        },
        {
          name: 'systemProgram';
          isMut: false;
          isSigner: false;
        },
        {
          name: 'writeAuthority';
          isMut: false;
          isSigner: true;
        },
      ];
      args: [
        {
          name: 'params';
          type: {
            defined: 'PostUpdateParams';
          };
        },
      ];
    },
    {
      name: 'reclaimRent';
      accounts: [
        {
          name: 'payer';
          isMut: true;
          isSigner: true;
        },
        {
          name: 'priceUpdateAccount';
          isMut: true;
          isSigner: false;
        },
      ];
      args: [];
    },
  ];
  accounts: [
    {
      name: 'Config';
      type: {
        kind: 'struct';
        fields: [
          {
            name: 'governanceAuthority';
            type: 'publicKey';
          },
          {
            name: 'targetGovernanceAuthority';
            type: {
              option: 'publicKey';
            };
          },
          {
            name: 'wormhole';
            type: 'publicKey';
          },
          {
            name: 'validDataSources';
            type: {
              vec: {
                defined: 'DataSource';
              };
            };
          },
          {
            name: 'singleUpdateFeeInLamports';
            type: 'u64';
          },
          {
            name: 'minimumSignatures';
            type: 'u8';
          },
        ];
      };
    },
    {
      name: 'priceUpdateV2';
      type: {
        kind: 'struct';
        fields: [
          {
            name: 'writeAuthority';
            type: 'publicKey';
          },
          {
            name: 'verificationLevel';
            type: {
              defined: 'VerificationLevel';
            };
          },
          {
            name: 'priceMessage';
            type: {
              defined: 'PriceFeedMessage';
            };
          },
          {
            name: 'postedSlot';
            type: 'u64';
          },
        ];
      };
    },
  ];
  types: [
    {
      name: 'PriceFeedMessage';
      type: {
        kind: 'struct';
        fields: [
          {
            name: 'feedId';
            type: {
              array: ['u8', 32];
            };
          },
          {
            name: 'price';
            type: 'i64';
          },
          {
            name: 'conf';
            type: 'u64';
          },
          {
            name: 'exponent';
            type: 'i32';
          },
          {
            name: 'publishTime';
            type: 'i64';
          },
          {
            name: 'prevPublishTime';
            type: 'i64';
          },
          {
            name: 'emaPrice';
            type: 'i64';
          },
          {
            name: 'emaConf';
            type: 'u64';
          },
        ];
      };
    },
    {
      name: 'MerklePriceUpdate';
      type: {
        kind: 'struct';
        fields: [
          {
            name: 'message';
            type: 'bytes';
          },
          {
            name: 'proof';
            type: {
              vec: {
                array: ['u8', 20];
              };
            };
          },
        ];
      };
    },
    {
      name: 'DataSource';
      type: {
        kind: 'struct';
        fields: [
          {
            name: 'chain';
            type: 'u16';
          },
          {
            name: 'emitter';
            type: 'publicKey';
          },
        ];
      };
    },
    {
      name: 'PostUpdateAtomicParams';
      type: {
        kind: 'struct';
        fields: [
          {
            name: 'vaa';
            type: 'bytes';
          },
          {
            name: 'merklePriceUpdate';
            type: {
              defined: 'MerklePriceUpdate';
            };
          },
          {
            name: 'treasuryId';
            type: 'u8';
          },
        ];
      };
    },
    {
      name: 'PostUpdateParams';
      type: {
        kind: 'struct';
        fields: [
          {
            name: 'merklePriceUpdate';
            type: {
              defined: 'MerklePriceUpdate';
            };
          },
          {
            name: 'treasuryId';
            type: 'u8';
          },
        ];
      };
    },
    {
      name: 'VerificationLevel';
      docs: [
        '* This enum represents how many guardian signatures were checked for a Pythnet price update\n * If full, guardian quorum has been attained\n * If partial, at least config.minimum signatures have been verified, but in the case config.minimum_signatures changes in the future we also include the number of signatures that were checked',
      ];
      type: {
        kind: 'enum';
        variants: [
          {
            name: 'Partial';
            fields: [
              {
                name: 'numSignatures';
                type: 'u8';
              },
            ];
          },
          {
            name: 'Full';
          },
        ];
      };
    },
  ];
  errors: [
    {
      code: 6000;
      name: 'InvalidWormholeMessage';
      msg: 'Received an invalid wormhole message';
    },
    {
      code: 6001;
      name: 'DeserializeMessageFailed';
      msg: 'An error occurred when deserializing the message';
    },
    {
      code: 6002;
      name: 'InvalidPriceUpdate';
      msg: 'Received an invalid price update';
    },
    {
      code: 6003;
      name: 'UnsupportedMessageType';
      msg: 'This type of message is not supported currently';
    },
    {
      code: 6004;
      name: 'InvalidDataSource';
      msg: "The tuple emitter chain, emitter doesn't match one of the valid data sources.";
    },
    {
      code: 6005;
      name: 'InsufficientFunds';
      msg: 'Funds are insufficient to pay the receiving fee';
    },
    {
      code: 6006;
      name: 'WrongWriteAuthority';
      msg: "This signer can't write to price update account";
    },
    {
      code: 6007;
      name: 'WrongVaaOwner';
      msg: 'The posted VAA account has the wrong owner.';
    },
    {
      code: 6008;
      name: 'DeserializeVaaFailed';
      msg: 'An error occurred when deserializing the VAA.';
    },
    {
      code: 6009;
      name: 'InsufficientGuardianSignatures';
      msg: 'The number of guardian signatures is below the minimum';
    },
    {
      code: 6010;
      name: 'InvalidVaaVersion';
      msg: 'Invalid VAA version';
    },
    {
      code: 6011;
      name: 'GuardianSetMismatch';
      msg: "Guardian set version in the VAA doesn't match the guardian set passed";
    },
    {
      code: 6012;
      name: 'InvalidGuardianOrder';
      msg: 'Guardian signature indices must be increasing';
    },
    {
      code: 6013;
      name: 'InvalidGuardianIndex';
      msg: 'Guardian index exceeds the number of guardians in the set';
    },
    {
      code: 6014;
      name: 'InvalidSignature';
      msg: 'A VAA signature is invalid';
    },
    {
      code: 6015;
      name: 'InvalidGuardianKeyRecovery';
      msg: "The recovered guardian public key doesn't match the guardian set";
    },
    {
      code: 6016;
      name: 'WrongGuardianSetOwner';
      msg: 'The guardian set account is owned by the wrong program';
    },
    {
      code: 6017;
      name: 'InvalidGuardianSetPda';
      msg: "The Guardian Set account doesn't match the PDA derivation";
    },
    {
      code: 6018;
      name: 'GuardianSetExpired';
      msg: 'The Guardian Set is expired';
    },
    {
      code: 6019;
      name: 'GovernanceAuthorityMismatch';
      msg: 'The signer is not authorized to perform this governance action';
    },
    {
      code: 6020;
      name: 'TargetGovernanceAuthorityMismatch';
      msg: 'The signer is not authorized to accept the governance authority';
    },
    {
      code: 6021;
      name: 'NonexistentGovernanceAuthorityTransferRequest';
      msg: 'The governance authority needs to request a transfer first';
    },
  ];
};

export const IDL: PythSolanaReceiver = {
  version: '0.1.0',
  name: 'pyth_solana_receiver',
  instructions: [
    {
      name: 'initialize',
      accounts: [
        {
          name: 'payer',
          isMut: true,
          isSigner: true,
        },
        {
          name: 'config',
          isMut: true,
          isSigner: false,
        },
        {
          name: 'systemProgram',
          isMut: false,
          isSigner: false,
        },
      ],
      args: [
        {
          name: 'initialConfig',
          type: {
            defined: 'Config',
          },
        },
      ],
    },
    {
      name: 'requestGovernanceAuthorityTransfer',
      accounts: [
        {
          name: 'payer',
          isMut: false,
          isSigner: true,
        },
        {
          name: 'config',
          isMut: true,
          isSigner: false,
        },
      ],
      args: [
        {
          name: 'targetGovernanceAuthority',
          type: 'publicKey',
        },
      ],
    },
    {
      name: 'acceptGovernanceAuthorityTransfer',
      accounts: [
        {
          name: 'payer',
          isMut: false,
          isSigner: true,
        },
        {
          name: 'config',
          isMut: true,
          isSigner: false,
        },
      ],
      args: [],
    },
    {
      name: 'setDataSources',
      accounts: [
        {
          name: 'payer',
          isMut: false,
          isSigner: true,
        },
        {
          name: 'config',
          isMut: true,
          isSigner: false,
        },
      ],
      args: [
        {
          name: 'validDataSources',
          type: {
            vec: {
              defined: 'DataSource',
            },
          },
        },
      ],
    },
    {
      name: 'setFee',
      accounts: [
        {
          name: 'payer',
          isMut: false,
          isSigner: true,
        },
        {
          name: 'config',
          isMut: true,
          isSigner: false,
        },
      ],
      args: [
        {
          name: 'singleUpdateFeeInLamports',
          type: 'u64',
        },
      ],
    },
    {
      name: 'setWormholeAddress',
      accounts: [
        {
          name: 'payer',
          isMut: false,
          isSigner: true,
        },
        {
          name: 'config',
          isMut: true,
          isSigner: false,
        },
      ],
      args: [
        {
          name: 'wormhole',
          type: 'publicKey',
        },
      ],
    },
    {
      name: 'setMinimumSignatures',
      accounts: [
        {
          name: 'payer',
          isMut: false,
          isSigner: true,
        },
        {
          name: 'config',
          isMut: true,
          isSigner: false,
        },
      ],
      args: [
        {
          name: 'minimumSignatures',
          type: 'u8',
        },
      ],
    },
    {
      name: 'postUpdateAtomic',
      docs: [
        'Post a price update using a VAA and a MerklePriceUpdate.',
        'This function allows you to post a price update in a single transaction.',
        "Compared to post_update, it is less secure since you won't be able to verify all guardian signatures if you use this function because of transaction size limitations.",
        'Typically, you can fit 5 guardian signatures in a transaction that uses this.',
      ],
      accounts: [
        {
          name: 'payer',
          isMut: true,
          isSigner: true,
        },
        {
          name: 'guardianSet',
          isMut: false,
          isSigner: false,
          docs: [
            'Instead we do the same steps in deserialize_guardian_set_checked.',
          ],
        },
        {
          name: 'config',
          isMut: false,
          isSigner: false,
        },
        {
          name: 'treasury',
          isMut: true,
          isSigner: false,
        },
        {
          name: 'priceUpdateAccount',
          isMut: true,
          isSigner: true,
          docs: [
            'The contraint is such that either the price_update_account is uninitialized or the payer is the write_authority.',
            "Pubkey::default() is the SystemProgram on Solana and it can't sign so it's impossible that price_update_account.write_authority == Pubkey::default() once the account is initialized",
          ],
        },
        {
          name: 'systemProgram',
          isMut: false,
          isSigner: false,
        },
        {
          name: 'writeAuthority',
          isMut: false,
          isSigner: true,
        },
      ],
      args: [
        {
          name: 'params',
          type: {
            defined: 'PostUpdateAtomicParams',
          },
        },
      ],
    },
    {
      name: 'postUpdate',
      docs: [
        'Post a price update using an encoded_vaa account and a MerklePriceUpdate calldata.',
        'This should be called after the client has already verified the Vaa via the Wormhole contract.',
        'Check out target_chains/solana/cli/src/main.rs for an example of how to do this.',
      ],
      accounts: [
        {
          name: 'payer',
          isMut: true,
          isSigner: true,
        },
        {
          name: 'encodedVaa',
          isMut: false,
          isSigner: false,
        },
        {
          name: 'config',
          isMut: false,
          isSigner: false,
        },
        {
          name: 'treasury',
          isMut: true,
          isSigner: false,
        },
        {
          name: 'priceUpdateAccount',
          isMut: true,
          isSigner: true,
          docs: [
            'The contraint is such that either the price_update_account is uninitialized or the payer is the write_authority.',
            "Pubkey::default() is the SystemProgram on Solana and it can't sign so it's impossible that price_update_account.write_authority == Pubkey::default() once the account is initialized",
          ],
        },
        {
          name: 'systemProgram',
          isMut: false,
          isSigner: false,
        },
        {
          name: 'writeAuthority',
          isMut: false,
          isSigner: true,
        },
      ],
      args: [
        {
          name: 'params',
          type: {
            defined: 'PostUpdateParams',
          },
        },
      ],
    },
    {
      name: 'reclaimRent',
      accounts: [
        {
          name: 'payer',
          isMut: true,
          isSigner: true,
        },
        {
          name: 'priceUpdateAccount',
          isMut: true,
          isSigner: false,
        },
      ],
      args: [],
    },
  ],
  accounts: [
    {
      name: 'Config',
      type: {
        kind: 'struct',
        fields: [
          {
            name: 'governanceAuthority',
            type: 'publicKey',
          },
          {
            name: 'targetGovernanceAuthority',
            type: {
              option: 'publicKey',
            },
          },
          {
            name: 'wormhole',
            type: 'publicKey',
          },
          {
            name: 'validDataSources',
            type: {
              vec: {
                defined: 'DataSource',
              },
            },
          },
          {
            name: 'singleUpdateFeeInLamports',
            type: 'u64',
          },
          {
            name: 'minimumSignatures',
            type: 'u8',
          },
        ],
      },
    },
    {
      name: 'priceUpdateV2',
      type: {
        kind: 'struct',
        fields: [
          {
            name: 'writeAuthority',
            type: 'publicKey',
          },
          {
            name: 'verificationLevel',
            type: {
              defined: 'VerificationLevel',
            },
          },
          {
            name: 'priceMessage',
            type: {
              defined: 'PriceFeedMessage',
            },
          },
          {
            name: 'postedSlot',
            type: 'u64',
          },
        ],
      },
    },
  ],
  types: [
    {
      name: 'PriceFeedMessage',
      type: {
        kind: 'struct',
        fields: [
          {
            name: 'feedId',
            type: {
              array: ['u8', 32],
            },
          },
          {
            name: 'price',
            type: 'i64',
          },
          {
            name: 'conf',
            type: 'u64',
          },
          {
            name: 'exponent',
            type: 'i32',
          },
          {
            name: 'publishTime',
            type: 'i64',
          },
          {
            name: 'prevPublishTime',
            type: 'i64',
          },
          {
            name: 'emaPrice',
            type: 'i64',
          },
          {
            name: 'emaConf',
            type: 'u64',
          },
        ],
      },
    },
    {
      name: 'MerklePriceUpdate',
      type: {
        kind: 'struct',
        fields: [
          {
            name: 'message',
            type: 'bytes',
          },
          {
            name: 'proof',
            type: {
              vec: {
                array: ['u8', 20],
              },
            },
          },
        ],
      },
    },
    {
      name: 'DataSource',
      type: {
        kind: 'struct',
        fields: [
          {
            name: 'chain',
            type: 'u16',
          },
          {
            name: 'emitter',
            type: 'publicKey',
          },
        ],
      },
    },
    {
      name: 'PostUpdateAtomicParams',
      type: {
        kind: 'struct',
        fields: [
          {
            name: 'vaa',
            type: 'bytes',
          },
          {
            name: 'merklePriceUpdate',
            type: {
              defined: 'MerklePriceUpdate',
            },
          },
          {
            name: 'treasuryId',
            type: 'u8',
          },
        ],
      },
    },
    {
      name: 'PostUpdateParams',
      type: {
        kind: 'struct',
        fields: [
          {
            name: 'merklePriceUpdate',
            type: {
              defined: 'MerklePriceUpdate',
            },
          },
          {
            name: 'treasuryId',
            type: 'u8',
          },
        ],
      },
    },
    {
      name: 'VerificationLevel',
      docs: [
        '* This enum represents how many guardian signatures were checked for a Pythnet price update\n * If full, guardian quorum has been attained\n * If partial, at least config.minimum signatures have been verified, but in the case config.minimum_signatures changes in the future we also include the number of signatures that were checked',
      ],
      type: {
        kind: 'enum',
        variants: [
          {
            name: 'Partial',
            fields: [
              {
                name: 'numSignatures',
                type: 'u8',
              },
            ],
          },
          {
            name: 'Full',
          },
        ],
      },
    },
  ],
  errors: [
    {
      code: 6000,
      name: 'InvalidWormholeMessage',
      msg: 'Received an invalid wormhole message',
    },
    {
      code: 6001,
      name: 'DeserializeMessageFailed',
      msg: 'An error occurred when deserializing the message',
    },
    {
      code: 6002,
      name: 'InvalidPriceUpdate',
      msg: 'Received an invalid price update',
    },
    {
      code: 6003,
      name: 'UnsupportedMessageType',
      msg: 'This type of message is not supported currently',
    },
    {
      code: 6004,
      name: 'InvalidDataSource',
      msg: "The tuple emitter chain, emitter doesn't match one of the valid data sources.",
    },
    {
      code: 6005,
      name: 'InsufficientFunds',
      msg: 'Funds are insufficient to pay the receiving fee',
    },
    {
      code: 6006,
      name: 'WrongWriteAuthority',
      msg: "This signer can't write to price update account",
    },
    {
      code: 6007,
      name: 'WrongVaaOwner',
      msg: 'The posted VAA account has the wrong owner.',
    },
    {
      code: 6008,
      name: 'DeserializeVaaFailed',
      msg: 'An error occurred when deserializing the VAA.',
    },
    {
      code: 6009,
      name: 'InsufficientGuardianSignatures',
      msg: 'The number of guardian signatures is below the minimum',
    },
    {
      code: 6010,
      name: 'InvalidVaaVersion',
      msg: 'Invalid VAA version',
    },
    {
      code: 6011,
      name: 'GuardianSetMismatch',
      msg: "Guardian set version in the VAA doesn't match the guardian set passed",
    },
    {
      code: 6012,
      name: 'InvalidGuardianOrder',
      msg: 'Guardian signature indices must be increasing',
    },
    {
      code: 6013,
      name: 'InvalidGuardianIndex',
      msg: 'Guardian index exceeds the number of guardians in the set',
    },
    {
      code: 6014,
      name: 'InvalidSignature',
      msg: 'A VAA signature is invalid',
    },
    {
      code: 6015,
      name: 'InvalidGuardianKeyRecovery',
      msg: "The recovered guardian public key doesn't match the guardian set",
    },
    {
      code: 6016,
      name: 'WrongGuardianSetOwner',
      msg: 'The guardian set account is owned by the wrong program',
    },
    {
      code: 6017,
      name: 'InvalidGuardianSetPda',
      msg: "The Guardian Set account doesn't match the PDA derivation",
    },
    {
      code: 6018,
      name: 'GuardianSetExpired',
      msg: 'The Guardian Set is expired',
    },
    {
      code: 6019,
      name: 'GovernanceAuthorityMismatch',
      msg: 'The signer is not authorized to perform this governance action',
    },
    {
      code: 6020,
      name: 'TargetGovernanceAuthorityMismatch',
      msg: 'The signer is not authorized to accept the governance authority',
    },
    {
      code: 6021,
      name: 'NonexistentGovernanceAuthorityTransferRequest',
      msg: 'The governance authority needs to request a transfer first',
    },
  ],
};
