buyer initiated flow

This commit is contained in:
thesn10
2026-05-26 21:33:32 +02:00
parent dd5ec25ff9
commit 9d9c7a8a43
19 changed files with 382 additions and 168 deletions

View File

@@ -1,5 +1,5 @@
use anchor_lang::prelude::*;
use crate::state::{ResolverEntry, ResolverType};
use crate::state::{AcceptancePolicy, ResolverEntry, ResolverType};
use crate::error::RegistryError;
#[derive(Accounts)]
@@ -22,6 +22,7 @@ pub struct RegisterResolver<'info> {
pub fn handler(
ctx: Context<RegisterResolver>,
resolver_type: ResolverType,
acceptance_policy: AcceptancePolicy,
name: String,
description: String,
fee_bps: u16,
@@ -34,6 +35,7 @@ pub fn handler(
let entry = &mut ctx.accounts.resolver_entry;
entry.authority = ctx.accounts.authority.key();
entry.resolver_type = resolver_type;
entry.acceptance_policy = acceptance_policy;
entry.name = name;
entry.description = description;
entry.fee_bps = fee_bps;

View File

@@ -1,4 +1,5 @@
#![allow(clippy::diverging_sub_expression)]
#![allow(clippy::too_many_arguments)]
pub mod error;
pub mod instructions;
@@ -23,6 +24,7 @@ pub mod descro_ext_resolvers {
pub fn register_resolver(
ctx: Context<RegisterResolver>,
resolver_type: ResolverType,
acceptance_policy: AcceptancePolicy,
name: String,
description: String,
fee_bps: u16,
@@ -32,6 +34,7 @@ pub mod descro_ext_resolvers {
register::handler(
ctx,
resolver_type,
acceptance_policy,
name,
description,
fee_bps,

View File

@@ -5,6 +5,7 @@ use anchor_lang::prelude::*;
pub struct ResolverEntry {
pub authority: Pubkey,
pub resolver_type: ResolverType,
pub acceptance_policy: AcceptancePolicy,
#[max_len(64)]
pub name: String,
#[max_len(256)]
@@ -28,6 +29,13 @@ pub enum ResolverType {
Multisig,
}
#[derive(AnchorSerialize, AnchorDeserialize, Clone, PartialEq, InitSpace, Debug)]
pub enum AcceptancePolicy {
Open,
SignatureGated,
ProgramGated,
}
/// Passed to update_stats; mirrors the Escrow program's Winner enum.
#[derive(AnchorSerialize, AnchorDeserialize, Clone, PartialEq)]
pub enum Ruling {

View File

@@ -1,4 +1,4 @@
#![allow(dead_code, unused_imports)]
#![allow(dead_code, unused_imports, clippy::too_many_arguments)]
pub use anchor_lang::prelude::Pubkey;
use {
@@ -6,7 +6,7 @@ use {
solana_program::{instruction::Instruction, system_program},
AccountDeserialize, InstructionData, ToAccountMetas,
},
descro_ext_resolvers::{ResolverEntry, ResolverType},
descro_ext_resolvers::{AcceptancePolicy, ResolverEntry, ResolverType},
litesvm::LiteSVM,
solana_keypair::Keypair,
solana_message::{Message, VersionedMessage},
@@ -51,6 +51,7 @@ pub fn try_send(svm: &mut LiteSVM, ix: Instruction, payer: &Keypair) -> bool {
pub fn ix_register(
authority: &Pubkey,
resolver_type: ResolverType,
acceptance_policy: AcceptancePolicy,
name: &str,
description: &str,
fee_bps: u16,
@@ -62,6 +63,7 @@ pub fn ix_register(
descro_ext_resolvers::id(),
&descro_ext_resolvers::instruction::RegisterResolver {
resolver_type,
acceptance_policy,
name: name.to_string(),
description: description.to_string(),
fee_bps,

View File

@@ -1,6 +1,6 @@
mod common;
use common::*;
use descro_ext_resolvers::ResolverType;
use descro_ext_resolvers::{AcceptancePolicy, ResolverType};
use solana_keypair::Keypair;
use solana_signer::Signer;
@@ -13,6 +13,7 @@ fn registers_entry_with_correct_state() {
ix_register(
&authority.pubkey(),
ResolverType::CentralAuthority,
AcceptancePolicy::Open,
"Acme Resolvers",
"Fast and fair dispute resolution",
100, // 1%
@@ -25,6 +26,7 @@ fn registers_entry_with_correct_state() {
let entry = read_entry(&svm, &authority.pubkey());
assert_eq!(entry.authority, authority.pubkey());
assert_eq!(entry.resolver_type, ResolverType::CentralAuthority);
assert_eq!(entry.acceptance_policy, AcceptancePolicy::Open);
assert_eq!(entry.name, "Acme Resolvers");
assert_eq!(entry.fee_bps, 100);
assert_eq!(entry.total_resolved, 0);
@@ -41,6 +43,7 @@ fn duplicate_register_fails() {
ix_register(
&authority.pubkey(),
ResolverType::CentralAuthority,
AcceptancePolicy::Open,
"Acme",
"",
0,
@@ -54,6 +57,7 @@ fn duplicate_register_fails() {
ix_register(
&authority.pubkey(),
ResolverType::CentralAuthority,
AcceptancePolicy::Open,
"Acme Again",
"",
0,
@@ -73,6 +77,7 @@ fn register_empty_name_fails() {
ix_register(
&authority.pubkey(),
ResolverType::CentralAuthority,
AcceptancePolicy::Open,
"",
"",
0,
@@ -92,6 +97,7 @@ fn register_invalid_fee_bps_fails() {
ix_register(
&authority.pubkey(),
ResolverType::CentralAuthority,
AcceptancePolicy::Open,
"Acme",
"",
10_001, // > 100%
@@ -110,12 +116,12 @@ fn different_authorities_have_separate_entries() {
send(
&mut svm,
ix_register(&auth1.pubkey(), ResolverType::CentralAuthority, "Auth1", "", 0, auth1.pubkey(), ""),
ix_register(&auth1.pubkey(), ResolverType::CentralAuthority, AcceptancePolicy::Open, "Auth1", "", 0, auth1.pubkey(), ""),
&auth1,
);
send(
&mut svm,
ix_register(&auth2.pubkey(), ResolverType::JuryDAO, "Auth2", "", 50, auth2.pubkey(), ""),
ix_register(&auth2.pubkey(), ResolverType::JuryDAO, AcceptancePolicy::Open, "Auth2", "", 50, auth2.pubkey(), ""),
&auth2,
);

View File

@@ -1,6 +1,6 @@
mod common;
use common::*;
use descro_ext_resolvers::ResolverType;
use descro_ext_resolvers::{AcceptancePolicy, ResolverType};
use solana_keypair::Keypair;
use solana_signer::Signer;
@@ -10,6 +10,7 @@ fn register_default(svm: &mut litesvm::LiteSVM, authority: &Keypair) {
ix_register(
&authority.pubkey(),
ResolverType::CentralAuthority,
AcceptancePolicy::Open,
"Original Name",
"Original description",
100,