Skip to content

Conversation

@norwnd
Copy link
Owner

@norwnd norwnd commented Jul 19, 2023

This is a rough MVP of an idea outlined in decred#952 (comment) that can be used by tech-savvy DEX users.

It's vendor-specific(and prevents trades when vendor service is unavailable), has weak privacy, yet it should do the job. This implementation is currently using https://web3portal.com vendor that allows for up to 2500 free uploads, which should be sufficient for most use-cases.

However I haven't tested it for Taker redeem (not 100% sure if it'll work): redeem is problematic, if Maker already redeemed Taker will need secret + secretHash in order to redeem his part (he can't refund after this point)

Well now run a test for this, it does work for Taker redeem actually, just need to:

  • find Maker redeem and fetch secret, for DCR might need to check FindKeyPush in dcrdex repo on how to extract secrets from DCR redeem txns, eg:
sigScript, err := hex.DecodeString("483045022100e619b9ecc2fd2ec4e3f38be09688c722661e8a1ef3dce09196a7f5dd30eaa25102202fa58fc4344f844ba3194a519c956f0c1baf8b82353d4b3cb9a8e5ba344e0b3901210380dcc0f97c89b186aab2329bae4b30ee920e17a3b6435e4c121178d908cdb4de20e365285e21fc311069cf206d9e56c8eaab996ae84d4c18787640cdb7a6c91253514c616382012088c020a017a12d2dc3f88f98c3225e226e16a5a1d3190a725ab90c32e5b6115620b7d48876a9148a00aafbd40a6e7b619a7b2ca0a8763b4b57507f6704520cbb64b17576a914ce45bc063873330be210f80ebd21acfd9aaf66226888ac")
	if err != nil {
		return fmt.Errorf("hex.DecodeString: %v", err)
	}
	contractHash, err := hex.DecodeString("b5c5936018751a6f427dfc524de0c8f547d183f4")
	if err != nil {
		return fmt.Errorf("hex.DecodeString: %v", err)
	}
	secret, err := FindKeyPush(0, sigScript, contractHash, chaincfg.TestNet3Params())
	if err != nil {
		return fmt.Errorf("hex.DecodeString: %v", err)
	}
	fmt.Println(fmt.Sprintf("secret hash: %x", sha256.Sum256(secret)))
	fmt.Println(fmt.Sprintf("secret: %x", secret))
  • then use this secret with the following code to broadcast Taker redeem transaction (using Decred wallet in this example, can put this into (dcr *ExchangeWallet) Unlock after successful wallet connect&unlock, and one needs to login in UI to trigger this code to run):
	hash, err := chainhash.NewHashFromStr("1793f5eebbfae6332744c48fd79f73b18c352e6375763a43f4da67fe7a5ae700")
	if err != nil {
		panic(err)
	}
	if err != nil {
		return nil, fmt.Errorf("chainhash.NewHashFromStr: %w", err)
	}
	contract := dex.Bytes{}
	err = contract.UnmarshalJSON([]byte(`"6382012088c0204facf7cbc8b60d05a88712b6c2e5ee82d8cfd7d2bd6805175e31923e498675ae8876a91439572304d4b32fe54f64f484ec6f06f268ecc0ed6704005eb864b17576a91460271efb85cb69f2a95e0fa205130c811bce9b946888ac"`))
	if err != nil {
		return nil, fmt.Errorf("contract.UnmarshalJSON: %w", err)
	}
	swapTx := dex.Bytes{} // https://testnet.dcrdata.org/tx/1793f5eebbfae6332744c48fd79f73b18c352e6375763a43f4da67fe7a5ae700
	err = swapTx.UnmarshalJSON([]byte(`"01000000013ac2f0308badac05af17334552b05044284f7f666ecb3674b8e76f1869dddd8c0000000000ffffffff0100c2eb0b00000000000017a914507e89df445fc26d92faae65bd86634081c917c287000000000000000001bacfeb0b000000000e0b11000800000069463043021f01bbbd5a4856184724efcb025744e3a5ecae6b2699e61f1d84a36b821f502f0220665ec826f38b8044f9a351e6a952c06b98f8a45f83f1ef083debde7d7c1607c10121032e65ecca0563a73aea48d95e5730c1d9f05d53c400fdb652974331e7f14ba7ad"`))
	if err != nil {
		return nil, fmt.Errorf("swapTx.UnmarshalJSON: %w", err)
	}
	info, err := dcr.AuditContract(toCoinID(hash, 0), contract, swapTx,  false)
	if err != nil {
		return nil, fmt.Errorf("dcr.AuditContract: %w", err)
	}
	secret := dex.Bytes{}
	err = secret.UnmarshalJSON([]byte(`"a25899484e1dfc660a5d3c5a3ae00d19650a300c1f1357b19ceba90a2d87e08c"`))
	if err != nil {
		return nil, fmt.Errorf("secret.UnmarshalJSON: %w", err)
	}
	coinID, out, _, err := dcr.Redeem(
		&asset.RedeemForm{
			Redemptions:[]*asset.Redemption{
				{
					Spends: info,
					Secret: secret,
				},
			},
		},
	)
	if err != nil {
		return nil, fmt.Errorf("dcr.Redeem: %w", err)
	}
	dcr.log.Infof("GOT coinID, out: %s, %s", spew.Sdump(coinID), spew.Sdump(out))

@norwnd norwnd force-pushed the backup-to-skynet-web3portal-for-disaster-recovery branch from e418d9d to 89f0afa Compare July 19, 2023 13:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants