Skip to content

Commit ed07e76

Browse files
committed
update addr32 address map
1 parent fe029ac commit ed07e76

File tree

6 files changed

+74
-405
lines changed

6 files changed

+74
-405
lines changed

stacks/Clarinet.toml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,16 @@ authors = []
55
telemetry = false
66
cache_dir = './.cache'
77

8-
[contracts.executor-state]
9-
path = 'contracts/executor-state.clar'
8+
[contracts.addr32]
9+
path = 'contracts/mocks/addr32.clar'
1010
clarity_version = 3
11-
epoch = 'latest'
11+
epoch = '3.2'
1212

1313
[contracts.executor]
1414
path = 'contracts/executor.clar'
1515
clarity_version = 3
1616
epoch = '3.2'
17-
depends_on = ['executor-state']
17+
depends_on = ['addr32']
1818
[repl.analysis]
1919
passes = ['check_checker']
2020

stacks/contracts/executor.clar

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@
1313
(define-constant EXECUTOR-VERSION "Executor-0.0.1")
1414
(define-constant OUR-CHAIN u1) ;; Must be manually updated before deployment. Worth doing it this way or an initialize call?
1515

16+
;; addr32 contract reference - update before deployment
17+
;; Local/Test: .addr32
18+
;; Testnet: 'ST2W4SFFKXMGFJW7K7NZFK3AH52ZTXDB74HKV9MRA.addr32
19+
;; Mainnet: TBD
20+
1621
;; errors
1722
(define-constant ERR-QUOTE-SRC-CHAIN-MISMATCH (err u1001))
1823
(define-constant ERR-QUOTE-DST-CHAIN-MISMATCH (err u1002))
@@ -53,7 +58,7 @@
5358
)
5459

5560
;; 2. Verify payee is registered and get principal
56-
(let ((payee-lookup-result (contract-call? .executor-state universal-address-to-principal-get
61+
(let ((payee-lookup-result (contract-call? .addr32 lookup
5762
payee-universal-addr
5863
)))
5964
(asserts! (is-some payee-lookup-result) ERR-UNREGISTERED-PAYEE)
@@ -192,9 +197,9 @@
192197
)
193198

194199
;; Convert 32-byte universal address hash back to a Stacks principal
195-
;; Uses the executor-state contract's payee registry
200+
;; Uses the addr32 contract's registry
196201
(define-read-only (universal-addr-to-principal (universal-addr (buff 32)))
197-
(contract-call? .executor-state universal-address-to-principal-get
202+
(contract-call? .addr32 lookup
198203
universal-addr
199204
)
200205
)
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,57 @@
1-
;; title: executor-state
2-
;; version: 0.0.1
3-
;; summary: State contract for cross-chain executor relayer registry
4-
;; description: Simple relayer address mapping for the executor system
1+
;; Title: addr32
2+
;; Version: final (CANNOT BE UPDATED)
53

6-
;;;; Constants
4+
;; This contract provides 32-byte addressing for the Stacks blockchain
5+
;; A Stacks contract principal can be longer than 32 bytes, and some protocols can't handle that
6+
;; We can generate a unique 32-byte address for any Stacks principal by hashing it
7+
;; This allows us to use existing protocols unmodified
78

8-
;; State contract errors
9-
(define-constant ERR_STATE_RELAYER_EXISTS (err u20001))
9+
(define-constant ERR_INVALID_ADDRESS (err u901))
1010

11-
;;;; Data maps
12-
13-
;; Map to track payee addresses for payments
14-
;; Universal address is keccak256(stacks-principal-as-string)
15-
(define-map universal-address-to-principal
16-
(buff 32) ;; Universal address (32-byte hash)
17-
principal ;; Stacks principal for STX payments
18-
)
19-
20-
;;;; Public functions
21-
22-
;; @desc Register a payee's Stacks address for their universal address
23-
;; Anyone can call this to register themselves as a payee
24-
(define-public (register-payee (stacks-addr principal))
25-
(let (
26-
(p-as-string (principal-to-string stacks-addr))
27-
(universal-addr (keccak256 (string-ascii-to-buff p-as-string)))
28-
)
29-
;; Check if payee already exists
30-
(asserts! (is-none (universal-address-to-principal-get universal-addr))
31-
ERR_STATE_RELAYER_EXISTS
32-
)
33-
34-
;; Register the mapping
35-
(map-set universal-address-to-principal universal-addr stacks-addr)
36-
37-
;; Return the universal address for confirmation
38-
(ok universal-addr)
39-
)
11+
;; Registered principals
12+
(define-map registry
13+
(buff 32) ;; keccak256(principal)
14+
principal ;; Stacks principal
4015
)
4116

42-
;;;; Read-only functions
43-
44-
;; Constants for principal-to-string conversion (extracted from self-listing-helper-v3)
17+
;; @desc Get or register 32-byte address
18+
(define-public (register (p principal))
19+
(if (is-standard p)
20+
;; Address matches network, this is expected
21+
(inner-register p)
22+
;; Address does not match network, need to support for unit tests
23+
(let ((addr32 (hash p)))
24+
(match (lookup addr32)
25+
val (ok {
26+
created: false,
27+
addr32: addr32
28+
})
29+
ERR_INVALID_ADDRESS))))
30+
31+
;; @desc Hash a Stacks principal to generate addr32
32+
(define-read-only (hash (p principal))
33+
(keccak256 (string-ascii-to-buff (principal-to-string p))))
34+
35+
;; @desc Lookup Stacks principal for given addr32
36+
(define-read-only (lookup (addr32 (buff 32)))
37+
(map-get? registry addr32))
38+
39+
;; @desc Lookup to see if Stacks principal is registered
40+
(define-read-only (reverse-lookup (p principal))
41+
(let ((addr32 (hash p)))
42+
{
43+
registered: (is-some (map-get? registry addr32)),
44+
addr32: addr32
45+
}))
46+
47+
;; Constants for principal-to-string conversion
4548
(define-constant C32 "0123456789ABCDEFGHJKMNPQRSTVWXYZ")
4649
(define-constant LIST_15 (list 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0))
4750
(define-constant LIST_24 (list 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0))
4851
(define-constant LIST_39 (concat LIST_24 LIST_15))
4952

50-
;; @desc Convert principal to string representation
51-
;; Extracted from self-listing-helper-v3 to eliminate external dependencies
52-
(define-read-only (principal-to-string (p principal))
53+
;; TODO: Replace with `to-ascii?` in Clarity 4
54+
(define-private (principal-to-string (p principal))
5355
(let (
5456
(destructed (match (principal-destruct? p) ok-value ok-value err-value err-value))
5557
(checksum (unwrap-panic (slice? (sha256 (sha256 (concat (get version destructed) (get hash-bytes destructed)))) u0 u4)))
@@ -66,9 +68,7 @@
6668

6769
(define-private (hash-bytes-to-string (data (buff 24)))
6870
(let (
69-
;; fixed-length: 8 * 15 / 5 = 24
7071
(low-part (get s (fold c32-to-string-iter LIST_24 { s: "", r: (buff-to-uint-be (unwrap-panic (as-max-len? (unwrap-panic (slice? data u9 u24)) u16)))})))
71-
;; fixed-length: ceil(8 * 9 / 5) = 15
7272
(high-part (get s (fold c32-to-string-iter LIST_15 { s: "", r: (buff-to-uint-be (unwrap-panic (as-max-len? (unwrap-panic (slice? data u0 u9)) u16)))})))
7373
)
7474
(unwrap-panic (as-max-len? (concat high-part low-part) u39))
@@ -89,20 +89,14 @@
8989
(define-private (append-leading-0 (hash-bytes (buff 24)) (s (string-ascii 39)))
9090
(get address (fold append-leading-0-iter LIST_24 { hash-bytes: hash-bytes, address: s })))
9191

92-
;; @desc Helper function to convert string to buffer for hashing
93-
;; Matches the exact implementation from Wormhole Core
94-
(define-read-only (string-ascii-to-buff (s (string-ascii 256)))
92+
(define-private (string-ascii-to-buff (s (string-ascii 256)))
9593
(let ((cb (unwrap-panic (to-consensus-buff? s))))
96-
;; Consensus buff format for string:
97-
;; bytes[0]: Consensus Buff Type
98-
;; bytes[1..4]: String length
99-
;; bytes[5..]: String data
100-
(unwrap-panic (slice? cb u5 (len cb)))
101-
)
102-
)
103-
104-
;;;; Map getters
105-
106-
(define-read-only (universal-address-to-principal-get (universal-addr (buff 32)))
107-
(map-get? universal-address-to-principal universal-addr)
108-
)
94+
(unwrap-panic (slice? cb u5 (len cb)))))
95+
96+
;; @desc Bypass checks, used in unit tests
97+
(define-private (inner-register (p principal))
98+
(let ((addr32 (hash p)))
99+
(ok {
100+
created: (map-insert registry addr32 p),
101+
addr32: addr32
102+
})))

stacks/deployments/default.simnet-plan.yaml

Lines changed: 2 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -63,93 +63,9 @@ plan:
6363
- id: 0
6464
transactions:
6565
- emulated-contract-publish:
66-
contract-name: extension-trait
67-
emulated-sender: SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM
68-
path: "./.cache/requirements/SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.extension-trait.clar"
69-
clarity-version: 2
70-
- emulated-contract-publish:
71-
contract-name: proposal-trait
72-
emulated-sender: SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM
73-
path: "./.cache/requirements/SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.proposal-trait.clar"
74-
clarity-version: 2
75-
- emulated-contract-publish:
76-
contract-name: executor-dao
77-
emulated-sender: SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM
78-
path: "./.cache/requirements/SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.executor-dao.clar"
79-
clarity-version: 2
80-
- emulated-contract-publish:
81-
contract-name: trait-sip-010
82-
emulated-sender: SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM
83-
path: "./.cache/requirements/SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.trait-sip-010.clar"
84-
clarity-version: 2
85-
- emulated-contract-publish:
86-
contract-name: amm-registry-v2-01
87-
emulated-sender: SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM
88-
path: "./.cache/requirements/SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.amm-registry-v2-01.clar"
89-
clarity-version: 2
90-
- emulated-contract-publish:
91-
contract-name: trait-flash-loan-user
92-
emulated-sender: SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM
93-
path: "./.cache/requirements/SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.trait-flash-loan-user.clar"
94-
clarity-version: 2
95-
- emulated-contract-publish:
96-
contract-name: trait-semi-fungible
97-
emulated-sender: SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM
98-
path: "./.cache/requirements/SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.trait-semi-fungible.clar"
99-
clarity-version: 2
100-
- emulated-contract-publish:
101-
contract-name: amm-vault-v2-01
102-
emulated-sender: SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM
103-
path: "./.cache/requirements/SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.amm-vault-v2-01.clar"
104-
clarity-version: 2
105-
- emulated-contract-publish:
106-
contract-name: token-amm-pool-v2-01
107-
emulated-sender: SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM
108-
path: "./.cache/requirements/SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.token-amm-pool-v2-01.clar"
109-
clarity-version: 2
110-
- emulated-contract-publish:
111-
contract-name: amm-pool-v2-01
112-
emulated-sender: SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM
113-
path: "./.cache/requirements/SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.amm-pool-v2-01.clar"
114-
clarity-version: 2
115-
epoch: "2.5"
116-
- id: 1
117-
transactions:
118-
- emulated-contract-publish:
119-
contract-name: liquidity-locker
120-
emulated-sender: SP1E0XBN9T4B10E9QMR7XMFJPMA19D77WY3KP2QKC
121-
path: "./.cache/requirements/SP1E0XBN9T4B10E9QMR7XMFJPMA19D77WY3KP2QKC.liquidity-locker.clar"
122-
clarity-version: 3
123-
epoch: "3.0"
124-
- id: 2
125-
transactions:
126-
- emulated-contract-publish:
127-
contract-name: clarity-stacks
128-
emulated-sender: SP1E0XBN9T4B10E9QMR7XMFJPMA19D77WY3KP2QKC
129-
path: "./.cache/requirements/SP1E0XBN9T4B10E9QMR7XMFJPMA19D77WY3KP2QKC.clarity-stacks.clar"
130-
clarity-version: 3
131-
- emulated-contract-publish:
132-
contract-name: clarity-stacks-helper
133-
emulated-sender: SP1E0XBN9T4B10E9QMR7XMFJPMA19D77WY3KP2QKC
134-
path: "./.cache/requirements/SP1E0XBN9T4B10E9QMR7XMFJPMA19D77WY3KP2QKC.clarity-stacks-helper.clar"
135-
clarity-version: 3
136-
- emulated-contract-publish:
137-
contract-name: code-body-prover
138-
emulated-sender: SP1E0XBN9T4B10E9QMR7XMFJPMA19D77WY3KP2QKC
139-
path: "./.cache/requirements/SP1E0XBN9T4B10E9QMR7XMFJPMA19D77WY3KP2QKC.code-body-prover.clar"
140-
clarity-version: 3
141-
- emulated-contract-publish:
142-
contract-name: self-listing-helper-v3
143-
emulated-sender: SP1E0XBN9T4B10E9QMR7XMFJPMA19D77WY3KP2QKC
144-
path: "./.cache/requirements/SP1E0XBN9T4B10E9QMR7XMFJPMA19D77WY3KP2QKC.self-listing-helper-v3.clar"
145-
clarity-version: 3
146-
epoch: "3.1"
147-
- id: 3
148-
transactions:
149-
- emulated-contract-publish:
150-
contract-name: executor-state
66+
contract-name: addr32
15167
emulated-sender: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM
152-
path: contracts/executor-state.clar
68+
path: contracts/mocks/addr32.clar
15369
clarity-version: 3
15470
- emulated-contract-publish:
15571
contract-name: executor

0 commit comments

Comments
 (0)