Skip to content
Merged
Show file tree
Hide file tree
Changes from 73 commits
Commits
Show all changes
93 commits
Select commit Hold shift + click to select a range
ce12308
wip: init
mitinarseny Jul 29, 2026
4a861a2
wip: resolver_id?
mitinarseny Jul 30, 2026
9b8f222
wip
mitinarseny Jul 30, 2026
8d9377a
Merge branch 'main' into feat/nep641
mitinarseny Jul 30, 2026
075e4d3
chore: single `sign_for`
mitinarseny Jul 30, 2026
ca60336
feat: impl NEP-641 for wallets
mitinarseny Jul 30, 2026
5528615
feat(wallet/sdk): NEP-641 support
mitinarseny Jul 31, 2026
b88e9f3
chore: force offchain msg support for schema and signers
mitinarseny Jul 31, 2026
5f30fbf
fix(wallet/sdk): wrap offchain messages until the last-1 extension
mitinarseny Jul 31, 2026
d25b9a4
wip
mitinarseny Aug 1, 2026
46e14bd
feat: generic auth
mitinarseny Aug 2, 2026
0d91db6
chore
mitinarseny Aug 2, 2026
ed63fed
feat!: propagate full path
mitinarseny Aug 2, 2026
51e5b5b
wip: standardized OffchainMessage
mitinarseny Aug 2, 2026
7fb2acf
feat(wallet/sdk): sign offchain messages
mitinarseny Aug 2, 2026
a7de64b
chore(wallet/sdk): test offchain resolve
mitinarseny Aug 2, 2026
f535d02
chore: tests
mitinarseny Aug 2, 2026
d86303c
chore(wallet/sdk): extension fixture
mitinarseny Aug 2, 2026
22c18ce
chore
mitinarseny Aug 2, 2026
3d8fd00
chore(wallet/sdk): better offchain API
mitinarseny Aug 2, 2026
671c4e8
chore
mitinarseny Aug 2, 2026
6d4b4f1
wip: docs
mitinarseny Aug 2, 2026
dc37a88
chore: docs
mitinarseny Aug 2, 2026
1818c21
feat(nep641/verifier): max depth
mitinarseny Aug 3, 2026
a41e878
fix: tests
mitinarseny Aug 3, 2026
f4429b7
chore: docs
mitinarseny Aug 3, 2026
fb5bad3
chore: tracing follows_from
mitinarseny Aug 3, 2026
3c67f6f
chore
mitinarseny Aug 3, 2026
895fb1b
chore
mitinarseny Aug 3, 2026
d81b8b0
chore: rename to payload
mitinarseny Aug 3, 2026
0b6c9d8
chore: docs
mitinarseny Aug 3, 2026
e6ca4bb
chore
mitinarseny Aug 3, 2026
3b13426
chore
mitinarseny Aug 3, 2026
1317e15
chore
mitinarseny Aug 3, 2026
68842b2
chore
mitinarseny Aug 3, 2026
3b726e5
chore
mitinarseny Aug 3, 2026
abe4e8c
chore
mitinarseny Aug 3, 2026
5c4f78a
chore
mitinarseny Aug 3, 2026
39cea33
chore: features
mitinarseny Aug 3, 2026
f6ef6f1
fix!: reoder fields
mitinarseny Aug 4, 2026
4078362
chore: doc examples
mitinarseny Aug 4, 2026
fbd092d
chore
mitinarseny Aug 4, 2026
21196fc
chore
mitinarseny Aug 4, 2026
9c77cbd
chore
mitinarseny Aug 4, 2026
32124b9
chore
mitinarseny Aug 4, 2026
f715745
chore
mitinarseny Aug 4, 2026
5c3acb4
wip: access keys
mitinarseny Aug 4, 2026
168ce96
wip
mitinarseny Aug 4, 2026
f548d5a
chore
mitinarseny Aug 4, 2026
4a84a3f
chore
mitinarseny Aug 4, 2026
1380cfc
chore
mitinarseny Aug 5, 2026
01ce1a5
chore: verify block timestamp
mitinarseny Aug 5, 2026
4c5dee9
chore
mitinarseny Aug 5, 2026
f820129
chore
mitinarseny Aug 5, 2026
7434a22
chore
mitinarseny Aug 5, 2026
95b29a0
chore
mitinarseny Aug 5, 2026
c9cdf21
chore
mitinarseny Aug 5, 2026
3968acd
chore
mitinarseny Aug 5, 2026
1b57cee
chore
mitinarseny Aug 5, 2026
0664d4e
chore
mitinarseny Aug 5, 2026
c60def3
chore: errors
mitinarseny Aug 5, 2026
976f2b4
chore
mitinarseny Aug 5, 2026
2624dd9
chore
mitinarseny Aug 5, 2026
e1e4802
chore
mitinarseny Aug 5, 2026
3faaf40
chore
mitinarseny Aug 5, 2026
7405058
chore
mitinarseny Aug 5, 2026
a9d0e55
chore
mitinarseny Aug 5, 2026
45f6dac
chore
mitinarseny Aug 5, 2026
be82feb
chore
mitinarseny Aug 5, 2026
d7b03b0
chore
mitinarseny Aug 5, 2026
2e66f79
fix: ignore wasmtime advisory
mitinarseny Aug 5, 2026
30caa76
chore: fix tests
mitinarseny Aug 5, 2026
dbfc5c6
chore(nep641): nep413 feature
mitinarseny Aug 5, 2026
3699511
chore
mitinarseny Aug 5, 2026
b734750
chore
mitinarseny Aug 5, 2026
ba04a3d
chore: no borsh
mitinarseny Aug 5, 2026
a5f8bb8
chore
mitinarseny Aug 5, 2026
ec199f9
fix tests
mitinarseny Aug 5, 2026
a49d897
chore
mitinarseny Aug 5, 2026
d97c184
chore: simplify
mitinarseny Aug 6, 2026
7c1781f
fix!(nep641): rename `public_key` field to `access_key` to reduce col…
mitinarseny Aug 6, 2026
b57c190
chore(nep641): panic on invalid resolver confituration
mitinarseny Aug 6, 2026
2477652
chore: reduce collisions for access key auths even more by `deny_unkn…
mitinarseny Aug 6, 2026
470db81
chore: test with more ext depth
mitinarseny Aug 6, 2026
04e1e9b
chore!: reverse the path for `w_resolve_auth()`
mitinarseny Aug 6, 2026
68077a8
Merge branch 'main' into feat/nep641
mitinarseny Aug 6, 2026
357339d
chore
mitinarseny Aug 6, 2026
6c067d3
chore
mitinarseny Aug 6, 2026
269cc7a
chore
mitinarseny Aug 6, 2026
e6e967a
chore: add tests for access keys
mitinarseny Aug 7, 2026
e26f886
chore: better tracing
mitinarseny Aug 7, 2026
2f510ac
chore
mitinarseny Aug 7, 2026
c7376e7
chore
mitinarseny Aug 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .cargo/audit.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,7 @@
# https://docs.rs/cargo-audit/latest/cargo_audit/config/

[advisories]
ignore = [
# transitive wasmtime dependency is only currently used for `near-sdk/unit-testing` feature
"RUSTSEC-2026-0222", # TODO: remove
]
Comment on lines +5 to +11

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 Security & Privacy | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

echo "Dependency and audit references:"
fd -a -t f -e toml -e lock -e yml -e yaml -e sh . \
  | xargs -r rg -n -C 5 \
      'near-sdk|unit-testing|wasmtime|cargo audit|RUSTSEC-2026-0222'

echo
echo "Wasmtime versions in lockfiles:"
while IFS= read -r lockfile; do
  echo "== $lockfile =="
  rg -n -A3 -B1 '^name = "wasmtime"$' "$lockfile"
done < <(fd -a -t f -g 'Cargo.lock' .)

Repository: near/intents

Length of output: 50368


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

echo "Cargo.lock wasmtime package entries:"
python3 - <<'PY'
from pathlib import Path
p = Path('Cargo.lock')
text = p.read_text()
# Extract package blocks with name = "wasmtime" including metadata/dependencies if present.
start_indices = [i for i in range(len(text)) if text.startswith('[[package]]', i)]
blocks = []
for idx in start_indices:
    nxt = min(start_indices[start_indices.index(idx)+1:]) if idx != start_indices[-1] else len(text)
    blocks.append((idx,nxt))
for idx,nxt in blocks:
    block = text[idx:nxt].splitlines()
    name = None
    for line in block:
        if line.startswith('name = ') and '"' in line:
            name = line.split('"',2)[1]
            break
    if name == 'wasmtime':
        print('\n'.join(block[:80]))
PY

echo
echo "Dependencies on wasmtime in lockfile package blocks:"
python3 - <<'PY'
from pathlib import Path
import re
p = Path('Cargo.lock')
text = p.read_text()
blocks = re.findall(r'^{(?P<body>.*?)^}$', text, re.S | re.M)
for body in blocks:
    name = re.search(r'^name = "(.*?)"', body, re.M)
    deps = re.findall(r'^\s{1,4}"(wasmtime[^"]*)"', body, re.M)
    if name and (name.group(1) == 'wasmtime' or deps):
        print(name.group(1), deps[:10])
PY

echo
echo "Workspace/package references to unit-testing or wasmtime in dependency sections:"
python3 - <<'PY'
from pathlib import Path
files = list(Path('.').glob('**/Cargo.toml'))
for f in files:
    if any(part in {'.git','target'} for part in f.parts):
        continue
    s = f.read_text()
    if 'unit-testing' in s or 'wasmtime' in s:
        print(f)
        for sec in ['[dependencies]','[dev-dependencies]','[build-dependencies]']:
            if sec in s:
                i=s.index(sec); ss=s.find('\n[',i+1); end=len(s) if ss==-1 else ss
                print(s[i:end].splitlines()[:25])
PY

echo
echo "Audit configuration and CI audit references:"
rg -n -C 4 'audit|cargo-audit|RUSTSEC-2026-0222|features\s*=|\[.*\]' ./.cargo audit -g 'Cargo.toml' .github workflows .github/workflows 2>/dev/null || true

Repository: near/intents

Length of output: 16434


🌐 Web query:

RUSTSEC-2026-0222 wasmtime vulnerability fixed version

💡 Result:

The vulnerability RUSTSEC-2026-0222, which involves type index confusion between Wasmtime engines, was patched in the following versions [1][2]: - 24.0.12 - 36.0.13 - 46.0.2 - 47.0.3 Users are advised to update to these versions or higher to remediate the vulnerability [3].

Citations:


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

echo "Cargo.lock wasmtime resolution and reverse dependencies:"
python3 - <<'PY'
from pathlib import Path
import re
lock = Path('Cargo.lock').read_text()
blocks = re.findall(r'(?m)^\[\[package\]\].*?^(?=\[\[package\]\]|$)', lock, re.S)
pkgs = {}
for block in blocks:
    m = re.search(r'^name = "(.*?)"\n', block, re.M)
    if not m: continue
    name = m.group(1)
    version = re.search(r'^version = "(.*?)"\n', block, re.M)
    deps = re.findall(r'^\n{0,1} {4}"(.*?)"\n', block, re.M)
    pkgs[name] = {"version": version.group(1) if version else None, "dependencies": deps}
print("wasmtime =", pkgs.get("wasmtime", {}))
for name, info in pkgs.items():
    if info.get("version") == "wasmtime" or info.get("dependencies") and "wasmtime" in info["dependencies"]:
        print(name, "version=", pkgs[name]["version"], "depends on wasmtime")

print("\nLock references to unit-testing:")
for f in list(Path('.').glob('**/Cargo.toml')):
    text = f.read_text()
    if 'unit-testing' in text or 'wasmtime' in text:
        print(f)
        for sec in ('[dependencies]', '[dev-dependencies]', '[build-dependencies]'):
            if sec in text:
                print(text[sec:sec.text(text.find(sec)).text])
PY

Repository: near/intents

Length of output: 474


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

echo "Lockfile reverse dependencies on wasmtime:"
python3 - <<'PY'
from pathlib import Path
import re
lock = Path('Cargo.lock').read_text()
blocks = re.findall(r'(?ms)^\[\[package\]\].*?^(?=\[\[package\]\]|$)', lock)
pkgs = {}
for block in blocks:
    m = re.search(r'^name = "(.*?)"\n', block, re.M)
    if not m: continue
    version_match = re.search(r'^version = "(.*?)"\n', block, re.M)
    deps = re.findall(r'^\n{0,1} {4}"(.*?)"\n', block, re.M)
    pkgs[m.group(1)] = {"version": version_match.group(1) if version_match else None, "dependencies": deps}
print("wasmtime in lock:", pkgs.get("wasmtime"))
for name, info in pkgs.items():
    if info["dependencies"] and "wasmtime" in info["dependencies"]:
        print(name, "version=", info["version"], "depends on wasmtime")
PY

echo
echo "Manifest direct dependency references:"
python3 - <<'PY'
from pathlib import Path
for f in Path('.').glob('**/Cargo.toml'):
    if any(part in {'.git','target'} for part in f.parts):
        continue
    text = f.read_text()
    if 'unit-testing' in text or 'wasmtime' in text:
        print(f)
        for sec in ('[dependencies]', '[dev-dependencies]', '[build-dependencies]'):
            if sec in text:
                print(text[text.index(sec):])
PY

echo
echo "Audit configuration contents:"
cat -n .cargo/audit.toml 2>/dev/null || true

Repository: near/intents

Length of output: 33036


Security Misconfiguration (CWE-693)

Reachability: Internal

Scope this global advisory suppression to the test-only graph.

The shared .cargo/audit.toml suppresses RUSTSEC-2026-0222 for every cargo-audit invocation. The affected wasmtime 45.0.3 package is only reachable through manifests that enable near-sdk/unit-testing in dev-dependencies/target.'cfg(near)'.dev-dependencies, so document or move this ignore to the test-only audit command to avoid suppressing future non-test release dependency paths.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.cargo/audit.toml around lines 5 - 8, Remove the global RUSTSEC-2026-0222
entry from the shared audit configuration and scope the suppression to the
test-only audit command or configuration that covers near-sdk/unit-testing
dev-dependency graphs. Preserve the ignore only for those test audits, and
document its test-only rationale there.

51 changes: 42 additions & 9 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ members = [
"crates/signatures/erc191",
"crates/signatures/nep413",
"crates/signatures/nep461",
"crates/signatures/nep641",
"crates/signatures/webauthn",
"crates/signatures/sep53",
"crates/signatures/tip191",
Expand Down Expand Up @@ -125,6 +126,7 @@ defuse-token-id = { path = "crates/primitives/token-id", default-features = fals
defuse-erc191.path = "crates/signatures/erc191"
defuse-nep413.path = "crates/signatures/nep413"
defuse-nep461.path = "crates/signatures/nep461"
defuse-nep641.path = "crates/signatures/nep641"
defuse-sep53.path = "crates/signatures/sep53"
defuse-tip191.path = "crates/signatures/tip191"
defuse-ton-connect = { path = "crates/signatures/ton-connect", default-features = false }
Expand Down
4 changes: 2 additions & 2 deletions contracts/defuse/core/src/payload/nep413.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use defuse_crypto::ed25519::{Ed25519PublicKey, Ed25519Signature};
use defuse_crypto::ed25519::{Ed25519, Ed25519PublicKey, Ed25519Signature};
pub use defuse_nep413::{Nep413, Nep413Payload};
use impl_tools::autoimpl;
use near_sdk::AccountId;
Expand Down Expand Up @@ -75,7 +75,7 @@ impl SignedPayload for SignedNep413Payload {
type PublicKey = Ed25519PublicKey;

fn verify(&self) -> Option<Self::PublicKey> {
Nep413::verify(
Nep413::verify::<Ed25519>(
&self.public_key.try_into().ok()?,
&self.payload,
&self.signature.into(),
Expand Down
21 changes: 17 additions & 4 deletions contracts/wallet/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ repository.workspace = true
[dependencies]
defuse-bitmap.workspace = true
defuse-near-promise.workspace = true
defuse-nep641.workspace = true
defuse-time.workspace = true
near-account-id.workspace = true
thiserror.workspace = true
Expand All @@ -24,19 +25,21 @@ digest-io = { workspace = true, optional = true }
impl-tools = { workspace = true, optional = true }
schemars = { workspace = true, features = ["derive"], optional = true }
serde = { workspace = true, features = ["derive"], optional = true }
serde_json = { workspace = true, optional = true }
serde_with = { workspace = true, optional = true }

near-sdk = { workspace = true, optional = true }

[features]
default = ["std"]

std = ["defuse-time/std"]
std = ["defuse-nep641/std", "defuse-time/std"]
Comment thread
mitinarseny marked this conversation as resolved.

abi = ["borsh-schema", "near-sdk?/abi", "schemars-v0_8"]
arbitrary = [
"defuse-bitmap/arbitrary",
"defuse-near-promise/arbitrary",
"defuse-nep641/arbitrary",
"defuse-time/arbitrary",
"dep:arbitrary",
"dep:arbitrary_with",
Expand All @@ -45,6 +48,7 @@ arbitrary = [
borsh = [
"defuse-bitmap/borsh",
"defuse-near-promise/borsh",
"defuse-nep641/borsh",
"defuse-time/borsh",
"dep:borsh",
"dep:defuse-borsh-utils",
Expand All @@ -56,21 +60,29 @@ borsh-schema = [
"defuse-bitmap/borsh-schema",
"defuse-borsh-utils?/schema",
"defuse-near-promise/borsh-schema",
"defuse-nep641/borsh-schema",
"defuse-time/borsh-schema",
"near-account-id/abi",
]
digest = ["dep:defuse-digest", "dep:digest-io"]
json = ["defuse-near-promise/json", "serde"]
near-kit = ["defuse-near-promise/near-kit"]
digest = ["defuse-nep641/digest", "dep:defuse-digest", "dep:digest-io"]
json = [
"defuse-near-promise/json",
"defuse-nep641/json",
"dep:serde_json",
"serde",
]
near-kit = ["defuse-near-promise/near-kit", "defuse-nep641/near-kit"]
schemars-v0_8 = [
"defuse-near-promise/schemars-v0_8",
"defuse-nep641/schemars-v0_8",
"defuse-time/schemars-v0_8",
"dep:schemars",
"near-account-id/schemars-v0_8",
"serde",
]
serde = [
"defuse-near-promise/serde",
"defuse-nep641/serde",
"defuse-time/serde",
"dep:cfg_eval",
"dep:serde",
Expand All @@ -84,6 +96,7 @@ near-contract = [
"dep:impl-tools",
"dep:near-sdk",
"digest",
"json",
"serde",
"std",
]
Expand Down
29 changes: 22 additions & 7 deletions contracts/wallet/signatures/ed25519/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,14 @@ use defuse_crypto::{
Curve,
ed25519::{Ed25519, Ed25519PublicKey, Ed25519Signature},
};
use defuse_wallet::{RequestMessage, SignatureSchema};
use defuse_wallet::{RequestMessage, SignatureSchema, offchain::OffchainMessage};

/// Simple [`Ed25519`] wallet [signature schema](SignatureSchema)
/// over [canonical request hash](RequestMessage::hash).
pub struct WalletEd25519;

impl SignatureSchema for WalletEd25519 {
type PublicKey = Ed25519PublicKey;

fn verify(public_key: &Self::PublicKey, msg: &RequestMessage, proof: &str) -> bool {
impl WalletEd25519 {
fn verify_hash(public_key: &Ed25519PublicKey, hash: &[u8; 32], proof: &str) -> bool {
let Ok(signature) = Ed25519Signature::from_str(proof) else {
return false;
};
Expand All @@ -30,7 +28,24 @@ impl SignatureSchema for WalletEd25519 {
return false;
};

Ed25519::verify(&public_key, &msg.hash(), &signature.into())
Ed25519::verify(&public_key, hash, &signature.into())
}
}

impl SignatureSchema for WalletEd25519 {
type PublicKey = Ed25519PublicKey;

#[inline]
fn verify_request_msg(public_key: &Self::PublicKey, msg: &RequestMessage, proof: &str) -> bool {
Self::verify_hash(public_key, &msg.hash(), proof)
}

fn verify_offchain_msg(
public_key: &Self::PublicKey,
msg: &OffchainMessage,
proof: &str,
) -> bool {
Self::verify_hash(public_key, &msg.hash(), proof)
}
}

Expand Down Expand Up @@ -83,7 +98,7 @@ mod tests {
#[case] proof: impl Into<Ed25519Signature>,
) {
assert!(
WalletEd25519::verify(&public_key.into(), &msg, &proof.into().to_string()),
WalletEd25519::verify_request_msg(&public_key.into(), &msg, &proof.into().to_string()),
"signature is invalid"
);
}
Expand Down
26 changes: 21 additions & 5 deletions contracts/wallet/signatures/ed25519/src/signer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,17 @@ use crate::WalletEd25519;
#[derive(Debug, Clone, Copy, PartialEq, Eq, derive_more::From, derive_more::AsRef)]
pub struct WalletEd25519Signer<S>(pub S);

impl<S> WalletEd25519Signer<S>
where
S: Signer<Ed25519>,
{
async fn sign_hash(&self, hash: &[u8; 32]) -> Result<Proof, S::Error> {
let sig = self.0.sign(hash).await?;

Ok(Ed25519Signature::from(sig).to_string())
}
}

impl<S> WalletSigner<WalletEd25519> for WalletEd25519Signer<S>
where
S: Signer<Ed25519>,
Expand All @@ -50,10 +61,15 @@ where
self.0.public_key().into()
}

async fn sign_wallet_msg(&self, msg: &RequestMessage) -> Result<Proof, Self::Error> {
let sig = self.0.sign(&msg.hash()).await?;
async fn sign_request_msg(&self, msg: &RequestMessage) -> Result<Proof, Self::Error> {
self.sign_hash(&msg.hash()).await
}

Ok(Ed25519Signature::from(sig).to_string())
async fn sign_offchain_msg(
&self,
msg: &defuse_wallet::offchain::OffchainMessage,
) -> Result<Proof, Self::Error> {
self.sign_hash(&msg.hash()).await
}
}

Expand Down Expand Up @@ -81,12 +97,12 @@ mod tests {
request: Request::new(),
};

let proof = WalletSigner::<WalletEd25519>::sign_wallet_msg(&signer, &msg)
let proof = WalletSigner::<WalletEd25519>::sign_request_msg(&signer, &msg)
.await
.unwrap();

assert!(
WalletEd25519::verify(
WalletEd25519::verify_request_msg(
&WalletSigner::<WalletEd25519>::public_key(&signer),
&msg,
&proof
Expand Down
17 changes: 15 additions & 2 deletions contracts/wallet/signatures/no-sign/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ use core::{
str::FromStr,
};

use defuse_wallet::{RequestMessage, SignatureSchema};
use defuse_wallet::{RequestMessage, SignatureSchema, offchain::OffchainMessage};

/// [`SignatureSchema`] which always rejects the signature.
///
Expand All @@ -19,7 +19,20 @@ impl SignatureSchema for NoSign {
type PublicKey = NoPublicKey;

#[inline]
fn verify(_public_key: &Self::PublicKey, _msg: &RequestMessage, _proof: &str) -> bool {
fn verify_request_msg(
_public_key: &Self::PublicKey,
_msg: &RequestMessage,
_proof: &str,
) -> bool {
false
}

#[inline]
fn verify_offchain_msg(
_public_key: &Self::PublicKey,
_msg: &OffchainMessage,
_proof: &str,
) -> bool {
false
}
}
Expand Down
Loading
Loading