Buxton received a full no-trade clause in the deal and will be paid $500,000 every time he reaches 502, 533, 567, 600 and 625 plate appearances, the sources said.
He also has MVP bonuses in each year of the deal: $8 million for finishing first, $7 million for finishing second, $6 million for third, $5 million for fourth, $4 million for fifth and $3 million for finishing in sixth through 10th place, the sources said.
He had been scheduled to become an unrestricted free agent after the 2022 season.
Buxton set career bests last season with a .306 batting average and 19 home runs but was limited to 65 games because of injuries.
Because of various injuries, he has played in more than 100 games just once in his career, in 2017, when he appeared in 140 games and won his only Gold Glove Award. That was also the only season he has reached more than 500 plate appearances (511).
For his career, Buxton has a .248 average, 70 home runs and 204 RBIs in seven seasons, all with the Twins.