feat: oneClick to publish WeChat public account tweets (#1417)
Reviewed-on: daoyoucloud/tachybase#1417 Reviewed-by: sealday <zhanglin@daoyoucloud.com> Co-authored-by: luliangqiang <2650321653@qq.com> Co-committed-by: luliangqiang <2650321653@qq.com>
This commit is contained in:
parent
90ce46221b
commit
59322447dc
@ -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": {
|
||||
|
@ -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)}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
208
pnpm-lock.yaml
208
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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user