From 758020cb026f48c09c9c9beed630901551e963e6 Mon Sep 17 00:00:00 2001 From: open-junius Date: Fri, 14 Nov 2025 15:22:49 +0800 Subject: [PATCH 1/5] add getProxies in precompile --- evm-tests/package.json | 2 +- evm-tests/src/contracts/proxy.ts | 19 +++ evm-tests/test/pure-proxy.precompile.test.ts | 50 +++++- precompiles/src/proxy.rs | 19 +++ precompiles/src/solidity/proxy.abi | 160 +++++++++++++++++++ precompiles/src/solidity/proxy.sol | 38 +++-- 6 files changed, 268 insertions(+), 20 deletions(-) create mode 100644 precompiles/src/solidity/proxy.abi diff --git a/evm-tests/package.json b/evm-tests/package.json index ae756ae55f..653ea3fbdf 100644 --- a/evm-tests/package.json +++ b/evm-tests/package.json @@ -1,6 +1,6 @@ { "scripts": { - "test": "mocha --timeout 999999 --retries 3 --file src/setup.ts --require ts-node/register test/*test.ts" + "test": "mocha --timeout 999999 --retries 3 --file src/setup.ts --require ts-node/register test/pure*test.ts" }, "keywords": [], "author": "", diff --git a/evm-tests/src/contracts/proxy.ts b/evm-tests/src/contracts/proxy.ts index 48ffd0a50f..34578fa0f9 100644 --- a/evm-tests/src/contracts/proxy.ts +++ b/evm-tests/src/contracts/proxy.ts @@ -144,5 +144,24 @@ export const IProxyABI = [ "outputs": [], "stateMutability": "nonpayable", "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "account", + "type": "bytes32" + } + ], + "name": "getProxies", + "outputs": [ + { + "internalType": "bytes32[]", + "name": "", + "type": "bytes32[]" + } + ], + "stateMutability": "view", + "type": "function" } ]; diff --git a/evm-tests/test/pure-proxy.precompile.test.ts b/evm-tests/test/pure-proxy.precompile.test.ts index 1a34b02cf7..202f87466e 100644 --- a/evm-tests/test/pure-proxy.precompile.test.ts +++ b/evm-tests/test/pure-proxy.precompile.test.ts @@ -130,29 +130,34 @@ describe("Test pure proxy precompile", () => { const proxies = await api.query.Proxy.Proxies.getValue(convertH160ToSS58(evmWallet2.address)) const contract = new ethers.Contract(IPROXY_ADDRESS, IProxyABI, evmWallet2) + const proxiesFromContract = await contract.getProxies(convertH160ToPublicKey(evmWallet2.address)) + assert.equal(proxiesFromContract.length, proxies[0].length, "proxies length should be equal") + const type = 0; const delay = 0; const tx = await contract.addProxy(convertH160ToPublicKey(evmWallet3.address), type, delay) await tx.wait() - const proxiesAfterAdd = await await api.query.Proxy.Proxies.getValue(convertH160ToSS58(evmWallet2.address)) + const proxiesList = proxiesAfterAdd[0].map(proxy => proxy.delegate) + const proxiesFromContractAfterAdd = await contract.getProxies(convertH160ToPublicKey(evmWallet2.address)) + assert.equal(proxiesFromContractAfterAdd.length, proxiesList.length, "proxy length should be equal") - const length = proxiesAfterAdd[0].length - assert.equal(length, proxies[0].length + 1, "proxy should be set") - const proxy = proxiesAfterAdd[0][proxiesAfterAdd[0].length - 1] - - assert.equal(proxy.delegate, convertH160ToSS58(evmWallet3.address), "proxy should be set") + for (let index = 0; index < proxiesFromContractAfterAdd.length; index++) { + let proxySs58 = convertPublicKeyToSs58(proxiesFromContractAfterAdd[index]) + assert.ok(proxiesList.includes(proxySs58), "proxy should be set") + } + assert.equal(proxiesList.length, proxies[0].length + 1, "proxy should be set") + const proxy = proxiesList[proxiesList.length - 1] + assert.equal(proxy, convertH160ToSS58(evmWallet3.address), "proxy should be set") const balance = (await api.query.System.Account.getValue(convertPublicKeyToSs58(receiver.publicKey))).data.free const amount = 1000000000; const contract2 = new ethers.Contract(IPROXY_ADDRESS, IProxyABI, evmWallet3) - - const callCode = await getTransferCallCode(api, receiver, amount) const tx2 = await contract2.proxyCall(convertH160ToPublicKey(evmWallet2.address), [type], callCode) await tx2.wait() @@ -160,4 +165,33 @@ describe("Test pure proxy precompile", () => { const balanceAfter = (await api.query.System.Account.getValue(convertPublicKeyToSs58(receiver.publicKey))).data.free assert.equal(balanceAfter, balance + BigInt(amount), "balance should be increased") }) + + it("Call addProxy many times, then check getProxies is correct", async () => { + const proxies = await api.query.Proxy.Proxies.getValue(convertH160ToSS58(evmWallet2.address)) + const contract = new ethers.Contract(IPROXY_ADDRESS, IProxyABI, evmWallet2) + + const proxiesFromContract = await contract.getProxies(convertH160ToPublicKey(evmWallet2.address)) + assert.equal(proxiesFromContract.length, proxies[0].length, "proxies length should be equal") + + const type = 0; + const delay = 0; + + for (let i = 0; i < 5; i++) { + const evmWallet = generateRandomEthersWallet() + const tx = await contract.addProxy(convertH160ToPublicKey(evmWallet.address), type, delay) + await tx.wait() + } + + const proxiesAfterAdd = await await api.query.Proxy.Proxies.getValue(convertH160ToSS58(evmWallet2.address)) + const proxiesList = proxiesAfterAdd[0].map(proxy => proxy.delegate) + + const proxiesFromContractAfterAdd = await contract.getProxies(convertH160ToPublicKey(evmWallet2.address)) + + assert.equal(proxiesFromContractAfterAdd.length, proxiesList.length, "proxy length should be equal") + + for (let index = 0; index < proxiesFromContractAfterAdd.length; index++) { + let proxySs58 = convertPublicKeyToSs58(proxiesFromContractAfterAdd[index]) + assert.ok(proxiesList.includes(proxySs58), "proxy should be set") + } + }) }); diff --git a/precompiles/src/proxy.rs b/precompiles/src/proxy.rs index 1399177766..b723e63f00 100644 --- a/precompiles/src/proxy.rs +++ b/precompiles/src/proxy.rs @@ -15,6 +15,7 @@ use sp_runtime::{ traits::{Dispatchable, StaticLookup}, }; use sp_std::boxed::Box; +use sp_std::vec; use sp_std::vec::Vec; use subtensor_runtime_common::ProxyType; pub struct ProxyPrecompile(PhantomData); @@ -239,4 +240,22 @@ where handle.try_dispatch_runtime_call::(call, RawOrigin::Signed(account_id)) } + + #[precompile::public("getProxies(bytes32)")] + #[precompile::view] + pub fn get_proxies( + _handle: &mut impl PrecompileHandle, + account_id: H256, + ) -> EvmResult> { + let account_id = R::AccountId::from(account_id.0.into()); + + let proxies = pallet_proxy::pallet::Pallet::::proxies(account_id); + let mut result: Vec = vec![]; + for proxy in proxies.0 { + let delegate: [u8; 32] = proxy.delegate.into(); + result.push(delegate.into()); + } + + Ok(result) + } } diff --git a/precompiles/src/solidity/proxy.abi b/precompiles/src/solidity/proxy.abi new file mode 100644 index 0000000000..f557b54606 --- /dev/null +++ b/precompiles/src/solidity/proxy.abi @@ -0,0 +1,160 @@ +[ + { + "type": "function", + "name": "createPureProxy", + "inputs": [ + { + "name": "proxy_type", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "delay", + "type": "uint32", + "internalType": "uint32" + }, + { + "name": "index", + "type": "uint16", + "internalType": "uint16" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "proxyCall", + "inputs": [ + { + "name": "real", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "force_proxy_type", + "type": "uint8[]", + "internalType": "uint8[]" + }, + { + "name": "call", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "killPureProxy", + "inputs": [ + { + "name": "spawner", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "proxy_type", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "index", + "type": "uint16", + "internalType": "uint16" + }, + { + "name": "height", + "type": "uint16", + "internalType": "uint16" + }, + { + "name": "ext_index", + "type": "uint32", + "internalType": "uint32" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "addProxy", + "inputs": [ + { + "name": "delegate", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "proxy_type", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "delay", + "type": "uint32", + "internalType": "uint32" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "removeProxy", + "inputs": [ + { + "name": "delegate", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "proxy_type", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "delay", + "type": "uint32", + "internalType": "uint32" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "removeProxies", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "pokeDeposit", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "getProxies", + "inputs": [ + { + "name": "account", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "bytes32[]", + "internalType": "bytes32[]" + } + ], + "stateMutability": "view" + } +] diff --git a/precompiles/src/solidity/proxy.sol b/precompiles/src/solidity/proxy.sol index b0e03031bf..560742d93d 100644 --- a/precompiles/src/solidity/proxy.sol +++ b/precompiles/src/solidity/proxy.sol @@ -5,26 +5,42 @@ address constant IPROXY_ADDRESS = 0x000000000000000000000000000000000000080b; interface IProxy { function createPureProxy( - uint8 proxy_type, - uint32 delay, - uint16 index + uint8 proxy_type, + uint32 delay, + uint16 index ) external; - function proxyCall(bytes32 real, uint8[] memory force_proxy_type, bytes memory call) external; + function proxyCall( + bytes32 real, + uint8[] memory force_proxy_type, + bytes memory call + ) external; function killPureProxy( - bytes32 spawner, - uint8 proxy_type, - uint16 index, - uint16 height, - uint32 ext_index + bytes32 spawner, + uint8 proxy_type, + uint16 index, + uint16 height, + uint32 ext_index ) external; - function addProxy(bytes32 delegate, uint8 proxy_type, uint32 delay) external; + function addProxy( + bytes32 delegate, + uint8 proxy_type, + uint32 delay + ) external; - function removeProxy(bytes32 delegate, uint8 proxy_type, uint32 delay) external; + function removeProxy( + bytes32 delegate, + uint8 proxy_type, + uint32 delay + ) external; function removeProxies() external; function pokeDeposit() external; + + function getProxies( + bytes32 account + ) external view returns (bytes32[] memory); } From d397207d66de6b0200b5ff714aaa5666386185da Mon Sep 17 00:00:00 2001 From: open-junius Date: Fri, 14 Nov 2025 15:24:24 +0800 Subject: [PATCH 2/5] test all --- evm-tests/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/evm-tests/package.json b/evm-tests/package.json index 653ea3fbdf..ae756ae55f 100644 --- a/evm-tests/package.json +++ b/evm-tests/package.json @@ -1,6 +1,6 @@ { "scripts": { - "test": "mocha --timeout 999999 --retries 3 --file src/setup.ts --require ts-node/register test/pure*test.ts" + "test": "mocha --timeout 999999 --retries 3 --file src/setup.ts --require ts-node/register test/*test.ts" }, "keywords": [], "author": "", From d15137f1daa26859d792f549f8daaf468d1ea454 Mon Sep 17 00:00:00 2001 From: open-junius Date: Fri, 14 Nov 2025 17:54:49 +0800 Subject: [PATCH 3/5] bump version --- runtime/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index f6843c50ee..9ece1dd025 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -220,7 +220,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // `spec_version`, and `authoring_version` are the same between Wasm and native. // This value is set to 100 to notify Polkadot-JS App (https://polkadot.js.org/apps) to use // the compatible custom types. - spec_version: 346, + spec_version: 347, impl_version: 1, apis: RUNTIME_API_VERSIONS, transaction_version: 1, From eddd9a862298d7522b0e42398d61dbf6e521b18c Mon Sep 17 00:00:00 2001 From: open-junius Date: Sat, 15 Nov 2025 00:33:52 +0800 Subject: [PATCH 4/5] update result struct --- common/src/lib.rs | 27 ++++++++++++++++++++ evm-tests/src/contracts/proxy.ts | 21 +++++++++++++-- evm-tests/test/pure-proxy.precompile.test.ts | 20 +++++++++++++-- precompiles/src/proxy.rs | 21 ++++++++++++--- precompiles/src/solidity/proxy.sol | 8 +++++- 5 files changed, 88 insertions(+), 9 deletions(-) diff --git a/common/src/lib.rs b/common/src/lib.rs index 28a33c2ae6..be185a9140 100644 --- a/common/src/lib.rs +++ b/common/src/lib.rs @@ -189,6 +189,33 @@ impl TryFrom for ProxyType { } } +impl TryInto for ProxyType { + type Error = (); + + fn try_into(self) -> Result { + match self { + Self::Any => Ok(0), + Self::Owner => Ok(1), + Self::NonCritical => Ok(2), + Self::NonTransfer => Ok(3), + Self::Senate => Ok(4), + Self::NonFungible => Ok(5), + Self::Triumvirate => Ok(6), + Self::Governance => Ok(7), + Self::Staking => Ok(8), + Self::Registration => Ok(9), + Self::Transfer => Ok(10), + Self::SmallTransfer => Ok(11), + Self::RootWeights => Ok(12), + Self::ChildKeys => Ok(13), + Self::SudoUncheckedSetCode => Ok(14), + Self::SwapHotkey => Ok(15), + Self::SubnetLeaseBeneficiary => Ok(16), + Self::RootClaim => Err(()), + } + } +} + impl Default for ProxyType { // allow all Calls; required to be most permissive fn default() -> Self { diff --git a/evm-tests/src/contracts/proxy.ts b/evm-tests/src/contracts/proxy.ts index 34578fa0f9..1a3eab3594 100644 --- a/evm-tests/src/contracts/proxy.ts +++ b/evm-tests/src/contracts/proxy.ts @@ -156,9 +156,26 @@ export const IProxyABI = [ "name": "getProxies", "outputs": [ { - "internalType": "bytes32[]", + "components": [ + { + "internalType": "bytes32", + "name": "delegate", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "proxy_type", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "delay", + "type": "uint256" + } + ], + "internalType": "struct IProxy.ProxyInfo[]", "name": "", - "type": "bytes32[]" + "type": "tuple[]" } ], "stateMutability": "view", diff --git a/evm-tests/test/pure-proxy.precompile.test.ts b/evm-tests/test/pure-proxy.precompile.test.ts index 202f87466e..a59819b7b4 100644 --- a/evm-tests/test/pure-proxy.precompile.test.ts +++ b/evm-tests/test/pure-proxy.precompile.test.ts @@ -145,8 +145,16 @@ describe("Test pure proxy precompile", () => { assert.equal(proxiesFromContractAfterAdd.length, proxiesList.length, "proxy length should be equal") for (let index = 0; index < proxiesFromContractAfterAdd.length; index++) { - let proxySs58 = convertPublicKeyToSs58(proxiesFromContractAfterAdd[index]) + const proxyInfo = proxiesFromContractAfterAdd[index] + let proxySs58 = convertPublicKeyToSs58(proxyInfo.delegate) assert.ok(proxiesList.includes(proxySs58), "proxy should be set") + + // Verify proxy_type and delay match + const matchingProxy = proxiesAfterAdd[0].find(p => p.delegate === proxySs58) + if (matchingProxy) { + assert.equal(Number(proxyInfo.proxy_type), matchingProxy.proxy_type, "proxy_type should match") + assert.equal(Number(proxyInfo.delay), Number(matchingProxy.delay), "delay should match") + } } assert.equal(proxiesList.length, proxies[0].length + 1, "proxy should be set") @@ -190,8 +198,16 @@ describe("Test pure proxy precompile", () => { assert.equal(proxiesFromContractAfterAdd.length, proxiesList.length, "proxy length should be equal") for (let index = 0; index < proxiesFromContractAfterAdd.length; index++) { - let proxySs58 = convertPublicKeyToSs58(proxiesFromContractAfterAdd[index]) + const proxyInfo = proxiesFromContractAfterAdd[index] + let proxySs58 = convertPublicKeyToSs58(proxyInfo.delegate) assert.ok(proxiesList.includes(proxySs58), "proxy should be set") + + // Verify proxy_type and delay match + const matchingProxy = proxiesAfterAdd[0].find(p => p.delegate === proxySs58) + if (matchingProxy) { + assert.equal(Number(proxyInfo.proxy_type), matchingProxy.proxy_type, "proxy_type should match") + assert.equal(Number(proxyInfo.delay), Number(matchingProxy.delay), "delay should match") + } } }) }); diff --git a/precompiles/src/proxy.rs b/precompiles/src/proxy.rs index b723e63f00..b999d06999 100644 --- a/precompiles/src/proxy.rs +++ b/precompiles/src/proxy.rs @@ -9,7 +9,7 @@ use frame_system::RawOrigin; use pallet_evm::{AddressMapping, PrecompileHandle}; use pallet_subtensor_proxy as pallet_proxy; use precompile_utils::EvmResult; -use sp_core::H256; +use sp_core::{H256, U256}; use sp_runtime::{ codec::DecodeLimit, traits::{Dispatchable, StaticLookup}, @@ -246,14 +246,27 @@ where pub fn get_proxies( _handle: &mut impl PrecompileHandle, account_id: H256, - ) -> EvmResult> { + ) -> EvmResult> { let account_id = R::AccountId::from(account_id.0.into()); let proxies = pallet_proxy::pallet::Pallet::::proxies(account_id); - let mut result: Vec = vec![]; + let mut result: Vec<(H256, U256, U256)> = vec![]; for proxy in proxies.0 { let delegate: [u8; 32] = proxy.delegate.into(); - result.push(delegate.into()); + let proxy_type: u8 = + proxy + .proxy_type + .try_into() + .map_err(|_| PrecompileFailure::Error { + exit_status: ExitError::Other("Invalid proxy type".into()), + })?; + let delay: u32 = proxy + .delay + .try_into() + .map_err(|_| PrecompileFailure::Error { + exit_status: ExitError::Other("Invalid delay".into()), + })?; + result.push((delegate.into(), proxy_type.into(), delay.into())); } Ok(result) diff --git a/precompiles/src/solidity/proxy.sol b/precompiles/src/solidity/proxy.sol index 560742d93d..dbbee1d3f1 100644 --- a/precompiles/src/solidity/proxy.sol +++ b/precompiles/src/solidity/proxy.sol @@ -40,7 +40,13 @@ interface IProxy { function pokeDeposit() external; + struct ProxyInfo { + bytes32 delegate; + uint256 proxy_type; + uint256 delay; + } + function getProxies( bytes32 account - ) external view returns (bytes32[] memory); + ) external view returns (ProxyInfo[] memory); } From 077a8d5616bfbb96d305d03dd3ab70711e35a775 Mon Sep 17 00:00:00 2001 From: open-junius Date: Sat, 15 Nov 2025 01:14:46 +0800 Subject: [PATCH 5/5] fix test --- evm-tests/test/pure-proxy.precompile.test.ts | 43 +++++++++----------- 1 file changed, 20 insertions(+), 23 deletions(-) diff --git a/evm-tests/test/pure-proxy.precompile.test.ts b/evm-tests/test/pure-proxy.precompile.test.ts index a59819b7b4..9960c02005 100644 --- a/evm-tests/test/pure-proxy.precompile.test.ts +++ b/evm-tests/test/pure-proxy.precompile.test.ts @@ -46,8 +46,10 @@ async function getProxies(api: TypedApi, address: string) { describe("Test pure proxy precompile", () => { const evmWallet = generateRandomEthersWallet(); + // only used for edge case and normal proxy const evmWallet2 = generateRandomEthersWallet(); const evmWallet3 = generateRandomEthersWallet(); + const evmWallet4 = generateRandomEthersWallet(); const receiver = getRandomSubstrateKeypair(); let api: TypedApi @@ -61,6 +63,7 @@ describe("Test pure proxy precompile", () => { await forceSetBalanceToEthAddress(api, evmWallet.address) await forceSetBalanceToEthAddress(api, evmWallet2.address) await forceSetBalanceToEthAddress(api, evmWallet3.address) + await forceSetBalanceToEthAddress(api, evmWallet4.address) }) it("Call createPureProxy, then use proxy to call transfer", async () => { @@ -141,19 +144,18 @@ describe("Test pure proxy precompile", () => { const proxiesAfterAdd = await await api.query.Proxy.Proxies.getValue(convertH160ToSS58(evmWallet2.address)) const proxiesList = proxiesAfterAdd[0].map(proxy => proxy.delegate) + const proxiesFromContractAfterAdd = await contract.getProxies(convertH160ToPublicKey(evmWallet2.address)) + assert.equal(proxiesFromContractAfterAdd.length, proxiesList.length, "proxy length should be equal") for (let index = 0; index < proxiesFromContractAfterAdd.length; index++) { const proxyInfo = proxiesFromContractAfterAdd[index] - let proxySs58 = convertPublicKeyToSs58(proxyInfo.delegate) + let proxySs58 = convertPublicKeyToSs58(proxyInfo[0]) assert.ok(proxiesList.includes(proxySs58), "proxy should be set") - - // Verify proxy_type and delay match - const matchingProxy = proxiesAfterAdd[0].find(p => p.delegate === proxySs58) - if (matchingProxy) { - assert.equal(Number(proxyInfo.proxy_type), matchingProxy.proxy_type, "proxy_type should match") - assert.equal(Number(proxyInfo.delay), Number(matchingProxy.delay), "delay should match") + if (index === proxiesFromContractAfterAdd.length - 1) { + assert.equal(Number(proxyInfo[1]), type, "proxy_type should match") + assert.equal(Number(proxyInfo[2]), delay, "delay should match") } } @@ -162,7 +164,6 @@ describe("Test pure proxy precompile", () => { assert.equal(proxy, convertH160ToSS58(evmWallet3.address), "proxy should be set") const balance = (await api.query.System.Account.getValue(convertPublicKeyToSs58(receiver.publicKey))).data.free - const amount = 1000000000; const contract2 = new ethers.Contract(IPROXY_ADDRESS, IProxyABI, evmWallet3) @@ -175,14 +176,15 @@ describe("Test pure proxy precompile", () => { }) it("Call addProxy many times, then check getProxies is correct", async () => { - const proxies = await api.query.Proxy.Proxies.getValue(convertH160ToSS58(evmWallet2.address)) - const contract = new ethers.Contract(IPROXY_ADDRESS, IProxyABI, evmWallet2) + const proxies = await api.query.Proxy.Proxies.getValue(convertH160ToSS58(evmWallet4.address)) + const contract = new ethers.Contract(IPROXY_ADDRESS, IProxyABI, evmWallet4) + assert.equal(proxies[0].length, 0, "proxies length should be 0") - const proxiesFromContract = await contract.getProxies(convertH160ToPublicKey(evmWallet2.address)) + const proxiesFromContract = await contract.getProxies(convertH160ToPublicKey(evmWallet4.address)) assert.equal(proxiesFromContract.length, proxies[0].length, "proxies length should be equal") - const type = 0; - const delay = 0; + const type = 1; + const delay = 2; for (let i = 0; i < 5; i++) { const evmWallet = generateRandomEthersWallet() @@ -190,24 +192,19 @@ describe("Test pure proxy precompile", () => { await tx.wait() } - const proxiesAfterAdd = await await api.query.Proxy.Proxies.getValue(convertH160ToSS58(evmWallet2.address)) + const proxiesAfterAdd = await await api.query.Proxy.Proxies.getValue(convertH160ToSS58(evmWallet4.address)) const proxiesList = proxiesAfterAdd[0].map(proxy => proxy.delegate) - const proxiesFromContractAfterAdd = await contract.getProxies(convertH160ToPublicKey(evmWallet2.address)) + const proxiesFromContractAfterAdd = await contract.getProxies(convertH160ToPublicKey(evmWallet4.address)) assert.equal(proxiesFromContractAfterAdd.length, proxiesList.length, "proxy length should be equal") for (let index = 0; index < proxiesFromContractAfterAdd.length; index++) { const proxyInfo = proxiesFromContractAfterAdd[index] - let proxySs58 = convertPublicKeyToSs58(proxyInfo.delegate) + let proxySs58 = convertPublicKeyToSs58(proxyInfo[0]) assert.ok(proxiesList.includes(proxySs58), "proxy should be set") - - // Verify proxy_type and delay match - const matchingProxy = proxiesAfterAdd[0].find(p => p.delegate === proxySs58) - if (matchingProxy) { - assert.equal(Number(proxyInfo.proxy_type), matchingProxy.proxy_type, "proxy_type should match") - assert.equal(Number(proxyInfo.delay), Number(matchingProxy.delay), "delay should match") - } + assert.equal(Number(proxyInfo[1]), type, "proxy_type should match") + assert.equal(Number(proxyInfo[2]), delay, "delay should match") } }) });