Skip to content

Commit

Permalink
implement cip62 submitDelegation
Browse files Browse the repository at this point in the history
  • Loading branch information
yushih committed May 30, 2023
1 parent 0841d07 commit 0500a1e
Show file tree
Hide file tree
Showing 14 changed files with 810 additions and 29 deletions.
3 changes: 3 additions & 0 deletions packages/yoroi-connector/example-cardano/index.html
Expand Up @@ -73,6 +73,9 @@ <h1 class="display-4 text-center">Cardano dApp Example</h1>
<div class="col-6 mb-4">
<button id="get-voting-credentials" class="btn btn-light w-100" >Get voting credentials</button>
</div>
<div class="col-6 mb-4">
<button id="submit-delegation" class="btn btn-light w-100" >Submit delegation</button>
</div>
<div class="col-6 mb-4">
<a href="/subpage.html">Go to a subpage</a>
</div>
Expand Down
42 changes: 34 additions & 8 deletions packages/yoroi-connector/example-cardano/index.js
Expand Up @@ -33,6 +33,7 @@ const getNFTs = get("#nfts");
const getNetworkId = get("#get-network-id");
const enableCatalyst = get("#enable-catalyst");
const getVotingCredentials= get("#get-voting-credentials");
const submitDelegation = get("#submit-delegation");

let accessGranted = false;
let cardanoApi;
Expand All @@ -45,6 +46,7 @@ let changeAddress;
let unsignedTransactionHex;
let transactionHex;
let catalystApi;
let votingCredentials;

function isCBOR() {
return returnType === "cbor";
Expand Down Expand Up @@ -1105,16 +1107,40 @@ getVotingCredentials.addEventListener("click", async () => {
toggleSpinner("show");
if (!catalystApi) {
alertError("Catalyst not enabled");
return;
}
try {
const result = await catalystApi.getVotingCredentials();
alertSuccess(JSON.stringify(result));
} catch (error) {
alertError(JSON.stringify(error));
console.error(error);
} else {
try {
votingCredentials = await catalystApi.getVotingCredentials();
alertSuccess(JSON.stringify(votingCredentials));
} catch (error) {
alertError(JSON.stringify(error));
console.error(error);
}
}
toggleSpinner("hide");
});

submitDelegation.addEventListener("click", async () => {
toggleSpinner("show");
if (!votingCredentials) {
alertError("Require voting credential");
} else {
const delegation = {
delegations: [
{
voteKey: votingCredentials.voteKey,
weight: 1,
}
],
purpose: 0,
};
try {
const result = await catalystApi.submitDelegation(delegation);
alertSuccess(JSON.stringify(result));
} catch (error) {
alertError(JSON.stringify(error));
console.error(error);
}
}
toggleSpinner("hide");
});

Expand Down
4 changes: 4 additions & 0 deletions packages/yoroi-connector/src/inject.js
Expand Up @@ -119,6 +119,10 @@ const initialInject = `
getVotingCredentials() {
return this._cardano_rpc_call('get_voting_credentials', []);
}
submitDelegation(delegation) {
return this._cardano_rpc_call('submit_delegation', [delegation]);
}
}
if (!await cardano_check_read_access()) {
Expand Down
16 changes: 13 additions & 3 deletions packages/yoroi-extension/app/api/ada/lib/cardanoCrypto/catalyst.js
Expand Up @@ -26,11 +26,12 @@ function prefix0x(hex: string): string {
}

export function generateRegistrationMetadata(
votingPublicKey: string,
delegationsOrVotingPublicKey: Array<[string, number]> | string,
stakingPublicKey: string,
rewardAddress: string,
nonce: number,
signer: Uint8Array => string,
votingPurpose: number = 0,
): RustModule.WalletV4.AuxiliaryData {

/**
Expand All @@ -50,13 +51,22 @@ export function generateRegistrationMetadata(
* }
*/

let delegations;
if (typeof delegationsOrVotingPublicKey === 'string') {
delegations = [prefix0x(delegationsOrVotingPublicKey), 1];
} else {
delegations = delegationsOrVotingPublicKey.map(
([votingPublicKey, weight]) => [prefix0x(votingPublicKey), weight]
);
}

const registrationData = RustModule.WalletV4.encode_json_str_to_metadatum(
JSON.stringify({
'1': [[prefix0x(votingPublicKey), 1]],
'1': delegations,
'2': prefix0x(stakingPublicKey),
'3': prefix0x(rewardAddress),
'4': nonce,
'5': 0,
'5': votingPurpose,
}),
RustModule.WalletV4.MetadataJsonSchema.BasicConversions
);
Expand Down
6 changes: 6 additions & 0 deletions packages/yoroi-extension/app/connector/Routes.js
Expand Up @@ -10,6 +10,7 @@ import ConnectContainer from './containers/ConnectContainer';
import Layout from './components/layout/Layout';
import SignTxContainer from './containers/SignTxContainer';
import EnableCatalystContainer from './containers/EnableCatalystContainer';
import SubmitDelegationContainer from './containers/SubmitDelegationContainer';
import LoadingPage from '../containers/LoadingPage';

export const Routes = (stores: StoresMap, actions: ActionsMap): Node => {
Expand All @@ -36,6 +37,11 @@ const getContent = (stores, actions) => (
path={ROUTES.ENABLE_CATALYST}
component={props => <EnableCatalystContainer {...props} stores={stores} actions={actions} />}
/>
<Route
exact
path={ROUTES.SUBMIT_DELEGATION}
component={props => <SubmitDelegationContainer {...props} stores={stores} actions={actions} />}
/>
</Switch>
);

Expand Down
Expand Up @@ -18,4 +18,6 @@ export default class ConnectorActions {
confirmSignInTx: AsyncAction<string> = new AsyncAction();
cancelSignInTx: Action<void> = new Action();
enableCatalyst: Action<boolean> = new Action();
confirmSubmitDelegation: AsyncAction<?string> = new AsyncAction();
cancelSubmitDelegation: Action<void> = new Action();
}

0 comments on commit 0500a1e

Please sign in to comment.