tact代码:
import "@stdlib/deploy";
import "@stdlib/ownable";
struct RoundInfo {orders: map<Int as uint32, BuyInfo>; sum: Int as uint16; arrLength: Int as uint16;
}
struct BuyInfo {startLuckyNum: Int as uint16; nifiNum: Int as uint16; message BatchSyncOrderMsg {round: Int as uint32;orders: map<Int as uint32, BuyInfo>;
}contract Contract {rounds: map<Int as uint32, RoundInfo>;receive(msg: BatchSyncOrderMsg) {self.requireOwner(); let roundInfo: RoundInfo = self.rounds.get(msg.round)!!; let totalNifiNum: Int = 0;foreach (orderNumber, buyInfo in msg.orders) {roundInfo.orders.set(orderNumber, buyInfo);totalNifiNum += buyInfo.nifiNum;roundInfo.sequence += 1;}}
go调用代码:
type BatchSyncOrderMsg struct {RoundId uint32Orders tlb.HashmapE[tlb.Uint32, tlb.Ref[chainservice.BuyInfo]]
}
func (t TonApiServiceImpl) BatchSyncOrder(ctx context.Context, roundId uint32, orders map[uint32]chainservice.BuyInfo) (string, error) {msg := BatchSyncOrderMsg3{RoundId: roundId,}var keys []tlb.Uint32var values []tlb.Ref[chainservice.BuyInfo]for key, value := range orders {keys = append(keys, tlb.Uint32(key))values = append(values, tlb.Ref[chainservice.BuyInfo]{Value: value})}msg.Orders = tlb.NewHashmapE(keys, values)return t.InvokeContract(ctx, roundContractConfig.ContractAddress, BatchSyncOrderMethodId, msg, 51_000_000)
}func TestTonApiServiceImpl_BatchSyncOrder(t *testing.T) {var boughtRoundNum uint16 = 0var startLuckNum uint16 = 1orders := make(map[uint32]chainservice.BuyInfo)for i := 1; i <= int(ordersMax); i++ {buyNum := maxRoundNum / uint16(ordersMax)if boughtRoundNum+buyNum > maxRoundNum {buyNum = maxRoundNum - boughtRoundNum}if buyNum == 0 {break}orderID := StartOrderID + uint32(i)orders[orderID] = chainservice.BuyInfo{StartLuckNum: startLuckNum,Amount: buyNum,}startLuckNum += buyNumboughtRoundNum += buyNum}txHash, err := tonService.BatchSyncOrder(context.Background(), RoundId, orders, nil)if err != nil {t.Error(err)}fmt.Println("txHash:", txHash)}
这边截取部分代码,