Simon Lee 3 weeks ago
parent
commit
cf57aa5aa9
7 changed files with 566 additions and 2 deletions
  1. 249
    0
      POC/spf-init.ts
  2. 23
    0
      POC/test.ts
  3. 14
    0
      POC/test2.ts
  4. 159
    0
      POC/test3.ts
  5. 24
    0
      POC/trest.ts
  6. 1
    0
      package.json
  7. 96
    2
      yarn.lock

+ 249
- 0
POC/spf-init.ts View File

@@ -0,0 +1,249 @@
//

import {toUtf8String,parseUnits,ContractFactory, parseEther,JsonRpcProvider, ethers ,Contract, JsonRpcSigner, Wallet,ContractTransactionResponse, MaxInt256
,Transaction,formatEther,
decodeBase64
} from 'ethers'
import { connect } from 'http2';

const PF_TOKEN_ABI = [
"function mint(address to, uint256 amount) external",
"function transfer(address to, uint256 amount) external returns (bool)",
"function batchMint(address[] calldata recipients, uint256[] calldata amounts) external",
"function balanceOf(address account) external view returns (uint256)",
"function totalSupply() external view returns (uint256)",
"function name() external view returns (string)",
"function symbol() external view returns (string)",
"function decimals() external view returns (uint8)",
"function hasRole(bytes32 role, address account) external view returns (bool)",
"event TokensMinted(address indexed to, uint256 amount, address indexed minter)",

"function recordInterestPayment(uint256 amount) external",
];

const SHS_ADDRESS="0x306f182eEdfe85d61aC2eA88acE58f565edf3DFe";
const SHS_PRIVATE_KEY="0x3221ea02f27a2929f3a7ec75f5cac6f8207eb910a66f7e31d6391143dfbef5bf";
const MASSET_ADDESS="0xDfc4dB2811a325DDd296C55D7A4055eD3bdB391D";
const MASSET_PRIVATE_KEY="0x920a8a7f062b2f31da7bea211af1a5c0adb316e32301040c19d1d3748d6b7ab0";


//TR_A
// export const SPF_CONTRACT_ADDRESS =
// "0x4e4637E3199E8a11a6dDafF64F1DCc8c7C2Aab36"; // sPF 주소
// export const SPF_CONTRACT_ADDRESS =
// "0x3B24bfdD5D52d4b25EE5812F35334A831ecA553d"; // sPF 주소 (이자함수포함)

//TR_B
// export const SPF_CONTRACT_ADDRESS =
// "0xa1b2A55AEaEf5093fc9b04438Dc194C3B631f118"; // sPF 주소
export const SPF_CONTRACT_ADDRESS =
"0xaB72Fe1511ac371E369DFf3B0f6Bba23198baFD2"; // sPF 주소 (이자함수포함)


const PULSE_RPC_URL = "https://secuchain.testnet.stopulse.co.kr/";


// export const SOL_ADDRESS = "0x8DFeB78ecEe391149b1c2739cEd0f6992D0a5663";
// const PRIVATE_KEY =
// "0x47c496fe62e38aebcf4c5298cdae6889efed27b308fb473311d4a209e512f20e";

const PULSE_PRIVATE_KEY =
"0xcd2336d7c471a0f2f1da77e91bcaf71e96e40481415bdb062152b4d045e1702c";

const provider = new ethers.JsonRpcProvider(PULSE_RPC_URL);
const wallet = new ethers.Wallet(SHS_PRIVATE_KEY, provider);
const wallet2 = new ethers.Wallet(MASSET_PRIVATE_KEY, provider);
const walletAdmin = new ethers.Wallet(PULSE_PRIVATE_KEY, provider);

const contractAdmin = new ethers.Contract(
SPF_CONTRACT_ADDRESS,
PF_TOKEN_ABI,
walletAdmin
);
const contract = new ethers.Contract(
SPF_CONTRACT_ADDRESS,
PF_TOKEN_ABI,
wallet
);


function getNewPrivateKey(){
const newWallet = ethers.Wallet.createRandom();
const wallet = new ethers.Wallet(newWallet.privateKey, provider);

console.log(newWallet.address);
console.log(newWallet.privateKey);
return newWallet.privateKey;
}
async function setup() {

// await mintToAddress(SHS_ADDRESS, "30000000000");
await mintToAddress(MASSET_ADDESS, "16000000000");

}



async function view() {
// const precision = await mmfToken.getNAVPrecision();
const precision = await contract.getNAVPrecision();
console.log(precision.toString());


const currentNAV = await contract.currentNAV();
console.log(currentNAV.toString());

const balance = await contract.balanceOf(SHS_ADDRESS);

console.log(`balance = ${balance.toString()}}`);
}



/**
* 특정 주소에 원하는 만큼 SPF 토큰을 minting하는 함수
* @param toAddress - 토큰을 받을 주소
* @param amount - minting할 토큰 양 (ether 단위)
*/
async function mintToAddress(toAddress: string, amount: string) {
console.log(`Minting ${amount} SPF tokens to ${toAddress}...`);

const tx = await contractAdmin.mint(
toAddress,
ethers.parseEther(amount),
{
gasLimit: 500000,
gasPrice: 0,
}
);

await tx.wait(1);
console.log(`Successfully minted ${amount} SPF tokens to ${toAddress}`);

// 잔액 확인
const balance = await contractAdmin.balanceOf(toAddress);
console.log(`New balance: ${ethers.formatEther(balance)} SPF`);
}

/**
* 특정 주소의 SPF 토큰을 burn하는 함수 (dead address로 전송)
* @param fromAddress - 토큰을 burn할 주소 (이 주소의 private key를 가진 wallet 필요)
* @param amount - burn할 토큰 양 (ether 단위)
* @param privateKey - fromAddress의 private key
*/
async function burnFromAddress(fromAddress: string, amount: string, privateKey: string) {
const DEAD_ADDRESS = "0x000000000000000000000000000000000000dEaD";
console.log(`Burning ${amount} SPF tokens from ${fromAddress} to dead address...`);

// burn할 주소의 wallet 생성
const burnerWallet = new ethers.Wallet(privateKey, provider);
const burnerContract = new ethers.Contract(
SPF_CONTRACT_ADDRESS,
PF_TOKEN_ABI,
burnerWallet
);

const tx = await burnerContract.transfer(
DEAD_ADDRESS,
ethers.parseEther(amount),
{
gasLimit: 500000,
gasPrice: 0,
}
);

await tx.wait(1);
console.log(`Successfully burned ${amount} SPF tokens from ${fromAddress}`);

// 잔액 확인
const balance = await burnerContract.balanceOf(fromAddress);
console.log(`Remaining balance: ${ethers.formatEther(balance)} SPF`);
}

/**
* SPF 토큰을 특정 주소에서 다른 주소로 전송하는 함수
* @param fromAddress - 토큰을 보낼 주소
* @param toAddress - 토큰을 받을 주소
* @param amount - 전송할 토큰 양 (ether 단위)
* @param privateKey - fromAddress의 private key
*/
async function transferToken(fromAddress: string, toAddress: string, amount: string, privateKey: string) {
console.log(`Transferring ${amount} SPF tokens from ${fromAddress} to ${toAddress}...`);

// 전송할 주소의 wallet 생성
const senderWallet = new ethers.Wallet(privateKey, provider);
const senderContract = new ethers.Contract(
SPF_CONTRACT_ADDRESS,
PF_TOKEN_ABI,
senderWallet
);

// 전송 전 잔액 확인
const beforeBalance = await senderContract.balanceOf(fromAddress);
console.log(`Current balance: ${ethers.formatEther(beforeBalance)} SPF`);

const amountWei = ethers.parseEther(amount);

if (beforeBalance < amountWei) {
throw new Error(`Insufficient balance. Have: ${ethers.formatEther(beforeBalance)} SPF, Need: ${amount} SPF`);
}

const tx = await senderContract.transfer(
toAddress,
amountWei,
{
gasLimit: 500000,
gasPrice: 0,
}
);

await tx.wait(1);
console.log(`Successfully transferred ${amount} SPF tokens from ${fromAddress} to ${toAddress}`);

// 양쪽 주소의 잔액 확인
const fromBalance = await senderContract.balanceOf(fromAddress);
const toBalance = await senderContract.balanceOf(toAddress);
console.log(`From address balance: ${ethers.formatEther(fromBalance)} SPF`);
console.log(`To address balance: ${ethers.formatEther(toBalance)} SPF`);
}

async function recordInterestPayment(amount: string) {
console.log(`Recording interest payment of ${amount} SPF...`);

console.log(`payInterest of ${amount} ...`);

const tx = await contractAdmin.recordInterestPayment(
ethers.parseEther(amount),
{
gasLimit: 500000,
gasPrice: 0,
}
);

await tx.wait(1);
console.log(`Successfully payed ${amount} of interests`);
}

async function main() {
// recordInterestPayment("750000000");

// recordInterestPayment("1200000000");

// await setup();

// await transferToken(SHS_ADDRESS,MASSET_ADDESS,"300000",SHS_PRIVATE_KEY);

//await setNav();
// await view();

// getNewPrivateKey();
// getNewPrivateKey();

}



main();

+ 23
- 0
POC/test.ts View File

@@ -0,0 +1,23 @@
import { AlchemyProvider, Wallet } from 'ethers';

// 1. 네트워크와 API 키 설정
const network = 'matic-amoy'; // Polygon Amoy 테스트넷
const alchemyApiKey = 'o5F9YD_LHZZEde-gXzZyv'; // 여기에 본인의 API 키 입력

// 2. Alchemy Provider 생성
const provider = new AlchemyProvider(network, alchemyApiKey);

// 3. 지갑 연결 (테스트용 private key 사용)
const privateKey = 'ccb3131e009c579f16e6088f89218744f670e9b09c28514c671d5ae239f0c532'; // 절대 실제 자산이 있는 키 사용 금지!
const wallet = new Wallet(privateKey, provider);

// 4. 예제: 지갑 주소와 잔액 출력
async function main() {
const address = await wallet.getAddress();
const balance = await provider.getBalance(address);
console.log(`🪪 Address: ${address}`);
console.log(`🪪 Balance: ${balance}`);
//console.log(`💰 Balance: ${ethers.formatEther(balance)} MATIC`);
}

main().catch(console.error);

+ 14
- 0
POC/test2.ts View File

@@ -0,0 +1,14 @@


import Web3 from 'web3';
const web3 = new Web3();

async function MathInterface() {

const contract = new web3.eth.Contract(ABI, "0xc4cce39ae1e0006b811101b619d627448e5a342b");
const uri = await contract.methods.tokenURI(9).call();
console.log(uri);

}



+ 159
- 0
POC/test3.ts View File

@@ -0,0 +1,159 @@
import {toUtf8String,parseUnits,ContractFactory, parseEther,JsonRpcProvider, ethers ,Contract, JsonRpcSigner, Wallet,ContractTransactionResponse, MaxInt256
,Transaction,formatEther,
decodeBase64
} from 'ethers'
import { connect } from 'http2';

const MMF_ABI = [
// ========== ERC20 기본 함수 ==========
"function name() view returns (string)",
"function symbol() view returns (string)",
"function decimals() view returns (uint8)",
"function totalSupply() view returns (uint256)",
"function balanceOf(address account) view returns (uint256)",
"function transfer(address to, uint256 amount) returns (bool)",
"function allowance(address owner, address spender) view returns (uint256)",
"function approve(address spender, uint256 amount) returns (bool)",
"function transferFrom(address from, address to, uint256 amount) returns (bool)",

// ========== Share-Based 함수 ==========
"function sharesOf(address account) view returns (uint256)",
"function getSharesByTokenAmount(uint256 tokenAmount) view returns (uint256)",
"function getTokenAmountByShares(uint256 shareAmount) view returns (uint256)",

// ========== Purchase 함수 ==========
"function purchaseWithDT(address buyer, uint256 dtAmount) returns (uint256)",
"function processPendingPurchase(address buyer, uint256 index) returns (bool)",

// ========== Redemption 함수 ==========
"function redeemToDT(uint256 tokenAmount) returns (uint256)",
"function redeemAll() returns (uint256)",

// ========== NAV & Rebase 함수 ==========
"function currentNAV() view returns (uint256)",
"function updateNAVAndRebase(uint256 newNAV) returns (bool)",
"function lastNAVUpdateTime() view returns (uint256)",
"function lastRebaseTime() view returns (uint256)",
"function totalRebaseAmount() view returns (uint256)",
"function getNAVDecimal() view returns (uint256, uint256)",

// ========== Lockup 함수 ==========
"function lockupUntil(address) view returns (uint256)",
"function defaultLockupPeriod() view returns (uint256)",
"function getLockupTimeRemaining(address user) view returns (uint256)",

// ========== Pending Purchase 함수 ==========
"function getPendingPurchaseCount(address user) view returns (uint256)",
"function getPendingPurchase(address user, uint256 index) view returns (uint256 dtAmount, uint256 timestamp, uint256 navAtPurchase, bool processed)",

// ========== Access Control 함수 ==========
"function hasRole(bytes32 role, address account) view returns (bool)",
"function paused() view returns (bool)",

// ========== Admin 함수 ==========
"function setDTTokenAddress(address _dtTokenAddress)",
"function setDefaultLockupPeriod(uint256 period)",
"function setUserLockup(address user, uint256 until)",
"function pause()",
"function unpause()",

"function updateNAVWithDecimals(uint256 value, uint256 decimalPlaces) external returns (bool)",

"function getNAVPrecision() external pure returns (uint256)",

// ========== Events ==========
"event Transfer(address indexed from, address indexed to, uint256 value)",
"event Approval(address indexed owner, address indexed spender, uint256 value)",
"event TokensPurchased(address indexed buyer, uint256 dtAmount, uint256 tokenAmount, uint256 nav, uint256 timestamp)",
"event TokensRedeemed(address indexed redeemer, uint256 tokenAmount, uint256 dtAmount, uint256 nav, uint256 timestamp)",
"event NAVUpdated(uint256 oldNAV, uint256 newNAV, uint256 timestamp, address updater)",
"event Rebased(uint256 oldTotalSupply, uint256 newTotalSupply, int256 rebaseAmount, uint256 nav, uint256 timestamp)",
"event LockupUpdated(address indexed user, uint256 lockupUntil)",
"event PurchasePending(address indexed buyer, uint256 dtAmount, uint256 nav, uint256 timestamp)",
"event PurchaseProcessed(address indexed buyer, uint256 index, uint256 timestamp)",

];

export const SMMF_CONTRACT_ADDRESS =
"0xC290e84BE1886a08760b3468D4C3083A36C17a21"; // sMMF 주소

const PULSE_RPC_URL = "https://secuchain.testnet.stopulse.co.kr/";


export const SOL_ADDRESS = "0x8DFeB78ecEe391149b1c2739cEd0f6992D0a5663";
const PRIVATE_KEY =
"0x47c496fe62e38aebcf4c5298cdae6889efed27b308fb473311d4a209e512f20e";

const PULSE_PRIVATE_KEY =
"0xcd2336d7c471a0f2f1da77e91bcaf71e96e40481415bdb062152b4d045e1702c";

const provider = new ethers.JsonRpcProvider(PULSE_RPC_URL);
const wallet = new ethers.Wallet(PRIVATE_KEY, provider);
const walletAdmin = new ethers.Wallet(PULSE_PRIVATE_KEY, provider);

const contractAdmin = new ethers.Contract(
SMMF_CONTRACT_ADDRESS,
MMF_ABI,
walletAdmin
);
const contract = new ethers.Contract(
SMMF_CONTRACT_ADDRESS,
MMF_ABI,
wallet
);

async function setup() {
const amount = "1000000000";

let tx = await contractAdmin.purchaseWithDT(
SOL_ADDRESS,
ethers.parseEther(amount),
{
gasLimit: 500000, // 가스 한도 증가
gasPrice: 0,
}
);
await tx.wait(1);

const currentNAV = await contractAdmin.currentNAV();
console.log(currentNAV.toString());

// const balance = await mmfToken.balanceOf(userA.address);
const balance = await contractAdmin.balanceOf(SOL_ADDRESS);

console.log(`balance = ${balance.toString()}}`);

}

async function setNav() {
await contractAdmin.updateNAVWithDecimals(10002365, 7);
}

async function view() {

// const precision = await mmfToken.getNAVPrecision();

const precision = await contract.getNAVPrecision();
console.log(`precision = : ${precision.toString()}`);


const currentNAV = await contract.currentNAV();
console.log(`currentNAV = : ${ currentNAV.toString()}`);

const balance = await contract.balanceOf(SOL_ADDRESS);

console.log(`balance = ${balance.toString()}}`);
}
async function main() {
//await setup();
//await setNav();
await view();

}



main();

+ 24
- 0
POC/trest.ts View File

@@ -0,0 +1,24 @@
import { createPublicClient, http, Block } from "viem";
import { polygonAmoy } from "viem/chains";






async function main() {
const client = createPublicClient({
chain: polygonAmoy,
transport: http("https://polygon-amoy.g.alchemy.com/v2/o5F9YD_LHZZEde-gXzZyv"),
});
const block: Block = await client.getBlock({
blockNumber: 123456n,
});

console.log(block);
}


main();



+ 1
- 0
package.json View File

@@ -16,6 +16,7 @@
"ethers": "^6.13.4",
"hardhat-ethers": "^1.0.1",
"typescript": "^5.6.3",
"viem": "^2.36.0",
"web3": "^4.16.0"
},
"devDependencies": {

+ 96
- 2
yarn.lock View File

@@ -12,7 +12,7 @@
resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz#63430d04bd8c5e74f8d7d049338f1cd9d4f02069"
integrity sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==

"@adraffy/ens-normalize@^1.8.8":
"@adraffy/ens-normalize@^1.11.0", "@adraffy/ens-normalize@^1.8.8":
version "1.11.0"
resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.11.0.tgz#42cc67c5baa407ac25059fcd7d405cc5ecdb0c33"
integrity sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==
@@ -469,6 +469,11 @@
tweetnacl "^1.0.3"
tweetnacl-util "^0.15.1"

"@noble/ciphers@^1.3.0":
version "1.3.0"
resolved "https://registry.yarnpkg.com/@noble/ciphers/-/ciphers-1.3.0.tgz#f64b8ff886c240e644e5573c097f86e5b43676dc"
integrity sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==

"@noble/curves@1.2.0", "@noble/curves@~1.2.0":
version "1.2.0"
resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.2.0.tgz#92d7e12e4e49b23105a2555c6984d41733d65c35"
@@ -483,6 +488,20 @@
dependencies:
"@noble/hashes" "1.4.0"

"@noble/curves@1.9.6":
version "1.9.6"
resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.9.6.tgz#b45ebedca85bb75782f6be7e7f120f0c423c99e0"
integrity sha512-GIKz/j99FRthB8icyJQA51E8Uk5hXmdyThjgQXRKiv9h0zeRlzSCLIzFw6K1LotZ3XuB7yzlf76qk7uBmTdFqA==
dependencies:
"@noble/hashes" "1.8.0"

"@noble/curves@^1.9.1", "@noble/curves@~1.9.0":
version "1.9.7"
resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.9.7.tgz#79d04b4758a43e4bca2cbdc62e7771352fa6b951"
integrity sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==
dependencies:
"@noble/hashes" "1.8.0"

"@noble/hashes@1.2.0", "@noble/hashes@~1.2.0":
version "1.2.0"
resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.2.0.tgz#a3150eeb09cc7ab207ebf6d7b9ad311a9bdbed12"
@@ -498,6 +517,11 @@
resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426"
integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==

"@noble/hashes@1.8.0", "@noble/hashes@^1.8.0", "@noble/hashes@~1.8.0":
version "1.8.0"
resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.8.0.tgz#cee43d801fcef9644b11b8194857695acd5f815a"
integrity sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==

"@noble/hashes@^1.4.0":
version "1.5.0"
resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.5.0.tgz#abadc5ca20332db2b1b2aa3e496e9af1213570b0"
@@ -817,6 +841,11 @@
resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.9.tgz#e5e142fbbfe251091f9c5f1dd4c834ac04c3dbd1"
integrity sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==

"@scure/base@~1.2.5":
version "1.2.6"
resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.2.6.tgz#ca917184b8231394dd8847509c67a0be522e59f6"
integrity sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==

"@scure/bip32@1.1.5":
version "1.1.5"
resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.5.tgz#d2ccae16dcc2e75bc1d75f5ef3c66a338d1ba300"
@@ -844,6 +873,15 @@
"@noble/hashes" "~1.4.0"
"@scure/base" "~1.1.6"

"@scure/bip32@1.7.0", "@scure/bip32@^1.7.0":
version "1.7.0"
resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.7.0.tgz#b8683bab172369f988f1589640e53c4606984219"
integrity sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==
dependencies:
"@noble/curves" "~1.9.0"
"@noble/hashes" "~1.8.0"
"@scure/base" "~1.2.5"

"@scure/bip39@1.1.1":
version "1.1.1"
resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.1.tgz#b54557b2e86214319405db819c4b6a370cf340c5"
@@ -868,6 +906,14 @@
"@noble/hashes" "~1.4.0"
"@scure/base" "~1.1.6"

"@scure/bip39@1.6.0", "@scure/bip39@^1.6.0":
version "1.6.0"
resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.6.0.tgz#475970ace440d7be87a6086cbee77cb8f1a684f9"
integrity sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==
dependencies:
"@noble/hashes" "~1.8.0"
"@scure/base" "~1.2.5"

"@sentry/core@5.30.0":
version "5.30.0"
resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3"
@@ -1080,6 +1126,16 @@ abitype@1.0.0:
resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.0.tgz#237176dace81d90d018bebf3a45cb42f2a2d9e97"
integrity sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ==

abitype@1.0.8:
version "1.0.8"
resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.8.tgz#3554f28b2e9d6e9f35eb59878193eabd1b9f46ba"
integrity sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==

abitype@^1.0.8:
version "1.0.9"
resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.9.tgz#f66940f69caf2b6c190088a017e289dbe41090a6"
integrity sha512-oN0S++TQmlwWuB+rkA6aiEefLv3SP+2l/tC5mux/TLj6qdA6rF15Vbpex4fHovLsMkwLwTIRj8/Q8vXCS3GfOg==

acorn-walk@^8.1.1:
version "8.3.4"
resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7"
@@ -2075,7 +2131,7 @@ ethjs-util@0.1.6, ethjs-util@^0.1.6:
is-hex-prefixed "1.0.0"
strip-hex-prefix "1.0.0"

eventemitter3@^5.0.1:
eventemitter3@5.0.1, eventemitter3@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4"
integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==
@@ -2837,6 +2893,11 @@ isows@1.0.3:
resolved "https://registry.yarnpkg.com/isows/-/isows-1.0.3.tgz#93c1cf0575daf56e7120bab5c8c448b0809d0d74"
integrity sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg==

isows@1.0.7:
version "1.0.7"
resolved "https://registry.yarnpkg.com/isows/-/isows-1.0.7.tgz#1c06400b7eed216fbba3bcbd68f12490fc342915"
integrity sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==

jackspeak@^3.1.2:
version "3.4.3"
resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a"
@@ -3233,6 +3294,20 @@ os-tmpdir@~1.0.2:
resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==

ox@0.9.1:
version "0.9.1"
resolved "https://registry.yarnpkg.com/ox/-/ox-0.9.1.tgz#d3300afe70c5b2ec50a9df3097f8bb0523b306a5"
integrity sha512-NVI0cajROntJWtFnxZQ1aXDVy+c6DLEXJ3wwON48CgbPhmMJrpRTfVbuppR+47RmXm3lZ/uMaKiFSkLdAO1now==
dependencies:
"@adraffy/ens-normalize" "^1.11.0"
"@noble/ciphers" "^1.3.0"
"@noble/curves" "^1.9.1"
"@noble/hashes" "^1.8.0"
"@scure/bip32" "^1.7.0"
"@scure/bip39" "^1.6.0"
abitype "^1.0.8"
eventemitter3 "5.0.1"

p-limit@^3.0.2:
version "3.1.0"
resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b"
@@ -4104,6 +4179,20 @@ viem@2.7.14:
isows "1.0.3"
ws "8.13.0"

viem@^2.36.0:
version "2.36.0"
resolved "https://registry.yarnpkg.com/viem/-/viem-2.36.0.tgz#e564484018c6e4432dfa936fdda4ca585008d4f7"
integrity sha512-Xz7AkGtR43K+NY74X2lBevwfRrsXuifGUzt8QiULO47NXIcT7g3jcA4nIvl5m2OTE5v8SlzishwXmg64xOIVmQ==
dependencies:
"@noble/curves" "1.9.6"
"@noble/hashes" "1.8.0"
"@scure/bip32" "1.7.0"
"@scure/bip39" "1.6.0"
abitype "1.0.8"
isows "1.0.7"
ox "0.9.1"
ws "8.18.3"

web3-core@^4.4.0, web3-core@^4.5.0, web3-core@^4.6.0, web3-core@^4.7.1:
version "4.7.1"
resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-4.7.1.tgz#bc56cd7959fe44ee77139d591211f69851140009"
@@ -4462,6 +4551,11 @@ ws@8.17.1:
resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b"
integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==

ws@8.18.3:
version "8.18.3"
resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.3.tgz#b56b88abffde62791c639170400c93dcb0c95472"
integrity sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==

ws@^7.4.6:
version "7.5.10"
resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9"

Loading…
Cancel
Save