From 33432a1d034509aee81352a233985779226a025d Mon Sep 17 00:00:00 2001 From: BowTiedRadone Date: Fri, 24 Jan 2025 19:52:56 +0200 Subject: [PATCH] Add trait import and trait implementation contracts This commit adds the following to the example project: - `ft-transfer-many`: A contract that imports a trait and references it in a function parameter. - `rendezvous-token`: A contract that implements the referenced trait. Additionally, it includes an invariant and a property test for the ft-transfer-many contract to demonstrate the random selection of trait implementations in action. --- example/Clarinet.toml | 12 ++++- example/contracts/ft-transfer-many.clar | 21 +++++++++ example/contracts/ft-transfer-many.tests.clar | 47 +++++++++++++++++++ example/contracts/rendezvous-token.clar | 41 ++++++++++++++++ example/contracts/trait.clar | 3 -- example/contracts/trait.tests.clar | 9 ---- 6 files changed, 119 insertions(+), 14 deletions(-) create mode 100644 example/contracts/ft-transfer-many.clar create mode 100644 example/contracts/ft-transfer-many.tests.clar create mode 100644 example/contracts/rendezvous-token.clar delete mode 100644 example/contracts/trait.clar delete mode 100644 example/contracts/trait.tests.clar diff --git a/example/Clarinet.toml b/example/Clarinet.toml index 4b98c90..4602bbd 100644 --- a/example/Clarinet.toml +++ b/example/Clarinet.toml @@ -6,6 +6,14 @@ cache_dir = "./.cache" [[project.requirements]] contract_id = 'SP4SZE494VC2YC5JYG7AYFQ44F5Q4PYV7DVMDPBG.ststx-token' +[[project.requirements]] +contract_id = 'SP4SZE494VC2YC5JYG7AYFQ44F5Q4PYV7DVMDPBG.sip-010-trait-ft-standard' + +[contracts.rendezvous-token] +path = 'contracts/rendezvous-token.clar' +clarity_version = 2 +epoch = 2.5 + [contracts.cargo] path = "contracts/cargo.clar" clarity_version = 3 @@ -26,8 +34,8 @@ path = "contracts/slice.clar" clarity_version = 3 epoch = 3.0 -[contracts.trait] -path = 'contracts/trait.clar' +[contracts.ft-transfer-many] +path = 'contracts/ft-transfer-many.clar' clarity_version = 3 epoch = 3.0 diff --git a/example/contracts/ft-transfer-many.clar b/example/contracts/ft-transfer-many.clar new file mode 100644 index 0000000..de1781a --- /dev/null +++ b/example/contracts/ft-transfer-many.clar @@ -0,0 +1,21 @@ +(use-trait ft-trait 'SP4SZE494VC2YC5JYG7AYFQ44F5Q4PYV7DVMDPBG.sip-010-trait-ft-standard.sip-010-trait) + +(define-public (transfer-many + (transfers-list + (list 5 {token: , recipient: principal, amount: uint}) + ) + ) + (ok (map transfer transfers-list)) +) + +(define-private (transfer + (one-transfer {token: , recipient: principal, amount: uint}) + ) + (let + ( + (ft (get token one-transfer)) + (recipient (get recipient one-transfer)) + (amount (get amount one-transfer)) + ) + (contract-call? ft transfer amount tx-sender recipient none)) +) diff --git a/example/contracts/ft-transfer-many.tests.clar b/example/contracts/ft-transfer-many.tests.clar new file mode 100644 index 0000000..850085d --- /dev/null +++ b/example/contracts/ft-transfer-many.tests.clar @@ -0,0 +1,47 @@ +;; Invariants + +(define-read-only (invariant-trait (address principal)) + (let + ( + (total-supply + (unwrap-panic (contract-call? .rendezvous-token get-total-supply))) + (user-balance + (unwrap-panic + (contract-call? + .rendezvous-token + get-balance + address + ) + ) + ) + ) + (<= user-balance total-supply) + ) +) + +;; Properties + +(define-public (test-transfer + (token ) (recipient principal) (amount uint) + ) + (let + ( + (sender-balance-before + (unwrap-panic (contract-call? token get-balance tx-sender))) + (transfer-result + (transfer {token: token, recipient: recipient, amount: amount})) + (sender-balance-after + (unwrap-panic (contract-call? token get-balance tx-sender))) + ) + (match transfer-result + result + (ok + (is-eq + sender-balance-after + (- sender-balance-before amount) + ) + ) + error (ok false) + ) + ) +) \ No newline at end of file diff --git a/example/contracts/rendezvous-token.clar b/example/contracts/rendezvous-token.clar new file mode 100644 index 0000000..fbf0320 --- /dev/null +++ b/example/contracts/rendezvous-token.clar @@ -0,0 +1,41 @@ +(impl-trait 'SP4SZE494VC2YC5JYG7AYFQ44F5Q4PYV7DVMDPBG.sip-010-trait-ft-standard.sip-010-trait) + +(define-fungible-token rendezvous) + +;; SIP-010 methods. + +(define-read-only (get-total-supply) + (ok (ft-get-supply rendezvous)) +) + +(define-read-only (get-name) + (ok "Rendezvous Token") +) + +(define-read-only (get-symbol) + (ok "rendezvous") +) + +(define-read-only (get-decimals) + (ok u6) +) + +(define-read-only (get-balance (account principal)) + (ok (ft-get-balance rendezvous account)) +) + +(define-read-only (get-token-uri) + (ok (some u"")) +) + +(define-public (transfer + (amount uint) + (sender principal) + (recipient principal) + (memo (optional (buff 34))) + ) + (match (ft-transfer? rendezvous amount sender recipient) + response (ok response) + error (err error) + ) +) \ No newline at end of file diff --git a/example/contracts/trait.clar b/example/contracts/trait.clar deleted file mode 100644 index 2fb7231..0000000 --- a/example/contracts/trait.clar +++ /dev/null @@ -1,3 +0,0 @@ -(define-public (function) - (ok true) -) diff --git a/example/contracts/trait.tests.clar b/example/contracts/trait.tests.clar deleted file mode 100644 index f20b676..0000000 --- a/example/contracts/trait.tests.clar +++ /dev/null @@ -1,9 +0,0 @@ -(use-trait ft-trait 'SP4SZE494VC2YC5JYG7AYFQ44F5Q4PYV7DVMDPBG.sip-010-trait-ft-standard.sip-010-trait) - -(define-read-only (invariant-trait (token )) - true -) - -(define-public (test-trait (token )) - (ok true) -)