
Security News
Attackers Are Hunting High-Impact Node.js Maintainers in a Coordinated Social Engineering Campaign
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.
$ npm install doubleup
JS
import { DoubleUpClient } from 'doubleup';
const suiClient = new SuiClient({ url: getFullnodeUrl("mainnet") });
...
export const dbClient = new DoubleUpClient({
partnerNftListId: "0x0",
suiClient: provider,
});
React
import { DoubleUpProvider } from 'doubleup';
// or use suiClient from @mysten provider
const suiClient = new SuiClient({ url: getFullnodeUrl("mainnet") });
## Basic Usage
JS
```js
import { Transaction } from "@mysten/sui/transactions";
const txb = new Transaction();
const coinType = "0x2::sui::SUI";
txb.setSender(address);
const betTypes = [0]; // 0 for heads, 1 for tails
const coin = txb.splitCoins(txb.gas, [1_000_000])
dbClient.createCoinflip({
betTypes,
coin,
coinType,
transaction: txb,
});
// Then just call sign and execute on the txb that is generated
The following games are enabled for a reduced house edge for holders of selected NFT projects:
When initializing the client, include the partnerNftListId option or prop.
Then, include partnerNftId in the call to the game. For example:
const dbClient = new DoubleUpClient({
client: suiClient,
partnerNftListId: "" // <<<<<<<<<<
});
...
const { ok: gameOk, err: gameErr, gameSeed } = createRangeDice({
betType,
coin,
coinType,
partnerNftId, // <<<<<<<<<<<<
range,
transaction: txb
});
If the player does not own the NFT passed in, then the call to the contract will fail.
betType
| Value | Meaning |
|---|---|
| 0 | Heads |
| 1 | Tails |
pollInterval (optional, default: 3000)
milliseconds
import { Transaction } from "@mysten/sui/transactions";
const txb = new Transaction();
const coinType = "0x2::sui::SUI";
const betTypes = [0]; // 0 for heads, 1 for tails
const coin = txb.splitCoins(txb.gas, [1_000_000])
dbClient.createCoinflip({
betTypes,
coin,
coinType,
transaction: txb,
});
// Then just call sign and execute on the txb that is generated
NOTE: NOT CURRENTLY IMPLEMENTED
betType
| Value | Meaning |
|---|---|
| 0 - 5 | Dice Rolls |
| 6 | Odd |
| 7 | Even |
| 8 | Small |
| 9 | Big |
pollInterval (optional, default: 3000)
milliseconds
const betType = 0;
const [coin] = txb.splitCoins(
txb.gas,
txb.pure.u64(betAmount)
);
const coinType = "0x2::sui::SUI";
const { ok: gameOk, err: gameErr, gameSeed } = createDice({
betType,
coin,
coinType,
transaction: txb
});
const transactionResult = await signAndExecuteTransactionBlock({ ... });
const { ok: resultOk, err: resultErr, results } = await getDiceResult({
???
});
multiplier
1.01 - 100
pollInterval (optional, default: 3000)
milliseconds
const [coin] = txb.splitCoins(
txb.gas,
txb.pure.u64(betAmount)
);
const coinType = "0x2::sui::SUI";
const { ok: gameOk, err: gameErr, gameSeed } = createLimbo({
coin,
coinType,
multiplier: 50,
transaction: txb
});
const transactionResult = await signAndExecuteTransactionBlock({ ... });
const { ok: resultOk, err: resultErr, results } = await getLimboResult({
coinType,
gameSeed,
transactionResult
});
const address = '0x...';
const [coin] = txb.splitCoins(
txb.gas,
txb.pure(lottery.ticket_cost, "u64")
);
const tickets = [{
numbers: [27, 15, 30, 7, 11],
specialNumber: 2
}];
const { ok, err } = buyLotteryTickets({
address,
coin,
tickets,
transaction: txb
});
const { ok, err, result } = await getLottery();
const { ok, err, results } = await getLotteryHistory();
const { ok, err, result } = await getLotteryDrawingResult({
round: 8679412
});
const { ok, err, results } = await getLotteryTickets({
address: '0x...'
});
const ticketIds = [
'0x...',
'0x...'
];
const { ok, err, results } = await redeemLotteryTickets({
ticketIds
});
numberOfDiscs
1 - 100
plinkoType
| Value | Meaning |
|---|---|
| 0 | 6 Rows |
| 1 | 9 Rows |
| 2 | 12 Rows |
pollInterval (optional, default: 3000)
milliseconds
const [coin] = txb.splitCoins(
txb.gas,
txb.pure(betAmount * numberOfDiscs, "u64")
);
const coinType = "0x2::sui::SUI";
const { ok: gameOk, err: gameErr, gameSeed } = createPlinko({
betAmount,
coin,
coinType,
numberOfDiscs: 50,
plinkoType: 1,
transaction: txb
});
const transactionResult = await signAndExecuteTransactionBlock({ ... });
const { ok: resultOk, err: resultErr, results } = await getPlinkoResult({
coinType,
gameSeed,
transactionResult
});
** If over/under, range must be a number. **
** If inside/outside, range must be an array of two numbers. **
range
1 - 100
OR
[1 - 100, 1 - 100]
betType
| Value | Meaning |
|---|---|
| 0 | Over |
| 1 | Under |
| 2 | Inside |
| 3 | Outside |
pollInterval (optional, default: 3000)
milliseconds
const [coin] = txb.splitCoins(
txb.gas,
txb.pure(betAmount * numberOfDiscs, "u64")
);
const coinType = "0x2::sui::SUI";
// EXAMPLE: over
const betType = 0;
const range = 25;
// EXAMPLE: inside
const betType = 2;
const range = [25, 50];
const { ok: gameOk, err: gameErr, gameSeed } = createRangeDice({
betType,
coin,
coinType,
range,
transaction: txb
});
const transactionResult = await signAndExecuteTransactionBlock({ ... });
const { ok: resultOk, err: resultErr, results } = await getRangeDiceResult({
betType,
coinType,
gameSeed,
transactionResult
});
const coinType = "0x2::sui::SUI";
const { ok, err } = createRouletteTable({
coinType,
transaction: txb
});
const address = "0x...";
const coinType = "0x2::sui::SUI";
const { ok, err, tableExists } = await doesRouletteTableExist({
address,
coinType
});
betType
| Value | Meaning |
|---|---|
| 0 | Red |
| 1 | Black |
| 2 | Number |
| 3 | Even |
| 4 | Odd |
| 5 | 1st 12 (1 - 12) |
| 6 | 2nd 12 (13 - 24) |
| 7 | 3rd 12 (25 - 36) |
| 8 | 1st 18 (1 - 18) |
| 9 | 2nd 18 (19 - 36) |
| 10 | 1st Row (1, 4, 7, ...) |
| 11 | 2nd Row (2, 5, 8, ...) |
| 12 | 3rd Row (3, 6, 9, ...) |
const coinType = "0x2::sui::SUI";
const tableOwner = "0x...";
const [coin] = txb.splitCoins(
txb.gas,
txb.pure.u64(betAmount)
);
// red
const betType = 0;
const { ok, err, betId } = addRouletteBet({
address: tableOwner,
betType,
coin,
coinType,
transaction: txb
});
// bet on 15
const betType = 2;
const betNumber = 15;
const { ok, err, betId } = addRouletteBet({
address: tableOwner,
betNumber,
betType,
coin,
coinType,
transaction: txb
});
const coinType = "0x2::sui::SUI";
const self = "0x...";
const tableOwner = "0x...";
const { ok, err, results } = await removeRouletteBet({
betId,
coinType,
player: self,
tableOwner,
transaction
});
const coinType = "0x2::sui::SUI";
const { ok: startOk, err: startErr, gameSeed } = startRoulette({
coinType,
transaction: txb
});
const transactionResult = await signAndExecuteTransactionBlock({ ... });
// Get the current round number of the object
const { roundNumber } = await doesRouletteTableExist({
address,
coinType: SUI_COIN_TYPE
});
const { ok: resultOk, err: resultErr, results } = await getRouletteResult({
coinType,
gameSeed,
transactionResult,
roundNumber
});
FAQs
SDK to integrate with doubleup contracts
The npm package doubleup receives a total of 33 weekly downloads. As such, doubleup popularity was classified as not popular.
We found that doubleup demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 5 open source maintainers collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.

Security News
Axios compromise traced to social engineering, showing how attacks on maintainers can bypass controls and expose the broader software supply chain.

Security News
Node.js has paused its bug bounty program after funding ended, removing payouts for vulnerability reports but keeping its security process unchanged.