TypeScript Client
TypeScript library for interacting with the DolomiteMargin smart contracts.
npm i -s @dolomite-exchange/dolomite
or with
yarn
yarn add @dolomite-exchange/dolomite
import { DolomiteMargin, Networks } from '@dolomite-exchange/dolomite-margin';
// --- Initialize with Web3 provider ---
const dolomiteMargin = new DolomiteMargin(
provider, // Valid web3 provider
Networks.ARBITRtUM,
{
defaultAccount: '0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1', // Optional
accounts: [
{
address: '0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1', // Optional
privateKey: '0x4f3edf983ac636a65a842ce7c78d9aa706d3b113bce9c46f30d7d21715b23b1d',
},
], // Optional: loading in an account for signing transactions
}, // Optional
);
// --- OR Initialize with Web3 Provider node endpoint ---
const dolomiteMargin = new DolomiteMargin(
'https://arbitrum-mainnet.infura.io/v3/YOUR-PROJECT-ID',
Networks.ARBITRUM,
{
defaultAccount: '0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1', // Optional - but needed if using Infura
accounts: [
{
address: '0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1', // Optional
privateKey: '0x4f3edf983ac636a65a842ce7c78d9aa706d3b113bce9c46f30d7d21715b23b1d',
},
], // Optional: loading in an account for signing transactions
}, // Optional
);
DolomiteMargin exposes a number of "standard" actions for interacting with the protocol. These are a subset of what is possible with Operations, but are simpler to use.
Deposit funds to DolomiteMargin
import { MarketId, BigNumber } from '@dolomite-exchange/dolomite-margin';
// Deposits a certain amount of tokens for some asset.
// By default resolves when transaction is received by the node - not when mined
const result = await dolomiteMargin.standardActions.deposit({
accountOwner: '0x52bc44d5378309ee2abf1539bf71de1b7d7be3b5', // Your address
marketId: MarketId.ETH,
// Base units of the token, so 1e18 = 1 ETH
// NOTE: USDC has 6 decimal places, so 1e6 = 1 USDC
amount: new BigNumber('1e18'),
});
MarketId.ETH
will send ETH whereasMarketId.WETH
will send WETH. Both are the same market on the protocol- For all markets except
MarketId.ETH
, you will first need to set allowance on that token. See Tokens
Withdraw funds from DolomiteMargin
import { MarketId, BigNumber } from '@dolomite-exchange/dolomite-margin';
// Withdraws a certain amount of tokens for some asset.
// By default resolves when transaction is received by the node - not when mined
const result = await dolomiteMargin.standardActions.withdraw({
accountOwner: '0x52bc44d5378309ee2abf1539bf71de1b7d7be3b5', // Your address
marketId: MarketId.ETH,
// Base units of the token, so 1e18 = 1 ETH
// NOTE: USDC has 6 decimal places, so 1e6 = 1 USDC
amount: new BigNumber('1e18'),
});
// Withdraws all of your tokens for some asset.
// By default resolves when transaction is received by the node - not when mined
const result = await dolomiteMargin.standardActions.withdrawToZero({
accountOwner: '0x52bc44d5378309ee2abf1539bf71de1b7d7be3b5', // Your address
marketId: MarketId.ETH,
});
MarketId.ETH
will withdraw as ETH whereasMarketId.WETH
will withdraw as WETH. Both are the same market on the protocol
To initialize an Operation:
const operation = dolomiteMargin.operation.initiate();
DolomiteMargin also provides a Payable Proxy contract that will automatically wrap and unwrap ETH <-> WETH, so that users can interact with DolomiteMargin using only ETH. You can use it by:
const operation = dolomiteMargin.operation.initiate({ proxy: ProxyType.Payable });
Once an operation is initialized, Actions can be added to it. Action functions modify the
operation
itself, and also always return the operation
.In this example 1 ETH is being withdrawn from an account, and then 200 DAI are being deposited into it:
import { MarketId } from '@dolomite-exchange/dolomite-margin';
operation.withdraw({
primaryAccountOwner: '0x52bc44d5378309ee2abf1539bf71de1b7d7be3b5',
primaryAccountId: new BigNumber('123456'),
marketId: MarketId.WETH,
amount: {
value: new BigNumber('-1e18'),
reference: AmountReference.Delta,
denomination: AmountDenomination.Actual,
},
to: '0x52bc44d5378309ee2abf1539bf71de1b7d7be3b5'
})ty
.deposit({
primaryAccountOwner: '0x52bc44d5378309ee2abf1539bf71de1b7d7be3b5',
primaryAccountId: new BigNumber('123456'),
marketId: MarketId.DAI,
amount: {
value: new BigNumber('200e18'),
reference: AmountReference.Delta,
denomination: AmountDenomination.Actual,
},
from: '0x52bc44d5378309ee2abf1539bf71de1b7d7be3b5',
});
After Actions have been added to the
operation
, it can be committed. This is what sends the transaction to the blockchain to execute the Operation on the protocol.const response = await operation.commit({
from: '0x52bc44d5378309ee2abf1539bf71de1b7d7be3b5',
gasPrice: '1000000000',
confirmationType: ConfirmationType.Confirmed,
});
DolomiteMargin provides a number of read-only getter functions which read information off the smart contracts on the blockchain. You can find them here.
Example of getting the balances of an Account:
const balances = await dolomiteMargin.getters.getAccountBalances(
'0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359', // Account Owner
new BigNumber('11'), // Account Number
);
DolomiteMargin provides a helper to parse DolomiteMargin-specific logs from a transaction.
const dolomiteMarginLogs = dolomiteMargin.logs.parseLogs(transactionReceipt);
DolomiteMargin provides helper functions to help with interacting with ERC20 tokens. You can find them all here.
Example of setting DAI token allowance on DolomiteMargin:
await dolomiteMargin.token.setMaximumDolomiteMarginAllowance(
'0x89d24a6b4ccb1b6faa2625fe562bdd9a23260359', // DAI Contract Address
'0x52bc44d5378309ee2abf1539bf71de1b7d7be3b5', // My Address
{ from: '0x52bc44d5378309ee2abf1539bf71de1b7d7be3b5' }, // My Address
);
You can import types from DolomiteMargin as:
import {
AmountDenomination,
AmountReference,
ConfirmationType,
} from '@dolomite-exchange/dolomite-margin';
import { BigNumber } from '@dolomite-exchange/dolomite-margin';
Last modified 1mo ago