Source Code

;; Used to simulate mainnet migration from v1 to v2 in the test suite
;; Must be called after deploying migrate-v0-v1.clar

(define-constant deployer tx-sender)

(define-data-var executed bool false)
(define-data-var executed-burn-mint bool false)
(define-data-var executed-reserve-data-update bool false)
(define-data-var executed-borrower-block-height bool false)
(define-data-var enabled bool true)

;; TODO: to fetch off-chain
(define-constant ststx-holders (list
 'SP1QTSSVHRQKX42CEY9NZ0Q808J5MTPXGV41Q35YF
 'SP1SQFWYGWX2JPNQTG87PHFX4H2WHB64Y334J0E6F
 'SP28XSESN0BTCBS8X91YHW8PXD7RQP77JJPW4XMH1
 'SP2EPZQ71PXY783S6R4493FW7C4TXXF8652HW5SCQ
 'SP3942ACZ73Q768Y19A1QTWJBTPCSDV3ZEDQSNYJK
 'SP6JAVT15GK449RBXGYDZHWRF0E8XGSRDREK1YGQ
 'SPHPBWK05V0XCN1H97T8SEBHGXTG7KNFYQ4PYXJ1
 'SPR0DKQ8BNXRMB4W20MAFPSSXP70WS65A715MHS
 'SP109KATYDW3TC8ZNZF0WGF58S5XF8PDAW5WVPYYX
 'SP1612JVQASPPNP72HBWPXBR9JNKVC45Q35MZTAVQ
 'SP1Z74Y3HNTZV2F03F6JA3JQ685JWG6BTPTJ0QDKJ
 'SP215NR9D2ZHQK92FKBA7GHN84HB4TJVGN5PZ36P5
 'SP3G6F3AS6TJYVG173D21DS283XHWJ9V00GBZ13AS
 'SP3M8P704ME3V511T0ZR0N457W38B0Q3PKSH415EC
 'SP3PH86GR1VZASJ20YK0G9P60B6Z2MMNC96Y765A1
 'SP8NAN40X1TR6HX82VNG0CYTKQ4TTMY600TW1DFA
 'SP9XM5KZYD9V1FMAZYQBZA2RVTTMY3745FFZB6XZ
 'SPFQCP1A7V9SGJ8WHRBDP8WP771V46YMW344AG6E
 'SPP82DZ6J5JZ4J6BXT68K8DPVE7NHR5VVH0KC4Y8
 'SP257T4QVF4EB2QSZWP0TK112QEWDSRPYQ1EEJEJ8
 'SP2EJ9AP25022C0ADCAGXTFKFQVFAEF7XYZEJB5JK
 'SP1QPZ5HT3JBD17CAF40FZXTR81P8KKAXHHZQNWDB
 'SP3CCXW93VY31ADKW3HE73PSGBSKJ9FFH9EFN82BF
 'SP2PNA3NH6WRFTVGF88TS89F3RYG801YPXPHWG3KF
 'SP3HSPZ2ZN19AMHM022VR8VWEG015MC2DYD22H4CM
 'SP2D0MKNF3CV7EQY2HPX10D9YMQG6AB104M808N55
 'SP2V01M60V88T7HF2WT7PEB53B4BFS3A0TJV2H5NW
 'SPKMG3623R1D5XTJXG80RGMDZ0C462BXBJ3Q1K1G
 'SP3KRJTWQ83KV8GNFXQVKZY8Q594SQ6AKSAVP5Y0S
 'SP2BACT48Z5Z82A3BZN7NXTGD6TGM6A93BQSD0HP5
 'SP1RNRWWNY052GAT7B3E8S3TWM7D7MRP6HPEDF215
 'SPR99A9WZ2ESJCRMZA5WGR9DHWKYGGRT9337G4C
 'SP1Z15KWHMWFH6N4XQ8RNTMWN4KQVBFKAQW1ZX8VX
 'SP1JBDCKXVSPRW6340Y3P31DBFBSYJ42DK012G64R
 'SP245KAZ48Q4N1RE6PCHGRANYH6TXX0DG4PQSAT8V
 'SP1NN5RP6G9NV7JCBBBWQX1X2KY813005G4VKWTCB
 'SP35H4EKMEHS4HJKBB6HDX9909ZCWDF0GFX2NRN3
 'SPV9X7J2SXDT2EDEY8YCQGBZKD63JX737VQPMSQF
 'SP1RS94BWM0F66GB40N299FF8AQJ8GM5W0BCB5JVS
 'SP3KE8ZDNZ0QCKCWXMW1NVGFBZ83TP985SPRFYXVB
 'SPK8A95GCX48AAV8HDPQMEVTBVYJ0M067K45SBNP
 'SP3ESWRH568H33R78NH67JS9GX8CG1C5RYCZRYPDN
 'SP14QR1861Z6CDJ9QZPBZNEHKVE4229MQDQA3394X
 'SP26KG3J25NRJC3HC2BD6930WKE8DAEM0QK6PXZ35
 'SP8YSRK1GXZTPNGRYW06M744FVTQSKY0MWJ2KE2W
 'SPHBNR9MN87MN4MG5SSTKYC1MSTR14M0WWK9A6BT
 'SP300XEHTEBJT8BE9R6QABC2XYS38JBF00P0RFDH5
 'SPAWF26YJTQVCVPY2B0PCWFE070SFCSHFVTMY067
 'SP3D556RSW44FZHPS2YQJ9C6HK18HW1MEEN6D1CE5
 'SP2E0C29AVHH8DDY10MZ4K97PTCZ2SEVNE96F1WJ1
 'SP1M2Z1QTJCWYMF0F5JB5KYNDHZRWKBSJEAYHHPY4
 'SP22KS826Q8ZPKVHAA0DTMHB6KRASHS7A5P6PKN6W
 'SP24GMJYZ8A9975CZF7ZR3QKGFMF84QTKTNF4NRR9
 'SP385NP4NGJ28P0HE6355HHA9B18763Q2QP69GX4R
 'SP3KJ6CQASTSGD0Z7A19V33VAMSEMY0XPD80F0XCA
 'SP13688SZPX05F6VT48ND1KRKYS72CXDCKE3XC1S3
 'SP1AZZK1771VF680CW9V61H1XVHX3R9ZJKSD3496G
 'SP1CEQF1GK3DXJ9PTB9NQMQNK1SR8FJR1ADBREQ6F
 'SP1KEC0T7NJ8JAYG6G5WNK609HWTKZP1ZSHAM6TF9
 'SP1WXRMPVSP5NSHRE24KEAQETCC8KYNYTV58CS55H
 'SP21BKCJC80FR7T55Z0ZTKGP7BC8HJV6B99T4BM34
 'SP23NGNEG3DXR9SGAZ1FN8VK1SXZAHPZ4EB8HFT41
 'SP27NAC1H0YGMG939XNZW6ET1R84Z873W73EXB8QA
 'SP3D16S6RS6667WTZF0CY3ZF07ERVWRK1K721RGDC
 'SP583YCXSJ1C0C48CX85DHKQMV5JD1PJG3YQBCS0
 'SPM19B8JM0RQR38VYATJ0W2C6AZNEDKEHBY5N60Z
 'SPW7M55XXDFP6VP7E4CW4AWAQ6S6X6NBZQEKV83H
 'SPX844BXY4H5BWBB1ACFSFF25SPC5K3FP0XE8VKZ
 'SP1QJDPGAJPRGQN4T1X6RHGAEJTAQ9DG68CXADQH2
 'SP1HAZNEA5A56YKH7KM18M39DE0DV0H7ZX5K9FT3J
 'SP1BCD986ZZ71D7K1PJ76MEQGE5A0430JP3XEP2EB
 'SP33DNHJ2P3XCB5R5JF0TCA6R8ATG7NJCV3D4R5T2
 'SP18Q01BQT4QNJBHSSQCP534E71B7A9DD1X1M6069
 'SP3FHG75XH0KMKDEBJ3BSFTQHWZ7KFGVSKHT41B3N
 'SPT12CDNQ1M0EYGCA3GF1VKP95W837SZ345GRM5S
 'SP1G3TT99S4KTQCNCM5QN7MV73JBX54AY387J8M2T
 'SP224G21ZK17WA7D2VZC17JPWQ1PWEDPB418HM127
 'SP2RNDYEAZWKVDB06TT761GRZ67VV8WVV4YBH6W73
 'SP28Y4F82SRB420KDJC2BPE6TQ52A9HXMAKWVPJPE
 'SP39TBSPBEBSSZWEFWAC2FZR9V94C05EWCFHW91ZT
 'SP1EQPJS15JMH6YHA079SH15E77ZZB321NQBR5RZ1
 'SP3XGM1Q16NMC4Q7NY50H708GAXRT32BWHRCZ9J2B
 'SP16VHK2PS58YM582Y1K27374T6Q64MYZ1XJWN1FR
 'SP1NQJ3QXX4KW0R0G9WHZ26S96T5KF9VM6K0FJN3V
 'SP315XBDYJXGQZ9T3JMV2D9H90AJDWPV4V78FQMGK
 'SP3AH0JM7FYBGT4FH8GA1A20XTDVQ3NPZGGB7N5AG
 'SPBHVPH6JCG2XSD7JAF17X60BN6EPR67KYRDN20A
 'SPMS02JR723GVC4YRNC6NSMH0ACBGMSZE7XN5271
 'SP3VRAKW72G7GEM2YYT9GV3QK51NNBGNRNEEHEZC0
 'SPFAB8A6D49T8WVHGE0NM6YQJYEDGDM6E2WAH8MP
 'SP5H2M81YDS6A8EX2ZP0KBPDHM6CVWHJQC2Y92W1
 'SP29C68FVGV48H7GNFSRRQQJMC3VMVCRTXNCGBFRV
 'SP2X4SDD5KGTQ225ENR03BVCH2V6F28EBX60814AQ
 'SP368221WC2VG7FBKXV9WZV1H392AWA3VXRZ9RRNN
 'SP2FSQ43XMXR76HN1X0YMXWJN4NX7HKKC6DX7D2H6
 'SP1RR6PNPESZSC8Y7APDX0GZCBJ394YSFPKVMDK3V
 'SP2HQ825GJ0DDW4QZ26DA1HTTNMFVJV0SNFPN4XT0
 'SP1232YJY3NM44265BK37ZC3S6BQ1JXB4MZG1MAZ9
 'SP2K3F56YDVABD2MQG01KGJ0RQZYY4C8B6VJS5GT4
 'SP25QW4AHC6707ZKDSYYZ46051ZAQ46WKVXAWANFV
 'SP6KRD4ZC5XWCAV3Y13PRGWE5MMYARCSQ500HMVS
 'SP1M9ZCKKVZ64YJBXQ3J7D583CFY5SMEXPSAXH7D7
 'SPQAEDQNPDPD2GEDD8MAHZCSYK61G9EEGVGJYQCD
 'SPZ9HDY5E9TNN5HZPXXZBRMXQX91PRH88GW55BFF
 'SP2KD79FKDGDM8K9HRBG26YC6MNAD3EFM7A6A9ZM1
 'SPMMGJRF75N96PCMVQDMC0Z494FNENAHANRV0YVF
 'SP35MPPWKDMNVQZV54VXJ68P6CXWFRVWYT00B9KXP
 'SP3HWGJK8QX4NST283XCGBJSNASJENMC1AN4G3BFJ
 'SP1974GCPXTJWQ3RFZK5AEX57KR0795YE2RHGSWJZ
 'SP3BWND6AM8E7BE6RMZXF0HTFVRFWC95007C4983Y
 'SP3DWBR82JNVM12ZSB4AAG9TR3H7C5P5Q5XT69NPS
 'SP3N9TS22GFG2JH1BJA0JPPTXK7RTYCJNMVZ7XM9R
 'SPDFV56J717C5TVRSN7DR6C5H4BY9ARF2HFNKJ51
 'SP3AXDTQX90ZEK0N5KPZZYM0HPJ1MJ7ZR5TZ3B5J5
 'SP14WHZA3PF2YJ4GFY30CQ5VXXREGRP2H7DGV87YA
 'SP1EB80713ZFETGR8S3KBV8K7WCEHYD9JWNC8PKN6
 'SP1H0BYZV0TZBZHAFYPWSDWREYKWJJG8038E7EQX2
 'SP1KJSAPJ2XJAFSE3TDGCPFR1TCSCAT4D2CPYE4TP
 'SP1KPBGP2XT0TSWJPQFKPD9BYPVE0K577E0ER4CT0
 'SP1PMXTRHC1XE9GW85YQMMHG6YZJC0Z0WS6MYHKMY
 'SP1QQN26PNJC8TD49FEJT5C724AWAV32WHDGADX0J
 'SP28XAJ7VKVRP98W92MG44K8YAT8TZEFPQK4CZABM
 'SP2DTEE7S9QQD2AGEZ5FHBZMJ0ZMF8P7DZBKEKE74
 'SP3163VNMQR33CXNEKVNAMY9E3Y92R1NPWFVJRGGP
 'SP379F3C8GP8P8AQBW2XZK19M8E931QJG8P989PK8
 'SP3JM11KT5JPM0QHQ8595X0C20X1Q4WXAR7BNM3BA
 'SP3P05D4FYZA8JD0TJRTPQV2WXGSEYARSAR2RJ99Y
 'SPMRWFR3A694JWBVA9NNVJMCHM5783E3JNQA9B1H
 'SPV04KH4DBYA5DK1Z9JRP04VG1WAH3H6P9QH2H42
 'SPWJAFHY9W429CHCF4W5J6M586VKKG9X95RCJNDJ
 'SP2XD5DWC4MV7EESVAXZ54KHGJBSGR3XGJV7HC4DZ
 'SP1MW3AW4CMK1FNRGQ2RTCF53HRC5Z5JBTM00H81X
 'SPXM2HC3Z9TG1JJMDYN5892X3DM2ERQ77KF4QPGT
 'SP1E3DQ5RHZM51KHNAN8FSPT7HX6TNT42P7WDVWWK
 'SP6HWZGDYMCVN5EJ02S8X415SERB4VZSQSTXCE72
 'SPPFNMNCX6Q2TCDJJHGAC763C12875NA97R6F8NJ
 'SP1X755JKKQ88WXNTXHEX0EJ12W957AZAQEH28JWW
 'SP1FFYZ5D6QZASSV76STRKBWPRB9VMBKYF9EMNYW5
 'SP3CBJC1C3XA9J0ZA7HXNK67AWECP6XX6TF58A1A0
 'SPCPXYYZEXDBKMQHYG6EG9PX59T19KP0H0RJSDT3
 'SP3612WSXDWE16B7GQEEMGMA04EE4XCH9M7V40Z5Y
 'SP1E7F45EV6NQJ6XNH3W06DV5P6EQRRYXDRVDXCGA
 'SP32556X6B0V9GDE9GRX6BQ7EBKV6HSKG3ERZG58S
 'SP1BRHMJD4H6C5NQFA6HYGKFX6Z2E75J7WD7QZ5X5
 'SP2JSPQD7M61NMJ77PVDXA7SQEPHSRR3V1NNQ8J80
 'SPYS2VWA4306ASCEYR03Q785X2YENQB1BGF6Y8DF
 'SP263ACQ08D5J4PWQFTHAX8GG0TDFCGX3MKG43HKX
 'SP099VSFS5TK88TM1GJ3MWKHPBA3XMG0PG3PFYYR
 'SP2SE5910ANTWH06F32V892KQTEAGWFV7RBBX11CQ
 'SP3WC7TCFBPVZDARCDTSZB5NV5C73E643S03SM9R9
 'SP3Y6TRFRFWMK1MZ660VGG9Q7TH9XNQRVKHCM9EA3
 'SPFF2RQTP864RRA58NEJ886G75T4J32XEJ37CCWJ
 'SP30GSD56W7864WR53E1J4A1H7XC88SR7RXT0TMEE
 'SPTN43YKK34RFDZM45YAPWAPAVD33PN38BB1JFWV
 'SP2YFZKRZ6TJ2MGD4148QPY2M3PCEZB727XFYFARG
 'SP1E3SYVDWCA3TRWT6TF2C3GAHSZB0NSEAQ46WEK2
 'SP3953FB8S7F2WCXF7398CXF38ZM49E5C244J91NY
 'SP3KMYV70ZDN6EH42W6FXW76GCG77NJPD1SGT6C9B
 'SP1RVC8T0ZEFBB02VRK6ASERG6QQ0YSGB10BZQREP
 'SP15PDXH4MEW0NZX7P8NM4K1M81E5CRFH705VBCG6
 'SP2AJTGB4GBG9CJ9DRX5HMQGHEM34KNH3DXSS7HF1
 'SP2VTG5QDQ6HHW0G4FGAZ3E9EHS4WS7Y966SRGNAG
 'SP3308YQTG8XGG3PFK35KJJA0TYCG0RVVRVQ3HXZA
 'SP1A3225DQ95B2ZBFDP36DZYK63Q9N00EZCXRH8BK
 'SP20HWFWFRYM4VNASWK14EWTFVBZCB992NP7MNZ53
 'SP3CSDCC7EVPGXVWRFFSDMZNGZ6Z3T956BPGCWPB3
 'SP3JCNGT06X8T79KAZGG5XS8ZGGMS8DSPYXEFJ26
 'SPKPC9WPM60DHAD1WHTCDC1M55YE0ZYD8J88X54Q
 'SPZX735T7Z97GSC7GZM6RP7BKMYKBZNGTGAG2XAF
 'SP3JJVFJHYF83D3EWEVDHCFXN1AEFM61BN98TA5NP
 'SP1DMY09AC1716AQ4BQ6F9XC4QK5PRT0C4H3AN0SH
 'SP1KSPYGMENSE273CGPEDGW7ZBCJTYRRM1A6ER3ZK
 'SP3N83E2GM68KKQDW8BR0VDRXH9VVHQEJ3ATZFQJ7
 'SP3GP0D1A19TFFF40QVVSXESWRSBVR2NV03FZGDYY
 'SP3JFGYA2CZNCA5NR654AXK54EXY38FHKVDQ093J2
 'SP3ZMRR6M0YV2EG2C43MJCHTRG6R7YQMPKR1G25AW
 'SP2TQCP43Y2KGJJ64T9EHVRDHGD4CRFBWS8W41QH6
 'SP3RVVNA7MKG8Z4B0C7WKZCQVSKRMQPDQGWACE9SF
 'SP3ZWA4895AZJ16QNE8WJHCCK9HPZBV5JM1CJQZ23
 'SP1H9SVTH7HJQWPH620Z9QSSEZPNNTGPWPAYESJ20
 'SP1YCXKS2M73899W7BCAW3NBRQJCB62ZYVABWYTGM
 'SP21JTQXW01SSEQBFJG3F0QTSN907XDDCAKCGCVJT
 'SP2D7PG71J84XGRCKAWC3ZDHZ2R80QN4SHZN2DY5B
 'SP2N994D7NGFC71SRPDDY5Z1TWZ1PRH0R7CEDYR67
 'SP2YJW1HA7FY2FBEMEKJYDD6RX9EBAGQ8JECX44C4
 'SP2ZVF10TKX0CB2VK2C2F2CQ31GYYE05VHP28HCPP
 'SP30PJRM2E3KXGF2289PB44ZFTGSX5BRRNJ2Q0AFM
 'SP31V48MFS28BFC5S8DSWVHNDW9E5CGTE85WDQMGB
 'SP3JTNRJXP7T8RM0GZRGVCYCW8ZPJJHS54J3RATE
 'SP3PAFA4N0SAYJQQ3N24QQC9PNQK7211D2R5HKZ72
 'SP7BZRBZMP1XJWP3RQDAQRA7PTYGB2FE4S1X8T7D
 'SPD916KQF90CRTBCAAGQFFMX5KD5G2RC257KMDYV
 'SPE2QZA0K5R8DHFBSZFQEH3PHWF68V0FDKQ7VJGQ
 'SPNQMBXEM92PQH5VE12E82JG74PHPP1TW5FAT84P
 'SPTQANDS81X5P9DJCCZ4NGHVA508R6K9C3HYD7AQ
 'SP3MTMK8YQ3PYX66ZT59JGJ173ZBHTHJCXNPEEW32
 'SP2HRC2R8XYXHBFJ0RQXKQNANYEDWE4V91PQ0XF68
 'SP1159JBSJX2E7TCRMQT5HGXDZZCNC7S5K418TW9R
 'SPD14397EJ75FDMAA61CYGTDNN3Q5M8DVT7E469F
 'SP2Z7E3KQ7ZEB43D0DAT7NACYAC4QX8KM49TP5MKK
))

(define-public (burn-mint-zststx)
  (begin
    (asserts! (var-get enabled) (err u10))
    (asserts! (is-eq deployer tx-sender) (err u11))
    (asserts! (not (var-get executed-burn-mint)) (err u12))
    ;; enable zststx access
    (try! (contract-call? .zststx set-approved-contract (as-contract tx-sender) true))
    (try! (contract-call? .zststx-v1-0 set-approved-contract (as-contract tx-sender) true))
    (try! (contract-call? .zststx-v1-2 set-approved-contract (as-contract tx-sender) true))
    (try! (contract-call? .zststx-v2-0 set-approved-contract (as-contract tx-sender) true))

    ;; burn/mint v2 to v3
    (try! (fold check-err (map consolidate-ststx-lambda ststx-holders) (ok true)))

    ;; disable access
    (try! (contract-call? .zststx set-approved-contract (as-contract tx-sender) false))
    (try! (contract-call? .zststx-v1-0 set-approved-contract (as-contract tx-sender) false))
    (try! (contract-call? .zststx-v1-2 set-approved-contract (as-contract tx-sender) false))
    (try! (contract-call? .zststx-v2-0 set-approved-contract (as-contract tx-sender) false))

    
    (var-set executed-burn-mint true)
    (ok true)
  )
)


(define-private (consolidate-ststx-lambda (account principal))
  (consolidate-ststx-balance-to-v3 account)
)

(define-private (check-err (result (response bool uint)) (prior (response bool uint)))
  (match prior ok-value result err-value (err err-value))
)

(define-private (consolidate-ststx-balance-to-v3 (account principal))
  (let (
    ;; burns old balances and mints to the latest version
    (v0-balance (unwrap-panic (contract-call? .zststx get-principal-balance account)))
    (v1-balance (unwrap-panic (contract-call? .zststx-v1-0 get-principal-balance account)))
    (v2-balance (unwrap-panic (contract-call? .zststx-v1-2 get-principal-balance account)))
    )
    (if (> v0-balance u0)
      (begin
        (try! (contract-call? .zststx burn v0-balance account))
        (try! (contract-call? .zststx-v2-0 mint v0-balance account))
        true
      )
      ;; if doesn't have v0 balance, then check if has v1 balance
      (if (> v1-balance u0)
        (begin
          (try! (contract-call? .zststx-v1-0 burn v1-balance account))
          (try! (contract-call? .zststx-v2-0 mint v1-balance account))
          true
        )
        ;; if doesn't have v1 balance, then check if has v2 balance
        (if (> v2-balance u0)
          (begin
            (try! (contract-call? .zststx-v1-2 burn v2-balance account))
            (try! (contract-call? .zststx-v2-0 mint v2-balance account))
            true
          )
          false
        )
      )
    )
    (ok true)
  )
)

(define-read-only (can-execute)
  (begin
    (asserts! (not (var-get enabled)) (err u10))
    (ok (not (var-get enabled)))
  )
)


(define-public (disable)
  (begin
    (asserts! (is-eq deployer tx-sender) (err u11))
    (ok (var-set enabled false))
  )
)

Functions (6)

FunctionAccessArgs
burn-mint-zststxpublic
consolidate-ststx-lambdaprivateaccount: principal
check-errprivateresult: (response bool uint
consolidate-ststx-balance-to-v3privateaccount: principal
can-executeread-only
disablepublic