diff --git a/packages/plugins/@tachybase/plugin-wechat-official-account/package.json b/packages/plugins/@tachybase/plugin-wechat-official-account/package.json index 2d8f52bf0..8f45c4b44 100644 --- a/packages/plugins/@tachybase/plugin-wechat-official-account/package.json +++ b/packages/plugins/@tachybase/plugin-wechat-official-account/package.json @@ -1,6 +1,6 @@ { "name": "@tachybase/plugin-wechat-official-account", - "version": "0.21.75", + "version": "0.21.81", "keywords": [ "Authentication" ], @@ -12,11 +12,11 @@ "axios": "^1.7.2", "bcrypt": "^5.1.1", "body-parser": "^1.20.2", - "crypto": "^1.0.1", "jsonwebtoken": "^8.5.1", "koa-bodyparser": "^4.3.0", "qrcode.react": "^3.1.0", "react-router-dom": "^6.11.2", + "sequelize": "^6.37.3", "xml2js": "^0.6.2" }, "peerDependencies": { diff --git a/packages/plugins/@tachybase/plugin-wechat-official-account/src/server/plugin.ts b/packages/plugins/@tachybase/plugin-wechat-official-account/src/server/plugin.ts index b02c5ee98..f0162bc60 100644 --- a/packages/plugins/@tachybase/plugin-wechat-official-account/src/server/plugin.ts +++ b/packages/plugins/@tachybase/plugin-wechat-official-account/src/server/plugin.ts @@ -1,112 +1,164 @@ -// --10、解决数据库注册插入问题 import crypto from 'crypto'; import { BasicAuth } from '@tachybase/plugin-auth'; import { Plugin } from '@tachybase/server'; import axios from 'axios'; +import { Op } from 'sequelize'; import xml2js from 'xml2js'; import { authType } from '../constants'; export class PluginReplacePageServer extends Plugin { - // 从数据库查询config表 - async config() { - const repo = this.app.db.getRepository('config'); + // 从数据库查询wechatConfig表 + async getWeChatConfig() { + const repo = this.app.db.getRepository('wechatConfig'); const config = await repo.findById(1); - return config.get(); + const { appid, appsecret, token, accesstoken, token_expires_at } = config.get(); + return { appid, appsecret, token, accesstoken, token_expires_at }; } - // 从数据库查询message表 - async message() { - const repo = this.app.db.getRepository('message'); + // 从数据库查询wechatMessage表 + async getWeChatMessage() { + const repo = this.app.db.getRepository('wechatMessage'); const messages = await repo.find(); return messages; } - // 从数据库查询menu表 - async menu() { - const repo = this.app.db.getRepository('menu'); - const menus = await repo.find(); + // 从数据库查询wechatMenu表 + async getWeChatMenu() { + const repo = this.app.db.getRepository('wechatMenu'); + + // 查询三个一级菜单并按 createdAt 倒序排序 + const primaryMenus = await repo.find({ + where: { button: null }, + order: [['createdAt', 'DESC']], + limit: 3, + }); + + // 查询所有二级菜单并按 createdAt 倒序排序 + const secondaryMenus = await repo.find({ + where: { button: { [Op.ne]: null } }, + order: [['createdAt', 'DESC']], + limit: 5, + }); // 将数据库中的数据构建成菜单结构 const menuStructure = { button: [] }; - menus.forEach((menu) => { + // 反转一级菜单数组,以便从倒数第三新的开始处理 + const reversedPrimaryMenus = primaryMenus.reverse(); + + // 处理一级菜单 + reversedPrimaryMenus.forEach((menu) => { if (!menu.button) { // 一级菜单 - if (menuStructure.button.length < 3) { - if (Buffer.byteLength(menu.name, 'utf8') <= 16) { - menuStructure.button.push({ - type: menu.type, - name: menu.name, - key: menu.key || undefined, - url: menu.url || undefined, - sub_button: [], - }); - } else { - console.warn(`一级菜单名称 "${menu.name}" 超过了 16 个字节的限制`); - } - } else { - console.warn('超过了一级菜单的数量限制'); - } - } else { - // 二级菜单 - const parentMenu = menuStructure.button.find((btn) => btn.name === menu.button); - if (parentMenu) { - if (parentMenu.sub_button.length < 5) { - if (Buffer.byteLength(menu.name, 'utf8') <= 40) { - parentMenu.sub_button.push({ - type: menu.type, - name: menu.name, - key: menu.key || undefined, - url: menu.url || undefined, - }); - } else { - console.warn(`二级菜单名称 "${menu.name}" 超过了 40 个字节的限制`); - } - } else { - console.warn('超过了二级菜单的数量限制'); + let name = menu.name; + if (Buffer.byteLength(name, 'utf8') > 12) { + while (Buffer.byteLength(name, 'utf8') > 12 - 2) { + // 预留2字节给省略号 + name = name.slice(0, -1); } + name += '..'; } + menuStructure.button.push({ + type: menu.type, + name: name, + key: menu.key || undefined, + url: menu.url || undefined, + sub_button: [], + }); } }); - console.log('-------------', JSON.stringify(menuStructure, null, 2)); + // 反转二级菜单数组 + const reversedSecondaryMenus = secondaryMenus.reverse(); + + // 为一级菜单添加二级菜单 + reversedSecondaryMenus.forEach((menu) => { + if (menu.button) { + // 二级菜单 + const parentMenu = menuStructure.button.find((btn) => btn.name === menu.button); + if (parentMenu) { + let name = menu.name; + if (Buffer.byteLength(name, 'utf8') > 32) { + while (Buffer.byteLength(name, 'utf8') > 32 - 2) { + // 预留2字节给省略号 + name = name.slice(0, -1); + } + name += '..'; + } + parentMenu.sub_button.push({ + type: menu.type, + name: name, + key: menu.key || undefined, + url: menu.url || undefined, + }); + } + } + }); return menuStructure; } + // 从数据库查询wechatArticle表 + async getWeChatArticle() { + const repo = this.app.db.getRepository('wechatArticle'); + const articles = await repo.find({ order: [['id', 'desc']], limit: 1 }); + if (articles.length > 0) { + return articles[0]; + } else { + this.app.logger.error('No articles found in the database'); + return null; + } + } + // 验证Wechat平台的请求签名 async checkSignature(query) { const { signature, timestamp, nonce } = query; const hash = crypto.createHash('sha1'); - const { token } = await this.config(); // 获取配置的token,完成Wechat签名认证 + const { token } = await this.getWeChatConfig(); // 获取配置的token,完成Wechat签名认证 const str = [token, timestamp, nonce].sort().join(''); hash.update(str); const result = hash.digest('hex') === signature; return result; } - // 获取Wechat-Token - async getAccessToken() { - const { appid, appsecret } = await this.config(); // 使用config方法 查询config表 - const url = `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appid}&secret=${appsecret}`; + // 获取AccessToken + async getAccessToken(forceRefresh = false) { + const configRepo = this.app.db.getRepository('wechatConfig'); + const config = await this.getWeChatConfig(); + const { appid, appsecret, accesstoken, token_expires_at } = config; - console.log(`Fetching access token from URL: ${url}`); - console.log(`App ID: ${appid}, App Secret: ${appsecret}`); + const now = Date.now(); + const bufferTime = 10 * 60 * 1000; // 提前10分钟,转换为毫秒 + + // 判断是否需要刷新access token + if (!forceRefresh && accesstoken && token_expires_at && now < token_expires_at - bufferTime) { + return accesstoken; + } + + const url = `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appid}&secret=${appsecret}`; try { const response = await axios.get(url); - console.log('Access token response:', response.data); - return response.data.access_token; + const newAccessToken = response.data.access_token; + const expiresIn = response.data.expires_in * 1000; // 转换为毫秒 + const newTokenExpiresAt = now + expiresIn; // 实际过期时间 + + await configRepo.update({ + filter: { id: 1 }, + values: { accesstoken: newAccessToken, token_expires_at: newTokenExpiresAt }, + }); + + return newAccessToken; } catch (error) { - console.error('Error getting access token:', error); + this.app.logger.error(`Error getting access token: ${JSON.stringify(error)}`); return null; } } // 生成OAuth授权URL async generateAuthUrl() { - const { appid } = await this.config(); // 获取appid + const { appid } = await this.getWeChatConfig(); // 获取appid const redirectUri = encodeURIComponent('https://lu.dev.daoyoucloud.com/api/wechat@handleOAuthCallback'); const scope = 'snsapi_userinfo'; // 获取用户信息的权限 const state = 'STATE'; // 自定义的state参数 @@ -119,10 +171,11 @@ export class PluginReplacePageServer extends Plugin { async generateQrCode() { const authUrl = await this.generateAuthUrl(); if (!authUrl) { - console.error('Failed to generate OAuth URL'); + this.app.logger.error('Failed to generate OAuth URL'); return null; } + // TODO: 修改为前端使用库,生成授权二维码 const qrCodeUrl = `https://api.qrserver.com/v1/create-qr-code/?data=${encodeURIComponent(authUrl)}&size=300x300`; return qrCodeUrl; } @@ -130,10 +183,10 @@ export class PluginReplacePageServer extends Plugin { // 创建菜单 async createCustomMenu() { const accessToken = await this.getAccessToken(); // 获取Wechat Token - const menu = await this.menu(); // 获取菜单数据 + const menu = await this.getWeChatMenu(); // 获取菜单数据 if (!accessToken) { - console.error('Failed to get access token'); + this.app.logger.error('Failed to get access token'); return; } @@ -142,9 +195,9 @@ export class PluginReplacePageServer extends Plugin { // 若通过accessToken验证,则发送Wechat请求,创建菜单 try { const response = await axios.post(url, menu); - console.log('Create menu response:', response.data); + this.app.logger.info(`Create menu response: ${JSON.stringify(response.data)}`); } catch (error) { - console.error('Error creating menu:', error); + this.app.logger.error(`Error creating menu: ${JSON.stringify(error)}`); } } @@ -168,15 +221,17 @@ export class PluginReplacePageServer extends Plugin { return; } - const messages = await this.message(); // 调用当前对象的 message方法 + const messages = await this.getWeChatMessage(); // 调用当前对象的 message方法 const messagesList = messages.map((message) => `${message.id}、 ${message.key}`).join('\n'); + // TODO: 用户可以在前端配置默认回复 + // 可以把默认回复添加到wechat_cofig表里面 let replyContent = `您好,欢迎关注道有云网络科技有限公司!您可以输入下面关键字来获取您要了解的信息!\n(输入序号或关键字):\n${messagesList}`; // 解析 POST 请求的 XML 格式消息体 xml2js.parseString(body, { explicitArray: false }, (err, result) => { if (err) { - console.error('Error parsing XML:', err); + this.app.logger.error(`Error parsing XML: ${JSON.stringify(err)}`); ctx.status = 500; ctx.body = 'Server Error'; return; @@ -251,7 +306,6 @@ export class PluginReplacePageServer extends Plugin { // 处理OAuth回调 async handleOAuthCallback(ctx) { const { code } = ctx.query; - console.log('code---:', code); if (!code) { ctx.status = 400; @@ -260,15 +314,12 @@ export class PluginReplacePageServer extends Plugin { } try { - const { appid, appsecret } = await this.config(); - console.log('appid---:', appid); - console.log('appsecret---:', appsecret); + const { appid, appsecret } = await this.getWeChatConfig(); // 获取 access_token 和 openid const tokenUrl = `https://api.weixin.qq.com/sns/oauth2/access_token?appid=${appid}&secret=${appsecret}&code=${code}&grant_type=authorization_code`; const tokenResponse = await axios.get(tokenUrl); const { access_token, openid } = tokenResponse.data; - console.log('access_token---:', access_token, '\n openid---:', openid); if (!access_token || !openid) { throw new Error('Failed to get access token or openid'); @@ -280,7 +331,6 @@ export class PluginReplacePageServer extends Plugin { // 用户信息 const userInfo = userInfoResponse.data; - console.log('用户信息:', userInfo); // 检查数据库中是否存在该用户 const userRepo = this.app.db.getRepository('users'); @@ -294,55 +344,225 @@ export class PluginReplacePageServer extends Plugin { // 如果用户不存在,则插入新用户 await userRepo.create({ values: { - username: openid.substring(0, 6), + username: openid.slice(-6), password: openid, nickname: userInfo.nickname, }, }); - console.log('新用户已创建:', userInfo.nickname); + this.app.logger.info(`新用户已创建: ${JSON.stringify(userInfo.nickname)}`); } else { // 如果用户存在,直接登录 - console.log('用户已存在:', existingUser.nickname); + this.app.logger.info(`用户已存在:' ${JSON.stringify(existingUser.nickname)}`); } // 这里可以设置登录态或返回登录成功的信息 ctx.body = '完成注册,登录成功!'; - // 返回手机端页面 - // ctx.redirect('https://lu.dev.daoyoucloud.com/admin/4tr7gnzlwni'); } catch (error) { - console.error('Error handling OAuth callback:', error); + this.app.logger.error(`Error handling OAuth callback: ${JSON.stringify(error)}`); ctx.status = 500; ctx.body = 'Server Error'; - // ctx.body = '您已存在账户,登录成功!'; } } + // 从素材库获取素材列表 + async getMaterialList() { + const accessToken = await this.getAccessToken(); // 获取WeChat的access token + + if (!accessToken) { + this.app.logger.error('Failed to get access token'); + return null; + } + + const url = `https://api.weixin.qq.com/cgi-bin/material/batchget_material?access_token=${accessToken}`; + const data = { + type: 'image', // 需要检查的素材类型,如:image, video, voice, news + offset: 0, + count: 20, // 每次获取的素材数量,可以根据需要调整 + }; + + try { + const response = await axios.post(url, data); + if (response.data.item) { + response.data.item.forEach((material) => { + this.app.logger.info( + `Media ID: ${JSON.stringify(material.media_id)}, Name: ${JSON.stringify(material.name)}, Update Time: ${JSON.stringify(material.update_time)}`, + ); + }); + return response.data.item; + } else { + this.app.logger.error(`Failed to get material list: ${JSON.stringify(response.data)}`); + return null; + } + } catch (error) { + this.app.logger.error(`Error getting material list: ${JSON.stringify(error)}`); + return null; + } + } + + // 检查素材是否为永久素材 + async checkMaterialType(mediaId) { + const materials = await this.getMaterialList(); + if (materials) { + const material = materials.find((item) => item.media_id === mediaId); + if (material) { + this.app.logger.info(`Material ID: ${JSON.stringify(mediaId)} is a permanent material.`); + return true; // 表示是永久素材 + } else { + this.app.logger.info(`Material ID: ${JSON.stringify(mediaId)} is not found in permanent materials.`); + return false; // 表示不是永久素材 + } + } else { + this.app.logger.error('No materials found.'); + return false; + } + } + + // 更新articles表中的thumb_media_id字段 + async updateLatestArticleWithLatestMediaId() { + const materialList = await this.getMaterialList(); + if (materialList && materialList.length > 0) { + const latestMediaId = materialList[materialList.length - 1].media_id; + + // 获取articles表中的最后一条记录 + const repo = this.app.db.getRepository('wechatArticle'); + const articles = await repo.find({ order: [['id', 'desc']], limit: 1 }); + + if (articles.length > 0) { + const latestArticle = articles[0]; + await repo.update({ + filter: { id: latestArticle.id }, + values: { thumb_media_id: latestMediaId }, + }); + this.app.logger.info( + `Article ${JSON.stringify(latestArticle.id)} thumb_media_id updated to ${JSON.stringify(latestMediaId)}`, + ); + } else { + this.app.logger.error('No articles found in the database'); + } + } else { + this.app.logger.error('No materials found in WeChat material list'); + } + } + + // 上传图文到草稿箱 + async uploadNewsToDraft(article) { + const isPermanent = await this.checkMaterialType(article.thumb_media_id); + if (!isPermanent) { + this.app.logger.error(`Thumb media ID: ${JSON.stringify(article.thumb_media_id)} is not a permanent material.`); + return null; + } + + const accessToken = await this.getAccessToken(); // 获取WeChat的access token + + if (!accessToken) { + this.app.logger.error('Failed to get access token'); + return null; + } + + const url = `https://api.weixin.qq.com/cgi-bin/draft/add?access_token=${accessToken}`; + + const articleData = { + articles: [ + { + title: article.title, + thumb_media_id: article.thumb_media_id, // 确保这是一个永久素材的 thumb_media_id + author: article.author, + digest: article.digest || '', + show_cover_pic: 1, + content: article.content, + content_source_url: article.content_source_url || '', + }, + ], + }; + + try { + const response = await axios.post(url, articleData); + this.app.logger.info(`Upload news to draft response: ${JSON.stringify(response.data)}`); + if (response.data.errcode) { + this.app.logger.error( + `Error code: ${JSON.stringify(response.data.errcode)}, message: ${JSON.stringify(response.data.errmsg)}`, + ); + return null; + } + return response.data.media_id; + } catch (error) { + this.app.logger.error(`Error uploading news to draft: ${JSON.stringify(error)}`); + return null; + } + } + + // 发送推文接口 + async sendNewsToAll(mediaId) { + const accessToken = await this.getAccessToken(); + + if (!accessToken) { + this.app.logger.error('Failed to get access token'); + return null; + } + + const url = `https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_token=${accessToken}`; + + const messageData = { + filter: { + is_to_all: true, // 发送给所有用户 + }, + mpnews: { + media_id: mediaId, + }, + msgtype: 'mpnews', + send_ignore_reprint: 0, + }; + + try { + const response = await axios.post(url, messageData); + this.app.logger.info(`Send news response: ${JSON.stringify(response.data)}`); + if (response.data.errcode) { + this.app.logger.error( + `Error code: ${JSON.stringify(response.data.errcode)}, message: ${JSON.stringify(response.data.errmsg)}`, + ); + return null; + } + return response.data; + } catch (error) { + this.app.logger.error(`Error sending news: ${JSON.stringify(error)}`); + return null; + } + } + + // 发布文章接口 + async publishLastArticleToWeChat() { + const article = await this.getWeChatArticle(); // 获取最后一条文章 + + if (article) { + const mediaId = await this.uploadNewsToDraft(article); // 上传图文消息到草稿箱获取media_id + + if (mediaId) { + const result = await this.sendNewsToAll(mediaId); // 使用media_id进行群发 + return result; + } + } + return null; + } + // load() 生命周期函数,在插件加载时执行 async load() { // 监听 message 表的 afterCreate 事件 - this.app.db.on('message.afterCreate', this.handleMessageCreate.bind(this)); + this.app.db.on('wechatMessage.afterCreate', this.handleMessageCreate.bind(this)); // 监听 menu 表的 afterUpdate 事件 - this.app.db.on('menu.afterUpdate', this.handleMenuUpdate.bind(this)); + this.app.db.on('wechatMenu.afterUpdate', this.handleMenuUpdate.bind(this)); // 注册认证(前端显示按钮) this.app.authManager.registerTypes(authType, { auth: BasicAuth, }); - // 定义资源动作 this.app.resourcer.define({ name: 'wechat', actions: { - // 测试接口 - test: async (ctx) => { - ctx.withoutDataWrapping = true; - ctx.body = 'Hello World!'; - console.log('Hello World!'); - }, // 创建菜单接口 createMenu: async (ctx) => { await this.createCustomMenu(); - console.log('Custom menu created successfully.'); + this.app.logger.info('Custom menu created successfully.'); ctx.body = 'success'; }, // Wechat 消息处理接口/服务器URL配置接口 @@ -359,7 +579,7 @@ export class PluginReplacePageServer extends Plugin { const qrCodeUrl = await this.generateQrCode(); if (qrCodeUrl) { ctx.body = { data: { url: qrCodeUrl } }; // 确保返回的数据格式正确 - console.log(`我是生成二维码接口的URL: ${qrCodeUrl}`); + this.app.logger.info(`我是生成二维码接口的URL: ${JSON.stringify(qrCodeUrl)}`); } else { ctx.status = 500; ctx.body = 'Failed to generate QR code'; @@ -369,6 +589,21 @@ export class PluginReplacePageServer extends Plugin { handleOAuthCallback: async (ctx) => { await this.handleOAuthCallback(ctx); }, + // 获取素材列表并更新最新文章的封面图片接口 + updateLatestArticleWithLatestMediaId: async (ctx) => { + await this.updateLatestArticleWithLatestMediaId(); + ctx.body = 'Latest article updated with latest media ID'; + }, + // 发布最新文章到微信公众号接口 + publishLastArticleToWeChat: async (ctx) => { + const result = await this.publishLastArticleToWeChat(); + if (result) { + ctx.body = 'Article published to WeChat successfully'; + } else { + ctx.status = 500; + ctx.body = 'Failed to publish article to WeChat'; + } + }, }, }); @@ -378,11 +613,11 @@ export class PluginReplacePageServer extends Plugin { // 处理 message 表的 afterCreate 事件 async handleMessageCreate(model, options) { const { id, key, value } = model.get(); - console.log(`New message created: ${key} - ${value}`); + this.app.logger.info(`New message created: ${JSON.stringify(key)} - ${JSON.stringify(value)}`); // 获取所有关注公众号的用户 ID const userIds = await this.getAllFollowers(); - console.log('Follower IDs:', userIds); + this.app.logger.info(`Follower IDs: ${JSON.stringify(userIds)}`); // 推送消息content await this.pushMessageToFollowers(userIds, `目前系统提示已经更新,大家可以使用新的关键字 "${key}" 来获取信息!`); @@ -391,11 +626,11 @@ export class PluginReplacePageServer extends Plugin { // 处理 menu 表的 afterUpdate 事件 async handleMenuUpdate(model, options) { const { id, name } = model.get(); - console.log(`Menu item updated: ${name} (ID: ${id})`); + this.app.logger.info(`Menu item updated: ${JSON.stringify(name)} (ID: ${JSON.stringify(id)})`); // 获取所有关注公众号的用户 ID const userIds = await this.getAllFollowers(); - console.log('Follower IDs:', userIds); + this.app.logger.info(`Follower IDs: ${JSON.stringify(userIds)}`); // 推送消息content await this.pushMessageToFollowers(userIds, '用户你好,菜单项已经更新'); @@ -405,7 +640,7 @@ export class PluginReplacePageServer extends Plugin { async getAllFollowers() { const accessToken = await this.getAccessToken(); if (!accessToken) { - console.error('Failed to get access token'); + this.app.logger.error('Failed to get access token'); return []; } @@ -413,13 +648,12 @@ export class PluginReplacePageServer extends Plugin { try { const response = await axios.get(url); if (response.data.errcode) { - console.error(`Error getting followers: ${response.data.errmsg}`); + this.app.logger.error(`Error getting followers: ${JSON.stringify(response.data.errmsg)}`); return []; } - console.log('返回用户ID数组----'); return response.data.data.openid; // 返回关注者的OpenID数组 } catch (error) { - console.error('Error getting followers:', error); + this.app.logger.error(`Error getting followers: ${JSON.stringify(error)}`); return []; } } @@ -428,7 +662,7 @@ export class PluginReplacePageServer extends Plugin { async pushMessageToFollowers(userIds, message) { const accessToken = await this.getAccessToken(); if (!accessToken) { - console.error('Failed to get access token'); + this.app.logger.error('Failed to get access token'); return; } @@ -447,12 +681,14 @@ export class PluginReplacePageServer extends Plugin { try { const response = await axios.post(url, data); if (response.data.errcode) { - console.error(`Error pushing message to user ${userId}: ${response.data.errmsg}`); + this.app.logger.error( + `Error pushing message to user ${JSON.stringify(userId)}: ${JSON.stringify(response.data.errmsg)}`, + ); } else { - console.log(`Message pushed to user ${userId} successfully.`); + this.app.logger.info(`Message pushed to user ${JSON.stringify(userId)} successfully.`); } } catch (error) { - console.error(`Error pushing message to user ${userId}:`, error); + this.app.logger.error(`Error pushing message to user ${JSON.stringify(userId)}: ${JSON.stringify(error)}`); } } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3518b2529..4317517e5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2206,7 +2206,7 @@ importers: dependencies: '@nomicfoundation/hardhat-toolbox': specifier: ^5.0.0 - version: 5.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.7)(@nomicfoundation/hardhat-ethers@3.0.6)(@nomicfoundation/hardhat-ignition-ethers@0.15.5)(@nomicfoundation/hardhat-network-helpers@1.0.11)(@nomicfoundation/hardhat-verify@2.0.8)(@typechain/ethers-v6@0.5.1)(@typechain/hardhat@9.1.0)(@types/chai@4.3.16)(@types/mocha@10.0.7)(@types/node@20.14.2)(chai@4.3.10)(ethers@6.13.2)(hardhat-gas-reporter@1.0.10)(hardhat@2.22.6)(solidity-coverage@0.8.12)(ts-node@9.1.1)(typechain@8.3.2)(typescript@5.5.4) + version: 5.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.7)(@nomicfoundation/hardhat-ethers@3.0.6)(@nomicfoundation/hardhat-ignition-ethers@0.15.5)(@nomicfoundation/hardhat-network-helpers@1.0.11)(@nomicfoundation/hardhat-verify@2.0.9)(@typechain/ethers-v6@0.5.1)(@typechain/hardhat@9.1.0)(@types/chai@4.3.16)(@types/mocha@10.0.7)(@types/node@20.14.2)(chai@4.3.10)(ethers@6.13.2)(hardhat-gas-reporter@1.0.10)(hardhat@2.22.7)(solidity-coverage@0.8.12)(ts-node@9.1.1)(typechain@8.3.2)(typescript@5.5.4) '@tachybase/actions': specifier: workspace:* version: link:../../../core/actions @@ -2230,7 +2230,7 @@ importers: version: 0.0.1-security hardhat: specifier: ^2.22.6 - version: 2.22.6(ts-node@9.1.1)(typescript@5.5.4) + version: 2.22.7(ts-node@9.1.1)(typescript@5.5.4) path: specifier: ^0.12.7 version: 0.12.7 @@ -4104,9 +4104,6 @@ importers: body-parser: specifier: ^1.20.2 version: 1.20.2 - crypto: - specifier: ^1.0.1 - version: 1.0.1 jsonwebtoken: specifier: ^8.5.1 version: 8.5.1 @@ -4119,6 +4116,9 @@ importers: react-router-dom: specifier: ^6.11.2 version: 6.25.1(react-dom@18.3.1)(react@18.3.1) + sequelize: + specifier: ^6.37.3 + version: 6.37.3 xml2js: specifier: ^0.6.2 version: 0.6.2 @@ -5010,7 +5010,7 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-router: ^5.0.0 || ^6.0.0 dependencies: - ahooks: 3.7.8(react@18.3.1) + ahooks: 3.7.11(react@18.3.1) query-string: 6.14.1 react: 18.3.1 react-router: 6.21.1(react@18.3.1) @@ -10672,7 +10672,6 @@ packages: /@mapbox/node-pre-gyp@1.0.11: resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} hasBin: true - requiresBuild: true dependencies: detect-libc: 2.0.3 https-proxy-agent: 5.0.1 @@ -10834,52 +10833,52 @@ packages: '@nodelib/fs.scandir': 2.1.5 fastq: 1.15.0 - /@nomicfoundation/edr-darwin-arm64@0.4.2: - resolution: {integrity: sha512-S+hhepupfqpBvMa9M1PVS08sVjGXsLnjyAsjhrrsjsNuTHVLhKzhkguvBD5g4If5skrwgOaVqpag4wnQbd15kQ==} + /@nomicfoundation/edr-darwin-arm64@0.5.0: + resolution: {integrity: sha512-G6OX/PESdfU4ZOyJ4MDh4eevW0wt2mduuxA+thXtTcStOiQTtPuV205h4kLOR5wRB1Zz6Zy0LedTMax7TzOtGw==} engines: {node: '>= 18'} dev: false - /@nomicfoundation/edr-darwin-x64@0.4.2: - resolution: {integrity: sha512-/zM94AUrXz6CmcsecRNHJ50jABDUFafmGc4iBmkfX/mTp4tVZj7XTyIogrQIt0FnTaeb4CgZoLap2+8tW/Uldg==} + /@nomicfoundation/edr-darwin-x64@0.5.0: + resolution: {integrity: sha512-fI7uHfHqPtdPZjkFUTpotc/F5gGv41ws+jSZy9+2AR9RDMOAIXMEArOx9rGLBcevWu8SFnyH/l/77kG/5FXbDw==} engines: {node: '>= 18'} dev: false - /@nomicfoundation/edr-linux-arm64-gnu@0.4.2: - resolution: {integrity: sha512-TV3Pr2tFvvmCfPCi9PaCGLtqn+oLaPKfL2NWpnoCeFFdzDQXi2L930yP1oUPY5RXd78NLdVHMkEkbhb2b6Wuvg==} + /@nomicfoundation/edr-linux-arm64-gnu@0.5.0: + resolution: {integrity: sha512-eMC3sWPkBZILg2/YB4Xv6IR0nggCLt5hS8K8jjHeGEeUs9pf8poBF2Oy+G4lSu0YLLjexGzHypz9/P+pIuxZHw==} engines: {node: '>= 18'} dev: false - /@nomicfoundation/edr-linux-arm64-musl@0.4.2: - resolution: {integrity: sha512-PALwrLBk1M9rolXyhSX8xdhe5jL0qf/PgiCIF7W7lUyVKrI/I0oiU0EHDk/Xw7yi2UJg4WRyhhZoHYa0g4g8Qg==} + /@nomicfoundation/edr-linux-arm64-musl@0.5.0: + resolution: {integrity: sha512-yPK0tKjYRxe5ktggFr8aBHH0DCI9uafuaD8QuzyrQAfSf/m/ebTdgthROdbYp6eRk5mJyfAQT/45fM3tnlYsWw==} engines: {node: '>= 18'} dev: false - /@nomicfoundation/edr-linux-x64-gnu@0.4.2: - resolution: {integrity: sha512-5svkftypDjAZ1LxV1onojlaqPRxrTEjJLkrUwLL+Fao5ZMe7aTnk5QQ1Jv76gW6WYZnMXNgjPhRcnw3oSNrqFA==} + /@nomicfoundation/edr-linux-x64-gnu@0.5.0: + resolution: {integrity: sha512-Hds8CRYi4DEyuErjcwUNSvNpMzmOYUihW4qYCoKgSBUVS5saX1PyPYvFYuYpeU5J8/T2iMk6yAPVLCxtKbgnKg==} engines: {node: '>= 18'} dev: false - /@nomicfoundation/edr-linux-x64-musl@0.4.2: - resolution: {integrity: sha512-qiMlXQTggdH9zfOB4Eil4rQ95z8s7QdLJcOfz5Aym12qJNkCyF9hi4cc4dDCWA0CdI3x3oLbuf8qb81SF8R45w==} + /@nomicfoundation/edr-linux-x64-musl@0.5.0: + resolution: {integrity: sha512-1hXMDSzdyh5ojwO3ZSRbt7t5KKYycGUlFdC3lgJRZ7gStB8xjb7RA3hZn2csn9OydS950Ne4nh+puNq91iXApw==} engines: {node: '>= 18'} dev: false - /@nomicfoundation/edr-win32-x64-msvc@0.4.2: - resolution: {integrity: sha512-hDkAb0iaMmGYwBY/rA1oCX8VpsezfQcHPEPIEGXEcWC3WbnOgIZo0Qkpu/g0OMtFOJSQlWLXvKZuV7blhnrQag==} + /@nomicfoundation/edr-win32-x64-msvc@0.5.0: + resolution: {integrity: sha512-CFagD423400xXkRmACIR13FoocN48qi4ogRnuFQIvBDtEE3aMEajfFj4bycmQQDqnqChsZy/jwD4OxbX6oaNJw==} engines: {node: '>= 18'} dev: false - /@nomicfoundation/edr@0.4.2: - resolution: {integrity: sha512-U7v0HuZHfrsl/5FpUzuB2FYA0+FUglHHwiO6NhvLtNYKMZcPzdS6iUriMp/7GWs0SVxW3bAht9GinZPxdhVwWg==} + /@nomicfoundation/edr@0.5.0: + resolution: {integrity: sha512-nAUyjGhxntXje/1AkDX9POfH+pqUxdi4XHzIhaf/dJYs7fgAFxL3STBK1OYcA3LR7vtiylLHMz7wxjqLzlLGKg==} engines: {node: '>= 18'} dependencies: - '@nomicfoundation/edr-darwin-arm64': 0.4.2 - '@nomicfoundation/edr-darwin-x64': 0.4.2 - '@nomicfoundation/edr-linux-arm64-gnu': 0.4.2 - '@nomicfoundation/edr-linux-arm64-musl': 0.4.2 - '@nomicfoundation/edr-linux-x64-gnu': 0.4.2 - '@nomicfoundation/edr-linux-x64-musl': 0.4.2 - '@nomicfoundation/edr-win32-x64-msvc': 0.4.2 + '@nomicfoundation/edr-darwin-arm64': 0.5.0 + '@nomicfoundation/edr-darwin-x64': 0.5.0 + '@nomicfoundation/edr-linux-arm64-gnu': 0.5.0 + '@nomicfoundation/edr-linux-arm64-musl': 0.5.0 + '@nomicfoundation/edr-linux-x64-gnu': 0.5.0 + '@nomicfoundation/edr-linux-x64-musl': 0.5.0 + '@nomicfoundation/edr-win32-x64-msvc': 0.5.0 dev: false /@nomicfoundation/ethereumjs-common@4.0.4: @@ -10924,7 +10923,7 @@ packages: ethereum-cryptography: 0.1.3 dev: false - /@nomicfoundation/hardhat-chai-matchers@2.0.7(@nomicfoundation/hardhat-ethers@3.0.6)(chai@4.3.10)(ethers@6.13.2)(hardhat@2.22.6): + /@nomicfoundation/hardhat-chai-matchers@2.0.7(@nomicfoundation/hardhat-ethers@3.0.6)(chai@4.3.10)(ethers@6.13.2)(hardhat@2.22.7): resolution: {integrity: sha512-RQfsiTwdf0SP+DtuNYvm4921X6VirCQq0Xyh+mnuGlTwEFSPZ/o27oQC+l+3Y/l48DDU7+ZcYBR+Fp+Rp94LfQ==} peerDependencies: '@nomicfoundation/hardhat-ethers': ^3.0.0 @@ -10932,17 +10931,17 @@ packages: ethers: ^6.1.0 hardhat: ^2.9.4 dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.6(ethers@6.13.2)(hardhat@2.22.6) + '@nomicfoundation/hardhat-ethers': 3.0.6(ethers@6.13.2)(hardhat@2.22.7) '@types/chai-as-promised': 7.1.8 chai: 4.3.10 chai-as-promised: 7.1.2(chai@4.3.10) deep-eql: 4.1.3 ethers: 6.13.2 - hardhat: 2.22.6(ts-node@9.1.1)(typescript@5.5.4) + hardhat: 2.22.7(ts-node@9.1.1)(typescript@5.5.4) ordinal: 1.0.3 dev: false - /@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.2)(hardhat@2.22.6): + /@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.2)(hardhat@2.22.7): resolution: {integrity: sha512-/xzkFQAaHQhmIAYOQmvHBPwL+NkwLzT9gRZBsgWUYeV+E6pzXsBQsHfRYbAZ3XEYare+T7S+5Tg/1KDJgepSkA==} peerDependencies: ethers: ^6.1.0 @@ -10950,13 +10949,13 @@ packages: dependencies: debug: 4.3.5(supports-color@5.5.0) ethers: 6.13.2 - hardhat: 2.22.6(ts-node@9.1.1)(typescript@5.5.4) + hardhat: 2.22.7(ts-node@9.1.1)(typescript@5.5.4) lodash.isequal: 4.5.0 transitivePeerDependencies: - supports-color dev: false - /@nomicfoundation/hardhat-ignition-ethers@0.15.5(@nomicfoundation/hardhat-ethers@3.0.6)(@nomicfoundation/hardhat-ignition@0.15.5)(@nomicfoundation/ignition-core@0.15.5)(ethers@6.13.2)(hardhat@2.22.6): + /@nomicfoundation/hardhat-ignition-ethers@0.15.5(@nomicfoundation/hardhat-ethers@3.0.6)(@nomicfoundation/hardhat-ignition@0.15.5)(@nomicfoundation/ignition-core@0.15.5)(ethers@6.13.2)(hardhat@2.22.7): resolution: {integrity: sha512-W6s1QN9CFxzSVZS6w9Jcj3WLaK32z2FP5MxNU2OKY1Fn9ZzLr+miXbUbWYuRHl6dxrrl6sE8cv33Cybv19pmCg==} peerDependencies: '@nomicfoundation/hardhat-ethers': ^3.0.4 @@ -10965,26 +10964,26 @@ packages: ethers: ^6.7.0 hardhat: ^2.18.0 dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.6(ethers@6.13.2)(hardhat@2.22.6) - '@nomicfoundation/hardhat-ignition': 0.15.5(@nomicfoundation/hardhat-verify@2.0.8)(hardhat@2.22.6) + '@nomicfoundation/hardhat-ethers': 3.0.6(ethers@6.13.2)(hardhat@2.22.7) + '@nomicfoundation/hardhat-ignition': 0.15.5(@nomicfoundation/hardhat-verify@2.0.9)(hardhat@2.22.7) '@nomicfoundation/ignition-core': 0.15.5 ethers: 6.13.2 - hardhat: 2.22.6(ts-node@9.1.1)(typescript@5.5.4) + hardhat: 2.22.7(ts-node@9.1.1)(typescript@5.5.4) dev: false - /@nomicfoundation/hardhat-ignition@0.15.5(@nomicfoundation/hardhat-verify@2.0.8)(hardhat@2.22.6): + /@nomicfoundation/hardhat-ignition@0.15.5(@nomicfoundation/hardhat-verify@2.0.9)(hardhat@2.22.7): resolution: {integrity: sha512-Y5nhFXFqt4owA6Ooag8ZBFDF2RAZElMXViknVIsi3m45pbQimS50ti6FU8HxfRkDnBARa40CIn7UGV0hrelzDw==} peerDependencies: '@nomicfoundation/hardhat-verify': ^2.0.1 hardhat: ^2.18.0 dependencies: - '@nomicfoundation/hardhat-verify': 2.0.8(hardhat@2.22.6) + '@nomicfoundation/hardhat-verify': 2.0.9(hardhat@2.22.7) '@nomicfoundation/ignition-core': 0.15.5 '@nomicfoundation/ignition-ui': 0.15.5 chalk: 4.1.2 debug: 4.3.5(supports-color@5.5.0) fs-extra: 10.1.0 - hardhat: 2.22.6(ts-node@9.1.1)(typescript@5.5.4) + hardhat: 2.22.7(ts-node@9.1.1)(typescript@5.5.4) prompts: 2.4.2 transitivePeerDependencies: - bufferutil @@ -10992,16 +10991,16 @@ packages: - utf-8-validate dev: false - /@nomicfoundation/hardhat-network-helpers@1.0.11(hardhat@2.22.6): + /@nomicfoundation/hardhat-network-helpers@1.0.11(hardhat@2.22.7): resolution: {integrity: sha512-uGPL7QSKvxrHRU69dx8jzoBvuztlLCtyFsbgfXIwIjnO3dqZRz2GNMHJoO3C3dIiUNM6jdNF4AUnoQKDscdYrA==} peerDependencies: hardhat: ^2.9.5 dependencies: ethereumjs-util: 7.1.5 - hardhat: 2.22.6(ts-node@9.1.1)(typescript@5.5.4) + hardhat: 2.22.7(ts-node@9.1.1)(typescript@5.5.4) dev: false - /@nomicfoundation/hardhat-toolbox@5.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.7)(@nomicfoundation/hardhat-ethers@3.0.6)(@nomicfoundation/hardhat-ignition-ethers@0.15.5)(@nomicfoundation/hardhat-network-helpers@1.0.11)(@nomicfoundation/hardhat-verify@2.0.8)(@typechain/ethers-v6@0.5.1)(@typechain/hardhat@9.1.0)(@types/chai@4.3.16)(@types/mocha@10.0.7)(@types/node@20.14.2)(chai@4.3.10)(ethers@6.13.2)(hardhat-gas-reporter@1.0.10)(hardhat@2.22.6)(solidity-coverage@0.8.12)(ts-node@9.1.1)(typechain@8.3.2)(typescript@5.5.4): + /@nomicfoundation/hardhat-toolbox@5.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.7)(@nomicfoundation/hardhat-ethers@3.0.6)(@nomicfoundation/hardhat-ignition-ethers@0.15.5)(@nomicfoundation/hardhat-network-helpers@1.0.11)(@nomicfoundation/hardhat-verify@2.0.9)(@typechain/ethers-v6@0.5.1)(@typechain/hardhat@9.1.0)(@types/chai@4.3.16)(@types/mocha@10.0.7)(@types/node@20.14.2)(chai@4.3.10)(ethers@6.13.2)(hardhat-gas-reporter@1.0.10)(hardhat@2.22.7)(solidity-coverage@0.8.12)(ts-node@9.1.1)(typechain@8.3.2)(typescript@5.5.4): resolution: {integrity: sha512-FnUtUC5PsakCbwiVNsqlXVIWG5JIb5CEZoSXbJUsEBun22Bivx2jhF1/q9iQbzuaGpJKFQyOhemPB2+XlEE6pQ==} peerDependencies: '@nomicfoundation/hardhat-chai-matchers': ^2.0.0 @@ -11023,37 +11022,37 @@ packages: typechain: ^8.3.0 typescript: '>=4.5.0' dependencies: - '@nomicfoundation/hardhat-chai-matchers': 2.0.7(@nomicfoundation/hardhat-ethers@3.0.6)(chai@4.3.10)(ethers@6.13.2)(hardhat@2.22.6) - '@nomicfoundation/hardhat-ethers': 3.0.6(ethers@6.13.2)(hardhat@2.22.6) - '@nomicfoundation/hardhat-ignition-ethers': 0.15.5(@nomicfoundation/hardhat-ethers@3.0.6)(@nomicfoundation/hardhat-ignition@0.15.5)(@nomicfoundation/ignition-core@0.15.5)(ethers@6.13.2)(hardhat@2.22.6) - '@nomicfoundation/hardhat-network-helpers': 1.0.11(hardhat@2.22.6) - '@nomicfoundation/hardhat-verify': 2.0.8(hardhat@2.22.6) + '@nomicfoundation/hardhat-chai-matchers': 2.0.7(@nomicfoundation/hardhat-ethers@3.0.6)(chai@4.3.10)(ethers@6.13.2)(hardhat@2.22.7) + '@nomicfoundation/hardhat-ethers': 3.0.6(ethers@6.13.2)(hardhat@2.22.7) + '@nomicfoundation/hardhat-ignition-ethers': 0.15.5(@nomicfoundation/hardhat-ethers@3.0.6)(@nomicfoundation/hardhat-ignition@0.15.5)(@nomicfoundation/ignition-core@0.15.5)(ethers@6.13.2)(hardhat@2.22.7) + '@nomicfoundation/hardhat-network-helpers': 1.0.11(hardhat@2.22.7) + '@nomicfoundation/hardhat-verify': 2.0.9(hardhat@2.22.7) '@typechain/ethers-v6': 0.5.1(ethers@6.13.2)(typechain@8.3.2)(typescript@5.5.4) - '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1)(ethers@6.13.2)(hardhat@2.22.6)(typechain@8.3.2) + '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1)(ethers@6.13.2)(hardhat@2.22.7)(typechain@8.3.2) '@types/chai': 4.3.16 '@types/mocha': 10.0.7 '@types/node': 20.14.2 chai: 4.3.10 ethers: 6.13.2 - hardhat: 2.22.6(ts-node@9.1.1)(typescript@5.5.4) - hardhat-gas-reporter: 1.0.10(hardhat@2.22.6) - solidity-coverage: 0.8.12(hardhat@2.22.6) + hardhat: 2.22.7(ts-node@9.1.1)(typescript@5.5.4) + hardhat-gas-reporter: 1.0.10(hardhat@2.22.7) + solidity-coverage: 0.8.12(hardhat@2.22.7) ts-node: 9.1.1(typescript@5.5.4) typechain: 8.3.2(typescript@5.5.4) typescript: 5.5.4 dev: false - /@nomicfoundation/hardhat-verify@2.0.8(hardhat@2.22.6): - resolution: {integrity: sha512-x/OYya7A2Kcz+3W/J78dyDHxr0ezU23DKTrRKfy5wDPCnePqnr79vm8EXqX3gYps6IjPBYyGPZ9K6E5BnrWx5Q==} + /@nomicfoundation/hardhat-verify@2.0.9(hardhat@2.22.7): + resolution: {integrity: sha512-7kD8hu1+zlnX87gC+UN4S0HTKBnIsDfXZ/pproq1gYsK94hgCk+exvzXbwR0X2giiY/RZPkqY9oKRi0Uev91hQ==} peerDependencies: - hardhat: ^2.0.4 + hardhat: ^2.22.72.0.4 dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/address': 5.7.0 cbor: 8.1.0 chalk: 2.4.2 debug: 4.3.5(supports-color@5.5.0) - hardhat: 2.22.6(ts-node@9.1.1)(typescript@5.5.4) + hardhat: 2.22.7(ts-node@9.1.1)(typescript@5.5.4) lodash.clonedeep: 4.5.0 semver: 6.3.1 table: 6.8.2 @@ -12838,7 +12837,7 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.24.7 classnames: 2.5.1 rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 @@ -12899,7 +12898,7 @@ packages: '@babel/runtime': 7.24.7 '@rc-component/portal': 1.1.2(react-dom@18.3.1)(react@18.3.1) classnames: 2.5.1 - rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) + rc-motion: 2.9.1(react-dom@18.3.1)(react@18.3.1) rc-resize-observer: 1.4.0(react-dom@18.3.1)(react@18.3.1) rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 @@ -14217,7 +14216,7 @@ packages: typescript: 5.5.4 dev: false - /@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1)(ethers@6.13.2)(hardhat@2.22.6)(typechain@8.3.2): + /@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1)(ethers@6.13.2)(hardhat@2.22.7)(typechain@8.3.2): resolution: {integrity: sha512-mtaUlzLlkqTlfPwB3FORdejqBskSnh+Jl8AIJGjXNAQfRQ4ofHADPl1+oU7Z3pAJzmZbUXII8MhOLQltcHgKnA==} peerDependencies: '@typechain/ethers-v6': ^0.5.1 @@ -14228,7 +14227,7 @@ packages: '@typechain/ethers-v6': 0.5.1(ethers@6.13.2)(typechain@8.3.2)(typescript@5.5.4) ethers: 6.13.2 fs-extra: 9.1.0 - hardhat: 2.22.6(ts-node@9.1.1)(typescript@5.5.4) + hardhat: 2.22.7(ts-node@9.1.1)(typescript@5.5.4) typechain: 8.3.2(typescript@5.5.4) dev: false @@ -16254,12 +16253,12 @@ packages: acorn: 7.4.1 acorn-walk: 7.2.0 - /acorn-import-assertions@1.9.0(acorn@8.12.1): + /acorn-import-assertions@1.9.0(acorn@8.11.3): resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} peerDependencies: acorn: ^8 dependencies: - acorn: 8.12.1 + acorn: 8.11.3 dev: false /acorn-import-attributes@1.9.5(acorn@8.12.1): @@ -16269,12 +16268,12 @@ packages: dependencies: acorn: 8.12.1 - /acorn-jsx@5.3.2(acorn@8.12.1): + /acorn-jsx@5.3.2(acorn@8.11.3): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.12.1 + acorn: 8.11.3 /acorn-walk@7.2.0: resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} @@ -16334,7 +16333,6 @@ packages: /agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} - requiresBuild: true dependencies: debug: 4.3.5(supports-color@5.5.0) transitivePeerDependencies: @@ -16752,7 +16750,6 @@ packages: /aproba@2.0.0: resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} - requiresBuild: true /arch@2.2.0: resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} @@ -16810,7 +16807,6 @@ packages: /are-we-there-yet@2.0.0: resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} engines: {node: '>=10'} - requiresBuild: true dependencies: delegates: 1.0.0 readable-stream: 3.6.2 @@ -18152,7 +18148,7 @@ packages: engines: {node: '>= 8.10.0'} dependencies: anymatch: 3.1.3 - braces: 3.0.3 + braces: 3.0.2 glob-parent: 5.1.2 is-binary-path: 2.1.0 is-glob: 4.0.3 @@ -18164,7 +18160,6 @@ packages: /chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} - requiresBuild: true /chrome-trace-event@1.0.4: resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} @@ -18412,7 +18407,6 @@ packages: /color-support@1.1.3: resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} hasBin: true - requiresBuild: true /color@3.2.1: resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} @@ -18661,7 +18655,6 @@ packages: /console-control-strings@1.1.0: resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} - requiresBuild: true /consolidate@0.16.0(ejs@3.1.10)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-Nhl1wzCslqXYTJVDyJCu3ODohy9OfBMB5uD2BiBTzd7w+QY0lBzafkR8y8755yMYHAaMD4NuzbAw03/xzfw+eQ==} @@ -20012,7 +20005,6 @@ packages: /delegates@1.0.0: resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - requiresBuild: true /denque@2.1.0: resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} @@ -20061,7 +20053,6 @@ packages: /detect-libc@2.0.3: resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} engines: {node: '>=8'} - requiresBuild: true /detect-newline@4.0.1: resolution: {integrity: sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==} @@ -21234,8 +21225,8 @@ packages: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.12.1 - acorn-jsx: 5.3.2(acorn@8.12.1) + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) eslint-visitor-keys: 3.4.3 /esprima@2.7.3: @@ -22192,7 +22183,6 @@ packages: /fs-minipass@2.1.0: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} - requiresBuild: true dependencies: minipass: 3.3.6 @@ -22253,7 +22243,6 @@ packages: /gauge@3.0.2: resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} engines: {node: '>=10'} - requiresBuild: true dependencies: aproba: 2.0.0 color-support: 1.1.3 @@ -22542,7 +22531,6 @@ packages: /glob@5.0.15: resolution: {integrity: sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==} - deprecated: Glob versions prior to v9 are no longer supported dependencies: inflight: 1.0.6 inherits: 2.0.4 @@ -22565,7 +22553,6 @@ packages: /glob@7.1.7: resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} - deprecated: Glob versions prior to v9 are no longer supported dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -22577,7 +22564,6 @@ packages: /glob@7.2.0: resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - deprecated: Glob versions prior to v9 are no longer supported dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -22768,14 +22754,14 @@ packages: resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} engines: {node: '>=6'} - /hardhat-gas-reporter@1.0.10(hardhat@2.22.6): + /hardhat-gas-reporter@1.0.10(hardhat@2.22.7): resolution: {integrity: sha512-02N4+So/fZrzJ88ci54GqwVA3Zrf0C9duuTyGt0CFRIh/CdNwbnTgkXkRfojOMLBQ+6t+lBIkgbsOtqMvNwikA==} peerDependencies: hardhat: ^2.0.2 dependencies: array-uniq: 1.0.3 eth-gas-reporter: 0.2.27 - hardhat: 2.22.6(ts-node@9.1.1)(typescript@5.5.4) + hardhat: 2.22.7(ts-node@9.1.1)(typescript@5.5.4) sha1: 1.1.1 transitivePeerDependencies: - '@codechecks/client' @@ -22784,8 +22770,8 @@ packages: - utf-8-validate dev: false - /hardhat@2.22.6(ts-node@9.1.1)(typescript@5.5.4): - resolution: {integrity: sha512-abFEnd9QACwEtSvZZGSmzvw7N3zhQN1cDKz5SLHAupfG24qTHofCjqvD5kT5Wwsq5XOL0ON1Mq5rr4v0XX5ciw==} + /hardhat@2.22.7(ts-node@9.1.1)(typescript@5.5.4): + resolution: {integrity: sha512-nrXQAl+qUr75TsCLDo8P41YXLc+5U7qQMMCIrbbmy1/uQaVPncdjDrD5BR0CENvHRj7EBqO+JkofpozXoIfJKg==} hasBin: true peerDependencies: ts-node: '*' @@ -22798,7 +22784,7 @@ packages: dependencies: '@ethersproject/abi': 5.7.0 '@metamask/eth-sig-util': 4.0.1 - '@nomicfoundation/edr': 0.4.2 + '@nomicfoundation/edr': 0.5.0 '@nomicfoundation/ethereumjs-common': 4.0.4 '@nomicfoundation/ethereumjs-tx': 5.0.4 '@nomicfoundation/ethereumjs-util': 9.0.4 @@ -22894,7 +22880,6 @@ packages: /has-unicode@2.0.1: resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} - requiresBuild: true /has-yarn@2.1.0: resolution: {integrity: sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==} @@ -23175,7 +23160,6 @@ packages: /https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} - requiresBuild: true dependencies: agent-base: 6.0.2 debug: 4.3.5(supports-color@5.5.0) @@ -23253,7 +23237,7 @@ packages: /i18next@23.11.5: resolution: {integrity: sha512-41pvpVbW9rhZPk5xjCX2TPJi2861LEig/YRhUkY+1FQ2IQPS0bKUDYnEqY8XPPbB48h1uIwLnP9iiEfuSl20CA==} dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.24.7 /iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} @@ -23330,8 +23314,8 @@ packages: /import-in-the-middle@1.7.1: resolution: {integrity: sha512-1LrZPDtW+atAxH42S6288qyDFNQ2YCty+2mxEPRtfazH6Z5QwkaBSTS2ods7hnVJioF6rkRfNoA6A/MstpFXLg==} dependencies: - acorn: 8.12.1 - acorn-import-assertions: 1.9.0(acorn@8.12.1) + acorn: 8.11.3 + acorn-import-assertions: 1.9.0(acorn@8.11.3) cjs-module-lexer: 1.2.3 module-details-from-path: 1.0.3 dev: false @@ -25273,7 +25257,6 @@ packages: /make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} - requiresBuild: true dependencies: semver: 6.3.1 @@ -25768,7 +25751,6 @@ packages: /minipass@3.3.6: resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} engines: {node: '>=8'} - requiresBuild: true dependencies: yallist: 4.0.0 @@ -25780,7 +25762,6 @@ packages: /minipass@5.0.0: resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} engines: {node: '>=8'} - requiresBuild: true /minipass@7.0.4: resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} @@ -25794,7 +25775,6 @@ packages: /minizlib@2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} - requiresBuild: true dependencies: minipass: 3.3.6 yallist: 4.0.0 @@ -25822,12 +25802,11 @@ packages: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} hasBin: true - requiresBuild: true /mlly@1.6.1: resolution: {integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==} dependencies: - acorn: 8.12.1 + acorn: 8.11.3 pathe: 1.1.2 pkg-types: 1.0.3 ufo: 1.4.0 @@ -26356,7 +26335,6 @@ packages: resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} engines: {node: '>=6'} hasBin: true - requiresBuild: true dependencies: abbrev: 1.1.1 @@ -26434,7 +26412,6 @@ packages: /npmlog@5.0.1: resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} - requiresBuild: true dependencies: are-we-there-yet: 2.0.0 console-control-strings: 1.1.0 @@ -28739,6 +28716,19 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false + /rc-motion@2.9.1(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-QD4bUqByjVQs7PhUT1d4bNxvtTcK9ETwtg7psbDfo6TmYalH/1hhjj4r2hbhW7g5OOEqYHhfwfj4noIvuOVRtQ==} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + dependencies: + '@babel/runtime': 7.24.7 + classnames: 2.5.1 + rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: true + /rc-motion@2.9.2(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-fUAhHKLDdkAXIDLH0GYwof3raS58dtNUmzLF2MeiR8o6n4thNpSDQhOqQzWE4WfFZDCi9VEN8n7tiB7czREcyw==} peerDependencies: @@ -28946,9 +28936,9 @@ packages: react-dom: '*' dependencies: '@babel/runtime': 7.24.7 - '@rc-component/trigger': 2.2.0(react-dom@18.3.1)(react@18.3.1) + '@rc-component/trigger': 2.1.1(react-dom@18.3.1)(react@18.3.1) classnames: 2.5.1 - rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) + rc-motion: 2.9.1(react-dom@18.3.1)(react@18.3.1) rc-overflow: 1.3.2(react-dom@18.3.1)(react@18.3.1) rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) rc-virtual-list: 3.11.4(react-dom@18.3.1)(react@18.3.1) @@ -29170,7 +29160,7 @@ packages: dependencies: '@babel/runtime': 7.24.7 classnames: 2.5.1 - rc-motion: 2.9.2(react-dom@18.3.1)(react@18.3.1) + rc-motion: 2.9.1(react-dom@18.3.1)(react@18.3.1) rc-util: 5.43.0(react-dom@18.3.1)(react@18.3.1) rc-virtual-list: 3.14.2(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 @@ -30304,7 +30294,6 @@ packages: /rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} hasBin: true - requiresBuild: true dependencies: glob: 7.2.3 @@ -30647,7 +30636,6 @@ packages: /semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - requiresBuild: true /semver@7.3.7: resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==} @@ -30806,7 +30794,6 @@ packages: wkx: 0.5.0 transitivePeerDependencies: - supports-color - dev: true /serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} @@ -30984,7 +30971,6 @@ packages: /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - requiresBuild: true /signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} @@ -31141,7 +31127,7 @@ packages: - debug dev: false - /solidity-coverage@0.8.12(hardhat@2.22.6): + /solidity-coverage@0.8.12(hardhat@2.22.7): resolution: {integrity: sha512-8cOB1PtjnjFRqOgwFiD8DaUsYJtVJ6+YdXQtSZDrLGf8cdhhh8xzTtGzVTGeBf15kTv0v7lYPJlV/az7zLEPJw==} hasBin: true peerDependencies: @@ -31156,7 +31142,7 @@ packages: ghost-testrpc: 0.0.2 global-modules: 2.0.0 globby: 10.0.2 - hardhat: 2.22.6(ts-node@9.1.1)(typescript@5.5.4) + hardhat: 2.22.7(ts-node@9.1.1)(typescript@5.5.4) jsonschema: 1.4.1 lodash: 4.17.21 mocha: 10.7.0 @@ -32165,7 +32151,6 @@ packages: /tar@6.2.1: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} - requiresBuild: true dependencies: chownr: 2.0.0 fs-minipass: 2.1.0 @@ -32544,7 +32529,7 @@ packages: '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 '@types/node': 20.14.2 - acorn: 8.12.1 + acorn: 8.11.3 acorn-walk: 8.3.2 arg: 4.1.3 create-require: 1.1.1 @@ -34401,7 +34386,6 @@ packages: /wide-align@1.1.5: resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} - requiresBuild: true dependencies: string-width: 4.2.3