Esempio n. 1
0
def if_stake():
    now_time = GetTime()
    now_period = issue()  # 当期
    old_time = query_period_time(now_period)
    if now_time - old_time > KEY_GAME_TIME_FOR_A_ROUND:
        return True
    return False
Esempio n. 2
0
def init():
    if Get(KEY_OWNER):
        raise Exception("已经初始化过")
    time = GetTime()
    Put(KEY_OWNER, OWNER)  # Put 合约的 owenr
    now_period = get_period_generation()
    Put(KEY_GAME_PERIOD, now_period)  # Put 最开始的期号
    time_key = concat(KEY_GAME_TIME, now_period)
    Put(time_key, time)             # Put 最开始的期号时间戳
    period_ls = [now_period]
    PutArray(KEY_GAME_LIST, period_ls)  # Put 期数列表
Esempio n. 3
0
def get_period_generation():  # 期数生成器
    now_time = GetTime()
    now_time = TimeFormat(now_time)  # 格式 2019-09-25 17:15:30
    time = split(now_time, " ")  # 分成两个元素
    time_01 = time[0]  # 年月日
    time_02 = time[1]  # 分时秒
    time_01 = split(time_01, "-")
    time_02 = split(time_02, ":")
    a = join("", time_01)
    b = concat(concat(time_02[0], time_02[1]), time_02[2])
    period = concat(a, b)  # 拼接
    return period
Esempio n. 4
0
def stake(game_type, operation_type):  # 用户购买
    sender = GetTxSender()
    user_list = emoji_random()  # 随机表情列表
    period = get_period_generation()  # 当期期号

    if query_user_time_condition(sender):  # 查询是否过去5秒
        stake_info_key = concat(concat(KEY_USER_STAKE_INFO, sender), period)
        PutArray(stake_info_key, user_list)  # Put 用户购买后产生的列表

        # Put 用户的投注列表,最多保持24个记录
        stake_list = query_user_stake_list(sender)
        stake_list_key = concat(KEY_USER_STAKE_LIST, sender)
        if len(stake_list) == 0:
            PutArray(stake_list_key, [period])
        if len(stake_list) == 24:
            new_stake_list = []
            for i in range(len(stake_list)):
                if i != len(stake_list) - 1:
                    new_stake_list.append(stake_list[i + 1])
            new_stake_list.append(period)
            PutArray(stake_list_key, new_stake_list)
        else:
            new_stake_list = []
            for i in range(len(stake_list)):
                new_stake_list.append(stake_list[i])
            new_stake_list.append(period)
            PutArray(stake_list_key, new_stake_list)

        period_type_key = concat(concat(KEY_USER_PERIOD_TYPE, sender), period)
        Put(period_type_key, game_type)  # Put 用户当期期数的类型,即表情包
        amount = 200 * GARD_FACTOR

        if BalanceOf(sender, [GARD_DENOM])[0] < amount:
            raise Exception("余额不足")

        inject_stake_pool(amount)  # 给合约地址转钱
        add_user_stake_amount(sender, amount)  # 加入自己的消费额中
        time = GetTime()
        period_time_key = concat(concat(KEY_USER_PERIOD_TIME, sender), period)
        Put(period_time_key, time)  # Put 用户期数的时间戳

        save_period_key = concat(KEY_SAVE_PERIOD, sender)
        if operation_type == 1:  # 1为 直接stake
            save_period_key = concat(KEY_SAVE_PERIOD, sender)
            PutArray(save_period_key, [])  # 把用户保存的表清空
        if operation_type != 1:  # 0 为继续
            save_period_list = GetArray(save_period_key)  # 查询用户保存的期号列表
            if len(save_period_list) == 0:
                raise Exception("当期不是继续的场景")

        return True
    else:
        raise Exception("请等待时间")
def get_periods_exceeds(address, rd):  # 返回一个一天内的投注列表
    stake_all_key = concat(KEY_MY_ALL_STAKE, address)  # 我所有的投注期号记录,只记录三天以内的
    stake_all_value = GetArray(stake_all_key)  # 期数列表
    now_time = GetTime()
    list = []
    for i in range(len(stake_all_value)):
        time = query_periods_time(stake_all_value[i])  # 根据期数查询时间戳
        sub = now_time - time
        if rd != stake_all_value[i] and 0 < sub <= 60 * 60 * 24 * 1:  # 小于1天和不重复的
            list.append(stake_all_value[i])
    list.append(rd)
    return list
Esempio n. 6
0
def transfer(from_address, to_address, amount):
    # check if address freezing
    timestamp = GetTime()
    freeze_out_end = Get(concat(KEY_FREEZE_OUT, from_address))
    freeze_in_end = Get(concat(KEY_FREEZE_IN, to_address))
    if timestamp < freeze_out_end or timestamp < freeze_in_end:
        raise Exception("There is currently a frozen address.")

    #call StandardTokenContract transfer
    param = state('string:transfer', '[string:', from_address, 'string:',
                  to_address, 'int:', amount, ']')
    StandardTokenContract(param)
    return True
Esempio n. 7
0
def query_box_status():  # 查看盒子当前状态
    now_time = GetTime()
    interest_amount = query_interest_balance()
    deposit_amount = query_deposit_amount()

    if now_time <= BOX_START_TIME:  # 小于开始时间为可存入利息的发行期
        return ISSUE_STATUS
    if interest_amount == BOX_INTEREST and BOX_START_TIME < now_time <= BOX_LOCK_TIME:  # 利息等于该存入的利息,并且当前时间大于开始时间,小于开始计息的时间,为可存入存款的存款吸纳期
        return DEPOSIT_STATUS
    if deposit_amount > BOX_BOTTOM_LINE and BOX_LOCK_TIME < now_time <= BOX_END_TIME:  # 存款数量大于最小存款数,并且当前时间大于存款吸纳期,小于最后的结束时间,为存款的锁定期
        return LOCK_STATUS
    if interest_amount == BOX_INTEREST and deposit_amount > BOX_BOTTOM_LINE and now_time > BOX_END_TIME:  # 存款盒子结束,可以取出总收益
        return BOX_END

    return BOX_FAILED
Esempio n. 8
0
def init():
    if Get(KEY_OWNER):
        return False

    now_time = GetTime()
    Put(KEY_OWNER, OWNER)  # 添加owner 地址
    Put(KEY_NUMBER_DRAWS, get_period_generation())  # 当前期数 ,格式:20190925
    draws_time_key = concat(Get(KEY_NUMBER_DRAWS), KEY_PERIODS_TIME)
    Put(draws_time_key, now_time)  # 当前期号对应的时间戳
    note_key = concat(Get(KEY_NUMBER_DRAWS), KEY_CALUCLATION_NOTE)
    Put(note_key, 0)  # 投注数
    key = concat(Get(KEY_NUMBER_DRAWS), KEY_DRAWS_PID)
    Put(key, get_pid())  # 初始期数的pid
    PutArray(KEY_PERIODS_LIST, [Get(KEY_NUMBER_DRAWS)])  # 存放一天内的期号列表
    return True
Esempio n. 9
0
def query_user_time_condition(address):  # 查询是否距离最后一期,是否过去5秒
    if not IsValid(address):
        raise Exception("地址格式错误")

    stake_list = query_user_stake_list(address)
    if len(stake_list) == 0:
        return True

    last_period = stake_list[len(stake_list) - 1]  # 最后一期
    old_time = query_user_period_time(address, last_period)  # 最后一期的时间戳
    now_time = GetTime()
    if now_time - old_time > GAME_TIME_FOR_A_ROUND:
        return True

    return False
Esempio n. 10
0
def save(number):  # 用户保存号码
    sender = GetTxSender()
    numbers = split(number, "-")
    stake_list = query_user_stake_list(sender)  # 查询用户的投注列表
    if len(stake_list) == 0:
        raise Exception("当期用户没有投注")

    last_stake = stake_list[len(stake_list) - 1]

    old_time = query_user_period_time(sender, last_stake)  # 最后一期的时间戳
    now_time = GetTime()
    if now_time - old_time > 30:
        raise Exception("当期已经过了时间,无法标记")

    last_stake_info = query_user_stake_info(sender, last_stake)  # 查询用户该期的表单

    if numbers[0] != numbers[1]:
        raise Exception("标记的不是同一个")
    num = 0
    for i in range(len(last_stake_info)):
        if last_stake_info[i] == numbers[0]:
            num = num + 1
    if num < 2:
        raise Exception("标记的号码在表情中未出现两次")

    save_num_key = concat(concat(KEY_SAVE_NUMBER, sender), last_stake)
    Put(save_num_key, number)  # 存取用户保存的号码

    save_period_key = concat(KEY_SAVE_PERIOD, sender)
    save_period = GetArray(save_period_key)

    new_save = []
    if len(save_period) != 0:
        for i in range(len(save_period)):
            new_save.append(save_period[i])
    new_save.append(last_stake)
    PutArray(save_period_key, new_save)  # 存取用户保存的期号

    return True
Esempio n. 11
0
def remaining_time(sender, period):  # 查询用户该期剩余时间
    time = query_user_period_time(sender, period)
    now_time = GetTime()
    end_time = time + 30
    return end_time - now_time
Esempio n. 12
0
def stake(mode, multipe, number):  # 用户投注
    ls = []
    now_time = GetTime()
    for i in range(len(number)):
        ls.append(int(number[i]))
    if mode == 0:       # 散值
        for i in range(len(ls)):
            if ls[i] > 6:
                raise Exception("每个数字在1到6之间")
    if mode == 1:       # 和值
        if int(number) < 3 or int(number) > 18:
            raise Exception("最大的和值为18")

    if multipe > 99 or multipe < 1:
        raise Exception("不支持的倍数")

    if if_stake():
        num = draw_number()     # 开启下一期前,开放上一期的中奖号码
        draw_num_key = concat(KEY_GAME_PRIZE, issue())
        Put(draw_num_key, num)      # Put 该期的中奖号码
        update_period = get_period_generation()
        Put(KEY_GAME_PERIOD, update_period)  # Put 新的期数
        time_key = concat(KEY_GAME_TIME, update_period)
        Put(time_key, now_time)         # Put新期数的时间戳
        period_list = []
        ls = GetArray(KEY_GAME_LIST)
        for i in range(len(ls)):
            if len(ls) < 24:
                period_list.append(ls[i])
            if len(ls) >= 24 and i < 23:
                period_list.append(ls[i + 1])
        period_list.append(update_period)
        PutArray(KEY_GAME_LIST, period_list)  # Put 24个期数列表

    sender = GetTxSender()
    period = issue()
    amount = multipe * STAKE_AMOUNT

    if BalanceOf(sender, [GARD_DENOM])[0] < amount:
        raise Exception("余额不足")

    if len(query_user_stake(sender, period)) > 0:
        raise Exception("当期已经购买过")
    user_stake_key = concat(concat(KEY_USER_STAKE, sender), period)
    if mode == 0:  # 0 为散号
        PutArray(user_stake_key, [str(mode), str(multipe), number, str(amount)])
    if mode == 1:  # 1 为和值
        PutArray(user_stake_key, [str(mode), str(multipe), number, str(amount)])

    user_stake_list = []
    ls = query_user_stake_list(sender)
    for i in range(len(ls)):
        if len(ls) < 24:
            user_stake_list.append(ls[i])
        if len(ls) >= 24 and i < 23:
            user_stake_list.append(ls[i + 1])
    user_stake_list.append(period)
    user_stake_list_key = concat(KEY_USER_ISSUE, sender)  # Put 24个用户投注的期数列表
    PutArray(user_stake_list_key, user_stake_list)

    stake_all_amount = query_user_stake_amount(sender)
    stake_amount_key = concat(KEY_USER_STAKE, sender)
    if not stake_all_amount:
        Put(stake_amount_key, amount)
    else:
        stake_all_amount = stake_all_amount + amount
        Put(stake_amount_key, stake_all_amount)         # Put 用户的总共投注金额

    inject_stake_pool(amount)
    return True
Esempio n. 13
0
def withdraw(draws):  # 根据期数兑奖
    sender = GetTxSender()
    now_draws = Get(KEY_NUMBER_DRAWS)  # 当前期数
    time = GetTime()  # 当前时间
    last_number = GetArray(KEY_LAST_NUMBER_DRAWS)

    if query_user_withdraw_status(draws, sender):
        raise Exception("当期已经兑过奖")

    if len(last_number) == 0:
        raise Exception("当前期还无法兑奖")
    last_draws_time = int(last_number[1])  # 最后一期时间
    if int(draws) >= int(now_draws):
        raise Exception("当前期无法兑奖")

    if len(query_users_number(sender, draws)) == 0:
        raise Exception("当前期数没有投注")

    if time - last_draws_time >= 60 * 60 * 24 * 1:  # 计算是否超过一天
        raise Exception("当前已经超过一天未兑奖,无法兑现")

    amount_award_list = query_amount_award(draws)  # 查询每一期的中奖额度信息
    lottery_sys_pool = int(amount_award_list[0])  # 开奖时的系统池额度
    lottery_users_pool = int(amount_award_list[1])  # 开奖时的用户池额度
    fist_pool_amount = int(amount_award_list[2])  # 开奖时候的一等奖额度
    second_pool_amount = int(amount_award_list[3])  # 开奖时候的二等奖额度
    thrid_pool_amount = int(amount_award_list[4])  # 开奖时候的三等奖额度

    numbers = query_users_number(sender, draws)  # 用户投注的所有号码
    withdraws_all_amount = 0  # 应该获取到的所有奖金额度
    user_pool_amount = 0  # 应该要减去的用户奖池额度
    sys_pool_amount = 0  # 应该要减去的系统奖池额度

    fist_withdraws_amount = 0  # 用户兑奖的一等奖额度
    second_withdraws_amount = 0  # 用户兑奖的二等奖额度
    thrid_withdraws_amount = 0  # 用户兑奖的三等奖额度

    for num in numbers:  # 遍历所有号码
        if first_prize_match(draws, num):
            fist_amount = query_users_number_amount(sender, draws, num)
            withdraws_fist_amount = fist_amount * lottery_users_pool / 10 * 4 / fist_pool_amount + lottery_sys_pool / 1000
            user_pool_amount = user_pool_amount + fist_amount * lottery_users_pool / 10 * 4 / fist_pool_amount
            sys_pool_amount = sys_pool_amount + lottery_sys_pool / 1000
            withdraws_all_amount = withdraws_all_amount + withdraws_fist_amount
            fist_withdraws_amount = fist_withdraws_amount + withdraws_fist_amount
            continue
        if second_prize_match(draws, num):
            second_amount = query_users_number_amount(sender, draws, num)
            withdraw_second_amount = second_amount * lottery_users_pool / 10 * 2 / second_pool_amount
            withdraws_all_amount = withdraws_all_amount + withdraw_second_amount
            user_pool_amount = user_pool_amount + withdraw_second_amount
            second_withdraws_amount = second_withdraws_amount + withdraw_second_amount
            continue
        if thrid_prize_match(draws, num):
            thrid_amount = query_users_number_amount(sender, draws, num)
            withdraws_thrid_amount = thrid_amount * lottery_users_pool / 10 * 1 / thrid_pool_amount
            withdraws_all_amount = withdraws_all_amount + withdraws_thrid_amount
            user_pool_amount = user_pool_amount + withdraws_thrid_amount
            thrid_withdraws_amount = thrid_withdraws_amount + withdraws_thrid_amount
            continue

    if withdraws_all_amount > 0:  # 如果中奖则给其转账,并判断邀请逻辑
        inviter_address = query_my_inviter(sender)  # 上级地址
        event_pool = ppool()  # 查询活动奖池额度
        sys_pool = syspool()  # 查询系统奖池额度
        user_pool = stakepool()  # 查询活动奖池
        if inviter_address and event_pool > 0:  # 如果存在邀请者,并或活动奖池大于0

            rd = int(GetRand(1))  # 随机字符串
            pted_event_amount = event_pool / 1000 + event_pool * rd / 1000  # 分配随机 0.1% 到 1% 不等

            sr_key = concat(KEY_SHARED_REWARD, sender)  # 被邀请的被推广奖励
            sender_reward_list = GetArray(sr_key)
            if len(sender_reward_list) == 0:
                PutArray(sr_key, [str(0), str(pted_event_amount)])
            else:
                promotion_amount = sender_reward_list[0]  # 推广奖励
                promoted_amount = int(sender_reward_list[1])  # 被推广奖励
                PutArray(sr_key, [
                    promotion_amount,
                    str(promoted_amount + pted_event_amount)
                ])  # 提交自己的被推广奖励

            rd = int(GetRand(1))  # 随机字符串
            pro_event_amount = event_pool / 1000 + event_pool * rd / 1000  # 分配随机 0.1% 到 1% 不等

            sr_key = concat(KEY_SHARED_REWARD, inviter_address)  # 推广者的推广奖励
            invited_reward_list = GetArray(sr_key)  # 邀请者
            if len(invited_reward_list) == 0:
                PutArray(sr_key, [str(pro_event_amount), str(0)])
            else:
                promotion_amount = int(invited_reward_list[0])  # 推广奖励
                promoted_amount = invited_reward_list[1]  # 被推广奖励
                PutArray(sr_key, [
                    str(promotion_amount + pro_event_amount), promoted_amount
                ])  # 提交推广者的推广奖励

            ContractBalanceSend(sender, GARD_DENOM,
                                pted_event_amount)  # 给投注人转入被邀请奖励
            ContractBalanceSend(inviter_address, GARD_DENOM,
                                pro_event_amount)  # 给邀请人转推广奖励

            now_event_pool = event_pool - pted_event_amount - pro_event_amount
            Put(KEY_EVENT_POOL, now_event_pool)  # 更新活动奖池额度

        issue_account = query_issue_account()  # 查询总的中奖额度信息
        withdraw_account = query_withdraw_account(draws)  # 查询该兑奖期的兑奖额度信息
        withdraw_account_key = concat(KEY_ISSUE_ACCOUNT, draws)
        if len(issue_account) != 0:
            old_fist = int(issue_account[0])
            old_second = int(issue_account[1])
            old_thrid = int(issue_account[2])
            PutArray(KEY_ISSUE_ACCOUNT, [
                str(old_fist + fist_withdraws_amount),
                str(old_second + second_withdraws_amount),
                str(old_thrid + thrid_withdraws_amount)
            ])  # 提交总的中奖额度信息
        else:
            PutArray(KEY_ISSUE_ACCOUNT, [
                str(fist_withdraws_amount),
                str(second_withdraws_amount),
                str(thrid_withdraws_amount)
            ])  # 提交总的中奖额度信息

        if len(withdraw_account) != 0:
            old_withdraws_fist = int(withdraw_account[0])
            old_withdraws_second = int(withdraw_account[1])
            old_withdraws_thrid = int(withdraw_account[2])
            PutArray(withdraw_account_key, [
                str(old_withdraws_fist + fist_withdraws_amount),
                str(old_withdraws_second + second_withdraws_amount),
                str(old_withdraws_thrid + thrid_withdraws_amount)
            ])  # 提交指定期的兑奖额度信息
        else:
            PutArray(withdraw_account_key, [
                str(fist_withdraws_amount),
                str(second_withdraws_amount),
                str(thrid_withdraws_amount)
            ])  # 提交指定期的兑奖额度信息

        Put(KEY_USER_POOL, user_pool - user_pool_amount)  # 提交用户奖池
        Put(KEY_SYSTEM_POOL, sys_pool - sys_pool_amount)  # 提交系统奖池额度

        stake_count_key = concat(KEY_MY_STAKE_COUNT,
                                 sender)  # 我的投注统计,包括投注的总 token,和获取奖励的总 token
        count_value = GetArray(stake_count_key)
        betting_amount = count_value[0]  # 总共投注
        reward_amount = int(count_value[1])  # 获得奖励
        PutArray(stake_count_key,
                 [betting_amount,
                  str(reward_amount + withdraws_all_amount)])  # 提交自己投注记录

        key = concat(concat(KEY_REDEMPTION_USER, draws), sender)  # 兑奖信息
        PutArray(key, [str(time), str(withdraws_all_amount)])  # 提交用户的兑奖信息

        withdraw_status_key = concat(concat(KEY_WITZHDRAWS_STATUS, draws),
                                     sender)
        Put(withdraw_status_key, True)  # 将用户此期的兑奖状态改成true
        ContractBalanceSend(sender, GARD_DENOM,
                            withdraws_all_amount)  # 给投注人转入获取的奖励
        return True
    else:
        raise Exception("当前投注没有中奖")
Esempio n. 14
0
def get_peroid_pid():  # 计算是否过去五分钟,五分钟为一个整数倍
    now_time = GetTime()
    pid = ((now_time - GMAE_START_TIME) - (
            (now_time - GMAE_START_TIME) % KEY_GAME_TIME_FOR_A_ROUND)) / KEY_GAME_TIME_FOR_A_ROUND
    return pid
Esempio n. 15
0
def draw():  # 开奖
    if not if_lottery():
        raise Exception("当前期数还在进行时")
    draws = Get(KEY_NUMBER_DRAWS)  # 当前期数
    sender = GetTxSender()
    if BalanceOf(sender, [GARD_DENOM])[0] <= 0:
        raise Exception("当前账户没有持有 GARD,无法开奖")

    sys_pool = syspool()  # 当前的系统奖池额度
    now_users_pool = stakepool()  # 当前用户池额度

    now_time = GetTime()  # 获取当前时间
    prize_number = GetRand(3)  # 生成中奖号码
    prize_key = concat(KEY_PRIZE_NUMBER, draws)
    Put(prize_key, prize_number)  # 记录每一期的中奖号码

    rand_amount = int(GetRand(4))  # 生成随机开奖奖励 amount
    lettry_amount = rand_amount * GARD_FACTOR

    draws_lettry_key = concat(KEY_LOTTERY_USER, draws)
    PutArray(draws_lettry_key,
             [sender, str(now_time), str(lettry_amount)])  # 增加开奖人记录

    now_users_pool = now_users_pool - lettry_amount
    Put(KEY_USER_POOL, now_users_pool)  # 先从用户奖池扣除这一部分开奖奖金

    # 算出当前中奖人数有多少个
    note_key = concat(draws, KEY_CALUCLATION_NOTE)
    note_num = Get(note_key)  # 当期有多少个投注数, 返回是个int
    fist_amount = 0  # 第一名的总额度
    second_amount = 0  # 二等奖中奖总token额度
    thrid_amount = 0  # 三等奖中奖总token额度
    for i in range(1, note_num + 1):
        betting_info = query_bets_note(draws, str(i))
        number = betting_info[2]
        if first_prize_match(draws, number):
            fist_amount = int(betting_info[3]) + fist_amount
            continue
        if second_prize_match(draws, number):
            second_amount = int(betting_info[3]) + second_amount
            continue
        if thrid_prize_match(draws, number):
            thrid_amount = int(betting_info[3]) + thrid_amount
            continue

    award_key = concat(draws, KEY_AMOUNT_EACH_AWARD)  # 中奖额度信息
    PutArray(award_key, [
        str(sys_pool),
        str(now_users_pool),
        str(fist_amount),
        str(second_amount),
        str(thrid_amount)
    ])  # 记录每一期的中奖额度信息

    PutArray(KEY_LAST_NUMBER_DRAWS, [draws, str(now_time)])  # 最后一期期数和期数结束时间

    draws = get_period_generation()
    Put(KEY_NUMBER_DRAWS, draws)  # 期数变更

    key = concat(draws, KEY_DRAWS_PID)
    now_pid = get_pid()
    Put(key, now_pid)  # 更改这期的pid

    draws_time_key = concat(draws, KEY_PERIODS_TIME)
    Put(draws_time_key, now_time)  # 当前期号对应的时间戳

    all_periods = query_periods_list()
    list = []
    for i in range(len(all_periods)):
        list.append(all_periods[i])
    if len(list) == 24:
        list = list[1:]
    list.append(draws)
    PutArray(KEY_PERIODS_LIST, list)  # 所有列表 24 个

    ContractBalanceSend(sender, GARD_DENOM, lettry_amount)  # 给开奖人奖金
    return True
Esempio n. 16
0
def stake(number, amount, invitation_code):  # 用户投注
    if len(number) != 3:
        raise Exception("请输入正确的投注号码")
    if amount < 10000 * GARD_FACTOR:
        raise Exception("每次投注不能少于 10000gard")
    if if_lottery():
        raise Exception('当前期已经结束,处于开奖期,前往开奖')

    sender_address = GetTxSender()  # 当前调用地址
    if BalanceOf(sender_address, [GARD_DENOM])[0] < 10000 * GARD_FACTOR:
        raise Exception("账户余额不足投注")

    now_time = GetTime()  # 当前时间
    rd = Get(KEY_NUMBER_DRAWS)  # 当前期数
    user_bets_key = concat(concat(KEY_USER_BETS, sender_address), rd)  # 用户投注次数
    user_bets = Get(user_bets_key)

    if not user_bets:
        Put(user_bets_key, 1)
    else:
        if user_bets >= 3:
            raise Exception("当前用户投注次数超过三次")
        else:
            Put(user_bets_key, user_bets + 1)

    now_user_pool = stakepool()  # 当前用户池额度
    if not now_user_pool:
        Put(KEY_USER_POOL, amount)
    else:
        Put(KEY_USER_POOL, amount + now_user_pool)  # 添加入总的用户池额度

    now_issue_stakepool = query_issue_stakepool(rd)
    issue_stakepool_key = concat(rd, KEY_USER_POOL)  # 当期的用户池总额度
    if now_issue_stakepool > 0:
        Put(issue_stakepool_key, now_issue_stakepool + amount)
    else:
        Put(issue_stakepool_key, amount)

    note_key = concat(rd, KEY_CALUCLATION_NOTE)
    num_note = Get(note_key)  # 获取投注数
    now_note = num_note + 1  # 每个用户投注一次,次数增加一次
    Put(note_key, now_note)  # 记录每一期的总的投注数
    # 投注数每次都增加,避免出现一个过大的列表

    betting_record_key = concat(concat(KEY_NUMBER_BETS_PEER_ISSUE, rd),
                                str(now_note))  # 每一期的投注记录 key

    user_info = [str(now_time), sender_address, number, str(amount)]  # 保存为一个数组
    Assert(user_info[3] == str(amount), "erro")  # 输出address
    PutArray(betting_record_key, user_info)  # 记录投注记录

    number_key = concat(concat(rd, KEY_BETTING_NUMBER),
                        sender_address)  # 用户的投注号码
    amount_key = concat(concat(concat(rd, KEY_BETTING_AMOUNT), number),
                        sender_address)  # 记录用户投注的金额
    stake_all_key = concat(KEY_MY_ALL_STAKE,
                           sender_address)  # 我所有的投注记录,只记录三天以内的

    stake_list = GetArray(stake_all_key)
    if len(stake_list) == 0:
        ls = []
        ls.append(rd)
        PutArray(stake_all_key, ls)  # 记录我的投注记录期号
    else:
        periods_exceeds_list = get_periods_exceeds(sender_address,
                                                   rd)  # 返回去掉一天外的数组
        PutArray(stake_all_key, periods_exceeds_list)

    numbers = GetArray(number_key)
    if len(numbers) == 0:
        PutArray(number_key, [number])  # 记录用户的投注号码
        Put(amount_key, amount)  # 记录用户对这个号码的投注金额
    else:
        ls = []
        existed = False
        for i in range(len(numbers)):
            ls.append(numbers[i])
            if numbers[i] == number:
                balance = query_users_number_amount(sender_address, rd, number)
                balance_amount = balance + amount
                Put(amount_key, balance_amount)
                existed = True
        if not existed:
            ls.append(number)
            PutArray(number_key, ls)
            Put(amount_key, amount)  # 记录用户对这个号码的投注金额

    invited_key = concat(KEY_INVITED_RECORD, sender_address)  # 被邀请记录
    invited = Get(invited_key)
    invitation_user = query_invitation_code_user(invitation_code)  # 生成邀请码的地址
    invitation_key = concat(KEY_INVITATION_RECORD, invitation_user)  # 上级邀请记录
    if len(
            invitation_code
    ) == 4 and not invited and invitation_user and invitation_user != sender_address:
        Put(invited_key, invitation_user)  # 提交被邀请记录
        invitation_list_value = GetArray(invitation_key)
        invitation_list = []
        for i in range(len(invitation_list_value)):
            invitation_list.append(invitation_list_value[i])
        invitation_list.append(sender_address)
        PutArray(invitation_key,
                 invitation_list)  # 提交邀请人的邀请记录,由于可以邀请很多人,所有是个列表

    stake_count_key = concat(
        KEY_MY_STAKE_COUNT,
        sender_address)  # 我的投注统计,包括投注的总 token,和获取奖励的总 token
    count_value = GetArray(stake_count_key)
    if len(count_value) == 0:
        PutArray(stake_count_key, [str(amount), str(0)])
    if len(count_value) == 2:
        betting_amount = int(count_value[0])  # 总共投注
        reward_amount = int(count_value[1])  # 获得奖励
        PutArray(stake_count_key,
                 [str(betting_amount + amount),
                  str(reward_amount)])  # 提交自己投注记录

    ContractBalanceInject(sender_address, GARD_DENOM, amount)
    return True
Esempio n. 17
0
def get_pid():  # 获取当前期数pid,主要用于判断是否已经过了一小时
    time = GetTime()
    pid = ((time - KEY_GAME_START_TIME) - (time - KEY_GAME_START_TIME) %
           KEY_GAME_TIME_FOR_A_ROUND) / KEY_GAME_TIME_FOR_A_ROUND
    return pid
Esempio n. 18
0
def get_call_pid():  # 每15秒叫号一次
    now_time = GetTime()
    pid = ((now_time - GMAE_START_TIME) - (
            (now_time - GMAE_START_TIME) % KEY_GAME_TIME_FOR_CALL_NUMBER)) / KEY_GAME_TIME_FOR_CALL_NUMBER
    return pid
Esempio n. 19
0
def stake(multiple):  # 用户购买卡单
    if multiple != 1 and multiple != 2 and multiple != 5 and multiple != 10:
        raise Exception("只支持一倍,两倍,五倍,十倍")

    sender = GetTxSender()  # 当前用户

    if BalanceOf(sender, [GARD_DENOM])[0] < 200 * GARD_FACTOR:
        raise Exception("当前余额不足购买")

    now_time = GetTime()

    if not issue():  # 如果当期没有期数
        period = get_period_generation()
        Put(KEY_GAME_PERIOD, period)  # Put 初始的期号
        pid_key = concat(KEY_GAME_PID, period)
        Put(pid_key, get_peroid_pid())  # Put 初始期号的 pid
        time_key = concat(KEY_ISSUE_TIME, period)
        Put(time_key, now_time)  # Put 初始的时间戳

    if if_update_period():  # 已经过了五分钟 返回 true
        period = get_period_generation()  # 新的期号
        Put(KEY_GAME_PERIOD, period)  # Put 新的期号
        now_pid = get_peroid_pid()  # 当前 pid
        pid_key = concat(KEY_GAME_PID, period)
        Put(pid_key, now_pid)  # Put 新的期号的pid
        time_key = concat(KEY_ISSUE_TIME, period)
        Put(time_key, now_time)  # Put 新的期号的时间戳

    now_period = Get(KEY_GAME_PERIOD)  # 当前期

    table_generation = get_table_generation()  # 获取表格
    period_lottery_key = concat(concat(KEY_USER_LOTTERY, sender), now_period)
    user_table = query_user_table_generation(sender, now_period)
    if len(user_table) > 0:
        raise Exception("当期已经买过卡单")

    PutArray(period_lottery_key, table_generation)  # 如果没有购买过,则提交当前表单

    stake_key = concat(KEY_USER_STAKE, sender)
    stake_list = GetArray(stake_key)  # 查询用户的投注列表

    ls = []
    if len(stake_list) == 0:
        ls.append(now_period)
    if len(stake_list) == 24:
        for i in range(len(stake_list)):
            if i != len(stake_list) - 1:
                ls.append(stake_list[i + 1])
        ls.append(now_period)
    if 0 < len(stake_list) < 24:
        for i in range(len(stake_list)):
            ls.append(stake_list[i])
        ls.append(now_period)

    PutArray(stake_key, ls)  # 只记录用户的24期

    stake_amount = stakepool()
    if not stake_amount:
        Put(KEY_STAKE_POOL, 200 * GARD_FACTOR)
    else:
        stake_amount = stake_amount + 200 * GARD_FACTOR
        Put(KEY_STAKE_POOL, stake_amount)  # put 投注池子

    multiple_key = concat(concat(KEY_MULTIPLE, sender), now_period)  # 用户该期的倍数

    Put(multiple_key, multiple)

    call_numbers = query_period_call_number(now_period)  # 返回一个列表, 查询本期的叫号列表
    call_number_key = concat(KEY_GAME_PERIOD_CALL_NUMBER, now_period)
    if len(call_numbers) == 0:
        PutArray(call_number_key, call_number())  # Put 本期的叫号号码

    amount = multiple * 200 * GARD_FACTOR
    stake_amount_key = concat(KEY_USER_STAKE_AMOUNT, sender)
    user_stake_amount = query_user_stake_amount(sender)
    if not user_stake_amount:
        Put(stake_amount_key, amount)  # Put 用户总共购买过的金额
    else:
        user_stake_amount = user_stake_amount + amount
        Put(stake_amount_key, user_stake_amount)

    user_multiple_key = concat(concat(KEY_USER_ISSUE_MULTIPLE, sender), now_period)  # 用户当期购买的倍数
    Put(user_multiple_key, multiple)

    ContractBalanceInject(sender, GARD_DENOM, amount)  # 每次投注花费200个gard

    return True