@@ -22,15 +22,49 @@ const DEFAULT_API_BY_NETWORK = {
2222
2323const STACKFLOW_MESSAGE_VERSION = "0.6.0" ;
2424const BNSV2_API_BASE = "https://api.bnsv2.com" ;
25- const CONTRACT_PRESETS = {
26- "stx-mainnet" : {
27- contractId : "SP126XFZQ3ZHYM6Q6KAQZMMJSDY91A8BTT6AD08RV.stackflow-0-6-0" ,
28- tokenContract : "" ,
29- } ,
30- "sbtc-mainnet" : {
31- contractId : "SP126XFZQ3ZHYM6Q6KAQZMMJSDY91A8BTT6AD08RV.stackflow-sbtc-0-6-0" ,
32- tokenContract : "SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-token" ,
33- } ,
25+ const CONTRACT_PRESETS_BY_NETWORK = {
26+ devnet : [
27+ {
28+ key : "stx-devnet" ,
29+ label : "STX (devnet default)" ,
30+ contractId : "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.stackflow" ,
31+ tokenContract : "" ,
32+ } ,
33+ {
34+ key : "sbtc-devnet" ,
35+ label : "sBTC (devnet default)" ,
36+ contractId : "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.stackflow-sbtc" ,
37+ tokenContract : "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.test-token" ,
38+ } ,
39+ ] ,
40+ testnet : [
41+ {
42+ key : "stx-testnet" ,
43+ label : "STX (testnet default)" ,
44+ contractId : "ST126XFZQ3ZHYM6Q6KAQZMMJSDY91A8BTT59ZTE2J.stackflow-0-6-0" ,
45+ tokenContract : "" ,
46+ } ,
47+ {
48+ key : "sbtc-testnet" ,
49+ label : "sBTC (testnet default)" ,
50+ contractId : "ST126XFZQ3ZHYM6Q6KAQZMMJSDY91A8BTT59ZTE2J.stackflow-sbtc-0-6-0" ,
51+ tokenContract : "" ,
52+ } ,
53+ ] ,
54+ mainnet : [
55+ {
56+ key : "stx-mainnet" ,
57+ label : "STX (mainnet default)" ,
58+ contractId : "SP126XFZQ3ZHYM6Q6KAQZMMJSDY91A8BTT6AD08RV.stackflow-0-6-0" ,
59+ tokenContract : "" ,
60+ } ,
61+ {
62+ key : "sbtc-mainnet" ,
63+ label : "sBTC (mainnet default)" ,
64+ contractId : "SP126XFZQ3ZHYM6Q6KAQZMMJSDY91A8BTT6AD08RV.stackflow-sbtc-0-6-0" ,
65+ tokenContract : "SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-token" ,
66+ } ,
67+ ] ,
3468} ;
3569
3670const elements = {
@@ -482,22 +516,46 @@ function updateNetworkDefaults() {
482516 }
483517}
484518
485- function getPresetKeyByValues ( contractId , tokenContract ) {
519+ function getPresetsForNetwork ( network = readNetwork ( ) ) {
520+ return CONTRACT_PRESETS_BY_NETWORK [ network ] || [ ] ;
521+ }
522+
523+ function findPresetByKey ( presetKey , network = readNetwork ( ) ) {
524+ return getPresetsForNetwork ( network ) . find ( ( preset ) => preset . key === presetKey ) || null ;
525+ }
526+
527+ function renderPresetOptions ( network = readNetwork ( ) ) {
528+ const presets = getPresetsForNetwork ( network ) ;
529+ const selected = normalizedText ( elements . contractPreset . value ) || "custom" ;
530+ const options = [
531+ ...presets . map ( ( preset ) => `<option value="${ preset . key } ">${ preset . label } </option>` ) ,
532+ '<option value="custom">Custom (manual)</option>' ,
533+ ] ;
534+ elements . contractPreset . innerHTML = options . join ( "" ) ;
535+
536+ if ( presets . some ( ( preset ) => preset . key === selected ) || selected === "custom" ) {
537+ elements . contractPreset . value = selected ;
538+ } else {
539+ elements . contractPreset . value = "custom" ;
540+ }
541+ }
542+
543+ function getPresetKeyByValues ( contractId , tokenContract , network = readNetwork ( ) ) {
486544 const contractText = normalizedText ( contractId ) ;
487545 const tokenText = normalizedText ( tokenContract ) ;
488- for ( const [ presetKey , preset ] of Object . entries ( CONTRACT_PRESETS ) ) {
546+ for ( const preset of getPresetsForNetwork ( network ) ) {
489547 if (
490548 normalizedText ( preset . contractId ) === contractText &&
491549 normalizedText ( preset . tokenContract ) === tokenText
492550 ) {
493- return presetKey ;
551+ return preset . key ;
494552 }
495553 }
496554 return "custom" ;
497555}
498556
499557function applyContractPreset ( presetKey , { log = true } = { } ) {
500- const preset = CONTRACT_PRESETS [ presetKey ] ;
558+ const preset = findPresetByKey ( presetKey ) ;
501559 if ( ! preset ) {
502560 return ;
503561 }
@@ -821,10 +879,28 @@ function wireEvents() {
821879 elements . buildPayload . addEventListener ( "click" , handleBuildPayload ) ;
822880 elements . copyOutput . addEventListener ( "click" , handleCopyOutput ) ;
823881 elements . network . addEventListener ( "change" , ( ) => {
882+ const previousPresetKey = elements . contractPreset . value ;
824883 elements . stacksApiUrl . value = DEFAULT_API_BY_NETWORK [ readNetwork ( ) ] ;
884+ renderPresetOptions ( ) ;
885+ if ( previousPresetKey !== "custom" ) {
886+ const presets = getPresetsForNetwork ( ) ;
887+ if ( presets . length > 0 ) {
888+ elements . contractPreset . value = presets [ 0 ] . key ;
889+ applyContractPreset ( presets [ 0 ] . key ) ;
890+ }
891+ return ;
892+ }
893+ elements . contractPreset . value = getPresetKeyByValues (
894+ elements . contractId . value ,
895+ elements . tokenContract . value ,
896+ ) ;
825897 } ) ;
826898 elements . contractPreset . addEventListener ( "change" , ( ) => {
827- applyContractPreset ( elements . contractPreset . value ) ;
899+ const presetKey = elements . contractPreset . value ;
900+ if ( presetKey === "custom" ) {
901+ return ;
902+ }
903+ applyContractPreset ( presetKey ) ;
828904 } ) ;
829905 elements . contractId . addEventListener ( "input" , ( ) => {
830906 elements . contractPreset . value = getPresetKeyByValues (
@@ -843,9 +919,15 @@ function wireEvents() {
843919async function bootstrap ( ) {
844920 wireEvents ( ) ;
845921 updateNetworkDefaults ( ) ;
922+ renderPresetOptions ( ) ;
846923 if ( ! normalizedText ( elements . contractId . value ) && ! normalizedText ( elements . tokenContract . value ) ) {
847- elements . contractPreset . value = "stx-mainnet" ;
848- applyContractPreset ( "stx-mainnet" , { log : false } ) ;
924+ const presets = getPresetsForNetwork ( ) ;
925+ if ( presets . length > 0 ) {
926+ elements . contractPreset . value = presets [ 0 ] . key ;
927+ applyContractPreset ( presets [ 0 ] . key , { log : false } ) ;
928+ } else {
929+ elements . contractPreset . value = "custom" ;
930+ }
849931 } else {
850932 elements . contractPreset . value = getPresetKeyByValues (
851933 elements . contractId . value ,
0 commit comments