Integration of Rosettanet into Starknet DApps
Rosettanet integration is getting added to starknet.js
(6.24.1) and get-starknet
(v4). With these integrations Rosettanet will work as WalletAccount
in starknet.js
.
Connecting to Wallet
DApps can connect to wallets using the connect()
function from get-starknet
:
import { connect } from "@starknet-io/get-starknet";
const [selectedAccount, setSelectedAccount] = useState(null);
function handleConnect() {
return async () => {
const res = await connect();
setSelectedAccount(res);
};
}
return <button onClick={handleConnect()}>Connect With get-starknet</button>;
This is a standard implementation of get-starknet
in DApps. To use the wallet with starknet.js
, we first need to determine whether the user's wallet is a Starknet wallet or an EVM wallet. We can do this by checking selectedAccount from get-starknet is a EVM Wallet or Starknet Wallet. You can distinguish EVM wallets by checking if the window object includes the methods send
and sendAsync
, which are not present in Starknet wallets.
Ensure the node
variable points to a valid Rosettanet node.
import { RosettanetAccount, WalletAccount } from "starknet";
const userWalletAccount = await (typeof selectedAccount.sendAsync ===
"function" && typeof selectedAccount.send === "function"
? RosettanetAccount.connect({ nodeUrl: node }, selectedAccount)
: WalletAccount.connect({ nodeUrl: node }, selectedAccount));
This detection method will be available in the rosettanetjs npm library for easier usage in the near future.
Sending Requests
Once connected, the DApp can send transactions and requests through the user's wallet. Use the execute()
method from starknet.js
to send transactions. RosettanetAccount
supports nearly all WalletAccount
methods, except for declare()
and deploy()
. You can check what is available for WalletAccount
from starknet.js
docs.
const starknetCalldata = [
{
contractAddress:'contractAddress',
entrypoint: 'approve',
// You can use entrypoint as function name or entry point selector hash
calldata: "calldata",
},
{
contractAddress:'contractAddress',
// You can use entrypoint as function name or entry point selector hash
entrypoint: '0x25356d5707a314336daf6636019fcd414e2403787a6dfb3eacc0c8450b341c8',
calldata: "calldata",
},
];
const response = await userWalletAccount.execute(starknetCalldata);
If your DApp needs the wallet address, userWalletAccount.address
will return the address. For EVM wallets, this will be an Ethereum address. You can call a helper contract to obtain the corresponding Starknet address from the Ethereum address:
import { RpcProvider, Contract } from "starknet";
export async function getStarknetAddress(address) {
const starknetProvider = new RpcProvider({
nodeUrl: nodeUrl,
});
const rosettanetContractAddress = "Rosettanet Contract Address";
const { abi: rosettanetContractAbi } = await starknetProvider.getClassAt(
contractAddress
);
if (contractAbi === undefined) {
throw new Error("no contract abi, check contract address");
}
const rosettanetContract = new Contract(
rosettanetContractAbi,
rosettanetContractAddress,
starknetProvider
);
const starknetAddress =
await rosettanetContract.get_starknet_address_with_fallback(address);
return "0x" + starknetAddress.toString(16);
}
This method will also be included in the rosettanetjs npm library for convenience.
Rosettanet Account can get information both Ethereum and Starknet requests. For example blockNumberRosettanet
uses eth_blockNumber
method and returns Starknet block number, getBlockNumber
uses starknet_blockNumber
method and returns Starknet block number.
const userWalletAccount = await RosettanetAccount.connect(
{ nodeUrl: node },
selectedAccount
);
const ethereumMethod = await userWalletAccount.blockNumberRosettanet();
const starknetMethod = await userWalletAccount.getBlockNumber();
Available Ethereum Requests
These methods are using Ethereum requests but retrieve data from Starknet Chain.
sendTransactionRosettanet
Sends transaction request to wallet. Uses eth_sendTransaction
method.
Parameters:
Name | Description | Type |
---|---|---|
params | Valid Ethereum Transaction Object | Ethereum Transaction Object |
const userWalletAccount = await RosettanetAccount.connect(
{ nodeUrl: node },
selectedAccount
);
const ethereumMethod = await userWalletAccount.sendTransactionRosettanet(
params
);
chainIdRosettanet
Request the current chain ID from the wallet. Uses eth_chainId
method.
const userWalletAccount = await RosettanetAccount.connect(
{ nodeUrl: node },
selectedAccount
);
const ethereumMethod = await userWalletAccount.requestChainId();
blockNumberRosettanet
Request latest block number in Starknet. Uses eth_blockNumber
method.
const userWalletAccount = await RosettanetAccount.connect(
{ nodeUrl: node },
selectedAccount
);
const ethereumMethod = await userWalletAccount.blockNumberRosettanet();
callRosettanet
Call request. Uses eth_call
method.
Parameters:
Name | Description | Type |
---|---|---|
tx | Valid Ethereum Transaction Object | Ethereum Transaction Object |
const userWalletAccount = await RosettanetAccount.connect(
{ nodeUrl: node },
selectedAccount
);
const ethereumMethod = await userWalletAccount.callRosettanet(tx);
estimateGasRosettanet
Estimated gas fee for the transaction. Uses eth_estimateGas
method
Parameters:
Name | Description | Type |
---|---|---|
tx | Valid Ethereum Transaction Object | Ethereum Transaction Object |
const userWalletAccount = await RosettanetAccount.connect(
{ nodeUrl: node },
selectedAccount
);
const ethereumMethod = await userWalletAccount.estimateGasRosettanet(tx);
gasPriceRosettanet
Latest gas price in network. Uses eth_gasPrice
method.
const userWalletAccount = await RosettanetAccount.connect(
{ nodeUrl: node },
selectedAccount
);
const ethereumMethod = await userWalletAccount.gasPriceRosettanet();
getBalanceRosettanet
STRK balance of given address. Uses eth_getBalance
method.
Parameters:
Name | Description | Type |
---|---|---|
address | Ethereum Address to check balance | string |
block | Block number or hash (optional) | string |
const userWalletAccount = await RosettanetAccount.connect(
{ nodeUrl: node },
selectedAccount
);
const ethereumMethod = await userWalletAccount.getBalanceRosettanet(
address,
block
);
getBlockByHashRosettanet
Block by given block hash. Uses eth_getBlockByHash
method.
Parameters:
Name | Description | type |
---|---|---|
blockHash | Ethereum Block hash. | string |
hydratedTx | Hydrated transactions (optional) | boolean |
const userWalletAccount = await RosettanetAccount.connect(
{ nodeUrl: node },
selectedAccount
);
const ethereumMethod = await userWalletAccount.getBlockByHashRosettanet(
blockHash,
hydratedTx
);
getBlockByNumberRosettanet
Block by given block number. Uses eth_getBlockByNumber
method.
Parameters:
Name | Description | type |
---|---|---|
blockNumber | Block number or block tag. | string |
hydratedTx | Hydrated transactions (optional) | boolean |
const userWalletAccount = await RosettanetAccount.connect(
{ nodeUrl: node },
selectedAccount
);
const ethereumMethod = await userWalletAccount.getBlockByHashRosettanet(
blockNumber,
hydratedTx
);
getBlockTransactionCountByHashRosettanet
Transaction count of given block hash. Uses eth_getBlockTransactionCountByHash
method.
Parameters:
Name | Description | type |
---|---|---|
blockHash | Block hash | string |
const userWalletAccount = await RosettanetAccount.connect(
{ nodeUrl: node },
selectedAccount
);
const ethereumMethod = await userWalletAccount.getBlockByHashRosettanet(
blockHash
);
getBlockTransactionCountByNumberRosettanet
Transaction count of given block number. Uses eth_getBlockTransactionCountByNumber
method.
Parameters:
Name | Description | type |
---|---|---|
blockNumber | Block number | string |
const userWalletAccount = await RosettanetAccount.connect(
{ nodeUrl: node },
selectedAccount
);
const ethereumMethod =
await userWalletAccount.getBlockTransactionCountByNumberRosettanet(
blockNumber
);
getTransactionCountRosettanet
Transaction count of given address. Uses eth_getTransactionCount
method.
Parameters:
Name | Description | type |
---|---|---|
address | Ethereum address | string |
const userWalletAccount = await RosettanetAccount.connect(
{ nodeUrl: node },
selectedAccount
);
const ethereumMethod = await userWalletAccount.getTransactionCountRosettanet(
address
);
getTransactionReceiptRosettanet
Transaction receipt of given transaction hash. Uses eth_getTransactionReceipt
method.
Parameters:
Name | Description | type |
---|---|---|
txHash | Ethereum transaction hash | string |
const userWalletAccount = await RosettanetAccount.connect(
{ nodeUrl: node },
selectedAccount
);
const ethereumMethod = await userWalletAccount.getTransactionReceiptRosettanet(
txHash
);