Skip to content
This repository was archived by the owner on Mar 10, 2025. It is now read-only.

Commit 49e0661

Browse files
committed
minting and name length issue
1 parent 1e5e013 commit 49e0661

9 files changed

+108
-19
lines changed

package-lock.json

+4-4
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@
6262
"flowbite-svelte-icons": "^0.4.4",
6363
"micro-packed": "^0.3.2",
6464
"sats-connect": "^1.1.1",
65-
"sbtc-bridge-lib": "^1.1.24",
65+
"sbtc-bridge-lib": "^1.1.25",
6666
"sockjs": "^0.3.24",
6767
"svelte-local-storage-store": "^0.5.0",
6868
"svelte-qrcode": "^1.0.0",

src/lib/components/admin/DecodeSbtc.svelte

+2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import { onMount } from 'svelte';
33
//import { parsePayloadFromTransaction } from 'sbtc-bridge-lib';
44
import { CONFIG } from '$lib/config';
55
import { parsePayloadFromTransaction } from 'sbtc-bridge-lib';
6+
import { mintToMerkle } from '$lib/sbtc_admin';
7+
import Button from "../shared/Button.svelte";
68
79
export let tx:any;
810
let res:any;

src/lib/components/admin/TransactionAnalysis.svelte

+1-1
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ import VerifyTransactions from './VerifyTransactions.svelte';
8282
<div class="">
8383
{#if tx}
8484
{#if feature === 'sbtcDecode'}
85-
<DecodeSbtc {tx}/>
85+
<DecodeSbtc {tx} />
8686
{:else if block}
8787
<VerifyTransactions {tx} {block}/>
8888
{/if}

src/lib/components/admin/VerifyTransactions.svelte

+7-6
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { onMount } from 'svelte';
77
import { sha256 } from '@noble/hashes/sha256';
88
import { explorerAddressUrl } from '$lib/utils';
99
import { sbtcConfig } from '$stores/stores'
10-
import { bitcoinToSats, generateMerkleRoot, generateMerkleTree, getParametersForProof, type TxMinedParameters } from 'sbtc-bridge-lib';
10+
import { bitcoinToSats, generateMerkleRoot, generateMerkleTree, getParametersForProof, parsePayloadFromTransaction, type TxMinedParameters } from 'sbtc-bridge-lib';
1111
import { CONFIG } from '$lib/config';
1212
import { loggedIn } from '$lib/stacks_connect';
1313
/**
@@ -172,17 +172,19 @@ const verifyMerkleProof = async () => {
172172
console.log(answer)
173173
}
174174
175-
const mintTo = async () => {
176-
functionName = 'verify-merkle-proof'
175+
const mintTo = async () => {
176+
const data = parsePayloadFromTransaction(CONFIG.VITE_NETWORK, tx.hex)
177+
let prin = data.stacksAddress;
178+
if (typeof (data.lengthOfCname) === 'number' && data.lengthOfCname > 0) prin += '.' + data.cname
177179
contractParameters = {
178180
amount: tx.vout[1].amount,
179181
txid: hex.encode(hex.decode(tx.txid)),
180-
stxAddress: stxAddress,
182+
stxAddress: prin,
181183
proofs: (proofString) ? proofString.split(' ').join('<br/>') : parameters.proofElements.map(({ hash }) => hash).join('<br/>'),
182184
'tx-index': parameters.txIndex,
183185
}
184186
185-
const res = await romeoMintTo($sbtcConfig.sbtcContractData.contractId, amount, stxAddress!, tx.txid, parameters.height, getProofsAsCV(), parameters.txIndex, parameters.headerHex)
187+
const res = await romeoMintTo($sbtcConfig.sbtcContractData.contractId, amount, prin!, tx.txid, parameters.height, getProofsAsCV(), parameters.txIndex, parameters.headerHex)
186188
console.log(res)
187189
}
188190
@@ -289,7 +291,6 @@ onMount(async () => {
289291
<label for="transact-path">Amount (sats)</label>
290292
<input type="number" class="text-black block p-3 rounded-md border w-full" bind:value={amount}/>
291293
</div>
292-
<div class="mb-5"><Button darkScheme={false} label={'Mint'} target={''} on:clicked={() => mintTo()}/></div>
293294
{/if}
294295

295296
{#if showTree}

src/lib/components/dashboard/dr/SignTransaction.svelte

+11-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { sbtcConfig } from '$stores/stores';
77
import { explorerBtcTxUrl } from "$lib/utils";
88
import { saveBridgeTransaction } from '$lib/bridge_api';
99
import type { BridgeTransactionType } from 'sbtc-bridge-lib'
10-
import { buildDepositTransaction, buildDepositTransactionOpDrop } from 'sbtc-bridge-lib'
10+
import { buildDepositPayload, buildDepositTransaction, buildDepositTransactionOpDrop, parseDepositPayload } from 'sbtc-bridge-lib'
1111
import { appDetails, getStacksNetwork, isLeather } from "$lib/stacks_connect";
1212
import Invoice from '../shared/Invoice.svelte';
1313
import { CONFIG } from '$lib/config';
@@ -16,6 +16,7 @@ import { BitcoinNetworkType, signTransaction, type SignTransactionOptions } from
1616
import { broadcastTransaction } from '$lib/sbtc';
1717
import type { Transaction, TransactionOutput, TransactionInput } from '@scure/btc-signer';
1818
import { Tooltip } from 'flowbite-svelte';
19+
import { buildDepositPayloadInternal } from '$lib/stacks_connect_bug';
1920
2021
export let peginRequest:BridgeTransactionType;
2122
export let addressInfo:any;
@@ -146,6 +147,15 @@ onMount(async () => {
146147
transaction = buildDepositTransactionOpDrop(CONFIG.VITE_NETWORK, $sbtcConfig.payloadDepositData, $sbtcConfig.btcFeeRates, addressInfo.utxos, peginRequest.commitTxScript!.address!);
147148
} else {
148149
transaction = buildDepositTransaction(CONFIG.VITE_NETWORK, $sbtcConfig.sbtcContractData.sbtcWalletPublicKey, $sbtcConfig.payloadDepositData, $sbtcConfig.btcFeeRates, addressInfo.utxos)
150+
/**
151+
*/
152+
const data1 = buildDepositPayloadInternal(0, $sbtcConfig.payloadDepositData.principal, false)
153+
const dout1 = parseDepositPayload(hex.decode(data1))
154+
const data = buildDepositPayload(CONFIG.VITE_NETWORK, $sbtcConfig.payloadDepositData.principal);
155+
const dout = parseDepositPayload(hex.decode(data))
156+
console.log(data1)
157+
console.log(dout)
158+
console.log(dout1)
149159
}
150160
if (transaction.inputsLength === 0) {
151161
errorReason = '<p>Unable to create / sign transaction</p><p>You can change the bitcoin address on the previous screen to your Bitcoin Core or Electrum wallet and then copy paste the PSBT before signing and broadcasting the transaction.</p>'

src/lib/config.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ const SHARED_DEVENV_CONFIG = {
44
VITE_PUBLIC_APP_VERSION: '1.0.0',
55
VITE_NETWORK: 'devnet',
66
VITE_SBTC_COORDINATOR: 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM',
7-
VITE_BRIDGE_WS: 'ws://localhost:3010',
7+
VITE_BRIDGE_WS: 'ws://45.79.130.153:3999',
88
VITE_BRIDGE_API: 'http://45.79.130.153:3010/bridge-api/v1',
99
VITE_STACKS_API: 'http://45.79.130.153:3999',
1010
VITE_STACKS_EXPLORER: 'http://45.79.130.153:3020',
@@ -18,7 +18,7 @@ const SHARED_DEVENV_LOCAL_CONFIG = {
1818
VITE_PUBLIC_APP_VERSION: '1.0.0',
1919
VITE_NETWORK: 'devnet',
2020
VITE_SBTC_COORDINATOR: 'ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM',
21-
VITE_BRIDGE_WS: 'ws://localhost:3010',
21+
VITE_BRIDGE_WS: 'ws://45.79.130.153:3999',
2222
VITE_BRIDGE_API: 'http://45.79.130.153:3010/bridge-api/v1',
2323
VITE_STACKS_API: 'http://45.79.130.153:3999',
2424
VITE_STACKS_EXPLORER: 'http://45.79.130.153:3020',

src/lib/sbtc_admin.ts

+31-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
* sbtc - interact with Stacks Blockchain to read sbtc contract info
33
*/
44
import { CONFIG } from '$lib/config';
5-
import { PostConditionMode, uintCV, stringAsciiCV, bufferCVFromString, bufferCV, cvToJSON, deserializeCV, type ListCV } from '@stacks/transactions';
5+
import { PostConditionMode, uintCV, stringAsciiCV, bufferCVFromString, bufferCV, cvToJSON, deserializeCV, type ListCV, contractPrincipalCV } from '@stacks/transactions';
66
import { tupleCV } from '@stacks/transactions/dist/esm/clarity/index.js';
77
import { principalCV } from '@stacks/transactions/dist/esm/clarity/types/principalCV.js';
88
import { openContractCall } from '@stacks/connect';
@@ -29,7 +29,10 @@ export function isCoordinator(address:string) {
2929

3030
export async function romeoMintTo(contractId:string, amount:number, stxAddress: string, btcTxid: string, height: number, merkleProofs: ListCV, txIndex:number, headerHex: string) {
3131
//data {addr: principal, key: (buff 33)}
32-
const stxAddressCV = principalCV(stxAddress);
32+
let stxAddressCV = principalCV(stxAddress);
33+
if (stxAddress.indexOf('.') > -1) {
34+
stxAddressCV = contractPrincipalCV(stxAddress.split('.')[0], stxAddress.split('.')[1]);
35+
}
3336
const functionArgs = [uintCV(amount), stxAddressCV, bufferCV(hex.decode(btcTxid)), uintCV(height), merkleProofs, uintCV(txIndex), bufferCV(hex.decode(headerHex))]
3437
await openContractCall({
3538
network: getStacksNetwork(),
@@ -73,6 +76,32 @@ export async function mintTo(contractId:string, amount:number, stxAddress: strin
7376
});
7477
}
7578

79+
export async function mintToMerkle(amount:number, stxAddress: string, btcTxid: string) {
80+
//data {addr: principal, key: (buff 33)}
81+
const contractId = CONFIG.VITE_SBTC_COORDINATOR + '.asset'
82+
83+
const btcTxidCV = bufferCV(hex.decode(btcTxid))
84+
const stxAddressCV = principalCV(stxAddress);
85+
const functionArgs = [uintCV(amount), stxAddressCV, btcTxidCV]
86+
87+
await openContractCall({
88+
network: getStacksNetwork(),
89+
postConditions: [],
90+
postConditionMode: PostConditionMode.Deny,
91+
contractAddress: contractId.split('.')[0],
92+
contractName: contractId.split('.')[1],
93+
functionName: 'mint',
94+
functionArgs: functionArgs,
95+
onFinish: (data: any) => {
96+
console.log('TX Data: ', data);
97+
return data;
98+
},
99+
onCancel: () => {
100+
console.log('popup closed!');
101+
}
102+
});
103+
}
104+
76105
export async function burnFrom(contractId:string, amount:number, stxAddress: string, btcTxid: string) {
77106
//data {addr: principal, key: (buff 33)}
78107
const btcAddressCV = stringAsciiCV(btcTxid);

src/lib/stacks_connect_bug.ts

+49-2
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,56 @@ import {
77
signMessageHashRsv,
88
} from '@stacks/transactions';
99
import { sha256 } from '@noble/hashes/sha256';
10-
import { MAGIC_BYTES_MAINNET, MAGIC_BYTES_TESTNET, getAddressFromOutScript, parseDepositPayload, parseWithdrawPayload, type PayloadType } from 'sbtc-bridge-lib';
11-
import * as btc from '@scure/btc-signer';
10+
import { MAGIC_BYTES_TESTNET, PEGIN_OPCODE, amountToBigUint64 } from 'sbtc-bridge-lib';
1211
import { hex } from '@scure/base';
12+
import { c32addressDecode } from 'c32check';
13+
import * as P from 'micro-packed';
14+
const concat = P.concatBytes;
15+
16+
export function buildDepositPayloadInternal(amountSats:number, address:string, opDrop:boolean):string {
17+
const magicBuf = hex.decode(MAGIC_BYTES_TESTNET)
18+
const opCodeBuf = hex.decode(PEGIN_OPCODE);
19+
const addr = c32addressDecode(address.split('.')[0])
20+
//const addr0Buf = hex.encode(amountToUint8(addr[0], 1));
21+
const addr0Buf = (hex.decode(addr[0].toString(16)));
22+
const addr1Buf = hex.decode(addr[1]);
23+
24+
const cnameLength = new Uint8Array(1);
25+
//const memoLength = new Uint8Array(1);
26+
const principalType = (address.indexOf('.') > -1) ? hex.decode('06') : hex.decode('05');
27+
let buf1 = concat(opCodeBuf, principalType, addr0Buf, addr1Buf);
28+
if (address.indexOf('.') > -1) {
29+
const cnameBuf = new TextEncoder().encode(address.split('.')[1]);
30+
const cnameBufHex = hex.encode(cnameBuf)
31+
let cnameLen:any;
32+
try {
33+
cnameLen = hex.decode(cnameBuf.length.toString(8))
34+
} catch (err) {
35+
cnameLen = cnameLength.fill(cnameBufHex.length);
36+
}
37+
buf1 = concat(buf1, cnameLen, cnameBuf);
38+
} else {
39+
cnameLength.fill(0);
40+
buf1 = concat(buf1, cnameLength);
41+
}
42+
/**
43+
if (memo) {
44+
const memoBuf = new TextEncoder().encode(memo);
45+
const memoLength = hex.decode(memoBuf.length.toString(8));
46+
buf1 = concat(buf1, memoLength, memoBuf);
47+
} else {
48+
memoLength.fill(0);
49+
buf1 = concat(buf1, memoLength);
50+
}
51+
*/
52+
if (opDrop) {
53+
const feeBuf = amountToBigUint64(amountSats, 8)
54+
buf1 = concat(buf1, feeBuf)
55+
}
56+
57+
if (!opDrop) return hex.encode(concat(magicBuf, buf1))
58+
return hex.encode(buf1);
59+
}
1360

1461
export const keyChain = {
1562
"mnemonic": "foster raise devote wear great volcano spring chapter among violin bleak syrup rent sphere coyote client govern spirit good risk cruise twice trick jealous",

0 commit comments

Comments
 (0)