From e4091c6e75fd6b0c1dd1d9b29035bf488d947dc4 Mon Sep 17 00:00:00 2001 From: Jason Schrader Date: Wed, 21 Feb 2024 16:40:43 -0700 Subject: [PATCH] fix: convert stacks-m2m-v2 to use aBTC for resources --- src/stacks-m2m-v2.clar | 24 +++++++---------- tests/stacks-m2m-v2.test.ts | 53 ++++++++++++++++++++++++++++++++++--- 2 files changed, 59 insertions(+), 18 deletions(-) diff --git a/src/stacks-m2m-v2.clar b/src/stacks-m2m-v2.clar index 3b8a219..f100d80 100644 --- a/src/stacks-m2m-v2.clar +++ b/src/stacks-m2m-v2.clar @@ -7,14 +7,6 @@ ;; (impl-trait .stacks-m2m-trait-v1.stacks-m2m-trait-v1) -;; tokens -;; -;; MAINNET -;; xBTC SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.token-wbtc -;; aBTC SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.token-abtc -;; TESTNET -(define-constant ABTC_CONTRACT .stacks-m2m-abtc) - ;; constants ;; @@ -37,7 +29,6 @@ (define-constant ERR_USER_NOT_FOUND (err u1008)) (define-constant ERR_INVOICE_ALREADY_PAID (err u1009)) (define-constant ERR_SAVING_INVOICE_DATA (err u1010)) -(define-constant ERR_SETTING_MEMO_ON_TRANSFER (err u1011)) ;; data vars ;; @@ -82,8 +73,8 @@ uint ;; resource index { createdAt: uint, - ;; enabled: bool, ;; use instead of deleting resources? - ;; url: (string-utf8 255), ;; would need setter, health check + ;; enabled: bool, ;; TODO: use instead of deleting resources? + ;; url: (optional (string-utf8 255)), ;; TODO: would need setter, health check name: (string-utf8 50), description: (string-utf8 255), price: uint, @@ -275,8 +266,8 @@ (userIndex (unwrap! (get-or-create-user contract-caller) ERR_USER_NOT_FOUND)) (userData (unwrap! (get-user-data userIndex) ERR_USER_NOT_FOUND)) ) - ;; update InvoiceIndexes map, check invoice hash is unique - ;; (asserts! (map-insert InvoiceIndexes invoiceHash newCount) ERR_INVOICE_ALREADY_PAID) + ;; check that resourceIndex is > 0 + (asserts! (> resourceIndex u0) ERR_INVALID_PARAMS) ;; update InvoiceData map (asserts! (map-insert InvoiceData newCount @@ -324,8 +315,11 @@ ;; make transfer (if (is-some memo) ;; TODO: check for guards on price setting - (try! (stx-transfer-memo? (get price resourceData) contract-caller (var-get paymentAddress) (unwrap! memo ERR_SETTING_MEMO_ON_TRANSFER))) - (try! (stx-transfer? (get price resourceData) contract-caller (var-get paymentAddress))) + ;; MAINNET + ;; xBTC SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.token-wbtc + ;; aBTC SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.token-abtc + (try! (contract-call? .stacks-m2m-abtc transfer (get price resourceData) contract-caller (var-get paymentAddress) memo)) + (try! (contract-call? .stacks-m2m-abtc transfer (get price resourceData) contract-caller (var-get paymentAddress) none)) ) ;; return new count (ok newCount) diff --git a/tests/stacks-m2m-v2.test.ts b/tests/stacks-m2m-v2.test.ts index 479c1cc..9c21328 100644 --- a/tests/stacks-m2m-v2.test.ts +++ b/tests/stacks-m2m-v2.test.ts @@ -13,14 +13,13 @@ enum ErrCode { ERR_USER_NOT_FOUND, ERR_INVOICE_ALREADY_PAID, ERR_SAVING_INVOICE_DATA, - ERR_SETTING_MEMO_ON_TRANSFER, } const createResource = (name: string, desc: string, price: number) => { return [Cl.stringUtf8(name), Cl.stringUtf8(desc), Cl.uint(price)]; }; -const defaultPrice = 1_000_000; // 1 STX +const defaultPrice = 10_000; // 0.0001 aBTC const testResource = [ Cl.stringUtf8("Bitcoin Face"), @@ -469,6 +468,13 @@ describe("Paying an invoice", () => { const address1 = accounts.get("wallet_1")!; const expectedCount = 1; // ACT + // mint aBTC to pay for resources + simnet.callPublicFn( + "stacks-m2m-abtc", + "faucet-flood", + [Cl.principal(address1)], + address1 + ); // add a resource simnet.callPublicFn( "stacks-m2m-v2", @@ -498,6 +504,13 @@ describe("Paying an invoice", () => { const expectedCount = 1; const memo = Buffer.from("This is a memo test!"); // ACT + // mint aBTC to pay for resources + simnet.callPublicFn( + "stacks-m2m-abtc", + "faucet-flood", + [Cl.principal(address1)], + address1 + ); // add a resource simnet.callPublicFn( "stacks-m2m-v2", @@ -529,6 +542,27 @@ describe("Paying an invoice", () => { const expectedCount = 1; const memo = Cl.none(); // ACT + // mint aBTC to pay for resources + simnet.callPublicFn( + "stacks-m2m-abtc", + "faucet-flood", + [Cl.principal(address1)], + address1 + ); + // mint aBTC to pay for resources + simnet.callPublicFn( + "stacks-m2m-abtc", + "faucet-flood", + [Cl.principal(address2)], + address2 + ); + // mint aBTC to pay for resources + simnet.callPublicFn( + "stacks-m2m-abtc", + "faucet-flood", + [Cl.principal(address3)], + address3 + ); // add a resource simnet.callPublicFn( "stacks-m2m-v2", @@ -612,6 +646,19 @@ describe("Paying an invoice", () => { const deployer = accounts.get("deployer")!; const memo = Cl.none(); // ACT + // mint aBTC to pay for resources + simnet.callPublicFn( + "stacks-m2m-abtc", + "faucet-flood", + [Cl.principal(address1)], + address1 + ); + simnet.callPublicFn( + "stacks-m2m-abtc", + "faucet-flood", + [Cl.principal(address2)], + address2 + ); // add a resource simnet.callPublicFn( "stacks-m2m-v2", @@ -666,7 +713,7 @@ describe("Paying an invoice", () => { // ASSERT expect(resourceResponse.result).toBeSome( Cl.tuple({ - createdAt: Cl.uint(2), + createdAt: Cl.uint(4), description: Cl.stringUtf8("Generate a unique Bitcoin face."), name: Cl.stringUtf8("Bitcoin Face"), price: Cl.uint(defaultPrice),