feat(mall): 实现 VIP购买功能
- 新增 VIP 购买相关接口和页面
- 实现 VIP等级和过期时间的更新
- 添加充值订单的处理逻辑
- 实现上级返利的功能
- 优化会员信息展示
38 files added
56 files modified
| | |
| | | </properties> |
| | | |
| | | <dependencies> |
| | | |
| | | <!-- 区块链模块--> |
| | | <dependency> |
| | | <groupId>org.web3j</groupId> |
| | | <artifactId>core</artifactId> |
| | | <version>4.5.5</version> |
| | | </dependency> |
| | | <dependency> |
| | | <groupId>com.squareup.okhttp3</groupId> |
| | | <artifactId>okhttp</artifactId> |
| | | </dependency> |
| | | <dependency> |
| | | <groupId>com.squareup.okhttp3</groupId> |
| | | <artifactId>logging-interceptor</artifactId> |
| | | <version>3.6.0</version> |
| | | </dependency> |
| | | <dependency> |
| | | <groupId>org.web3j</groupId> |
| | | <artifactId>parity</artifactId> |
| | | <version>4.5.10</version> |
| | | <exclusions> |
| | | <exclusion> |
| | | <artifactId>core</artifactId> |
| | | <groupId>org.web3j</groupId> |
| | | </exclusion> |
| | | </exclusions> |
| | | </dependency> |
| | | <dependency> |
| | | <groupId>org.bouncycastle</groupId> |
| | | <artifactId>bcprov-jdk15on</artifactId> |
| | | <version>1.68</version> |
| | | </dependency> |
| | | <dependency> |
| | | <groupId>org.bouncycastle</groupId> |
| | | <artifactId>bcpkix-jdk15on</artifactId> |
| | | <version>1.68</version> |
| | | </dependency> |
| | | <!-- 短信模块--> |
| | | <dependency> |
| | | <groupId>com.infobip</groupId> |
New file |
| | |
| | | package cc.mrbird.febs.common.annotation; |
| | | |
| | | import java.lang.annotation.*; |
| | | |
| | | @Documented |
| | | @Retention(RetentionPolicy.RUNTIME) |
| | | @Target(ElementType.METHOD) |
| | | public @interface SubmitRepeat { |
| | | |
| | | } |
New file |
| | |
| | | package cc.mrbird.febs.common.aspect; |
| | | |
| | | import cc.mrbird.febs.common.annotation.SubmitRepeat; |
| | | import cc.mrbird.febs.common.exception.LimitAccessException; |
| | | import cc.mrbird.febs.common.utils.AppContants; |
| | | import cc.mrbird.febs.common.utils.LoginUserUtil; |
| | | import cc.mrbird.febs.common.utils.RedisUtils; |
| | | import cn.hutool.core.util.StrUtil; |
| | | import cn.hutool.crypto.asymmetric.KeyType; |
| | | import cn.hutool.crypto.asymmetric.RSA; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.aspectj.lang.ProceedingJoinPoint; |
| | | import org.aspectj.lang.annotation.*; |
| | | import org.springframework.stereotype.Component; |
| | | import org.springframework.web.context.request.RequestContextHolder; |
| | | import org.springframework.web.context.request.ServletRequestAttributes; |
| | | |
| | | import javax.annotation.Resource; |
| | | import javax.servlet.http.HttpServletRequest; |
| | | |
| | | @Slf4j |
| | | @Aspect |
| | | @Component |
| | | public class SubmitRepeatAspect { |
| | | @Resource |
| | | private RedisUtils redisUtil; |
| | | |
| | | private String key; |
| | | |
| | | @Pointcut("@annotation(submitRepeat)") |
| | | public void submitRepeatPointCut(SubmitRepeat submitRepeat) { |
| | | |
| | | } |
| | | |
| | | @Before("submitRepeatPointCut(submitRepeat)") |
| | | public void before(SubmitRepeat submitRepeat) { |
| | | } |
| | | |
| | | @Around("submitRepeatPointCut(submitRepeat)") |
| | | public Object around(ProceedingJoinPoint joinPoint, SubmitRepeat submitRepeat) throws Throwable { |
| | | ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); |
| | | HttpServletRequest request = attributes.getRequest(); |
| | | |
| | | String headerToken = request.getHeader("token"); |
| | | |
| | | RSA rsa = new RSA(AppContants.PRIVATE_KEY, null); |
| | | String[] tokens = StrUtil.split(rsa.decryptStr(headerToken, KeyType.PrivateKey), "_"); |
| | | String token = tokens[0]; |
| | | String uri = request.getRequestURI(); |
| | | Long mId = LoginUserUtil.getLoginUser().getId(); |
| | | log.info("#token : {}, uri : {}, mId : {}#", token, uri, mId); |
| | | key = mId + "_" + uri; |
| | | boolean flag = redisUtil.setNotExist(key, "1", 1); |
| | | if (flag) { |
| | | Object result = joinPoint.proceed(); |
| | | redisUtil.del(key); |
| | | return result; |
| | | } else { |
| | | throw new LimitAccessException("请勿重复提交"); |
| | | } |
| | | } |
| | | |
| | | @After("submitRepeatPointCut(submitRepeat)") |
| | | public void after(SubmitRepeat submitRepeat) { |
| | | |
| | | } |
| | | |
| | | } |
| | |
| | | package cc.mrbird.febs.common.configure; |
| | | |
| | | import cc.mrbird.febs.rabbit.constants.ExchangeConstants; |
| | | import cc.mrbird.febs.rabbit.constants.QueueConstants; |
| | | import cc.mrbird.febs.rabbit.constants.RouteKeyConstants; |
| | | import cc.mrbird.febs.rabbit.enumerates.RabbitQueueEnum; |
| | | import org.springframework.amqp.core.*; |
| | | import org.springframework.amqp.rabbit.connection.ConnectionFactory; |
| | |
| | | import org.springframework.context.annotation.Bean; |
| | | import org.springframework.context.annotation.Configuration; |
| | | import org.springframework.context.annotation.Scope; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import javax.annotation.Resource; |
| | | |
| | | /** |
| | | * @author wzy |
| | | * @date 2021-09-25 |
| | | **/ |
| | | @Configuration |
| | | public class RabbitConfigure { |
| | | |
| | |
| | | return new RabbitTemplate(connectionFactory); |
| | | } |
| | | |
| | | @Bean |
| | | public DirectExchange defaultExchange() { |
| | | return new DirectExchange(ExchangeConstants.EXCHANGE_DEFAULT); |
| | | } |
| | | |
| | | @Bean |
| | | public Queue defaultQueue() { |
| | | return new Queue(QueueConstants.QUEUE_DEFAULT); |
| | | } |
| | | |
| | | @Bean |
| | | public Binding defaultBind() { |
| | | return BindingBuilder.bind(defaultQueue()).to(defaultExchange()).with(RouteKeyConstants.ROUTE_KEY_DEFAULT); |
| | | } |
| | | |
| | | // === 充值自动过期 延时 start === |
| | | @Bean |
| | | public DirectExchange delayTtlExchange() { |
| | | return new DirectExchange(RabbitQueueEnum.ORDER_CANCEL_DELAY_TTL.getExchange()); |
| | | public DirectExchange chargeDelayTtlExchange() { |
| | | return new DirectExchange(RabbitQueueEnum.RUN_VIP_OPERATION_CHARGE_FAIL_TTL.getExchange()); |
| | | } |
| | | |
| | | @Bean |
| | | public DirectExchange orderDelayExchange() { |
| | | return new DirectExchange(RabbitQueueEnum.ORDER_CANCEL_DELAY.getExchange()); |
| | | public Binding chargeDelayTtlBind() { |
| | | return BindingBuilder.bind(chargeDelayTtlQueue()).to(chargeDelayTtlExchange()).with(RabbitQueueEnum.RUN_VIP_OPERATION_CHARGE_FAIL_TTL.getRoute()); |
| | | } |
| | | |
| | | @Bean |
| | | public Queue orderDelayQueue() { |
| | | return new Queue(RabbitQueueEnum.ORDER_CANCEL_DELAY.getQueue()); |
| | | } |
| | | |
| | | @Bean |
| | | public Queue orderDelayQueueTtl() { |
| | | return QueueBuilder.durable(RabbitQueueEnum.ORDER_CANCEL_DELAY_TTL.getQueue()) |
| | | public Queue chargeDelayTtlQueue() { |
| | | return QueueBuilder.durable(RabbitQueueEnum.RUN_VIP_OPERATION_CHARGE_FAIL_TTL.getQueue()) |
| | | //到期后转发的交换机 |
| | | .withArgument("x-dead-letter-exchange", RabbitQueueEnum.ORDER_CANCEL_DELAY.getExchange()) |
| | | .withArgument("x-dead-letter-exchange", RabbitQueueEnum.RUN_VIP_OPERATION_CHARGE_FAIL.getExchange()) |
| | | //到期后转发的路由键 |
| | | .withArgument("x-dead-letter-routing-key", RabbitQueueEnum.ORDER_CANCEL_DELAY.getRoute()) |
| | | .withArgument("x-dead-letter-routing-key", RabbitQueueEnum.RUN_VIP_OPERATION_CHARGE_FAIL.getRoute()) |
| | | .build(); |
| | | } |
| | | |
| | | @Bean |
| | | public Binding orderDelayBind() { |
| | | return BindingBuilder.bind(orderDelayQueue()).to(orderDelayExchange()).with(RabbitQueueEnum.ORDER_CANCEL_DELAY.getRoute()); |
| | | public DirectExchange chargeDelayExchange() { |
| | | return new DirectExchange(RabbitQueueEnum.RUN_VIP_OPERATION_CHARGE_FAIL.getExchange()); |
| | | } |
| | | @Bean |
| | | public Queue chargeDelayQueue() { |
| | | return new Queue(RabbitQueueEnum.RUN_VIP_OPERATION_CHARGE_FAIL.getQueue()); |
| | | } |
| | | @Bean |
| | | public Binding chargeDelayBind() { |
| | | return BindingBuilder.bind(chargeDelayQueue()).to(chargeDelayExchange()).with(RabbitQueueEnum.RUN_VIP_OPERATION_CHARGE_FAIL.getRoute()); |
| | | } |
| | | // === 充值自动过期 延时 end === |
| | | |
| | | |
| | | |
| | | // start |
| | | @Bean |
| | | public DirectExchange agentReturnExchange() { |
| | | return new DirectExchange(RabbitQueueEnum.RUN_VIP_OPERATION_CHARGE.getExchange()); |
| | | } |
| | | |
| | | @Bean |
| | | public Binding orderDelayBindTtl() { |
| | | return BindingBuilder.bind(orderDelayQueueTtl()).to(delayTtlExchange()).with(RabbitQueueEnum.ORDER_CANCEL_DELAY_TTL.getRoute()); |
| | | public Queue agentReturnQueue() { |
| | | return new Queue(RabbitQueueEnum.RUN_VIP_OPERATION_CHARGE.getQueue()); |
| | | } |
| | | |
| | | @Bean |
| | | public Queue autoLevelUpAgentQueue() { |
| | | return new Queue(QueueConstants.AGENT_AUTO_LEVEL_UP); |
| | | public Binding agentReturnBind() { |
| | | return BindingBuilder.bind(agentReturnQueue()).to(agentReturnExchange()).with(RabbitQueueEnum.RUN_VIP_OPERATION_CHARGE.getRoute()); |
| | | } |
| | | |
| | | @Bean |
| | | public Binding autoLevelUpBind() { |
| | | return BindingBuilder.bind(autoLevelUpAgentQueue()).to(defaultExchange()).with(RouteKeyConstants.ROUTE_KEY_DEFAULT); |
| | | } |
| | | |
| | | @Bean |
| | | public DirectExchange agentReturnMoneyExchange() { |
| | | return new DirectExchange(RabbitQueueEnum.AGENT_REUTRN_MONEY.getExchange()); |
| | | } |
| | | |
| | | @Bean |
| | | public Queue agentReturnMoneyQueue() { |
| | | return new Queue(QueueConstants.AGENT_RETURN_MONEY); |
| | | } |
| | | |
| | | @Bean |
| | | public Binding agentReturnMoneyBind() { |
| | | return BindingBuilder.bind(agentReturnMoneyQueue()).to(agentReturnMoneyExchange()).with(RabbitQueueEnum.AGENT_REUTRN_MONEY.getRoute()); |
| | | } |
| | | |
| | | |
| | | @Bean |
| | | public DirectExchange orderReturnMoneyExchange() { |
| | | return new DirectExchange(RabbitQueueEnum.ORDER_RETURN_MONEY.getExchange()); |
| | | } |
| | | |
| | | @Bean |
| | | public Queue orderReturnMoneyQueue() { |
| | | return new Queue(QueueConstants.ORDER_RETURN_MONEY); |
| | | } |
| | | |
| | | @Bean |
| | | public Binding orderReturnMoneyBind() { |
| | | return BindingBuilder.bind(orderReturnMoneyQueue()).to(orderReturnMoneyExchange()).with(RabbitQueueEnum.ORDER_RETURN_MONEY.getRoute()); |
| | | } |
| | | |
| | | |
| | | @Bean |
| | | public DirectExchange orderCouponExchange() { |
| | | return new DirectExchange(RabbitQueueEnum.ORDER_COUPON.getExchange()); |
| | | } |
| | | |
| | | @Bean |
| | | public Queue orderCouponQueue() { |
| | | return new Queue(QueueConstants.ORDER_COUPON); |
| | | } |
| | | |
| | | @Bean |
| | | public Binding orderCouponBind() { |
| | | return BindingBuilder.bind(orderCouponQueue()).to(orderCouponExchange()).with(RabbitQueueEnum.ORDER_COUPON.getRoute()); |
| | | } |
| | | |
| | | |
| | | @Bean |
| | | public DirectExchange getScoreMsgExchange() { |
| | | return new DirectExchange(RabbitQueueEnum.GET_SCORE_MSG.getExchange()); |
| | | } |
| | | |
| | | @Bean |
| | | public Queue getScoreMsgQueue() { |
| | | return new Queue(QueueConstants.GET_SCORE_MSG); |
| | | } |
| | | |
| | | @Bean |
| | | public Binding getScoreMsgBind() { |
| | | return BindingBuilder.bind(getScoreMsgQueue()).to(getScoreMsgExchange()).with(RabbitQueueEnum.GET_SCORE_MSG.getRoute()); |
| | | } |
| | | |
| | | |
| | | @Bean |
| | | public DirectExchange vipLevelUp() { |
| | | return new DirectExchange(RabbitQueueEnum.VIP_LEVEL_UP.getExchange()); |
| | | } |
| | | |
| | | @Bean |
| | | public Queue vipLevelUpQueue() { |
| | | return new Queue(QueueConstants.VIP_LEVEL_UP); |
| | | } |
| | | |
| | | @Bean |
| | | public Binding vipLevelUpBind() { |
| | | return BindingBuilder.bind(vipLevelUpQueue()).to(vipLevelUp()).with(RabbitQueueEnum.VIP_LEVEL_UP.getRoute()); |
| | | } |
| | | // end |
| | | |
| | | } |
| | |
| | | |
| | | |
| | | /** |
| | | * 余额 |
| | | * 碳币 |
| | | */ |
| | | BALANCE(1), |
| | | /** |
| | | * 积分 |
| | | * 碳积分 |
| | | */ |
| | | SCORE(2), |
| | | /** |
New file |
| | |
| | | package cc.mrbird.febs.common.enumerates; |
| | | |
| | | import lombok.Getter; |
| | | |
| | | @Getter |
| | | public enum RunVipDataDictionaryEnum { |
| | | |
| | | //充值类型 |
| | | CHARGE_TYPE_TRC("CHARGE_TYPE", "CHARGE_TYPE_TRC"), |
| | | CHARGE_TYPE_BSC("CHARGE_TYPE", "CHARGE_TYPE_BSC"), |
| | | |
| | | //系统充值失效时间 |
| | | CHARGE_SYS_FAIL_TIME("CHARGE_SYS_FAIL_TIME", "CHARGE_SYS_FAIL_TIME"), |
| | | |
| | | //系统充值地址 |
| | | CHARGE_SYS_ADDRESS("CHARGE_SYS_ADDRESS", "CHARGE_SYS_ADDRESS"), |
| | | |
| | | //碳币兑换USDT的手续费率 |
| | | RUN_VIP_BALANCE_TO_COIN_PERCENT("RUN_VIP_BALANCE_TO_COIN_PERCENT", "RUN_VIP_BALANCE_TO_COIN_PERCENT"), |
| | | |
| | | //碳币兑换USDT的最小数 |
| | | RUN_VIP_BALANCE_TO_COIN_MIN("RUN_VIP_BALANCE_TO_COIN_MIN", "RUN_VIP_BALANCE_TO_COIN_MIN"), |
| | | |
| | | //碳币兑换USDT的比值,如果为0.5,则表示1碳币兑换0.5个USDT |
| | | RUN_VIP_BALANCE_TO_COIN("RUN_VIP_BALANCE_TO_COIN", "RUN_VIP_BALANCE_TO_COIN"), |
| | | |
| | | //用户碳积分兑换碳币的比值 如果为0.5,则表示1积分兑换0.5个碳币 |
| | | RUN_VIP_SCORE_TO_BALANCE("RUN_VIP_SCORE_TO_BALANCE", "RUN_VIP_SCORE_TO_BALANCE"), |
| | | |
| | | //用户碳积分兑换碳币的最小兑换数值 |
| | | RUN_VIP_SCORE_MIN("RUN_VIP_SCORE_MIN", "RUN_VIP_SCORE_MIN"); |
| | | |
| | | private String type; |
| | | |
| | | private String code; |
| | | |
| | | RunVipDataDictionaryEnum(String type, String code) { |
| | | this.type = type; |
| | | this.code = code; |
| | | } |
| | | } |
New file |
| | |
| | | package cc.mrbird.febs.common.enumerates; |
| | | |
| | | import lombok.Getter; |
| | | |
| | | @Getter |
| | | public enum RunVipMoneyFlowTypeEnum { |
| | | |
| | | /** |
| | | * 购买VIP返利 |
| | | */ |
| | | BUY_VIP_REBATE(6,"{}购买{},返利{}碳币"), |
| | | |
| | | /** |
| | | * 碳币提现 |
| | | */ |
| | | BALANCE_OUT(5,"{}碳币兑换{}USDT,手续费{}USDT"), |
| | | |
| | | /** |
| | | * 碳积分兑换碳币 |
| | | */ |
| | | SCORE_OUT_BALANCE_IN(4,"{}碳积分兑换{}碳币"), |
| | | |
| | | /** |
| | | * 碳积分兑换碳币 |
| | | */ |
| | | SCORE_OUT_BALANCE(3,"{}碳积分兑换{}碳币"), |
| | | |
| | | /** |
| | | * 碳币转赠好友-转入 |
| | | */ |
| | | BALANCE_IN_GIVE_FRIEND(2,"获得好友{},{}碳币"), |
| | | |
| | | /** |
| | | * 碳币转赠好友-转出 |
| | | */ |
| | | BALANCE_OUT_GIVE_FRIEND(1,"转赠好友{},{}碳币"); |
| | | |
| | | private final int value; |
| | | private final String description; |
| | | |
| | | RunVipMoneyFlowTypeEnum(int value,String description) { |
| | | |
| | | this.value = value; |
| | | this.description = description; |
| | | } |
| | | } |
| | |
| | | /** |
| | | * 是否,同意拒绝,上线下线 |
| | | */ |
| | | ING(2, "进行中"), |
| | | YES(1, "是"), |
| | | |
| | | NO(0, "否"); |
| | |
| | | package cc.mrbird.febs.common.utils;
|
| | |
|
| | | import java.math.BigDecimal;
|
| | |
|
| | | public class AppContants {
|
| | |
|
| | | /**
|
| | |
| | |
|
| | | public static final String FP_TOKEN_HEADER_TYPE = "WECHATPAY2-SHA256-RSA2048 ";
|
| | |
|
| | | public static final String REDIS_KEY_BLOCK_ETH_NEWEST_NUM = "BLOCK_ETH_NEWEST_NUM";
|
| | | public static final String REDIS_KEY_BLOCK_ETH_INCREMENT_NUM = "BLOCK_ETH_INCREMENT_NUM";
|
| | |
|
| | | /**
|
| | | * token头部
|
| | | */
|
New file |
| | |
| | | package cc.mrbird.febs.mall.chain.ercCoin; |
| | | |
| | | import cc.mrbird.febs.common.enumerates.RunVipDataDictionaryEnum; |
| | | import cc.mrbird.febs.common.enumerates.YesOrNoEnum; |
| | | import cc.mrbird.febs.mall.entity.MallCharge; |
| | | import cc.mrbird.febs.mall.mapper.DataDictionaryCustomMapper; |
| | | import cc.mrbird.febs.mall.mapper.MallChargeMapper; |
| | | import cc.mrbird.febs.rabbit.producter.AgentProducer; |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.util.StrUtil; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.math.BigDecimal; |
| | | import java.math.BigInteger; |
| | | import java.math.RoundingMode; |
| | | import java.util.List; |
| | | |
| | | @Slf4j |
| | | @Service |
| | | public class BscUsdtContractEvent implements ContractEventService { |
| | | |
| | | @Resource |
| | | private DataDictionaryCustomMapper dataDictionaryCustomMapper; |
| | | |
| | | @Resource |
| | | private MallChargeMapper mallChargeMapper; |
| | | @Resource |
| | | private AgentProducer agentProducer; |
| | | |
| | | @Override |
| | | public void sdmUSDT(EthUsdtContract.TransferEventResponse e) { |
| | | if (e.to == null) { |
| | | return; |
| | | } |
| | | String sysAddress = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | RunVipDataDictionaryEnum.CHARGE_SYS_ADDRESS.getType(), RunVipDataDictionaryEnum.CHARGE_SYS_ADDRESS.getCode() |
| | | ).getValue(); |
| | | String type = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | RunVipDataDictionaryEnum.CHARGE_TYPE_BSC.getType(), RunVipDataDictionaryEnum.CHARGE_TYPE_BSC.getCode() |
| | | ).getValue(); |
| | | if(StrUtil.isBlank(sysAddress)){ |
| | | log.info("系统未设置充值地址"); |
| | | return; |
| | | } |
| | | |
| | | // 判断收款地址是否是设置的平台地址 |
| | | if (sysAddress.toLowerCase().equals(e.to)) { |
| | | |
| | | String transactionHash = e.log.getTransactionHash(); |
| | | LambdaQueryWrapper<MallCharge> mallChargeLambdaQueryWrapper = new LambdaQueryWrapper<>(); |
| | | mallChargeLambdaQueryWrapper.eq(MallCharge::getTransHash, transactionHash); |
| | | List<MallCharge> list = mallChargeMapper.selectList(mallChargeLambdaQueryWrapper); |
| | | if(CollUtil.isNotEmpty(list)){ |
| | | log.info("扫描到HASH已使用:{}",transactionHash); |
| | | return; |
| | | } |
| | | |
| | | ContractChainService sourceUsdtInstance = ChainService.getInstance(ChainEnum.BSC_USDT.name()); |
| | | int decimals = sourceUsdtInstance.decimals(); |
| | | |
| | | String fromAddress = e.from; |
| | | if (fromAddress.equals(sysAddress.toLowerCase())) { |
| | | log.info("系统地址转出:{}",transactionHash); |
| | | return; |
| | | } |
| | | |
| | | BigInteger tokens = e.tokens; |
| | | BigDecimal amount = new BigDecimal(tokens.toString()) |
| | | .divide(BigDecimal.TEN.pow(decimals), decimals, RoundingMode.HALF_DOWN) |
| | | .setScale(2,BigDecimal.ROUND_DOWN); |
| | | LambdaQueryWrapper<MallCharge> queryWrapper = new LambdaQueryWrapper<>(); |
| | | queryWrapper.eq(MallCharge::getAddress, fromAddress); |
| | | queryWrapper.eq(MallCharge::getSysAddress, sysAddress); |
| | | queryWrapper.eq(MallCharge::getAmount, amount); |
| | | queryWrapper.eq(MallCharge::getType, type); |
| | | queryWrapper.eq(MallCharge::getState, YesOrNoEnum.ING.getValue()); |
| | | List<MallCharge> mallCharges = mallChargeMapper.selectList(queryWrapper); |
| | | if(CollUtil.isEmpty(mallCharges)){ |
| | | log.info("未查询到匹配充值记录,充值地址:{},HASH:{}",fromAddress,transactionHash); |
| | | return; |
| | | } |
| | | MallCharge mallCharge = mallCharges.get(0); |
| | | mallCharge.setState(YesOrNoEnum.YES.getValue()); |
| | | mallChargeMapper.updateById(mallCharge); |
| | | agentProducer.sendBuyVipSuccessMsg(mallCharge.getId()); |
| | | |
| | | |
| | | log.info("扫描到用户ID:{},地址:{},充值金额:{}",mallCharge.getMemberId(),fromAddress,amount); |
| | | |
| | | } |
| | | } |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package cc.mrbird.febs.mall.chain.ercCoin; |
| | | |
| | | import lombok.Getter; |
| | | |
| | | /** |
| | | * 链类型 |
| | | */ |
| | | @Getter |
| | | public enum ChainEnum { |
| | | |
| | | /** |
| | | * 币安 usdt合约 |
| | | * 0x55d398326f99059fF775485246999027B3197955 |
| | | * 测试链 0x337610d27c682E347C9cD60BD4b3b107C9d34dDd |
| | | */ |
| | | BSC_USDT("BSC", "0xE09705E2D5283ee4b74182Ed5906D30E3b0D5fa8", |
| | | "a922d1900a99e883c5ca684ea479a81f2c7de6b8efde7e81b3877ff056221460", |
| | | "https://bsc-dataseed1.ninicoin.io", |
| | | "0x55d398326f99059fF775485246999027B3197955", |
| | | ""); |
| | | |
| | | |
| | | private String chain; |
| | | |
| | | private String address; |
| | | |
| | | private String privateKey; |
| | | |
| | | private String url; |
| | | |
| | | private String contractAddress; |
| | | |
| | | private String apiKey; |
| | | |
| | | ChainEnum(String chain, String address, String privateKey, String url, String contractAddress, String apiKey) { |
| | | this.chain = chain; |
| | | this.address = address; |
| | | this.privateKey = privateKey; |
| | | this.url = url; |
| | | this.contractAddress = contractAddress; |
| | | this.apiKey = apiKey; |
| | | } |
| | | |
| | | public static ChainEnum getValueByName(String name) { |
| | | ChainEnum[] values = values(); |
| | | for (ChainEnum value : values) { |
| | | if (value.name().equals(name)) { |
| | | return value; |
| | | } |
| | | } |
| | | |
| | | return null; |
| | | } |
| | | } |
New file |
| | |
| | | package cc.mrbird.febs.mall.chain.ercCoin; |
| | | |
| | | import cc.mrbird.febs.common.exception.FebsException; |
| | | import io.reactivex.Flowable; |
| | | import io.reactivex.schedulers.Schedulers; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.web3j.crypto.Credentials; |
| | | import org.web3j.protocol.Web3j; |
| | | import org.web3j.protocol.core.DefaultBlockParameter; |
| | | import org.web3j.protocol.core.DefaultBlockParameterName; |
| | | import org.web3j.protocol.core.DefaultBlockParameterNumber; |
| | | import org.web3j.protocol.core.methods.request.EthFilter; |
| | | import org.web3j.protocol.http.HttpService; |
| | | import org.web3j.tx.gas.StaticGasProvider; |
| | | |
| | | import java.math.BigInteger; |
| | | import java.util.HashMap; |
| | | import java.util.Map; |
| | | import java.util.concurrent.TimeUnit; |
| | | import java.util.concurrent.atomic.AtomicInteger; |
| | | |
| | | @Slf4j |
| | | public class ChainService { |
| | | private final static Map<String, ContractChainService> contractMap = new HashMap<>(); |
| | | |
| | | static { |
| | | for (ChainEnum chain : ChainEnum.values()) { |
| | | contractMap.put(chain.name(), new EthService(chain.getUrl(), chain.getAddress(), chain.getPrivateKey(), chain.getContractAddress())); |
| | | } |
| | | } |
| | | |
| | | private ChainService() { |
| | | } |
| | | |
| | | public final static ChainService INSTANCE = new ChainService(); |
| | | |
| | | public static ContractChainService getInstance(String chainType) { |
| | | ContractChainService contract = contractMap.get(chainType); |
| | | if (contract == null) { |
| | | throw new FebsException("参数错误"); |
| | | } |
| | | |
| | | return contract; |
| | | } |
| | | |
| | | public static void sdmUSDTEventListener(BigInteger startBlock, BigInteger endBlock, ContractEventService event, String type) { |
| | | ChainEnum chain = ChainEnum.getValueByName(type); |
| | | assert chain != null; |
| | | |
| | | EthUsdtContract contract = contract(chain.getPrivateKey(), chain.getContractAddress(), chain.getUrl()); |
| | | EthFilter filter = getFilter(startBlock, endBlock, chain.getContractAddress()); |
| | | |
| | | Flowable<EthUsdtContract.TransferEventResponse> eventFlowable = contract.transferEventFlowable(filter) |
| | | .doOnError(throwable -> |
| | | log.error("合约事件监听发生错误: " + throwable.getMessage(), throwable)) // 更具体的错误日志记录 |
| | | .retryWhen(errors -> { |
| | | AtomicInteger counter = new AtomicInteger(); |
| | | return errors.takeWhile(e -> counter.getAndIncrement() != 3) |
| | | .flatMap(e -> { |
| | | System.out.println("delay retry by " + counter.get() + " second(s)"); |
| | | return Flowable.timer(counter.get(), TimeUnit.SECONDS); |
| | | }); |
| | | }) |
| | | .subscribeOn(Schedulers.io()); // 指定subscribe操作在IO线程中执行,避免阻塞主线程 |
| | | |
| | | eventFlowable.subscribe( |
| | | e -> { |
| | | try { |
| | | event.sdmUSDT(e); // 处理事件 |
| | | } catch (Exception ex) { |
| | | // 处理事件时可能出现的异常 |
| | | log.error("处理合约事件时出错", ex); |
| | | } |
| | | }, |
| | | Throwable::printStackTrace, // 打印错误堆栈,或者可以替换为更具体的错误处理逻辑 |
| | | () -> log.info("合约事件监听已完成") // 在Flowable完成时执行的逻辑,如记录日志等 |
| | | ); |
| | | |
| | | } |
| | | |
| | | |
| | | private static EthUsdtContract contract(String privateKey, String contractAddress, String url) { |
| | | Credentials credentials = Credentials.create(privateKey); |
| | | HttpService httpService = new HttpService(url); |
| | | return EthUsdtContract.load(contractAddress, |
| | | Web3j.build(httpService), |
| | | credentials, |
| | | new StaticGasProvider(BigInteger.valueOf(4500000L), BigInteger.valueOf(200000L))); |
| | | } |
| | | |
| | | private static EthFilter getFilter(BigInteger startBlock, BigInteger endBlock, String contractAddress) { |
| | | DefaultBlockParameter startParameterName = null; |
| | | DefaultBlockParameter endParameterName = null; |
| | | if (startBlock != null) { |
| | | startParameterName = new DefaultBlockParameterNumber(startBlock); |
| | | } else { |
| | | startParameterName = DefaultBlockParameterName.EARLIEST; |
| | | } |
| | | |
| | | if (endBlock != null) { |
| | | endParameterName = new DefaultBlockParameterNumber(endBlock); |
| | | } else { |
| | | endParameterName = DefaultBlockParameterName.LATEST; |
| | | } |
| | | |
| | | return new EthFilter(startParameterName, endParameterName, contractAddress); |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package cc.mrbird.febs.mall.chain.ercCoin; |
| | | |
| | | import java.math.BigInteger; |
| | | |
| | | public interface ContractChainService { |
| | | |
| | | int decimals(); |
| | | |
| | | BigInteger blockNumber(); |
| | | |
| | | } |
New file |
| | |
| | | package cc.mrbird.febs.mall.chain.ercCoin; |
| | | |
| | | public interface ContractEventService { |
| | | |
| | | void sdmUSDT(EthUsdtContract.TransferEventResponse e); |
| | | } |
New file |
| | |
| | | package cc.mrbird.febs.mall.chain.ercCoin; |
| | | |
| | | import org.web3j.abi.FunctionEncoder; |
| | | import org.web3j.abi.FunctionReturnDecoder; |
| | | import org.web3j.abi.TypeReference; |
| | | import org.web3j.abi.datatypes.Function; |
| | | import org.web3j.abi.datatypes.Type; |
| | | import org.web3j.abi.datatypes.generated.Uint256; |
| | | import org.web3j.protocol.Web3j; |
| | | import org.web3j.protocol.core.DefaultBlockParameterName; |
| | | import org.web3j.protocol.core.Request; |
| | | import org.web3j.protocol.core.methods.request.Transaction; |
| | | import org.web3j.protocol.core.methods.response.EthBlockNumber; |
| | | import org.web3j.protocol.core.methods.response.EthCall; |
| | | import org.web3j.protocol.http.HttpService; |
| | | import org.web3j.utils.Numeric; |
| | | |
| | | import java.io.IOException; |
| | | import java.math.BigInteger; |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | |
| | | public class EthService implements ContractChainService { |
| | | |
| | | private Web3j web3j; |
| | | private String url; |
| | | private String ownerAddress; |
| | | private String privateKey; |
| | | private String contractAddress; |
| | | |
| | | public EthService(String url, String address, String privateKey, String contractAddress) { |
| | | this.url = url; |
| | | this.ownerAddress = address; |
| | | this.privateKey = privateKey; |
| | | this.contractAddress = contractAddress; |
| | | |
| | | HttpService service = new HttpService(url); |
| | | web3j = Web3j.build(service); |
| | | } |
| | | |
| | | @Override |
| | | public int decimals() { |
| | | try { |
| | | String methodName = "decimals"; |
| | | List<Type> inputParameters = new ArrayList<>(); |
| | | List<TypeReference<?>> outputParameters = new ArrayList<>(); |
| | | TypeReference<Uint256> typeReference = new TypeReference<Uint256>() { |
| | | }; |
| | | outputParameters.add(typeReference); |
| | | Function function = new Function(methodName, inputParameters, outputParameters); |
| | | String data = FunctionEncoder.encode(function); |
| | | Transaction transaction = Transaction.createEthCallTransaction(null, contractAddress, data); |
| | | |
| | | EthCall ethCall; |
| | | BigInteger decimals = BigInteger.ZERO; |
| | | try { |
| | | ethCall = web3j.ethCall(transaction, DefaultBlockParameterName.LATEST).send(); |
| | | List<Type> results = FunctionReturnDecoder.decode(ethCall.getValue(), function.getOutputParameters()); |
| | | decimals = (BigInteger) results.get(0).getValue(); |
| | | return decimals.intValue(); |
| | | } catch (IOException e) { |
| | | e.printStackTrace(); |
| | | } |
| | | |
| | | |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | return 0; |
| | | } |
| | | |
| | | @Override |
| | | public BigInteger blockNumber() { |
| | | Request<?, EthBlockNumber> request = web3j.ethBlockNumber(); |
| | | EthBlockNumber send = null; |
| | | try { |
| | | send = request.send(); |
| | | } catch (IOException e) { |
| | | e.printStackTrace(); |
| | | } |
| | | |
| | | if (send != null) { |
| | | return Numeric.decodeQuantity(send.getResult()); |
| | | } else { |
| | | throw new NullPointerException(); |
| | | } |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package cc.mrbird.febs.mall.chain.ercCoin; |
| | | |
| | | import io.reactivex.Flowable; |
| | | import io.reactivex.functions.Function; |
| | | import org.web3j.abi.EventEncoder; |
| | | import org.web3j.abi.TypeReference; |
| | | import org.web3j.abi.datatypes.*; |
| | | import org.web3j.abi.datatypes.generated.Uint256; |
| | | import org.web3j.abi.datatypes.generated.Uint8; |
| | | import org.web3j.crypto.Credentials; |
| | | import org.web3j.protocol.Web3j; |
| | | import org.web3j.protocol.core.DefaultBlockParameter; |
| | | import org.web3j.protocol.core.RemoteCall; |
| | | import org.web3j.protocol.core.RemoteFunctionCall; |
| | | import org.web3j.protocol.core.methods.request.EthFilter; |
| | | import org.web3j.protocol.core.methods.response.BaseEventResponse; |
| | | import org.web3j.protocol.core.methods.response.Log; |
| | | import org.web3j.protocol.core.methods.response.TransactionReceipt; |
| | | import org.web3j.tuples.generated.Tuple14; |
| | | import org.web3j.tx.Contract; |
| | | import org.web3j.tx.TransactionManager; |
| | | import org.web3j.tx.gas.ContractGasProvider; |
| | | |
| | | import java.math.BigInteger; |
| | | import java.util.ArrayList; |
| | | import java.util.Arrays; |
| | | import java.util.Collections; |
| | | import java.util.List; |
| | | import java.util.concurrent.Callable; |
| | | |
| | | /** |
| | | * <p>Auto generated code. |
| | | * <p><strong>Do not modify!</strong> |
| | | * <p>Please use the <a href="https://docs.web3j.io/command_line.html">web3j command line tools</a>, |
| | | * or the org.web3j.codegen.SolidityFunctionWrapperGenerator in the |
| | | * <a href="https://github.com/web3j/web3j/tree/master/codegen">codegen module</a> to update. |
| | | * |
| | | * <p>Generated with web3j version 4.5.5. |
| | | */ |
| | | @SuppressWarnings("rawtypes") |
| | | public class EthUsdtContract extends Contract { |
| | | private static String BINARY ; |
| | | |
| | | static { |
| | | String str1 = "{\r\n"; |
| | | String str2="\t\"linkReferences\": {},\r\n"; |
| | | String str3= "\t\"object\": \"60806040526107d0600a556000600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550734b56d1b5ada3fa8f914a1e8cfa29362ea9caa1e9600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550734b56d1b5ada3fa8f914a1e8cfa29362ea9caa1e9600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550734b56d1b5ada3fa8f914a1e8cfa29362ea9caa1e9600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506201046a601055612710600260009054906101000a900460ff1660ff16600a0a600102816200017657fe5b046011556001601960006101000a81548160ff021916908360ff1602179055506040518060400160405280601981526020017f43757272656e63792076616c756520696e6375626174696f6e0000000000000081525060009080519060200190620001e39291906200059b565b506040518060400160405280600381526020017f464843000000000000000000000000000000000000000000000000000000000081525060019080519060200190620002319291906200059b565b506012600260006101000a81548160ff021916908360ff160217905550600260009054906101000a900460ff1660ff16600a0a630773594002600381905550600354600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555033600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604051806101c001604052806000815260200160008152602001600081526020016201046a815260200160008152602001600081526020016000815260200160128152602001428152602001600081526020016000815260200160001515815260200160011515815260200160001515815250601360006201046a8152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a015561016082015181600b0160006101000a81548160ff02191690831515021790555061018082015181600b0160016101000a81548160ff0219169083151502179055506101a082015181600b0160026101000a81548160ff0219169083151502179055509050506201046a601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600260009054906101000a900460ff1660ff16600a0a600102600560006201046a8152602001908152602001600020819055506000601760006201046a8152602001908152602001600020819055506201046a601560405180807f78306a636676636900000000000000000000000000000000000000000000000081525060080190509081526020016040518091039020819055506040518060400160405280600881526020017f78306a6366766369000000000000000000000000000000000000000000000000815250601660006201046a81526020019081526020016000209080519060200190620005949291906200059b565b506200064a565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620005de57805160ff19168380011785556200060f565b828001600101855582156200060f579182015b828111156200060e578251825591602001919060010190620005f1565b5b5090506200061e919062000622565b5090565b6200064791905b808211156200064357600081600090555060010162000629565b5090565b90565b61398d806200065a6000396000f3fe6080604052600436106101f95760003560e01c80635b4b8b481161010d57806395d89b41116100a0578063d41702c71161006f578063d41702c714610d08578063d5789b3414610d33578063d5969c4014610d84578063dd62ed3e14610edd578063e15674e914610f62576101f9565b806395d89b4114610ae8578063a9059cbb14610b78578063ad8b9edc14610beb578063bee4a5da14610cb9576101f9565b80637ecc29c9116100dc5780637ecc29c914610901578063844786cc14610966578063867e186a146109b55780638da5cb5b14610a91576101f9565b80635b4b8b48146107a657806370a08231146107d1578063766064ee146108365780637c0ab152146108ea576101f9565b806323b872dd11610190578063313ce5671161015f578063313ce567146106b457806347a249b2146106e55780634b6860e5146107365780634f70445c1461076157806354c927d71461079c576101f9565b806323b872dd1461057357806328c06d6c1461060657806328ce2206146106445780632c4e722e14610689576101f9565b80630a8ca775116101cc5780630a8ca7751461038b5780630be76f801461046757806310dc97c01461051d57806318160ddd14610548576101f9565b8063054f7d9c146101fe57806306fdde031461022f578063095ea7b3146102bf5780630a3b73c014610332575b600080fd5b34801561020a57600080fd5b5061021361114f565b604051808260ff1660ff16815260200191505060405180910390f35b34801561023b57600080fd5b50610244611162565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610284578082015181840152602081019050610269565b50505050905090810190601f1680156102b15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102cb57600080fd5b50610318600480360360408110156102e257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611200565b604051808215151515815260200191505060405180910390f35b34801561033e57600080fd5b506103756004803603604081101561035557600080fd5b8101908080359060200190929190803590602001909291905050506112f2565b6040518082815260200191505060405180910390f35b34801561039757600080fd5b50610465600480360360608110156103ae57600080fd5b8101908080359060200190929190803590602001906401000000008111156103d557600080fd5b8201836020820111156103e757600080fd5b8035906020019184600183028401116401000000008311171561040957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190505050611320565b005b34801561047357600080fd5b506104a06004803603602081101561048a57600080fd5b81019080803590602001909291905050506116fa565b604051808f81526020018e81526020018d81526020018c81526020018b81526020018a81526020018981526020018881526020018781526020018681526020018581526020018415151515815260200183151515158152602001821515151581526020019e50505050505050505050505050505060405180910390f35b34801561052957600080fd5b5061053261178d565b6040518082815260200191505060405180910390f35b34801561055457600080fd5b5061055d611793565b6040518082815260200191505060405180910390f35b34801561057f57600080fd5b506105ec6004803603606081101561059657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611799565b604051808215151515815260200191505060405180910390f35b34801561061257600080fd5b506106426004803603602081101561062957600080fd5b81019080803560ff169060200190929190505050611a79565b005b34801561065057600080fd5b506106876004803603604081101561066757600080fd5b810190808035906020019092919080359060200190929190505050611af1565b005b34801561069557600080fd5b5061069e611c3f565b6040518082815260200191505060405180910390f35b3480156106c057600080fd5b506106c9611c45565b604051808260ff1660ff16815260200191505060405180910390f35b3480156106f157600080fd5b506107346004803603602081101561070857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c58565b005b34801561074257600080fd5b5061074b611cf6565b6040518082815260200191505060405180910390f35b34801561076d57600080fd5b5061079a6004803603602081101561078457600080fd5b8101908080359060200190929190505050611cfc565b005b6107a4611d0b565b005b3480156107b257600080fd5b506107bb6123cb565b6040518082815260200191505060405180910390f35b3480156107dd57600080fd5b50610820600480360360208110156107f457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506123d1565b6040518082815260200191505060405180910390f35b34801561084257600080fd5b5061086f6004803603602081101561085957600080fd5b81019080803590602001909291905050506123e9565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156108af578082015181840152602081019050610894565b50505050905090810190601f1680156108dc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108f657600080fd5b506108ff612499565b005b34801561090d57600080fd5b506109506004803603602081101561092457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612b42565b6040518082815260200191505060405180910390f35b34801561097257600080fd5b5061099f6004803603602081101561098957600080fd5b8101908080359060200190929190505050612b5a565b6040518082815260200191505060405180910390f35b3480156109c157600080fd5b50610a7b600480360360208110156109d857600080fd5b81019080803590602001906401000000008111156109f557600080fd5b820183602082011115610a0757600080fd5b80359060200191846001830284011164010000000083111715610a2957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612b72565b6040518082815260200191505060405180910390f35b348015610a9d57600080fd5b50610aa6612ba0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610af457600080fd5b50610afd612bc6565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610b3d578082015181840152602081019050610b22565b50505050905090810190601f168015610b6a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610b8457600080fd5b50610bd160048036036040811015610b9b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612c64565b604051808215151515815260200191505060405180910390f35b610cb760048036036040811015610c0157600080fd5b8101908080359060200190640100000000811115610c1e57600080fd5b820183602082011115610c3057600080fd5b80359060200191846001830284011164010000000083111715610c5257600080fd5b909192939192939080359060200190640100000000811115610c7357600080fd5b820183602082011115610c8557600080fd5b80359060200191846001830284011164010000000083111715610ca757600080fd5b9091929391929390505050612e7d565b005b348015610cc557600080fd5b50610cf260048036036020811015610cdc57600080fd5b810190808035906020019092919050505061302e565b6040518082815260200191505060405180910390f35b348015610d1457600080fd5b50610d1d613046565b6040518082815260200191505060405180910390f35b348015610d3f57600080fd5b50610d8260048036036020811015610d5657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061304c565b005b348015610d9057600080fd5b50610edb60048036036040811015610da757600080fd5b8101908080359060200190640100000000811115610dc457600080fd5b820183602082011115610dd657600080fd5b80359060200191846020830284011164010000000083111715610df857600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190640100000000811115610e5857600080fd5b820183602082011115610e6a57600080fd5b80359060200191846020830284011164010000000083111715610e8c57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192905050506130ea565b005b348015610ee957600080fd5b50610f4c60048036036040811015610f0057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506131b2565b6040518082815260200191505060405180910390f35b348015610f6e57600080fd5b5061114d60048036036060811015610f8557600080fd5b8101908080359060200190640100000000811115610fa257600080fd5b820183602082011115610fb457600080fd5b80359060200191846020830284011164010000000083111715610fd657600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561103657600080fd5b82018360208201111561104857600080fd5b8035906020019184602083028401116401000000008311171561106a57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156110ca57600080fd5b8201836020820111156110dc57600080fd5b803590602001918460208302840111640100000000831117156110fe57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050613239565b005b601960009054906101000a900460ff1681565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156111f85780601f106111cd576101008083540402835291602001916111f8565b820191906000526020600020905b8154815290600101906020018083116111db57829003601f168201915b505050505081565b600081600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6018602052816000526040600020818154811061130b57fe5b90600052602060002001600091509150505481565b60136000848152602001908152602001600020600b0160019054906101000a900460ff166116f557604051806101c00160405280600081526020016000815260200160008152602001848152602001828152602001828152602001600081526020016012815260200142815260200160008152602001600081526020016000151581526020016001151581526020016000151581525060136000858152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a015561016082015181600b0160006101000a81548160ff02191690831515021790555061018082015181600b0160016101000a81548160ff0219169083151502179055506101a082015181600b0160026101000a81548160ff02191690831515021790555090505082601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550601860008281526020019081526020016000208390806001815401808255809150509060018203906000526020600020016000909192909190915055506001601760008381526020019081526020016000206000828254019250508190555060136000828152602001908152602001600020600b0160029054906101000a900460ff1661159b57600160136000838152602001908152602001600020600b0160026101000a81548160ff0219169083151502179055505b826015836040518082805190602001908083835b602083106115d257805182526020820191506020810190506020830392506115af565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902081905550816016600085815260200190815260200160002090805190602001906116309291906138b3565b503373ffffffffffffffffffffffffffffffffffffffff167f499ffe076035b47b460b067c9f7f3f16b2bf00bba63656747df722c55c9dd63d8285856040518084815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156116b857808201518184015260208101905061169d565b50505050905090810190601f1680156116e55780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a25b505050565b601360205280600052604060002060009150905080600001549080600101549080600201549080600301549080600401549080600501549080600601549080600701549080600801549080600901549080600a01549080600b0160009054906101000a900460ff169080600b0160019054906101000a900460ff169080600b0160029054906101000a900460ff1690508e565b60075481565b60035481565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156118045750600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b61180d57600080fd5b81600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561185957600080fd5b81600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156118e257600080fd5b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205401101561196f57600080fd5b81600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611ad357600080fd5b80601960006101000a81548160ff021916908360ff16021790555050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b4b57600080fd5b60136000838152602001908152602001600020600501548114611be35780601360008481526020019081526020016000206004018190555060186000828152602001908152602001600020829080600181540180825580915050906001820390600052602060002001600090919290919091505550600160176000838152602001908152602001600020600082825401925050819055505b60136000828152602001908152602001600020600b0160029054906101000a900460ff16611c3b57600160136000838152602001908152602001600020600b0160026101000a81548160ff0219169083151502179055505b5050565b600a5481565b600260009054906101000a900460ff1681565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611cb257600080fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60085481565b611d0733308361343f565b5050565b6000600a8054340281611d1a57fe5b04905080600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015611dd2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f546f6b656e73206e6f7420656e6f75676800000000000000000000000000000081525060200191505060405180910390fd5b600260009054906101000a900460ff1660ff16600a0a601402341115611e60576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600a8152602001807f4c6573732032304554480000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600260009054906101000a900460ff1660ff16600a0a601402600560008381526020019081526020016000205434011115611f47576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600a8152602001807f4c6573732032304554480000000000000000000000000000000000000000000081525060200191505060405180910390fd5b600260009054906101000a900460ff1660ff16600a0a601402341161201357600060136000838152602001908152602001600020600a01549050600260009054906101000a900460ff1660ff16600a0a6001028101341015612011576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f52657175697265206d6f7265204554480000000000000000000000000000000081525060200191505060405180910390fd5b505b34600560008381526020019081526020016000206000828254019250508190555034600860008282540192505081905550600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc600a348161208a57fe5b049081150290604051600060405180830381858888f193505050501580156120b6573d6000803e3d6000fd5b50600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6064600334028161210057fe5b049081150290604051600060405180830381858888f1935050505015801561212c573d6000803e3d6000fd5b506121373383613696565b81601360008381526020019081526020016000206009016000828254019250508190555060006013600083815260200190815260200160002060050154905060136000838152602001908152602001600020600b0160009054906101000a900460ff166122b55760006013600083815260200190815260200160002060070154905060128114156121ec5760076013600084815260200190815260200160002060070160008282540192505081905550612284565b601981141561221f57600f6013600084815260200190815260200160002060070160008282540192505081905550612283565b602881141561225257601e6013600084815260200190815260200160002060070160008282540192505081905550612282565b604681141561228157603c60136000848152602001908152602001600020600701600082825401925050819055505b5b5b5b600160136000858152602001908152602001600020600b0160006101000a81548160ff021916908315150217905550505b6000601360008481526020019081526020016000206002018190555060006013600084815260200190815260200160002060000181905550600060136000848152602001908152602001600020600101819055503460136000848152602001908152602001600020600a01819055504260136000848152602001908152602001600020600801819055503373ffffffffffffffffffffffffffffffffffffffff167fb86003758cb2bf10f229c0db27d82cd8707ac04de44d14c98e27fa706fb4de7a600560008581526020019081526020016000205484601360008681526020019081526020016000206007015460405180848152602001838152602001828152602001935050505060405180910390a2505050565b60095481565b60046020528060005260406000206000915090505481565b60166020528060005260406000206000915090508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156124915780601f1061246657610100808354040283529160200191612491565b820191906000526020600020905b81548152906001019060200180831161247457829003601f168201915b505050505081565b6000600260009054906101000a900460ff1660ff16600a0a600a02905080600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561256b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f496e73756666696369656e7420746f6b656e000000000000000000000000000081525060200191505060405180910390fd5b6000601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060006013600083815260200190815260200160002060000154905060006005600084815260200190815260200160002054905060008111612658576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f496e73756666696369656e74204554480000000000000000000000000000000081525060200191505060405180910390fd5b6000601360008581526020019081526020016000206008015490506000620151808242038161268357fe5b049050600081116126fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f496e73756666696369656e74204554480000000000000000000000000000000081525060200191505060405180910390fd5b60008411158015612723575060006013600087815260200190815260200160002060010154145b15612740576103e8600f828502028161273857fe5b049350612864565b6000841180612765575060006013600087815260200190815260200160002060010154115b80612786575060006013600087815260200190815260200160002060020154115b156127ec5762015180828161279757fe5b066201518042816127a457fe5b061180156127c8575060006013600087815260200190815260200160002060020154115b156127e757601360008681526020019081526020016000206002015493505b612863565b60008411612862576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f496e73756666696369656e74204554480000000000000000000000000000000081525060200191505060405180910390fd5b5b5b600a601684028161287157fe5b0484111561288a57600a601684028161288657fe5b0493505b60008411612900576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f496e73756666696369656e74204554480000000000000000000000000000000081525060200191505060405180910390fd5b60006016600a86028161290f57fe5b0490506005600087815260200190815260200160002054811061294a576000600560008881526020019081526020016000208190555061296c565b8060056000888152602001908152602001600020600082825403925050819055505b6011546005600088815260200190815260200160002054116129d15760006005600088815260200190815260200160002081905550600060136000888152602001908152602001600020600b0160006101000a81548160ff0219169083151502179055505b600060136000888152602001908152602001600020600201819055506000601360008881526020019081526020016000206000018190555060006013600088815260200190815260200160002060010181905550612a3033308961343f565b503373ffffffffffffffffffffffffffffffffffffffff166108fc869081150290604051600060405180830381858888f19350505050158015612a77573d6000803e3d6000fd5b50846009600082825401925050819055504260136000888152602001908152602001600020600801819055508460136000888152602001908152602001600020600601600082825401925050819055503373ffffffffffffffffffffffffffffffffffffffff167fb86003758cb2bf10f229c0db27d82cd8707ac04de44d14c98e27fa706fb4de7a600560008981526020019081526020016000205488600060405180848152602001838152602001828152602001935050505060405180910390a250505050505050565b60146020528060005260406000206000915090505481565b60056020528060005260406000206000915090505481565b6015818051602081018201805184825260208301602085012081835280955050505050506000915090505481565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612c5c5780601f10612c3157610100808354040283529160200191612c5c565b820191906000526020600020905b815481529060010190602001808311612c3f57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612c9f57600080fd5b81600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015612ceb57600080fd5b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054011015612d7857600080fd5b81600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a392915050565b60003411612ef3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f706c65617365207061792065746800000000000000000000000000000000000081525060200191505060405180910390fd5b6000600a543402905080601260008282540192505081905550612f1730338361343f565b506000601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060136000828152602001908152602001600020600b0160019054906101000a900460ff166130265760006015858560405180838380828437808301925050509250505090815260200160405180910390205490506201046a811015612fc2576201046a90505b600160106000828254019250508190555061302460105488888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505083611320565b505b505050505050565b60176020528060005260406000206000915090505481565b60125481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146130a657600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461314457600080fd5b60008251905060008090505b818110156131ac57600084828151811061316657fe5b6020026020010151905083828151811061317c57fe5b60200260200101516013600083815260200190815260200160002060070181905550508080600101915050613150565b50505050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461329357600080fd5b60008351905060008090505b818110156134385760008582815181106132b557fe5b602002602001015190508482815181106132cb57fe5b602002602001015160136000838152602001908152602001600020600101541461331e578482815181106132fb57fe5b602002602001015160136000838152602001908152602001600020600101819055505b60136000828152602001908152602001600020600201546013600083815260200190815260200160002060000154146133d6576000601360008381526020019081526020016000206000015414156133a35783828151811061337c57fe5b602002602001015160136000838152602001908152602001600020600001819055506133d5565b601360008281526020019081526020016000206002015460136000838152602001908152602001600020600001819055505b5b60008483815181106133e457fe5b6020026020010151111561342a578382815181106133fe57fe5b602002602001015160136000838152602001908152602001600020600201600082825401925050819055505b50808060010191505061329f565b5050505050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156134aa5750600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b6134b357600080fd5b81600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156134ff57600080fd5b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205401101561358c57600080fd5b81600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b80600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156136e257600080fd5b80600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055508060046000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a36000600260009054906101000a900460ff1660ff16600a0a620f4240026007548161384c57fe5b049050816007600082825401925050819055506000600260009054906101000a900460ff1660ff16600a0a620f4240026007548161388657fe5b049050601482820302600a5403600a819055506064600a5410156138ad576064600a819055505b50505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106138f457805160ff1916838001178555613922565b82800160010185558215613922579182015b82811115613921578251825591602001919060010190613906565b5b50905061392f9190613933565b5090565b61395591905b80821115613951576000816000905550600101613939565b5090565b9056fea265627a7a723158204b915f2233752eb088236703f914c9691a95fcf5387c988e7ab1068ce8b60d1264736f6c63430005100032\",\r\n"; |
| | | String str4 = "\t\"opcodes\": \"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH2 0x7D0 PUSH1 0xA SSTORE PUSH1 0x0 PUSH1 0xC PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH20 0x4B56D1B5ADA3FA8F914A1E8CFA29362EA9CAA1E9 PUSH1 0xD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH20 0x4B56D1B5ADA3FA8F914A1E8CFA29362EA9CAA1E9 PUSH1 0xE PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH20 0x4B56D1B5ADA3FA8F914A1E8CFA29362EA9CAA1E9 PUSH1 0xF PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH3 0x1046A PUSH1 0x10 SSTORE PUSH2 0x2710 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0xFF AND PUSH1 0xA EXP PUSH1 0x1 MUL DUP2 PUSH3 0x176 JUMPI INVALID JUMPDEST DIV PUSH1 0x11 SSTORE PUSH1 0x1 PUSH1 0x19 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x19 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x43757272656E63792076616C756520696E6375626174696F6E00000000000000 DUP2 MSTORE POP PUSH1 0x0 SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH3 0x1E3 SWAP3 SWAP2 SWAP1 PUSH3 0x59B JUMP JUMPDEST POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x3 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4648430000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x1 SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH3 0x231 SWAP3 SWAP2 SWAP1 PUSH3 0x59B JUMP JUMPDEST POP PUSH1 0x12 PUSH1 0x2 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0xFF AND PUSH1 0xA EXP PUSH4 0x7735940 MUL PUSH1 0x3 DUP2 SWAP1 SSTORE POP PUSH1 0x3 SLOAD PUSH1 0x4 PUSH1 0x0 ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP CALLER PUSH1 0xB PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x40 MLOAD DUP1 PUSH2 0x1C0 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH3 0x1046A DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x12 DUP2 MSTORE PUSH1 0x20 ADD TIMESTAMP DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 ISZERO ISZERO DUP2 MSTORE POP PUSH1 0x13 PUSH1 0x0 PUSH3 0x1046A DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD SSTORE PUSH1 0x20 DUP3 ADD MLOAD DUP2 PUSH1 0x1 ADD SSTORE PUSH1 0x40 DUP3 ADD MLOAD DUP2 PUSH1 0x2 ADD SSTORE PUSH1 0x60 DUP3 ADD MLOAD DUP2 PUSH1 0x3 ADD SSTORE PUSH1 0x80 DUP3 ADD MLOAD DUP2 PUSH1 0x4 ADD SSTORE PUSH1 0xA0 DUP3 ADD MLOAD DUP2 PUSH1 0x5 ADD SSTORE PUSH1 0xC0 DUP3 ADD MLOAD DUP2 PUSH1 0x6 ADD SSTORE PUSH1 0xE0 DUP3 ADD MLOAD DUP2 PUSH1 0x7 ADD SSTORE PUSH2 0x100 DUP3 ADD MLOAD DUP2 PUSH1 0x8 ADD SSTORE PUSH2 0x120 DUP3 ADD MLOAD DUP2 PUSH1 0x9 ADD SSTORE PUSH2 0x140 DUP3 ADD MLOAD DUP2 PUSH1 0xA ADD SSTORE PUSH2 0x160 DUP3 ADD MLOAD DUP2 PUSH1 0xB ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP PUSH2 0x180 DUP3 ADD MLOAD DUP2 PUSH1 0xB ADD PUSH1 0x1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP PUSH2 0x1A0 DUP3 ADD MLOAD DUP2 PUSH1 0xB ADD PUSH1 0x2 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP SWAP1 POP POP PUSH3 0x1046A PUSH1 0x14 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0xFF AND PUSH1 0xA EXP PUSH1 0x1 MUL PUSH1 0x5 PUSH1 0x0 PUSH3 0x1046A DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH1 0x0 PUSH1 0x17 PUSH1 0x0 PUSH3 0x1046A DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH3 0x1046A PUSH1 0x15 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH32 0x78306A6366766369000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x8 ADD SWAP1 POP SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x8 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x78306A6366766369000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x16 PUSH1 0x0 PUSH3 0x1046A DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH3 0x594 SWAP3 SWAP2 SWAP1 PUSH3 0x59B JUMP JUMPDEST POP PUSH3 0x64A JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH3 0x5DE JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH3 0x60F JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH3 0x60F JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH3 0x60E JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH3 0x5F1 JUMP JUMPDEST JUMPDEST POP SWAP1 POP PUSH3 0x61E SWAP2 SWAP1 PUSH3 0x622 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH3 0x647 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH3 0x643 JUMPI PUSH1 0x0 DUP2 PUSH1 0x0 SWAP1 SSTORE POP PUSH1 0x1 ADD PUSH3 0x629 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x398D DUP1 PUSH3 0x65A PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x1F9 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x5B4B8B48 GT PUSH2 0x10D JUMPI DUP1 PUSH4 0x95D89B41 GT PUSH2 0xA0 JUMPI DUP1 PUSH4 0xD41702C7 GT PUSH2 0x6F JUMPI DUP1 PUSH4 0xD41702C7 EQ PUSH2 0xD08 JUMPI DUP1 PUSH4 0xD5789B34 EQ PUSH2 0xD33 JUMPI DUP1 PUSH4 0xD5969C40 EQ PUSH2 0xD84 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0xEDD JUMPI DUP1 PUSH4 0xE15674E9 EQ PUSH2 0xF62 JUMPI PUSH2 0x1F9 JUMP JUMPDEST DUP1 PUSH4 0x95D89B41 EQ PUSH2 0xAE8 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0xB78 JUMPI DUP1 PUSH4 0xAD8B9EDC EQ PUSH2 0xBEB JUMPI DUP1 PUSH4 0xBEE4A5DA EQ PUSH2 0xCB9 JUMPI PUSH2 0x1F9 JUMP JUMPDEST DUP1 PUSH4 0x7ECC29C9 GT PUSH2 0xDC JUMPI DUP1 PUSH4 0x7ECC29C9 EQ PUSH2 0x901 JUMPI DUP1 PUSH4 0x844786CC EQ PUSH2 0x966 JUMPI DUP1 PUSH4 0x867E186A EQ PUSH2 0x9B5 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0xA91 JUMPI PUSH2 0x1F9 JUMP JUMPDEST DUP1 PUSH4 0x5B4B8B48 EQ PUSH2 0x7A6 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x7D1 JUMPI DUP1 PUSH4 0x766064EE EQ PUSH2 0x836 JUMPI DUP1 PUSH4 0x7C0AB152 EQ PUSH2 0x8EA JUMPI PUSH2 0x1F9 JUMP JUMPDEST DUP1 PUSH4 0x23B872DD GT PUSH2 0x190 JUMPI DUP1 PUSH4 0x313CE567 GT PUSH2 0x15F JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x6B4 JUMPI DUP1 PUSH4 0x47A249B2 EQ PUSH2 0x6E5 JUMPI DUP1 PUSH4 0x4B6860E5 EQ PUSH2 0x736 JUMPI DUP1 PUSH4 0x4F70445C EQ PUSH2 0x761 JUMPI DUP1 PUSH4 0x54C927D7 EQ PUSH2 0x79C JUMPI PUSH2 0x1F9 JUMP JUMPDEST DUP1 PUSH4 0x23B872DD EQ PUSH2 0x573 JUMPI DUP1 PUSH4 0x28C06D6C EQ PUSH2 0x606 JUMPI DUP1 PUSH4 0x28CE2206 EQ PUSH2 0x644 JUMPI DUP1 PUSH4 0x2C4E722E EQ PUSH2 0x689 JUMPI PUSH2 0x1F9 JUMP JUMPDEST DUP1 PUSH4 0xA8CA775 GT PUSH2 0x1CC JUMPI DUP1 PUSH4 0xA8CA775 EQ PUSH2 0x38B JUMPI DUP1 PUSH4 0xBE76F80 EQ PUSH2 0x467 JUMPI DUP1 PUSH4 0x10DC97C0 EQ PUSH2 0x51D JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x548 JUMPI PUSH2 0x1F9 JUMP JUMPDEST DUP1 PUSH4 0x54F7D9C EQ PUSH2 0x1FE JUMPI DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x22F JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x2BF JUMPI DUP1 PUSH4 0xA3B73C0 EQ PUSH2 0x332 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x20A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x213 PUSH2 0x114F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x23B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x244 PUSH2 0x1162 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x284 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x269 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x2B1 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x318 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x2E2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1200 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x33E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x375 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x355 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x12F2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x397 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x465 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x3AE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x3D5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x3E7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x409 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP2 DUP5 ADD MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND SWAP1 POP DUP1 DUP4 ADD SWAP3 POP POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1320 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x473 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4A0 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x48A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x16FA JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP16 DUP2 MSTORE PUSH1 0x20 ADD DUP15 DUP2 MSTORE PUSH1 0x20 ADD DUP14 DUP2 MSTORE PUSH1 0x20 ADD DUP13 DUP2 MSTORE PUSH1 0x20 ADD DUP12 DUP2 MSTORE PUSH1 0x20 ADD DUP11 DUP2 MSTORE PUSH1 0x20 ADD DUP10 DUP2 MSTORE PUSH1 0x20 ADD DUP9 DUP2 MSTORE PUSH1 0x20 ADD DUP8 DUP2 MSTORE PUSH1 0x20 ADD DUP7 DUP2 MSTORE PUSH1 0x20 ADD DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD DUP4 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP15 POP POP POP POP POP POP POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x529 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x532 PUSH2 0x178D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x554 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x55D PUSH2 0x1793 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x57F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5EC PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x596 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1799 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x612 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x642 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x629 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH1 0xFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1A79 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x650 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x687 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x667 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1AF1 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x695 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x69E PUSH2 0x1C3F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x6C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x6C9 PUSH2 0x1C45 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x6F1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x734 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x708 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1C58 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x742 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x74B PUSH2 0x1CF6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x76D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x79A PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x784 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1CFC JUMP JUMPDEST STOP JUMPDEST PUSH2 0x7A4 PUSH2 0x1D0B JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x7B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x7BB PUSH2 0x23CB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x7DD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x820 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x7F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x23D1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x842 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x86F PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x859 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x23E9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x8AF JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x894 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x8DC JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x8F6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8FF PUSH2 0x2499 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x90D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x950 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x924 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x2B42 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x972 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x99F PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x989 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x2B5A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x9C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xA7B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x9D8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x9F5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xA07 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xA29 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP2 DUP5 ADD MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND SWAP1 POP DUP1 DUP4 ADD SWAP3 POP POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x2B72 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xA9D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xAA6 PUSH2 0x2BA0 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xAF4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xAFD PUSH2 0x2BC6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xB3D JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0xB22 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xB6A JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xB84 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xBD1 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0xB9B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x2C64 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xCB7 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0xC01 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xC1E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xC30 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xC52 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 SWAP2 SWAP3 SWAP4 SWAP2 SWAP3 SWAP4 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xC73 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xC85 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xCA7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 SWAP2 SWAP3 SWAP4 SWAP2 SWAP3 SWAP4 SWAP1 POP POP POP PUSH2 0x2E7D JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xCC5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xCF2 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xCDC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x302E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xD14 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD1D PUSH2 0x3046 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xD3F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD82 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xD56 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x304C JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xD90 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xEDB PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0xDA7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xDC4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xDD6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xDF8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP2 DUP5 ADD MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND SWAP1 POP DUP1 DUP4 ADD SWAP3 POP POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xE58 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xE6A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xE8C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP2 DUP5 ADD MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND SWAP1 POP DUP1 DUP4 ADD SWAP3 POP POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x30EA JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xEE9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xF4C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0xF00 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x31B2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xF6E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x114D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0xF85 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xFA2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xFB4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0xFD6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP2 DUP5 ADD MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND SWAP1 POP DUP1 DUP4 ADD SWAP3 POP POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x1036 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x1048 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x106A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP2 DUP5 ADD MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND SWAP1 POP DUP1 DUP4 ADD SWAP3 POP POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x10CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x10DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x20 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x10FE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP2 DUP5 ADD MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND SWAP1 POP DUP1 DUP4 ADD SWAP3 POP POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x3239 JUMP JUMPDEST STOP JUMPDEST PUSH1 0x19 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x11F8 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x11CD JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x11F8 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x11DB JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x6 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x1 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x18 PUSH1 0x20 MSTORE DUP2 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 DUP2 DUP2 SLOAD DUP2 LT PUSH2 0x130B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP2 POP SWAP2 POP POP SLOAD DUP2 JUMP JUMPDEST PUSH1 0x13 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0xB ADD PUSH1 0x1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH2 0x16F5 JUMPI PUSH1 0x40 MLOAD DUP1 PUSH2 0x1C0 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x12 DUP2 MSTORE PUSH1 0x20 ADD TIMESTAMP DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 ISZERO ISZERO DUP2 MSTORE POP PUSH1 0x13 PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD SSTORE PUSH1 0x20 DUP3 ADD MLOAD DUP2 PUSH1 0x1 ADD SSTORE PUSH1 0x40 DUP3 ADD MLOAD DUP2 PUSH1 0x2 ADD SSTORE PUSH1 0x60 DUP3 ADD MLOAD DUP2 PUSH1 0x3 ADD SSTORE PUSH1 0x80 DUP3 ADD MLOAD DUP2 PUSH1 0x4 ADD SSTORE PUSH1 0xA0 DUP3 ADD MLOAD DUP2 PUSH1 0x5 ADD SSTORE PUSH1 0xC0 DUP3 ADD MLOAD DUP2 PUSH1 0x6 ADD SSTORE PUSH1 0xE0 DUP3 ADD MLOAD DUP2 PUSH1 0x7 ADD SSTORE PUSH2 0x100 DUP3 ADD MLOAD DUP2 PUSH1 0x8 ADD SSTORE PUSH2 0x120 DUP3 ADD MLOAD DUP2 PUSH1 0x9 ADD SSTORE PUSH2 0x140 DUP3 ADD MLOAD DUP2 PUSH1 0xA ADD SSTORE PUSH2 0x160 DUP3 ADD MLOAD DUP2 PUSH1 0xB ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP PUSH2 0x180 DUP3 ADD MLOAD DUP2 PUSH1 0xB ADD PUSH1 0x1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP PUSH2 0x1A0 DUP3 ADD MLOAD DUP2 PUSH1 0xB ADD PUSH1 0x2 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP SWAP1 POP POP DUP3 PUSH1 0x14 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH1 0x18 PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP4 SWAP1 DUP1 PUSH1 0x1 DUP2 SLOAD ADD DUP1 DUP3 SSTORE DUP1 SWAP2 POP POP SWAP1 PUSH1 0x1 DUP3 SUB SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SWAP2 SWAP3 SWAP1 SWAP2 SWAP1 SWAP2 POP SSTORE POP PUSH1 0x1 PUSH1 0x17 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD ADD SWAP3 POP POP DUP2 SWAP1 SSTORE POP PUSH1 0x13 PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0xB ADD PUSH1 0x2 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH2 0x159B JUMPI PUSH1 0x1 PUSH1 0x13 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0xB ADD PUSH1 0x2 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP JUMPDEST DUP3 PUSH1 0x15 DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x15D2 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH1 0x20 DUP4 SUB SWAP3 POP PUSH2 0x15AF JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 DUP2 SWAP1 SSTORE POP DUP2 PUSH1 0x16 PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x1630 SWAP3 SWAP2 SWAP1 PUSH2 0x38B3 JUMP JUMPDEST POP CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x499FFE076035B47B460B067C9F7F3F16B2BF00BBA63656747DF722C55C9DD63D DUP3 DUP6 DUP6 PUSH1 0x40 MLOAD DUP1 DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x16B8 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x169D JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x16E5 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x13 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP1 POP DUP1 PUSH1 0x0 ADD SLOAD SWAP1 DUP1 PUSH1 0x1 ADD SLOAD SWAP1 DUP1 PUSH1 0x2 ADD SLOAD SWAP1 DUP1"; |
| | | String str44 =" PUSH1 0x3 ADD SLOAD SWAP1 DUP1 PUSH1 0x4 ADD SLOAD SWAP1 DUP1 PUSH1 0x5 ADD SLOAD SWAP1 DUP1 PUSH1 0x6 ADD SLOAD SWAP1 DUP1 PUSH1 0x7 ADD SLOAD SWAP1 DUP1 PUSH1 0x8 ADD SLOAD SWAP1 DUP1 PUSH1 0x9 ADD SLOAD SWAP1 DUP1 PUSH1 0xA ADD SLOAD SWAP1 DUP1 PUSH1 0xB ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND SWAP1 DUP1 PUSH1 0xB ADD PUSH1 0x1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND SWAP1 DUP1 PUSH1 0xB ADD PUSH1 0x2 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND SWAP1 POP DUP15 JUMP JUMPDEST PUSH1 0x7 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x3 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO DUP1 ISZERO PUSH2 0x1804 JUMPI POP PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO JUMPDEST PUSH2 0x180D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 PUSH1 0x4 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD LT ISZERO PUSH2 0x1859 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 PUSH1 0x6 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD GT ISZERO PUSH2 0x18E2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x4 PUSH1 0x0 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD DUP3 PUSH1 0x4 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD ADD LT ISZERO PUSH2 0x196F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 PUSH1 0x4 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD SUB SWAP3 POP POP DUP2 SWAP1 SSTORE POP DUP2 PUSH1 0x4 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD ADD SWAP3 POP POP DUP2 SWAP1 SSTORE POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x1 SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0xD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x1AD3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x19 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH1 0xD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x1B4B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x13 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x5 ADD SLOAD DUP2 EQ PUSH2 0x1BE3 JUMPI DUP1 PUSH1 0x13 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x4 ADD DUP2 SWAP1 SSTORE POP PUSH1 0x18 PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP3 SWAP1 DUP1 PUSH1 0x1 DUP2 SLOAD ADD DUP1 DUP3 SSTORE DUP1 SWAP2 POP POP SWAP1 PUSH1 0x1 DUP3 SUB SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SWAP2 SWAP3 SWAP1 SWAP2 SWAP1 SWAP2 POP SSTORE POP PUSH1 0x1 PUSH1 0x17 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD ADD SWAP3 POP POP DUP2 SWAP1 SSTORE POP JUMPDEST PUSH1 0x13 PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0xB ADD PUSH1 0x2 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH2 0x1C3B JUMPI PUSH1 0x1 PUSH1 0x13 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0xB ADD PUSH1 0x2 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0xA SLOAD DUP2 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0xD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x1CB2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0xF PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH1 0x8 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x1D07 CALLER ADDRESS DUP4 PUSH2 0x343F JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0xA DUP1 SLOAD CALLVALUE MUL DUP2 PUSH2 0x1D1A JUMPI INVALID JUMPDEST DIV SWAP1 POP DUP1 PUSH1 0x4 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD LT ISZERO PUSH2 0x1DD2 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x11 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x546F6B656E73206E6F7420656E6F756768000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0xFF AND PUSH1 0xA EXP PUSH1 0x14 MUL CALLVALUE GT ISZERO PUSH2 0x1E60 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0xA DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x4C65737320323045544800000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x14 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0xFF AND PUSH1 0xA EXP PUSH1 0x14 MUL PUSH1 0x5 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD CALLVALUE ADD GT ISZERO PUSH2 0x1F47 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0xA DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x4C65737320323045544800000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0xFF AND PUSH1 0xA EXP PUSH1 0x14 MUL CALLVALUE GT PUSH2 0x2013 JUMPI PUSH1 0x0 PUSH1 0x13 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0xA ADD SLOAD SWAP1 POP PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0xFF AND PUSH1 0xA EXP PUSH1 0x1 MUL DUP2 ADD CALLVALUE LT ISZERO PUSH2 0x2011 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x10 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x52657175697265206D6F72652045544800000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP JUMPDEST CALLVALUE PUSH1 0x5 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD ADD SWAP3 POP POP DUP2 SWAP1 SSTORE POP CALLVALUE PUSH1 0x8 PUSH1 0x0 DUP3 DUP3 SLOAD ADD SWAP3 POP POP DUP2 SWAP1 SSTORE POP PUSH1 0xE PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x8FC PUSH1 0xA CALLVALUE DUP2 PUSH2 0x208A JUMPI INVALID JUMPDEST DIV SWAP1 DUP2 ISZERO MUL SWAP1 PUSH1 0x40 MLOAD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x20B6 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0xF PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x8FC PUSH1 0x64 PUSH1 0x3 CALLVALUE MUL DUP2 PUSH2 0x2100 JUMPI INVALID JUMPDEST DIV SWAP1 DUP2 ISZERO MUL SWAP1 PUSH1 0x40 MLOAD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x212C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH2 0x2137 CALLER DUP4 PUSH2 0x3696 JUMP JUMPDEST DUP2 PUSH1 0x13 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x9 ADD PUSH1 0x0 DUP3 DUP3 SLOAD ADD SWAP3 POP POP DUP2 SWAP1 SSTORE POP PUSH1 0x0 PUSH1 0x13 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x5 ADD SLOAD SWAP1 POP PUSH1 0x13 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0xB ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH2 0x22B5 JUMPI PUSH1 0x0 PUSH1 0x13 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x7 ADD SLOAD SWAP1 POP PUSH1 0x12 DUP2 EQ ISZERO PUSH2 0x21EC JUMPI PUSH1 0x7 PUSH1 0x13 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x7 ADD PUSH1 0x0 DUP3 DUP3 SLOAD ADD SWAP3 POP POP DUP2 SWAP1 SSTORE POP PUSH2 0x2284 JUMP JUMPDEST PUSH1 0x19 DUP2 EQ ISZERO PUSH2 0x221F JUMPI PUSH1 0xF PUSH1 0x13 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x7 ADD PUSH1 0x0 DUP3 DUP3 SLOAD ADD SWAP3 POP POP DUP2 SWAP1 SSTORE POP PUSH2 0x2283 JUMP JUMPDEST PUSH1 0x28 DUP2 EQ ISZERO PUSH2 0x2252 JUMPI PUSH1 0x1E PUSH1 0x13 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x7 ADD PUSH1 0x0 DUP3 DUP3 SLOAD ADD SWAP3 POP POP DUP2 SWAP1 SSTORE POP PUSH2 0x2282 JUMP JUMPDEST PUSH1 0x46 DUP2 EQ ISZERO PUSH2 0x2281 JUMPI PUSH1 0x3C PUSH1 0x13 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x7 ADD PUSH1 0x0 DUP3 DUP3 SLOAD ADD SWAP3 POP POP DUP2 SWAP1 SSTORE POP JUMPDEST JUMPDEST JUMPDEST JUMPDEST PUSH1 0x1 PUSH1 0x13 PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0xB ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP POP JUMPDEST PUSH1 0x0 PUSH1 0x13 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x2 ADD DUP2 SWAP1 SSTORE POP PUSH1 0x0 PUSH1 0x13 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 ADD DUP2 SWAP1 SSTORE POP PUSH1 0x0 PUSH1 0x13 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x1 ADD DUP2 SWAP1 SSTORE POP CALLVALUE PUSH1 0x13 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0xA ADD DUP2 SWAP1 SSTORE POP TIMESTAMP PUSH1 0x13 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x8 ADD DUP2 SWAP1 SSTORE POP CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xB86003758CB2BF10F229C0DB27D82CD8707AC04DE44D14C98E27FA706FB4DE7A PUSH1 0x5 PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD DUP5 PUSH1 0x13 PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x7 ADD SLOAD PUSH1 0x40 MLOAD DUP1 DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP JUMP JUMPDEST PUSH1 0x9 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x4 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP1 POP SLOAD DUP2 JUMP JUMPDEST PUSH1 0x16 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP1 POP DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x2491 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2466 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2491 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2474 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0xFF AND PUSH1 0xA EXP PUSH1 0xA MUL SWAP1 POP DUP1 PUSH1 0x4 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD LT ISZERO PUSH2 0x256B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x12 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x496E73756666696369656E7420746F6B656E0000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x14 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP PUSH1 0x0 PUSH1 0x13 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 ADD SLOAD SWAP1 POP PUSH1 0x0 PUSH1 0x5 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP PUSH1 0x0 DUP2 GT PUSH2 0x2658 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x10 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x496E73756666696369656E742045544800000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x13 PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x8 ADD SLOAD SWAP1 POP PUSH1 0x0 PUSH3 0x15180 DUP3 TIMESTAMP SUB DUP2 PUSH2 0x2683 JUMPI INVALID JUMPDEST DIV SWAP1 POP PUSH1 0x0 DUP2 GT PUSH2 0x26FC JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x10 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x496E73756666696369656E742045544800000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 DUP5 GT ISZERO DUP1 ISZERO PUSH2 0x2723 JUMPI POP PUSH1 0x0 PUSH1 0x13 PUSH1 0x0 DUP8 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x1 ADD SLOAD EQ JUMPDEST ISZERO PUSH2 0x2740 JUMPI PUSH2 0x3E8 PUSH1 0xF DUP3 DUP6 MUL MUL DUP2 PUSH2 0x2738 JUMPI INVALID JUMPDEST DIV SWAP4 POP PUSH2 0x2864 JUMP JUMPDEST PUSH1 0x0 DUP5 GT DUP1 PUSH2 0x2765 JUMPI POP PUSH1 0x0 PUSH1 0x13 PUSH1 0x0 DUP8 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x1 ADD SLOAD GT JUMPDEST DUP1 PUSH2 0x2786 JUMPI POP PUSH1 0x0 PUSH1 0x13 PUSH1 0x0 DUP8 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x2 ADD SLOAD GT JUMPDEST ISZERO PUSH2 0x27EC JUMPI PUSH3 0x15180 DUP3 DUP2 PUSH2 0x2797 JUMPI INVALID JUMPDEST MOD PUSH3 0x15180 TIMESTAMP DUP2 PUSH2 0x27A4 JUMPI INVALID JUMPDEST MOD GT DUP1 ISZERO PUSH2 0x27C8 JUMPI POP PUSH1 0x0 PUSH1 0x13 PUSH1 0x0 DUP8 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x2 ADD SLOAD GT JUMPDEST ISZERO PUSH2 0x27E7 JUMPI PUSH1 0x13 PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x2 ADD SLOAD SWAP4 POP JUMPDEST PUSH2 0x2863 JUMP JUMPDEST PUSH1 0x0 DUP5 GT PUSH2 0x2862 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x10 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x496E73756666696369656E742045544800000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST JUMPDEST JUMPDEST PUSH1 0xA PUSH1 0x16 DUP5 MUL DUP2 PUSH2 0x2871 JUMPI INVALID JUMPDEST DIV DUP5 GT ISZERO PUSH2 0x288A JUMPI PUSH1 0xA PUSH1 0x16 DUP5 MUL DUP2 PUSH2 0x2886 JUMPI INVALID JUMPDEST DIV SWAP4 POP JUMPDEST PUSH1 0x0 DUP5 GT PUSH2 0x2900 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x10 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x496E73756666696369656E742045544800000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x16 PUSH1 0xA DUP7 MUL DUP2 PUSH2 0x290F JUMPI INVALID JUMPDEST DIV SWAP1 POP PUSH1 0x5 PUSH1 0x0 DUP8 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD DUP2 LT PUSH2 0x294A JUMPI PUSH1 0x0 PUSH1 0x5 PUSH1 0x0 DUP9 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH2 0x296C JUMP JUMPDEST DUP1 PUSH1 0x5 PUSH1 0x0 DUP9 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD SUB SWAP3 POP POP DUP2 SWAP1 SSTORE POP JUMPDEST PUSH1 0x11 SLOAD PUSH1 0x5 PUSH1 0x0 DUP9 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD GT PUSH2 0x29D1 JUMPI PUSH1 0x0 PUSH1 0x5 PUSH1 0x0 DUP9 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH1 0x0 PUSH1 0x13 PUSH1 0x0 DUP9 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0xB ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP JUMPDEST PUSH1 0x0 PUSH1 0x13 PUSH1 0x0 DUP9 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x2 ADD DUP2 SWAP1 SSTORE POP PUSH1 0x0 PUSH1 0x13 PUSH1 0x0 DUP9 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 ADD DUP2 SWAP1 SSTORE POP PUSH1 0x0 PUSH1 0x13 PUSH1 0x0 DUP9 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x1 ADD DUP2 SWAP1 SSTORE POP PUSH2 0x2A30 CALLER ADDRESS DUP10 PUSH2 0x343F JUMP JUMPDEST POP CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x8FC DUP7 SWAP1 DUP2 ISZERO MUL SWAP1 PUSH1 0x40 MLOAD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x2A77 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP DUP5 PUSH1 0x9 PUSH1 0x0 DUP3 DUP3 SLOAD ADD SWAP3 POP POP DUP2 SWAP1 SSTORE POP TIMESTAMP PUSH1 0x13 PUSH1 0x0 DUP9 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x8 ADD DUP2 SWAP1 SSTORE POP DUP5 PUSH1 0x13 PUSH1 0x0 DUP9 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x6 ADD PUSH1 0x0 DUP3 DUP3 SLOAD ADD SWAP3 POP POP DUP2 SWAP1 SSTORE POP CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xB86003758CB2BF10F229C0DB27D82CD8707AC04DE44D14C98E27FA706FB4DE7A PUSH1 0x5 PUSH1 0x0 DUP10 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD DUP9 PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x14 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP1 POP SLOAD DUP2 JUMP JUMPDEST PUSH1 0x5 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP1 POP SLOAD DUP2 JUMP JUMPDEST PUSH1 0x15 DUP2 DUP1 MLOAD PUSH1 0x20 DUP2 ADD DUP3 ADD DUP1 MLOAD DUP5 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP6 ADD KECCAK256 DUP2 DUP4 MSTORE DUP1 SWAP6 POP POP POP POP POP POP PUSH1 0x0 SWAP2 POP SWAP1 POP SLOAD DUP2 JUMP JUMPDEST PUSH1 0xB PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x2C5C JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2C31 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2C5C JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2C3F JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x2C9F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 PUSH1 0x4 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD LT ISZERO PUSH2 0x2CEB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x4 PUSH1 0x0 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD DUP3 PUSH1 0x4 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD ADD LT ISZERO PUSH2 0x2D78 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 PUSH1 0x4 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD SUB SWAP3 POP POP DUP2 SWAP1 SSTORE POP DUP2 PUSH1 0x4 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD ADD SWAP3 POP POP DUP2 SWAP1 SSTORE POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 CALLVALUE GT PUSH2 0x2EF3 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0xE DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x706C656173652070617920657468000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0xA SLOAD CALLVALUE MUL SWAP1 POP DUP1 PUSH1 0x12 PUSH1 0x0 DUP3 DUP3 SLOAD ADD SWAP3 POP POP DUP2 SWAP1 SSTORE POP PUSH2 0x2F17 ADDRESS CALLER DUP4 PUSH2 0x343F JUMP JUMPDEST POP PUSH1 0x0 PUSH1 0x14 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP PUSH1 0x13 PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0xB ADD PUSH1 0x1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH2 0x3026 JUMPI PUSH1 0x0 PUSH1 0x15 DUP6 DUP6 PUSH1 0x40 MLOAD DUP1 DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP1 DUP4 ADD SWAP3 POP POP POP SWAP3 POP POP POP SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 SLOAD SWAP1 POP PUSH3 0x1046A DUP2 LT ISZERO PUSH2 0x2FC2 JUMPI PUSH3 0x1046A SWAP1 POP JUMPDEST PUSH1 0x1 PUSH1 0x10 PUSH1 0x0 DUP3 DUP3 SLOAD ADD SWAP3 POP POP DUP2 SWAP1 SSTORE POP PUSH2 0x3024 PUSH1 0x10 SLOAD DUP9 DUP9 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP2 DUP5 ADD MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND SWAP1 POP DUP1 DUP4 ADD SWAP3 POP POP POP POP POP POP POP DUP4 PUSH2 0x1320 JUMP JUMPDEST POP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x17 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP1 POP SLOAD DUP2 JUMP JUMPDEST PUSH1 0x12 SLOAD DUP2 JUMP JUMPDEST PUSH1 0xD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x30A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0xE PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH1 0xD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x3144 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP3 MLOAD SWAP1 POP PUSH1 0x0 DUP1 SWAP1 POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x31AC JUMPI PUSH1 0x0 DUP5 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x3166 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD SWAP1 POP DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x317C JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x13 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x7 ADD DUP2 SWAP1 SSTORE POP POP DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x3150 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x6 PUSH1 0x0 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0xD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x3293 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP4 MLOAD SWAP1 POP PUSH1 0x0 DUP1 SWAP1 POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x3438 JUMPI PUSH1 0x0 DUP6 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x32B5 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD SWAP1 POP DUP5 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x32CB JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x13 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x1 ADD SLOAD EQ PUSH2 0x331E JUMPI DUP5 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x32FB JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x13 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x1 ADD DUP2 SWAP1 SSTORE POP JUMPDEST PUSH1 0x13 PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x2 ADD SLOAD PUSH1 0x13 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 ADD SLOAD EQ PUSH2 0x33D6 JUMPI PUSH1 0x0 PUSH1 0x13 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 ADD SLOAD EQ ISZERO PUSH2 0x33A3 JUMPI DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x337C JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x13 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 ADD DUP2 SWAP1 SSTORE POP PUSH2 0x33D5 JUMP JUMPDEST PUSH1 0x13 PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x2 ADD SLOAD PUSH1 0x13 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 ADD DUP2 SWAP1 SSTORE POP JUMPDEST JUMPDEST PUSH1 0x0 DUP5 DUP4 DUP2 MLOAD DUP2 LT PUSH2 0x33E4 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD GT ISZERO PUSH2 0x342A JUMPI DUP4 DUP3 DUP2 MLOAD DUP2 LT PUSH2 0x33FE JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH1 0x13 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x2 ADD PUSH1 0x0 DUP3 DUP3 SLOAD ADD SWAP3 POP POP DUP2 SWAP1 SSTORE POP JUMPDEST POP DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x329F JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO DUP1 ISZERO PUSH2 0x34AA JUMPI POP PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO JUMPDEST PUSH2 0x34B3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 PUSH1 0x4 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD LT ISZERO PUSH2 0x34FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x4 PUSH1 0x0 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD DUP3 PUSH1 0x4 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD ADD LT ISZERO PUSH2 0x358C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 PUSH1 0x4 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD SUB SWAP3 POP POP DUP2 SWAP1 SSTORE POP DUP2 PUSH1 0x4 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD ADD SWAP3 POP POP DUP2 SWAP1 SSTORE POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x1 SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 PUSH1 0x4 PUSH1 0x0 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD LT ISZERO PUSH2 0x36E2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x4 PUSH1 0x0 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD SUB SWAP3 POP POP DUP2 SWAP1 SSTORE POP DUP1 PUSH1 0x4 PUSH1 0x0 PUSH1 0xC PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD ADD SWAP3 POP POP DUP2 SWAP1 SSTORE POP PUSH1 0xC PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0xFF AND PUSH1 0xA EXP PUSH3 0xF4240 MUL PUSH1 0x7 SLOAD DUP2 PUSH2 0x384C JUMPI INVALID JUMPDEST DIV SWAP1 POP DUP2 PUSH1 0x7 PUSH1 0x0 DUP3 DUP3 SLOAD ADD SWAP3 POP POP DUP2 SWAP1 SSTORE POP PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0xFF AND PUSH1 0xA EXP PUSH3 0xF4240 MUL PUSH1 0x7 SLOAD DUP2 PUSH2 0x3886 JUMPI INVALID JUMPDEST DIV SWAP1 POP PUSH1 0x14 DUP3 DUP3 SUB MUL PUSH1 0xA SLOAD SUB PUSH1 0xA DUP2 SWAP1 SSTORE POP PUSH1 0x64 PUSH1 0xA SLOAD LT ISZERO PUSH2 0x38AD JUMPI PUSH1 0x64 PUSH1 0xA DUP2 SWAP1 SSTORE POP JUMPDEST POP POP POP POP JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x38F4 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x3922 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x3922 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x3921 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x3906 JUMP JUMPDEST JUMPDEST POP SWAP1 POP PUSH2 0x392F SWAP2 SWAP1 PUSH2 0x3933 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x3955 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x3951 JUMPI PUSH1 0x0 DUP2 PUSH1 0x0 SWAP1 SSTORE POP PUSH1 0x1 ADD PUSH2 0x3939 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST SWAP1 JUMP INVALID LOG2 PUSH6 0x627A7A723158 KECCAK256 0x4B SWAP2 0x5F 0x22 CALLER PUSH22 0x2EB088236703F914C9691A95FCF5387C988E7AB1068C 0xE8 0xB6 0xD SLT PUSH5 0x736F6C6343 STOP SDIV LT STOP ORIGIN \",\r\n"; |
| | | String str5 ="\t\"sourceMap\": \"1464:16294:0:-;;;1995:4;1976:23;;2117:42;2098:61;;;;;;;;;;;;;;;;;;;;2196:42;2166:72;;;;;;;;;;;;;;;;;;;;2280:42;2245:77;;;;;;;;;;;;;;;;;;;;2363:42;2329:76;;;;;;;;;;;;;;;;;;;;2607:5;2588:24;;2664:5;2652:8;;;;;;;;;;;2644:17;;2638:2;:23;2634:1;:27;:35;;;;;;2619:51;;3952:1;3932:21;;;;;;;;;;;;;;;;;;;;4047:34;;;;;;;;;;;;;;;;;:4;:34;;;;;;;;;;;;:::i;:::-;;4092:14;;;;;;;;;;;;;;;;;:6;:14;;;;;;;;;;;;:::i;:::-;;4128:2;4117:8;;:13;;;;;;;;;;;;;;;;;;4181:8;;;;;;;;;;;4173:17;;4167:2;:23;4155:9;:35;4141:11;:49;;;;4292:11;;4265:9;:24;4283:4;4265:24;;;;;;;;;;;;;;;:38;;;;4322:10;4314:5;;:18;;;;;;;;;;;;;;;;;;4363:255;;;;;;;;4478:1;4363:255;;;;4509:1;4363:255;;;;4526:1;4363:255;;;;4379:5;4363:255;;;;4397:1;4363:255;;;;4411:1;4363:255;;;;4442:1;4363:255;;;;4458:2;4363:255;;;;4539:3;4363:255;;;;4553:1;4363:255;;;;4566:1;4363:255;;;;4578:5;4363:255;;;;;;4593:4;4363:255;;;;;;4611:5;4363:255;;;;;4343:10;:17;4354:5;4343:17;;;;;;;;;;;:275;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4653:5;4629:9;:21;4639:10;4629:21;;;;;;;;;;;;;;;:29;;;;4703:8;;;;;;;;;;;4695:17;;4689:2;:23;4685:1;:27;4669:6;:13;4676:5;4669:13;;;;;;;;;;;:43;;;;4739:1;4723:6;:13;4730:5;4723:13;;;;;;;;;;;:17;;;;4776:5;4751:12;:24;;;;;;;;;;;;;;;;;;;;;;;;:30;;;;4792:29;;;;;;;;;;;;;;;;;:9;:16;4802:5;4792:16;;;;;;;;;;;:29;;;;;;;;;;;;:::i;:::-;;1464:16294;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;\"\r\n"; |
| | | String str6="}"; |
| | | StringBuilder sb = new StringBuilder(); |
| | | sb.append(str1); |
| | | sb.append(str2); |
| | | sb.append(str3); |
| | | sb.append(str4); |
| | | sb.append(str44); |
| | | sb.append(str5); |
| | | sb.append(str6); |
| | | BINARY = sb.toString(); |
| | | } |
| | | public static final String FUNC_ALLOWANCE = "allowance"; |
| | | |
| | | public static final String FUNC_APPROVE = "approve"; |
| | | |
| | | public static final String FUNC_BALANCEOF = "balanceOf"; |
| | | |
| | | public static final String FUNC_BETMEMBERIDTOTAL = "betMemberIdTotal"; |
| | | |
| | | public static final String FUNC_BETTINGETH = "bettingEth"; |
| | | |
| | | public static final String FUNC_BETTINGTOTAL = "bettingTotal"; |
| | | |
| | | public static final String FUNC_BURNTOKENFEE = "burnTokenFee"; |
| | | |
| | | public static final String FUNC_BURNTOTAL = "burnTotal"; |
| | | |
| | | public static final String FUNC_BUYTOKEN = "buyToken"; |
| | | |
| | | public static final String FUNC_CHILDRENMAP = "childrenMap"; |
| | | |
| | | public static final String FUNC_CHILDS = "childs"; |
| | | |
| | | public static final String FUNC_COLLECTBURNFEE = "collectBurnFee"; |
| | | |
| | | public static final String FUNC_COLLECTMANAGEFEE = "collectManageFee"; |
| | | |
| | | public static final String FUNC_DECIMALS = "decimals"; |
| | | |
| | | public static final String FUNC_EXTRACTETH = "extractEth"; |
| | | |
| | | public static final String FUNC_FROZEN = "frozen"; |
| | | |
| | | public static final String FUNC_FROZENPROFIT = "frozenProfit"; |
| | | |
| | | public static final String FUNC_MANAGEFEE = "manageFee"; |
| | | |
| | | public static final String FUNC_MEMBERDATA = "memberData"; |
| | | |
| | | public static final String FUNC_MEMBERMAP = "memberMap"; |
| | | |
| | | public static final String FUNC_MEMBERPROFIT = "memberProfit"; |
| | | |
| | | public static final String FUNC_MEMBERREL = "memberRel"; |
| | | |
| | | public static final String FUNC_MEMBERRELSTR = "memberRelStr"; |
| | | |
| | | public static final String FUNC_NAME = "name"; |
| | | |
| | | public static final String FUNC_OUTTOTAL = "outTotal"; |
| | | |
| | | public static final String FUNC_OWNER = "owner"; |
| | | |
| | | public static final String FUNC_RATE = "rate"; |
| | | |
| | | public static final String FUNC_REG = "reg"; |
| | | |
| | | public static final String FUNC_SETMEMBERPARENT = "setMemberParent"; |
| | | |
| | | public static final String FUNC_SYMBOL = "symbol"; |
| | | |
| | | public static final String FUNC_TESTREG = "testReg"; |
| | | |
| | | public static final String FUNC_TOKENBUYTOTAL = "tokenBuyTotal"; |
| | | |
| | | public static final String FUNC_TOTALSUPPLY = "totalSupply"; |
| | | |
| | | public static final String FUNC_TOUZHU = "touzhu"; |
| | | |
| | | public static final String FUNC_TRANSFER = "transfer"; |
| | | |
| | | public static final String FUNC_TRANSFERFROM = "transferFrom"; |
| | | public static final String FUNC_MEMTOKENS = "memTokens"; |
| | | public static final String FUNC_SETMEMBERTOP = "setMemberTop"; |
| | | public static final Event APPROVAL_EVENT = new Event("Approval", |
| | | Arrays.<TypeReference<?>>asList(new TypeReference<Address>(true) {}, new TypeReference<Address>(true) {}, new TypeReference<Uint256>() {})); |
| | | ; |
| | | |
| | | public static final Event BETTING_EVENT = new Event("Betting", |
| | | Arrays.<TypeReference<?>>asList(new TypeReference<Address>(true) {}, new TypeReference<Uint256>() {}, new TypeReference<Uint256>() {}, new TypeReference<Uint256>() {})); |
| | | ; |
| | | |
| | | public static final Event REGIS_EVENT = new Event("Regis", |
| | | Arrays.<TypeReference<?>>asList(new TypeReference<Address>(true) {}, new TypeReference<Uint256>() {}, new TypeReference<Uint256>() {}, new TypeReference<Utf8String>() {})); |
| | | ; |
| | | |
| | | public static final Event TRANSFER_EVENT = new Event("Transfer", |
| | | Arrays.<TypeReference<?>>asList(new TypeReference<Address>(true) {}, new TypeReference<Address>(true) {}, new TypeReference<Uint256>() {})); |
| | | ; |
| | | |
| | | @Deprecated |
| | | protected EthUsdtContract(String contractAddress, Web3j web3j, Credentials credentials, BigInteger gasPrice, BigInteger gasLimit) { |
| | | super(BINARY, contractAddress, web3j, credentials, gasPrice, gasLimit); |
| | | } |
| | | |
| | | protected EthUsdtContract(String contractAddress, Web3j web3j, Credentials credentials, ContractGasProvider contractGasProvider) { |
| | | super(BINARY, contractAddress, web3j, credentials, contractGasProvider); |
| | | } |
| | | |
| | | @Deprecated |
| | | protected EthUsdtContract(String contractAddress, Web3j web3j, TransactionManager transactionManager, BigInteger gasPrice, BigInteger gasLimit) { |
| | | super(BINARY, contractAddress, web3j, transactionManager, gasPrice, gasLimit); |
| | | } |
| | | |
| | | protected EthUsdtContract(String contractAddress, Web3j web3j, TransactionManager transactionManager, ContractGasProvider contractGasProvider) { |
| | | super(BINARY, contractAddress, web3j, transactionManager, contractGasProvider); |
| | | } |
| | | |
| | | public List<ApprovalEventResponse> getApprovalEvents(TransactionReceipt transactionReceipt) { |
| | | List<EventValuesWithLog> valueList = extractEventParametersWithLog(APPROVAL_EVENT, transactionReceipt); |
| | | ArrayList<ApprovalEventResponse> responses = new ArrayList<ApprovalEventResponse>(valueList.size()); |
| | | for (EventValuesWithLog eventValues : valueList) { |
| | | ApprovalEventResponse typedResponse = new ApprovalEventResponse(); |
| | | typedResponse.log = eventValues.getLog(); |
| | | typedResponse.tokenOwner = (String) eventValues.getIndexedValues().get(0).getValue(); |
| | | typedResponse.spender = (String) eventValues.getIndexedValues().get(1).getValue(); |
| | | typedResponse.tokens = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue(); |
| | | responses.add(typedResponse); |
| | | } |
| | | return responses; |
| | | } |
| | | |
| | | public Flowable<ApprovalEventResponse> approvalEventFlowable(EthFilter filter) { |
| | | return web3j.ethLogFlowable(filter).map(new Function<Log, ApprovalEventResponse>() { |
| | | @Override |
| | | public ApprovalEventResponse apply(Log log) { |
| | | EventValuesWithLog eventValues = extractEventParametersWithLog(APPROVAL_EVENT, log); |
| | | ApprovalEventResponse typedResponse = new ApprovalEventResponse(); |
| | | typedResponse.log = log; |
| | | typedResponse.tokenOwner = (String) eventValues.getIndexedValues().get(0).getValue(); |
| | | typedResponse.spender = (String) eventValues.getIndexedValues().get(1).getValue(); |
| | | typedResponse.tokens = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue(); |
| | | return typedResponse; |
| | | } |
| | | }); |
| | | } |
| | | |
| | | public Flowable<ApprovalEventResponse> approvalEventFlowable(DefaultBlockParameter startBlock, DefaultBlockParameter endBlock) { |
| | | EthFilter filter = new EthFilter(startBlock, endBlock, getContractAddress()); |
| | | filter.addSingleTopic(EventEncoder.encode(APPROVAL_EVENT)); |
| | | return approvalEventFlowable(filter); |
| | | } |
| | | |
| | | public List<BettingEventResponse> getBettingEvents(TransactionReceipt transactionReceipt) { |
| | | List<EventValuesWithLog> valueList = extractEventParametersWithLog(BETTING_EVENT, transactionReceipt); |
| | | ArrayList<BettingEventResponse> responses = new ArrayList<BettingEventResponse>(valueList.size()); |
| | | for (EventValuesWithLog eventValues : valueList) { |
| | | BettingEventResponse typedResponse = new BettingEventResponse(); |
| | | typedResponse.log = eventValues.getLog(); |
| | | typedResponse.from = (String) eventValues.getIndexedValues().get(0).getValue(); |
| | | typedResponse.betEth = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue(); |
| | | typedResponse.memberId = (BigInteger) eventValues.getNonIndexedValues().get(1).getValue(); |
| | | typedResponse.refProfitRate = (BigInteger) eventValues.getNonIndexedValues().get(2).getValue(); |
| | | responses.add(typedResponse); |
| | | } |
| | | return responses; |
| | | } |
| | | |
| | | public Flowable<BettingEventResponse> bettingEventFlowable(EthFilter filter) { |
| | | return web3j.ethLogFlowable(filter).map(new Function<Log, BettingEventResponse>() { |
| | | @Override |
| | | public BettingEventResponse apply(Log log) { |
| | | EventValuesWithLog eventValues = extractEventParametersWithLog(BETTING_EVENT, log); |
| | | BettingEventResponse typedResponse = new BettingEventResponse(); |
| | | if(eventValues==null){ |
| | | return typedResponse; |
| | | } |
| | | typedResponse.log = log; |
| | | typedResponse.from = (String) eventValues.getIndexedValues().get(0).getValue(); |
| | | typedResponse.betEth = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue(); |
| | | typedResponse.memberId = (BigInteger) eventValues.getNonIndexedValues().get(1).getValue(); |
| | | typedResponse.refProfitRate = (BigInteger) eventValues.getNonIndexedValues().get(2).getValue(); |
| | | return typedResponse; |
| | | } |
| | | }); |
| | | } |
| | | |
| | | public Flowable<BettingEventResponse> bettingEventFlowable(DefaultBlockParameter startBlock, DefaultBlockParameter endBlock) { |
| | | EthFilter filter = new EthFilter(startBlock, endBlock, getContractAddress()); |
| | | filter.addSingleTopic(EventEncoder.encode(BETTING_EVENT)); |
| | | return bettingEventFlowable(filter); |
| | | } |
| | | |
| | | public List<RegisEventResponse> getRegisEvents(TransactionReceipt transactionReceipt) { |
| | | List<EventValuesWithLog> valueList = extractEventParametersWithLog(REGIS_EVENT, transactionReceipt); |
| | | ArrayList<RegisEventResponse> responses = new ArrayList<RegisEventResponse>(valueList.size()); |
| | | for (EventValuesWithLog eventValues : valueList) { |
| | | RegisEventResponse typedResponse = new RegisEventResponse(); |
| | | typedResponse.log = eventValues.getLog(); |
| | | typedResponse.from = (String) eventValues.getIndexedValues().get(0).getValue(); |
| | | typedResponse.refferId = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue(); |
| | | typedResponse.memberId = (BigInteger) eventValues.getNonIndexedValues().get(1).getValue(); |
| | | typedResponse.memStr = (String) eventValues.getNonIndexedValues().get(2).getValue(); |
| | | responses.add(typedResponse); |
| | | } |
| | | return responses; |
| | | } |
| | | |
| | | public Flowable<RegisEventResponse> regisEventFlowable(EthFilter filter) { |
| | | return web3j.ethLogFlowable(filter).map(new Function<Log, RegisEventResponse>() { |
| | | @Override |
| | | public RegisEventResponse apply(Log log) { |
| | | EventValuesWithLog eventValues = extractEventParametersWithLog(REGIS_EVENT, log); |
| | | RegisEventResponse typedResponse = new RegisEventResponse(); |
| | | if(eventValues==null){ |
| | | return typedResponse; |
| | | } |
| | | typedResponse.log = log; |
| | | typedResponse.from = (String) eventValues.getIndexedValues().get(0).getValue(); |
| | | typedResponse.refferId = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue(); |
| | | typedResponse.memberId = (BigInteger) eventValues.getNonIndexedValues().get(1).getValue(); |
| | | typedResponse.memStr = (String) eventValues.getNonIndexedValues().get(2).getValue(); |
| | | return typedResponse; |
| | | } |
| | | }); |
| | | } |
| | | |
| | | public Flowable<RegisEventResponse> regisEventFlowable(DefaultBlockParameter startBlock, DefaultBlockParameter endBlock) { |
| | | EthFilter filter = new EthFilter(startBlock, endBlock, getContractAddress()); |
| | | filter.addSingleTopic(EventEncoder.encode(REGIS_EVENT)); |
| | | return regisEventFlowable(filter); |
| | | } |
| | | |
| | | public List<TransferEventResponse> getTransferEvents(TransactionReceipt transactionReceipt) { |
| | | List<EventValuesWithLog> valueList = extractEventParametersWithLog(TRANSFER_EVENT, transactionReceipt); |
| | | ArrayList<TransferEventResponse> responses = new ArrayList<TransferEventResponse>(valueList.size()); |
| | | for (EventValuesWithLog eventValues : valueList) { |
| | | TransferEventResponse typedResponse = new TransferEventResponse(); |
| | | typedResponse.log = eventValues.getLog(); |
| | | typedResponse.from = (String) eventValues.getIndexedValues().get(0).getValue(); |
| | | typedResponse.to = (String) eventValues.getIndexedValues().get(1).getValue(); |
| | | typedResponse.tokens = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue(); |
| | | responses.add(typedResponse); |
| | | } |
| | | return responses; |
| | | } |
| | | |
| | | public Flowable<TransferEventResponse> transferEventFlowable(EthFilter filter) { |
| | | return web3j.ethLogFlowable(filter).map(new Function<Log, TransferEventResponse>() { |
| | | @Override |
| | | public TransferEventResponse apply(Log log) { |
| | | EventValuesWithLog eventValues = extractEventParametersWithLog(TRANSFER_EVENT, log); |
| | | TransferEventResponse typedResponse = new TransferEventResponse(); |
| | | if(eventValues!=null){ |
| | | typedResponse.log = log; |
| | | typedResponse.from = (String) eventValues.getIndexedValues().get(0).getValue(); |
| | | typedResponse.to = (String) eventValues.getIndexedValues().get(1).getValue(); |
| | | typedResponse.tokens = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue(); |
| | | } |
| | | |
| | | return typedResponse; |
| | | } |
| | | }); |
| | | } |
| | | |
| | | public Flowable<TransferEventResponse> transferEventFlowable(Web3j web3j, EthFilter filter) { |
| | | return web3j.ethLogFlowable(filter).map(new Function<Log, TransferEventResponse>() { |
| | | @Override |
| | | public TransferEventResponse apply(Log log) { |
| | | EventValuesWithLog eventValues = extractEventParametersWithLog(TRANSFER_EVENT, log); |
| | | TransferEventResponse typedResponse = new TransferEventResponse(); |
| | | if(eventValues!=null){ |
| | | typedResponse.log = log; |
| | | typedResponse.from = (String) eventValues.getIndexedValues().get(0).getValue(); |
| | | typedResponse.to = (String) eventValues.getIndexedValues().get(1).getValue(); |
| | | typedResponse.tokens = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue(); |
| | | } |
| | | |
| | | return typedResponse; |
| | | } |
| | | }); |
| | | } |
| | | |
| | | public Flowable<TransferEventResponse> transferEventFlowable(DefaultBlockParameter startBlock, DefaultBlockParameter endBlock) { |
| | | EthFilter filter = new EthFilter(startBlock, endBlock, getContractAddress()); |
| | | filter.addSingleTopic(EventEncoder.encode(TRANSFER_EVENT)); |
| | | return transferEventFlowable(filter); |
| | | } |
| | | |
| | | public RemoteFunctionCall<BigInteger> allowance(String tokenOwner, String spender) { |
| | | final org.web3j.abi.datatypes.Function function = new org.web3j.abi.datatypes.Function(FUNC_ALLOWANCE, |
| | | Arrays.<Type>asList(new Address(160, tokenOwner), |
| | | new Address(160, spender)), |
| | | Arrays.<TypeReference<?>>asList(new TypeReference<Uint256>() {})); |
| | | return executeRemoteCallSingleValueReturn(function, BigInteger.class); |
| | | } |
| | | |
| | | public RemoteFunctionCall<TransactionReceipt> approve(String spender, BigInteger tokens) { |
| | | final org.web3j.abi.datatypes.Function function = new org.web3j.abi.datatypes.Function( |
| | | FUNC_APPROVE, |
| | | Arrays.<Type>asList(new Address(160, spender), |
| | | new Uint256(tokens)), |
| | | Collections.<TypeReference<?>>emptyList()); |
| | | return executeRemoteCallTransaction(function); |
| | | } |
| | | |
| | | public RemoteFunctionCall<BigInteger> balanceOf(String param0) { |
| | | final org.web3j.abi.datatypes.Function function = new org.web3j.abi.datatypes.Function(FUNC_BALANCEOF, |
| | | Arrays.<Type>asList(new Address(160, param0)), |
| | | Arrays.<TypeReference<?>>asList(new TypeReference<Uint256>() {})); |
| | | return executeRemoteCallSingleValueReturn(function, BigInteger.class); |
| | | } |
| | | |
| | | public RemoteFunctionCall<BigInteger> betMemberIdTotal(BigInteger param0) { |
| | | final org.web3j.abi.datatypes.Function function = new org.web3j.abi.datatypes.Function(FUNC_BETMEMBERIDTOTAL, |
| | | Arrays.<Type>asList(new Uint256(param0)), |
| | | Arrays.<TypeReference<?>>asList(new TypeReference<Uint256>() {})); |
| | | return executeRemoteCallSingleValueReturn(function, BigInteger.class); |
| | | } |
| | | |
| | | public RemoteFunctionCall<TransactionReceipt> bettingEth(BigInteger weiValue) { |
| | | final org.web3j.abi.datatypes.Function function = new org.web3j.abi.datatypes.Function( |
| | | FUNC_BETTINGETH, |
| | | Arrays.<Type>asList(), |
| | | Collections.<TypeReference<?>>emptyList()); |
| | | return executeRemoteCallTransaction(function, weiValue); |
| | | } |
| | | |
| | | public RemoteFunctionCall<BigInteger> bettingTotal() { |
| | | final org.web3j.abi.datatypes.Function function = new org.web3j.abi.datatypes.Function(FUNC_BETTINGTOTAL, |
| | | Arrays.<Type>asList(), |
| | | Arrays.<TypeReference<?>>asList(new TypeReference<Uint256>() {})); |
| | | return executeRemoteCallSingleValueReturn(function, BigInteger.class); |
| | | } |
| | | |
| | | public RemoteFunctionCall<BigInteger> burnTokenFee() { |
| | | final org.web3j.abi.datatypes.Function function = new org.web3j.abi.datatypes.Function(FUNC_BURNTOKENFEE, |
| | | Arrays.<Type>asList(), |
| | | Arrays.<TypeReference<?>>asList(new TypeReference<Uint256>() {})); |
| | | return executeRemoteCallSingleValueReturn(function, BigInteger.class); |
| | | } |
| | | |
| | | public RemoteFunctionCall<BigInteger> burnTotal() { |
| | | final org.web3j.abi.datatypes.Function function = new org.web3j.abi.datatypes.Function(FUNC_BURNTOTAL, |
| | | Arrays.<Type>asList(), |
| | | Arrays.<TypeReference<?>>asList(new TypeReference<Uint256>() {})); |
| | | return executeRemoteCallSingleValueReturn(function, BigInteger.class); |
| | | } |
| | | |
| | | public RemoteFunctionCall<TransactionReceipt> buyToken(String memIdStr, String referIdStr, BigInteger weiValue) { |
| | | final org.web3j.abi.datatypes.Function function = new org.web3j.abi.datatypes.Function( |
| | | FUNC_BUYTOKEN, |
| | | Arrays.<Type>asList(new Utf8String(memIdStr), |
| | | new Utf8String(referIdStr)), |
| | | Collections.<TypeReference<?>>emptyList()); |
| | | return executeRemoteCallTransaction(function, weiValue); |
| | | } |
| | | |
| | | public RemoteFunctionCall<BigInteger> childrenMap(BigInteger param0, BigInteger param1) { |
| | | final org.web3j.abi.datatypes.Function function = new org.web3j.abi.datatypes.Function(FUNC_CHILDRENMAP, |
| | | Arrays.<Type>asList(new Uint256(param0), |
| | | new Uint256(param1)), |
| | | Arrays.<TypeReference<?>>asList(new TypeReference<Uint256>() {})); |
| | | return executeRemoteCallSingleValueReturn(function, BigInteger.class); |
| | | } |
| | | |
| | | public RemoteFunctionCall<BigInteger> childs(BigInteger param0) { |
| | | final org.web3j.abi.datatypes.Function function = new org.web3j.abi.datatypes.Function(FUNC_CHILDS, |
| | | Arrays.<Type>asList(new Uint256(param0)), |
| | | Arrays.<TypeReference<?>>asList(new TypeReference<Uint256>() {})); |
| | | return executeRemoteCallSingleValueReturn(function, BigInteger.class); |
| | | } |
| | | |
| | | public RemoteFunctionCall<TransactionReceipt> collectBurnFee(String receiver) { |
| | | final org.web3j.abi.datatypes.Function function = new org.web3j.abi.datatypes.Function( |
| | | FUNC_COLLECTBURNFEE, |
| | | Arrays.<Type>asList(new Address(160, receiver)), |
| | | Collections.<TypeReference<?>>emptyList()); |
| | | return executeRemoteCallTransaction(function); |
| | | } |
| | | |
| | | public RemoteFunctionCall<TransactionReceipt> collectManageFee(String receiver) { |
| | | final org.web3j.abi.datatypes.Function function = new org.web3j.abi.datatypes.Function( |
| | | FUNC_COLLECTMANAGEFEE, |
| | | Arrays.<Type>asList(new Address(160, receiver)), |
| | | Collections.<TypeReference<?>>emptyList()); |
| | | return executeRemoteCallTransaction(function); |
| | | } |
| | | |
| | | public RemoteFunctionCall<BigInteger> decimals() { |
| | | final org.web3j.abi.datatypes.Function function = new org.web3j.abi.datatypes.Function(FUNC_DECIMALS, |
| | | Arrays.<Type>asList(), |
| | | Arrays.<TypeReference<?>>asList(new TypeReference<Uint8>() {})); |
| | | return executeRemoteCallSingleValueReturn(function, BigInteger.class); |
| | | } |
| | | |
| | | public RemoteFunctionCall<TransactionReceipt> extractEth() { |
| | | final org.web3j.abi.datatypes.Function function = new org.web3j.abi.datatypes.Function( |
| | | FUNC_EXTRACTETH, |
| | | Arrays.<Type>asList(), |
| | | Collections.<TypeReference<?>>emptyList()); |
| | | return executeRemoteCallTransaction(function); |
| | | } |
| | | |
| | | public RemoteFunctionCall<BigInteger> frozen() { |
| | | final org.web3j.abi.datatypes.Function function = new org.web3j.abi.datatypes.Function(FUNC_FROZEN, |
| | | Arrays.<Type>asList(), |
| | | Arrays.<TypeReference<?>>asList(new TypeReference<Uint8>() {})); |
| | | return executeRemoteCallSingleValueReturn(function, BigInteger.class); |
| | | } |
| | | |
| | | public RemoteFunctionCall<TransactionReceipt> frozenProfit(BigInteger frozenParam) { |
| | | final org.web3j.abi.datatypes.Function function = new org.web3j.abi.datatypes.Function( |
| | | FUNC_FROZENPROFIT, |
| | | Arrays.<Type>asList(new Uint8(frozenParam)), |
| | | Collections.<TypeReference<?>>emptyList()); |
| | | return executeRemoteCallTransaction(function); |
| | | } |
| | | |
| | | public RemoteFunctionCall<BigInteger> manageFee() { |
| | | final org.web3j.abi.datatypes.Function function = new org.web3j.abi.datatypes.Function(FUNC_MANAGEFEE, |
| | | Arrays.<Type>asList(), |
| | | Arrays.<TypeReference<?>>asList(new TypeReference<Uint256>() {})); |
| | | return executeRemoteCallSingleValueReturn(function, BigInteger.class); |
| | | } |
| | | |
| | | public RemoteFunctionCall<Tuple14<BigInteger, BigInteger, BigInteger, BigInteger, BigInteger, BigInteger, BigInteger, BigInteger, BigInteger, BigInteger, BigInteger, Boolean, Boolean, Boolean>> memberData(BigInteger param0) { |
| | | final org.web3j.abi.datatypes.Function function = new org.web3j.abi.datatypes.Function(FUNC_MEMBERDATA, |
| | | Arrays.<Type>asList(new Uint256(param0)), |
| | | Arrays.<TypeReference<?>>asList(new TypeReference<Uint256>() {}, new TypeReference<Uint256>() {}, new TypeReference<Uint256>() {}, new TypeReference<Uint256>() {}, new TypeReference<Uint256>() {}, new TypeReference<Uint256>() {}, new TypeReference<Uint256>() {}, new TypeReference<Uint256>() {}, new TypeReference<Uint256>() {}, new TypeReference<Uint256>() {}, new TypeReference<Uint256>() {}, new TypeReference<Bool>() {}, new TypeReference<Bool>() {}, new TypeReference<Bool>() {})); |
| | | return new RemoteFunctionCall<Tuple14<BigInteger, BigInteger, BigInteger, BigInteger, BigInteger, BigInteger, BigInteger, BigInteger, BigInteger, BigInteger, BigInteger, Boolean, Boolean, Boolean>>(function, |
| | | new Callable<Tuple14<BigInteger, BigInteger, BigInteger, BigInteger, BigInteger, BigInteger, BigInteger, BigInteger, BigInteger, BigInteger, BigInteger, Boolean, Boolean, Boolean>>() { |
| | | @Override |
| | | public Tuple14<BigInteger, BigInteger, BigInteger, BigInteger, BigInteger, BigInteger, BigInteger, BigInteger, BigInteger, BigInteger, BigInteger, Boolean, Boolean, Boolean> call() throws Exception { |
| | | List<Type> results = executeCallMultipleValueReturn(function); |
| | | return new Tuple14<BigInteger, BigInteger, BigInteger, BigInteger, BigInteger, BigInteger, BigInteger, BigInteger, BigInteger, BigInteger, BigInteger, Boolean, Boolean, Boolean>( |
| | | (BigInteger) results.get(0).getValue(), |
| | | (BigInteger) results.get(1).getValue(), |
| | | (BigInteger) results.get(2).getValue(), |
| | | (BigInteger) results.get(3).getValue(), |
| | | (BigInteger) results.get(4).getValue(), |
| | | (BigInteger) results.get(5).getValue(), |
| | | (BigInteger) results.get(6).getValue(), |
| | | (BigInteger) results.get(7).getValue(), |
| | | (BigInteger) results.get(8).getValue(), |
| | | (BigInteger) results.get(9).getValue(), |
| | | (BigInteger) results.get(10).getValue(), |
| | | (Boolean) results.get(11).getValue(), |
| | | (Boolean) results.get(12).getValue(), |
| | | (Boolean) results.get(13).getValue()); |
| | | } |
| | | }); |
| | | } |
| | | |
| | | public RemoteFunctionCall<BigInteger> memberMap(String param0) { |
| | | final org.web3j.abi.datatypes.Function function = new org.web3j.abi.datatypes.Function(FUNC_MEMBERMAP, |
| | | Arrays.<Type>asList(new Address(160, param0)), |
| | | Arrays.<TypeReference<?>>asList(new TypeReference<Uint256>() {})); |
| | | return executeRemoteCallSingleValueReturn(function, BigInteger.class); |
| | | } |
| | | |
| | | public RemoteFunctionCall<TransactionReceipt> memberProfit(List<BigInteger> memberArr, List<BigInteger> memberAccess, List<BigInteger> memberTotalProfit) { |
| | | final org.web3j.abi.datatypes.Function function = new org.web3j.abi.datatypes.Function( |
| | | FUNC_MEMBERPROFIT, |
| | | Arrays.<Type>asList(new DynamicArray<Uint256>( |
| | | Uint256.class, |
| | | org.web3j.abi.Utils.typeMap(memberArr, Uint256.class)), |
| | | new DynamicArray<Uint256>( |
| | | Uint256.class, |
| | | org.web3j.abi.Utils.typeMap(memberAccess, Uint256.class)), |
| | | new DynamicArray<Uint256>( |
| | | Uint256.class, |
| | | org.web3j.abi.Utils.typeMap(memberTotalProfit, Uint256.class))), |
| | | Collections.<TypeReference<?>>emptyList()); |
| | | return executeRemoteCallTransaction(function); |
| | | } |
| | | |
| | | public RemoteFunctionCall<String> memberRel(BigInteger param0) { |
| | | final org.web3j.abi.datatypes.Function function = new org.web3j.abi.datatypes.Function(FUNC_MEMBERREL, |
| | | Arrays.<Type>asList(new Uint256(param0)), |
| | | Arrays.<TypeReference<?>>asList(new TypeReference<Utf8String>() {})); |
| | | return executeRemoteCallSingleValueReturn(function, String.class); |
| | | } |
| | | |
| | | public RemoteFunctionCall<BigInteger> memberRelStr(String param0) { |
| | | final org.web3j.abi.datatypes.Function function = new org.web3j.abi.datatypes.Function(FUNC_MEMBERRELSTR, |
| | | Arrays.<Type>asList(new Utf8String(param0)), |
| | | Arrays.<TypeReference<?>>asList(new TypeReference<Uint256>() {})); |
| | | return executeRemoteCallSingleValueReturn(function, BigInteger.class); |
| | | } |
| | | |
| | | public RemoteFunctionCall<String> name() { |
| | | final org.web3j.abi.datatypes.Function function = new org.web3j.abi.datatypes.Function(FUNC_NAME, |
| | | Arrays.<Type>asList(), |
| | | Arrays.<TypeReference<?>>asList(new TypeReference<Utf8String>() {})); |
| | | return executeRemoteCallSingleValueReturn(function, String.class); |
| | | } |
| | | |
| | | public RemoteFunctionCall<BigInteger> outTotal() { |
| | | final org.web3j.abi.datatypes.Function function = new org.web3j.abi.datatypes.Function(FUNC_OUTTOTAL, |
| | | Arrays.<Type>asList(), |
| | | Arrays.<TypeReference<?>>asList(new TypeReference<Uint256>() {})); |
| | | return executeRemoteCallSingleValueReturn(function, BigInteger.class); |
| | | } |
| | | |
| | | public RemoteFunctionCall<String> owner() { |
| | | final org.web3j.abi.datatypes.Function function = new org.web3j.abi.datatypes.Function(FUNC_OWNER, |
| | | Arrays.<Type>asList(), |
| | | Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {})); |
| | | return executeRemoteCallSingleValueReturn(function, String.class); |
| | | } |
| | | |
| | | public RemoteFunctionCall<BigInteger> rate() { |
| | | final org.web3j.abi.datatypes.Function function = new org.web3j.abi.datatypes.Function(FUNC_RATE, |
| | | Arrays.<Type>asList(), |
| | | Arrays.<TypeReference<?>>asList(new TypeReference<Uint256>() {})); |
| | | return executeRemoteCallSingleValueReturn(function, BigInteger.class); |
| | | } |
| | | |
| | | public RemoteFunctionCall<TransactionReceipt> reg(BigInteger memberId, String memIdStr, BigInteger referId) { |
| | | final org.web3j.abi.datatypes.Function function = new org.web3j.abi.datatypes.Function( |
| | | FUNC_REG, |
| | | Arrays.<Type>asList(new Uint256(memberId), |
| | | new Utf8String(memIdStr), |
| | | new Uint256(referId)), |
| | | Collections.<TypeReference<?>>emptyList()); |
| | | return executeRemoteCallTransaction(function); |
| | | } |
| | | |
| | | public RemoteFunctionCall<TransactionReceipt> setMemberParent(BigInteger memberId, BigInteger parentId) { |
| | | final org.web3j.abi.datatypes.Function function = new org.web3j.abi.datatypes.Function( |
| | | FUNC_SETMEMBERPARENT, |
| | | Arrays.<Type>asList(new Uint256(memberId), |
| | | new Uint256(parentId)), |
| | | Collections.<TypeReference<?>>emptyList()); |
| | | return executeRemoteCallTransaction(function); |
| | | } |
| | | |
| | | public RemoteFunctionCall<String> symbol() { |
| | | final org.web3j.abi.datatypes.Function function = new org.web3j.abi.datatypes.Function(FUNC_SYMBOL, |
| | | Arrays.<Type>asList(), |
| | | Arrays.<TypeReference<?>>asList(new TypeReference<Utf8String>() {})); |
| | | return executeRemoteCallSingleValueReturn(function, String.class); |
| | | } |
| | | |
| | | public RemoteFunctionCall<TransactionReceipt> testReg(BigInteger len) { |
| | | final org.web3j.abi.datatypes.Function function = new org.web3j.abi.datatypes.Function( |
| | | FUNC_TESTREG, |
| | | Arrays.<Type>asList(new Uint256(len)), |
| | | Collections.<TypeReference<?>>emptyList()); |
| | | return executeRemoteCallTransaction(function); |
| | | } |
| | | |
| | | public RemoteFunctionCall<BigInteger> tokenBuyTotal() { |
| | | final org.web3j.abi.datatypes.Function function = new org.web3j.abi.datatypes.Function(FUNC_TOKENBUYTOTAL, |
| | | Arrays.<Type>asList(), |
| | | Arrays.<TypeReference<?>>asList(new TypeReference<Uint256>() {})); |
| | | return executeRemoteCallSingleValueReturn(function, BigInteger.class); |
| | | } |
| | | |
| | | public RemoteFunctionCall<BigInteger> totalSupply() { |
| | | final org.web3j.abi.datatypes.Function function = new org.web3j.abi.datatypes.Function(FUNC_TOTALSUPPLY, |
| | | Arrays.<Type>asList(), |
| | | Arrays.<TypeReference<?>>asList(new TypeReference<Uint256>() {})); |
| | | return executeRemoteCallSingleValueReturn(function, BigInteger.class); |
| | | } |
| | | |
| | | public RemoteFunctionCall<BigInteger> touzhu(BigInteger param0) { |
| | | final org.web3j.abi.datatypes.Function function = new org.web3j.abi.datatypes.Function(FUNC_TOUZHU, |
| | | Arrays.<Type>asList(new Uint256(param0)), |
| | | Arrays.<TypeReference<?>>asList(new TypeReference<Uint256>() {})); |
| | | return executeRemoteCallSingleValueReturn(function, BigInteger.class); |
| | | } |
| | | |
| | | public RemoteFunctionCall<TransactionReceipt> transfer(String to, BigInteger tokens) { |
| | | final org.web3j.abi.datatypes.Function function = new org.web3j.abi.datatypes.Function( |
| | | FUNC_TRANSFER, |
| | | Arrays.<Type>asList(new Address(160, to), |
| | | new Uint256(tokens)), |
| | | Collections.<TypeReference<?>>emptyList()); |
| | | return executeRemoteCallTransaction(function); |
| | | } |
| | | |
| | | public RemoteFunctionCall<TransactionReceipt> transferFrom(String from, String to, BigInteger tokens) { |
| | | final org.web3j.abi.datatypes.Function function = new org.web3j.abi.datatypes.Function( |
| | | FUNC_TRANSFERFROM, |
| | | Arrays.<Type>asList(new Address(160, from), |
| | | new Address(160, to), |
| | | new Uint256(tokens)), |
| | | Collections.<TypeReference<?>>emptyList()); |
| | | return executeRemoteCallTransaction(function); |
| | | } |
| | | |
| | | |
| | | public RemoteFunctionCall<TransactionReceipt> setMemberTop(List<BigInteger> memberArr, List<BigInteger> topArr) { |
| | | final org.web3j.abi.datatypes.Function function = new org.web3j.abi.datatypes.Function( |
| | | FUNC_SETMEMBERTOP, |
| | | Arrays.<Type>asList(new DynamicArray<Uint256>( |
| | | Uint256.class, |
| | | org.web3j.abi.Utils.typeMap(memberArr, Uint256.class)), |
| | | new DynamicArray<Uint256>( |
| | | Uint256.class, |
| | | org.web3j.abi.Utils.typeMap(topArr, Uint256.class))), |
| | | Collections.<TypeReference<?>>emptyList()); |
| | | return executeRemoteCallTransaction(function); |
| | | } |
| | | |
| | | public RemoteFunctionCall<TransactionReceipt> memTokens(String receiver, BigInteger tokens) { |
| | | final org.web3j.abi.datatypes.Function function = new org.web3j.abi.datatypes.Function( |
| | | FUNC_MEMTOKENS, |
| | | Arrays.<Type>asList(new Address(160, receiver), |
| | | new Uint256(tokens)), |
| | | Collections.<TypeReference<?>>emptyList()); |
| | | return executeRemoteCallTransaction(function); |
| | | } |
| | | |
| | | @Deprecated |
| | | public static EthUsdtContract load(String contractAddress, Web3j web3j, Credentials credentials, BigInteger gasPrice, BigInteger gasLimit) { |
| | | return new EthUsdtContract(contractAddress, web3j, credentials, gasPrice, gasLimit); |
| | | } |
| | | |
| | | @Deprecated |
| | | public static EthUsdtContract load(String contractAddress, Web3j web3j, TransactionManager transactionManager, BigInteger gasPrice, BigInteger gasLimit) { |
| | | return new EthUsdtContract(contractAddress, web3j, transactionManager, gasPrice, gasLimit); |
| | | } |
| | | |
| | | public static EthUsdtContract load(String contractAddress, Web3j web3j, Credentials credentials, ContractGasProvider contractGasProvider) { |
| | | return new EthUsdtContract(contractAddress, web3j, credentials, contractGasProvider); |
| | | } |
| | | |
| | | public static EthUsdtContract load(String contractAddress, Web3j web3j, TransactionManager transactionManager, ContractGasProvider contractGasProvider) { |
| | | return new EthUsdtContract(contractAddress, web3j, transactionManager, contractGasProvider); |
| | | } |
| | | |
| | | public static RemoteCall<EthUsdtContract> deploy(Web3j web3j, Credentials credentials, ContractGasProvider contractGasProvider, BigInteger initialWeiValue) { |
| | | return deployRemoteCall(EthUsdtContract.class, web3j, credentials, contractGasProvider, BINARY, "", initialWeiValue); |
| | | } |
| | | |
| | | public static RemoteCall<EthUsdtContract> deploy(Web3j web3j, TransactionManager transactionManager, ContractGasProvider contractGasProvider, BigInteger initialWeiValue) { |
| | | return deployRemoteCall(EthUsdtContract.class, web3j, transactionManager, contractGasProvider, BINARY, "", initialWeiValue); |
| | | } |
| | | |
| | | @Deprecated |
| | | public static RemoteCall<EthUsdtContract> deploy(Web3j web3j, Credentials credentials, BigInteger gasPrice, BigInteger gasLimit, BigInteger initialWeiValue) { |
| | | return deployRemoteCall(EthUsdtContract.class, web3j, credentials, gasPrice, gasLimit, BINARY, "", initialWeiValue); |
| | | } |
| | | |
| | | @Deprecated |
| | | public static RemoteCall<EthUsdtContract> deploy(Web3j web3j, TransactionManager transactionManager, BigInteger gasPrice, BigInteger gasLimit, BigInteger initialWeiValue) { |
| | | return deployRemoteCall(EthUsdtContract.class, web3j, transactionManager, gasPrice, gasLimit, BINARY, "", initialWeiValue); |
| | | } |
| | | |
| | | public static class ApprovalEventResponse extends BaseEventResponse { |
| | | public String tokenOwner; |
| | | |
| | | public String spender; |
| | | |
| | | public BigInteger tokens; |
| | | } |
| | | |
| | | public static class BettingEventResponse extends BaseEventResponse { |
| | | public String from; |
| | | |
| | | public BigInteger betEth; |
| | | |
| | | public BigInteger memberId; |
| | | |
| | | public BigInteger refProfitRate; |
| | | } |
| | | |
| | | public static class RegisEventResponse extends BaseEventResponse { |
| | | public String from; |
| | | |
| | | public BigInteger refferId; |
| | | |
| | | public BigInteger memberId; |
| | | |
| | | public String memStr; |
| | | } |
| | | |
| | | public static class TransferEventResponse extends BaseEventResponse { |
| | | public String from; |
| | | |
| | | public String to; |
| | | |
| | | public BigInteger tokens; |
| | | } |
| | | } |
New file |
| | |
| | | package cc.mrbird.febs.mall.chain.ercCoin.quartz; |
| | | |
| | | import cc.mrbird.febs.common.utils.AppContants; |
| | | import cc.mrbird.febs.common.utils.RedisUtils; |
| | | import cc.mrbird.febs.mall.chain.ercCoin.ChainEnum; |
| | | import cc.mrbird.febs.mall.chain.ercCoin.ChainService; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; |
| | | import org.springframework.scheduling.annotation.Scheduled; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import java.math.BigInteger; |
| | | |
| | | @Slf4j |
| | | @Component |
| | | @ConditionalOnProperty(prefix = "chain", name = "bsc", havingValue = "true") |
| | | public class ChainSDMListenerJob{ |
| | | |
| | | @Autowired |
| | | private RedisUtils redisUtils; |
| | | |
| | | @Scheduled(cron = "0 0/5 * * * ? ") |
| | | public void chainBlockUpdate() { |
| | | BigInteger blockNumber = ChainService.getInstance(ChainEnum.BSC_USDT.name()).blockNumber(); |
| | | |
| | | redisUtils.set(AppContants.REDIS_KEY_BLOCK_ETH_NEWEST_NUM, blockNumber); |
| | | } |
| | | |
| | | @Scheduled(cron = "0/2 * * * * ? ") |
| | | public void chainIncrementBlock() { |
| | | Object newestBlockObj = redisUtils.get(AppContants.REDIS_KEY_BLOCK_ETH_NEWEST_NUM); |
| | | BigInteger newestBlock; |
| | | if (newestBlockObj == null) { |
| | | newestBlock = ChainService.getInstance(ChainEnum.BSC_USDT.name()).blockNumber(); |
| | | } else { |
| | | newestBlock = (BigInteger) newestBlockObj; |
| | | } |
| | | |
| | | Object incrementObj = redisUtils.get(AppContants.REDIS_KEY_BLOCK_ETH_INCREMENT_NUM); |
| | | BigInteger toIncrement; |
| | | if (incrementObj == null) { |
| | | toIncrement = newestBlock; |
| | | } else { |
| | | BigInteger incrementBlock = (BigInteger) incrementObj; |
| | | |
| | | // 最新区块小于增加区块 |
| | | if (newestBlock.compareTo(incrementBlock) <= 0) { |
| | | return; |
| | | } |
| | | toIncrement = incrementBlock.add(BigInteger.ONE); |
| | | } |
| | | |
| | | redisUtils.set(AppContants.REDIS_KEY_BLOCK_ETH_INCREMENT_NUM, toIncrement); |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package cc.mrbird.febs.mall.chain.ercCoin.quartz; |
| | | |
| | | import cc.mrbird.febs.common.utils.AppContants; |
| | | import cc.mrbird.febs.common.utils.RedisUtils; |
| | | import cc.mrbird.febs.mall.chain.ercCoin.ChainEnum; |
| | | import cc.mrbird.febs.mall.chain.ercCoin.ChainService; |
| | | import cc.mrbird.febs.mall.chain.ercCoin.ContractEventService; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.boot.ApplicationArguments; |
| | | import org.springframework.boot.ApplicationRunner; |
| | | import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import java.math.BigInteger; |
| | | |
| | | @Slf4j |
| | | @Component |
| | | @ConditionalOnProperty(prefix = "chain", name = "bsc", havingValue = "true") |
| | | public class ChainSDMRunner implements ApplicationRunner { |
| | | @Autowired |
| | | private ContractEventService bscUsdtContractEvent; |
| | | |
| | | @Autowired |
| | | private RedisUtils redisUtils; |
| | | |
| | | @Override |
| | | public void run(ApplicationArguments args) throws Exception { |
| | | long start = System.currentTimeMillis(); |
| | | log.info("区块链USDT开始启动"); |
| | | |
| | | Object incrementObj = redisUtils.get(AppContants.REDIS_KEY_BLOCK_ETH_INCREMENT_NUM); |
| | | BigInteger newest = ChainService.getInstance(ChainEnum.BSC_USDT.name()).blockNumber(); |
| | | BigInteger block; |
| | | if (incrementObj == null) { |
| | | block = newest; |
| | | } else { |
| | | block = (BigInteger) incrementObj; |
| | | } |
| | | |
| | | BigInteger section = BigInteger.valueOf(5000); |
| | | log.info("监听:[{} - {} - {}]", newest,block,newest.subtract(block).compareTo(section) > -1); |
| | | while (newest.subtract(block).compareTo(section) > -1) { |
| | | BigInteger end = block.add(section); |
| | | log.info("监听:[{} - {}]", block, end); |
| | | ChainService.sdmUSDTEventListener(block, end, bscUsdtContractEvent, ChainEnum.BSC_USDT.name()); |
| | | |
| | | block = block.add(section); |
| | | if (block.compareTo(newest) > 0) { |
| | | block = newest; |
| | | } |
| | | } |
| | | |
| | | ChainService.sdmUSDTEventListener(block, null, bscUsdtContractEvent, ChainEnum.BSC_USDT.name()); |
| | | |
| | | long end = System.currentTimeMillis(); |
| | | log.info("区块链滑点启动完成, 消耗时间{}", end - start); |
| | | } |
| | | } |
New file |
| | |
| | | package cc.mrbird.febs.mall.chain.trcCoin; |
| | | |
| | | import okhttp3.*; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | |
| | | import java.io.IOException; |
| | | import java.nio.charset.StandardCharsets; |
| | | import java.util.Map; |
| | | import java.util.Objects; |
| | | |
| | | public class OkHttpUtil2 { |
| | | protected final static Logger logger = LoggerFactory.getLogger(OkHttpUtil2.class); |
| | | private static Dispatcher dispatcher = new Dispatcher(); |
| | | |
| | | static { |
| | | dispatcher.setMaxRequests(200); |
| | | dispatcher.setMaxRequestsPerHost(100); |
| | | } |
| | | |
| | | private static OkHttpClient httpClient = new OkHttpClient.Builder().dispatcher(dispatcher).build(); |
| | | |
| | | public static byte[] doGet(String url, Map<String, String[]> header, Map<String, String[]> params, String expectContentType) { |
| | | Request.Builder builder = new Request.Builder(); |
| | | addHeader(builder, header); |
| | | addUrlParam(builder, url, params); |
| | | return requestExec(builder.build(), expectContentType); |
| | | } |
| | | |
| | | public static byte[] doGetSingle(String url, Map<String, String> header, Map<String, String> params, String expectContentType) { |
| | | Request.Builder builder = new Request.Builder(); |
| | | addHeaderSingle(builder, header); |
| | | addUrlParamSingle(builder, url, params); |
| | | return requestExec(builder.build(), expectContentType); |
| | | } |
| | | |
| | | public static byte[] doPost(String url, Map<String, String[]> header, Map<String, String[]> body, String expectContentType) { |
| | | Request.Builder builder = new Request.Builder().url(url); |
| | | addHeader(builder, header); |
| | | addBodyParam(builder, body, "POST"); |
| | | return requestExec(builder.build(), expectContentType); |
| | | } |
| | | |
| | | |
| | | |
| | | private static void addHeaderSingle(Request.Builder builder, Map<String, String> header) { |
| | | if (header == null) { |
| | | return; |
| | | } |
| | | for (String key : header.keySet()) { |
| | | String value = header.get(key); |
| | | if (value != null) { |
| | | builder.addHeader(key, value); |
| | | } |
| | | } |
| | | } |
| | | |
| | | private static void addHeader(Request.Builder builder, Map<String, String[]> header) { |
| | | if (header == null) { |
| | | return; |
| | | } |
| | | for (String key : header.keySet()) { |
| | | String[] values = header.get(key); |
| | | if (values != null) { |
| | | for (String value : values) { |
| | | builder.addHeader(key, value); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | private static void addUrlParam(Request.Builder builder, String url, Map<String, String[]> params) { |
| | | if (params == null) { |
| | | return; |
| | | } |
| | | HttpUrl.Builder urlBuilder = HttpUrl.parse(url).newBuilder(); |
| | | for (String key : params.keySet()) { |
| | | String[] values = params.get(key); |
| | | if (values != null) { |
| | | for (String value : values) { |
| | | urlBuilder.addQueryParameter(key, value); |
| | | } |
| | | } |
| | | } |
| | | builder.url(urlBuilder.build()); |
| | | } |
| | | |
| | | private static void addUrlParamSingle(Request.Builder builder, String url, Map<String, String> params) { |
| | | if (params == null) { |
| | | return; |
| | | } |
| | | HttpUrl.Builder urlBuilder = HttpUrl.parse(url).newBuilder(); |
| | | for (String key : params.keySet()) { |
| | | String value = params.get(key); |
| | | if (value != null) { |
| | | urlBuilder.addQueryParameter(key, value); |
| | | } |
| | | } |
| | | builder.url(urlBuilder.build()); |
| | | } |
| | | |
| | | private static void addBodyParam(Request.Builder builder, Map<String, String[]> body, String method) { |
| | | if (body == null) { |
| | | return; |
| | | } |
| | | FormBody.Builder formBodyBuilder = new FormBody.Builder(StandardCharsets.UTF_8); |
| | | for (String key : body.keySet()) { |
| | | String[] values = body.get(key); |
| | | if (values != null) { |
| | | for (String value : values) { |
| | | formBodyBuilder.add(key, value); |
| | | } |
| | | } |
| | | } |
| | | builder.method(method, formBodyBuilder.build()); |
| | | } |
| | | |
| | | private static byte[] requestExec(Request request, String expectContentType) { |
| | | Objects.requireNonNull(request, "okHttp request is null"); |
| | | |
| | | try (Response response = httpClient.newCall(request).execute()) { |
| | | if (response.code() == 200) { |
| | | ResponseBody body = response.body(); |
| | | if (body != null) { |
| | | byte[] bytes = body.bytes(); |
| | | String contentType = response.header("Content-Type"); |
| | | if (contentType != null && !contentType.contains(expectContentType)) { |
| | | String res = new String(bytes, StandardCharsets.UTF_8); |
| | | System.out.println(res); |
| | | return bytes; |
| | | } |
| | | return bytes; |
| | | } |
| | | logger.error("response body is null"); |
| | | System.out.println("response body is null"); |
| | | } else { |
| | | ResponseBody body = response.body(); |
| | | String res = ""; |
| | | byte[] bytes = null; |
| | | if (body != null) { |
| | | bytes = body.bytes(); |
| | | String contentType = response.header("Content-Type"); |
| | | if (contentType != null && !contentType.contains(expectContentType)) { |
| | | //res = new String(body.bytes(), StandardCharsets.UTF_8); |
| | | //return body.bytes(); |
| | | } |
| | | res = new String(bytes, StandardCharsets.UTF_8); |
| | | |
| | | } |
| | | logger.error("request failed, http code:{},responseBody:{} ", response.code(), res); |
| | | System.out.println("request failed, http code: " + response.code()); |
| | | |
| | | return bytes; |
| | | } |
| | | } catch (IOException ioException) { |
| | | logger.error("request exec error:", ioException); |
| | | System.out.println("request exec error: " + ioException.getMessage()); |
| | | } |
| | | return null; |
| | | } |
| | | } |
New file |
| | |
| | | package cc.mrbird.febs.mall.chain.trcCoin; |
| | | |
| | | import lombok.Data; |
| | | |
| | | @Data |
| | | public class OklinkDataPageDetailModel { |
| | | private String txId; |
| | | private String blockHash; |
| | | private String height; |
| | | private String transactionTime; |
| | | private String from; |
| | | private String to; |
| | | private String amount; |
| | | private String symbol; |
| | | } |
New file |
| | |
| | | package cc.mrbird.febs.mall.chain.trcCoin; |
| | | |
| | | import lombok.Data; |
| | | |
| | | import java.util.List; |
| | | |
| | | @Data |
| | | public class OklinkDataPageModel { |
| | | private String limit; |
| | | private String page; |
| | | private String totalPage; |
| | | private List<OklinkDataPageDetailModel> transactionList; |
| | | } |
New file |
| | |
| | | package cc.mrbird.febs.mall.chain.trcCoin; |
| | | |
| | | import lombok.Data; |
| | | |
| | | import java.util.List; |
| | | |
| | | @Data |
| | | public class OklinkModel { |
| | | private String code; |
| | | private String msg; |
| | | private List<OklinkDataPageModel> data; |
| | | } |
New file |
| | |
| | | package cc.mrbird.febs.mall.chain.trcCoin.quartz; |
| | | |
| | | import cc.mrbird.febs.common.enumerates.RunVipDataDictionaryEnum; |
| | | import cc.mrbird.febs.common.enumerates.YesOrNoEnum; |
| | | import cc.mrbird.febs.mall.chain.trcCoin.OkHttpUtil2; |
| | | import cc.mrbird.febs.mall.chain.trcCoin.OklinkDataPageDetailModel; |
| | | import cc.mrbird.febs.mall.chain.trcCoin.OklinkModel; |
| | | import cc.mrbird.febs.mall.entity.MallCharge; |
| | | import cc.mrbird.febs.mall.mapper.DataDictionaryCustomMapper; |
| | | import cc.mrbird.febs.mall.mapper.MallChargeMapper; |
| | | import cc.mrbird.febs.rabbit.producter.AgentProducer; |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.util.StrUtil; |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; |
| | | import org.springframework.scheduling.annotation.Scheduled; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.math.BigDecimal; |
| | | import java.nio.charset.StandardCharsets; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | @Slf4j |
| | | @Component |
| | | @ConditionalOnProperty(prefix = "chain", name = "trc", havingValue = "true") |
| | | public class ChainTrcListenerJob { |
| | | |
| | | @Resource |
| | | private DataDictionaryCustomMapper dataDictionaryCustomMapper; |
| | | |
| | | @Resource |
| | | private MallChargeMapper mallChargeMapper; |
| | | @Resource |
| | | private AgentProducer agentProducer; |
| | | |
| | | /** |
| | | * 五分钟 毫秒 |
| | | */ |
| | | private final static long TIME_INTERVAL_1HOUR = 300000*12; |
| | | |
| | | private final static String TRC20_TRANSFER_API = "https://www.oklink.com/api/v5/explorer/address/token-transaction-list"; |
| | | public final static String TRC20_CONTRACT_ADDRESS = "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t"; |
| | | public final static String TRC20_NAME = "TRON"; |
| | | public final static String TOKEN_20 = "token_20"; |
| | | |
| | | /** |
| | | * todo 替换成自己的API-KEY |
| | | */ |
| | | private final static String TRON_API_KEY = "21fc662e-03f1-4f60-9124-7b63c0d6c813"; |
| | | |
| | | private static Map<String, String> REQUEST_HEADER = new HashMap<>(); |
| | | static { |
| | | REQUEST_HEADER.put("Ok-Access-Key", TRON_API_KEY); |
| | | } |
| | | |
| | | @Scheduled(cron = "0 0/2 * * * ? ") |
| | | public void chainBlockUpdate() { |
| | | log.info("TRC20同步"); |
| | | String sysAddress = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | RunVipDataDictionaryEnum.CHARGE_SYS_ADDRESS.getType(), RunVipDataDictionaryEnum.CHARGE_SYS_ADDRESS.getCode() |
| | | ).getValue(); |
| | | String type = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | RunVipDataDictionaryEnum.CHARGE_TYPE_TRC.getType(), RunVipDataDictionaryEnum.CHARGE_TYPE_TRC.getCode() |
| | | ).getValue(); |
| | | |
| | | if(StrUtil.isBlank(sysAddress)){ |
| | | log.info("系统未设置充值地址"); |
| | | return; |
| | | } |
| | | // 定时任务的执行时间和转账时间区间间隔5分钟 |
| | | // 查询过去5分钟的记录 |
| | | Map<String, String> param = new HashMap<>(); |
| | | param.put("chainShortName", TRC20_NAME); |
| | | param.put("protocolType", TOKEN_20); |
| | | param.put("tokenContractAddress", TRC20_CONTRACT_ADDRESS); |
| | | param.put("address", sysAddress); |
| | | param.put("limit", "100"); |
| | | long l = System.currentTimeMillis(); |
| | | byte[] bytes = OkHttpUtil2.doGetSingle(TRC20_TRANSFER_API, REQUEST_HEADER, param, "application/json"); |
| | | |
| | | if (bytes == null) { |
| | | log.error("fyTrc20RechargeOklinkTask查询链上数据返回为空,传参:{}",param); |
| | | return; |
| | | } |
| | | |
| | | String s = new String(bytes, StandardCharsets.UTF_8); |
| | | OklinkModel trc20TransfersModel = JSONObject.parseObject(s, OklinkModel.class); |
| | | List<OklinkDataPageDetailModel> tokenTransfers = trc20TransfersModel.getData().get(0).getTransactionList(); |
| | | if (CollUtil.isEmpty(tokenTransfers)) { |
| | | return; |
| | | } |
| | | long l1 = System.currentTimeMillis(); |
| | | log.info("查询trc耗时:{}", (l1 - l)); |
| | | |
| | | // 有记录 |
| | | for (OklinkDataPageDetailModel tokenTransfer : tokenTransfers) { |
| | | String transactionTime = tokenTransfer.getTransactionTime(); |
| | | |
| | | Long transTime = Long.valueOf(transactionTime); |
| | | if ((transTime + TIME_INTERVAL_1HOUR) < l1) { |
| | | continue; |
| | | } |
| | | // 把1个小时前的数据过滤 |
| | | log.info("链上时间:{}", transactionTime); |
| | | |
| | | // 判断收款地址是否是设置的平台地址 |
| | | if (sysAddress.equals(tokenTransfer.getTo())) { |
| | | |
| | | String transactionId = tokenTransfer.getTxId(); |
| | | LambdaQueryWrapper<MallCharge> mallChargeLambdaQueryWrapper = new LambdaQueryWrapper<>(); |
| | | mallChargeLambdaQueryWrapper.eq(MallCharge::getTransHash, transactionId); |
| | | List<MallCharge> list = mallChargeMapper.selectList(mallChargeLambdaQueryWrapper); |
| | | if(CollUtil.isNotEmpty(list)){ |
| | | log.info("扫描到HASH已使用:{}",transactionId); |
| | | return; |
| | | } |
| | | String fromAddress = tokenTransfer.getFrom(); |
| | | if (fromAddress.equals(sysAddress)) { |
| | | log.info("系统地址转出:{}", transactionId); |
| | | continue; |
| | | } |
| | | |
| | | BigDecimal amount = new BigDecimal(tokenTransfer.getAmount()); |
| | | LambdaQueryWrapper<MallCharge> queryWrapper = new LambdaQueryWrapper<>(); |
| | | queryWrapper.eq(MallCharge::getAddress, fromAddress); |
| | | queryWrapper.eq(MallCharge::getSysAddress, sysAddress); |
| | | queryWrapper.eq(MallCharge::getAmount, amount); |
| | | queryWrapper.eq(MallCharge::getType, type); |
| | | queryWrapper.eq(MallCharge::getState, YesOrNoEnum.ING.getValue()); |
| | | List<MallCharge> mallCharges = mallChargeMapper.selectList(queryWrapper); |
| | | if(CollUtil.isEmpty(mallCharges)){ |
| | | log.info("未查询到匹配充值记录,充值地址:{},HASH:{}",fromAddress,transactionId); |
| | | continue; |
| | | } |
| | | |
| | | MallCharge mallCharge = mallCharges.get(0); |
| | | mallCharge.setState(YesOrNoEnum.YES.getValue()); |
| | | mallChargeMapper.updateById(mallCharge); |
| | | agentProducer.sendBuyVipSuccessMsg(mallCharge.getId()); |
| | | |
| | | log.info("扫描到用户ID:{},地址:{},充值金额:{}", mallCharge.getMemberId(), fromAddress, amount); |
| | | } |
| | | } |
| | | } |
| | | |
| | | } |
| | |
| | | package cc.mrbird.febs.mall.controller; |
| | | |
| | | import cc.mrbird.febs.common.annotation.ControllerEndpoint; |
| | | import cc.mrbird.febs.common.controller.BaseController; |
| | | import cc.mrbird.febs.common.entity.FebsResponse; |
| | | import cc.mrbird.febs.common.entity.QueryRequest; |
| | | import cc.mrbird.febs.mall.entity.MallCharge; |
| | | import cc.mrbird.febs.mall.entity.MallMember; |
| | | import cc.mrbird.febs.mall.entity.MallMemberWithdraw; |
| | | import cc.mrbird.febs.mall.entity.RunVip; |
| | | import cc.mrbird.febs.mall.mapper.MallMemberMapper; |
| | | import cc.mrbird.febs.mall.service.IAdminRunVipService; |
| | | import lombok.RequiredArgsConstructor; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import javax.validation.constraints.NotNull; |
| | | import java.util.Map; |
| | | |
| | | @Slf4j |
| | |
| | | public class AdminRunVipController extends BaseController{ |
| | | |
| | | private final IAdminRunVipService iAdminRunVipService; |
| | | private final MallMemberMapper mallMemberMapper; |
| | | |
| | | @GetMapping(value = "/allVipList") |
| | | public FebsResponse allVipList() { |
| | | return new FebsResponse().success().data(iAdminRunVipService.list()); |
| | | } |
| | | |
| | | @PostMapping("vipLevelSetUpdate") |
| | | public FebsResponse vipLevelSetUpdate(MallMember member) { |
| | | mallMemberMapper.updateVipLevelTimeAndLevel(member.getId(),member.getVipLevelTime(),member.getLevel()); |
| | | return new FebsResponse().success().message("操作成功"); |
| | | } |
| | | |
| | | @GetMapping("/sellList") |
| | | public FebsResponse sellList(MallMemberWithdraw mallMemberWithdraw, QueryRequest request) { |
| | | Map<String, Object> data = getDataTable(iAdminRunVipService.sellList(mallMemberWithdraw,request)); |
| | | return new FebsResponse().success().data(data); |
| | | } |
| | | |
| | | @GetMapping("sellAgree/{state}/{id}") |
| | | @ControllerEndpoint(operation = "碳币提现", exceptionMessage = "操作失败") |
| | | public FebsResponse sellAgree(@NotNull(message = "{required}") @PathVariable Integer state, @NotNull(message = "{required}") @PathVariable Long id) { |
| | | return iAdminRunVipService.sellAgree(state,id); |
| | | } |
| | | |
| | | @GetMapping("/buyList") |
| | | public FebsResponse buyList(MallCharge mallCharge, QueryRequest request) { |
| | | Map<String, Object> data = getDataTable(iAdminRunVipService.buyList(mallCharge,request)); |
| | | return new FebsResponse().success().data(data); |
| | | } |
| | | |
| | | @GetMapping("chargeAgree/{state}/{id}") |
| | | @ControllerEndpoint(operation = "会员购买会员", exceptionMessage = "操作失败") |
| | | public FebsResponse chargeAgree(@NotNull(message = "{required}") @PathVariable Integer state, @NotNull(message = "{required}") @PathVariable Long id) { |
| | | return iAdminRunVipService.chargeAgree(state,id); |
| | | } |
| | | |
| | | @GetMapping("/list") |
| | | public FebsResponse list(RunVip runVip,QueryRequest request) { |
| | |
| | | package cc.mrbird.febs.mall.controller; |
| | | |
| | | import cc.mrbird.febs.common.entity.FebsResponse; |
| | | import cc.mrbird.febs.common.utils.RedisUtils; |
| | | import cc.mrbird.febs.mall.dto.*; |
| | | import cc.mrbird.febs.mall.dto.ForgetPwdDto; |
| | | import cc.mrbird.febs.mall.dto.LoginDto; |
| | | import cc.mrbird.febs.mall.dto.RegisterDto; |
| | | import cc.mrbird.febs.mall.service.IApiMallMemberService; |
| | | import cc.mrbird.febs.pay.model.WxGenerateQrCodeDto; |
| | | import cc.mrbird.febs.pay.service.IXcxPayService; |
| | | import cc.mrbird.febs.pay.util.WechatConfigure; |
| | | import com.alibaba.fastjson.JSON; |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import io.swagger.annotations.Api; |
| | | import io.swagger.annotations.ApiOperation; |
| | | import lombok.RequiredArgsConstructor; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import javax.validation.Valid; |
| | | import java.io.ByteArrayInputStream; |
| | | import java.io.ByteArrayOutputStream; |
| | | import java.io.FileOutputStream; |
| | | import java.io.IOException; |
| | | import java.util.Dictionary; |
| | | import java.util.HashMap; |
| | | import java.util.Map; |
| | | |
| | | /** |
| | | * @author wzy |
| | |
| | | @RequiredArgsConstructor |
| | | @RestController |
| | | @RequestMapping(value = "/api/login") |
| | | @Api(value = "ApiLoginController", tags = "登录注册类") |
| | | @Api(value = "ApiLoginController", tags = "碳积分登录注册类") |
| | | public class ApiLoginController { |
| | | |
| | | private final IApiMallMemberService memberService; |
| | | private final IXcxPayService iXcxPayService; |
| | | private final RedisUtils redisUtils; |
| | | |
| | | @ApiOperation(value = "app注册接口", notes = "app注册接口") |
| | | @PostMapping(value = "/register") |
| | | public FebsResponse register(@RequestBody RegisterDto registerDto) { |
| | |
| | | @PostMapping(value = "/forgetPwd") |
| | | public FebsResponse forgetPwd(@RequestBody ForgetPwdDto forgetPwdDto) { |
| | | return memberService.forgetPwd(forgetPwdDto); |
| | | } |
| | | |
| | | @ApiOperation(value = "提交注册申诉", notes = "提交注册申诉") |
| | | @PostMapping(value = "addRegisterAppeal") |
| | | public FebsResponse addRegisterAppeal(@RequestBody RegisterAppealDto registerAppeal) { |
| | | memberService.addRegisterAppeal(registerAppeal); |
| | | return new FebsResponse().success().message("申请成功"); |
| | | } |
| | | |
| | | /** |
| | | * 小程序登录 |
| | | */ |
| | | @ApiOperation(value = "小程序登录", notes = "小程序登录") |
| | | @PostMapping(value = "/xcxLogin") |
| | | public FebsResponse xcxLogin(@RequestBody ApiXcxLoginDto apiXcxLoginDto) throws IOException { |
| | | return memberService.xcxLogin(apiXcxLoginDto); |
| | | } |
| | | |
| | | /** |
| | | * 小程序手机号登录 |
| | | */ |
| | | @ApiOperation(value = "小程序手机号登录", notes = "小程序手机号登录") |
| | | @PostMapping(value = "/xcxPhoneLogin") |
| | | public FebsResponse xcxPhoneLogin(@RequestBody ApiXcxPhoneLoginDto apiXcxPhoneLoginDto){ |
| | | return memberService.xcxPhoneLogin(apiXcxPhoneLoginDto); |
| | | } |
| | | |
| | | /** |
| | | * 小程序接收用户数据,更新用户信息 |
| | | */ |
| | | @ApiOperation(value = "小程序接收用户数据", notes = "小程序接收用户数据") |
| | | @PostMapping(value = "/xcxSaveInfo") |
| | | public FebsResponse xcxSaveInfo(@RequestBody ApiXcxSaveInfoDto apiXcxSaveInfoDto){ |
| | | return memberService.xcxSaveInfo(apiXcxSaveInfoDto); |
| | | } |
| | | |
| | | /** |
| | | * 小程序是否允许打开 |
| | | * 先获取系统设置的范围访问开关 |
| | | * 1:开启,获取范围大小,如果范围内没有团长,不允许打开 |
| | | * 2:关闭,允许打开 |
| | | */ |
| | | @ApiOperation(value = "小程序是否允许打开(1:允许 2:不允许)", notes = "小程序是否允许打开") |
| | | @PostMapping(value = "/xcxOpen") |
| | | public FebsResponse xcxOpen(@RequestBody ApiXcxOpenDto apiXcxOpenDto){ |
| | | return memberService.xcxOpen(apiXcxOpenDto); |
| | | } |
| | | |
| | | /** |
| | | * 获取分享二维码 |
| | | */ |
| | | @ApiOperation(value = "获取分享二维码", notes = "获取分享二维码") |
| | | @PostMapping(value = "/generateQrCode") |
| | | public FebsResponse generateQrCode(@RequestBody WxGenerateQrCodeDto wxGenerateQrCodeDto){ |
| | | return iXcxPayService.generateQrCode(wxGenerateQrCodeDto); |
| | | } |
| | | |
| | | /** |
| | | * 获取ACCESS_TOKEN |
| | | */ |
| | | @ApiOperation(value = "获取ACCESS_TOKEN", notes = "获取ACCESS_TOKEN") |
| | | @GetMapping(value = "/getAccessToken") |
| | | public FebsResponse getAccessToken(){ |
| | | return new FebsResponse().success().data(redisUtils.get(WechatConfigure.WX_ACCESS_TOKEN_REDIS_KEY).toString()); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 获取分享二维码(不上传服务器) |
| | | */ |
| | | @ApiOperation(value = "获取分享二维码(不上传服务器)", notes = "获取分享二维码(不上传服务器)") |
| | | @PostMapping(value = "/getQrCode") |
| | | public FebsResponse getQrCode(@RequestBody WxGenerateQrCodeDto wxGenerateQrCodeDto) { |
| | | return iXcxPayService.getQrCode(wxGenerateQrCodeDto); |
| | | } |
| | | |
| | | } |
| | |
| | | |
| | | import cc.mrbird.febs.common.entity.FebsResponse; |
| | | import cc.mrbird.febs.mall.dto.*; |
| | | import cc.mrbird.febs.mall.entity.MallMember; |
| | | import cc.mrbird.febs.mall.entity.MallMemberCoupon; |
| | | import cc.mrbird.febs.mall.entity.MallMemberPayment; |
| | | import cc.mrbird.febs.mall.service.*; |
| | | import cc.mrbird.febs.mall.vo.*; |
| | | import cc.mrbird.febs.vip.service.IMallVipBenefitsService; |
| | | import cc.mrbird.febs.mall.service.IApiMallMemberService; |
| | | import cc.mrbird.febs.mall.vo.ApiChartVo; |
| | | import cc.mrbird.febs.mall.vo.MallMemberVo; |
| | | import cc.mrbird.febs.mall.vo.MoneyFlowVo; |
| | | import cc.mrbird.febs.mall.vo.MyTeamVo; |
| | | import io.swagger.annotations.Api; |
| | | import io.swagger.annotations.ApiOperation; |
| | | import io.swagger.annotations.ApiResponse; |
| | |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import javax.validation.Valid; |
| | | import java.util.Map; |
| | | |
| | | /** |
| | | * @author wzy |
| | | * @date 2021-09-16 |
| | | **/ |
| | | @Slf4j |
| | | @RestController |
| | | @RequestMapping(value = "/api/member") |
| | | @RequiredArgsConstructor |
| | | @Api(value = "ApiMallMemberController", tags = "商城用户接口类") |
| | | @Api(value = "ApiMallMemberController", tags = "碳积分用户接口") |
| | | public class ApiMallMemberController { |
| | | |
| | | private final IApiMallMemberService memberService; |
| | | private final IMallMemberWithdrawService mallMemberWithdrawService; |
| | | private final IApiMallMemberWalletService walletService; |
| | | private final IApiMallAgentService iApiMallAgentService; |
| | | private final IMallVipBenefitsService mallVipBenefitsService; |
| | | |
| | | /** |
| | | * 小程序接收用户数据,更新用户信息 |
| | | */ |
| | | @ApiOperation(value = "小程序接收用户数据", notes = "小程序接收用户数据") |
| | | @PostMapping(value = "/xcxSaveInfo") |
| | | public FebsResponse xcxSaveInfo(@RequestBody ApiXcxSaveInfoDto apiXcxSaveInfoDto){ |
| | | return memberService.xcxSaveInfo(apiXcxSaveInfoDto); |
| | | } |
| | | |
| | | @ApiOperation(value = "获取商城用户信息", notes = "获取商城用户信息") |
| | | @ApiOperation(value = "获取用户信息", notes = "获取用户信息") |
| | | @ApiResponses({ |
| | | @ApiResponse(code = 200, message = "success", response = MallMemberVo.class) |
| | | }) |
| | |
| | | @PostMapping(value = "/logout") |
| | | public FebsResponse logout() { |
| | | return memberService.logout(); |
| | | } |
| | | |
| | | @ApiOperation(value = "获取购物车、订单等角标数量") |
| | | @GetMapping(value = "/findMarkCnt") |
| | | public FebsResponse findMarkCnt() { |
| | | return memberService.findMemberMarkCnt(); |
| | | } |
| | | |
| | | @ApiOperation(value = "设置支付密码") |
| | |
| | | return memberService.moneyFlows(moneyFlowDto); |
| | | } |
| | | |
| | | @ApiOperation(value = "转账") |
| | | @PostMapping(value = "/transfer") |
| | | public FebsResponse transfer(@RequestBody @Validated TransferDto transferDto) { |
| | | @ApiOperation(value = "兑换碳币") |
| | | @PostMapping(value = "/changeScore") |
| | | public FebsResponse changeScore(@RequestBody @Validated CommissionChangeDto commissionChange) { |
| | | memberService.commissionChange(commissionChange); |
| | | return new FebsResponse().success().message("操作成功"); |
| | | } |
| | | |
| | | @ApiOperation(value = "转赠好友") |
| | | @PostMapping(value = "/giveFriend") |
| | | public FebsResponse giveFriend(@RequestBody @Validated TransferDto transferDto) { |
| | | memberService.transfer(transferDto); |
| | | return new FebsResponse().success().message("转账成功"); |
| | | return new FebsResponse().success().message("操作成功"); |
| | | } |
| | | |
| | | @ApiOperation(value = "提现规则", notes = "提现规则") |
| | | @ApiResponses({ |
| | | @ApiResponse(code = 200, message = "success", response = CashOutSettingVo.class) |
| | | }) |
| | | @GetMapping(value = "/cashOutSetting") |
| | | public FebsResponse cashOutSetting() { |
| | | return new FebsResponse().success().data(memberService.cashOutSetting()); |
| | | } |
| | | |
| | | @ApiOperation(value = "提现") |
| | | @PostMapping(value = "/withdrawal") |
| | | public FebsResponse withdrawal(@RequestBody @Validated WithdrawalDto withdrawalDto) { |
| | | mallMemberWithdrawService.withdrawal(withdrawalDto); |
| | | return new FebsResponse().success().message("提交成功"); |
| | | } |
| | | |
| | | @ApiOperation(value = "设置收款方式") |
| | | @ApiOperation(value = "地址新增和编辑") |
| | | @PostMapping(value = "/setPayment") |
| | | public FebsResponse setPayment(@RequestBody MallMemberPayment mallMemberPayment) { |
| | | public FebsResponse setPayment(@RequestBody ApiMallMemberPaymentDto mallMemberPayment) { |
| | | memberService.setPayment(mallMemberPayment); |
| | | return new FebsResponse().success().message("设置成功"); |
| | | return new FebsResponse().success().message("操作成功"); |
| | | } |
| | | |
| | | @ApiOperation(value = "获取收款方式") |
| | | @ApiOperation(value = "获取地址列表") |
| | | @GetMapping(value = "/findPayment") |
| | | public FebsResponse findPayment() { |
| | | return new FebsResponse().success().data(memberService.findMemberPayment()); |
| | | } |
| | | |
| | | @ApiOperation(value = "绑定手机号") |
| | | @PostMapping(value = "/bindPhone") |
| | | public FebsResponse bindPhone(@RequestBody AccountAndCodeDto accountAndCodeDto) { |
| | | memberService.bindPhone(accountAndCodeDto); |
| | | return new FebsResponse().success().message("绑定成功"); |
| | | @ApiOperation(value = "地址删除") |
| | | @PostMapping(value = "/delPayment") |
| | | public FebsResponse delPayment(@RequestBody ApiMallMemberPaymentDto mallMemberPayment) { |
| | | memberService.delPayment(mallMemberPayment); |
| | | return new FebsResponse().success().message("操作成功"); |
| | | } |
| | | |
| | | @ApiOperation(value = "可提现金额") |
| | | @GetMapping(value = "/canWithdrawal") |
| | | public FebsResponse canWithdrawal() { |
| | | return new FebsResponse().success().data(memberService.canMoney()); |
| | | @ApiOperation(value = "兑换提现") |
| | | @PostMapping(value = "/withdrawal") |
| | | public FebsResponse withdrawal(@RequestBody @Validated WithdrawalDto withdrawalDto) { |
| | | memberService.withdrawal(withdrawalDto); |
| | | return new FebsResponse().success().message("操作成功"); |
| | | } |
| | | |
| | | @ApiOperation(value = "用户消费排名") |
| | | @PostMapping(value = "/findRankList") |
| | | public FebsResponse findRankList(@RequestBody RankListDto rankListDto) { |
| | | return new FebsResponse().success().data(memberService.findRankList(rankListDto)); |
| | | } |
| | | |
| | | @ApiOperation(value = "根据邀请码或者手机号获取昵称") |
| | | @PostMapping(value = "/findMemberInfoByAccount/{phone}") |
| | | public FebsResponse findMemberInfoByAccount(@PathVariable("phone") String phone) { |
| | | MallMember account = memberService.findMemberInfoByAccount(phone); |
| | | if (account == null) { |
| | | return new FebsResponse().fail().message("用户不存在"); |
| | | } |
| | | |
| | | MallMemberVo member = new MallMemberVo(); |
| | | member.setName(account.getName()); |
| | | return new FebsResponse().success().data(member); |
| | | } |
| | | |
| | | @ApiOperation(value = "佣金划转") |
| | | @PostMapping(value = "/commissionChange") |
| | | public FebsResponse commissionChange(@RequestBody @Validated CommissionChangeDto commissionChange) { |
| | | walletService.commissionChange(commissionChange); |
| | | return new FebsResponse().success(); |
| | | } |
| | | |
| | | @ApiOperation(value = "我的权益") |
| | | @ApiResponses( |
| | | @ApiResponse(code = 200, message = "success", response = MyCommissionVo.class) |
| | | ) |
| | | @PostMapping(value = "/myCommission") |
| | | public FebsResponse myCommission() { |
| | | return new FebsResponse().success().data(memberService.myCommission()); |
| | | } |
| | | |
| | | @ApiOperation(value = "商铺申请是否存在") |
| | | @PostMapping(value = "/shopApplyIsExist") |
| | | public FebsResponse shopApplyIsExist() { |
| | | return null; |
| | | } |
| | | |
| | | @ApiOperation(value = "充值余额") |
| | | @PostMapping(value = "/rechargeWallet") |
| | | public FebsResponse rechargeWallet(@RequestBody @Validated ApiRechargeWalletDto apiRechargeWalletDto) { |
| | | return memberService.rechargeWallet(apiRechargeWalletDto); |
| | | } |
| | | |
| | | /** |
| | | * 申请代理 |
| | | * @param apiAgentApplyDto |
| | | * @return |
| | | */ |
| | | @ApiOperation(value = "申请代理") |
| | | @PostMapping(value = "/agentApply") |
| | | public FebsResponse agentApply(@RequestBody @Validated ApiAgentApplyDto apiAgentApplyDto) { |
| | | return iApiMallAgentService.agentApply(apiAgentApplyDto); |
| | | } |
| | | |
| | | /** |
| | | * 绑定默认推荐人 |
| | | */ |
| | | @ApiOperation(value = "绑定默认推荐人") |
| | | @PostMapping(value = "/setInvite") |
| | | public FebsResponse setInvite(@RequestBody @Validated ApiSetInviteDto apiSetInviteDto) { |
| | | return memberService.setInvite(apiSetInviteDto); |
| | | } |
| | | |
| | | @ApiOperation(value = "代理申请信息") |
| | | @GetMapping(value = "/agentApplyInfo") |
| | | public FebsResponse agentApplyInfo() { |
| | | return memberService.agentApplyInfo(); |
| | | } |
| | | |
| | | @ApiOperation(value = "合伙人权益") |
| | | @GetMapping(value = "/agentDetail") |
| | | public FebsResponse agentDetail() { |
| | | return memberService.agentDetail(); |
| | | } |
| | | |
| | | @ApiOperation(value = "活动公告") |
| | | @GetMapping(value = "/activityInfo") |
| | | public FebsResponse activityInfo() { |
| | | return memberService.activityInfo(); |
| | | } |
| | | |
| | | @ApiOperation(value = "通过邀请链接领取优惠卷") |
| | | @PostMapping(value = "/getCoupon") |
| | | public FebsResponse getCoupon(@RequestBody GetCouponDto getCouponDto) { |
| | | return memberService.getCoupon(getCouponDto); |
| | | } |
| | | |
| | | |
| | | @ApiOperation(value = "扫码推销员领取优惠卷") |
| | | @PostMapping(value = "/scanCoupon") |
| | | public FebsResponse scanCoupon(@RequestBody GetCouponDto getCouponDto) { |
| | | return memberService.scanCoupon(getCouponDto); |
| | | } |
| | | |
| | | @ApiOperation(value = "优惠卷列表") |
| | | @ApiOperation(value = "榜单") |
| | | @ApiResponses({ |
| | | @ApiResponse(code = 200, message = "success", response = MallMemberCouponVo.class) |
| | | @ApiResponse(code = 200, message = "success", response = ApiChartVo.class) |
| | | }) |
| | | @PostMapping(value = "/memberCoupon") |
| | | public FebsResponse memberCoupon(@RequestBody MallMemberCouponDto mallMemberCouponDto) { |
| | | return memberService.memberCoupon(mallMemberCouponDto); |
| | | @PostMapping(value = "/record") |
| | | public FebsResponse record(@RequestBody @Validated ApiRecordDto apiRecordDto) { |
| | | return new FebsResponse().success().data(memberService.dayRecord(apiRecordDto)); |
| | | } |
| | | |
| | | @ApiOperation(value = "创建订单优惠卷列表") |
| | | @ApiResponses({ |
| | | @ApiResponse(code = 200, message = "success", response = MallMemberCouponVo.class) |
| | | }) |
| | | @PostMapping(value = "/memberPayCoupon") |
| | | public FebsResponse memberPayCoupon(@RequestBody MallMemberCouponDto mallMemberCouponDto) { |
| | | return memberService.memberPayCoupon(mallMemberCouponDto); |
| | | } |
| | | |
| | | @ApiOperation(value = "优惠卷详情", notes = "优惠卷详情") |
| | | @ApiResponses({ |
| | | @ApiResponse(code = 200, message = "success", response = MallMemberCouponVo.class) |
| | | }) |
| | | @GetMapping(value = "/couponDetails/{id}") |
| | | public FebsResponse couponDetails(@PathVariable("id") Long id) { |
| | | return memberService.couponDetails(id); |
| | | } |
| | | |
| | | |
| | | @ApiOperation(value = "登录事件", notes = "登录事件") |
| | | @GetMapping(value = "/birthdayEvent") |
| | | public FebsResponse birthdayEvent() { |
| | | Map<String, Object> birthdayEvent = mallVipBenefitsService.birthdayEvent(); |
| | | return new FebsResponse().success().data(birthdayEvent); |
| | | } |
| | | |
| | | @ApiOperation(value = "登录事件", notes = "登录事件") |
| | | @GetMapping(value = "/loginEvent") |
| | | public FebsResponse loginEvent() { |
| | | Map<String, Object> loginEvent = memberService.loginEvent(); |
| | | return new FebsResponse().success().data(loginEvent); |
| | | } |
| | | |
| | | @ApiOperation(value = "店铺列表") |
| | | @ApiResponses({ |
| | | @ApiResponse(code = 200, message = "success", response = MallStoreVo.class) |
| | | }) |
| | | @PostMapping(value = "/storeList") |
| | | public FebsResponse storeList(@RequestBody MallStoreDto mallStoreDto) { |
| | | return memberService.storeList(mallStoreDto); |
| | | } |
| | | |
| | | @ApiOperation(value = "店铺机器列表") |
| | | @ApiResponses({ |
| | | @ApiResponse(code = 200, message = "success", response = MallStoreItemVo.class) |
| | | }) |
| | | @PostMapping(value = "/storeItemList") |
| | | public FebsResponse storeItemList(@RequestBody MallStoreItemDto mallStoreItemDto) { |
| | | return memberService.storeItemList(mallStoreItemDto); |
| | | } |
| | | |
| | | @ApiOperation(value = "绑定用户") |
| | | @PostMapping(value = "/bindStoreMember") |
| | | public FebsResponse bindStoreMember(@RequestBody @Validated BindStoreMemberDto bindStoreMemberDto) { |
| | | return memberService.bindStoreMember(bindStoreMemberDto); |
| | | } |
| | | |
| | | @ApiOperation(value = "绑定列表") |
| | | @ApiResponses({ |
| | | @ApiResponse(code = 200, message = "success", response = MallStoreMemberVo.class) |
| | | }) |
| | | @PostMapping(value = "/bindList") |
| | | public FebsResponse bindList() { |
| | | return memberService.bindList(); |
| | | } |
| | | |
| | | @ApiOperation(value = "获取检测结果") |
| | | @PostMapping(value = "/bindResult") |
| | | public FebsResponse bindResult(@RequestBody @Validated BindResultDto bindResultDto) { |
| | | return memberService.bindResult(bindResultDto); |
| | | } |
| | | } |
| | |
| | | package cc.mrbird.febs.mall.controller; |
| | | |
| | | import cc.mrbird.febs.common.annotation.SubmitRepeat; |
| | | import cc.mrbird.febs.common.entity.FebsResponse; |
| | | import cc.mrbird.febs.mall.dto.ApiChargeListDto; |
| | | import cc.mrbird.febs.mall.dto.ApiGoChargeDto; |
| | | import cc.mrbird.febs.mall.dto.ApiGoChargeInfoDto; |
| | | import cc.mrbird.febs.mall.service.IRunVipService; |
| | | import cc.mrbird.febs.mall.vo.ApiChargeInfoVo; |
| | | import cc.mrbird.febs.mall.vo.ApiChargeVo; |
| | | import cc.mrbird.febs.mall.vo.ApiGoChargeVo; |
| | | import cc.mrbird.febs.mall.vo.ApiRunVipVo; |
| | | import io.swagger.annotations.Api; |
| | | import io.swagger.annotations.ApiOperation; |
| | |
| | | import lombok.RequiredArgsConstructor; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.CrossOrigin; |
| | | import org.springframework.web.bind.annotation.GetMapping; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.RestController; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import javax.validation.Valid; |
| | | |
| | | @Slf4j |
| | | @Validated |
| | |
| | | |
| | | private final IRunVipService iRunVipService; |
| | | |
| | | @ApiOperation(value = "会员中心-购买VIP", notes = "会员中心-购买VIP") |
| | | @ApiOperation(value = "会员中心-购买VIP列表", notes = "会员中心-购买VIP列表") |
| | | @ApiResponses({ |
| | | @ApiResponse(code = 200, message = "success", response = ApiRunVipVo.class) |
| | | }) |
| | |
| | | public FebsResponse vipInfo() { |
| | | return new FebsResponse().success().data(iRunVipService.vipInfo()); |
| | | } |
| | | |
| | | @ApiOperation(value = "【购买VIP】基本数据", notes = "【余额充值】基本数据") |
| | | @ApiResponses({ |
| | | @ApiResponse(code = 200, message = "success", response = ApiChargeInfoVo.class) |
| | | }) |
| | | @GetMapping(value = "/getChargeInfo") |
| | | public FebsResponse getChargeInfo() { |
| | | return iRunVipService.getChargeInfo(); |
| | | } |
| | | |
| | | @ApiOperation(value = "【购买VIP】列表", notes = "【余额充值】列表") |
| | | @ApiResponses({ |
| | | @ApiResponse(code = 200, message = "success", response = ApiChargeVo.class) |
| | | }) |
| | | @PostMapping(value = "/getChargeList") |
| | | public FebsResponse getChargeList(@RequestBody ApiChargeListDto apiChargeListDto) { |
| | | return new FebsResponse().success().data(iRunVipService.getChargeList(apiChargeListDto)); |
| | | } |
| | | |
| | | @ApiOperation(value = "【购买VIP】立即购买", notes = "【购买VIP】立即购买") |
| | | @ApiResponses({ |
| | | @ApiResponse(code = 200, message = "success", response = ApiGoChargeVo.class) |
| | | }) |
| | | @PostMapping(value = "/goCharge") |
| | | @SubmitRepeat |
| | | public FebsResponse goCharge(@RequestBody @Valid ApiGoChargeDto apiGoChargeDto) { |
| | | return iRunVipService.goCharge(apiGoChargeDto); |
| | | } |
| | | |
| | | @ApiOperation(value = "【购买VIP】马上支付", notes = "【余额充值】马上支付") |
| | | @ApiResponses({ |
| | | @ApiResponse(code = 200, message = "success", response = ApiGoChargeVo.class) |
| | | }) |
| | | @PostMapping(value = "/goChargeInfo") |
| | | @SubmitRepeat |
| | | public FebsResponse goChargeInfo(@RequestBody @Valid ApiGoChargeInfoDto apiGoChargeInfoDto) { |
| | | return iRunVipService.goChargeInfo(apiGoChargeInfoDto); |
| | | } |
| | | } |
| | |
| | | import cc.mrbird.febs.mall.dto.Base64UploadDto; |
| | | import cc.mrbird.febs.mall.entity.DataDictionaryCustom; |
| | | import cc.mrbird.febs.mall.service.ICommonService; |
| | | import cc.mrbird.febs.mall.vo.OrderListVo; |
| | | import cn.hutool.core.util.IdUtil; |
| | | import cn.hutool.core.util.StrUtil; |
| | | import com.best.javaSdk.kdTraceQuery.response.KdTraceQueryRsp; |
| | |
| | | boolean result = ZzSmsSend.sendALiYun(account, code.toString()); |
| | | if (result) { |
| | | Map<String, Object> map = new HashMap<>(); |
| | | boolean flag = redisUtils.set(AppContants.VERIFY_CODE_PREFIX + account, code, 300); |
| | | map.put("code", flag); |
| | | return new FebsResponse().success().message("验证码发送成功"); |
| | | boolean flag = redisUtils.set(AppContants.VERIFY_CODE_PREFIX + account, code, 120); |
| | | map.put("code", code); |
| | | return new FebsResponse().success().message("发送成功"); |
| | | // return new FebsResponse().success().data(map); |
| | | } |
| | | // 发送邮件验证码 |
| | | } else if (AppContants.ACCOUNT_TYPE_EMAIL.equals(type)) { |
| | |
| | | import cc.mrbird.febs.mall.mapper.MallSalesmanMapper; |
| | | import cc.mrbird.febs.mall.service.IAdminMallMemberService; |
| | | import cc.mrbird.febs.mall.vo.*; |
| | | import cn.hutool.core.date.DateUtil; |
| | | import cn.hutool.core.util.ObjectUtil; |
| | | import lombok.RequiredArgsConstructor; |
| | | import org.apache.shiro.authz.annotation.RequiresPermissions; |
| | |
| | | Map<String, Object> data = new HashMap<>(); |
| | | data.put("id", mallMember.getId()); |
| | | data.put("level", mallMember.getLevel()); |
| | | data.put("vipLevelTime", DateUtil.formatDate(mallMember.getVipLevelTime())); |
| | | model.addAttribute("vipLevelSet", data); |
| | | return FebsUtil.view("modules/mallMember/vip-level-setting"); |
| | | } |
| | |
| | | public class ViewRunVipController{ |
| | | |
| | | private final IAdminRunVipService iAdminRunVipService; |
| | | @GetMapping(value = "/sellVipList") |
| | | @RequiresPermissions("sellVipList:view") |
| | | public String sellVipList() { |
| | | return FebsUtil.view("modules/runVip/sellVipList"); |
| | | } |
| | | @GetMapping(value = "/buyVipList") |
| | | @RequiresPermissions("buyVipList:view") |
| | | public String buyVipList() { |
| | | return FebsUtil.view("modules/runVip/buyVipList"); |
| | | } |
| | | @GetMapping(value = "/runVipList") |
| | | @RequiresPermissions("runVipList:view") |
| | | public String runVipList() { |
| | |
| | | import cc.mrbird.febs.mall.entity.MallMember; |
| | | import cc.mrbird.febs.mall.vo.MallMemberVo; |
| | | import cc.mrbird.febs.mall.vo.MyCommissionVo; |
| | | import cc.mrbird.febs.mall.vo.TeamListVo; |
| | | import org.mapstruct.Mapper; |
| | | import org.mapstruct.factory.Mappers; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * @author wzy |
| | |
| | | |
| | | public abstract MyCommissionVo entityToCommissionVo(MallMember mallMember); |
| | | |
| | | public abstract TeamListVo entityToTeamListVo(MallMember mallMember); |
| | | |
| | | public abstract List<TeamListVo> entityToTeamListVos(List<MallMember> mallMembers); |
| | | |
| | | } |
New file |
| | |
| | | package cc.mrbird.febs.mall.dto; |
| | | |
| | | import io.swagger.annotations.ApiModel; |
| | | import lombok.Data; |
| | | |
| | | @Data |
| | | @ApiModel(value = "ApiBuyVipDto", description = "参数接收类") |
| | | public class ApiBuyVipDto { |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package cc.mrbird.febs.mall.dto; |
| | | |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | @Data |
| | | @ApiModel(value = "ApiChargeListDto", description = "参数接收类") |
| | | public class ApiChargeListDto { |
| | | |
| | | @ApiModelProperty(hidden = true) |
| | | private Long memberId; |
| | | |
| | | @ApiModelProperty(value = "页码", example = "1") |
| | | private Integer pageNum; |
| | | |
| | | @ApiModelProperty(value = "每页数量", example = "10") |
| | | private Integer pageSize; |
| | | } |
New file |
| | |
| | | package cc.mrbird.febs.mall.dto; |
| | | |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import javax.validation.constraints.NotNull; |
| | | |
| | | @Data |
| | | @ApiModel(value = "ApiGoChargeDto", description = "参数接收类") |
| | | public class ApiGoChargeDto { |
| | | |
| | | @NotNull(message = "请选择地址") |
| | | @ApiModelProperty(value = "地址ID", example = "123456") |
| | | private Long addressId; |
| | | |
| | | @NotNull(message = "请选择会员") |
| | | @ApiModelProperty(value = "会员ID", example = "123456") |
| | | private Long runVipId; |
| | | |
| | | @NotNull(message = "请选择数量") |
| | | @ApiModelProperty(value = "数量", example = "123456") |
| | | private Integer vipCnt; |
| | | |
| | | } |
New file |
| | |
| | | package cc.mrbird.febs.mall.dto; |
| | | |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import javax.validation.constraints.NotBlank; |
| | | |
| | | @Data |
| | | @ApiModel(value = "ApiGoChargeInfoDto", description = "API信息参数接收类") |
| | | public class ApiGoChargeInfoDto { |
| | | |
| | | @NotBlank(message = "编号不能为空") |
| | | @ApiModelProperty(value = "编号", example = "123456") |
| | | private String orderNo; |
| | | |
| | | } |
New file |
| | |
| | | package cc.mrbird.febs.mall.dto; |
| | | |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | @Data |
| | | @ApiModel(value = "ApiMallMemberPaymentDto", description = "接收类") |
| | | public class ApiMallMemberPaymentDto { |
| | | |
| | | private Long id; |
| | | |
| | | @ApiModelProperty(value = "地址类型") |
| | | private String bankNo; |
| | | |
| | | @ApiModelProperty(value = "地址") |
| | | private String bank; |
| | | } |
New file |
| | |
| | | package cc.mrbird.febs.mall.dto; |
| | | |
| | | import lombok.Data; |
| | | |
| | | import java.io.Serializable; |
| | | |
| | | @Data |
| | | public class ApiMemberChargeFailDto implements Serializable { |
| | | private static final long serialVersionUID = -1277171780468841527L; |
| | | |
| | | private Long chargeId; |
| | | |
| | | private Long failTime; |
| | | } |
New file |
| | |
| | | package cc.mrbird.febs.mall.dto; |
| | | |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import javax.validation.constraints.NotNull; |
| | | |
| | | @Data |
| | | @ApiModel(value = "ApiRecordDto", description = "接收类") |
| | | public class ApiRecordDto { |
| | | |
| | | @NotNull(message = "参数不能为空") |
| | | @ApiModelProperty(value = "1:日榜 2:月榜", example = "10") |
| | | private Integer type; |
| | | } |
| | |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import javax.validation.constraints.Min; |
| | | import javax.validation.constraints.NotBlank; |
| | | import javax.validation.constraints.NotNull; |
| | | import java.math.BigDecimal; |
| | | |
| | |
| | | * @date 2022-05-05 |
| | | **/ |
| | | @Data |
| | | @ApiModel(value = "CommissionChangeDto", description = "佣金划转参数接收类") |
| | | @ApiModel(value = "CommissionChangeDto", description = "兑换碳币") |
| | | public class CommissionChangeDto { |
| | | |
| | | @ApiModelProperty(value = "划转金额", example = "100") |
| | | @NotNull(message = "请输入划转金额") |
| | | @NotNull(message = "参数不能为空") |
| | | @Min(0) |
| | | @ApiModelProperty(value = "金额", example = "1") |
| | | private BigDecimal amount; |
| | | |
| | | @ApiModelProperty(value = "类型 1-to余额 2-to竞猜积分", example = "1") |
| | | @NotNull(message = "参数错误") |
| | | private Integer type; |
| | | @NotBlank(message = "参数不能为空") |
| | | @ApiModelProperty(value = "交易密码", example = "123456") |
| | | private String tradePwd; |
| | | } |
| | |
| | | package cc.mrbird.febs.mall.dto; |
| | | |
| | | import io.swagger.annotations.Api; |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | |
| | | @ApiModelProperty(value = "页码", example = "1") |
| | | private Integer pageNum; |
| | | |
| | | @ApiModelProperty(value = "类型 1-静态收益 2-直推奖 3-代理收益 4-排名收益 5-总监收益 6-社区点补 7-一代收益 8-提现 9-转增 10-支付 11-退款") |
| | | private Integer type; |
| | | |
| | | @ApiModelProperty(value = "类型 1-全部 2-支出 3-收入") |
| | | private Integer inOrOut; |
| | | |
| | | @ApiModelProperty(value = "流水类型 1-余额 2-赠送积分 3-竞猜积分 4-佣金") |
| | | @ApiModelProperty(value = "流水类型 1-碳币 2-碳积分") |
| | | private Integer flowType; |
| | | |
| | | @ApiModelProperty(hidden = true) |
| | |
| | | @ApiModelProperty(value = "交易密码") |
| | | private String tradePwd; |
| | | |
| | | // @ApiModelProperty(value = "银行卡号") |
| | | // private String bankNo; |
| | | // |
| | | // @ApiModelProperty(value = "姓名") |
| | | // private String name; |
| | | @NotNull(message = "参数不能为空") |
| | | @ApiModelProperty(value = "地址ID") |
| | | private Long addressId; |
| | | |
| | | } |
New file |
| | |
| | | package cc.mrbird.febs.mall.entity; |
| | | |
| | | import cc.mrbird.febs.common.entity.BaseEntity; |
| | | import com.baomidou.mybatisplus.annotation.TableField; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.Date; |
| | | |
| | | @Data |
| | | @TableName("mall_charge") |
| | | public class MallCharge extends BaseEntity { |
| | | |
| | | private Long memberId; |
| | | private String orderNo; |
| | | private Integer state;//2-进行中 1-成功 0-失败 |
| | | private String type;//1-trc 2-erc |
| | | private String address; |
| | | private BigDecimal amount; |
| | | private Date failTime; |
| | | private String transHash; |
| | | private String sysAddress; |
| | | private String vipCode; |
| | | private String vipName; |
| | | private Integer vipCnt; |
| | | |
| | | @TableField(exist = false) |
| | | private String account; |
| | | |
| | | } |
| | |
| | | package cc.mrbird.febs.mall.entity; |
| | | |
| | | import cc.mrbird.febs.common.controller.BaseController; |
| | | import cc.mrbird.febs.common.entity.BaseEntity; |
| | | import cc.mrbird.febs.common.entity.BaseEntity; |
| | | import com.baomidou.mybatisplus.annotation.TableField; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | |
| | | |
| | | private Date lastLoginTime; |
| | | |
| | | @DateTimeFormat(pattern = "yyyy-MM-dd") |
| | | @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") |
| | | private Date vipLevelTime; |
| | | } |
| | |
| | | |
| | | import cc.mrbird.febs.common.entity.BaseEntity; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | /** |
| | |
| | | /** |
| | | * 银行卡号 |
| | | */ |
| | | |
| | | |
| | | @ApiModelProperty(value = "地址类型") |
| | | private String bankNo; |
| | | |
| | | /** |
| | | * 开户行 |
| | | */ |
| | | |
| | | @ApiModelProperty(value = "地址") |
| | | private String bank; |
| | | } |
| | |
| | | private Long memberId; |
| | | |
| | | /** |
| | | * 余额 |
| | | * 碳币 |
| | | */ |
| | | private BigDecimal balance; |
| | | |
| | | /** |
| | | * 积分 |
| | | * 碳积分 |
| | | */ |
| | | private BigDecimal score; |
| | | |
| | |
| | | package cc.mrbird.febs.mall.entity; |
| | | |
| | | import cc.mrbird.febs.common.entity.BaseEntity; |
| | | import com.baomidou.mybatisplus.annotation.TableField; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | /** |
| | | * @author wzy |
| | | * @date 2022-05-05 |
| | | **/ |
| | | @Data |
| | | @TableName("mall_member_withdraw") |
| | | public class MallMemberWithdraw extends BaseEntity { |
| | | |
| | | private String withdrawNo; |
| | | |
| | | private Long memberId; |
| | | |
| | | private BigDecimal amount; |
| | | |
| | | /** |
| | | * 状态 1-提现中 2-提现成功 3-提现失败 |
| | | * 状态 1-成功 2-进行中 0-失败 |
| | | */ |
| | | private Integer status; |
| | | |
| | |
| | | |
| | | private String name; |
| | | |
| | | private String withdrawNo; |
| | | private String type; |
| | | |
| | | @TableField(exist = false) |
| | | private String account; |
| | | } |
| | |
| | | private Long rtMemberId; |
| | | |
| | | /** |
| | | * 提现状态 1-提现中2-成功 3-拒绝 |
| | | * 充值状态 1-充值中2-成功 3-失败 |
| | | * 提现状态 1-成功2-进行中 0-失败 |
| | | * 充值状态 |
| | | */ |
| | | private Integer status; |
| | | |
New file |
| | |
| | | package cc.mrbird.febs.mall.mapper; |
| | | |
| | | import cc.mrbird.febs.mall.dto.ApiChargeListDto; |
| | | import cc.mrbird.febs.mall.entity.MallCharge; |
| | | import cc.mrbird.febs.mall.entity.MallMemberWithdraw; |
| | | import cc.mrbird.febs.mall.vo.ApiChargeVo; |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import org.apache.ibatis.annotations.Param; |
| | | |
| | | import java.util.List; |
| | | |
| | | public interface MallChargeMapper extends BaseMapper<MallCharge> { |
| | | |
| | | List<ApiChargeVo> selectChargeListInPage(@Param("record")ApiChargeListDto apiChargeListDto, Page<ApiChargeVo> page); |
| | | |
| | | IPage<MallCharge> selectAdminChargeListInPage(Page<MallCharge> page, @Param("record")MallCharge mallCharge); |
| | | |
| | | IPage<MallMemberWithdraw> selectAdminWithdrawListInPage(Page<MallMemberWithdraw> page, @Param("record")MallMemberWithdraw mallMemberWithdraw); |
| | | } |
| | |
| | | void updateReferrerId(@Param("id")Long id); |
| | | |
| | | void updateLastLogin(@Param("id")Long id,@Param("lastLogin") Date lastLogin); |
| | | |
| | | void updateVipLevelTimeAndLevel(@Param("id")Long id,@Param("vipLevelTime") Date lastLogin,@Param("level") String level); |
| | | } |
| | |
| | | |
| | | int updateBalanceWithVersion(@Param("record") MallMemberWallet wallet); |
| | | |
| | | int updateScoreWithVersion(@Param("record") MallMemberWallet wallet); |
| | | |
| | | int updateCommissionWithVersion(@Param("record") MallMemberWallet wallet); |
| | | |
| | | int updateAmountWithVersion(@Param("record") MallMemberWallet wallet); |
| | |
| | | // } |
| | | mallOrderInfoMapper.updateOrderConfirmStatus(DateUtil.date(),DateUtil.offsetDay(new Date(), -value)); |
| | | |
| | | orderInfos.forEach(item -> { |
| | | if(item.getOrderType() == 1){ |
| | | agentProducer.sendGetScoreMsg(item.getId()); |
| | | } |
| | | }); |
| | | } |
| | | } |
| | | /** |
| | |
| | | package cc.mrbird.febs.mall.service; |
| | | |
| | | import cc.mrbird.febs.common.entity.FebsResponse; |
| | | import cc.mrbird.febs.common.entity.QueryRequest; |
| | | import cc.mrbird.febs.mall.entity.MallCharge; |
| | | import cc.mrbird.febs.mall.entity.MallMemberWithdraw; |
| | | import cc.mrbird.febs.mall.entity.RunVip; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.extension.service.IService; |
| | |
| | | void addVip(RunVip config); |
| | | |
| | | void editVip(RunVip config); |
| | | |
| | | IPage<MallCharge> buyList(MallCharge mallCharge, QueryRequest request); |
| | | |
| | | FebsResponse chargeAgree(Integer state, Long id); |
| | | |
| | | FebsResponse sellAgree(Integer state, Long id); |
| | | |
| | | IPage<MallMemberWithdraw> sellList(MallMemberWithdraw mallMemberWithdraw, QueryRequest request); |
| | | } |
| | |
| | | package cc.mrbird.febs.mall.service; |
| | | |
| | | import cc.mrbird.febs.mall.dto.ApiMemberChargeFailDto; |
| | | |
| | | public interface IAgentService { |
| | | |
| | | void autoUpAgentLevel(Long memberId); |
| | |
| | | void returnMoneyToAgent(Long orderId); |
| | | |
| | | void rankReturnMoney(Long orderId); |
| | | |
| | | void sendMemberChargeFailMsg(ApiMemberChargeFailDto apiMemberChargeFailDto); |
| | | |
| | | void buyVipSuccessMsg(Long chargeId); |
| | | } |
| | |
| | | import cc.mrbird.febs.mall.entity.MallMember; |
| | | import cc.mrbird.febs.mall.entity.MallMemberPayment; |
| | | import cc.mrbird.febs.mall.entity.MallShopApply; |
| | | import cc.mrbird.febs.mall.vo.CashOutSettingVo; |
| | | import cc.mrbird.febs.mall.vo.MyCommissionVo; |
| | | import cc.mrbird.febs.mall.vo.MyTeamVo; |
| | | import cc.mrbird.febs.mall.vo.ShopListVo; |
| | | import cc.mrbird.febs.mall.vo.*; |
| | | import com.baomidou.mybatisplus.extension.service.IService; |
| | | |
| | | import java.io.IOException; |
| | |
| | | |
| | | void addMoneyFlow(Long memberId, BigDecimal amount, Integer type, String orderNo, String description, String remark, Long rtMemberId, Integer status, Integer flowType); |
| | | |
| | | void runVipMoneyFlowAdd( |
| | | Long memberId, Long rtMemberId, String orderNo,Integer flowType, Integer type, BigDecimal amount, String description, Integer status); |
| | | |
| | | void transfer(TransferDto transferDto); |
| | | |
| | | void setPayment(MallMemberPayment mallMemberPayment); |
| | | void withdrawal(WithdrawalDto withdrawalDto); |
| | | |
| | | MallMemberPayment findMemberPayment(); |
| | | void commissionChange(CommissionChangeDto commissionChange); |
| | | |
| | | void setPayment(ApiMallMemberPaymentDto mallMemberPayment); |
| | | |
| | | List<MallMemberPayment> findMemberPayment(); |
| | | |
| | | void delPayment(ApiMallMemberPaymentDto mallMemberPayment); |
| | | |
| | | void bindPhone(AccountAndCodeDto accountAndCodeDto); |
| | | |
| | |
| | | FebsResponse bindList(); |
| | | |
| | | FebsResponse bindResult(BindResultDto bindResultDto); |
| | | |
| | | List<ApiChartVo> dayRecord( ApiRecordDto apiRecordDto); |
| | | } |
| | |
| | | |
| | | void reduceBalance(BigDecimal amount, Long memberId); |
| | | |
| | | void addScore(BigDecimal amount, Long member); |
| | | |
| | | void reduceScore(BigDecimal amount, Long memberId); |
| | | |
| | | void addCommission(BigDecimal amount, Long member); |
| | | |
| | | void reduceCommission(BigDecimal amount, Long member); |
| | |
| | | package cc.mrbird.febs.mall.service; |
| | | |
| | | import cc.mrbird.febs.common.entity.FebsResponse; |
| | | import cc.mrbird.febs.mall.dto.ApiChargeListDto; |
| | | import cc.mrbird.febs.mall.dto.ApiGoChargeDto; |
| | | import cc.mrbird.febs.mall.dto.ApiGoChargeInfoDto; |
| | | import cc.mrbird.febs.mall.entity.RunVip; |
| | | import cc.mrbird.febs.mall.vo.ApiChargeVo; |
| | | import cc.mrbird.febs.mall.vo.ApiRunVipVo; |
| | | import com.baomidou.mybatisplus.extension.service.IService; |
| | | |
| | |
| | | |
| | | public interface IRunVipService extends IService<RunVip> { |
| | | List<ApiRunVipVo> vipInfo(); |
| | | |
| | | FebsResponse goCharge(ApiGoChargeDto apiGoChargeDto); |
| | | |
| | | FebsResponse goChargeInfo(ApiGoChargeInfoDto apiGoChargeInfoDto); |
| | | |
| | | FebsResponse getChargeInfo(); |
| | | |
| | | List<ApiChargeVo> getChargeList(ApiChargeListDto apiChargeListDto); |
| | | } |
| | |
| | | public IPage<MallMember> getMallMemberList(MallMember mallMember, QueryRequest request) { |
| | | Page<MallMember> page = new Page<>(request.getPageNum(), request.getPageSize()); |
| | | IPage<MallMember> mallMembers = this.baseMapper.selectMallMemberListInPage(page, mallMember); |
| | | // if(CollUtil.isNotEmpty(mallMembers.getRecords())){ |
| | | // for(MallMember mallMemberTeam : mallMembers.getRecords()){ |
| | | // Long salesmansId = mallMemberTeam.getSalesmansId(); |
| | | // MallSalesman mallSalesman = mallSalesmanMapper.selectById(salesmansId); |
| | | // if(ObjectUtil.isNotEmpty(mallSalesman)){ |
| | | // StringBuffer salesmanName = new StringBuffer(); |
| | | // salesmanName.append(mallSalesman.getName()); |
| | | // if(2 == mallSalesman.getState()){ |
| | | // salesmanName.append("(禁用)"); |
| | | // } |
| | | // mallMemberTeam.setSalesmansName(salesmanName.toString()); |
| | | // } |
| | | // } |
| | | // } |
| | | return mallMembers; |
| | | } |
| | | |
| | |
| | | } else if (type == 3) { |
| | | filedType = "prizeScore"; |
| | | } else { |
| | | throw new FebsException("参数错误"); |
| | | throw new FebsException("操作失败"); |
| | | } |
| | | |
| | | if (isReduce) { |
| | | int i = iApiMallMemberWalletService.reduce(mallSystemPayDto.getAddBalance().negate(), mallSystemPayDto.getId(), filedType); |
| | | |
| | | if (i == 2) { |
| | | throw new FebsException("剩余数量不足"); |
| | | throw new FebsException("操作失败"); |
| | | } |
| | | } else { |
| | | iApiMallMemberWalletService.add(mallSystemPayDto.getAddBalance(), mallSystemPayDto.getId(), filedType); |
| | |
| | | |
| | | // 重置交易密码 |
| | | if (type == 1) { |
| | | String payPwd = SecureUtil.md5("654321"); |
| | | String payPwd = SecureUtil.md5("123456"); |
| | | member.setTradePassword(payPwd); |
| | | // 重置登录密码 |
| | | } else { |
| | |
| | | package cc.mrbird.febs.mall.service.impl; |
| | | |
| | | import cc.mrbird.febs.common.entity.FebsResponse; |
| | | import cc.mrbird.febs.common.entity.QueryRequest; |
| | | import cc.mrbird.febs.common.enumerates.YesOrNoEnum; |
| | | import cc.mrbird.febs.common.exception.FebsException; |
| | | import cc.mrbird.febs.mall.entity.MallCharge; |
| | | import cc.mrbird.febs.mall.entity.MallMemberWithdraw; |
| | | import cc.mrbird.febs.mall.entity.MallMoneyFlow; |
| | | import cc.mrbird.febs.mall.entity.RunVip; |
| | | import cc.mrbird.febs.mall.mapper.MallChargeMapper; |
| | | import cc.mrbird.febs.mall.mapper.MallMemberWithdrawMapper; |
| | | import cc.mrbird.febs.mall.mapper.MallMoneyFlowMapper; |
| | | import cc.mrbird.febs.mall.mapper.RunVipMapper; |
| | | import cc.mrbird.febs.mall.service.IAdminRunVipService; |
| | | import cc.mrbird.febs.rabbit.producter.AgentProducer; |
| | | import cn.hutool.core.util.ObjectUtil; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | |
| | | public class AdminRunVipServiceImpl extends ServiceImpl<RunVipMapper, RunVip> implements IAdminRunVipService { |
| | | |
| | | private final RunVipMapper runVipMapper; |
| | | private final MallChargeMapper mallChargeMapper; |
| | | private final MallMemberWithdrawMapper mallMemberWithdrawMapper; |
| | | private final MallMoneyFlowMapper mallMoneyFlowMapper; |
| | | private final AgentProducer agentProducer; |
| | | @Override |
| | | public IPage<RunVip> runVipListInPage(RunVip runVip,QueryRequest request) { |
| | | Page<RunVip> page = new Page<>(request.getPageNum(), request.getPageSize()); |
| | |
| | | public void editVip(RunVip config) { |
| | | this.baseMapper.updateById(config); |
| | | } |
| | | |
| | | @Override |
| | | public IPage<MallCharge> buyList(MallCharge mallCharge, QueryRequest request) { |
| | | Page<MallCharge> page = new Page<>(request.getPageNum(), request.getPageSize()); |
| | | IPage<MallCharge> adminChargeListVoIPage = mallChargeMapper.selectAdminChargeListInPage(page, mallCharge); |
| | | return adminChargeListVoIPage; |
| | | } |
| | | |
| | | @Override |
| | | public FebsResponse chargeAgree(Integer state, Long id) { |
| | | MallCharge mallCharge = mallChargeMapper.selectById(id); |
| | | |
| | | if(ObjectUtil.isEmpty(mallCharge)){ |
| | | throw new FebsException("记录不存在"); |
| | | } |
| | | if(YesOrNoEnum.ING.getValue() != mallCharge.getState()){ |
| | | throw new FebsException("记录不是进行中状态"); |
| | | } |
| | | if(YesOrNoEnum.YES.getValue() == state){ |
| | | mallCharge.setState(YesOrNoEnum.YES.getValue()); |
| | | } |
| | | if(YesOrNoEnum.NO.getValue() == state){ |
| | | mallCharge.setState(YesOrNoEnum.NO.getValue()); |
| | | } |
| | | mallCharge.setRevision(mallCharge.getRevision()+1); |
| | | mallChargeMapper.updateById(mallCharge); |
| | | |
| | | if(mallCharge.getState() == YesOrNoEnum.YES.getValue()){ |
| | | agentProducer.sendBuyVipSuccessMsg(mallCharge.getId()); |
| | | } |
| | | return new FebsResponse().success().message("操作成功"); |
| | | } |
| | | |
| | | @Override |
| | | public FebsResponse sellAgree(Integer state, Long id) { |
| | | MallMemberWithdraw mallMemberWithdraw = mallMemberWithdrawMapper.selectById(id); |
| | | if(ObjectUtil.isEmpty(mallMemberWithdraw)){ |
| | | throw new FebsException("记录不存在"); |
| | | } |
| | | if(YesOrNoEnum.ING.getValue() != mallMemberWithdraw.getStatus()){ |
| | | throw new FebsException("记录不是进行中状态"); |
| | | } |
| | | if(YesOrNoEnum.YES.getValue() == state){ |
| | | mallMemberWithdraw.setStatus(YesOrNoEnum.YES.getValue()); |
| | | } |
| | | if(YesOrNoEnum.NO.getValue() == state){ |
| | | mallMemberWithdraw.setStatus(YesOrNoEnum.NO.getValue()); |
| | | } |
| | | mallMemberWithdraw.setRevision(mallMemberWithdraw.getRevision()+1); |
| | | mallMemberWithdrawMapper.updateById(mallMemberWithdraw); |
| | | |
| | | MallMoneyFlow mallMoneyFlow = mallMoneyFlowMapper.selectOne(new LambdaQueryWrapper<MallMoneyFlow>().eq(MallMoneyFlow::getOrderNo, mallMemberWithdraw.getWithdrawNo())); |
| | | mallMoneyFlow.setStatus(mallMemberWithdraw.getStatus()); |
| | | mallMoneyFlowMapper.updateById(mallMoneyFlow); |
| | | return new FebsResponse().success().message("操作成功"); |
| | | } |
| | | |
| | | @Override |
| | | public IPage<MallMemberWithdraw> sellList(MallMemberWithdraw mallMemberWithdraw, QueryRequest request) { |
| | | Page<MallMemberWithdraw> page = new Page<>(request.getPageNum(), request.getPageSize()); |
| | | IPage<MallMemberWithdraw> adminChargeListVoIPage = mallChargeMapper.selectAdminWithdrawListInPage(page, mallMemberWithdraw); |
| | | return adminChargeListVoIPage; |
| | | } |
| | | } |
| | |
| | | package cc.mrbird.febs.mall.service.impl; |
| | | |
| | | import cc.mrbird.febs.common.enumerates.AgentLevelEnum; |
| | | import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum; |
| | | import cc.mrbird.febs.common.utils.AppContants; |
| | | import cc.mrbird.febs.mall.entity.AgentInfo; |
| | | import cc.mrbird.febs.mall.entity.DataDictionaryCustom; |
| | | import cc.mrbird.febs.mall.entity.MallMember; |
| | | import cc.mrbird.febs.mall.entity.MallOrderInfo; |
| | | import cc.mrbird.febs.mall.mapper.*; |
| | | import cc.mrbird.febs.common.enumerates.*; |
| | | import cc.mrbird.febs.common.utils.MallUtils; |
| | | import cc.mrbird.febs.mall.dto.ApiMemberChargeFailDto; |
| | | import cc.mrbird.febs.mall.entity.*; |
| | | import cc.mrbird.febs.mall.mapper.DataDictionaryCustomMapper; |
| | | import cc.mrbird.febs.mall.mapper.MallChargeMapper; |
| | | import cc.mrbird.febs.mall.mapper.MallMemberMapper; |
| | | import cc.mrbird.febs.mall.mapper.RunVipMapper; |
| | | import cc.mrbird.febs.mall.service.IAgentService; |
| | | import cc.mrbird.febs.mall.service.IApiMallMemberService; |
| | | import cc.mrbird.febs.mall.service.IApiMallMemberWalletService; |
| | | import cc.mrbird.febs.mall.service.IMallAchieveService; |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.date.DateTime; |
| | | import cn.hutool.core.date.DateUtil; |
| | | import cn.hutool.core.util.ObjectUtil; |
| | | import cn.hutool.core.util.StrUtil; |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import jdk.nashorn.internal.ir.IfNode; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import lombok.RequiredArgsConstructor; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.math.RoundingMode; |
| | | import java.util.ArrayList; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | /** |
| | | * @author wzy |
| | |
| | | public class AgentServiceImpl implements IAgentService { |
| | | |
| | | private final DataDictionaryCustomMapper dataDictionaryCustomMapper; |
| | | private final MallMemberMapper memberMapper; |
| | | private final MallMemberMapper mallMemberMapper; |
| | | private final MallChargeMapper mallChargeMapper; |
| | | private final RunVipMapper runVipMapper; |
| | | private final IApiMallMemberWalletService walletService; |
| | | private final IApiMallMemberService mallMemberService; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void autoUpAgentLevel(Long memberId) { |
| | | MallMember member = memberMapper.selectById(memberId); |
| | | MallMember member = mallMemberMapper.selectById(memberId); |
| | | if(StrUtil.isBlank(member.getReferrerIds())) { |
| | | return; |
| | | } |
| | | |
| | | List<String> ids = StrUtil.split(member.getReferrerIds(), ','); |
| | | List<MallMember> parentMembers = memberMapper.selectByInviteIds(ids); |
| | | List<MallMember> parentMembers = mallMemberMapper.selectByInviteIds(ids); |
| | | for (MallMember parent : parentMembers) { |
| | | // 未激活用户无法升级 |
| | | if (AgentLevelEnum.ZERO_LEVEL.name().equals(member.getLevel())) { |
| | |
| | | } |
| | | |
| | | parent.setLevel(nextLevel.getCode()); |
| | | memberMapper.updateById(parent); |
| | | mallMemberMapper.updateById(parent); |
| | | } |
| | | } |
| | | |
| | |
| | | * @return |
| | | */ |
| | | private boolean directMemberCnt(MallMember member, AgentInfo agentInfo) { |
| | | List<MallMember> childs = memberMapper.selectByRefererId(member.getInviteId()); |
| | | List<MallMember> childs = mallMemberMapper.selectByRefererId(member.getInviteId()); |
| | | if (CollUtil.isEmpty(childs)) { |
| | | return false; |
| | | } |
| | |
| | | } |
| | | |
| | | // 直推用户 |
| | | List<MallMember> directMember = memberMapper.selectByRefererId(member.getInviteId()); |
| | | List<MallMember> directMember = mallMemberMapper.selectByRefererId(member.getInviteId()); |
| | | if (CollUtil.isEmpty(directMember)) { |
| | | return false; |
| | | } |
| | |
| | | // 用户团队达到指定代理数量,且都不在同一条线 |
| | | int i = 0; |
| | | for (MallMember child : directMember) { |
| | | List<MallMember> mallMembers = memberMapper.selectChildAgentList(child.getInviteId(), member.getLevel()); |
| | | List<MallMember> mallMembers = mallMemberMapper.selectChildAgentList(child.getInviteId(), member.getLevel()); |
| | | if (CollUtil.isNotEmpty(mallMembers)) { |
| | | i++; |
| | | } |
| | |
| | | /** |
| | | * 团队业绩是否达标 |
| | | * |
| | | * @param mallMember |
| | | * @param agentInfo |
| | | * @return |
| | | */ |
| | | private boolean teamIncome(MallMember member, AgentInfo agentInfo) { |
| | | BigDecimal totalIncome = memberMapper.selectAchieveByMemberId(member.getInviteId(), 2); |
| | | BigDecimal totalIncome = mallMemberMapper.selectAchieveByMemberId(member.getInviteId(), 2); |
| | | |
| | | BigDecimal targetIncome = agentInfo.getTeamIncome().multiply(new BigDecimal("10000")); |
| | | if (totalIncome.compareTo(targetIncome) >= 0) { |
| | |
| | | public void rankReturnMoney(Long orderId) { |
| | | |
| | | } |
| | | |
| | | @Override |
| | | public void sendMemberChargeFailMsg(ApiMemberChargeFailDto apiMemberChargeFailDto) { |
| | | // 获取充值订单ID |
| | | Long chargeId = apiMemberChargeFailDto.getChargeId(); |
| | | |
| | | // 根据充值订单ID查询充值订单信息 |
| | | MallCharge mallCharge = mallChargeMapper.selectById(chargeId); |
| | | |
| | | // 如果查询不到充值订单信息,则直接返回 |
| | | if(ObjectUtil.isEmpty(mallCharge)){ |
| | | return; |
| | | } |
| | | |
| | | // 获取充值订单的状态 |
| | | Integer state = mallCharge.getState(); |
| | | |
| | | // 如果充值订单状态不是正在进行中,则直接返回 |
| | | if(YesOrNoEnum.ING.getValue() != state){ |
| | | return; |
| | | } |
| | | |
| | | // 更新充值订单状态为失败 |
| | | mallCharge.setState(YesOrNoEnum.NO.getValue()); |
| | | |
| | | // 更新数据库中的充值订单信息 |
| | | mallChargeMapper.updateById(mallCharge); |
| | | } |
| | | |
| | | @Override |
| | | public void buyVipSuccessMsg(Long chargeId) { |
| | | MallCharge mallCharge = mallChargeMapper.selectById(chargeId); |
| | | //更新会员的等级和过期时间 |
| | | Long memberId = mallCharge.getMemberId(); |
| | | String vipCode = mallCharge.getVipCode(); |
| | | DateTime dateTime = DateUtil.offsetMonth(DateUtil.date(), 1); |
| | | mallMemberMapper.updateVipLevelTimeAndLevel(memberId,dateTime,vipCode); |
| | | |
| | | //购买成功后,是否返利上级 |
| | | MallMember mallMember = mallMemberMapper.selectById(memberId); |
| | | if(null == mallMember.getReferrerId()){ |
| | | return; |
| | | } |
| | | |
| | | RunVip runVip = runVipMapper.selectOne(new LambdaQueryWrapper<RunVip>().eq(RunVip::getVipCode, vipCode)); |
| | | BigDecimal rebatePercent = runVip.getRebatePercent(); |
| | | BigDecimal amount = mallCharge.getAmount(); |
| | | BigDecimal rebateAmount = amount.multiply(rebatePercent).setScale(2, BigDecimal.ROUND_DOWN); |
| | | BigDecimal balanceToCoin = |
| | | new BigDecimal( |
| | | dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | RunVipDataDictionaryEnum.RUN_VIP_BALANCE_TO_COIN.getType(), |
| | | RunVipDataDictionaryEnum.RUN_VIP_BALANCE_TO_COIN.getCode() |
| | | ).getValue() |
| | | ); |
| | | BigDecimal rebateCoin = rebateAmount.divide(balanceToCoin, 2, BigDecimal.ROUND_DOWN); |
| | | if(BigDecimal.ZERO.compareTo(rebateCoin) >= 0){ |
| | | return; |
| | | } |
| | | MallMember parent = mallMemberMapper.selectInfoByInviteId(mallMember.getReferrerId()); |
| | | if(null == parent){ |
| | | return; |
| | | } |
| | | String orderNo = MallUtils.getOrderNum("FL"); |
| | | if(null != parent.getReferrerId()){ |
| | | BigDecimal rebateCoinGrandpa = rebateCoin.multiply(rebatePercent); |
| | | MallMember grandpa = mallMemberMapper.selectInfoByInviteId(parent.getReferrerId()); |
| | | if(null != grandpa){ |
| | | //返利给上上级 |
| | | walletService.addBalance(rebateCoinGrandpa,grandpa.getId()); |
| | | mallMemberService.runVipMoneyFlowAdd( |
| | | grandpa.getId(), |
| | | mallMember.getId(), |
| | | orderNo, |
| | | FlowTypeEnum.BALANCE.getValue(), |
| | | RunVipMoneyFlowTypeEnum.BUY_VIP_REBATE.getValue(), |
| | | rebateCoinGrandpa, |
| | | StrUtil.format(RunVipMoneyFlowTypeEnum.BUY_VIP_REBATE.getDescription(),mallMember.getPhone(),runVip.getVipName(),rebateCoinGrandpa), |
| | | YesOrNoEnum.YES.getValue() |
| | | ); |
| | | rebateCoin = rebateCoin.subtract(rebateCoinGrandpa); |
| | | } |
| | | } |
| | | //返利给上级 |
| | | walletService.addBalance(rebateCoin,parent.getId()); |
| | | mallMemberService.runVipMoneyFlowAdd( |
| | | parent.getId(), |
| | | mallMember.getId(), |
| | | orderNo, |
| | | FlowTypeEnum.BALANCE.getValue(), |
| | | RunVipMoneyFlowTypeEnum.BUY_VIP_REBATE.getValue(), |
| | | rebateCoin, |
| | | StrUtil.format(RunVipMoneyFlowTypeEnum.BUY_VIP_REBATE.getDescription(),mallMember.getPhone(),runVip.getVipName(),rebateCoin), |
| | | YesOrNoEnum.YES.getValue() |
| | | ); |
| | | } |
| | | } |
| | |
| | | package cc.mrbird.febs.mall.service.impl; |
| | | |
| | | import cc.mrbird.febs.common.entity.FebsResponse; |
| | | import cc.mrbird.febs.common.enumerates.DataDictionaryEnum; |
| | | import cc.mrbird.febs.common.enumerates.FlowTypeEnum; |
| | | import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum; |
| | | import cc.mrbird.febs.common.enumerates.ScoreFlowTypeEnum; |
| | | import cc.mrbird.febs.common.enumerates.*; |
| | | import cc.mrbird.febs.common.exception.FebsException; |
| | | import cc.mrbird.febs.common.properties.XcxProperties; |
| | | import cc.mrbird.febs.common.utils.*; |
| | |
| | | import cc.mrbird.febs.vip.mapper.MallVipConfigMapper; |
| | | import cn.hutool.core.bean.BeanUtil; |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.date.DateTime; |
| | | import cn.hutool.core.date.DateUnit; |
| | | import cn.hutool.core.date.DateUtil; |
| | | import cn.hutool.core.util.IdUtil; |
| | |
| | | private final MallGoodsMapper mallGoodsMapper; |
| | | |
| | | private final MallVipConfigMapper mallVipConfigMapper; |
| | | private final RunVipMapper runVipMapper; |
| | | private final MallStoreMapper mallStoreMapper; |
| | | private final MallStoreItemMapper mallStoreItemMapper; |
| | | private final MallStoreMemberMapper mallStoreMemberMapper; |
| | | private final MallMemberWithdrawMapper mallMemberWithdrawMapper; |
| | | |
| | | |
| | | @Value("${spring.profiles.active}") |
| | |
| | | mallMember.setReferrerIds(ids); |
| | | } |
| | | //会员VIP等级 |
| | | List<MallVipConfig> configs = mallVipConfigMapper.selectVipConfigList(); |
| | | if (StrUtil.isBlank(mallMember.getLevel()) && CollUtil.isNotEmpty(configs)) { |
| | | MallVipConfig mallVipConfig = configs.get(0); |
| | | mallMember.setLevel(mallVipConfig.getCode()); |
| | | List<RunVip> runVips = runVipMapper.selectList(new LambdaQueryWrapper<RunVip>().orderByAsc(RunVip::getOrderNumber)); |
| | | if (StrUtil.isBlank(mallMember.getLevel()) && CollUtil.isNotEmpty(runVips)) { |
| | | RunVip runVip = runVips.get(0); |
| | | mallMember.setLevel(runVip.getVipCode()); |
| | | } |
| | | this.baseMapper.updateById(mallMember); |
| | | |
| | |
| | | public FebsResponse findMemberInfo() { |
| | | Long id = LoginUserUtil.getLoginUser().getId(); |
| | | MallMember mallMember = this.baseMapper.selectById(id); |
| | | |
| | | MallMemberVo mallMemberVo = MallMemberConversion.INSTANCE.entityToVo(mallMember); |
| | | if(StrUtil.isNotEmpty(mallMember.getReferrerId())){ |
| | | MallMember referMember = this.baseMapper.selectInfoByInviteId(mallMember.getReferrerId()); |
| | | if (referMember != null) { |
| | | mallMemberVo.setReferrerName(referMember.getName()); |
| | | } |
| | | } |
| | | |
| | | if (StrUtil.isNotBlank(mallMember.getTradePassword())) { |
| | | mallMemberVo.setHasTradePwd(1); |
| | | } |
| | | mallMemberVo.setTradeWord(StrUtil.isEmpty(mallMember.getTradePassword()) ? YesOrNoEnum.NO.getValue() : YesOrNoEnum.YES.getValue()); |
| | | |
| | | MallMemberPayment payment = mallMemberPaymentMapper.selectByMemberId(id); |
| | | if (payment != null) { |
| | | mallMemberVo.setHasPayment(1); |
| | | } |
| | | |
| | | MemberCollectionListDto memberCollectionListDto = new MemberCollectionListDto(); |
| | | memberCollectionListDto.setPageNow(1); |
| | | memberCollectionListDto.setPageSize(10); |
| | | List<CollectionListVo> collectionList = mallMemberCollectionService.findMemberCollectionList(memberCollectionListDto); |
| | | mallMemberVo.setCollectionCnt(CollUtil.isNotEmpty(collectionList) ? collectionList.size() : 0); |
| | | |
| | | MemberFootprintListDto memberFootprintListDto = new MemberFootprintListDto(); |
| | | memberFootprintListDto.setPageNow(1); |
| | | memberFootprintListDto.setPageSize(10); |
| | | List<FootprintListVo> footprintList = mallMemberFootprintService.findMemberFootprintList(memberFootprintListDto); |
| | | mallMemberVo.setFootprintCnt(CollUtil.isNotEmpty(footprintList) ? footprintList.size() : 0); |
| | | |
| | | List<MallMember> mallMembers = this.baseMapper.selectByRefererId(mallMember.getInviteId()); |
| | | mallMemberVo.setChildCnt(CollUtil.isNotEmpty(mallMembers) ? mallMembers.size() : 0); |
| | | RunVip runVip = runVipMapper.selectOne(new LambdaQueryWrapper<RunVip>().eq(RunVip::getVipCode, mallMemberVo.getLevel())); |
| | | mallMemberVo.setLevelName(runVip.getVipName()); |
| | | mallMemberVo.setLevelPng(runVip.getVipPng()); |
| | | |
| | | MallMemberWallet wallet = mallMemberWalletMapper.selectWalletByMemberId(mallMemberVo.getId()); |
| | | |
| | | MallVipConfig mallVipConfig = mallVipConfigMapper.selectVipConfigByCode(mallMember.getLevel()); |
| | | |
| | | mallMemberVo.setVipInfo(mallVipConfig); |
| | | mallMemberVo.setBalance(wallet.getBalance()); |
| | | // mallMemberVo.setScore(wallet.getScore()); |
| | | mallMemberVo.setPrizeScore(wallet.getPrizeScore()); |
| | | // mallMemberVo.setTotalCost(mallOrderInfoMapper.selectTotalAmount(id)); |
| | | mallMemberVo.setScore(wallet.getScore()); |
| | | |
| | | mallMemberVo.setMinScore( |
| | | new BigDecimal( |
| | | dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | RunVipDataDictionaryEnum.RUN_VIP_SCORE_MIN.getType(), |
| | | RunVipDataDictionaryEnum.RUN_VIP_SCORE_MIN.getCode()).getValue() |
| | | ).setScale(0,BigDecimal.ROUND_DOWN) |
| | | ); |
| | | mallMemberVo.setScoreBalance( |
| | | new BigDecimal( |
| | | dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | RunVipDataDictionaryEnum.RUN_VIP_SCORE_TO_BALANCE.getType(), |
| | | RunVipDataDictionaryEnum.RUN_VIP_SCORE_TO_BALANCE.getCode()).getValue() |
| | | ).setScale(2, BigDecimal.ROUND_DOWN) |
| | | ); |
| | | mallMemberVo.setBalanceCoin( |
| | | new BigDecimal( |
| | | dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | RunVipDataDictionaryEnum.RUN_VIP_BALANCE_TO_COIN.getType(), |
| | | RunVipDataDictionaryEnum.RUN_VIP_BALANCE_TO_COIN.getCode()).getValue() |
| | | ).setScale(2, BigDecimal.ROUND_DOWN) |
| | | ); |
| | | mallMemberVo.setBalanceCoinPercent( |
| | | new BigDecimal( |
| | | dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | RunVipDataDictionaryEnum.RUN_VIP_BALANCE_TO_COIN_PERCENT.getType(), |
| | | RunVipDataDictionaryEnum.RUN_VIP_BALANCE_TO_COIN_PERCENT.getCode()).getValue() |
| | | ).setScale(4, BigDecimal.ROUND_DOWN) |
| | | ); |
| | | return new FebsResponse().success().data(mallMemberVo); |
| | | } |
| | | |
| | |
| | | } else { |
| | | memberId = teamListDto.getId(); |
| | | } |
| | | |
| | | MallMember mallMember = this.baseMapper.selectById(memberId); |
| | | |
| | | List<TeamListVo> list = this.baseMapper.selectTeamListByInviteId(mallMember.getInviteId()); |
| | | |
| | | /** |
| | | * 直属三级 |
| | | */ |
| | | MyTeamVo myTeamVo = new MyTeamVo(); |
| | | myTeamVo.setTeam(list); |
| | | myTeamVo.setMyAchieve(this.mallOrderInfoMapper.selectAmountOrTeamAmount(mallMember.getInviteId(), 1)); |
| | | myTeamVo.setMyTeamAchieve(this.mallOrderInfoMapper.selectAmountOrTeamAmount(mallMember.getInviteId(), 2)); |
| | | myTeamVo.setMyTeamCnt(this.baseMapper.selectAllChildAgentListByInviteId(mallMember.getInviteId()).size()); |
| | | //获取个人的碳币 |
| | | MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(memberId); |
| | | myTeamVo.setMyBalance(mallMemberWallet.getBalance()); |
| | | //全部直推 |
| | | List<MallMember> mallMembers = this.baseMapper.selectByRefererId(mallMember.getInviteId()); |
| | | /** |
| | | * 如果没有下级,那么直接返回当前用户的信息 |
| | | */ |
| | | if(CollUtil.isEmpty(mallMembers)){ |
| | | myTeamVo.setMyTeamCnt(0); |
| | | myTeamVo.setMyTeamBalance(BigDecimal.ZERO); |
| | | myTeamVo.setTeam(null); |
| | | return new FebsResponse().success().data(myTeamVo); |
| | | } |
| | | /** |
| | | * 如果有下级,获取所有的团队 |
| | | */ |
| | | myTeamVo.setMyTeamCnt(mallMembers.size()); |
| | | myTeamVo.setMyTeamBalance(getTeamBalance(mallMembers)); |
| | | |
| | | List<TeamListVo> teamListVos = MallMemberConversion.INSTANCE.entityToTeamListVos(mallMembers); |
| | | teamListVos.forEach(item -> { |
| | | item.setMyBalance(mallMemberWalletMapper.selectWalletByMemberId(item.getId()).getBalance()); |
| | | item.setLevelName(runVipMapper.selectOne(new LambdaQueryWrapper<RunVip>().eq(RunVip::getVipCode,item.getLevel())).getVipName()); |
| | | List<MallMember> mallMemberRefs = this.baseMapper.selectByRefererId(item.getInviteId()); |
| | | if(CollUtil.isEmpty(mallMemberRefs)){ |
| | | item.setMyTeamCnt(0); |
| | | item.setMyTeamBalance(BigDecimal.ZERO); |
| | | }else{ |
| | | item.setMyTeamCnt(mallMemberRefs.size()); |
| | | //获取mallMembers的所有id |
| | | myTeamVo.setMyTeamBalance(getTeamBalance(mallMemberRefs)); |
| | | } |
| | | }); |
| | | |
| | | |
| | | return new FebsResponse().success().data(myTeamVo); |
| | | } |
| | | |
| | | /** |
| | | * 获取团队余额 |
| | | * 该方法计算一组商城成员的总余额 |
| | | * 它首先提取成员ID,然后查询这些成员的钱包信息,并计算钱包余额的总和 |
| | | * |
| | | * @param mallMembers 商城成员列表,用于计算总余额 |
| | | * @return 团队的总余额,表示为BigDecimal类型 |
| | | */ |
| | | private BigDecimal getTeamBalance(List<MallMember> mallMembers) { |
| | | // 提取所有商城成员的ID,以便进行后续的钱包信息查询 |
| | | List<Long> ids = mallMembers.stream().map(MallMember::getId).collect(Collectors.toList()); |
| | | |
| | | // 根据成员ID列表查询所有相关成员的钱包信息 |
| | | List<MallMemberWallet> mallMemberWallets = mallMemberWalletMapper.selectList(new LambdaQueryWrapper<MallMemberWallet>().in(MallMemberWallet::getMemberId, ids)); |
| | | |
| | | // 计算所有成员钱包余额的总和,并返回该总和 |
| | | return mallMemberWallets.stream().map(MallMemberWallet::getBalance).reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | } |
| | | |
| | | @Override |
| | |
| | | Long id = LoginUserUtil.getLoginUser().getId(); |
| | | moneyFlowDto.setMemberId(id); |
| | | IPage<MoneyFlowVo> pages = mallMoneyFlowMapper.selectApiMoneyFlowInPage(page, moneyFlowDto); |
| | | |
| | | if (moneyFlowDto.getFlowType() == 3) { |
| | | pages.getRecords().forEach(item -> { |
| | | item.setDescription(ScoreFlowTypeEnum.getDescByValue(item.getType())); |
| | | }); |
| | | } |
| | | return new FebsResponse().success().data(pages); |
| | | } |
| | | |
| | |
| | | mallMoneyFlowMapper.insert(flow); |
| | | } |
| | | |
| | | /** |
| | | * 处理VIP资金流水添加操作 |
| | | * 此方法用于在会员进行充值或扣费活动时,记录相应的资金流水信息 |
| | | * |
| | | * @param memberId 会员ID,标识进行资金操作的会员 |
| | | * @param rtMemberId 实体会员ID,用于关联现实中的会员身份 |
| | | * @param orderNo 订单编号,用于跟踪资金流水的来源订单 |
| | | * @param flowType 流水类型,指示资金流入或流出 |
| | | * @param type 交易类型,区分不同的交易场景 |
| | | * @param amount 金额,本次操作涉及的资金量 |
| | | * @param description 描述,简述本次资金操作的原因或场景 |
| | | * @param status 状态,表示资金操作的当前状态 |
| | | */ |
| | | @Override |
| | | public void runVipMoneyFlowAdd(Long memberId, Long rtMemberId, String orderNo,Integer flowType, Integer type, BigDecimal amount, String description, Integer status) { |
| | | // 创建一个新的商城资金流水对象 |
| | | MallMoneyFlow flow = new MallMoneyFlow(); |
| | | |
| | | // 设置资金流水的各项属性 |
| | | flow.setMemberId(memberId); |
| | | flow.setRtMemberId(rtMemberId); |
| | | flow.setOrderNo(orderNo); |
| | | flow.setFlowType(flowType); |
| | | flow.setType(type); |
| | | flow.setAmount(amount); |
| | | flow.setDescription(description); |
| | | flow.setStatus(status); |
| | | |
| | | // 插入资金流水记录到数据库 |
| | | mallMoneyFlowMapper.insert(flow); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void transfer(TransferDto transferDto) { |
| | | Long memberId = LoginUserUtil.getLoginUser().getId(); |
| | | MallMember mallMember = this.baseMapper.selectInfoByAccount(transferDto.getAccount()); |
| | | if (mallMember == null) { |
| | | throw new FebsException("用户不存在"); |
| | | } |
| | | |
| | | Long memberId = LoginUserUtil.getLoginUser().getId(); |
| | | MallMember loginMember = this.baseMapper.selectById(memberId); |
| | | |
| | | /** |
| | | * 用户的等级level是否允许兑换碳币 |
| | | */ |
| | | RunVip runVip = runVipMapper.selectOne(new LambdaQueryWrapper<RunVip>().eq(RunVip::getVipCode, loginMember.getLevel())); |
| | | if(ObjectUtil.isEmpty(runVip) || runVip.getChangeState() != YesOrNoEnum.YES.getValue()){ |
| | | throw new FebsException("请先升级会员"); |
| | | } |
| | | |
| | | if (loginMember.getPhone().equals(transferDto.getAccount()) || loginMember.getInviteId().equals(transferDto.getAccount())) { |
| | | throw new FebsException("不能给自己转账"); |
| | | } |
| | | |
| | | if (StrUtil.isBlank(loginMember.getTradePassword())) { |
| | | throw new FebsException("未设置支付密码"); |
| | | throw new FebsException("未设置资金密码"); |
| | | } |
| | | |
| | | if (!loginMember.getTradePassword().equals(SecureUtil.md5(transferDto.getTradePwd()))) { |
| | | throw new FebsException("支付密码错误"); |
| | | throw new FebsException("资金密码错误"); |
| | | } |
| | | |
| | | walletService.reduceBalance(transferDto.getAmount(), memberId); |
| | | String orderNo = MallUtils.getOrderNum("T"); |
| | | this.addMoneyFlow(memberId, transferDto.getAmount().negate(), MoneyFlowTypeEnum.TRANSFER.getValue(), orderNo, null, null, mallMember.getId(), null, FlowTypeEnum.BALANCE.getValue()); |
| | | |
| | | walletService.reduceBalance(transferDto.getAmount(), loginMember.getId()); |
| | | String orderNo = MallUtils.getOrderNum("HZ"); |
| | | this.runVipMoneyFlowAdd( |
| | | loginMember.getId(), |
| | | mallMember.getId(), |
| | | orderNo, |
| | | FlowTypeEnum.BALANCE.getValue(), |
| | | RunVipMoneyFlowTypeEnum.BALANCE_OUT_GIVE_FRIEND.getValue(), |
| | | transferDto.getAmount().negate(), |
| | | StrUtil.format(RunVipMoneyFlowTypeEnum.BALANCE_OUT_GIVE_FRIEND.getDescription(),mallMember.getInviteId(),transferDto.getAmount()), |
| | | YesOrNoEnum.YES.getValue() |
| | | ); |
| | | walletService.addBalance(transferDto.getAmount(), mallMember.getId()); |
| | | this.addMoneyFlow(mallMember.getId(), transferDto.getAmount(), MoneyFlowTypeEnum.TRANSFER.getValue(), orderNo, null, null, memberId, null, FlowTypeEnum.BALANCE.getValue()); |
| | | |
| | | this.runVipMoneyFlowAdd( |
| | | mallMember.getId(), |
| | | loginMember.getId(), |
| | | orderNo, |
| | | FlowTypeEnum.BALANCE.getValue(), |
| | | RunVipMoneyFlowTypeEnum.BALANCE_IN_GIVE_FRIEND.getValue(), |
| | | transferDto.getAmount(), |
| | | StrUtil.format(RunVipMoneyFlowTypeEnum.BALANCE_IN_GIVE_FRIEND.getDescription(),loginMember.getInviteId(),transferDto.getAmount()), |
| | | YesOrNoEnum.YES.getValue() |
| | | ); |
| | | } |
| | | |
| | | @Override |
| | | public void setPayment(MallMemberPayment mallMemberPayment) { |
| | | MallMember member = LoginUserUtil.getLoginUser(); |
| | | public void withdrawal(WithdrawalDto withdrawalDto) { |
| | | Long memberId = LoginUserUtil.getLoginUser().getId(); |
| | | MallMember loginMember = this.baseMapper.selectById(memberId); |
| | | /** |
| | | * 用户的等级level是否允许兑换碳币 |
| | | */ |
| | | RunVip runVip = runVipMapper.selectOne(new LambdaQueryWrapper<RunVip>().eq(RunVip::getVipCode, loginMember.getLevel())); |
| | | if(ObjectUtil.isEmpty(runVip) || runVip.getWithdrawState() != YesOrNoEnum.YES.getValue()){ |
| | | throw new FebsException("请先升级会员"); |
| | | } |
| | | |
| | | MallMemberPayment exist = mallMemberPaymentMapper.selectByMemberId(member.getId()); |
| | | if (exist == null) { |
| | | if (StrUtil.isBlank(loginMember.getTradePassword())) { |
| | | throw new FebsException("未设置资金密码"); |
| | | } |
| | | |
| | | if (!loginMember.getTradePassword().equals(SecureUtil.md5(withdrawalDto.getTradePwd()))) { |
| | | throw new FebsException("资金密码错误"); |
| | | } |
| | | |
| | | MallMemberPayment mallMemberPayment = mallMemberPaymentMapper.selectById(withdrawalDto.getAddressId()); |
| | | if (mallMemberPayment == null) { |
| | | throw new FebsException("无效的提现地址"); |
| | | } |
| | | BigDecimal minCnt = new BigDecimal( |
| | | dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | RunVipDataDictionaryEnum.RUN_VIP_BALANCE_TO_COIN_MIN.getType(), |
| | | RunVipDataDictionaryEnum.RUN_VIP_BALANCE_TO_COIN_MIN.getCode()).getValue() |
| | | ).setScale(4, BigDecimal.ROUND_DOWN); |
| | | if(minCnt.compareTo(withdrawalDto.getAmount()) > 0){ |
| | | throw new FebsException(minCnt+"碳币起提"); |
| | | } |
| | | |
| | | BigDecimal balanceToCoin = new BigDecimal( |
| | | dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | RunVipDataDictionaryEnum.RUN_VIP_BALANCE_TO_COIN.getType(), |
| | | RunVipDataDictionaryEnum.RUN_VIP_BALANCE_TO_COIN.getCode()).getValue() |
| | | ).setScale(2, BigDecimal.ROUND_DOWN); |
| | | BigDecimal balanceToCoinPercent = new BigDecimal( |
| | | dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | RunVipDataDictionaryEnum.RUN_VIP_BALANCE_TO_COIN_PERCENT.getType(), |
| | | RunVipDataDictionaryEnum.RUN_VIP_BALANCE_TO_COIN_PERCENT.getCode()).getValue() |
| | | ).setScale(4, BigDecimal.ROUND_DOWN); |
| | | /** |
| | | * 减少碳币,增加进行中提现记录 |
| | | */ |
| | | BigDecimal withdrawalAmount = withdrawalDto.getAmount().multiply(balanceToCoin).setScale(2, BigDecimal.ROUND_DOWN); |
| | | BigDecimal fee = balanceToCoinPercent.multiply(withdrawalAmount).setScale(2, BigDecimal.ROUND_DOWN); |
| | | BigDecimal withdrawalAmountReal = withdrawalAmount.subtract(fee); |
| | | String orderNo = MallUtils.getOrderNum("TX"); |
| | | MallMemberWithdraw withdraw = new MallMemberWithdraw(); |
| | | withdraw.setWithdrawNo(orderNo); |
| | | withdraw.setMemberId(loginMember.getId()); |
| | | withdraw.setAmount(withdrawalAmountReal); |
| | | withdraw.setStatus(YesOrNoEnum.ING.getValue()); |
| | | withdraw.setAmountFee(fee); |
| | | withdraw.setName(mallMemberPayment.getBank()); |
| | | withdraw.setType(mallMemberPayment.getBankNo()); |
| | | mallMemberWithdrawMapper.insert(withdraw); |
| | | |
| | | walletService.reduceBalance(withdrawalDto.getAmount(), loginMember.getId()); |
| | | this.runVipMoneyFlowAdd( |
| | | loginMember.getId(), |
| | | loginMember.getId(), |
| | | orderNo, |
| | | FlowTypeEnum.BALANCE.getValue(), |
| | | RunVipMoneyFlowTypeEnum.BALANCE_OUT.getValue(), |
| | | withdrawalDto.getAmount().negate(), |
| | | StrUtil.format(RunVipMoneyFlowTypeEnum.BALANCE_OUT.getDescription(),withdrawalDto.getAmount(),withdrawalAmount,fee), |
| | | YesOrNoEnum.ING.getValue() |
| | | ); |
| | | |
| | | } |
| | | |
| | | @Override |
| | | public void commissionChange(CommissionChangeDto commissionChange) { |
| | | Long memberId = LoginUserUtil.getLoginUser().getId(); |
| | | BigDecimal minScore = new BigDecimal( |
| | | dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | RunVipDataDictionaryEnum.RUN_VIP_SCORE_MIN.getType(), |
| | | RunVipDataDictionaryEnum.RUN_VIP_SCORE_MIN.getCode()).getValue() |
| | | ).setScale(0, BigDecimal.ROUND_DOWN); |
| | | if(minScore.compareTo(commissionChange.getAmount()) > 0){ |
| | | throw new FebsException("碳积分不足"+minScore); |
| | | } |
| | | |
| | | MallMember loginMember = this.baseMapper.selectById(memberId); |
| | | if (StrUtil.isBlank(loginMember.getTradePassword())) { |
| | | throw new FebsException("未设置资金密码"); |
| | | } |
| | | if (!loginMember.getTradePassword().equals(SecureUtil.md5(commissionChange.getTradePwd()))) { |
| | | throw new FebsException("资金密码错误"); |
| | | } |
| | | /** |
| | | * 用户的等级level是否允许兑换碳币 |
| | | */ |
| | | RunVip runVip = runVipMapper.selectOne(new LambdaQueryWrapper<RunVip>().eq(RunVip::getVipCode, loginMember.getLevel())); |
| | | if(ObjectUtil.isEmpty(runVip) || runVip.getChangeState() != YesOrNoEnum.YES.getValue()){ |
| | | throw new FebsException("请先升级会员"); |
| | | } |
| | | |
| | | BigDecimal scoreBalancePercent = new BigDecimal( |
| | | dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | RunVipDataDictionaryEnum.RUN_VIP_SCORE_TO_BALANCE.getType(), |
| | | RunVipDataDictionaryEnum.RUN_VIP_SCORE_TO_BALANCE.getCode()).getValue() |
| | | ).setScale(2, BigDecimal.ROUND_DOWN); |
| | | BigDecimal score = commissionChange.getAmount(); |
| | | BigDecimal balance = commissionChange.getAmount().multiply(scoreBalancePercent).setScale(2, BigDecimal.ROUND_DOWN); |
| | | |
| | | walletService.reduceScore(score, loginMember.getId()); |
| | | String orderNo = MallUtils.getOrderNum("DH"); |
| | | this.runVipMoneyFlowAdd( |
| | | loginMember.getId(), |
| | | loginMember.getId(), |
| | | orderNo, |
| | | FlowTypeEnum.SCORE.getValue(), |
| | | RunVipMoneyFlowTypeEnum.SCORE_OUT_BALANCE.getValue(), |
| | | score.negate(), |
| | | StrUtil.format(RunVipMoneyFlowTypeEnum.SCORE_OUT_BALANCE.getDescription(),score,balance), |
| | | YesOrNoEnum.YES.getValue() |
| | | ); |
| | | |
| | | walletService.addBalance(balance, loginMember.getId()); |
| | | this.runVipMoneyFlowAdd( |
| | | loginMember.getId(), |
| | | loginMember.getId(), |
| | | orderNo, |
| | | FlowTypeEnum.BALANCE.getValue(), |
| | | RunVipMoneyFlowTypeEnum.SCORE_OUT_BALANCE_IN.getValue(), |
| | | balance, |
| | | StrUtil.format(RunVipMoneyFlowTypeEnum.SCORE_OUT_BALANCE_IN.getDescription(),score,balance), |
| | | YesOrNoEnum.YES.getValue() |
| | | ); |
| | | } |
| | | |
| | | @Override |
| | | public void setPayment(ApiMallMemberPaymentDto apiMallMemberPaymentDto) { |
| | | |
| | | List<MallMemberPayment> mallMemberPayments = mallMemberPaymentMapper.selectList( |
| | | new LambdaQueryWrapper<MallMemberPayment>().eq(MallMemberPayment::getBank, apiMallMemberPaymentDto.getBank())); |
| | | if(CollUtil.isNotEmpty(mallMemberPayments)){ |
| | | throw new FebsException("地址已使用"); |
| | | } |
| | | |
| | | MallMember member = LoginUserUtil.getLoginUser(); |
| | | if(null == apiMallMemberPaymentDto.getId()){//新增 |
| | | MallMemberPayment mallMemberPayment = new MallMemberPayment(); |
| | | mallMemberPayment.setMemberId(member.getId()); |
| | | mallMemberPayment.setBankNo(apiMallMemberPaymentDto.getBankNo()); |
| | | mallMemberPayment.setBank(apiMallMemberPaymentDto.getBank()); |
| | | mallMemberPaymentMapper.insert(mallMemberPayment); |
| | | } else { |
| | | mallMemberPayment.setId(exist.getId()); |
| | | }else{ |
| | | MallMemberPayment mallMemberPayment = mallMemberPaymentMapper.selectById(apiMallMemberPaymentDto.getId()); |
| | | mallMemberPayment.setMemberId(member.getId()); |
| | | mallMemberPayment.setBankNo(apiMallMemberPaymentDto.getBankNo()); |
| | | mallMemberPayment.setBank(apiMallMemberPaymentDto.getBank()); |
| | | mallMemberPaymentMapper.updateById(mallMemberPayment); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public MallMemberPayment findMemberPayment() { |
| | | public List<MallMemberPayment> findMemberPayment() { |
| | | MallMember member = LoginUserUtil.getLoginUser(); |
| | | return mallMemberPaymentMapper.selectByMemberId(member.getId()); |
| | | List<MallMemberPayment> mallMemberPayments = mallMemberPaymentMapper.selectList(new LambdaQueryWrapper<MallMemberPayment>().eq(MallMemberPayment::getMemberId, member.getId())); |
| | | return mallMemberPayments; |
| | | } |
| | | |
| | | @Override |
| | | public void delPayment(ApiMallMemberPaymentDto mallMemberPayment) { |
| | | MallMember member = LoginUserUtil.getLoginUser(); |
| | | mallMemberPaymentMapper.deleteById(mallMemberPayment.getId()); |
| | | } |
| | | |
| | | @Override |
| | |
| | | return new FebsResponse().success().data(data); |
| | | } |
| | | |
| | | @Override |
| | | public List<ApiChartVo> dayRecord(ApiRecordDto apiRecordDto) { |
| | | /** |
| | | * 1:日榜 2:月榜 |
| | | * 获取当前日期 |
| | | */ |
| | | LambdaQueryWrapper<MallMoneyFlow> mallMoneyFlowLambdaQueryWrapper = new LambdaQueryWrapper<>(); |
| | | if(apiRecordDto.getType() == 1){ |
| | | DateTime dateTime = DateUtil.beginOfDay(DateUtil.date()); |
| | | mallMoneyFlowLambdaQueryWrapper.ge(MallMoneyFlow :: getCreatedTime , dateTime); |
| | | }else{ |
| | | DateTime dateTime = DateUtil.beginOfMonth(DateUtil.date()); |
| | | mallMoneyFlowLambdaQueryWrapper.ge(MallMoneyFlow :: getCreatedTime , dateTime); |
| | | } |
| | | mallMoneyFlowLambdaQueryWrapper.eq(MallMoneyFlow :: getFlowType, FlowTypeEnum.SCORE.getValue()); |
| | | mallMoneyFlowLambdaQueryWrapper.eq(MallMoneyFlow :: getType, RunVipMoneyFlowTypeEnum.SCORE_OUT_BALANCE.getValue()); |
| | | List<MallMoneyFlow> mallMoneyFlows = mallMoneyFlowMapper.selectList(mallMoneyFlowLambdaQueryWrapper); |
| | | |
| | | List<ApiChartVo> apiChartVos = new ArrayList<>(); |
| | | if(CollUtil.isEmpty(mallMoneyFlows)){ |
| | | return apiChartVos; |
| | | } |
| | | // 使用 Stream API 按照 memberId 分组,并计算每个 memberId 的 amount 绝对值之和 |
| | | Map<Long, BigDecimal> sumByMemberId = mallMoneyFlows.stream() |
| | | .collect(Collectors.groupingBy( |
| | | MallMoneyFlow::getMemberId, |
| | | Collectors.reducing(BigDecimal.ZERO, MallMoneyFlow::getAmount, BigDecimal::add) |
| | | )).entrySet().stream() |
| | | .collect(Collectors.toMap( |
| | | Map.Entry::getKey, |
| | | entry -> entry.getValue().abs() // 计算绝对值 |
| | | )); |
| | | |
| | | // 对 Map 按照 amount 的绝对值之和从大到小排序,并取前十个结果 |
| | | List<Map.Entry<Long, BigDecimal>> sortedList = sumByMemberId.entrySet().stream() |
| | | .sorted((entry1, entry2) -> entry2.getValue().compareTo(entry1.getValue())) |
| | | .limit(10) |
| | | .collect(Collectors.toList()); |
| | | sortedList.forEach(entry -> { |
| | | ApiChartVo apiChartVo = new ApiChartVo(); |
| | | MallMember mallMember = this.baseMapper.selectById(entry.getKey()); |
| | | apiChartVo.setPhone(mallMember.getPhone()); |
| | | apiChartVo.setAvatar(mallMember.getAvatar()); |
| | | apiChartVo.setScore(entry.getValue()); |
| | | apiChartVos.add(apiChartVo); |
| | | }); |
| | | return apiChartVos; |
| | | } |
| | | |
| | | public static void main(String[] args) { |
| | | Long userld = 173L; |
| | | String shopAccount = "luohu"; |
| | |
| | | package cc.mrbird.febs.mall.service.impl; |
| | | |
| | | import cc.mrbird.febs.common.enumerates.FlowTypeEnum; |
| | | import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum; |
| | | import cc.mrbird.febs.common.exception.FebsException; |
| | | import cc.mrbird.febs.common.utils.LoginUserUtil; |
| | | import cc.mrbird.febs.mall.dto.CommissionChangeDto; |
| | | import cc.mrbird.febs.mall.entity.MallMember; |
| | | import cc.mrbird.febs.mall.entity.MallMemberWallet; |
| | | import cc.mrbird.febs.mall.mapper.DataDictionaryCustomMapper; |
| | | import cc.mrbird.febs.mall.mapper.MallMemberWalletMapper; |
| | | import cc.mrbird.febs.mall.service.IApiMallMemberService; |
| | | import cc.mrbird.febs.mall.service.IApiMallMemberWalletService; |
| | | import cc.mrbird.febs.mall.service.IMallMoneyFlowService; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | |
| | | public class ApiMallMemberWalletServiceImpl extends ServiceImpl<MallMemberWalletMapper, MallMemberWallet> implements IApiMallMemberWalletService { |
| | | |
| | | private final IMallMoneyFlowService moneyFlowService; |
| | | private final DataDictionaryCustomMapper dataDictionaryCustomMapper; |
| | | |
| | | @Override |
| | | public void addBalance(BigDecimal amount, Long memberId) { |
| | |
| | | flag = false; |
| | | } else { |
| | | if (i > 2) { |
| | | throw new FebsException("余额增加失败"); |
| | | throw new FebsException("操作失败"); |
| | | } |
| | | } |
| | | } |
| | |
| | | i++; |
| | | MallMemberWallet wallet = this.baseMapper.selectWalletByMemberId(memberId); |
| | | if (amount.compareTo(wallet.getBalance()) > 0) { |
| | | throw new FebsException("余额不足"); |
| | | throw new FebsException("碳币不足"); |
| | | } |
| | | |
| | | wallet.setBalance(wallet.getBalance().subtract(amount)); |
| | |
| | | flag = false; |
| | | } else { |
| | | if (i > 2) { |
| | | throw new FebsException("余额支付失败"); |
| | | throw new FebsException("操作失败"); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public void addScore(BigDecimal amount, Long memberId) { |
| | | int i = 0; |
| | | boolean flag = true; |
| | | |
| | | while (flag) { |
| | | i++; |
| | | MallMemberWallet wallet = this.baseMapper.selectWalletByMemberId(memberId); |
| | | wallet.setScore(wallet.getScore().add(amount)); |
| | | |
| | | int result = this.baseMapper.updateScoreWithVersion(wallet); |
| | | if (result > 0) { |
| | | flag = false; |
| | | } else { |
| | | if (i > 2) { |
| | | throw new FebsException("操作失败"); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public void reduceScore(BigDecimal amount, Long memberId) { |
| | | int i = 0; |
| | | boolean flag = true; |
| | | |
| | | while (flag) { |
| | | i++; |
| | | MallMemberWallet wallet = this.baseMapper.selectWalletByMemberId(memberId); |
| | | if (amount.compareTo(wallet.getScore()) > 0) { |
| | | throw new FebsException("碳积分不足"); |
| | | } |
| | | |
| | | wallet.setScore(wallet.getScore().subtract(amount)); |
| | | |
| | | int result = this.baseMapper.updateScoreWithVersion(wallet); |
| | | if (result > 0) { |
| | | flag = false; |
| | | } else { |
| | | if (i > 2) { |
| | | throw new FebsException("操作失败"); |
| | | } |
| | | } |
| | | } |
| | |
| | | declaredField.set(update, balance.add(amount)); |
| | | } catch (NoSuchFieldException | IllegalAccessException e) { |
| | | e.printStackTrace(); |
| | | throw new FebsException("金额新增失败"); |
| | | throw new FebsException("操作失败"); |
| | | } |
| | | |
| | | int result = this.baseMapper.updateAmountWithVersion(update); |
| | |
| | | flag = false; |
| | | } else { |
| | | if (i > 2) { |
| | | throw new FebsException("金额新增失败"); |
| | | throw new FebsException("操作失败"); |
| | | } |
| | | } |
| | | } |
| | |
| | | flag = false; |
| | | } else { |
| | | if (i > 2) { |
| | | throw new FebsException("余额修改失败"); |
| | | throw new FebsException("操作失败"); |
| | | } |
| | | } |
| | | } |
| | |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void commissionChange(CommissionChangeDto commissionChange) { |
| | | MallMember member = LoginUserUtil.getLoginUser(); |
| | | |
| | | // TODO 判断是否开启了划转 |
| | | |
| | | int type; |
| | | int flowType; |
| | | this.reduce(commissionChange.getAmount(), member.getId(), "commission"); |
| | | |
| | | // 佣金转余额 |
| | | if (commissionChange.getType() == 1) { |
| | | type = MoneyFlowTypeEnum.COMMISSION_TO_BALANCE.getValue(); |
| | | flowType = FlowTypeEnum.BALANCE.getValue(); |
| | | this.add(commissionChange.getAmount(), member.getId(), "balance"); |
| | | |
| | | // 佣金转竞猜积分 |
| | | } else if (commissionChange.getType() == 2){ |
| | | type = MoneyFlowTypeEnum.COMMISSION_TO_PRIZESCORE.getValue(); |
| | | flowType = FlowTypeEnum.PRIZE_SCORE.getValue(); |
| | | this.add(commissionChange.getAmount(), member.getId(), "prizeScore"); |
| | | } else { |
| | | throw new FebsException("参数错误"); |
| | | } |
| | | |
| | | moneyFlowService.addMoneyFlow(member.getId(), commissionChange.getAmount().negate(), type, null, FlowTypeEnum.COMMISSION.getValue()); |
| | | moneyFlowService.addMoneyFlow(member.getId(), commissionChange.getAmount(), type, null, flowType); |
| | | } |
| | | } |
| | |
| | | orderInfo.setLongitude(address.getLongitude()); |
| | | this.baseMapper.updateById(orderInfo); |
| | | //过期时间修改成24小时 |
| | | agentProducer.sendOrderCancelDelayMsg(orderInfo.getId(), 24 * 60 * 60 * 1000L); |
| | | return orderInfo.getId(); |
| | | } |
| | | |
| | |
| | | |
| | | orderInfo.setPayOrderNo(payResultStr); |
| | | orderInfo.setPayMethod("支付宝支付"); |
| | | agentProducer.sendOrderReturn(orderInfo.getId()); |
| | | break; |
| | | case "3": |
| | | payResultStr = balancePay(orderInfo, payOrderDto.getTradePwd(), "balance"); |
| | |
| | | |
| | | mallMoneyFlowService.addMoneyFlow(member.getId(), orderInfo.getAmount().negate(), MoneyFlowTypeEnum.PAY.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.BALANCE.getValue(),"余额支付",2); |
| | | |
| | | agentProducer.sendOrderCoupon(orderInfo.getId()); |
| | | break; |
| | | case "4": |
| | | if (orderInfo.getOrderType() != 2) { |
| | |
| | | orderInfo.setReceivingTime(new Date()); |
| | | this.baseMapper.updateById(orderInfo); |
| | | //普通订单才产生积分,积分订单不产生积分 |
| | | if(1 == orderInfo.getOrderType()){ |
| | | agentProducer.sendGetScoreMsg(orderInfo.getId()); |
| | | } |
| | | //生成一条团长提成记录 |
| | | // Long orderInfoId = orderInfo.getId(); |
| | | // List<MallOrderItem> mallOrderItemList = mallOrderItemMapper.selectListByOrderId(orderInfoId); |
| | |
| | | package cc.mrbird.febs.mall.service.impl; |
| | | |
| | | import cc.mrbird.febs.common.entity.FebsResponse; |
| | | import cc.mrbird.febs.common.enumerates.RunVipDataDictionaryEnum; |
| | | import cc.mrbird.febs.common.enumerates.YesOrNoEnum; |
| | | import cc.mrbird.febs.common.exception.FebsException; |
| | | import cc.mrbird.febs.common.utils.LoginUserUtil; |
| | | import cc.mrbird.febs.common.utils.MallUtils; |
| | | import cc.mrbird.febs.mall.conversion.RunVipConversion; |
| | | import cc.mrbird.febs.mall.entity.MallMember; |
| | | import cc.mrbird.febs.mall.entity.RunVip; |
| | | import cc.mrbird.febs.mall.dto.ApiChargeListDto; |
| | | import cc.mrbird.febs.mall.dto.ApiGoChargeDto; |
| | | import cc.mrbird.febs.mall.dto.ApiGoChargeInfoDto; |
| | | import cc.mrbird.febs.mall.dto.ApiMemberChargeFailDto; |
| | | import cc.mrbird.febs.mall.entity.*; |
| | | import cc.mrbird.febs.mall.mapper.DataDictionaryCustomMapper; |
| | | import cc.mrbird.febs.mall.mapper.MallChargeMapper; |
| | | import cc.mrbird.febs.mall.mapper.MallMemberPaymentMapper; |
| | | import cc.mrbird.febs.mall.mapper.RunVipMapper; |
| | | import cc.mrbird.febs.mall.service.IRunVipService; |
| | | import cc.mrbird.febs.mall.vo.ApiChargeInfoVo; |
| | | import cc.mrbird.febs.mall.vo.ApiChargeVo; |
| | | import cc.mrbird.febs.mall.vo.ApiGoChargeVo; |
| | | import cc.mrbird.febs.mall.vo.ApiRunVipVo; |
| | | import cc.mrbird.febs.rabbit.producter.AgentProducer; |
| | | import cn.hutool.core.date.DateTime; |
| | | import cn.hutool.core.date.DateUtil; |
| | | import cn.hutool.core.util.ObjectUtil; |
| | | import cn.hutool.core.util.StrUtil; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import lombok.RequiredArgsConstructor; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | import java.util.stream.Collectors; |
| | | |
| | | @Slf4j |
| | | @Service |
| | | @RequiredArgsConstructor |
| | | public class RunVipServiceImpl extends ServiceImpl<RunVipMapper, RunVip> implements IRunVipService { |
| | | |
| | | private final DataDictionaryCustomMapper dataDictionaryCustomMapper; |
| | | private final MallMemberPaymentMapper mallMemberPaymentMapper; |
| | | private final MallChargeMapper mallChargeMapper; |
| | | private final AgentProducer agentProducer; |
| | | @Override |
| | | public List<ApiRunVipVo> vipInfo() { |
| | | MallMember member = LoginUserUtil.getLoginUser(); |
| | |
| | | |
| | | return apiRunVipVos; |
| | | } |
| | | |
| | | @Override |
| | | public FebsResponse goCharge(ApiGoChargeDto apiGoChargeDto) { |
| | | |
| | | Long memberId = LoginUserUtil.getLoginUser().getId(); |
| | | |
| | | Long runVipId = apiGoChargeDto.getRunVipId(); |
| | | RunVip runVip = this.baseMapper.selectById(runVipId); |
| | | if(runVip.getState() != YesOrNoEnum.YES.getValue()){ |
| | | throw new FebsException("会员套餐已下架"); |
| | | } |
| | | //价格 |
| | | BigDecimal presentAmount = runVip.getPresentPrice().multiply(new BigDecimal(apiGoChargeDto.getVipCnt())).setScale(2,BigDecimal.ROUND_DOWN); |
| | | |
| | | Long addressId = apiGoChargeDto.getAddressId(); |
| | | MallMemberPayment mallMemberPayment = mallMemberPaymentMapper.selectById(addressId); |
| | | if(ObjectUtil.isEmpty(mallMemberPayment)){ |
| | | return new FebsResponse().fail().message("请先绑定你的地址"); |
| | | } |
| | | |
| | | String sysAddress = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | RunVipDataDictionaryEnum.CHARGE_SYS_ADDRESS.getType(), |
| | | RunVipDataDictionaryEnum.CHARGE_SYS_ADDRESS.getCode() |
| | | ).getValue(); |
| | | String failMinutes = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | RunVipDataDictionaryEnum.CHARGE_SYS_FAIL_TIME.getType(), |
| | | RunVipDataDictionaryEnum.CHARGE_SYS_FAIL_TIME.getCode() |
| | | ).getValue(); |
| | | DateTime failTime = DateUtil.offsetMinute(DateUtil.date(), Integer.parseInt(failMinutes)); |
| | | |
| | | MallCharge mallCharge = new MallCharge(); |
| | | mallCharge.setMemberId(memberId); |
| | | mallCharge.setOrderNo(MallUtils.getOrderNum()); |
| | | mallCharge.setState(YesOrNoEnum.ING.getValue()); |
| | | mallCharge.setType(mallMemberPayment.getBankNo()); |
| | | mallCharge.setAddress(mallMemberPayment.getBank()); |
| | | mallCharge.setAmount(presentAmount); |
| | | mallCharge.setFailTime(failTime); |
| | | mallCharge.setSysAddress(sysAddress); |
| | | mallCharge.setVipCode(runVip.getVipCode()); |
| | | mallCharge.setVipName(runVip.getVipName()); |
| | | mallCharge.setVipCnt(apiGoChargeDto.getVipCnt()); |
| | | mallChargeMapper.insert(mallCharge); |
| | | |
| | | ApiGoChargeVo apiGoChargeVo = new ApiGoChargeVo(); |
| | | apiGoChargeVo.setFailTime(mallCharge.getFailTime()); |
| | | apiGoChargeVo.setAddress(mallCharge.getAddress()); |
| | | apiGoChargeVo.setAmount(mallCharge.getAmount()); |
| | | apiGoChargeVo.setSysAddress(mallCharge.getSysAddress()); |
| | | |
| | | /** |
| | | * 充值接口调用后,发送一个延时队列 |
| | | * 功能:延迟时间为【failMinutes】后,更新充值记录为失败。 |
| | | */ |
| | | ApiMemberChargeFailDto apiMemberChargeFailDto = new ApiMemberChargeFailDto(); |
| | | apiMemberChargeFailDto.setChargeId(mallCharge.getId()); |
| | | apiMemberChargeFailDto.setFailTime(Integer.parseInt(failMinutes) * 60L* 1000L); |
| | | agentProducer.sendMemberChargeFailMsg(apiMemberChargeFailDto); |
| | | |
| | | return new FebsResponse().success().data(apiGoChargeVo); |
| | | } |
| | | |
| | | @Override |
| | | public FebsResponse goChargeInfo(ApiGoChargeInfoDto apiGoChargeInfoDto) { |
| | | Long memberId = LoginUserUtil.getLoginUser().getId(); |
| | | String orderNo = apiGoChargeInfoDto.getOrderNo(); |
| | | |
| | | LambdaQueryWrapper<MallCharge> objectLambdaQueryWrapper = new LambdaQueryWrapper<>(); |
| | | objectLambdaQueryWrapper.eq(MallCharge::getMemberId,memberId); |
| | | objectLambdaQueryWrapper.eq(MallCharge::getOrderNo,orderNo); |
| | | MallCharge mallCharge = mallChargeMapper.selectOne(objectLambdaQueryWrapper); |
| | | |
| | | ApiGoChargeVo apiGoChargeVo = new ApiGoChargeVo(); |
| | | apiGoChargeVo.setFailTime(mallCharge.getFailTime()); |
| | | apiGoChargeVo.setAddress(mallCharge.getAddress()); |
| | | apiGoChargeVo.setAmount(mallCharge.getAmount()); |
| | | apiGoChargeVo.setSysAddress(mallCharge.getSysAddress()); |
| | | return new FebsResponse().success().data(apiGoChargeVo); |
| | | } |
| | | |
| | | @Override |
| | | public FebsResponse getChargeInfo() { |
| | | Long memberId = LoginUserUtil.getLoginUser().getId(); |
| | | ApiChargeInfoVo apiChargeInfoVo = new ApiChargeInfoVo(); |
| | | |
| | | String sysAddress = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( |
| | | RunVipDataDictionaryEnum.CHARGE_SYS_ADDRESS.getType(), |
| | | RunVipDataDictionaryEnum.CHARGE_SYS_ADDRESS.getCode() |
| | | ).getValue(); |
| | | apiChargeInfoVo.setChargeAddress(sysAddress); |
| | | List<DataDictionaryCustom> dataDictionaryCustoms = dataDictionaryCustomMapper.selectDicByType(RunVipDataDictionaryEnum.CHARGE_TYPE_TRC.getType()); |
| | | List<String> coinTypeList = dataDictionaryCustoms.stream().map(DataDictionaryCustom::getValue).collect(Collectors.toList()); |
| | | apiChargeInfoVo.setCoinType(coinTypeList); |
| | | return new FebsResponse().success().data(apiChargeInfoVo); |
| | | } |
| | | |
| | | @Override |
| | | public List<ApiChargeVo> getChargeList(ApiChargeListDto apiChargeListDto) { |
| | | Long memberId = LoginUserUtil.getLoginUser().getId(); |
| | | apiChargeListDto.setMemberId(memberId); |
| | | Page<ApiChargeVo> page = new Page<>(apiChargeListDto.getPageNum(), apiChargeListDto.getPageSize()); |
| | | return mallChargeMapper.selectChargeListInPage(apiChargeListDto, page); |
| | | } |
| | | } |
New file |
| | |
| | | package cc.mrbird.febs.mall.vo; |
| | | |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import java.util.List; |
| | | |
| | | @Data |
| | | @ApiModel(value = "ApiChargeInfoVo", description = "基础数据") |
| | | public class ApiChargeInfoVo { |
| | | |
| | | @ApiModelProperty(value = "充值地址") |
| | | private String chargeAddress; |
| | | |
| | | @ApiModelProperty(value = "充值地址类型") |
| | | private List<String> coinType; |
| | | |
| | | } |
New file |
| | |
| | | package cc.mrbird.febs.mall.vo; |
| | | |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.Date; |
| | | |
| | | @Data |
| | | @ApiModel(value = "ApiChargeVo", description = "基础数据") |
| | | public class ApiChargeVo { |
| | | |
| | | @ApiModelProperty(value = "编号") |
| | | private String orderNo; |
| | | |
| | | @ApiModelProperty(value = "账户") |
| | | private String account; |
| | | |
| | | @ApiModelProperty(value = "状态 2-进行中 1-成功 0-失败") |
| | | private Integer state; |
| | | |
| | | @ApiModelProperty(value = "充值类型1-trc20 2-erc20") |
| | | private String type; |
| | | |
| | | @ApiModelProperty(value = "充值地址") |
| | | private String address; |
| | | |
| | | @ApiModelProperty(value = "套餐名称") |
| | | private String vipName; |
| | | |
| | | @ApiModelProperty(value = "套餐数量") |
| | | private Integer vipCnt; |
| | | |
| | | @ApiModelProperty(value = "充值金额") |
| | | private BigDecimal amount; |
| | | |
| | | @ApiModelProperty(value = "时间") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") |
| | | private Date createdTime; |
| | | |
| | | } |
New file |
| | |
| | | package cc.mrbird.febs.mall.vo; |
| | | |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | @Data |
| | | @ApiModel(value = "ApiChartVo", description = "信息返回类") |
| | | public class ApiChartVo { |
| | | |
| | | @ApiModelProperty(value = "手机号") |
| | | private String phone; |
| | | |
| | | @ApiModelProperty(value = "头像") |
| | | private String avatar; |
| | | |
| | | @ApiModelProperty(value = "碳积分") |
| | | private BigDecimal score; |
| | | } |
New file |
| | |
| | | package cc.mrbird.febs.mall.vo; |
| | | |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.Date; |
| | | |
| | | @Data |
| | | @ApiModel(value = "ApiGoChargeVo", description = "基础数据") |
| | | public class ApiGoChargeVo { |
| | | |
| | | @ApiModelProperty(value = "我的充值地址") |
| | | private String address; |
| | | |
| | | @ApiModelProperty(value = "充值金额") |
| | | private BigDecimal amount; |
| | | |
| | | @ApiModelProperty(value = "失效时间") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") |
| | | private Date failTime; |
| | | |
| | | @ApiModelProperty(value = "系统收款地址") |
| | | private String sysAddress; |
| | | } |
| | |
| | | package cc.mrbird.febs.mall.vo; |
| | | |
| | | import cc.mrbird.febs.vip.entity.MallVipConfig; |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import io.swagger.annotations.ApiModel; |
| | | import io.swagger.annotations.ApiModelProperty; |
| | |
| | | |
| | | @ApiModelProperty(value = "id") |
| | | private Long id; |
| | | |
| | | @ApiModelProperty(value = "昵称") |
| | | private String name; |
| | | |
| | | @ApiModelProperty(value = "手机号") |
| | | private String phone; |
| | | |
| | | @ApiModelProperty(value = "邮箱") |
| | | private String email; |
| | | |
| | | @ApiModelProperty(value = "性别") |
| | | private String sex; |
| | | |
| | | @ApiModelProperty(value = "邀请码(如果是团长,邀请码就是团长特征码)") |
| | | private String inviteId; |
| | | |
| | | @ApiModelProperty(value = "头像") |
| | | private String avatar; |
| | | |
| | | @ApiModelProperty(value = "余额") |
| | | private BigDecimal balance; |
| | | |
| | | @ApiModelProperty(value = "代理等级") |
| | | @ApiModelProperty(value = "手机号") |
| | | private String phone; |
| | | @ApiModelProperty(value = "邀请码(如果是团长,邀请码就是团长特征码)") |
| | | private String inviteId; |
| | | @ApiModelProperty(value = "VIP等级图片") |
| | | private String levelPng; |
| | | @ApiModelProperty(value = "VIP等级名称") |
| | | private String levelName; |
| | | |
| | | @ApiModelProperty(value = "推荐人昵称") |
| | | private String referrerName; |
| | | |
| | | @ApiModelProperty(value = "VIP等级编码") |
| | | private String level; |
| | | |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") |
| | | private Date createdTime; |
| | | |
| | | /** |
| | | * 账户状态;1-正常 2-禁用 |
| | | */ |
| | | private Integer accountStatus; |
| | | public static final int ACCOUNTSTATUS_Y = 1; |
| | | public static final int ACCOUNTSTATUS_N = 2; |
| | | |
| | | @ApiModelProperty(value = "是否设置收款方式", example = "1是2否") |
| | | private Integer hasPayment = 2; |
| | | |
| | | @ApiModelProperty(value = "是否设置交易密码", example = "1是2否") |
| | | private Integer hasTradePwd = 2; |
| | | |
| | | @ApiModelProperty(value = "绑定手机号") |
| | | private String bindPhone; |
| | | |
| | | @ApiModelProperty(value = "累计消费") |
| | | private BigDecimal totalCost; |
| | | |
| | | @ApiModelProperty(value = "赠送积分") |
| | | @ApiModelProperty(value = "碳币") |
| | | private BigDecimal balance; |
| | | @ApiModelProperty(value = "碳积分") |
| | | private BigDecimal score; |
| | | |
| | | @ApiModelProperty(value = "抽奖积分") |
| | | private BigDecimal prizeScore; |
| | | @ApiModelProperty(value = "碳积分兑换碳币的最小值") |
| | | private BigDecimal minScore; |
| | | |
| | | @ApiModelProperty(value = "是否是团长 1: 是 2:否") |
| | | private Integer isTeamLeader; |
| | | @ApiModelProperty(value = "碳积分兑换碳币的比值,如果为0.5,则表示1积分兑换0.5个碳币") |
| | | private BigDecimal scoreBalance; |
| | | |
| | | @ApiModelProperty(value = "是否是代理 1: 申请中 2:是 3:否") |
| | | private Integer isAgent; |
| | | @ApiModelProperty(value = "碳币兑换USDT的比值,如果为0.5,则表示1碳币兑换0.5个USDT") |
| | | private BigDecimal balanceCoin; |
| | | |
| | | @ApiModelProperty(value = "代理名称") |
| | | private String agentLevelName; |
| | | @ApiModelProperty(value = "碳币兑换USDT的手续费") |
| | | private BigDecimal balanceCoinPercent; |
| | | |
| | | @ApiModelProperty(value = "代理等级数字 1:一级 2:二级 3:三级") |
| | | private Integer agentLevel; |
| | | |
| | | @ApiModelProperty(value = "收藏数量") |
| | | private Integer collectionCnt; |
| | | |
| | | @ApiModelProperty(value = "足迹数量") |
| | | private Integer footprintCnt; |
| | | |
| | | @ApiModelProperty(value = "足迹数量") |
| | | private Integer childCnt; |
| | | |
| | | @ApiModelProperty(value = "是否是推销员") |
| | | private Integer isSale; |
| | | |
| | | @ApiModelProperty(value = "会员信息") |
| | | private MallVipConfig vipInfo; |
| | | @ApiModelProperty(value = "是否有支付密码 1:是 0:否") |
| | | private Integer tradeWord; |
| | | |
| | | |
| | | @ApiModelProperty(value = "生日") |
| | | @ApiModelProperty(value = "会员到期时间") |
| | | @DateTimeFormat(pattern = "yyyy-MM-dd") |
| | | @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") |
| | | private Date birthday; |
| | | private Date vipLevelTime; |
| | | |
| | | } |
| | |
| | | import java.math.BigDecimal; |
| | | import java.util.Date; |
| | | |
| | | /** |
| | | * @author wzy |
| | | * @date 2021-09-24 |
| | | **/ |
| | | @Data |
| | | @ApiModel(value = "MoneyFlowVo", description = "资金列表返回参数类") |
| | | public class MoneyFlowVo { |
| | | |
| | | @ApiModelProperty(value = "订单号") |
| | | private String orderNo; |
| | | |
| | | @ApiModelProperty(value = "金额,有正负") |
| | | private BigDecimal amount; |
| | | |
| | | @ApiModelProperty(value = "类型 1-静态收益 2-直推奖 3-代理收益 4-排名收益 5-总监收益 6-社区点补 7-一代收益 8-提现 9-转增 10-支付 11-退款") |
| | | @ApiModelProperty(value = "类型") |
| | | private Integer type; |
| | | |
| | | @ApiModelProperty(value = "对方手机号") |
| | | private String phone; |
| | | |
| | | @ApiModelProperty(value = "代理等级") |
| | | private String memberLevel; |
| | | |
| | | @ApiModelProperty(value = "提现状态 1-提现中2-成功 3-拒绝") |
| | | @ApiModelProperty(value = "状态 1-进行中 2-成功 0-失败") |
| | | private Integer status; |
| | | |
| | | @ApiModelProperty(value = "时间") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") |
| | | private Date createdTime; |
| | | |
| | | |
| | | @ApiModelProperty(value = "描述") |
| | | private String description; |
| | | |
| | | @ApiModelProperty(value = "备注") |
| | | private String remark; |
| | | } |
| | |
| | | @ApiModel(value = "MyTeamVo", description = "我的团队返回参数类") |
| | | public class MyTeamVo { |
| | | |
| | | @ApiModelProperty(value = "我的业绩") |
| | | private BigDecimal myAchieve; |
| | | @ApiModelProperty(value = "我的碳币") |
| | | private BigDecimal myBalance; |
| | | |
| | | @ApiModelProperty(value = "我的团队业绩") |
| | | private BigDecimal myTeamAchieve; |
| | | |
| | | @ApiModelProperty(value = "团队数量") |
| | | @ApiModelProperty(value = "团队总数") |
| | | private int myTeamCnt; |
| | | |
| | | @ApiModelProperty(value = "团队碳币") |
| | | private BigDecimal myTeamBalance; |
| | | |
| | | @ApiModelProperty(value = "团队列表") |
| | | private List<TeamListVo> team; |
| | | } |
| | |
| | | import java.math.BigDecimal; |
| | | import java.util.Date; |
| | | |
| | | /** |
| | | * @author wzy |
| | | * @date 2021-09-24 |
| | | **/ |
| | | @Data |
| | | @ApiModel(value = "TeamListVo", description = "团队列表返回参数类") |
| | | public class TeamListVo { |
| | |
| | | @ApiModelProperty(value = "头像") |
| | | private String avatar; |
| | | |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | @ApiModelProperty(value = "注册时间") |
| | | private Date createTime; |
| | | |
| | | @ApiModelProperty(value = "手机号") |
| | | private String phone; |
| | | |
| | | @ApiModelProperty(value = "金额") |
| | | private BigDecimal amount; |
| | | |
| | | @ApiModelProperty(value = "订单数量") |
| | | private Integer orderCnt; |
| | | |
| | | @ApiModelProperty(value = "团队数量") |
| | | private Integer cnt; |
| | | @ApiModelProperty(value = "用户等级编码") |
| | | private String level; |
| | | |
| | | @ApiModelProperty(value = "注册时间") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") |
| | | private Date createdTime; |
| | | |
| | | @ApiModelProperty(value = "是否当前用户 1-是") |
| | | private Integer isCurrent; |
| | | @ApiModelProperty(value = "手机号") |
| | | private String phone; |
| | | |
| | | @ApiModelProperty(value = "竞猜积分") |
| | | private BigDecimal prizeScore; |
| | | @ApiModelProperty(value = "我的碳币") |
| | | private BigDecimal myBalance; |
| | | |
| | | @ApiModelProperty(value = "用户等级") |
| | | private String levelName; |
| | | |
| | | @ApiModelProperty(value = "自己下单数量") |
| | | private Integer selfOrderCnt; |
| | | @ApiModelProperty(value = "团队总数") |
| | | private int myTeamCnt; |
| | | @ApiModelProperty(value = "团队碳币") |
| | | private BigDecimal myTeamBalance; |
| | | |
| | | } |
| | |
| | | order.setPayOrderNo(transaction_id); |
| | | mallOrderInfoMapper.updateById(order); |
| | | |
| | | agentProducer.sendOrderCoupon(order.getId()); |
| | | // agentProducer.sendGetScoreMsg(order.getId()); |
| | | |
| | | mallMoneyFlowService.addMoneyFlow( |
| | | order.getMemberId(), |
| | |
| | | package cc.mrbird.febs.pay.service.impl; |
| | | |
| | | import cc.mrbird.febs.common.enumerates.AgentLevelEnum; |
| | | import cc.mrbird.febs.common.enumerates.FlowTypeEnum; |
| | | import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum; |
| | | import cc.mrbird.febs.common.enumerates.OrderStatusEnum; |
| | | import cc.mrbird.febs.common.exception.FebsException; |
| | | import cc.mrbird.febs.mall.entity.MallMember; |
| | | import cc.mrbird.febs.mall.entity.MallOrderInfo; |
| | | import cc.mrbird.febs.mall.mapper.MallOrderInfoMapper; |
| | | import cc.mrbird.febs.mall.service.IApiMallMemberService; |
| | | import cc.mrbird.febs.mall.service.IApiMallOrderInfoService; |
| | | import cc.mrbird.febs.pay.model.AliPayPassbackModel; |
| | | import cc.mrbird.febs.pay.properties.AliPayProperties; |
| | | import cc.mrbird.febs.pay.service.IPayService; |
| | | import cc.mrbird.febs.rabbit.producter.AgentProducer; |
| | | import cn.hutool.core.util.StrUtil; |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.alipay.api.AlipayApiException; |
| | | import com.alipay.api.domain.AlipayTradeAppPayModel; |
| | |
| | | orderInfo.setPayTradeNo(params.get("trade_no")); |
| | | orderInfoMapper.updateById(orderInfo); |
| | | |
| | | // agentProducer.sendReturnMoneyMsg(orderInfo.getId()); |
| | | agentProducer.sendAutoLevelUpMsg(orderInfo.getMemberId()); |
| | | |
| | | // memberService.addMoneyFlow(orderInfo.getMemberId(), orderInfo.getAmount().negate(), MoneyFlowTypeEnum.PAY.getValue(), orderInfo.getOrderNo(), null, null, null, null, FlowTypeEnum.BALANCE.getValue()); |
| | | } |
| | | } |
| | |
| | | **/ |
| | | public class ExchangeConstants { |
| | | |
| | | public static final String EXCHANGE_DEFAULT = "exchange_default_qay"; |
| | | public static final String RUN_VIP_OPERATION_CHARGE_FAIL_TTL = "exchange_run_vip_operation_charge_fail_tll"; |
| | | public static final String RUN_VIP_OPERATION_CHARGE_FAIL = "exchange_run_vip_operation_charge_fail"; |
| | | public static final String RUN_VIP_OPERATION_CHARGE = "exchange_run_vip_operation_charge"; |
| | | } |
| | |
| | | **/ |
| | | public class QueueConstants { |
| | | |
| | | public static final String QUEUE_DEFAULT = "queue_default_qay"; |
| | | public static final String AGENT_AUTO_LEVEL_UP = "queue_agent_auto_level_up_qay"; |
| | | public static final String AGENT_RETURN_MONEY = "queue_agent_return_money_qay"; |
| | | public static final String ORDER_RETURN_MONEY = "queue_order_return_money_qay"; |
| | | |
| | | public static final String ORDER_COUPON = "queue_order_coupon"; |
| | | |
| | | public static final String GET_SCORE_MSG = "queue_get_score_msg"; |
| | | public static final String VIP_LEVEL_UP = "queue_vip_level_up"; |
| | | public static final String RUN_VIP_OPERATION_CHARGE = "queue_run_vip_operation_charge"; |
| | | public static final String RUN_VIP_OPERATION_CHARGE_FAIL = "queue_run_vip_operation_charge_fail"; |
| | | public static final String RUN_VIP_OPERATION_CHARGE_FAIL_TTL = "queue_run_vip_operation_charge_fail_tll"; |
| | | } |
| | |
| | | * @date 2021-09-25 |
| | | **/ |
| | | public class RouteKeyConstants { |
| | | |
| | | public static final String ROUTE_KEY_DEFAULT = "route_key_default_qay"; |
| | | public static final String RUN_VIP_OPERATION_CHARGE = "route_key_run_vip_operation_charge"; |
| | | public static final String RUN_VIP_OPERATION_CHARGE_FAIL = "route_key_run_vip_operation_charge_fail"; |
| | | public static final String RUN_VIP_OPERATION_CHARGE_FAIL_TTL = "route_key_run_vip_operation_charge_fail_tll"; |
| | | } |
| | |
| | | package cc.mrbird.febs.rabbit.consumer; |
| | | |
| | | import cc.mrbird.febs.mall.dto.ApiMemberChargeFailDto; |
| | | import cc.mrbird.febs.mall.service.IAgentService; |
| | | import cc.mrbird.febs.mall.service.IApiMallOrderInfoService; |
| | | import cc.mrbird.febs.mall.service.IMemberProfitService; |
| | | import cc.mrbird.febs.rabbit.constants.QueueConstants; |
| | | import cc.mrbird.febs.rabbit.enumerates.RabbitQueueEnum; |
| | | import cc.mrbird.febs.vip.service.IVipCommonService; |
| | | import com.rabbitmq.client.Channel; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.amqp.core.Message; |
| | | import org.springframework.amqp.rabbit.annotation.RabbitListener; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import java.util.Date; |
| | | |
| | | /** |
| | | * @author wzy |
| | |
| | | @Slf4j |
| | | @Component |
| | | public class AgentConsumer { |
| | | |
| | | @Autowired |
| | | private IApiMallOrderInfoService orderInfoService; |
| | | @Autowired |
| | | private IAgentService agentService; |
| | | @Autowired |
| | | private IMemberProfitService memberProfitService; |
| | | |
| | | @RabbitListener(queues = QueueConstants.QUEUE_DEFAULT) |
| | | public void agentReturn(Message message, Channel channel) { |
| | | log.info("消费者:{}", new String(message.getBody())); |
| | | } |
| | | |
| | | @RabbitListener(queues = "queue_order_delay_qay") |
| | | public void orderCancelDelay(String id) { |
| | | /** |
| | | * 充值自动过期 |
| | | * @param apiMemberChargeFailDto |
| | | */ |
| | | @RabbitListener(queues = QueueConstants.RUN_VIP_OPERATION_CHARGE_FAIL) |
| | | public void memberChargeFailMsg(ApiMemberChargeFailDto apiMemberChargeFailDto) { |
| | | try { |
| | | orderInfoService.autoCancelOrder(Long.parseLong(id)); |
| | | agentService.sendMemberChargeFailMsg(apiMemberChargeFailDto); |
| | | } catch (Exception e) { |
| | | log.error("订单超时支付异常", e); |
| | | log.error("消费充值自动过期异常", e); |
| | | } |
| | | } |
| | | |
| | | @RabbitListener(queues = QueueConstants.AGENT_AUTO_LEVEL_UP) |
| | | public void agentAutoLevelUp(String id) { |
| | | log.info("收到代理自动升级消息:{}", id); |
| | | |
| | | /** |
| | | * 购买成功 |
| | | */ |
| | | @RabbitListener(queues = QueueConstants.RUN_VIP_OPERATION_CHARGE) |
| | | public void buyVipSuccessMsg(Long chargeId) { |
| | | try { |
| | | agentService.autoUpAgentLevel(Long.parseLong(id)); |
| | | agentService.buyVipSuccessMsg(chargeId); |
| | | } catch (Exception e) { |
| | | log.error("代理自动升级异常", e); |
| | | log.error("消费购买成功异常", e); |
| | | } |
| | | } |
| | | |
| | | @RabbitListener(queues = QueueConstants.AGENT_RETURN_MONEY) |
| | | public void agentReturnMoney(String orderId) { |
| | | log.info("收到返利消息:{}", orderId); |
| | | try { |
| | | agentService.returnMoneyToAgent(Long.parseLong(orderId)); |
| | | } catch (Exception e) { |
| | | log.error("返利异常", e); |
| | | } |
| | | } |
| | | |
| | | @RabbitListener(queues = QueueConstants.ORDER_RETURN_MONEY) |
| | | public void orderReturnMoney(String orderId) { |
| | | log.info("收到订单返利消息:{}", orderId); |
| | | try { |
| | | memberProfitService.dynamicProfit(Long.parseLong(orderId)); |
| | | } catch (Exception e) { |
| | | log.error("订单返利异常:", e); |
| | | } |
| | | } |
| | | |
| | | @RabbitListener(queues = QueueConstants.ORDER_COUPON) |
| | | public void getOrderCoupon(Long orderId) { |
| | | log.info("收到使用优惠卷消息:{}", orderId); |
| | | try { |
| | | memberProfitService.getOrderCoupon(orderId); |
| | | } catch (Exception e) { |
| | | log.error("使用优惠卷异常:", e); |
| | | } |
| | | } |
| | | |
| | | @Autowired |
| | | private IVipCommonService vipCommonService; |
| | | |
| | | @RabbitListener(queues = QueueConstants.GET_SCORE_MSG) |
| | | public void getScoreMsg(Long orderId) { |
| | | log.info("收到积分消息:{}", orderId); |
| | | try { |
| | | vipCommonService.getScore(orderId); |
| | | } catch (Exception e) { |
| | | log.error("获取积分消息异常", e); |
| | | } |
| | | } |
| | | |
| | | @RabbitListener(queues = QueueConstants.VIP_LEVEL_UP) |
| | | public void vipLevelUp(Long orderId) { |
| | | log.info("收到会员升级消息:{}", orderId); |
| | | try { |
| | | vipCommonService.levelUp(orderId); |
| | | } catch (Exception e) { |
| | | log.error("会员升级消息异常", e); |
| | | } |
| | | } |
| | | } |
| | |
| | | package cc.mrbird.febs.rabbit.enumerates; |
| | | |
| | | import cc.mrbird.febs.rabbit.constants.ExchangeConstants; |
| | | import cc.mrbird.febs.rabbit.constants.QueueConstants; |
| | | import cc.mrbird.febs.rabbit.constants.RouteKeyConstants; |
| | | import lombok.Getter; |
| | | |
| | | @Getter |
| | | public enum RabbitQueueEnum { |
| | | |
| | | DEFAULT("exchange_default_qay", "route_key_default_qay", "queue_default_qay"), |
| | | /** |
| | | * 购买成功消息 |
| | | */ |
| | | RUN_VIP_OPERATION_CHARGE(ExchangeConstants.RUN_VIP_OPERATION_CHARGE, |
| | | RouteKeyConstants.RUN_VIP_OPERATION_CHARGE, |
| | | QueueConstants.RUN_VIP_OPERATION_CHARGE), |
| | | |
| | | ORDER_CANCEL_DELAY_TTL("exchange_order_delay_ttl_qay", "route_key_order_delay_ttl_qay", "queue_order_delay_ttl_qay"), |
| | | ORDER_CANCEL_DELAY("exchange_order_delay_qay", "route_key_order_delay_qay", "queue_order_delay_qay"), |
| | | |
| | | AGENT_REUTRN_MONEY("exchange_agent_return_money_qay", "route_key_agent_return_money_qay", "queue_agent_return_money_qay"), |
| | | |
| | | ORDER_RETURN_MONEY("exchange_order_return_money_qay", "route_key_order_return_money_qay", "queue_order_return_money_qay"), |
| | | |
| | | ORDER_COUPON("exchange_order_coupon", "route_key_order_coupon", QueueConstants.ORDER_COUPON), |
| | | |
| | | GET_SCORE_MSG("exchange_get_score_msg", "route_key_get_score_msg", QueueConstants.GET_SCORE_MSG), |
| | | |
| | | VIP_LEVEL_UP("exchange_vip_level_up", "route_key_vip_level_up", QueueConstants.VIP_LEVEL_UP); |
| | | /** |
| | | * 充值自动过期 |
| | | */ |
| | | RUN_VIP_OPERATION_CHARGE_FAIL(ExchangeConstants.RUN_VIP_OPERATION_CHARGE_FAIL, |
| | | RouteKeyConstants.RUN_VIP_OPERATION_CHARGE_FAIL, |
| | | QueueConstants.RUN_VIP_OPERATION_CHARGE_FAIL), |
| | | RUN_VIP_OPERATION_CHARGE_FAIL_TTL(ExchangeConstants.RUN_VIP_OPERATION_CHARGE_FAIL_TTL, |
| | | RouteKeyConstants.RUN_VIP_OPERATION_CHARGE_FAIL_TTL, |
| | | QueueConstants.RUN_VIP_OPERATION_CHARGE_FAIL_TTL),; |
| | | |
| | | private String exchange; |
| | | |
| | |
| | | package cc.mrbird.febs.rabbit.producter; |
| | | |
| | | import cc.mrbird.febs.rabbit.constants.ExchangeConstants; |
| | | import cc.mrbird.febs.rabbit.constants.RouteKeyConstants; |
| | | import cc.mrbird.febs.mall.dto.ApiMemberChargeFailDto; |
| | | import cc.mrbird.febs.rabbit.enumerates.RabbitQueueEnum; |
| | | import com.alibaba.fastjson.JSON; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.amqp.AmqpException; |
| | | import org.springframework.amqp.core.Message; |
| | |
| | | import org.springframework.amqp.rabbit.core.RabbitTemplate; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import javax.validation.constraints.NotNull; |
| | | import java.util.Date; |
| | | import java.util.UUID; |
| | | |
| | | /** |
| | | * @author wzy |
| | |
| | | |
| | | } |
| | | |
| | | public void sendOrderReturn(Long id) { |
| | | log.info("发送消息:{}", id); |
| | | CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString()); |
| | | rabbitTemplate.convertAndSend(RabbitQueueEnum.ORDER_RETURN_MONEY.getExchange(), RabbitQueueEnum.ORDER_RETURN_MONEY.getRoute(), id, correlationData); |
| | | } |
| | | |
| | | public void sendOrderCancelDelayMsg(Long id, Long times) { |
| | | log.info("发送自动取消订单消息:{}, {}", id, times); |
| | | rabbitTemplate.convertAndSend(RabbitQueueEnum.ORDER_CANCEL_DELAY_TTL.getExchange(), RabbitQueueEnum.ORDER_CANCEL_DELAY_TTL.getRoute(), id, new MessagePostProcessor() { |
| | | @Override |
| | | public Message postProcessMessage(Message message) throws AmqpException { |
| | | message.getMessageProperties().setExpiration(String.valueOf(times)); |
| | | return message; |
| | | } |
| | | }); |
| | | } |
| | | |
| | | /** |
| | | * 发送代理自动升级消息 |
| | | * |
| | | * @param memberId |
| | | * 购买VIP自动过期 |
| | | * @param apiMemberChargeFailDto |
| | | */ |
| | | public void sendAutoLevelUpMsg(@NotNull Long memberId) { |
| | | log.info("发送代理自动升级消息:{}", memberId); |
| | | rabbitTemplate.convertAndSend(ExchangeConstants.EXCHANGE_DEFAULT, RouteKeyConstants.ROUTE_KEY_DEFAULT, memberId); |
| | | public void sendMemberChargeFailMsg(ApiMemberChargeFailDto apiMemberChargeFailDto) { |
| | | log.info("发送购买VIP自动过期: {}", JSON.toJSONString(apiMemberChargeFailDto)); |
| | | rabbitTemplate.convertAndSend( |
| | | RabbitQueueEnum.RUN_VIP_OPERATION_CHARGE_FAIL_TTL.getExchange(), |
| | | RabbitQueueEnum.RUN_VIP_OPERATION_CHARGE_FAIL_TTL.getRoute(), |
| | | apiMemberChargeFailDto, |
| | | new MessagePostProcessor() { |
| | | @Override |
| | | public Message postProcessMessage(Message message) throws AmqpException { |
| | | message.getMessageProperties().setExpiration(String.valueOf(apiMemberChargeFailDto.getFailTime())); |
| | | return message; |
| | | } |
| | | }); |
| | | } |
| | | |
| | | public void sendReturnMoneyMsg(Long orderId) { |
| | | log.info("发送返利消息:{}", orderId); |
| | | rabbitTemplate.convertAndSend(RabbitQueueEnum.AGENT_REUTRN_MONEY.getExchange(), RabbitQueueEnum.AGENT_REUTRN_MONEY.getRoute(), orderId); |
| | | } |
| | | |
| | | |
| | | public void sendOrderCoupon(Long id) { |
| | | log.info("发送使用优惠卷消息:{}", id); |
| | | CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString()); |
| | | rabbitTemplate.convertAndSend(RabbitQueueEnum.ORDER_COUPON.getExchange(), RabbitQueueEnum.ORDER_COUPON.getRoute(), id, correlationData); |
| | | } |
| | | |
| | | public void sendGetScoreMsg(Long orderId) { |
| | | log.info("发送获得积分消息:{}", orderId); |
| | | |
| | | CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString()); |
| | | rabbitTemplate.convertAndSend(RabbitQueueEnum.GET_SCORE_MSG.getExchange(), RabbitQueueEnum.GET_SCORE_MSG.getRoute(), orderId, correlationData); |
| | | } |
| | | |
| | | public void sendVipLevelUp(Long orderId) { |
| | | log.info("发送会员升级消息:{}", orderId); |
| | | |
| | | CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString()); |
| | | rabbitTemplate.convertAndSend(RabbitQueueEnum.VIP_LEVEL_UP.getExchange(), RabbitQueueEnum.VIP_LEVEL_UP.getRoute(), orderId, correlationData); |
| | | public void sendBuyVipSuccessMsg(Long id) { |
| | | log.info("发送购买成功消息:{}",id); |
| | | rabbitTemplate.convertAndSend( |
| | | RabbitQueueEnum.RUN_VIP_OPERATION_CHARGE.getExchange(), |
| | | RabbitQueueEnum.RUN_VIP_OPERATION_CHARGE.getRoute(), |
| | | id); |
| | | } |
| | | } |
| | |
| | | } |
| | | }); |
| | | |
| | | agentProducer.sendVipLevelUp(orderId); |
| | | } |
| | | |
| | | @Override |
New file |
| | |
| | | <?xml version="1.0" encoding="UTF-8"?> |
| | | <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
| | | <mapper namespace="cc.mrbird.febs.mall.mapper.MallChargeMapper"> |
| | | |
| | | <select id="selectChargeListInPage" resultType="cc.mrbird.febs.mall.vo.ApiChargeVo"> |
| | | SELECT |
| | | b.phone account, |
| | | a.vip_name vipName, |
| | | a.vip_cnt vipCnt, |
| | | a.order_no orderNo, |
| | | a.state state, |
| | | a.created_time createdTime, |
| | | a.type type, |
| | | a.amount amount, |
| | | a.address address |
| | | FROM mall_charge a |
| | | inner join mall_member b on a.member_id = b.id |
| | | where member_id = #{record.memberId} |
| | | order by a.created_time desc |
| | | </select> |
| | | |
| | | <select id="selectAdminChargeListInPage" resultType="cc.mrbird.febs.mall.entity.MallCharge"> |
| | | SELECT |
| | | a.id id, |
| | | a.order_no orderNo, |
| | | a.state state, |
| | | a.address address, |
| | | a.amount amount, |
| | | a.type type, |
| | | a.fail_time failTime, |
| | | a.sys_address sysAddress, |
| | | a.CREATED_TIME createdTime, |
| | | a.vip_name vipName, |
| | | a.vip_cnt vipCnt, |
| | | b.phone account |
| | | FROM mall_charge a |
| | | inner join mall_member b on a.member_id = b.id |
| | | <where> |
| | | <if test="record != null" > |
| | | <if test="record.account!=null and record.account!=''"> |
| | | and b.phone like concat('%', #{record.account},'%') |
| | | </if> |
| | | <if test="record.orderNo!=null and record.orderNo!=''"> |
| | | and a.order_no like concat('%', #{record.orderNo},'%') |
| | | </if> |
| | | <if test="record.state!=null"> |
| | | and a.state = #{record.state} |
| | | </if> |
| | | </if> |
| | | </where> |
| | | order by a.created_time desc |
| | | </select> |
| | | |
| | | <select id="selectAdminWithdrawListInPage" resultType="cc.mrbird.febs.mall.entity.MallMemberWithdraw"> |
| | | SELECT |
| | | a.*, |
| | | b.phone account |
| | | FROM mall_member_withdraw a |
| | | inner join mall_member b on a.member_id = b.id |
| | | <where> |
| | | <if test="record != null" > |
| | | <if test="record.account!=null and record.account!=''"> |
| | | and b.phone like concat('%', #{record.account},'%') |
| | | </if> |
| | | <if test="record.withdrawNo!=null and record.withdrawNo!=''"> |
| | | and a.withdraw_no like concat('%', #{record.withdrawNo},'%') |
| | | </if> |
| | | <if test="record.name!=null and record.name!=''"> |
| | | and a.name like concat('%', #{record.name},'%') |
| | | </if> |
| | | <if test="record.status!=null"> |
| | | and a.status = #{record.status} |
| | | </if> |
| | | </if> |
| | | </where> |
| | | order by a.created_time desc |
| | | </select> |
| | | |
| | | </mapper> |
| | |
| | | <mapper namespace="cc.mrbird.febs.mall.mapper.MallMemberMapper"> |
| | | |
| | | <select id="selectMallMemberListInPage" resultType="cc.mrbird.febs.mall.entity.MallMember"> |
| | | SELECT m.*,a.name referrerName,IFNULL(c.balance,0) balance,IFNULL(c.score,0) score,IFNULL(c.prize_score,0) prizeScore,IFNULL(c.commission,0) commission |
| | | ,vipConfig.name levelName |
| | | SELECT |
| | | m.*, |
| | | a.phone referrerName, |
| | | IFNULL(c.balance,0) balance, |
| | | IFNULL(c.score,0) score, |
| | | vipConfig.vip_name levelName |
| | | FROM mall_member m |
| | | left join mall_member a on m.referrer_id = a.invite_id |
| | | LEFT JOIN mall_member_wallet c on c.member_id = m.id |
| | | left join mall_vip_config vipConfig on m.level = vipConfig.code |
| | | left join run_vip vipConfig on m.level = vipConfig.vip_code |
| | | <where> |
| | | <if test="record != null" > |
| | | <if test="record.birthdayQuery!=null"> |
| | | and date_format(m.birthday, '%m-%d') = date_format(#{record.birthdayQuery}, '%m-%d') |
| | | </if> |
| | | <if test="record.name!=null and record.name!=''"> |
| | | and m.name like concat('%', #{record.name},'%') |
| | | </if> |
| | | <if test="record.account!=null and record.account!=''"> |
| | | and ( |
| | | m.phone like concat('%', #{record.account},'%') |
| | |
| | | <if test="record.accountStatus!=null"> |
| | | and m.account_status = #{record.accountStatus} |
| | | </if> |
| | | <if test="record.accountType != null" > |
| | | and m.account_type = #{record.accountType} |
| | | </if> |
| | | <if test="record.level!=null and record.level!=''"> |
| | | and m.level=#{record.level} |
| | | </if> |
| | | <if test="record.isSale!=null and record.isSale!=''"> |
| | | and m.is_sale=#{record.isSale} |
| | | </if> |
| | | </if> |
| | | </where> |
| | | GROUP BY |
| | | m.id, a.NAME, c.balance, c.score, c.prize_score, c.commission, vipConfig.NAME |
| | | m.id, a.phone, c.balance, c.score,vipConfig.vip_name |
| | | order by m.CREATED_TIME desc |
| | | </select> |
| | | |
| | |
| | | where id = #{id} |
| | | </update> |
| | | |
| | | |
| | | |
| | | <update id="updateVipLevelTimeAndLevel"> |
| | | update mall_member |
| | | set vip_level_time = #{vipLevelTime}, |
| | | level = #{level} |
| | | where id = #{id} |
| | | </update> |
| | | |
| | | </mapper> |
| | |
| | | where id=#{record.id} and revision=#{record.revision} |
| | | </update> |
| | | |
| | | <update id="updateScoreWithVersion"> |
| | | update mall_member_wallet |
| | | set revision = revision + 1, |
| | | score = #{record.score} |
| | | where id=#{record.id} and revision=#{record.revision} |
| | | </update> |
| | | |
| | | <update id="updateCommissionWithVersion"> |
| | | update mall_member_wallet |
| | | set revision = revision + 1, |
| | |
| | | |
| | | <select id="selectApiMoneyFlowInPage" resultType="cc.mrbird.febs.mall.vo.MoneyFlowVo"> |
| | | select |
| | | a.*, |
| | | case when a.rt_member_id is null then (select n.phone from mall_member n where n.id=a.member_id) |
| | | when a.rt_member_id is not null then (select m.phone from mall_member m where m.id=a.rt_member_id) |
| | | end phone, |
| | | c.description memberLevel |
| | | a.* |
| | | from mall_money_flow a |
| | | left join mall_member b on a.rt_member_id=b.id |
| | | left join data_dictionary_custom c on b.level = c.code and c.type='AGENT_LEVEL' |
| | | <where> |
| | | 1=1 and a.status = 2 |
| | | <if test="record.inOrOut == 3"> |
| | | and a.amount > 0 |
| | | </if> |
| | | <if test="record.inOrOut == 2"> |
| | | and 0 > a.amount |
| | | </if> |
| | | <if test="record.memberId != null"> |
| | | and a.member_id=#{record.memberId} |
| | | </if> |
| | | <if test="record.flowType != null and record.flowType != ''"> |
| | | and a.flow_type=#{record.flowType} |
| | | </if> |
| | | <if test="record.type != null and record.type != ''"> |
| | | and a.type=#{record.type} |
| | | </if> |
| | | </where> |
| | | order by a.created_time desc |
| | |
| | | <div class="layui-col-md10"> |
| | | <div class="layui-form-item"> |
| | | <div class="layui-inline"> |
| | | <label class="layui-form-label layui-form-label-sm">用户昵称</label> |
| | | <div class="layui-input-inline"> |
| | | <input type="text" placeholder="用户昵称" name="name" autocomplete="off" class="layui-input"> |
| | | </div> |
| | | </div> |
| | | <div class="layui-inline"> |
| | | <label class="layui-form-label layui-form-label-sm">手机号码</label> |
| | | <div class="layui-input-inline"> |
| | | <input type="text" placeholder="手机号码" name="account" autocomplete="off" class="layui-input"> |
| | |
| | | <option value="ZERO_LEVEL">普通用户</option> |
| | | <option value="FIRST_LEVEL">城市合伙人</option> |
| | | </select> |
| | | </div> |
| | | </div> |
| | | <div class="layui-inline"> |
| | | <label class="layui-form-label layui-form-label-sm">会员生日</label> |
| | | <div class="layui-input-inline"> |
| | | <input type="text" name="birthday" id="febs-member-benefits-list-birthday-start" lay-verify="date" |
| | | placeholder="MM-dd" autocomplete="off" class="layui-input"> |
| | | </div> |
| | | </div> |
| | | </div> |
| | |
| | | </style> |
| | | <script type="text/html" id="toolbar"> |
| | | <div class="layui-btn-container"> |
| | | <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" lay-event="balance">余额充值</button> |
| | | <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" lay-event="prizeScore">积分充值</button> |
| | | <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" lay-event="balance">碳币拨付</button> |
| | | <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" lay-event="score">碳积分拨付</button> |
| | | <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" lay-event="resetPwd">登录密码重置</button> |
| | | <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" lay-event="updateReferer">修改推荐人</button> |
| | | <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" lay-event="resetPayPwd">资金密码重置</button> |
| | | <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" lay-event="updateVipLevel">修改会员等级</button> |
| | | <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" lay-event="addCoupon">优惠券派送</button> |
| | | </div> |
| | | </script> |
| | | <!-- 表格操作栏 end --> |
| | |
| | | openAccount(data.id); |
| | | }); |
| | | } |
| | | |
| | | if (layEvent === 'see') { |
| | | febs.modal.open( '个人信息', 'modules/mallMember/detail/' + data.id, { |
| | | btn: ['提交', '取消'], |
| | | yes: function (index, layero) { |
| | | $('#user-update').find('#submit').trigger('click'); |
| | | }, |
| | | btn2: function () { |
| | | layer.closeAll(); |
| | | } |
| | | }); |
| | | } |
| | | |
| | | if (layEvent === 'addLeader') { |
| | | febs.modal.open( '团长新增', 'modules/leader/addLeader/' + data.id, { |
| | | btn: ['提交', '取消'], |
| | | yes: function (index, layero) { |
| | | $('#user-addLeader').find('#submit').trigger('click'); |
| | | }, |
| | | btn2: function () { |
| | | layer.closeAll(); |
| | | } |
| | | }); |
| | | } |
| | | |
| | | if (layEvent === 'agentSelect') { |
| | | febs.modal.open('推销员设置', 'modules/mallMember/agentSelect/' + data.id, { |
| | | btn: ['提交', '取消'], |
| | | yes: function (index, layero) { |
| | | $('#agent-select').find('#submit').trigger('click'); |
| | | }, |
| | | btn2: function () { |
| | | layer.closeAll(); |
| | | } |
| | | }); |
| | | } |
| | | |
| | | if (layEvent === 'moneyFlow') { |
| | | febs.modal.open( '用户资金流水', 'modules/mallMember/moneyFlow/' + data.id, { |
| | | maxmin: true, |
| | | }); |
| | | } |
| | | |
| | | |
| | | |
| | | }); |
| | | function memberOut(id) { |
| | | febs.get(ctx + 'admin/mallMember/memberOut/' + id, null, function () { |
| | |
| | | defaultToolbar:[], |
| | | cols: [[ |
| | | {type: 'checkbox'}, |
| | | {field: 'phone', title: '手机号码', minWidth: 150,align:'left'}, |
| | | {field: 'name', title: '用户昵称', minWidth: 100,align:'left'}, |
| | | {field: 'birthday', title: '会员生日', minWidth: 100,align:'left'}, |
| | | {field: 'phone', title: '账号', minWidth: 150,align:'left'}, |
| | | {field: 'name', title: '昵称', minWidth: 100,align:'left'}, |
| | | {field: 'inviteId', title: '邀请码', minWidth: 100,align:'left'}, |
| | | {field: 'balance', title: '余额', minWidth: 100,align:'left'}, |
| | | // {field: 'score', title: '赠送积分', minWidth: 100,align:'left'}, |
| | | {field: 'prizeScore', title: '积分', minWidth: 100,align:'left'}, |
| | | // {field: 'commission', title: '佣金', minWidth: 100,align:'left'}, |
| | | {field: 'balance', title: '碳币', minWidth: 100,align:'left'}, |
| | | {field: 'score', title: '碳积分', minWidth: 100,align:'left'}, |
| | | {field: 'referrerName', title: '推荐人', minWidth: 100,align:'left'}, |
| | | {field: 'levelName', title: '会员等级', minWidth: 100,align:'left'}, |
| | | // {field: 'referrerName', title: '推荐人', minWidth: 100,align:'left'}, |
| | | {field: 'isSalesman', title: '推销员设置', templet: '#isSalesmanSwitch', minWidth: 100,align:'center'}, |
| | | // {field: 'director', title: '总监', templet:'#switchDirector', minWidth: 100}, |
| | | // {field: 'accountType', title: '账号类型', |
| | | // templet: function (d) { |
| | | // if (d.accountType === 2) { |
| | | // return '<span style="color:red;">测试账号</span>' |
| | | // } else if (d.accountType === 1) { |
| | | // return '<span style="color:green;">正常账号</span>' |
| | | // }else{ |
| | | // return '' |
| | | // } |
| | | // }, minWidth: 100,align:'center'}, |
| | | // {field: 'leaderState', title: '是否是团长', |
| | | // templet: function (d) { |
| | | // if (d.leaderState === 1) { |
| | | // return '<span style="color:green;">团长</span>' |
| | | // }else if (d.leaderState === 3) { |
| | | // return '<span">申请中</span>' |
| | | // }else if (d.leaderState === 4) { |
| | | // return '<span">普通用户(取消团长资格)</span>' |
| | | // }else{ |
| | | // return '<span">普通用户</span>' |
| | | // } |
| | | // }, minWidth: 100,align:'center'}, |
| | | // {field: 'accountStatus', title: '账号状态', templet: '#switchStatus', minWidth: 100,align:'center'}, |
| | | {field: 'accountStatus', title: '账号状态', templet: '#switchStatus', minWidth: 100,align:'center'}, |
| | | {field: 'vipLevelTime', title: '到期时间', minWidth: 180,align:'center'}, |
| | | {field: 'createdTime', title: '注册时间', minWidth: 180,align:'center'}, |
| | | {title: '操作', |
| | | templet: function (d) { |
| | | return '' |
| | | +'<button class="layui-btn layui-btn-normal layui-btn-xs febs-bg-red" lay-event="memberOut" shiro:hasPermission="user:update">注销</button>' |
| | | // + '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="addLeader" shiro:hasPermission="user:update">设置为团长</button>' |
| | | |
| | | },minWidth: 200,align:'center'} |
| | | ]] |
| | | }); |
| | |
| | | if (checkData.length <= 0) { |
| | | febs.alert.warn('请选择需要的用户'); |
| | | return; |
| | | } |
| | | |
| | | if (layEvent == 'updateReferer') { |
| | | if (checkData.length > 1) { |
| | | febs.alert.warn('每次只能修改一个用户'); |
| | | return; |
| | | } |
| | | febs.modal.open( '修改推荐人', 'modules/mallMember/updateReferer/' + checkData[0].id, { |
| | | btn: ['提交', '取消'], |
| | | yes: function (index, layero) { |
| | | $('#referer-update').find('#submit').trigger('click'); |
| | | }, |
| | | btn2: function () { |
| | | layer.closeAll(); |
| | | } |
| | | }); |
| | | } |
| | | |
| | | if (layEvent === 'updateVipLevel') { |
| | |
| | | } |
| | | |
| | | if (layEvent === 'resetPayPwd') { |
| | | febs.modal.confirm('重置交易密码', '是否重置选中账号交易密码?', function () { |
| | | febs.modal.confirm('重置交易密码', '是否重置选中账号交易密码为:【123456】?', function () { |
| | | var ids = []; |
| | | layui.each(checkData, function (key, item) { |
| | | ids.push(item.id) |
| | |
| | | if (checkData.length > 1) { |
| | | febs.alert.warn('请选择一个用户'); |
| | | } |
| | | systemPay("余额充值", checkData[0].id, 1); |
| | | systemPay("碳币拨付", checkData[0].id, 1); |
| | | } |
| | | |
| | | if (layEvent === 'score') { |
| | | if (checkData.length > 1) { |
| | | febs.alert.warn('请选择一个用户'); |
| | | } |
| | | systemPay("积分充值", checkData[0].id, 2); |
| | | } |
| | | |
| | | if (layEvent === 'prizeScore') { |
| | | if (checkData.length > 1) { |
| | | febs.alert.warn('请选择一个用户'); |
| | | } |
| | | systemPay("积分充值", checkData[0].id, 3); |
| | | } |
| | | |
| | | if (layEvent === 'agentLevel') { |
| | | febs.modal.open('设置代理级别', 'modules/mallMember/agentLevelSet/' + checkData[0].id, { |
| | | btn: ['确认', '取消'], |
| | | yes: function (index, layero) { |
| | | $('#agent-level-set').find('#submit').trigger('click'); |
| | | }, |
| | | btn2: function () { |
| | | layer.closeAll(); |
| | | } |
| | | }); |
| | | } |
| | | |
| | | if (layEvent === 'addCoupon') { |
| | | febs.modal.open('添加优惠券', 'modules/mallMember/addCoupon/' + checkData[0].id, { |
| | | btn: ['确认', '取消'], |
| | | yes: function (index, layero) { |
| | | $('#member-coupon-select').find('#submit').trigger('click'); |
| | | }, |
| | | btn2: function () { |
| | | layer.closeAll(); |
| | | } |
| | | }); |
| | | systemPay("碳积分拨付", checkData[0].id, 2); |
| | | } |
| | | }); |
| | | |
| | |
| | | openAccount(data.value); |
| | | } else { |
| | | closeAccount(data.value); |
| | | } |
| | | }) |
| | | |
| | | form.on('switch(switchStoreMaster)', function (data) { |
| | | if (data.elem.checked) { |
| | | changeIdentityYes(2, data.value); |
| | | } else { |
| | | changeIdentityNo(2, data.value); |
| | | } |
| | | }) |
| | | |
| | | form.on('switch(switchDirector)', function (data) { |
| | | if (data.elem.checked) { |
| | | changeIdentityYes(1, data.value); |
| | | } else { |
| | | changeIdentityNo(1, data.value); |
| | | } |
| | | }) |
| | | }) |
| | |
| | | </div> |
| | | </div> |
| | | <div class="layui-form-item"> |
| | | <label class="layui-form-label febs-form-item-require">当前余额:</label> |
| | | <label class="layui-form-label febs-form-item-require">当前数量:</label> |
| | | <div class="layui-input-block"> |
| | | <input type="number" name="balance" lay-verify="required" autocomplete="off" class="layui-input" readonly> |
| | | </div> |
| | |
| | | </div> |
| | | </div> |
| | | <div class="layui-form-item"> |
| | | <div class="layui-col-lg6"> |
| | | <label class="layui-form-label ">到期时间:</label> |
| | | <div class="layui-input-block"> |
| | | <input type="text" name="vipLevelTime" id="vipLevelTime" autocomplete="off" class="layui-input" > |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="layui-form-item"> |
| | | <div class="layui-inline"> |
| | | <label class="layui-form-label">会员等级:</label> |
| | | <div class="layui-input-inline"> |
| | |
| | | </div> |
| | | |
| | | <script data-th-inline="javascript"> |
| | | layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree'], function () { |
| | | layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree', 'laydate'], function () { |
| | | var $ = layui.jquery, |
| | | febs = layui.febs, |
| | | layer = layui.layer, |
| | | formSelects = layui.formSelects, |
| | | treeSelect = layui.treeSelect, |
| | | laydate = layui.laydate, |
| | | form = layui.form, |
| | | eleTree = layui.eleTree, |
| | | vipLevelSet = [[${vipLevelSet}]], |
| | |
| | | |
| | | form.render(); |
| | | |
| | | laydate.render({ |
| | | elem: '#vipLevelTime' |
| | | ,format: 'yyyy-MM-dd' |
| | | }); |
| | | |
| | | initUserValue(); |
| | | |
| | | function initUserValue() { |
| | | form.val("vip-level-set-form", { |
| | | "id": vipLevelSet.id, |
| | | "level": vipLevelSet.level |
| | | "level": vipLevelSet.level, |
| | | "vipLevelTime": vipLevelSet.vipLevelTime |
| | | }); |
| | | } |
| | | |
| | | //(下拉框) |
| | | $.get(ctx + 'admin/vip/config/allList', function (res) { |
| | | $.get(ctx + 'admin/runVip/allVipList', function (res) { |
| | | var data = res.data; |
| | | for (var k in data) |
| | | { |
| | | $(".vip-level-set-level").append("<option value='" + data[k].code + "'>" + data[k].name + "</option>"); |
| | | $(".vip-level-set-level").append("<option value='" + data[k].vipCode + "'>" + data[k].vipName + "</option>"); |
| | | } |
| | | layui.use('form', function () { |
| | | var form = layui.form; |
| | |
| | | }); |
| | | |
| | | form.on('submit(vip-level-set-form-submit)', function (data) { |
| | | febs.post(ctx + 'admin/mallMember/vipLevelSetUpdate', data.field, function () { |
| | | febs.post(ctx + 'admin/runVip/vipLevelSetUpdate', data.field, function () { |
| | | layer.closeAll(); |
| | | febs.alert.success('操作成功'); |
| | | $('#febs-member-list').find('#reset').click(); |
New file |
| | |
| | | <div class="layui-fluid layui-anim febs-anim" id="febs-charge-list" lay-title="购买VIP"> |
| | | <div class="layui-row febs-container"> |
| | | <div class="layui-col-md12"> |
| | | <div class="layui-card"> |
| | | <div class="layui-card-body febs-table-full"> |
| | | <form class="layui-form layui-table-form" lay-filter="user-table-form"> |
| | | <div class="layui-row"> |
| | | <div class="layui-col-md10"> |
| | | <div class="layui-form-item"> |
| | | <div class="layui-inline"> |
| | | <label class="layui-form-label layui-form-label-sm">账号</label> |
| | | <div class="layui-input-inline"> |
| | | <input type="text" name="account" placeholder="手机号/账号" autocomplete="off" class="layui-input"> |
| | | </div> |
| | | </div> |
| | | <div class="layui-inline"> |
| | | <label class="layui-form-label layui-form-label-sm">编号</label> |
| | | <div class="layui-input-inline"> |
| | | <input type="text" name="orderNo" placeholder="编号" autocomplete="off" class="layui-input"> |
| | | </div> |
| | | </div> |
| | | <div class="layui-inline"> |
| | | <label class="layui-form-label layui-form-label-sm">状态</label> |
| | | <div class="layui-input-inline"> |
| | | <select name="state"> |
| | | <option value=""></option> |
| | | <option value="2">进行中</option> |
| | | <option value="1">成功</option> |
| | | <option value="0">失败</option> |
| | | </select> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="layui-col-md2 layui-col-sm12 layui-col-xs12 table-action-area"> |
| | | <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain table-action" id="query"> |
| | | <i class="layui-icon"></i> |
| | | </div> |
| | | <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="reset"> |
| | | <i class="layui-icon"></i> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </form> |
| | | <table lay-filter="lhChargeTable" lay-data="{id: 'lhChargeTable'}"></table> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <script type="text/html" id="stateType"> |
| | | {{# |
| | | var state = { |
| | | 2: {title: '进行中', color: 'volcano'}, |
| | | 1: {title: '成功', color: 'green'}, |
| | | 0: {title: '失败', color: 'blue'} |
| | | }[d.state]; |
| | | }} |
| | | <span class="layui-badge febs-bg-{{state.color}}">{{ state.title }}</span> |
| | | </script> |
| | | |
| | | <script type="text/html" id="commissionOption"> |
| | | {{# if(d.state == 2){ }} |
| | | <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" shiro:hasPermission="user:update" lay-event="chargeAgreeEvent">确认</button> |
| | | <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" shiro:hasPermission="user:update" lay-event="chargeDisAgreeEvent">取消</button> |
| | | {{# } }} |
| | | </script> |
| | | <script data-th-inline="none" type="text/javascript"> |
| | | layui.use([ 'jquery', 'form', 'table', 'febs'], function () { |
| | | var $ = layui.jquery, |
| | | febs = layui.febs, |
| | | form = layui.form, |
| | | table = layui.table, |
| | | $view = $('#febs-charge-list'), |
| | | $query = $view.find('#query'), |
| | | $reset = $view.find('#reset'), |
| | | $searchForm = $view.find('form'), |
| | | sortObject = {field: null, type: null}, |
| | | tableIns; |
| | | |
| | | form.render(); |
| | | initlhChargeTable(); |
| | | |
| | | // 查询按钮 |
| | | $query.on('click', function () { |
| | | var params = $.extend(getQueryParams(), {field: sortObject.field, order: sortObject.type}); |
| | | tableIns.reload({where: params, page: {curr: 1}}); |
| | | }); |
| | | // 刷新按钮 |
| | | $reset.on('click', function () { |
| | | $searchForm[0].reset(); |
| | | sortObject.type = 'null'; |
| | | tableIns.reload({where: getQueryParams(), page: {curr: 1}, initSort: sortObject}); |
| | | }); |
| | | // 获取查询参数 |
| | | function getQueryParams() { |
| | | return { |
| | | orderNo: $searchForm.find('input[name="orderNo"]').val(), |
| | | account: $searchForm.find('input[name="account"]').val(), |
| | | state: $searchForm.find("select[name='state']").val(), |
| | | }; |
| | | } |
| | | // 初始化表格操作栏各个按钮功能 |
| | | table.on('tool(lhChargeTable)', function (obj) { |
| | | var data = obj.data, |
| | | layEvent = obj.event; |
| | | if (layEvent === 'chargeAgreeEvent') { |
| | | febs.modal.confirm('确认', '确认支付?', function () { |
| | | chargeAgreeEvent(1,data.id); |
| | | }); |
| | | } |
| | | if (layEvent === 'chargeDisAgreeEvent') { |
| | | febs.modal.confirm('取消', '取消支付?', function () { |
| | | chargeAgreeEvent(0,data.id); |
| | | }); |
| | | } |
| | | }); |
| | | function chargeAgreeEvent(state,id) { |
| | | febs.get(ctx + 'admin/runVip/chargeAgree/'+ state +'/'+ id, null, function (e) { |
| | | febs.alert.success(e.message); |
| | | $query.click(); |
| | | }); |
| | | } |
| | | |
| | | function initlhChargeTable() { |
| | | tableIns = febs.table.init({ |
| | | elem: $view.find('table'), |
| | | id: 'lhChargeTable', |
| | | url: ctx + 'admin/runVip/buyList', |
| | | toolbar:"#lhChargeTable", |
| | | totalRow: true ,// 开启合计行 |
| | | cols: [[ |
| | | {type: 'numbers', title: '序号', width: 80}, |
| | | {field: 'orderNo', title: '编号', minWidth: 100,align:'center', totalRowText: '合计'}, |
| | | {field: 'account', title: '账号', minWidth: 150,align:'center'}, |
| | | {field: 'type', title: '链', minWidth: 100,align:'center'}, |
| | | {field: 'vipName', title: '会员名称', minWidth: 100,align:'center'}, |
| | | {field: 'vipCnt', title: '数量', minWidth: 100,align:'center'}, |
| | | {field: 'amount', title: '金额', minWidth: 100,align:'center',totalRow: '{{= parseInt(d.amount) }}'}, |
| | | {field: 'address', title: '地址', minWidth: 100,align:'center'}, |
| | | {title: '状态', templet: '#stateType', minWidth: 100,align:'center'}, |
| | | {field: 'failTime', title: '失效时间', minWidth: 180,align:'center'}, |
| | | {field: 'createdTime', title: '创建时间', minWidth: 180,align:'center'}, |
| | | {title: '操作', toolbar: '#commissionOption', minWidth: 200} |
| | | ]], |
| | | done: function(res, curr, count) { |
| | | // 遍历每一行数据 |
| | | res.data.forEach(function(item, index) { |
| | | // 根据状态值控制按钮显示 |
| | | if (item.state === 2) { |
| | | // 如果状态为1,显示 |
| | | $('#commissionOption' + index).show(); |
| | | } else { |
| | | // 否则,隐藏 |
| | | $('#commissionOption' + index).hide(); |
| | | } |
| | | }); |
| | | } |
| | | }); |
| | | } |
| | | |
| | | table.on('toolbar(lhChargeTable)', function(obj){ |
| | | var data = obj.data, |
| | | layEvent = obj.event; |
| | | }); |
| | | }) |
| | | </script> |
New file |
| | |
| | | <div class="layui-fluid layui-anim febs-anim" id="febs-withdraw-list" lay-title="碳币提现"> |
| | | <div class="layui-row febs-container"> |
| | | <div class="layui-col-md12"> |
| | | <div class="layui-card"> |
| | | <div class="layui-card-body febs-table-full"> |
| | | <form class="layui-form layui-table-form" lay-filter="user-table-form"> |
| | | <div class="layui-row"> |
| | | <div class="layui-col-md10"> |
| | | <div class="layui-form-item"> |
| | | <div class="layui-inline"> |
| | | <label class="layui-form-label layui-form-label-sm">账号</label> |
| | | <div class="layui-input-inline"> |
| | | <input type="text" name="account" placeholder="手机号/账号" autocomplete="off" class="layui-input"> |
| | | </div> |
| | | </div> |
| | | <div class="layui-inline"> |
| | | <label class="layui-form-label layui-form-label-sm">编号</label> |
| | | <div class="layui-input-inline"> |
| | | <input type="text" name="withdrawNo" placeholder="编号" autocomplete="off" class="layui-input"> |
| | | </div> |
| | | </div> |
| | | <div class="layui-inline"> |
| | | <label class="layui-form-label layui-form-label-sm">地址</label> |
| | | <div class="layui-input-inline"> |
| | | <input type="text" name="address" placeholder="地址" autocomplete="off" class="layui-input"> |
| | | </div> |
| | | </div> |
| | | <div class="layui-inline"> |
| | | <label class="layui-form-label layui-form-label-sm">状态</label> |
| | | <div class="layui-input-inline"> |
| | | <select name="status"> |
| | | <option value=""></option> |
| | | <option value="2">进行中</option> |
| | | <option value="1">成功</option> |
| | | <option value="0">失败</option> |
| | | </select> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="layui-col-md2 layui-col-sm12 layui-col-xs12 table-action-area"> |
| | | <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain table-action" id="query"> |
| | | <i class="layui-icon"></i> |
| | | </div> |
| | | <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="reset"> |
| | | <i class="layui-icon"></i> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </form> |
| | | <table lay-filter="lhWithdrawTable" lay-data="{id: 'lhWithdrawTable'}"></table> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <script type="text/html" id="statusType"> |
| | | {{# |
| | | var status = { |
| | | 2: {title: '进行中', color: 'volcano'}, |
| | | 1: {title: '成功', color: 'green'}, |
| | | 0: {title: '失败', color: 'blue'} |
| | | }[d.status]; |
| | | }} |
| | | <span class="layui-badge febs-bg-{{state.color}}">{{ status.title }}</span> |
| | | </script> |
| | | |
| | | <script type="text/html" id="commissionOption"> |
| | | {{# if(d.state == 2){ }} |
| | | <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" shiro:hasPermission="user:update" lay-event="chargeAgreeEvent">确认</button> |
| | | <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" shiro:hasPermission="user:update" lay-event="chargeDisAgreeEvent">取消</button> |
| | | {{# } }} |
| | | </script> |
| | | <script data-th-inline="none" type="text/javascript"> |
| | | layui.use([ 'jquery', 'form', 'table', 'febs'], function () { |
| | | var $ = layui.jquery, |
| | | febs = layui.febs, |
| | | form = layui.form, |
| | | table = layui.table, |
| | | $view = $('#febs-withdraw-list'), |
| | | $query = $view.find('#query'), |
| | | $reset = $view.find('#reset'), |
| | | $searchForm = $view.find('form'), |
| | | sortObject = {field: null, type: null}, |
| | | tableIns; |
| | | |
| | | form.render(); |
| | | initlhWithdrawTable(); |
| | | |
| | | // 查询按钮 |
| | | $query.on('click', function () { |
| | | var params = $.extend(getQueryParams(), {field: sortObject.field, order: sortObject.type}); |
| | | tableIns.reload({where: params, page: {curr: 1}}); |
| | | }); |
| | | // 刷新按钮 |
| | | $reset.on('click', function () { |
| | | $searchForm[0].reset(); |
| | | sortObject.type = 'null'; |
| | | tableIns.reload({where: getQueryParams(), page: {curr: 1}, initSort: sortObject}); |
| | | }); |
| | | // 获取查询参数 |
| | | function getQueryParams() { |
| | | return { |
| | | withdrawNo: $searchForm.find('input[name="withdrawNo"]').val(), |
| | | account: $searchForm.find('input[name="account"]').val(), |
| | | name: $searchForm.find('input[name="address"]').val(), |
| | | status: $searchForm.find("select[name='status']").val(), |
| | | }; |
| | | } |
| | | // 初始化表格操作栏各个按钮功能 |
| | | table.on('tool(lhWithdrawTable)', function (obj) { |
| | | var data = obj.data, |
| | | layEvent = obj.event; |
| | | if (layEvent === 'chargeAgreeEvent') { |
| | | febs.modal.confirm('确认', '确认提现?', function () { |
| | | chargeAgreeEvent(1,data.id); |
| | | }); |
| | | } |
| | | if (layEvent === 'chargeDisAgreeEvent') { |
| | | febs.modal.confirm('取消', '取消提现?', function () { |
| | | chargeAgreeEvent(0,data.id); |
| | | }); |
| | | } |
| | | }); |
| | | function chargeAgreeEvent(state,id) { |
| | | febs.get(ctx + 'admin/runVip/sellAgree/'+ state +'/'+ id, null, function (e) { |
| | | febs.alert.success(e.message); |
| | | $query.click(); |
| | | }); |
| | | } |
| | | |
| | | function initlhWithdrawTable() { |
| | | tableIns = febs.table.init({ |
| | | elem: $view.find('table'), |
| | | id: 'lhWithdrawTable', |
| | | url: ctx + 'admin/runVip/sellList', |
| | | toolbar:"#lhWithdrawTable", |
| | | totalRow: true ,// 开启合计行 |
| | | cols: [[ |
| | | {type: 'numbers', title: '序号', width: 80}, |
| | | {field: 'withdrawNo', title: '编号', minWidth: 100,align:'center', totalRowText: '合计'}, |
| | | {field: 'account', title: '账号', minWidth: 150,align:'center'}, |
| | | {field: 'type', title: '链', minWidth: 100,align:'center'}, |
| | | {field: 'name', title: '提现地址', minWidth: 100,align:'center'}, |
| | | {field: 'amount', title: '金额', minWidth: 100,align:'center',totalRow: '{{= parseInt(d.amount) }}'}, |
| | | {field: 'amountFee', title: '手续费', minWidth: 100,align:'center',totalRow: '{{= parseInt(d.amount) }}'}, |
| | | {title: '状态', templet: '#statusType', minWidth: 100,align:'center'}, |
| | | {field: 'createdTime', title: '创建时间', minWidth: 180,align:'center'}, |
| | | {title: '操作', toolbar: '#commissionOption', minWidth: 200} |
| | | ]], |
| | | done: function(res, curr, count) { |
| | | // 遍历每一行数据 |
| | | res.data.forEach(function(item, index) { |
| | | // 根据状态值控制按钮显示 |
| | | if (item.state === 2) { |
| | | // 如果状态为1,显示 |
| | | $('#commissionOption' + index).show(); |
| | | } else { |
| | | // 否则,隐藏 |
| | | $('#commissionOption' + index).hide(); |
| | | } |
| | | }); |
| | | } |
| | | }); |
| | | } |
| | | |
| | | table.on('toolbar(lhWithdrawTable)', function(obj){ |
| | | var data = obj.data, |
| | | layEvent = obj.event; |
| | | }); |
| | | }) |
| | | </script> |
| | |
| | | <div class="layui-fluid" id="febs-vip-edit"> |
| | | <form class="layui-form" action="" lay-filter="vip-edit-form"> |
| | | <div class="layui-form-item"> |
| | | |
| | | <input type="text" name="id" lay-verify="required" autocomplete="off" class="layui-input febs-hide" > |
| | | <div class="layui-col-lg6"> |
| | | <label class="layui-form-label febs-form-item-require">序号:</label> |
| | | <div class="layui-input-block"> |
| | |
| | | </div> |
| | | </blockquote> |
| | | <div class="febs-hide"> |
| | | <input type="text" id="thumb" name="thumb" autocomplete="off" class="layui-input" readonly> |
| | | <input type="text" id="vipPng" name="vipPng" autocomplete="off" class="layui-input" readonly> |
| | | </div> |
| | | </div> |
| | | </div> |
| | |
| | | "rebatePercent" : runVip.rebatePercent |
| | | }); |
| | | $('#thumbImage').html('<img src="'+ runVip.vipPng +'" class="layui-upload-img" style="width: 100px">') |
| | | $("#thumb").val(runVip.vipPng); |
| | | $("#vipPng").val(runVip.vipPng); |
| | | } |
| | | |
| | | form.on('submit(vip-edit-form-submit)', function (data) { |
| | |
| | | }); |
| | | } |
| | | ,done: function(res){ |
| | | $("#thumb").val(res.data.src); |
| | | $("#vipPng").val(res.data.src); |
| | | } |
| | | }); |
| | | }); |