@@ -93,6 +93,40 @@ fn resolveAccountInfo(comptime field_name: []const u8, accounts: anytype) *const
9393 @compileError ("account field must be AccountInfo or type with toAccountInfo(): " ++ field_name );
9494}
9595
96+ fn toAccountInfo (value : anytype ) * const AccountInfo {
97+ const TargetType = @TypeOf (value );
98+ if (TargetType == AccountInfo ) {
99+ @compileError ("AccountInfo values are not supported; pass a pointer" );
100+ }
101+ if (@typeInfo (TargetType ) == .pointer ) {
102+ const ChildType = @typeInfo (TargetType ).pointer .child ;
103+ if (ChildType == AccountInfo ) {
104+ return value ;
105+ }
106+ if (@hasDecl (ChildType , "toAccountInfo" )) {
107+ return value .toAccountInfo ();
108+ }
109+ }
110+ if (@hasDecl (TargetType , "toAccountInfo" )) {
111+ return value .toAccountInfo ();
112+ }
113+ @compileError ("value must be AccountInfo pointer or type with toAccountInfo()" );
114+ }
115+
116+ fn mintDecimals (value : anytype ) u8 {
117+ const TargetType = @TypeOf (value );
118+ if (@hasField (TargetType , "data" )) {
119+ return value .data .decimals ;
120+ }
121+ if (@typeInfo (TargetType ) == .pointer ) {
122+ const ChildType = @typeInfo (TargetType ).pointer .child ;
123+ if (@hasField (ChildType , "data" )) {
124+ return value .* .data .decimals ;
125+ }
126+ }
127+ @compileError ("mint account must expose data.decimals" );
128+ }
129+
96130// ============================================================================
97131// TokenAccount Wrapper
98132// ============================================================================
@@ -552,6 +586,28 @@ pub fn transferChecked(
552586 return invokeInstruction (& ix , infos [0.. ], null );
553587}
554588
589+ /// Invoke SPL Token transferChecked using mint wrapper decimals.
590+ pub fn transferCheckedWithMint (
591+ token_program : * const AccountInfo ,
592+ source : * const AccountInfo ,
593+ mint_account : anytype ,
594+ destination : * const AccountInfo ,
595+ authority : * const AccountInfo ,
596+ amount : u64 ,
597+ ) ? TokenCpiError {
598+ const mint_info = toAccountInfo (mint_account );
599+ const decimals = mintDecimals (mint_account );
600+ return transferChecked (
601+ token_program ,
602+ source ,
603+ mint_info ,
604+ destination ,
605+ authority ,
606+ amount ,
607+ decimals ,
608+ );
609+ }
610+
555611/// Invoke SPL Token mintTo.
556612pub fn mintTo (
557613 token_program : * const AccountInfo ,
0 commit comments